HEX
Server: Apache
System: Linux server1.ariadata.co 4.18.0-553.120.1.el8_10.x86_64 #1 SMP Mon Apr 20 18:04:27 EDT 2026 x86_64
User: nepi (1051)
PHP: 7.4.33
Disabled: exec,passthru,shell_exec,system,show_source,popen,proc_open
Upload Files
File: /home/nepi/public_html/public/admin/js/chunk-50e7582d.2bc955de.js.map
{"version":3,"sources":["webpack:///./node_modules/tinymce/themes/silver/theme.js","webpack:///./node_modules/tinymce/plugins/pagebreak/plugin.js","webpack:///./node_modules/tinymce/themes/silver/index.js","webpack:///./src/interfaces/wysiwyg/input.vue?3488","webpack:///./node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js","webpack:///./node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/ScriptLoader.js","webpack:///./node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/EditorPropTypes.js","webpack:///./node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js","webpack:///./node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/index.js","webpack:///src/interfaces/wysiwyg/input.vue","webpack:///./src/interfaces/wysiwyg/input.vue?361b","webpack:///./src/interfaces/wysiwyg/input.vue","webpack:///./node_modules/tinymce/plugins/lists/plugin.js","webpack:///./node_modules/tinymce/plugins/media/plugin.js","webpack:///./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack:///./node_modules/tinymce/plugins/preview/plugin.js","webpack:///./node_modules/tinymce/plugins/paste/plugin.js","webpack:///./node_modules/@directus/extension-toolkit/mixins/interface.js","webpack:///./node_modules/tinymce/plugins/table/plugin.js","webpack:///./node_modules/tinymce/plugins/imagetools/plugin.js","webpack:///./node_modules/tinymce/plugins/insertdatetime/plugin.js","webpack:///./node_modules/tinymce/plugins/autoresize/plugin.js","webpack:///./src/interfaces/wysiwyg/input.vue?d9fe","webpack:///./node_modules/tinymce/plugins/link/plugin.js","webpack:///./node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/TinyMCE.js","webpack:///./node_modules/tinymce/plugins/image/plugin.js","webpack:///./node_modules/tinymce/plugins/hr/plugin.js","webpack:///./node_modules/tinymce/plugins/directionality/plugin.js","webpack:///./node_modules/tinymce/tinymce.js","webpack:///./node_modules/tinymce/plugins/code/plugin.js","webpack:///./node_modules/tinymce/plugins/fullscreen/plugin.js"],"names":["domGlobals","noop","noarg","f","compose","fa","fb","args","_i","arguments","length","apply","constant","value","identity","x","curry","fn","initialArgs","restArgs","all","concat","not","die","msg","Error","never","always","global$1","tinymce","util","Tools","resolve","__assign","Object","assign","t","s","i","n","p","prototype","hasOwnProperty","call","this","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__spreadArrays","il","r","Array","k","a","j","jl","SimpleResultType","none","NONE","eq","o","isNone","thunk","id","me","fold","is","isSome","getOr","getOrThunk","getOrDie","getOrNull","getOrUndefined","undefined","or","orThunk","map","each","bind","exists","forall","filter","equals","equals_","toArray","toString","freeze","some","constant_a","self","v","elementEq","b","from","Option","opt","mapError","_","onValue","toOption","isValue","isError","error","message","String","onError","fromOption","err","Result","typeOf","isPrototypeOf","constructor","name","isType","type","isString","isObject","isArray","isBoolean","isFunction","isNumber","isArrayOf","pred","len","nativeSlice","slice","nativeIndexOf","nativePush","push","rawIndexOf","ts","xs","contains","range","num","chunk","array","size","eachr","partition","pass","fail","arr","foldr","acc","foldl","find","findIndex","flatten","reverse","difference","a1","a2","mapToObject","pure","sort","comparator","copy","head","last","from$1","findMap","keys","each$1","obj","props","map$1","tupleMap","tuple","mapToArray","find$1","values","get","key","has","hasNonNullableKey","generate","cases","constructors","adt","acase","count","keys$1","argLength","match","branches","branchKeys","join","allReqd","reqKey","target","log","label","console","params","Adt","hasOwnProperty$1","shallow","old","nu","deep","bothObjects","deepMerge","baseMerge","merger","objects","ret","curObject","merge","cached","called","res","stype","serror","svalue","partition$1","results","errors","val","map$2","Value","bind$1","bindError","toResult","fromResult","SimpleResult","strict","defaultedThunk","asOption","asDefaultedOptionThunk","mergeWithThunk","defaulted","fallback","mergeWith","base","exclude","fields","wrap","_a","wrapAll","keyvalues","kv","partition$2","bothErrors","firstError","secondError","bothValues","result","exclude$1","wrap$1","wrapAll$1","mergeValues","mergeErrors","consolidate","objs","partitions","mergeValues$1","mergeErrors$1","consolidateObj","consolidateArr","ResultCombine","formatObj","input","JSON","stringify","formatErrors","es","path","getErrorInfo","missingStrict","missingKey","missingBranch","branch","unsupportedFields","unsupported","custom","adt$1","field","state","strictAccess","fallbackAccess","fallbackThunk","optionAccess","optionDefaultedAccess","cExtractOne","strength","okey","presence","prop","bundle","av","extract","bundleAsOption","optValue","outcome","ov","baseThunk","instantiator","cExtract","valueThunk","getDelegate","value$1","validator","getSetKeys","objOfOnly","delegate","objOf","fieldNames","extra","fieldStrings","arrOf","oneOf","props_1","setOf","validateKeys","validatedKeys","validKeys","schema","vk","anyValue","arrOfObj","chooseFrom","ch","vp","choose","choice","chosen","_anyValue","arrOfObj$1","objFields","arrOfVal","valueThunkOf","valueOf","setOf$1","errs","asRaw","extraction","errInfo","formatError","asRawOrDie","chooseProcessor","choose$1","anyValue$1","typedValue","expectedType","actualType","number","string","boolean","functionProcessor","isPostMessageable","every","iter","callbackFn","next","done","postMessageable","validateEnum","strict$1","strictOf","strictNumber","strictString","strictStringEnum","strictBoolean","strictFunction","forbid","strictObjOf","objSchema","strictArrayOfObj","strictArrayOf","option","optionOf","optionNumber","optionString","optionFunction","optionArrayOf","optionObjOf","optionObjOfOnly","defaulted$1","defaultedOf","defaultedNumber","defaultedString","defaultedStringEnum","defaultedBoolean","defaultedFunction","defaultedPostMsg","defaultedArrayOf","defaultedObjOf","state$1","Cell","initial","set","clone","fromHtml","html","scope","doc","document","div","createElement","innerHTML","hasChildNodes","childNodes","fromDom","fromTag","tag","node","fromText","text","createTextNode","dom","fromPoint","docElm","y","elementFromPoint","Element","compareDocumentPosition","documentPositionPreceding","Node","DOCUMENT_POSITION_PRECEDING","documentPositionContainedBy","DOCUMENT_POSITION_CONTAINED_BY","firstMatch","regexes","test","find$2","agent","major","minor","group","Number","replace","nu$1","detect","versionRegexes","cleanedAgent","toLowerCase","unknown","Version","edge","chrome","ie","opera","firefox","safari","isBrowser","current","unknown$1","nu$2","version","info","isEdge","isChrome","isIE","isOpera","isFirefox","isSafari","Browser","windows","ios","android","linux","osx","solaris","freebsd","chromeos","isOS","unknown$2","nu$3","isWindows","isiOS","isAndroid","isOSX","isLinux","isSolaris","isFreeBSD","isChromeOS","OperatingSystem","DeviceType","os","browser","userAgent","mediaMatch","isiPad","isiPhone","isMobile","isTouch","isTablet","isPhone","iOSwebview","isDesktop","isWebView","detect$1","candidates","candidate","search","detectBrowser","browsers","detectOs","oses","UaString","checkRange","str","substr","start","contains$1","endsWith","suffix","trim","normalVersionRegex","checkContains","uastring","PlatformInfo","detect$2","deviceType","PlatformDetection","query","window","matchMedia","matches","platform","navigator","detect$3","DOCUMENT","ATTRIBUTE_NODE","CDATA_SECTION_NODE","COMMENT_NODE","DOCUMENT_NODE","ELEMENT","DOCUMENT_TYPE_NODE","DOCUMENT_FRAGMENT_NODE","ELEMENT_NODE","TEXT","TEXT_NODE","ELEMENT$1","PROCESSING_INSTRUCTION_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","NOTATION_NODE","DOCUMENT$1","element","selector","nodeType","elem","msMatchesSelector","webkitMatchesSelector","mozMatchesSelector","bypassSelector","childElementCount","querySelectorAll","one","querySelector","e1","e2","regularContains","d1","d2","ieContains","contains$2","ancestor","transform","isRoot","stop","parentNode","el","transformed","closest","isSource","component","simulatedEvent","event","nu$4","parts","all$1","handlers","handler","any","read","can","abort","run","fuse","touchstart","touchmove","touchend","touchcancel","mousedown","mousemove","mouseout","mouseup","mouseover","focusin","focusout","keydown","keyup","change","click","transitionend","selectstart","alloy","tap","focus","postBlur","postPaste","receive","execute","focusItem","longpress","sandboxClose","typeaheadCancel","systemInit","documentTouchmove","documentTouchend","windowScroll","windowResize","attachedToDom","detachedFromDom","dismissRequested","repositionRequested","focusShifted","slotVisibility","changeTab","dismissTab","highlight","dehighlight","emit","dispatchWith","emitWith","properties","emitExecute","dispatch","data","getSystem","triggerEvent","dispatchEvent","derive","configs","predicate","preventDefault","prevent","runActionExtra","action","runOnName","runOnSourceName","redirectToUid","uid","getByUid","redirectee","redirectToPart","detail","partName","partUids","runWithTarget","ev","getByDom","closest$1","c","cutter","cut","stopper","runOnSource","runOnAttached","runOnDetached","runOnInit","runOnExecute","Immutable","struct","sort$1","reqMessage","required","unsuppMessage","validateStrArr","checkDupes","everything","sorted","dupe","d","MixedBag","optional","req","owner","ownerDocument","documentElement","defaultView","parent","offsetParent","nextSibling","children","child","index","cs","firstChild","fromHtml$1","before","marker","parent$1","insertBefore","after","sibling","append","prepend","firstChild$1","appendChild","appendAt","before$1","elements","append$1","empty","textContent","rogue","remove","removeChild","unwrap","wrapper","children$1","get$1","content","owner$1","docDom","fragment","createDocumentFragment","contentElements","getOuter","container","cloneNode","Function","nodeName","isType$1","isElement","isText","rawSet","setAttribute","set$1","setAll","attrs","get$2","getAttribute","getOpt","has$1","hasAttribute","remove$1","removeAttribute","original","isDeep","shallow$1","getHtml","isRecursive","originator","events","warn","DefaultEvents","__proto__","unique","generate$1","prefix","date","Date","time","getTime","random","Math","floor","idAttr","prefix$1","idAttr$1","write","writeOnly","defineProperty","writable","read$1","generate$2","make","NoContextApi","getComp","debugInfo","triggerFocus","triggerEscape","build","addToWorld","removeFromWorld","addToGui","removeFromGui","broadcast","broadcastOn","broadcastEvent","isConnected","singleton","markAsBehaviourApi","apiName","apiFunction","endIndex","openBracketIndex","parameters","substring","split","toFunctionAnnotation","cleanParameters","markAsExtraApi","extraName","markAsSketchApi","premadeTag","premade","comp","getPremade","spec","makeApi","rest","getApis","NoState","init","nu$5","readState","generateFrom","validated","behaviours","list","optBlobThunk","output","blob","config","getBehaviours","bData","getData","byInnerKey","indexKey","chain","nu$6","classes","attributes","styles","merge$1","defnA","mod","combine","baseMod","modsByBehaviour","behaviour","exhibit","byAspect","modification","combineObjects","combinedClasses","combinedAttributes","combinedStyles","sortKeys","keyName","order","aKey","bKey","aIndex","bIndex","uncurried","purpose","curried","cHandler","curryArgs","descHandler","extraArgs","getCurried","behaviourTuple","nameToHandlers","groupByEvents","behaviourEvents","combine$1","eventOrder","byEventName","combineGroups","assemble","rawHandler","missingOrderError","eventName","tuples","fuse$1","sortedTuples","combined","assembled","toInfo","toDefinition","domChildren","components","toModification","domModification","toEvents","read$2","attr","add","remove$2","supports","classList","get$3","add$1","clazz","remove$3","add$2","cleanClass","remove$4","has$2","add$3","remove$5","isSupported","style","getPropertyValue","inBody","body","getBody","internalSet","property","setProperty","internalRemove","removeProperty","set$2","setAll$1","css","setOptions","get$4","getComputedStyle","getUnsafeProperty","getRaw","raw","getAllRaw","ruleName","item","isValidValue","remove$6","reflow","offsetWidth","get$5","set$3","renderToDom","definition","subject","innerHtml","getBehaviours$1","generateFrom$1","generate$3","getDomDefinition","bList","infoModification","baseModification","getEvents","baseEvents","getMe","systemApi","bBlob","modDefinition","subcomponents","connect","newApi","disconnect","syncComponents","subs","hasConfigured","apis","behaviourName","buildSubcomponents","build$1","buildFromSpec","userSpec","specEvents","completeSpec","external","extSpec","uids","userSpecWithUid","prebuilt","premade$1","Dimension","getOffset","h","parseFloat","aggregate","parseInt","isNaN","max","cumulativeInclusions","absoluteMax","api","getBoundingClientRect","height","offsetHeight","get$6","getOuter$1","setMax","inclusions","absMax","left","top","translate","Position","boxPosition","box","firstDefinedOrZero","absolute","win","offsetLeft","offsetTop","scrollTop","pageYOffset","scrollLeft","pageXOffset","clientTop","clientLeft","viewport","api$1","set$4","get$7","getOuter$2","setMax$1","mkEvent","kill","fromRawEvent","rawEvent","stopPropagation","clientX","clientY","handle","binder","useCapture","wrapped","addEventListener","unbind","bind$2","capture","removeEventListener","get$8","_DOC","to","scrollTo","get$9","_win","bounds","width","right","bottom","getBounds","scroll","clientWidth","clientHeight","visualViewport","pageLeft","pageTop","walkUp","navigation","frame","view","pathTo","paths","frameElement","Navigation","find$3","frames","offset","loc","pointed","rect","bounds$1","xy","w","absolute$1","position","ClosestOrAncestor","EventConfiguration","ancestor$1","descendant","descend","child_1","closest$2","ancestor$2","descendant$1","closest$3","find$4","queryElem","dependent","dep","manager","ariaId","link","unlink","isAriaPartOf","isPartOf","unknown$3","AttributeValue","eventConfig","makeEventLogger","initialTarget","sequence","startTime","logEventCut","logEventStopped","logNoParent","logEventNoHandlers","logEventResponse","finishTime","processEvent","status","patterns","NORMAL","noLogger","LOGGING","logger","STOP","getTrace","stack","lines","line","ignoreEvent","monitorEvent","menuFields","itemFields","itemSchema","_initSize","itemMarkers","tieredMenuMarkers","markers","onPresenceHandler","fieldName","onHandler","onKeyboardHandler","onStrictHandler","onStrictKeyboardHandler","snapshot","initSize","nu$7","adt$2","southeast","southwest","northeast","northwest","south","north","east","west","cata","cataVertical","middle","cataHorizontal","getRestriction","anchor","restriction","boundsRestriction","restrictions","dir","adjustBounds","boundsRestrictions","bubbleOffsets","applyRestriction","bubbleOffset","adjustedLeft","adjustedTop","adjustedRight","adjustedBottom","eastX","middleX","westX","northY","southY","centreY","eastEdgeX","westEdgeX","southeast$1","bubbles","southwest$1","northeast$1","northwest$1","north$1","south$1","east$1","west$1","all$2","allRtl","aboveOrBelow","aboveOrBelowRtl","belowOrAbove","belowOrAboveRtl","executeEvent","bConfig","bState","executor","loadEvent","create","active","configSchema","schemaSchema","doCreate","createModes","modes","wrapApi","bName","revokeBehaviour","getConfig","wrappedApis","apiF","wrappedExtra","extraF","revoke","prepared","configAsRaw","initialConfig","behaviourInfo","exhibitor","derive$1","capabilities","simpleSchema","create$1","modeSchema","createModes$1","branchKey","chooseChannels","channels","universal","events$1","receiveConfig","channelMap","receivingData","targetChannels","channelInfo","channelSchema","onReceive","ActiveReceiving","ReceivingSchema","Receiving","posConfig","useFixed","ActivePosition","focus$1","blur","hasFocus","activeElement","_doc","preserve","ownerDoc","refocus","focused","oldFocus","newFocus","NuPositionCss","applyPositionCss","addPx","adt$3","relative","fixed","positionWithDirection","posName","decision","decisionX","decisionY","decisionWidth","decisionHeight","decisionRight","decisionBottom","direction","reposition","origin","toBox","rel","viewport$1","pos","removeScroll","outerScroll","cata$1","onNone","onRelative","onFixed","box$1","anchorBox","cycleBy","delta","min","clamp","adt$4","fit","nofit","calcReposition","newX","newY","boundsX","boundsY","boundsWidth","boundsHeight","xInBounds","yInBounds","originInBounds","xFit","yFit","sizeInBounds","deltaW","abs","deltaH","maxX","maxY","limitX","limitY","attempt","candidateX","candidateY","bubble","bubbleLeft","bubbleTop","adjustedBounds","boundsBottom","boundsRight","upAvailable","downAvailable","maxHeight","westAvailable","eastAvailable","maxWidth","on","classesOn","off","classesOff","candidateYforTest","attempts","elementBox","panelWidth","panelHeight","attemptBestFit","layout","attemptLayout","newReposition","newDeltaW","newDeltaH","improved","abc","bestNext","elementSize","options","preference","setClasses","classInfo","setHeight","maxHeightFunction","setWidth","maxWidthFunction","setMaxHeight","anchored","available","expandable","reparteeOptions","defaultOr","dephault","simple","layouts","overrideOptions","go","allAlignments","nu$8","yoffset","getClasses","xDelta","yDelta","alignmentsOn","alignmentsOff","innerNorthwest","innerNortheast","innerNorth","innerSouthwest","innerSoutheast","innerSouth","innerWest","innerEast","nu$9","onDirection","isLtr","isRtl","getDirection","Attribute","isBottomToTopDir","BottomToTop","schema$1","get$a","defaultLtr","defaultRtl","defaultBottomLtr","defaultBottomRtl","dirElement","isBottomToTop","customLtr","ls","onLtr","customRtl","onRtl","ltr","onBottomLtr","rtl","onBottomRtl","placement","anchorInfo","hotspot","overrides","placer","HotspotAnchor","placement$1","MakeshiftAnchor","zeroWidth","nbsp","create$2","SimRange","adt$5","cata$2","onBefore","onOn","onAfter","getStart","situ","before$2","after$1","Situ","adt$6","domRange","exact","exactFromRange","simRange","soffset","finish","foffset","getStart$1","selection","rng","startContainer","startSitu","finishSitu","relative$1","getWin","range$1","Selection","setStart","setStartBefore","setStartAfter","setFinish","setEndBefore","setEnd","setEndAfter","relativeToNative","createRange","exactToNative","toRect","getFirstRect","rects","getClientRects","adt$7","fromRange","startOffset","endContainer","endOffset","getRanges","doDiagnose","ranges","collapsed","reversed","rev","diagnose","asLtrRange","diagnosis","NodeValue","getOption","nodeValue","api$2","get$b","getEnd","isTextNodeWithCursorPosition","elementsWithCursorPosition","isCursorPosition","hasCursorPosition","last$1","descendantRtl","descendants","makeRange","after$2","same","readRange","rangeCount","firstRng","getRangeAt","lastRng","doGetExact","anchorNode","focusNode","anchorOffset","focusOffset","getExact","getSelection","sel","getFirstRect$1","point","descendOnce","adt$8","screen","toFixed","toAbsolute","sum","points","sumAsFixed","positions","sumAsAbsolute","absolute$2","root","hasSameOwner","frameOwner","compOwner","getRootPoint","capRect","newLeft","newTop","newWidth","newHeight","calcNewAnchor","optBox","rootPoint","topLeft","layoutsLtr","showAbove","layoutsRtl","ContentAnchorCommon","point$1","descendOnce$1","getAnchorSelection","modStart","modFinish","placement$2","selectionBox","optRect","rawRect","targetElement","SelectionAnchor","placement$3","nodeBox","NodeAnchor","eastX$1","westX$1","northY$1","southY$1","southeast$2","southwest$2","northeast$2","northwest$2","all$3","allRtl$1","placement$4","submenuInfo","SubmenuAnchor","AnchorSchema","submenu","makeshift","getFixedOrigin","getRelativeOrigin","place","anchoring","placee","position$1","posState","positionWithin","boxElement","boundsBox","positionWithinBounds","anchorage","oldVisibility","doPlace","vis","getMode","pConfig","pState","PositionApis","PositionSchema","Positioning","fireDetaching","fireAttaching","attach","detachChildren","childComp","replaceChildren","newChildren","deleted","attach$1","attachWith","insertion","doDetach","detach","detachChildren$1","attachSystem","guiSystem","attachSystemWith","attachSystemAfter","inserter","detachSystem","rebuild","sandbox","sConfig","sState","getAttachPoint","built","open","newState","onOpen","setContent","openWhileCloaked","transaction","cloak","decloak","close","onClose","clear","isOpen","isPartOf$1","getState","store","cssKey","newValue","restore","oldValue","sink","cloakVisibilityAttr","hasPosition","SandboxApis","events$2","sandboxConfig","sandboxState","ActiveSandbox","SandboxSchema","contents","SandboxState","Sandboxing","dismissPopups","repositionPopups","mouseReleased","schema$2","receivingChannel","rawSpec","isPart","isExtraPart","fireEventInstead","fe","schema$3","receivingChannel$1","doReposition","onLoad","repConfig","repState","onUnload","setValue","getValue","getState$1","RepresentApis","events$3","resetOnDom","se","ActiveRepresenting","memory","mode","isNotSet","manual","dataset","dataByValue","dataByText","lookup","itemString","update","items","currentDataByValue","currentDataByText","newDataByValue","newDataByText","meta","init$1","RepresentState","setValue$1","onSetValue","getValue$1","getDataKey","getFallbackEntry","onLoad$1","initialValue","onUnload$1","DatasetStore","getValue$2","setValue$2","onLoad$2","ManualStore","setValue$3","getValue$3","onLoad$3","initVal","onUnload$2","MemoryStore","RepresentSchema","Representing","setValueFrom","source","field$1","forbidden","get$c","dump","augment","SketchBehaviours","_placeholder","adt$9","single","multiple","isSubstituted","subPlaceholder","compSpec","placeholders","newSpec","scan","uiType","substitute","childSpecs","substituted","valuesThunk","preprocessor","preprocess","substituteAll","oneReplace","replacements","used","substitutePlaces","ps","ph","placeholder","adt$a","fFactory","sketch","fSchema","fName","fPname","typeSpec","fGroupSchema","fDefaults","fOverrides","requiredSpec","externalSpec","optionalSpec","groupSpec","asNamedPart","part","name$1","asCommon","convert","adtConstructor","partSchema","external$1","PartType","combine$2","partSpec","partValidated","defaults","internals","externals","pname","factory","_partSpec","_partValidated","units","u","generate$4","np","g","doGenerateOne","generateOne","schemas","names","substitutes","getPart","partKey","getPartOrDie","getParts","partKeys","system","pk","getAllParts","pUid","getAllPartNames","getPartsOrDie","defaultUids","baseUid","partTypes","partNames","pn","defaultUidsSchema","AlloyParts","partSchemas","partUidsSchemas","asRawOrDie$1","baseS","single$1","specWithUid","supplyUid","composite","partUidsSchema","components$1","hasUid","isSketchSpec","FocusInsideModes","singleSchema","compositeSchema","single$2","rawConfig","configFields","extraApis","composite$1","partFields","cat","lift2","oa","ob","lift3","oc","inside","getCurrent","composeConfig","composeState","ComposeApis","ComposeSchema","Composing","dehighlightAllExcept","hConfig","hState","skip","highlighted","highlightClass","skipComp","onDehighlight","dehighlightAll","dehighlight$1","isHighlighted","highlight$1","onHighlight","highlightFirst","getFirst","firstComp","highlightLast","getLast","lastComp","highlightAt","getByIndex","highlightBy","getCandidates","targetComp","queryTarget","getHighlighted","itemClass","getDelta","selected","dest","getPrevious","getNext","HighlightApis","HighlightSchema","Highlighting","BACKSPACE","TAB","ENTER","ESCAPE","SPACE","LEFT","UP","RIGHT","DOWN","cyclePrev","tryPrev","cycleNext","tryNext","inSet","which","and","preds","isShift","shiftKey","isControl","ctrlKey","isNotShift","rule","classification","choose$2","transitions","transition","reportFocusShifting","prevFocus","noChange","focusee","highlights","ToolbarMode","typical","infoSchema","stateInit","getKeydownRules","getKeyupRules","optFocusIn","processKey","getRules","keyingConfig","keyingState","rules","onFocusHandler","focusInside","OnFocusMode","focusIn","tryGoInsideComponent","isEnterOrSpace","OnEnterOrSpaceMode","create$3","cyclicField","isVisible","tabbingConfig","visibilitySelector","findInitial","tabstops","visibles","firstTabstop","findCurrent","focusManager","isTabstop","useTabstopAt","tabbingState","goFromTabstop","stopIndex","cycle","cyclic","tabstop","optStopIndex","goBackwards","navigate","goForwards","onEnter","exit","onEscape","AcyclicType","CyclicType","doDefaultExecute","defaultExecute","stopEventForFirefox","schema$4","execute$1","executeConfig","executeState","spaceExec","useSpace","enterExec","useEnter","downExec","useDown","execKeys","useControlEnter","ExecutionType","flatgrid","dimensions","setGridSize","numRows","numColumns","getNumRows","getNumColumns","init$2","KeyingState","useH","movement","move","use","west$2","moveLeft","moveRight","east$2","useV","north$2","south$2","isHidden","locate","locateVisible","visible","findIndex$1","withGrid","numCols","oldRow","oldColumn","address","newIndex","row","column","cycleHorizontal","onLastRow","colsInRow","newColumn","cycleVertical","newRow","newCol","cycleRight","cycleLeft","cycleUp","cycleDown","schema$5","gridConfig","gridState","first","execute$2","doMove","identified","handleTab","captureTab","doEscape","moveNorth","moveSouth","getKeydownRules$1","getKeyupRules$1","FlatgridType","horizontal","isDisabledButton","tryCycle","schema$6","findCurrent$1","flowConfig","execute$3","focusIn$1","getInitial","moveLeft$1","moveRight$1","doMove$1","flowState","executeOnMove","doEscape$1","getKeydownRules$2","_component","_se","_flowState","westMovers","allowVertical","eastMovers","getKeyupRules$2","FlowType","toCell","matrix","rowIndex","columnIndex","cell","cycleHorizontal$1","startCol","deltaCol","newColIndex","cycleVertical$1","colIndex","startRow","deltaRow","nextRowIndex","colsInNextRow","nextColIndex","moveHorizontal","moveVertical","cycleRight$1","cycleLeft$1","cycleUp$1","cycleDown$1","moveLeft$2","moveRight$2","moveUp","moveDown","schema$7","focusIn$2","matrixConfig","previousSelector","selectors","execute$4","toMatrix","rows","doMove$2","ifCycle","ifMove","cycles","inRow","cellsInRow","allRows","moveLeft$3","moveRight$3","moveNorth$1","moveSouth$1","getKeydownRules$3","getKeyupRules$3","MatrixType","schema$8","execute$5","menuConfig","focusIn$3","moveUp$1","moveDown$1","fireShiftTab","menuState","moveOnTab","fireTab","getKeydownRules$4","getKeyupRules$4","MenuType","schema$9","getKeydownRules$5","specialInfo","onSpace","onShiftEnter","onShiftTab","onTab","onUp","onDown","onLeft","onRight","getKeyupRules$5","stopSpaceKeyup","SpecialType","acyclic","flow","flatgrid$1","execution","menu","special","KeyboardBranches","isFlatgridState","keyState","Keying","keyConfig","sendFocusIn","set$5","replaceConfig","replaceState","insert","childSpec","append$2","appendee","prepend$1","prependee","remove$7","removee","foundChild","replaceAt","replaceeIndex","replacer","replacee","replaceBy","replaceePred","ReplaceApis","Replacing","events$4","eventHandlers","focus$2","focusConfig","ignore","onFocus","blur$1","isFocused","FocusApis","exhibit$1","tabindex","events$5","stopMousedown","ActiveFocus","FocusSchema","Focusing","updateAriaState","toggleConfig","toggleState","ariaInfo","aria","updateClass","toggleClass","toggle","set$6","on$1","isOn","onLoad$4","ToggleApis","exhibit$2","events$6","load","toggleOnExecute","ActiveToggle","SetupBehaviourCellState","initialState","updatePressed","syncWithExpanded","updateExpanded","updateSelected","updateChecked","ToggleSchema","pressed","checked","expanded","Toggling","pointerEvents","onClick","events$7","optAction","executeHandler","hoverEvent","focusEvent","onHover","hover","focus$3","builder","toggling","hasSubmenu","itemBehaviours","tConfig","ignoreFocus","schema$a","builder$1","schema$b","owner$2","builder$2","focusWidget","widget","onHorizontalArrow","autofocus","setSource","widgetBehaviours","schema$c","itemSchema$1","separator","configureGrid","movementInfo","configureMatrix","rowSelector","configureMenu","parts$1","itemInfo","unit","fakeFocus","schema$d","grid","focus$4","make$1","menuBehaviours","selectedItem","role","Menu","transpose","trace","byItem","byMenu","triggerItem","triggerMenu","generate$5","menus","expansions","menuItems","menuPaths","_triggerItem","init$3","primary","directory","isClear","setMenuBuilt","menuName","setContents","sPrimary","sMenus","sExpansions","sPaths","getTriggeringItem","menuValue","getTriggerData","getItemByValue","getPreparedMenu","triggeringItemValue","triggeredItem","triggeredMenu","triggeringItem","triggeringPath","getTriggeringPath","itemValue","extraPath","lookupItem","revPath","triggers","menuIndex","expand","collapse","refresh","lookupMenu","extractPreparedMenu","otherMenus","menuValues","getPrimary","getMenus","prep","LayeredState","make$2","rawUiSpec","ExpandHighlightDecision","submenuParentItems","buildMenus","primaryName","makeSketch","nbMenu","layeredState","setup","componentMap","toDirectory","getItemValue","setActiveMenu","mv","closeOthers","others","backgroundMenu","stayInDom","getSubmenuParents","parentItems","itemComp","updateAriaExpansions","updateMenuPath","latestMenuName","menuPrep","activeMenu","buildIfRequired","expandRight","HighlightSubmenu","activeMenuPrep","onOpenSubmenu","collapseLeft","onCollapseMenu","updateView","keyOnItem","getSource","onExecute","onOpenMenu","highlightImmediately","navigateOnHover","HighlightParent","getActiveItem","collapseMenuApi","currentItem","highlightPrimary","extractMenuFromContainer","repositionMenus","maybeActivePrimary","allMenus","preparedMenus","primaryMenu","onRepositionMenu","collapseMenu","tmenuBehaviours","keyInfo","selectedMenu","collapseItem","tieredData","singleData","collapseItem$1","tieredMenu","tmenu","makeMenu","menuSandbox","menuSpec","lazySink","isFirstTierSubmenu","triggeringPaths","getSubmenuLayouts","submenuTriggers","st","submenuLayouts","isPartOfRelated","related","getRelated","thing","showAt","showWithin","showWithinBounds","showMenuAt","showMenuWithinBounds","hide","getContent","inlineBehaviours","onShow","onHide","fireDismissalEventInstead","fireRepositionEventInstead","InlineView","westEdgeX$1","middleX$1","eastEdgeX$1","northY$2","southY$2","southeast$3","southwest$3","northeast$3","northwest$3","north$3","south$3","global$2","global$3","global$4","getSkinUrl","editor","settings","skin","skinUrl","skin_url","skinName","documentBaseURI","baseURL","isReadOnly","getParam","isSkinDisabled","getHeightSetting","getElement","getWidthSetting","DOM","getStyle","getMinWidthSetting","min_width","getMinHeightSetting","min_height","getMaxWidthSetting","getMaxHeightSetting","getUserStyleFormats","isMergeStyleFormats","getRemovedMenuItems","isMenubarEnabled","isToolbarEnabled","toolbar","isToolbarTrue","isToolbarString","isToolbarObjectArray","isMultipleToolbars","getMultipleToolbarsSetting","toolbarKeys","toolbars","toolbarArray","ToolbarLocation","getToolbarMode","getToolbarGroups","isToolbarLocationTop","fixedContainerSelector","fixedContainerElement","inline","useFixedContainer","getUiContainer","fixedContainer","isDistractionFree","isStickyToolbar","isDraggableModal","factory$1","lookupAttr","getModAttributes","roleAttrs","buttonBehaviours","Button","record","anyInSystem","asSpec","defaultIcon","icons","get$d","getFirst$1","notificationIconMap","success","warning","factory$2","memBannerText","translationProvider","renderPercentBar","percent","renderPercentText","memBannerProgress","progress","updateProgress","updateText","text$1","banner","iconChoices","icon","level","iconProvider","closeButton","onAction","Notification","NotificationManagerImpl","extras","uiMothership","backstage","isToolbarLocationTop$1","getLayoutDirection","prePositionNotifications","notifications","notification","moveTo","positionNotifications","firstItem","moveRel","getEl","closeCallback","hideCloseButton","timeout","notificationWrapper","progressBar","shared","providers","getSink","setTimeout","layoutDirection_1","nodeAnchor","anchors","nuText","getArgs","ItemResponse","rate","timer","cancel","clearTimeout","throttle","last$2","global$5","isBoundary","isBlock","getContentEditable","repeatLeft","process","rootNode","backwards","autocompleteSelector","create$4","detect$4","getNode","getDoc","extractContents","insertNode","elm","normalize","setCursorLocation","isValidTextRange","getText","isWhitespace","chr","stripTriggerChar","triggerCh","findChar","char","charAt","findStart","initRange","minChars","findTriggerChIndex","getParent","getRoot","spot","cloneRange","triggerCharIndex","lastIndexOf","triggerChar","getContext","createRng","selectNode","onKeypress","redirectKeyToItem","getItem","getView","isActive","cancelIfNecessary","isMenuOpen","stopImmediatePropagation","isProcessingAction","AutocompleterEditorEvents","global$6","point$2","isText$1","isElement$1","toLast","toLeaf","isPreviousCharContent","leaf","isStartOfWord","getTriggerContext","database","triggerChars","getDatabase","getRng","context","lookupWithContext","fetchOptions","startText","autocompleters","lookupByChar","autocompleter","lookupData","ac","fetchResult","fetch","maxResults","then","matchText","columns","separatorMenuItemSchema","createSeparatorMenuItem","autocompleterItemSchema","autocompleterSchema","createSeparatorItem","createAutocompleterItem","createAutocompleter","stringArray","register","popups","ui","registry","getAll","popup","datasetValues","dv","commonMenuItemFields","menuItemSchema","createMenuItem","nestedMenuItemSchema","createNestedMenuItem","toggleMenuItemSchema","createToggleMenuItem","choiceMenuItemSchema","createChoiceMenuItem","fancyTypes","fancyMenuItemSchema","createFancyMenuItem","detectSize","margin","selectorClass","descendants$1","columnLength","thisTop","cTop","ceil","namedEvents","unnamedEvents","SimpleBehaviours","TooltippingSchema","init$4","getTooltip","setTooltip","clearTooltip","clearTimer","resetTimer","delay","isShowing","TooltippingState","ExclusivityChannel","ShowTooltipEvent","HideTooltipEvent","hideAllExclusive","tState","setComponents","specs","tooltip","TooltippingApis","events$8","tooltipConfig","show","tooltipDom","tooltipComponents","ActiveTooltipping","Tooltipping","global$7","navClass","selectableClass","colorClass","presetClasses","normal","color","tickedClass","groupHeadingClass","iconClass","textClass","accessoryClass","caretClass","checkmarkClass","activeClass","iconClassRtl","classForPreset","presets","global$8","convertText","mac","alt","ctrl","shift","access","other","shortcut","updated","segment","ConvertShortcut","renderIcon","iconHtml","renderText","renderHtml","renderStyledText","renderShortcut","renderCheckmark","renderSubmenuCaret","renderDownwardsCaret","renderColorStructure","itemText","iconSvg","providerBackstage","colorPickerCommand","removeColorCommand","getDom","common","title","baseDom","optComponents","renderNormalItemStructure","renderIcons","textRender","rtlClass","leftIcon","checkMark","domTitle","ariaLabel","htmlContent","menuItem","shortcutContent","caret","rtlIcon","rtlTransform","renderItemStructure","providersBackstage","fallbackIcon","getIconName","iconName","needRtlClass","iconContent","nativeDisabled","onLoad$5","disableConfig","disableState","disabled","disable","hasNative","useNative","nativeIsDisabled","nativeDisable","nativeEnable","ariaIsDisabled","ariaDisable","ariaEnable","disableClass","onDisabled","enable","onEnabled","isDisabled","set$7","DisableApis","exhibit$3","events$9","ActiveDisable","DisableSchema","Disabling","button","splitButton","toolbarButton","DisablingConfigs","runWithApi","getApi","onControlAttached","editorOffCell","onDestroy","onSetup","onControlDetached","ItemResponse$1","onMenuItemExecute","itemResponse","triggersSubmenu","CLOSE_ON_EXECUTE","menuItemEventOrder","componentRenderPipeline","renderCommonItem","structure","buildData","tooltipBehaviour","sharedBackstage","tooltipWorker","_tooltip","escapeRegExp","encodeText","encode","replaceText","translated","encoded","escapedMatchRegex","RegExp","renderAutocompleteItem","useText","onItemValueHandler","_api","renderChoiceItem","isSelected","setActive","setDisabled","parts$2","cellOverEvent","cellExecuteEvent","makeCell","col","labelId","emitCellOver","makeCells","cells","selectCells","selectedRow","selectedColumn","makeComponents","cellRow","makeLabelText","renderInsertTableMenuItem","sizeLabelId","memLabel","hexColour","hexString","shorthandRegex","longformRegex","isHexString","hex","getLongForm","m","extractValues","longForm","splitForm","exec","toHex","fromRgba","rgbaColour","red","green","blue","round","rgbRegex","rgbaRegex","alpha","isRgbaComponent","fromHsv","hsv","hue","saturation","brightness","side","chroma","fromHex","fromStringValues","fromString","rgbaString","rgbMatch","rgbaMatch","rgba","redColour","global$9","storageName","ColorCache","storageString","localstorage","parse","prune","diff","cache","unshift","pop","setItem","idx","splice","choiceItem","defaultColors","colorCache","mapColors","colorMap","colors","canvas","ctx","byteAsHex","colorByte","alphaByte","bg","colorByteWithWhiteBg","toUpperCase","asHexColor","clearRect","fillStyle","fillRect","getImageData","getColorCols","defaultCols","hasCustomColors","getColorMap","getColors","unmapped","getCurrentColors","addColor","Settings","fireSkinLoaded","fire","fireSkinLoadError","fireResizeEditor","fireBeforeRenderUI","fireResizeContent","fireScrollContent","fireTextColorChange","Events","getCurrentColor","format","getParents","applyFormat","undoManager","transact","formatter","nodeChanged","removeFormat","registerCommands","addCommand","calcCols","sqrt","getColorCols$1","getAdditionalColors","hasCustom","applyColor","onChoice","dialog","colorPickerDialog","colorOpt","execCommand","getMenuColors","getFetch","callback","setIconColor","splitButtonApi","newColor","setIconFillAndStroke","pathId","setIconFill","setIconStroke","registerTextColorButton","lastColor","addSplitButton","select","optCurrentRgb","currentRgb","currentHex","onItemAction","registerTextColorMenuItem","addNestedMenuItem","getSubmenuItems","fancytype","getOnSubmit","colorpicker","details","initialData","submit","windowManager","buttons","onSubmit","onCancel","register$1","lastForeColor","lastBackColor","ColorSwatch","forMenu","hasIcons","markers$1","menuClasses","dom$1","chunk$1","rowDom","chunks","forSwatch","forToolbar","preprocessCollection","isSeparator","allSplits","currentSplit","forCollection","initItems","_hasIcons","_item","forHorizontalCollection","hasIcon","menuHasIcons","handleError","createHorizontalPartialMenuWithAlloyItems","_columns","_presets","createPartialMenuWithAlloyItems","createPartialChoiceMenu","presetItemTypes","alloyItems","createChoiceItems","itemPresets","deriveMenuMovement","menuMarkers","rowClass","deriveCollectionMovement","renderColorSwatchItem","colorinput","widgetSpec","FocusMode","fancyMenuItems","inserttable","colorswatch","valueOpt","renderFancyMenuItem","render","renderNormalItem","renderNestedItem","downwardsCaret","renderSeparatorItem","renderToggleMenuItem","autocomplete","nested","toggle$1","fancy","hasIcon$1","menuHasIcons$1","createMenuItemFromBridge","isHorizontalMenu","parseForHorizontalMenu","menuitem","createAutocompleteItems","createPartialMenu","itemHasIcon","createItem","createPartial","createTieredDataFrom","partialMenu","createMenuFrom","focusMode","ContentFocus","register$2","activeAutocompleter","processingAction","hideIfNecessary","lastElement","getAutocompleters","getCombinedItems","choices","itemMeta","nr","autocompleterApi","reload","BUBBLE_TO_SANDBOX","commenceIfNecessary","matchLength","display","ld","doLookup","newContext","lookupInfo","combinedItems","autocompleterUiApi","Autocompleter","filter$1","bind$3","capture$1","fromRawEvent$1","closest$4","DelayedFunction","fun","ref","schedule","SIGNIFICANT_MOVE","LONGPRESS_DELAY","getTouch","touches","isFarEnough","touch","distX","distY","monitor","startData","longpressFired","longpress$1","handleTouchstart","handleTouchmove","handleTouchend","isSame","fireIfReady","isDangerous","keyEv","settingsSchema","bindFocus","bindBlur","setup$1","rawSettings","tapEvent","simpleEvents","tapStopped","stopped","pasteTimeout","onPaste","onKeydown","stopBackspace","onFocusIn","focusoutTimeout","onFocusOut","derive$2","rawTarget","getTarget","fromSource","isStopped","isCut","fromExternal","adt$b","resume","complete","doTriggerHandler","eventType","handlerInfo","eventHandler","doTriggerOnUntilStopped","triggerHandler","listeners","listener","triggerUntilStopped","triggerOnUntilStopped","broadcastHandler","EventRegistry","registerId","findHandler","filterByType","isAboveRoot","unregisterId","handlersById","Registry","readOrTag","failOnDuplicate","tagId","conflict","unregister","getById","factory$3","domWithoutAttributes","containerBehaviours","Container","takeover","domEvents","_alloyId","broadcast$1","destroy","broadcastData","receivers","receiver","formChangeEvent","formCloseEvent","formCancelEvent","formActionEvent","formSubmitEvent","formBlockEvent","formUnblockEvent","formTabChangeEvent","formResizeEvent","renderAlertBanner","iconTooltip","url","renderBar","interpreter","schema$e","parts$3","excludeFactory","factory$4","fieldBehaviours","descriptor","descriptorId","getField","getLabel","FormField","schema$f","focusBehaviours","selectOnFocus","setSelectionRange","inputBehaviours","dom$2","inputAttributes","inputStyles","inputClasses","factory$5","Input","exports$1","module","exports","define","require","amd","global","EphoxContactWrapper","code","1","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","runClearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","Item","nextTick","env","argv","versions","addListener","once","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","umask","2","setImmediate","setTimeoutFunc","thisArg","Promise","TypeError","_state","_handled","_value","_deferreds","doResolve","deferred","_immediateFn","cb","onFulfilled","onRejected","reject","promise","finale","_unhandledRejectionFn","Handler","reason","ex","prom","remaining","race","_setImmediateFn","_setUnhandledRejectionFn","3","clearImmediate","immediateIds","nextImmediateId","Timeout","clearFn","_id","_clearFn","setInterval","clearInterval","unref","enroll","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","_onTimeout","4","promisePolyfill","Global","boltExport","HighlightOnOpen","nu$a","baseFn","callbacks","nCallback","isReady","cbs","pure$1","LazyValue","errorReporter","make$3","fab","aFutureB","toPromise","anonBind","futureB","toLazy","toCached","nu$b","pure$2","Future","ariaElements","isAriaElement","markValid","invalidConfig","invalidClass","notify","notifyInfo","getContainer","validHtml","onValid","markInvalid","invalidState","onInvalid","validatorInfo","validate","run$1","onValidate","valid","isInvalid","InvalidateApis","events$a","onEvent","validateOnLoad","ActiveInvalidate","InvalidateSchema","Invalidating","validation","exhibit$4","tabConfig","tabAttr","ActiveTabstopping","TabstopSchema","Tabstopping","renderFormFieldWith","pLabel","pField","extraClasses","extraBehaviours","renderFormFieldSpecWith","renderFormField","renderFormFieldDomWith","renderFormFieldDom","renderLabel","getCoupled","coupleConfig","coupleState","getOrCreate","CouplingApis","CouplingSchema","init$5","coupled","CouplingState","Coupling","partType","getAnchor","getHotspot","getAnchorOverrides","mapFetch","fetcher","openF","highlightOnOpen","futureData","getLazySink","tdata","HighlightFirst","open$1","onOpenSync","processed","close$1","_externals","_onOpenSync","_highlightOnOpen","togglePopup","showing","matchWidth","useMinWidth","buttonWidth","sinkDetail","internalSink","lazySinkFn","doRepositionMenus","makeSandbox","ariaOwner","sandboxClasses","sandboxBehaviours","sandboxFields","schema$g","parts$4","factory$6","_spec","switchToMenu","HighlightNone","triggerExecute","dropdownBehaviours","Dropdown","exhibit$5","unselectable","events$b","ActiveUnselecting","Unselecting","renderPanelButton","colorInputChangeEvent","colorSwatchChangeEvent","colorPickerCancelEvent","renderColorInput","colorInputBackstage","inputValue","span","emitSwatchChange","colorBit","memColorButton","colorPicker","colorButton","hsvColour","fromRgb","minRGB","maxRGB","calcHex","rgb","fieldsUpdate","sliderUpdate","paletteUpdate","labelPart","edgePart","model","edgeActions","det","mouseIsDown","tlEdgePart","tedgePart","trEdgePart","redgePart","brEdgePart","bedgePart","blEdgePart","ledgePart","thumbPart","spectrumPart","modelDetail","getValueFromEvent","spectrum","SliderParts","_sliderChangeEvent","sliderChangeEvent","isTouchEvent","evt","getEventSource","touchEvent","mouseEvent","r$1","l","minX","minY","min1X","min1Y","max1X","max1Y","range$2","xRange","yRange","halfX","halfY","step","stepSize","snap","snapToGrid","snapStart","rounded","hasEdge","edgeName","hasLEdge","hasREdge","hasTEdge","hasBEdge","currentValue","xValue","yValue","xyValue","fireSliderChange","setToTLEdgeXY","setToTEdge","setToTEdgeXY","setToTREdgeXY","setToREdge","setToREdgeXY","setToBREdgeXY","setToBEdge","setToBEdgeXY","setToBLEdgeXY","setToLEdge","setToLEdgeXY","reduceBy","increaseBy","capValue","snapValueOf","initValue","extraValue","remainder","adjustment","rawSteps","maxSteps","numSteps","findOffsetOf","findValueOf","hasMinEdge","hasMaxEdge","minBound","maxBound","screenRange","capMin","capMax","findOffsetOfValue","maxOffset","centerMinEdge","centerMaxEdge","getBounds$1","getBoundsProperty","getMinXBounds","getMaxXBounds","getMinYBounds","getMaxYBounds","getXScreenRange","getYScreenRange","getCenterOffsetOf","componentMinEdge","componentMaxEdge","spectrumMinEdge","getXCenterOffSetOf","componentBounds","spectrumBounds","getYCenterOffSetOf","fireSliderChange$1","sliderValue","findValueOfOffset","sliderVal","setToMin","setToMax","moveBy","handleMovement","findOffsetOfValue$1","minEdge","maxEdge","minOffset","findPositionOfValue","slider","setPositionFromValue","thumb","edges","getSpectrum","getLeftEdge","getRightEdge","thumbRadius","HorizontalModel","fireSliderChange$2","sliderValue$1","findValueOfOffset$1","setValueFrom$1","setToMin$1","setToMax$1","moveBy$1","handleMovement$1","getValueFromEvent$1","findOffsetOfValue$2","findPositionOfValue$1","setPositionFromValue$1","getTopEdge","getBottomEdge","onLeft$1","onRight$1","onUp$1","onDown$1","edgeActions$1","VerticalModel","fireSliderChange$3","sliderValue$2","setValueFrom$2","moveBy$2","isVerticalMovement","handleMovement$2","setToMin$2","mX","mY","setToMax$2","getValueFromEvent$2","setPositionFromValue$2","xPos","yPos","thumbXRadius","thumbYRadius","onLeft$2","onRight$2","onUp$2","onDown$2","edgeActions$2","TwoDModel","SliderSchema","getThumb","changeValue","onChange","resetToMin","resetToMax","fireOnChoose","onChoose","wasDown","onDragStart","onDragEnd","sliderBehaviours","getInitialValue","onInit","Slider","sliderFactory","getClass","_thumb","owner$3","schema$h","getPartName","sketch$1","fSpec","fieldParts","make$4","toResult$1","formBehaviours","form","resPs","resPThunk","pName","Form","validInput","invalidInput","validatingInput","translatePrefix","rgbFormFactory","onValidHexx","onInvalidHexx","invalidation","isValid","renderTextField","description","helptext","comps","concats","copyRgbToHex","hexField","copyRgbToForm","memPreview","updatePreview","preview","copyHexToRgb","setValueRgb","getValueRgb","onInvalidInput","onValidHex","onValidRgb","isHexInputEvent","onValidInput","formPartStrings","redStrings","greenStrings","blueStrings","hexStrings","updateHex","rgbFormSketcher","paletteFactory","_translate","setColour","grdWhite","createLinearGradient","addColorStop","grdBlack","setSliderColour","_detail","_slider","saturationBrightnessPaletteSketcher","setRgba","_apis","makeFactory","rgbForm","onInvalidHex","sbPalette","paletteRgba","memPalette","memRgb","updatePalette","palette","updateFields","runUpdates","updates","paletteUpdates","oldRgb","hsvColour$1","newHsvColour","nuHex","sliderUpdates","colourPickerSketcher","self$1","memento","mem","childAt","ComposingConfigs","english","getEnglishText","translate$1","renderColorPicker","colourPickerFactory","memPicker","picker","optRgbForm","optHex","formValues","pattern","global$a","isOldCustomEditor","renderCustomEditor","editorApi","memReplaced","ta","scriptId","scriptUrl","ea","cvalue","ed","processors","memento$1","rawProcessors","rawValue","postprocess","withComp","optInitialValue","getter","setter","withElement","domValue","domHtml","memory$1","RepresentingConfigs","extensionsAccepted","filterByExtension","files","re","file","renderDropZone","actions","onDrop","transferEvent","handleFiles","dataTransfer","onSelect","memInput","accept","renderField","inputComp","renderGrid","beforeObject","afterObject","craftWithClasses","outline","craft","triggerTab","onFocus$1","isPseudoStop","NavigableObject","platformNeedsSandboxing","getDynamicSource","isSandbox","cachedValue","frameComponent","contentWindow","renderIFrame","sandboxed","sourcing","create$5","resize","clone$1","tCanvas","get2dContext","drawImage","getWidth","image","naturalWidth","getHeight","naturalHeight","asap","immediateFn","catch","values_1","Promise$1","blobToImage","blobUrl","URL","createObjectURL","Image","removeListeners","loaded","src","dataUriToBlobSync","uri","mimetype","base64","sliceSize","byteCharacters","atob","bytesLength","slicesCount","byteArrays","sliceIndex","begin","end","bytes","charCodeAt","Uint8Array","Blob","dataUriToBlob","canvasToBlob","quality","HTMLCanvasElement","toBlob","toDataURL","canvasToDataURL","blobToCanvas","revokeImageUrl","blobToDataUri","reader","FileReader","onloadend","readAsDataURL","revokeObjectURL","create$6","getCanvas","initialType","getType","toBase64","toAdjustedBlob","toAdjustedDataURL","toAdjustedBase64","dataurl","toCanvas","fromBlob","fromCanvas","blobToImageResult","clamp$1","parsedValue","identity$1","DELTA_INDEX","multiply","matrix1","matrix2","out","adjustContrast","adjustBrightness","adjustColors","adjustR","adjustG","adjustB","colorFilter","ir","applyColorFilter","applyMatrix","pixelsData","m0","m1","m2","m3","m4","m5","m6","m7","m8","m9","m10","m11","m12","m13","m14","m15","m16","m17","m18","m19","pixels","putImageData","convoluteFilter","applyConvoluteFilter","pIn","pOut","aMatrix","halfSide","drgba","cy","cx","scx","scy","innerOffset","wt","pixelsIn","pixelsOut","functionColorFilter","colorFn","filterImpl","applyLookup","complexAdjustableColorFilter","matrixAdjustFn","adjust","basicColorFilter","basicConvolutionFilter","kernel","invert","contrast","colorize","sharpen","gamma","pow","scale","dW","dH","sW","sH","wRatio","hRatio","scaleCapped","scaled","_scale","rotate","angle","applyRotate","translateX","translateY","PI","flip","axis","applyFlip","crop","applyCrop","resize$1","newCanvas","invert$1","sharpen$1","gamma$1","colorize$1","brightness$1","contrast$1","flip$1","crop$1","resize$2","rotate$1","renderIcon$1","renderIconFromPack","iconsProvider","renderReplacableIconFromPack","renderLabel$1","internalToolbarButtonExecute","onToolbarButtonExecute","itemApi","buttonApi","toolbarButtonEventOrder","updateMenuText","updateMenuIcon","renderCommonDropdown","optMemDisplayText","optMemDisplayIcon","onLeftOrRightInMenu","dropdown","tooltipAttributes","translatedTooltip","memDropdown","displayText","displayIcon","isMenuItemReference","isExpandingMenuItem","separator$1","unwrapReferences","realItems","getFromExpandingItem","submenuItems","newMenus","newExpansions","getFromItem","generateValueIfRequired","itemWithValue","newData","build$2","mainMenu","submenus","getMenuButtonApi","renderMenuButton","getFetch$1","getButton","getMenuItemAction","storage","orig","getMenuItemSetup","renderCommonSpec","actionOpt","domFinal","renderIconButtonSpec","renderIconButton","iconButtonSpec","renderButtonSpec","translatedText","borderless","renderButton","buttonSpec","getAction","buttonType","isMenuFooterButtonSpec","isNormalFooterButtonSpec","renderFooterButton","memButton_1","menuButtonSpec","fixedSpec","renderDialogButton","schema$i","coupledPart","selfName","otherName","lock","onLockedChange","parts$5","locked","lockClass","factory$7","coupledFieldBehaviours","field1Name","field1","field2Name","field2","getField1","getField2","getLock","FormCoupledInputs","formatSize","unitDec","maxDecimal","numText","parseSize","sizeText","numPattern","convertUnit","inInch","supported","noSizeConversion","ratioSizeConversion","makeRatioConverter","currentFieldText","otherFieldText","cValue","oValue","cSize","oSize","renderSizeInput","converter","ratioEvent","pLock","formGroup","getFieldPart","isField1","widthField","heightField","newSize","optCurrent","optOther","value1","value2","undo","redo","zoom","back","swap","tempTransform","transformApply","internal","saveState","disable$1","enable$1","external$2","renderEditPanel","imagePanel","createButton","createIconButton","disableAllComponents","eventcomp","enableAllComponents","panelDom","noop$1","emit$1","emitDisable","emitEnable","emitTransform","emitTempTransform","getBackSwap","memContainer","ButtonPanel","emitTransformApply","createBackButton","createSpacer","createApplyButton","makeCropTransform","getRect","cropPanelComponents","hideCrop","CropPanel","memSize","constrain","makeResizeTransform","resizePanelComponents","sizeInput","ResizePanel","makeValueTransform","horizontalFlip","verticalFlip","counterclockwiseRotate","clockwiseRotate","flipRotateOnAction","operation","flipRotateComponents","FlipRotatePanel","makeSlider","makeVariableSlider","valTransform","variableFilterPanelComponents","createVariableFilterPanel","filterPanelComponents","FilterPanel","BrightnessPanel","ContrastPanel","GammaPanel","makeColorTransform","makeColorSlider","redOpt","memRed","blueOpt","memBlue","greenOpt","memGreen","colorizePanelComponents","ColorizePanel","getTransformPanelEvent","panel","cropPanelUpdate","_anyInSystem","showCrop","resizePanelUpdate","measurements","getMeasurements","sharpenTransform","invertTransform","buttonPanelComponents","getApplyButton","global$b","global$c","global$d","global$e","global$f","getDocumentSize","scrollWidth","scrollHeight","updateWithTouchData","changedTouches","DragHelper","$eventOverlay","downButton","drag","startX","startY","handleElement","getElementById","handleElm","cursor","docSize","screenX","screenY","runtimeStyle","zIndex","opacity","appendTo","deltaX","deltaY","create$7","currentRect","viewPortRect","clampRect","containerElm","instance","dragHelpers","blockers","handles","xMul","yMul","getAbsoluteRect","outerRect","relativeRect","getRelativeRect","innerRect","getInnerRect","moveRect","startRect","setInnerRect","createDragHelper","blocker","repaint","activeHandle","moveAndBlock","keyCode","SPACEBAR","toggleVisibility","updateElementRect","setRect","setViewPortRect","setClampRect","helper","extend","CropRect","loadImage","renderImagePanel","initialUrl","memBg","zoomState","cropRect","rectState","viewRectState","repaintImg","img","panelW","panelH","cRect","zoomFit","updateSrc","aImg","lastViewRect","viewRect","inflate","currentZoom","newZoom","newRect","setButtonEnabled","enabled","renderSideBar","updateButtonUndoStates","undoEnabled","redoEnabled","memUndo","memRedo","UndoStack","removed","canUndo","canRedo","Delimiter","makeState","blobState","tempState","undoStack","getBlobState","setBlobState","getTempState","temp","updateTempState","newTempState","createState","destroyTempState","destroyState","destroyStates","states","addBlobState","addTempState","applyTempState","postApply","currentState","getHistoryStates","renderImageTools","historyStates","sideBar","disableUndoRedo","_simulatedEvent","oImg","unblock","imageResultToBlob","block","editPanel","applyButton","blobManipulate","manipulate","tempManipulate","manipulateApply","currentUrl","factory$8","initialValues","selectClasses","selectAttributes","selectBehaviours","found","HtmlSelect","renderSelectBox","translatedOptions","chevron","selectWrap","baseInputBehaviours","multiline","validatingBehaviours","vl","inputMode","inputmode","classname","flex","extraClasses2","maximized","renderInput","renderTextarea","events$c","streamConfig","streamState","streams","stream","processor","cancelEvent","ActiveStreaming","_config","setTimer","init$6","StreamingState","setup$2","streamInfo","sInfo","throttler","onStream","stopEvent","StreamingSchema","Streaming","setValueFromItem","itemData","setCursorAtEnd","setSelectionOn","setSelectionToEnd","attemptSelectOver","selectsOver","inputDisplay_1","getDisplayText","itemDisplay","itemExecute","make$5","navigateList","highlighter","previewing","focusBehaviours$1","responseTime","focusInInput","previousValue_1","_sandbox","pv","sandboxIsOpen","openClass","onItemExecute","dismissOnBlur","typeahead","typeaheadBehaviours","schema$j","parts$6","populateFromBrowse","Typeahead","wrap$2","bindFuture","resA","bindResult","mapResult","foldResult","whenError","whenValue","withTimeout","errorThunk","timedOut","nu$c","worker","value$2","error$1","fromResult$1","fromFuture","future","fromPromise","completer","FutureResult","separator$2","toMenuItem","staticMenuItem","toMenuItems","targets","filterLinkTargets","filteredTargets","headerTargets","linkInfo","anchorTargets","anchorTargetTop","anchorTop","anchorTargetBottom","anchorBottom","historyTargets","history","joinMenuLists","bothEmpty","filterByQuery","term","lowerCaseTerm","getItems","fileType","urlBackstage","urlInputValue","getLinkInformation","getHistory","errorId","renderUrlInput","updateHistory","urlEntry","addToHistory","filetype","memUrlBox","getValidationHandler","memInvalidIcon","invalidComp","_menu","_entry","makeIcon","errId","memStatus","optUrlPicker","getUrlPicker","browseUrlEvent","memUrlPickerButton","controlHWrapper","openUrlPicker","componentData","urlData","fieldname","chosenData","renderCheckbox","repBehaviour","toggleCheckboxHandler","className","memIcons","renderHtmlPanel","renderLabel$2","backstageShared","renderCollection","runOnItem","escapeAttribute","htmlLines","mapItemName","tgt","collectionEvents","currentActive","renderTable","renderTh","renderHeader","header","renderTd","renderTr","renderRows","renderPanel","make$6","makeIframe","iframeSpec","factories","bar","collection","alertbanner","textarea","iframe","checkbox","dropzone","selectbox","sizeinput","urlinput","customeditor","htmlpanel","imagetools","table","noFormParts","_name","interpretInForm","oldBackstage","newBackstage","interpretParts","interpretWithoutForm","bubbleAlignments","valignCentre","alignCentre","alignLeft","alignRight","getInlineDialogAnchor","contentAreaElement","lazyAnchorbar","useEditableAreaAnchor","editableAreaAnchor","standardAnchor","getBannerAnchor","getCursorAnchor","bodyElement","getNodeAnchor","getAnchors","useFixedToolbarContainer","getContentAreaContainer","inlineDialog","Anchors","hasCustomColors$1","getColors$1","getColorCols$2","ColorInputBackstage","isDraggableModal$1","DialogBackstage","defaultStyleFormats","isNestedFormat","isBlockFormat","isInlineFormat","isSelectorFormat","mapFormats","userFormats","fmt","customFormats","formats","formatName","registerCustomFormats","registerFormats","getStyleFormats","registeredUserFormats","processBasic","isSelectedFor","getPreviewFor","formatterSpec","getStylePreview","register$3","enrichSupported","enrichMenu","submenuSpec","enrichCustom","customSpec","newItem","doEnrich","newItems_1","getStyleItems","init$7","parseStyle","getCssText","settingsFormats","settingsFlattenedFormats","eventsFormats","eventsFlattenedFormats","replaceSettings","enriched","modifications","fromSettings","fromEvents","getFlattenedKeys","trim$1","hasContentEditableState","contentEditable","isContentEditableTrue","isContentEditableFalse","create$8","isChildOfContentEditableTrue","getElementText","innerText","getOrGenerateId","isAnchor","isValidAnchor","isEditable","isHeader","isValidHeader","getLevel","headerTarget","headerId","anchorTarget","anchorId","anchorText","getHeaderTargets","elms","getAnchorTargets","getTargetElements","hasTitle","find$5","LinkTargets","STORAGE_KEY","HISTORY_LENGTH","isHttpUrl","isArrayOfUrl","isRecordOfUrlArray","getAllHistory","unparsedHistory","localStorage","SyntaxError","setAllHistory","itemsWithoutUrl","hasOwnProperty$2","isTruthy","makeMap","getOpt$1","getTextSetting","defaultValue","getPicker","file_picker_callback","getPickerTypes","optFileTypes","file_picker_types","optLegacyTypes","file_browser_callback_types","optTypes","_picker","types","getPickerSetting","pickerTypes","entry","typeahead_urls","optValidator","file_picker_validator_handler","filepicker_validator_handler","UrlInputBackstage","init$8","contextMenuState","styleselect","isContextMenuOpen","setContextMenuState","expandable$1","showContextToolbarEvent","hideContextToolbarEvent","schema$k","parts$7","factory$9","tgroupBehaviours","itemSelector","ToolbarGroup","schema$l","enhanceGroups","parts$8","factory$a","setGroups","groups","getGroupContainer","shell","toolbarBehaviours","Toolbar","generate$6","output$1","apportion","total","parray","within","withinWidth","toUnit","fitLast","fits","overflow","overflower","fitAll","tryFit","divide","partition$3","storedGroups","bGroups","findFocusedComp","focusedElm","setOverflow","overflowGroup","builtGroups","focusedComp","availableWidth","overflows","schema$m","schema$n","parts$9","schema$o","parts$a","toggledClass","toggle$2","toolbarSandbox","position$2","bounder","setGroups$1","makeSandbox$1","factory$b","getToolbar","FloatingToolbarButton","buildGroups","refresh$1","memFloatingToolbarButton","overflowGroups","floatingToolbarButton","factory$c","getOverflowBounds","overflowToggledClass","splitToolbarBehaviours","getOverflow","SplitFloatingToolbar","getAnimationRoot","slideConfig","getDimensionProperty","dimension","getDimension","disableTransitions","shrinkingClass","growingClass","setShrunk","closedClass","setGrown","doImmediateShrink","slideState","_calculatedSize","setCollapsed","onStartShrink","onShrunk","doStartShrink","calculatedSize","doStartSmartShrink","shrinker","doStartGrow","wasShrinking","beforeSize","fullSize","startPartialGrow","startCompleteGrow","setStartSize","setExpanded","onStartGrow","refresh$2","isExpanded","grow","shrink","immediateShrink","hasGrown","hasShrunk","isCollapsed","isGrowing","isShrinking","isTransitioning","toggleGrow","SlidingApis","exhibit$6","events$d","propertyName","onGrown","ActiveSliding","SlidingSchema","init$9","SlidingState","Sliding","schema$p","parts$b","onClosed","onOpened","toggleToolbar","overf","refresh$3","factory$d","toolbarToggleEvent","doSetGroups","_button","SplitSlidingToolbar","toolbarHeightChange","ReadOnlyChannel","ReadOnlyDataSchema","setDisabledAll","forEach","broadcastReadonly","uiComponents","readonly","outerContainer","mothership","toggleToReadOnly","setupReadonlyModeSwitch","setMode","createReadonlyReceivingForOverflow","renderToolbarGroupCommon","toolbarGroup","renderToolbarGroup","getToolbarbehaviours","toolbarSpec","modeName","onAttached","initGroups","renderMoreToolbarCommon","cyclicKeying","renderFloatingMoreToolbar","baseSpec","overflowXOffset","headerElem","moreDrawerData","lazyHeader","headerBounds","docElem","docBounds","renderSlidingMoreToolbar","renderToolbar","scrolling","baseToolbarButtonFields","toolbarButtonSchema","createToolbarButton","baseMenuButtonFields","MenuButtonSchema","createMenuButton","splitButtonSchema","createSplitButton","baseToolbarToggleButtonFields","toggleButtonSchema","createToggleButton","groupToolbarButtonSchema","createGroupToolbarButton","contextBarFields","contextButtonFields","contextToggleButtonFields","launchButtonFields","launchToggleButtonFields","toggleOrNormal","contextformbutton","contextformtogglebutton","contextFormSchema","contextToolbarSchema","createContextToolbar","createContextForm","getState$2","reflectState","ReflectingApis","events$e","reflectingConfig","reflectingState","updateState","renderComponents","newComponents","channel","rawData","ActiveReflecting","init$a","optS","ReflectingState","ReflectingSchema","Reflecting","schema$q","arrowPart","arrow","buttonPart","btn","splitDropdown","parts$c","factory$e","openMenu","executeOnButton","buttonEvents","ariaDescriptor","splitDropdownBehaviours","SplitDropdown","getButtonApi","getToggleApi","getTooltipAttributes","focusButtonEvent","rtlIcon$1","rtlTransform$1","renderCommonStructure","needsRtlClass","renderFloatingToolbarButton","identifyButtons","renderCommonToolbarButton","specialisation","toolbarButtonBehaviours","renderToolbarButton","renderToolbarButtonWith","bonusEvents","renderToolbarToggleButton","renderToolbarToggleButtonWith","fetchChoices","renderSplitButton","displayChannel","underlinePath","buttonComp","getFormApi","runOnExecute$1","formApi","renderContextButton","bridged","renderContextToggleButton","generateOne$1","generate$7","mementos","asSpecs","findPrimary","compInSystem","renderContextForm","toolbarType","commands","ContextForm","getHorizontalBounds","contentAreaBox","viewportBounds","contentBoxWidth","maxViewportWidth","getVerticalBounds","headerBox","isToolbarBelowContentArea","isToolbarAbove","containerBounds","getContextToolbarBounds","toolbarOrMenubarEnabled","_b","matchTargetWith","toolbarApi","lookup$1","scopes","rootElem","isOutsideRoot","startNode","inNodeScope","inEditorScope","ToolbarLookup","categorise","contextToolbars","forms","formNavigators","lookupTable","registerForm","contextForm","launch","registerToolbar","contextToolbar","ToolbarScopes","forwardSlideEvent","backSlideEvent","changeSlideEvent","resizingClass","renderContextToolbar","currentWidth","newContents","oldContents","forwardContents","generateSelectItems","_editor","generateItem","rawItem","response","si","invalid","validateItems","preItems","getCurrentValue","shouldHide","createMenuItems","createSelectButton","getComponent","setInitialValue","nodeChangeHandler","rawFormats","buildBasicStaticDataset","ResizeTypes","delimiter","SemiColon","buildBasicSettingsDataset","settingName","alignMenuItems","command","getSpec","getMatchingValue","_format","updateSelectMenuIcon","alignment","canApply","createAlignSelect","alignSelectMenu","defaultFontsFormats","systemStackFonts","splitFonts","fontFamily","fonts","font","isSystemFontStack","matchesSystemStack","getSpec$1","getFirstFont","queryCommandValue","matchOpt","updateSelectMenuText","createFontSelect","fontSelectMenu","defaultFontsizeFormats","legacyFontSizes","round$1","precision","factor","toPt","fontSize","toLegacy","getSpec$2","_loop_1","pt","legacy","Space","createFontsizeSelect","fontsizeSelectMenu","findNearest","getStyles","parents","matchNode","getCurrentSelectionParents","currentNode","onSetupFormatToggle","unbindCell","formatChanged","initialized","onActionToggleFormat","defaultBlocks","getSpec$3","nodeChangeEvent","detectedFormat","createFormatSelect","formatSelectMenu","getSpec$4","getFormatItems","flattenedItems","createStyleSelect","styleSelectMenu","defaultToolbar","renderFromBridge","bridgeBuilder","togglebutton","menubutton","splitbutton","grouptoolbarbutton","identify","allowToolbarGroups","TopToBottom","floating","styleSelectButton","fontsizeSelectButton","fontSelectButton","formatButton","alignMenuButton","extractFrom","bespokeButtons","fontsizeselect","fontselect","formatselect","align","removeUnusedDefaults","filteredItemGroups","subItem","convertStringToolbar","strToolbar","groupsStrings","isToolbarGroupSettingArray","createToolbar","toolbarConfig","lookupButton","toolbarItem","prefixes","toolbarGroups","bubbleSize","bubbleAlignments$1","anchorOverrides","desktopAnchorSpecLayouts","mobileAnchorSpecLayouts","getAnchorLayout","register$4","registryContextToolbars","contextbar","isRangeOverlapping","aTop","aBottom","bTop","bBottom","getLastElementVerticalBound","nodeBounds","ele","diffTop","shouldContextToolbarHide","lastElementBounds","contextToolbarBounds","forceHide","hideOrRepositionIfNecessary","lastAnchor","contextBarEle","wrapInPopDialog","shortcuts","getScopes","alloySpec","buildToolbar","default","allButtons","toolbarKey","launchContext","sElem","launchContextToolbar","setEditorTimeout","ContextToolbar","setup$3","ship","fireDismissPopups","onTouchstart","onTouchmove","onTouchend","onMousedown","onMouseup","onContentClick","onContentMouseup","onWindowScroll","onWindowResize","onEditorResize","Events$1","parts$d","partType$1","schema$r","customListDetail","itemsPart","parts$e","name$2","factory$f","setItems","getListContainer","itemComps","numListsRequired","numListsToAdd","itemsToAdd","makeItem","itemsToRemove","builtLists","setupItem","listBehaviours","CustomList","getOffsetParent","isFixed","offsetParent$1","getOrigin","morphAdt","static","appear","contextualInfo","transitionClass","fadeOutClass","fadeInClass","disappear","isPartiallyVisible","isTopCompletelyVisible","isBottomCompletelyVisible","isVisibleForModes","getPrior","getInitialPosition","storePrior","setInitialPosition","revertToOriginal","offsetBox_1","morphToOriginal","dockInfo","morphToFixed","winBox","isTop","getMorph","isDocked","getMorphToOriginal","morphToStatic","onUndocked","morphToCoord","method","onDocked","updateVisibility","morphToDocked","contextual","contextInfo","lazyContext","setVisible","refreshInternal","lazyViewport","morph","setDocked","resetInternal","refresh$4","reset","DockingApis","events$f","dockState","onShown","onHidden","ActiveDocking","DockingSchema","init$b","docked","initialBounds","DockingState","Docking","visibility","editorStickyOnClass","editorStickyOffClass","scrollFromBehindHeader","containerHeader","viewHeight","innerHeight","scrollPos","markerElement","markerPos","markerHeight","markerTop","markerBottom","editorHeaderPos","editorHeaderHeight","editorHeaderTop","editorHeaderBottom","editorHeaderDockedAtTop","editorHeaderDockedAtBottom","updateIframeContentFlow","isToolbarTop","getOccupiedHeight","parentElem","padding","parentWidth","updateSinkVisibility","sinkElem","updateEditorClasses","editorContainer","restoreFocus","focusedElem","activeElm","findFocusedElem","rootElm","setup$4","isDocked$1","getIframeBehaviours","getBehaviours$2","runOnSinkElement","onDockingSwitch","additionalBehaviours","headerHeight","boxHeight","topBound","StickyHeader","setup$5","isDocked$2","getBehaviours$3","StaticHeader","sticky","factory$g","setMenus","activeButton","hoveredButton","activeComp","hoveredComp","prev","SilverMenubar","owner$4","schema$s","getPartName$1","sketch$2","sSpec","slot","make$7","getSlotNames","getSlot","onSlot","def","onSlots","doShowing","doShow","doHide","hideSlot","hideSlots","hideAllSlots","showSlot","slotBehaviours","slotApis","SlotContainer","sidebarSchema","createSidebar","setup$6","sidebars","addToggleButton","handleToggle","makePanels","panelConfigs","sidepanel","optSidePanelSpec","sidePanelSpec","makeSidebar","slotContainer","setSidebar","sidebar","optSlider","toggleSidebar","optSlotContainer","whichSidebar","sidebarOpen","fixSize","autoSize","renderSidebar","getAttrs","fromHtml$2","renderSpinner","toggleThrobber","renderThrobber","setup$7","lazyThrobber","throbberState","timerId","factory$h","getSocket","getHeader","setToolbar","setToolbars","mToolbar","refreshToolbar","getThrobber","focusToolbar","optToolbar","setMenubar","menubar","focusMenubar","partMenubar","toolbarFactory","sliding","partMultipleToolbar","tc","partToolbar","renderer","lazyToolbar","lazyMoreButton","partHeader","partSocket","partSidebar","partThrobber","OuterContainer","grps","grp","renderedToolbars","defaultMenubar","defaultMenus","edit","tools","help","make$8","removedMenuItems","itemName","removedMenuItem","parseItemsString","identifyMenus","rawMenuData","userDefinedMenus","validMenus","menuData","isNotSeparator","fireSkinLoaded$1","_skinLoaded","fireSkinLoadError$1","SkinLoaded","loadSkin","isInline","skinUiCss","contentCSS","styleSheetLoader","rawUiConfig","toolbarButtonsConfig","detection","isiOS12","setupEvents","initialDocEle","lastWindowDimensions","innerWidth","lastDocumentDimensions","docEle","outer","inner","elementLoad","lastToolbarWidth","targetNode","socket","limit","addQueryValueHandler","toolbarMode","refreshDrawer","iframeContainer","Iframe","parseToInt","numToPx","calcCappedSize","minSize","maxSize","minOverride","maxOverride","Utils","getHeight$1","baseHeight","minHeight","getHeightWithFallback","getWidth$1","baseWidth","minWidth","getWidthWithFallback","getTargetPosAndHeight","targetElm","render$1","floatContainer","isSticky","editorMaxWidthOpt","isSplitToolbar","prevPosAndHeight","updateChromePosition","tbar","targetBounds","bodyMargin","repositionFloatingUiComponents","updateChromeUi","resetDocking","toolbar_1","addClass","removeClass","uiContainer","requestAnimationFrame","posAndHeight","Inline","register$5","alignToolbarButtons","cmd","alignNoneToolbarButton","addButton","AlignmentButtons","toggleFormat","registerFormatButtons","name_1","registerCommandButtons","registerCommandToggleButtons","registerButtons","registerMenuItems","addMenuItem","register$6","SimpleControls","toggleUndoRedoState","checkState","onUndoStateChange","registerMenuItems$1","registerButtons$1","register$7","UndoRedo","toggleVisualAidState","hasVisual","onVisualAid","registerMenuItems$2","addToggleMenuItem","registerToolbarButton","register$8","VisualAid","toggleOutdentState","queryCommandState","onNodeChange","registerButtons$2","register$9","IndentOutdent","register$a","ComplexControls","setup$8","FormatControls","nu$d","transpose$1","dx","dy","isTouchEvent$1","fromPageXY","pageX","pageY","fromClientXY","transposeContentAreaContainer","containerPos","getPos","getPointAnchor","getSelectionAnchor","getNodeAnchor$1","getAnchorSpec","isTriggeredByKeyboardEvent","initAndShow","buildMenu","contextmenu","anchorSpec","bubbleSize$1","bubbleAlignments$2","isTouchWithinSelection","touch_1","rngRectOpt","rngRect","getAnchorSpec$1","setupiOSOverrides","originalSelection","selectionReset","setRng","unbindEventListeners","preventMousedown","clearSelectionReset","initAndShow$1","shouldHighlightImmediately","openiOS_1","patchPipeConfig","shouldNeverUseNative","contextmenu_never_use_native","getMenuItems","defaultItems","contextMenus","isContextMenuDisabled","getContextMenu","Settings$1","isSeparator$1","separator$3","makeContextItem","addContextMenuGroup","groupItems","lastMenuItem","generateContextMenu","selectedElement","sections","allItems","isNativeOverrideKeyEvent","isTriggeredByKeyboard","pointerType","setup$9","hideContextMenu","_e","showContextMenu","initAndShow$2","hideEvents","adt$c","subtract","add$4","transform$1","changes","asFixed","coord","asAbsolute","asOffset","withinRange","coord1","coord2","getDeltas","toStyles","stylesOpt","translate$2","absolute$3","fixed$1","absorb","partialCoord","originalCoord","absorbOne","stencil","optX","optY","get$e","snapsInfo","leftAttr","topAttr","set$8","getCoords","snapInfo","moveOrSnap","newCoord","mustSnap","findClosestSnap","findSnap","fixedCoord","spanned","stopDrag","findMatchingSnap","snaps","sensor","inRange","getSnapPoints","matchSnap","bestSnap","deltas","bestDeltas","currAvg","bestAvg","snapTo","snapTo$1","dragConfig","repositionTarget","snapPin","DraggingApis","initialAttribute","resetZIndex","initZIndex","changeZIndex","zindex","instigate","anyComponent","discard","createComponent","blockerClass","blockerEvents","SnapSchema","schema$t","getCurrentCoord","location","clampCoords","coords","absoluteCoord","newCoords","offset$1","calcNewCoord","optSnaps","currentCoord","snapping","onSensor","dragBy","onDrag","calcStartData","move$1","dragState","dragMode","dragStartData","getStartData","dlt","updateStartState","setStartData","init$c","dragApi","forceDrop","drop","delayDrop","getData$1","getDelta$1","MouseData","events$g","stop$1","schema$u","init$d","getDataFrom","getData$2","getDelta$2","TouchData","events$h","blockerCell","schema$v","events$i","schema$w","mouse","mouseOrTouch","DraggingBranches","init$e","previous","calculateDelta","dragEvent","nuData","DragState","Dragging","dragger","platform$1","snapWidth","snapOffset","calcSnap","selectorOpt","td","selectorHandle","sensorLeft","sensorTop","sensorWidth","sensorHeight","getSnapsConfig","isSameCell","cellOpt","currentTd","createSelector","setup$a","tlTds","brTds","startCell","finishCell","getTopLeftSnap","memTopLeft","getTopLeftSnaps","getBottomRightSnap","memBottomRight","getBottomRightSnaps","topLeftSnaps","bottomRightSnaps","bottomRight","showOrHideHandle","isAbove","isBelow","cellRect","viewportHeight","aboveViewport","belowViewport","getSnapConfig","snapTopLeft","snapLastTopLeft","snapBottomRight","snapLastBottomRight","otherCells","upOrLeftCells","downOrRightCells","TableSelectorHandles","getDimensions","resizeType","originalHeight","originalWidth","Both","resize$3","dim","isHidden$1","renderElementPath","getDataPath","newPathElements","divider","newAcc","updatePath","newPath","parent_1","isDefaultPrevented","isPropagationStopped","ElementPath","renderWordCount","replaceCountText","words","characters","currentVal","newMode","wordCount","renderStatusbar","renderResizeHandlerIcon","renderBranding","linkHtml","getResizeType","plugins","None","Vertical","getTextComponents","getComponents","setup$b","lazyOuterContainer","platformClasses","touchPlatformClass","deviceClasses","dirAttributes","verticalDirAttributes","isHeaderDocked","memAnchorBar","lazyAnchorBar","throbber","sb","statusbar","socketSidebarContainer","hasMultipleToolbar","hasToolbar","hasMenubar","getPartToolbar","editorComponents","containerComponents","border","getUi","broadcastAll","setEditorSize","parsedHeight","parsedWidth","renderUI","toolbarGroupButtonConfig","addGroupToolbarButton","toolbarOpt","Render","describedBy","describedElement","describeElement","describeId","AriaLabel","labelledBy","labelledElement","labelElement","schema$x","basic","parts$f","dragBlockClass","getDragBounds","factory$i","dialogBusyEvent","dialogIdleEvent","busyBehaviours","showDialog","busyComp","externalBlocker","bc","getBusySpec","busySpec","busy","hideDialog","blockerDom","getDialogBody","getDialogFooter","setBusy","setIdle","modalEventsId","getFooter","modalBehaviours","ModalDialog","alertBannerFields","alertBannerSchema","createBarFields","itemsField","buttonFields","buttonSchema","checkboxFields","checkboxSchema","checkboxDataProcessor","formComponentFields","formComponentWithLabelFields","colorInputFields","colorInputSchema","colorInputDataProcessor","colorPickerFields","colorPickerSchema","colorPickerDataProcessor","dropZoneFields","dropZoneSchema","dropZoneDataProcessor","createGridFields","iframeFields","iframeSchema","iframeDataProcessor","inputFields","inputSchema","inputDataProcessor","selectBoxFields","selectBoxSchema","selectBoxDataProcessor","sizeInputFields","sizeInputSchema","sizeInputDataProcessor","textAreaFields","textAreaSchema","textAreaDataProcessor","urlInputFields","urlInputSchema","urlInputDataProcessor","customEditorFields","customEditorFieldsOld","customEditorSchema","customEditorDataProcessor","htmlPanelFields","htmlPanelSchema","imageToolsFields","imageToolsSchema","collectionFields","collectionSchema","collectionDataProcessor","createLabelFields","tableFields","tableSchema","createItemsField","itemSchema$2","sErr","passValue","panelSchema","panelFields","tabFields","tabPanelFields","tabPanelSchema","dialogToggleMenuItemSchema","dialogToggleMenuItemDataProcessor","baseButtonFields","dialogButtonFields","normalButtonFields","menuButtonFields","dialogButtonSchema","dialogButtonFields$1","dialogButtonSchema$1","dialogSchema","tabpanel","createDialog","getAllObjects","isNamedItem","dataProcessors","togglemenuitem","getDataProcessor","getNamedItems","createDataValidator","namedItems","urlDialogButtonSchema","urlDialogSchema","createUrlDialog","extract$1","internalDialog","dataValidator","DialogManager","openUrl","redial","value$3","isSet","toValidValues","renderBodyPanel","memForm","formValue","vals","factory$j","tabButtonBehaviours","TabButton","schema$y","tabsPart","barDetail","dismissTab$1","tabbar","changeTab$1","clickToDismiss","tabClass","parts$g","factory$k","tabbarBehaviours","selectedClass","tab","Tabbar","factory$l","tabviewBehaviours","Tabview","schema$z","barPart","tabs","viewPart","parts$h","factory$m","tabValue","tabview","tabWithValue","tabData","onChangeTab","changeTabBy","section","byPred","tabSectionBehaviours","selectFirst","onDismissTab","getViewItems","showTab","tabKey","getTabIfNotActive","optTab","TabSection","measureHeights","allTabs","tabviewComp","getMaxHeight","heights","getMaxTabviewHeight","tablist","documentElement$1","tabviewHeight","isTabListBeside","currentTabHeight","dialogTopMargin","dialogBottomMargin","dialogHeight","chromeHeight","setTabviewHeight","updateTabviewHeight","dialogBody","maxTabHeight","getTabview","smartTabHeight","extraEvents","maxTabHeightOpt","oldHeight","naiveTabHeight","SendDataToSectionChannel","SendDataToViewChannel","renderTabPanel","storedValue","updateDataWithForm","formData","validData","currentData","setDataOnForm","oldTab","tabMode","_viewItems","oldName","tsection","dialogChannel","titleChannel","bodyChannel","footerChannel","bodySendMessageChannel","renderBody","ariaAttrs","incoming","_comp","isTabPanel","ariaAttributes","renderInlineBody","contentId","renderModalBody","bodySpec","renderIframeBody","hiddenHeader","pClose","pUntitled","pBodyMessage","pFooter","footer","pFooterGroup","startButtons","endButtons","renderDialog","dialogClass","blockerBackdropClass","scrollLockClass","extraStyles","dialogEvents","renderClose","renderTitle","renderDragHandle","renderInlineHeader","titleId","renderModalHeader","pTitle","pHandle","draghandle","draggable","getEventExtras","lazyDialog","closeWindow","onBlock","blockEvent","bs","onUnblock","renderModalDialog","mapMenuButtons","mapItems","extractCellsToObject","menuButton","innerAcc","initCommonEvents","fireApiEvent","_event","initUrlDialog","getInstanceApi","withSpec","_c","currentDialog","initDialog","currentDialogInit","cur","onTabChange","newTabName","oldTabName","SilverDialogEvents","makeButton","lookup$2","footerButtons","buttonName","memButton","_data","buttonGroups","makeGroup","renderFooter","initSpec","lookupByName","renderInlineFooter","renderModalFooter","getCompByName","form_1","getFormWrapper","footerState","validateData","dialogState","getDialogApi","doRedial","menuItemStates","withRoot","valueComp","representedValues","menuItemCurrentState","setData","prevData","instanceApi","mergedData","newInternalData","bodyState","tabSection","dialogInit","renderDialog$1","storagedMenuButtons","objOfCells","dialogSize","modalAccess","getForm","outerForm","renderInlineDialog","dialogLabelId","dialogContentId","memHeader","memBody","memFooter","global$g","getUrlDialogApi","sendMessage","SUPPORTED_MESSAGE_ACTIONS","isSupportedMessage","mceAction","isCustomMessage","handleMessage","insertContent","renderUrlDialog","iframeUri","base_uri","href","iframeDomain","protocol","host","port","messageHandlerUnbinder","isSameOrigin","onMessage","unbinder","iframeEle","iframeWin","postMessage","setup$c","closeDialog","alertDialog","memFooterClose","titleSpec","closeSpec","footerCloseButton","setup$d","confirmDialog","memFooterYes","footerNo","footerYesButton","validateData$1","isAlertOrConfirmDialog","inlineAdditionalBehaviours","setup$e","isStickyToolbar$1","openInlineDialog","openModalDialog","openModalUrlDialog","internalInitialData","config$1","refreshDocking","dialogUi","inlineDialogComp","confirm","alert","WindowManager","Theme","windowMgr","getWindowManagerImpl","getNotificationManagerImpl","getSeparatorHtml","shouldSplitBlock","getPageBreakClass","getPlaceholderHtml","transparentSrc","separatorHtml","pageBreakSeparatorRegExp","serializer","addNodeFilter","nodes","getBlockElements","FilterContent","pagebreak_split_block","Commands","hasClass","ResolveName","Buttons","Plugin","_vm","_h","$createElement","_self","staticClass","initOptions","updateValue","$t","$event","newInlineFile","selectCallback","fileInputOptions","selectedFile","relation","staticRenderFns","validEvents","isValidKey","bindHandlers","initEvent","bindModelHandlers","currentContent","modelEvents","$props","normalizedEvents","$watch","prevVal","$emit","initEditor","$listeners","uuid","now","isTextarea","tagName","normalizePluginArray","mergePlugins","initPlugins","inputPlugins","injectScriptTag","scriptTag","referrerPolicy","scriptLoaded","editorProps","apiKey","cloudChannel","Boolean","scriptState","renderInline","renderIframe","initialise","finalInit","elementId","inlineEditor","Editor","created","watch","mounted","$el","beforeDestroy","cssVar","groupBy","wasType","is$1","fromElements","lastChild","fireListEvent","unsafe","actual","Global$1","htmlElement","HTMLElement","isTextNode","isListNode","isOlUlNode","isListItemNode","isDlItemNode","isTableCellNode","isBr","isFirstChild","isLastChild","isTextBlock","getTextBlockElements","blockElements","isBogusBr","previousSibling","isEmpty","keepBookmarks","isChildOfBody","isChildOf","NodeType","getParentList","selectionStart","getClosestListRootElm","isParentListSelected","parentList","selectedBlocks","findSubLists","grep","getSelectedSubLists","getSelectedBlocks","findParentListItemsNodes","listItemsElms","parentLi","getSelectedListItems","getSelectedDlItems","parentTableCell","findLastParentListNode","parentLists","getSelectedLists","firstList","subsequentLists","getSelectedListRoots","selectedLists","getUniqueListRoots","lists","listRoots","isList","shouldIndentOnTab","getForcedRootBlock","getForcedRootBlockAttrs","createTextBlock","contentNode","textBlock","hasContentNode","createFragment","blockName","setAttribs","shallowAs","mutate","joinSegment","joinSegments","segments","appendSegments","head$1","tail","createSegment","listType","createSegments","populateSegments","listAttributes","itemAttributes","normalizeSegment","appendItem","writeShallow","cast","newCast","depth","writeDeep","composeList","entries","isList$1","hasFirstChildList","hasLastChildList","isIndented","cloneItemContent","li","createEntry","indentEntry","indentation","cloneListProperties","previousSiblingEntry","normalizeEntries","matchingEntry","parseItem","itemSelection","selectionState","currentItemEntry","childListEntries","parseList","parser","newDepth","parseLists","initialDepth","sourceList","outdentedComposer","indentedComposer","contentDocument","composeEntries","groupIsIndented","indentSelectedEntries","getItemSelection","selectedListItems","listIndentation","entrySets","entrySet","composedLists","composedList","splitList","ul","tmpRng","bookmarks","newBlock","removeAndKeepBookmarks","insertAfter","SplitList","outdentDlItem","dl","indentDlItem","dlIndentation","dlItems","getNormalizedPoint","normalizeRange","outRng","rangeStart","rangeEnd","Range","selectionIndentation","isHandled","bookmark","getBookmark","moveToBookmark","indentListSelection","outdentListSelection","flattenListSelection","DOM$1","createBookmark","setupEndPoint","offsetNode","resolveBookmark","restoreEndPoint","nodeIndex","Bookmark","isCustomList","listToggleActionFromListName","listName","updateListStyle","setStyle","updateListAttrs","updateListWithDetails","removeStyles","getEndPointNode","getSelectedTextBlocks","textBlocks","endNode","siblings","isBookmarkNode","hasCompatibleStyle","sib","sibStyle","detailStyle","applyList","listItemName","listBlock","rename","mergeWithAdjacentLists","isValidLists","list1","list2","hasSameListStyle","targetStyle","hasSameClasses","elm1","elm2","shouldMerge","updateList","newList","toggleMultipleLists","hasListStyleDetail","toggleSingleList","toggleList","selectedSubLists","ToggleList","DOM$2","normalizeList","normalizeLists","NormalizeLists","findNextCaretContainer","isForward","nonEmptyBlocks","getNonEmptyElements","walker","hasOnlyOneBlockChild","unwrapSingleBlockChild","moveChildren","fromElm","toElm","mergeLiElements","listNode","$","nestedLists","mergeIntoEmptyLi","fromLi","toLi","mergeForward","mergeBackward","resolvedBookmark","backspaceDeleteFromListToListCaret","selectionStartElm","rng_1","otherLi_1","removeBlock","parentBlock","backspaceDeleteIntoListCaret","otherLi_2","backspaceDeleteCaret","backspaceDeleteRange","startListParent","backspaceDelete","DELETE","Delete","Api","queryListCommandState","addQueryStateHandler","setupTabKey","metaKeyPressed","Keyboard","listState","tableCellIndex","hasPlugin","plugin","inArray","getScripts","getAudioTemplateCallback","getVideoTemplateCallback","hasLiveEmbeds","shouldFilterHtml","getUrlResolver","hasAltSource","hasPoster","hasDimensions","getVideoScriptMatch","trimPx","getEphoxEmbedData","altsource","poster","htmlToData","isEphoxEmbed","allow_conditional_comments","movie","videoScript","guess","mimes","mp3","m4a","wav","mp4","webm","ogg","swf","fileEnd","mime","Mime","setAttributes","updatedAttrs","updateEphoxEmbed","styleMap","serializeStyle","sources","updateHtml","updateAll","hasImage","writer","sourceCount","comment","cdata","imgAttrs","UpdateHtml","urlPatterns","regex","allowFullscreen","getProtocol","protocolMatches","getUrl","newUrl","matchPattern","getIframeHtml","getFlashHtml","getAudioHtml","audioTemplateCallback","altsourcemime","getVideoHtml","videoTemplateCallback","sourcemime","getScriptHtml","dataToHtml","dataIn","embed","convertURL","embedPromise","rej","wrappedResolve","defaultPromise","loadedData","getEmbedHtml","embedHandler","isCached","Service","extractMeta","sourceInput","mainData","metaData","getFromData","getFromMetaData","getNonEmptyValue","getFromValueFirst","getFromMetaFirst","dims","errorMessage","notificationManager","snippetToData","embedSnippet","isMediaElement","getEditorData","snippet","serialize","addEmbedHtml","snippetData","selectPlaceholder","beforeObjects","afterObjects","handleInsert","submitForm","editorData","handleSource","serviceData","handleEmbed","dataFromEmbed","handleUpdate","mediaInput","generalTab","embedTextarea","embedTab","advancedFormItems","advancedTab","Dialog","sanitize","blocked","attrName","Sanitize","createPlaceholderNode","placeHolder","shortEnded","retainAttributesAndInnerHtml","createPreviewIframeNode","previewWrapper","previewNode","shimNode","allowfullscreen","class","frameborder","sourceNode","attrValue","attribs","ai","escape","isPageEmbedWrapper","nodeClass","isWithinEmbedWrapper","placeHolderConverter","ceFalse","Nodes","specialElements","getSpecialElements","boolAttrs","getBoolAttrs","addAttributeFilter","realElm","innerNode","realElmName","unescape","$elm","selectedNode","getAttrib","objectType","stateSelectorAdapter","selectorChangedWithUnbind","_typeof","Symbol","iterator","getPreviewDialogWidth","getPreviewDialogHeight","getContentStyle","shouldUseContentCssCors","getPreviewHtml","headHtml","contentStyle","getURI","cors","bodyId","body_id","bodyClass","body_class","isMetaKeyPressed","preventClicksOnLinksScript","directionality","dirAttr","previewHtml","IframeContent","dataApi","hasProPlugin","DetectProPlugin","clipboard","quirks","firePastePreProcess","isWordHtml","wordContent","firePastePostProcess","firePastePlainTextToggle","firePaste","ieFake","togglePlainTextPaste","pasteFormat","Actions","pasteHtml","pasteText","par","asyncValues","asyncValue","par$1","futures","traverse","internalMimeType","internalMark","mark","unmark","isMarked","InternalHtml","internalHtmlMime","isPlainText","toBRs","openContainer","rootTag","rootAttrs","encodeAllRaw","toBlockElements","blocks","tagOpen","tagClose","paragraphs","stitch","Newlines","shouldBlockDrop","shouldPasteDataImages","shouldFilterDrop","getPreProcess","getPostProcess","getWebkitStyles","shouldRemoveWebKitStyles","shouldMergeFormats","isSmartPasteEnabled","isPasteAsTextEnabled","getRetainStyleProps","getWordValidElements","defaultValidElements","shouldConvertWordFakeLists","shouldUseDefaultFilters","domParser","shortEndedElements","getShortEndedElements","ignoreElements","walk","trimHtml","trimSpaces","s1","s2","createIdGenerator","isMsEdge","isWordContent","isNumericList","isBulletList","convertFakeListsToProperLists","currentListNode","prevListNode","lastLevel","txt","trimListStart","regExp","removeIgnoredNodes","_listIgnore","convertParagraphToLi","paragraphNode","_listLevel","nodeText","filterStyles","validStyles","styleValue","outputStyles","filterWordContent","retainStyleProperties","spaces","validElements","valid_elements","valid_children","attributesOrder","preProcess","WordFilter","preProcess$1","forced_root_block","isRootContent","processResult","cancelled","postProcessFilter","tempBody","postProcessArgs","filterContent","preProcessArgs","filteredContent","hasEventListeners","ProcessFilters","paste","isAbsoluteUrl","isImageUrl","createImage","pasteHtmlFn","createLink","linkSelection","insertImage","smartInsertContent","pasteAsText","SmartPaste","isCollapsibleWhitespace","isNewLineChar","isNewline","normalizeWhitespace","pcIsSpace","doPaste","pasteHtml$1","internalFlag","encodedText","normalizedText","forced_root_block_attrs","getDataTransferItems","mceInternalUrlPrefix","legacyText","contentType","getClipboardContent","clipboardEvent","clipboardData","hasContentType","clipboardContent","mimeType","hasHtmlOrText","getBase64FromUri","isValidDataUriImage","imgElm","images_dataimg_filter","extractFilename","uniqueId","pasteImage","imageItem","images_reuse_filename","blobCache","editorUpload","blobInfo","existingBlobInfo","findFirst","cachedBlobInfo","blobUri","isClipboardEvent","readBlobsAsDataUris","getAsFile","onload","getImagesFromDataTransfer","images","pasteImageData","paste_data_images","blobResults","isBrokenAndroidClipboardEvent","isKeyboardPasteEvent","registerEventHandlers","pasteBin","keyboardPastePlainTextState","keyboardPasteEvent","insertClipboardContent","isKeyBoardPaste","plainTextMode","isPlainTextHtml","isImage","isDefaultContent","removePasteBinOnKeyUp","webkit","getLastRng","registerEventsAndFilters","isPasteInsert","isWebKitFakeUrl","isDataUri","allow_html_data_urls","getPasteBinParent","isExternalPasteBin","delegatePasteEvents","pasteBinElm","pasteBinDefaultContent","isDefault","lastRngCell","gecko","pasteBinClone","pasteBinClones","dirtyWrappers","cleanWrapper","copyAndRemove","isPasteBin","PasteBin","Clipboard","hasWorkingClipboardApi","iOS","setHtml5Clipboard","clearData","setClipboardData","markedHtml","contenteditable","setStyles","offscreenRange","selectNodeContents","isTableSelection","hasSelectedContent","CutCopy","getCaretRangeFromEvent","getCaretRangeFromPoint","isPlainTextFileUrl","plainTextContent","setFocusedRange","draggingInternallyState","dropContent","content_1","DragDrop","postProcess","PrePostProcess","addPreProcessFilter","filterFunc","addPostProcessFilter","removeExplorerBrElementsAfterBlocks","explorerBlocksRegExp","removeWebKitStyles","webKitStyles","webKitStylesSetting","dom_1","node_1","decode","removeUnderlineAndFontInAnchor","Quirks","makeSetupHandler","pastePlainTextToggleHandler","primaryKey","includes","invalidTypeMessage","incorrect","COMMENT","isComment","startsWith","sourceDom","targetDom","cssText","rawParent","prevSibling","detailnew","extended","rowdata","elementnew","rowdatanew","rowcells","rowdetails","ancestors","ancestors$1","children$2","child$1","child$2","firstLayer","filterFirstLayer","LayerSelector","tags","isRootOrUpperTable","notCell","neighbours","neighbourCells","neighbourRows","firstCell","grid$1","rowProp","colProp","rowsCount","cols","TableLookup","fromTable","parentSection","parentName","rowspan","colspan","fromPastedRows","example","DetailsList","getAt","warehouse","findItem","filtered","filterItems","maxRows","maxColumns","currentRow","cr","cc","newpos","justCells","Warehouse","statsStruct","findSelectedStats","house","totalColumns","totalRows","minRow","minCol","maxRow","maxCol","endRow","endCol","seenSelected","fillInGaps","stats","needCell","clean","emptyRows","selectedSelector","unselectedCells","CopySelected","copy$1","cloneChildren","createCell","replica","pasteReplace","cloneFormats","oldCell","newCell","first$1","firstText","formatSelector","clonedFormat","cellOperations","formatsToClone","docu","lastNode","gap","TableFill","inSelection","leftEdge","rightEdge","topEdge","bottomEdge","finishCol","finishRow","isWithin","isRectangular","isRect","detailIsWithin","CellBounds","detailA","detailB","getAnyBox","startCoords","finishCoords","sc","fc","getBox","CellGroup","intercepts","parentCell","innerCell","isContainedBy","c1","c2","CellFinder","deltaColumn","getWarehouse","intercepts$1","nestedIntercepts","firstTable","lastTable","optStartCell","optLastCell","lastCell","getBox$1","TablePositions","TagBoundaries","DomUniverse","isEmptyTag","isNonEditable","comparePosition","copyAttributesTo","destination","as","up","down","copyTo","afterAll","appendAll","setText","leftRight","brokenPath","bisect","universe","ind","breakToRight","second","breakToLeft","prior","breakPath","breaker","splits","breakage","nextChild","look","oneAll","unsafeOne","commonElement","eq$1","unsafeSubset","ps1","ps2","finder","topDown","startIndex","sIndex","eIndex","ancestors$2","pruned1","pruned2","firstpath","secondpath","subset","ancs","SubsetFn","sharedOne","subset$1","ancestors$3","breakToLeft$1","breakToRight$1","breakPath$1","Parent","sharedOne$1","_universe","subset$2","ancestors$4","breakToLeft$2","breakToRight$2","breakPath$2","DomParent","Identified","getIsRoot","rootTable","boxes","startTable","finishTable","ancestorCells","lca","lcaTable","finishAncestorCells","startAncestorCells","retrieve","sels","lastSelectedSelector","getEdges","firstSelectedSelector","tbl","expandTo","shiftSelection","CellSelection","retrieve$1","retrieveBox","firstAncestor","lastAncestor","fA","lA","TableSelection","attributeSelector","firstSelected","lastSelected","Ephemera","type$1","onMultiple","onSingle","SelectionTypes","selections","unmergable","hasSpan","mergable","_env","CellOperations","noMenu","notCell$1","paste$1","pasteRows","generators","TableTargets","extractSelected","serializeElements","getTextContent","registerEvents","cellSelection","multiCellContext","domCell","pasteCells","needManualCalc","toNumber","px","getProp","getCalculatedHeight","paddingTop","paddingBottom","borderTop","borderBottom","boxSizing","borders","RuntimeSize","genericSizeRegex","percentageBasedSizeRegex","pixelBasedSizeRegex","setPixelWidth","amount","setPercentageWidth","getHeightValue","normalizePixelSize","getTotalHeight","getSpan","getRawWidth","cssWidth","normalizePercentageWidth","cellWidth","tableSize","pixelWidth","choosePercentageSize","percentMatch","intWidth","getPercentageWidth","normalizePixelWidth","choosePixelSize","pixelMatch","floatWidth","getPixelWidth","getGenericWidth","setGenericWidth","Sizes","halve","main","CellMutations","rowInfo","colInfo","rtlEdge","ltrEdge","getTop","findPositions","getInnerEdge","getOuterEdge","cellOption","lastLine","negate","optElements","BarPositions","ResizeDirection","TableDirection","directionAt","auto","getGridSize","TableGridSize","setIfNot","newRows","newCells","renderSection","gridSection","sectionName","tb","isNew","tr","removeSection","renderOrRemoveSection","headSection","bodySection","footSection","copy$2","clonedCell","Redraw","repeat","repititions","deduce","aa","rowsArr","getBlock","isSingle","getFallback","decide","inBlock","singleInBlock","detailOption","rows$1","Blocks","namespace","dashNamespace","Styles","row$1","Bar","resizeBar","resizeRowBar","resizeColBar","BAR_THICKNESS","wire","drawBar","cpOption","cp","refreshCol","colPositions","tableHeight","colBar","refreshRow","rowPositions","tableWidth","rowBar","refreshGrid","hdirection","vdirection","each$2","bars","isRowBar","isColBar","Bars","addCell","gridRow","setCells","mutateCell","mapCells","getCell","getCellElement","cellLength","GridRow","getColumn","getRow","findDiff","subgrid","restOfRow","endColIndex","restOfColumn","endRowIndex","TableGrid","toDetails","seen","ri","ci","updateSeen","toGrid","rowCells","Transitions","fromWarehouse","deriveRows","rendered","findRow","rowOfCells","toDetailList","findInWarehouse","postAction","genWrappers","newElements","onCell","onPasteRows","lc","onMergable","_warehouse","onUnmergable","onCells","measure","startAddress","gridA","gridB","rowRemainder","colRemainder","colRequired","rowRequired","rowDelta","colDelta","measureWidth","colLengthA","colLengthB","fill","generator","rowFill","_row","colFill","tailor","fillCols","fillRows","modifiedCols","tailoredGrid","Fitment","substitution","unmerge","isToReplace","uniqueCells","currentCell","splitRows","rowPrevCells","replacement","_loop_2","sub","MergingOperations","isSpanning","matching","mergeTables","mergeHeight","mergeWidth","fittedGrid","fittedNewGrid","secondDelta","fittedOldGrid","TableMerge","insertRowAt","between","withinSpan","insertColumnAt","splitCellIntoColumns","exampleRow","exampleCol","isTargetCell","splitCellIntoRows","deleteColumnsAt","deleteRowsAt","ModificationOperations","replaceIn","isTarget","notStartRow","notStartColumn","replaceColumn","alreadyAdded","replaceRow","targetRow","TransformOperations","only","ColumnContext","neighbours$1","determine","zero","onOnly","singleColumnWidth","newNext","minCellWidth","newThis","diffx","onMiddle","_prev","Deltas","getSpan$1","hasColspan","hasRowspan","getInt","CellUtils","getRaw$1","getRawW","getRawH","getWidthFrom","backups","columnCell","deduced","getDeduced","getRawWidths","getPercentageWidths","getPixelWidths","getHeightFrom","rowCell","getPixelHeights","getRawHeights","ColumnSizes","measures","recalculateWidth","widths","recalculateHeight","matchRowHeight","Recalculations","percentageSize","getCellDelta","_delta","setTableWidth","_newWidths","ratio","getWidths","setElementWidth","pixelSize","newWidths","chooseSize","fallbackWidth","getTableSize","TableSize","getWarehouse$1","sumUp","getTableWarehouse","adjustWidth","newSizes","adjustHeight","newHeights","newCellSizes","newRowSizes","adjustWidthTo","Adjustments","handleUnsupported","baseWith","invalidKeys","handleExact","exactly","verifyGenerators","elementToData","toData","nuFrom","recent","getOrInit","makeNew","replaceOrInit","merging","Generators","blockList","isFormatting","isHeading","isContainer","isFrame","Structure","universe$1","isBlock$1","isFormatting$1","isHeading$1","isContainer$1","isEmptyTag$1","isFrame$1","isInline$1","DomStructure","merge$2","advancedBr","isListItem","siblingIsBlock","rightSibling","markCell","rightSiblingIsBlock","markContent","TableContent","elementFromGrid","findIn","uniqueRows","currentDetail","uniqueColumns","insertRowBefore","targetIndex","newGrid","insertRowsBefore","newG","insertRowAfter","insertRowsAfter","insertColumnBefore","insertColumnsBefore","insertColumnAfter","insertColumnsAfter","makeRowHeader","makeColumnHeader","unmakeRowHeader","unmakeColumnHeader","splitCellIntoColumns$1","splitCellIntoRows$1","eraseColumns","_comparator","_genWrappers","eraseRows","mergeCells","unmergeCells","pasteDetails","gridify","wh","mergedGrid","nuGrid","gridifyRows","pasteRowsBefore","pasteRowsAfter","TableOperations","getBody$1","getPixelWidth$1","getPixelHeight","removePxSuffix","addSizeSuffix","removeDataStyle","dataStyleCells","ltr$1","rtl$1","Direction","defaultTableToolbar","defaultStyles","defaultAttributes","getDefaultAttributes","getDefaultStyles","hasTableResizeBars","hasTabNavigation","hasAdvancedCellTab","hasAdvancedRowTab","hasAdvancedTableTab","hasAppearanceOptions","hasTableGrid","shouldStyleWithCss","getCellClassList","getRowClassList","getTableClassList","isPercentagesForced","isPixelsForced","getCloneElements","cloneElements","hasObjectResizing","objectResizing","fireNewRow","fireNewCell","fireObjectResizeStart","fireObjectResized","fireTableSelectionChange","fireTableSelectionClear","toEnd","freefallRtl","freefallRtl$1","universe$2","freefallRtl$2","TableActions","lazyWire","isTableBody","lastRowGuard","lastColumnGuard","guard","des","deleteRow","deleteColumn","copyRows","selectedCells","slicedGrid","slicedDetails","CopyRows","getTDTHOverallStyle","firstChildStyle","checkChildren","currentStyle","applyAlign","applyVAlign","unApplyAlign","unApplyVAlign","Styles$1","buildListItems","inputList","itemCallback","startItems","appendItems","extractAdvancedStyles","rgbToHex","borderWidth","borderStyle","borderColor","bgColor","borderwidth","borderstyle","bordercolor","backgroundcolor","getSharedValues","baseData","comparisonData","itemKey","comparisonValue","getAdvancedTab","dialogName","advTabItems","getAlignment","alignments","dataName","alignmentData","getHAlignment","getVAlignment","extractDataFromSettings","hasAdvTableTab","extractAdvancedStyleData","defaultData","cellspacing","cellpadding","caption","getBorder","advStyle","getCellPaddingCellSpacing","spacing","extractDataFromTableElement","optBorderWidth","extractDataFromRowElement","extractDataFromCellElement","celltype","Helpers","getClassList","rowClassList","textStyle","children$3","classlist","CellDialogGeneralTab","setAttrib","ifTruthy","DomModifier","updateSimpleProps","modifiers","updateAdvancedProps","applyToSingle","cellElm","halign","valign","applyToMultiple","onSubmitCellForm","applicator","cellsData","dialogTabPanel","dialogPanel","CellDialog","getClassList$1","formChildren","getItems$1","RowDialogGeneralTab","switchRowType","rowElm","toType","tableElm","oldParentElm","parentElm","updateAdvancedProps$1","modifier","onSubmitRowForm","oldData","createModifier","rowsData","RowDialog","DefaultRenderOptions","percentages","makeTable","tableBody","tableRow","tableHeaderCell","tableCell","rowHeaders","columnHeaders","renderOpts","tbody","trs","placeCaretInCell","selectFirstCellInTable","fireEvents","isPercentage","insert$1","InsertTable","getItems$2","hasClasses","insertNewTable","rowColCountItems","alwaysItems","appearanceItems","alignmentItem","classListItem","TableDialogGeneralTab","styleTDTH","applyDataToElement","onSubmitTableForm","captionElm","addVisual","open$2","generalPanel","nonAdvancedForm","advancedForm","TableDialog","getSelectionStartFromSelector","getSelectionStartCell","getSelectionStartCellOrCaption","each$3","clipboardRows","eraseTable","cellOrCaption","tableOpt","getTableFromCell","getSize","resizeChange","oldSize","actOnSelection","copyRowSelection","pasteOnSelection","clonedRows","mceTableSplitCells","mceTableMergeCells","mceTableInsertRowBefore","mceTableInsertRowAfter","mceTableInsertColBefore","mceTableInsertColAfter","mceTableDeleteCol","mceTableDeleteRow","mceTableCutRow","mceTableCopyRow","mceTablePasteRowBefore","mceTablePasteRowAfter","mceTableDelete","func","mceInsertTable","mceTableProps","mceTableRowProps","mceTableCellProps","detached","editable","body$1","ResizeWire","Event","trigger","typeDefs","styles$1","Styles$2","Blocker","layerClass","DragMode","DragSink","DragApi","compare","mutation","mdown","mup","mmove","mout","MouseDrag","InDrag","dataOption","NoDrag","Movement","noDragState","inDragState","throttledDrop","runIfActive","Dragger","Mutation","BarMutation","findClosestContentEditable","resizeBarDragging","BarManager","resizing","hoverTable","getResizer","_dataRow","_dataCol","currentCol","oldX","startAdjust","findClosestEditableTable","hideBars","showBars","beforeResize","afterResize","startDrag","TableResize","createContainer","TableWire","calculatePercentageWidth","enforcePercentage","rawTable","tablePercentage","enforcePixels","getResizeHandler","startW","startRawW","selectionRng","isTable","lazyResize","sz","rawWire","tableHasPercentage","percentW","targetPercentW","newCellSizes_1","newCellSize","none$1","CellLocation","CellNavigation","selectNodeContentsUsing","searchForPoint","rectForOffset","curDeltaX","inRect","locateOffset","textnode","rangeForOffset","foundRect","searchInChildren","locateNode","locate$1","boundedX","boundedY","COLLAPSE_TO_LEFT","COLLAPSE_TO_RIGHT","getCollapseDirection","createCollapsedNode","collapseDirection","locateInElement","cursorRange","locateInEmpty","caretPositionFromPoint","caretRangeFromPoint","searchTextNodes","searchFromPoint","availableSearch","fromPoint$1","beforeSpecial","preprocessRelative","preprocessExact","after$3","doSetNativeRange","removeAllRanges","addRange","doSetRange","setLegacyRtlRange","setRangeFromRelative","setBaseAndExtent","setExact","setRelative","toNative","getDomRange","setToElement","getAtPoint","forward","backward","getCellFirstCursorPosition","getNewRowCursorPosition","rootElements","handle$1","body_1","isRoot_1","TabContext","Response","Situs","convertToRange","makeSitus","Util","sync","selectRange","detect$5","cellSel","annotations","updateSelection","newSels","clearBeforeUpdate","KeySelection","backtrack","_direction","sidestep","advance","successors","go$1","ruleOpt","succ","Walkers","hone","left$1","right$1","isLeaf","before$3","seekLeft","after$4","seekRight","universe$3","before$4","after$5","seekLeft$1","seekRight$1","failedUp","failedDown","isOverlapping","bridge","beforeBounds","afterBounds","isRow","verify","beforeOffset","afterOffset","failure","afterCell","beforeCell","_sharedRow","onSuccess","onFailedUp","onFailedDown","BeforeAfter","inParent","indexInParent","gatherer","cand","gather","handleBr","findBr","handleParent","br","adjacent","tryBr","analysis","BrTags","moveBottomTo","moveTopTo","getTop$1","getBottom","Carets","getPartialBox","getRangedRect","toCaret","getElemBox","getBoxAt","getEntireBox","Rectangles","JUMP_SIZE","NUM_RETRIES","retry","isOutside","inOutsideBlock","adjustDown","guessBox","lowerCaret","adjustUp","higherCaret","upMovement","adjuster","downMovement","isAtTable","adjustForTable","numRetries","adjustTil","situsFromPoint","newCaret","ieTryDown","ieTryUp","checkScroll","adjusted","getInnerHeight","moved","scrollBy","Retries","tryUp","tryDown","getJumpSize","MAX_RETRIES","platform$2","findSpot","brNeighbour","fromSitus","scan$1","tryCursor","situs","tryAgain","tryAt","otherRetry","ieRetry","handle$2","TableKeys","inSameTable","simulate","precheck","firstUpCheck","lastOffset","lastDownCheck","VerticalMovement","findCell","MouseSelection","clearState","selectContents","KeyDirection","isKey","keycode","isUp","isDown","isNavigation","SelectionKeys","isBackward","toRaw","sr","Rect","by","WindowBridge","exactAdt","clearSelection","collapseSelection","toStart","setSelection","setRelativeSelection","getScrollY","rc","keyboard","clearToNavigate","realEvent","InputHandlers","removeClasses","byClass","ephemera","addSelectionClass","removeSelectionClasses","byAttr","onSelection","onClear","removeSelectionAttributes","addSelectionAttribute","SelectionAnnotation","getUpOrLeftCells","upGrid","upDetails","slicedCells","getDownOrRightCells","downGrid","downDetails","getOtherCells","OtherCells","hasInternalTarget","CellSelection$1","selectionTargets","handlerStruct","syncSelection","mouseHandlers","keyHandlers","hasShiftKey","handleResponse","ns","wrappedEvent","isLeftMouse","isLeftButtonPressed","mouseDown","mouseOver","mouseUp","getDoubleTap","lastTarget","lastTimeStamp","touchEnd","lT","lTS","timeStamp","doubleTap","Selections","getSelectionTargets","changeHandlers","findTargets","resetTargets","onSetupTable","onSetupCellOrRow","onSetupMergeable","onSetupUnmergeable","addButtons","addMenuButton","addToolbars","addContextToolbar","addMenuItems","insertTableAction","tableProperties","deleteTable","rowItems","columnItems","cellItems","addContextMenu","MenuItems","getClipboardRows","setClipboardRows","sugarRows","resizeHandler","insertTable","addTempAttr","Plugin$1","imageToBlob","anyUriToBlob","xhr","XMLHttpRequest","responseType","onerror","_this","corsError","genericError","send","blobToImage$1","imageToBlob$1","getToolbarItems","getProxyUrl","getCorsHosts","getCredentialsHosts","getFetchImage","getApiKey","getUploadTimeout","shouldReuseFilename","getImageSize","isPxValue","setImageSize","getNaturalImageSize","ImageSize","json","reduce","requestUrlAsBlob","headers","withCredentials","onreadystatechange","readyState","setRequestHeader","readBlob","fr","readAsText","parseJson","friendlyHttpErrors","friendlyServiceErrors","isServiceErrorCode","getHttpErrorMsg","handleHttpError","getServiceErrorMsg","getServiceError","serviceError","errorType","errorMsg","handleServiceError","handleServiceErrorResponse","Errors","appendApiKey","encodeURIComponent","requestServiceBlob","requestBlob","getFigureImg","isFigure","getEditableImage","imgNode","isLocalImage","isCorsImage","imagetools_proxy","imgOpt","displayError","getSelectedImage","createId","isCorsWithCredentialsImage","defaultFetchImage","imageToBlob$2","customFetchImage","findBlob","getByUri","startTimedUpload","imageUploadTimerState","imageUploadTimer","uploadImagesAuto","cancelTimedUpload","updateSelectedImage","uploadImmediately","selectedImage","imageLoadedHandler","removeAttr","selectedImageOperation","_scanForImages","imageResult","rotate$2","flippedSize","flip$2","handleDialogBlob","originalSize","newImage","makeOpen","getLoadedSpec","originalImgOpt","originalImg","originalSizeOpt","origImg","mceImageRotateLeft","mceImageRotateRight","mceImageFlipVertical","mceImageFlipHorizontal","mceEditImage","lastSelectedImageState","lastSelectedImage","UploadSelectedImage","elementOpt","getDateFormat","getTimeFormat","getFormats","getDefaultDateTime","shouldInsertTimeElement","daysShort","daysLong","monthsShort","monthsLong","addZeros","getDateTime","getFullYear","getYear","getMonth","getDate","getHours","getMinutes","getSeconds","getDay","updateElement","timeElm","computerTime","userTime","newTimeElm","datetime","insertDateTime","defaultFormat","makeMenuItemHandler","getAutoResizeMinHeight","getAutoResizeMaxHeight","getAutoResizeOverflowPadding","getAutoResizeBottomMargin","shouldAutoResizeOnInit","isFullscreen","fullscreen","wait","times","interval","toggleScrolling","overflowY","parseCssValueToInt","computed","deltaSize","resizeHeight","contentHeight","resizeBottomMargin","marginTop","marginBottom","containerHeight","contentAreaHeight","scrollIntoView","overflowPadding","Resize","assumeExternalTargets","externalTargets","hasContextToolbar","getLinkList","getDefaultLinkTarget","getTargetList","getRelList","getLinkClassList","shouldShowLinkTitle","allowUnsafeLinkTarget","useQuickLink","getDefaultLinkProtocol","appendClickRemove","createEvent","initMouseEvent","OpenUrl","hasProtocol","getHref","applyRelTargetRules","isUnsafe","rels","addTargetRules","removeTargetRules","newRels","trimCaretContainers","getAnchorElement","selectedElm","isImageFigure","getAnchorText","anchorElm","isLink","hasLinks","isOnlyTextSelected","getLinkAttrs","handleExternalTargets","applyLinkOverrides","linkAttrs","newLinkAttrs","newRel","updateLink","linkImageFigure","createHTML","attachState","unlinkImageFigure","fig","sanitizeList","extractValue","sanitizeWith","extracter","createUi","ListOptions","findTextByValue","catalog","persistentText","hasPersistentText","findCatalog","catalogs","linkSettings","onUrlChange","urlText","urlTitle","onCatalogChange","DialogChanges","delayedConfirm","tryEmailTransform","suggestMailTo","tryProtocolTransform","defaultLinkProtocol","suggestProtocol","DialogConfirms","anchorNodes","AnchorListOptions","ClassListOptions","getLinks","extractor","linkList","optItems","LinkListOptions","getRels","isTargetBlank_1","enforceSafe","safeRelExtractor","sanitizer","RelOptions","fallbacks","getTargets","TargetOptions","nonEmptyAttr","extractFromAnchor","onlyText","linkClass","collect","linkNode","links","optNode","flags","titleEnabled","DialogInfo","handleSubmit","getChangedValue","changedData","pData","collectData","getInitialData","defaultTarget","makeDialog","urlInput","titleText","dialogDelta","getLink","getSelectedLink","hasOnlyAltModifier","altKey","metaKey","gotoLink","targetEl","openDialog","gotoSelectedLink","leftClickedOnAHref","setupGotoLinks","toggleActiveState","toggleEnabledState","addShortcut","setupButtons","setupMenuItems","setupContextMenu","inLink","noLink","setupContextToolbars","collapseSelectionToEnd","onSetupLink","addContextForm","Controls","getGlobal","getTinymce","hasAdvTab","hasUploadTab","getPrependUrl","hasDescription","hasImageTitle","hasImageCaption","getImageList","hasUploadUrl","getUploadUrl","hasUploadHandler","getUploadHandler","getUploadBasePath","getUploadCredentials","showAccessibilityOptions","isAutomaticUploadsEnabled","parseIntAndGetMax","val1","val2","removePixelSuffix","addPixelSuffix","mergeMargins","splitMargin","createImageList","imageList","waitLoadImage","selectImage","isPlaceholderImage","getHspace","marginLeft","marginRight","getVspace","hasCaption","wrapInFigure","figureElm","removeFigure","toggleCaption","normalizeStyle","normalizeCss","setSize","setHspace","pxValue","setVspace","setBorder","setBorderStyle","getBorderStyle","getIsDecorative","getAlt","hspace","vspace","isDecorative","getStyleValue","setAlt","figure","updateProp","sugarImage","hasAccessibilityOptions","updateAlt","normalized","mergedCss","compressed","splitTextBlock","readImageDataFromSelection","insertImageAtCaret","outerHTML","insertedElm","syncSrcAttr","deleteImage","writeImageDataToSelection","insertOrUpdateImage","isGroup","findEntryDelegate","findEntry","optList","ListUtils","pathJoin","path1","path2","Uploader","defaultHandler","credentials","upload","onprogress","responseText","basePath","FormData","filename","uploadBlob","isDefaultHandler","makeTab","AdvTab","urlListSanitizer","futureImageList","automaticUploads","prependURL","preUrl","makeItems","imageUrl","imageDescription","imageTitle","imageDimensions","makeTab$1","MainTab","makeTab$2","UploadTab","prevImage","prevAlt","fromImageData","fileinput","toImageData","addPrependUrl2","srcURL","prependUrl","addPrependUrl","formFillFromMeta2","formFillFromMeta","calculateImageSize","helpers","imageSize","updateImagesDropdown","changeSrc","changeImages","calcVSpace","matchingTopBottom","calcHSpace","matchingLeftRight","calcBorderWidth","calcBorderStyle","calcStyle","changeStyle2","dataCopy","changeStyle","changeAStyle","changeFileInput","uploader","finalize","updateSrcAndSwitchTab","dataUrl","createBlobCache","alertErr","addToBlobCache","changeHandler","closeHandler","makeDialogBody","tabPanel","submitHandler","normalizeCss$1","stylesArg","hasImageClass","toggleContentEditableState","toggleContentEditable","setDir","curDir","getNodeChangeHandler","isNull","objAcc","internalFilter","onTrue","onFalse","bifilter","lTrim","rTrim","recurse","Recurse","prevSiblings","nextSiblings","childNodesCount","intoView","alignToTop","scrollIntoViewIfNeeded","isNodeType","isRestrictedNode","getPrototypeOf","matchNodeNames","lowercasedNames","matchStyleValues","cssValue","hasPropValue","propName","propValue","hasAttributeValue","isBogus","isBogusAll","isTextareaOrInput","isDocument","isDocumentFragment","browser$1","firstElement","getTableCaptionDeltaY","bodyTop","captionTop","captionHeight","hasChild","Position$1","module$1","requestAnimationFramePromise","promiseObj","requestAnimationFrameFunc","vendors","featurefill","wrappedSetTimeout","wrappedSetInterval","wrappedClearTimeout","wrappedClearInterval","debounce","Delay","setEditorInterval","browser$2","fileApi","windowsPhone","Env","caretAfter","documentMode","cacheSuffix","experimentalShadowDom","canHaveCSP","desktop","isArray$1","toArray$1","filter$2","indexOf$1","iteratee","accumulator","ArrUtils","whiteSpaceRegExp","delim","sp","cn","scn","de","createNS","onCreate","ext","explode","_addCacheSuffix","hasOwn","StyleSheetLoader","maxLoadTime","idCount","loadedStates","_setReferrerPolicy","appendToHead","getElementsByTagName","loadedCallback","errorCallback","passed","failed","isOldWebKit","webKitChunks","testCallback","waitCallback","waitForWebKitLinkLoaded","styleSheet","styleSheets","ownerNode","owningElement","waitForGeckoLinkLoaded","cssRules","sheet","async","defer","contentCssCors","crossOrigin","loadF","unbox","loadAll","urls","namedEntities","baseEntities","reverseEntities","voids","tableCells","tableSections","headings","listItems","wsElements","lazyLookup","isTable$1","isBr$1","isVoid","isTableSection","isTableCell","isWsPreserveElement","surroundedBySpans","previousIsSpan","nextIsSpan","trimNode","trimmedLength","TrimNode","makeMap$1","attrsCharsRegExp","textCharsRegExp","rawCharsRegExp","entityRegExp","asciiMap","128","130","131","132","133","134","135","136","137","138","139","140","142","145","146","147","148","149","150","151","152","153","154","155","156","158","159","'","nativeDecode","buildEntitiesLookup","radix","entity","fromCharCode","encodeRaw","encodeNumeric","encodeNamed","entities","getEncodeFunc","entitiesMap","encodeNamedAndNumeric","encodeCustomNamed","nameMap","named","numeric","Entities","mapCache","dummyObj","makeMap$2","extend$1","explode$1","compileSchema","globalAttributes","blockContent","phrasingContent","flowContent","html4BlockContent","html4PhrasingContent","ni","arrayToMap","addAttrs","schemaItem","script","compileElementMap","Schema","invalidStyles","schemaItems","whiteSpaceElementsMap","selfClosingElementsMap","shortEndedElementsMap","boolAttrMap","validClasses","blockElementsMap","nonEmptyElementsMap","moveCaretBeforeOnEnterElementsMap","textBlockElementsMap","textInlineElementsMap","patternElements","customElementsMap","createLookupTable","extendWith","verify_html","valid_styles","invalid_styles","valid_classes","patternToRegExp","addValidElements","ei","al","attrData","elementName","attrType","outputName","globalAttributesOrder","elementRuleRegExp","attrRuleRegExp","hasPatternsRegExp","paddEmpty","removeEmpty","removeEmptyAttrs","attributesRequired","attributesDefault","attributesForced","forcedValue","validValues","attributePatterns","setValidElements","addCustomElements","customElements","customElementRegExp","text_block_elements","block_elements","cloneName","customRule","elmName","addValidChildren","validChildren","childRuleRegExp","getElementRule","custom_elements","extended_valid_elements","dd","dt","th","thead","tfoot","legend","area","param","parentsRequired","invalid_elements","getValidStyles","getInvalidStyles","getValidClasses","getTextInlineElements","getSelfClosingElements","getMoveCaretBeforeOnEnterElements","getWhiteSpaceElements","isValidChild","attrPatterns","getCustomElements","support","Expr","isXML","tokenize","compile","outermostContext","sortInput","hasDuplicate","setDocument","documentIsHTML","rbuggyQSA","rbuggyMatches","contains$3","encodingItems","rgbRegExp","urlOrStrRegExp","styleRegExp","trimRightRegExp","encodingLookup","invisibleChar","isEncoded","urlConverter","url_converter","urlConverterScope","url_converter_scope","compress","noJoin","canCompress","compress2","keepSlashes","decodeSingleHexSequence","escSeq","decodeHexSequences","processUrl","url2","url3","str2","allow_script_urls","allow_svg_data_urls","lastIndex","serializeStyles","styleList","eventExpandoPrefix","mouseEventRe","deprecated","keyLocation","layerX","layerY","returnValue","webkitMovementX","webkitMovementY","keyIdentifier","mozPressure","hasIsDefaultPrevented","returnTrue","returnFalse","addEvent","attachEvent","removeEvent","detachEvent","getTargetFromShadowDom","composedPath","fix","originalEvent","srcElement","eventDoc","cancelBubble","isImmediatePropagationStopped","bindOnReady","eventUtils","domLoaded","isDocReady","readyHandler","EventUtils","expando","hasMouseEnterLeave","hasFocusIn","callbackList","fakeName","nativeHandler","defaultNativeHandler","executeHandlers","namesList","mouseEnterLeave","currentTarget","relatedTarget","eventMap","parentWindow","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","sortOrder","strundefined","MAX_NEGATIVE","push_native","indexOf$2","booleans","whitespace","identifier","pseudos","rtrim","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","escaped","escapedWhitespace","high","els","Sizzle","seed","nid","newSelector","getElementsByClassName","qsa","toSelector","testContext","qsaError","cacheLength","markFunction","siblingCheck","sourceIndex","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","hasCompare","attrId","tmp","disconnectedMatch","adown","bup","sortDetached","aup","ap","bp","expr","matchesSelector","attrHandle","getAttributeNode","specified","uniqueSort","duplicates","detectDuplicates","sortStable","createPseudo","preFilter","excess","unquoted","nodeNameSelector","operator","check","what","ofType","xml","outerCache","useCache","pseudo","setFilters","matched","matcher","unmatched","lang","elemLang","hash","tabIndex","selectedIndex","even","odd","lt","gt","nth","radio","password","tokens","addCombinator","combinator","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","preMap","postMap","preexisting","elems","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","filters","parseOnly","soFar","preFilters","token","compiled","push$1","slice$1","rquickExpr$1","skipUniques","isDefined","isString$1","isWindow","fragDoc","frag","domManipulate","targetNodes","sourceItem","getElementDocument","DomQuery","makeArray","lastParent","newWrapper","numericCssMap","booleanMap","propFix","for","cssFix","float","attrHooks","cssHooks","DomQueryConstructor","inArray$1","whiteSpaceRegExp$1","trim$2","each$4","hook","camel","dashed","prependTo","replaceWith","wrapInner","existingClassName","classState","object","until","siblingName","firstSibling","wrappedResult","parentsUntil","nextUntil","prevUntil","overrideDefaults","TreeWalker","prev2","findSibling","findPreviousNode","startName","each$5","grep$1","simpleSelectorRe","whiteSpaceRegExp$2","setupAttrHooks","keepValues","keep_values","keepUrlHook","updateInternalStyleAttr","findNodeIndex","lastNodeType","DOMUtils","addedStyles","counter","stdMode","boxModel","boundEvents","ownEvents","getElementsByName","$$","defaultVal","getAttribs","originalValue","onSetAttrib","attrElm","clone_1","root_element","getViewPort","argWin","update_styles","selectorVal","_findSib","getPrev","setHTML","canHaveHTML","newElm","outHtml","keepChildren","$node","removeAllAttribs","removeAttributeNode","addStyle","styleElm","loadCSS","cls","getOuterHTML","setOuterHTML","reference","referenceNode","oldElm","replaceChild","attrNode","findCommonAncestor","pe","rgbVal","isNonEmptyElement","isNamedAnchor","brCount","bogusVal","splitElm","replacementElm","bef","aft","pa","rv","getContentEditableParent","dumpRng","DOMUtils$1","each$6","grep$2","QUEUED","LOADING","LOADED","FAILED","ScriptLoader","scriptLoadedCallbacks","queueLoadedCallbacks","loading","loadScript","isDone","markDone","loadQueue","loadScripts","scripts","failures","execCallbacks","loadingScripts","notifyCallbacks","isRaw","isTokenised","currentCode","getLanguageData","setCode","newCode","getCode","langData","translation","getLangData","textstr","removeContext","substitued","$1","$2","hasCode","I18n","AddOnManager","_listeners","runListeners","matchedListeners","dependencies","requireLangPack","languages","languageLoad","waitFor","language","wrappedLanguages","addOn","addOnConstructor","createUrl","baseUrl","resource","addComponents","pluginName","pluginUrl","loadDependencies","addOnUrl","deps","urlString","PluginManager","ThemeManager","AddOnManager$1","annotation","dataAnnotation","dataAnnotationId","annotationName","an","newStart","getAttr","findMarkers","isAnnotation","findAll","nodesAlready","changeCallbacks","initData","withCallbacks","updateCallbacks","callbackMap","outputData","fireCallbacks","fireNoAnnotation","identifyParserNode","spans","persistent","ZWSP","isZwsp","trim$3","Zwsp","isElement$2","isText$2","isCaretContainerBlock","isCaretContainerInline","isCaretContainer","hasContent","insertInline","textNode","endsWithCaretContainer","splitText","startsWithCaretContainer","isBeforeInline","isAtStart","isAfterInline","isAtEnd","createBogusBr","insertBlock","blockNode","trimBogusBr","brs","lastBr","showCaretContainerBlock","caretContainer","isRangeInCaretContainerBlock","isContentEditableTrue$1","isContentEditableFalse$1","isBr$2","isText$3","isInvalidTextElement","isAtomicInline","isTable$2","isCaretContainer$1","isCaretCandidate","isNonUiContentEditableFalse","isUnselectable","isInEditable","isAtomicContentEditableFalse","isAtomic","isEditableCaretCandidate","isEqual","rect1","rect2","isValidOverflow","containsXY","getSelectedNode","extendingChars","isExtendingChar","someIf","slice$2","Predicate","isElement$3","isCaretCandidate$1","isFloated","isValidElementCaretCandidate","isNotPre","isText$4","isBr$3","resolveIndex","isWhiteSpace","isRange","isHiddenWhiteSpaceRange","getBrClientRect","brNode","clientRect","nbsp$1","getBoundingClientRectWebKitText","ec","so","eo","newRng","isZeroRect","clientRects","collapseAndInflateWidth","newClientRect","getCaretPositionClientRects","caretPosition","beforeNode","addUniqueAndValidRect","addCharacterOffset","CaretPosition","toRange","fromRangeStart","fromRangeEnd","pos1","pos2","isTextPosition","isElementPosition","HDirection","CaretPosition$1","isText$5","isBogus$1","nodeIndex$1","normalizedParent","getChildNodes","normalizedTextOffset","equal","normalizedNodeIndex","numTextFragments","createPathItem","outputOffset","resolvePathItem","findTextPosition","dataLen","targetOffset","resolve$1","trimEmptyTextNode","insertFragment","rangeInsertNode","isContentEditableFalse$2","getNormalizedTextOffset","trimmedOffset","getPoint","getLocation","findIndex$2","moveEndPoint","normalizeTableCellSelection","findAdjacentContentEditableFalseElm","getOffsetBookmark","getCaretBookmark","getRangeBookmark","createBookmarkSpan","filled","getPersistentBookmark","rng2","endBookmarkNode","startBookmarkNode","keep","GetBookmark","getUndoBookmark","TextWalker","TextSeeker","isBlockBoundary","newOffset","forwards","CARET_ID","isCaretNode","getParentCaretContainer","isElement$4","isText$6","removeNode","getNodeValue","setNodeValue","trimCount","trimmedText","removeUnchanged","removeTextAndReposition","removeElementAndReposition","newPosition","removeTextCaretContainer","removeElementCaretContainer","removeAndReposition","caretContainerNode","CaretContainerRemove","getBodySetting","bodyObj","getIframeAttrs","getDocType","getDocumentBaseUrl","getBodyId","getBodyClass","getContentSecurityPolicy","shouldPutBrInPre","getBrNewLineSelector","getNoNewLineSelector","shouldKeepStyles","shouldEndContainerOnEmptyBlock","getFontStyleValues","getFontSizeClasses","getImagesDataImgFilter","shouldReuseFileName","shouldReplaceBlobUris","getIconPackName","getIconsUrl","getImageUploadUrl","getImageUploadBasePath","getImagesUploadCredentials","getImagesUploadHandler","getReferrerPolicy","getLanguageCode","getLanguageUrl","shouldIndentUseMargin","getIndentation","getContentCss","contentCss","content_css","getDirectionality","getInlineBoundarySelector","getObjectResizing","getResizeImgProportional","getPlaceholder","browser$3","isContentEditableFalse$3","isTableCell$1","getAbsoluteClientRect","scrollX","scrollY","rootRect","trimInlineCaretContainers","contentEditableFalseNodes","deleteData","FakeCaret","cursorInterval","lastVisualCaret","rootBlock","caretBlock","caretState","startBlink","getCss","isFakeCaretTableBrowser","isFakeCaretTarget","isContentEditableFalse$4","isBlockLike","isCaretContainer$2","isCaretContainerBlock$1","isElement$5","isCaretCandidate$2","isForwards","isBackwards","skipCaretContainers","findNode","predicateFn","getParentBlock","isInSameBlock","caretPosition1","caretPosition2","getChildNodeAtRelativeOffset","relativeOffset","beforeAfter","isNodesInSameBlock","node1","node2","lean","leanLeft","leanRight","getRelativeCefElm","getNormalizedRangeEndPoint","normalizedRange","getElementFromPosition","getElementFromPrevPosition","getVisualCaretPosition","walkFn","isMoveInsideSameBlock","inSameBlock","isContentEditableFalse$5","isText$7","isElement$6","isBr$4","isCaretCandidate$3","isAtomic$1","isEditableCaretCandidate$1","nodeAtIndex","getCaretCandidatePosition","moveForwardFromBr","nextNode","findCaretPosition","Forwards","startPos","rootContentEditableFalseElm","CaretWalker","Backwards","walkToPositionIn","fromPosition","afterElement","isBeforeOrStart","isAfterOrEnd","isBeforeAfterSameElement","isAtBr","shouldSkipPosition","navigateIgnore","ignoreFilter","positionIn","nextPosition","prevPosition","CaretFinder","firstPositionIn","lastPositionIn","isStringPathBookmark","isRangeBookmark","isIdBookmark","isIndexBookmark","isPathBookmark","addBogus","resolveCaretPositionBookmark","insertZwsp","tryFindRangePosition","padEmptyCaretContainer","setEndPoint","isValidTextNode","appendData","resolvePaths","resolveId","endPos","spos","epos","resolveIndex$1","resolve$2","ResolveBookmark","getBookmark$1","isBookmarkNode$1","Bookmarks","is$2","expected","isNbsp","isWhiteSpace$1","isContent","isNode","isInlineBlock","moveStart","isWhiteSpaceNode","getNonWhiteSpaceSibling","inc","nextName","isTextBlock$1","isEmptyTextNode","replaceVars","vars","isEq","str1","normalizeStyleValue","getTextDecoration","decoration","getParents$1","isBookmarkNode$2","getParents$2","isWhiteSpaceNode$1","isTextBlock$2","findParentContentEditable","walkText","findSpace","findContent","findWordEndPoint","includeTrailingSpaces","lastTextNode","textSeeker","textOffset","spaceResult","findSelectorEndPoint","curFormat","findBlockEndPoint","scopeRoot","findParentContainer","block_expand","expandRng","includeTrailingSpace","startPoint","endPoint","each$7","clampToExistingChildren","getEndChild","walk$1","collectSiblings","findEndPoint","walkBoundary","siblings_1","RangeWalk","isZeroWidth","wrapName","applyWordGrab","makeAnnotation","eDoc","decorate","master","_d","annotate","newWrappers","finishWrapper","getOrOpenWrapper","processElements","processElement","processNodes","annotateWithBookmark","initialRng","Annotator","annotationChanged","whiteSpaceRegExp$3","typeLookup","walk$2","isEmptyTextNode$1","Node$1","selfAttrs","cloneAttrs","selfAttr","refNode","isValidPrefixAttrName","isInvalidUri","findEndTagIndex","tokenRegExp","isConditionalComment","findCommentEndIndex","lcHtml","endIfIndex","endCommentRegexp","checkBogusAttribute","attrString","SaxParser","fix_self_closing","pi","doctype","endRegExp","attrList","textData","isInternalElement","removeInternalElements","fillAttrsMap","isShortEnded","elementRule","isValidElement","attribsValue","validAttributesMap","validAttributePatterns","processHtml","anyAttributesRequired","selfClosing","attrRegExp","fixSelfClosing","filteredUrlAttrs","scriptUriRegExp","parsingMode","processEndTag","processComment","processMalformedComment","startTag","parseAttribute","val3","attrRule","trimRegExp","decodeURIComponent","self_closing_elements","remove_internals","bogusValue","isValidCdataSection","preserve_cdata","findEndTag","documentFocusInHandler","SaxParser$1","tempAttrs","trimContentRegExp","trimInternal","endTagIndex","bogusAllRegExp","getTempAttrs","trimExternal","TrimHtml","trimEmptyContents","emptyRegExp","getContentFromBody","getInner","no_events","makeMap$3","Writer","indent","indentBefore","indentAfter","htmlOutput","indent_before","indent_after","entity_encoding","element_format","Serializer","8","7","10","11","sortedAttrs","findMatchingNodes","nodeFilters","attributeFilters","nodeMatches","attrMatches","name_2","filter$3","browser$4","normalizeRng","isOrContains","isRngInRoot","shouldStore","nativeRangeToSelectionRange","getBookmark$2","bookmarkToNativeRng","newBookmark","storeNative","SelectionBookmark","isEditorUIElement","FocusManager","isManualNodeChange","selectionChange","registerPageMouseUp","throttledStore","mouseUpPage","registerFocusOut","registerMouseUp","registerEditorEvents","SelectionRestore","isEditorUIElement$1","isEditorContentAreaElement","isUIElement","customSelector","custom_ui_selector","getActiveElement","editorManager","focusedEditor","blurredEditor","activeEditor","unregisterDocumentEvents","FocusController","getContentEditableHost","getCollapsedNode","getFocusInElement","normalizeSelection","caretPos","focusBody","hasElementFocus","hasIframeFocus","iframeElement","hasInlineFocus","rawBody","hasUiFocus","hasFocus$1","hasEditorOrUiFocus","focusEditor","refreshContentEditable","bookmarkRng","contentEditableHost","activateEditor","skipFocus","EditorFocus","defaultFormat$1","isTreeNode","moveSelection","setEditorHtml","setContentString","forcedRootBlockName","padd","setContentTree","getNodeFilters","getAttributeFilters","firePreProcess","firePostProcess","fireRemove","fireDetach","fireSwitchMode","firePreInit","firePostRender","fireInit","firePlaceholderToggle","fireError","DOM$3","restoreOriginalStyles","orgDisplay","safeDestroy","clearDomReferences","contentAreaContainer","formElement","restoreForm","_mceOldSubmit","formEventDelegate","_selectionOverrides","save","is_removing","unbindAllNativeEvents","hasHiddenInput","automatic","destroyed","_beforeUnload","theme","deep$1","sectionResult","deviceDetection","legacyMobilePlugins","defaultTouchSettings","table_grid","object_resizing","normalizePlugins","pluginNames","trimmedPlugins","filterLegacyMobilePlugins","extractSections","getSection","sectionSettings","hasSection","isSectionTheme","getSectionConfig","getDefaultSettings","documentBaseUrl","baseDefaults","toolbar_mode","document_base_url","add_form_submit_trigger","submit_patch","add_unload_trigger","convert_urls","relative_urls","remove_script_host","visual","font_size_legacy_values","hidden_input","inline_styles","convert_fonts_to_spans","getDefaultMobileSettings","defaultMobileSettings","toolbar_sticky","defaultPhoneSettings","getExternalPlugins","overrideSettings","userDefinedExternalPlugins","external_plugins","combinePlugins","forcedPlugins","processPlugins","isMobileDevice","defaultOverrideSettings","forced_plugins","desktopPlugins","mobileConfig","mobilePlugins","platformPlugins","combinedPlugins","isOnMobile","combineSettings","defaultSettings","defaultDeviceSettings","mobile","extendedSettings","getEditorSettings","getFiltered","getParamObject","CreateIconManager","iconPack","IconManager","rawElm","getComputedSizeProp","getClientWidth","getClientHeight","getMarginTop","getMarginLeft","getBoundingClientRect$1","isInsideElementContentArea","bodyElm","isXYInContentArea","transposedPoint","fromDomSafe","isEditorAttachedToDom","rawContainer","EditorView","unimplemented","NotificationManager","getImplementation","getTopNotification","addNotification","closeNotification","otherNotification","getNotifications","serviceMessage","service_message","WindowManagerImpl","getParams","setParams","dialogs","funcBind","fireOpenEvent","fireCloseEvent","addDialog","otherDialog","getTopDialog","storeSelectionAndOpenDialog","displayNotification","uploadError","logError","createLoadError","pluginLoadError","iconsLoadError","languageLoadError","pluginInitError","initError","ErrorReporter","isContentCssSkinName","getContentCssUrls","contentCssFile","appendContentCssFromSettings","BookmarkManager","BookmarkManager$1","isXYWithinRange","RangePoint","VK","END","HOME","modifierPressed","isContentEditableFalse$6","isContentEditableTrue$2","getContentEditableRoot","ControlSelection","selectedElmGhost","resizeHelper","resizeHandles","selectedHandle","selectedElmX","selectedElmY","startH","resizeStarted","startScrollWidth","startScrollHeight","editableDoc","rootDocument","rootElement","nw","ne","sw","isEventOnImageOutsideRange","contextMenuSelectImage","getResizeTarget","isResizable","resizeGhostElement","proportional","resizeHelperX","resizeHelperY","endGhostResize","setSizeProp","showResizeRect","targetWidth","targetHeight","hideResizeRect","unbindResizeHandleEvents","unSelectabe","updateResizeRect","startElm","controlElm","isChildOrEqual","disableGeckoResize","isWithinContentEditableFalse","handleMSControlSelect_1","delayedSelect","throttledUpdateResizeRect","composing","excludeFromDescend","fireScrollIntoViewEvent","scrollEvent","fireAfterScrollIntoViewEvent","markerInfo","cleanupFun","cleanup","createMarker","elementMarker","withMarker","preserveWith","_s","applyWithMarker","withScrollEvents","startElement","endElement","scrollToMarker","intoWindowIfNeeded","viewportBottom","largerThanViewport","intoWindow","intoFrame","frameViewHeight","op","rangeIntoWindow","elementIntoWindow","rangeIntoFrame","elementIntoFrame","elementIntoView","scroller","rangeIntoView","ScrollIntoView","scrollElementIntoView","scrollRangeIntoView","hasCeProperty","findParent","findClosestIeRange","createTextRange","moveToElementText","moveToPoint","moveOutOfContentEditableFalse","parentElement","pointDoc","CaretRangeFromPoint","processRanges","EventProcessRanges","dropLast","parentsUntil$1","parents$1","parentsAndSelf","Parents","getStartNode","getEndNode","getFirstChildren","getLastChildren","hasAllContentsSelected","moveEndPoint$1","hasAnyRanges","getSel","tableModel","cellPosition","fillout","y2","x2","cellExists","skipCellsX","findElementPos","extractRows","sx","sy","ey","subTable","createDomTable","tableElement","modelRowsToDomRows","fromDom$1","toDom","subsection","SimpleTableModel","getSelectedNodes","hasMultipleRanges","MultiRange","getCellsFromRanges","getCellsFromElement","getCellsFromElementOrRanges","rangeCells","getCellsFromEditor","TableCellSelection","findParentListContainer","getFullySelectedListWrappers","listCont","innerElm","directListWrappers","commonAnchorContainer","listElm","getWrapElements","commonAncestorContainer","wrapElements","listWrappers","allWrappers","emptyFragment","getFragmentFromRange","cloneContents","getParentTable","getTableFragment","selectedTableCells","fullTableModel","sectionedTableModel","getSelectionFragment","FragmentReader","bin","getHtmlContent","tmpElm","getContent$1","GetSelectionContent","isEq$1","rng1","RangeCompare","findParent$1","hasParent","hasParentWithName","isTable$3","isTableCell$2","isCeFalseCaretContainer","hasBrBeforeAfter","isPrevNode","hasContentEditableFalseParent","findTextNodeRelative","isAfterNode","lastInlineElement","parentBlockContainer","normalizeEndPoint","directionLeft","normRng","NormalizeRange","prependData","insertData","rngSetContent","deleteContents","prevText","nextText","oldLength","setupArgs","setContent$1","createContextualFragment","SetSelectionContent","getEndpointElement","real","getStart$2","skipEmptyTextNodes","getNode$1","endElm","select$1","deleteFromCallbackMap","newCallbacks","SelectorChanged","selectorChangedData","currentSelectors","matchedSelectors","isNativeIeSelection","isAttachedToDom","isValidRange","Selection$1","bookmarkManager","controlSelection","selectedRange","explicitRange","getEnd$1","compareEndPoints","tryCompareBoundaryPoints","how","sourceRange","destinationRange","compareBoundaryPoints","START_TO_START","END_TO_END","ieRange","setNode","getSelectedBlocks$1","anchorRange","focusRange","selectorChanged","getScrollContainer","scrollContainer","placeCaretAt","removeAttrs","addFontToSpansFilter","fontSizes","face","addStrikeToSpanFilter","addFilters","LegacyFilter","paddEmptyNode","brPreferred","padd_empty_with_br","isPaddedWithNbsp","hasOnlyChild","isPadded","isEmpty$1","nonEmptyElements","whitespaceElements","isLineBreakNode","remove_trailing_brs","prevName","whiteSpaceElements","appendRel","addNoOpener","allow_unsafe_link_target","allow_html_in_named_anchor","fix_list_elements","classValue","validClassesMap","makeMap$4","each$8","explode$2","extend$2","DomParser","matchedNodes","matchedAttributes","root_name","fixInvalidChildren","newParent","tempNode","childNode","nonSplitableElements","textBlockElements","filterNode","fi","fl","isInWhiteSpacePreservedElement","invalidChildren","getRootBlockName","rootBlockName","startWhiteSpaceRegExp","endWhiteSpaceRegExp","allWhiteSpaceRegExp","isAllWhiteSpaceRegExp","addRootBlocks","rootBlockNode","createNode","removeWhitespaceBefore","textNodeNext","textVal","cloneAndExcludeBlocks","newNode","attrFiltersLen","htmlParser","internalName","hasChildren","trimTrailingBr","brNode1","brNode2","DomSerializerFilters","impl","oldDoc","implementation","createHTMLDocument","importNode","shouldFireEvent","DomSerializerPreProcess","outArgs","getHtmlFromNode","parseHtml","parserArgs","serializeNode","htmlSerializer","toHtml","DomSerializer","addRules","setRules","Serializer$1","domSerializer","blobUriToBlob","rejectWithError","parseDataUri","uriParts","uriToBlob","Conversions","imageToBlobInfo","dataUri","getAllImages","ImageScanner","uploadStatus","cachedPromises","isUploaded","promises","imageInfo","newPromise","pendingPromises","noUpload","handlerSuccess","handlerFailure","resolvePending","uploadBlobInfo","openNotification","markPending","closeNotification_1","markUploaded","removeFailed","pendingUploadBlobInfo","uploadBlobs","blobInfos","isPending","UploadStatus","PENDING","UPLOADED","blobUriStatuses","createStatus","resultUri","hasBlobUri","getResultUri","count$1","rnd","Uuid","BlobCache","mimeToExt","toBlobInfo","removeByUri","EditorUpload","imageScanner","urlFilters","aliveGuard","cacheInvalidator","replaceString","replaceImageUrl","targetUrl","replacementUrl","replaceUrlInUndoStack","fragments","replaceImageUri","uploadImages","scanForImages","imageInfos","filteredResult","uploadInfo","dataImgFilter","addFilter","resultItem","replaceBlobUris","source_view","getLastChildren$1","rawNode","removeTrailingBr","allBrs","fillWithPaddingBr","isPaddingContents","isPaddedElement","trimBlockTrailingBr","lastChildPrevSibling","PaddingBr","isEq$2","matchesUnInheritedFormatSelector","formatList","inherit","matchParents","matchName","matchItems","similar","onmatch","matchAll","matchedFormatNames","checkedMap","defaultBlock","split$1","normalizeContent","isStartOfContent","isEndOfContent","previousCharIsSpace","normalize$1","replaceData","normalizeWhitespaceAfter","whitespaceCount","normalizeWhitespaceBefore","mergeTextNodes","prevNode","whitespaceOffset","hasWhitespacePreserveParent","isContent$1","isBookmark","isBogus$2","isBogusAll$1","isEmptyNode","skipBogus","isEmpty$2","Empty","needsReposition","beforeOrStartOf","afterOrEndOf","getPreviousSiblingCaretPosition","getNextSiblingCaretPosition","findCaretPositionBackwardsFromElm","startPosition","findCaretPositionForwardsFromElm","findCaretPositionBackwards","findCaretPositionForward","findCaretPosition$1","findCaretPosOutsideElmAfterDelete","eqRawNode","isBlock$2","paddEmptyBlock","deleteNormalized","afterDeletePosOpt","prevTextOpt","nextTextOpt","isInlineElement","deleteElement","moveCaret","afterDeletePos","normalizedAfterDeletePos","paddPos","DeleteElement","ZWSP$1","CARET_ID$1","getEmptyCaretContainers","isCaretContainerEmpty","findFirstTextNode","createCaretContainer","trimZwspFromCaretContainer","removeCaretContainerNode","removeCaretContainer","insertCaretContainerNode","formatNode","appendNode","insertFormatNodesIntoCaretContainer","formatNodes","innerMostFormatNode","applyCaretFormat","wordcharRegex","removeCaretFormat","hasContentAfter","expandedRng","newCaretContainer","caretNode","disableCaretContainer","replaceWithCaretFormat","innerMost","isFormatElement","inlineElements","isEmptyCaretFormatElement","postProcessHooks","filter$4","each$9","addPostProcessHook","hooks","postProcess$1","isPre","hasPreSibling","pre","joinPre","pre1","pre2","each$a","ElementUtils","compareObjects","obj1","obj2","MCE_ATTR_RE","each$b","isEq$3","isTableCell$3","isChildOfInlineParent","lastIdx","wrap$3","wrapWithSiblings","matchName$1","isColorFormatAndAnchor","removeNode$1","rootBlockElm","forcedRootBlock","list_block","compareNode","stylesModified","remove_similar","valueOut","findFormatRoot","formatRoot","wrapAndSplit","lastClone","firstClone","formatRootParent","mixed","splitToFormatRoot","isRemoveBookmarkNode","lastContentEditable","removeRngStyle","textDecoration","ceFalseOverride","each$c","isElementNode","findElementSibling","mergeSiblingsNodes","tmpSibling","elementUtils","processChildElements","hasStyle","applyStyle","unwrapEmptySpan","processTextDecorationsAndColor","mergeTextDecorationsAndColor","mergeBackgroundColorAndFontSize","backgroundColor","mergeSubSup","mergeSiblings","merge_siblings","clearChildStyles","clear_child_styles","mergeWithChildren","mergeWithParents","merge_with_parents","createRange$1","normalizeBlockSelectionRange","newEndPos","normalize$2","RangeNormalizer","each$d","isElementNode$1","setElementFormat","onformat","styleVal","applyNodeStyle","applyRngStyle","nodeSpecific","wrapElm","currentWrapElm","childCount","getChildCount","getChildElementNode","mergeStyles","curSelNode","registeredFormatListeners","currentFormats","updateAndFireChangeCallbacks","formatChangeData","formatsList","newFormats","matchedFormats","remainingFormats","filterRemainingFormats","addListeners","formatChangeItems","valigntop","verticalAlign","valignmiddle","valignbottom","alignleft","textAlign","aligncenter","alignright","alignjustify","bold","fontWeight","italic","fontStyle","underline","strikethrough","forecolor","hilitecolor","fontname","fontsize","fontsize_class","blockquote","subscript","superscript","removeformat","DefaultFormats","FormatRegistry","VDirection","each$e","parsedSelectorToHtml","ancestry","sItem","getRequiredParent","elmRule","wrapInHtml","parentCandidate","parentRequired","ancestorName","siblingElm","parseSelectorItem","$0","$3","$4","parseSelector","previewFrag","previewElm","parentFontSize","previewStyles","previewCss","preview_styles","removeVars","numValue","FormatShortcuts","Formatter","formatChangeState","KEEP","INSERT","vDown","vUp","snake","diag","buildScript","start1","end1","start2","end2","getMiddleSnake","i2","buildSnake","Diff","getOuterHtml","createFragment$1","insertAt","removeAt","applyDiff","currentFragments","Fragments","undoLevelDocument","lazyTempDocument","hasIframes","createFragmentedLevel","beforeBookmark","createCompleteLevel","createFromEditor","trimmedFragments","trimmed","applyToEditor","getLevelContent","getCleanLevelContent","hasEqualContent","level1","level2","hasEqualCleanedContent","isEq$4","Levels","isUnlocked","locks","setTyping","typing","endTyping","endTypingLevelIgnoreLocks","beforeChange","addUndoLevel","currentLevel","bm","custom_undo_redo_levels","setDirty","callback1","callback2","hasUndo","hasRedo","registerEvents$1","isFirstTypedCharacter","addNonTypingUndoLevel","isDirty","modKey","isInsertReplacementText","inputType","isInsertTextDataNull","addKeyboardShortcuts","UndoManager","nonTypingKeycodes","placeholderAttr","isKeyboardEvent","isDeleteEvent","isNonTypingKeyboardEvent","isTypingKeyboardEvent","isVisuallyEmpty","isForcedRootBlockFalse","firstElementChild","updatePlaceholder","showPlaceholder","isPlaceholderShown","debounceLongpress","isEqualNode","TouchEvents","isBlockElement","isValidTarget","hasBlockParent","shouldRemoveTextNode","restoreSelection","rootNodeName","ForceBlocks","isText$8","startsWithCaretContainer$1","endsWithCaretContainer$1","createZwsp","insertInline$1","insertInlineBefore","insertInlineAfter","insertInlinePos","isPosCaretContainer","renderCaret","BoundaryCaret","strongRtl","hasStrongRtl","isInlineTarget","isRtl$1","findInlineParents","findRootInline","hasSameParentBlock","block1","block2","isAtZwsp","normalizePosition","normalizeForwards","normalizeBackwards","InlineUtils","evaluateUntil","fns","LazyEvaluator","Location","rescope","nPos","isNotInsideFormatCaretContainer","findInsideRootInline","prevPos","nextPos","isValidLocation","readLocation","getName","outside","isEq$5","location1","location2","betweenInlines","fromInline","toInline","skipNoMovement","fromLocation","toLocation","findLocationTraverse","findLocationSimple","findLocation","BoundaryLocation","prevLocation","nextLocation","hasSelectionModifyApi","modify","moveByWord","WordSelection","setCaretPosition","isFeatureEnabled","inline_boundaries","setSelected","renderCaretLocation","findLocation$1","toggleInlines","selectedInlines","targetInlines","safeRemoveCaretContainer","renderInsideInlineCaret","inlines","moveWord","setupSelectedState","moveNextWord","movePrevWord","BoundarySelection","getNodeClientRects","toArrayWithNode","BreakType","findUntil","walkUntil","isAboveFn","isBeflowFn","targetClientRect","aboveLineNumber","lineNumber","isLineNumber","upUntil","Up","downUntil","Down","positionsUntil","isBelowFn","caretWalker","getClientRect","isAboveLine","isLine","isContentEditableFalse$7","findNode$1","distanceToRectLeft","distanceToRectRight","isInside","findClosestClientRect","oldClientRect","oldDistance","newDistance","walkUntil$1","findLineNodeRects","targetNodeRect","checkPosFn","lineRects","getFakeCaretTargets","caretInfo","closestCaret","closestNodeRect","contentEditableFalseNodeRects","targetNodeRects","isContentEditableTrue$3","isContentEditableFalse$8","showCaret","getNodeRange","renderCaretAtRange","caretPositionNode","caretPositionBeforeNode","ceRoot","renderRangeCaret","caretRange","isChar","isBeforeSpace","isAfterSpace","isEmptyText","matchesElementPosition","isImageBlock","isCefNode","isBeforeImageBlock","isAfterImageBlock","isBeforeTable","isAfterTable","isBeforeContentEditableFalse","isAfterContentEditableFalse","customEventRootDelegates","beforeUnloadDelegate","walk$3","getBreakType","currentPos","Br","Block","Wrap","getPositionsUntil","breakType","breakAt","Eol","getAdjacentLinePositions","getPositionsUntilBreak","findClosestHorizontalPositionFromPoint","newPos","lastPos","lastRect","lastDist","newDist","findClosestHorizontalPosition","targetRect","getPositionsUntilPreviousLine","getPositionsUntilNextLine","isAtFirstLine","isAtLastLine","getPositionsAbove","getPositionsBelow","getFirstLinePositions","getLastLinePositions","isContentEditableFalse$9","getSelectedNode$1","moveToCeFalseHorizontally","getNextPosFn","isBeforeContentEditableFalseFn","rangeIsInContainerBlock","nextCaretPosition","peekCaretPosition","moveToCeFalseVertically","walkerFn","linePositions","nextLinePositions","closestNextLineRect","caretClientRect","dist1","dist2","contentEditableFalseNode","caretPositions","exitPreBlock","getNextVisualCaretPosition","getPrevVisualCaretPosition","getHorizontalRange","newRange","getVerticalRange","moveH","moveV","isCefPosition","moveToLineEndPoint","deflate","getCorners","getYAxisValue","tds","findClosestCorner","corners","newCorner","oldCorner","oldDist","getClosestCell","isTargetCorner","corner","getBottomValue","getTopValue","isAbove$1","isBelow$1","getClosestCellAbove","getClosestCellBelow","findClosestPositionInAboveCell","findClosestPositionInBelowCell","moveToRange","hasNextBreak","lineInfo","breakPos","startsWithWrapBreak","startsWithBrBreak","isAtTableCellLine","isAtFirstTableCellLine","isAtLastTableCellLine","isCaretAtStartOrEndOfTable","navigateHorizontally","getClosestAbovePosition","getClosestBelowPosition","getTable","renderBlock","navigateVertically","moveH$1","moveV$1","rangeBefore","insertElement","insertBr","insertBlock$1","insertEmptyLine","getClosestTargetBlock","isAtFirstOrLastLine","moveCaretToNewEmptyLine","rootBlockAttrs","moveV$2","defaultPatterns","matchesEvent","match$1","MatchKeys","executeKeydownOverride","ArrowKeys","isBeforeRoot","getParentBlock$1","placeCaretInEmptyBody","paddEmptyBody","willDeleteLastPositionInElement","fromPos","firstPos","normalizedFirstPos","normalizedLastPos","normalizedFromPos","DeleteUtils","blockPosition","blockBoundary","getBlockPosition","isDifferentBlocks","hasSameParent","parent1","parent2","skipLastBr","lastPositionInBlock","readFromRange","fromBlockPos","toBlockPos","blockPos","read$3","BlockMergeBoundary","getChildrenUntilBlockBoundary","extractChildren","removeEmptyRoot","isEmptyBefore","nestedBlockMerge","fromBlock","toBlock","insertionPoint","sidelongBlockMerge","findInsertionPoint","getInsertionPoint","trimBr","mergeBlockInto","mergeBlocks","MergeBlocks","BlockBoundaryDelete","deleteRangeMergeBlocks","isRawNodeInTable","isSelectionInTable","isEverythingSelected","noPrevious","noNext","emptyEditor","deleteRange","backspaceDelete$1","BlockRangeDelete","isBr$5","parentBlocks","isBeforeBr","isAfterBr","findPreviousBr","findNextBr","isCompoundElement","DeleteAction","moveToElement","moveToPosition","isAtContentEditableBlockCaret","caretLocation","isDeleteFromCefDifferentBlocks","deleteEmptyBlockOrMoveToCef","toCefElm","blockElm","findCefPosition","getContentEditableBlockAction","skipMoveToActionFromInlineCefToContent","deleteAction","getContentEditableAction","read$4","deleteElement$1","hideFakeCaret","getAncestorCe","getContentEditableRoot$1","deleteOffscreenSelection","hasCefAncestor","paddEmptyElement","backspaceDelete$2","CefDelete","trimEmptyTextNode$1","deleteContentAndShowCaret","deleteCefBoundaryText","backspaceDelete$3","CefBoundaryDelete","isFeatureEnabled$1","rangeFromPositions","hasOnlyTwoOrLessPositionsLeft","setCaretLocation","deleteFromTo","rescope$1","backspaceDeleteCollapsed","toPosition","backspaceDelete$4","BoundaryDelete","getParentInlines","hasOnlyOneChild","deleteLastPosition","parentInlines","isFormatElement$1","deleteCaret","backspaceDelete$5","InlineFormatDelete","tableCellRng","tableSelection","removeTable","emptyCells","isRootFromElement","getClosestCell$1","getClosestTable","isExpandedCellRng","cellRng","getTableFromCellRng","startParentTable","endParentTable","getTableCells","getCellRangeFromStartTable","endCell","partialSelection","isWithinSameTable","getCellRng","getTableSelectionFromCellRng","getTableSelectionFromRng","getCellIndex","getSelectedCells","getActionFromRange","deleteTableElement","deleteCellRange","deleteCaptionRange","emptyElement","deleteTableRange","getParentCaption","deleteRange$1","getParentCell","deleteBetweenCells","fromCell","isDeleteOfLastCharPos","fromCaption","emptyCaretCaption","validateCaretCaption","toCaption","deleteCaretInsideCaption","deleteCaretCells","deleteCaretCaption","isNearTable","isBeforeOrAfterTable","deleteCaret$1","backspaceDelete$6","TableDelete","deleteCaret$2","backspaceDelete$7","PageBreakDelete","isEditable$1","parseIndentValue","getIndentStyleName","useMargin","indentStyleName","indentElement","validateBlocks","intentValue","canOutdent","getBlocksToIndent","isListComponent","parentIsListComponent","indentUnit","indentValue","navigateIgnoreEmptyTextNodes","getClosestBlock","isAtBeforeAfterBlockBoundary","isAtBlockBoundary","isAtStartOfBlock","isAtEndOfBlock","isBeforeBlock","isAfterBlock","backspaceDelete$8","_caret","_forward","Outdent","executeKeydownOverride$1","executeKeyupOverride","DeleteBackspaceKeys","firstNonWhiteSpaceNodeSibling","moveToCaretPosition","getEditableRoot","editableRoot","getParentBlock$2","getParentBlockName","isListItemParentBlock","NewLineUtils","hasFirstChild","hasParent$1","isListBlock","isNestedList","getContainerBlock","containerBlock","containerBlockParent","isFirstOrLastLi","createNewBlock","newBlockName","InsertLi","trimZwsp","isEmptyAnchor","isTableCell$4","emptyBlock","containerAndSiblingName","canSplitBlock","trimInlineElementsOnLeftSideOfBlock","firstChilds","normalizeZwspOffset","includeZwspInRange","trimLeadingLineBreaks","getEditableRoot$1","applyAttributes","forcedRootBlockAttrs","attrStyles","currentStyles","newStyles","attrClassesOpt","attrClasses","currentClassesOpt","currentClasses","filteredClasses","newClasses","appliedAttrs","remainingAttrs","setForcedBlockAttrs","wrapSelfAndSiblingsInDefaultBlock","addBrToBlockIfNeeded","parentBlockName","containerBlockName","isAfterLastNodeInContainer","clonedNode","textInlineElements","isCaretAtStartOrEndOfBlock","normalizedOffset","insertNewBlockAfter","InsertBlock","hasRightSideContent","scrollToBr","brElm","moveSelectionToBr","extraBr","insertBrAtCaret","isControlKey","insertBrBefore","insertBrAfter","hasBrAfter","isBeforeBr$1","isAnchorLink","isInsideAnchor","readInlineAnchorLocation","insertBrOutsideAnchor","insert$2","anchorLocation","InsertBr","shouldInsertBr","shouldBlockNewLine","ContextSelectors","newLineAction","shouldBlockNewLine$1","isBrMode","requiredState","brMode","inListBlock","inPreBlock","inSummaryBlock","shouldPutBrInPre$1","inBrContext","canInsertIntoEditableRoot","rootEditable","match$2","predicates","isMatch","getAction$1","NewLineAction","insert$3","InsertNewLine","handleEnterKeyEvent","EnterKey","insertTextAtPosition","insertNbspAtPosition","insertSpaceAtPosition","isInMiddleOfText","getClosestBlock$1","hasSpaceBefore","hasSpaceAfter","isPreValue","isInPre","isAtBeginningOfBody","isAtEndOfBody","isAtLineBoundary","needsToHaveNbsp","needsToBeNbspLeft","needsToBeNbspRight","afterPos","needsToBeNbsp","isNbspAt","hasNbsp","normalizeNbspMiddle","chars","normalizeNbspAtStart","normalizeNbspInMiddleOfTextNode","newText","normalizeNbspAtEnd","normalizeNbsps","normalizeNbspsInEditor","locationToCaretPosition","insertInlineBoundarySpaceOrNbsp","checkPos","setSelection$1","insertSpaceOrNbspAtSelection","executeKeydownOverride$2","SpaceKey","findBlockCaretContainer","removeIeControlRect","showBlockCaretContainer","blockCaretContainer","handleBlockContainer","CaretContainerInput","browser$5","setupIeInput","keypressThrotter","isComposing","executeKeydownOverride$3","setup$f","HomeEndKeys","setup$g","KeyboardOverrides","NodeChange","lastPath","nativeRng","fakeRng","isSameElementPath","disable_nodechange","currentPath","preventSummaryToggle","filterDetails","setup$h","isTextBlockNode","normalizeSelection$1","setup$i","getAbsolutePosition","getBodyPosition","getScrollPosition","getBodyScroll","inlineScroll","iframeScroll","getMousePosition","iframePosition","scrollPosition","calculatePosition","bodyPosition","mousePosition","calc","MousePosition","isContentEditableFalse$a","isContentEditableTrue$4","isDraggable","isValidDropTarget","dragElement","cloneElement","cloneElm","createGhost","clonedElm","ghostElm","appendGhostToBody","moveGhost","overflowX","removeElement","isLeftMouseButtonPressed","hasDraggableElement","applyRelPos","relX","start$1","ceElm","elmPos","relY","ghost","throttledPlaceCaretAt","dragging","targetPos","getRawTarget","targetClone_1","targetClone","removeDragState","bindFakeDragEvents","pageDom","dragStartHandler","dragHandler","dropHandler","dragEndHandler","blockIeDrop","realTarget","DragDropOverrides","setup$j","renderFocusCaret","CefFocus","isContentEditableTrue$5","isContentEditableFalse$b","getContentEditableRoot$2","SelectionOverrides","selectedContentEditableNode","fakeCaret","realSelectionId","isFakeSelectionElement","getRealSelectionElement","setRange","getRange","contentEditableRoot","removeContentEditableSelection","handleTouchSelect","setContentEditableSelection","hasNormalCaretPosition","hasBetterMouseTarget","targetBlock","normalizeShortEndedElementSelection","isRangeInCaretContainer","realSelectionElement","outerText","isWithinCaretContainer","$realSelectionContainer","origTargetClone","nodeElm","isGecko","isWebKit","mceInternalDataType","setEditorCommandState","setMceInternalContent","selectionHtml","internalContent","getMceInternalContent","insertClipboardContents","queryCommandSupported","emptyEditorWhenDeleting","serializeRng","allContentsSelected","allRng","allSelection","selectAll","inputMethodFocus","removeHrOnBackspace","selectControlElements","removeStylesWhenDeletingAcrossBlockElements","getAttributeApplyFunction","template","setAttributeNode","isSelectionAcrossElements","disableBackspaceIntoATable","removeBlockQuoteOnBackSpace","setGeckoEditingOptions","setOpts","addBrAfterLastLinks","fixLinks","setDefaultBlockType","showBrokenImageIcon","contentStyles","restoreFocusOnKeyDown","bodyHeight","blockCmdArrowNavigation","selection_1","disableAutoUrlDetect","tapLinksAndImages","blockFormSubmitInsideEditor","removeAppleInterchangeBrs","ieInternalDragAndDrop","DOM$4","appendStyle","createParser","autoFocus","auto_focus","moveSelectionToFirstCaretPosition","bindPendingEventDelegates","execCallback","getStyleSheetLoader","initContentBody","skipWrite","contentCssText","orgVisibility","iframeHTML","bodyEl","hex_colors","force_hex_style_colors","annotator","_nodeChangeDispatcher","browser_spellcheck","gecko_spellcheck","spellcheck","protect","startContent","content_style","InitContentBody","DOM$5","relaxDomain","ifr","domain","hostname","bodyUuid","domainRelaxUrl","createIframeElement","customAttrs","frameBorder","allowTransparency","createIframe","isDomainRelaxed","boxInfo","hidden","InitIframe","DOM$6","initPlugin","initializedPlugins","pluginInstance","trimLegacyPrefix","initIcons","iconPackName","currentIcons","defaultIcons","loadIcons","svgData","addIcon","initTheme","renderFromLoadedTheme","renderFromThemeFunc","iframeHeight","createThemeFalseResult","renderThemeFalseIframe","renderThemeFalse","renderThemeUi","Init","DOM$7","hasSkipLoadPrefix","loadLanguage","scriptLoader","languageCode","languageUrl","url_1","loadTheme","themeUrl","theme_url","getIconsUrlMetaFromUrl","getIconsUrlMetaFromName","urlMeta","loadPlugins","depPlugin","url_2","resetContent","triggerSave","encoding","set_dirty","hasOnlyOneChild$1","isPaddingNode","isPaddedEmptyBlock","isEmptyFragmentElement","isListFragment","cleanupDomFragment","domFragment","toDomFragment","listItems$1","isPadding","isListItemPadded","isEmptyOrPadded","trimListItems","getParentLi","isParentBlockLi","getSplit","beforeRng","afterRng","findFirstIn","newCaretPos","findLastOf","insertMiddle","insertBefore$1","insertAfter$1","insertAtCaret","liTarget","liElms","BEGINNING","isAt","InsertList","isAfterNbsp","trimOrPadLeftRight","hasSiblingText","trimNbspAfterDeleteAndPadValue","isTableCell$5","selectionSetContent","validInsertion","trimBrsFromTableCell","reduceInlineTextElements","root_1","elementUtils_1","testNode","markFragmentElements","umarkFragmentElements","isPartOfFragment","canHaveChildren","moveSelectionToMarker","parentEditableFalseElm","nextRng","getContentEditableFalseParent","findNextCaretRng","insertHtmlAtCaret","bookmarkHtml","caretElement","processValue","insertAtCaret$1","InsertContent","nativeCommand","deleteCommand","forwardDeleteCommand","DeleteCommands","ancestor$3","legacyPropNames","getSpecifiedFontProp","getProperty","legacyPropName","normalizeFontFamily","getComputedFontProp","getFontProp","FontInfo","getFontSize","getFontFamily","findFirstCaretElement","isRangeAtStartOfNode","getCaretElement","fromFontSizeNumber","fontSizeNumber","fontClasses","normalizeFontNames","fontNameAction","fontNameQuery","fontSizeAction","fontSizeQuery","each$f","map$3","inArray$2","EditorCommands","setupCommands","customCommand","skip_focus","addCommands","commandList","hasCustomCommand","execNativeCommand","isFormatMatch","storeSelection","selectionBookmark","queryCommandEnabled","listParent","editingHost","alignStates","Undo","Redo","nativeEvents","EventDispatcher","bindings","toggleEvent","isNative","beforeFire","wrappedCallback","bindingName","hi","getEventDispatcher","_eventDispatcher","toggleNativeEvent","Observable","dispatcherArgs","internalContentEditableAttr","setContentEditable","switchOffContentEditableTrue","switchOnContentEditableTrue","removeFakeSelection","restoreFakeSelection","toggleReadOnly","registerFilters","registerReadOnlyContentFilters","isClickEvent","isInAnchor","preventReadOnlyEvents","registerReadOnlySelectionBlockers","DOM$8","getEventTarget","event_root","eventRoot","isListening","fireEvent","bindEventDelegate","eventRootElm","delegates","editors","EditorObservable","_pendingNativeEvents","defaultModes","switchToMode","activeMode","availableModes","oldMode","activate","deactivate","editorReadOnly","registerMode","design","each$g","explode$3","keyCodeLookup","f1","f2","f3","f4","f5","f6","f7","f8","f9","f10","f11","f12","modifierNames","Shortcuts","pendingPatterns","hasModifier","isFunctionKey","matchShortcut","subpatterns","executeShortcutAction","desc","cmdFunc","createShortcut","parseShortcut","charCode","addAutocompleter","addSidebar","each$h","trim$4","queryParts","DEFAULT_PORTS","ftp","http","https","mailto","URI","baseUri","isProtocolRelative","toAbsPath","urlMatch","userInfo","uriComponents","pathname","setPath","pathMatch","toRelative","relativeUri","tu","uu","toRelPath","noHost","absoluteUri","defaultPort","breakPoint","normalizedBase","outPath","nb","normalizedPath","noProtoHost","DOM$9","extend$3","each$i","resolve$3","ie$1","loadedCSS","isNotDirty","documentBaseURL","base_url","_setBaseUrl","baseURI","referrer_policy","language_load","editorCommands","cache_suffix","modeInstance","callbackLookup","setProgressState","initialContent","oldState","urlconverter_callback","visual_table_class","visual_anchor_class","DOM$a","explode$4","each$j","extend$4","instanceCounter","boundGlobalEvents","legacyEditors","isValidLegacyKey","globalEventDelegate","EditorManager","toggleGlobalEvents","removeEditorFromList","targetEditor","oldEditors","purgeDestroyedEditor","isQuirksMode","compatMode","majorVersion","minorVersion","releaseDate","i18n","preInit","tinyMCEPreInit","srcScript","currentScript","pluginBaseUrls","plugin_base_urls","invalidInlineTargets","isInvalidInlineTarget","editor_deselector","editor_selector","provideResults","initEditors","initCount","createEditor","existingEditor","addI18n","RangeUtils","normalizedRng","compareRanges","extendClass","initializing","RangeUtils$1","awaiter","resolveCb","rejectCb","tasks","resultFns","loadErrMsg","runErrMsg","task","waiter","Resource","round$2","relativePosition","targetW","targetH","findBestRelativePosition","constrainRect","intersect","x1","y1","fixedSize","underflowX1","underflowY1","overflowX2","overflowY2","cx2","cy2","fromClientRect","each$k","extend$5","Class","member","_super","mixins","mixin","Mixins","dummy","createMethod","Methods","Properties","Statics","Defaults","min$1","max$1","round$3","Color","rgb2hsv","hsvToRgb","toRgb","toHsv","hexCode","JSONUtils","JSONP","XHR","ready","success_scope","error_scope","overrideMimeType","content_type","crossDomain","requestheaders","extend$6","JSONRequest","sendRPC","ecb","scb","xhrArgs","ty","removeItem","configurable","enumerable","LocalStorage","publicApi","geom","isMac","exportToModuleLoaders","exportToWindowGlobal","tinyMCE","Content","editorContent","fullscreenState","revocable","doRevoke","unbindable","filterSelf","fireFullscreenStateChanged","siblings$1","siblings$2","siblingStyles","ancestorPosition","ancestorStyles","bgFallback","matchColor","editorBody","clobberStyles","gatherSibilings","clobber","clobberStyle","backup","containerStyles","restoreStyles","clobberedEls","Thor","getScrollPos","setScrollPos","viewportUpdate","resizeBinder","scrollBinder","refreshScroll","refreshVisualViewport","toggleFullscreen","editorContainerStyle","iframeStyle","editorContainerS","fullscreenInfo","iframeWidth","containerWidth","containerTop","containerLeft","newFullScreenInfo","editorEventCallback"],"mappings":"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mH,EAAM2lH,GAAS1rC,MAAK,SAAU+sC,GACrD,OAAOA,EAAQx8F,MAAM,KAAK,MAG9B,SAASy8F,IACP,OAAOR,EAAUxsC,KAAKipC,IAExB,MAAO,CACLyD,QAASA,EACTd,OAAQA,EACRC,UAAWA,EACXc,SAAUA,EACVC,eAAgBA,EAChBC,kBAAmBA,EACnBC,iBAAkBA,EAClBE,SAAUA,GAGd,SAASC,GAASl7F,GAChB,OAAOk6F,GAAcl6F,GAAMiuD,MAAK,SAAUwqC,GACxC,OAAO+B,GAASR,GAAah6F,GAAOA,EAAMy4F,MAG9C,SAAS0C,GAAWx7B,EAAQ3rF,GAC1B,OAAO0lH,GAAa/5B,EAAQ3rF,GAAMi6E,MAAK,SAAUjuD,GAC/C,OAAOw6F,GAASzC,GAAUnpH,QAAQ+wF,GAAS3/D,EAAM2/D,EAAOm6B,gBAI5D,IAAIsB,GAAoB,SAAUp7F,GAChC,OAAOk7F,GAASl7F,IAGlB,SAASq7F,GAAQ5tH,EAAOwuC,EAAKtS,GAC3B,IAAI2xF,EAA+B,kBAAV7tH,EAAqB87B,WAAW97B,GAASA,EAMlE,OALI6tH,EAAc3xF,EAChB2xF,EAAc3xF,EACL2xF,EAAcr/E,IACvBq/E,EAAcr/E,GAETq/E,EAET,SAASC,KACP,MAAO,CACL,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GAGJ,IAAIC,GAAc,CAChB,EACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,EACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,IACA,KACA,EACA,KACA,KACA,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AMhM,YAAc,YAAco4E,EAAM,IACxCo2K,SACAf,EAAazhP,GAGfmiP,IAEFV,EAAaz2O,GACbA,EAAK+3J,KAAO32F,OA/BV01K,SAJAD,KAqCAkB,EAAQ,SAAU32K,GACpB,OAAOmI,GAAOpgG,IAAG,SAAUzK,GACzBulE,EAAKm9B,EAAKtkG,EAAQ4B,EAASpB,EAASkG,GAAOjG,MAAM6jG,KAAQtkG,EAAQ4B,EAASpB,EAASkG,GAAON,MAAMk+F,UAGhG42K,EAAQ,SAAU7rQ,GACpB,OAAOA,EAAOtL,KAAKrD,EAAUA,IAE3By6Q,EAAU,SAAUC,EAAMxiM,EAASg0K,GACrCluC,GAAMh6M,EAAI02Q,EAAMH,IAAQvwQ,KAAI,SAAU2E,GACpC,IAAIqU,EAAQjb,EAAU4G,GAAQ,SAAUrM,GACtC,OAAOA,EAAEkD,aAEPwd,EAAM/a,KAAKrI,OAAS,EACtBssP,EAAQlpO,EAAM/a,KAAKjE,IAAIw2Q,IAEvBtiM,EAAQl1D,EAAMhb,KAAKhE,IAAIw2Q,QAI7B,MAAO,CACL/zM,KAAMA,EACNg0M,QAASA,EACTzB,mBAAoBA,GAIxB,IAmMI2B,GAAeC,GAAcC,GAnM7B57D,GAAS,CACX,UACA,QACA,UACA,MACA,KACA,aACA,SACA,OACA,WACA,SACA,SACA,OACA,OACA,MACA,UACA,UACA,OACA,IACA,KACA,WACA,KACA,SACA,UACA,SACA,aACA,KACA,KACA,KACA,KACA,KACA,KACA,UACA,MACA,MACA,YACA,OACA,MACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,WAEE67D,GAAQ,CACV,OACA,OACA,WACA,KACA,MACA,QACA,KACA,MACA,QACA,UACA,OACA,OACA,QACA,QACA,SACA,MACA,SAEEC,GAAa,CACf,KACA,MAEEC,GAAgB,CAClB,QACA,QACA,SAEEpuE,GAAa,CACf,KACA,KACA,KACA,KACA,KACA,KACA,IACA,MACA,UACA,MACA,OACA,aACA,SACA,MACA,WACA,SACA,SACA,UACA,UACA,SACA,QACA,MACA,UAEEquE,GAAW,CACb,K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","file":"js/chunk-50e7582d.2bc955de.js","sourcesContent":["/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var noop = function () {\n    };\n    var noarg = function (f) {\n      return function () {\n        return f();\n      };\n    };\n    var compose = function (fa, fb) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return fa(fb.apply(null, args));\n      };\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var identity = function (x) {\n      return x;\n    };\n    function curry(fn) {\n      var initialArgs = [];\n      for (var _i = 1; _i < arguments.length; _i++) {\n        initialArgs[_i - 1] = arguments[_i];\n      }\n      return function () {\n        var restArgs = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          restArgs[_i] = arguments[_i];\n        }\n        var all = initialArgs.concat(restArgs);\n        return fn.apply(null, all);\n      };\n    }\n    var not = function (f) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return !f.apply(null, args);\n      };\n    };\n    var die = function (msg) {\n      return function () {\n        throw new Error(msg);\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.ThemeManager');\n\n    var __assign = function () {\n      __assign = Object.assign || function __assign(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p))\n              t[p] = s[p];\n        }\n        return t;\n      };\n      return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n      var t = {};\n      for (var p in s)\n        if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n          t[p] = s[p];\n      if (s != null && typeof Object.getOwnPropertySymbols === 'function')\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n            t[p[i]] = s[p[i]];\n        }\n      return t;\n    }\n    function __spreadArrays() {\n      for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n        s += arguments[i].length;\n      for (var r = Array(s), k = 0, i = 0; i < il; i++)\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n      return r;\n    }\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var value = function (o) {\n      var is = function (v) {\n        return o === v;\n      };\n      var or = function (opt) {\n        return value(o);\n      };\n      var orThunk = function (f) {\n        return value(o);\n      };\n      var map = function (f) {\n        return value(f(o));\n      };\n      var mapError = function (f) {\n        return value(o);\n      };\n      var each = function (f) {\n        f(o);\n      };\n      var bind = function (f) {\n        return f(o);\n      };\n      var fold = function (_, onValue) {\n        return onValue(o);\n      };\n      var exists = function (f) {\n        return f(o);\n      };\n      var forall = function (f) {\n        return f(o);\n      };\n      var toOption = function () {\n        return Option.some(o);\n      };\n      return {\n        is: is,\n        isValue: always,\n        isError: never,\n        getOr: constant(o),\n        getOrThunk: constant(o),\n        getOrDie: constant(o),\n        or: or,\n        orThunk: orThunk,\n        fold: fold,\n        map: map,\n        mapError: mapError,\n        each: each,\n        bind: bind,\n        exists: exists,\n        forall: forall,\n        toOption: toOption\n      };\n    };\n    var error = function (message) {\n      var getOrThunk = function (f) {\n        return f();\n      };\n      var getOrDie = function () {\n        return die(String(message))();\n      };\n      var or = function (opt) {\n        return opt;\n      };\n      var orThunk = function (f) {\n        return f();\n      };\n      var map = function (f) {\n        return error(message);\n      };\n      var mapError = function (f) {\n        return error(f(message));\n      };\n      var bind = function (f) {\n        return error(message);\n      };\n      var fold = function (onError, _) {\n        return onError(message);\n      };\n      return {\n        is: never,\n        isValue: never,\n        isError: always,\n        getOr: identity,\n        getOrThunk: getOrThunk,\n        getOrDie: getOrDie,\n        or: or,\n        orThunk: orThunk,\n        fold: fold,\n        map: map,\n        mapError: mapError,\n        each: noop,\n        bind: bind,\n        exists: never,\n        forall: always,\n        toOption: Option.none\n      };\n    };\n    var fromOption = function (opt, err) {\n      return opt.fold(function () {\n        return error(err);\n      }, value);\n    };\n    var Result = {\n      value: value,\n      error: error,\n      fromOption: fromOption\n    };\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isString = isType('string');\n    var isObject = isType('object');\n    var isArray = isType('array');\n    var isBoolean = isType('boolean');\n    var isFunction = isType('function');\n    var isNumber = isType('number');\n    var isArrayOf = function (value, pred) {\n      if (isArray(value)) {\n        for (var i = 0, len = value.length; i < len; ++i) {\n          if (pred(value[i]) !== true) {\n            return false;\n          }\n        }\n        return true;\n      }\n      return false;\n    };\n\n    var nativeSlice = Array.prototype.slice;\n    var nativeIndexOf = Array.prototype.indexOf;\n    var nativePush = Array.prototype.push;\n    var rawIndexOf = function (ts, t) {\n      return nativeIndexOf.call(ts, t);\n    };\n    var indexOf = function (xs, x) {\n      var r = rawIndexOf(xs, x);\n      return r === -1 ? Option.none() : Option.some(r);\n    };\n    var contains = function (xs, x) {\n      return rawIndexOf(xs, x) > -1;\n    };\n    var exists = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    var range = function (num, f) {\n      var r = [];\n      for (var i = 0; i < num; i++) {\n        r.push(f(i));\n      }\n      return r;\n    };\n    var chunk = function (array, size) {\n      var r = [];\n      for (var i = 0; i < array.length; i += size) {\n        var s = nativeSlice.call(array, i, i + size);\n        r.push(s);\n      }\n      return r;\n    };\n    var map = function (xs, f) {\n      var len = xs.length;\n      var r = new Array(len);\n      for (var i = 0; i < len; i++) {\n        var x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    var each = function (xs, f) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var eachr = function (xs, f) {\n      for (var i = xs.length - 1; i >= 0; i--) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var partition = function (xs, pred) {\n      var pass = [];\n      var fail = [];\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        var arr = pred(x, i) ? pass : fail;\n        arr.push(x);\n      }\n      return {\n        pass: pass,\n        fail: fail\n      };\n    };\n    var filter = function (xs, pred) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n    var foldr = function (xs, f, acc) {\n      eachr(xs, function (x) {\n        acc = f(acc, x);\n      });\n      return acc;\n    };\n    var foldl = function (xs, f, acc) {\n      each(xs, function (x) {\n        acc = f(acc, x);\n      });\n      return acc;\n    };\n    var find = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return Option.some(x);\n        }\n      }\n      return Option.none();\n    };\n    var findIndex = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return Option.some(i);\n        }\n      }\n      return Option.none();\n    };\n    var flatten = function (xs) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    var bind = function (xs, f) {\n      return flatten(map(xs, f));\n    };\n    var forall = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        var x = xs[i];\n        if (pred(x, i) !== true) {\n          return false;\n        }\n      }\n      return true;\n    };\n    var reverse = function (xs) {\n      var r = nativeSlice.call(xs, 0);\n      r.reverse();\n      return r;\n    };\n    var difference = function (a1, a2) {\n      return filter(a1, function (x) {\n        return !contains(a2, x);\n      });\n    };\n    var mapToObject = function (xs, f) {\n      var r = {};\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        r[String(x)] = f(x, i);\n      }\n      return r;\n    };\n    var pure = function (x) {\n      return [x];\n    };\n    var sort = function (xs, comparator) {\n      var copy = nativeSlice.call(xs, 0);\n      copy.sort(comparator);\n      return copy;\n    };\n    var head = function (xs) {\n      return xs.length === 0 ? Option.none() : Option.some(xs[0]);\n    };\n    var last = function (xs) {\n      return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]);\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n    var findMap = function (arr, f) {\n      for (var i = 0; i < arr.length; i++) {\n        var r = f(arr[i], i);\n        if (r.isSome()) {\n          return r;\n        }\n      }\n      return Option.none();\n    };\n\n    var keys = Object.keys;\n    var hasOwnProperty = Object.hasOwnProperty;\n    var each$1 = function (obj, f) {\n      var props = keys(obj);\n      for (var k = 0, len = props.length; k < len; k++) {\n        var i = props[k];\n        var x = obj[i];\n        f(x, i);\n      }\n    };\n    var map$1 = function (obj, f) {\n      return tupleMap(obj, function (x, i) {\n        return {\n          k: i,\n          v: f(x, i)\n        };\n      });\n    };\n    var tupleMap = function (obj, f) {\n      var r = {};\n      each$1(obj, function (x, i) {\n        var tuple = f(x, i);\n        r[tuple.k] = tuple.v;\n      });\n      return r;\n    };\n    var mapToArray = function (obj, f) {\n      var r = [];\n      each$1(obj, function (value, name) {\n        r.push(f(value, name));\n      });\n      return r;\n    };\n    var find$1 = function (obj, pred) {\n      var props = keys(obj);\n      for (var k = 0, len = props.length; k < len; k++) {\n        var i = props[k];\n        var x = obj[i];\n        if (pred(x, i, obj)) {\n          return Option.some(x);\n        }\n      }\n      return Option.none();\n    };\n    var values = function (obj) {\n      return mapToArray(obj, function (v) {\n        return v;\n      });\n    };\n    var get = function (obj, key) {\n      return has(obj, key) ? Option.from(obj[key]) : Option.none();\n    };\n    var has = function (obj, key) {\n      return hasOwnProperty.call(obj, key);\n    };\n    var hasNonNullableKey = function (obj, key) {\n      return has(obj, key) && obj[key] !== undefined && obj[key] !== null;\n    };\n\n    var generate = function (cases) {\n      if (!isArray(cases)) {\n        throw new Error('cases must be an array');\n      }\n      if (cases.length === 0) {\n        throw new Error('there must be at least one case');\n      }\n      var constructors = [];\n      var adt = {};\n      each(cases, function (acase, count) {\n        var keys$1 = keys(acase);\n        if (keys$1.length !== 1) {\n          throw new Error('one and only one name per case');\n        }\n        var key = keys$1[0];\n        var value = acase[key];\n        if (adt[key] !== undefined) {\n          throw new Error('duplicate key detected:' + key);\n        } else if (key === 'cata') {\n          throw new Error('cannot have a case named cata (sorry)');\n        } else if (!isArray(value)) {\n          throw new Error('case arguments must be an array');\n        }\n        constructors.push(key);\n        adt[key] = function () {\n          var argLength = arguments.length;\n          if (argLength !== value.length) {\n            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);\n          }\n          var args = new Array(argLength);\n          for (var i = 0; i < args.length; i++) {\n            args[i] = arguments[i];\n          }\n          var match = function (branches) {\n            var branchKeys = keys(branches);\n            if (constructors.length !== branchKeys.length) {\n              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\\nActual: ' + branchKeys.join(','));\n            }\n            var allReqd = forall(constructors, function (reqKey) {\n              return contains(branchKeys, reqKey);\n            });\n            if (!allReqd) {\n              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\\nRequired: ' + constructors.join(', '));\n            }\n            return branches[key].apply(null, args);\n          };\n          return {\n            fold: function () {\n              if (arguments.length !== cases.length) {\n                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + arguments.length);\n              }\n              var target = arguments[count];\n              return target.apply(null, args);\n            },\n            match: match,\n            log: function (label) {\n              domGlobals.console.log(label, {\n                constructors: constructors,\n                constructor: key,\n                params: args\n              });\n            }\n          };\n        };\n      });\n      return adt;\n    };\n    var Adt = { generate: generate };\n\n    var hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n    var shallow = function (old, nu) {\n      return nu;\n    };\n    var deep = function (old, nu) {\n      var bothObjects = isObject(old) && isObject(nu);\n      return bothObjects ? deepMerge(old, nu) : nu;\n    };\n    var baseMerge = function (merger) {\n      return function () {\n        var objects = new Array(arguments.length);\n        for (var i = 0; i < objects.length; i++) {\n          objects[i] = arguments[i];\n        }\n        if (objects.length === 0) {\n          throw new Error('Can\\'t merge zero objects');\n        }\n        var ret = {};\n        for (var j = 0; j < objects.length; j++) {\n          var curObject = objects[j];\n          for (var key in curObject) {\n            if (hasOwnProperty$1.call(curObject, key)) {\n              ret[key] = merger(ret[key], curObject[key]);\n            }\n          }\n        }\n        return ret;\n      };\n    };\n    var deepMerge = baseMerge(deep);\n    var merge = baseMerge(shallow);\n\n    var cached = function (f) {\n      var called = false;\n      var r;\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        if (!called) {\n          called = true;\n          r = f.apply(null, args);\n        }\n        return r;\n      };\n    };\n\n    var SimpleResultType;\n    (function (SimpleResultType) {\n      SimpleResultType[SimpleResultType['Error'] = 0] = 'Error';\n      SimpleResultType[SimpleResultType['Value'] = 1] = 'Value';\n    }(SimpleResultType || (SimpleResultType = {})));\n    var fold = function (res, onError, onValue) {\n      return res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue);\n    };\n    var partition$1 = function (results) {\n      var values = [];\n      var errors = [];\n      each(results, function (obj) {\n        fold(obj, function (err) {\n          return errors.push(err);\n        }, function (val) {\n          return values.push(val);\n        });\n      });\n      return {\n        values: values,\n        errors: errors\n      };\n    };\n    var mapError = function (res, f) {\n      if (res.stype === SimpleResultType.Error) {\n        return {\n          stype: SimpleResultType.Error,\n          serror: f(res.serror)\n        };\n      } else {\n        return res;\n      }\n    };\n    var map$2 = function (res, f) {\n      if (res.stype === SimpleResultType.Value) {\n        return {\n          stype: SimpleResultType.Value,\n          svalue: f(res.svalue)\n        };\n      } else {\n        return res;\n      }\n    };\n    var bind$1 = function (res, f) {\n      if (res.stype === SimpleResultType.Value) {\n        return f(res.svalue);\n      } else {\n        return res;\n      }\n    };\n    var bindError = function (res, f) {\n      if (res.stype === SimpleResultType.Error) {\n        return f(res.serror);\n      } else {\n        return res;\n      }\n    };\n    var svalue = function (v) {\n      return {\n        stype: SimpleResultType.Value,\n        svalue: v\n      };\n    };\n    var serror = function (e) {\n      return {\n        stype: SimpleResultType.Error,\n        serror: e\n      };\n    };\n    var toResult = function (res) {\n      return fold(res, Result.error, Result.value);\n    };\n    var fromResult = function (res) {\n      return res.fold(serror, svalue);\n    };\n    var SimpleResult = {\n      fromResult: fromResult,\n      toResult: toResult,\n      svalue: svalue,\n      partition: partition$1,\n      serror: serror,\n      bind: bind$1,\n      bindError: bindError,\n      map: map$2,\n      mapError: mapError,\n      fold: fold\n    };\n\n    var adt = Adt.generate([\n      { strict: [] },\n      { defaultedThunk: ['fallbackThunk'] },\n      { asOption: [] },\n      { asDefaultedOptionThunk: ['fallbackThunk'] },\n      { mergeWithThunk: ['baseThunk'] }\n    ]);\n    var defaulted = function (fallback) {\n      return adt.defaultedThunk(constant(fallback));\n    };\n    var mergeWith = function (base) {\n      return adt.mergeWithThunk(constant(base));\n    };\n    var strict = adt.strict;\n    var asOption = adt.asOption;\n    var defaultedThunk = adt.defaultedThunk;\n    var asDefaultedOptionThunk = adt.asDefaultedOptionThunk;\n    var mergeWithThunk = adt.mergeWithThunk;\n\n    var exclude = function (obj, fields) {\n      var r = {};\n      each$1(obj, function (v, k) {\n        if (!contains(fields, k)) {\n          r[k] = v;\n        }\n      });\n      return r;\n    };\n\n    var wrap = function (key, value) {\n      var _a;\n      return _a = {}, _a[key] = value, _a;\n    };\n    var wrapAll = function (keyvalues) {\n      var r = {};\n      each(keyvalues, function (kv) {\n        r[kv.key] = kv.value;\n      });\n      return r;\n    };\n\n    var comparison = Adt.generate([\n      {\n        bothErrors: [\n          'error1',\n          'error2'\n        ]\n      },\n      {\n        firstError: [\n          'error1',\n          'value2'\n        ]\n      },\n      {\n        secondError: [\n          'value1',\n          'error2'\n        ]\n      },\n      {\n        bothValues: [\n          'value1',\n          'value2'\n        ]\n      }\n    ]);\n    var partition$2 = function (results) {\n      var errors = [];\n      var values = [];\n      each(results, function (result) {\n        result.fold(function (err) {\n          errors.push(err);\n        }, function (value) {\n          values.push(value);\n        });\n      });\n      return {\n        errors: errors,\n        values: values\n      };\n    };\n\n    var exclude$1 = function (obj, fields) {\n      return exclude(obj, fields);\n    };\n    var wrap$1 = function (key, value) {\n      return wrap(key, value);\n    };\n    var wrapAll$1 = function (keyvalues) {\n      return wrapAll(keyvalues);\n    };\n    var mergeValues = function (values, base) {\n      return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge.apply(undefined, values)));\n    };\n    var mergeErrors = function (errors) {\n      return Result.error(flatten(errors));\n    };\n    var consolidate = function (objs, base) {\n      var partitions = partition$2(objs);\n      return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : mergeValues(partitions.values, base);\n    };\n\n    var mergeValues$1 = function (values, base) {\n      return values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge.apply(undefined, values))) : SimpleResult.svalue(base);\n    };\n    var mergeErrors$1 = function (errors) {\n      return compose(SimpleResult.serror, flatten)(errors);\n    };\n    var consolidateObj = function (objects, base) {\n      var partition = SimpleResult.partition(objects);\n      return partition.errors.length > 0 ? mergeErrors$1(partition.errors) : mergeValues$1(partition.values, base);\n    };\n    var consolidateArr = function (objects) {\n      var partitions = SimpleResult.partition(objects);\n      return partitions.errors.length > 0 ? mergeErrors$1(partitions.errors) : SimpleResult.svalue(partitions.values);\n    };\n    var ResultCombine = {\n      consolidateObj: consolidateObj,\n      consolidateArr: consolidateArr\n    };\n\n    var formatObj = function (input) {\n      return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2);\n    };\n    var formatErrors = function (errors) {\n      var es = errors.length > 10 ? errors.slice(0, 10).concat([{\n          path: [],\n          getErrorInfo: function () {\n            return '... (only showing first ten failures)';\n          }\n        }]) : errors;\n      return map(es, function (e) {\n        return 'Failed path: (' + e.path.join(' > ') + ')\\n' + e.getErrorInfo();\n      });\n    };\n\n    var nu = function (path, getErrorInfo) {\n      return SimpleResult.serror([{\n          path: path,\n          getErrorInfo: getErrorInfo\n        }]);\n    };\n    var missingStrict = function (path, key, obj) {\n      return nu(path, function () {\n        return 'Could not find valid *strict* value for \"' + key + '\" in ' + formatObj(obj);\n      });\n    };\n    var missingKey = function (path, key) {\n      return nu(path, function () {\n        return 'Choice schema did not contain choice key: \"' + key + '\"';\n      });\n    };\n    var missingBranch = function (path, branches, branch) {\n      return nu(path, function () {\n        return 'The chosen schema: \"' + branch + '\" did not exist in branches: ' + formatObj(branches);\n      });\n    };\n    var unsupportedFields = function (path, unsupported) {\n      return nu(path, function () {\n        return 'There are unsupported fields: [' + unsupported.join(', ') + '] specified';\n      });\n    };\n    var custom = function (path, err) {\n      return nu(path, function () {\n        return err;\n      });\n    };\n\n    var adt$1 = Adt.generate([\n      {\n        field: [\n          'key',\n          'okey',\n          'presence',\n          'prop'\n        ]\n      },\n      {\n        state: [\n          'okey',\n          'instantiator'\n        ]\n      }\n    ]);\n    var strictAccess = function (path, obj, key) {\n      return get(obj, key).fold(function () {\n        return missingStrict(path, key, obj);\n      }, SimpleResult.svalue);\n    };\n    var fallbackAccess = function (obj, key, fallbackThunk) {\n      var v = get(obj, key).fold(function () {\n        return fallbackThunk(obj);\n      }, identity);\n      return SimpleResult.svalue(v);\n    };\n    var optionAccess = function (obj, key) {\n      return SimpleResult.svalue(get(obj, key));\n    };\n    var optionDefaultedAccess = function (obj, key, fallback) {\n      var opt = get(obj, key).map(function (val) {\n        return val === true ? fallback(obj) : val;\n      });\n      return SimpleResult.svalue(opt);\n    };\n    var cExtractOne = function (path, obj, field, strength) {\n      return field.fold(function (key, okey, presence, prop) {\n        var bundle = function (av) {\n          var result = prop.extract(path.concat([key]), strength, av);\n          return SimpleResult.map(result, function (res) {\n            return wrap(okey, strength(res));\n          });\n        };\n        var bundleAsOption = function (optValue) {\n          return optValue.fold(function () {\n            var outcome = wrap(okey, strength(Option.none()));\n            return SimpleResult.svalue(outcome);\n          }, function (ov) {\n            var result = prop.extract(path.concat([key]), strength, ov);\n            return SimpleResult.map(result, function (res) {\n              return wrap(okey, strength(Option.some(res)));\n            });\n          });\n        };\n        return function () {\n          return presence.fold(function () {\n            return SimpleResult.bind(strictAccess(path, obj, key), bundle);\n          }, function (fallbackThunk) {\n            return SimpleResult.bind(fallbackAccess(obj, key, fallbackThunk), bundle);\n          }, function () {\n            return SimpleResult.bind(optionAccess(obj, key), bundleAsOption);\n          }, function (fallbackThunk) {\n            return SimpleResult.bind(optionDefaultedAccess(obj, key, fallbackThunk), bundleAsOption);\n          }, function (baseThunk) {\n            var base = baseThunk(obj);\n            var result = SimpleResult.map(fallbackAccess(obj, key, constant({})), function (v) {\n              return deepMerge(base, v);\n            });\n            return SimpleResult.bind(result, bundle);\n          });\n        }();\n      }, function (okey, instantiator) {\n        var state = instantiator(obj);\n        return SimpleResult.svalue(wrap(okey, strength(state)));\n      });\n    };\n    var cExtract = function (path, obj, fields, strength) {\n      var results = map(fields, function (field) {\n        return cExtractOne(path, obj, field, strength);\n      });\n      return ResultCombine.consolidateObj(results, {});\n    };\n    var valueThunk = function (getDelegate) {\n      var extract = function (path, strength, val) {\n        return getDelegate().extract(path, strength, val);\n      };\n      var toString = function () {\n        return getDelegate().toString();\n      };\n      return {\n        extract: extract,\n        toString: toString\n      };\n    };\n    var value$1 = function (validator) {\n      var extract = function (path, strength, val) {\n        return SimpleResult.bindError(validator(val, strength), function (err) {\n          return custom(path, err);\n        });\n      };\n      var toString = function () {\n        return 'val';\n      };\n      return {\n        extract: extract,\n        toString: toString\n      };\n    };\n    var getSetKeys = function (obj) {\n      var keys$1 = keys(obj);\n      return filter(keys$1, function (k) {\n        return hasNonNullableKey(obj, k);\n      });\n    };\n    var objOfOnly = function (fields) {\n      var delegate = objOf(fields);\n      var fieldNames = foldr(fields, function (acc, f) {\n        return f.fold(function (key) {\n          return deepMerge(acc, wrap$1(key, true));\n        }, constant(acc));\n      }, {});\n      var extract = function (path, strength, o) {\n        var keys = isBoolean(o) ? [] : getSetKeys(o);\n        var extra = filter(keys, function (k) {\n          return !hasNonNullableKey(fieldNames, k);\n        });\n        return extra.length === 0 ? delegate.extract(path, strength, o) : unsupportedFields(path, extra);\n      };\n      return {\n        extract: extract,\n        toString: delegate.toString\n      };\n    };\n    var objOf = function (fields) {\n      var extract = function (path, strength, o) {\n        return cExtract(path, o, fields, strength);\n      };\n      var toString = function () {\n        var fieldStrings = map(fields, function (field) {\n          return field.fold(function (key, okey, presence, prop) {\n            return key + ' -> ' + prop.toString();\n          }, function (okey, instantiator) {\n            return 'state(' + okey + ')';\n          });\n        });\n        return 'obj{\\n' + fieldStrings.join('\\n') + '}';\n      };\n      return {\n        extract: extract,\n        toString: toString\n      };\n    };\n    var arrOf = function (prop) {\n      var extract = function (path, strength, array) {\n        var results = map(array, function (a, i) {\n          return prop.extract(path.concat(['[' + i + ']']), strength, a);\n        });\n        return ResultCombine.consolidateArr(results);\n      };\n      var toString = function () {\n        return 'array(' + prop.toString() + ')';\n      };\n      return {\n        extract: extract,\n        toString: toString\n      };\n    };\n    var oneOf = function (props) {\n      var extract = function (path, strength, val) {\n        var errors = [];\n        for (var _i = 0, props_1 = props; _i < props_1.length; _i++) {\n          var prop = props_1[_i];\n          var res = prop.extract(path, strength, val);\n          if (res.stype === SimpleResultType.Value) {\n            return res;\n          }\n          errors.push(res);\n        }\n        return ResultCombine.consolidateArr(errors);\n      };\n      var toString = function () {\n        return 'oneOf(' + map(props, function (prop) {\n          return prop.toString();\n        }).join(', ') + ')';\n      };\n      return {\n        extract: extract,\n        toString: toString\n      };\n    };\n    var setOf = function (validator, prop) {\n      var validateKeys = function (path, keys) {\n        return arrOf(value$1(validator)).extract(path, identity, keys);\n      };\n      var extract = function (path, strength, o) {\n        var keys$1 = keys(o);\n        var validatedKeys = validateKeys(path, keys$1);\n        return SimpleResult.bind(validatedKeys, function (validKeys) {\n          var schema = map(validKeys, function (vk) {\n            return adt$1.field(vk, vk, strict(), prop);\n          });\n          return objOf(schema).extract(path, strength, o);\n        });\n      };\n      var toString = function () {\n        return 'setOf(' + prop.toString() + ')';\n      };\n      return {\n        extract: extract,\n        toString: toString\n      };\n    };\n    var anyValue = constant(value$1(SimpleResult.svalue));\n    var arrOfObj = compose(arrOf, objOf);\n    var state = adt$1.state;\n    var field = adt$1.field;\n\n    var chooseFrom = function (path, strength, input, branches, ch) {\n      var fields = get(branches, ch);\n      return fields.fold(function () {\n        return missingBranch(path, branches, ch);\n      }, function (vp) {\n        return vp.extract(path.concat(['branch: ' + ch]), strength, input);\n      });\n    };\n    var choose = function (key, branches) {\n      var extract = function (path, strength, input) {\n        var choice = get(input, key);\n        return choice.fold(function () {\n          return missingKey(path, key);\n        }, function (chosen) {\n          return chooseFrom(path, strength, input, branches, chosen);\n        });\n      };\n      var toString = function () {\n        return 'chooseOn(' + key + '). Possible values: ' + keys(branches);\n      };\n      return {\n        extract: extract,\n        toString: toString\n      };\n    };\n\n    var _anyValue = value$1(SimpleResult.svalue);\n    var arrOfObj$1 = function (objFields) {\n      return arrOfObj(objFields);\n    };\n    var arrOfVal = function () {\n      return arrOf(_anyValue);\n    };\n    var valueThunkOf = valueThunk;\n    var valueOf = function (validator) {\n      return value$1(function (v) {\n        return validator(v).fold(SimpleResult.serror, SimpleResult.svalue);\n      });\n    };\n    var setOf$1 = function (validator, prop) {\n      return setOf(function (v) {\n        return SimpleResult.fromResult(validator(v));\n      }, prop);\n    };\n    var extract = function (label, prop, strength, obj) {\n      var res = prop.extract([label], strength, obj);\n      return SimpleResult.mapError(res, function (errs) {\n        return {\n          input: obj,\n          errors: errs\n        };\n      });\n    };\n    var asRaw = function (label, prop, obj) {\n      return SimpleResult.toResult(extract(label, prop, identity, obj));\n    };\n    var getOrDie = function (extraction) {\n      return extraction.fold(function (errInfo) {\n        throw new Error(formatError(errInfo));\n      }, identity);\n    };\n    var asRawOrDie = function (label, prop, obj) {\n      return getOrDie(asRaw(label, prop, obj));\n    };\n    var formatError = function (errInfo) {\n      return 'Errors: \\n' + formatErrors(errInfo.errors).join('\\n') + '\\n\\nInput object: ' + formatObj(errInfo.input);\n    };\n    var chooseProcessor = function (key, branches) {\n      return choose(key, branches);\n    };\n    var choose$1 = function (key, branches) {\n      return choose(key, map$1(branches, objOf));\n    };\n    var anyValue$1 = constant(_anyValue);\n    var typedValue = function (validator, expectedType) {\n      return value$1(function (a) {\n        var actualType = typeof a;\n        return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected type: ' + expectedType + ' but got: ' + actualType);\n      });\n    };\n    var number = typedValue(isNumber, 'number');\n    var string = typedValue(isString, 'string');\n    var boolean = typedValue(isBoolean, 'boolean');\n    var functionProcessor = typedValue(isFunction, 'function');\n    var isPostMessageable = function (val) {\n      var every = function (iter, callbackFn) {\n        var result = iter.next();\n        while (!result.done) {\n          if (!callbackFn(result.value)) {\n            return false;\n          }\n          result = iter.next();\n        }\n        return true;\n      };\n      if (Object(val) !== val) {\n        return true;\n      }\n      switch ({}.toString.call(val).slice(8, -1)) {\n      case 'Boolean':\n      case 'Number':\n      case 'String':\n      case 'Date':\n      case 'RegExp':\n      case 'Blob':\n      case 'FileList':\n      case 'ImageData':\n      case 'ImageBitmap':\n      case 'ArrayBuffer':\n        return true;\n      case 'Array':\n      case 'Object':\n        return Object.keys(val).every(function (prop) {\n          return isPostMessageable(val[prop]);\n        });\n      case 'Map':\n        return every(val.keys(), isPostMessageable) && every(val.values(), isPostMessageable);\n      case 'Set':\n        return every(val.keys(), isPostMessageable);\n      default:\n        return false;\n      }\n    };\n    var postMessageable = value$1(function (a) {\n      return isPostMessageable(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected value to be acceptable for sending via postMessage');\n    });\n\n    var validateEnum = function (values) {\n      return valueOf(function (value) {\n        return contains(values, value) ? Result.value(value) : Result.error('Unsupported value: \"' + value + '\", choose one of \"' + values.join(', ') + '\".');\n      });\n    };\n    var strict$1 = function (key) {\n      return field(key, key, strict(), anyValue());\n    };\n    var strictOf = function (key, schema) {\n      return field(key, key, strict(), schema);\n    };\n    var strictNumber = function (key) {\n      return strictOf(key, number);\n    };\n    var strictString = function (key) {\n      return strictOf(key, string);\n    };\n    var strictStringEnum = function (key, values) {\n      return field(key, key, strict(), validateEnum(values));\n    };\n    var strictBoolean = function (key) {\n      return strictOf(key, boolean);\n    };\n    var strictFunction = function (key) {\n      return strictOf(key, functionProcessor);\n    };\n    var forbid = function (key, message) {\n      return field(key, key, asOption(), value$1(function (v) {\n        return SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message);\n      }));\n    };\n    var strictObjOf = function (key, objSchema) {\n      return field(key, key, strict(), objOf(objSchema));\n    };\n    var strictArrayOfObj = function (key, objFields) {\n      return field(key, key, strict(), arrOfObj(objFields));\n    };\n    var strictArrayOf = function (key, schema) {\n      return field(key, key, strict(), arrOf(schema));\n    };\n    var option = function (key) {\n      return field(key, key, asOption(), anyValue());\n    };\n    var optionOf = function (key, schema) {\n      return field(key, key, asOption(), schema);\n    };\n    var optionNumber = function (key) {\n      return optionOf(key, number);\n    };\n    var optionString = function (key) {\n      return optionOf(key, string);\n    };\n    var optionFunction = function (key) {\n      return optionOf(key, functionProcessor);\n    };\n    var optionArrayOf = function (key, schema) {\n      return optionOf(key, arrOf(schema));\n    };\n    var optionObjOf = function (key, objSchema) {\n      return optionOf(key, objOf(objSchema));\n    };\n    var optionObjOfOnly = function (key, objSchema) {\n      return optionOf(key, objOfOnly(objSchema));\n    };\n    var defaulted$1 = function (key, fallback) {\n      return field(key, key, defaulted(fallback), anyValue());\n    };\n    var defaultedOf = function (key, fallback, schema) {\n      return field(key, key, defaulted(fallback), schema);\n    };\n    var defaultedNumber = function (key, fallback) {\n      return defaultedOf(key, fallback, number);\n    };\n    var defaultedString = function (key, fallback) {\n      return defaultedOf(key, fallback, string);\n    };\n    var defaultedStringEnum = function (key, fallback, values) {\n      return defaultedOf(key, fallback, validateEnum(values));\n    };\n    var defaultedBoolean = function (key, fallback) {\n      return defaultedOf(key, fallback, boolean);\n    };\n    var defaultedFunction = function (key, fallback) {\n      return defaultedOf(key, fallback, functionProcessor);\n    };\n    var defaultedPostMsg = function (key, fallback) {\n      return defaultedOf(key, fallback, postMessageable);\n    };\n    var defaultedArrayOf = function (key, fallback, schema) {\n      return defaultedOf(key, fallback, arrOf(schema));\n    };\n    var defaultedObjOf = function (key, fallback, objSchema) {\n      return defaultedOf(key, fallback, objOf(objSchema));\n    };\n    var state$1 = function (okey, instantiator) {\n      return state(okey, instantiator);\n    };\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var fromHtml = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        domGlobals.console.error('HTML does not have a single root node', html);\n        throw new Error('HTML must have a single root node');\n      }\n      return fromDom(div.childNodes[0]);\n    };\n    var fromTag = function (tag, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createElement(tag);\n      return fromDom(node);\n    };\n    var fromText = function (text, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createTextNode(text);\n      return fromDom(node);\n    };\n    var fromDom = function (node) {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: constant(node) };\n    };\n    var fromPoint = function (docElm, x, y) {\n      var doc = docElm.dom();\n      return Option.from(doc.elementFromPoint(x, y)).map(fromDom);\n    };\n    var Element = {\n      fromHtml: fromHtml,\n      fromTag: fromTag,\n      fromText: fromText,\n      fromDom: fromDom,\n      fromPoint: fromPoint\n    };\n\n    var compareDocumentPosition = function (a, b, match) {\n      return (a.compareDocumentPosition(b) & match) !== 0;\n    };\n    var documentPositionPreceding = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING);\n    };\n    var documentPositionContainedBy = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY);\n    };\n    var Node = {\n      documentPositionPreceding: documentPositionPreceding,\n      documentPositionContainedBy: documentPositionContainedBy\n    };\n\n    var firstMatch = function (regexes, s) {\n      for (var i = 0; i < regexes.length; i++) {\n        var x = regexes[i];\n        if (x.test(s)) {\n          return x;\n        }\n      }\n      return undefined;\n    };\n    var find$2 = function (regexes, agent) {\n      var r = firstMatch(regexes, agent);\n      if (!r) {\n        return {\n          major: 0,\n          minor: 0\n        };\n      }\n      var group = function (i) {\n        return Number(agent.replace(r, '$' + i));\n      };\n      return nu$1(group(1), group(2));\n    };\n    var detect = function (versionRegexes, agent) {\n      var cleanedAgent = String(agent).toLowerCase();\n      if (versionRegexes.length === 0) {\n        return unknown();\n      }\n      return find$2(versionRegexes, cleanedAgent);\n    };\n    var unknown = function () {\n      return nu$1(0, 0);\n    };\n    var nu$1 = function (major, minor) {\n      return {\n        major: major,\n        minor: minor\n      };\n    };\n    var Version = {\n      nu: nu$1,\n      detect: detect,\n      unknown: unknown\n    };\n\n    var edge = 'Edge';\n    var chrome = 'Chrome';\n    var ie = 'IE';\n    var opera = 'Opera';\n    var firefox = 'Firefox';\n    var safari = 'Safari';\n    var isBrowser = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$1 = function () {\n      return nu$2({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$2 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isEdge: isBrowser(edge, current),\n        isChrome: isBrowser(chrome, current),\n        isIE: isBrowser(ie, current),\n        isOpera: isBrowser(opera, current),\n        isFirefox: isBrowser(firefox, current),\n        isSafari: isBrowser(safari, current)\n      };\n    };\n    var Browser = {\n      unknown: unknown$1,\n      nu: nu$2,\n      edge: constant(edge),\n      chrome: constant(chrome),\n      ie: constant(ie),\n      opera: constant(opera),\n      firefox: constant(firefox),\n      safari: constant(safari)\n    };\n\n    var windows = 'Windows';\n    var ios = 'iOS';\n    var android = 'Android';\n    var linux = 'Linux';\n    var osx = 'OSX';\n    var solaris = 'Solaris';\n    var freebsd = 'FreeBSD';\n    var chromeos = 'ChromeOS';\n    var isOS = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$2 = function () {\n      return nu$3({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$3 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isWindows: isOS(windows, current),\n        isiOS: isOS(ios, current),\n        isAndroid: isOS(android, current),\n        isOSX: isOS(osx, current),\n        isLinux: isOS(linux, current),\n        isSolaris: isOS(solaris, current),\n        isFreeBSD: isOS(freebsd, current),\n        isChromeOS: isOS(chromeos, current)\n      };\n    };\n    var OperatingSystem = {\n      unknown: unknown$2,\n      nu: nu$3,\n      windows: constant(windows),\n      ios: constant(ios),\n      android: constant(android),\n      linux: constant(linux),\n      osx: constant(osx),\n      solaris: constant(solaris),\n      freebsd: constant(freebsd),\n      chromeos: constant(chromeos)\n    };\n\n    var DeviceType = function (os, browser, userAgent, mediaMatch) {\n      var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;\n      var isiPhone = os.isiOS() && !isiPad;\n      var isMobile = os.isiOS() || os.isAndroid();\n      var isTouch = isMobile || mediaMatch('(pointer:coarse)');\n      var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');\n      var isPhone = isiPhone || isMobile && !isTablet;\n      var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;\n      var isDesktop = !isPhone && !isTablet && !iOSwebview;\n      return {\n        isiPad: constant(isiPad),\n        isiPhone: constant(isiPhone),\n        isTablet: constant(isTablet),\n        isPhone: constant(isPhone),\n        isTouch: constant(isTouch),\n        isAndroid: os.isAndroid,\n        isiOS: os.isiOS,\n        isWebView: constant(iOSwebview),\n        isDesktop: constant(isDesktop)\n      };\n    };\n\n    var detect$1 = function (candidates, userAgent) {\n      var agent = String(userAgent).toLowerCase();\n      return find(candidates, function (candidate) {\n        return candidate.search(agent);\n      });\n    };\n    var detectBrowser = function (browsers, userAgent) {\n      return detect$1(browsers, userAgent).map(function (browser) {\n        var version = Version.detect(browser.versionRegexes, userAgent);\n        return {\n          current: browser.name,\n          version: version\n        };\n      });\n    };\n    var detectOs = function (oses, userAgent) {\n      return detect$1(oses, userAgent).map(function (os) {\n        var version = Version.detect(os.versionRegexes, userAgent);\n        return {\n          current: os.name,\n          version: version\n        };\n      });\n    };\n    var UaString = {\n      detectBrowser: detectBrowser,\n      detectOs: detectOs\n    };\n\n    var checkRange = function (str, substr, start) {\n      if (substr === '') {\n        return true;\n      }\n      if (str.length < substr.length) {\n        return false;\n      }\n      var x = str.substr(start, start + substr.length);\n      return x === substr;\n    };\n    var contains$1 = function (str, substr) {\n      return str.indexOf(substr) !== -1;\n    };\n    var endsWith = function (str, suffix) {\n      return checkRange(str, suffix, str.length - suffix.length);\n    };\n    var trim = function (str) {\n      return str.replace(/^\\s+|\\s+$/g, '');\n    };\n\n    var normalVersionRegex = /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/;\n    var checkContains = function (target) {\n      return function (uastring) {\n        return contains$1(uastring, target);\n      };\n    };\n    var browsers = [\n      {\n        name: 'Edge',\n        versionRegexes: [/.*?edge\\/ ?([0-9]+)\\.([0-9]+)$/],\n        search: function (uastring) {\n          return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit');\n        }\n      },\n      {\n        name: 'Chrome',\n        versionRegexes: [\n          /.*?chrome\\/([0-9]+)\\.([0-9]+).*/,\n          normalVersionRegex\n        ],\n        search: function (uastring) {\n          return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe');\n        }\n      },\n      {\n        name: 'IE',\n        versionRegexes: [\n          /.*?msie\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*?rv:([0-9]+)\\.([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return contains$1(uastring, 'msie') || contains$1(uastring, 'trident');\n        }\n      },\n      {\n        name: 'Opera',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?opera\\/([0-9]+)\\.([0-9]+).*/\n        ],\n        search: checkContains('opera')\n      },\n      {\n        name: 'Firefox',\n        versionRegexes: [/.*?firefox\\/\\ ?([0-9]+)\\.([0-9]+).*/],\n        search: checkContains('firefox')\n      },\n      {\n        name: 'Safari',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?cpu os ([0-9]+)_([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit');\n        }\n      }\n    ];\n    var oses = [\n      {\n        name: 'Windows',\n        search: checkContains('win'),\n        versionRegexes: [/.*?windows\\ nt\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'iOS',\n        search: function (uastring) {\n          return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad');\n        },\n        versionRegexes: [\n          /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*cpu os ([0-9]+)_([0-9]+).*/,\n          /.*cpu iphone os ([0-9]+)_([0-9]+).*/\n        ]\n      },\n      {\n        name: 'Android',\n        search: checkContains('android'),\n        versionRegexes: [/.*?android\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'OSX',\n        search: checkContains('mac os x'),\n        versionRegexes: [/.*?mac\\ os\\ x\\ ?([0-9]+)_([0-9]+).*/]\n      },\n      {\n        name: 'Linux',\n        search: checkContains('linux'),\n        versionRegexes: []\n      },\n      {\n        name: 'Solaris',\n        search: checkContains('sunos'),\n        versionRegexes: []\n      },\n      {\n        name: 'FreeBSD',\n        search: checkContains('freebsd'),\n        versionRegexes: []\n      },\n      {\n        name: 'ChromeOS',\n        search: checkContains('cros'),\n        versionRegexes: [/.*?chrome\\/([0-9]+)\\.([0-9]+).*/]\n      }\n    ];\n    var PlatformInfo = {\n      browsers: constant(browsers),\n      oses: constant(oses)\n    };\n\n    var detect$2 = function (userAgent, mediaMatch) {\n      var browsers = PlatformInfo.browsers();\n      var oses = PlatformInfo.oses();\n      var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);\n      var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);\n      var deviceType = DeviceType(os, browser, userAgent, mediaMatch);\n      return {\n        browser: browser,\n        os: os,\n        deviceType: deviceType\n      };\n    };\n    var PlatformDetection = { detect: detect$2 };\n\n    var mediaMatch = function (query) {\n      return domGlobals.window.matchMedia(query).matches;\n    };\n    var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch));\n    var detect$3 = function () {\n      return platform.get();\n    };\n\n    var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;\n    var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;\n    var COMMENT = domGlobals.Node.COMMENT_NODE;\n    var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;\n    var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;\n    var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;\n    var ELEMENT = domGlobals.Node.ELEMENT_NODE;\n    var TEXT = domGlobals.Node.TEXT_NODE;\n    var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;\n    var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;\n    var ENTITY = domGlobals.Node.ENTITY_NODE;\n    var NOTATION = domGlobals.Node.NOTATION_NODE;\n\n    var ELEMENT$1 = ELEMENT;\n    var DOCUMENT$1 = DOCUMENT;\n    var is = function (element, selector) {\n      var dom = element.dom();\n      if (dom.nodeType !== ELEMENT$1) {\n        return false;\n      } else {\n        var elem = dom;\n        if (elem.matches !== undefined) {\n          return elem.matches(selector);\n        } else if (elem.msMatchesSelector !== undefined) {\n          return elem.msMatchesSelector(selector);\n        } else if (elem.webkitMatchesSelector !== undefined) {\n          return elem.webkitMatchesSelector(selector);\n        } else if (elem.mozMatchesSelector !== undefined) {\n          return elem.mozMatchesSelector(selector);\n        } else {\n          throw new Error('Browser lacks native selectors');\n        }\n      }\n    };\n    var bypassSelector = function (dom) {\n      return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0;\n    };\n    var all = function (selector, scope) {\n      var base = scope === undefined ? domGlobals.document : scope.dom();\n      return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom);\n    };\n    var one = function (selector, scope) {\n      var base = scope === undefined ? domGlobals.document : scope.dom();\n      return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom);\n    };\n\n    var eq = function (e1, e2) {\n      return e1.dom() === e2.dom();\n    };\n    var regularContains = function (e1, e2) {\n      var d1 = e1.dom();\n      var d2 = e2.dom();\n      return d1 === d2 ? false : d1.contains(d2);\n    };\n    var ieContains = function (e1, e2) {\n      return Node.documentPositionContainedBy(e1.dom(), e2.dom());\n    };\n    var browser = detect$3().browser;\n    var contains$2 = browser.isIE() ? ieContains : regularContains;\n\n    var ancestor = function (scope, transform, isRoot) {\n      var element = scope.dom();\n      var stop = isFunction(isRoot) ? isRoot : constant(false);\n      while (element.parentNode) {\n        element = element.parentNode;\n        var el = Element.fromDom(element);\n        var transformed = transform(el);\n        if (transformed.isSome()) {\n          return transformed;\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Option.none();\n    };\n    var closest = function (scope, transform, isRoot) {\n      var current = transform(scope);\n      return current.orThunk(function () {\n        return isRoot(scope) ? Option.none() : ancestor(scope, transform, isRoot);\n      });\n    };\n\n    var isSource = function (component, simulatedEvent) {\n      return eq(component.element(), simulatedEvent.event().target());\n    };\n\n    var nu$4 = function (parts) {\n      if (!hasNonNullableKey(parts, 'can') && !hasNonNullableKey(parts, 'abort') && !hasNonNullableKey(parts, 'run')) {\n        throw new Error('EventHandler defined by: ' + JSON.stringify(parts, null, 2) + ' does not have can, abort, or run!');\n      }\n      return asRawOrDie('Extracting event.handler', objOfOnly([\n        defaulted$1('can', constant(true)),\n        defaulted$1('abort', constant(false)),\n        defaulted$1('run', noop)\n      ]), parts);\n    };\n    var all$1 = function (handlers, f) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return foldl(handlers, function (acc, handler) {\n          return acc && f(handler).apply(undefined, args);\n        }, true);\n      };\n    };\n    var any = function (handlers, f) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return foldl(handlers, function (acc, handler) {\n          return acc || f(handler).apply(undefined, args);\n        }, false);\n      };\n    };\n    var read = function (handler) {\n      return isFunction(handler) ? {\n        can: constant(true),\n        abort: constant(false),\n        run: handler\n      } : handler;\n    };\n    var fuse = function (handlers) {\n      var can = all$1(handlers, function (handler) {\n        return handler.can;\n      });\n      var abort = any(handlers, function (handler) {\n        return handler.abort;\n      });\n      var run = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        each(handlers, function (handler) {\n          handler.run.apply(undefined, args);\n        });\n      };\n      return nu$4({\n        can: can,\n        abort: abort,\n        run: run\n      });\n    };\n\n    var touchstart = constant('touchstart');\n    var touchmove = constant('touchmove');\n    var touchend = constant('touchend');\n    var touchcancel = constant('touchcancel');\n    var mousedown = constant('mousedown');\n    var mousemove = constant('mousemove');\n    var mouseout = constant('mouseout');\n    var mouseup = constant('mouseup');\n    var mouseover = constant('mouseover');\n    var focusin = constant('focusin');\n    var focusout = constant('focusout');\n    var keydown = constant('keydown');\n    var keyup = constant('keyup');\n    var input = constant('input');\n    var change = constant('change');\n    var click = constant('click');\n    var transitionend = constant('transitionend');\n    var selectstart = constant('selectstart');\n\n    var alloy = { tap: constant('alloy.tap') };\n    var focus = constant('alloy.focus');\n    var postBlur = constant('alloy.blur.post');\n    var postPaste = constant('alloy.paste.post');\n    var receive = constant('alloy.receive');\n    var execute = constant('alloy.execute');\n    var focusItem = constant('alloy.focus.item');\n    var tap = alloy.tap;\n    var longpress = constant('alloy.longpress');\n    var sandboxClose = constant('alloy.sandbox.close');\n    var typeaheadCancel = constant('alloy.typeahead.cancel');\n    var systemInit = constant('alloy.system.init');\n    var documentTouchmove = constant('alloy.system.touchmove');\n    var documentTouchend = constant('alloy.system.touchend');\n    var windowScroll = constant('alloy.system.scroll');\n    var windowResize = constant('alloy.system.resize');\n    var attachedToDom = constant('alloy.system.attached');\n    var detachedFromDom = constant('alloy.system.detached');\n    var dismissRequested = constant('alloy.system.dismissRequested');\n    var repositionRequested = constant('alloy.system.repositionRequested');\n    var focusShifted = constant('alloy.focusmanager.shifted');\n    var slotVisibility = constant('alloy.slotcontainer.visibility');\n    var changeTab = constant('alloy.change.tab');\n    var dismissTab = constant('alloy.dismiss.tab');\n    var highlight = constant('alloy.highlight');\n    var dehighlight = constant('alloy.dehighlight');\n\n    var emit = function (component, event) {\n      dispatchWith(component, component.element(), event, {});\n    };\n    var emitWith = function (component, event, properties) {\n      dispatchWith(component, component.element(), event, properties);\n    };\n    var emitExecute = function (component) {\n      emit(component, execute());\n    };\n    var dispatch = function (component, target, event) {\n      dispatchWith(component, target, event, {});\n    };\n    var dispatchWith = function (component, target, event, properties) {\n      var data = __assign({ target: target }, properties);\n      component.getSystem().triggerEvent(event, target, map$1(data, constant));\n    };\n    var dispatchEvent = function (component, target, event, simulatedEvent) {\n      component.getSystem().triggerEvent(event, target, simulatedEvent.event());\n    };\n\n    var derive = function (configs) {\n      return wrapAll$1(configs);\n    };\n    var abort = function (name, predicate) {\n      return {\n        key: name,\n        value: nu$4({ abort: predicate })\n      };\n    };\n    var can = function (name, predicate) {\n      return {\n        key: name,\n        value: nu$4({ can: predicate })\n      };\n    };\n    var preventDefault = function (name) {\n      return {\n        key: name,\n        value: nu$4({\n          run: function (component, simulatedEvent) {\n            simulatedEvent.event().prevent();\n          }\n        })\n      };\n    };\n    var run = function (name, handler) {\n      return {\n        key: name,\n        value: nu$4({ run: handler })\n      };\n    };\n    var runActionExtra = function (name, action, extra) {\n      return {\n        key: name,\n        value: nu$4({\n          run: function (component, simulatedEvent) {\n            action.apply(undefined, [\n              component,\n              simulatedEvent\n            ].concat(extra));\n          }\n        })\n      };\n    };\n    var runOnName = function (name) {\n      return function (handler) {\n        return run(name, handler);\n      };\n    };\n    var runOnSourceName = function (name) {\n      return function (handler) {\n        return {\n          key: name,\n          value: nu$4({\n            run: function (component, simulatedEvent) {\n              if (isSource(component, simulatedEvent)) {\n                handler(component, simulatedEvent);\n              }\n            }\n          })\n        };\n      };\n    };\n    var redirectToUid = function (name, uid) {\n      return run(name, function (component, simulatedEvent) {\n        component.getSystem().getByUid(uid).each(function (redirectee) {\n          dispatchEvent(redirectee, redirectee.element(), name, simulatedEvent);\n        });\n      });\n    };\n    var redirectToPart = function (name, detail, partName) {\n      var uid = detail.partUids[partName];\n      return redirectToUid(name, uid);\n    };\n    var runWithTarget = function (name, f) {\n      return run(name, function (component, simulatedEvent) {\n        var ev = simulatedEvent.event();\n        var target = component.getSystem().getByDom(ev.target()).fold(function () {\n          var closest$1 = closest(ev.target(), function (el) {\n            return component.getSystem().getByDom(el).toOption();\n          }, constant(false));\n          return closest$1.getOr(component);\n        }, function (c) {\n          return c;\n        });\n        f(component, target, simulatedEvent);\n      });\n    };\n    var cutter = function (name) {\n      return run(name, function (component, simulatedEvent) {\n        simulatedEvent.cut();\n      });\n    };\n    var stopper = function (name) {\n      return run(name, function (component, simulatedEvent) {\n        simulatedEvent.stop();\n      });\n    };\n    var runOnSource = function (name, f) {\n      return runOnSourceName(name)(f);\n    };\n    var runOnAttached = runOnSourceName(attachedToDom());\n    var runOnDetached = runOnSourceName(detachedFromDom());\n    var runOnInit = runOnSourceName(systemInit());\n    var runOnExecute = runOnName(execute());\n\n    var Immutable = function () {\n      var fields = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        fields[_i] = arguments[_i];\n      }\n      return function () {\n        var values = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          values[_i] = arguments[_i];\n        }\n        if (fields.length !== values.length) {\n          throw new Error('Wrong number of arguments to struct. Expected \"[' + fields.length + ']\", got ' + values.length + ' arguments');\n        }\n        var struct = {};\n        each(fields, function (name, i) {\n          struct[name] = constant(values[i]);\n        });\n        return struct;\n      };\n    };\n\n    var sort$1 = function (arr) {\n      return arr.slice(0).sort();\n    };\n    var reqMessage = function (required, keys) {\n      throw new Error('All required keys (' + sort$1(required).join(', ') + ') were not specified. Specified keys were: ' + sort$1(keys).join(', ') + '.');\n    };\n    var unsuppMessage = function (unsupported) {\n      throw new Error('Unsupported keys for object: ' + sort$1(unsupported).join(', '));\n    };\n    var validateStrArr = function (label, array) {\n      if (!isArray(array)) {\n        throw new Error('The ' + label + ' fields must be an array. Was: ' + array + '.');\n      }\n      each(array, function (a) {\n        if (!isString(a)) {\n          throw new Error('The value ' + a + ' in the ' + label + ' fields was not a string.');\n        }\n      });\n    };\n    var checkDupes = function (everything) {\n      var sorted = sort$1(everything);\n      var dupe = find(sorted, function (s, i) {\n        return i < sorted.length - 1 && s === sorted[i + 1];\n      });\n      dupe.each(function (d) {\n        throw new Error('The field: ' + d + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].');\n      });\n    };\n\n    var MixedBag = function (required, optional) {\n      var everything = required.concat(optional);\n      if (everything.length === 0) {\n        throw new Error('You must specify at least one required or optional field.');\n      }\n      validateStrArr('required', required);\n      validateStrArr('optional', optional);\n      checkDupes(everything);\n      return function (obj) {\n        var keys$1 = keys(obj);\n        var allReqd = forall(required, function (req) {\n          return contains(keys$1, req);\n        });\n        if (!allReqd) {\n          reqMessage(required, keys$1);\n        }\n        var unsupported = filter(keys$1, function (key) {\n          return !contains(everything, key);\n        });\n        if (unsupported.length > 0) {\n          unsuppMessage(unsupported);\n        }\n        var r = {};\n        each(required, function (req) {\n          r[req] = constant(obj[req]);\n        });\n        each(optional, function (opt) {\n          r[opt] = constant(Object.prototype.hasOwnProperty.call(obj, opt) ? Option.some(obj[opt]) : Option.none());\n        });\n        return r;\n      };\n    };\n\n    var owner = function (element) {\n      return Element.fromDom(element.dom().ownerDocument);\n    };\n    var documentElement = function (element) {\n      return Element.fromDom(element.dom().ownerDocument.documentElement);\n    };\n    var defaultView = function (element) {\n      return Element.fromDom(element.dom().ownerDocument.defaultView);\n    };\n    var parent = function (element) {\n      return Option.from(element.dom().parentNode).map(Element.fromDom);\n    };\n    var offsetParent = function (element) {\n      return Option.from(element.dom().offsetParent).map(Element.fromDom);\n    };\n    var nextSibling = function (element) {\n      return Option.from(element.dom().nextSibling).map(Element.fromDom);\n    };\n    var children = function (element) {\n      return map(element.dom().childNodes, Element.fromDom);\n    };\n    var child = function (element, index) {\n      var cs = element.dom().childNodes;\n      return Option.from(cs[index]).map(Element.fromDom);\n    };\n    var firstChild = function (element) {\n      return child(element, 0);\n    };\n    var spot = Immutable('element', 'offset');\n\n    var fromHtml$1 = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      return children(Element.fromDom(div));\n    };\n\n    var before = function (marker, element) {\n      var parent$1 = parent(marker);\n      parent$1.each(function (v) {\n        v.dom().insertBefore(element.dom(), marker.dom());\n      });\n    };\n    var after = function (marker, element) {\n      var sibling = nextSibling(marker);\n      sibling.fold(function () {\n        var parent$1 = parent(marker);\n        parent$1.each(function (v) {\n          append(v, element);\n        });\n      }, function (v) {\n        before(v, element);\n      });\n    };\n    var prepend = function (parent, element) {\n      var firstChild$1 = firstChild(parent);\n      firstChild$1.fold(function () {\n        append(parent, element);\n      }, function (v) {\n        parent.dom().insertBefore(element.dom(), v.dom());\n      });\n    };\n    var append = function (parent, element) {\n      parent.dom().appendChild(element.dom());\n    };\n    var appendAt = function (parent, element, index) {\n      child(parent, index).fold(function () {\n        append(parent, element);\n      }, function (v) {\n        before(v, element);\n      });\n    };\n\n    var before$1 = function (marker, elements) {\n      each(elements, function (x) {\n        before(marker, x);\n      });\n    };\n    var append$1 = function (parent, elements) {\n      each(elements, function (x) {\n        append(parent, x);\n      });\n    };\n\n    var empty = function (element) {\n      element.dom().textContent = '';\n      each(children(element), function (rogue) {\n        remove(rogue);\n      });\n    };\n    var remove = function (element) {\n      var dom = element.dom();\n      if (dom.parentNode !== null) {\n        dom.parentNode.removeChild(dom);\n      }\n    };\n    var unwrap = function (wrapper) {\n      var children$1 = children(wrapper);\n      if (children$1.length > 0) {\n        before$1(wrapper, children$1);\n      }\n      remove(wrapper);\n    };\n\n    var get$1 = function (element) {\n      return element.dom().innerHTML;\n    };\n    var set = function (element, content) {\n      var owner$1 = owner(element);\n      var docDom = owner$1.dom();\n      var fragment = Element.fromDom(docDom.createDocumentFragment());\n      var contentElements = fromHtml$1(content, docDom);\n      append$1(fragment, contentElements);\n      empty(element);\n      append(element, fragment);\n    };\n    var getOuter = function (element) {\n      var container = Element.fromTag('div');\n      var clone = Element.fromDom(element.dom().cloneNode(true));\n      append(container, clone);\n      return get$1(container);\n    };\n\n    var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();\n\n    var name = function (element) {\n      var r = element.dom().nodeName;\n      return r.toLowerCase();\n    };\n    var type = function (element) {\n      return element.dom().nodeType;\n    };\n    var isType$1 = function (t) {\n      return function (element) {\n        return type(element) === t;\n      };\n    };\n    var isElement = isType$1(ELEMENT);\n    var isText = isType$1(TEXT);\n\n    var rawSet = function (dom, key, value) {\n      if (isString(value) || isBoolean(value) || isNumber(value)) {\n        dom.setAttribute(key, value + '');\n      } else {\n        domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n        throw new Error('Attribute value was not simple');\n      }\n    };\n    var set$1 = function (element, key, value) {\n      rawSet(element.dom(), key, value);\n    };\n    var setAll = function (element, attrs) {\n      var dom = element.dom();\n      each$1(attrs, function (v, k) {\n        rawSet(dom, k, v);\n      });\n    };\n    var get$2 = function (element, key) {\n      var v = element.dom().getAttribute(key);\n      return v === null ? undefined : v;\n    };\n    var getOpt = function (element, key) {\n      return Option.from(get$2(element, key));\n    };\n    var has$1 = function (element, key) {\n      var dom = element.dom();\n      return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;\n    };\n    var remove$1 = function (element, key) {\n      element.dom().removeAttribute(key);\n    };\n\n    var clone = function (original, isDeep) {\n      return Element.fromDom(original.dom().cloneNode(isDeep));\n    };\n    var shallow$1 = function (original) {\n      return clone(original, false);\n    };\n\n    var getHtml = function (element) {\n      var clone = shallow$1(element);\n      return getOuter(clone);\n    };\n\n    var element = function (elem) {\n      return getHtml(elem);\n    };\n\n    var isRecursive = function (component, originator, target) {\n      return eq(originator, component.element()) && !eq(originator, target);\n    };\n    var events = derive([can(focus(), function (component, simulatedEvent) {\n        var originator = simulatedEvent.event().originator();\n        var target = simulatedEvent.event().target();\n        if (isRecursive(component, originator, target)) {\n          domGlobals.console.warn(focus() + ' did not get interpreted by the desired target. ' + '\\nOriginator: ' + element(originator) + '\\nTarget: ' + element(target) + '\\nCheck the ' + focus() + ' event handlers');\n          return false;\n        } else {\n          return true;\n        }\n      })]);\n\n    var DefaultEvents = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events\n    });\n\n    var unique = 0;\n    var generate$1 = function (prefix) {\n      var date = new Date();\n      var time = date.getTime();\n      var random = Math.floor(Math.random() * 1000000000);\n      unique++;\n      return prefix + '_' + random + unique + String(time);\n    };\n\n    var prefix = constant('alloy-id-');\n    var idAttr = constant('data-alloy-id');\n\n    var prefix$1 = prefix();\n    var idAttr$1 = idAttr();\n    var write = function (label, elem) {\n      var id = generate$1(prefix$1 + label);\n      writeOnly(elem, id);\n      return id;\n    };\n    var writeOnly = function (elem, uid) {\n      Object.defineProperty(elem.dom(), idAttr$1, {\n        value: uid,\n        writable: true\n      });\n    };\n    var read$1 = function (elem) {\n      var id = isElement(elem) ? elem.dom()[idAttr$1] : null;\n      return Option.from(id);\n    };\n    var generate$2 = function (prefix) {\n      return generate$1(prefix);\n    };\n\n    var make = identity;\n\n    var NoContextApi = function (getComp) {\n      var fail = function (event) {\n        return function () {\n          throw new Error('The component must be in a context to send: ' + event + (getComp ? '\\n' + element(getComp().element()) + ' is not in context.' : ''));\n        };\n      };\n      return {\n        debugInfo: constant('fake'),\n        triggerEvent: fail('triggerEvent'),\n        triggerFocus: fail('triggerFocus'),\n        triggerEscape: fail('triggerEscape'),\n        build: fail('build'),\n        addToWorld: fail('addToWorld'),\n        removeFromWorld: fail('removeFromWorld'),\n        addToGui: fail('addToGui'),\n        removeFromGui: fail('removeFromGui'),\n        getByUid: fail('getByUid'),\n        getByDom: fail('getByDom'),\n        broadcast: fail('broadcast'),\n        broadcastOn: fail('broadcastOn'),\n        broadcastEvent: fail('broadcastEvent'),\n        isConnected: constant(false)\n      };\n    };\n    var singleton = NoContextApi();\n\n    var markAsBehaviourApi = function (f, apiName, apiFunction) {\n      var delegate = apiFunction.toString();\n      var endIndex = delegate.indexOf(')') + 1;\n      var openBracketIndex = delegate.indexOf('(');\n      var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\\s*/);\n      f.toFunctionAnnotation = function () {\n        return {\n          name: apiName,\n          parameters: cleanParameters(parameters.slice(0, 1).concat(parameters.slice(3)))\n        };\n      };\n      return f;\n    };\n    var cleanParameters = function (parameters) {\n      return map(parameters, function (p) {\n        return endsWith(p, '/*') ? p.substring(0, p.length - '/*'.length) : p;\n      });\n    };\n    var markAsExtraApi = function (f, extraName) {\n      var delegate = f.toString();\n      var endIndex = delegate.indexOf(')') + 1;\n      var openBracketIndex = delegate.indexOf('(');\n      var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\\s*/);\n      f.toFunctionAnnotation = function () {\n        return {\n          name: extraName,\n          parameters: cleanParameters(parameters)\n        };\n      };\n      return f;\n    };\n    var markAsSketchApi = function (f, apiFunction) {\n      var delegate = apiFunction.toString();\n      var endIndex = delegate.indexOf(')') + 1;\n      var openBracketIndex = delegate.indexOf('(');\n      var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\\s*/);\n      f.toFunctionAnnotation = function () {\n        return {\n          name: 'OVERRIDE',\n          parameters: cleanParameters(parameters.slice(1))\n        };\n      };\n      return f;\n    };\n\n    var premadeTag = generate$1('alloy-premade');\n    var premade = function (comp) {\n      return wrap$1(premadeTag, comp);\n    };\n    var getPremade = function (spec) {\n      return get(spec, premadeTag);\n    };\n    var makeApi = function (f) {\n      return markAsSketchApi(function (component) {\n        var rest = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n          rest[_i - 1] = arguments[_i];\n        }\n        return f.apply(undefined, [component.getApis()].concat([component].concat(rest)));\n      }, f);\n    };\n\n    var NoState = {\n      init: function () {\n        return nu$5({\n          readState: function () {\n            return 'No State required';\n          }\n        });\n      }\n    };\n    var nu$5 = function (spec) {\n      return spec;\n    };\n\n    var generateFrom = function (spec, all) {\n      var schema = map(all, function (a) {\n        return optionObjOf(a.name(), [\n          strict$1('config'),\n          defaulted$1('state', NoState)\n        ]);\n      });\n      var validated = asRaw('component.behaviours', objOf(schema), spec.behaviours).fold(function (errInfo) {\n        throw new Error(formatError(errInfo) + '\\nComplete spec:\\n' + JSON.stringify(spec, null, 2));\n      }, function (v) {\n        return v;\n      });\n      return {\n        list: all,\n        data: map$1(validated, function (optBlobThunk) {\n          var output = optBlobThunk.map(function (blob) {\n            return {\n              config: blob.config,\n              state: blob.state.init(blob.config)\n            };\n          });\n          return function () {\n            return output;\n          };\n        })\n      };\n    };\n    var getBehaviours = function (bData) {\n      return bData.list;\n    };\n    var getData = function (bData) {\n      return bData.data;\n    };\n\n    var byInnerKey = function (data, tuple) {\n      var r = {};\n      each$1(data, function (detail, key) {\n        each$1(detail, function (value, indexKey) {\n          var chain = get(r, indexKey).getOr([]);\n          r[indexKey] = chain.concat([tuple(key, value)]);\n        });\n      });\n      return r;\n    };\n\n    var nu$6 = function (s) {\n      return {\n        classes: s.classes !== undefined ? s.classes : [],\n        attributes: s.attributes !== undefined ? s.attributes : {},\n        styles: s.styles !== undefined ? s.styles : {}\n      };\n    };\n    var merge$1 = function (defnA, mod) {\n      return __assign(__assign({}, defnA), {\n        attributes: __assign(__assign({}, defnA.attributes), mod.attributes),\n        styles: __assign(__assign({}, defnA.styles), mod.styles),\n        classes: defnA.classes.concat(mod.classes)\n      });\n    };\n\n    var combine = function (info, baseMod, behaviours, base) {\n      var modsByBehaviour = __assign({}, baseMod);\n      each(behaviours, function (behaviour) {\n        modsByBehaviour[behaviour.name()] = behaviour.exhibit(info, base);\n      });\n      var byAspect = byInnerKey(modsByBehaviour, function (name, modification) {\n        return {\n          name: name,\n          modification: modification\n        };\n      });\n      var combineObjects = function (objects) {\n        return foldr(objects, function (b, a) {\n          return __assign(__assign({}, a.modification), b);\n        }, {});\n      };\n      var combinedClasses = foldr(byAspect.classes, function (b, a) {\n        return a.modification.concat(b);\n      }, []);\n      var combinedAttributes = combineObjects(byAspect.attributes);\n      var combinedStyles = combineObjects(byAspect.styles);\n      return nu$6({\n        classes: combinedClasses,\n        attributes: combinedAttributes,\n        styles: combinedStyles\n      });\n    };\n\n    var sortKeys = function (label, keyName, array, order) {\n      try {\n        var sorted = sort(array, function (a, b) {\n          var aKey = a[keyName]();\n          var bKey = b[keyName]();\n          var aIndex = order.indexOf(aKey);\n          var bIndex = order.indexOf(bKey);\n          if (aIndex === -1) {\n            throw new Error('The ordering for ' + label + ' does not have an entry for ' + aKey + '.\\nOrder specified: ' + JSON.stringify(order, null, 2));\n          }\n          if (bIndex === -1) {\n            throw new Error('The ordering for ' + label + ' does not have an entry for ' + bKey + '.\\nOrder specified: ' + JSON.stringify(order, null, 2));\n          }\n          if (aIndex < bIndex) {\n            return -1;\n          } else if (bIndex < aIndex) {\n            return 1;\n          } else {\n            return 0;\n          }\n        });\n        return Result.value(sorted);\n      } catch (err) {\n        return Result.error([err]);\n      }\n    };\n\n    var uncurried = function (handler, purpose) {\n      return {\n        handler: handler,\n        purpose: constant(purpose)\n      };\n    };\n    var curried = function (handler, purpose) {\n      return {\n        cHandler: handler,\n        purpose: constant(purpose)\n      };\n    };\n    var curryArgs = function (descHandler, extraArgs) {\n      return curried(curry.apply(undefined, [descHandler.handler].concat(extraArgs)), descHandler.purpose());\n    };\n    var getCurried = function (descHandler) {\n      return descHandler.cHandler;\n    };\n\n    var behaviourTuple = function (name, handler) {\n      return {\n        name: constant(name),\n        handler: constant(handler)\n      };\n    };\n    var nameToHandlers = function (behaviours, info) {\n      var r = {};\n      each(behaviours, function (behaviour) {\n        r[behaviour.name()] = behaviour.handlers(info);\n      });\n      return r;\n    };\n    var groupByEvents = function (info, behaviours, base) {\n      var behaviourEvents = __assign(__assign({}, base), nameToHandlers(behaviours, info));\n      return byInnerKey(behaviourEvents, behaviourTuple);\n    };\n    var combine$1 = function (info, eventOrder, behaviours, base) {\n      var byEventName = groupByEvents(info, behaviours, base);\n      return combineGroups(byEventName, eventOrder);\n    };\n    var assemble = function (rawHandler) {\n      var handler = read(rawHandler);\n      return function (component, simulatedEvent) {\n        var rest = [];\n        for (var _i = 2; _i < arguments.length; _i++) {\n          rest[_i - 2] = arguments[_i];\n        }\n        var args = [\n          component,\n          simulatedEvent\n        ].concat(rest);\n        if (handler.abort.apply(undefined, args)) {\n          simulatedEvent.stop();\n        } else if (handler.can.apply(undefined, args)) {\n          handler.run.apply(undefined, args);\n        }\n      };\n    };\n    var missingOrderError = function (eventName, tuples) {\n      return Result.error(['The event (' + eventName + ') has more than one behaviour that listens to it.\\nWhen this occurs, you must ' + 'specify an event ordering for the behaviours in your spec (e.g. [ \"listing\", \"toggling\" ]).\\nThe behaviours that ' + 'can trigger it are: ' + JSON.stringify(map(tuples, function (c) {\n          return c.name();\n        }), null, 2)]);\n    };\n    var fuse$1 = function (tuples, eventOrder, eventName) {\n      var order = eventOrder[eventName];\n      if (!order) {\n        return missingOrderError(eventName, tuples);\n      } else {\n        return sortKeys('Event: ' + eventName, 'name', tuples, order).map(function (sortedTuples) {\n          var handlers = map(sortedTuples, function (tuple) {\n            return tuple.handler();\n          });\n          return fuse(handlers);\n        });\n      }\n    };\n    var combineGroups = function (byEventName, eventOrder) {\n      var r = mapToArray(byEventName, function (tuples, eventName) {\n        var combined = tuples.length === 1 ? Result.value(tuples[0].handler()) : fuse$1(tuples, eventOrder, eventName);\n        return combined.map(function (handler) {\n          var assembled = assemble(handler);\n          var purpose = tuples.length > 1 ? filter(eventOrder[eventName], function (o) {\n            return exists(tuples, function (t) {\n              return t.name() === o;\n            });\n          }).join(' > ') : tuples[0].name();\n          return wrap$1(eventName, uncurried(assembled, purpose));\n        });\n      });\n      return consolidate(r, {});\n    };\n\n    var toInfo = function (spec) {\n      return asRaw('custom.definition', objOf([\n        field('dom', 'dom', strict(), objOf([\n          strict$1('tag'),\n          defaulted$1('styles', {}),\n          defaulted$1('classes', []),\n          defaulted$1('attributes', {}),\n          option('value'),\n          option('innerHtml')\n        ])),\n        strict$1('components'),\n        strict$1('uid'),\n        defaulted$1('events', {}),\n        defaulted$1('apis', {}),\n        field('eventOrder', 'eventOrder', mergeWith({\n          'alloy.execute': [\n            'disabling',\n            'alloy.base.behaviour',\n            'toggling',\n            'typeaheadevents'\n          ],\n          'alloy.focus': [\n            'alloy.base.behaviour',\n            'focusing',\n            'keying'\n          ],\n          'alloy.system.init': [\n            'alloy.base.behaviour',\n            'disabling',\n            'toggling',\n            'representing'\n          ],\n          'input': [\n            'alloy.base.behaviour',\n            'representing',\n            'streaming',\n            'invalidating'\n          ],\n          'alloy.system.detached': [\n            'alloy.base.behaviour',\n            'representing',\n            'item-events',\n            'tooltipping'\n          ],\n          'mousedown': [\n            'focusing',\n            'alloy.base.behaviour',\n            'item-type-events'\n          ],\n          'touchstart': [\n            'focusing',\n            'alloy.base.behaviour',\n            'item-type-events'\n          ],\n          'mouseover': [\n            'item-type-events',\n            'tooltipping'\n          ]\n        }), anyValue$1()),\n        option('domModification')\n      ]), spec);\n    };\n    var toDefinition = function (detail) {\n      return __assign(__assign({}, detail.dom), {\n        uid: detail.uid,\n        domChildren: map(detail.components, function (comp) {\n          return comp.element();\n        })\n      });\n    };\n    var toModification = function (detail) {\n      return detail.domModification.fold(function () {\n        return nu$6({});\n      }, nu$6);\n    };\n    var toEvents = function (info) {\n      return info.events;\n    };\n\n    var read$2 = function (element, attr) {\n      var value = get$2(element, attr);\n      return value === undefined || value === '' ? [] : value.split(' ');\n    };\n    var add = function (element, attr, id) {\n      var old = read$2(element, attr);\n      var nu = old.concat([id]);\n      set$1(element, attr, nu.join(' '));\n      return true;\n    };\n    var remove$2 = function (element, attr, id) {\n      var nu = filter(read$2(element, attr), function (v) {\n        return v !== id;\n      });\n      if (nu.length > 0) {\n        set$1(element, attr, nu.join(' '));\n      } else {\n        remove$1(element, attr);\n      }\n      return false;\n    };\n\n    var supports = function (element) {\n      return element.dom().classList !== undefined;\n    };\n    var get$3 = function (element) {\n      return read$2(element, 'class');\n    };\n    var add$1 = function (element, clazz) {\n      return add(element, 'class', clazz);\n    };\n    var remove$3 = function (element, clazz) {\n      return remove$2(element, 'class', clazz);\n    };\n\n    var add$2 = function (element, clazz) {\n      if (supports(element)) {\n        element.dom().classList.add(clazz);\n      } else {\n        add$1(element, clazz);\n      }\n    };\n    var cleanClass = function (element) {\n      var classList = supports(element) ? element.dom().classList : get$3(element);\n      if (classList.length === 0) {\n        remove$1(element, 'class');\n      }\n    };\n    var remove$4 = function (element, clazz) {\n      if (supports(element)) {\n        var classList = element.dom().classList;\n        classList.remove(clazz);\n      } else {\n        remove$3(element, clazz);\n      }\n      cleanClass(element);\n    };\n    var has$2 = function (element, clazz) {\n      return supports(element) && element.dom().classList.contains(clazz);\n    };\n\n    var add$3 = function (element, classes) {\n      each(classes, function (x) {\n        add$2(element, x);\n      });\n    };\n    var remove$5 = function (element, classes) {\n      each(classes, function (x) {\n        remove$4(element, x);\n      });\n    };\n\n    var isSupported = function (dom) {\n      return dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n    };\n\n    var inBody = function (element) {\n      var dom = isText(element) ? element.dom().parentNode : element.dom();\n      return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom);\n    };\n    var body = cached(function () {\n      return getBody(Element.fromDom(domGlobals.document));\n    });\n    var getBody = function (doc) {\n      var b = doc.dom().body;\n      if (b === null || b === undefined) {\n        throw new Error('Body is not available yet');\n      }\n      return Element.fromDom(b);\n    };\n\n    var internalSet = function (dom, property, value) {\n      if (!isString(value)) {\n        domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);\n        throw new Error('CSS value must be a string: ' + value);\n      }\n      if (isSupported(dom)) {\n        dom.style.setProperty(property, value);\n      }\n    };\n    var internalRemove = function (dom, property) {\n      if (isSupported(dom)) {\n        dom.style.removeProperty(property);\n      }\n    };\n    var set$2 = function (element, property, value) {\n      var dom = element.dom();\n      internalSet(dom, property, value);\n    };\n    var setAll$1 = function (element, css) {\n      var dom = element.dom();\n      each$1(css, function (v, k) {\n        internalSet(dom, k, v);\n      });\n    };\n    var setOptions = function (element, css) {\n      var dom = element.dom();\n      each$1(css, function (v, k) {\n        v.fold(function () {\n          internalRemove(dom, k);\n        }, function (value) {\n          internalSet(dom, k, value);\n        });\n      });\n    };\n    var get$4 = function (element, property) {\n      var dom = element.dom();\n      var styles = domGlobals.window.getComputedStyle(dom);\n      var r = styles.getPropertyValue(property);\n      var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n      return v === null ? undefined : v;\n    };\n    var getUnsafeProperty = function (dom, property) {\n      return isSupported(dom) ? dom.style.getPropertyValue(property) : '';\n    };\n    var getRaw = function (element, property) {\n      var dom = element.dom();\n      var raw = getUnsafeProperty(dom, property);\n      return Option.from(raw).filter(function (r) {\n        return r.length > 0;\n      });\n    };\n    var getAllRaw = function (element) {\n      var css = {};\n      var dom = element.dom();\n      if (isSupported(dom)) {\n        for (var i = 0; i < dom.style.length; i++) {\n          var ruleName = dom.style.item(i);\n          css[ruleName] = dom.style[ruleName];\n        }\n      }\n      return css;\n    };\n    var isValidValue = function (tag, property, value) {\n      var element = Element.fromTag(tag);\n      set$2(element, property, value);\n      var style = getRaw(element, property);\n      return style.isSome();\n    };\n    var remove$6 = function (element, property) {\n      var dom = element.dom();\n      internalRemove(dom, property);\n      if (has$1(element, 'style') && trim(get$2(element, 'style')) === '') {\n        remove$1(element, 'style');\n      }\n    };\n    var reflow = function (e) {\n      return e.dom().offsetWidth;\n    };\n\n    var get$5 = function (element) {\n      return element.dom().value;\n    };\n    var set$3 = function (element, value) {\n      if (value === undefined) {\n        throw new Error('Value.set was undefined');\n      }\n      element.dom().value = value;\n    };\n\n    var renderToDom = function (definition) {\n      var subject = Element.fromTag(definition.tag);\n      setAll(subject, definition.attributes);\n      add$3(subject, definition.classes);\n      setAll$1(subject, definition.styles);\n      definition.innerHtml.each(function (html) {\n        return set(subject, html);\n      });\n      var children = definition.domChildren;\n      append$1(subject, children);\n      definition.value.each(function (value) {\n        set$3(subject, value);\n      });\n      if (!definition.uid) {\n        debugger;\n      }\n      writeOnly(subject, definition.uid);\n      return subject;\n    };\n\n    var getBehaviours$1 = function (spec) {\n      var behaviours = get(spec, 'behaviours').getOr({});\n      var keys$1 = filter(keys(behaviours), function (k) {\n        return behaviours[k] !== undefined;\n      });\n      return map(keys$1, function (k) {\n        return behaviours[k].me;\n      });\n    };\n    var generateFrom$1 = function (spec, all) {\n      return generateFrom(spec, all);\n    };\n    var generate$3 = function (spec) {\n      var all = getBehaviours$1(spec);\n      return generateFrom$1(spec, all);\n    };\n\n    var getDomDefinition = function (info, bList, bData) {\n      var definition = toDefinition(info);\n      var infoModification = toModification(info);\n      var baseModification = { 'alloy.base.modification': infoModification };\n      var modification = bList.length > 0 ? combine(bData, baseModification, bList, definition) : infoModification;\n      return merge$1(definition, modification);\n    };\n    var getEvents = function (info, bList, bData) {\n      var baseEvents = { 'alloy.base.behaviour': toEvents(info) };\n      return combine$1(bData, info.eventOrder, bList, baseEvents).getOrDie();\n    };\n    var build = function (spec) {\n      var getMe = function () {\n        return me;\n      };\n      var systemApi = Cell(singleton);\n      var info = getOrDie(toInfo(spec));\n      var bBlob = generate$3(spec);\n      var bList = getBehaviours(bBlob);\n      var bData = getData(bBlob);\n      var modDefinition = getDomDefinition(info, bList, bData);\n      var item = renderToDom(modDefinition);\n      var events = getEvents(info, bList, bData);\n      var subcomponents = Cell(info.components);\n      var connect = function (newApi) {\n        systemApi.set(newApi);\n      };\n      var disconnect = function () {\n        systemApi.set(NoContextApi(getMe));\n      };\n      var syncComponents = function () {\n        var children$1 = children(item);\n        var subs = bind(children$1, function (child) {\n          return systemApi.get().getByDom(child).fold(function () {\n            return [];\n          }, function (c) {\n            return [c];\n          });\n        });\n        subcomponents.set(subs);\n      };\n      var config = function (behaviour) {\n        var b = bData;\n        var f = isFunction(b[behaviour.name()]) ? b[behaviour.name()] : function () {\n          throw new Error('Could not find ' + behaviour.name() + ' in ' + JSON.stringify(spec, null, 2));\n        };\n        return f();\n      };\n      var hasConfigured = function (behaviour) {\n        return isFunction(bData[behaviour.name()]);\n      };\n      var getApis = function () {\n        return info.apis;\n      };\n      var readState = function (behaviourName) {\n        return bData[behaviourName]().map(function (b) {\n          return b.state.readState();\n        }).getOr('not enabled');\n      };\n      var me = {\n        getSystem: systemApi.get,\n        config: config,\n        hasConfigured: hasConfigured,\n        spec: constant(spec),\n        readState: readState,\n        getApis: getApis,\n        connect: connect,\n        disconnect: disconnect,\n        element: constant(item),\n        syncComponents: syncComponents,\n        components: subcomponents.get,\n        events: constant(events)\n      };\n      return me;\n    };\n\n    var buildSubcomponents = function (spec) {\n      var components = get(spec, 'components').getOr([]);\n      return map(components, build$1);\n    };\n    var buildFromSpec = function (userSpec) {\n      var _a = make(userSpec), specEvents = _a.events, spec = __rest(_a, ['events']);\n      var components = buildSubcomponents(spec);\n      var completeSpec = __assign(__assign({}, spec), {\n        events: __assign(__assign({}, DefaultEvents), specEvents),\n        components: components\n      });\n      return Result.value(build(completeSpec));\n    };\n    var text = function (textContent) {\n      var element = Element.fromText(textContent);\n      return external({ element: element });\n    };\n    var external = function (spec) {\n      var extSpec = asRawOrDie('external.component', objOfOnly([\n        strict$1('element'),\n        option('uid')\n      ]), spec);\n      var systemApi = Cell(NoContextApi());\n      var connect = function (newApi) {\n        systemApi.set(newApi);\n      };\n      var disconnect = function () {\n        systemApi.set(NoContextApi(function () {\n          return me;\n        }));\n      };\n      extSpec.uid.each(function (uid) {\n        writeOnly(extSpec.element, uid);\n      });\n      var me = {\n        getSystem: systemApi.get,\n        config: Option.none,\n        hasConfigured: constant(false),\n        connect: connect,\n        disconnect: disconnect,\n        getApis: function () {\n          return {};\n        },\n        element: constant(extSpec.element),\n        spec: constant(spec),\n        readState: constant('No state'),\n        syncComponents: noop,\n        components: constant([]),\n        events: constant({})\n      };\n      return premade(me);\n    };\n    var uids = generate$2;\n    var build$1 = function (spec) {\n      return getPremade(spec).fold(function () {\n        var userSpecWithUid = spec.hasOwnProperty('uid') ? spec : __assign({ uid: uids('') }, spec);\n        return buildFromSpec(userSpecWithUid).getOrDie();\n      }, function (prebuilt) {\n        return prebuilt;\n      });\n    };\n    var premade$1 = premade;\n\n    function Dimension (name, getOffset) {\n      var set = function (element, h) {\n        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {\n          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);\n        }\n        var dom = element.dom();\n        if (isSupported(dom)) {\n          dom.style[name] = h + 'px';\n        }\n      };\n      var get = function (element) {\n        var r = getOffset(element);\n        if (r <= 0 || r === null) {\n          var css = get$4(element, name);\n          return parseFloat(css) || 0;\n        }\n        return r;\n      };\n      var getOuter = get;\n      var aggregate = function (element, properties) {\n        return foldl(properties, function (acc, property) {\n          var val = get$4(element, property);\n          var value = val === undefined ? 0 : parseInt(val, 10);\n          return isNaN(value) ? acc : acc + value;\n        }, 0);\n      };\n      var max = function (element, value, properties) {\n        var cumulativeInclusions = aggregate(element, properties);\n        var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;\n        return absoluteMax;\n      };\n      return {\n        set: set,\n        get: get,\n        getOuter: getOuter,\n        aggregate: aggregate,\n        max: max\n      };\n    }\n\n    var api = Dimension('height', function (element) {\n      var dom = element.dom();\n      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;\n    });\n    var get$6 = function (element) {\n      return api.get(element);\n    };\n    var getOuter$1 = function (element) {\n      return api.getOuter(element);\n    };\n    var setMax = function (element, value) {\n      var inclusions = [\n        'margin-top',\n        'border-top-width',\n        'padding-top',\n        'padding-bottom',\n        'border-bottom-width',\n        'margin-bottom'\n      ];\n      var absMax = api.max(element, value, inclusions);\n      set$2(element, 'max-height', absMax + 'px');\n    };\n\n    var r = function (left, top) {\n      var translate = function (x, y) {\n        return r(left + x, top + y);\n      };\n      return {\n        left: constant(left),\n        top: constant(top),\n        translate: translate\n      };\n    };\n    var Position = r;\n\n    var boxPosition = function (dom) {\n      var box = dom.getBoundingClientRect();\n      return Position(box.left, box.top);\n    };\n    var firstDefinedOrZero = function (a, b) {\n      return a !== undefined ? a : b !== undefined ? b : 0;\n    };\n    var absolute = function (element) {\n      var doc = element.dom().ownerDocument;\n      var body = doc.body;\n      var win = doc.defaultView;\n      var html = doc.documentElement;\n      if (body === element.dom()) {\n        return Position(body.offsetLeft, body.offsetTop);\n      }\n      var scrollTop = firstDefinedOrZero(win.pageYOffset, html.scrollTop);\n      var scrollLeft = firstDefinedOrZero(win.pageXOffset, html.scrollLeft);\n      var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);\n      var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);\n      return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);\n    };\n    var viewport = function (element) {\n      var dom = element.dom();\n      var doc = dom.ownerDocument;\n      var body = doc.body;\n      if (body === dom) {\n        return Position(body.offsetLeft, body.offsetTop);\n      }\n      if (!inBody(element)) {\n        return Position(0, 0);\n      }\n      return boxPosition(dom);\n    };\n\n    var api$1 = Dimension('width', function (element) {\n      return element.dom().offsetWidth;\n    });\n    var set$4 = function (element, h) {\n      api$1.set(element, h);\n    };\n    var get$7 = function (element) {\n      return api$1.get(element);\n    };\n    var getOuter$2 = function (element) {\n      return api$1.getOuter(element);\n    };\n    var setMax$1 = function (element, value) {\n      var inclusions = [\n        'margin-left',\n        'border-left-width',\n        'padding-left',\n        'padding-right',\n        'border-right-width',\n        'margin-right'\n      ];\n      var absMax = api$1.max(element, value, inclusions);\n      set$2(element, 'max-width', absMax + 'px');\n    };\n\n    var mkEvent = function (target, x, y, stop, prevent, kill, raw) {\n      return {\n        target: constant(target),\n        x: constant(x),\n        y: constant(y),\n        stop: stop,\n        prevent: prevent,\n        kill: kill,\n        raw: constant(raw)\n      };\n    };\n    var fromRawEvent = function (rawEvent) {\n      var target = Element.fromDom(rawEvent.target);\n      var stop = function () {\n        rawEvent.stopPropagation();\n      };\n      var prevent = function () {\n        rawEvent.preventDefault();\n      };\n      var kill = compose(prevent, stop);\n      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);\n    };\n    var handle = function (filter, handler) {\n      return function (rawEvent) {\n        if (!filter(rawEvent)) {\n          return;\n        }\n        handler(fromRawEvent(rawEvent));\n      };\n    };\n    var binder = function (element, event, filter, handler, useCapture) {\n      var wrapped = handle(filter, handler);\n      element.dom().addEventListener(event, wrapped, useCapture);\n      return { unbind: curry(unbind, element, event, wrapped, useCapture) };\n    };\n    var bind$2 = function (element, event, filter, handler) {\n      return binder(element, event, filter, handler, false);\n    };\n    var capture = function (element, event, filter, handler) {\n      return binder(element, event, filter, handler, true);\n    };\n    var unbind = function (element, event, handler, useCapture) {\n      element.dom().removeEventListener(event, handler, useCapture);\n    };\n\n    var isSafari = detect$3().browser.isSafari();\n    var get$8 = function (_DOC) {\n      var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document;\n      var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n      var y = doc.body.scrollTop || doc.documentElement.scrollTop;\n      return Position(x, y);\n    };\n    var to = function (x, y, _DOC) {\n      var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document;\n      var win = doc.defaultView;\n      win.scrollTo(x, y);\n    };\n\n    var get$9 = function (_win) {\n      var win = _win === undefined ? domGlobals.window : _win;\n      return Option.from(win['visualViewport']);\n    };\n    var bounds = function (x, y, width, height) {\n      return {\n        x: constant(x),\n        y: constant(y),\n        width: constant(width),\n        height: constant(height),\n        right: constant(x + width),\n        bottom: constant(y + height)\n      };\n    };\n    var getBounds = function (_win) {\n      var win = _win === undefined ? domGlobals.window : _win;\n      var doc = win.document;\n      var scroll = get$8(Element.fromDom(doc));\n      return get$9(win).fold(function () {\n        var html = win.document.documentElement;\n        var width = html.clientWidth;\n        var height = html.clientHeight;\n        return bounds(scroll.left(), scroll.top(), width, height);\n      }, function (visualViewport) {\n        return bounds(Math.max(visualViewport.pageLeft, scroll.left()), Math.max(visualViewport.pageTop, scroll.top()), visualViewport.width, visualViewport.height);\n      });\n    };\n\n    var walkUp = function (navigation, doc) {\n      var frame = navigation.view(doc);\n      return frame.fold(constant([]), function (f) {\n        var parent = navigation.owner(f);\n        var rest = walkUp(navigation, parent);\n        return [f].concat(rest);\n      });\n    };\n    var pathTo = function (element, navigation) {\n      var d = navigation.owner(element);\n      var paths = walkUp(navigation, d);\n      return Option.some(paths);\n    };\n\n    var view = function (doc) {\n      var element = doc.dom() === domGlobals.document ? Option.none() : Option.from(doc.dom().defaultView.frameElement);\n      return element.map(Element.fromDom);\n    };\n    var owner$1 = function (element) {\n      return owner(element);\n    };\n\n    var Navigation = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        view: view,\n        owner: owner$1\n    });\n\n    var find$3 = function (element) {\n      var doc = Element.fromDom(domGlobals.document);\n      var scroll = get$8(doc);\n      var path = pathTo(element, Navigation);\n      return path.fold(curry(absolute, element), function (frames) {\n        var offset = viewport(element);\n        var r = foldr(frames, function (b, a) {\n          var loc = viewport(a);\n          return {\n            left: b.left + loc.left(),\n            top: b.top + loc.top()\n          };\n        }, {\n          left: 0,\n          top: 0\n        });\n        return Position(r.left + offset.left() + scroll.left(), r.top + offset.top() + scroll.top());\n      });\n    };\n\n    var pointed = Immutable('point', 'width', 'height');\n    var rect = Immutable('x', 'y', 'width', 'height');\n    var bounds$1 = function (x, y, width, height) {\n      return {\n        x: constant(x),\n        y: constant(y),\n        width: constant(width),\n        height: constant(height),\n        right: constant(x + width),\n        bottom: constant(y + height)\n      };\n    };\n    var box = function (element) {\n      var xy = absolute(element);\n      var w = getOuter$2(element);\n      var h = getOuter$1(element);\n      return bounds$1(xy.left(), xy.top(), w, h);\n    };\n    var absolute$1 = function (element) {\n      var position = find$3(element);\n      var width = getOuter$2(element);\n      var height = getOuter$1(element);\n      return bounds$1(position.left(), position.top(), width, height);\n    };\n    var win = function () {\n      return getBounds(domGlobals.window);\n    };\n\n    function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {\n      return is(scope, a) ? Option.some(scope) : isFunction(isRoot) && isRoot(scope) ? Option.none() : ancestor(scope, a, isRoot);\n    }\n\n    var ancestor$1 = function (scope, predicate, isRoot) {\n      var element = scope.dom();\n      var stop = isFunction(isRoot) ? isRoot : constant(false);\n      while (element.parentNode) {\n        element = element.parentNode;\n        var el = Element.fromDom(element);\n        if (predicate(el)) {\n          return Option.some(el);\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Option.none();\n    };\n    var closest$1 = function (scope, predicate, isRoot) {\n      var is = function (s, test) {\n        return test(s);\n      };\n      return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot);\n    };\n    var descendant = function (scope, predicate) {\n      var descend = function (node) {\n        for (var i = 0; i < node.childNodes.length; i++) {\n          var child_1 = Element.fromDom(node.childNodes[i]);\n          if (predicate(child_1)) {\n            return Option.some(child_1);\n          }\n          var res = descend(node.childNodes[i]);\n          if (res.isSome()) {\n            return res;\n          }\n        }\n        return Option.none();\n      };\n      return descend(scope.dom());\n    };\n\n    var closest$2 = function (scope, predicate, isRoot) {\n      return closest$1(scope, predicate, isRoot).isSome();\n    };\n\n    var ancestor$2 = function (scope, selector, isRoot) {\n      return ancestor$1(scope, function (e) {\n        return is(e, selector);\n      }, isRoot);\n    };\n    var descendant$1 = function (scope, selector) {\n      return one(selector, scope);\n    };\n    var closest$3 = function (scope, selector, isRoot) {\n      return ClosestOrAncestor(is, ancestor$2, scope, selector, isRoot);\n    };\n\n    var find$4 = function (queryElem) {\n      var dependent = closest$1(queryElem, function (elem) {\n        if (!isElement(elem)) {\n          return false;\n        }\n        var id = get$2(elem, 'id');\n        return id !== undefined && id.indexOf('aria-owns') > -1;\n      });\n      return dependent.bind(function (dep) {\n        var id = get$2(dep, 'id');\n        var doc = owner(dep);\n        return descendant$1(doc, '[aria-owns=\"' + id + '\"]');\n      });\n    };\n    var manager = function () {\n      var ariaId = generate$1('aria-owns');\n      var link = function (elem) {\n        set$1(elem, 'aria-owns', ariaId);\n      };\n      var unlink = function (elem) {\n        remove$1(elem, 'aria-owns');\n      };\n      return {\n        id: constant(ariaId),\n        link: link,\n        unlink: unlink\n      };\n    };\n\n    var isAriaPartOf = function (component, queryElem) {\n      return find$4(queryElem).exists(function (owner) {\n        return isPartOf(component, owner);\n      });\n    };\n    var isPartOf = function (component, queryElem) {\n      return closest$2(queryElem, function (el) {\n        return eq(el, component.element());\n      }, constant(false)) || isAriaPartOf(component, queryElem);\n    };\n\n    var unknown$3 = 'unknown';\n    var EventConfiguration;\n    (function (EventConfiguration) {\n      EventConfiguration[EventConfiguration['STOP'] = 0] = 'STOP';\n      EventConfiguration[EventConfiguration['NORMAL'] = 1] = 'NORMAL';\n      EventConfiguration[EventConfiguration['LOGGING'] = 2] = 'LOGGING';\n    }(EventConfiguration || (EventConfiguration = {})));\n    var eventConfig = Cell({});\n    var makeEventLogger = function (eventName, initialTarget) {\n      var sequence = [];\n      var startTime = new Date().getTime();\n      return {\n        logEventCut: function (name, target, purpose) {\n          sequence.push({\n            outcome: 'cut',\n            target: target,\n            purpose: purpose\n          });\n        },\n        logEventStopped: function (name, target, purpose) {\n          sequence.push({\n            outcome: 'stopped',\n            target: target,\n            purpose: purpose\n          });\n        },\n        logNoParent: function (name, target, purpose) {\n          sequence.push({\n            outcome: 'no-parent',\n            target: target,\n            purpose: purpose\n          });\n        },\n        logEventNoHandlers: function (name, target) {\n          sequence.push({\n            outcome: 'no-handlers-left',\n            target: target\n          });\n        },\n        logEventResponse: function (name, target, purpose) {\n          sequence.push({\n            outcome: 'response',\n            purpose: purpose,\n            target: target\n          });\n        },\n        write: function () {\n          var finishTime = new Date().getTime();\n          if (contains([\n              'mousemove',\n              'mouseover',\n              'mouseout',\n              systemInit()\n            ], eventName)) {\n            return;\n          }\n          domGlobals.console.log(eventName, {\n            event: eventName,\n            time: finishTime - startTime,\n            target: initialTarget.dom(),\n            sequence: map(sequence, function (s) {\n              if (!contains([\n                  'cut',\n                  'stopped',\n                  'response'\n                ], s.outcome)) {\n                return s.outcome;\n              } else {\n                return '{' + s.purpose + '} ' + s.outcome + ' at (' + element(s.target) + ')';\n              }\n            })\n          });\n        }\n      };\n    };\n    var processEvent = function (eventName, initialTarget, f) {\n      var status = get(eventConfig.get(), eventName).orThunk(function () {\n        var patterns = keys(eventConfig.get());\n        return findMap(patterns, function (p) {\n          return eventName.indexOf(p) > -1 ? Option.some(eventConfig.get()[p]) : Option.none();\n        });\n      }).getOr(EventConfiguration.NORMAL);\n      switch (status) {\n      case EventConfiguration.NORMAL:\n        return f(noLogger());\n      case EventConfiguration.LOGGING: {\n          var logger = makeEventLogger(eventName, initialTarget);\n          var output = f(logger);\n          logger.write();\n          return output;\n        }\n      case EventConfiguration.STOP:\n        return true;\n      }\n    };\n    var path = [\n      'alloy/data/Fields',\n      'alloy/debugging/Debugging'\n    ];\n    var getTrace = function () {\n      var err = new Error();\n      if (err.stack !== undefined) {\n        var lines = err.stack.split('\\n');\n        return find(lines, function (line) {\n          return line.indexOf('alloy') > 0 && !exists(path, function (p) {\n            return line.indexOf(p) > -1;\n          });\n        }).getOr(unknown$3);\n      } else {\n        return unknown$3;\n      }\n    };\n    var ignoreEvent = {\n      logEventCut: noop,\n      logEventStopped: noop,\n      logNoParent: noop,\n      logEventNoHandlers: noop,\n      logEventResponse: noop,\n      write: noop\n    };\n    var monitorEvent = function (eventName, initialTarget, f) {\n      return processEvent(eventName, initialTarget, f);\n    };\n    var noLogger = constant(ignoreEvent);\n\n    var menuFields = constant([\n      strict$1('menu'),\n      strict$1('selectedMenu')\n    ]);\n    var itemFields = constant([\n      strict$1('item'),\n      strict$1('selectedItem')\n    ]);\n    var schema = constant(objOf(itemFields().concat(menuFields())));\n    var itemSchema = constant(objOf(itemFields()));\n\n    var _initSize = strictObjOf('initSize', [\n      strict$1('numColumns'),\n      strict$1('numRows')\n    ]);\n    var itemMarkers = function () {\n      return strictOf('markers', itemSchema());\n    };\n    var tieredMenuMarkers = function () {\n      return strictObjOf('markers', [strict$1('backgroundMenu')].concat(menuFields()).concat(itemFields()));\n    };\n    var markers = function (required) {\n      return strictObjOf('markers', map(required, strict$1));\n    };\n    var onPresenceHandler = function (label, fieldName, presence) {\n      var trace = getTrace();\n      return field(fieldName, fieldName, presence, valueOf(function (f) {\n        return Result.value(function () {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          return f.apply(undefined, args);\n        });\n      }));\n    };\n    var onHandler = function (fieldName) {\n      return onPresenceHandler('onHandler', fieldName, defaulted(noop));\n    };\n    var onKeyboardHandler = function (fieldName) {\n      return onPresenceHandler('onKeyboardHandler', fieldName, defaulted(Option.none));\n    };\n    var onStrictHandler = function (fieldName) {\n      return onPresenceHandler('onHandler', fieldName, strict());\n    };\n    var onStrictKeyboardHandler = function (fieldName) {\n      return onPresenceHandler('onKeyboardHandler', fieldName, strict());\n    };\n    var output = function (name, value) {\n      return state$1(name, constant(value));\n    };\n    var snapshot = function (name) {\n      return state$1(name, identity);\n    };\n    var initSize = constant(_initSize);\n\n    var nu$7 = Immutable('x', 'y', 'bubble', 'direction', 'boundsRestriction', 'label');\n\n    var adt$2 = Adt.generate([\n      { southeast: [] },\n      { southwest: [] },\n      { northeast: [] },\n      { northwest: [] },\n      { south: [] },\n      { north: [] },\n      { east: [] },\n      { west: [] }\n    ]);\n    var cata = function (subject, southeast, southwest, northeast, northwest, south, north, east, west) {\n      return subject.fold(southeast, southwest, northeast, northwest, south, north, east, west);\n    };\n    var cataVertical = function (subject, south, middle, north) {\n      return subject.fold(south, south, north, north, south, north, middle, middle);\n    };\n    var cataHorizontal = function (subject, east, middle, west) {\n      return subject.fold(east, west, east, west, middle, middle, east, west);\n    };\n    var southeast = adt$2.southeast;\n    var southwest = adt$2.southwest;\n    var northeast = adt$2.northeast;\n    var northwest = adt$2.northwest;\n    var south = adt$2.south;\n    var north = adt$2.north;\n    var east = adt$2.east;\n    var west = adt$2.west;\n\n    var getRestriction = function (anchor, restriction) {\n      switch (restriction) {\n      case 1:\n        return anchor.x();\n      case 0:\n        return anchor.x() + anchor.width();\n      case 2:\n        return anchor.y();\n      case 3:\n        return anchor.y() + anchor.height();\n      }\n    };\n    var boundsRestriction = function (anchor, restrictions) {\n      return mapToObject([\n        'left',\n        'right',\n        'top',\n        'bottom'\n      ], function (dir) {\n        return get(restrictions, dir).map(function (restriction) {\n          return getRestriction(anchor, restriction);\n        });\n      });\n    };\n    var adjustBounds = function (bounds, boundsRestrictions, bubbleOffsets) {\n      var applyRestriction = function (dir, current) {\n        var bubbleOffset = dir === 'top' || dir === 'bottom' ? bubbleOffsets.top() : bubbleOffsets.left();\n        return get(boundsRestrictions, dir).bind(identity).bind(function (restriction) {\n          if (dir === 'left' || dir === 'top') {\n            return restriction >= current ? Option.some(restriction) : Option.none();\n          } else {\n            return restriction <= current ? Option.some(restriction) : Option.none();\n          }\n        }).map(function (restriction) {\n          return restriction + bubbleOffset;\n        }).getOr(current);\n      };\n      var adjustedLeft = applyRestriction('left', bounds.x());\n      var adjustedTop = applyRestriction('top', bounds.y());\n      var adjustedRight = applyRestriction('right', bounds.right());\n      var adjustedBottom = applyRestriction('bottom', bounds.bottom());\n      return bounds$1(adjustedLeft, adjustedTop, adjustedRight - adjustedLeft, adjustedBottom - adjustedTop);\n    };\n\n    var eastX = function (anchor) {\n      return anchor.x();\n    };\n    var middleX = function (anchor, element) {\n      return anchor.x() + anchor.width() / 2 - element.width() / 2;\n    };\n    var westX = function (anchor, element) {\n      return anchor.x() + anchor.width() - element.width();\n    };\n    var northY = function (anchor, element) {\n      return anchor.y() - element.height();\n    };\n    var southY = function (anchor) {\n      return anchor.y() + anchor.height();\n    };\n    var centreY = function (anchor, element) {\n      return anchor.y() + anchor.height() / 2 - element.height() / 2;\n    };\n    var eastEdgeX = function (anchor) {\n      return anchor.x() + anchor.width();\n    };\n    var westEdgeX = function (anchor, element) {\n      return anchor.x() - element.width();\n    };\n    var southeast$1 = function (anchor, element, bubbles) {\n      return nu$7(eastX(anchor), southY(anchor), bubbles.southeast(), southeast(), boundsRestriction(anchor, {\n        left: 1,\n        top: 3\n      }), 'layout-se');\n    };\n    var southwest$1 = function (anchor, element, bubbles) {\n      return nu$7(westX(anchor, element), southY(anchor), bubbles.southwest(), southwest(), boundsRestriction(anchor, {\n        right: 0,\n        top: 3\n      }), 'layout-sw');\n    };\n    var northeast$1 = function (anchor, element, bubbles) {\n      return nu$7(eastX(anchor), northY(anchor, element), bubbles.northeast(), northeast(), boundsRestriction(anchor, {\n        left: 1,\n        bottom: 2\n      }), 'layout-ne');\n    };\n    var northwest$1 = function (anchor, element, bubbles) {\n      return nu$7(westX(anchor, element), northY(anchor, element), bubbles.northwest(), northwest(), boundsRestriction(anchor, {\n        right: 0,\n        bottom: 2\n      }), 'layout-nw');\n    };\n    var north$1 = function (anchor, element, bubbles) {\n      return nu$7(middleX(anchor, element), northY(anchor, element), bubbles.north(), north(), boundsRestriction(anchor, { bottom: 2 }), 'layout-n');\n    };\n    var south$1 = function (anchor, element, bubbles) {\n      return nu$7(middleX(anchor, element), southY(anchor), bubbles.south(), south(), boundsRestriction(anchor, { top: 3 }), 'layout-s');\n    };\n    var east$1 = function (anchor, element, bubbles) {\n      return nu$7(eastEdgeX(anchor), centreY(anchor, element), bubbles.east(), east(), boundsRestriction(anchor, { left: 0 }), 'layout-e');\n    };\n    var west$1 = function (anchor, element, bubbles) {\n      return nu$7(westEdgeX(anchor, element), centreY(anchor, element), bubbles.west(), west(), boundsRestriction(anchor, { right: 1 }), 'layout-w');\n    };\n    var all$2 = function () {\n      return [\n        southeast$1,\n        southwest$1,\n        northeast$1,\n        northwest$1,\n        south$1,\n        north$1,\n        east$1,\n        west$1\n      ];\n    };\n    var allRtl = function () {\n      return [\n        southwest$1,\n        southeast$1,\n        northwest$1,\n        northeast$1,\n        south$1,\n        north$1,\n        east$1,\n        west$1\n      ];\n    };\n    var aboveOrBelow = function () {\n      return [\n        northeast$1,\n        northwest$1,\n        southeast$1,\n        southwest$1,\n        north$1,\n        south$1\n      ];\n    };\n    var aboveOrBelowRtl = function () {\n      return [\n        northwest$1,\n        northeast$1,\n        southwest$1,\n        southeast$1,\n        north$1,\n        south$1\n      ];\n    };\n    var belowOrAbove = function () {\n      return [\n        southeast$1,\n        southwest$1,\n        northeast$1,\n        northwest$1,\n        south$1,\n        north$1\n      ];\n    };\n    var belowOrAboveRtl = function () {\n      return [\n        southwest$1,\n        southeast$1,\n        northwest$1,\n        northeast$1,\n        south$1,\n        north$1\n      ];\n    };\n\n    var executeEvent = function (bConfig, bState, executor) {\n      return runOnExecute(function (component) {\n        executor(component, bConfig, bState);\n      });\n    };\n    var loadEvent = function (bConfig, bState, f) {\n      return runOnInit(function (component, simulatedEvent) {\n        f(component, bConfig, bState);\n      });\n    };\n    var create = function (schema, name, active, apis, extra, state) {\n      var configSchema = objOfOnly(schema);\n      var schemaSchema = optionObjOf(name, [optionObjOfOnly('config', schema)]);\n      return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);\n    };\n    var createModes = function (modes, name, active, apis, extra, state) {\n      var configSchema = modes;\n      var schemaSchema = optionObjOf(name, [optionOf('config', modes)]);\n      return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);\n    };\n    var wrapApi = function (bName, apiFunction, apiName) {\n      var f = function (component) {\n        var rest = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n          rest[_i - 1] = arguments[_i];\n        }\n        var args = [component].concat(rest);\n        return component.config({ name: constant(bName) }).fold(function () {\n          throw new Error('We could not find any behaviour configuration for: ' + bName + '. Using API: ' + apiName);\n        }, function (info) {\n          var rest = Array.prototype.slice.call(args, 1);\n          return apiFunction.apply(undefined, [\n            component,\n            info.config,\n            info.state\n          ].concat(rest));\n        });\n      };\n      return markAsBehaviourApi(f, apiName, apiFunction);\n    };\n    var revokeBehaviour = function (name) {\n      return {\n        key: name,\n        value: undefined\n      };\n    };\n    var doCreate = function (configSchema, schemaSchema, name, active, apis, extra, state) {\n      var getConfig = function (info) {\n        return hasNonNullableKey(info, name) ? info[name]() : Option.none();\n      };\n      var wrappedApis = map$1(apis, function (apiF, apiName) {\n        return wrapApi(name, apiF, apiName);\n      });\n      var wrappedExtra = map$1(extra, function (extraF, extraName) {\n        return markAsExtraApi(extraF, extraName);\n      });\n      var me = __assign(__assign(__assign({}, wrappedExtra), wrappedApis), {\n        revoke: curry(revokeBehaviour, name),\n        config: function (spec) {\n          var prepared = asRawOrDie(name + '-config', configSchema, spec);\n          return {\n            key: name,\n            value: {\n              config: prepared,\n              me: me,\n              configAsRaw: cached(function () {\n                return asRawOrDie(name + '-config', configSchema, spec);\n              }),\n              initialConfig: spec,\n              state: state\n            }\n          };\n        },\n        schema: function () {\n          return schemaSchema;\n        },\n        exhibit: function (info, base) {\n          return getConfig(info).bind(function (behaviourInfo) {\n            return get(active, 'exhibit').map(function (exhibitor) {\n              return exhibitor(base, behaviourInfo.config, behaviourInfo.state);\n            });\n          }).getOr(nu$6({}));\n        },\n        name: function () {\n          return name;\n        },\n        handlers: function (info) {\n          return getConfig(info).map(function (behaviourInfo) {\n            var getEvents = get(active, 'events').getOr(function () {\n              return {};\n            });\n            return getEvents(behaviourInfo.config, behaviourInfo.state);\n          }).getOr({});\n        }\n      });\n      return me;\n    };\n\n    var derive$1 = function (capabilities) {\n      return wrapAll$1(capabilities);\n    };\n    var simpleSchema = objOfOnly([\n      strict$1('fields'),\n      strict$1('name'),\n      defaulted$1('active', {}),\n      defaulted$1('apis', {}),\n      defaulted$1('state', NoState),\n      defaulted$1('extra', {})\n    ]);\n    var create$1 = function (data) {\n      var value = asRawOrDie('Creating behaviour: ' + data.name, simpleSchema, data);\n      return create(value.fields, value.name, value.active, value.apis, value.extra, value.state);\n    };\n    var modeSchema = objOfOnly([\n      strict$1('branchKey'),\n      strict$1('branches'),\n      strict$1('name'),\n      defaulted$1('active', {}),\n      defaulted$1('apis', {}),\n      defaulted$1('state', NoState),\n      defaulted$1('extra', {})\n    ]);\n    var createModes$1 = function (data) {\n      var value = asRawOrDie('Creating behaviour: ' + data.name, modeSchema, data);\n      return createModes(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state);\n    };\n    var revoke = constant(undefined);\n\n    var chooseChannels = function (channels, message) {\n      return message.universal() ? channels : filter(channels, function (ch) {\n        return contains(message.channels(), ch);\n      });\n    };\n    var events$1 = function (receiveConfig) {\n      return derive([run(receive(), function (component, message) {\n          var channelMap = receiveConfig.channels;\n          var channels = keys(channelMap);\n          var receivingData = message;\n          var targetChannels = chooseChannels(channels, receivingData);\n          each(targetChannels, function (ch) {\n            var channelInfo = channelMap[ch];\n            var channelSchema = channelInfo.schema;\n            var data = asRawOrDie('channel[' + ch + '] data\\nReceiver: ' + element(component.element()), channelSchema, receivingData.data());\n            channelInfo.onReceive(component, data);\n          });\n        })]);\n    };\n\n    var ActiveReceiving = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$1\n    });\n\n    var ReceivingSchema = [strictOf('channels', setOf$1(Result.value, objOfOnly([\n        onStrictHandler('onReceive'),\n        defaulted$1('schema', anyValue$1())\n      ])))];\n\n    var Receiving = create$1({\n      fields: ReceivingSchema,\n      name: 'receiving',\n      active: ActiveReceiving\n    });\n\n    var exhibit = function (base, posConfig) {\n      return nu$6({\n        classes: [],\n        styles: posConfig.useFixed() ? {} : { position: 'relative' }\n      });\n    };\n\n    var ActivePosition = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit\n    });\n\n    var focus$1 = function (element) {\n      element.dom().focus();\n    };\n    var blur = function (element) {\n      element.dom().blur();\n    };\n    var hasFocus = function (element) {\n      var doc = owner(element).dom();\n      return element.dom() === doc.activeElement;\n    };\n    var active = function (_doc) {\n      var doc = _doc !== undefined ? _doc.dom() : domGlobals.document;\n      return Option.from(doc.activeElement).map(Element.fromDom);\n    };\n    var search = function (element) {\n      return active(owner(element)).filter(function (e) {\n        return element.dom().contains(e.dom());\n      });\n    };\n\n    var preserve = function (f, container) {\n      var ownerDoc = owner(container);\n      var refocus = active(ownerDoc).bind(function (focused) {\n        var hasFocus = function (elem) {\n          return eq(focused, elem);\n        };\n        return hasFocus(container) ? Option.some(container) : descendant(container, hasFocus);\n      });\n      var result = f(container);\n      refocus.each(function (oldFocus) {\n        active(ownerDoc).filter(function (newFocus) {\n          return eq(newFocus, oldFocus);\n        }).fold(function () {\n          focus$1(oldFocus);\n        }, noop);\n      });\n      return result;\n    };\n\n    var NuPositionCss = Immutable('position', 'left', 'top', 'right', 'bottom');\n    var applyPositionCss = function (element, position) {\n      var addPx = function (num) {\n        return num + 'px';\n      };\n      setOptions(element, {\n        position: Option.some(position.position()),\n        left: position.left().map(addPx),\n        top: position.top().map(addPx),\n        right: position.right().map(addPx),\n        bottom: position.bottom().map(addPx)\n      });\n    };\n\n    var adt$3 = Adt.generate([\n      { none: [] },\n      {\n        relative: [\n          'x',\n          'y',\n          'width',\n          'height'\n        ]\n      },\n      {\n        fixed: [\n          'x',\n          'y',\n          'width',\n          'height'\n        ]\n      }\n    ]);\n    var positionWithDirection = function (posName, decision, x, y, width, height) {\n      var decisionX = decision.x() - x;\n      var decisionY = decision.y() - y;\n      var decisionWidth = decision.width();\n      var decisionHeight = decision.height();\n      var decisionRight = width - (decisionX + decisionWidth);\n      var decisionBottom = height - (decisionY + decisionHeight);\n      var left = Option.some(decisionX);\n      var top = Option.some(decisionY);\n      var right = Option.some(decisionRight);\n      var bottom = Option.some(decisionBottom);\n      var none = Option.none();\n      return cata(decision.direction(), function () {\n        return NuPositionCss(posName, left, top, none, none);\n      }, function () {\n        return NuPositionCss(posName, none, top, right, none);\n      }, function () {\n        return NuPositionCss(posName, left, none, none, bottom);\n      }, function () {\n        return NuPositionCss(posName, none, none, right, bottom);\n      }, function () {\n        return NuPositionCss(posName, left, top, none, none);\n      }, function () {\n        return NuPositionCss(posName, left, none, none, bottom);\n      }, function () {\n        return NuPositionCss(posName, left, top, none, none);\n      }, function () {\n        return NuPositionCss(posName, none, top, right, none);\n      });\n    };\n    var reposition = function (origin, decision) {\n      return origin.fold(function () {\n        return NuPositionCss('absolute', Option.some(decision.x()), Option.some(decision.y()), Option.none(), Option.none());\n      }, function (x, y, width, height) {\n        return positionWithDirection('absolute', decision, x, y, width, height);\n      }, function (x, y, width, height) {\n        return positionWithDirection('fixed', decision, x, y, width, height);\n      });\n    };\n    var toBox = function (origin, element) {\n      var rel = curry(find$3, element);\n      var position = origin.fold(rel, rel, function () {\n        var scroll = get$8();\n        return find$3(element).translate(-scroll.left(), -scroll.top());\n      });\n      var width = getOuter$2(element);\n      var height = getOuter$1(element);\n      return bounds$1(position.left(), position.top(), width, height);\n    };\n    var viewport$1 = function (origin, getBounds) {\n      return getBounds.fold(function () {\n        return origin.fold(win, win, bounds$1);\n      }, function (b) {\n        return origin.fold(b, b, function () {\n          var bounds = b();\n          var pos = translate(origin, bounds.x(), bounds.y());\n          return bounds$1(pos.left(), pos.top(), bounds.width(), bounds.height());\n        });\n      });\n    };\n    var translate = function (origin, x, y) {\n      var pos = Position(x, y);\n      var removeScroll = function () {\n        var outerScroll = get$8();\n        return pos.translate(-outerScroll.left(), -outerScroll.top());\n      };\n      return origin.fold(constant(pos), constant(pos), removeScroll);\n    };\n    var cata$1 = function (subject, onNone, onRelative, onFixed) {\n      return subject.fold(onNone, onRelative, onFixed);\n    };\n    var none$1 = adt$3.none;\n    var relative = adt$3.relative;\n    var fixed = adt$3.fixed;\n\n    var anchor = Immutable('anchorBox', 'origin');\n    var box$1 = function (anchorBox, origin) {\n      return anchor(anchorBox, origin);\n    };\n\n    var cycleBy = function (value, delta, min, max) {\n      var r = value + delta;\n      return r > max ? min : r < min ? max : r;\n    };\n    var clamp = function (value, min, max) {\n      return Math.min(Math.max(value, min), max);\n    };\n\n    var decision = MixedBag([\n      'x',\n      'y',\n      'width',\n      'height',\n      'maxHeight',\n      'maxWidth',\n      'direction',\n      'classes',\n      'label',\n      'candidateYforTest'\n    ], []);\n\n    var adt$4 = Adt.generate([\n      { fit: ['reposition'] },\n      {\n        nofit: [\n          'reposition',\n          'deltaW',\n          'deltaH'\n        ]\n      }\n    ]);\n    var calcReposition = function (newX, newY, width, height, bounds) {\n      var boundsX = bounds.x();\n      var boundsY = bounds.y();\n      var boundsWidth = bounds.width();\n      var boundsHeight = bounds.height();\n      var xInBounds = newX >= boundsX;\n      var yInBounds = newY >= boundsY;\n      var originInBounds = xInBounds && yInBounds;\n      var xFit = newX + width <= boundsX + boundsWidth;\n      var yFit = newY + height <= boundsY + boundsHeight;\n      var sizeInBounds = xFit && yFit;\n      var deltaW = Math.abs(Math.min(width, xInBounds ? boundsX + boundsWidth - newX : boundsX - (newX + width)));\n      var deltaH = Math.abs(Math.min(height, yInBounds ? boundsY + boundsHeight - newY : boundsY - (newY + height)));\n      var maxX = Math.max(bounds.x(), bounds.right() - width);\n      var maxY = Math.max(bounds.y(), bounds.bottom() - height);\n      var limitX = clamp(newX, bounds.x(), maxX);\n      var limitY = clamp(newY, bounds.y(), maxY);\n      return {\n        originInBounds: originInBounds,\n        sizeInBounds: sizeInBounds,\n        limitX: limitX,\n        limitY: limitY,\n        deltaW: deltaW,\n        deltaH: deltaH\n      };\n    };\n    var attempt = function (candidate, width, height, bounds) {\n      var candidateX = candidate.x();\n      var candidateY = candidate.y();\n      var bubbleOffsets = candidate.bubble().offset();\n      var bubbleLeft = bubbleOffsets.left();\n      var bubbleTop = bubbleOffsets.top();\n      var adjustedBounds = adjustBounds(bounds, candidate.boundsRestriction(), bubbleOffsets);\n      var boundsY = adjustedBounds.y();\n      var boundsBottom = adjustedBounds.bottom();\n      var boundsX = adjustedBounds.x();\n      var boundsRight = adjustedBounds.right();\n      var newX = candidateX + bubbleLeft;\n      var newY = candidateY + bubbleTop;\n      var _a = calcReposition(newX, newY, width, height, adjustedBounds), originInBounds = _a.originInBounds, sizeInBounds = _a.sizeInBounds, limitX = _a.limitX, limitY = _a.limitY, deltaW = _a.deltaW, deltaH = _a.deltaH;\n      var upAvailable = constant(limitY + deltaH - boundsY);\n      var downAvailable = constant(boundsBottom - limitY);\n      var maxHeight = cataVertical(candidate.direction(), downAvailable, downAvailable, upAvailable);\n      var westAvailable = constant(limitX + deltaW - boundsX);\n      var eastAvailable = constant(boundsRight - limitX);\n      var maxWidth = cataHorizontal(candidate.direction(), eastAvailable, eastAvailable, westAvailable);\n      var reposition = decision({\n        x: limitX,\n        y: limitY,\n        width: deltaW,\n        height: deltaH,\n        maxHeight: maxHeight,\n        maxWidth: maxWidth,\n        direction: candidate.direction(),\n        classes: {\n          on: candidate.bubble().classesOn(),\n          off: candidate.bubble().classesOff()\n        },\n        label: candidate.label(),\n        candidateYforTest: newY\n      });\n      return originInBounds && sizeInBounds ? adt$4.fit(reposition) : adt$4.nofit(reposition, deltaW, deltaH);\n    };\n    var attempts = function (candidates, anchorBox, elementBox, bubbles, bounds) {\n      var panelWidth = elementBox.width();\n      var panelHeight = elementBox.height();\n      var attemptBestFit = function (layout, reposition, deltaW, deltaH) {\n        var next = layout(anchorBox, elementBox, bubbles);\n        var attemptLayout = attempt(next, panelWidth, panelHeight, bounds);\n        return attemptLayout.fold(adt$4.fit, function (newReposition, newDeltaW, newDeltaH) {\n          var improved = newDeltaH > deltaH || newDeltaW > deltaW;\n          return improved ? adt$4.nofit(newReposition, newDeltaW, newDeltaH) : adt$4.nofit(reposition, deltaW, deltaH);\n        });\n      };\n      var abc = foldl(candidates, function (b, a) {\n        var bestNext = curry(attemptBestFit, a);\n        return b.fold(adt$4.fit, bestNext);\n      }, adt$4.nofit(decision({\n        x: anchorBox.x(),\n        y: anchorBox.y(),\n        width: elementBox.width(),\n        height: elementBox.height(),\n        maxHeight: elementBox.height(),\n        maxWidth: elementBox.width(),\n        direction: southeast(),\n        classes: {\n          on: [],\n          off: []\n        },\n        label: 'none',\n        candidateYforTest: anchorBox.y()\n      }), -1, -1));\n      return abc.fold(identity, identity);\n    };\n\n    var elementSize = function (p) {\n      return {\n        width: constant(getOuter$2(p)),\n        height: constant(getOuter$1(p))\n      };\n    };\n    var layout = function (anchorBox, element, bubbles, options) {\n      remove$6(element, 'max-height');\n      remove$6(element, 'max-width');\n      var elementBox = elementSize(element);\n      return attempts(options.preference(), anchorBox, elementBox, bubbles, options.bounds());\n    };\n    var setClasses = function (element, decision) {\n      var classInfo = decision.classes();\n      remove$5(element, classInfo.off);\n      add$3(element, classInfo.on);\n    };\n    var setHeight = function (element, decision, options) {\n      var maxHeightFunction = options.maxHeightFunction();\n      maxHeightFunction(element, decision.maxHeight());\n    };\n    var setWidth = function (element, decision, options) {\n      var maxWidthFunction = options.maxWidthFunction();\n      maxWidthFunction(element, decision.maxWidth());\n    };\n    var position = function (element, decision, options) {\n      applyPositionCss(element, reposition(options.origin(), decision));\n    };\n\n    var setMaxHeight = function (element, maxHeight) {\n      setMax(element, Math.floor(maxHeight));\n    };\n    var anchored = constant(function (element, available) {\n      setMaxHeight(element, available);\n      setAll$1(element, {\n        'overflow-x': 'hidden',\n        'overflow-y': 'auto'\n      });\n    });\n    var expandable = constant(function (element, available) {\n      setMaxHeight(element, available);\n    });\n\n    var reparteeOptions = MixedBag([\n      'bounds',\n      'origin',\n      'preference',\n      'maxHeightFunction',\n      'maxWidthFunction'\n    ], []);\n    var defaultOr = function (options, key, dephault) {\n      return options[key] === undefined ? dephault : options[key];\n    };\n    var simple = function (anchor, element, bubble, layouts, getBounds, overrideOptions) {\n      var maxHeightFunction = defaultOr(overrideOptions, 'maxHeightFunction', anchored());\n      var maxWidthFunction = defaultOr(overrideOptions, 'maxWidthFunction', noop);\n      var anchorBox = anchor.anchorBox();\n      var origin = anchor.origin();\n      var options = reparteeOptions({\n        bounds: viewport$1(origin, getBounds),\n        origin: origin,\n        preference: layouts,\n        maxHeightFunction: maxHeightFunction,\n        maxWidthFunction: maxWidthFunction\n      });\n      go(anchorBox, element, bubble, options);\n    };\n    var go = function (anchorBox, element, bubble, options) {\n      var decision = layout(anchorBox, element, bubble, options);\n      position(element, decision, options);\n      setClasses(element, decision);\n      setHeight(element, decision, options);\n      setWidth(element, decision, options);\n    };\n\n    var allAlignments = [\n      'valignCentre',\n      'alignLeft',\n      'alignRight',\n      'alignCentre',\n      'top',\n      'bottom',\n      'left',\n      'right'\n    ];\n    var nu$8 = function (width, yoffset, classes) {\n      var getClasses = function (prop) {\n        return get(classes, prop).getOr([]);\n      };\n      var make = function (xDelta, yDelta, alignmentsOn) {\n        var alignmentsOff = difference(allAlignments, alignmentsOn);\n        return {\n          offset: function () {\n            return Position(xDelta, yDelta);\n          },\n          classesOn: function () {\n            return bind(alignmentsOn, getClasses);\n          },\n          classesOff: function () {\n            return bind(alignmentsOff, getClasses);\n          }\n        };\n      };\n      return {\n        southeast: function () {\n          return make(-width, yoffset, [\n            'top',\n            'alignLeft'\n          ]);\n        },\n        southwest: function () {\n          return make(width, yoffset, [\n            'top',\n            'alignRight'\n          ]);\n        },\n        south: function () {\n          return make(-width / 2, yoffset, [\n            'top',\n            'alignCentre'\n          ]);\n        },\n        northeast: function () {\n          return make(-width, -yoffset, [\n            'bottom',\n            'alignLeft'\n          ]);\n        },\n        northwest: function () {\n          return make(width, -yoffset, [\n            'bottom',\n            'alignRight'\n          ]);\n        },\n        north: function () {\n          return make(-width / 2, -yoffset, [\n            'bottom',\n            'alignCentre'\n          ]);\n        },\n        east: function () {\n          return make(width, -yoffset / 2, [\n            'valignCentre',\n            'left'\n          ]);\n        },\n        west: function () {\n          return make(-width, -yoffset / 2, [\n            'valignCentre',\n            'right'\n          ]);\n        },\n        innerNorthwest: function () {\n          return make(-width, yoffset, [\n            'top',\n            'alignRight'\n          ]);\n        },\n        innerNortheast: function () {\n          return make(width, yoffset, [\n            'top',\n            'alignLeft'\n          ]);\n        },\n        innerNorth: function () {\n          return make(-width / 2, yoffset, [\n            'top',\n            'alignCentre'\n          ]);\n        },\n        innerSouthwest: function () {\n          return make(-width, -yoffset, [\n            'bottom',\n            'alignRight'\n          ]);\n        },\n        innerSoutheast: function () {\n          return make(width, -yoffset, [\n            'bottom',\n            'alignLeft'\n          ]);\n        },\n        innerSouth: function () {\n          return make(-width / 2, -yoffset, [\n            'bottom',\n            'alignCentre'\n          ]);\n        },\n        innerWest: function () {\n          return make(width, -yoffset / 2, [\n            'valignCentre',\n            'right'\n          ]);\n        },\n        innerEast: function () {\n          return make(-width, -yoffset / 2, [\n            'valignCentre',\n            'left'\n          ]);\n        }\n      };\n    };\n    var fallback = function () {\n      return nu$8(0, 0, {});\n    };\n\n    var nu$9 = function (x) {\n      return x;\n    };\n\n    var onDirection = function (isLtr, isRtl) {\n      return function (element) {\n        return getDirection(element) === 'rtl' ? isRtl : isLtr;\n      };\n    };\n    var getDirection = function (element) {\n      return get$4(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';\n    };\n\n    var AttributeValue;\n    (function (AttributeValue) {\n      AttributeValue['TopToBottom'] = 'toptobottom';\n      AttributeValue['BottomToTop'] = 'bottomtotop';\n    }(AttributeValue || (AttributeValue = {})));\n    var Attribute = 'data-alloy-vertical-dir';\n    var isBottomToTopDir = function (el) {\n      return closest$2(el, function (current) {\n        return isElement(current) && get$2(current, Attribute) === AttributeValue.BottomToTop;\n      });\n    };\n\n    var schema$1 = function () {\n      return optionObjOf('layouts', [\n        strict$1('onLtr'),\n        strict$1('onRtl'),\n        option('onBottomLtr'),\n        option('onBottomRtl')\n      ]);\n    };\n    var get$a = function (elem, info, defaultLtr, defaultRtl, defaultBottomLtr, defaultBottomRtl, dirElement) {\n      var isBottomToTop = dirElement.map(isBottomToTopDir).getOr(false);\n      var customLtr = info.layouts.map(function (ls) {\n        return ls.onLtr(elem);\n      });\n      var customRtl = info.layouts.map(function (ls) {\n        return ls.onRtl(elem);\n      });\n      var ltr = isBottomToTop ? info.layouts.bind(function (ls) {\n        return ls.onBottomLtr.map(function (f) {\n          return f(elem);\n        });\n      }).or(customLtr).getOr(defaultBottomLtr) : customLtr.getOr(defaultLtr);\n      var rtl = isBottomToTop ? info.layouts.bind(function (ls) {\n        return ls.onBottomRtl.map(function (f) {\n          return f(elem);\n        });\n      }).or(customRtl).getOr(defaultBottomRtl) : customRtl.getOr(defaultRtl);\n      var f = onDirection(ltr, rtl);\n      return f(elem);\n    };\n\n    var placement = function (component, anchorInfo, origin) {\n      var hotspot = anchorInfo.hotspot;\n      var anchorBox = toBox(origin, hotspot.element());\n      var layouts = get$a(component.element(), anchorInfo, belowOrAbove(), belowOrAboveRtl(), aboveOrBelow(), aboveOrBelowRtl(), Option.some(anchorInfo.hotspot.element()));\n      return Option.some(nu$9({\n        anchorBox: anchorBox,\n        bubble: anchorInfo.bubble.getOr(fallback()),\n        overrides: anchorInfo.overrides,\n        layouts: layouts,\n        placer: Option.none()\n      }));\n    };\n    var HotspotAnchor = [\n      strict$1('hotspot'),\n      option('bubble'),\n      defaulted$1('overrides', {}),\n      schema$1(),\n      output('placement', placement)\n    ];\n\n    var placement$1 = function (component, anchorInfo, origin) {\n      var pos = translate(origin, anchorInfo.x, anchorInfo.y);\n      var anchorBox = bounds$1(pos.left(), pos.top(), anchorInfo.width, anchorInfo.height);\n      var layouts = get$a(component.element(), anchorInfo, all$2(), allRtl(), all$2(), allRtl(), Option.none());\n      return Option.some(nu$9({\n        anchorBox: anchorBox,\n        bubble: anchorInfo.bubble,\n        overrides: anchorInfo.overrides,\n        layouts: layouts,\n        placer: Option.none()\n      }));\n    };\n    var MakeshiftAnchor = [\n      strict$1('x'),\n      strict$1('y'),\n      defaulted$1('height', 0),\n      defaulted$1('width', 0),\n      defaulted$1('bubble', fallback()),\n      defaulted$1('overrides', {}),\n      schema$1(),\n      output('placement', placement$1)\n    ];\n\n    var zeroWidth = '\\uFEFF';\n    var nbsp = '\\xA0';\n\n    var create$2 = Immutable('start', 'soffset', 'finish', 'foffset');\n    var SimRange = { create: create$2 };\n\n    var adt$5 = Adt.generate([\n      { before: ['element'] },\n      {\n        on: [\n          'element',\n          'offset'\n        ]\n      },\n      { after: ['element'] }\n    ]);\n    var cata$2 = function (subject, onBefore, onOn, onAfter) {\n      return subject.fold(onBefore, onOn, onAfter);\n    };\n    var getStart = function (situ) {\n      return situ.fold(identity, identity, identity);\n    };\n    var before$2 = adt$5.before;\n    var on = adt$5.on;\n    var after$1 = adt$5.after;\n    var Situ = {\n      before: before$2,\n      on: on,\n      after: after$1,\n      cata: cata$2,\n      getStart: getStart\n    };\n\n    var adt$6 = Adt.generate([\n      { domRange: ['rng'] },\n      {\n        relative: [\n          'startSitu',\n          'finishSitu'\n        ]\n      },\n      {\n        exact: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    var exactFromRange = function (simRange) {\n      return adt$6.exact(simRange.start(), simRange.soffset(), simRange.finish(), simRange.foffset());\n    };\n    var getStart$1 = function (selection) {\n      return selection.match({\n        domRange: function (rng) {\n          return Element.fromDom(rng.startContainer);\n        },\n        relative: function (startSitu, finishSitu) {\n          return Situ.getStart(startSitu);\n        },\n        exact: function (start, soffset, finish, foffset) {\n          return start;\n        }\n      });\n    };\n    var domRange = adt$6.domRange;\n    var relative$1 = adt$6.relative;\n    var exact = adt$6.exact;\n    var getWin = function (selection) {\n      var start = getStart$1(selection);\n      return defaultView(start);\n    };\n    var range$1 = SimRange.create;\n    var Selection = {\n      domRange: domRange,\n      relative: relative$1,\n      exact: exact,\n      exactFromRange: exactFromRange,\n      getWin: getWin,\n      range: range$1\n    };\n\n    var setStart = function (rng, situ) {\n      situ.fold(function (e) {\n        rng.setStartBefore(e.dom());\n      }, function (e, o) {\n        rng.setStart(e.dom(), o);\n      }, function (e) {\n        rng.setStartAfter(e.dom());\n      });\n    };\n    var setFinish = function (rng, situ) {\n      situ.fold(function (e) {\n        rng.setEndBefore(e.dom());\n      }, function (e, o) {\n        rng.setEnd(e.dom(), o);\n      }, function (e) {\n        rng.setEndAfter(e.dom());\n      });\n    };\n    var relativeToNative = function (win, startSitu, finishSitu) {\n      var range = win.document.createRange();\n      setStart(range, startSitu);\n      setFinish(range, finishSitu);\n      return range;\n    };\n    var exactToNative = function (win, start, soffset, finish, foffset) {\n      var rng = win.document.createRange();\n      rng.setStart(start.dom(), soffset);\n      rng.setEnd(finish.dom(), foffset);\n      return rng;\n    };\n    var toRect = function (rect) {\n      return {\n        left: constant(rect.left),\n        top: constant(rect.top),\n        right: constant(rect.right),\n        bottom: constant(rect.bottom),\n        width: constant(rect.width),\n        height: constant(rect.height)\n      };\n    };\n    var getFirstRect = function (rng) {\n      var rects = rng.getClientRects();\n      var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect();\n      return rect.width > 0 || rect.height > 0 ? Option.some(rect).map(toRect) : Option.none();\n    };\n\n    var adt$7 = Adt.generate([\n      {\n        ltr: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      },\n      {\n        rtl: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    var fromRange = function (win, type, range) {\n      return type(Element.fromDom(range.startContainer), range.startOffset, Element.fromDom(range.endContainer), range.endOffset);\n    };\n    var getRanges = function (win, selection) {\n      return selection.match({\n        domRange: function (rng) {\n          return {\n            ltr: constant(rng),\n            rtl: Option.none\n          };\n        },\n        relative: function (startSitu, finishSitu) {\n          return {\n            ltr: cached(function () {\n              return relativeToNative(win, startSitu, finishSitu);\n            }),\n            rtl: cached(function () {\n              return Option.some(relativeToNative(win, finishSitu, startSitu));\n            })\n          };\n        },\n        exact: function (start, soffset, finish, foffset) {\n          return {\n            ltr: cached(function () {\n              return exactToNative(win, start, soffset, finish, foffset);\n            }),\n            rtl: cached(function () {\n              return Option.some(exactToNative(win, finish, foffset, start, soffset));\n            })\n          };\n        }\n      });\n    };\n    var doDiagnose = function (win, ranges) {\n      var rng = ranges.ltr();\n      if (rng.collapsed) {\n        var reversed = ranges.rtl().filter(function (rev) {\n          return rev.collapsed === false;\n        });\n        return reversed.map(function (rev) {\n          return adt$7.rtl(Element.fromDom(rev.endContainer), rev.endOffset, Element.fromDom(rev.startContainer), rev.startOffset);\n        }).getOrThunk(function () {\n          return fromRange(win, adt$7.ltr, rng);\n        });\n      } else {\n        return fromRange(win, adt$7.ltr, rng);\n      }\n    };\n    var diagnose = function (win, selection) {\n      var ranges = getRanges(win, selection);\n      return doDiagnose(win, ranges);\n    };\n    var asLtrRange = function (win, selection) {\n      var diagnosis = diagnose(win, selection);\n      return diagnosis.match({\n        ltr: function (start, soffset, finish, foffset) {\n          var rng = win.document.createRange();\n          rng.setStart(start.dom(), soffset);\n          rng.setEnd(finish.dom(), foffset);\n          return rng;\n        },\n        rtl: function (start, soffset, finish, foffset) {\n          var rng = win.document.createRange();\n          rng.setStart(finish.dom(), foffset);\n          rng.setEnd(start.dom(), soffset);\n          return rng;\n        }\n      });\n    };\n    var ltr = adt$7.ltr;\n    var rtl = adt$7.rtl;\n\n    function NodeValue (is, name) {\n      var get = function (element) {\n        if (!is(element)) {\n          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');\n        }\n        return getOption(element).getOr('');\n      };\n      var getOption = function (element) {\n        return is(element) ? Option.from(element.dom().nodeValue) : Option.none();\n      };\n      var set = function (element, value) {\n        if (!is(element)) {\n          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');\n        }\n        element.dom().nodeValue = value;\n      };\n      return {\n        get: get,\n        getOption: getOption,\n        set: set\n      };\n    }\n\n    var api$2 = NodeValue(isText, 'text');\n    var get$b = function (element) {\n      return api$2.get(element);\n    };\n    var getOption = function (element) {\n      return api$2.getOption(element);\n    };\n\n    var getEnd = function (element) {\n      return name(element) === 'img' ? 1 : getOption(element).fold(function () {\n        return children(element).length;\n      }, function (v) {\n        return v.length;\n      });\n    };\n    var isTextNodeWithCursorPosition = function (el) {\n      return getOption(el).filter(function (text) {\n        return text.trim().length !== 0 || text.indexOf(nbsp) > -1;\n      }).isSome();\n    };\n    var elementsWithCursorPosition = [\n      'img',\n      'br'\n    ];\n    var isCursorPosition = function (elem) {\n      var hasCursorPosition = isTextNodeWithCursorPosition(elem);\n      return hasCursorPosition || contains(elementsWithCursorPosition, name(elem));\n    };\n\n    var last$1 = function (element) {\n      return descendantRtl(element, isCursorPosition);\n    };\n    var descendantRtl = function (scope, predicate) {\n      var descend = function (element) {\n        var children$1 = children(element);\n        for (var i = children$1.length - 1; i >= 0; i--) {\n          var child = children$1[i];\n          if (predicate(child)) {\n            return Option.some(child);\n          }\n          var res = descend(child);\n          if (res.isSome()) {\n            return res;\n          }\n        }\n        return Option.none();\n      };\n      return descend(scope);\n    };\n\n    var descendants = function (scope, selector) {\n      return all(selector, scope);\n    };\n\n    var makeRange = function (start, soffset, finish, foffset) {\n      var doc = owner(start);\n      var rng = doc.dom().createRange();\n      rng.setStart(start.dom(), soffset);\n      rng.setEnd(finish.dom(), foffset);\n      return rng;\n    };\n    var after$2 = function (start, soffset, finish, foffset) {\n      var r = makeRange(start, soffset, finish, foffset);\n      var same = eq(start, finish) && soffset === foffset;\n      return r.collapsed && !same;\n    };\n\n    var readRange = function (selection) {\n      if (selection.rangeCount > 0) {\n        var firstRng = selection.getRangeAt(0);\n        var lastRng = selection.getRangeAt(selection.rangeCount - 1);\n        return Option.some(SimRange.create(Element.fromDom(firstRng.startContainer), firstRng.startOffset, Element.fromDom(lastRng.endContainer), lastRng.endOffset));\n      } else {\n        return Option.none();\n      }\n    };\n    var doGetExact = function (selection) {\n      var anchor = Element.fromDom(selection.anchorNode);\n      var focus = Element.fromDom(selection.focusNode);\n      return after$2(anchor, selection.anchorOffset, focus, selection.focusOffset) ? Option.some(SimRange.create(anchor, selection.anchorOffset, focus, selection.focusOffset)) : readRange(selection);\n    };\n    var getExact = function (win) {\n      return Option.from(win.getSelection()).filter(function (sel) {\n        return sel.rangeCount > 0;\n      }).bind(doGetExact);\n    };\n    var getFirstRect$1 = function (win, selection) {\n      var rng = asLtrRange(win, selection);\n      return getFirstRect(rng);\n    };\n\n    var point = Immutable('element', 'offset');\n    var descendOnce = function (element, offset) {\n      var children$1 = children(element);\n      if (children$1.length === 0) {\n        return point(element, offset);\n      } else if (offset < children$1.length) {\n        return point(children$1[offset], 0);\n      } else {\n        var last = children$1[children$1.length - 1];\n        var len = isText(last) ? get$b(last).length : children(last).length;\n        return point(last, len);\n      }\n    };\n\n    var adt$8 = Adt.generate([\n      { screen: ['point'] },\n      {\n        absolute: [\n          'point',\n          'scrollLeft',\n          'scrollTop'\n        ]\n      }\n    ]);\n    var toFixed = function (pos) {\n      return pos.fold(identity, function (point, scrollLeft, scrollTop) {\n        return point.translate(-scrollLeft, -scrollTop);\n      });\n    };\n    var toAbsolute = function (pos) {\n      return pos.fold(identity, identity);\n    };\n    var sum = function (points) {\n      return foldl(points, function (b, a) {\n        return b.translate(a.left(), a.top());\n      }, Position(0, 0));\n    };\n    var sumAsFixed = function (positions) {\n      var points = map(positions, toFixed);\n      return sum(points);\n    };\n    var sumAsAbsolute = function (positions) {\n      var points = map(positions, toAbsolute);\n      return sum(points);\n    };\n    var screen = adt$8.screen;\n    var absolute$2 = adt$8.absolute;\n\n    var getOffset = function (component, origin, anchorInfo) {\n      var win = defaultView(anchorInfo.root).dom();\n      var hasSameOwner = function (frame) {\n        var frameOwner = owner(frame);\n        var compOwner = owner(component.element());\n        return eq(frameOwner, compOwner);\n      };\n      return Option.from(win.frameElement).map(Element.fromDom).filter(hasSameOwner).map(absolute);\n    };\n    var getRootPoint = function (component, origin, anchorInfo) {\n      var doc = owner(component.element());\n      var outerScroll = get$8(doc);\n      var offset = getOffset(component, origin, anchorInfo).getOr(outerScroll);\n      return absolute$2(offset, outerScroll.left(), outerScroll.top());\n    };\n\n    var capRect = function (left, top, width, height) {\n      var newLeft = left, newTop = top, newWidth = width, newHeight = height;\n      if (left < 0) {\n        newLeft = 0;\n        newWidth = width + left;\n      }\n      if (top < 0) {\n        newTop = 0;\n        newHeight = height + top;\n      }\n      var point = screen(Position(newLeft, newTop));\n      return Option.some(pointed(point, newWidth, newHeight));\n    };\n    var calcNewAnchor = function (optBox, rootPoint, anchorInfo, origin, elem) {\n      return optBox.map(function (box) {\n        var points = [\n          rootPoint,\n          box.point()\n        ];\n        var topLeft = cata$1(origin, function () {\n          return sumAsAbsolute(points);\n        }, function () {\n          return sumAsAbsolute(points);\n        }, function () {\n          return sumAsFixed(points);\n        });\n        var anchorBox = rect(topLeft.left(), topLeft.top(), box.width(), box.height());\n        var layoutsLtr = anchorInfo.showAbove ? aboveOrBelow() : belowOrAbove();\n        var layoutsRtl = anchorInfo.showAbove ? belowOrAboveRtl() : belowOrAboveRtl();\n        var layouts = get$a(elem, anchorInfo, layoutsLtr, layoutsRtl, layoutsLtr, layoutsRtl, Option.none());\n        return nu$9({\n          anchorBox: anchorBox,\n          bubble: anchorInfo.bubble.getOr(fallback()),\n          overrides: anchorInfo.overrides,\n          layouts: layouts,\n          placer: Option.none()\n        });\n      });\n    };\n    var ContentAnchorCommon = {\n      capRect: capRect,\n      calcNewAnchor: calcNewAnchor\n    };\n\n    var point$1 = Immutable('element', 'offset');\n    var descendOnce$1 = function (element, offset) {\n      return isText(element) ? point$1(element, offset) : descendOnce(element, offset);\n    };\n    var getAnchorSelection = function (win, anchorInfo) {\n      var getSelection = anchorInfo.getSelection.getOrThunk(function () {\n        return function () {\n          return getExact(win);\n        };\n      });\n      return getSelection().map(function (sel) {\n        var modStart = descendOnce$1(sel.start(), sel.soffset());\n        var modFinish = descendOnce$1(sel.finish(), sel.foffset());\n        return Selection.range(modStart.element(), modStart.offset(), modFinish.element(), modFinish.offset());\n      });\n    };\n    var placement$2 = function (component, anchorInfo, origin) {\n      var win = defaultView(anchorInfo.root).dom();\n      var rootPoint = getRootPoint(component, origin, anchorInfo);\n      var selectionBox = getAnchorSelection(win, anchorInfo).bind(function (sel) {\n        var optRect = getFirstRect$1(win, Selection.exactFromRange(sel)).orThunk(function () {\n          var x = Element.fromText(zeroWidth);\n          before(sel.start(), x);\n          return getFirstRect$1(win, Selection.exact(x, 0, x, 1)).map(function (rect) {\n            remove(x);\n            return rect;\n          });\n        });\n        return optRect.bind(function (rawRect) {\n          return ContentAnchorCommon.capRect(rawRect.left(), rawRect.top(), rawRect.width(), rawRect.height());\n        });\n      });\n      var targetElement = getAnchorSelection(win, anchorInfo).bind(function (sel) {\n        return isElement(sel.start()) ? Option.some(sel.start()) : parent(sel.start());\n      });\n      var elem = targetElement.getOr(component.element());\n      return ContentAnchorCommon.calcNewAnchor(selectionBox, rootPoint, anchorInfo, origin, elem);\n    };\n    var SelectionAnchor = [\n      option('getSelection'),\n      strict$1('root'),\n      option('bubble'),\n      schema$1(),\n      defaulted$1('overrides', {}),\n      defaulted$1('showAbove', false),\n      output('placement', placement$2)\n    ];\n\n    var placement$3 = function (component, anchorInfo, origin) {\n      var rootPoint = getRootPoint(component, origin, anchorInfo);\n      return anchorInfo.node.bind(function (target) {\n        var rect = target.dom().getBoundingClientRect();\n        var nodeBox = ContentAnchorCommon.capRect(rect.left, rect.top, rect.width, rect.height);\n        var elem = anchorInfo.node.getOr(component.element());\n        return ContentAnchorCommon.calcNewAnchor(nodeBox, rootPoint, anchorInfo, origin, elem);\n      });\n    };\n    var NodeAnchor = [\n      strict$1('node'),\n      strict$1('root'),\n      option('bubble'),\n      schema$1(),\n      defaulted$1('overrides', {}),\n      defaulted$1('showAbove', false),\n      output('placement', placement$3)\n    ];\n\n    var eastX$1 = function (anchor) {\n      return anchor.x() + anchor.width();\n    };\n    var westX$1 = function (anchor, element) {\n      return anchor.x() - element.width();\n    };\n    var northY$1 = function (anchor, element) {\n      return anchor.y() - element.height() + anchor.height();\n    };\n    var southY$1 = function (anchor) {\n      return anchor.y();\n    };\n    var southeast$2 = function (anchor, element, bubbles) {\n      return nu$7(eastX$1(anchor), southY$1(anchor), bubbles.southeast(), southeast(), boundsRestriction(anchor, {\n        left: 0,\n        top: 2\n      }), 'link-layout-se');\n    };\n    var southwest$2 = function (anchor, element, bubbles) {\n      return nu$7(westX$1(anchor, element), southY$1(anchor), bubbles.southwest(), southwest(), boundsRestriction(anchor, {\n        right: 1,\n        top: 2\n      }), 'link-layout-sw');\n    };\n    var northeast$2 = function (anchor, element, bubbles) {\n      return nu$7(eastX$1(anchor), northY$1(anchor, element), bubbles.northeast(), northeast(), boundsRestriction(anchor, {\n        left: 0,\n        bottom: 3\n      }), 'link-layout-ne');\n    };\n    var northwest$2 = function (anchor, element, bubbles) {\n      return nu$7(westX$1(anchor, element), northY$1(anchor, element), bubbles.northwest(), northwest(), boundsRestriction(anchor, {\n        right: 1,\n        bottom: 3\n      }), 'link-layout-nw');\n    };\n    var all$3 = function () {\n      return [\n        southeast$2,\n        southwest$2,\n        northeast$2,\n        northwest$2\n      ];\n    };\n    var allRtl$1 = function () {\n      return [\n        southwest$2,\n        southeast$2,\n        northwest$2,\n        northeast$2\n      ];\n    };\n\n    var placement$4 = function (component, submenuInfo, origin) {\n      var anchorBox = toBox(origin, submenuInfo.item.element());\n      var layouts = get$a(component.element(), submenuInfo, all$3(), allRtl$1(), all$3(), allRtl$1(), Option.none());\n      return Option.some(nu$9({\n        anchorBox: anchorBox,\n        bubble: fallback(),\n        overrides: submenuInfo.overrides,\n        layouts: layouts,\n        placer: Option.none()\n      }));\n    };\n    var SubmenuAnchor = [\n      strict$1('item'),\n      schema$1(),\n      defaulted$1('overrides', {}),\n      output('placement', placement$4)\n    ];\n\n    var AnchorSchema = choose$1('anchor', {\n      selection: SelectionAnchor,\n      node: NodeAnchor,\n      hotspot: HotspotAnchor,\n      submenu: SubmenuAnchor,\n      makeshift: MakeshiftAnchor\n    });\n\n    var getFixedOrigin = function () {\n      var html = domGlobals.document.documentElement;\n      return fixed(0, 0, html.clientWidth, html.clientHeight);\n    };\n    var getRelativeOrigin = function (component) {\n      var position = absolute(component.element());\n      var bounds = component.element().dom().getBoundingClientRect();\n      return relative(position.left(), position.top(), bounds.width, bounds.height);\n    };\n    var place = function (component, origin, anchoring, getBounds, placee) {\n      var anchor = box$1(anchoring.anchorBox, origin);\n      simple(anchor, placee.element(), anchoring.bubble, anchoring.layouts, getBounds, anchoring.overrides);\n    };\n    var position$1 = function (component, posConfig, posState, anchor, placee) {\n      positionWithin(component, posConfig, posState, anchor, placee, Option.none());\n    };\n    var positionWithin = function (component, posConfig, posState, anchor, placee, boxElement) {\n      var boundsBox = boxElement.map(box);\n      return positionWithinBounds(component, posConfig, posState, anchor, placee, boundsBox);\n    };\n    var positionWithinBounds = function (component, posConfig, posState, anchor, placee, bounds) {\n      var anchorage = asRawOrDie('positioning anchor.info', AnchorSchema, anchor);\n      preserve(function () {\n        set$2(placee.element(), 'position', 'fixed');\n        var oldVisibility = getRaw(placee.element(), 'visibility');\n        set$2(placee.element(), 'visibility', 'hidden');\n        var origin = posConfig.useFixed() ? getFixedOrigin() : getRelativeOrigin(component);\n        var placer = anchorage.placement;\n        var getBounds = bounds.map(constant).or(posConfig.getBounds);\n        placer(component, anchorage, origin).each(function (anchoring) {\n          var doPlace = anchoring.placer.getOr(place);\n          doPlace(component, origin, anchoring, getBounds, placee);\n        });\n        oldVisibility.fold(function () {\n          remove$6(placee.element(), 'visibility');\n        }, function (vis) {\n          set$2(placee.element(), 'visibility', vis);\n        });\n        if (getRaw(placee.element(), 'left').isNone() && getRaw(placee.element(), 'top').isNone() && getRaw(placee.element(), 'right').isNone() && getRaw(placee.element(), 'bottom').isNone() && getRaw(placee.element(), 'position').is('fixed')) {\n          remove$6(placee.element(), 'position');\n        }\n      }, placee.element());\n    };\n    var getMode = function (component, pConfig, pState) {\n      return pConfig.useFixed() ? 'fixed' : 'absolute';\n    };\n\n    var PositionApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        position: position$1,\n        positionWithin: positionWithin,\n        positionWithinBounds: positionWithinBounds,\n        getMode: getMode\n    });\n\n    var PositionSchema = [\n      defaulted$1('useFixed', never),\n      option('getBounds')\n    ];\n\n    var Positioning = create$1({\n      fields: PositionSchema,\n      name: 'positioning',\n      active: ActivePosition,\n      apis: PositionApis\n    });\n\n    var fireDetaching = function (component) {\n      emit(component, detachedFromDom());\n      var children = component.components();\n      each(children, fireDetaching);\n    };\n    var fireAttaching = function (component) {\n      var children = component.components();\n      each(children, fireAttaching);\n      emit(component, attachedToDom());\n    };\n    var attach = function (parent, child) {\n      append(parent.element(), child.element());\n    };\n    var detachChildren = function (component) {\n      each(component.components(), function (childComp) {\n        return remove(childComp.element());\n      });\n      empty(component.element());\n      component.syncComponents();\n    };\n    var replaceChildren = function (component, newChildren) {\n      var subs = component.components();\n      detachChildren(component);\n      var deleted = difference(subs, newChildren);\n      each(deleted, function (comp) {\n        fireDetaching(comp);\n        component.getSystem().removeFromWorld(comp);\n      });\n      each(newChildren, function (childComp) {\n        if (!childComp.getSystem().isConnected()) {\n          component.getSystem().addToWorld(childComp);\n          attach(component, childComp);\n          if (inBody(component.element())) {\n            fireAttaching(childComp);\n          }\n        } else {\n          attach(component, childComp);\n        }\n        component.syncComponents();\n      });\n    };\n\n    var attach$1 = function (parent, child) {\n      attachWith(parent, child, append);\n    };\n    var attachWith = function (parent, child, insertion) {\n      parent.getSystem().addToWorld(child);\n      insertion(parent.element(), child.element());\n      if (inBody(parent.element())) {\n        fireAttaching(child);\n      }\n      parent.syncComponents();\n    };\n    var doDetach = function (component) {\n      fireDetaching(component);\n      remove(component.element());\n      component.getSystem().removeFromWorld(component);\n    };\n    var detach = function (component) {\n      var parent$1 = parent(component.element()).bind(function (p) {\n        return component.getSystem().getByDom(p).toOption();\n      });\n      doDetach(component);\n      parent$1.each(function (p) {\n        p.syncComponents();\n      });\n    };\n    var detachChildren$1 = function (component) {\n      var subs = component.components();\n      each(subs, doDetach);\n      empty(component.element());\n      component.syncComponents();\n    };\n    var attachSystem = function (element, guiSystem) {\n      attachSystemWith(element, guiSystem, append);\n    };\n    var attachSystemAfter = function (element, guiSystem) {\n      attachSystemWith(element, guiSystem, after);\n    };\n    var attachSystemWith = function (element, guiSystem, inserter) {\n      inserter(element, guiSystem.element());\n      var children$1 = children(guiSystem.element());\n      each(children$1, function (child) {\n        guiSystem.getByDom(child).each(fireAttaching);\n      });\n    };\n    var detachSystem = function (guiSystem) {\n      var children$1 = children(guiSystem.element());\n      each(children$1, function (child) {\n        guiSystem.getByDom(child).each(fireDetaching);\n      });\n      remove(guiSystem.element());\n    };\n\n    var rebuild = function (sandbox, sConfig, sState, data) {\n      sState.get().each(function (data) {\n        detachChildren$1(sandbox);\n      });\n      var point = sConfig.getAttachPoint(sandbox);\n      attach$1(point, sandbox);\n      var built = sandbox.getSystem().build(data);\n      attach$1(sandbox, built);\n      sState.set(built);\n      return built;\n    };\n    var open = function (sandbox, sConfig, sState, data) {\n      var newState = rebuild(sandbox, sConfig, sState, data);\n      sConfig.onOpen(sandbox, newState);\n      return newState;\n    };\n    var setContent = function (sandbox, sConfig, sState, data) {\n      return sState.get().map(function () {\n        return rebuild(sandbox, sConfig, sState, data);\n      });\n    };\n    var openWhileCloaked = function (sandbox, sConfig, sState, data, transaction) {\n      cloak(sandbox, sConfig);\n      open(sandbox, sConfig, sState, data);\n      transaction();\n      decloak(sandbox, sConfig);\n    };\n    var close = function (sandbox, sConfig, sState) {\n      sState.get().each(function (data) {\n        detachChildren$1(sandbox);\n        detach(sandbox);\n        sConfig.onClose(sandbox, data);\n        sState.clear();\n      });\n    };\n    var isOpen = function (sandbox, sConfig, sState) {\n      return sState.isOpen();\n    };\n    var isPartOf$1 = function (sandbox, sConfig, sState, queryElem) {\n      return isOpen(sandbox, sConfig, sState) && sState.get().exists(function (data) {\n        return sConfig.isPartOf(sandbox, data, queryElem);\n      });\n    };\n    var getState = function (sandbox, sConfig, sState) {\n      return sState.get();\n    };\n    var store = function (sandbox, cssKey, attr, newValue) {\n      getRaw(sandbox.element(), cssKey).fold(function () {\n        remove$1(sandbox.element(), attr);\n      }, function (v) {\n        set$1(sandbox.element(), attr, v);\n      });\n      set$2(sandbox.element(), cssKey, newValue);\n    };\n    var restore = function (sandbox, cssKey, attr) {\n      if (has$1(sandbox.element(), attr)) {\n        var oldValue = get$2(sandbox.element(), attr);\n        set$2(sandbox.element(), cssKey, oldValue);\n      } else {\n        remove$6(sandbox.element(), cssKey);\n      }\n    };\n    var cloak = function (sandbox, sConfig, sState) {\n      var sink = sConfig.getAttachPoint(sandbox);\n      set$2(sandbox.element(), 'position', Positioning.getMode(sink));\n      store(sandbox, 'visibility', sConfig.cloakVisibilityAttr, 'hidden');\n    };\n    var hasPosition = function (element) {\n      return exists([\n        'top',\n        'left',\n        'right',\n        'bottom'\n      ], function (pos) {\n        return getRaw(element, pos).isSome();\n      });\n    };\n    var decloak = function (sandbox, sConfig, sState) {\n      if (!hasPosition(sandbox.element())) {\n        remove$6(sandbox.element(), 'position');\n      }\n      restore(sandbox, 'visibility', sConfig.cloakVisibilityAttr);\n    };\n\n    var SandboxApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        cloak: cloak,\n        decloak: decloak,\n        open: open,\n        openWhileCloaked: openWhileCloaked,\n        close: close,\n        isOpen: isOpen,\n        isPartOf: isPartOf$1,\n        getState: getState,\n        setContent: setContent\n    });\n\n    var events$2 = function (sandboxConfig, sandboxState) {\n      return derive([run(sandboxClose(), function (sandbox, simulatedEvent) {\n          close(sandbox, sandboxConfig, sandboxState);\n        })]);\n    };\n\n    var ActiveSandbox = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$2\n    });\n\n    var SandboxSchema = [\n      onHandler('onOpen'),\n      onHandler('onClose'),\n      strict$1('isPartOf'),\n      strict$1('getAttachPoint'),\n      defaulted$1('cloakVisibilityAttr', 'data-precloak-visibility')\n    ];\n\n    var init = function () {\n      var contents = Cell(Option.none());\n      var readState = constant('not-implemented');\n      var isOpen = function () {\n        return contents.get().isSome();\n      };\n      var set = function (comp) {\n        contents.set(Option.some(comp));\n      };\n      var get = function () {\n        return contents.get();\n      };\n      var clear = function () {\n        contents.set(Option.none());\n      };\n      return nu$5({\n        readState: readState,\n        isOpen: isOpen,\n        clear: clear,\n        set: set,\n        get: get\n      });\n    };\n\n    var SandboxState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init\n    });\n\n    var Sandboxing = create$1({\n      fields: SandboxSchema,\n      name: 'sandboxing',\n      active: ActiveSandbox,\n      apis: SandboxApis,\n      state: SandboxState\n    });\n\n    var dismissPopups = constant('dismiss.popups');\n    var repositionPopups = constant('reposition.popups');\n    var mouseReleased = constant('mouse.released');\n\n    var schema$2 = objOfOnly([\n      defaulted$1('isExtraPart', constant(false)),\n      optionObjOf('fireEventInstead', [defaulted$1('event', dismissRequested())])\n    ]);\n    var receivingChannel = function (rawSpec) {\n      var _a;\n      var detail = asRawOrDie('Dismissal', schema$2, rawSpec);\n      return _a = {}, _a[dismissPopups()] = {\n        schema: objOfOnly([strict$1('target')]),\n        onReceive: function (sandbox, data) {\n          if (Sandboxing.isOpen(sandbox)) {\n            var isPart = Sandboxing.isPartOf(sandbox, data.target) || detail.isExtraPart(sandbox, data.target);\n            if (!isPart) {\n              detail.fireEventInstead.fold(function () {\n                return Sandboxing.close(sandbox);\n              }, function (fe) {\n                return emit(sandbox, fe.event);\n              });\n            }\n          }\n        }\n      }, _a;\n    };\n\n    var schema$3 = objOfOnly([\n      optionObjOf('fireEventInstead', [defaulted$1('event', repositionRequested())]),\n      strictFunction('doReposition')\n    ]);\n    var receivingChannel$1 = function (rawSpec) {\n      var _a;\n      var detail = asRawOrDie('Reposition', schema$3, rawSpec);\n      return _a = {}, _a[repositionPopups()] = {\n        onReceive: function (sandbox) {\n          if (Sandboxing.isOpen(sandbox)) {\n            detail.fireEventInstead.fold(function () {\n              return detail.doReposition(sandbox);\n            }, function (fe) {\n              return emit(sandbox, fe.event);\n            });\n          }\n        }\n      }, _a;\n    };\n\n    var onLoad = function (component, repConfig, repState) {\n      repConfig.store.manager.onLoad(component, repConfig, repState);\n    };\n    var onUnload = function (component, repConfig, repState) {\n      repConfig.store.manager.onUnload(component, repConfig, repState);\n    };\n    var setValue = function (component, repConfig, repState, data) {\n      repConfig.store.manager.setValue(component, repConfig, repState, data);\n    };\n    var getValue = function (component, repConfig, repState) {\n      return repConfig.store.manager.getValue(component, repConfig, repState);\n    };\n    var getState$1 = function (component, repConfig, repState) {\n      return repState;\n    };\n\n    var RepresentApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        onLoad: onLoad,\n        onUnload: onUnload,\n        setValue: setValue,\n        getValue: getValue,\n        getState: getState$1\n    });\n\n    var events$3 = function (repConfig, repState) {\n      var es = repConfig.resetOnDom ? [\n        runOnAttached(function (comp, se) {\n          onLoad(comp, repConfig, repState);\n        }),\n        runOnDetached(function (comp, se) {\n          onUnload(comp, repConfig, repState);\n        })\n      ] : [loadEvent(repConfig, repState, onLoad)];\n      return derive(es);\n    };\n\n    var ActiveRepresenting = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$3\n    });\n\n    var memory = function () {\n      var data = Cell(null);\n      var readState = function () {\n        return {\n          mode: 'memory',\n          value: data.get()\n        };\n      };\n      var isNotSet = function () {\n        return data.get() === null;\n      };\n      var clear = function () {\n        data.set(null);\n      };\n      return nu$5({\n        set: data.set,\n        get: data.get,\n        isNotSet: isNotSet,\n        clear: clear,\n        readState: readState\n      });\n    };\n    var manual = function () {\n      var readState = function () {\n      };\n      return nu$5({ readState: readState });\n    };\n    var dataset = function () {\n      var dataByValue = Cell({});\n      var dataByText = Cell({});\n      var readState = function () {\n        return {\n          mode: 'dataset',\n          dataByValue: dataByValue.get(),\n          dataByText: dataByText.get()\n        };\n      };\n      var clear = function () {\n        dataByValue.set({});\n        dataByText.set({});\n      };\n      var lookup = function (itemString) {\n        return get(dataByValue.get(), itemString).orThunk(function () {\n          return get(dataByText.get(), itemString);\n        });\n      };\n      var update = function (items) {\n        var currentDataByValue = dataByValue.get();\n        var currentDataByText = dataByText.get();\n        var newDataByValue = {};\n        var newDataByText = {};\n        each(items, function (item) {\n          newDataByValue[item.value] = item;\n          get(item, 'meta').each(function (meta) {\n            get(meta, 'text').each(function (text) {\n              newDataByText[text] = item;\n            });\n          });\n        });\n        dataByValue.set(__assign(__assign({}, currentDataByValue), newDataByValue));\n        dataByText.set(__assign(__assign({}, currentDataByText), newDataByText));\n      };\n      return nu$5({\n        readState: readState,\n        lookup: lookup,\n        update: update,\n        clear: clear\n      });\n    };\n    var init$1 = function (spec) {\n      return spec.store.manager.state(spec);\n    };\n\n    var RepresentState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        memory: memory,\n        dataset: dataset,\n        manual: manual,\n        init: init$1\n    });\n\n    var setValue$1 = function (component, repConfig, repState, data) {\n      var store = repConfig.store;\n      repState.update([data]);\n      store.setValue(component, data);\n      repConfig.onSetValue(component, data);\n    };\n    var getValue$1 = function (component, repConfig, repState) {\n      var store = repConfig.store;\n      var key = store.getDataKey(component);\n      return repState.lookup(key).fold(function () {\n        return store.getFallbackEntry(key);\n      }, function (data) {\n        return data;\n      });\n    };\n    var onLoad$1 = function (component, repConfig, repState) {\n      var store = repConfig.store;\n      store.initialValue.each(function (data) {\n        setValue$1(component, repConfig, repState, data);\n      });\n    };\n    var onUnload$1 = function (component, repConfig, repState) {\n      repState.clear();\n    };\n    var DatasetStore = [\n      option('initialValue'),\n      strict$1('getFallbackEntry'),\n      strict$1('getDataKey'),\n      strict$1('setValue'),\n      output('manager', {\n        setValue: setValue$1,\n        getValue: getValue$1,\n        onLoad: onLoad$1,\n        onUnload: onUnload$1,\n        state: dataset\n      })\n    ];\n\n    var getValue$2 = function (component, repConfig, repState) {\n      return repConfig.store.getValue(component);\n    };\n    var setValue$2 = function (component, repConfig, repState, data) {\n      repConfig.store.setValue(component, data);\n      repConfig.onSetValue(component, data);\n    };\n    var onLoad$2 = function (component, repConfig, repState) {\n      repConfig.store.initialValue.each(function (data) {\n        repConfig.store.setValue(component, data);\n      });\n    };\n    var ManualStore = [\n      strict$1('getValue'),\n      defaulted$1('setValue', noop),\n      option('initialValue'),\n      output('manager', {\n        setValue: setValue$2,\n        getValue: getValue$2,\n        onLoad: onLoad$2,\n        onUnload: noop,\n        state: NoState.init\n      })\n    ];\n\n    var setValue$3 = function (component, repConfig, repState, data) {\n      repState.set(data);\n      repConfig.onSetValue(component, data);\n    };\n    var getValue$3 = function (component, repConfig, repState) {\n      return repState.get();\n    };\n    var onLoad$3 = function (component, repConfig, repState) {\n      repConfig.store.initialValue.each(function (initVal) {\n        if (repState.isNotSet()) {\n          repState.set(initVal);\n        }\n      });\n    };\n    var onUnload$2 = function (component, repConfig, repState) {\n      repState.clear();\n    };\n    var MemoryStore = [\n      option('initialValue'),\n      output('manager', {\n        setValue: setValue$3,\n        getValue: getValue$3,\n        onLoad: onLoad$3,\n        onUnload: onUnload$2,\n        state: memory\n      })\n    ];\n\n    var RepresentSchema = [\n      defaultedOf('store', { mode: 'memory' }, choose$1('mode', {\n        memory: MemoryStore,\n        manual: ManualStore,\n        dataset: DatasetStore\n      })),\n      onHandler('onSetValue'),\n      defaulted$1('resetOnDom', false)\n    ];\n\n    var Representing = create$1({\n      fields: RepresentSchema,\n      name: 'representing',\n      active: ActiveRepresenting,\n      apis: RepresentApis,\n      extra: {\n        setValueFrom: function (component, source) {\n          var value = Representing.getValue(source);\n          Representing.setValue(component, value);\n        }\n      },\n      state: RepresentState\n    });\n\n    var field$1 = function (name, forbidden) {\n      return defaultedObjOf(name, {}, map(forbidden, function (f) {\n        return forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name);\n      }).concat([state$1('dump', identity)]));\n    };\n    var get$c = function (data) {\n      return data.dump;\n    };\n    var augment = function (data, original) {\n      return __assign(__assign({}, data.dump), derive$1(original));\n    };\n    var SketchBehaviours = {\n      field: field$1,\n      augment: augment,\n      get: get$c\n    };\n\n    var _placeholder = 'placeholder';\n    var adt$9 = Adt.generate([\n      {\n        single: [\n          'required',\n          'valueThunk'\n        ]\n      },\n      {\n        multiple: [\n          'required',\n          'valueThunks'\n        ]\n      }\n    ]);\n    var isSubstituted = function (spec) {\n      return has(spec, 'uiType');\n    };\n    var subPlaceholder = function (owner, detail, compSpec, placeholders) {\n      if (owner.exists(function (o) {\n          return o !== compSpec.owner;\n        })) {\n        return adt$9.single(true, constant(compSpec));\n      }\n      return get(placeholders, compSpec.name).fold(function () {\n        throw new Error('Unknown placeholder component: ' + compSpec.name + '\\nKnown: [' + keys(placeholders) + ']\\nNamespace: ' + owner.getOr('none') + '\\nSpec: ' + JSON.stringify(compSpec, null, 2));\n      }, function (newSpec) {\n        return newSpec.replace();\n      });\n    };\n    var scan = function (owner, detail, compSpec, placeholders) {\n      if (isSubstituted(compSpec) && compSpec.uiType === _placeholder) {\n        return subPlaceholder(owner, detail, compSpec, placeholders);\n      } else {\n        return adt$9.single(false, constant(compSpec));\n      }\n    };\n    var substitute = function (owner, detail, compSpec, placeholders) {\n      var base = scan(owner, detail, compSpec, placeholders);\n      return base.fold(function (req, valueThunk) {\n        var value = isSubstituted(compSpec) ? valueThunk(detail, compSpec.config, compSpec.validated) : valueThunk(detail);\n        var childSpecs = get(value, 'components').getOr([]);\n        var substituted = bind(childSpecs, function (c) {\n          return substitute(owner, detail, c, placeholders);\n        });\n        return [__assign(__assign({}, value), { components: substituted })];\n      }, function (req, valuesThunk) {\n        if (isSubstituted(compSpec)) {\n          var values = valuesThunk(detail, compSpec.config, compSpec.validated);\n          var preprocessor = compSpec.validated.preprocess.getOr(identity);\n          return preprocessor(values);\n        } else {\n          return valuesThunk(detail);\n        }\n      });\n    };\n    var substituteAll = function (owner, detail, components, placeholders) {\n      return bind(components, function (c) {\n        return substitute(owner, detail, c, placeholders);\n      });\n    };\n    var oneReplace = function (label, replacements) {\n      var called = false;\n      var used = function () {\n        return called;\n      };\n      var replace = function () {\n        if (called) {\n          throw new Error('Trying to use the same placeholder more than once: ' + label);\n        }\n        called = true;\n        return replacements;\n      };\n      var required = function () {\n        return replacements.fold(function (req, _) {\n          return req;\n        }, function (req, _) {\n          return req;\n        });\n      };\n      return {\n        name: constant(label),\n        required: required,\n        used: used,\n        replace: replace\n      };\n    };\n    var substitutePlaces = function (owner, detail, components, placeholders) {\n      var ps = map$1(placeholders, function (ph, name) {\n        return oneReplace(name, ph);\n      });\n      var outcome = substituteAll(owner, detail, components, ps);\n      each$1(ps, function (p) {\n        if (p.used() === false && p.required()) {\n          throw new Error('Placeholder: ' + p.name() + ' was not found in components list\\nNamespace: ' + owner.getOr('none') + '\\nComponents: ' + JSON.stringify(detail.components, null, 2));\n        }\n      });\n      return outcome;\n    };\n    var single = adt$9.single;\n    var multiple = adt$9.multiple;\n    var placeholder = constant(_placeholder);\n\n    var adt$a = Adt.generate([\n      { required: ['data'] },\n      { external: ['data'] },\n      { optional: ['data'] },\n      { group: ['data'] }\n    ]);\n    var fFactory = defaulted$1('factory', { sketch: identity });\n    var fSchema = defaulted$1('schema', []);\n    var fName = strict$1('name');\n    var fPname = field('pname', 'pname', defaultedThunk(function (typeSpec) {\n      return '<alloy.' + generate$1(typeSpec.name) + '>';\n    }), anyValue$1());\n    var fGroupSchema = state$1('schema', function () {\n      return [option('preprocess')];\n    });\n    var fDefaults = defaulted$1('defaults', constant({}));\n    var fOverrides = defaulted$1('overrides', constant({}));\n    var requiredSpec = objOf([\n      fFactory,\n      fSchema,\n      fName,\n      fPname,\n      fDefaults,\n      fOverrides\n    ]);\n    var externalSpec = objOf([\n      fFactory,\n      fSchema,\n      fName,\n      fDefaults,\n      fOverrides\n    ]);\n    var optionalSpec = objOf([\n      fFactory,\n      fSchema,\n      fName,\n      fPname,\n      fDefaults,\n      fOverrides\n    ]);\n    var groupSpec = objOf([\n      fFactory,\n      fGroupSchema,\n      fName,\n      strict$1('unit'),\n      fPname,\n      fDefaults,\n      fOverrides\n    ]);\n    var asNamedPart = function (part) {\n      return part.fold(Option.some, Option.none, Option.some, Option.some);\n    };\n    var name$1 = function (part) {\n      var get = function (data) {\n        return data.name;\n      };\n      return part.fold(get, get, get, get);\n    };\n    var asCommon = function (part) {\n      return part.fold(identity, identity, identity, identity);\n    };\n    var convert = function (adtConstructor, partSchema) {\n      return function (spec) {\n        var data = asRawOrDie('Converting part type', partSchema, spec);\n        return adtConstructor(data);\n      };\n    };\n    var required = convert(adt$a.required, requiredSpec);\n    var external$1 = convert(adt$a.external, externalSpec);\n    var optional = convert(adt$a.optional, optionalSpec);\n    var group = convert(adt$a.group, groupSpec);\n    var original = constant('entirety');\n\n    var PartType = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        required: required,\n        external: external$1,\n        optional: optional,\n        group: group,\n        asNamedPart: asNamedPart,\n        name: name$1,\n        asCommon: asCommon,\n        original: original\n    });\n\n    var combine$2 = function (detail, data, partSpec, partValidated) {\n      return deepMerge(data.defaults(detail, partSpec, partValidated), partSpec, { uid: detail.partUids[data.name] }, data.overrides(detail, partSpec, partValidated));\n    };\n    var subs = function (owner, detail, parts) {\n      var internals = {};\n      var externals = {};\n      each(parts, function (part) {\n        part.fold(function (data) {\n          internals[data.pname] = single(true, function (detail, partSpec, partValidated) {\n            return data.factory.sketch(combine$2(detail, data, partSpec, partValidated));\n          });\n        }, function (data) {\n          var partSpec = detail.parts[data.name];\n          externals[data.name] = constant(data.factory.sketch(combine$2(detail, data, partSpec[original()]), partSpec));\n        }, function (data) {\n          internals[data.pname] = single(false, function (detail, partSpec, partValidated) {\n            return data.factory.sketch(combine$2(detail, data, partSpec, partValidated));\n          });\n        }, function (data) {\n          internals[data.pname] = multiple(true, function (detail, _partSpec, _partValidated) {\n            var units = detail[data.name];\n            return map(units, function (u) {\n              return data.factory.sketch(deepMerge(data.defaults(detail, u, _partValidated), u, data.overrides(detail, u)));\n            });\n          });\n        });\n      });\n      return {\n        internals: constant(internals),\n        externals: constant(externals)\n      };\n    };\n\n    var generate$4 = function (owner, parts) {\n      var r = {};\n      each(parts, function (part) {\n        asNamedPart(part).each(function (np) {\n          var g = doGenerateOne(owner, np.pname);\n          r[np.name] = function (config) {\n            var validated = asRawOrDie('Part: ' + np.name + ' in ' + owner, objOf(np.schema), config);\n            return __assign(__assign({}, g), {\n              config: config,\n              validated: validated\n            });\n          };\n        });\n      });\n      return r;\n    };\n    var doGenerateOne = function (owner, pname) {\n      return {\n        uiType: placeholder(),\n        owner: owner,\n        name: pname\n      };\n    };\n    var generateOne = function (owner, pname, config) {\n      return {\n        uiType: placeholder(),\n        owner: owner,\n        name: pname,\n        config: config,\n        validated: {}\n      };\n    };\n    var schemas = function (parts) {\n      return bind(parts, function (part) {\n        return part.fold(Option.none, Option.some, Option.none, Option.none).map(function (data) {\n          return strictObjOf(data.name, data.schema.concat([snapshot(original())]));\n        }).toArray();\n      });\n    };\n    var names = function (parts) {\n      return map(parts, name$1);\n    };\n    var substitutes = function (owner, detail, parts) {\n      return subs(owner, detail, parts);\n    };\n    var components = function (owner, detail, internals) {\n      return substitutePlaces(Option.some(owner), detail, detail.components, internals);\n    };\n    var getPart = function (component, detail, partKey) {\n      var uid = detail.partUids[partKey];\n      return component.getSystem().getByUid(uid).toOption();\n    };\n    var getPartOrDie = function (component, detail, partKey) {\n      return getPart(component, detail, partKey).getOrDie('Could not find part: ' + partKey);\n    };\n    var getParts = function (component, detail, partKeys) {\n      var r = {};\n      var uids = detail.partUids;\n      var system = component.getSystem();\n      each(partKeys, function (pk) {\n        r[pk] = constant(system.getByUid(uids[pk]));\n      });\n      return r;\n    };\n    var getAllParts = function (component, detail) {\n      var system = component.getSystem();\n      return map$1(detail.partUids, function (pUid, k) {\n        return constant(system.getByUid(pUid));\n      });\n    };\n    var getAllPartNames = function (detail) {\n      return keys(detail.partUids);\n    };\n    var getPartsOrDie = function (component, detail, partKeys) {\n      var r = {};\n      var uids = detail.partUids;\n      var system = component.getSystem();\n      each(partKeys, function (pk) {\n        r[pk] = constant(system.getByUid(uids[pk]).getOrDie());\n      });\n      return r;\n    };\n    var defaultUids = function (baseUid, partTypes) {\n      var partNames = names(partTypes);\n      return wrapAll$1(map(partNames, function (pn) {\n        return {\n          key: pn,\n          value: baseUid + '-' + pn\n        };\n      }));\n    };\n    var defaultUidsSchema = function (partTypes) {\n      return field('partUids', 'partUids', mergeWithThunk(function (spec) {\n        return defaultUids(spec.uid, partTypes);\n      }), anyValue$1());\n    };\n\n    var AlloyParts = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        generate: generate$4,\n        generateOne: generateOne,\n        schemas: schemas,\n        names: names,\n        substitutes: substitutes,\n        components: components,\n        defaultUids: defaultUids,\n        defaultUidsSchema: defaultUidsSchema,\n        getAllParts: getAllParts,\n        getAllPartNames: getAllPartNames,\n        getPart: getPart,\n        getPartOrDie: getPartOrDie,\n        getParts: getParts,\n        getPartsOrDie: getPartsOrDie\n    });\n\n    var base = function (partSchemas, partUidsSchemas) {\n      var ps = partSchemas.length > 0 ? [strictObjOf('parts', partSchemas)] : [];\n      return ps.concat([\n        strict$1('uid'),\n        defaulted$1('dom', {}),\n        defaulted$1('components', []),\n        snapshot('originalSpec'),\n        defaulted$1('debug.sketcher', {})\n      ]).concat(partUidsSchemas);\n    };\n    var asRawOrDie$1 = function (label, schema, spec, partSchemas, partUidsSchemas) {\n      var baseS = base(partSchemas, partUidsSchemas);\n      return asRawOrDie(label + ' [SpecSchema]', objOfOnly(baseS.concat(schema)), spec);\n    };\n\n    var single$1 = function (owner, schema, factory, spec) {\n      var specWithUid = supplyUid(spec);\n      var detail = asRawOrDie$1(owner, schema, specWithUid, [], []);\n      return factory(detail, specWithUid);\n    };\n    var composite = function (owner, schema, partTypes, factory, spec) {\n      var specWithUid = supplyUid(spec);\n      var partSchemas = schemas(partTypes);\n      var partUidsSchema = defaultUidsSchema(partTypes);\n      var detail = asRawOrDie$1(owner, schema, specWithUid, partSchemas, [partUidsSchema]);\n      var subs = substitutes(owner, detail, partTypes);\n      var components$1 = components(owner, detail, subs.internals());\n      return factory(detail, components$1, specWithUid, subs.externals());\n    };\n    var hasUid = function (spec) {\n      return has(spec, 'uid');\n    };\n    var supplyUid = function (spec) {\n      return hasUid(spec) ? spec : __assign(__assign({}, spec), { uid: generate$2('uid') });\n    };\n\n    function isSketchSpec(spec) {\n      return spec.uid !== undefined;\n    }\n    var singleSchema = objOfOnly([\n      strict$1('name'),\n      strict$1('factory'),\n      strict$1('configFields'),\n      defaulted$1('apis', {}),\n      defaulted$1('extraApis', {})\n    ]);\n    var compositeSchema = objOfOnly([\n      strict$1('name'),\n      strict$1('factory'),\n      strict$1('configFields'),\n      strict$1('partFields'),\n      defaulted$1('apis', {}),\n      defaulted$1('extraApis', {})\n    ]);\n    var single$2 = function (rawConfig) {\n      var config = asRawOrDie('Sketcher for ' + rawConfig.name, singleSchema, rawConfig);\n      var sketch = function (spec) {\n        return single$1(config.name, config.configFields, config.factory, spec);\n      };\n      var apis = map$1(config.apis, makeApi);\n      var extraApis = map$1(config.extraApis, function (f, k) {\n        return markAsExtraApi(f, k);\n      });\n      return __assign(__assign({\n        name: constant(config.name),\n        configFields: constant(config.configFields),\n        sketch: sketch\n      }, apis), extraApis);\n    };\n    var composite$1 = function (rawConfig) {\n      var config = asRawOrDie('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig);\n      var sketch = function (spec) {\n        return composite(config.name, config.configFields, config.partFields, config.factory, spec);\n      };\n      var parts = generate$4(config.name, config.partFields);\n      var apis = map$1(config.apis, makeApi);\n      var extraApis = map$1(config.extraApis, function (f, k) {\n        return markAsExtraApi(f, k);\n      });\n      return __assign(__assign({\n        name: constant(config.name),\n        partFields: constant(config.partFields),\n        configFields: constant(config.configFields),\n        sketch: sketch,\n        parts: constant(parts)\n      }, apis), extraApis);\n    };\n\n    var cat = function (arr) {\n      var r = [];\n      var push = function (x) {\n        r.push(x);\n      };\n      for (var i = 0; i < arr.length; i++) {\n        arr[i].each(push);\n      }\n      return r;\n    };\n    var sequence = function (arr) {\n      var r = [];\n      for (var i = 0; i < arr.length; i++) {\n        var x = arr[i];\n        if (x.isSome()) {\n          r.push(x.getOrDie());\n        } else {\n          return Option.none();\n        }\n      }\n      return Option.some(r);\n    };\n    var lift2 = function (oa, ob, f) {\n      return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none();\n    };\n    var lift3 = function (oa, ob, oc, f) {\n      return oa.isSome() && ob.isSome() && oc.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Option.none();\n    };\n\n    var inside = function (target) {\n      return name(target) === 'input' && get$2(target, 'type') !== 'radio' || name(target) === 'textarea';\n    };\n\n    var getCurrent = function (component, composeConfig, composeState) {\n      return composeConfig.find(component);\n    };\n\n    var ComposeApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getCurrent: getCurrent\n    });\n\n    var ComposeSchema = [strict$1('find')];\n\n    var Composing = create$1({\n      fields: ComposeSchema,\n      name: 'composing',\n      apis: ComposeApis\n    });\n\n    var dehighlightAllExcept = function (component, hConfig, hState, skip) {\n      var highlighted = descendants(component.element(), '.' + hConfig.highlightClass);\n      each(highlighted, function (h) {\n        if (!exists(skip, function (skipComp) {\n            return skipComp.element() === h;\n          })) {\n          remove$4(h, hConfig.highlightClass);\n          component.getSystem().getByDom(h).each(function (target) {\n            hConfig.onDehighlight(component, target);\n            emit(target, dehighlight());\n          });\n        }\n      });\n    };\n    var dehighlightAll = function (component, hConfig, hState) {\n      return dehighlightAllExcept(component, hConfig, hState, []);\n    };\n    var dehighlight$1 = function (component, hConfig, hState, target) {\n      if (isHighlighted(component, hConfig, hState, target)) {\n        remove$4(target.element(), hConfig.highlightClass);\n        hConfig.onDehighlight(component, target);\n        emit(target, dehighlight());\n      }\n    };\n    var highlight$1 = function (component, hConfig, hState, target) {\n      dehighlightAllExcept(component, hConfig, hState, [target]);\n      if (!isHighlighted(component, hConfig, hState, target)) {\n        add$2(target.element(), hConfig.highlightClass);\n        hConfig.onHighlight(component, target);\n        emit(target, highlight());\n      }\n    };\n    var highlightFirst = function (component, hConfig, hState) {\n      getFirst(component, hConfig).each(function (firstComp) {\n        highlight$1(component, hConfig, hState, firstComp);\n      });\n    };\n    var highlightLast = function (component, hConfig, hState) {\n      getLast(component, hConfig).each(function (lastComp) {\n        highlight$1(component, hConfig, hState, lastComp);\n      });\n    };\n    var highlightAt = function (component, hConfig, hState, index) {\n      getByIndex(component, hConfig, hState, index).fold(function (err) {\n        throw new Error(err);\n      }, function (firstComp) {\n        highlight$1(component, hConfig, hState, firstComp);\n      });\n    };\n    var highlightBy = function (component, hConfig, hState, predicate) {\n      var candidates = getCandidates(component, hConfig);\n      var targetComp = find(candidates, predicate);\n      targetComp.each(function (c) {\n        highlight$1(component, hConfig, hState, c);\n      });\n    };\n    var isHighlighted = function (component, hConfig, hState, queryTarget) {\n      return has$2(queryTarget.element(), hConfig.highlightClass);\n    };\n    var getHighlighted = function (component, hConfig, hState) {\n      return descendant$1(component.element(), '.' + hConfig.highlightClass).bind(function (e) {\n        return component.getSystem().getByDom(e).toOption();\n      });\n    };\n    var getByIndex = function (component, hConfig, hState, index) {\n      var items = descendants(component.element(), '.' + hConfig.itemClass);\n      return Option.from(items[index]).fold(function () {\n        return Result.error('No element found with index ' + index);\n      }, component.getSystem().getByDom);\n    };\n    var getFirst = function (component, hConfig, hState) {\n      return descendant$1(component.element(), '.' + hConfig.itemClass).bind(function (e) {\n        return component.getSystem().getByDom(e).toOption();\n      });\n    };\n    var getLast = function (component, hConfig, hState) {\n      var items = descendants(component.element(), '.' + hConfig.itemClass);\n      var last = items.length > 0 ? Option.some(items[items.length - 1]) : Option.none();\n      return last.bind(function (c) {\n        return component.getSystem().getByDom(c).toOption();\n      });\n    };\n    var getDelta = function (component, hConfig, hState, delta) {\n      var items = descendants(component.element(), '.' + hConfig.itemClass);\n      var current = findIndex(items, function (item) {\n        return has$2(item, hConfig.highlightClass);\n      });\n      return current.bind(function (selected) {\n        var dest = cycleBy(selected, delta, 0, items.length - 1);\n        return component.getSystem().getByDom(items[dest]).toOption();\n      });\n    };\n    var getPrevious = function (component, hConfig, hState) {\n      return getDelta(component, hConfig, hState, -1);\n    };\n    var getNext = function (component, hConfig, hState) {\n      return getDelta(component, hConfig, hState, +1);\n    };\n    var getCandidates = function (component, hConfig, hState) {\n      var items = descendants(component.element(), '.' + hConfig.itemClass);\n      return cat(map(items, function (i) {\n        return component.getSystem().getByDom(i).toOption();\n      }));\n    };\n\n    var HighlightApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        dehighlightAll: dehighlightAll,\n        dehighlight: dehighlight$1,\n        highlight: highlight$1,\n        highlightFirst: highlightFirst,\n        highlightLast: highlightLast,\n        highlightAt: highlightAt,\n        highlightBy: highlightBy,\n        isHighlighted: isHighlighted,\n        getHighlighted: getHighlighted,\n        getFirst: getFirst,\n        getLast: getLast,\n        getPrevious: getPrevious,\n        getNext: getNext,\n        getCandidates: getCandidates\n    });\n\n    var HighlightSchema = [\n      strict$1('highlightClass'),\n      strict$1('itemClass'),\n      onHandler('onHighlight'),\n      onHandler('onDehighlight')\n    ];\n\n    var Highlighting = create$1({\n      fields: HighlightSchema,\n      name: 'highlighting',\n      apis: HighlightApis\n    });\n\n    var BACKSPACE = function () {\n      return [8];\n    };\n    var TAB = function () {\n      return [9];\n    };\n    var ENTER = function () {\n      return [13];\n    };\n    var ESCAPE = function () {\n      return [27];\n    };\n    var SPACE = function () {\n      return [32];\n    };\n    var LEFT = function () {\n      return [37];\n    };\n    var UP = function () {\n      return [38];\n    };\n    var RIGHT = function () {\n      return [39];\n    };\n    var DOWN = function () {\n      return [40];\n    };\n\n    var cyclePrev = function (values, index, predicate) {\n      var before = reverse(values.slice(0, index));\n      var after = reverse(values.slice(index + 1));\n      return find(before.concat(after), predicate);\n    };\n    var tryPrev = function (values, index, predicate) {\n      var before = reverse(values.slice(0, index));\n      return find(before, predicate);\n    };\n    var cycleNext = function (values, index, predicate) {\n      var before = values.slice(0, index);\n      var after = values.slice(index + 1);\n      return find(after.concat(before), predicate);\n    };\n    var tryNext = function (values, index, predicate) {\n      var after = values.slice(index + 1);\n      return find(after, predicate);\n    };\n\n    var inSet = function (keys) {\n      return function (event) {\n        var raw = event.raw();\n        return contains(keys, raw.which);\n      };\n    };\n    var and = function (preds) {\n      return function (event) {\n        return forall(preds, function (pred) {\n          return pred(event);\n        });\n      };\n    };\n    var isShift = function (event) {\n      var raw = event.raw();\n      return raw.shiftKey === true;\n    };\n    var isControl = function (event) {\n      var raw = event.raw();\n      return raw.ctrlKey === true;\n    };\n    var isNotShift = not(isShift);\n\n    var rule = function (matches, action) {\n      return {\n        matches: matches,\n        classification: action\n      };\n    };\n    var choose$2 = function (transitions, event) {\n      var transition = find(transitions, function (t) {\n        return t.matches(event);\n      });\n      return transition.map(function (t) {\n        return t.classification;\n      });\n    };\n\n    var reportFocusShifting = function (component, prevFocus, newFocus) {\n      var noChange = prevFocus.exists(function (p) {\n        return newFocus.exists(function (n) {\n          return eq(n, p);\n        });\n      });\n      if (!noChange) {\n        emitWith(component, focusShifted(), {\n          prevFocus: prevFocus,\n          newFocus: newFocus\n        });\n      }\n    };\n    var dom = function () {\n      var get = function (component) {\n        return search(component.element());\n      };\n      var set = function (component, focusee) {\n        var prevFocus = get(component);\n        component.getSystem().triggerFocus(focusee, component.element());\n        var newFocus = get(component);\n        reportFocusShifting(component, prevFocus, newFocus);\n      };\n      return {\n        get: get,\n        set: set\n      };\n    };\n    var highlights = function () {\n      var get = function (component) {\n        return Highlighting.getHighlighted(component).map(function (item) {\n          return item.element();\n        });\n      };\n      var set = function (component, element) {\n        var prevFocus = get(component);\n        component.getSystem().getByDom(element).fold(noop, function (item) {\n          Highlighting.highlight(component, item);\n        });\n        var newFocus = get(component);\n        reportFocusShifting(component, prevFocus, newFocus);\n      };\n      return {\n        get: get,\n        set: set\n      };\n    };\n\n    var FocusInsideModes;\n    (function (FocusInsideModes) {\n      FocusInsideModes['OnFocusMode'] = 'onFocus';\n      FocusInsideModes['OnEnterOrSpaceMode'] = 'onEnterOrSpace';\n      FocusInsideModes['OnApiMode'] = 'onApi';\n    }(FocusInsideModes || (FocusInsideModes = {})));\n\n    var typical = function (infoSchema, stateInit, getKeydownRules, getKeyupRules, optFocusIn) {\n      var schema = function () {\n        return infoSchema.concat([\n          defaulted$1('focusManager', dom()),\n          defaultedOf('focusInside', 'onFocus', valueOf(function (val) {\n            return contains([\n              'onFocus',\n              'onEnterOrSpace',\n              'onApi'\n            ], val) ? Result.value(val) : Result.error('Invalid value for focusInside');\n          })),\n          output('handler', me),\n          output('state', stateInit),\n          output('sendFocusIn', optFocusIn)\n        ]);\n      };\n      var processKey = function (component, simulatedEvent, getRules, keyingConfig, keyingState) {\n        var rules = getRules(component, simulatedEvent, keyingConfig, keyingState);\n        return choose$2(rules, simulatedEvent.event()).bind(function (rule) {\n          return rule(component, simulatedEvent, keyingConfig, keyingState);\n        });\n      };\n      var toEvents = function (keyingConfig, keyingState) {\n        var onFocusHandler = keyingConfig.focusInside !== FocusInsideModes.OnFocusMode ? Option.none() : optFocusIn(keyingConfig).map(function (focusIn) {\n          return run(focus(), function (component, simulatedEvent) {\n            focusIn(component, keyingConfig, keyingState);\n            simulatedEvent.stop();\n          });\n        });\n        var tryGoInsideComponent = function (component, simulatedEvent) {\n          var isEnterOrSpace = inSet(SPACE().concat(ENTER()))(simulatedEvent.event());\n          if (keyingConfig.focusInside === FocusInsideModes.OnEnterOrSpaceMode && isEnterOrSpace && isSource(component, simulatedEvent)) {\n            optFocusIn(keyingConfig).each(function (focusIn) {\n              focusIn(component, keyingConfig, keyingState);\n              simulatedEvent.stop();\n            });\n          }\n        };\n        return derive(onFocusHandler.toArray().concat([\n          run(keydown(), function (component, simulatedEvent) {\n            processKey(component, simulatedEvent, getKeydownRules, keyingConfig, keyingState).fold(function () {\n              tryGoInsideComponent(component, simulatedEvent);\n            }, function (_) {\n              simulatedEvent.stop();\n            });\n          }),\n          run(keyup(), function (component, simulatedEvent) {\n            processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(function (_) {\n              simulatedEvent.stop();\n            });\n          })\n        ]));\n      };\n      var me = {\n        schema: schema,\n        processKey: processKey,\n        toEvents: toEvents\n      };\n      return me;\n    };\n\n    var create$3 = function (cyclicField) {\n      var schema = [\n        option('onEscape'),\n        option('onEnter'),\n        defaulted$1('selector', '[data-alloy-tabstop=\"true\"]:not(:disabled)'),\n        defaulted$1('firstTabstop', 0),\n        defaulted$1('useTabstopAt', constant(true)),\n        option('visibilitySelector')\n      ].concat([cyclicField]);\n      var isVisible = function (tabbingConfig, element) {\n        var target = tabbingConfig.visibilitySelector.bind(function (sel) {\n          return closest$3(element, sel);\n        }).getOr(element);\n        return get$6(target) > 0;\n      };\n      var findInitial = function (component, tabbingConfig) {\n        var tabstops = descendants(component.element(), tabbingConfig.selector);\n        var visibles = filter(tabstops, function (elem) {\n          return isVisible(tabbingConfig, elem);\n        });\n        return Option.from(visibles[tabbingConfig.firstTabstop]);\n      };\n      var findCurrent = function (component, tabbingConfig) {\n        return tabbingConfig.focusManager.get(component).bind(function (elem) {\n          return closest$3(elem, tabbingConfig.selector);\n        });\n      };\n      var isTabstop = function (tabbingConfig, element) {\n        return isVisible(tabbingConfig, element) && tabbingConfig.useTabstopAt(element);\n      };\n      var focusIn = function (component, tabbingConfig, tabbingState) {\n        findInitial(component, tabbingConfig).each(function (target) {\n          tabbingConfig.focusManager.set(component, target);\n        });\n      };\n      var goFromTabstop = function (component, tabstops, stopIndex, tabbingConfig, cycle) {\n        return cycle(tabstops, stopIndex, function (elem) {\n          return isTabstop(tabbingConfig, elem);\n        }).fold(function () {\n          return tabbingConfig.cyclic ? Option.some(true) : Option.none();\n        }, function (target) {\n          tabbingConfig.focusManager.set(component, target);\n          return Option.some(true);\n        });\n      };\n      var go = function (component, simulatedEvent, tabbingConfig, cycle) {\n        var tabstops = descendants(component.element(), tabbingConfig.selector);\n        return findCurrent(component, tabbingConfig).bind(function (tabstop) {\n          var optStopIndex = findIndex(tabstops, curry(eq, tabstop));\n          return optStopIndex.bind(function (stopIndex) {\n            return goFromTabstop(component, tabstops, stopIndex, tabbingConfig, cycle);\n          });\n        });\n      };\n      var goBackwards = function (component, simulatedEvent, tabbingConfig) {\n        var navigate = tabbingConfig.cyclic ? cyclePrev : tryPrev;\n        return go(component, simulatedEvent, tabbingConfig, navigate);\n      };\n      var goForwards = function (component, simulatedEvent, tabbingConfig) {\n        var navigate = tabbingConfig.cyclic ? cycleNext : tryNext;\n        return go(component, simulatedEvent, tabbingConfig, navigate);\n      };\n      var execute = function (component, simulatedEvent, tabbingConfig) {\n        return tabbingConfig.onEnter.bind(function (f) {\n          return f(component, simulatedEvent);\n        });\n      };\n      var exit = function (component, simulatedEvent, tabbingConfig) {\n        return tabbingConfig.onEscape.bind(function (f) {\n          return f(component, simulatedEvent);\n        });\n      };\n      var getKeydownRules = constant([\n        rule(and([\n          isShift,\n          inSet(TAB())\n        ]), goBackwards),\n        rule(inSet(TAB()), goForwards),\n        rule(inSet(ESCAPE()), exit),\n        rule(and([\n          isNotShift,\n          inSet(ENTER())\n        ]), execute)\n      ]);\n      var getKeyupRules = constant([]);\n      return typical(schema, NoState.init, getKeydownRules, getKeyupRules, function () {\n        return Option.some(focusIn);\n      });\n    };\n\n    var AcyclicType = create$3(state$1('cyclic', constant(false)));\n\n    var CyclicType = create$3(state$1('cyclic', constant(true)));\n\n    var doDefaultExecute = function (component, simulatedEvent, focused) {\n      dispatch(component, focused, execute());\n      return Option.some(true);\n    };\n    var defaultExecute = function (component, simulatedEvent, focused) {\n      return inside(focused) && inSet(SPACE())(simulatedEvent.event()) ? Option.none() : doDefaultExecute(component, simulatedEvent, focused);\n    };\n    var stopEventForFirefox = function (component, simulatedEvent) {\n      return Option.some(true);\n    };\n\n    var schema$4 = [\n      defaulted$1('execute', defaultExecute),\n      defaulted$1('useSpace', false),\n      defaulted$1('useEnter', true),\n      defaulted$1('useControlEnter', false),\n      defaulted$1('useDown', false)\n    ];\n    var execute$1 = function (component, simulatedEvent, executeConfig) {\n      return executeConfig.execute(component, simulatedEvent, component.element());\n    };\n    var getKeydownRules = function (component, simulatedEvent, executeConfig, executeState) {\n      var spaceExec = executeConfig.useSpace && !inside(component.element()) ? SPACE() : [];\n      var enterExec = executeConfig.useEnter ? ENTER() : [];\n      var downExec = executeConfig.useDown ? DOWN() : [];\n      var execKeys = spaceExec.concat(enterExec).concat(downExec);\n      return [rule(inSet(execKeys), execute$1)].concat(executeConfig.useControlEnter ? [rule(and([\n          isControl,\n          inSet(ENTER())\n        ]), execute$1)] : []);\n    };\n    var getKeyupRules = function (component, simulatedEvent, executeConfig, executeState) {\n      return executeConfig.useSpace && !inside(component.element()) ? [rule(inSet(SPACE()), stopEventForFirefox)] : [];\n    };\n    var ExecutionType = typical(schema$4, NoState.init, getKeydownRules, getKeyupRules, function () {\n      return Option.none();\n    });\n\n    var flatgrid = function () {\n      var dimensions = Cell(Option.none());\n      var setGridSize = function (numRows, numColumns) {\n        dimensions.set(Option.some({\n          numRows: constant(numRows),\n          numColumns: constant(numColumns)\n        }));\n      };\n      var getNumRows = function () {\n        return dimensions.get().map(function (d) {\n          return d.numRows();\n        });\n      };\n      var getNumColumns = function () {\n        return dimensions.get().map(function (d) {\n          return d.numColumns();\n        });\n      };\n      return nu$5({\n        readState: function () {\n          return dimensions.get().map(function (d) {\n            return {\n              numRows: String(d.numRows()),\n              numColumns: String(d.numColumns())\n            };\n          }).getOr({\n            numRows: '?',\n            numColumns: '?'\n          });\n        },\n        setGridSize: setGridSize,\n        getNumRows: getNumRows,\n        getNumColumns: getNumColumns\n      });\n    };\n    var init$2 = function (spec) {\n      return spec.state(spec);\n    };\n\n    var KeyingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        flatgrid: flatgrid,\n        init: init$2\n    });\n\n    var useH = function (movement) {\n      return function (component, simulatedEvent, config, state) {\n        var move = movement(component.element());\n        return use(move, component, simulatedEvent, config, state);\n      };\n    };\n    var west$2 = function (moveLeft, moveRight) {\n      var movement = onDirection(moveLeft, moveRight);\n      return useH(movement);\n    };\n    var east$2 = function (moveLeft, moveRight) {\n      var movement = onDirection(moveRight, moveLeft);\n      return useH(movement);\n    };\n    var useV = function (move) {\n      return function (component, simulatedEvent, config, state) {\n        return use(move, component, simulatedEvent, config, state);\n      };\n    };\n    var use = function (move, component, simulatedEvent, config, state) {\n      var outcome = config.focusManager.get(component).bind(function (focused) {\n        return move(component.element(), focused, config, state);\n      });\n      return outcome.map(function (newFocus) {\n        config.focusManager.set(component, newFocus);\n        return true;\n      });\n    };\n    var north$2 = useV;\n    var south$2 = useV;\n    var move = useV;\n\n    var isHidden = function (dom) {\n      return dom.offsetWidth <= 0 && dom.offsetHeight <= 0;\n    };\n    var isVisible = function (element) {\n      var dom = element.dom();\n      return !isHidden(dom);\n    };\n\n    var locate = function (candidates, predicate) {\n      return findIndex(candidates, predicate).map(function (index) {\n        return {\n          index: constant(index),\n          candidates: constant(candidates)\n        };\n      });\n    };\n\n    var locateVisible = function (container, current, selector) {\n      var predicate = function (x) {\n        return eq(x, current);\n      };\n      var candidates = descendants(container, selector);\n      var visible = filter(candidates, isVisible);\n      return locate(visible, predicate);\n    };\n    var findIndex$1 = function (elements, target) {\n      return findIndex(elements, function (elem) {\n        return eq(target, elem);\n      });\n    };\n\n    var withGrid = function (values, index, numCols, f) {\n      var oldRow = Math.floor(index / numCols);\n      var oldColumn = index % numCols;\n      return f(oldRow, oldColumn).bind(function (address) {\n        var newIndex = address.row() * numCols + address.column();\n        return newIndex >= 0 && newIndex < values.length ? Option.some(values[newIndex]) : Option.none();\n      });\n    };\n    var cycleHorizontal = function (values, index, numRows, numCols, delta) {\n      return withGrid(values, index, numCols, function (oldRow, oldColumn) {\n        var onLastRow = oldRow === numRows - 1;\n        var colsInRow = onLastRow ? values.length - oldRow * numCols : numCols;\n        var newColumn = cycleBy(oldColumn, delta, 0, colsInRow - 1);\n        return Option.some({\n          row: constant(oldRow),\n          column: constant(newColumn)\n        });\n      });\n    };\n    var cycleVertical = function (values, index, numRows, numCols, delta) {\n      return withGrid(values, index, numCols, function (oldRow, oldColumn) {\n        var newRow = cycleBy(oldRow, delta, 0, numRows - 1);\n        var onLastRow = newRow === numRows - 1;\n        var colsInRow = onLastRow ? values.length - newRow * numCols : numCols;\n        var newCol = clamp(oldColumn, 0, colsInRow - 1);\n        return Option.some({\n          row: constant(newRow),\n          column: constant(newCol)\n        });\n      });\n    };\n    var cycleRight = function (values, index, numRows, numCols) {\n      return cycleHorizontal(values, index, numRows, numCols, +1);\n    };\n    var cycleLeft = function (values, index, numRows, numCols) {\n      return cycleHorizontal(values, index, numRows, numCols, -1);\n    };\n    var cycleUp = function (values, index, numRows, numCols) {\n      return cycleVertical(values, index, numRows, numCols, -1);\n    };\n    var cycleDown = function (values, index, numRows, numCols) {\n      return cycleVertical(values, index, numRows, numCols, +1);\n    };\n\n    var schema$5 = [\n      strict$1('selector'),\n      defaulted$1('execute', defaultExecute),\n      onKeyboardHandler('onEscape'),\n      defaulted$1('captureTab', false),\n      initSize()\n    ];\n    var focusIn = function (component, gridConfig, gridState) {\n      descendant$1(component.element(), gridConfig.selector).each(function (first) {\n        gridConfig.focusManager.set(component, first);\n      });\n    };\n    var findCurrent = function (component, gridConfig) {\n      return gridConfig.focusManager.get(component).bind(function (elem) {\n        return closest$3(elem, gridConfig.selector);\n      });\n    };\n    var execute$2 = function (component, simulatedEvent, gridConfig, gridState) {\n      return findCurrent(component, gridConfig).bind(function (focused) {\n        return gridConfig.execute(component, simulatedEvent, focused);\n      });\n    };\n    var doMove = function (cycle) {\n      return function (element, focused, gridConfig, gridState) {\n        return locateVisible(element, focused, gridConfig.selector).bind(function (identified) {\n          return cycle(identified.candidates(), identified.index(), gridState.getNumRows().getOr(gridConfig.initSize.numRows), gridState.getNumColumns().getOr(gridConfig.initSize.numColumns));\n        });\n      };\n    };\n    var handleTab = function (component, simulatedEvent, gridConfig) {\n      return gridConfig.captureTab ? Option.some(true) : Option.none();\n    };\n    var doEscape = function (component, simulatedEvent, gridConfig) {\n      return gridConfig.onEscape(component, simulatedEvent);\n    };\n    var moveLeft = doMove(cycleLeft);\n    var moveRight = doMove(cycleRight);\n    var moveNorth = doMove(cycleUp);\n    var moveSouth = doMove(cycleDown);\n    var getKeydownRules$1 = constant([\n      rule(inSet(LEFT()), west$2(moveLeft, moveRight)),\n      rule(inSet(RIGHT()), east$2(moveLeft, moveRight)),\n      rule(inSet(UP()), north$2(moveNorth)),\n      rule(inSet(DOWN()), south$2(moveSouth)),\n      rule(and([\n        isShift,\n        inSet(TAB())\n      ]), handleTab),\n      rule(and([\n        isNotShift,\n        inSet(TAB())\n      ]), handleTab),\n      rule(inSet(ESCAPE()), doEscape),\n      rule(inSet(SPACE().concat(ENTER())), execute$2)\n    ]);\n    var getKeyupRules$1 = constant([rule(inSet(SPACE()), stopEventForFirefox)]);\n    var FlatgridType = typical(schema$5, flatgrid, getKeydownRules$1, getKeyupRules$1, function () {\n      return Option.some(focusIn);\n    });\n\n    var horizontal = function (container, selector, current, delta) {\n      var isDisabledButton = function (candidate) {\n        return name(candidate) === 'button' && get$2(candidate, 'disabled') === 'disabled';\n      };\n      var tryCycle = function (initial, index, candidates) {\n        var newIndex = cycleBy(index, delta, 0, candidates.length - 1);\n        if (newIndex === initial) {\n          return Option.none();\n        } else {\n          return isDisabledButton(candidates[newIndex]) ? tryCycle(initial, newIndex, candidates) : Option.from(candidates[newIndex]);\n        }\n      };\n      return locateVisible(container, current, selector).bind(function (identified) {\n        var index = identified.index();\n        var candidates = identified.candidates();\n        return tryCycle(index, index, candidates);\n      });\n    };\n\n    var schema$6 = [\n      strict$1('selector'),\n      defaulted$1('getInitial', Option.none),\n      defaulted$1('execute', defaultExecute),\n      onKeyboardHandler('onEscape'),\n      defaulted$1('executeOnMove', false),\n      defaulted$1('allowVertical', true)\n    ];\n    var findCurrent$1 = function (component, flowConfig) {\n      return flowConfig.focusManager.get(component).bind(function (elem) {\n        return closest$3(elem, flowConfig.selector);\n      });\n    };\n    var execute$3 = function (component, simulatedEvent, flowConfig) {\n      return findCurrent$1(component, flowConfig).bind(function (focused) {\n        return flowConfig.execute(component, simulatedEvent, focused);\n      });\n    };\n    var focusIn$1 = function (component, flowConfig, state) {\n      flowConfig.getInitial(component).orThunk(function () {\n        return descendant$1(component.element(), flowConfig.selector);\n      }).each(function (first) {\n        flowConfig.focusManager.set(component, first);\n      });\n    };\n    var moveLeft$1 = function (element, focused, info) {\n      return horizontal(element, info.selector, focused, -1);\n    };\n    var moveRight$1 = function (element, focused, info) {\n      return horizontal(element, info.selector, focused, +1);\n    };\n    var doMove$1 = function (movement) {\n      return function (component, simulatedEvent, flowConfig, flowState) {\n        return movement(component, simulatedEvent, flowConfig, flowState).bind(function () {\n          return flowConfig.executeOnMove ? execute$3(component, simulatedEvent, flowConfig) : Option.some(true);\n        });\n      };\n    };\n    var doEscape$1 = function (component, simulatedEvent, flowConfig) {\n      return flowConfig.onEscape(component, simulatedEvent);\n    };\n    var getKeydownRules$2 = function (_component, _se, flowConfig, _flowState) {\n      var westMovers = LEFT().concat(flowConfig.allowVertical ? UP() : []);\n      var eastMovers = RIGHT().concat(flowConfig.allowVertical ? DOWN() : []);\n      return [\n        rule(inSet(westMovers), doMove$1(west$2(moveLeft$1, moveRight$1))),\n        rule(inSet(eastMovers), doMove$1(east$2(moveLeft$1, moveRight$1))),\n        rule(inSet(ENTER()), execute$3),\n        rule(inSet(SPACE()), execute$3),\n        rule(inSet(ESCAPE()), doEscape$1)\n      ];\n    };\n    var getKeyupRules$2 = constant([rule(inSet(SPACE()), stopEventForFirefox)]);\n    var FlowType = typical(schema$6, NoState.init, getKeydownRules$2, getKeyupRules$2, function () {\n      return Option.some(focusIn$1);\n    });\n\n    var outcome = MixedBag([\n      'rowIndex',\n      'columnIndex',\n      'cell'\n    ], []);\n    var toCell = function (matrix, rowIndex, columnIndex) {\n      return Option.from(matrix[rowIndex]).bind(function (row) {\n        return Option.from(row[columnIndex]).map(function (cell) {\n          return outcome({\n            rowIndex: rowIndex,\n            columnIndex: columnIndex,\n            cell: cell\n          });\n        });\n      });\n    };\n    var cycleHorizontal$1 = function (matrix, rowIndex, startCol, deltaCol) {\n      var row = matrix[rowIndex];\n      var colsInRow = row.length;\n      var newColIndex = cycleBy(startCol, deltaCol, 0, colsInRow - 1);\n      return toCell(matrix, rowIndex, newColIndex);\n    };\n    var cycleVertical$1 = function (matrix, colIndex, startRow, deltaRow) {\n      var nextRowIndex = cycleBy(startRow, deltaRow, 0, matrix.length - 1);\n      var colsInNextRow = matrix[nextRowIndex].length;\n      var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1);\n      return toCell(matrix, nextRowIndex, nextColIndex);\n    };\n    var moveHorizontal = function (matrix, rowIndex, startCol, deltaCol) {\n      var row = matrix[rowIndex];\n      var colsInRow = row.length;\n      var newColIndex = clamp(startCol + deltaCol, 0, colsInRow - 1);\n      return toCell(matrix, rowIndex, newColIndex);\n    };\n    var moveVertical = function (matrix, colIndex, startRow, deltaRow) {\n      var nextRowIndex = clamp(startRow + deltaRow, 0, matrix.length - 1);\n      var colsInNextRow = matrix[nextRowIndex].length;\n      var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1);\n      return toCell(matrix, nextRowIndex, nextColIndex);\n    };\n    var cycleRight$1 = function (matrix, startRow, startCol) {\n      return cycleHorizontal$1(matrix, startRow, startCol, +1);\n    };\n    var cycleLeft$1 = function (matrix, startRow, startCol) {\n      return cycleHorizontal$1(matrix, startRow, startCol, -1);\n    };\n    var cycleUp$1 = function (matrix, startRow, startCol) {\n      return cycleVertical$1(matrix, startCol, startRow, -1);\n    };\n    var cycleDown$1 = function (matrix, startRow, startCol) {\n      return cycleVertical$1(matrix, startCol, startRow, +1);\n    };\n    var moveLeft$2 = function (matrix, startRow, startCol) {\n      return moveHorizontal(matrix, startRow, startCol, -1);\n    };\n    var moveRight$2 = function (matrix, startRow, startCol) {\n      return moveHorizontal(matrix, startRow, startCol, +1);\n    };\n    var moveUp = function (matrix, startRow, startCol) {\n      return moveVertical(matrix, startCol, startRow, -1);\n    };\n    var moveDown = function (matrix, startRow, startCol) {\n      return moveVertical(matrix, startCol, startRow, +1);\n    };\n\n    var schema$7 = [\n      strictObjOf('selectors', [\n        strict$1('row'),\n        strict$1('cell')\n      ]),\n      defaulted$1('cycles', true),\n      defaulted$1('previousSelector', Option.none),\n      defaulted$1('execute', defaultExecute)\n    ];\n    var focusIn$2 = function (component, matrixConfig, state) {\n      var focused = matrixConfig.previousSelector(component).orThunk(function () {\n        var selectors = matrixConfig.selectors;\n        return descendant$1(component.element(), selectors.cell);\n      });\n      focused.each(function (cell) {\n        matrixConfig.focusManager.set(component, cell);\n      });\n    };\n    var execute$4 = function (component, simulatedEvent, matrixConfig) {\n      return search(component.element()).bind(function (focused) {\n        return matrixConfig.execute(component, simulatedEvent, focused);\n      });\n    };\n    var toMatrix = function (rows, matrixConfig) {\n      return map(rows, function (row) {\n        return descendants(row, matrixConfig.selectors.cell);\n      });\n    };\n    var doMove$2 = function (ifCycle, ifMove) {\n      return function (element, focused, matrixConfig) {\n        var move = matrixConfig.cycles ? ifCycle : ifMove;\n        return closest$3(focused, matrixConfig.selectors.row).bind(function (inRow) {\n          var cellsInRow = descendants(inRow, matrixConfig.selectors.cell);\n          return findIndex$1(cellsInRow, focused).bind(function (colIndex) {\n            var allRows = descendants(element, matrixConfig.selectors.row);\n            return findIndex$1(allRows, inRow).bind(function (rowIndex) {\n              var matrix = toMatrix(allRows, matrixConfig);\n              return move(matrix, rowIndex, colIndex).map(function (next) {\n                return next.cell();\n              });\n            });\n          });\n        });\n      };\n    };\n    var moveLeft$3 = doMove$2(cycleLeft$1, moveLeft$2);\n    var moveRight$3 = doMove$2(cycleRight$1, moveRight$2);\n    var moveNorth$1 = doMove$2(cycleUp$1, moveUp);\n    var moveSouth$1 = doMove$2(cycleDown$1, moveDown);\n    var getKeydownRules$3 = constant([\n      rule(inSet(LEFT()), west$2(moveLeft$3, moveRight$3)),\n      rule(inSet(RIGHT()), east$2(moveLeft$3, moveRight$3)),\n      rule(inSet(UP()), north$2(moveNorth$1)),\n      rule(inSet(DOWN()), south$2(moveSouth$1)),\n      rule(inSet(SPACE().concat(ENTER())), execute$4)\n    ]);\n    var getKeyupRules$3 = constant([rule(inSet(SPACE()), stopEventForFirefox)]);\n    var MatrixType = typical(schema$7, NoState.init, getKeydownRules$3, getKeyupRules$3, function () {\n      return Option.some(focusIn$2);\n    });\n\n    var schema$8 = [\n      strict$1('selector'),\n      defaulted$1('execute', defaultExecute),\n      defaulted$1('moveOnTab', false)\n    ];\n    var execute$5 = function (component, simulatedEvent, menuConfig) {\n      return menuConfig.focusManager.get(component).bind(function (focused) {\n        return menuConfig.execute(component, simulatedEvent, focused);\n      });\n    };\n    var focusIn$3 = function (component, menuConfig, state) {\n      descendant$1(component.element(), menuConfig.selector).each(function (first) {\n        menuConfig.focusManager.set(component, first);\n      });\n    };\n    var moveUp$1 = function (element, focused, info) {\n      return horizontal(element, info.selector, focused, -1);\n    };\n    var moveDown$1 = function (element, focused, info) {\n      return horizontal(element, info.selector, focused, +1);\n    };\n    var fireShiftTab = function (component, simulatedEvent, menuConfig, menuState) {\n      return menuConfig.moveOnTab ? move(moveUp$1)(component, simulatedEvent, menuConfig, menuState) : Option.none();\n    };\n    var fireTab = function (component, simulatedEvent, menuConfig, menuState) {\n      return menuConfig.moveOnTab ? move(moveDown$1)(component, simulatedEvent, menuConfig, menuState) : Option.none();\n    };\n    var getKeydownRules$4 = constant([\n      rule(inSet(UP()), move(moveUp$1)),\n      rule(inSet(DOWN()), move(moveDown$1)),\n      rule(and([\n        isShift,\n        inSet(TAB())\n      ]), fireShiftTab),\n      rule(and([\n        isNotShift,\n        inSet(TAB())\n      ]), fireTab),\n      rule(inSet(ENTER()), execute$5),\n      rule(inSet(SPACE()), execute$5)\n    ]);\n    var getKeyupRules$4 = constant([rule(inSet(SPACE()), stopEventForFirefox)]);\n    var MenuType = typical(schema$8, NoState.init, getKeydownRules$4, getKeyupRules$4, function () {\n      return Option.some(focusIn$3);\n    });\n\n    var schema$9 = [\n      onKeyboardHandler('onSpace'),\n      onKeyboardHandler('onEnter'),\n      onKeyboardHandler('onShiftEnter'),\n      onKeyboardHandler('onLeft'),\n      onKeyboardHandler('onRight'),\n      onKeyboardHandler('onTab'),\n      onKeyboardHandler('onShiftTab'),\n      onKeyboardHandler('onUp'),\n      onKeyboardHandler('onDown'),\n      onKeyboardHandler('onEscape'),\n      defaulted$1('stopSpaceKeyup', false),\n      option('focusIn')\n    ];\n    var getKeydownRules$5 = function (component, simulatedEvent, specialInfo) {\n      return [\n        rule(inSet(SPACE()), specialInfo.onSpace),\n        rule(and([\n          isNotShift,\n          inSet(ENTER())\n        ]), specialInfo.onEnter),\n        rule(and([\n          isShift,\n          inSet(ENTER())\n        ]), specialInfo.onShiftEnter),\n        rule(and([\n          isShift,\n          inSet(TAB())\n        ]), specialInfo.onShiftTab),\n        rule(and([\n          isNotShift,\n          inSet(TAB())\n        ]), specialInfo.onTab),\n        rule(inSet(UP()), specialInfo.onUp),\n        rule(inSet(DOWN()), specialInfo.onDown),\n        rule(inSet(LEFT()), specialInfo.onLeft),\n        rule(inSet(RIGHT()), specialInfo.onRight),\n        rule(inSet(SPACE()), specialInfo.onSpace),\n        rule(inSet(ESCAPE()), specialInfo.onEscape)\n      ];\n    };\n    var getKeyupRules$5 = function (component, simulatedEvent, specialInfo) {\n      return specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE()), stopEventForFirefox)] : [];\n    };\n    var SpecialType = typical(schema$9, NoState.init, getKeydownRules$5, getKeyupRules$5, function (specialInfo) {\n      return specialInfo.focusIn;\n    });\n\n    var acyclic = AcyclicType.schema();\n    var cyclic = CyclicType.schema();\n    var flow = FlowType.schema();\n    var flatgrid$1 = FlatgridType.schema();\n    var matrix = MatrixType.schema();\n    var execution = ExecutionType.schema();\n    var menu = MenuType.schema();\n    var special = SpecialType.schema();\n\n    var KeyboardBranches = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        acyclic: acyclic,\n        cyclic: cyclic,\n        flow: flow,\n        flatgrid: flatgrid$1,\n        matrix: matrix,\n        execution: execution,\n        menu: menu,\n        special: special\n    });\n\n    var isFlatgridState = function (keyState) {\n      return hasNonNullableKey(keyState, 'setGridSize');\n    };\n    var Keying = createModes$1({\n      branchKey: 'mode',\n      branches: KeyboardBranches,\n      name: 'keying',\n      active: {\n        events: function (keyingConfig, keyingState) {\n          var handler = keyingConfig.handler;\n          return handler.toEvents(keyingConfig, keyingState);\n        }\n      },\n      apis: {\n        focusIn: function (component, keyConfig, keyState) {\n          keyConfig.sendFocusIn(keyConfig).fold(function () {\n            component.getSystem().triggerFocus(component.element(), component.element());\n          }, function (sendFocusIn) {\n            sendFocusIn(component, keyConfig, keyState);\n          });\n        },\n        setGridSize: function (component, keyConfig, keyState, numRows, numColumns) {\n          if (!isFlatgridState(keyState)) {\n            domGlobals.console.error('Layout does not support setGridSize');\n          } else {\n            keyState.setGridSize(numRows, numColumns);\n          }\n        }\n      },\n      state: KeyingState\n    });\n\n    var set$5 = function (component, replaceConfig, replaceState, data) {\n      preserve(function () {\n        var newChildren = map(data, component.getSystem().build);\n        replaceChildren(component, newChildren);\n      }, component.element());\n    };\n    var insert = function (component, replaceConfig, insertion, childSpec) {\n      var child = component.getSystem().build(childSpec);\n      attachWith(component, child, insertion);\n    };\n    var append$2 = function (component, replaceConfig, replaceState, appendee) {\n      insert(component, replaceConfig, append, appendee);\n    };\n    var prepend$1 = function (component, replaceConfig, replaceState, prependee) {\n      insert(component, replaceConfig, prepend, prependee);\n    };\n    var remove$7 = function (component, replaceConfig, replaceState, removee) {\n      var children = contents(component);\n      var foundChild = find(children, function (child) {\n        return eq(removee.element(), child.element());\n      });\n      foundChild.each(detach);\n    };\n    var contents = function (component, replaceConfig) {\n      return component.components();\n    };\n    var replaceAt = function (component, replaceConfig, replaceState, replaceeIndex, replacer) {\n      var children = contents(component);\n      return Option.from(children[replaceeIndex]).map(function (replacee) {\n        remove$7(component, replaceConfig, replaceState, replacee);\n        replacer.each(function (r) {\n          insert(component, replaceConfig, function (p, c) {\n            appendAt(p, c, replaceeIndex);\n          }, r);\n        });\n        return replacee;\n      });\n    };\n    var replaceBy = function (component, replaceConfig, replaceState, replaceePred, replacer) {\n      var children = contents(component);\n      return findIndex(children, replaceePred).bind(function (replaceeIndex) {\n        return replaceAt(component, replaceConfig, replaceState, replaceeIndex, replacer);\n      });\n    };\n\n    var ReplaceApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        append: append$2,\n        prepend: prepend$1,\n        remove: remove$7,\n        replaceAt: replaceAt,\n        replaceBy: replaceBy,\n        set: set$5,\n        contents: contents\n    });\n\n    var Replacing = create$1({\n      fields: [],\n      name: 'replacing',\n      apis: ReplaceApis\n    });\n\n    var events$4 = function (name, eventHandlers) {\n      var events = derive(eventHandlers);\n      return create$1({\n        fields: [strict$1('enabled')],\n        name: name,\n        active: { events: constant(events) }\n      });\n    };\n    var config = function (name, eventHandlers) {\n      var me = events$4(name, eventHandlers);\n      return {\n        key: name,\n        value: {\n          config: {},\n          me: me,\n          configAsRaw: constant({}),\n          initialConfig: {},\n          state: NoState\n        }\n      };\n    };\n\n    var focus$2 = function (component, focusConfig) {\n      if (!focusConfig.ignore) {\n        focus$1(component.element());\n        focusConfig.onFocus(component);\n      }\n    };\n    var blur$1 = function (component, focusConfig) {\n      if (!focusConfig.ignore) {\n        blur(component.element());\n      }\n    };\n    var isFocused = function (component) {\n      return hasFocus(component.element());\n    };\n\n    var FocusApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        focus: focus$2,\n        blur: blur$1,\n        isFocused: isFocused\n    });\n\n    var exhibit$1 = function (base, focusConfig) {\n      var mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } };\n      return nu$6(mod);\n    };\n    var events$5 = function (focusConfig) {\n      return derive([run(focus(), function (component, simulatedEvent) {\n          focus$2(component, focusConfig);\n          simulatedEvent.stop();\n        })].concat(focusConfig.stopMousedown ? [run(mousedown(), function (_, simulatedEvent) {\n          simulatedEvent.event().prevent();\n        })] : []));\n    };\n\n    var ActiveFocus = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$1,\n        events: events$5\n    });\n\n    var FocusSchema = [\n      onHandler('onFocus'),\n      defaulted$1('stopMousedown', false),\n      defaulted$1('ignore', false)\n    ];\n\n    var Focusing = create$1({\n      fields: FocusSchema,\n      name: 'focusing',\n      active: ActiveFocus,\n      apis: FocusApis\n    });\n\n    var updateAriaState = function (component, toggleConfig, toggleState) {\n      var ariaInfo = toggleConfig.aria;\n      ariaInfo.update(component, ariaInfo, toggleState.get());\n    };\n    var updateClass = function (component, toggleConfig, toggleState) {\n      toggleConfig.toggleClass.each(function (toggleClass) {\n        if (toggleState.get()) {\n          add$2(component.element(), toggleClass);\n        } else {\n          remove$4(component.element(), toggleClass);\n        }\n      });\n    };\n    var toggle = function (component, toggleConfig, toggleState) {\n      set$6(component, toggleConfig, toggleState, !toggleState.get());\n    };\n    var on$1 = function (component, toggleConfig, toggleState) {\n      toggleState.set(true);\n      updateClass(component, toggleConfig, toggleState);\n      updateAriaState(component, toggleConfig, toggleState);\n    };\n    var off = function (component, toggleConfig, toggleState) {\n      toggleState.set(false);\n      updateClass(component, toggleConfig, toggleState);\n      updateAriaState(component, toggleConfig, toggleState);\n    };\n    var set$6 = function (component, toggleConfig, toggleState, state) {\n      var action = state ? on$1 : off;\n      action(component, toggleConfig, toggleState);\n    };\n    var isOn = function (component, toggleConfig, toggleState) {\n      return toggleState.get();\n    };\n    var onLoad$4 = function (component, toggleConfig, toggleState) {\n      set$6(component, toggleConfig, toggleState, toggleConfig.selected);\n    };\n\n    var ToggleApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        onLoad: onLoad$4,\n        toggle: toggle,\n        isOn: isOn,\n        on: on$1,\n        off: off,\n        set: set$6\n    });\n\n    var exhibit$2 = function () {\n      return nu$6({});\n    };\n    var events$6 = function (toggleConfig, toggleState) {\n      var execute = executeEvent(toggleConfig, toggleState, toggle);\n      var load = loadEvent(toggleConfig, toggleState, onLoad$4);\n      return derive(flatten([\n        toggleConfig.toggleOnExecute ? [execute] : [],\n        [load]\n      ]));\n    };\n\n    var ActiveToggle = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$2,\n        events: events$6\n    });\n\n    var SetupBehaviourCellState = function (initialState) {\n      var init = function () {\n        var cell = Cell(initialState);\n        var get = function () {\n          return cell.get();\n        };\n        var set = function (newState) {\n          return cell.set(newState);\n        };\n        var clear = function () {\n          return cell.set(initialState);\n        };\n        var readState = function () {\n          return cell.get();\n        };\n        return {\n          get: get,\n          set: set,\n          clear: clear,\n          readState: readState\n        };\n      };\n      return { init: init };\n    };\n\n    var updatePressed = function (component, ariaInfo, status) {\n      set$1(component.element(), 'aria-pressed', status);\n      if (ariaInfo.syncWithExpanded) {\n        updateExpanded(component, ariaInfo, status);\n      }\n    };\n    var updateSelected = function (component, ariaInfo, status) {\n      set$1(component.element(), 'aria-selected', status);\n    };\n    var updateChecked = function (component, ariaInfo, status) {\n      set$1(component.element(), 'aria-checked', status);\n    };\n    var updateExpanded = function (component, ariaInfo, status) {\n      set$1(component.element(), 'aria-expanded', status);\n    };\n\n    var ToggleSchema = [\n      defaulted$1('selected', false),\n      option('toggleClass'),\n      defaulted$1('toggleOnExecute', true),\n      defaultedOf('aria', { mode: 'none' }, choose$1('mode', {\n        pressed: [\n          defaulted$1('syncWithExpanded', false),\n          output('update', updatePressed)\n        ],\n        checked: [output('update', updateChecked)],\n        expanded: [output('update', updateExpanded)],\n        selected: [output('update', updateSelected)],\n        none: [output('update', noop)]\n      }))\n    ];\n\n    var Toggling = create$1({\n      fields: ToggleSchema,\n      name: 'toggling',\n      active: ActiveToggle,\n      apis: ToggleApis,\n      state: SetupBehaviourCellState(false)\n    });\n\n    var pointerEvents = function () {\n      var onClick = function (component, simulatedEvent) {\n        simulatedEvent.stop();\n        emitExecute(component);\n      };\n      return [\n        run(click(), onClick),\n        run(tap(), onClick),\n        cutter(touchstart()),\n        cutter(mousedown())\n      ];\n    };\n    var events$7 = function (optAction) {\n      var executeHandler = function (action) {\n        return runOnExecute(function (component, simulatedEvent) {\n          action(component);\n          simulatedEvent.stop();\n        });\n      };\n      return derive(flatten([\n        optAction.map(executeHandler).toArray(),\n        pointerEvents()\n      ]));\n    };\n\n    var hoverEvent = 'alloy.item-hover';\n    var focusEvent = 'alloy.item-focus';\n    var onHover = function (item) {\n      if (search(item.element()).isNone() || Focusing.isFocused(item)) {\n        if (!Focusing.isFocused(item)) {\n          Focusing.focus(item);\n        }\n        emitWith(item, hoverEvent, { item: item });\n      }\n    };\n    var onFocus = function (item) {\n      emitWith(item, focusEvent, { item: item });\n    };\n    var hover = constant(hoverEvent);\n    var focus$3 = constant(focusEvent);\n\n    var builder = function (detail) {\n      return {\n        dom: detail.dom,\n        domModification: __assign(__assign({}, detail.domModification), { attributes: __assign(__assign(__assign({ 'role': detail.toggling.isSome() ? 'menuitemcheckbox' : 'menuitem' }, detail.domModification.attributes), { 'aria-haspopup': detail.hasSubmenu }), detail.hasSubmenu ? { 'aria-expanded': false } : {}) }),\n        behaviours: SketchBehaviours.augment(detail.itemBehaviours, [\n          detail.toggling.fold(Toggling.revoke, function (tConfig) {\n            return Toggling.config(__assign({ aria: { mode: 'checked' } }, tConfig));\n          }),\n          Focusing.config({\n            ignore: detail.ignoreFocus,\n            stopMousedown: detail.ignoreFocus,\n            onFocus: function (component) {\n              onFocus(component);\n            }\n          }),\n          Keying.config({ mode: 'execution' }),\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: detail.data\n            }\n          }),\n          config('item-type-events', __spreadArrays(pointerEvents(), [\n            run(mouseover(), onHover),\n            run(focusItem(), Focusing.focus)\n          ]))\n        ]),\n        components: detail.components,\n        eventOrder: detail.eventOrder\n      };\n    };\n    var schema$a = [\n      strict$1('data'),\n      strict$1('components'),\n      strict$1('dom'),\n      defaulted$1('hasSubmenu', false),\n      option('toggling'),\n      SketchBehaviours.field('itemBehaviours', [\n        Toggling,\n        Focusing,\n        Keying,\n        Representing\n      ]),\n      defaulted$1('ignoreFocus', false),\n      defaulted$1('domModification', {}),\n      output('builder', builder),\n      defaulted$1('eventOrder', {})\n    ];\n\n    var builder$1 = function (detail) {\n      return {\n        dom: detail.dom,\n        components: detail.components,\n        events: derive([stopper(focusItem())])\n      };\n    };\n    var schema$b = [\n      strict$1('dom'),\n      strict$1('components'),\n      output('builder', builder$1)\n    ];\n\n    var owner$2 = function () {\n      return 'item-widget';\n    };\n    var parts = constant([required({\n        name: 'widget',\n        overrides: function (detail) {\n          return {\n            behaviours: derive$1([Representing.config({\n                store: {\n                  mode: 'manual',\n                  getValue: function (component) {\n                    return detail.data;\n                  },\n                  setValue: function () {\n                  }\n                }\n              })])\n          };\n        }\n      })]);\n\n    var builder$2 = function (detail) {\n      var subs = substitutes(owner$2(), detail, parts());\n      var components$1 = components(owner$2(), detail, subs.internals());\n      var focusWidget = function (component) {\n        return getPart(component, detail, 'widget').map(function (widget) {\n          Keying.focusIn(widget);\n          return widget;\n        });\n      };\n      var onHorizontalArrow = function (component, simulatedEvent) {\n        return inside(simulatedEvent.event().target()) ? Option.none() : function () {\n          if (detail.autofocus) {\n            simulatedEvent.setSource(component.element());\n            return Option.none();\n          } else {\n            return Option.none();\n          }\n        }();\n      };\n      return {\n        dom: detail.dom,\n        components: components$1,\n        domModification: detail.domModification,\n        events: derive([\n          runOnExecute(function (component, simulatedEvent) {\n            focusWidget(component).each(function (widget) {\n              simulatedEvent.stop();\n            });\n          }),\n          run(mouseover(), onHover),\n          run(focusItem(), function (component, simulatedEvent) {\n            if (detail.autofocus) {\n              focusWidget(component);\n            } else {\n              Focusing.focus(component);\n            }\n          })\n        ]),\n        behaviours: SketchBehaviours.augment(detail.widgetBehaviours, [\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: detail.data\n            }\n          }),\n          Focusing.config({\n            ignore: detail.ignoreFocus,\n            onFocus: function (component) {\n              onFocus(component);\n            }\n          }),\n          Keying.config({\n            mode: 'special',\n            focusIn: detail.autofocus ? function (component) {\n              focusWidget(component);\n            } : revoke(),\n            onLeft: onHorizontalArrow,\n            onRight: onHorizontalArrow,\n            onEscape: function (component, simulatedEvent) {\n              if (!Focusing.isFocused(component) && !detail.autofocus) {\n                Focusing.focus(component);\n                return Option.some(true);\n              } else if (detail.autofocus) {\n                simulatedEvent.setSource(component.element());\n                return Option.none();\n              } else {\n                return Option.none();\n              }\n            }\n          })\n        ])\n      };\n    };\n    var schema$c = [\n      strict$1('uid'),\n      strict$1('data'),\n      strict$1('components'),\n      strict$1('dom'),\n      defaulted$1('autofocus', false),\n      defaulted$1('ignoreFocus', false),\n      SketchBehaviours.field('widgetBehaviours', [\n        Representing,\n        Focusing,\n        Keying\n      ]),\n      defaulted$1('domModification', {}),\n      defaultUidsSchema(parts()),\n      output('builder', builder$2)\n    ];\n\n    var itemSchema$1 = choose$1('type', {\n      widget: schema$c,\n      item: schema$a,\n      separator: schema$b\n    });\n    var configureGrid = function (detail, movementInfo) {\n      return {\n        mode: 'flatgrid',\n        selector: '.' + detail.markers.item,\n        initSize: {\n          numColumns: movementInfo.initSize.numColumns,\n          numRows: movementInfo.initSize.numRows\n        },\n        focusManager: detail.focusManager\n      };\n    };\n    var configureMatrix = function (detail, movementInfo) {\n      return {\n        mode: 'matrix',\n        selectors: {\n          row: movementInfo.rowSelector,\n          cell: '.' + detail.markers.item\n        },\n        focusManager: detail.focusManager\n      };\n    };\n    var configureMenu = function (detail, movementInfo) {\n      return {\n        mode: 'menu',\n        selector: '.' + detail.markers.item,\n        moveOnTab: movementInfo.moveOnTab,\n        focusManager: detail.focusManager\n      };\n    };\n    var parts$1 = constant([group({\n        factory: {\n          sketch: function (spec) {\n            var itemInfo = asRawOrDie('menu.spec item', itemSchema$1, spec);\n            return itemInfo.builder(itemInfo);\n          }\n        },\n        name: 'items',\n        unit: 'item',\n        defaults: function (detail, u) {\n          return u.hasOwnProperty('uid') ? u : __assign(__assign({}, u), { uid: generate$2('item') });\n        },\n        overrides: function (detail, u) {\n          return {\n            type: u.type,\n            ignoreFocus: detail.fakeFocus,\n            domModification: { classes: [detail.markers.item] }\n          };\n        }\n      })]);\n    var schema$d = constant([\n      strict$1('value'),\n      strict$1('items'),\n      strict$1('dom'),\n      strict$1('components'),\n      defaulted$1('eventOrder', {}),\n      field$1('menuBehaviours', [\n        Highlighting,\n        Representing,\n        Composing,\n        Keying\n      ]),\n      defaultedOf('movement', {\n        mode: 'menu',\n        moveOnTab: true\n      }, choose$1('mode', {\n        grid: [\n          initSize(),\n          output('config', configureGrid)\n        ],\n        matrix: [\n          output('config', configureMatrix),\n          strict$1('rowSelector')\n        ],\n        menu: [\n          defaulted$1('moveOnTab', true),\n          output('config', configureMenu)\n        ]\n      })),\n      itemMarkers(),\n      defaulted$1('fakeFocus', false),\n      defaulted$1('focusManager', dom()),\n      onHandler('onHighlight')\n    ]);\n\n    var focus$4 = constant('alloy.menu-focus');\n\n    var make$1 = function (detail, components, spec, externals) {\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        markers: detail.markers,\n        behaviours: augment(detail.menuBehaviours, [\n          Highlighting.config({\n            highlightClass: detail.markers.selectedItem,\n            itemClass: detail.markers.item,\n            onHighlight: detail.onHighlight\n          }),\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: detail.value\n            }\n          }),\n          Composing.config({ find: Option.some }),\n          Keying.config(detail.movement.config(detail, detail.movement))\n        ]),\n        events: derive([\n          run(focus$3(), function (menu, simulatedEvent) {\n            var event = simulatedEvent.event();\n            menu.getSystem().getByDom(event.target()).each(function (item) {\n              Highlighting.highlight(menu, item);\n              simulatedEvent.stop();\n              emitWith(menu, focus$4(), {\n                menu: menu,\n                item: item\n              });\n            });\n          }),\n          run(hover(), function (menu, simulatedEvent) {\n            var item = simulatedEvent.event().item();\n            Highlighting.highlight(menu, item);\n          })\n        ]),\n        components: components,\n        eventOrder: detail.eventOrder,\n        domModification: { attributes: { role: 'menu' } }\n      };\n    };\n\n    var Menu = composite$1({\n      name: 'Menu',\n      configFields: schema$d(),\n      partFields: parts$1(),\n      factory: make$1\n    });\n\n    var transpose = function (obj) {\n      return tupleMap(obj, function (v, k) {\n        return {\n          k: v,\n          v: k\n        };\n      });\n    };\n    var trace = function (items, byItem, byMenu, finish) {\n      return get(byMenu, finish).bind(function (triggerItem) {\n        return get(items, triggerItem).bind(function (triggerMenu) {\n          var rest = trace(items, byItem, byMenu, triggerMenu);\n          return Option.some([triggerMenu].concat(rest));\n        });\n      }).getOr([]);\n    };\n    var generate$5 = function (menus, expansions) {\n      var items = {};\n      each$1(menus, function (menuItems, menu) {\n        each(menuItems, function (item) {\n          items[item] = menu;\n        });\n      });\n      var byItem = expansions;\n      var byMenu = transpose(expansions);\n      var menuPaths = map$1(byMenu, function (_triggerItem, submenu) {\n        return [submenu].concat(trace(items, byItem, byMenu, submenu));\n      });\n      return map$1(items, function (menu) {\n        return get(menuPaths, menu).getOr([menu]);\n      });\n    };\n\n    var init$3 = function () {\n      var expansions = Cell({});\n      var menus = Cell({});\n      var paths = Cell({});\n      var primary = Cell(Option.none());\n      var directory = Cell({});\n      var clear = function () {\n        expansions.set({});\n        menus.set({});\n        paths.set({});\n        primary.set(Option.none());\n      };\n      var isClear = function () {\n        return primary.get().isNone();\n      };\n      var setMenuBuilt = function (menuName, built) {\n        var _a;\n        menus.set(__assign(__assign({}, menus.get()), (_a = {}, _a[menuName] = {\n          type: 'prepared',\n          menu: built\n        }, _a)));\n      };\n      var setContents = function (sPrimary, sMenus, sExpansions, dir) {\n        primary.set(Option.some(sPrimary));\n        expansions.set(sExpansions);\n        menus.set(sMenus);\n        directory.set(dir);\n        var sPaths = generate$5(dir, sExpansions);\n        paths.set(sPaths);\n      };\n      var getTriggeringItem = function (menuValue) {\n        return find$1(expansions.get(), function (v, k) {\n          return v === menuValue;\n        });\n      };\n      var getTriggerData = function (menuValue, getItemByValue, path) {\n        return getPreparedMenu(menuValue).bind(function (menu) {\n          return getTriggeringItem(menuValue).bind(function (triggeringItemValue) {\n            return getItemByValue(triggeringItemValue).map(function (triggeredItem) {\n              return {\n                triggeredMenu: menu,\n                triggeringItem: triggeredItem,\n                triggeringPath: path\n              };\n            });\n          });\n        });\n      };\n      var getTriggeringPath = function (itemValue, getItemByValue) {\n        var extraPath = filter(lookupItem(itemValue).toArray(), function (menuValue) {\n          return getPreparedMenu(menuValue).isSome();\n        });\n        return get(paths.get(), itemValue).bind(function (path) {\n          var revPath = reverse(extraPath.concat(path));\n          var triggers = bind(revPath, function (menuValue, menuIndex) {\n            return getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(function () {\n              return primary.get().is(menuValue) ? [] : [Option.none()];\n            }, function (data) {\n              return [Option.some(data)];\n            });\n          });\n          return sequence(triggers);\n        });\n      };\n      var expand = function (itemValue) {\n        return get(expansions.get(), itemValue).map(function (menu) {\n          var current = get(paths.get(), itemValue).getOr([]);\n          return [menu].concat(current);\n        });\n      };\n      var collapse = function (itemValue) {\n        return get(paths.get(), itemValue).bind(function (path) {\n          return path.length > 1 ? Option.some(path.slice(1)) : Option.none();\n        });\n      };\n      var refresh = function (itemValue) {\n        return get(paths.get(), itemValue);\n      };\n      var getPreparedMenu = function (menuValue) {\n        return lookupMenu(menuValue).bind(extractPreparedMenu);\n      };\n      var lookupMenu = function (menuValue) {\n        return get(menus.get(), menuValue);\n      };\n      var lookupItem = function (itemValue) {\n        return get(expansions.get(), itemValue);\n      };\n      var otherMenus = function (path) {\n        var menuValues = directory.get();\n        return difference(keys(menuValues), path);\n      };\n      var getPrimary = function () {\n        return primary.get().bind(getPreparedMenu);\n      };\n      var getMenus = function () {\n        return menus.get();\n      };\n      return {\n        setMenuBuilt: setMenuBuilt,\n        setContents: setContents,\n        expand: expand,\n        refresh: refresh,\n        collapse: collapse,\n        lookupMenu: lookupMenu,\n        lookupItem: lookupItem,\n        otherMenus: otherMenus,\n        getPrimary: getPrimary,\n        getMenus: getMenus,\n        clear: clear,\n        isClear: isClear,\n        getTriggeringPath: getTriggeringPath\n      };\n    };\n    var extractPreparedMenu = function (prep) {\n      return prep.type === 'prepared' ? Option.some(prep.menu) : Option.none();\n    };\n    var LayeredState = {\n      init: init$3,\n      extractPreparedMenu: extractPreparedMenu\n    };\n\n    var make$2 = function (detail, rawUiSpec) {\n      var submenuParentItems = Cell(Option.none());\n      var buildMenus = function (container, primaryName, menus) {\n        return map$1(menus, function (spec, name) {\n          var makeSketch = function () {\n            return Menu.sketch(__assign(__assign({ dom: spec.dom }, spec), {\n              value: name,\n              items: spec.items,\n              markers: detail.markers,\n              fakeFocus: detail.fakeFocus,\n              onHighlight: detail.onHighlight,\n              focusManager: detail.fakeFocus ? highlights() : dom()\n            }));\n          };\n          return name === primaryName ? {\n            type: 'prepared',\n            menu: container.getSystem().build(makeSketch())\n          } : {\n            type: 'notbuilt',\n            nbMenu: makeSketch\n          };\n        });\n      };\n      var layeredState = LayeredState.init();\n      var setup = function (container) {\n        var componentMap = buildMenus(container, detail.data.primary, detail.data.menus);\n        var directory = toDirectory();\n        layeredState.setContents(detail.data.primary, componentMap, detail.data.expansions, directory);\n        return layeredState.getPrimary();\n      };\n      var getItemValue = function (item) {\n        return Representing.getValue(item).value;\n      };\n      var getItemByValue = function (container, menus, itemValue) {\n        return findMap(menus, function (menu) {\n          if (!menu.getSystem().isConnected()) {\n            return Option.none();\n          }\n          var candidates = Highlighting.getCandidates(menu);\n          return find(candidates, function (c) {\n            return getItemValue(c) === itemValue;\n          });\n        });\n      };\n      var toDirectory = function (container) {\n        return map$1(detail.data.menus, function (data, menuName) {\n          return bind(data.items, function (item) {\n            return item.type === 'separator' ? [] : [item.data.value];\n          });\n        });\n      };\n      var setActiveMenu = function (container, menu) {\n        Highlighting.highlight(container, menu);\n        Highlighting.getHighlighted(menu).orThunk(function () {\n          return Highlighting.getFirst(menu);\n        }).each(function (item) {\n          dispatch(container, item.element(), focusItem());\n        });\n      };\n      var getMenus = function (state, menuValues) {\n        return cat(map(menuValues, function (mv) {\n          return state.lookupMenu(mv).bind(function (prep) {\n            return prep.type === 'prepared' ? Option.some(prep.menu) : Option.none();\n          });\n        }));\n      };\n      var closeOthers = function (container, state, path) {\n        var others = getMenus(state, state.otherMenus(path));\n        each(others, function (o) {\n          remove$5(o.element(), [detail.markers.backgroundMenu]);\n          if (!detail.stayInDom) {\n            Replacing.remove(container, o);\n          }\n        });\n      };\n      var getSubmenuParents = function (container) {\n        return submenuParentItems.get().getOrThunk(function () {\n          var r = {};\n          var items = descendants(container.element(), '.' + detail.markers.item);\n          var parentItems = filter(items, function (i) {\n            return get$2(i, 'aria-haspopup') === 'true';\n          });\n          each(parentItems, function (i) {\n            container.getSystem().getByDom(i).each(function (itemComp) {\n              var key = getItemValue(itemComp);\n              r[key] = itemComp;\n            });\n          });\n          submenuParentItems.set(Option.some(r));\n          return r;\n        });\n      };\n      var updateAriaExpansions = function (container, path) {\n        var parentItems = getSubmenuParents(container);\n        each$1(parentItems, function (v, k) {\n          var expanded = contains(path, k);\n          set$1(v.element(), 'aria-expanded', expanded);\n        });\n      };\n      var updateMenuPath = function (container, state, path) {\n        return Option.from(path[0]).bind(function (latestMenuName) {\n          return state.lookupMenu(latestMenuName).bind(function (menuPrep) {\n            if (menuPrep.type === 'notbuilt') {\n              return Option.none();\n            } else {\n              var activeMenu = menuPrep.menu;\n              var rest = getMenus(state, path.slice(1));\n              each(rest, function (r) {\n                add$2(r.element(), detail.markers.backgroundMenu);\n              });\n              if (!inBody(activeMenu.element())) {\n                Replacing.append(container, premade$1(activeMenu));\n              }\n              remove$5(activeMenu.element(), [detail.markers.backgroundMenu]);\n              setActiveMenu(container, activeMenu);\n              closeOthers(container, state, path);\n              return Option.some(activeMenu);\n            }\n          });\n        });\n      };\n      var ExpandHighlightDecision;\n      (function (ExpandHighlightDecision) {\n        ExpandHighlightDecision[ExpandHighlightDecision['HighlightSubmenu'] = 0] = 'HighlightSubmenu';\n        ExpandHighlightDecision[ExpandHighlightDecision['HighlightParent'] = 1] = 'HighlightParent';\n      }(ExpandHighlightDecision || (ExpandHighlightDecision = {})));\n      var buildIfRequired = function (container, menuName, menuPrep) {\n        if (menuPrep.type === 'notbuilt') {\n          var menu = container.getSystem().build(menuPrep.nbMenu());\n          layeredState.setMenuBuilt(menuName, menu);\n          return menu;\n        } else {\n          return menuPrep.menu;\n        }\n      };\n      var expandRight = function (container, item, decision) {\n        if (decision === void 0) {\n          decision = ExpandHighlightDecision.HighlightSubmenu;\n        }\n        var value = getItemValue(item);\n        return layeredState.expand(value).bind(function (path) {\n          updateAriaExpansions(container, path);\n          return Option.from(path[0]).bind(function (menuName) {\n            return layeredState.lookupMenu(menuName).bind(function (activeMenuPrep) {\n              var activeMenu = buildIfRequired(container, menuName, activeMenuPrep);\n              if (!inBody(activeMenu.element())) {\n                Replacing.append(container, premade$1(activeMenu));\n              }\n              detail.onOpenSubmenu(container, item, activeMenu, reverse(path));\n              if (decision === ExpandHighlightDecision.HighlightSubmenu) {\n                Highlighting.highlightFirst(activeMenu);\n                return updateMenuPath(container, layeredState, path);\n              } else {\n                Highlighting.dehighlightAll(activeMenu);\n                return Option.some(item);\n              }\n            });\n          });\n        });\n      };\n      var collapseLeft = function (container, item) {\n        var value = getItemValue(item);\n        return layeredState.collapse(value).bind(function (path) {\n          updateAriaExpansions(container, path);\n          return updateMenuPath(container, layeredState, path).map(function (activeMenu) {\n            detail.onCollapseMenu(container, item, activeMenu);\n            return activeMenu;\n          });\n        });\n      };\n      var updateView = function (container, item) {\n        var value = getItemValue(item);\n        return layeredState.refresh(value).bind(function (path) {\n          updateAriaExpansions(container, path);\n          return updateMenuPath(container, layeredState, path);\n        });\n      };\n      var onRight = function (container, item) {\n        return inside(item.element()) ? Option.none() : expandRight(container, item, ExpandHighlightDecision.HighlightSubmenu);\n      };\n      var onLeft = function (container, item) {\n        return inside(item.element()) ? Option.none() : collapseLeft(container, item);\n      };\n      var onEscape = function (container, item) {\n        return collapseLeft(container, item).orThunk(function () {\n          return detail.onEscape(container, item).map(function () {\n            return container;\n          });\n        });\n      };\n      var keyOnItem = function (f) {\n        return function (container, simulatedEvent) {\n          return closest$3(simulatedEvent.getSource(), '.' + detail.markers.item).bind(function (target) {\n            return container.getSystem().getByDom(target).toOption().bind(function (item) {\n              return f(container, item).map(function () {\n                return true;\n              });\n            });\n          });\n        };\n      };\n      var events = derive([\n        run(focus$4(), function (sandbox, simulatedEvent) {\n          var item = simulatedEvent.event().item();\n          layeredState.lookupItem(getItemValue(item)).each(function () {\n            var menu = simulatedEvent.event().menu();\n            Highlighting.highlight(sandbox, menu);\n            var value = getItemValue(simulatedEvent.event().item());\n            layeredState.refresh(value).each(function (path) {\n              return closeOthers(sandbox, layeredState, path);\n            });\n          });\n        }),\n        runOnExecute(function (component, simulatedEvent) {\n          var target = simulatedEvent.event().target();\n          component.getSystem().getByDom(target).each(function (item) {\n            var itemValue = getItemValue(item);\n            if (itemValue.indexOf('collapse-item') === 0) {\n              collapseLeft(component, item);\n            }\n            expandRight(component, item, ExpandHighlightDecision.HighlightSubmenu).fold(function () {\n              detail.onExecute(component, item);\n            }, function () {\n            });\n          });\n        }),\n        runOnAttached(function (container, simulatedEvent) {\n          setup(container).each(function (primary) {\n            Replacing.append(container, premade$1(primary));\n            detail.onOpenMenu(container, primary);\n            if (detail.highlightImmediately) {\n              setActiveMenu(container, primary);\n            }\n          });\n        })\n      ].concat(detail.navigateOnHover ? [run(hover(), function (sandbox, simulatedEvent) {\n          var item = simulatedEvent.event().item();\n          updateView(sandbox, item);\n          expandRight(sandbox, item, ExpandHighlightDecision.HighlightParent);\n          detail.onHover(sandbox, item);\n        })] : []));\n      var getActiveItem = function (container) {\n        return Highlighting.getHighlighted(container).bind(Highlighting.getHighlighted);\n      };\n      var collapseMenuApi = function (container) {\n        getActiveItem(container).each(function (currentItem) {\n          collapseLeft(container, currentItem);\n        });\n      };\n      var highlightPrimary = function (container) {\n        layeredState.getPrimary().each(function (primary) {\n          setActiveMenu(container, primary);\n        });\n      };\n      var extractMenuFromContainer = function (container) {\n        return Option.from(container.components()[0]).filter(function (comp) {\n          return get$2(comp.element(), 'role') === 'menu';\n        });\n      };\n      var repositionMenus = function (container) {\n        var maybeActivePrimary = layeredState.getPrimary().bind(function (primary) {\n          return getActiveItem(container).bind(function (currentItem) {\n            var itemValue = getItemValue(currentItem);\n            var allMenus = values(layeredState.getMenus());\n            var preparedMenus = cat(map(allMenus, LayeredState.extractPreparedMenu));\n            return layeredState.getTriggeringPath(itemValue, function (v) {\n              return getItemByValue(container, preparedMenus, v);\n            });\n          }).map(function (triggeringPath) {\n            return {\n              primary: primary,\n              triggeringPath: triggeringPath\n            };\n          });\n        });\n        maybeActivePrimary.fold(function () {\n          extractMenuFromContainer(container).each(function (primaryMenu) {\n            detail.onRepositionMenu(container, primaryMenu, []);\n          });\n        }, function (_a) {\n          var primary = _a.primary, triggeringPath = _a.triggeringPath;\n          detail.onRepositionMenu(container, primary, triggeringPath);\n        });\n      };\n      var apis = {\n        collapseMenu: collapseMenuApi,\n        highlightPrimary: highlightPrimary,\n        repositionMenus: repositionMenus\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        markers: detail.markers,\n        behaviours: augment(detail.tmenuBehaviours, [\n          Keying.config({\n            mode: 'special',\n            onRight: keyOnItem(onRight),\n            onLeft: keyOnItem(onLeft),\n            onEscape: keyOnItem(onEscape),\n            focusIn: function (container, keyInfo) {\n              layeredState.getPrimary().each(function (primary) {\n                dispatch(container, primary.element(), focusItem());\n              });\n            }\n          }),\n          Highlighting.config({\n            highlightClass: detail.markers.selectedMenu,\n            itemClass: detail.markers.menu\n          }),\n          Composing.config({\n            find: function (container) {\n              return Highlighting.getHighlighted(container);\n            }\n          }),\n          Replacing.config({})\n        ]),\n        eventOrder: detail.eventOrder,\n        apis: apis,\n        events: events\n      };\n    };\n    var collapseItem = constant('collapse-item');\n\n    var tieredData = function (primary, menus, expansions) {\n      return {\n        primary: primary,\n        menus: menus,\n        expansions: expansions\n      };\n    };\n    var singleData = function (name, menu) {\n      return {\n        primary: name,\n        menus: wrap$1(name, menu),\n        expansions: {}\n      };\n    };\n    var collapseItem$1 = function (text) {\n      return {\n        value: generate$1(collapseItem()),\n        meta: { text: text }\n      };\n    };\n    var tieredMenu = single$2({\n      name: 'TieredMenu',\n      configFields: [\n        onStrictKeyboardHandler('onExecute'),\n        onStrictKeyboardHandler('onEscape'),\n        onStrictHandler('onOpenMenu'),\n        onStrictHandler('onOpenSubmenu'),\n        onHandler('onRepositionMenu'),\n        onHandler('onCollapseMenu'),\n        defaulted$1('highlightImmediately', true),\n        strictObjOf('data', [\n          strict$1('primary'),\n          strict$1('menus'),\n          strict$1('expansions')\n        ]),\n        defaulted$1('fakeFocus', false),\n        onHandler('onHighlight'),\n        onHandler('onHover'),\n        tieredMenuMarkers(),\n        strict$1('dom'),\n        defaulted$1('navigateOnHover', true),\n        defaulted$1('stayInDom', false),\n        field$1('tmenuBehaviours', [\n          Keying,\n          Highlighting,\n          Composing,\n          Replacing\n        ]),\n        defaulted$1('eventOrder', {})\n      ],\n      apis: {\n        collapseMenu: function (apis, tmenu) {\n          apis.collapseMenu(tmenu);\n        },\n        highlightPrimary: function (apis, tmenu) {\n          apis.highlightPrimary(tmenu);\n        },\n        repositionMenus: function (apis, tmenu) {\n          apis.repositionMenus(tmenu);\n        }\n      },\n      factory: make$2,\n      extraApis: {\n        tieredData: tieredData,\n        singleData: singleData,\n        collapseItem: collapseItem$1\n      }\n    });\n\n    var makeMenu = function (detail, menuSandbox, anchor, menuSpec, getBounds) {\n      var lazySink = function () {\n        return detail.lazySink(menuSandbox);\n      };\n      var layouts = menuSpec.type === 'horizontal' ? {\n        layouts: {\n          onLtr: function () {\n            return belowOrAbove();\n          },\n          onRtl: function () {\n            return belowOrAboveRtl();\n          }\n        }\n      } : {};\n      var isFirstTierSubmenu = function (triggeringPaths) {\n        return triggeringPaths.length === 2;\n      };\n      var getSubmenuLayouts = function (triggeringPaths) {\n        return isFirstTierSubmenu(triggeringPaths) ? layouts : {};\n      };\n      return tieredMenu.sketch({\n        dom: { tag: 'div' },\n        data: menuSpec.data,\n        markers: menuSpec.menu.markers,\n        highlightImmediately: menuSpec.menu.highlightImmediately,\n        onEscape: function () {\n          Sandboxing.close(menuSandbox);\n          detail.onEscape.map(function (handler) {\n            return handler(menuSandbox);\n          });\n          return Option.some(true);\n        },\n        onExecute: function () {\n          return Option.some(true);\n        },\n        onOpenMenu: function (tmenu, menu) {\n          Positioning.positionWithinBounds(lazySink().getOrDie(), anchor, menu, getBounds());\n        },\n        onOpenSubmenu: function (tmenu, item, submenu, triggeringPaths) {\n          var sink = lazySink().getOrDie();\n          Positioning.position(sink, __assign({\n            anchor: 'submenu',\n            item: item\n          }, getSubmenuLayouts(triggeringPaths)), submenu);\n        },\n        onRepositionMenu: function (tmenu, primaryMenu, submenuTriggers) {\n          var sink = lazySink().getOrDie();\n          Positioning.positionWithinBounds(sink, anchor, primaryMenu, getBounds());\n          each(submenuTriggers, function (st) {\n            var submenuLayouts = getSubmenuLayouts(st.triggeringPath);\n            Positioning.position(sink, __assign({\n              anchor: 'submenu',\n              item: st.triggeringItem\n            }, submenuLayouts), st.triggeredMenu);\n          });\n        }\n      });\n    };\n    var factory = function (detail, spec) {\n      var isPartOfRelated = function (sandbox, queryElem) {\n        var related = detail.getRelated(sandbox);\n        return related.exists(function (rel) {\n          return isPartOf(rel, queryElem);\n        });\n      };\n      var setContent = function (sandbox, thing) {\n        Sandboxing.setContent(sandbox, thing);\n      };\n      var showAt = function (sandbox, anchor, thing) {\n        showWithin(sandbox, anchor, thing, Option.none());\n      };\n      var showWithin = function (sandbox, anchor, thing, boxElement) {\n        showWithinBounds(sandbox, anchor, thing, function () {\n          return boxElement.map(function (elem) {\n            return box(elem);\n          });\n        });\n      };\n      var showWithinBounds = function (sandbox, anchor, thing, getBounds) {\n        var sink = detail.lazySink(sandbox).getOrDie();\n        Sandboxing.openWhileCloaked(sandbox, thing, function () {\n          return Positioning.positionWithinBounds(sink, anchor, sandbox, getBounds());\n        });\n        Representing.setValue(sandbox, Option.some({\n          mode: 'position',\n          anchor: anchor,\n          getBounds: getBounds\n        }));\n      };\n      var showMenuAt = function (sandbox, anchor, menuSpec) {\n        showMenuWithinBounds(sandbox, anchor, menuSpec, function () {\n          return Option.none();\n        });\n      };\n      var showMenuWithinBounds = function (sandbox, anchor, menuSpec, getBounds) {\n        var menu = makeMenu(detail, sandbox, anchor, menuSpec, getBounds);\n        Sandboxing.open(sandbox, menu);\n        Representing.setValue(sandbox, Option.some({\n          mode: 'menu',\n          menu: menu\n        }));\n      };\n      var hide = function (sandbox) {\n        if (Sandboxing.isOpen(sandbox)) {\n          Representing.setValue(sandbox, Option.none());\n          Sandboxing.close(sandbox);\n        }\n      };\n      var getContent = function (sandbox) {\n        return Sandboxing.getState(sandbox);\n      };\n      var reposition = function (sandbox) {\n        if (Sandboxing.isOpen(sandbox)) {\n          Representing.getValue(sandbox).each(function (state) {\n            switch (state.mode) {\n            case 'menu':\n              Sandboxing.getState(sandbox).each(function (tmenu) {\n                tieredMenu.repositionMenus(tmenu);\n              });\n              break;\n            case 'position':\n              var sink = detail.lazySink(sandbox).getOrDie();\n              Positioning.positionWithinBounds(sink, state.anchor, sandbox, state.getBounds());\n              break;\n            }\n          });\n        }\n      };\n      var apis = {\n        setContent: setContent,\n        showAt: showAt,\n        showWithin: showWithin,\n        showWithinBounds: showWithinBounds,\n        showMenuAt: showMenuAt,\n        showMenuWithinBounds: showMenuWithinBounds,\n        hide: hide,\n        getContent: getContent,\n        reposition: reposition,\n        isOpen: Sandboxing.isOpen\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        behaviours: augment(detail.inlineBehaviours, [\n          Sandboxing.config({\n            isPartOf: function (sandbox, data, queryElem) {\n              return isPartOf(data, queryElem) || isPartOfRelated(sandbox, queryElem);\n            },\n            getAttachPoint: function (sandbox) {\n              return detail.lazySink(sandbox).getOrDie();\n            },\n            onOpen: function (sandbox) {\n              detail.onShow(sandbox);\n            },\n            onClose: function (sandbox) {\n              detail.onHide(sandbox);\n            }\n          }),\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: Option.none()\n            }\n          }),\n          Receiving.config({\n            channels: __assign(__assign({}, receivingChannel(__assign({ isExtraPart: spec.isExtraPart }, detail.fireDismissalEventInstead.map(function (fe) {\n              return { fireEventInstead: { event: fe.event } };\n            }).getOr({})))), receivingChannel$1(__assign(__assign({}, detail.fireRepositionEventInstead.map(function (fe) {\n              return { fireEventInstead: { event: fe.event } };\n            }).getOr({})), { doReposition: reposition })))\n          })\n        ]),\n        eventOrder: detail.eventOrder,\n        apis: apis\n      };\n    };\n    var InlineView = single$2({\n      name: 'InlineView',\n      configFields: [\n        strict$1('lazySink'),\n        onHandler('onShow'),\n        onHandler('onHide'),\n        optionFunction('onEscape'),\n        field$1('inlineBehaviours', [\n          Sandboxing,\n          Representing,\n          Receiving\n        ]),\n        optionObjOf('fireDismissalEventInstead', [defaulted$1('event', dismissRequested())]),\n        optionObjOf('fireRepositionEventInstead', [defaulted$1('event', repositionRequested())]),\n        defaulted$1('getRelated', Option.none),\n        defaulted$1('isExtraPart', never),\n        defaulted$1('eventOrder', Option.none)\n      ],\n      factory: factory,\n      apis: {\n        showAt: function (apis, component, anchor, thing) {\n          apis.showAt(component, anchor, thing);\n        },\n        showWithin: function (apis, component, anchor, thing, boxElement) {\n          apis.showWithin(component, anchor, thing, boxElement);\n        },\n        showWithinBounds: function (apis, component, anchor, thing, bounds) {\n          apis.showWithinBounds(component, anchor, thing, bounds);\n        },\n        showMenuAt: function (apis, component, anchor, menuSpec) {\n          apis.showMenuAt(component, anchor, menuSpec);\n        },\n        showMenuWithinBounds: function (apis, component, anchor, menuSpec, bounds) {\n          apis.showMenuWithinBounds(component, anchor, menuSpec, bounds);\n        },\n        hide: function (apis, component) {\n          apis.hide(component);\n        },\n        isOpen: function (apis, component) {\n          return apis.isOpen(component);\n        },\n        getContent: function (apis, component) {\n          return apis.getContent(component);\n        },\n        setContent: function (apis, component, thing) {\n          apis.setContent(component, thing);\n        },\n        reposition: function (apis, component) {\n          apis.reposition(component);\n        }\n      }\n    });\n\n    var westEdgeX$1 = function (anchor) {\n      return anchor.x();\n    };\n    var middleX$1 = function (anchor, element) {\n      return anchor.x() + anchor.width() / 2 - element.width() / 2;\n    };\n    var eastEdgeX$1 = function (anchor, element) {\n      return anchor.x() + anchor.width() - element.width();\n    };\n    var northY$2 = function (anchor) {\n      return anchor.y();\n    };\n    var southY$2 = function (anchor, element) {\n      return anchor.y() + anchor.height() - element.height();\n    };\n    var southeast$3 = function (anchor, element, bubbles) {\n      return nu$7(eastEdgeX$1(anchor, element), southY$2(anchor, element), bubbles.innerSoutheast(), northwest(), boundsRestriction(anchor, {\n        right: 0,\n        bottom: 3\n      }), 'layout-inner-se');\n    };\n    var southwest$3 = function (anchor, element, bubbles) {\n      return nu$7(westEdgeX$1(anchor), southY$2(anchor, element), bubbles.innerSouthwest(), northeast(), boundsRestriction(anchor, {\n        left: 1,\n        bottom: 3\n      }), 'layout-inner-sw');\n    };\n    var northeast$3 = function (anchor, element, bubbles) {\n      return nu$7(eastEdgeX$1(anchor, element), northY$2(anchor), bubbles.innerNortheast(), southwest(), boundsRestriction(anchor, {\n        right: 0,\n        top: 2\n      }), 'layout-inner-ne');\n    };\n    var northwest$3 = function (anchor, element, bubbles) {\n      return nu$7(westEdgeX$1(anchor), northY$2(anchor), bubbles.innerNorthwest(), southeast(), boundsRestriction(anchor, {\n        left: 1,\n        top: 2\n      }), 'layout-inner-nw');\n    };\n    var north$3 = function (anchor, element, bubbles) {\n      return nu$7(middleX$1(anchor, element), northY$2(anchor), bubbles.innerNorth(), south(), boundsRestriction(anchor, { top: 2 }), 'layout-inner-n');\n    };\n    var south$3 = function (anchor, element, bubbles) {\n      return nu$7(middleX$1(anchor, element), southY$2(anchor, element), bubbles.innerSouth(), north(), boundsRestriction(anchor, { bottom: 3 }), 'layout-inner-s');\n    };\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n    var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n    var global$4 = tinymce.util.Tools.resolve('tinymce.EditorManager');\n\n    var getSkinUrl = function (editor) {\n      var settings = editor.settings;\n      var skin = settings.skin;\n      var skinUrl = settings.skin_url;\n      if (skin !== false) {\n        var skinName = skin ? skin : 'oxide';\n        if (skinUrl) {\n          skinUrl = editor.documentBaseURI.toAbsolute(skinUrl);\n        } else {\n          skinUrl = global$4.baseURL + '/skins/ui/' + skinName;\n        }\n      }\n      return skinUrl;\n    };\n    var isReadOnly = function (editor) {\n      return editor.getParam('readonly', false, 'boolean');\n    };\n    var isSkinDisabled = function (editor) {\n      return editor.getParam('skin') === false;\n    };\n    var getHeightSetting = function (editor) {\n      return editor.getParam('height', Math.max(editor.getElement().offsetHeight, 200));\n    };\n    var getWidthSetting = function (editor) {\n      return editor.getParam('width', global$3.DOM.getStyle(editor.getElement(), 'width'));\n    };\n    var getMinWidthSetting = function (editor) {\n      return Option.from(editor.settings.min_width).filter(isNumber);\n    };\n    var getMinHeightSetting = function (editor) {\n      return Option.from(editor.settings.min_height).filter(isNumber);\n    };\n    var getMaxWidthSetting = function (editor) {\n      return Option.from(editor.getParam('max_width')).filter(isNumber);\n    };\n    var getMaxHeightSetting = function (editor) {\n      return Option.from(editor.getParam('max_height')).filter(isNumber);\n    };\n    var getUserStyleFormats = function (editor) {\n      return Option.from(editor.getParam('style_formats')).filter(isArray);\n    };\n    var isMergeStyleFormats = function (editor) {\n      return editor.getParam('style_formats_merge', false, 'boolean');\n    };\n    var getRemovedMenuItems = function (editor) {\n      return editor.getParam('removed_menuitems', '');\n    };\n    var isMenubarEnabled = function (editor) {\n      return editor.getParam('menubar', true, 'boolean') !== false;\n    };\n    var isToolbarEnabled = function (editor) {\n      var toolbar = editor.getParam('toolbar', true);\n      var isToolbarTrue = toolbar === true;\n      var isToolbarString = isString(toolbar);\n      var isToolbarObjectArray = isArray(toolbar) && toolbar.length > 0;\n      return !isMultipleToolbars(editor) && (isToolbarObjectArray || isToolbarString || isToolbarTrue);\n    };\n    var getMultipleToolbarsSetting = function (editor) {\n      var keys$1 = keys(editor.settings);\n      var toolbarKeys = filter(keys$1, function (key) {\n        return /^toolbar([1-9])$/.test(key);\n      });\n      var toolbars = map(toolbarKeys, function (key) {\n        return editor.getParam(key, false, 'string');\n      });\n      var toolbarArray = filter(toolbars, function (toolbar) {\n        return typeof toolbar === 'string';\n      });\n      return toolbarArray.length > 0 ? Option.some(toolbarArray) : Option.none();\n    };\n    var isMultipleToolbars = function (editor) {\n      return getMultipleToolbarsSetting(editor).fold(function () {\n        var toolbar = editor.getParam('toolbar', [], 'string[]');\n        return toolbar.length > 0;\n      }, function () {\n        return true;\n      });\n    };\n    var ToolbarMode;\n    (function (ToolbarMode) {\n      ToolbarMode['default'] = 'wrap';\n      ToolbarMode['floating'] = 'floating';\n      ToolbarMode['sliding'] = 'sliding';\n      ToolbarMode['scrolling'] = 'scrolling';\n    }(ToolbarMode || (ToolbarMode = {})));\n    var getToolbarMode = function (editor) {\n      return editor.getParam('toolbar_mode', '', 'string');\n    };\n    var ToolbarLocation;\n    (function (ToolbarLocation) {\n      ToolbarLocation['top'] = 'top';\n      ToolbarLocation['bottom'] = 'bottom';\n    }(ToolbarLocation || (ToolbarLocation = {})));\n    var getToolbarGroups = function (editor) {\n      return editor.getParam('toolbar_groups', {}, 'object');\n    };\n    var isToolbarLocationTop = function (editor) {\n      return editor.getParam('toolbar_location', ToolbarLocation.top, 'string') !== ToolbarLocation.bottom;\n    };\n    var fixedContainerSelector = function (editor) {\n      return editor.getParam('fixed_toolbar_container', '', 'string');\n    };\n    var fixedContainerElement = function (editor) {\n      var selector = fixedContainerSelector(editor);\n      return selector.length > 0 && editor.inline ? descendant$1(body(), selector) : Option.none();\n    };\n    var useFixedContainer = function (editor) {\n      return editor.inline && fixedContainerElement(editor).isSome();\n    };\n    var getUiContainer = function (editor) {\n      var fixedContainer = fixedContainerElement(editor);\n      return fixedContainer.getOr(body());\n    };\n    var isDistractionFree = function (editor) {\n      return editor.inline && !isMenubarEnabled(editor) && !isToolbarEnabled(editor) && !isMultipleToolbars(editor);\n    };\n    var isStickyToolbar = function (editor) {\n      var isStickyToolbar = editor.getParam('toolbar_sticky', false, 'boolean');\n      return (isStickyToolbar || editor.inline) && !useFixedContainer(editor) && !isDistractionFree(editor);\n    };\n    var isDraggableModal = function (editor) {\n      return editor.getParam('draggable_modal', false, 'boolean');\n    };\n\n    var factory$1 = function (detail) {\n      var events = events$7(detail.action);\n      var tag = detail.dom.tag;\n      var lookupAttr = function (attr) {\n        return get(detail.dom, 'attributes').bind(function (attrs) {\n          return get(attrs, attr);\n        });\n      };\n      var getModAttributes = function () {\n        if (tag === 'button') {\n          var type = lookupAttr('type').getOr('button');\n          var roleAttrs = lookupAttr('role').map(function (role) {\n            return { role: role };\n          }).getOr({});\n          return __assign({ type: type }, roleAttrs);\n        } else {\n          var role = lookupAttr('role').getOr('button');\n          return { role: role };\n        }\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: detail.components,\n        events: events,\n        behaviours: SketchBehaviours.augment(detail.buttonBehaviours, [\n          Focusing.config({}),\n          Keying.config({\n            mode: 'execution',\n            useSpace: true,\n            useEnter: true\n          })\n        ]),\n        domModification: { attributes: getModAttributes() },\n        eventOrder: detail.eventOrder\n      };\n    };\n    var Button = single$2({\n      name: 'Button',\n      factory: factory$1,\n      configFields: [\n        defaulted$1('uid', undefined),\n        strict$1('dom'),\n        defaulted$1('components', []),\n        SketchBehaviours.field('buttonBehaviours', [\n          Focusing,\n          Keying\n        ]),\n        option('action'),\n        option('role'),\n        defaulted$1('eventOrder', {})\n      ]\n    });\n\n    var record = function (spec) {\n      var uid = isSketchSpec(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$2('memento');\n      var get = function (anyInSystem) {\n        return anyInSystem.getSystem().getByUid(uid).getOrDie();\n      };\n      var getOpt = function (anyInSystem) {\n        return anyInSystem.getSystem().getByUid(uid).toOption();\n      };\n      var asSpec = function () {\n        return __assign(__assign({}, spec), { uid: uid });\n      };\n      return {\n        get: get,\n        getOpt: getOpt,\n        asSpec: asSpec\n      };\n    };\n\n    var defaultIcon = function (icons) {\n      return Option.from(icons()['temporary-placeholder']).getOr('!not found!');\n    };\n    var get$d = function (name, icons) {\n      return Option.from(icons()[name]).getOrThunk(function () {\n        return defaultIcon(icons);\n      });\n    };\n    var getOr = function (name, icons, fallback) {\n      return Option.from(icons()[name]).or(fallback).getOrThunk(function () {\n        return defaultIcon(icons);\n      });\n    };\n    var getFirst$1 = function (names, icons) {\n      return findMap(names, function (name) {\n        return Option.from(icons()[name]);\n      }).getOrThunk(function () {\n        return defaultIcon(icons);\n      });\n    };\n\n    var notificationIconMap = {\n      success: 'checkmark',\n      error: 'warning',\n      err: 'error',\n      warning: 'warning',\n      warn: 'warning',\n      info: 'info'\n    };\n    var factory$2 = function (detail) {\n      var memBannerText = record({\n        dom: {\n          tag: 'p',\n          innerHtml: detail.translationProvider(detail.text)\n        },\n        behaviours: derive$1([Replacing.config({})])\n      });\n      var renderPercentBar = function (percent) {\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-bar'],\n            attributes: { style: 'width: ' + percent + '%' }\n          }\n        };\n      };\n      var renderPercentText = function (percent) {\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-text'],\n            innerHtml: percent + '%'\n          }\n        };\n      };\n      var memBannerProgress = record({\n        dom: {\n          tag: 'div',\n          classes: detail.progress ? [\n            'tox-progress-bar',\n            'tox-progress-indicator'\n          ] : ['tox-progress-bar']\n        },\n        components: [\n          {\n            dom: {\n              tag: 'div',\n              classes: ['tox-bar-container']\n            },\n            components: [renderPercentBar(0)]\n          },\n          renderPercentText(0)\n        ],\n        behaviours: derive$1([Replacing.config({})])\n      });\n      var updateProgress = function (comp, percent) {\n        if (comp.getSystem().isConnected()) {\n          memBannerProgress.getOpt(comp).each(function (progress) {\n            Replacing.set(progress, [\n              {\n                dom: {\n                  tag: 'div',\n                  classes: ['tox-bar-container']\n                },\n                components: [renderPercentBar(percent)]\n              },\n              renderPercentText(percent)\n            ]);\n          });\n        }\n      };\n      var updateText = function (comp, text$1) {\n        if (comp.getSystem().isConnected()) {\n          var banner = memBannerText.get(comp);\n          Replacing.set(banner, [text(text$1)]);\n        }\n      };\n      var apis = {\n        updateProgress: updateProgress,\n        updateText: updateText\n      };\n      var iconChoices = flatten([\n        detail.icon.toArray(),\n        detail.level.toArray(),\n        detail.level.bind(function (level) {\n          return Option.from(notificationIconMap[level]);\n        }).toArray()\n      ]);\n      return {\n        uid: detail.uid,\n        dom: {\n          tag: 'div',\n          attributes: { role: 'alert' },\n          classes: detail.level.map(function (level) {\n            return [\n              'tox-notification',\n              'tox-notification--in',\n              'tox-notification--' + level\n            ];\n          }).getOr([\n            'tox-notification',\n            'tox-notification--in'\n          ])\n        },\n        components: [\n          {\n            dom: {\n              tag: 'div',\n              classes: ['tox-notification__icon'],\n              innerHtml: getFirst$1(iconChoices, detail.iconProvider)\n            }\n          },\n          {\n            dom: {\n              tag: 'div',\n              classes: ['tox-notification__body']\n            },\n            components: [memBannerText.asSpec()],\n            behaviours: derive$1([Replacing.config({})])\n          }\n        ].concat(detail.progress ? [memBannerProgress.asSpec()] : []).concat(!detail.closeButton ? [] : [Button.sketch({\n            dom: {\n              tag: 'button',\n              classes: [\n                'tox-notification__dismiss',\n                'tox-button',\n                'tox-button--naked',\n                'tox-button--icon'\n              ]\n            },\n            components: [{\n                dom: {\n                  tag: 'div',\n                  classes: ['tox-icon'],\n                  innerHtml: get$d('close', detail.iconProvider),\n                  attributes: { 'aria-label': detail.translationProvider('Close') }\n                }\n              }],\n            action: function (comp) {\n              detail.onAction(comp);\n            }\n          })]),\n        apis: apis\n      };\n    };\n    var Notification = single$2({\n      name: 'Notification',\n      factory: factory$2,\n      configFields: [\n        option('level'),\n        strict$1('progress'),\n        strict$1('icon'),\n        strict$1('onAction'),\n        strict$1('text'),\n        strict$1('iconProvider'),\n        strict$1('translationProvider'),\n        defaultedBoolean('closeButton', true)\n      ],\n      apis: {\n        updateProgress: function (apis, comp, percent) {\n          apis.updateProgress(comp, percent);\n        },\n        updateText: function (apis, comp, text) {\n          apis.updateText(comp, text);\n        }\n      }\n    });\n\n    function NotificationManagerImpl (editor, extras, uiMothership) {\n      var backstage = extras.backstage;\n      var isToolbarLocationTop$1 = isToolbarLocationTop(editor);\n      var getLayoutDirection = function (rel) {\n        switch (rel) {\n        case 'bc-bc':\n          return south$3;\n        case 'tc-tc':\n          return north$3;\n        case 'tc-bc':\n          return north$1;\n        case 'bc-tc':\n        default:\n          return south$1;\n        }\n      };\n      var prePositionNotifications = function (notifications) {\n        each(notifications, function (notification) {\n          return notification.moveTo(0, 0);\n        });\n      };\n      var positionNotifications = function (notifications) {\n        if (notifications.length > 0) {\n          head(notifications).each(function (firstItem) {\n            return firstItem.moveRel(null, 'banner');\n          });\n          each(notifications, function (notification, index) {\n            if (index > 0) {\n              notification.moveRel(notifications[index - 1].getEl(), 'bc-tc');\n            }\n          });\n        }\n      };\n      var reposition = function (notifications) {\n        prePositionNotifications(notifications);\n        positionNotifications(notifications);\n      };\n      var open = function (settings, closeCallback) {\n        var hideCloseButton = !settings.closeButton && settings.timeout && (settings.timeout > 0 || settings.timeout < 0);\n        var close = function () {\n          closeCallback();\n          InlineView.hide(notificationWrapper);\n        };\n        var notification = build$1(Notification.sketch({\n          text: settings.text,\n          level: contains([\n            'success',\n            'error',\n            'warning',\n            'warn',\n            'info'\n          ], settings.type) ? settings.type : undefined,\n          progress: settings.progressBar === true,\n          icon: Option.from(settings.icon),\n          closeButton: !hideCloseButton,\n          onAction: close,\n          iconProvider: backstage.shared.providers.icons,\n          translationProvider: backstage.shared.providers.translate\n        }));\n        var notificationWrapper = build$1(InlineView.sketch(__assign({\n          dom: {\n            tag: 'div',\n            classes: ['tox-notifications-container']\n          },\n          lazySink: extras.backstage.shared.getSink,\n          fireDismissalEventInstead: {}\n        }, isToolbarLocationTop$1 ? {} : { fireRepositionEventInstead: {} })));\n        uiMothership.add(notificationWrapper);\n        if (settings.timeout > 0) {\n          global$2.setTimeout(function () {\n            close();\n          }, settings.timeout);\n        }\n        return {\n          close: close,\n          moveTo: function (x, y) {\n            InlineView.showAt(notificationWrapper, {\n              anchor: 'makeshift',\n              x: x,\n              y: y\n            }, premade$1(notification));\n          },\n          moveRel: function (element, rel) {\n            if (rel !== 'banner') {\n              var layoutDirection_1 = getLayoutDirection(rel);\n              var nodeAnchor = {\n                anchor: 'node',\n                root: body(),\n                node: Option.some(Element.fromDom(element)),\n                layouts: {\n                  onRtl: function () {\n                    return [layoutDirection_1];\n                  },\n                  onLtr: function () {\n                    return [layoutDirection_1];\n                  }\n                }\n              };\n              InlineView.showAt(notificationWrapper, nodeAnchor, premade$1(notification));\n            } else {\n              InlineView.showAt(notificationWrapper, extras.backstage.shared.anchors.banner(), premade$1(notification));\n            }\n          },\n          text: function (nuText) {\n            Notification.updateText(notification, nuText);\n          },\n          settings: settings,\n          getEl: function () {\n            return notification.element().dom();\n          },\n          progressBar: {\n            value: function (percent) {\n              Notification.updateProgress(notification, percent);\n            }\n          }\n        };\n      };\n      var close = function (notification) {\n        notification.close();\n      };\n      var getArgs = function (notification) {\n        return notification.settings;\n      };\n      return {\n        open: open,\n        close: close,\n        reposition: reposition,\n        getArgs: getArgs\n      };\n    }\n\n    var first = function (fn, rate) {\n      var timer = null;\n      var cancel = function () {\n        if (timer !== null) {\n          domGlobals.clearTimeout(timer);\n          timer = null;\n        }\n      };\n      var throttle = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        if (timer === null) {\n          timer = domGlobals.setTimeout(function () {\n            fn.apply(null, args);\n            timer = null;\n          }, rate);\n        }\n      };\n      return {\n        cancel: cancel,\n        throttle: throttle\n      };\n    };\n    var last$2 = function (fn, rate) {\n      var timer = null;\n      var cancel = function () {\n        if (timer !== null) {\n          domGlobals.clearTimeout(timer);\n          timer = null;\n        }\n      };\n      var throttle = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        if (timer !== null) {\n          domGlobals.clearTimeout(timer);\n        }\n        timer = domGlobals.setTimeout(function () {\n          fn.apply(null, args);\n          timer = null;\n        }, rate);\n      };\n      return {\n        cancel: cancel,\n        throttle: throttle\n      };\n    };\n\n    var global$5 = tinymce.util.Tools.resolve('tinymce.dom.TextSeeker');\n\n    var isBoundary = function (dom, node) {\n      return dom.isBlock(node) || contains([\n        'BR',\n        'IMG',\n        'HR',\n        'INPUT'\n      ], node.nodeName) || dom.getContentEditable(node) === 'false';\n    };\n    var repeatLeft = function (dom, node, offset, process, rootNode) {\n      var search = global$5(dom, function (node) {\n        return isBoundary(dom, node);\n      });\n      return Option.from(search.backwards(node, offset, process, rootNode));\n    };\n\n    var autocompleteSelector = '[data-mce-autocompleter]';\n    var create$4 = function (editor, range) {\n      return detect$4(Element.fromDom(editor.selection.getNode())).getOrThunk(function () {\n        var wrapper = Element.fromHtml('<span data-mce-autocompleter=\"1\" data-mce-bogus=\"1\"></span>', editor.getDoc());\n        append(wrapper, Element.fromDom(range.extractContents()));\n        range.insertNode(wrapper.dom());\n        parent(wrapper).each(function (elm) {\n          return elm.dom().normalize();\n        });\n        last$1(wrapper).map(function (last) {\n          editor.selection.setCursorLocation(last.dom(), getEnd(last));\n        });\n        return wrapper;\n      });\n    };\n    var detect$4 = function (elm) {\n      return closest$3(elm, autocompleteSelector);\n    };\n\n    var isValidTextRange = function (rng) {\n      return rng.collapsed && rng.startContainer.nodeType === 3;\n    };\n    var getText = function (rng) {\n      return rng.toString().replace(/\\u00A0/g, ' ').replace(/\\uFEFF/g, '');\n    };\n    var isWhitespace = function (chr) {\n      return chr !== '' && ' \\xA0\\f\\n\\r\\t\\x0B'.indexOf(chr) !== -1;\n    };\n\n    var stripTriggerChar = function (text, triggerCh) {\n      return text.substring(triggerCh.length);\n    };\n    var findChar = function (text, index, ch) {\n      var i;\n      for (i = index - 1; i >= 0; i--) {\n        var char = text.charAt(i);\n        if (isWhitespace(char)) {\n          return Option.none();\n        }\n        if (char === ch) {\n          break;\n        }\n      }\n      return Option.some(i);\n    };\n    var findStart = function (dom, initRange, ch, minChars) {\n      if (minChars === void 0) {\n        minChars = 0;\n      }\n      if (!isValidTextRange(initRange)) {\n        return Option.none();\n      }\n      var findTriggerChIndex = function (element, offset, text) {\n        return findChar(text, offset, ch).getOr(offset);\n      };\n      var root = dom.getParent(initRange.startContainer, dom.isBlock) || dom.getRoot();\n      return repeatLeft(dom, initRange.startContainer, initRange.startOffset, findTriggerChIndex, root).bind(function (spot) {\n        var range = initRange.cloneRange();\n        range.setStart(spot.container, spot.offset);\n        range.setEnd(initRange.endContainer, initRange.endOffset);\n        if (range.collapsed) {\n          return Option.none();\n        }\n        var text = getText(range);\n        var triggerCharIndex = text.lastIndexOf(ch);\n        if (triggerCharIndex !== 0 || stripTriggerChar(text, ch).length < minChars) {\n          return Option.none();\n        } else {\n          return Option.some({\n            text: stripTriggerChar(text, ch),\n            range: range,\n            triggerChar: ch\n          });\n        }\n      });\n    };\n    var getContext = function (dom, initRange, ch, minChars) {\n      if (minChars === void 0) {\n        minChars = 0;\n      }\n      return detect$4(Element.fromDom(initRange.startContainer)).fold(function () {\n        return findStart(dom, initRange, ch, minChars);\n      }, function (elm) {\n        var range = dom.createRng();\n        range.selectNode(elm.dom());\n        var text = getText(range);\n        return Option.some({\n          range: range,\n          text: stripTriggerChar(text, ch),\n          triggerChar: ch\n        });\n      });\n    };\n\n    var setup = function (api, editor) {\n      editor.on('keypress compositionend', api.onKeypress.throttle);\n      editor.on('remove', api.onKeypress.cancel);\n      var redirectKeyToItem = function (item, e) {\n        emitWith(item, keydown(), { raw: e });\n      };\n      editor.on('keydown', function (e) {\n        var getItem = function () {\n          return api.getView().bind(Highlighting.getHighlighted);\n        };\n        if (e.which === 8) {\n          api.onKeypress.throttle(e);\n        }\n        if (api.isActive()) {\n          if (e.which === 27) {\n            api.cancelIfNecessary();\n          }\n          if (api.isMenuOpen()) {\n            if (e.which === 13) {\n              getItem().each(emitExecute);\n              e.preventDefault();\n            } else if (e.which === 40) {\n              getItem().fold(function () {\n                api.getView().each(Highlighting.highlightFirst);\n              }, function (item) {\n                redirectKeyToItem(item, e);\n              });\n              e.preventDefault();\n              e.stopImmediatePropagation();\n            } else if (e.which === 37 || e.which === 38 || e.which === 39) {\n              getItem().each(function (item) {\n                redirectKeyToItem(item, e);\n                e.preventDefault();\n                e.stopImmediatePropagation();\n              });\n            }\n          } else {\n            if (e.which === 13 || e.which === 38 || e.which === 40) {\n              api.cancelIfNecessary();\n            }\n          }\n        }\n      });\n      editor.on('NodeChange', function (e) {\n        if (api.isActive() && !api.isProcessingAction() && detect$4(Element.fromDom(e.element)).isNone()) {\n          api.cancelIfNecessary();\n        }\n      });\n    };\n    var AutocompleterEditorEvents = { setup: setup };\n\n    var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n    var point$2 = function (container, offset) {\n      return {\n        container: container,\n        offset: offset\n      };\n    };\n\n    var isText$1 = function (node) {\n      return node.nodeType === domGlobals.Node.TEXT_NODE;\n    };\n    var isElement$1 = function (node) {\n      return node.nodeType === domGlobals.Node.ELEMENT_NODE;\n    };\n    var toLast = function (node) {\n      if (isText$1(node)) {\n        return point$2(node, node.data.length);\n      } else {\n        var children = node.childNodes;\n        return children.length > 0 ? toLast(children[children.length - 1]) : point$2(node, children.length);\n      }\n    };\n    var toLeaf = function (node, offset) {\n      var children = node.childNodes;\n      if (children.length > 0 && offset < children.length) {\n        return toLeaf(children[offset], 0);\n      } else if (children.length > 0 && isElement$1(node) && children.length === offset) {\n        return toLast(children[children.length - 1]);\n      } else {\n        return point$2(node, offset);\n      }\n    };\n\n    var isPreviousCharContent = function (dom, leaf) {\n      return repeatLeft(dom, leaf.container, leaf.offset, function (element, offset) {\n        return offset === 0 ? -1 : offset;\n      }, dom.getRoot()).filter(function (spot) {\n        var char = spot.container.data.charAt(spot.offset - 1);\n        return !isWhitespace(char);\n      }).isSome();\n    };\n    var isStartOfWord = function (dom) {\n      return function (rng) {\n        var leaf = toLeaf(rng.startContainer, rng.startOffset);\n        return !isPreviousCharContent(dom, leaf);\n      };\n    };\n    var getTriggerContext = function (dom, initRange, database) {\n      return findMap(database.triggerChars, function (ch) {\n        return getContext(dom, initRange, ch);\n      });\n    };\n    var lookup = function (editor, getDatabase) {\n      var database = getDatabase();\n      var rng = editor.selection.getRng();\n      return getTriggerContext(editor.dom, rng, database).bind(function (context) {\n        return lookupWithContext(editor, getDatabase, context);\n      });\n    };\n    var lookupWithContext = function (editor, getDatabase, context, fetchOptions) {\n      if (fetchOptions === void 0) {\n        fetchOptions = {};\n      }\n      var database = getDatabase();\n      var rng = editor.selection.getRng();\n      var startText = rng.startContainer.nodeValue;\n      var autocompleters = filter(database.lookupByChar(context.triggerChar), function (autocompleter) {\n        return context.text.length >= autocompleter.minChars && autocompleter.matches.getOrThunk(function () {\n          return isStartOfWord(editor.dom);\n        })(context.range, startText, context.text);\n      });\n      if (autocompleters.length === 0) {\n        return Option.none();\n      }\n      var lookupData = global$6.all(map(autocompleters, function (ac) {\n        var fetchResult = ac.fetch(context.text, ac.maxResults, fetchOptions);\n        return fetchResult.then(function (results) {\n          return {\n            matchText: context.text,\n            items: results,\n            columns: ac.columns,\n            onAction: ac.onAction\n          };\n        });\n      }));\n      return Option.some({\n        lookupData: lookupData,\n        context: context\n      });\n    };\n\n    var separatorMenuItemSchema = objOf([\n      strictString('type'),\n      optionString('text')\n    ]);\n    var createSeparatorMenuItem = function (spec) {\n      return asRaw('separatormenuitem', separatorMenuItemSchema, spec);\n    };\n\n    var autocompleterItemSchema = objOf([\n      state$1('type', function () {\n        return 'autocompleteitem';\n      }),\n      state$1('active', function () {\n        return false;\n      }),\n      state$1('disabled', function () {\n        return false;\n      }),\n      defaulted$1('meta', {}),\n      strictString('value'),\n      optionString('text'),\n      optionString('icon')\n    ]);\n    var autocompleterSchema = objOf([\n      strictString('type'),\n      strictString('ch'),\n      defaultedNumber('minChars', 1),\n      defaulted$1('columns', 1),\n      defaultedNumber('maxResults', 10),\n      optionFunction('matches'),\n      strictFunction('fetch'),\n      strictFunction('onAction')\n    ]);\n    var createSeparatorItem = function (spec) {\n      return asRaw('Autocompleter.Separator', separatorMenuItemSchema, spec);\n    };\n    var createAutocompleterItem = function (spec) {\n      return asRaw('Autocompleter.Item', autocompleterItemSchema, spec);\n    };\n    var createAutocompleter = function (spec) {\n      return asRaw('Autocompleter', autocompleterSchema, spec);\n    };\n\n    var stringArray = function (a) {\n      var all = {};\n      each(a, function (key) {\n        all[key] = {};\n      });\n      return keys(all);\n    };\n\n    var register = function (editor) {\n      var popups = editor.ui.registry.getAll().popups;\n      var dataset = map$1(popups, function (popup) {\n        return createAutocompleter(popup).fold(function (err) {\n          throw new Error(formatError(err));\n        }, function (x) {\n          return x;\n        });\n      });\n      var triggerChars = stringArray(mapToArray(dataset, function (v) {\n        return v.ch;\n      }));\n      var datasetValues = values(dataset);\n      var lookupByChar = function (ch) {\n        return filter(datasetValues, function (dv) {\n          return dv.ch === ch;\n        });\n      };\n      return {\n        dataset: dataset,\n        triggerChars: triggerChars,\n        lookupByChar: lookupByChar\n      };\n    };\n\n    var commonMenuItemFields = [\n      defaultedBoolean('disabled', false),\n      optionString('text'),\n      optionString('shortcut'),\n      field('value', 'value', defaultedThunk(function () {\n        return generate$1('menuitem-value');\n      }), anyValue$1()),\n      defaulted$1('meta', {})\n    ];\n\n    var menuItemSchema = objOf([\n      strictString('type'),\n      defaultedFunction('onSetup', function () {\n        return noop;\n      }),\n      defaultedFunction('onAction', noop),\n      optionString('icon')\n    ].concat(commonMenuItemFields));\n    var createMenuItem = function (spec) {\n      return asRaw('menuitem', menuItemSchema, spec);\n    };\n\n    var nestedMenuItemSchema = objOf([\n      strictString('type'),\n      strictFunction('getSubmenuItems'),\n      defaultedFunction('onSetup', function () {\n        return noop;\n      }),\n      optionString('icon')\n    ].concat(commonMenuItemFields));\n    var createNestedMenuItem = function (spec) {\n      return asRaw('nestedmenuitem', nestedMenuItemSchema, spec);\n    };\n\n    var toggleMenuItemSchema = objOf([\n      strictString('type'),\n      defaultedBoolean('active', false),\n      defaultedFunction('onSetup', function () {\n        return noop;\n      }),\n      strictFunction('onAction')\n    ].concat(commonMenuItemFields));\n    var createToggleMenuItem = function (spec) {\n      return asRaw('togglemenuitem', toggleMenuItemSchema, spec);\n    };\n\n    var choiceMenuItemSchema = objOf([\n      strictString('type'),\n      defaultedBoolean('active', false),\n      optionString('icon')\n    ].concat(commonMenuItemFields));\n    var createChoiceMenuItem = function (spec) {\n      return asRaw('choicemenuitem', choiceMenuItemSchema, spec);\n    };\n\n    var fancyTypes = [\n      'inserttable',\n      'colorswatch'\n    ];\n    var fancyMenuItemSchema = objOf([\n      strictString('type'),\n      strictStringEnum('fancytype', fancyTypes),\n      defaultedFunction('onAction', noop)\n    ]);\n    var createFancyMenuItem = function (spec) {\n      return asRaw('fancymenuitem', fancyMenuItemSchema, spec);\n    };\n\n    var detectSize = function (comp, margin, selectorClass) {\n      var descendants$1 = descendants(comp.element(), '.' + selectorClass);\n      if (descendants$1.length > 0) {\n        var columnLength = findIndex(descendants$1, function (c) {\n          var thisTop = c.dom().getBoundingClientRect().top;\n          var cTop = descendants$1[0].dom().getBoundingClientRect().top;\n          return Math.abs(thisTop - cTop) > margin;\n        }).getOr(descendants$1.length);\n        return Option.some({\n          numColumns: columnLength,\n          numRows: Math.ceil(descendants$1.length / columnLength)\n        });\n      } else {\n        return Option.none();\n      }\n    };\n\n    var namedEvents = function (name, handlers) {\n      return derive$1([config(name, handlers)]);\n    };\n    var unnamedEvents = function (handlers) {\n      return namedEvents(generate$1('unnamed-events'), handlers);\n    };\n    var SimpleBehaviours = {\n      namedEvents: namedEvents,\n      unnamedEvents: unnamedEvents\n    };\n\n    var TooltippingSchema = [\n      strict$1('lazySink'),\n      strict$1('tooltipDom'),\n      defaulted$1('exclusive', true),\n      defaulted$1('tooltipComponents', []),\n      defaulted$1('delay', 300),\n      defaultedStringEnum('mode', 'normal', [\n        'normal',\n        'follow-highlight'\n      ]),\n      defaulted$1('anchor', function (comp) {\n        return {\n          anchor: 'hotspot',\n          hotspot: comp,\n          layouts: {\n            onLtr: constant([\n              south$1,\n              north$1,\n              southeast$1,\n              northeast$1,\n              southwest$1,\n              northwest$1\n            ]),\n            onRtl: constant([\n              south$1,\n              north$1,\n              southeast$1,\n              northeast$1,\n              southwest$1,\n              northwest$1\n            ])\n          }\n        };\n      }),\n      onHandler('onHide'),\n      onHandler('onShow')\n    ];\n\n    var init$4 = function () {\n      var timer = Cell(Option.none());\n      var popup = Cell(Option.none());\n      var getTooltip = function () {\n        return popup.get();\n      };\n      var setTooltip = function (comp) {\n        popup.set(Option.some(comp));\n      };\n      var clearTooltip = function () {\n        popup.set(Option.none());\n      };\n      var clearTimer = function () {\n        timer.get().each(function (t) {\n          domGlobals.clearTimeout(t);\n        });\n      };\n      var resetTimer = function (f, delay) {\n        clearTimer();\n        timer.set(Option.some(domGlobals.setTimeout(function () {\n          f();\n        }, delay)));\n      };\n      var isShowing = function () {\n        return popup.get().isSome();\n      };\n      var readState = constant('not-implemented');\n      return nu$5({\n        getTooltip: getTooltip,\n        isShowing: isShowing,\n        setTooltip: setTooltip,\n        clearTooltip: clearTooltip,\n        clearTimer: clearTimer,\n        resetTimer: resetTimer,\n        readState: readState\n      });\n    };\n\n    var TooltippingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$4\n    });\n\n    var ExclusivityChannel = generate$1('tooltip.exclusive');\n    var ShowTooltipEvent = generate$1('tooltip.show');\n    var HideTooltipEvent = generate$1('tooltip.hide');\n\n    var hideAllExclusive = function (component, tConfig, tState) {\n      component.getSystem().broadcastOn([ExclusivityChannel], {});\n    };\n    var setComponents = function (component, tConfig, tState, specs) {\n      tState.getTooltip().each(function (tooltip) {\n        if (tooltip.getSystem().isConnected()) {\n          Replacing.set(tooltip, specs);\n        }\n      });\n    };\n\n    var TooltippingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        hideAllExclusive: hideAllExclusive,\n        setComponents: setComponents\n    });\n\n    var events$8 = function (tooltipConfig, state) {\n      var hide = function (comp) {\n        state.getTooltip().each(function (p) {\n          detach(p);\n          tooltipConfig.onHide(comp, p);\n          state.clearTooltip();\n        });\n        state.clearTimer();\n      };\n      var show = function (comp) {\n        if (!state.isShowing()) {\n          hideAllExclusive(comp);\n          var sink = tooltipConfig.lazySink(comp).getOrDie();\n          var popup = comp.getSystem().build({\n            dom: tooltipConfig.tooltipDom,\n            components: tooltipConfig.tooltipComponents,\n            events: derive(tooltipConfig.mode === 'normal' ? [\n              run(mouseover(), function (_) {\n                emit(comp, ShowTooltipEvent);\n              }),\n              run(mouseout(), function (_) {\n                emit(comp, HideTooltipEvent);\n              })\n            ] : []),\n            behaviours: derive$1([Replacing.config({})])\n          });\n          state.setTooltip(popup);\n          attach$1(sink, popup);\n          tooltipConfig.onShow(comp, popup);\n          Positioning.position(sink, tooltipConfig.anchor(comp), popup);\n        }\n      };\n      return derive(flatten([\n        [\n          run(ShowTooltipEvent, function (comp) {\n            state.resetTimer(function () {\n              show(comp);\n            }, tooltipConfig.delay);\n          }),\n          run(HideTooltipEvent, function (comp) {\n            state.resetTimer(function () {\n              hide(comp);\n            }, tooltipConfig.delay);\n          }),\n          run(receive(), function (comp, message) {\n            var receivingData = message;\n            if (contains(receivingData.channels(), ExclusivityChannel)) {\n              hide(comp);\n            }\n          }),\n          runOnDetached(function (comp) {\n            hide(comp);\n          })\n        ],\n        tooltipConfig.mode === 'normal' ? [\n          run(focusin(), function (comp) {\n            emit(comp, ShowTooltipEvent);\n          }),\n          run(postBlur(), function (comp) {\n            emit(comp, HideTooltipEvent);\n          }),\n          run(mouseover(), function (comp) {\n            emit(comp, ShowTooltipEvent);\n          }),\n          run(mouseout(), function (comp) {\n            emit(comp, HideTooltipEvent);\n          })\n        ] : [\n          run(highlight(), function (comp, se) {\n            emit(comp, ShowTooltipEvent);\n          }),\n          run(dehighlight(), function (comp) {\n            emit(comp, HideTooltipEvent);\n          })\n        ]\n      ]));\n    };\n\n    var ActiveTooltipping = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$8\n    });\n\n    var Tooltipping = create$1({\n      fields: TooltippingSchema,\n      name: 'tooltipping',\n      active: ActiveTooltipping,\n      state: TooltippingState,\n      apis: TooltippingApis\n    });\n\n    var global$7 = tinymce.util.Tools.resolve('tinymce.util.I18n');\n\n    var navClass = 'tox-menu-nav__js';\n    var selectableClass = 'tox-collection__item';\n    var colorClass = 'tox-swatch';\n    var presetClasses = {\n      normal: navClass,\n      color: colorClass\n    };\n    var tickedClass = 'tox-collection__item--enabled';\n    var groupHeadingClass = 'tox-collection__group-heading';\n    var iconClass = 'tox-collection__item-icon';\n    var textClass = 'tox-collection__item-label';\n    var accessoryClass = 'tox-collection__item-accessory';\n    var caretClass = 'tox-collection__item-caret';\n    var checkmarkClass = 'tox-collection__item-checkmark';\n    var activeClass = 'tox-collection__item--active';\n    var iconClassRtl = 'tox-collection__item-icon-rtl';\n    var classForPreset = function (presets) {\n      return get(presetClasses, presets).getOr(navClass);\n    };\n\n    var global$8 = tinymce.util.Tools.resolve('tinymce.Env');\n\n    var convertText = function (source) {\n      var mac = {\n        alt: '&#x2325;',\n        ctrl: '&#x2303;',\n        shift: '&#x21E7;',\n        meta: '&#x2318;',\n        access: '&#x2303;&#x2325;'\n      };\n      var other = {\n        meta: 'Ctrl',\n        access: 'Shift+Alt'\n      };\n      var replace = global$8.mac ? mac : other;\n      var shortcut = source.split('+');\n      var updated = map(shortcut, function (segment) {\n        var search = segment.toLowerCase().trim();\n        return has(replace, search) ? replace[search] : segment;\n      });\n      return global$8.mac ? updated.join('') : updated.join('+');\n    };\n    var ConvertShortcut = { convertText: convertText };\n\n    var renderIcon = function (iconHtml) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [iconClass],\n          innerHtml: iconHtml\n        }\n      };\n    };\n    var renderText = function (text$1) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [textClass]\n        },\n        components: [text(global$7.translate(text$1))]\n      };\n    };\n    var renderHtml = function (html) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [textClass],\n          innerHtml: html\n        }\n      };\n    };\n    var renderStyledText = function (style, text$1) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [textClass]\n        },\n        components: [{\n            dom: {\n              tag: style.tag,\n              styles: style.styles\n            },\n            components: [text(global$7.translate(text$1))]\n          }]\n      };\n    };\n    var renderShortcut = function (shortcut) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [accessoryClass],\n          innerHtml: ConvertShortcut.convertText(shortcut)\n        }\n      };\n    };\n    var renderCheckmark = function (icons) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            iconClass,\n            checkmarkClass\n          ],\n          innerHtml: get$d('checkmark', icons)\n        }\n      };\n    };\n    var renderSubmenuCaret = function (icons) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [caretClass],\n          innerHtml: get$d('chevron-right', icons)\n        }\n      };\n    };\n    var renderDownwardsCaret = function (icons) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [caretClass],\n          innerHtml: get$d('chevron-down', icons)\n        }\n      };\n    };\n\n    var renderColorStructure = function (itemText, itemValue, iconSvg, providerBackstage) {\n      var colorPickerCommand = 'custom';\n      var removeColorCommand = 'remove';\n      var getDom = function () {\n        var common = colorClass;\n        var icon = iconSvg.getOr('');\n        var attributes = itemText.map(function (text) {\n          return { title: providerBackstage.translate(text) };\n        }).getOr({});\n        var baseDom = {\n          tag: 'div',\n          attributes: attributes,\n          classes: [common]\n        };\n        if (itemValue === colorPickerCommand) {\n          return __assign(__assign({}, baseDom), {\n            tag: 'button',\n            classes: __spreadArrays(baseDom.classes, ['tox-swatches__picker-btn']),\n            innerHtml: icon\n          });\n        } else if (itemValue === removeColorCommand) {\n          return __assign(__assign({}, baseDom), {\n            classes: __spreadArrays(baseDom.classes, ['tox-swatch--remove']),\n            innerHtml: icon\n          });\n        } else {\n          return __assign(__assign({}, baseDom), {\n            attributes: __assign(__assign({}, baseDom.attributes), { 'data-mce-color': itemValue }),\n            styles: { 'background-color': itemValue }\n          });\n        }\n      };\n      return {\n        dom: getDom(),\n        optComponents: []\n      };\n    };\n    var renderNormalItemStructure = function (info, icon, renderIcons, textRender, rtlClass) {\n      var leftIcon = renderIcons ? info.checkMark.orThunk(function () {\n        return icon.or(Option.some('')).map(renderIcon);\n      }) : Option.none();\n      var domTitle = info.ariaLabel.map(function (label) {\n        return { attributes: { title: global$7.translate(label) } };\n      }).getOr({});\n      var dom = __assign({\n        tag: 'div',\n        classes: [\n          navClass,\n          selectableClass\n        ].concat(rtlClass ? [iconClassRtl] : [])\n      }, domTitle);\n      var content = info.htmlContent.fold(function () {\n        return info.textContent.map(textRender);\n      }, function (html) {\n        return Option.some(renderHtml(html));\n      });\n      var menuItem = {\n        dom: dom,\n        optComponents: [\n          leftIcon,\n          content,\n          info.shortcutContent.map(renderShortcut),\n          info.caret\n        ]\n      };\n      return menuItem;\n    };\n    var rtlIcon = [\n      'list-num-default',\n      'list-num-lower-alpha',\n      'list-num-lower-greek',\n      'list-num-lower-roman',\n      'list-num-upper-alpha',\n      'list-num-upper-roman'\n    ];\n    var rtlTransform = [\n      'list-bull-circle',\n      'list-bull-default',\n      'list-bull-square'\n    ];\n    var renderItemStructure = function (info, providersBackstage, renderIcons, fallbackIcon) {\n      if (fallbackIcon === void 0) {\n        fallbackIcon = Option.none();\n      }\n      var getIconName = function (iconName) {\n        return iconName.map(function (name) {\n          return global$7.isRtl() && contains(rtlIcon, name) ? name + '-rtl' : name;\n        });\n      };\n      var needRtlClass = global$7.isRtl() && info.iconContent.exists(function (name) {\n        return contains(rtlTransform, name);\n      });\n      var icon = getIconName(info.iconContent).map(function (iconName) {\n        return getOr(iconName, providersBackstage.icons, fallbackIcon);\n      });\n      var textRender = Option.from(info.meta).fold(function () {\n        return renderText;\n      }, function (meta) {\n        return has(meta, 'style') ? curry(renderStyledText, meta.style) : renderText;\n      });\n      if (info.presets === 'color') {\n        return renderColorStructure(info.ariaLabel, info.value, icon, providersBackstage);\n      } else {\n        return renderNormalItemStructure(info, icon, renderIcons, textRender, needRtlClass);\n      }\n    };\n\n    var nativeDisabled = [\n      'input',\n      'button',\n      'textarea',\n      'select'\n    ];\n    var onLoad$5 = function (component, disableConfig, disableState) {\n      if (disableConfig.disabled) {\n        disable(component, disableConfig);\n      }\n    };\n    var hasNative = function (component, config) {\n      return config.useNative === true && contains(nativeDisabled, name(component.element()));\n    };\n    var nativeIsDisabled = function (component) {\n      return has$1(component.element(), 'disabled');\n    };\n    var nativeDisable = function (component) {\n      set$1(component.element(), 'disabled', 'disabled');\n    };\n    var nativeEnable = function (component) {\n      remove$1(component.element(), 'disabled');\n    };\n    var ariaIsDisabled = function (component) {\n      return get$2(component.element(), 'aria-disabled') === 'true';\n    };\n    var ariaDisable = function (component) {\n      set$1(component.element(), 'aria-disabled', 'true');\n    };\n    var ariaEnable = function (component) {\n      set$1(component.element(), 'aria-disabled', 'false');\n    };\n    var disable = function (component, disableConfig, disableState) {\n      disableConfig.disableClass.each(function (disableClass) {\n        add$2(component.element(), disableClass);\n      });\n      var f = hasNative(component, disableConfig) ? nativeDisable : ariaDisable;\n      f(component);\n      disableConfig.onDisabled(component);\n    };\n    var enable = function (component, disableConfig, disableState) {\n      disableConfig.disableClass.each(function (disableClass) {\n        remove$4(component.element(), disableClass);\n      });\n      var f = hasNative(component, disableConfig) ? nativeEnable : ariaEnable;\n      f(component);\n      disableConfig.onEnabled(component);\n    };\n    var isDisabled = function (component, disableConfig) {\n      return hasNative(component, disableConfig) ? nativeIsDisabled(component) : ariaIsDisabled(component);\n    };\n    var set$7 = function (component, disableConfig, disableState, disabled) {\n      var f = disabled ? disable : enable;\n      f(component, disableConfig, disableState);\n    };\n\n    var DisableApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        enable: enable,\n        disable: disable,\n        isDisabled: isDisabled,\n        onLoad: onLoad$5,\n        set: set$7\n    });\n\n    var exhibit$3 = function (base, disableConfig) {\n      return nu$6({ classes: disableConfig.disabled ? disableConfig.disableClass.map(pure).getOr([]) : [] });\n    };\n    var events$9 = function (disableConfig, disableState) {\n      return derive([\n        abort(execute(), function (component, simulatedEvent) {\n          return isDisabled(component, disableConfig);\n        }),\n        loadEvent(disableConfig, disableState, onLoad$5)\n      ]);\n    };\n\n    var ActiveDisable = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$3,\n        events: events$9\n    });\n\n    var DisableSchema = [\n      defaulted$1('disabled', false),\n      defaulted$1('useNative', true),\n      option('disableClass'),\n      onHandler('onDisabled'),\n      onHandler('onEnabled')\n    ];\n\n    var Disabling = create$1({\n      fields: DisableSchema,\n      name: 'disabling',\n      active: ActiveDisable,\n      apis: DisableApis\n    });\n\n    var item = function (disabled) {\n      return Disabling.config({\n        disabled: disabled,\n        disableClass: 'tox-collection__item--state-disabled'\n      });\n    };\n    var button = function (disabled) {\n      return Disabling.config({ disabled: disabled });\n    };\n    var splitButton = function (disabled) {\n      return Disabling.config({\n        disabled: disabled,\n        disableClass: 'tox-tbtn--disabled'\n      });\n    };\n    var toolbarButton = function (disabled) {\n      return Disabling.config({\n        disabled: disabled,\n        disableClass: 'tox-tbtn--disabled',\n        useNative: false\n      });\n    };\n    var DisablingConfigs = {\n      item: item,\n      button: button,\n      splitButton: splitButton,\n      toolbarButton: toolbarButton\n    };\n\n    var runWithApi = function (info, comp) {\n      var api = info.getApi(comp);\n      return function (f) {\n        f(api);\n      };\n    };\n    var onControlAttached = function (info, editorOffCell) {\n      return runOnAttached(function (comp) {\n        var run = runWithApi(info, comp);\n        run(function (api) {\n          var onDestroy = info.onSetup(api);\n          if (onDestroy !== null && onDestroy !== undefined) {\n            editorOffCell.set(onDestroy);\n          }\n        });\n      });\n    };\n    var onControlDetached = function (getApi, editorOffCell) {\n      return runOnDetached(function (comp) {\n        return runWithApi(getApi, comp)(editorOffCell.get());\n      });\n    };\n\n    var ItemResponse;\n    (function (ItemResponse) {\n      ItemResponse[ItemResponse['CLOSE_ON_EXECUTE'] = 0] = 'CLOSE_ON_EXECUTE';\n      ItemResponse[ItemResponse['BUBBLE_TO_SANDBOX'] = 1] = 'BUBBLE_TO_SANDBOX';\n    }(ItemResponse || (ItemResponse = {})));\n    var ItemResponse$1 = ItemResponse;\n\n    var onMenuItemExecute = function (info, itemResponse) {\n      return runOnExecute(function (comp, simulatedEvent) {\n        runWithApi(info, comp)(info.onAction);\n        if (!info.triggersSubmenu && itemResponse === ItemResponse$1.CLOSE_ON_EXECUTE) {\n          emit(comp, sandboxClose());\n          simulatedEvent.stop();\n        }\n      });\n    };\n    var menuItemEventOrder = {\n      'alloy.execute': [\n        'disabling',\n        'alloy.base.behaviour',\n        'toggling',\n        'item-events'\n      ]\n    };\n\n    var componentRenderPipeline = function (xs) {\n      return bind(xs, function (o) {\n        return o.toArray();\n      });\n    };\n    var renderCommonItem = function (spec, structure, itemResponse) {\n      var editorOffCell = Cell(noop);\n      return {\n        type: 'item',\n        dom: structure.dom,\n        components: componentRenderPipeline(structure.optComponents),\n        data: spec.data,\n        eventOrder: menuItemEventOrder,\n        hasSubmenu: spec.triggersSubmenu,\n        itemBehaviours: derive$1([\n          config('item-events', [\n            onMenuItemExecute(spec, itemResponse),\n            onControlAttached(spec, editorOffCell),\n            onControlDetached(spec, editorOffCell)\n          ]),\n          DisablingConfigs.item(spec.disabled),\n          Replacing.config({})\n        ].concat(spec.itemBehaviours))\n      };\n    };\n    var buildData = function (source) {\n      return {\n        value: source.value,\n        meta: __assign({ text: source.text.getOr('') }, source.meta)\n      };\n    };\n\n    var tooltipBehaviour = function (meta, sharedBackstage) {\n      return get(meta, 'tooltipWorker').map(function (tooltipWorker) {\n        return [Tooltipping.config({\n            lazySink: sharedBackstage.getSink,\n            tooltipDom: {\n              tag: 'div',\n              classes: ['tox-tooltip-worker-container']\n            },\n            tooltipComponents: [],\n            anchor: function (comp) {\n              return {\n                anchor: 'submenu',\n                item: comp,\n                overrides: { maxHeightFunction: expandable }\n              };\n            },\n            mode: 'follow-highlight',\n            onShow: function (component, _tooltip) {\n              tooltipWorker(function (elm) {\n                Tooltipping.setComponents(component, [external({ element: Element.fromDom(elm) })]);\n              });\n            }\n          })];\n      }).getOr([]);\n    };\n    var escapeRegExp = function (text) {\n      return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n    };\n    var encodeText = function (text) {\n      return global$3.DOM.encode(text);\n    };\n    var replaceText = function (text, matchText) {\n      var translated = global$7.translate(text);\n      var encoded = encodeText(translated);\n      if (matchText.length > 0) {\n        var escapedMatchRegex = new RegExp(escapeRegExp(matchText), 'gi');\n        return encoded.replace(escapedMatchRegex, function (match) {\n          return '<span class=\"tox-autocompleter-highlight\">' + match + '</span>';\n        });\n      } else {\n        return encoded;\n      }\n    };\n    var renderAutocompleteItem = function (spec, matchText, useText, presets, onItemValueHandler, itemResponse, sharedBackstage, renderIcons) {\n      if (renderIcons === void 0) {\n        renderIcons = true;\n      }\n      var structure = renderItemStructure({\n        presets: presets,\n        textContent: Option.none(),\n        htmlContent: useText ? spec.text.map(function (text) {\n          return replaceText(text, matchText);\n        }) : Option.none(),\n        ariaLabel: spec.text,\n        iconContent: spec.icon,\n        shortcutContent: Option.none(),\n        checkMark: Option.none(),\n        caret: Option.none(),\n        value: spec.value\n      }, sharedBackstage.providers, renderIcons, spec.icon);\n      return renderCommonItem({\n        data: buildData(spec),\n        disabled: spec.disabled,\n        getApi: function () {\n          return {};\n        },\n        onAction: function (_api) {\n          return onItemValueHandler(spec.value, spec.meta);\n        },\n        onSetup: function () {\n          return function () {\n          };\n        },\n        triggersSubmenu: false,\n        itemBehaviours: tooltipBehaviour(spec.meta, sharedBackstage)\n      }, structure, itemResponse);\n    };\n\n    var renderChoiceItem = function (spec, useText, presets, onItemValueHandler, isSelected, itemResponse, providersBackstage) {\n      var getApi = function (component) {\n        return {\n          setActive: function (state) {\n            Toggling.set(component, state);\n          },\n          isActive: function () {\n            return Toggling.isOn(component);\n          },\n          isDisabled: function () {\n            return Disabling.isDisabled(component);\n          },\n          setDisabled: function (state) {\n            return Disabling.set(component, state);\n          }\n        };\n      };\n      var structure = renderItemStructure({\n        presets: presets,\n        textContent: useText ? spec.text : Option.none(),\n        htmlContent: Option.none(),\n        ariaLabel: spec.text,\n        iconContent: spec.icon,\n        shortcutContent: useText ? spec.shortcut : Option.none(),\n        checkMark: useText ? Option.some(renderCheckmark(providersBackstage.icons)) : Option.none(),\n        caret: Option.none(),\n        value: spec.value\n      }, providersBackstage, true);\n      return deepMerge(renderCommonItem({\n        data: buildData(spec),\n        disabled: spec.disabled,\n        getApi: getApi,\n        onAction: function (_api) {\n          return onItemValueHandler(spec.value);\n        },\n        onSetup: function (api) {\n          api.setActive(isSelected);\n          return function () {\n          };\n        },\n        triggersSubmenu: false,\n        itemBehaviours: []\n      }, structure, itemResponse), {\n        toggling: {\n          toggleClass: tickedClass,\n          toggleOnExecute: false,\n          selected: spec.active\n        }\n      });\n    };\n\n    var parts$2 = constant(generate$4(owner$2(), parts()));\n\n    var cellOverEvent = generate$1('cell-over');\n    var cellExecuteEvent = generate$1('cell-execute');\n    var makeCell = function (row, col, labelId) {\n      var _a;\n      var emitCellOver = function (c) {\n        return emitWith(c, cellOverEvent, {\n          row: row,\n          col: col\n        });\n      };\n      var emitExecute = function (c) {\n        return emitWith(c, cellExecuteEvent, {\n          row: row,\n          col: col\n        });\n      };\n      var onClick = function (c, se) {\n        se.stop();\n        emitExecute(c);\n      };\n      return build$1({\n        dom: {\n          tag: 'div',\n          attributes: (_a = { role: 'button' }, _a['aria-labelledby'] = labelId, _a)\n        },\n        behaviours: derive$1([\n          config('insert-table-picker-cell', [\n            run(mouseover(), Focusing.focus),\n            run(execute(), emitExecute),\n            run(click(), onClick),\n            run(tap(), onClick)\n          ]),\n          Toggling.config({\n            toggleClass: 'tox-insert-table-picker__selected',\n            toggleOnExecute: false\n          }),\n          Focusing.config({ onFocus: emitCellOver })\n        ])\n      });\n    };\n    var makeCells = function (labelId, numRows, numCols) {\n      var cells = [];\n      for (var i = 0; i < numRows; i++) {\n        var row = [];\n        for (var j = 0; j < numCols; j++) {\n          row.push(makeCell(i, j, labelId));\n        }\n        cells.push(row);\n      }\n      return cells;\n    };\n    var selectCells = function (cells, selectedRow, selectedColumn, numRows, numColumns) {\n      for (var i = 0; i < numRows; i++) {\n        for (var j = 0; j < numColumns; j++) {\n          Toggling.set(cells[i][j], i <= selectedRow && j <= selectedColumn);\n        }\n      }\n    };\n    var makeComponents = function (cells) {\n      return bind(cells, function (cellRow) {\n        return map(cellRow, premade$1);\n      });\n    };\n    var makeLabelText = function (row, col) {\n      return text(col + 1 + 'x' + (row + 1));\n    };\n    function renderInsertTableMenuItem(spec) {\n      var numRows = 10;\n      var numColumns = 10;\n      var sizeLabelId = generate$1('size-label');\n      var cells = makeCells(sizeLabelId, numRows, numColumns);\n      var memLabel = record({\n        dom: {\n          tag: 'span',\n          classes: ['tox-insert-table-picker__label'],\n          attributes: { id: sizeLabelId }\n        },\n        components: [text('0x0')],\n        behaviours: derive$1([Replacing.config({})])\n      });\n      return {\n        type: 'widget',\n        data: { value: generate$1('widget-id') },\n        dom: {\n          tag: 'div',\n          classes: ['tox-fancymenuitem']\n        },\n        autofocus: true,\n        components: [parts$2().widget({\n            dom: {\n              tag: 'div',\n              classes: ['tox-insert-table-picker']\n            },\n            components: makeComponents(cells).concat(memLabel.asSpec()),\n            behaviours: derive$1([\n              config('insert-table-picker', [\n                runWithTarget(cellOverEvent, function (c, t, e) {\n                  var row = e.event().row();\n                  var col = e.event().col();\n                  selectCells(cells, row, col, numRows, numColumns);\n                  Replacing.set(memLabel.get(c), [makeLabelText(row, col)]);\n                }),\n                runWithTarget(cellExecuteEvent, function (c, _, e) {\n                  spec.onAction({\n                    numRows: e.event().row() + 1,\n                    numColumns: e.event().col() + 1\n                  });\n                  emit(c, sandboxClose());\n                })\n              ]),\n              Keying.config({\n                initSize: {\n                  numRows: numRows,\n                  numColumns: numColumns\n                },\n                mode: 'flatgrid',\n                selector: '[role=\"button\"]'\n              })\n            ])\n          })]\n      };\n    }\n\n    var hexColour = function (hexString) {\n      return { value: constant(hexString) };\n    };\n    var shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n    var longformRegex = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;\n    var isHexString = function (hex) {\n      return shorthandRegex.test(hex) || longformRegex.test(hex);\n    };\n    var getLongForm = function (hex) {\n      var hexString = hex.value().replace(shorthandRegex, function (m, r, g, b) {\n        return r + r + g + g + b + b;\n      });\n      return { value: constant(hexString) };\n    };\n    var extractValues = function (hex) {\n      var longForm = getLongForm(hex);\n      var splitForm = longformRegex.exec(longForm.value());\n      return splitForm === null ? [\n        'FFFFFF',\n        'FF',\n        'FF',\n        'FF'\n      ] : splitForm;\n    };\n    var toHex = function (component) {\n      var hex = component.toString(16);\n      return hex.length === 1 ? '0' + hex : hex;\n    };\n    var fromRgba = function (rgbaColour) {\n      var value = toHex(rgbaColour.red()) + toHex(rgbaColour.green()) + toHex(rgbaColour.blue());\n      return hexColour(value);\n    };\n\n    var min = Math.min;\n    var max = Math.max;\n    var round = Math.round;\n    var rgbRegex = /^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/;\n    var rgbaRegex = /^rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*(\\d?(?:\\.\\d+)?)\\)/;\n    var rgbaColour = function (red, green, blue, alpha) {\n      return {\n        red: constant(red),\n        green: constant(green),\n        blue: constant(blue),\n        alpha: constant(alpha)\n      };\n    };\n    var isRgbaComponent = function (value) {\n      var num = parseInt(value, 10);\n      return num.toString() === value && num >= 0 && num <= 255;\n    };\n    var fromHsv = function (hsv) {\n      var r;\n      var g;\n      var b;\n      var hue = (hsv.hue() || 0) % 360;\n      var saturation = hsv.saturation() / 100;\n      var brightness = hsv.value() / 100;\n      saturation = max(0, min(saturation, 1));\n      brightness = max(0, min(brightness, 1));\n      if (saturation === 0) {\n        r = g = b = round(255 * brightness);\n        return rgbaColour(r, g, b, 1);\n      }\n      var side = hue / 60;\n      var chroma = brightness * saturation;\n      var x = chroma * (1 - Math.abs(side % 2 - 1));\n      var match = brightness - chroma;\n      switch (Math.floor(side)) {\n      case 0:\n        r = chroma;\n        g = x;\n        b = 0;\n        break;\n      case 1:\n        r = x;\n        g = chroma;\n        b = 0;\n        break;\n      case 2:\n        r = 0;\n        g = chroma;\n        b = x;\n        break;\n      case 3:\n        r = 0;\n        g = x;\n        b = chroma;\n        break;\n      case 4:\n        r = x;\n        g = 0;\n        b = chroma;\n        break;\n      case 5:\n        r = chroma;\n        g = 0;\n        b = x;\n        break;\n      default:\n        r = g = b = 0;\n      }\n      r = round(255 * (r + match));\n      g = round(255 * (g + match));\n      b = round(255 * (b + match));\n      return rgbaColour(r, g, b, 1);\n    };\n    var fromHex = function (hexColour) {\n      var result = extractValues(hexColour);\n      var red = parseInt(result[1], 16);\n      var green = parseInt(result[2], 16);\n      var blue = parseInt(result[3], 16);\n      return rgbaColour(red, green, blue, 1);\n    };\n    var fromStringValues = function (red, green, blue, alpha) {\n      var r = parseInt(red, 10);\n      var g = parseInt(green, 10);\n      var b = parseInt(blue, 10);\n      var a = parseFloat(alpha);\n      return rgbaColour(r, g, b, a);\n    };\n    var fromString = function (rgbaString) {\n      if (rgbaString === 'transparent') {\n        return Option.some(rgbaColour(0, 0, 0, 0));\n      }\n      var rgbMatch = rgbRegex.exec(rgbaString);\n      if (rgbMatch !== null) {\n        return Option.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1'));\n      }\n      var rgbaMatch = rgbaRegex.exec(rgbaString);\n      if (rgbaMatch !== null) {\n        return Option.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4]));\n      }\n      return Option.none();\n    };\n    var toString = function (rgba) {\n      return 'rgba(' + rgba.red() + ',' + rgba.green() + ',' + rgba.blue() + ',' + rgba.alpha() + ')';\n    };\n    var redColour = constant(rgbaColour(255, 0, 0, 1));\n\n    var global$9 = tinymce.util.Tools.resolve('tinymce.util.LocalStorage');\n\n    var storageName = 'tinymce-custom-colors';\n    function ColorCache (max) {\n      if (max === void 0) {\n        max = 10;\n      }\n      var storageString = global$9.getItem(storageName);\n      var localstorage = isString(storageString) ? JSON.parse(storageString) : [];\n      var prune = function (list) {\n        var diff = max - list.length;\n        return diff < 0 ? list.slice(0, max) : list;\n      };\n      var cache = prune(localstorage);\n      var add = function (key) {\n        indexOf(cache, key).each(remove);\n        cache.unshift(key);\n        if (cache.length > max) {\n          cache.pop();\n        }\n        global$9.setItem(storageName, JSON.stringify(cache));\n      };\n      var remove = function (idx) {\n        cache.splice(idx, 1);\n      };\n      var state = function () {\n        return cache.slice(0);\n      };\n      return {\n        add: add,\n        state: state\n      };\n    }\n\n    var choiceItem = 'choiceitem';\n    var defaultColors = [\n      {\n        type: choiceItem,\n        text: 'Light Green',\n        value: '#BFEDD2'\n      },\n      {\n        type: choiceItem,\n        text: 'Light Yellow',\n        value: '#FBEEB8'\n      },\n      {\n        type: choiceItem,\n        text: 'Light Red',\n        value: '#F8CAC6'\n      },\n      {\n        type: choiceItem,\n        text: 'Light Purple',\n        value: '#ECCAFA'\n      },\n      {\n        type: choiceItem,\n        text: 'Light Blue',\n        value: '#C2E0F4'\n      },\n      {\n        type: choiceItem,\n        text: 'Green',\n        value: '#2DC26B'\n      },\n      {\n        type: choiceItem,\n        text: 'Yellow',\n        value: '#F1C40F'\n      },\n      {\n        type: choiceItem,\n        text: 'Red',\n        value: '#E03E2D'\n      },\n      {\n        type: choiceItem,\n        text: 'Purple',\n        value: '#B96AD9'\n      },\n      {\n        type: choiceItem,\n        text: 'Blue',\n        value: '#3598DB'\n      },\n      {\n        type: choiceItem,\n        text: 'Dark Turquoise',\n        value: '#169179'\n      },\n      {\n        type: choiceItem,\n        text: 'Orange',\n        value: '#E67E23'\n      },\n      {\n        type: choiceItem,\n        text: 'Dark Red',\n        value: '#BA372A'\n      },\n      {\n        type: choiceItem,\n        text: 'Dark Purple',\n        value: '#843FA1'\n      },\n      {\n        type: choiceItem,\n        text: 'Dark Blue',\n        value: '#236FA1'\n      },\n      {\n        type: choiceItem,\n        text: 'Light Gray',\n        value: '#ECF0F1'\n      },\n      {\n        type: choiceItem,\n        text: 'Medium Gray',\n        value: '#CED4D9'\n      },\n      {\n        type: choiceItem,\n        text: 'Gray',\n        value: '#95A5A6'\n      },\n      {\n        type: choiceItem,\n        text: 'Dark Gray',\n        value: '#7E8C8D'\n      },\n      {\n        type: choiceItem,\n        text: 'Navy Blue',\n        value: '#34495E'\n      },\n      {\n        type: choiceItem,\n        text: 'Black',\n        value: '#000000'\n      },\n      {\n        type: choiceItem,\n        text: 'White',\n        value: '#ffffff'\n      }\n    ];\n    var colorCache = ColorCache(10);\n    var mapColors = function (colorMap) {\n      var colors = [];\n      var canvas = domGlobals.document.createElement('canvas');\n      canvas.height = 1;\n      canvas.width = 1;\n      var ctx = canvas.getContext('2d');\n      var byteAsHex = function (colorByte, alphaByte) {\n        var bg = 255;\n        var alpha = alphaByte / 255;\n        var colorByteWithWhiteBg = Math.round(colorByte * alpha + bg * (1 - alpha));\n        return ('0' + colorByteWithWhiteBg.toString(16)).slice(-2).toUpperCase();\n      };\n      var asHexColor = function (color) {\n        if (/^[0-9A-Fa-f]{6}$/.test(color)) {\n          return '#' + color.toUpperCase();\n        }\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\n        ctx.fillStyle = '#FFFFFF';\n        ctx.fillStyle = color;\n        ctx.fillRect(0, 0, 1, 1);\n        var rgba = ctx.getImageData(0, 0, 1, 1).data;\n        var r = rgba[0], g = rgba[1], b = rgba[2], a = rgba[3];\n        return '#' + byteAsHex(r, a) + byteAsHex(g, a) + byteAsHex(b, a);\n      };\n      for (var i = 0; i < colorMap.length; i += 2) {\n        colors.push({\n          text: colorMap[i + 1],\n          value: asHexColor(colorMap[i]),\n          type: 'choiceitem'\n        });\n      }\n      return colors;\n    };\n    var getColorCols = function (editor, defaultCols) {\n      return editor.getParam('color_cols', defaultCols, 'number');\n    };\n    var hasCustomColors = function (editor) {\n      return editor.getParam('custom_colors') !== false;\n    };\n    var getColorMap = function (editor) {\n      return editor.getParam('color_map');\n    };\n    var getColors = function (editor) {\n      var unmapped = getColorMap(editor);\n      return unmapped !== undefined ? mapColors(unmapped) : defaultColors;\n    };\n    var getCurrentColors = function () {\n      return map(colorCache.state(), function (color) {\n        return {\n          type: choiceItem,\n          text: color,\n          value: color\n        };\n      });\n    };\n    var addColor = function (color) {\n      colorCache.add(color);\n    };\n    var Settings = {\n      mapColors: mapColors,\n      getColorCols: getColorCols,\n      hasCustomColors: hasCustomColors,\n      getColorMap: getColorMap,\n      getColors: getColors,\n      getCurrentColors: getCurrentColors,\n      addColor: addColor\n    };\n\n    var fireSkinLoaded = function (editor) {\n      return editor.fire('SkinLoaded');\n    };\n    var fireSkinLoadError = function (editor, error) {\n      return editor.fire('SkinLoadError', error);\n    };\n    var fireResizeEditor = function (editor) {\n      return editor.fire('ResizeEditor');\n    };\n    var fireBeforeRenderUI = function (editor) {\n      return editor.fire('BeforeRenderUI');\n    };\n    var fireResizeContent = function (editor, e) {\n      return editor.fire('ResizeContent', e);\n    };\n    var fireScrollContent = function (editor, e) {\n      return editor.fire('ScrollContent', e);\n    };\n    var fireTextColorChange = function (editor, data) {\n      return editor.fire('TextColorChange', data);\n    };\n    var Events = {\n      fireSkinLoaded: fireSkinLoaded,\n      fireSkinLoadError: fireSkinLoadError,\n      fireResizeEditor: fireResizeEditor,\n      fireScrollContent: fireScrollContent,\n      fireBeforeRenderUI: fireBeforeRenderUI,\n      fireResizeContent: fireResizeContent,\n      fireTextColorChange: fireTextColorChange\n    };\n\n    var getCurrentColor = function (editor, format) {\n      var color;\n      editor.dom.getParents(editor.selection.getStart(), function (elm) {\n        var value;\n        if (value = elm.style[format === 'forecolor' ? 'color' : 'background-color']) {\n          color = color ? color : value;\n        }\n      });\n      return color;\n    };\n    var applyFormat = function (editor, format, value) {\n      editor.undoManager.transact(function () {\n        editor.focus();\n        editor.formatter.apply(format, { value: value });\n        editor.nodeChanged();\n      });\n    };\n    var removeFormat = function (editor, format) {\n      editor.undoManager.transact(function () {\n        editor.focus();\n        editor.formatter.remove(format, { value: null }, null, true);\n        editor.nodeChanged();\n      });\n    };\n    var registerCommands = function (editor) {\n      editor.addCommand('mceApplyTextcolor', function (format, value) {\n        applyFormat(editor, format, value);\n      });\n      editor.addCommand('mceRemoveTextcolor', function (format) {\n        removeFormat(editor, format);\n      });\n    };\n    var calcCols = function (colors) {\n      return Math.max(5, Math.ceil(Math.sqrt(colors)));\n    };\n    var getColorCols$1 = function (editor) {\n      var colors = Settings.getColors(editor);\n      var defaultCols = calcCols(colors.length);\n      return Settings.getColorCols(editor, defaultCols);\n    };\n    var getAdditionalColors = function (hasCustom) {\n      var type = 'choiceitem';\n      var remove = {\n        type: type,\n        text: 'Remove color',\n        icon: 'color-swatch-remove-color',\n        value: 'remove'\n      };\n      var custom = {\n        type: type,\n        text: 'Custom color',\n        icon: 'color-picker',\n        value: 'custom'\n      };\n      return hasCustom ? [\n        remove,\n        custom\n      ] : [remove];\n    };\n    var applyColor = function (editor, format, value, onChoice) {\n      if (value === 'custom') {\n        var dialog = colorPickerDialog(editor);\n        dialog(function (colorOpt) {\n          colorOpt.each(function (color) {\n            Settings.addColor(color);\n            editor.execCommand('mceApplyTextcolor', format, color);\n            onChoice(color);\n          });\n        }, '#000000');\n      } else if (value === 'remove') {\n        onChoice('');\n        editor.execCommand('mceRemoveTextcolor', format);\n      } else {\n        onChoice(value);\n        editor.execCommand('mceApplyTextcolor', format, value);\n      }\n    };\n    var getMenuColors = function (colors, hasCustom) {\n      return colors.concat(Settings.getCurrentColors().concat(getAdditionalColors(hasCustom)));\n    };\n    var getFetch = function (colors, hasCustom) {\n      return function (callback) {\n        callback(getMenuColors(colors, hasCustom));\n      };\n    };\n    var setIconColor = function (splitButtonApi, name, newColor) {\n      var setIconFillAndStroke = function (pathId, color) {\n        splitButtonApi.setIconFill(pathId, color);\n        splitButtonApi.setIconStroke(pathId, color);\n      };\n      var id = name === 'forecolor' ? 'tox-icon-text-color__color' : 'tox-icon-highlight-bg-color__color';\n      setIconFillAndStroke(id, newColor);\n    };\n    var registerTextColorButton = function (editor, name, format, tooltip, lastColor) {\n      editor.ui.registry.addSplitButton(name, {\n        tooltip: tooltip,\n        presets: 'color',\n        icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color',\n        select: function (value) {\n          var optCurrentRgb = Option.from(getCurrentColor(editor, format));\n          return optCurrentRgb.bind(function (currentRgb) {\n            return fromString(currentRgb).map(function (rgba) {\n              var currentHex = fromRgba(rgba).value();\n              return contains$1(value.toLowerCase(), currentHex);\n            });\n          }).getOr(false);\n        },\n        columns: getColorCols$1(editor),\n        fetch: getFetch(Settings.getColors(editor), Settings.hasCustomColors(editor)),\n        onAction: function (splitButtonApi) {\n          if (lastColor.get() !== null) {\n            applyColor(editor, format, lastColor.get(), function () {\n            });\n          }\n        },\n        onItemAction: function (splitButtonApi, value) {\n          applyColor(editor, format, value, function (newColor) {\n            lastColor.set(newColor);\n            Events.fireTextColorChange(editor, {\n              name: name,\n              color: newColor\n            });\n          });\n        },\n        onSetup: function (splitButtonApi) {\n          if (lastColor.get() !== null) {\n            setIconColor(splitButtonApi, name, lastColor.get());\n          }\n          var handler = function (e) {\n            if (e.name === name) {\n              setIconColor(splitButtonApi, e.name, e.color);\n            }\n          };\n          editor.on('TextColorChange', handler);\n          return function () {\n            editor.off('TextColorChange', handler);\n          };\n        }\n      });\n    };\n    var registerTextColorMenuItem = function (editor, name, format, text) {\n      editor.ui.registry.addNestedMenuItem(name, {\n        text: text,\n        icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color',\n        getSubmenuItems: function () {\n          return [{\n              type: 'fancymenuitem',\n              fancytype: 'colorswatch',\n              onAction: function (data) {\n                applyColor(editor, format, data.value, noop);\n              }\n            }];\n        }\n      });\n    };\n    var colorPickerDialog = function (editor) {\n      return function (callback, value) {\n        var getOnSubmit = function (callback) {\n          return function (api) {\n            var data = api.getData();\n            callback(Option.from(data.colorpicker));\n            api.close();\n          };\n        };\n        var onAction = function (api, details) {\n          if (details.name === 'hex-valid') {\n            if (details.value) {\n              api.enable('ok');\n            } else {\n              api.disable('ok');\n            }\n          }\n        };\n        var initialData = { colorpicker: value };\n        var submit = getOnSubmit(callback);\n        editor.windowManager.open({\n          title: 'Color Picker',\n          size: 'normal',\n          body: {\n            type: 'panel',\n            items: [{\n                type: 'colorpicker',\n                name: 'colorpicker',\n                label: 'Color'\n              }]\n          },\n          buttons: [\n            {\n              type: 'cancel',\n              name: 'cancel',\n              text: 'Cancel'\n            },\n            {\n              type: 'submit',\n              name: 'save',\n              text: 'Save',\n              primary: true\n            }\n          ],\n          initialData: initialData,\n          onAction: onAction,\n          onSubmit: submit,\n          onClose: function () {\n          },\n          onCancel: function () {\n            callback(Option.none());\n          }\n        });\n      };\n    };\n    var register$1 = function (editor) {\n      registerCommands(editor);\n      var lastForeColor = Cell(null);\n      var lastBackColor = Cell(null);\n      registerTextColorButton(editor, 'forecolor', 'forecolor', 'Text color', lastForeColor);\n      registerTextColorButton(editor, 'backcolor', 'hilitecolor', 'Background color', lastBackColor);\n      registerTextColorMenuItem(editor, 'forecolor', 'forecolor', 'Text color');\n      registerTextColorMenuItem(editor, 'backcolor', 'hilitecolor', 'Background color');\n    };\n    var ColorSwatch = {\n      register: register$1,\n      getColors: getMenuColors,\n      getFetch: getFetch,\n      colorPickerDialog: colorPickerDialog,\n      getCurrentColor: getCurrentColor,\n      getColorCols: getColorCols$1,\n      calcCols: calcCols\n    };\n\n    var forMenu = function (presets) {\n      if (presets === 'color') {\n        return 'tox-swatches';\n      } else {\n        return 'tox-menu';\n      }\n    };\n    var classes = function (presets) {\n      return {\n        backgroundMenu: 'tox-background-menu',\n        selectedMenu: 'tox-selected-menu',\n        selectedItem: 'tox-collection__item--active',\n        hasIcons: 'tox-menu--has-icons',\n        menu: forMenu(presets),\n        tieredMenu: 'tox-tiered-menu'\n      };\n    };\n\n    var markers$1 = function (presets) {\n      var menuClasses = classes(presets);\n      return {\n        backgroundMenu: menuClasses.backgroundMenu,\n        selectedMenu: menuClasses.selectedMenu,\n        menu: menuClasses.menu,\n        selectedItem: menuClasses.selectedItem,\n        item: classForPreset(presets)\n      };\n    };\n    var dom$1 = function (hasIcons, columns, presets) {\n      var menuClasses = classes(presets);\n      return {\n        tag: 'div',\n        classes: flatten([\n          [\n            menuClasses.menu,\n            'tox-menu-' + columns + '-column'\n          ],\n          hasIcons ? [menuClasses.hasIcons] : []\n        ])\n      };\n    };\n    var components$1 = [Menu.parts().items({})];\n    var part = function (hasIcons, columns, presets) {\n      var menuClasses = classes(presets);\n      var d = {\n        tag: 'div',\n        classes: flatten([[menuClasses.tieredMenu]])\n      };\n      return {\n        dom: d,\n        markers: markers$1(presets)\n      };\n    };\n\n    var chunk$1 = function (rowDom, numColumns) {\n      return function (items) {\n        var chunks = chunk(items, numColumns);\n        return map(chunks, function (c) {\n          return {\n            dom: rowDom,\n            components: c\n          };\n        });\n      };\n    };\n    var forSwatch = function (columns) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-menu',\n            'tox-swatches-menu'\n          ]\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-swatches']\n            },\n            components: [Menu.parts().items({\n                preprocess: columns !== 'auto' ? chunk$1({\n                  tag: 'div',\n                  classes: ['tox-swatches__row']\n                }, columns) : identity\n              })]\n          }]\n      };\n    };\n    var forToolbar = function (columns) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-menu',\n            'tox-collection',\n            'tox-collection--toolbar',\n            'tox-collection--toolbar-lg'\n          ]\n        },\n        components: [Menu.parts().items({\n            preprocess: chunk$1({\n              tag: 'div',\n              classes: ['tox-collection__group']\n            }, columns)\n          })]\n      };\n    };\n    var preprocessCollection = function (items, isSeparator) {\n      var allSplits = [];\n      var currentSplit = [];\n      each(items, function (item, i) {\n        if (isSeparator(item, i)) {\n          if (currentSplit.length > 0) {\n            allSplits.push(currentSplit);\n          }\n          currentSplit = [];\n          if (has(item.dom, 'innerHtml')) {\n            currentSplit.push(item);\n          }\n        } else {\n          currentSplit.push(item);\n        }\n      });\n      if (currentSplit.length > 0) {\n        allSplits.push(currentSplit);\n      }\n      return map(allSplits, function (s) {\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-collection__group']\n          },\n          components: s\n        };\n      });\n    };\n    var forCollection = function (columns, initItems, _hasIcons) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-menu',\n            'tox-collection'\n          ].concat(columns === 1 ? ['tox-collection--list'] : ['tox-collection--grid'])\n        },\n        components: [Menu.parts().items({\n            preprocess: function (items) {\n              if (columns !== 'auto' && columns > 1) {\n                return chunk$1({\n                  tag: 'div',\n                  classes: ['tox-collection__group']\n                }, columns)(items);\n              } else {\n                return preprocessCollection(items, function (_item, i) {\n                  return initItems[i].type === 'separator';\n                });\n              }\n            }\n          })]\n      };\n    };\n    var forHorizontalCollection = function (initItems, _hasIcons) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-collection',\n            'tox-collection--horizontal'\n          ]\n        },\n        components: [Menu.parts().items({\n            preprocess: function (items) {\n              return preprocessCollection(items, function (_item, i) {\n                return initItems[i].type === 'separator';\n              });\n            }\n          })]\n      };\n    };\n\n    var hasIcon = function (item) {\n      return item.icon !== undefined || item.type === 'togglemenuitem' || item.type === 'choicemenuitem';\n    };\n    var menuHasIcons = function (xs) {\n      return exists(xs, hasIcon);\n    };\n    var handleError = function (error) {\n      domGlobals.console.error(formatError(error));\n      domGlobals.console.log(error);\n      return Option.none();\n    };\n    var createHorizontalPartialMenuWithAlloyItems = function (value, _hasIcons, items, _columns, _presets) {\n      var structure = forHorizontalCollection(items);\n      return {\n        value: value,\n        dom: structure.dom,\n        components: structure.components,\n        items: items\n      };\n    };\n    var createPartialMenuWithAlloyItems = function (value, hasIcons, items, columns, presets) {\n      if (presets === 'color') {\n        var structure = forSwatch(columns);\n        return {\n          value: value,\n          dom: structure.dom,\n          components: structure.components,\n          items: items\n        };\n      }\n      if (presets === 'normal' && columns === 'auto') {\n        var structure = forCollection(columns, items);\n        return {\n          value: value,\n          dom: structure.dom,\n          components: structure.components,\n          items: items\n        };\n      }\n      if (presets === 'normal' && columns === 1) {\n        var structure = forCollection(1, items);\n        return {\n          value: value,\n          dom: structure.dom,\n          components: structure.components,\n          items: items\n        };\n      }\n      if (presets === 'normal') {\n        var structure = forCollection(columns, items);\n        return {\n          value: value,\n          dom: structure.dom,\n          components: structure.components,\n          items: items\n        };\n      }\n      if (presets === 'listpreview' && columns !== 'auto') {\n        var structure = forToolbar(columns);\n        return {\n          value: value,\n          dom: structure.dom,\n          components: structure.components,\n          items: items\n        };\n      }\n      return {\n        value: value,\n        dom: dom$1(hasIcons, columns, presets),\n        components: components$1,\n        items: items\n      };\n    };\n\n    var createPartialChoiceMenu = function (value, items, onItemValueHandler, columns, presets, itemResponse, select, providersBackstage) {\n      var hasIcons = menuHasIcons(items);\n      var presetItemTypes = presets !== 'color' ? 'normal' : 'color';\n      var alloyItems = createChoiceItems(items, onItemValueHandler, columns, presetItemTypes, itemResponse, select, providersBackstage);\n      return createPartialMenuWithAlloyItems(value, hasIcons, alloyItems, columns, presets);\n    };\n    var createChoiceItems = function (items, onItemValueHandler, columns, itemPresets, itemResponse, select, providersBackstage) {\n      return cat(map(items, function (item) {\n        if (item.type === 'choiceitem') {\n          return createChoiceMenuItem(item).fold(handleError, function (d) {\n            return Option.some(renderChoiceItem(d, columns === 1, itemPresets, onItemValueHandler, select(item.value), itemResponse, providersBackstage));\n          });\n        } else {\n          return Option.none();\n        }\n      }));\n    };\n\n    var deriveMenuMovement = function (columns, presets) {\n      var menuMarkers = markers$1(presets);\n      if (columns === 1) {\n        return {\n          mode: 'menu',\n          moveOnTab: true\n        };\n      } else if (columns === 'auto') {\n        return {\n          mode: 'grid',\n          selector: '.' + menuMarkers.item,\n          initSize: {\n            numColumns: 1,\n            numRows: 1\n          }\n        };\n      } else {\n        var rowClass = presets === 'color' ? 'tox-swatches__row' : 'tox-collection__group';\n        return {\n          mode: 'matrix',\n          rowSelector: '.' + rowClass\n        };\n      }\n    };\n    var deriveCollectionMovement = function (columns, presets) {\n      if (columns === 1) {\n        return {\n          mode: 'menu',\n          moveOnTab: false,\n          selector: '.tox-collection__item'\n        };\n      } else if (columns === 'auto') {\n        return {\n          mode: 'flatgrid',\n          selector: '.' + 'tox-collection__item',\n          initSize: {\n            numColumns: 1,\n            numRows: 1\n          }\n        };\n      } else {\n        return {\n          mode: 'matrix',\n          selectors: {\n            row: presets === 'color' ? '.tox-swatches__row' : '.tox-collection__group',\n            cell: presets === 'color' ? '.' + colorClass : '.' + selectableClass\n          }\n        };\n      }\n    };\n\n    function renderColorSwatchItem(spec, backstage) {\n      var items = ColorSwatch.getColors(backstage.colorinput.getColors(), backstage.colorinput.hasCustomColors());\n      var columns = backstage.colorinput.getColorCols();\n      var presets = 'color';\n      var menuSpec = createPartialChoiceMenu(generate$1('menu-value'), items, function (value) {\n        spec.onAction({ value: value });\n      }, columns, presets, ItemResponse$1.CLOSE_ON_EXECUTE, function () {\n        return false;\n      }, backstage.shared.providers);\n      var widgetSpec = __assign(__assign({}, menuSpec), {\n        markers: markers$1(presets),\n        movement: deriveMenuMovement(columns, presets)\n      });\n      return {\n        type: 'widget',\n        data: { value: generate$1('widget-id') },\n        dom: {\n          tag: 'div',\n          classes: ['tox-fancymenuitem']\n        },\n        autofocus: true,\n        components: [parts$2().widget(Menu.sketch(widgetSpec))]\n      };\n    }\n\n    var fancyMenuItems = {\n      inserttable: renderInsertTableMenuItem,\n      colorswatch: renderColorSwatchItem\n    };\n    var valueOpt = function (obj, key) {\n      return Object.prototype.hasOwnProperty.call(obj, key) ? Option.some(obj[key]) : Option.none();\n    };\n    var renderFancyMenuItem = function (spec, backstage) {\n      return valueOpt(fancyMenuItems, spec.fancytype).map(function (render) {\n        return render(spec, backstage);\n      });\n    };\n\n    var renderNormalItem = function (spec, itemResponse, providersBackstage, renderIcons) {\n      if (renderIcons === void 0) {\n        renderIcons = true;\n      }\n      var getApi = function (component) {\n        return {\n          isDisabled: function () {\n            return Disabling.isDisabled(component);\n          },\n          setDisabled: function (state) {\n            return Disabling.set(component, state);\n          }\n        };\n      };\n      var structure = renderItemStructure({\n        presets: 'normal',\n        iconContent: spec.icon,\n        textContent: spec.text,\n        htmlContent: Option.none(),\n        ariaLabel: spec.text,\n        caret: Option.none(),\n        checkMark: Option.none(),\n        shortcutContent: spec.shortcut\n      }, providersBackstage, renderIcons);\n      return renderCommonItem({\n        data: buildData(spec),\n        getApi: getApi,\n        disabled: spec.disabled,\n        onAction: spec.onAction,\n        onSetup: spec.onSetup,\n        triggersSubmenu: false,\n        itemBehaviours: []\n      }, structure, itemResponse);\n    };\n\n    var renderNestedItem = function (spec, itemResponse, providersBackstage, renderIcons, downwardsCaret) {\n      if (renderIcons === void 0) {\n        renderIcons = true;\n      }\n      if (downwardsCaret === void 0) {\n        downwardsCaret = false;\n      }\n      var caret = downwardsCaret ? renderDownwardsCaret(providersBackstage.icons) : renderSubmenuCaret(providersBackstage.icons);\n      var getApi = function (component) {\n        return {\n          isDisabled: function () {\n            return Disabling.isDisabled(component);\n          },\n          setDisabled: function (state) {\n            return Disabling.set(component, state);\n          }\n        };\n      };\n      var structure = renderItemStructure({\n        presets: 'normal',\n        iconContent: spec.icon,\n        textContent: spec.text,\n        htmlContent: Option.none(),\n        ariaLabel: spec.text,\n        caret: Option.some(caret),\n        checkMark: Option.none(),\n        shortcutContent: spec.shortcut\n      }, providersBackstage, renderIcons);\n      return renderCommonItem({\n        data: buildData(spec),\n        getApi: getApi,\n        disabled: spec.disabled,\n        onAction: noop,\n        onSetup: spec.onSetup,\n        triggersSubmenu: true,\n        itemBehaviours: []\n      }, structure, itemResponse);\n    };\n\n    var renderSeparatorItem = function (spec) {\n      var innerHtml = spec.text.fold(function () {\n        return {};\n      }, function (text) {\n        return { innerHtml: text };\n      });\n      return {\n        type: 'separator',\n        dom: __assign({\n          tag: 'div',\n          classes: [\n            selectableClass,\n            groupHeadingClass\n          ]\n        }, innerHtml),\n        components: []\n      };\n    };\n\n    var renderToggleMenuItem = function (spec, itemResponse, providersBackstage) {\n      var getApi = function (component) {\n        return {\n          setActive: function (state) {\n            Toggling.set(component, state);\n          },\n          isActive: function () {\n            return Toggling.isOn(component);\n          },\n          isDisabled: function () {\n            return Disabling.isDisabled(component);\n          },\n          setDisabled: function (state) {\n            return Disabling.set(component, state);\n          }\n        };\n      };\n      var structure = renderItemStructure({\n        iconContent: Option.none(),\n        textContent: spec.text,\n        htmlContent: Option.none(),\n        ariaLabel: spec.text,\n        checkMark: Option.some(renderCheckmark(providersBackstage.icons)),\n        caret: Option.none(),\n        shortcutContent: spec.shortcut,\n        presets: 'normal',\n        meta: spec.meta\n      }, providersBackstage, true);\n      return deepMerge(renderCommonItem({\n        data: buildData(spec),\n        disabled: spec.disabled,\n        getApi: getApi,\n        onAction: spec.onAction,\n        onSetup: spec.onSetup,\n        triggersSubmenu: false,\n        itemBehaviours: []\n      }, structure, itemResponse), {\n        toggling: {\n          toggleClass: tickedClass,\n          toggleOnExecute: false,\n          selected: spec.active\n        }\n      });\n    };\n\n    var autocomplete = renderAutocompleteItem;\n    var separator = renderSeparatorItem;\n    var normal = renderNormalItem;\n    var nested = renderNestedItem;\n    var toggle$1 = renderToggleMenuItem;\n    var fancy = renderFancyMenuItem;\n\n    var FocusMode;\n    (function (FocusMode) {\n      FocusMode[FocusMode['ContentFocus'] = 0] = 'ContentFocus';\n      FocusMode[FocusMode['UiFocus'] = 1] = 'UiFocus';\n    }(FocusMode || (FocusMode = {})));\n    var hasIcon$1 = function (item) {\n      return item.icon !== undefined || item.type === 'togglemenuitem' || item.type === 'choicemenuitem';\n    };\n    var menuHasIcons$1 = function (xs) {\n      return exists(xs, hasIcon$1);\n    };\n    var createMenuItemFromBridge = function (item, itemResponse, backstage, menuHasIcons, isHorizontalMenu) {\n      var providersBackstage = backstage.shared.providers;\n      var parseForHorizontalMenu = function (menuitem) {\n        return !isHorizontalMenu ? menuitem : __assign(__assign({}, menuitem), {\n          shortcut: Option.none(),\n          icon: menuitem.text.isSome() ? Option.none() : menuitem.icon\n        });\n      };\n      switch (item.type) {\n      case 'menuitem':\n        return createMenuItem(item).fold(handleError, function (d) {\n          return Option.some(normal(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons));\n        });\n      case 'nestedmenuitem':\n        return createNestedMenuItem(item).fold(handleError, function (d) {\n          return Option.some(nested(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons, isHorizontalMenu));\n        });\n      case 'togglemenuitem':\n        return createToggleMenuItem(item).fold(handleError, function (d) {\n          return Option.some(toggle$1(parseForHorizontalMenu(d), itemResponse, providersBackstage));\n        });\n      case 'separator':\n        return createSeparatorMenuItem(item).fold(handleError, function (d) {\n          return Option.some(separator(d));\n        });\n      case 'fancymenuitem':\n        return createFancyMenuItem(item).fold(handleError, function (d) {\n          return fancy(parseForHorizontalMenu(d), backstage);\n        });\n      default: {\n          domGlobals.console.error('Unknown item in general menu', item);\n          return Option.none();\n        }\n      }\n    };\n    var createAutocompleteItems = function (items, matchText, onItemValueHandler, columns, itemResponse, sharedBackstage) {\n      var renderText = columns === 1;\n      var renderIcons = !renderText || menuHasIcons$1(items);\n      return cat(map(items, function (item) {\n        if (item.type === 'separator') {\n          return createSeparatorItem(item).fold(handleError, function (d) {\n            return Option.some(separator(d));\n          });\n        } else {\n          return createAutocompleterItem(item).fold(handleError, function (d) {\n            return Option.some(autocomplete(d, matchText, renderText, 'normal', onItemValueHandler, itemResponse, sharedBackstage, renderIcons));\n          });\n        }\n      }));\n    };\n    var createPartialMenu = function (value, items, itemResponse, backstage, isHorizontalMenu) {\n      var hasIcons = menuHasIcons$1(items);\n      var alloyItems = cat(map(items, function (item) {\n        var itemHasIcon = function (i) {\n          return isHorizontalMenu ? !i.hasOwnProperty('text') : hasIcons;\n        };\n        var createItem = function (i) {\n          return createMenuItemFromBridge(i, itemResponse, backstage, itemHasIcon(i), isHorizontalMenu);\n        };\n        if (item.type === 'nestedmenuitem' && item.getSubmenuItems().length <= 0) {\n          return createItem(__assign(__assign({}, item), { disabled: true }));\n        } else {\n          return createItem(item);\n        }\n      }));\n      var createPartial = isHorizontalMenu ? createHorizontalPartialMenuWithAlloyItems : createPartialMenuWithAlloyItems;\n      return createPartial(value, hasIcons, alloyItems, 1, 'normal');\n    };\n    var createTieredDataFrom = function (partialMenu) {\n      return tieredMenu.singleData(partialMenu.value, partialMenu);\n    };\n    var createMenuFrom = function (partialMenu, columns, focusMode, presets) {\n      var focusManager = focusMode === FocusMode.ContentFocus ? highlights() : dom();\n      var movement = deriveMenuMovement(columns, presets);\n      var menuMarkers = markers$1(presets);\n      return {\n        dom: partialMenu.dom,\n        components: partialMenu.components,\n        items: partialMenu.items,\n        value: partialMenu.value,\n        markers: {\n          selectedItem: menuMarkers.selectedItem,\n          item: menuMarkers.item\n        },\n        movement: movement,\n        fakeFocus: focusMode === FocusMode.ContentFocus,\n        focusManager: focusManager,\n        menuBehaviours: SimpleBehaviours.unnamedEvents(columns !== 'auto' ? [] : [runOnAttached(function (comp, se) {\n            detectSize(comp, 4, menuMarkers.item).each(function (_a) {\n              var numColumns = _a.numColumns, numRows = _a.numRows;\n              Keying.setGridSize(comp, numRows, numColumns);\n            });\n          })])\n      };\n    };\n\n    var register$2 = function (editor, sharedBackstage) {\n      var activeAutocompleter = Cell(Option.none());\n      var processingAction = Cell(false);\n      var autocompleter = build$1(InlineView.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-autocompleter']\n        },\n        components: [],\n        fireDismissalEventInstead: {},\n        inlineBehaviours: derive$1([config('dismissAutocompleter', [run(dismissRequested(), function () {\n              return cancelIfNecessary();\n            })])]),\n        lazySink: sharedBackstage.getSink\n      }));\n      var isMenuOpen = function () {\n        return InlineView.isOpen(autocompleter);\n      };\n      var isActive = function () {\n        return activeAutocompleter.get().isSome();\n      };\n      var hideIfNecessary = function () {\n        if (isActive()) {\n          InlineView.hide(autocompleter);\n        }\n      };\n      var cancelIfNecessary = function () {\n        if (isActive()) {\n          var lastElement = activeAutocompleter.get().map(function (ac) {\n            return ac.element;\n          });\n          detect$4(lastElement.getOr(Element.fromDom(editor.selection.getNode()))).each(unwrap);\n          hideIfNecessary();\n          activeAutocompleter.set(Option.none());\n          processingAction.set(false);\n        }\n      };\n      var getAutocompleters = cached(function () {\n        return register(editor);\n      });\n      var getCombinedItems = function (triggerChar, matches) {\n        var columns = findMap(matches, function (m) {\n          return Option.from(m.columns);\n        }).getOr(1);\n        return bind(matches, function (match) {\n          var choices = match.items;\n          return createAutocompleteItems(choices, match.matchText, function (itemValue, itemMeta) {\n            var nr = editor.selection.getRng();\n            getContext(editor.dom, nr, triggerChar).fold(function () {\n              return domGlobals.console.error('Lost context. Cursor probably moved');\n            }, function (_a) {\n              var range = _a.range;\n              var autocompleterApi = {\n                hide: function () {\n                  cancelIfNecessary();\n                },\n                reload: function (fetchOptions) {\n                  hideIfNecessary();\n                  load(fetchOptions);\n                }\n              };\n              processingAction.set(true);\n              match.onAction(autocompleterApi, range, itemValue, itemMeta);\n              processingAction.set(false);\n            });\n          }, columns, ItemResponse$1.BUBBLE_TO_SANDBOX, sharedBackstage);\n        });\n      };\n      var commenceIfNecessary = function (context) {\n        if (!isActive()) {\n          var wrapper = create$4(editor, context.range);\n          activeAutocompleter.set(Option.some({\n            triggerChar: context.triggerChar,\n            element: wrapper,\n            matchLength: context.text.length\n          }));\n          processingAction.set(false);\n        }\n      };\n      var display = function (ac, context, lookupData, items) {\n        ac.matchLength = context.text.length;\n        var columns = findMap(lookupData, function (ld) {\n          return Option.from(ld.columns);\n        }).getOr(1);\n        InlineView.showAt(autocompleter, {\n          anchor: 'node',\n          root: Element.fromDom(editor.getBody()),\n          node: Option.from(ac.element)\n        }, Menu.sketch(createMenuFrom(createPartialMenuWithAlloyItems('autocompleter-value', true, items, columns, 'normal'), columns, FocusMode.ContentFocus, 'normal')));\n        InlineView.getContent(autocompleter).each(Highlighting.highlightFirst);\n      };\n      var doLookup = function (fetchOptions) {\n        return activeAutocompleter.get().map(function (ac) {\n          return getContext(editor.dom, editor.selection.getRng(), ac.triggerChar).bind(function (newContext) {\n            return lookupWithContext(editor, getAutocompleters, newContext, fetchOptions);\n          });\n        }).getOrThunk(function () {\n          return lookup(editor, getAutocompleters);\n        });\n      };\n      var load = function (fetchOptions) {\n        doLookup(fetchOptions).fold(cancelIfNecessary, function (lookupInfo) {\n          commenceIfNecessary(lookupInfo.context);\n          lookupInfo.lookupData.then(function (lookupData) {\n            activeAutocompleter.get().map(function (ac) {\n              var context = lookupInfo.context;\n              if (ac.triggerChar === context.triggerChar) {\n                var combinedItems = getCombinedItems(context.triggerChar, lookupData);\n                if (combinedItems.length > 0) {\n                  display(ac, context, lookupData, combinedItems);\n                } else if (context.text.length - ac.matchLength >= 10) {\n                  cancelIfNecessary();\n                } else {\n                  hideIfNecessary();\n                }\n              }\n            });\n          });\n        });\n      };\n      var onKeypress = last$2(function (e) {\n        if (e.which === 27) {\n          return;\n        }\n        load();\n      }, 50);\n      var autocompleterUiApi = {\n        onKeypress: onKeypress,\n        cancelIfNecessary: cancelIfNecessary,\n        isMenuOpen: isMenuOpen,\n        isActive: isActive,\n        isProcessingAction: processingAction.get,\n        getView: function () {\n          return InlineView.getContent(autocompleter);\n        }\n      };\n      AutocompleterEditorEvents.setup(autocompleterUiApi, editor);\n    };\n    var Autocompleter = { register: register$2 };\n\n    var filter$1 = constant(true);\n    var bind$3 = function (element, event, handler) {\n      return bind$2(element, event, filter$1, handler);\n    };\n    var capture$1 = function (element, event, handler) {\n      return capture(element, event, filter$1, handler);\n    };\n    var fromRawEvent$1 = fromRawEvent;\n\n    var closest$4 = function (scope, selector, isRoot) {\n      return closest$3(scope, selector, isRoot).isSome();\n    };\n\n    function DelayedFunction (fun, delay) {\n      var ref = null;\n      var schedule = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        ref = domGlobals.setTimeout(function () {\n          fun.apply(null, args);\n          ref = null;\n        }, delay);\n      };\n      var cancel = function () {\n        if (ref !== null) {\n          domGlobals.clearTimeout(ref);\n          ref = null;\n        }\n      };\n      return {\n        cancel: cancel,\n        schedule: schedule\n      };\n    }\n\n    var SIGNIFICANT_MOVE = 5;\n    var LONGPRESS_DELAY = 400;\n    var getTouch = function (event) {\n      var raw = event.raw();\n      if (raw.touches === undefined || raw.touches.length !== 1) {\n        return Option.none();\n      }\n      return Option.some(raw.touches[0]);\n    };\n    var isFarEnough = function (touch, data) {\n      var distX = Math.abs(touch.clientX - data.x());\n      var distY = Math.abs(touch.clientY - data.y());\n      return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;\n    };\n    var monitor = function (settings) {\n      var startData = Cell(Option.none());\n      var longpressFired = Cell(false);\n      var longpress$1 = DelayedFunction(function (event) {\n        settings.triggerEvent(longpress(), event);\n        longpressFired.set(true);\n      }, LONGPRESS_DELAY);\n      var handleTouchstart = function (event) {\n        getTouch(event).each(function (touch) {\n          longpress$1.cancel();\n          var data = {\n            x: constant(touch.clientX),\n            y: constant(touch.clientY),\n            target: event.target\n          };\n          longpress$1.schedule(event);\n          longpressFired.set(false);\n          startData.set(Option.some(data));\n        });\n        return Option.none();\n      };\n      var handleTouchmove = function (event) {\n        longpress$1.cancel();\n        getTouch(event).each(function (touch) {\n          startData.get().each(function (data) {\n            if (isFarEnough(touch, data)) {\n              startData.set(Option.none());\n            }\n          });\n        });\n        return Option.none();\n      };\n      var handleTouchend = function (event) {\n        longpress$1.cancel();\n        var isSame = function (data) {\n          return eq(data.target(), event.target());\n        };\n        return startData.get().filter(isSame).map(function (data) {\n          if (longpressFired.get()) {\n            event.prevent();\n            return false;\n          } else {\n            return settings.triggerEvent(tap(), event);\n          }\n        });\n      };\n      var handlers = wrapAll$1([\n        {\n          key: touchstart(),\n          value: handleTouchstart\n        },\n        {\n          key: touchmove(),\n          value: handleTouchmove\n        },\n        {\n          key: touchend(),\n          value: handleTouchend\n        }\n      ]);\n      var fireIfReady = function (event, type) {\n        return get(handlers, type).bind(function (handler) {\n          return handler(event);\n        });\n      };\n      return { fireIfReady: fireIfReady };\n    };\n\n    var isDangerous = function (event) {\n      var keyEv = event.raw();\n      return keyEv.which === BACKSPACE()[0] && !contains([\n        'input',\n        'textarea'\n      ], name(event.target())) && !closest$4(event.target(), '[contenteditable=\"true\"]');\n    };\n    var isFirefox = detect$3().browser.isFirefox();\n    var settingsSchema = objOfOnly([\n      strictFunction('triggerEvent'),\n      defaulted$1('stopBackspace', true)\n    ]);\n    var bindFocus = function (container, handler) {\n      if (isFirefox) {\n        return capture$1(container, 'focus', handler);\n      } else {\n        return bind$3(container, 'focusin', handler);\n      }\n    };\n    var bindBlur = function (container, handler) {\n      if (isFirefox) {\n        return capture$1(container, 'blur', handler);\n      } else {\n        return bind$3(container, 'focusout', handler);\n      }\n    };\n    var setup$1 = function (container, rawSettings) {\n      var settings = asRawOrDie('Getting GUI events settings', settingsSchema, rawSettings);\n      var pointerEvents = [\n        'touchstart',\n        'touchmove',\n        'touchend',\n        'touchcancel',\n        'gesturestart',\n        'mousedown',\n        'mouseup',\n        'mouseover',\n        'mousemove',\n        'mouseout',\n        'click'\n      ];\n      var tapEvent = monitor(settings);\n      var simpleEvents = map(pointerEvents.concat([\n        'selectstart',\n        'input',\n        'contextmenu',\n        'change',\n        'transitionend',\n        'drag',\n        'dragstart',\n        'dragend',\n        'dragenter',\n        'dragleave',\n        'dragover',\n        'drop',\n        'keyup'\n      ]), function (type) {\n        return bind$3(container, type, function (event) {\n          tapEvent.fireIfReady(event, type).each(function (tapStopped) {\n            if (tapStopped) {\n              event.kill();\n            }\n          });\n          var stopped = settings.triggerEvent(type, event);\n          if (stopped) {\n            event.kill();\n          }\n        });\n      });\n      var pasteTimeout = Cell(Option.none());\n      var onPaste = bind$3(container, 'paste', function (event) {\n        tapEvent.fireIfReady(event, 'paste').each(function (tapStopped) {\n          if (tapStopped) {\n            event.kill();\n          }\n        });\n        var stopped = settings.triggerEvent('paste', event);\n        if (stopped) {\n          event.kill();\n        }\n        pasteTimeout.set(Option.some(domGlobals.setTimeout(function () {\n          settings.triggerEvent(postPaste(), event);\n        }, 0)));\n      });\n      var onKeydown = bind$3(container, 'keydown', function (event) {\n        var stopped = settings.triggerEvent('keydown', event);\n        if (stopped) {\n          event.kill();\n        } else if (settings.stopBackspace === true && isDangerous(event)) {\n          event.prevent();\n        }\n      });\n      var onFocusIn = bindFocus(container, function (event) {\n        var stopped = settings.triggerEvent('focusin', event);\n        if (stopped) {\n          event.kill();\n        }\n      });\n      var focusoutTimeout = Cell(Option.none());\n      var onFocusOut = bindBlur(container, function (event) {\n        var stopped = settings.triggerEvent('focusout', event);\n        if (stopped) {\n          event.kill();\n        }\n        focusoutTimeout.set(Option.some(domGlobals.setTimeout(function () {\n          settings.triggerEvent(postBlur(), event);\n        }, 0)));\n      });\n      var unbind = function () {\n        each(simpleEvents, function (e) {\n          e.unbind();\n        });\n        onKeydown.unbind();\n        onFocusIn.unbind();\n        onFocusOut.unbind();\n        onPaste.unbind();\n        pasteTimeout.get().each(domGlobals.clearTimeout);\n        focusoutTimeout.get().each(domGlobals.clearTimeout);\n      };\n      return { unbind: unbind };\n    };\n\n    var derive$2 = function (rawEvent, rawTarget) {\n      var source = get(rawEvent, 'target').map(function (getTarget) {\n        return getTarget();\n      }).getOr(rawTarget);\n      return Cell(source);\n    };\n\n    var fromSource = function (event, source) {\n      var stopper = Cell(false);\n      var cutter = Cell(false);\n      var stop = function () {\n        stopper.set(true);\n      };\n      var cut = function () {\n        cutter.set(true);\n      };\n      return {\n        stop: stop,\n        cut: cut,\n        isStopped: stopper.get,\n        isCut: cutter.get,\n        event: constant(event),\n        setSource: source.set,\n        getSource: source.get\n      };\n    };\n    var fromExternal = function (event) {\n      var stopper = Cell(false);\n      var stop = function () {\n        stopper.set(true);\n      };\n      return {\n        stop: stop,\n        cut: noop,\n        isStopped: stopper.get,\n        isCut: constant(false),\n        event: constant(event),\n        setSource: die('Cannot set source of a broadcasted event'),\n        getSource: die('Cannot get source of a broadcasted event')\n      };\n    };\n\n    var adt$b = Adt.generate([\n      { stopped: [] },\n      { resume: ['element'] },\n      { complete: [] }\n    ]);\n    var doTriggerHandler = function (lookup, eventType, rawEvent, target, source, logger) {\n      var handler = lookup(eventType, target);\n      var simulatedEvent = fromSource(rawEvent, source);\n      return handler.fold(function () {\n        logger.logEventNoHandlers(eventType, target);\n        return adt$b.complete();\n      }, function (handlerInfo) {\n        var descHandler = handlerInfo.descHandler();\n        var eventHandler = getCurried(descHandler);\n        eventHandler(simulatedEvent);\n        if (simulatedEvent.isStopped()) {\n          logger.logEventStopped(eventType, handlerInfo.element(), descHandler.purpose());\n          return adt$b.stopped();\n        } else if (simulatedEvent.isCut()) {\n          logger.logEventCut(eventType, handlerInfo.element(), descHandler.purpose());\n          return adt$b.complete();\n        } else {\n          return parent(handlerInfo.element()).fold(function () {\n            logger.logNoParent(eventType, handlerInfo.element(), descHandler.purpose());\n            return adt$b.complete();\n          }, function (parent) {\n            logger.logEventResponse(eventType, handlerInfo.element(), descHandler.purpose());\n            return adt$b.resume(parent);\n          });\n        }\n      });\n    };\n    var doTriggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, source, logger) {\n      return doTriggerHandler(lookup, eventType, rawEvent, rawTarget, source, logger).fold(function () {\n        return true;\n      }, function (parent) {\n        return doTriggerOnUntilStopped(lookup, eventType, rawEvent, parent, source, logger);\n      }, function () {\n        return false;\n      });\n    };\n    var triggerHandler = function (lookup, eventType, rawEvent, target, logger) {\n      var source = derive$2(rawEvent, target);\n      return doTriggerHandler(lookup, eventType, rawEvent, target, source, logger);\n    };\n    var broadcast = function (listeners, rawEvent, logger) {\n      var simulatedEvent = fromExternal(rawEvent);\n      each(listeners, function (listener) {\n        var descHandler = listener.descHandler();\n        var handler = getCurried(descHandler);\n        handler(simulatedEvent);\n      });\n      return simulatedEvent.isStopped();\n    };\n    var triggerUntilStopped = function (lookup, eventType, rawEvent, logger) {\n      var rawTarget = rawEvent.target();\n      return triggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, logger);\n    };\n    var triggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, logger) {\n      var source = derive$2(rawEvent, rawTarget);\n      return doTriggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, source, logger);\n    };\n\n    var eventHandler = Immutable('element', 'descHandler');\n    var broadcastHandler = function (id, handler) {\n      return {\n        id: constant(id),\n        descHandler: constant(handler)\n      };\n    };\n    function EventRegistry () {\n      var registry = {};\n      var registerId = function (extraArgs, id, events) {\n        each$1(events, function (v, k) {\n          var handlers = registry[k] !== undefined ? registry[k] : {};\n          handlers[id] = curryArgs(v, extraArgs);\n          registry[k] = handlers;\n        });\n      };\n      var findHandler = function (handlers, elem) {\n        return read$1(elem).fold(function () {\n          return Option.none();\n        }, function (id) {\n          return handlers.bind(function (h) {\n            return get(h, id);\n          }).map(function (descHandler) {\n            return eventHandler(elem, descHandler);\n          });\n        });\n      };\n      var filterByType = function (type) {\n        return get(registry, type).map(function (handlers) {\n          return mapToArray(handlers, function (f, id) {\n            return broadcastHandler(id, f);\n          });\n        }).getOr([]);\n      };\n      var find = function (isAboveRoot, type, target) {\n        var handlers = get(registry, type);\n        return closest(target, function (elem) {\n          return findHandler(handlers, elem);\n        }, isAboveRoot);\n      };\n      var unregisterId = function (id) {\n        each$1(registry, function (handlersById, eventName) {\n          if (handlersById.hasOwnProperty(id)) {\n            delete handlersById[id];\n          }\n        });\n      };\n      return {\n        registerId: registerId,\n        unregisterId: unregisterId,\n        filterByType: filterByType,\n        find: find\n      };\n    }\n\n    function Registry () {\n      var events = EventRegistry();\n      var components = {};\n      var readOrTag = function (component) {\n        var elem = component.element();\n        return read$1(elem).fold(function () {\n          return write('uid-', component.element());\n        }, function (uid) {\n          return uid;\n        });\n      };\n      var failOnDuplicate = function (component, tagId) {\n        var conflict = components[tagId];\n        if (conflict === component) {\n          unregister(component);\n        } else {\n          throw new Error('The tagId \"' + tagId + '\" is already used by: ' + element(conflict.element()) + '\\nCannot use it for: ' + element(component.element()) + '\\n' + 'The conflicting element is' + (inBody(conflict.element()) ? ' ' : ' not ') + 'already in the DOM');\n        }\n      };\n      var register = function (component) {\n        var tagId = readOrTag(component);\n        if (hasNonNullableKey(components, tagId)) {\n          failOnDuplicate(component, tagId);\n        }\n        var extraArgs = [component];\n        events.registerId(extraArgs, tagId, component.events());\n        components[tagId] = component;\n      };\n      var unregister = function (component) {\n        read$1(component.element()).each(function (tagId) {\n          delete components[tagId];\n          events.unregisterId(tagId);\n        });\n      };\n      var filter = function (type) {\n        return events.filterByType(type);\n      };\n      var find = function (isAboveRoot, type, target) {\n        return events.find(isAboveRoot, type, target);\n      };\n      var getById = function (id) {\n        return get(components, id);\n      };\n      return {\n        find: find,\n        filter: filter,\n        register: register,\n        unregister: unregister,\n        getById: getById\n      };\n    }\n\n    var factory$3 = function (detail) {\n      var _a = detail.dom, attributes = _a.attributes, domWithoutAttributes = __rest(_a, ['attributes']);\n      return {\n        uid: detail.uid,\n        dom: __assign({\n          tag: 'div',\n          attributes: __assign({ role: 'presentation' }, attributes)\n        }, domWithoutAttributes),\n        components: detail.components,\n        behaviours: get$c(detail.containerBehaviours),\n        events: detail.events,\n        domModification: detail.domModification,\n        eventOrder: detail.eventOrder\n      };\n    };\n    var Container = single$2({\n      name: 'Container',\n      factory: factory$3,\n      configFields: [\n        defaulted$1('components', []),\n        field$1('containerBehaviours', []),\n        defaulted$1('events', {}),\n        defaulted$1('domModification', {}),\n        defaulted$1('eventOrder', {})\n      ]\n    });\n\n    var takeover = function (root) {\n      var isAboveRoot = function (el) {\n        return parent(root.element()).fold(function () {\n          return true;\n        }, function (parent) {\n          return eq(el, parent);\n        });\n      };\n      var registry = Registry();\n      var lookup = function (eventName, target) {\n        return registry.find(isAboveRoot, eventName, target);\n      };\n      var domEvents = setup$1(root.element(), {\n        triggerEvent: function (eventName, event) {\n          return monitorEvent(eventName, event.target(), function (logger) {\n            return triggerUntilStopped(lookup, eventName, event, logger);\n          });\n        }\n      });\n      var systemApi = {\n        debugInfo: constant('real'),\n        triggerEvent: function (eventName, target, data) {\n          monitorEvent(eventName, target, function (logger) {\n            return triggerOnUntilStopped(lookup, eventName, data, target, logger);\n          });\n        },\n        triggerFocus: function (target, originator) {\n          read$1(target).fold(function () {\n            focus$1(target);\n          }, function (_alloyId) {\n            monitorEvent(focus(), target, function (logger) {\n              triggerHandler(lookup, focus(), {\n                originator: constant(originator),\n                kill: noop,\n                prevent: noop,\n                target: constant(target)\n              }, target, logger);\n              return false;\n            });\n          });\n        },\n        triggerEscape: function (comp, simulatedEvent) {\n          systemApi.triggerEvent('keydown', comp.element(), simulatedEvent.event());\n        },\n        getByUid: function (uid) {\n          return getByUid(uid);\n        },\n        getByDom: function (elem) {\n          return getByDom(elem);\n        },\n        build: build$1,\n        addToGui: function (c) {\n          add(c);\n        },\n        removeFromGui: function (c) {\n          remove$1(c);\n        },\n        addToWorld: function (c) {\n          addToWorld(c);\n        },\n        removeFromWorld: function (c) {\n          removeFromWorld(c);\n        },\n        broadcast: function (message) {\n          broadcast$1(message);\n        },\n        broadcastOn: function (channels, message) {\n          broadcastOn(channels, message);\n        },\n        broadcastEvent: function (eventName, event) {\n          broadcastEvent(eventName, event);\n        },\n        isConnected: constant(true)\n      };\n      var addToWorld = function (component) {\n        component.connect(systemApi);\n        if (!isText(component.element())) {\n          registry.register(component);\n          each(component.components(), addToWorld);\n          systemApi.triggerEvent(systemInit(), component.element(), { target: constant(component.element()) });\n        }\n      };\n      var removeFromWorld = function (component) {\n        if (!isText(component.element())) {\n          each(component.components(), removeFromWorld);\n          registry.unregister(component);\n        }\n        component.disconnect();\n      };\n      var add = function (component) {\n        attach$1(root, component);\n      };\n      var remove$1 = function (component) {\n        detach(component);\n      };\n      var destroy = function () {\n        domEvents.unbind();\n        remove(root.element());\n      };\n      var broadcastData = function (data) {\n        var receivers = registry.filter(receive());\n        each(receivers, function (receiver) {\n          var descHandler = receiver.descHandler();\n          var handler = getCurried(descHandler);\n          handler(data);\n        });\n      };\n      var broadcast$1 = function (message) {\n        broadcastData({\n          universal: constant(true),\n          data: constant(message)\n        });\n      };\n      var broadcastOn = function (channels, message) {\n        broadcastData({\n          universal: constant(false),\n          channels: constant(channels),\n          data: constant(message)\n        });\n      };\n      var broadcastEvent = function (eventName, event) {\n        var listeners = registry.filter(eventName);\n        return broadcast(listeners, event);\n      };\n      var getByUid = function (uid) {\n        return registry.getById(uid).fold(function () {\n          return Result.error(new Error('Could not find component with uid: \"' + uid + '\" in system.'));\n        }, Result.value);\n      };\n      var getByDom = function (elem) {\n        var uid = read$1(elem).getOr('not found');\n        return getByUid(uid);\n      };\n      addToWorld(root);\n      return {\n        root: constant(root),\n        element: root.element,\n        destroy: destroy,\n        add: add,\n        remove: remove$1,\n        getByUid: getByUid,\n        getByDom: getByDom,\n        addToWorld: addToWorld,\n        removeFromWorld: removeFromWorld,\n        broadcast: broadcast$1,\n        broadcastOn: broadcastOn,\n        broadcastEvent: broadcastEvent\n      };\n    };\n\n    var formChangeEvent = generate$1('form-component-change');\n    var formCloseEvent = generate$1('form-close');\n    var formCancelEvent = generate$1('form-cancel');\n    var formActionEvent = generate$1('form-action');\n    var formSubmitEvent = generate$1('form-submit');\n    var formBlockEvent = generate$1('form-block');\n    var formUnblockEvent = generate$1('form-unblock');\n    var formTabChangeEvent = generate$1('form-tabchange');\n    var formResizeEvent = generate$1('form-resize');\n\n    var renderAlertBanner = function (spec, providersBackstage) {\n      return Container.sketch({\n        dom: {\n          tag: 'div',\n          attributes: { role: 'alert' },\n          classes: [\n            'tox-notification',\n            'tox-notification--in',\n            'tox-notification--' + spec.level\n          ]\n        },\n        components: [\n          {\n            dom: {\n              tag: 'div',\n              classes: ['tox-notification__icon']\n            },\n            components: [Button.sketch({\n                dom: {\n                  tag: 'button',\n                  classes: [\n                    'tox-button',\n                    'tox-button--naked',\n                    'tox-button--icon'\n                  ],\n                  innerHtml: get$d(spec.icon, providersBackstage.icons),\n                  attributes: { title: providersBackstage.translate(spec.iconTooltip) }\n                },\n                action: function (comp) {\n                  emitWith(comp, formActionEvent, {\n                    name: 'alert-banner',\n                    value: spec.url\n                  });\n                }\n              })]\n          },\n          {\n            dom: {\n              tag: 'div',\n              classes: ['tox-notification__body'],\n              innerHtml: providersBackstage.translate(spec.text)\n            }\n          }\n        ]\n      });\n    };\n\n    var renderBar = function (spec, backstage) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-bar',\n            'tox-form__controls-h-stack'\n          ]\n        },\n        components: map(spec.items, backstage.interpreter)\n      };\n    };\n\n    var schema$e = constant([\n      defaulted$1('prefix', 'form-field'),\n      field$1('fieldBehaviours', [\n        Composing,\n        Representing\n      ])\n    ]);\n    var parts$3 = constant([\n      optional({\n        schema: [strict$1('dom')],\n        name: 'label'\n      }),\n      optional({\n        factory: {\n          sketch: function (spec) {\n            return {\n              uid: spec.uid,\n              dom: {\n                tag: 'span',\n                styles: { display: 'none' },\n                attributes: { 'aria-hidden': 'true' },\n                innerHtml: spec.text\n              }\n            };\n          }\n        },\n        schema: [strict$1('text')],\n        name: 'aria-descriptor'\n      }),\n      required({\n        factory: {\n          sketch: function (spec) {\n            var excludeFactory = exclude$1(spec, ['factory']);\n            return spec.factory.sketch(excludeFactory);\n          }\n        },\n        schema: [strict$1('factory')],\n        name: 'field'\n      })\n    ]);\n\n    var factory$4 = function (detail, components, spec, externals) {\n      var behaviours = augment(detail.fieldBehaviours, [\n        Composing.config({\n          find: function (container) {\n            return getPart(container, detail, 'field');\n          }\n        }),\n        Representing.config({\n          store: {\n            mode: 'manual',\n            getValue: function (field) {\n              return Composing.getCurrent(field).bind(Representing.getValue);\n            },\n            setValue: function (field, value) {\n              Composing.getCurrent(field).each(function (current) {\n                Representing.setValue(current, value);\n              });\n            }\n          }\n        })\n      ]);\n      var events = derive([runOnAttached(function (component, simulatedEvent) {\n          var ps = getParts(component, detail, [\n            'label',\n            'field',\n            'aria-descriptor'\n          ]);\n          ps.field().each(function (field) {\n            var id = generate$1(detail.prefix);\n            ps.label().each(function (label) {\n              set$1(label.element(), 'for', id);\n              set$1(field.element(), 'id', id);\n            });\n            ps['aria-descriptor']().each(function (descriptor) {\n              var descriptorId = generate$1(detail.prefix);\n              set$1(descriptor.element(), 'id', descriptorId);\n              set$1(field.element(), 'aria-describedby', descriptorId);\n            });\n          });\n        })]);\n      var apis = {\n        getField: function (container) {\n          return getPart(container, detail, 'field');\n        },\n        getLabel: function (container) {\n          return getPart(container, detail, 'label');\n        }\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: behaviours,\n        events: events,\n        apis: apis\n      };\n    };\n    var FormField = composite$1({\n      name: 'FormField',\n      configFields: schema$e(),\n      partFields: parts$3(),\n      factory: factory$4,\n      apis: {\n        getField: function (apis, comp) {\n          return apis.getField(comp);\n        },\n        getLabel: function (apis, comp) {\n          return apis.getLabel(comp);\n        }\n      }\n    });\n\n    var schema$f = constant([\n      option('data'),\n      defaulted$1('inputAttributes', {}),\n      defaulted$1('inputStyles', {}),\n      defaulted$1('tag', 'input'),\n      defaulted$1('inputClasses', []),\n      onHandler('onSetValue'),\n      defaulted$1('styles', {}),\n      defaulted$1('eventOrder', {}),\n      field$1('inputBehaviours', [\n        Representing,\n        Focusing\n      ]),\n      defaulted$1('selectOnFocus', true)\n    ]);\n    var focusBehaviours = function (detail) {\n      return derive$1([Focusing.config({\n          onFocus: !detail.selectOnFocus ? noop : function (component) {\n            var input = component.element();\n            var value = get$5(input);\n            input.dom().setSelectionRange(0, value.length);\n          }\n        })]);\n    };\n    var behaviours = function (detail) {\n      return __assign(__assign({}, focusBehaviours(detail)), augment(detail.inputBehaviours, [Representing.config({\n          store: __assign(__assign({ mode: 'manual' }, detail.data.map(function (data) {\n            return { initialValue: data };\n          }).getOr({})), {\n            getValue: function (input) {\n              return get$5(input.element());\n            },\n            setValue: function (input, data) {\n              var current = get$5(input.element());\n              if (current !== data) {\n                set$3(input.element(), data);\n              }\n            }\n          }),\n          onSetValue: detail.onSetValue\n        })]));\n    };\n    var dom$2 = function (detail) {\n      return {\n        tag: detail.tag,\n        attributes: __assign({ type: 'text' }, detail.inputAttributes),\n        styles: detail.inputStyles,\n        classes: detail.inputClasses\n      };\n    };\n\n    var factory$5 = function (detail, spec) {\n      return {\n        uid: detail.uid,\n        dom: dom$2(detail),\n        components: [],\n        behaviours: behaviours(detail),\n        eventOrder: detail.eventOrder\n      };\n    };\n    var Input = single$2({\n      name: 'Input',\n      configFields: schema$f(),\n      factory: factory$5\n    });\n\n    var exports$1 = {}, module = { exports: exports$1 };\n    (function (define, exports, module, require) {\n      (function (f) {\n        if (typeof exports === 'object' && typeof module !== 'undefined') {\n          module.exports = f();\n        } else if (typeof define === 'function' && define.amd) {\n          define([], f);\n        } else {\n          var g;\n          if (typeof window !== 'undefined') {\n            g = window;\n          } else if (typeof global !== 'undefined') {\n            g = global;\n          } else if (typeof self !== 'undefined') {\n            g = self;\n          } else {\n            g = this;\n          }\n          g.EphoxContactWrapper = f();\n        }\n      }(function () {\n        return function () {\n          function r(e, n, t) {\n            function o(i, f) {\n              if (!n[i]) {\n                if (!e[i]) {\n                  var c = 'function' == typeof require && require;\n                  if (!f && c)\n                    return c(i, !0);\n                  if (u)\n                    return u(i, !0);\n                  var a = new Error('Cannot find module \\'' + i + '\\'');\n                  throw a.code = 'MODULE_NOT_FOUND', a;\n                }\n                var p = n[i] = { exports: {} };\n                e[i][0].call(p.exports, function (r) {\n                  var n = e[i][1][r];\n                  return o(n || r);\n                }, p, p.exports, r, e, n, t);\n              }\n              return n[i].exports;\n            }\n            for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++)\n              o(t[i]);\n            return o;\n          }\n          return r;\n        }()({\n          1: [\n            function (require, module, exports) {\n              var process = module.exports = {};\n              var cachedSetTimeout;\n              var cachedClearTimeout;\n              function defaultSetTimout() {\n                throw new Error('setTimeout has not been defined');\n              }\n              function defaultClearTimeout() {\n                throw new Error('clearTimeout has not been defined');\n              }\n              (function () {\n                try {\n                  if (typeof setTimeout === 'function') {\n                    cachedSetTimeout = setTimeout;\n                  } else {\n                    cachedSetTimeout = defaultSetTimout;\n                  }\n                } catch (e) {\n                  cachedSetTimeout = defaultSetTimout;\n                }\n                try {\n                  if (typeof clearTimeout === 'function') {\n                    cachedClearTimeout = clearTimeout;\n                  } else {\n                    cachedClearTimeout = defaultClearTimeout;\n                  }\n                } catch (e) {\n                  cachedClearTimeout = defaultClearTimeout;\n                }\n              }());\n              function runTimeout(fun) {\n                if (cachedSetTimeout === setTimeout) {\n                  return setTimeout(fun, 0);\n                }\n                if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n                  cachedSetTimeout = setTimeout;\n                  return setTimeout(fun, 0);\n                }\n                try {\n                  return cachedSetTimeout(fun, 0);\n                } catch (e) {\n                  try {\n                    return cachedSetTimeout.call(null, fun, 0);\n                  } catch (e) {\n                    return cachedSetTimeout.call(this, fun, 0);\n                  }\n                }\n              }\n              function runClearTimeout(marker) {\n                if (cachedClearTimeout === clearTimeout) {\n                  return clearTimeout(marker);\n                }\n                if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n                  cachedClearTimeout = clearTimeout;\n                  return clearTimeout(marker);\n                }\n                try {\n                  return cachedClearTimeout(marker);\n                } catch (e) {\n                  try {\n                    return cachedClearTimeout.call(null, marker);\n                  } catch (e) {\n                    return cachedClearTimeout.call(this, marker);\n                  }\n                }\n              }\n              var queue = [];\n              var draining = false;\n              var currentQueue;\n              var queueIndex = -1;\n              function cleanUpNextTick() {\n                if (!draining || !currentQueue) {\n                  return;\n                }\n                draining = false;\n                if (currentQueue.length) {\n                  queue = currentQueue.concat(queue);\n                } else {\n                  queueIndex = -1;\n                }\n                if (queue.length) {\n                  drainQueue();\n                }\n              }\n              function drainQueue() {\n                if (draining) {\n                  return;\n                }\n                var timeout = runTimeout(cleanUpNextTick);\n                draining = true;\n                var len = queue.length;\n                while (len) {\n                  currentQueue = queue;\n                  queue = [];\n                  while (++queueIndex < len) {\n                    if (currentQueue) {\n                      currentQueue[queueIndex].run();\n                    }\n                  }\n                  queueIndex = -1;\n                  len = queue.length;\n                }\n                currentQueue = null;\n                draining = false;\n                runClearTimeout(timeout);\n              }\n              process.nextTick = function (fun) {\n                var args = new Array(arguments.length - 1);\n                if (arguments.length > 1) {\n                  for (var i = 1; i < arguments.length; i++) {\n                    args[i - 1] = arguments[i];\n                  }\n                }\n                queue.push(new Item(fun, args));\n                if (queue.length === 1 && !draining) {\n                  runTimeout(drainQueue);\n                }\n              };\n              function Item(fun, array) {\n                this.fun = fun;\n                this.array = array;\n              }\n              Item.prototype.run = function () {\n                this.fun.apply(null, this.array);\n              };\n              process.title = 'browser';\n              process.browser = true;\n              process.env = {};\n              process.argv = [];\n              process.version = '';\n              process.versions = {};\n              function noop() {\n              }\n              process.on = noop;\n              process.addListener = noop;\n              process.once = noop;\n              process.off = noop;\n              process.removeListener = noop;\n              process.removeAllListeners = noop;\n              process.emit = noop;\n              process.prependListener = noop;\n              process.prependOnceListener = noop;\n              process.listeners = function (name) {\n                return [];\n              };\n              process.binding = function (name) {\n                throw new Error('process.binding is not supported');\n              };\n              process.cwd = function () {\n                return '/';\n              };\n              process.chdir = function (dir) {\n                throw new Error('process.chdir is not supported');\n              };\n              process.umask = function () {\n                return 0;\n              };\n            },\n            {}\n          ],\n          2: [\n            function (require, module, exports) {\n              (function (setImmediate) {\n                (function (root) {\n                  var setTimeoutFunc = setTimeout;\n                  function noop() {\n                  }\n                  function bind(fn, thisArg) {\n                    return function () {\n                      fn.apply(thisArg, arguments);\n                    };\n                  }\n                  function Promise(fn) {\n                    if (typeof this !== 'object')\n                      throw new TypeError('Promises must be constructed via new');\n                    if (typeof fn !== 'function')\n                      throw new TypeError('not a function');\n                    this._state = 0;\n                    this._handled = false;\n                    this._value = undefined;\n                    this._deferreds = [];\n                    doResolve(fn, this);\n                  }\n                  function handle(self, deferred) {\n                    while (self._state === 3) {\n                      self = self._value;\n                    }\n                    if (self._state === 0) {\n                      self._deferreds.push(deferred);\n                      return;\n                    }\n                    self._handled = true;\n                    Promise._immediateFn(function () {\n                      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n                      if (cb === null) {\n                        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n                        return;\n                      }\n                      var ret;\n                      try {\n                        ret = cb(self._value);\n                      } catch (e) {\n                        reject(deferred.promise, e);\n                        return;\n                      }\n                      resolve(deferred.promise, ret);\n                    });\n                  }\n                  function resolve(self, newValue) {\n                    try {\n                      if (newValue === self)\n                        throw new TypeError('A promise cannot be resolved with itself.');\n                      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n                        var then = newValue.then;\n                        if (newValue instanceof Promise) {\n                          self._state = 3;\n                          self._value = newValue;\n                          finale(self);\n                          return;\n                        } else if (typeof then === 'function') {\n                          doResolve(bind(then, newValue), self);\n                          return;\n                        }\n                      }\n                      self._state = 1;\n                      self._value = newValue;\n                      finale(self);\n                    } catch (e) {\n                      reject(self, e);\n                    }\n                  }\n                  function reject(self, newValue) {\n                    self._state = 2;\n                    self._value = newValue;\n                    finale(self);\n                  }\n                  function finale(self) {\n                    if (self._state === 2 && self._deferreds.length === 0) {\n                      Promise._immediateFn(function () {\n                        if (!self._handled) {\n                          Promise._unhandledRejectionFn(self._value);\n                        }\n                      });\n                    }\n                    for (var i = 0, len = self._deferreds.length; i < len; i++) {\n                      handle(self, self._deferreds[i]);\n                    }\n                    self._deferreds = null;\n                  }\n                  function Handler(onFulfilled, onRejected, promise) {\n                    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n                    this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n                    this.promise = promise;\n                  }\n                  function doResolve(fn, self) {\n                    var done = false;\n                    try {\n                      fn(function (value) {\n                        if (done)\n                          return;\n                        done = true;\n                        resolve(self, value);\n                      }, function (reason) {\n                        if (done)\n                          return;\n                        done = true;\n                        reject(self, reason);\n                      });\n                    } catch (ex) {\n                      if (done)\n                        return;\n                      done = true;\n                      reject(self, ex);\n                    }\n                  }\n                  Promise.prototype['catch'] = function (onRejected) {\n                    return this.then(null, onRejected);\n                  };\n                  Promise.prototype.then = function (onFulfilled, onRejected) {\n                    var prom = new this.constructor(noop);\n                    handle(this, new Handler(onFulfilled, onRejected, prom));\n                    return prom;\n                  };\n                  Promise.all = function (arr) {\n                    var args = Array.prototype.slice.call(arr);\n                    return new Promise(function (resolve, reject) {\n                      if (args.length === 0)\n                        return resolve([]);\n                      var remaining = args.length;\n                      function res(i, val) {\n                        try {\n                          if (val && (typeof val === 'object' || typeof val === 'function')) {\n                            var then = val.then;\n                            if (typeof then === 'function') {\n                              then.call(val, function (val) {\n                                res(i, val);\n                              }, reject);\n                              return;\n                            }\n                          }\n                          args[i] = val;\n                          if (--remaining === 0) {\n                            resolve(args);\n                          }\n                        } catch (ex) {\n                          reject(ex);\n                        }\n                      }\n                      for (var i = 0; i < args.length; i++) {\n                        res(i, args[i]);\n                      }\n                    });\n                  };\n                  Promise.resolve = function (value) {\n                    if (value && typeof value === 'object' && value.constructor === Promise) {\n                      return value;\n                    }\n                    return new Promise(function (resolve) {\n                      resolve(value);\n                    });\n                  };\n                  Promise.reject = function (value) {\n                    return new Promise(function (resolve, reject) {\n                      reject(value);\n                    });\n                  };\n                  Promise.race = function (values) {\n                    return new Promise(function (resolve, reject) {\n                      for (var i = 0, len = values.length; i < len; i++) {\n                        values[i].then(resolve, reject);\n                      }\n                    });\n                  };\n                  Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {\n                    setImmediate(fn);\n                  } : function (fn) {\n                    setTimeoutFunc(fn, 0);\n                  };\n                  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n                    if (typeof console !== 'undefined' && console) {\n                      console.warn('Possible Unhandled Promise Rejection:', err);\n                    }\n                  };\n                  Promise._setImmediateFn = function _setImmediateFn(fn) {\n                    Promise._immediateFn = fn;\n                  };\n                  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {\n                    Promise._unhandledRejectionFn = fn;\n                  };\n                  if (typeof module !== 'undefined' && module.exports) {\n                    module.exports = Promise;\n                  } else if (!root.Promise) {\n                    root.Promise = Promise;\n                  }\n                }(this));\n              }.call(this, require('timers').setImmediate));\n            },\n            { 'timers': 3 }\n          ],\n          3: [\n            function (require, module, exports) {\n              (function (setImmediate, clearImmediate) {\n                var nextTick = require('process/browser.js').nextTick;\n                var apply = Function.prototype.apply;\n                var slice = Array.prototype.slice;\n                var immediateIds = {};\n                var nextImmediateId = 0;\n                exports.setTimeout = function () {\n                  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n                };\n                exports.setInterval = function () {\n                  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n                };\n                exports.clearTimeout = exports.clearInterval = function (timeout) {\n                  timeout.close();\n                };\n                function Timeout(id, clearFn) {\n                  this._id = id;\n                  this._clearFn = clearFn;\n                }\n                Timeout.prototype.unref = Timeout.prototype.ref = function () {\n                };\n                Timeout.prototype.close = function () {\n                  this._clearFn.call(window, this._id);\n                };\n                exports.enroll = function (item, msecs) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = msecs;\n                };\n                exports.unenroll = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = -1;\n                };\n                exports._unrefActive = exports.active = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  var msecs = item._idleTimeout;\n                  if (msecs >= 0) {\n                    item._idleTimeoutId = setTimeout(function onTimeout() {\n                      if (item._onTimeout)\n                        item._onTimeout();\n                    }, msecs);\n                  }\n                };\n                exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) {\n                  var id = nextImmediateId++;\n                  var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n                  immediateIds[id] = true;\n                  nextTick(function onNextTick() {\n                    if (immediateIds[id]) {\n                      if (args) {\n                        fn.apply(null, args);\n                      } else {\n                        fn.call(null);\n                      }\n                      exports.clearImmediate(id);\n                    }\n                  });\n                  return id;\n                };\n                exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) {\n                  delete immediateIds[id];\n                };\n              }.call(this, require('timers').setImmediate, require('timers').clearImmediate));\n            },\n            {\n              'process/browser.js': 1,\n              'timers': 3\n            }\n          ],\n          4: [\n            function (require, module, exports) {\n              var promisePolyfill = require('promise-polyfill');\n              var Global = function () {\n                if (typeof window !== 'undefined') {\n                  return window;\n                } else {\n                  return Function('return this;')();\n                }\n              }();\n              module.exports = { boltExport: Global.Promise || promisePolyfill };\n            },\n            { 'promise-polyfill': 2 }\n          ]\n        }, {}, [4])(4);\n      }));\n    }(undefined, exports$1, module, undefined));\n    var Promise = module.exports.boltExport;\n\n    var nu$a = function (baseFn) {\n      var data = Option.none();\n      var callbacks = [];\n      var map = function (f) {\n        return nu$a(function (nCallback) {\n          get(function (data) {\n            nCallback(f(data));\n          });\n        });\n      };\n      var get = function (nCallback) {\n        if (isReady()) {\n          call(nCallback);\n        } else {\n          callbacks.push(nCallback);\n        }\n      };\n      var set = function (x) {\n        data = Option.some(x);\n        run(callbacks);\n        callbacks = [];\n      };\n      var isReady = function () {\n        return data.isSome();\n      };\n      var run = function (cbs) {\n        each(cbs, call);\n      };\n      var call = function (cb) {\n        data.each(function (x) {\n          domGlobals.setTimeout(function () {\n            cb(x);\n          }, 0);\n        });\n      };\n      baseFn(set);\n      return {\n        get: get,\n        map: map,\n        isReady: isReady\n      };\n    };\n    var pure$1 = function (a) {\n      return nu$a(function (callback) {\n        callback(a);\n      });\n    };\n    var LazyValue = {\n      nu: nu$a,\n      pure: pure$1\n    };\n\n    var errorReporter = function (err) {\n      domGlobals.setTimeout(function () {\n        throw err;\n      }, 0);\n    };\n    var make$3 = function (run) {\n      var get = function (callback) {\n        run().then(callback, errorReporter);\n      };\n      var map = function (fab) {\n        return make$3(function () {\n          return run().then(fab);\n        });\n      };\n      var bind = function (aFutureB) {\n        return make$3(function () {\n          return run().then(function (v) {\n            return aFutureB(v).toPromise();\n          });\n        });\n      };\n      var anonBind = function (futureB) {\n        return make$3(function () {\n          return run().then(function () {\n            return futureB.toPromise();\n          });\n        });\n      };\n      var toLazy = function () {\n        return LazyValue.nu(get);\n      };\n      var toCached = function () {\n        var cache = null;\n        return make$3(function () {\n          if (cache === null) {\n            cache = run();\n          }\n          return cache;\n        });\n      };\n      var toPromise = run;\n      return {\n        map: map,\n        bind: bind,\n        anonBind: anonBind,\n        toLazy: toLazy,\n        toCached: toCached,\n        toPromise: toPromise,\n        get: get\n      };\n    };\n    var nu$b = function (baseFn) {\n      return make$3(function () {\n        return new Promise(baseFn);\n      });\n    };\n    var pure$2 = function (a) {\n      return make$3(function () {\n        return Promise.resolve(a);\n      });\n    };\n    var Future = {\n      nu: nu$b,\n      pure: pure$2\n    };\n\n    var ariaElements = [\n      'input',\n      'textarea'\n    ];\n    var isAriaElement = function (elem) {\n      var name$1 = name(elem);\n      return contains(ariaElements, name$1);\n    };\n    var markValid = function (component, invalidConfig) {\n      var elem = invalidConfig.getRoot(component).getOr(component.element());\n      remove$4(elem, invalidConfig.invalidClass);\n      invalidConfig.notify.each(function (notifyInfo) {\n        if (isAriaElement(component.element())) {\n          set$1(component.element(), 'aria-invalid', false);\n        }\n        notifyInfo.getContainer(component).each(function (container) {\n          set(container, notifyInfo.validHtml);\n        });\n        notifyInfo.onValid(component);\n      });\n    };\n    var markInvalid = function (component, invalidConfig, invalidState, text) {\n      var elem = invalidConfig.getRoot(component).getOr(component.element());\n      add$2(elem, invalidConfig.invalidClass);\n      invalidConfig.notify.each(function (notifyInfo) {\n        if (isAriaElement(component.element())) {\n          set$1(component.element(), 'aria-invalid', true);\n        }\n        notifyInfo.getContainer(component).each(function (container) {\n          set(container, text);\n        });\n        notifyInfo.onInvalid(component, text);\n      });\n    };\n    var query = function (component, invalidConfig, invalidState) {\n      return invalidConfig.validator.fold(function () {\n        return Future.pure(Result.value(true));\n      }, function (validatorInfo) {\n        return validatorInfo.validate(component);\n      });\n    };\n    var run$1 = function (component, invalidConfig, invalidState) {\n      invalidConfig.notify.each(function (notifyInfo) {\n        notifyInfo.onValidate(component);\n      });\n      return query(component, invalidConfig).map(function (valid) {\n        if (component.getSystem().isConnected()) {\n          return valid.fold(function (err) {\n            markInvalid(component, invalidConfig, invalidState, err);\n            return Result.error(err);\n          }, function (v) {\n            markValid(component, invalidConfig);\n            return Result.value(v);\n          });\n        } else {\n          return Result.error('No longer in system');\n        }\n      });\n    };\n    var isInvalid = function (component, invalidConfig) {\n      var elem = invalidConfig.getRoot(component).getOr(component.element());\n      return has$2(elem, invalidConfig.invalidClass);\n    };\n\n    var InvalidateApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        markValid: markValid,\n        markInvalid: markInvalid,\n        query: query,\n        run: run$1,\n        isInvalid: isInvalid\n    });\n\n    var events$a = function (invalidConfig, invalidState) {\n      return invalidConfig.validator.map(function (validatorInfo) {\n        return derive([run(validatorInfo.onEvent, function (component) {\n            run$1(component, invalidConfig, invalidState).get(identity);\n          })].concat(validatorInfo.validateOnLoad ? [runOnAttached(function (component) {\n            run$1(component, invalidConfig, invalidState).get(noop);\n          })] : []));\n      }).getOr({});\n    };\n\n    var ActiveInvalidate = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$a\n    });\n\n    var InvalidateSchema = [\n      strict$1('invalidClass'),\n      defaulted$1('getRoot', Option.none),\n      optionObjOf('notify', [\n        defaulted$1('aria', 'alert'),\n        defaulted$1('getContainer', Option.none),\n        defaulted$1('validHtml', ''),\n        onHandler('onValid'),\n        onHandler('onInvalid'),\n        onHandler('onValidate')\n      ]),\n      optionObjOf('validator', [\n        strict$1('validate'),\n        defaulted$1('onEvent', 'input'),\n        defaulted$1('validateOnLoad', true)\n      ])\n    ];\n\n    var Invalidating = create$1({\n      fields: InvalidateSchema,\n      name: 'invalidating',\n      active: ActiveInvalidate,\n      apis: InvalidateApis,\n      extra: {\n        validation: function (validator) {\n          return function (component) {\n            var v = Representing.getValue(component);\n            return Future.pure(validator(v));\n          };\n        }\n      }\n    });\n\n    var exhibit$4 = function (base, tabConfig) {\n      return nu$6({\n        attributes: wrapAll$1([{\n            key: tabConfig.tabAttr,\n            value: 'true'\n          }])\n      });\n    };\n\n    var ActiveTabstopping = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$4\n    });\n\n    var TabstopSchema = [defaulted$1('tabAttr', 'data-alloy-tabstop')];\n\n    var Tabstopping = create$1({\n      fields: TabstopSchema,\n      name: 'tabstopping',\n      active: ActiveTabstopping\n    });\n\n    var renderFormFieldWith = function (pLabel, pField, extraClasses, extraBehaviours) {\n      var spec = renderFormFieldSpecWith(pLabel, pField, extraClasses, extraBehaviours);\n      return FormField.sketch(spec);\n    };\n    var renderFormField = function (pLabel, pField) {\n      return renderFormFieldWith(pLabel, pField, [], []);\n    };\n    var renderFormFieldSpecWith = function (pLabel, pField, extraClasses, extraBehaviours) {\n      return {\n        dom: renderFormFieldDomWith(extraClasses),\n        components: pLabel.toArray().concat([pField]),\n        fieldBehaviours: derive$1(extraBehaviours)\n      };\n    };\n    var renderFormFieldDom = function () {\n      return renderFormFieldDomWith([]);\n    };\n    var renderFormFieldDomWith = function (extraClasses) {\n      return {\n        tag: 'div',\n        classes: ['tox-form__group'].concat(extraClasses)\n      };\n    };\n    var renderLabel = function (label, providersBackstage) {\n      return FormField.parts().label({\n        dom: {\n          tag: 'label',\n          classes: ['tox-label'],\n          innerHtml: providersBackstage.translate(label)\n        }\n      });\n    };\n\n    var getCoupled = function (component, coupleConfig, coupleState, name) {\n      return coupleState.getOrCreate(component, coupleConfig, name);\n    };\n\n    var CouplingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getCoupled: getCoupled\n    });\n\n    var CouplingSchema = [strictOf('others', setOf$1(Result.value, anyValue$1()))];\n\n    var init$5 = function () {\n      var coupled = {};\n      var getOrCreate = function (component, coupleConfig, name) {\n        var available = keys(coupleConfig.others);\n        if (!available) {\n          throw new Error('Cannot find coupled component: ' + name + '. Known coupled components: ' + JSON.stringify(available, null, 2));\n        } else {\n          return get(coupled, name).getOrThunk(function () {\n            var builder = get(coupleConfig.others, name).getOrDie('No information found for coupled component: ' + name);\n            var spec = builder(component);\n            var built = component.getSystem().build(spec);\n            coupled[name] = built;\n            return built;\n          });\n        }\n      };\n      var readState = constant({});\n      return nu$5({\n        readState: readState,\n        getOrCreate: getOrCreate\n      });\n    };\n\n    var CouplingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$5\n    });\n\n    var Coupling = create$1({\n      fields: CouplingSchema,\n      name: 'coupling',\n      apis: CouplingApis,\n      state: CouplingState\n    });\n\n    var suffix = constant('sink');\n    var partType = constant(optional({\n      name: suffix(),\n      overrides: constant({\n        dom: { tag: 'div' },\n        behaviours: derive$1([Positioning.config({ useFixed: always })]),\n        events: derive([\n          cutter(keydown()),\n          cutter(mousedown()),\n          cutter(click())\n        ])\n      })\n    }));\n\n    var HighlightOnOpen;\n    (function (HighlightOnOpen) {\n      HighlightOnOpen[HighlightOnOpen['HighlightFirst'] = 0] = 'HighlightFirst';\n      HighlightOnOpen[HighlightOnOpen['HighlightNone'] = 1] = 'HighlightNone';\n    }(HighlightOnOpen || (HighlightOnOpen = {})));\n    var getAnchor = function (detail, component) {\n      var hotspot = detail.getHotspot(component).getOr(component);\n      var anchor = 'hotspot';\n      var overrides = detail.getAnchorOverrides();\n      return detail.layouts.fold(function () {\n        return {\n          anchor: anchor,\n          hotspot: hotspot,\n          overrides: overrides\n        };\n      }, function (layouts) {\n        return {\n          anchor: anchor,\n          hotspot: hotspot,\n          overrides: overrides,\n          layouts: layouts\n        };\n      });\n    };\n    var fetch = function (detail, mapFetch, component) {\n      var fetcher = detail.fetch;\n      return fetcher(component).map(mapFetch);\n    };\n    var openF = function (detail, mapFetch, anchor, component, sandbox, externals, highlightOnOpen) {\n      var futureData = fetch(detail, mapFetch, component);\n      var getLazySink = getSink(component, detail);\n      return futureData.map(function (tdata) {\n        return tdata.bind(function (data) {\n          return Option.from(tieredMenu.sketch(__assign(__assign({}, externals.menu()), {\n            uid: generate$2(''),\n            data: data,\n            highlightImmediately: highlightOnOpen === HighlightOnOpen.HighlightFirst,\n            onOpenMenu: function (tmenu, menu) {\n              var sink = getLazySink().getOrDie();\n              Positioning.position(sink, anchor, menu);\n              Sandboxing.decloak(sandbox);\n            },\n            onOpenSubmenu: function (tmenu, item, submenu) {\n              var sink = getLazySink().getOrDie();\n              Positioning.position(sink, {\n                anchor: 'submenu',\n                item: item\n              }, submenu);\n              Sandboxing.decloak(sandbox);\n            },\n            onRepositionMenu: function (tmenu, primaryMenu, submenuTriggers) {\n              var sink = getLazySink().getOrDie();\n              Positioning.position(sink, anchor, primaryMenu);\n              each(submenuTriggers, function (st) {\n                Positioning.position(sink, {\n                  anchor: 'submenu',\n                  item: st.triggeringItem\n                }, st.triggeredMenu);\n              });\n            },\n            onEscape: function () {\n              Focusing.focus(component);\n              Sandboxing.close(sandbox);\n              return Option.some(true);\n            }\n          })));\n        });\n      });\n    };\n    var open$1 = function (detail, mapFetch, hotspot, sandbox, externals, onOpenSync, highlightOnOpen) {\n      var anchor = getAnchor(detail, hotspot);\n      var processed = openF(detail, mapFetch, anchor, hotspot, sandbox, externals, highlightOnOpen);\n      return processed.map(function (tdata) {\n        tdata.fold(function () {\n          if (Sandboxing.isOpen(sandbox)) {\n            Sandboxing.close(sandbox);\n          }\n        }, function (data) {\n          Sandboxing.cloak(sandbox);\n          Sandboxing.open(sandbox, data);\n          onOpenSync(sandbox);\n        });\n        return sandbox;\n      });\n    };\n    var close$1 = function (detail, mapFetch, component, sandbox, _externals, _onOpenSync, _highlightOnOpen) {\n      Sandboxing.close(sandbox);\n      return Future.pure(sandbox);\n    };\n    var togglePopup = function (detail, mapFetch, hotspot, externals, onOpenSync, highlightOnOpen) {\n      var sandbox = Coupling.getCoupled(hotspot, 'sandbox');\n      var showing = Sandboxing.isOpen(sandbox);\n      var action = showing ? close$1 : open$1;\n      return action(detail, mapFetch, hotspot, sandbox, externals, onOpenSync, highlightOnOpen);\n    };\n    var matchWidth = function (hotspot, container, useMinWidth) {\n      var menu = Composing.getCurrent(container).getOr(container);\n      var buttonWidth = get$7(hotspot.element());\n      if (useMinWidth) {\n        set$2(menu.element(), 'min-width', buttonWidth + 'px');\n      } else {\n        set$4(menu.element(), buttonWidth);\n      }\n    };\n    var getSink = function (anyInSystem, sinkDetail) {\n      return anyInSystem.getSystem().getByUid(sinkDetail.uid + '-' + suffix()).map(function (internalSink) {\n        return function () {\n          return Result.value(internalSink);\n        };\n      }).getOrThunk(function () {\n        return sinkDetail.lazySink.fold(function () {\n          return function () {\n            return Result.error(new Error('No internal sink is specified, nor could an external sink be found'));\n          };\n        }, function (lazySinkFn) {\n          return function () {\n            return lazySinkFn(anyInSystem);\n          };\n        });\n      });\n    };\n    var doRepositionMenus = function (sandbox) {\n      Sandboxing.getState(sandbox).each(function (tmenu) {\n        tieredMenu.repositionMenus(tmenu);\n      });\n    };\n    var makeSandbox = function (detail, hotspot, extras) {\n      var ariaOwner = manager();\n      var onOpen = function (component, menu) {\n        var anchor = getAnchor(detail, hotspot);\n        ariaOwner.link(hotspot.element());\n        if (detail.matchWidth) {\n          matchWidth(anchor.hotspot, menu, detail.useMinWidth);\n        }\n        detail.onOpen(anchor, component, menu);\n        if (extras !== undefined && extras.onOpen !== undefined) {\n          extras.onOpen(component, menu);\n        }\n      };\n      var onClose = function (component, menu) {\n        ariaOwner.unlink(hotspot.element());\n        if (extras !== undefined && extras.onClose !== undefined) {\n          extras.onClose(component, menu);\n        }\n      };\n      var lazySink = getSink(hotspot, detail);\n      return {\n        dom: {\n          tag: 'div',\n          classes: detail.sandboxClasses,\n          attributes: {\n            id: ariaOwner.id(),\n            role: 'listbox'\n          }\n        },\n        behaviours: SketchBehaviours.augment(detail.sandboxBehaviours, [\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: hotspot\n            }\n          }),\n          Sandboxing.config({\n            onOpen: onOpen,\n            onClose: onClose,\n            isPartOf: function (container, data, queryElem) {\n              return isPartOf(data, queryElem) || isPartOf(hotspot, queryElem);\n            },\n            getAttachPoint: function () {\n              return lazySink().getOrDie();\n            }\n          }),\n          Composing.config({\n            find: function (sandbox) {\n              return Sandboxing.getState(sandbox).bind(function (menu) {\n                return Composing.getCurrent(menu);\n              });\n            }\n          }),\n          Receiving.config({ channels: __assign(__assign({}, receivingChannel({ isExtraPart: never })), receivingChannel$1({ doReposition: doRepositionMenus })) })\n        ])\n      };\n    };\n    var repositionMenus = function (comp) {\n      var sandbox = Coupling.getCoupled(comp, 'sandbox');\n      doRepositionMenus(sandbox);\n    };\n\n    var sandboxFields = function () {\n      return [\n        defaulted$1('sandboxClasses', []),\n        SketchBehaviours.field('sandboxBehaviours', [\n          Composing,\n          Receiving,\n          Sandboxing,\n          Representing\n        ])\n      ];\n    };\n\n    var schema$g = constant([\n      strict$1('dom'),\n      strict$1('fetch'),\n      onHandler('onOpen'),\n      onKeyboardHandler('onExecute'),\n      defaulted$1('getHotspot', Option.some),\n      defaulted$1('getAnchorOverrides', constant({})),\n      schema$1(),\n      field$1('dropdownBehaviours', [\n        Toggling,\n        Coupling,\n        Keying,\n        Focusing\n      ]),\n      strict$1('toggleClass'),\n      defaulted$1('eventOrder', {}),\n      option('lazySink'),\n      defaulted$1('matchWidth', false),\n      defaulted$1('useMinWidth', false),\n      option('role')\n    ].concat(sandboxFields()));\n    var parts$4 = constant([\n      external$1({\n        schema: [tieredMenuMarkers()],\n        name: 'menu',\n        defaults: function (detail) {\n          return { onExecute: detail.onExecute };\n        }\n      }),\n      partType()\n    ]);\n\n    var factory$6 = function (detail, components, _spec, externals) {\n      var _a;\n      var lookupAttr = function (attr) {\n        return get(detail.dom, 'attributes').bind(function (attrs) {\n          return get(attrs, attr);\n        });\n      };\n      var switchToMenu = function (sandbox) {\n        Sandboxing.getState(sandbox).each(function (tmenu) {\n          tieredMenu.highlightPrimary(tmenu);\n        });\n      };\n      var action = function (component) {\n        var onOpenSync = switchToMenu;\n        togglePopup(detail, function (x) {\n          return x;\n        }, component, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);\n      };\n      var apis = {\n        expand: function (comp) {\n          if (!Toggling.isOn(comp)) {\n            togglePopup(detail, function (x) {\n              return x;\n            }, comp, externals, noop, HighlightOnOpen.HighlightNone).get(noop);\n          }\n        },\n        open: function (comp) {\n          if (!Toggling.isOn(comp)) {\n            togglePopup(detail, function (x) {\n              return x;\n            }, comp, externals, noop, HighlightOnOpen.HighlightFirst).get(noop);\n          }\n        },\n        isOpen: Toggling.isOn,\n        close: function (comp) {\n          if (Toggling.isOn(comp)) {\n            togglePopup(detail, function (x) {\n              return x;\n            }, comp, externals, noop, HighlightOnOpen.HighlightFirst).get(noop);\n          }\n        },\n        repositionMenus: function (comp) {\n          if (Toggling.isOn(comp)) {\n            repositionMenus(comp);\n          }\n        }\n      };\n      var triggerExecute = function (comp, se) {\n        emitExecute(comp);\n        return Option.some(true);\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: augment(detail.dropdownBehaviours, [\n          Toggling.config({\n            toggleClass: detail.toggleClass,\n            aria: { mode: 'expanded' }\n          }),\n          Coupling.config({\n            others: {\n              sandbox: function (hotspot) {\n                return makeSandbox(detail, hotspot, {\n                  onOpen: function () {\n                    Toggling.on(hotspot);\n                  },\n                  onClose: function () {\n                    Toggling.off(hotspot);\n                  }\n                });\n              }\n            }\n          }),\n          Keying.config({\n            mode: 'special',\n            onSpace: triggerExecute,\n            onEnter: triggerExecute,\n            onDown: function (comp, se) {\n              if (Dropdown.isOpen(comp)) {\n                var sandbox = Coupling.getCoupled(comp, 'sandbox');\n                switchToMenu(sandbox);\n              } else {\n                Dropdown.open(comp);\n              }\n              return Option.some(true);\n            },\n            onEscape: function (comp, se) {\n              if (Dropdown.isOpen(comp)) {\n                Dropdown.close(comp);\n                return Option.some(true);\n              } else {\n                return Option.none();\n              }\n            }\n          }),\n          Focusing.config({})\n        ]),\n        events: events$7(Option.some(action)),\n        eventOrder: __assign(__assign({}, detail.eventOrder), (_a = {}, _a[execute()] = [\n          'disabling',\n          'toggling',\n          'alloy.base.behaviour'\n        ], _a)),\n        apis: apis,\n        domModification: {\n          attributes: __assign(__assign({ 'aria-haspopup': 'true' }, detail.role.fold(function () {\n            return {};\n          }, function (role) {\n            return { role: role };\n          })), detail.dom.tag === 'button' ? { type: lookupAttr('type').getOr('button') } : {})\n        }\n      };\n    };\n    var Dropdown = composite$1({\n      name: 'Dropdown',\n      configFields: schema$g(),\n      partFields: parts$4(),\n      factory: factory$6,\n      apis: {\n        open: function (apis, comp) {\n          return apis.open(comp);\n        },\n        expand: function (apis, comp) {\n          return apis.expand(comp);\n        },\n        close: function (apis, comp) {\n          return apis.close(comp);\n        },\n        isOpen: function (apis, comp) {\n          return apis.isOpen(comp);\n        },\n        repositionMenus: function (apis, comp) {\n          return apis.repositionMenus(comp);\n        }\n      }\n    });\n\n    var exhibit$5 = function () {\n      return nu$6({\n        styles: {\n          '-webkit-user-select': 'none',\n          'user-select': 'none',\n          '-ms-user-select': 'none',\n          '-moz-user-select': '-moz-none'\n        },\n        attributes: { unselectable: 'on' }\n      });\n    };\n    var events$b = function () {\n      return derive([abort(selectstart(), constant(true))]);\n    };\n\n    var ActiveUnselecting = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$b,\n        exhibit: exhibit$5\n    });\n\n    var Unselecting = create$1({\n      fields: [],\n      name: 'unselecting',\n      active: ActiveUnselecting\n    });\n\n    var renderPanelButton = function (spec, sharedBackstage) {\n      return Dropdown.sketch({\n        dom: spec.dom,\n        components: spec.components,\n        toggleClass: 'mce-active',\n        dropdownBehaviours: derive$1([\n          Unselecting.config({}),\n          Tabstopping.config({})\n        ]),\n        layouts: spec.layouts,\n        sandboxClasses: ['tox-dialog__popups'],\n        lazySink: sharedBackstage.getSink,\n        fetch: function (comp) {\n          return Future.nu(function (callback) {\n            return spec.fetch(callback);\n          }).map(function (items) {\n            return Option.from(createTieredDataFrom(deepMerge(createPartialChoiceMenu(generate$1('menu-value'), items, function (value) {\n              spec.onItemAction(comp, value);\n            }, spec.columns, spec.presets, ItemResponse$1.CLOSE_ON_EXECUTE, function () {\n              return false;\n            }, sharedBackstage.providers), { movement: deriveMenuMovement(spec.columns, spec.presets) })));\n          });\n        },\n        parts: { menu: part(false, 1, spec.presets) }\n      });\n    };\n\n    var colorInputChangeEvent = generate$1('color-input-change');\n    var colorSwatchChangeEvent = generate$1('color-swatch-change');\n    var colorPickerCancelEvent = generate$1('color-picker-cancel');\n    var renderColorInput = function (spec, sharedBackstage, colorInputBackstage) {\n      var pField = FormField.parts().field({\n        factory: Input,\n        inputClasses: ['tox-textfield'],\n        onSetValue: function (c) {\n          return Invalidating.run(c).get(function () {\n          });\n        },\n        inputBehaviours: derive$1([\n          Tabstopping.config({}),\n          Invalidating.config({\n            invalidClass: 'tox-textbox-field-invalid',\n            getRoot: function (comp) {\n              return parent(comp.element());\n            },\n            notify: {\n              onValid: function (comp) {\n                var val = Representing.getValue(comp);\n                emitWith(comp, colorInputChangeEvent, { color: val });\n              }\n            },\n            validator: {\n              validateOnLoad: false,\n              validate: function (input) {\n                var inputValue = Representing.getValue(input);\n                if (inputValue.length === 0) {\n                  return Future.pure(Result.value(true));\n                } else {\n                  var span = Element.fromTag('span');\n                  set$2(span, 'background-color', inputValue);\n                  var res = getRaw(span, 'background-color').fold(function () {\n                    return Result.error('blah');\n                  }, function (_) {\n                    return Result.value(inputValue);\n                  });\n                  return Future.pure(res);\n                }\n              }\n            }\n          })\n        ]),\n        selectOnFocus: false\n      });\n      var pLabel = spec.label.map(function (label) {\n        return renderLabel(label, sharedBackstage.providers);\n      });\n      var emitSwatchChange = function (colorBit, value) {\n        emitWith(colorBit, colorSwatchChangeEvent, { value: value });\n      };\n      var onItemAction = function (comp, value) {\n        memColorButton.getOpt(comp).each(function (colorBit) {\n          if (value === 'custom') {\n            colorInputBackstage.colorPicker(function (valueOpt) {\n              valueOpt.fold(function () {\n                return emit(colorBit, colorPickerCancelEvent);\n              }, function (value) {\n                emitSwatchChange(colorBit, value);\n                Settings.addColor(value);\n              });\n            }, '#ffffff');\n          } else if (value === 'remove') {\n            emitSwatchChange(colorBit, '');\n          } else {\n            emitSwatchChange(colorBit, value);\n          }\n        });\n      };\n      var memColorButton = record(renderPanelButton({\n        dom: {\n          tag: 'span',\n          attributes: { 'aria-label': sharedBackstage.providers.translate('Color swatch') }\n        },\n        layouts: {\n          onRtl: function () {\n            return [\n              southwest$1,\n              southeast$1,\n              south$1\n            ];\n          },\n          onLtr: function () {\n            return [\n              southeast$1,\n              southwest$1,\n              south$1\n            ];\n          }\n        },\n        components: [],\n        fetch: ColorSwatch.getFetch(colorInputBackstage.getColors(), colorInputBackstage.hasCustomColors()),\n        columns: colorInputBackstage.getColorCols(),\n        presets: 'color',\n        onItemAction: onItemAction\n      }, sharedBackstage));\n      return FormField.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components: pLabel.toArray().concat([{\n            dom: {\n              tag: 'div',\n              classes: ['tox-color-input']\n            },\n            components: [\n              pField,\n              memColorButton.asSpec()\n            ]\n          }]),\n        fieldBehaviours: derive$1([config('form-field-events', [\n            run(colorInputChangeEvent, function (comp, se) {\n              memColorButton.getOpt(comp).each(function (colorButton) {\n                set$2(colorButton.element(), 'background-color', se.event().color());\n              });\n              emitWith(comp, formChangeEvent, { name: spec.name });\n            }),\n            run(colorSwatchChangeEvent, function (comp, se) {\n              FormField.getField(comp).each(function (field) {\n                Representing.setValue(field, se.event().value());\n                Composing.getCurrent(comp).each(Focusing.focus);\n              });\n            }),\n            run(colorPickerCancelEvent, function (comp, se) {\n              FormField.getField(comp).each(function (field) {\n                Composing.getCurrent(comp).each(Focusing.focus);\n              });\n            })\n          ])])\n      });\n    };\n\n    var hsvColour = function (hue, saturation, value) {\n      return {\n        hue: constant(hue),\n        saturation: constant(saturation),\n        value: constant(value)\n      };\n    };\n    var fromRgb = function (rgbaColour) {\n      var h = 0;\n      var s = 0;\n      var v = 0;\n      var r = rgbaColour.red() / 255;\n      var g = rgbaColour.green() / 255;\n      var b = rgbaColour.blue() / 255;\n      var minRGB = Math.min(r, Math.min(g, b));\n      var maxRGB = Math.max(r, Math.max(g, b));\n      if (minRGB === maxRGB) {\n        v = minRGB;\n        return hsvColour(0, 0, v * 100);\n      }\n      var d = r === minRGB ? g - b : b === minRGB ? r - g : b - r;\n      h = r === minRGB ? 3 : b === minRGB ? 1 : 5;\n      h = 60 * (h - d / (maxRGB - minRGB));\n      s = (maxRGB - minRGB) / maxRGB;\n      v = maxRGB;\n      return hsvColour(Math.round(h), Math.round(s * 100), Math.round(v * 100));\n    };\n\n    var calcHex = function (value) {\n      var hue = (100 - value) / 100 * 360;\n      var hsv = hsvColour(hue, 100, 100);\n      var rgb = fromHsv(hsv);\n      return fromRgba(rgb);\n    };\n\n    var fieldsUpdate = constant(generate$1('rgb-hex-update'));\n    var sliderUpdate = constant(generate$1('slider-update'));\n    var paletteUpdate = constant(generate$1('palette-update'));\n\n    var labelPart = optional({\n      schema: [strict$1('dom')],\n      name: 'label'\n    });\n    var edgePart = function (name) {\n      return optional({\n        name: '' + name + '-edge',\n        overrides: function (detail) {\n          var action = detail.model.manager.edgeActions[name];\n          return action.fold(function () {\n            return {};\n          }, function (a) {\n            return {\n              events: derive([\n                runActionExtra(touchstart(), function (comp, se, d) {\n                  return a(comp, d);\n                }, [detail]),\n                runActionExtra(mousedown(), function (comp, se, d) {\n                  return a(comp, d);\n                }, [detail]),\n                runActionExtra(mousemove(), function (comp, se, det) {\n                  if (det.mouseIsDown.get()) {\n                    a(comp, det);\n                  }\n                }, [detail])\n              ])\n            };\n          });\n        }\n      });\n    };\n    var tlEdgePart = edgePart('top-left');\n    var tedgePart = edgePart('top');\n    var trEdgePart = edgePart('top-right');\n    var redgePart = edgePart('right');\n    var brEdgePart = edgePart('bottom-right');\n    var bedgePart = edgePart('bottom');\n    var blEdgePart = edgePart('bottom-left');\n    var ledgePart = edgePart('left');\n    var thumbPart = required({\n      name: 'thumb',\n      defaults: constant({ dom: { styles: { position: 'absolute' } } }),\n      overrides: function (detail) {\n        return {\n          events: derive([\n            redirectToPart(touchstart(), detail, 'spectrum'),\n            redirectToPart(touchmove(), detail, 'spectrum'),\n            redirectToPart(touchend(), detail, 'spectrum'),\n            redirectToPart(mousedown(), detail, 'spectrum'),\n            redirectToPart(mousemove(), detail, 'spectrum'),\n            redirectToPart(mouseup(), detail, 'spectrum')\n          ])\n        };\n      }\n    });\n    var spectrumPart = required({\n      schema: [state$1('mouseIsDown', function () {\n          return Cell(false);\n        })],\n      name: 'spectrum',\n      overrides: function (detail) {\n        var modelDetail = detail.model;\n        var model = modelDetail.manager;\n        var setValueFrom = function (component, simulatedEvent) {\n          return model.getValueFromEvent(simulatedEvent).map(function (value) {\n            return model.setValueFrom(component, detail, value);\n          });\n        };\n        return {\n          behaviours: derive$1([\n            Keying.config({\n              mode: 'special',\n              onLeft: function (spectrum) {\n                return model.onLeft(spectrum, detail);\n              },\n              onRight: function (spectrum) {\n                return model.onRight(spectrum, detail);\n              },\n              onUp: function (spectrum) {\n                return model.onUp(spectrum, detail);\n              },\n              onDown: function (spectrum) {\n                return model.onDown(spectrum, detail);\n              }\n            }),\n            Focusing.config({})\n          ]),\n          events: derive([\n            run(touchstart(), setValueFrom),\n            run(touchmove(), setValueFrom),\n            run(mousedown(), setValueFrom),\n            run(mousemove(), function (spectrum, se) {\n              if (detail.mouseIsDown.get()) {\n                setValueFrom(spectrum, se);\n              }\n            })\n          ])\n        };\n      }\n    });\n    var SliderParts = [\n      labelPart,\n      ledgePart,\n      redgePart,\n      tedgePart,\n      bedgePart,\n      tlEdgePart,\n      trEdgePart,\n      blEdgePart,\n      brEdgePart,\n      thumbPart,\n      spectrumPart\n    ];\n\n    var _sliderChangeEvent = 'slider.change.value';\n    var sliderChangeEvent = constant(_sliderChangeEvent);\n    var isTouchEvent = function (evt) {\n      return evt.type.indexOf('touch') !== -1;\n    };\n    var getEventSource = function (simulatedEvent) {\n      var evt = simulatedEvent.event().raw();\n      if (isTouchEvent(evt)) {\n        var touchEvent = evt;\n        return touchEvent.touches !== undefined && touchEvent.touches.length === 1 ? Option.some(touchEvent.touches[0]).map(function (t) {\n          return Position(t.clientX, t.clientY);\n        }) : Option.none();\n      } else {\n        var mouseEvent = evt;\n        return mouseEvent.clientX !== undefined ? Option.some(mouseEvent).map(function (me) {\n          return Position(me.clientX, me.clientY);\n        }) : Option.none();\n      }\n    };\n\n    var t = 'top', r$1 = 'right', b = 'bottom', l = 'left';\n    var minX = function (detail) {\n      return detail.model.minX;\n    };\n    var minY = function (detail) {\n      return detail.model.minY;\n    };\n    var min1X = function (detail) {\n      return detail.model.minX - 1;\n    };\n    var min1Y = function (detail) {\n      return detail.model.minY - 1;\n    };\n    var maxX = function (detail) {\n      return detail.model.maxX;\n    };\n    var maxY = function (detail) {\n      return detail.model.maxY;\n    };\n    var max1X = function (detail) {\n      return detail.model.maxX + 1;\n    };\n    var max1Y = function (detail) {\n      return detail.model.maxY + 1;\n    };\n    var range$2 = function (detail, max, min) {\n      return max(detail) - min(detail);\n    };\n    var xRange = function (detail) {\n      return range$2(detail, maxX, minX);\n    };\n    var yRange = function (detail) {\n      return range$2(detail, maxY, minY);\n    };\n    var halfX = function (detail) {\n      return xRange(detail) / 2;\n    };\n    var halfY = function (detail) {\n      return yRange(detail) / 2;\n    };\n    var step = function (detail) {\n      return detail.stepSize;\n    };\n    var snap = function (detail) {\n      return detail.snapToGrid;\n    };\n    var snapStart = function (detail) {\n      return detail.snapStart;\n    };\n    var rounded = function (detail) {\n      return detail.rounded;\n    };\n    var hasEdge = function (detail, edgeName) {\n      return detail[edgeName + '-edge'] !== undefined;\n    };\n    var hasLEdge = function (detail) {\n      return hasEdge(detail, l);\n    };\n    var hasREdge = function (detail) {\n      return hasEdge(detail, r$1);\n    };\n    var hasTEdge = function (detail) {\n      return hasEdge(detail, t);\n    };\n    var hasBEdge = function (detail) {\n      return hasEdge(detail, b);\n    };\n    var currentValue = function (detail) {\n      return detail.model.value.get();\n    };\n\n    var xValue = function (x) {\n      return { x: constant(x) };\n    };\n    var yValue = function (y) {\n      return { y: constant(y) };\n    };\n    var xyValue = function (x, y) {\n      return {\n        x: constant(x),\n        y: constant(y)\n      };\n    };\n    var fireSliderChange = function (component, value) {\n      emitWith(component, sliderChangeEvent(), { value: value });\n    };\n    var setToTLEdgeXY = function (edge, detail) {\n      fireSliderChange(edge, xyValue(min1X(detail), min1Y(detail)));\n    };\n    var setToTEdge = function (edge, detail) {\n      fireSliderChange(edge, yValue(min1Y(detail)));\n    };\n    var setToTEdgeXY = function (edge, detail) {\n      fireSliderChange(edge, xyValue(halfX(detail), min1Y(detail)));\n    };\n    var setToTREdgeXY = function (edge, detail) {\n      fireSliderChange(edge, xyValue(max1X(detail), min1Y(detail)));\n    };\n    var setToREdge = function (edge, detail) {\n      fireSliderChange(edge, xValue(max1X(detail)));\n    };\n    var setToREdgeXY = function (edge, detail) {\n      fireSliderChange(edge, xyValue(max1X(detail), halfY(detail)));\n    };\n    var setToBREdgeXY = function (edge, detail) {\n      fireSliderChange(edge, xyValue(max1X(detail), max1Y(detail)));\n    };\n    var setToBEdge = function (edge, detail) {\n      fireSliderChange(edge, yValue(max1Y(detail)));\n    };\n    var setToBEdgeXY = function (edge, detail) {\n      fireSliderChange(edge, xyValue(halfX(detail), max1Y(detail)));\n    };\n    var setToBLEdgeXY = function (edge, detail) {\n      fireSliderChange(edge, xyValue(min1X(detail), max1Y(detail)));\n    };\n    var setToLEdge = function (edge, detail) {\n      fireSliderChange(edge, xValue(min1X(detail)));\n    };\n    var setToLEdgeXY = function (edge, detail) {\n      fireSliderChange(edge, xyValue(min1X(detail), halfY(detail)));\n    };\n\n    var reduceBy = function (value, min, max, step) {\n      if (value < min) {\n        return value;\n      } else if (value > max) {\n        return max;\n      } else if (value === min) {\n        return min - 1;\n      } else {\n        return Math.max(min, value - step);\n      }\n    };\n    var increaseBy = function (value, min, max, step) {\n      if (value > max) {\n        return value;\n      } else if (value < min) {\n        return min;\n      } else if (value === max) {\n        return max + 1;\n      } else {\n        return Math.min(max, value + step);\n      }\n    };\n    var capValue = function (value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    };\n    var snapValueOf = function (value, min, max, step, snapStart) {\n      return snapStart.fold(function () {\n        var initValue = value - min;\n        var extraValue = Math.round(initValue / step) * step;\n        return capValue(min + extraValue, min - 1, max + 1);\n      }, function (start) {\n        var remainder = (value - start) % step;\n        var adjustment = Math.round(remainder / step);\n        var rawSteps = Math.floor((value - start) / step);\n        var maxSteps = Math.floor((max - start) / step);\n        var numSteps = Math.min(maxSteps, rawSteps + adjustment);\n        var r = start + numSteps * step;\n        return Math.max(start, r);\n      });\n    };\n    var findOffsetOf = function (value, min, max) {\n      return Math.min(max, Math.max(value, min)) - min;\n    };\n    var findValueOf = function (args) {\n      var min = args.min, max = args.max, range = args.range, value = args.value, step = args.step, snap = args.snap, snapStart = args.snapStart, rounded = args.rounded, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, minBound = args.minBound, maxBound = args.maxBound, screenRange = args.screenRange;\n      var capMin = hasMinEdge ? min - 1 : min;\n      var capMax = hasMaxEdge ? max + 1 : max;\n      if (value < minBound) {\n        return capMin;\n      } else if (value > maxBound) {\n        return capMax;\n      } else {\n        var offset = findOffsetOf(value, minBound, maxBound);\n        var newValue = capValue(offset / screenRange * range + min, capMin, capMax);\n        if (snap && newValue >= min && newValue <= max) {\n          return snapValueOf(newValue, min, max, step, snapStart);\n        } else if (rounded) {\n          return Math.round(newValue);\n        } else {\n          return newValue;\n        }\n      }\n    };\n    var findOffsetOfValue = function (args) {\n      var min = args.min, max = args.max, range = args.range, value = args.value, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, maxBound = args.maxBound, maxOffset = args.maxOffset, centerMinEdge = args.centerMinEdge, centerMaxEdge = args.centerMaxEdge;\n      if (value < min) {\n        return hasMinEdge ? 0 : centerMinEdge;\n      } else if (value > max) {\n        return hasMaxEdge ? maxBound : centerMaxEdge;\n      } else {\n        return (value - min) / range * maxOffset;\n      }\n    };\n\n    var top = 'top', right = 'right', bottom = 'bottom', left = 'left', width = 'width', height = 'height';\n    var getBounds$1 = function (component) {\n      return component.element().dom().getBoundingClientRect();\n    };\n    var getBoundsProperty = function (bounds, property) {\n      return bounds[property];\n    };\n    var getMinXBounds = function (component) {\n      var bounds = getBounds$1(component);\n      return getBoundsProperty(bounds, left);\n    };\n    var getMaxXBounds = function (component) {\n      var bounds = getBounds$1(component);\n      return getBoundsProperty(bounds, right);\n    };\n    var getMinYBounds = function (component) {\n      var bounds = getBounds$1(component);\n      return getBoundsProperty(bounds, top);\n    };\n    var getMaxYBounds = function (component) {\n      var bounds = getBounds$1(component);\n      return getBoundsProperty(bounds, bottom);\n    };\n    var getXScreenRange = function (component) {\n      var bounds = getBounds$1(component);\n      return getBoundsProperty(bounds, width);\n    };\n    var getYScreenRange = function (component) {\n      var bounds = getBounds$1(component);\n      return getBoundsProperty(bounds, height);\n    };\n    var getCenterOffsetOf = function (componentMinEdge, componentMaxEdge, spectrumMinEdge) {\n      return (componentMinEdge + componentMaxEdge) / 2 - spectrumMinEdge;\n    };\n    var getXCenterOffSetOf = function (component, spectrum) {\n      var componentBounds = getBounds$1(component);\n      var spectrumBounds = getBounds$1(spectrum);\n      var componentMinEdge = getBoundsProperty(componentBounds, left);\n      var componentMaxEdge = getBoundsProperty(componentBounds, right);\n      var spectrumMinEdge = getBoundsProperty(spectrumBounds, left);\n      return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);\n    };\n    var getYCenterOffSetOf = function (component, spectrum) {\n      var componentBounds = getBounds$1(component);\n      var spectrumBounds = getBounds$1(spectrum);\n      var componentMinEdge = getBoundsProperty(componentBounds, top);\n      var componentMaxEdge = getBoundsProperty(componentBounds, bottom);\n      var spectrumMinEdge = getBoundsProperty(spectrumBounds, top);\n      return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);\n    };\n\n    var fireSliderChange$1 = function (spectrum, value) {\n      emitWith(spectrum, sliderChangeEvent(), { value: value });\n    };\n    var sliderValue = function (x) {\n      return { x: constant(x) };\n    };\n    var findValueOfOffset = function (spectrum, detail, left) {\n      var args = {\n        min: minX(detail),\n        max: maxX(detail),\n        range: xRange(detail),\n        value: left,\n        step: step(detail),\n        snap: snap(detail),\n        snapStart: snapStart(detail),\n        rounded: rounded(detail),\n        hasMinEdge: hasLEdge(detail),\n        hasMaxEdge: hasREdge(detail),\n        minBound: getMinXBounds(spectrum),\n        maxBound: getMaxXBounds(spectrum),\n        screenRange: getXScreenRange(spectrum)\n      };\n      return findValueOf(args);\n    };\n    var setValueFrom = function (spectrum, detail, value) {\n      var xValue = findValueOfOffset(spectrum, detail, value);\n      var sliderVal = sliderValue(xValue);\n      fireSliderChange$1(spectrum, sliderVal);\n      return xValue;\n    };\n    var setToMin = function (spectrum, detail) {\n      var min = minX(detail);\n      fireSliderChange$1(spectrum, sliderValue(min));\n    };\n    var setToMax = function (spectrum, detail) {\n      var max = maxX(detail);\n      fireSliderChange$1(spectrum, sliderValue(max));\n    };\n    var moveBy = function (direction, spectrum, detail) {\n      var f = direction > 0 ? increaseBy : reduceBy;\n      var xValue = f(currentValue(detail).x(), minX(detail), maxX(detail), step(detail));\n      fireSliderChange$1(spectrum, sliderValue(xValue));\n      return Option.some(xValue);\n    };\n    var handleMovement = function (direction) {\n      return function (spectrum, detail) {\n        return moveBy(direction, spectrum, detail).map(function () {\n          return true;\n        });\n      };\n    };\n    var getValueFromEvent = function (simulatedEvent) {\n      var pos = getEventSource(simulatedEvent);\n      return pos.map(function (p) {\n        return p.left();\n      });\n    };\n    var findOffsetOfValue$1 = function (spectrum, detail, value, minEdge, maxEdge) {\n      var minOffset = 0;\n      var maxOffset = getXScreenRange(spectrum);\n      var centerMinEdge = minEdge.bind(function (edge) {\n        return Option.some(getXCenterOffSetOf(edge, spectrum));\n      }).getOr(minOffset);\n      var centerMaxEdge = maxEdge.bind(function (edge) {\n        return Option.some(getXCenterOffSetOf(edge, spectrum));\n      }).getOr(maxOffset);\n      var args = {\n        min: minX(detail),\n        max: maxX(detail),\n        range: xRange(detail),\n        value: value,\n        hasMinEdge: hasLEdge(detail),\n        hasMaxEdge: hasREdge(detail),\n        minBound: getMinXBounds(spectrum),\n        minOffset: minOffset,\n        maxBound: getMaxXBounds(spectrum),\n        maxOffset: maxOffset,\n        centerMinEdge: centerMinEdge,\n        centerMaxEdge: centerMaxEdge\n      };\n      return findOffsetOfValue(args);\n    };\n    var findPositionOfValue = function (slider, spectrum, value, minEdge, maxEdge, detail) {\n      var offset = findOffsetOfValue$1(spectrum, detail, value, minEdge, maxEdge);\n      return getMinXBounds(spectrum) - getMinXBounds(slider) + offset;\n    };\n    var setPositionFromValue = function (slider, thumb, detail, edges) {\n      var value = currentValue(detail);\n      var pos = findPositionOfValue(slider, edges.getSpectrum(slider), value.x(), edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);\n      var thumbRadius = get$7(thumb.element()) / 2;\n      set$2(thumb.element(), 'left', pos - thumbRadius + 'px');\n    };\n    var onLeft = handleMovement(-1);\n    var onRight = handleMovement(1);\n    var onUp = Option.none;\n    var onDown = Option.none;\n    var edgeActions = {\n      'top-left': Option.none(),\n      'top': Option.none(),\n      'top-right': Option.none(),\n      'right': Option.some(setToREdge),\n      'bottom-right': Option.none(),\n      'bottom': Option.none(),\n      'bottom-left': Option.none(),\n      'left': Option.some(setToLEdge)\n    };\n\n    var HorizontalModel = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setValueFrom: setValueFrom,\n        setToMin: setToMin,\n        setToMax: setToMax,\n        findValueOfOffset: findValueOfOffset,\n        getValueFromEvent: getValueFromEvent,\n        findPositionOfValue: findPositionOfValue,\n        setPositionFromValue: setPositionFromValue,\n        onLeft: onLeft,\n        onRight: onRight,\n        onUp: onUp,\n        onDown: onDown,\n        edgeActions: edgeActions\n    });\n\n    var fireSliderChange$2 = function (spectrum, value) {\n      emitWith(spectrum, sliderChangeEvent(), { value: value });\n    };\n    var sliderValue$1 = function (y) {\n      return { y: constant(y) };\n    };\n    var findValueOfOffset$1 = function (spectrum, detail, top) {\n      var args = {\n        min: minY(detail),\n        max: maxY(detail),\n        range: yRange(detail),\n        value: top,\n        step: step(detail),\n        snap: snap(detail),\n        snapStart: snapStart(detail),\n        rounded: rounded(detail),\n        hasMinEdge: hasTEdge(detail),\n        hasMaxEdge: hasBEdge(detail),\n        minBound: getMinYBounds(spectrum),\n        maxBound: getMaxYBounds(spectrum),\n        screenRange: getYScreenRange(spectrum)\n      };\n      return findValueOf(args);\n    };\n    var setValueFrom$1 = function (spectrum, detail, value) {\n      var yValue = findValueOfOffset$1(spectrum, detail, value);\n      var sliderVal = sliderValue$1(yValue);\n      fireSliderChange$2(spectrum, sliderVal);\n      return yValue;\n    };\n    var setToMin$1 = function (spectrum, detail) {\n      var min = minY(detail);\n      fireSliderChange$2(spectrum, sliderValue$1(min));\n    };\n    var setToMax$1 = function (spectrum, detail) {\n      var max = maxY(detail);\n      fireSliderChange$2(spectrum, sliderValue$1(max));\n    };\n    var moveBy$1 = function (direction, spectrum, detail) {\n      var f = direction > 0 ? increaseBy : reduceBy;\n      var yValue = f(currentValue(detail).y(), minY(detail), maxY(detail), step(detail));\n      fireSliderChange$2(spectrum, sliderValue$1(yValue));\n      return Option.some(yValue);\n    };\n    var handleMovement$1 = function (direction) {\n      return function (spectrum, detail) {\n        return moveBy$1(direction, spectrum, detail).map(function () {\n          return true;\n        });\n      };\n    };\n    var getValueFromEvent$1 = function (simulatedEvent) {\n      var pos = getEventSource(simulatedEvent);\n      return pos.map(function (p) {\n        return p.top();\n      });\n    };\n    var findOffsetOfValue$2 = function (spectrum, detail, value, minEdge, maxEdge) {\n      var minOffset = 0;\n      var maxOffset = getYScreenRange(spectrum);\n      var centerMinEdge = minEdge.bind(function (edge) {\n        return Option.some(getYCenterOffSetOf(edge, spectrum));\n      }).getOr(minOffset);\n      var centerMaxEdge = maxEdge.bind(function (edge) {\n        return Option.some(getYCenterOffSetOf(edge, spectrum));\n      }).getOr(maxOffset);\n      var args = {\n        min: minY(detail),\n        max: maxY(detail),\n        range: yRange(detail),\n        value: value,\n        hasMinEdge: hasTEdge(detail),\n        hasMaxEdge: hasBEdge(detail),\n        minBound: getMinYBounds(spectrum),\n        minOffset: minOffset,\n        maxBound: getMaxYBounds(spectrum),\n        maxOffset: maxOffset,\n        centerMinEdge: centerMinEdge,\n        centerMaxEdge: centerMaxEdge\n      };\n      return findOffsetOfValue(args);\n    };\n    var findPositionOfValue$1 = function (slider, spectrum, value, minEdge, maxEdge, detail) {\n      var offset = findOffsetOfValue$2(spectrum, detail, value, minEdge, maxEdge);\n      return getMinYBounds(spectrum) - getMinYBounds(slider) + offset;\n    };\n    var setPositionFromValue$1 = function (slider, thumb, detail, edges) {\n      var value = currentValue(detail);\n      var pos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.y(), edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);\n      var thumbRadius = get$6(thumb.element()) / 2;\n      set$2(thumb.element(), 'top', pos - thumbRadius + 'px');\n    };\n    var onLeft$1 = Option.none;\n    var onRight$1 = Option.none;\n    var onUp$1 = handleMovement$1(-1);\n    var onDown$1 = handleMovement$1(1);\n    var edgeActions$1 = {\n      'top-left': Option.none(),\n      'top': Option.some(setToTEdge),\n      'top-right': Option.none(),\n      'right': Option.none(),\n      'bottom-right': Option.none(),\n      'bottom': Option.some(setToBEdge),\n      'bottom-left': Option.none(),\n      'left': Option.none()\n    };\n\n    var VerticalModel = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setValueFrom: setValueFrom$1,\n        setToMin: setToMin$1,\n        setToMax: setToMax$1,\n        findValueOfOffset: findValueOfOffset$1,\n        getValueFromEvent: getValueFromEvent$1,\n        findPositionOfValue: findPositionOfValue$1,\n        setPositionFromValue: setPositionFromValue$1,\n        onLeft: onLeft$1,\n        onRight: onRight$1,\n        onUp: onUp$1,\n        onDown: onDown$1,\n        edgeActions: edgeActions$1\n    });\n\n    var fireSliderChange$3 = function (spectrum, value) {\n      emitWith(spectrum, sliderChangeEvent(), { value: value });\n    };\n    var sliderValue$2 = function (x, y) {\n      return {\n        x: constant(x),\n        y: constant(y)\n      };\n    };\n    var setValueFrom$2 = function (spectrum, detail, value) {\n      var xValue = findValueOfOffset(spectrum, detail, value.left());\n      var yValue = findValueOfOffset$1(spectrum, detail, value.top());\n      var val = sliderValue$2(xValue, yValue);\n      fireSliderChange$3(spectrum, val);\n      return val;\n    };\n    var moveBy$2 = function (direction, isVerticalMovement, spectrum, detail) {\n      var f = direction > 0 ? increaseBy : reduceBy;\n      var xValue = isVerticalMovement ? currentValue(detail).x() : f(currentValue(detail).x(), minX(detail), maxX(detail), step(detail));\n      var yValue = !isVerticalMovement ? currentValue(detail).y() : f(currentValue(detail).y(), minY(detail), maxY(detail), step(detail));\n      fireSliderChange$3(spectrum, sliderValue$2(xValue, yValue));\n      return Option.some(xValue);\n    };\n    var handleMovement$2 = function (direction, isVerticalMovement) {\n      return function (spectrum, detail) {\n        return moveBy$2(direction, isVerticalMovement, spectrum, detail).map(function () {\n          return true;\n        });\n      };\n    };\n    var setToMin$2 = function (spectrum, detail) {\n      var mX = minX(detail);\n      var mY = minY(detail);\n      fireSliderChange$3(spectrum, sliderValue$2(mX, mY));\n    };\n    var setToMax$2 = function (spectrum, detail) {\n      var mX = maxX(detail);\n      var mY = maxY(detail);\n      fireSliderChange$3(spectrum, sliderValue$2(mX, mY));\n    };\n    var getValueFromEvent$2 = function (simulatedEvent) {\n      return getEventSource(simulatedEvent);\n    };\n    var setPositionFromValue$2 = function (slider, thumb, detail, edges) {\n      var value = currentValue(detail);\n      var xPos = findPositionOfValue(slider, edges.getSpectrum(slider), value.x(), edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);\n      var yPos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.y(), edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);\n      var thumbXRadius = get$7(thumb.element()) / 2;\n      var thumbYRadius = get$6(thumb.element()) / 2;\n      set$2(thumb.element(), 'left', xPos - thumbXRadius + 'px');\n      set$2(thumb.element(), 'top', yPos - thumbYRadius + 'px');\n    };\n    var onLeft$2 = handleMovement$2(-1, false);\n    var onRight$2 = handleMovement$2(1, false);\n    var onUp$2 = handleMovement$2(-1, true);\n    var onDown$2 = handleMovement$2(1, true);\n    var edgeActions$2 = {\n      'top-left': Option.some(setToTLEdgeXY),\n      'top': Option.some(setToTEdgeXY),\n      'top-right': Option.some(setToTREdgeXY),\n      'right': Option.some(setToREdgeXY),\n      'bottom-right': Option.some(setToBREdgeXY),\n      'bottom': Option.some(setToBEdgeXY),\n      'bottom-left': Option.some(setToBLEdgeXY),\n      'left': Option.some(setToLEdgeXY)\n    };\n\n    var TwoDModel = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setValueFrom: setValueFrom$2,\n        setToMin: setToMin$2,\n        setToMax: setToMax$2,\n        getValueFromEvent: getValueFromEvent$2,\n        setPositionFromValue: setPositionFromValue$2,\n        onLeft: onLeft$2,\n        onRight: onRight$2,\n        onUp: onUp$2,\n        onDown: onDown$2,\n        edgeActions: edgeActions$2\n    });\n\n    var SliderSchema = [\n      defaulted$1('stepSize', 1),\n      defaulted$1('onChange', noop),\n      defaulted$1('onChoose', noop),\n      defaulted$1('onInit', noop),\n      defaulted$1('onDragStart', noop),\n      defaulted$1('onDragEnd', noop),\n      defaulted$1('snapToGrid', false),\n      defaulted$1('rounded', true),\n      option('snapStart'),\n      strictOf('model', choose$1('mode', {\n        x: [\n          defaulted$1('minX', 0),\n          defaulted$1('maxX', 100),\n          state$1('value', function (spec) {\n            return Cell(spec.mode.minX);\n          }),\n          strict$1('getInitialValue'),\n          output('manager', HorizontalModel)\n        ],\n        y: [\n          defaulted$1('minY', 0),\n          defaulted$1('maxY', 100),\n          state$1('value', function (spec) {\n            return Cell(spec.mode.minY);\n          }),\n          strict$1('getInitialValue'),\n          output('manager', VerticalModel)\n        ],\n        xy: [\n          defaulted$1('minX', 0),\n          defaulted$1('maxX', 100),\n          defaulted$1('minY', 0),\n          defaulted$1('maxY', 100),\n          state$1('value', function (spec) {\n            return Cell({\n              x: constant(spec.mode.minX),\n              y: constant(spec.mode.minY)\n            });\n          }),\n          strict$1('getInitialValue'),\n          output('manager', TwoDModel)\n        ]\n      })),\n      field$1('sliderBehaviours', [\n        Keying,\n        Representing\n      ]),\n      state$1('mouseIsDown', function () {\n        return Cell(false);\n      })\n    ];\n\n    var sketch = function (detail, components, _spec, _externals) {\n      var _a;\n      var getThumb = function (component) {\n        return getPartOrDie(component, detail, 'thumb');\n      };\n      var getSpectrum = function (component) {\n        return getPartOrDie(component, detail, 'spectrum');\n      };\n      var getLeftEdge = function (component) {\n        return getPart(component, detail, 'left-edge');\n      };\n      var getRightEdge = function (component) {\n        return getPart(component, detail, 'right-edge');\n      };\n      var getTopEdge = function (component) {\n        return getPart(component, detail, 'top-edge');\n      };\n      var getBottomEdge = function (component) {\n        return getPart(component, detail, 'bottom-edge');\n      };\n      var modelDetail = detail.model;\n      var model = modelDetail.manager;\n      var refresh = function (slider, thumb) {\n        model.setPositionFromValue(slider, thumb, detail, {\n          getLeftEdge: getLeftEdge,\n          getRightEdge: getRightEdge,\n          getTopEdge: getTopEdge,\n          getBottomEdge: getBottomEdge,\n          getSpectrum: getSpectrum\n        });\n      };\n      var changeValue = function (slider, newValue) {\n        modelDetail.value.set(newValue);\n        var thumb = getThumb(slider);\n        refresh(slider, thumb);\n        detail.onChange(slider, thumb, newValue);\n        return Option.some(true);\n      };\n      var resetToMin = function (slider) {\n        model.setToMin(slider, detail);\n      };\n      var resetToMax = function (slider) {\n        model.setToMax(slider, detail);\n      };\n      var choose = function (slider) {\n        var fireOnChoose = function () {\n          getPart(slider, detail, 'thumb').each(function (thumb) {\n            var value = modelDetail.value.get();\n            detail.onChoose(slider, thumb, value);\n          });\n        };\n        var wasDown = detail.mouseIsDown.get();\n        detail.mouseIsDown.set(false);\n        if (wasDown) {\n          fireOnChoose();\n        }\n      };\n      var onDragStart = function (slider, simulatedEvent) {\n        simulatedEvent.stop();\n        detail.mouseIsDown.set(true);\n        detail.onDragStart(slider, getThumb(slider));\n      };\n      var onDragEnd = function (slider, simulatedEvent) {\n        simulatedEvent.stop();\n        detail.onDragEnd(slider, getThumb(slider));\n        choose(slider);\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: augment(detail.sliderBehaviours, [\n          Keying.config({\n            mode: 'special',\n            focusIn: function (slider) {\n              return getPart(slider, detail, 'spectrum').map(Keying.focusIn).map(constant(true));\n            }\n          }),\n          Representing.config({\n            store: {\n              mode: 'manual',\n              getValue: function (_) {\n                return modelDetail.value.get();\n              }\n            }\n          }),\n          Receiving.config({ channels: (_a = {}, _a[mouseReleased()] = { onReceive: choose }, _a) })\n        ]),\n        events: derive([\n          run(sliderChangeEvent(), function (slider, simulatedEvent) {\n            changeValue(slider, simulatedEvent.event().value());\n          }),\n          runOnAttached(function (slider, simulatedEvent) {\n            var getInitial = modelDetail.getInitialValue();\n            modelDetail.value.set(getInitial);\n            var thumb = getThumb(slider);\n            refresh(slider, thumb);\n            var spectrum = getSpectrum(slider);\n            detail.onInit(slider, thumb, spectrum, modelDetail.value.get());\n          }),\n          run(touchstart(), onDragStart),\n          run(touchend(), onDragEnd),\n          run(mousedown(), onDragStart),\n          run(mouseup(), onDragEnd)\n        ]),\n        apis: {\n          resetToMin: resetToMin,\n          resetToMax: resetToMax,\n          changeValue: changeValue,\n          refresh: refresh\n        },\n        domModification: { styles: { position: 'relative' } }\n      };\n    };\n\n    var Slider = composite$1({\n      name: 'Slider',\n      configFields: SliderSchema,\n      partFields: SliderParts,\n      factory: sketch,\n      apis: {\n        resetToMin: function (apis, slider) {\n          apis.resetToMin(slider);\n        },\n        resetToMax: function (apis, slider) {\n          apis.resetToMax(slider);\n        },\n        refresh: function (apis, slider) {\n          apis.refresh(slider);\n        }\n      }\n    });\n\n    var sliderFactory = function (translate, getClass) {\n      var spectrum = Slider.parts().spectrum({\n        dom: {\n          tag: 'div',\n          classes: [getClass('hue-slider-spectrum')],\n          attributes: { role: 'presentation' }\n        }\n      });\n      var thumb = Slider.parts().thumb({\n        dom: {\n          tag: 'div',\n          classes: [getClass('hue-slider-thumb')],\n          attributes: { role: 'presentation' }\n        }\n      });\n      return Slider.sketch({\n        dom: {\n          tag: 'div',\n          classes: [getClass('hue-slider')],\n          attributes: { role: 'presentation' }\n        },\n        rounded: false,\n        model: {\n          mode: 'y',\n          getInitialValue: constant({ y: constant(0) })\n        },\n        components: [\n          spectrum,\n          thumb\n        ],\n        sliderBehaviours: derive$1([Focusing.config({})]),\n        onChange: function (slider, _thumb, value) {\n          emitWith(slider, sliderUpdate(), { value: value });\n        }\n      });\n    };\n\n    var owner$3 = 'form';\n    var schema$h = [field$1('formBehaviours', [Representing])];\n    var getPartName = function (name) {\n      return '<alloy.field.' + name + '>';\n    };\n    var sketch$1 = function (fSpec) {\n      var parts = function () {\n        var record = [];\n        var field = function (name, config) {\n          record.push(name);\n          return generateOne(owner$3, getPartName(name), config);\n        };\n        return {\n          field: field,\n          record: function () {\n            return record;\n          }\n        };\n      }();\n      var spec = fSpec(parts);\n      var partNames = parts.record();\n      var fieldParts = map(partNames, function (n) {\n        return required({\n          name: n,\n          pname: getPartName(n)\n        });\n      });\n      return composite(owner$3, schema$h, fieldParts, make$4, spec);\n    };\n    var toResult$1 = function (o, e) {\n      return o.fold(function () {\n        return Result.error(e);\n      }, Result.value);\n    };\n    var make$4 = function (detail, components) {\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: augment(detail.formBehaviours, [Representing.config({\n            store: {\n              mode: 'manual',\n              getValue: function (form) {\n                var resPs = getAllParts(form, detail);\n                return map$1(resPs, function (resPThunk, pName) {\n                  return resPThunk().bind(function (v) {\n                    var opt = Composing.getCurrent(v);\n                    return toResult$1(opt, new Error('Cannot find a current component to extract the value from for form part \\'' + pName + '\\': ' + element(v.element())));\n                  }).map(Representing.getValue);\n                });\n              },\n              setValue: function (form, values) {\n                each$1(values, function (newValue, key) {\n                  getPart(form, detail, key).each(function (wrapper) {\n                    Composing.getCurrent(wrapper).each(function (field) {\n                      Representing.setValue(field, newValue);\n                    });\n                  });\n                });\n              }\n            }\n          })]),\n        apis: {\n          getField: function (form, key) {\n            return getPart(form, detail, key).bind(Composing.getCurrent);\n          }\n        }\n      };\n    };\n    var Form = {\n      getField: makeApi(function (apis, component, key) {\n        return apis.getField(component, key);\n      }),\n      sketch: sketch$1\n    };\n\n    var validInput = generate$1('valid-input');\n    var invalidInput = generate$1('invalid-input');\n    var validatingInput = generate$1('validating-input');\n    var translatePrefix = 'colorcustom.rgb.';\n    var rgbFormFactory = function (translate, getClass, onValidHexx, onInvalidHexx) {\n      var invalidation = function (label, isValid) {\n        return Invalidating.config({\n          invalidClass: getClass('invalid'),\n          notify: {\n            onValidate: function (comp) {\n              emitWith(comp, validatingInput, { type: label });\n            },\n            onValid: function (comp) {\n              emitWith(comp, validInput, {\n                type: label,\n                value: Representing.getValue(comp)\n              });\n            },\n            onInvalid: function (comp) {\n              emitWith(comp, invalidInput, {\n                type: label,\n                value: Representing.getValue(comp)\n              });\n            }\n          },\n          validator: {\n            validate: function (comp) {\n              var value = Representing.getValue(comp);\n              var res = isValid(value) ? Result.value(true) : Result.error(translate('aria.input.invalid'));\n              return Future.pure(res);\n            },\n            validateOnLoad: false\n          }\n        });\n      };\n      var renderTextField = function (isValid, name, label, description, data) {\n        var helptext = translate(translatePrefix + 'range');\n        var pLabel = FormField.parts().label({\n          dom: {\n            tag: 'label',\n            innerHtml: label,\n            attributes: { 'aria-label': description }\n          }\n        });\n        var pField = FormField.parts().field({\n          data: data,\n          factory: Input,\n          inputAttributes: __assign({ type: 'text' }, name === 'hex' ? { 'aria-live': 'polite' } : {}),\n          inputClasses: [getClass('textfield')],\n          inputBehaviours: derive$1([\n            invalidation(name, isValid),\n            Tabstopping.config({})\n          ]),\n          onSetValue: function (input) {\n            if (Invalidating.isInvalid(input)) {\n              var run = Invalidating.run(input);\n              run.get(noop);\n            }\n          }\n        });\n        var comps = [\n          pLabel,\n          pField\n        ];\n        var concats = name !== 'hex' ? [FormField.parts()['aria-descriptor']({ text: helptext })] : [];\n        var components = comps.concat(concats);\n        return {\n          dom: {\n            tag: 'div',\n            attributes: { role: 'presentation' }\n          },\n          components: components\n        };\n      };\n      var copyRgbToHex = function (form, rgba) {\n        var hex = fromRgba(rgba);\n        Form.getField(form, 'hex').each(function (hexField) {\n          if (!Focusing.isFocused(hexField)) {\n            Representing.setValue(form, { hex: hex.value() });\n          }\n        });\n        return hex;\n      };\n      var copyRgbToForm = function (form, rgb) {\n        var red = rgb.red();\n        var green = rgb.green();\n        var blue = rgb.blue();\n        Representing.setValue(form, {\n          red: red,\n          green: green,\n          blue: blue\n        });\n      };\n      var memPreview = record({\n        dom: {\n          tag: 'div',\n          classes: [getClass('rgba-preview')],\n          styles: { 'background-color': 'white' },\n          attributes: { role: 'presentation' }\n        }\n      });\n      var updatePreview = function (anyInSystem, hex) {\n        memPreview.getOpt(anyInSystem).each(function (preview) {\n          set$2(preview.element(), 'background-color', '#' + hex.value());\n        });\n      };\n      var factory = function () {\n        var state = {\n          red: constant(Cell(Option.some(255))),\n          green: constant(Cell(Option.some(255))),\n          blue: constant(Cell(Option.some(255))),\n          hex: constant(Cell(Option.some('ffffff')))\n        };\n        var copyHexToRgb = function (form, hex) {\n          var rgb = fromHex(hex);\n          copyRgbToForm(form, rgb);\n          setValueRgb(rgb);\n        };\n        var get = function (prop) {\n          return state[prop]().get();\n        };\n        var set = function (prop, value) {\n          state[prop]().set(value);\n        };\n        var getValueRgb = function () {\n          return get('red').bind(function (red) {\n            return get('green').bind(function (green) {\n              return get('blue').map(function (blue) {\n                return rgbaColour(red, green, blue, 1);\n              });\n            });\n          });\n        };\n        var setValueRgb = function (rgb) {\n          var red = rgb.red();\n          var green = rgb.green();\n          var blue = rgb.blue();\n          set('red', Option.some(red));\n          set('green', Option.some(green));\n          set('blue', Option.some(blue));\n        };\n        var onInvalidInput = function (form, simulatedEvent) {\n          var data = simulatedEvent.event();\n          if (data.type() !== 'hex') {\n            set(data.type(), Option.none());\n          } else {\n            onInvalidHexx(form);\n          }\n        };\n        var onValidHex = function (form, value) {\n          onValidHexx(form);\n          var hex = hexColour(value);\n          set('hex', Option.some(value));\n          var rgb = fromHex(hex);\n          copyRgbToForm(form, rgb);\n          setValueRgb(rgb);\n          emitWith(form, fieldsUpdate(), { hex: hex });\n          updatePreview(form, hex);\n        };\n        var onValidRgb = function (form, prop, value) {\n          var val = parseInt(value, 10);\n          set(prop, Option.some(val));\n          getValueRgb().each(function (rgb) {\n            var hex = copyRgbToHex(form, rgb);\n            updatePreview(form, hex);\n          });\n        };\n        var isHexInputEvent = function (data) {\n          return data.type() === 'hex';\n        };\n        var onValidInput = function (form, simulatedEvent) {\n          var data = simulatedEvent.event();\n          if (isHexInputEvent(data)) {\n            onValidHex(form, data.value());\n          } else {\n            onValidRgb(form, data.type(), data.value());\n          }\n        };\n        var formPartStrings = function (key) {\n          return {\n            label: translate(translatePrefix + key + '.label'),\n            description: translate(translatePrefix + key + '.description')\n          };\n        };\n        var redStrings = formPartStrings('red');\n        var greenStrings = formPartStrings('green');\n        var blueStrings = formPartStrings('blue');\n        var hexStrings = formPartStrings('hex');\n        return deepMerge(Form.sketch(function (parts) {\n          return {\n            dom: {\n              tag: 'form',\n              classes: [getClass('rgb-form')],\n              attributes: { 'aria-label': translate('aria.color.picker') }\n            },\n            components: [\n              parts.field('red', FormField.sketch(renderTextField(isRgbaComponent, 'red', redStrings.label, redStrings.description, 255))),\n              parts.field('green', FormField.sketch(renderTextField(isRgbaComponent, 'green', greenStrings.label, greenStrings.description, 255))),\n              parts.field('blue', FormField.sketch(renderTextField(isRgbaComponent, 'blue', blueStrings.label, blueStrings.description, 255))),\n              parts.field('hex', FormField.sketch(renderTextField(isHexString, 'hex', hexStrings.label, hexStrings.description, 'ffffff'))),\n              memPreview.asSpec()\n            ],\n            formBehaviours: derive$1([\n              Invalidating.config({ invalidClass: getClass('form-invalid') }),\n              config('rgb-form-events', [\n                run(validInput, onValidInput),\n                run(invalidInput, onInvalidInput),\n                run(validatingInput, onInvalidInput)\n              ])\n            ])\n          };\n        }), {\n          apis: {\n            updateHex: function (form, hex) {\n              Representing.setValue(form, { hex: hex.value() });\n              copyHexToRgb(form, hex);\n              updatePreview(form, hex);\n            }\n          }\n        });\n      };\n      var rgbFormSketcher = single$2({\n        factory: factory,\n        name: 'RgbForm',\n        configFields: [],\n        apis: {\n          updateHex: function (apis, form, hex) {\n            apis.updateHex(form, hex);\n          }\n        },\n        extraApis: {}\n      });\n      return rgbFormSketcher;\n    };\n\n    var paletteFactory = function (_translate, getClass) {\n      var spectrumPart = Slider.parts().spectrum({\n        dom: {\n          tag: 'canvas',\n          attributes: { role: 'presentation' },\n          classes: [getClass('sv-palette-spectrum')]\n        }\n      });\n      var thumbPart = Slider.parts().thumb({\n        dom: {\n          tag: 'div',\n          attributes: { role: 'presentation' },\n          classes: [getClass('sv-palette-thumb')],\n          innerHtml: '<div class=' + getClass('sv-palette-inner-thumb') + ' role=\"presentation\"></div>'\n        }\n      });\n      var setColour = function (canvas, rgba) {\n        var width = canvas.width, height = canvas.height;\n        var ctx = canvas.getContext('2d');\n        if (ctx === null) {\n          return;\n        }\n        ctx.fillStyle = rgba;\n        ctx.fillRect(0, 0, width, height);\n        var grdWhite = ctx.createLinearGradient(0, 0, width, 0);\n        grdWhite.addColorStop(0, 'rgba(255,255,255,1)');\n        grdWhite.addColorStop(1, 'rgba(255,255,255,0)');\n        ctx.fillStyle = grdWhite;\n        ctx.fillRect(0, 0, width, height);\n        var grdBlack = ctx.createLinearGradient(0, 0, 0, height);\n        grdBlack.addColorStop(0, 'rgba(0,0,0,0)');\n        grdBlack.addColorStop(1, 'rgba(0,0,0,1)');\n        ctx.fillStyle = grdBlack;\n        ctx.fillRect(0, 0, width, height);\n      };\n      var setSliderColour = function (slider, rgba) {\n        var canvas = slider.components()[0].element().dom();\n        setColour(canvas, toString(rgba));\n      };\n      var factory = function (_detail) {\n        var getInitialValue = constant({\n          x: constant(0),\n          y: constant(0)\n        });\n        var onChange = function (slider, _thumb, value) {\n          emitWith(slider, paletteUpdate(), { value: value });\n        };\n        var onInit = function (_slider, _thumb, spectrum, _value) {\n          setColour(spectrum.element().dom(), toString(redColour()));\n        };\n        var sliderBehaviours = derive$1([\n          Composing.config({ find: Option.some }),\n          Focusing.config({})\n        ]);\n        return Slider.sketch({\n          dom: {\n            tag: 'div',\n            attributes: { role: 'presentation' },\n            classes: [getClass('sv-palette')]\n          },\n          model: {\n            mode: 'xy',\n            getInitialValue: getInitialValue\n          },\n          rounded: false,\n          components: [\n            spectrumPart,\n            thumbPart\n          ],\n          onChange: onChange,\n          onInit: onInit,\n          sliderBehaviours: sliderBehaviours\n        });\n      };\n      var saturationBrightnessPaletteSketcher = single$2({\n        factory: factory,\n        name: 'SaturationBrightnessPalette',\n        configFields: [],\n        apis: {\n          setRgba: function (_apis, slider, rgba) {\n            setSliderColour(slider, rgba);\n          }\n        },\n        extraApis: {}\n      });\n      return saturationBrightnessPaletteSketcher;\n    };\n\n    var makeFactory = function (translate, getClass) {\n      var factory = function (detail) {\n        var rgbForm = rgbFormFactory(translate, getClass, detail.onValidHex, detail.onInvalidHex);\n        var sbPalette = paletteFactory(translate, getClass);\n        var state = { paletteRgba: constant(Cell(redColour())) };\n        var memPalette = record(sbPalette.sketch({}));\n        var memRgb = record(rgbForm.sketch({}));\n        var updatePalette = function (anyInSystem, hex) {\n          memPalette.getOpt(anyInSystem).each(function (palette) {\n            var rgba = fromHex(hex);\n            state.paletteRgba().set(rgba);\n            sbPalette.setRgba(palette, rgba);\n          });\n        };\n        var updateFields = function (anyInSystem, hex) {\n          memRgb.getOpt(anyInSystem).each(function (form) {\n            rgbForm.updateHex(form, hex);\n          });\n        };\n        var runUpdates = function (anyInSystem, hex, updates) {\n          each(updates, function (update) {\n            update(anyInSystem, hex);\n          });\n        };\n        var paletteUpdates = function () {\n          var updates = [updateFields];\n          return function (form, simulatedEvent) {\n            var value = simulatedEvent.event().value();\n            var oldRgb = state.paletteRgba().get();\n            var hsvColour$1 = fromRgb(oldRgb);\n            var newHsvColour = hsvColour(hsvColour$1.hue(), value.x(), 100 - value.y());\n            var rgb = fromHsv(newHsvColour);\n            var nuHex = fromRgba(rgb);\n            runUpdates(form, nuHex, updates);\n          };\n        };\n        var sliderUpdates = function () {\n          var updates = [\n            updatePalette,\n            updateFields\n          ];\n          return function (form, simulatedEvent) {\n            var value = simulatedEvent.event().value();\n            var hex = calcHex(value.y());\n            runUpdates(form, hex, updates);\n          };\n        };\n        return {\n          uid: detail.uid,\n          dom: detail.dom,\n          components: [\n            memPalette.asSpec(),\n            sliderFactory(translate, getClass),\n            memRgb.asSpec()\n          ],\n          behaviours: derive$1([\n            config('colour-picker-events', [\n              run(paletteUpdate(), paletteUpdates()),\n              run(sliderUpdate(), sliderUpdates())\n            ]),\n            Composing.config({\n              find: function (comp) {\n                return memRgb.getOpt(comp);\n              }\n            }),\n            Keying.config({ mode: 'acyclic' })\n          ])\n        };\n      };\n      var colourPickerSketcher = single$2({\n        name: 'ColourPicker',\n        configFields: [\n          strict$1('dom'),\n          defaulted$1('onValidHex', noop),\n          defaulted$1('onInvalidHex', noop)\n        ],\n        factory: factory\n      });\n      return colourPickerSketcher;\n    };\n\n    var self$1 = function () {\n      return Composing.config({ find: Option.some });\n    };\n    var memento = function (mem) {\n      return Composing.config({ find: mem.getOpt });\n    };\n    var childAt = function (index) {\n      return Composing.config({\n        find: function (comp) {\n          return child(comp.element(), index).bind(function (element) {\n            return comp.getSystem().getByDom(element).toOption();\n          });\n        }\n      });\n    };\n    var ComposingConfigs = {\n      self: self$1,\n      memento: memento,\n      childAt: childAt\n    };\n\n    var english = {\n      'colorcustom.rgb.red.label': 'R',\n      'colorcustom.rgb.red.description': 'Red component',\n      'colorcustom.rgb.green.label': 'G',\n      'colorcustom.rgb.green.description': 'Green component',\n      'colorcustom.rgb.blue.label': 'B',\n      'colorcustom.rgb.blue.description': 'Blue component',\n      'colorcustom.rgb.hex.label': '#',\n      'colorcustom.rgb.hex.description': 'Hex color code',\n      'colorcustom.rgb.range': 'Range 0 to 255',\n      'colorcustom.sb.saturation': 'Saturation',\n      'colorcustom.sb.brightness': 'Brightness',\n      'colorcustom.sb.picker': 'Saturation and Brightness Picker',\n      'colorcustom.sb.palette': 'Saturation and Brightness Palette',\n      'colorcustom.sb.instructions': 'Use arrow keys to select saturation and brightness, on x and y axes',\n      'colorcustom.hue.hue': 'Hue',\n      'colorcustom.hue.slider': 'Hue Slider',\n      'colorcustom.hue.palette': 'Hue Palette',\n      'colorcustom.hue.instructions': 'Use arrow keys to select a hue',\n      'aria.color.picker': 'Color Picker',\n      'aria.input.invalid': 'Invalid input'\n    };\n    var getEnglishText = function (key) {\n      return english[key];\n    };\n    var translate$1 = function (key) {\n      return getEnglishText(key);\n    };\n    var renderColorPicker = function (spec) {\n      var getClass = function (key) {\n        return 'tox-' + key;\n      };\n      var colourPickerFactory = makeFactory(translate$1, getClass);\n      var onValidHex = function (form) {\n        emitWith(form, formActionEvent, {\n          name: 'hex-valid',\n          value: true\n        });\n      };\n      var onInvalidHex = function (form) {\n        emitWith(form, formActionEvent, {\n          name: 'hex-valid',\n          value: false\n        });\n      };\n      var memPicker = record(colourPickerFactory.sketch({\n        dom: {\n          tag: 'div',\n          classes: [getClass('color-picker-container')],\n          attributes: { role: 'presentation' }\n        },\n        onValidHex: onValidHex,\n        onInvalidHex: onInvalidHex\n      }));\n      return {\n        dom: { tag: 'div' },\n        components: [memPicker.asSpec()],\n        behaviours: derive$1([\n          Representing.config({\n            store: {\n              mode: 'manual',\n              getValue: function (comp) {\n                var picker = memPicker.get(comp);\n                var optRgbForm = Composing.getCurrent(picker);\n                var optHex = optRgbForm.bind(function (rgbForm) {\n                  var formValues = Representing.getValue(rgbForm);\n                  return formValues.hex;\n                });\n                return optHex.map(function (hex) {\n                  return '#' + hex;\n                }).getOr('');\n              },\n              setValue: function (comp, newValue) {\n                var pattern = /^#([a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?)/;\n                var m = pattern.exec(newValue);\n                var picker = memPicker.get(comp);\n                var optRgbForm = Composing.getCurrent(picker);\n                optRgbForm.fold(function () {\n                  domGlobals.console.log('Can not find form');\n                }, function (rgbForm) {\n                  Representing.setValue(rgbForm, { hex: Option.from(m[1]).getOr('') });\n                  Form.getField(rgbForm, 'hex').each(function (hexField) {\n                    emit(hexField, input());\n                  });\n                });\n              }\n            }\n          }),\n          ComposingConfigs.self()\n        ])\n      };\n    };\n\n    var global$a = tinymce.util.Tools.resolve('tinymce.Resource');\n\n    var isOldCustomEditor = function (spec) {\n      return Object.prototype.hasOwnProperty.call(spec, 'init');\n    };\n    var renderCustomEditor = function (spec) {\n      var editorApi = Cell(Option.none());\n      var memReplaced = record({ dom: { tag: spec.tag } });\n      var initialValue = Cell(Option.none());\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-custom-editor']\n        },\n        behaviours: derive$1([\n          config('editor-foo-events', [runOnAttached(function (component) {\n              memReplaced.getOpt(component).each(function (ta) {\n                (isOldCustomEditor(spec) ? spec.init(ta.element().dom()) : global$a.load(spec.scriptId, spec.scriptUrl).then(function (init) {\n                  return init(ta.element().dom(), spec.settings);\n                })).then(function (ea) {\n                  initialValue.get().each(function (cvalue) {\n                    ea.setValue(cvalue);\n                  });\n                  initialValue.set(Option.none());\n                  editorApi.set(Option.some(ea));\n                });\n              });\n            })]),\n          Representing.config({\n            store: {\n              mode: 'manual',\n              getValue: function () {\n                return editorApi.get().fold(function () {\n                  return initialValue.get().getOr('');\n                }, function (ed) {\n                  return ed.getValue();\n                });\n              },\n              setValue: function (component, value) {\n                editorApi.get().fold(function () {\n                  initialValue.set(Option.some(value));\n                }, function (ed) {\n                  return ed.setValue(value);\n                });\n              }\n            }\n          }),\n          ComposingConfigs.self()\n        ]),\n        components: [memReplaced.asSpec()]\n      };\n    };\n\n    var processors = objOf([\n      defaulted$1('preprocess', identity),\n      defaulted$1('postprocess', identity)\n    ]);\n    var memento$1 = function (mem, rawProcessors) {\n      var ps = asRawOrDie('RepresentingConfigs.memento processors', processors, rawProcessors);\n      return Representing.config({\n        store: {\n          mode: 'manual',\n          getValue: function (comp) {\n            var other = mem.get(comp);\n            var rawValue = Representing.getValue(other);\n            return ps.postprocess(rawValue);\n          },\n          setValue: function (comp, rawValue) {\n            var newValue = ps.preprocess(rawValue);\n            var other = mem.get(comp);\n            Representing.setValue(other, newValue);\n          }\n        }\n      });\n    };\n    var withComp = function (optInitialValue, getter, setter) {\n      return Representing.config(deepMerge({\n        store: {\n          mode: 'manual',\n          getValue: getter,\n          setValue: setter\n        }\n      }, optInitialValue.map(function (initialValue) {\n        return { store: { initialValue: initialValue } };\n      }).getOr({})));\n    };\n    var withElement = function (initialValue, getter, setter) {\n      return withComp(initialValue, function (c) {\n        return getter(c.element());\n      }, function (c, v) {\n        return setter(c.element(), v);\n      });\n    };\n    var domValue = function (optInitialValue) {\n      return withElement(optInitialValue, get$5, set$3);\n    };\n    var domHtml = function (optInitialValue) {\n      return withElement(optInitialValue, get$1, set);\n    };\n    var memory$1 = function (initialValue) {\n      return Representing.config({\n        store: {\n          mode: 'memory',\n          initialValue: initialValue\n        }\n      });\n    };\n    var RepresentingConfigs = {\n      memento: memento$1,\n      withElement: withElement,\n      withComp: withComp,\n      domValue: domValue,\n      domHtml: domHtml,\n      memory: memory$1\n    };\n\n    var extensionsAccepted = '.jpg,.jpeg,.png,.gif';\n    var filterByExtension = function (files) {\n      var re = new RegExp('(' + extensionsAccepted.split(/\\s*,\\s*/).join('|') + ')$', 'i');\n      return filter(from$1(files), function (file) {\n        return re.test(file.name);\n      });\n    };\n    var renderDropZone = function (spec, providersBackstage) {\n      var stopper = function (_, se) {\n        se.stop();\n      };\n      var sequence = function (actions) {\n        return function (comp, se) {\n          each(actions, function (a) {\n            a(comp, se);\n          });\n        };\n      };\n      var onDrop = function (comp, se) {\n        if (!Disabling.isDisabled(comp)) {\n          var transferEvent = se.event().raw();\n          handleFiles(comp, transferEvent.dataTransfer.files);\n        }\n      };\n      var onSelect = function (component, simulatedEvent) {\n        var files = simulatedEvent.event().raw().target.files;\n        handleFiles(component, files);\n      };\n      var handleFiles = function (component, files) {\n        Representing.setValue(component, filterByExtension(files));\n        emitWith(component, formChangeEvent, { name: spec.name });\n      };\n      var memInput = record({\n        dom: {\n          tag: 'input',\n          attributes: {\n            type: 'file',\n            accept: 'image/*'\n          },\n          styles: { display: 'none' }\n        },\n        behaviours: derive$1([config('input-file-events', [\n            cutter(click()),\n            cutter(tap())\n          ])])\n      });\n      var renderField = function (s) {\n        return {\n          uid: s.uid,\n          dom: {\n            tag: 'div',\n            classes: ['tox-dropzone-container']\n          },\n          behaviours: derive$1([\n            RepresentingConfigs.memory([]),\n            ComposingConfigs.self(),\n            Disabling.config({}),\n            Toggling.config({\n              toggleClass: 'dragenter',\n              toggleOnExecute: false\n            }),\n            config('dropzone-events', [\n              run('dragenter', sequence([\n                stopper,\n                Toggling.toggle\n              ])),\n              run('dragleave', sequence([\n                stopper,\n                Toggling.toggle\n              ])),\n              run('dragover', stopper),\n              run('drop', sequence([\n                stopper,\n                onDrop\n              ])),\n              run(change(), onSelect)\n            ])\n          ]),\n          components: [{\n              dom: {\n                tag: 'div',\n                classes: ['tox-dropzone'],\n                styles: {}\n              },\n              components: [\n                {\n                  dom: {\n                    tag: 'p',\n                    innerHtml: providersBackstage.translate('Drop an image here')\n                  }\n                },\n                Button.sketch({\n                  dom: {\n                    tag: 'button',\n                    innerHtml: providersBackstage.translate('Browse for an image'),\n                    styles: { position: 'relative' },\n                    classes: [\n                      'tox-button',\n                      'tox-button--secondary'\n                    ]\n                  },\n                  components: [memInput.asSpec()],\n                  action: function (comp) {\n                    var inputComp = memInput.get(comp);\n                    inputComp.element().dom().click();\n                  },\n                  buttonBehaviours: derive$1([Tabstopping.config({})])\n                })\n              ]\n            }]\n        };\n      };\n      var pLabel = spec.label.map(function (label) {\n        return renderLabel(label, providersBackstage);\n      });\n      var pField = FormField.parts().field({ factory: { sketch: renderField } });\n      return renderFormFieldWith(pLabel, pField, ['tox-form__group--stretched'], []);\n    };\n\n    var renderGrid = function (spec, backstage) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-form__grid',\n            'tox-form__grid--' + spec.columns + 'col'\n          ]\n        },\n        components: map(spec.items, backstage.interpreter)\n      };\n    };\n\n    var beforeObject = generate$1('alloy-fake-before-tabstop');\n    var afterObject = generate$1('alloy-fake-after-tabstop');\n    var craftWithClasses = function (classes) {\n      return {\n        dom: {\n          tag: 'div',\n          styles: {\n            width: '1px',\n            height: '1px',\n            outline: 'none'\n          },\n          attributes: { tabindex: '0' },\n          classes: classes\n        },\n        behaviours: derive$1([\n          Focusing.config({ ignore: true }),\n          Tabstopping.config({})\n        ])\n      };\n    };\n    var craft = function (spec) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-navobj']\n        },\n        components: [\n          craftWithClasses([beforeObject]),\n          spec,\n          craftWithClasses([afterObject])\n        ],\n        behaviours: derive$1([ComposingConfigs.childAt(1)])\n      };\n    };\n    var triggerTab = function (placeholder, shiftKey) {\n      emitWith(placeholder, keydown(), {\n        raw: {\n          which: 9,\n          shiftKey: shiftKey\n        }\n      });\n    };\n    var onFocus$1 = function (container, targetComp) {\n      var target = targetComp.element();\n      if (has$2(target, beforeObject)) {\n        triggerTab(container, true);\n      } else if (has$2(target, afterObject)) {\n        triggerTab(container, false);\n      }\n    };\n    var isPseudoStop = function (element) {\n      return closest$4(element, [\n        '.' + beforeObject,\n        '.' + afterObject\n      ].join(','), constant(false));\n    };\n    var NavigableObject = {\n      isPseudoStop: isPseudoStop,\n      onFocus: onFocus$1,\n      craft: craft\n    };\n\n    var platformNeedsSandboxing = !(detect$3().browser.isIE() || detect$3().browser.isEdge());\n    var getDynamicSource = function (isSandbox) {\n      var cachedValue = Cell('');\n      return {\n        getValue: function (frameComponent) {\n          return cachedValue.get();\n        },\n        setValue: function (frameComponent, html) {\n          if (!isSandbox) {\n            set$1(frameComponent.element(), 'src', 'javascript:\\'\\'');\n            var doc = frameComponent.element().dom().contentWindow.document;\n            doc.open();\n            doc.write(html);\n            doc.close();\n          } else {\n            set$1(frameComponent.element(), 'srcdoc', html);\n          }\n          cachedValue.set(html);\n        }\n      };\n    };\n    var renderIFrame = function (spec, providersBackstage) {\n      var isSandbox = platformNeedsSandboxing && spec.sandboxed;\n      var attributes = __assign(__assign({}, spec.label.map(function (title) {\n        return { title: title };\n      }).getOr({})), isSandbox ? { sandbox: 'allow-scripts allow-same-origin' } : {});\n      var sourcing = getDynamicSource(isSandbox);\n      var pLabel = spec.label.map(function (label) {\n        return renderLabel(label, providersBackstage);\n      });\n      var factory = function (newSpec) {\n        return NavigableObject.craft({\n          uid: newSpec.uid,\n          dom: {\n            tag: 'iframe',\n            attributes: attributes\n          },\n          behaviours: derive$1([\n            Tabstopping.config({}),\n            Focusing.config({}),\n            RepresentingConfigs.withComp(Option.none(), sourcing.getValue, sourcing.setValue)\n          ])\n        });\n      };\n      var pField = FormField.parts().field({ factory: { sketch: factory } });\n      return renderFormFieldWith(pLabel, pField, ['tox-form__group--stretched'], []);\n    };\n\n    function create$5(width, height) {\n      return resize(domGlobals.document.createElement('canvas'), width, height);\n    }\n    function clone$1(canvas) {\n      var tCanvas = create$5(canvas.width, canvas.height);\n      var ctx = get2dContext(tCanvas);\n      ctx.drawImage(canvas, 0, 0);\n      return tCanvas;\n    }\n    function get2dContext(canvas) {\n      return canvas.getContext('2d');\n    }\n    function resize(canvas, width, height) {\n      canvas.width = width;\n      canvas.height = height;\n      return canvas;\n    }\n\n    function getWidth(image) {\n      return image.naturalWidth || image.width;\n    }\n    function getHeight(image) {\n      return image.naturalHeight || image.height;\n    }\n\n    var promise = function () {\n      var Promise = function (fn) {\n        if (typeof this !== 'object') {\n          throw new TypeError('Promises must be constructed via new');\n        }\n        if (typeof fn !== 'function') {\n          throw new TypeError('not a function');\n        }\n        this._state = null;\n        this._value = null;\n        this._deferreds = [];\n        doResolve(fn, bind(resolve, this), bind(reject, this));\n      };\n      var asap = Promise.immediateFn || typeof window.setImmediate === 'function' && window.setImmediate || function (fn) {\n        domGlobals.setTimeout(fn, 1);\n      };\n      function bind(fn, thisArg) {\n        return function () {\n          return fn.apply(thisArg, arguments);\n        };\n      }\n      var isArray = Array.isArray || function (value) {\n        return Object.prototype.toString.call(value) === '[object Array]';\n      };\n      function handle(deferred) {\n        var me = this;\n        if (this._state === null) {\n          this._deferreds.push(deferred);\n          return;\n        }\n        asap(function () {\n          var cb = me._state ? deferred.onFulfilled : deferred.onRejected;\n          if (cb === null) {\n            (me._state ? deferred.resolve : deferred.reject)(me._value);\n            return;\n          }\n          var ret;\n          try {\n            ret = cb(me._value);\n          } catch (e) {\n            deferred.reject(e);\n            return;\n          }\n          deferred.resolve(ret);\n        });\n      }\n      function resolve(newValue) {\n        try {\n          if (newValue === this) {\n            throw new TypeError('A promise cannot be resolved with itself.');\n          }\n          if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n            var then = newValue.then;\n            if (typeof then === 'function') {\n              doResolve(bind(then, newValue), bind(resolve, this), bind(reject, this));\n              return;\n            }\n          }\n          this._state = true;\n          this._value = newValue;\n          finale.call(this);\n        } catch (e) {\n          reject.call(this, e);\n        }\n      }\n      function reject(newValue) {\n        this._state = false;\n        this._value = newValue;\n        finale.call(this);\n      }\n      function finale() {\n        for (var _i = 0, _a = this._deferreds; _i < _a.length; _i++) {\n          var deferred = _a[_i];\n          handle.call(this, deferred);\n        }\n        this._deferreds = [];\n      }\n      function Handler(onFulfilled, onRejected, resolve, reject) {\n        this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n        this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n        this.resolve = resolve;\n        this.reject = reject;\n      }\n      function doResolve(fn, onFulfilled, onRejected) {\n        var done = false;\n        try {\n          fn(function (value) {\n            if (done) {\n              return;\n            }\n            done = true;\n            onFulfilled(value);\n          }, function (reason) {\n            if (done) {\n              return;\n            }\n            done = true;\n            onRejected(reason);\n          });\n        } catch (ex) {\n          if (done) {\n            return;\n          }\n          done = true;\n          onRejected(ex);\n        }\n      }\n      Promise.prototype.catch = function (onRejected) {\n        return this.then(null, onRejected);\n      };\n      Promise.prototype.then = function (onFulfilled, onRejected) {\n        var me = this;\n        return new Promise(function (resolve, reject) {\n          handle.call(me, new Handler(onFulfilled, onRejected, resolve, reject));\n        });\n      };\n      Promise.all = function () {\n        var values = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          values[_i] = arguments[_i];\n        }\n        var args = Array.prototype.slice.call(values.length === 1 && isArray(values[0]) ? values[0] : values);\n        return new Promise(function (resolve, reject) {\n          if (args.length === 0) {\n            return resolve([]);\n          }\n          var remaining = args.length;\n          function res(i, val) {\n            try {\n              if (val && (typeof val === 'object' || typeof val === 'function')) {\n                var then = val.then;\n                if (typeof then === 'function') {\n                  then.call(val, function (val) {\n                    res(i, val);\n                  }, reject);\n                  return;\n                }\n              }\n              args[i] = val;\n              if (--remaining === 0) {\n                resolve(args);\n              }\n            } catch (ex) {\n              reject(ex);\n            }\n          }\n          for (var i = 0; i < args.length; i++) {\n            res(i, args[i]);\n          }\n        });\n      };\n      Promise.resolve = function (value) {\n        if (value && typeof value === 'object' && value.constructor === Promise) {\n          return value;\n        }\n        return new Promise(function (resolve) {\n          resolve(value);\n        });\n      };\n      Promise.reject = function (reason) {\n        return new Promise(function (resolve, reject) {\n          reject(reason);\n        });\n      };\n      Promise.race = function (values) {\n        return new Promise(function (resolve, reject) {\n          for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {\n            var value = values_1[_i];\n            value.then(resolve, reject);\n          }\n        });\n      };\n      return Promise;\n    };\n    var Promise$1 = window.Promise ? window.Promise : promise();\n\n    function blobToImage(blob) {\n      return new Promise$1(function (resolve, reject) {\n        var blobUrl = domGlobals.URL.createObjectURL(blob);\n        var image = new domGlobals.Image();\n        var removeListeners = function () {\n          image.removeEventListener('load', loaded);\n          image.removeEventListener('error', error);\n        };\n        function loaded() {\n          removeListeners();\n          resolve(image);\n        }\n        function error() {\n          removeListeners();\n          reject('Unable to load data of type ' + blob.type + ': ' + blobUrl);\n        }\n        image.addEventListener('load', loaded);\n        image.addEventListener('error', error);\n        image.src = blobUrl;\n        if (image.complete) {\n          loaded();\n        }\n      });\n    }\n    function dataUriToBlobSync(uri) {\n      var data = uri.split(',');\n      var matches = /data:([^;]+)/.exec(data[0]);\n      if (!matches) {\n        return Option.none();\n      }\n      var mimetype = matches[1];\n      var base64 = data[1];\n      var sliceSize = 1024;\n      var byteCharacters = domGlobals.atob(base64);\n      var bytesLength = byteCharacters.length;\n      var slicesCount = Math.ceil(bytesLength / sliceSize);\n      var byteArrays = new Array(slicesCount);\n      for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n        var begin = sliceIndex * sliceSize;\n        var end = Math.min(begin + sliceSize, bytesLength);\n        var bytes = new Array(end - begin);\n        for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\n          bytes[i] = byteCharacters[offset].charCodeAt(0);\n        }\n        byteArrays[sliceIndex] = new Uint8Array(bytes);\n      }\n      return Option.some(new domGlobals.Blob(byteArrays, { type: mimetype }));\n    }\n    function dataUriToBlob(uri) {\n      return new Promise$1(function (resolve, reject) {\n        dataUriToBlobSync(uri).fold(function () {\n          reject('uri is not base64: ' + uri);\n        }, resolve);\n      });\n    }\n    function canvasToBlob(canvas, type, quality) {\n      type = type || 'image/png';\n      if (domGlobals.HTMLCanvasElement.prototype.toBlob) {\n        return new Promise$1(function (resolve, reject) {\n          canvas.toBlob(function (blob) {\n            if (blob) {\n              resolve(blob);\n            } else {\n              reject();\n            }\n          }, type, quality);\n        });\n      } else {\n        return dataUriToBlob(canvas.toDataURL(type, quality));\n      }\n    }\n    function canvasToDataURL(canvas, type, quality) {\n      type = type || 'image/png';\n      return canvas.toDataURL(type, quality);\n    }\n    function blobToCanvas(blob) {\n      return blobToImage(blob).then(function (image) {\n        revokeImageUrl(image);\n        var canvas = create$5(getWidth(image), getHeight(image));\n        var context = get2dContext(canvas);\n        context.drawImage(image, 0, 0);\n        return canvas;\n      });\n    }\n    function blobToDataUri(blob) {\n      return new Promise$1(function (resolve) {\n        var reader = new domGlobals.FileReader();\n        reader.onloadend = function () {\n          resolve(reader.result);\n        };\n        reader.readAsDataURL(blob);\n      });\n    }\n    function revokeImageUrl(image) {\n      domGlobals.URL.revokeObjectURL(image.src);\n    }\n\n    function create$6(getCanvas, blob, uri) {\n      var initialType = blob.type;\n      var getType = constant(initialType);\n      function toBlob() {\n        return Promise$1.resolve(blob);\n      }\n      function toDataURL() {\n        return uri;\n      }\n      function toBase64() {\n        return uri.split(',')[1];\n      }\n      function toAdjustedBlob(type, quality) {\n        return getCanvas.then(function (canvas) {\n          return canvasToBlob(canvas, type, quality);\n        });\n      }\n      function toAdjustedDataURL(type, quality) {\n        return getCanvas.then(function (canvas) {\n          return canvasToDataURL(canvas, type, quality);\n        });\n      }\n      function toAdjustedBase64(type, quality) {\n        return toAdjustedDataURL(type, quality).then(function (dataurl) {\n          return dataurl.split(',')[1];\n        });\n      }\n      function toCanvas() {\n        return getCanvas.then(clone$1);\n      }\n      return {\n        getType: getType,\n        toBlob: toBlob,\n        toDataURL: toDataURL,\n        toBase64: toBase64,\n        toAdjustedBlob: toAdjustedBlob,\n        toAdjustedDataURL: toAdjustedDataURL,\n        toAdjustedBase64: toAdjustedBase64,\n        toCanvas: toCanvas\n      };\n    }\n    function fromBlob(blob) {\n      return blobToDataUri(blob).then(function (uri) {\n        return create$6(blobToCanvas(blob), blob, uri);\n      });\n    }\n    function fromCanvas(canvas, type) {\n      return canvasToBlob(canvas, type).then(function (blob) {\n        return create$6(Promise$1.resolve(canvas), blob, canvas.toDataURL());\n      });\n    }\n\n    var blobToImageResult = function (blob) {\n      return fromBlob(blob);\n    };\n\n    function clamp$1(value, min, max) {\n      var parsedValue = typeof value === 'string' ? parseFloat(value) : value;\n      if (parsedValue > max) {\n        parsedValue = max;\n      } else if (parsedValue < min) {\n        parsedValue = min;\n      }\n      return parsedValue;\n    }\n    function identity$1() {\n      return [\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1\n      ];\n    }\n    var DELTA_INDEX = [\n      0,\n      0.01,\n      0.02,\n      0.04,\n      0.05,\n      0.06,\n      0.07,\n      0.08,\n      0.1,\n      0.11,\n      0.12,\n      0.14,\n      0.15,\n      0.16,\n      0.17,\n      0.18,\n      0.2,\n      0.21,\n      0.22,\n      0.24,\n      0.25,\n      0.27,\n      0.28,\n      0.3,\n      0.32,\n      0.34,\n      0.36,\n      0.38,\n      0.4,\n      0.42,\n      0.44,\n      0.46,\n      0.48,\n      0.5,\n      0.53,\n      0.56,\n      0.59,\n      0.62,\n      0.65,\n      0.68,\n      0.71,\n      0.74,\n      0.77,\n      0.8,\n      0.83,\n      0.86,\n      0.89,\n      0.92,\n      0.95,\n      0.98,\n      1,\n      1.06,\n      1.12,\n      1.18,\n      1.24,\n      1.3,\n      1.36,\n      1.42,\n      1.48,\n      1.54,\n      1.6,\n      1.66,\n      1.72,\n      1.78,\n      1.84,\n      1.9,\n      1.96,\n      2,\n      2.12,\n      2.25,\n      2.37,\n      2.5,\n      2.62,\n      2.75,\n      2.87,\n      3,\n      3.2,\n      3.4,\n      3.6,\n      3.8,\n      4,\n      4.3,\n      4.7,\n      4.9,\n      5,\n      5.5,\n      6,\n      6.5,\n      6.8,\n      7,\n      7.3,\n      7.5,\n      7.8,\n      8,\n      8.4,\n      8.7,\n      9,\n      9.4,\n      9.6,\n      9.8,\n      10\n    ];\n    function multiply(matrix1, matrix2) {\n      var col = [];\n      var out = new Array(25);\n      var val;\n      for (var i = 0; i < 5; i++) {\n        for (var j = 0; j < 5; j++) {\n          col[j] = matrix2[j + i * 5];\n        }\n        for (var j = 0; j < 5; j++) {\n          val = 0;\n          for (var k = 0; k < 5; k++) {\n            val += matrix1[j + k * 5] * col[k];\n          }\n          out[j + i * 5] = val;\n        }\n      }\n      return out;\n    }\n    function adjustContrast(matrix, value) {\n      var x;\n      value = clamp$1(value, -1, 1);\n      value *= 100;\n      if (value < 0) {\n        x = 127 + value / 100 * 127;\n      } else {\n        x = value % 1;\n        if (x === 0) {\n          x = DELTA_INDEX[value];\n        } else {\n          x = DELTA_INDEX[Math.floor(value)] * (1 - x) + DELTA_INDEX[Math.floor(value) + 1] * x;\n        }\n        x = x * 127 + 127;\n      }\n      return multiply(matrix, [\n        x / 127,\n        0,\n        0,\n        0,\n        0.5 * (127 - x),\n        0,\n        x / 127,\n        0,\n        0,\n        0.5 * (127 - x),\n        0,\n        0,\n        x / 127,\n        0,\n        0.5 * (127 - x),\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1\n      ]);\n    }\n    function adjustBrightness(matrix, value) {\n      value = clamp$1(255 * value, -255, 255);\n      return multiply(matrix, [\n        1,\n        0,\n        0,\n        0,\n        value,\n        0,\n        1,\n        0,\n        0,\n        value,\n        0,\n        0,\n        1,\n        0,\n        value,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1\n      ]);\n    }\n    function adjustColors(matrix, adjustR, adjustG, adjustB) {\n      adjustR = clamp$1(adjustR, 0, 2);\n      adjustG = clamp$1(adjustG, 0, 2);\n      adjustB = clamp$1(adjustB, 0, 2);\n      return multiply(matrix, [\n        adjustR,\n        0,\n        0,\n        0,\n        0,\n        0,\n        adjustG,\n        0,\n        0,\n        0,\n        0,\n        0,\n        adjustB,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1\n      ]);\n    }\n\n    function colorFilter(ir, matrix) {\n      return ir.toCanvas().then(function (canvas) {\n        return applyColorFilter(canvas, ir.getType(), matrix);\n      });\n    }\n    function applyColorFilter(canvas, type, matrix) {\n      var context = get2dContext(canvas);\n      function applyMatrix(pixelsData, m) {\n        var r, g, b, a;\n        var data = pixelsData.data, m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], m4 = m[4], m5 = m[5], m6 = m[6], m7 = m[7], m8 = m[8], m9 = m[9], m10 = m[10], m11 = m[11], m12 = m[12], m13 = m[13], m14 = m[14], m15 = m[15], m16 = m[16], m17 = m[17], m18 = m[18], m19 = m[19];\n        for (var i = 0; i < data.length; i += 4) {\n          r = data[i];\n          g = data[i + 1];\n          b = data[i + 2];\n          a = data[i + 3];\n          data[i] = r * m0 + g * m1 + b * m2 + a * m3 + m4;\n          data[i + 1] = r * m5 + g * m6 + b * m7 + a * m8 + m9;\n          data[i + 2] = r * m10 + g * m11 + b * m12 + a * m13 + m14;\n          data[i + 3] = r * m15 + g * m16 + b * m17 + a * m18 + m19;\n        }\n        return pixelsData;\n      }\n      var pixels = applyMatrix(context.getImageData(0, 0, canvas.width, canvas.height), matrix);\n      context.putImageData(pixels, 0, 0);\n      return fromCanvas(canvas, type);\n    }\n    function convoluteFilter(ir, matrix) {\n      return ir.toCanvas().then(function (canvas) {\n        return applyConvoluteFilter(canvas, ir.getType(), matrix);\n      });\n    }\n    function applyConvoluteFilter(canvas, type, matrix) {\n      var context = get2dContext(canvas);\n      function applyMatrix(pIn, pOut, aMatrix) {\n        function clamp(value, min, max) {\n          if (value > max) {\n            value = max;\n          } else if (value < min) {\n            value = min;\n          }\n          return value;\n        }\n        var side = Math.round(Math.sqrt(aMatrix.length));\n        var halfSide = Math.floor(side / 2);\n        var rgba = pIn.data;\n        var drgba = pOut.data;\n        var w = pIn.width;\n        var h = pIn.height;\n        for (var y = 0; y < h; y++) {\n          for (var x = 0; x < w; x++) {\n            var r = 0;\n            var g = 0;\n            var b = 0;\n            for (var cy = 0; cy < side; cy++) {\n              for (var cx = 0; cx < side; cx++) {\n                var scx = clamp(x + cx - halfSide, 0, w - 1);\n                var scy = clamp(y + cy - halfSide, 0, h - 1);\n                var innerOffset = (scy * w + scx) * 4;\n                var wt = aMatrix[cy * side + cx];\n                r += rgba[innerOffset] * wt;\n                g += rgba[innerOffset + 1] * wt;\n                b += rgba[innerOffset + 2] * wt;\n              }\n            }\n            var offset = (y * w + x) * 4;\n            drgba[offset] = clamp(r, 0, 255);\n            drgba[offset + 1] = clamp(g, 0, 255);\n            drgba[offset + 2] = clamp(b, 0, 255);\n          }\n        }\n        return pOut;\n      }\n      var pixelsIn = context.getImageData(0, 0, canvas.width, canvas.height);\n      var pixelsOut = context.getImageData(0, 0, canvas.width, canvas.height);\n      pixelsOut = applyMatrix(pixelsIn, pixelsOut, matrix);\n      context.putImageData(pixelsOut, 0, 0);\n      return fromCanvas(canvas, type);\n    }\n    function functionColorFilter(colorFn) {\n      var filterImpl = function (canvas, type, value) {\n        var context = get2dContext(canvas);\n        var lookup = new Array(256);\n        function applyLookup(pixelsData, lookupData) {\n          var data = pixelsData.data;\n          for (var i = 0; i < data.length; i += 4) {\n            data[i] = lookupData[data[i]];\n            data[i + 1] = lookupData[data[i + 1]];\n            data[i + 2] = lookupData[data[i + 2]];\n          }\n          return pixelsData;\n        }\n        for (var i = 0; i < lookup.length; i++) {\n          lookup[i] = colorFn(i, value);\n        }\n        var pixels = applyLookup(context.getImageData(0, 0, canvas.width, canvas.height), lookup);\n        context.putImageData(pixels, 0, 0);\n        return fromCanvas(canvas, type);\n      };\n      return function (ir, value) {\n        return ir.toCanvas().then(function (canvas) {\n          return filterImpl(canvas, ir.getType(), value);\n        });\n      };\n    }\n    function complexAdjustableColorFilter(matrixAdjustFn) {\n      return function (ir, adjust) {\n        return colorFilter(ir, matrixAdjustFn(identity$1(), adjust));\n      };\n    }\n    function basicColorFilter(matrix) {\n      return function (ir) {\n        return colorFilter(ir, matrix);\n      };\n    }\n    function basicConvolutionFilter(kernel) {\n      return function (ir) {\n        return convoluteFilter(ir, kernel);\n      };\n    }\n    var invert = basicColorFilter([\n      -1,\n      0,\n      0,\n      0,\n      255,\n      0,\n      -1,\n      0,\n      0,\n      255,\n      0,\n      0,\n      -1,\n      0,\n      255,\n      0,\n      0,\n      0,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1\n    ]);\n    var brightness = complexAdjustableColorFilter(adjustBrightness);\n    var contrast = complexAdjustableColorFilter(adjustContrast);\n    var colorize = function (ir, adjustR, adjustG, adjustB) {\n      return colorFilter(ir, adjustColors(identity$1(), adjustR, adjustG, adjustB));\n    };\n    var sharpen = basicConvolutionFilter([\n      0,\n      -1,\n      0,\n      -1,\n      5,\n      -1,\n      0,\n      -1,\n      0\n    ]);\n    var gamma = functionColorFilter(function (color, value) {\n      return Math.pow(color / 255, 1 - value) * 255;\n    });\n\n    function scale(image, dW, dH) {\n      var sW = getWidth(image);\n      var sH = getHeight(image);\n      var wRatio = dW / sW;\n      var hRatio = dH / sH;\n      var scaleCapped = false;\n      if (wRatio < 0.5 || wRatio > 2) {\n        wRatio = wRatio < 0.5 ? 0.5 : 2;\n        scaleCapped = true;\n      }\n      if (hRatio < 0.5 || hRatio > 2) {\n        hRatio = hRatio < 0.5 ? 0.5 : 2;\n        scaleCapped = true;\n      }\n      var scaled = _scale(image, wRatio, hRatio);\n      return !scaleCapped ? scaled : scaled.then(function (tCanvas) {\n        return scale(tCanvas, dW, dH);\n      });\n    }\n    function _scale(image, wRatio, hRatio) {\n      return new Promise$1(function (resolve) {\n        var sW = getWidth(image);\n        var sH = getHeight(image);\n        var dW = Math.floor(sW * wRatio);\n        var dH = Math.floor(sH * hRatio);\n        var canvas = create$5(dW, dH);\n        var context = get2dContext(canvas);\n        context.drawImage(image, 0, 0, sW, sH, 0, 0, dW, dH);\n        resolve(canvas);\n      });\n    }\n\n    function rotate(ir, angle) {\n      return ir.toCanvas().then(function (canvas) {\n        return applyRotate(canvas, ir.getType(), angle);\n      });\n    }\n    function applyRotate(image, type, angle) {\n      var canvas = create$5(image.width, image.height);\n      var context = get2dContext(canvas);\n      var translateX = 0;\n      var translateY = 0;\n      angle = angle < 0 ? 360 + angle : angle;\n      if (angle === 90 || angle === 270) {\n        resize(canvas, canvas.height, canvas.width);\n      }\n      if (angle === 90 || angle === 180) {\n        translateX = canvas.width;\n      }\n      if (angle === 270 || angle === 180) {\n        translateY = canvas.height;\n      }\n      context.translate(translateX, translateY);\n      context.rotate(angle * Math.PI / 180);\n      context.drawImage(image, 0, 0);\n      return fromCanvas(canvas, type);\n    }\n    function flip(ir, axis) {\n      return ir.toCanvas().then(function (canvas) {\n        return applyFlip(canvas, ir.getType(), axis);\n      });\n    }\n    function applyFlip(image, type, axis) {\n      var canvas = create$5(image.width, image.height);\n      var context = get2dContext(canvas);\n      if (axis === 'v') {\n        context.scale(1, -1);\n        context.drawImage(image, 0, -canvas.height);\n      } else {\n        context.scale(-1, 1);\n        context.drawImage(image, -canvas.width, 0);\n      }\n      return fromCanvas(canvas, type);\n    }\n    function crop(ir, x, y, w, h) {\n      return ir.toCanvas().then(function (canvas) {\n        return applyCrop(canvas, ir.getType(), x, y, w, h);\n      });\n    }\n    function applyCrop(image, type, x, y, w, h) {\n      var canvas = create$5(w, h);\n      var context = get2dContext(canvas);\n      context.drawImage(image, -x, -y);\n      return fromCanvas(canvas, type);\n    }\n    function resize$1(ir, w, h) {\n      return ir.toCanvas().then(function (canvas) {\n        return scale(canvas, w, h).then(function (newCanvas) {\n          return fromCanvas(newCanvas, ir.getType());\n        });\n      });\n    }\n\n    var invert$1 = function (ir) {\n      return invert(ir);\n    };\n    var sharpen$1 = function (ir) {\n      return sharpen(ir);\n    };\n    var gamma$1 = function (ir, value) {\n      return gamma(ir, value);\n    };\n    var colorize$1 = function (ir, adjustR, adjustG, adjustB) {\n      return colorize(ir, adjustR, adjustG, adjustB);\n    };\n    var brightness$1 = function (ir, adjust) {\n      return brightness(ir, adjust);\n    };\n    var contrast$1 = function (ir, adjust) {\n      return contrast(ir, adjust);\n    };\n    var flip$1 = function (ir, axis) {\n      return flip(ir, axis);\n    };\n    var crop$1 = function (ir, x, y, w, h) {\n      return crop(ir, x, y, w, h);\n    };\n    var resize$2 = function (ir, w, h) {\n      return resize$1(ir, w, h);\n    };\n    var rotate$1 = function (ir, angle) {\n      return rotate(ir, angle);\n    };\n\n    var renderIcon$1 = function (iconHtml, behaviours) {\n      return __assign({\n        dom: {\n          tag: 'span',\n          innerHtml: iconHtml,\n          classes: [\n            'tox-icon',\n            'tox-tbtn__icon-wrap'\n          ]\n        }\n      }, behaviours);\n    };\n    var renderIconFromPack = function (iconName, iconsProvider) {\n      return renderIcon$1(get$d(iconName, iconsProvider), {});\n    };\n    var renderReplacableIconFromPack = function (iconName, iconsProvider) {\n      return renderIcon$1(get$d(iconName, iconsProvider), { behaviours: derive$1([Replacing.config({})]) });\n    };\n    var renderLabel$1 = function (text, prefix, providersBackstage) {\n      return {\n        dom: {\n          tag: 'span',\n          innerHtml: providersBackstage.translate(text),\n          classes: [prefix + '__select-label']\n        },\n        behaviours: derive$1([Replacing.config({})])\n      };\n    };\n\n    var internalToolbarButtonExecute = generate$1('toolbar.button.execute');\n    var onToolbarButtonExecute = function (info) {\n      return runOnExecute(function (comp, simulatedEvent) {\n        runWithApi(info, comp)(function (itemApi) {\n          emitWith(comp, internalToolbarButtonExecute, { buttonApi: itemApi });\n          info.onAction(itemApi);\n        });\n      });\n    };\n    var toolbarButtonEventOrder = {\n      'alloy.execute': [\n        'disabling',\n        'alloy.base.behaviour',\n        'toggling',\n        'toolbar-button-events'\n      ]\n    };\n\n    var updateMenuText = generate$1('update-menu-text');\n    var updateMenuIcon = generate$1('update-menu-icon');\n    var renderCommonDropdown = function (spec, prefix, sharedBackstage) {\n      var editorOffCell = Cell(noop);\n      var optMemDisplayText = spec.text.map(function (text) {\n        return record(renderLabel$1(text, prefix, sharedBackstage.providers));\n      });\n      var optMemDisplayIcon = spec.icon.map(function (iconName) {\n        return record(renderReplacableIconFromPack(iconName, sharedBackstage.providers.icons));\n      });\n      var onLeftOrRightInMenu = function (comp, se) {\n        var dropdown = Representing.getValue(comp);\n        Focusing.focus(dropdown);\n        emitWith(dropdown, 'keydown', { raw: se.event().raw() });\n        Dropdown.close(dropdown);\n        return Option.some(true);\n      };\n      var role = spec.role.fold(function () {\n        return {};\n      }, function (role) {\n        return { role: role };\n      });\n      var tooltipAttributes = spec.tooltip.fold(function () {\n        return {};\n      }, function (tooltip) {\n        var translatedTooltip = sharedBackstage.providers.translate(tooltip);\n        return {\n          'title': translatedTooltip,\n          'aria-label': translatedTooltip\n        };\n      });\n      var memDropdown = record(Dropdown.sketch(__assign(__assign({}, role), {\n        dom: {\n          tag: 'button',\n          classes: [\n            prefix,\n            prefix + '--select'\n          ].concat(map(spec.classes, function (c) {\n            return prefix + '--' + c;\n          })),\n          attributes: __assign({}, tooltipAttributes)\n        },\n        components: componentRenderPipeline([\n          optMemDisplayIcon.map(function (mem) {\n            return mem.asSpec();\n          }),\n          optMemDisplayText.map(function (mem) {\n            return mem.asSpec();\n          }),\n          Option.some({\n            dom: {\n              tag: 'div',\n              classes: [prefix + '__select-chevron'],\n              innerHtml: get$d('chevron-down', sharedBackstage.providers.icons)\n            }\n          })\n        ]),\n        matchWidth: true,\n        useMinWidth: true,\n        dropdownBehaviours: derive$1(__spreadArrays(spec.dropdownBehaviours, [\n          DisablingConfigs.button(spec.disabled),\n          Unselecting.config({}),\n          Replacing.config({}),\n          config('dropdown-events', [\n            onControlAttached(spec, editorOffCell),\n            onControlDetached(spec, editorOffCell)\n          ]),\n          config('menubutton-update-display-text', [\n            run(updateMenuText, function (comp, se) {\n              optMemDisplayText.bind(function (mem) {\n                return mem.getOpt(comp);\n              }).each(function (displayText) {\n                Replacing.set(displayText, [text(sharedBackstage.providers.translate(se.event().text()))]);\n              });\n            }),\n            run(updateMenuIcon, function (comp, se) {\n              optMemDisplayIcon.bind(function (mem) {\n                return mem.getOpt(comp);\n              }).each(function (displayIcon) {\n                Replacing.set(displayIcon, [renderReplacableIconFromPack(se.event().icon(), sharedBackstage.providers.icons)]);\n              });\n            })\n          ])\n        ])),\n        eventOrder: deepMerge(toolbarButtonEventOrder, {\n          mousedown: [\n            'focusing',\n            'alloy.base.behaviour',\n            'item-type-events',\n            'normal-dropdown-events'\n          ]\n        }),\n        sandboxBehaviours: derive$1([Keying.config({\n            mode: 'special',\n            onLeft: onLeftOrRightInMenu,\n            onRight: onLeftOrRightInMenu\n          })]),\n        lazySink: sharedBackstage.getSink,\n        toggleClass: prefix + '--active',\n        parts: { menu: part(false, spec.columns, spec.presets) },\n        fetch: function () {\n          return Future.nu(spec.fetch);\n        }\n      })));\n      return memDropdown.asSpec();\n    };\n\n    var isMenuItemReference = function (item) {\n      return isString(item);\n    };\n    var isSeparator = function (item) {\n      return item.type === 'separator';\n    };\n    var isExpandingMenuItem = function (item) {\n      return has(item, 'getSubmenuItems');\n    };\n    var separator$1 = { type: 'separator' };\n    var unwrapReferences = function (items, menuItems) {\n      var realItems = foldl(items, function (acc, item) {\n        if (isMenuItemReference(item)) {\n          if (item === '') {\n            return acc;\n          } else if (item === '|') {\n            return acc.length > 0 && !isSeparator(acc[acc.length - 1]) ? acc.concat([separator$1]) : acc;\n          } else if (has(menuItems, item.toLowerCase())) {\n            return acc.concat([menuItems[item.toLowerCase()]]);\n          } else {\n            return acc;\n          }\n        } else {\n          return acc.concat([item]);\n        }\n      }, []);\n      if (realItems.length > 0 && isSeparator(realItems[realItems.length - 1])) {\n        realItems.pop();\n      }\n      return realItems;\n    };\n    var getFromExpandingItem = function (item, menuItems) {\n      var submenuItems = item.getSubmenuItems();\n      var rest = expand(submenuItems, menuItems);\n      var newMenus = deepMerge(rest.menus, wrap$1(item.value, rest.items));\n      var newExpansions = deepMerge(rest.expansions, wrap$1(item.value, item.value));\n      return {\n        item: item,\n        menus: newMenus,\n        expansions: newExpansions\n      };\n    };\n    var getFromItem = function (item, menuItems) {\n      return isExpandingMenuItem(item) ? getFromExpandingItem(item, menuItems) : {\n        item: item,\n        menus: {},\n        expansions: {}\n      };\n    };\n    var generateValueIfRequired = function (item) {\n      if (isSeparator(item)) {\n        return item;\n      } else {\n        var itemValue = get(item, 'value').getOrThunk(function () {\n          return generate$1('generated-menu-item');\n        });\n        return deepMerge({ value: itemValue }, item);\n      }\n    };\n    var expand = function (items, menuItems) {\n      var realItems = unwrapReferences(isString(items) ? items.split(' ') : items, menuItems);\n      return foldr(realItems, function (acc, item) {\n        var itemWithValue = generateValueIfRequired(item);\n        var newData = getFromItem(itemWithValue, menuItems);\n        return {\n          menus: deepMerge(acc.menus, newData.menus),\n          items: [newData.item].concat(acc.items),\n          expansions: deepMerge(acc.expansions, newData.expansions)\n        };\n      }, {\n        menus: {},\n        expansions: {},\n        items: []\n      });\n    };\n\n    var build$2 = function (items, itemResponse, backstage, isHorizontalMenu) {\n      var primary = generate$1('primary-menu');\n      var data = expand(items, backstage.shared.providers.menuItems());\n      if (data.items.length === 0) {\n        return Option.none();\n      }\n      var mainMenu = createPartialMenu(primary, data.items, itemResponse, backstage, isHorizontalMenu);\n      var submenus = map$1(data.menus, function (menuItems, menuName) {\n        return createPartialMenu(menuName, menuItems, itemResponse, backstage, false);\n      });\n      var menus = deepMerge(submenus, wrap$1(primary, mainMenu));\n      return Option.from(tieredMenu.tieredData(primary, menus, data.expansions));\n    };\n\n    var getMenuButtonApi = function (component) {\n      return {\n        isDisabled: function () {\n          return Disabling.isDisabled(component);\n        },\n        setDisabled: function (state) {\n          return Disabling.set(component, state);\n        },\n        setActive: function (state) {\n          var elm = component.element();\n          if (state) {\n            add$2(elm, 'tox-tbtn--enabled');\n            set$1(elm, 'aria-pressed', true);\n          } else {\n            remove$4(elm, 'tox-tbtn--enabled');\n            remove$1(elm, 'aria-pressed');\n          }\n        },\n        isActive: function () {\n          return has$2(component.element(), 'tox-tbtn--enabled');\n        }\n      };\n    };\n    var renderMenuButton = function (spec, prefix, backstage, role) {\n      return renderCommonDropdown({\n        text: spec.text,\n        icon: spec.icon,\n        tooltip: spec.tooltip,\n        role: role,\n        fetch: function (callback) {\n          spec.fetch(function (items) {\n            callback(build$2(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false));\n          });\n        },\n        onSetup: spec.onSetup,\n        getApi: getMenuButtonApi,\n        columns: 1,\n        presets: 'normal',\n        classes: [],\n        dropdownBehaviours: [Tabstopping.config({})]\n      }, prefix, backstage.shared);\n    };\n    var getFetch$1 = function (items, getButton, backstage) {\n      var getMenuItemAction = function (item) {\n        return function (api) {\n          var newValue = !api.isActive();\n          api.setActive(newValue);\n          item.storage.set(newValue);\n          backstage.shared.getSink().each(function (sink) {\n            getButton().getOpt(sink).each(function (orig) {\n              focus$1(orig.element());\n              emitWith(orig, formActionEvent, {\n                name: item.name,\n                value: item.storage.get()\n              });\n            });\n          });\n        };\n      };\n      var getMenuItemSetup = function (item) {\n        return function (api) {\n          api.setActive(item.storage.get());\n        };\n      };\n      return function (success) {\n        success(map(items, function (item) {\n          var text = item.text.fold(function () {\n            return {};\n          }, function (text) {\n            return { text: text };\n          });\n          return __assign(__assign({\n            type: item.type,\n            active: false\n          }, text), {\n            onAction: getMenuItemAction(item),\n            onSetup: getMenuItemSetup(item)\n          });\n        }));\n      };\n    };\n\n    var renderCommonSpec = function (spec, actionOpt, extraBehaviours, dom, components) {\n      if (extraBehaviours === void 0) {\n        extraBehaviours = [];\n      }\n      var action = actionOpt.fold(function () {\n        return {};\n      }, function (action) {\n        return { action: action };\n      });\n      var common = __assign({\n        buttonBehaviours: derive$1([\n          DisablingConfigs.button(spec.disabled),\n          Tabstopping.config({}),\n          config('button press', [\n            preventDefault('click'),\n            preventDefault('mousedown')\n          ])\n        ].concat(extraBehaviours)),\n        eventOrder: {\n          click: [\n            'button press',\n            'alloy.base.behaviour'\n          ],\n          mousedown: [\n            'button press',\n            'alloy.base.behaviour'\n          ]\n        }\n      }, action);\n      var domFinal = deepMerge(common, { dom: dom });\n      return deepMerge(domFinal, { components: components });\n    };\n    var renderIconButtonSpec = function (spec, action, providersBackstage, extraBehaviours) {\n      if (extraBehaviours === void 0) {\n        extraBehaviours = [];\n      }\n      var tooltipAttributes = spec.tooltip.map(function (tooltip) {\n        return {\n          'aria-label': providersBackstage.translate(tooltip),\n          'title': providersBackstage.translate(tooltip)\n        };\n      }).getOr({});\n      var dom = {\n        tag: 'button',\n        classes: ['tox-tbtn'],\n        attributes: tooltipAttributes\n      };\n      var icon = spec.icon.map(function (iconName) {\n        return renderIconFromPack(iconName, providersBackstage.icons);\n      });\n      var components = componentRenderPipeline([icon]);\n      return renderCommonSpec(spec, action, extraBehaviours, dom, components);\n    };\n    var renderIconButton = function (spec, action, providersBackstage, extraBehaviours) {\n      if (extraBehaviours === void 0) {\n        extraBehaviours = [];\n      }\n      var iconButtonSpec = renderIconButtonSpec(spec, Option.some(action), providersBackstage, extraBehaviours);\n      return Button.sketch(iconButtonSpec);\n    };\n    var renderButtonSpec = function (spec, action, providersBackstage, extraBehaviours, extraClasses) {\n      if (extraBehaviours === void 0) {\n        extraBehaviours = [];\n      }\n      if (extraClasses === void 0) {\n        extraClasses = [];\n      }\n      var translatedText = providersBackstage.translate(spec.text);\n      var icon = spec.icon ? spec.icon.map(function (iconName) {\n        return renderIconFromPack(iconName, providersBackstage.icons);\n      }) : Option.none();\n      var components = icon.isSome() ? componentRenderPipeline([icon]) : [];\n      var innerHtml = icon.isSome() ? {} : { innerHtml: translatedText };\n      var classes = __spreadArrays(!spec.primary && !spec.borderless ? [\n        'tox-button',\n        'tox-button--secondary'\n      ] : ['tox-button'], icon.isSome() ? ['tox-button--icon'] : [], spec.borderless ? ['tox-button--naked'] : [], extraClasses);\n      var dom = __assign(__assign({\n        tag: 'button',\n        classes: classes\n      }, innerHtml), { attributes: { title: translatedText } });\n      return renderCommonSpec(spec, action, extraBehaviours, dom, components);\n    };\n    var renderButton = function (spec, action, providersBackstage, extraBehaviours, extraClasses) {\n      if (extraBehaviours === void 0) {\n        extraBehaviours = [];\n      }\n      if (extraClasses === void 0) {\n        extraClasses = [];\n      }\n      var buttonSpec = renderButtonSpec(spec, Option.some(action), providersBackstage, extraBehaviours, extraClasses);\n      return Button.sketch(buttonSpec);\n    };\n    var getAction = function (name, buttonType) {\n      return function (comp) {\n        if (buttonType === 'custom') {\n          emitWith(comp, formActionEvent, {\n            name: name,\n            value: {}\n          });\n        } else if (buttonType === 'submit') {\n          emit(comp, formSubmitEvent);\n        } else if (buttonType === 'cancel') {\n          emit(comp, formCancelEvent);\n        } else {\n          domGlobals.console.error('Unknown button type: ', buttonType);\n        }\n      };\n    };\n    var isMenuFooterButtonSpec = function (spec, buttonType) {\n      return buttonType === 'menu';\n    };\n    var isNormalFooterButtonSpec = function (spec, buttonType) {\n      return buttonType === 'custom' || buttonType === 'cancel' || buttonType === 'submit';\n    };\n    var renderFooterButton = function (spec, buttonType, backstage) {\n      if (isMenuFooterButtonSpec(spec, buttonType)) {\n        var getButton = function () {\n          return memButton_1;\n        };\n        var menuButtonSpec = spec;\n        var fixedSpec = __assign(__assign({}, spec), {\n          onSetup: function (api) {\n            api.setDisabled(spec.disabled);\n            return noop;\n          },\n          fetch: getFetch$1(menuButtonSpec.items, getButton, backstage)\n        });\n        var memButton_1 = record(renderMenuButton(fixedSpec, 'tox-tbtn', backstage, Option.none()));\n        return memButton_1.asSpec();\n      } else if (isNormalFooterButtonSpec(spec, buttonType)) {\n        var action = getAction(spec.name, buttonType);\n        var buttonSpec = __assign(__assign({}, spec), { borderless: false });\n        return renderButton(buttonSpec, action, backstage.shared.providers, []);\n      } else {\n        domGlobals.console.error('Unknown footer button type: ', buttonType);\n      }\n    };\n    var renderDialogButton = function (spec, providersBackstage) {\n      var action = getAction(spec.name, 'custom');\n      return renderFormField(Option.none(), FormField.parts().field(__assign({ factory: Button }, renderButtonSpec(spec, Option.some(action), providersBackstage, [\n        RepresentingConfigs.memory(''),\n        ComposingConfigs.self()\n      ]))));\n    };\n\n    var schema$i = constant([\n      defaulted$1('field1Name', 'field1'),\n      defaulted$1('field2Name', 'field2'),\n      onStrictHandler('onLockedChange'),\n      markers(['lockClass']),\n      defaulted$1('locked', false),\n      SketchBehaviours.field('coupledFieldBehaviours', [\n        Composing,\n        Representing\n      ])\n    ]);\n    var getField = function (comp, detail, partName) {\n      return getPart(comp, detail, partName).bind(Composing.getCurrent);\n    };\n    var coupledPart = function (selfName, otherName) {\n      return required({\n        factory: FormField,\n        name: selfName,\n        overrides: function (detail) {\n          return {\n            fieldBehaviours: derive$1([config('coupled-input-behaviour', [run(input(), function (me) {\n                  getField(me, detail, otherName).each(function (other) {\n                    getPart(me, detail, 'lock').each(function (lock) {\n                      if (Toggling.isOn(lock)) {\n                        detail.onLockedChange(me, other, lock);\n                      }\n                    });\n                  });\n                })])])\n          };\n        }\n      });\n    };\n    var parts$5 = constant([\n      coupledPart('field1', 'field2'),\n      coupledPart('field2', 'field1'),\n      required({\n        factory: Button,\n        schema: [strict$1('dom')],\n        name: 'lock',\n        overrides: function (detail) {\n          return {\n            buttonBehaviours: derive$1([Toggling.config({\n                selected: detail.locked,\n                toggleClass: detail.markers.lockClass,\n                aria: { mode: 'pressed' }\n              })])\n          };\n        }\n      })\n    ]);\n\n    var factory$7 = function (detail, components, spec, externals) {\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: SketchBehaviours.augment(detail.coupledFieldBehaviours, [\n          Composing.config({ find: Option.some }),\n          Representing.config({\n            store: {\n              mode: 'manual',\n              getValue: function (comp) {\n                var _a;\n                var parts = getPartsOrDie(comp, detail, [\n                  'field1',\n                  'field2'\n                ]);\n                return _a = {}, _a[detail.field1Name] = Representing.getValue(parts.field1()), _a[detail.field2Name] = Representing.getValue(parts.field2()), _a;\n              },\n              setValue: function (comp, value) {\n                var parts = getPartsOrDie(comp, detail, [\n                  'field1',\n                  'field2'\n                ]);\n                if (hasNonNullableKey(value, detail.field1Name)) {\n                  Representing.setValue(parts.field1(), value[detail.field1Name]);\n                }\n                if (hasNonNullableKey(value, detail.field2Name)) {\n                  Representing.setValue(parts.field2(), value[detail.field2Name]);\n                }\n              }\n            }\n          })\n        ]),\n        apis: {\n          getField1: function (component) {\n            return getPart(component, detail, 'field1');\n          },\n          getField2: function (component) {\n            return getPart(component, detail, 'field2');\n          },\n          getLock: function (component) {\n            return getPart(component, detail, 'lock');\n          }\n        }\n      };\n    };\n    var FormCoupledInputs = composite$1({\n      name: 'FormCoupledInputs',\n      configFields: schema$i(),\n      partFields: parts$5(),\n      factory: factory$7,\n      apis: {\n        getField1: function (apis, component) {\n          return apis.getField1(component);\n        },\n        getField2: function (apis, component) {\n          return apis.getField2(component);\n        },\n        getLock: function (apis, component) {\n          return apis.getLock(component);\n        }\n      }\n    });\n\n    var formatSize = function (size) {\n      var unitDec = {\n        '': 0,\n        'px': 0,\n        'pt': 1,\n        'mm': 1,\n        'pc': 2,\n        'ex': 2,\n        'em': 2,\n        'ch': 2,\n        'rem': 2,\n        'cm': 3,\n        'in': 4,\n        '%': 4\n      };\n      var maxDecimal = function (unit) {\n        return unit in unitDec ? unitDec[unit] : 1;\n      };\n      var numText = size.value.toFixed(maxDecimal(size.unit));\n      if (numText.indexOf('.') !== -1) {\n        numText = numText.replace(/\\.?0*$/, '');\n      }\n      return numText + size.unit;\n    };\n    var parseSize = function (sizeText) {\n      var numPattern = /^\\s*(\\d+(?:\\.\\d+)?)\\s*(|cm|mm|in|px|pt|pc|em|ex|ch|rem|vw|vh|vmin|vmax|%)\\s*$/;\n      var match = numPattern.exec(sizeText);\n      if (match !== null) {\n        var value = parseFloat(match[1]);\n        var unit = match[2];\n        return Result.value({\n          value: value,\n          unit: unit\n        });\n      } else {\n        return Result.error(sizeText);\n      }\n    };\n    var convertUnit = function (size, unit) {\n      var inInch = {\n        '': 96,\n        'px': 96,\n        'pt': 72,\n        'cm': 2.54,\n        'pc': 12,\n        'mm': 25.4,\n        'in': 1\n      };\n      var supported = function (u) {\n        return Object.prototype.hasOwnProperty.call(inInch, u);\n      };\n      if (size.unit === unit) {\n        return Option.some(size.value);\n      } else if (supported(size.unit) && supported(unit)) {\n        if (inInch[size.unit] === inInch[unit]) {\n          return Option.some(size.value);\n        } else {\n          return Option.some(size.value / inInch[size.unit] * inInch[unit]);\n        }\n      } else {\n        return Option.none();\n      }\n    };\n    var noSizeConversion = function (input) {\n      return Option.none();\n    };\n    var ratioSizeConversion = function (scale, unit) {\n      return function (size) {\n        return convertUnit(size, unit).map(function (value) {\n          return {\n            value: value * scale,\n            unit: unit\n          };\n        });\n      };\n    };\n    var makeRatioConverter = function (currentFieldText, otherFieldText) {\n      var cValue = parseSize(currentFieldText).toOption();\n      var oValue = parseSize(otherFieldText).toOption();\n      return lift2(cValue, oValue, function (cSize, oSize) {\n        return convertUnit(cSize, oSize.unit).map(function (val) {\n          return oSize.value / val;\n        }).map(function (r) {\n          return ratioSizeConversion(r, oSize.unit);\n        }).getOr(noSizeConversion);\n      }).getOr(noSizeConversion);\n    };\n\n    var renderSizeInput = function (spec, providersBackstage) {\n      var converter = noSizeConversion;\n      var ratioEvent = generate$1('ratio-event');\n      var pLock = FormCoupledInputs.parts().lock({\n        dom: {\n          tag: 'button',\n          classes: [\n            'tox-lock',\n            'tox-button',\n            'tox-button--naked',\n            'tox-button--icon'\n          ],\n          attributes: { title: providersBackstage.translate(spec.label.getOr('Constrain proportions')) }\n        },\n        components: [\n          {\n            dom: {\n              tag: 'span',\n              classes: [\n                'tox-icon',\n                'tox-lock-icon__lock'\n              ],\n              innerHtml: get$d('lock', providersBackstage.icons)\n            }\n          },\n          {\n            dom: {\n              tag: 'span',\n              classes: [\n                'tox-icon',\n                'tox-lock-icon__unlock'\n              ],\n              innerHtml: get$d('unlock', providersBackstage.icons)\n            }\n          }\n        ],\n        buttonBehaviours: derive$1([\n          DisablingConfigs.button(spec.disabled),\n          Tabstopping.config({})\n        ])\n      });\n      var formGroup = function (components) {\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-form__group']\n          },\n          components: components\n        };\n      };\n      var getFieldPart = function (isField1) {\n        return FormField.parts().field({\n          factory: Input,\n          inputClasses: ['tox-textfield'],\n          inputBehaviours: derive$1([\n            Disabling.config({ disabled: spec.disabled }),\n            Tabstopping.config({}),\n            config('size-input-events', [\n              run(focusin(), function (component, simulatedEvent) {\n                emitWith(component, ratioEvent, { isField1: isField1 });\n              }),\n              run(change(), function (component, simulatedEvent) {\n                emitWith(component, formChangeEvent, { name: spec.name });\n              })\n            ])\n          ]),\n          selectOnFocus: false\n        });\n      };\n      var getLabel = function (label) {\n        return {\n          dom: {\n            tag: 'label',\n            classes: ['tox-label'],\n            innerHtml: providersBackstage.translate(label)\n          }\n        };\n      };\n      var widthField = FormCoupledInputs.parts().field1(formGroup([\n        FormField.parts().label(getLabel('Width')),\n        getFieldPart(true)\n      ]));\n      var heightField = FormCoupledInputs.parts().field2(formGroup([\n        FormField.parts().label(getLabel('Height')),\n        getFieldPart(false)\n      ]));\n      return FormCoupledInputs.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-form__controls-h-stack']\n            },\n            components: [\n              widthField,\n              heightField,\n              formGroup([\n                getLabel('&nbsp;'),\n                pLock\n              ])\n            ]\n          }],\n        field1Name: 'width',\n        field2Name: 'height',\n        locked: true,\n        markers: { lockClass: 'tox-locked' },\n        onLockedChange: function (current, other, lock) {\n          parseSize(Representing.getValue(current)).each(function (size) {\n            converter(size).each(function (newSize) {\n              Representing.setValue(other, formatSize(newSize));\n            });\n          });\n        },\n        coupledFieldBehaviours: derive$1([\n          Disabling.config({\n            disabled: spec.disabled,\n            onDisabled: function (comp) {\n              FormCoupledInputs.getField1(comp).bind(FormField.getField).each(Disabling.disable);\n              FormCoupledInputs.getField2(comp).bind(FormField.getField).each(Disabling.disable);\n              FormCoupledInputs.getLock(comp).each(Disabling.disable);\n            },\n            onEnabled: function (comp) {\n              FormCoupledInputs.getField1(comp).bind(FormField.getField).each(Disabling.enable);\n              FormCoupledInputs.getField2(comp).bind(FormField.getField).each(Disabling.enable);\n              FormCoupledInputs.getLock(comp).each(Disabling.enable);\n            }\n          }),\n          config('size-input-events2', [run(ratioEvent, function (component, simulatedEvent) {\n              var isField1 = simulatedEvent.event().isField1();\n              var optCurrent = isField1 ? FormCoupledInputs.getField1(component) : FormCoupledInputs.getField2(component);\n              var optOther = isField1 ? FormCoupledInputs.getField2(component) : FormCoupledInputs.getField1(component);\n              var value1 = optCurrent.map(Representing.getValue).getOr('');\n              var value2 = optOther.map(Representing.getValue).getOr('');\n              converter = makeRatioConverter(value1, value2);\n            })])\n        ])\n      });\n    };\n\n    var undo = constant(generate$1('undo'));\n    var redo = constant(generate$1('redo'));\n    var zoom = constant(generate$1('zoom'));\n    var back = constant(generate$1('back'));\n    var apply = constant(generate$1('apply'));\n    var swap = constant(generate$1('swap'));\n    var transform = constant(generate$1('transform'));\n    var tempTransform = constant(generate$1('temp-transform'));\n    var transformApply = constant(generate$1('transform-apply'));\n    var internal = {\n      undo: undo,\n      redo: redo,\n      zoom: zoom,\n      back: back,\n      apply: apply,\n      swap: swap,\n      transform: transform,\n      tempTransform: tempTransform,\n      transformApply: transformApply\n    };\n    var saveState = constant('save-state');\n    var disable$1 = constant('disable');\n    var enable$1 = constant('enable');\n    var external$2 = {\n      formActionEvent: formActionEvent,\n      saveState: saveState,\n      disable: disable$1,\n      enable: enable$1\n    };\n\n    var renderEditPanel = function (imagePanel, providersBackstage) {\n      var createButton = function (text, action, disabled, primary) {\n        return record(renderButton({\n          name: text,\n          text: text,\n          disabled: disabled,\n          primary: primary,\n          icon: Option.none(),\n          borderless: false\n        }, action, providersBackstage));\n      };\n      var createIconButton = function (icon, tooltip, action, disabled) {\n        return record(renderIconButton({\n          name: icon,\n          icon: Option.some(icon),\n          tooltip: Option.some(tooltip),\n          disabled: disabled,\n          primary: false,\n          borderless: false\n        }, action, providersBackstage));\n      };\n      var disableAllComponents = function (comps, eventcomp) {\n        comps.map(function (mem) {\n          var component = mem.get(eventcomp);\n          if (component.hasConfigured(Disabling)) {\n            Disabling.disable(component);\n          }\n        });\n      };\n      var enableAllComponents = function (comps, eventcomp) {\n        comps.map(function (mem) {\n          var component = mem.get(eventcomp);\n          if (component.hasConfigured(Disabling)) {\n            Disabling.enable(component);\n          }\n        });\n      };\n      var panelDom = {\n        tag: 'div',\n        classes: [\n          'tox-image-tools__toolbar',\n          'tox-image-tools-edit-panel'\n        ]\n      };\n      var noop$1 = noop;\n      var emit$1 = function (comp, event, data) {\n        emitWith(comp, event, data);\n      };\n      var emitDisable = function (component) {\n        return emit(component, external$2.disable());\n      };\n      var emitEnable = function (component) {\n        return emit(component, external$2.enable());\n      };\n      var emitTransform = function (comp, transform) {\n        emitDisable(comp);\n        emit$1(comp, internal.transform(), { transform: transform });\n        emitEnable(comp);\n      };\n      var emitTempTransform = function (comp, transform) {\n        emitDisable(comp);\n        emit$1(comp, internal.tempTransform(), { transform: transform });\n        emitEnable(comp);\n      };\n      var getBackSwap = function (anyInSystem) {\n        return function () {\n          memContainer.getOpt(anyInSystem).each(function (container) {\n            Replacing.set(container, [ButtonPanel]);\n          });\n        };\n      };\n      var emitTransformApply = function (comp, transform) {\n        emitDisable(comp);\n        emit$1(comp, internal.transformApply(), {\n          transform: transform,\n          swap: getBackSwap(comp)\n        });\n        emitEnable(comp);\n      };\n      var createBackButton = function () {\n        return createButton('Back', function (button) {\n          return emit$1(button, internal.back(), { swap: getBackSwap(button) });\n        }, false, false);\n      };\n      var createSpacer = function () {\n        return record({\n          dom: {\n            tag: 'div',\n            classes: ['tox-spacer']\n          },\n          behaviours: derive$1([Disabling.config({})])\n        });\n      };\n      var createApplyButton = function () {\n        return createButton('Apply', function (button) {\n          return emit$1(button, internal.apply(), { swap: getBackSwap(button) });\n        }, true, true);\n      };\n      var makeCropTransform = function () {\n        return function (ir) {\n          var rect = imagePanel.getRect();\n          return crop$1(ir, rect.x, rect.y, rect.w, rect.h);\n        };\n      };\n      var cropPanelComponents = [\n        createBackButton(),\n        createSpacer(),\n        createButton('Apply', function (button) {\n          var transform = makeCropTransform();\n          emitTransformApply(button, transform);\n          imagePanel.hideCrop();\n        }, false, true)\n      ];\n      var CropPanel = Container.sketch({\n        dom: panelDom,\n        components: cropPanelComponents.map(function (mem) {\n          return mem.asSpec();\n        }),\n        containerBehaviours: derive$1([config('image-tools-crop-buttons-events', [\n            run(external$2.disable(), function (comp, se) {\n              disableAllComponents(cropPanelComponents, comp);\n            }),\n            run(external$2.enable(), function (comp, se) {\n              enableAllComponents(cropPanelComponents, comp);\n            })\n          ])])\n      });\n      var memSize = record(renderSizeInput({\n        name: 'size',\n        label: Option.none(),\n        constrain: true,\n        disabled: false\n      }, providersBackstage));\n      var makeResizeTransform = function (width, height) {\n        return function (ir) {\n          return resize$2(ir, width, height);\n        };\n      };\n      var resizePanelComponents = [\n        createBackButton(),\n        createSpacer(),\n        memSize,\n        createSpacer(),\n        createButton('Apply', function (button) {\n          memSize.getOpt(button).each(function (sizeInput) {\n            var value = Representing.getValue(sizeInput);\n            var width = parseInt(value.width, 10);\n            var height = parseInt(value.height, 10);\n            var transform = makeResizeTransform(width, height);\n            emitTransformApply(button, transform);\n          });\n        }, false, true)\n      ];\n      var ResizePanel = Container.sketch({\n        dom: panelDom,\n        components: resizePanelComponents.map(function (mem) {\n          return mem.asSpec();\n        }),\n        containerBehaviours: derive$1([config('image-tools-resize-buttons-events', [\n            run(external$2.disable(), function (comp, se) {\n              disableAllComponents(resizePanelComponents, comp);\n            }),\n            run(external$2.enable(), function (comp, se) {\n              enableAllComponents(resizePanelComponents, comp);\n            })\n          ])])\n      });\n      var makeValueTransform = function (transform, value) {\n        return function (ir) {\n          return transform(ir, value);\n        };\n      };\n      var horizontalFlip = makeValueTransform(flip$1, 'h');\n      var verticalFlip = makeValueTransform(flip$1, 'v');\n      var counterclockwiseRotate = makeValueTransform(rotate$1, -90);\n      var clockwiseRotate = makeValueTransform(rotate$1, 90);\n      var flipRotateOnAction = function (comp, operation) {\n        emitTempTransform(comp, operation);\n      };\n      var flipRotateComponents = [\n        createBackButton(),\n        createSpacer(),\n        createIconButton('flip-horizontally', 'Flip horizontally', function (button) {\n          flipRotateOnAction(button, horizontalFlip);\n        }, false),\n        createIconButton('flip-vertically', 'Flip vertically', function (button) {\n          flipRotateOnAction(button, verticalFlip);\n        }, false),\n        createIconButton('rotate-left', 'Rotate counterclockwise', function (button) {\n          flipRotateOnAction(button, counterclockwiseRotate);\n        }, false),\n        createIconButton('rotate-right', 'Rotate clockwise', function (button) {\n          flipRotateOnAction(button, clockwiseRotate);\n        }, false),\n        createSpacer(),\n        createApplyButton()\n      ];\n      var FlipRotatePanel = Container.sketch({\n        dom: panelDom,\n        components: flipRotateComponents.map(function (mem) {\n          return mem.asSpec();\n        }),\n        containerBehaviours: derive$1([config('image-tools-fliprotate-buttons-events', [\n            run(external$2.disable(), function (comp, se) {\n              disableAllComponents(flipRotateComponents, comp);\n            }),\n            run(external$2.enable(), function (comp, se) {\n              enableAllComponents(flipRotateComponents, comp);\n            })\n          ])])\n      });\n      var makeSlider = function (label, onChoose, min, value, max) {\n        var labelPart = Slider.parts().label({\n          dom: {\n            tag: 'label',\n            classes: ['tox-label'],\n            innerHtml: providersBackstage.translate(label)\n          }\n        });\n        var spectrum = Slider.parts().spectrum({\n          dom: {\n            tag: 'div',\n            classes: ['tox-slider__rail'],\n            attributes: { role: 'presentation' }\n          }\n        });\n        var thumb = Slider.parts().thumb({\n          dom: {\n            tag: 'div',\n            classes: ['tox-slider__handle'],\n            attributes: { role: 'presentation' }\n          }\n        });\n        return record(Slider.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-slider'],\n            attributes: { role: 'presentation' }\n          },\n          model: {\n            mode: 'x',\n            minX: min,\n            maxX: max,\n            getInitialValue: constant({ x: constant(value) })\n          },\n          components: [\n            labelPart,\n            spectrum,\n            thumb\n          ],\n          sliderBehaviours: derive$1([Focusing.config({})]),\n          onChoose: onChoose\n        }));\n      };\n      var makeVariableSlider = function (label, transform, min, value, max) {\n        var onChoose = function (slider, thumb, value) {\n          var valTransform = makeValueTransform(transform, value.x() / 100);\n          emitTransform(slider, valTransform);\n        };\n        return makeSlider(label, onChoose, min, value, max);\n      };\n      var variableFilterPanelComponents = function (label, transform, min, value, max) {\n        return [\n          createBackButton(),\n          makeVariableSlider(label, transform, min, value, max),\n          createApplyButton()\n        ];\n      };\n      var createVariableFilterPanel = function (label, transform, min, value, max) {\n        var filterPanelComponents = variableFilterPanelComponents(label, transform, min, value, max);\n        return Container.sketch({\n          dom: panelDom,\n          components: filterPanelComponents.map(function (mem) {\n            return mem.asSpec();\n          }),\n          containerBehaviours: derive$1([config('image-tools-filter-panel-buttons-events', [\n              run(external$2.disable(), function (comp, se) {\n                disableAllComponents(filterPanelComponents, comp);\n              }),\n              run(external$2.enable(), function (comp, se) {\n                enableAllComponents(filterPanelComponents, comp);\n              })\n            ])])\n        });\n      };\n      var filterPanelComponents = [\n        createBackButton(),\n        createSpacer(),\n        createApplyButton()\n      ];\n      var FilterPanel = Container.sketch({\n        dom: panelDom,\n        components: filterPanelComponents.map(function (mem) {\n          return mem.asSpec();\n        })\n      });\n      var BrightnessPanel = createVariableFilterPanel('Brightness', brightness$1, -100, 0, 100);\n      var ContrastPanel = createVariableFilterPanel('Contrast', contrast$1, -100, 0, 100);\n      var GammaPanel = createVariableFilterPanel('Gamma', gamma$1, -100, 0, 100);\n      var makeColorTransform = function (red, green, blue) {\n        return function (ir) {\n          return colorize$1(ir, red, green, blue);\n        };\n      };\n      var makeColorSlider = function (label) {\n        var onChoose = function (slider, thumb, value) {\n          var redOpt = memRed.getOpt(slider);\n          var blueOpt = memBlue.getOpt(slider);\n          var greenOpt = memGreen.getOpt(slider);\n          redOpt.each(function (red) {\n            blueOpt.each(function (blue) {\n              greenOpt.each(function (green) {\n                var r = Representing.getValue(red).x() / 100;\n                var g = Representing.getValue(green).x() / 100;\n                var b = Representing.getValue(blue).x() / 100;\n                var transform = makeColorTransform(r, g, b);\n                emitTransform(slider, transform);\n              });\n            });\n          });\n        };\n        return makeSlider(label, onChoose, 0, 100, 200);\n      };\n      var memRed = makeColorSlider('R');\n      var memGreen = makeColorSlider('G');\n      var memBlue = makeColorSlider('B');\n      var colorizePanelComponents = [\n        createBackButton(),\n        memRed,\n        memGreen,\n        memBlue,\n        createApplyButton()\n      ];\n      var ColorizePanel = Container.sketch({\n        dom: panelDom,\n        components: colorizePanelComponents.map(function (mem) {\n          return mem.asSpec();\n        })\n      });\n      var getTransformPanelEvent = function (panel, transform, update) {\n        return function (button) {\n          var swap = function () {\n            memContainer.getOpt(button).each(function (container) {\n              Replacing.set(container, [panel]);\n              update(container);\n            });\n          };\n          emit$1(button, internal.swap(), {\n            transform: transform,\n            swap: swap\n          });\n        };\n      };\n      var cropPanelUpdate = function (_anyInSystem) {\n        imagePanel.showCrop();\n      };\n      var resizePanelUpdate = function (anyInSystem) {\n        memSize.getOpt(anyInSystem).each(function (sizeInput) {\n          var measurements = imagePanel.getMeasurements();\n          var width = measurements.width;\n          var height = measurements.height;\n          Representing.setValue(sizeInput, {\n            width: width,\n            height: height\n          });\n        });\n      };\n      var sharpenTransform = Option.some(sharpen$1);\n      var invertTransform = Option.some(invert$1);\n      var buttonPanelComponents = [\n        createIconButton('crop', 'Crop', getTransformPanelEvent(CropPanel, Option.none(), cropPanelUpdate), false),\n        createIconButton('resize', 'Resize', getTransformPanelEvent(ResizePanel, Option.none(), resizePanelUpdate), false),\n        createIconButton('orientation', 'Orientation', getTransformPanelEvent(FlipRotatePanel, Option.none(), noop$1), false),\n        createIconButton('brightness', 'Brightness', getTransformPanelEvent(BrightnessPanel, Option.none(), noop$1), false),\n        createIconButton('sharpen', 'Sharpen', getTransformPanelEvent(FilterPanel, sharpenTransform, noop$1), false),\n        createIconButton('contrast', 'Contrast', getTransformPanelEvent(ContrastPanel, Option.none(), noop$1), false),\n        createIconButton('color-levels', 'Color levels', getTransformPanelEvent(ColorizePanel, Option.none(), noop$1), false),\n        createIconButton('gamma', 'Gamma', getTransformPanelEvent(GammaPanel, Option.none(), noop$1), false),\n        createIconButton('invert', 'Invert', getTransformPanelEvent(FilterPanel, invertTransform, noop$1), false)\n      ];\n      var ButtonPanel = Container.sketch({\n        dom: panelDom,\n        components: buttonPanelComponents.map(function (mem) {\n          return mem.asSpec();\n        })\n      });\n      var container = Container.sketch({\n        dom: { tag: 'div' },\n        components: [ButtonPanel],\n        containerBehaviours: derive$1([Replacing.config({})])\n      });\n      var memContainer = record(container);\n      var getApplyButton = function (anyInSystem) {\n        return memContainer.getOpt(anyInSystem).map(function (container) {\n          var panel = container.components()[0];\n          return panel.components()[panel.components().length - 1];\n        });\n      };\n      return {\n        memContainer: memContainer,\n        getApplyButton: getApplyButton\n      };\n    };\n\n    var global$b = tinymce.util.Tools.resolve('tinymce.dom.DomQuery');\n\n    var global$c = tinymce.util.Tools.resolve('tinymce.geom.Rect');\n\n    var global$d = tinymce.util.Tools.resolve('tinymce.util.Observable');\n\n    var global$e = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var global$f = tinymce.util.Tools.resolve('tinymce.util.VK');\n\n    function getDocumentSize(doc) {\n      var documentElement, body, scrollWidth, clientWidth;\n      var offsetWidth, scrollHeight, clientHeight, offsetHeight;\n      var max = Math.max;\n      documentElement = doc.documentElement;\n      body = doc.body;\n      scrollWidth = max(documentElement.scrollWidth, body.scrollWidth);\n      clientWidth = max(documentElement.clientWidth, body.clientWidth);\n      offsetWidth = max(documentElement.offsetWidth, body.offsetWidth);\n      scrollHeight = max(documentElement.scrollHeight, body.scrollHeight);\n      clientHeight = max(documentElement.clientHeight, body.clientHeight);\n      offsetHeight = max(documentElement.offsetHeight, body.offsetHeight);\n      return {\n        width: scrollWidth < offsetWidth ? clientWidth : scrollWidth,\n        height: scrollHeight < offsetHeight ? clientHeight : scrollHeight\n      };\n    }\n    function updateWithTouchData(e) {\n      var keys, i;\n      if (e.changedTouches) {\n        keys = 'screenX screenY pageX pageY clientX clientY'.split(' ');\n        for (i = 0; i < keys.length; i++) {\n          e[keys[i]] = e.changedTouches[0][keys[i]];\n        }\n      }\n    }\n    function DragHelper (id, settings) {\n      var $eventOverlay;\n      var doc = settings.document || domGlobals.document;\n      var downButton;\n      var start, stop, drag, startX, startY;\n      settings = settings || {};\n      var handleElement = doc.getElementById(settings.handle || id);\n      start = function (e) {\n        var docSize = getDocumentSize(doc);\n        var handleElm, cursor;\n        updateWithTouchData(e);\n        e.preventDefault();\n        downButton = e.button;\n        handleElm = handleElement;\n        startX = e.screenX;\n        startY = e.screenY;\n        if (domGlobals.window.getComputedStyle) {\n          cursor = domGlobals.window.getComputedStyle(handleElm, null).getPropertyValue('cursor');\n        } else {\n          cursor = handleElm.runtimeStyle.cursor;\n        }\n        $eventOverlay = global$b('<div></div>').css({\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          width: docSize.width,\n          height: docSize.height,\n          zIndex: 2147483647,\n          opacity: 0.0001,\n          cursor: cursor\n        }).appendTo(doc.body);\n        global$b(doc).on('mousemove touchmove', drag).on('mouseup touchend', stop);\n        settings.start(e);\n      };\n      drag = function (e) {\n        updateWithTouchData(e);\n        if (e.button !== downButton) {\n          return stop(e);\n        }\n        e.deltaX = e.screenX - startX;\n        e.deltaY = e.screenY - startY;\n        e.preventDefault();\n        settings.drag(e);\n      };\n      stop = function (e) {\n        updateWithTouchData(e);\n        global$b(doc).off('mousemove touchmove', drag).off('mouseup touchend', stop);\n        $eventOverlay.remove();\n        if (settings.stop) {\n          settings.stop(e);\n        }\n      };\n      this.destroy = function () {\n        global$b(handleElement).off();\n      };\n      global$b(handleElement).on('mousedown touchstart', start);\n    }\n\n    var count = 0;\n    var create$7 = function (currentRect, viewPortRect, clampRect, containerElm, action) {\n      var instance;\n      var dragHelpers;\n      var blockers;\n      var prefix = 'tox-';\n      var id = prefix + 'crid-' + count++;\n      var handles = [\n        {\n          name: 'move',\n          xMul: 0,\n          yMul: 0,\n          deltaX: 1,\n          deltaY: 1,\n          deltaW: 0,\n          deltaH: 0,\n          label: 'Crop Mask'\n        },\n        {\n          name: 'nw',\n          xMul: 0,\n          yMul: 0,\n          deltaX: 1,\n          deltaY: 1,\n          deltaW: -1,\n          deltaH: -1,\n          label: 'Top Left Crop Handle'\n        },\n        {\n          name: 'ne',\n          xMul: 1,\n          yMul: 0,\n          deltaX: 0,\n          deltaY: 1,\n          deltaW: 1,\n          deltaH: -1,\n          label: 'Top Right Crop Handle'\n        },\n        {\n          name: 'sw',\n          xMul: 0,\n          yMul: 1,\n          deltaX: 1,\n          deltaY: 0,\n          deltaW: -1,\n          deltaH: 1,\n          label: 'Bottom Left Crop Handle'\n        },\n        {\n          name: 'se',\n          xMul: 1,\n          yMul: 1,\n          deltaX: 0,\n          deltaY: 0,\n          deltaW: 1,\n          deltaH: 1,\n          label: 'Bottom Right Crop Handle'\n        }\n      ];\n      blockers = [\n        'top',\n        'right',\n        'bottom',\n        'left'\n      ];\n      var getAbsoluteRect = function (outerRect, relativeRect) {\n        return {\n          x: relativeRect.x + outerRect.x,\n          y: relativeRect.y + outerRect.y,\n          w: relativeRect.w,\n          h: relativeRect.h\n        };\n      };\n      var getRelativeRect = function (outerRect, innerRect) {\n        return {\n          x: innerRect.x - outerRect.x,\n          y: innerRect.y - outerRect.y,\n          w: innerRect.w,\n          h: innerRect.h\n        };\n      };\n      var getInnerRect = function () {\n        return getRelativeRect(clampRect, currentRect);\n      };\n      function moveRect(handle, startRect, deltaX, deltaY) {\n        var x, y, w, h, rect;\n        x = startRect.x;\n        y = startRect.y;\n        w = startRect.w;\n        h = startRect.h;\n        x += deltaX * handle.deltaX;\n        y += deltaY * handle.deltaY;\n        w += deltaX * handle.deltaW;\n        h += deltaY * handle.deltaH;\n        if (w < 20) {\n          w = 20;\n        }\n        if (h < 20) {\n          h = 20;\n        }\n        rect = currentRect = global$c.clamp({\n          x: x,\n          y: y,\n          w: w,\n          h: h\n        }, clampRect, handle.name === 'move');\n        rect = getRelativeRect(clampRect, rect);\n        instance.fire('updateRect', { rect: rect });\n        setInnerRect(rect);\n      }\n      function render() {\n        function createDragHelper(handle) {\n          var startRect;\n          return new DragHelper(id, {\n            document: containerElm.ownerDocument,\n            handle: id + '-' + handle.name,\n            start: function () {\n              startRect = currentRect;\n            },\n            drag: function (e) {\n              moveRect(handle, startRect, e.deltaX, e.deltaY);\n            }\n          });\n        }\n        global$b('<div id=\"' + id + '\" class=\"' + prefix + 'croprect-container\"' + ' role=\"grid\" aria-dropeffect=\"execute\">').appendTo(containerElm);\n        global$e.each(blockers, function (blocker) {\n          global$b('#' + id, containerElm).append('<div id=\"' + id + '-' + blocker + '\"class=\"' + prefix + 'croprect-block\" style=\"display: none\" data-mce-bogus=\"all\">');\n        });\n        global$e.each(handles, function (handle) {\n          global$b('#' + id, containerElm).append('<div id=\"' + id + '-' + handle.name + '\" class=\"' + prefix + 'croprect-handle ' + prefix + 'croprect-handle-' + handle.name + '\"' + 'style=\"display: none\" data-mce-bogus=\"all\" role=\"gridcell\" tabindex=\"-1\"' + ' aria-label=\"' + handle.label + '\" aria-grabbed=\"false\" title=\"' + handle.label + '\">');\n        });\n        dragHelpers = global$e.map(handles, createDragHelper);\n        repaint(currentRect);\n        global$b(containerElm).on('focusin focusout', function (e) {\n          global$b(e.target).attr('aria-grabbed', e.type === 'focus' ? 'true' : 'false');\n        });\n        global$b(containerElm).on('keydown', function (e) {\n          var activeHandle;\n          global$e.each(handles, function (handle) {\n            if (e.target.id === id + '-' + handle.name) {\n              activeHandle = handle;\n              return false;\n            }\n          });\n          function moveAndBlock(evt, handle, startRect, deltaX, deltaY) {\n            evt.stopPropagation();\n            evt.preventDefault();\n            moveRect(activeHandle, startRect, deltaX, deltaY);\n          }\n          switch (e.keyCode) {\n          case global$f.LEFT:\n            moveAndBlock(e, activeHandle, currentRect, -10, 0);\n            break;\n          case global$f.RIGHT:\n            moveAndBlock(e, activeHandle, currentRect, 10, 0);\n            break;\n          case global$f.UP:\n            moveAndBlock(e, activeHandle, currentRect, 0, -10);\n            break;\n          case global$f.DOWN:\n            moveAndBlock(e, activeHandle, currentRect, 0, 10);\n            break;\n          case global$f.ENTER:\n          case global$f.SPACEBAR:\n            e.preventDefault();\n            action();\n            break;\n          }\n        });\n      }\n      function toggleVisibility(state) {\n        var selectors;\n        selectors = global$e.map(handles, function (handle) {\n          return '#' + id + '-' + handle.name;\n        }).concat(global$e.map(blockers, function (blocker) {\n          return '#' + id + '-' + blocker;\n        })).join(',');\n        if (state) {\n          global$b(selectors, containerElm).show();\n        } else {\n          global$b(selectors, containerElm).hide();\n        }\n      }\n      function repaint(rect) {\n        function updateElementRect(name, rect) {\n          if (rect.h < 0) {\n            rect.h = 0;\n          }\n          if (rect.w < 0) {\n            rect.w = 0;\n          }\n          global$b('#' + id + '-' + name, containerElm).css({\n            left: rect.x,\n            top: rect.y,\n            width: rect.w,\n            height: rect.h\n          });\n        }\n        global$e.each(handles, function (handle) {\n          global$b('#' + id + '-' + handle.name, containerElm).css({\n            left: rect.w * handle.xMul + rect.x,\n            top: rect.h * handle.yMul + rect.y\n          });\n        });\n        updateElementRect('top', {\n          x: viewPortRect.x,\n          y: viewPortRect.y,\n          w: viewPortRect.w,\n          h: rect.y - viewPortRect.y\n        });\n        updateElementRect('right', {\n          x: rect.x + rect.w,\n          y: rect.y,\n          w: viewPortRect.w - rect.x - rect.w + viewPortRect.x,\n          h: rect.h\n        });\n        updateElementRect('bottom', {\n          x: viewPortRect.x,\n          y: rect.y + rect.h,\n          w: viewPortRect.w,\n          h: viewPortRect.h - rect.y - rect.h + viewPortRect.y\n        });\n        updateElementRect('left', {\n          x: viewPortRect.x,\n          y: rect.y,\n          w: rect.x - viewPortRect.x,\n          h: rect.h\n        });\n        updateElementRect('move', rect);\n      }\n      function setRect(rect) {\n        currentRect = rect;\n        repaint(currentRect);\n      }\n      function setViewPortRect(rect) {\n        viewPortRect = rect;\n        repaint(currentRect);\n      }\n      function setInnerRect(rect) {\n        setRect(getAbsoluteRect(clampRect, rect));\n      }\n      function setClampRect(rect) {\n        clampRect = rect;\n        repaint(currentRect);\n      }\n      function destroy() {\n        global$e.each(dragHelpers, function (helper) {\n          helper.destroy();\n        });\n        dragHelpers = [];\n      }\n      render();\n      instance = global$e.extend({\n        toggleVisibility: toggleVisibility,\n        setClampRect: setClampRect,\n        setRect: setRect,\n        getInnerRect: getInnerRect,\n        setInnerRect: setInnerRect,\n        setViewPortRect: setViewPortRect,\n        destroy: destroy\n      }, global$d);\n      return instance;\n    };\n    var CropRect = { create: create$7 };\n\n    var loadImage = function (image) {\n      return new global$6(function (resolve) {\n        var loaded = function () {\n          image.removeEventListener('load', loaded);\n          resolve(image);\n        };\n        if (image.complete) {\n          resolve(image);\n        } else {\n          image.addEventListener('load', loaded);\n        }\n      });\n    };\n    var renderImagePanel = function (initialUrl) {\n      var memBg = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-image-tools__image-bg'],\n          attributes: { role: 'presentation' }\n        }\n      });\n      var zoomState = Cell(1);\n      var cropRect = Cell(Option.none());\n      var rectState = Cell({\n        x: 0,\n        y: 0,\n        w: 1,\n        h: 1\n      });\n      var viewRectState = Cell({\n        x: 0,\n        y: 0,\n        w: 1,\n        h: 1\n      });\n      var repaintImg = function (anyInSystem, img) {\n        memContainer.getOpt(anyInSystem).each(function (panel) {\n          var zoom = zoomState.get();\n          var panelW = get$7(panel.element());\n          var panelH = get$6(panel.element());\n          var width = img.dom().naturalWidth * zoom;\n          var height = img.dom().naturalHeight * zoom;\n          var left = Math.max(0, panelW / 2 - width / 2);\n          var top = Math.max(0, panelH / 2 - height / 2);\n          var css = {\n            left: left.toString() + 'px',\n            top: top.toString() + 'px',\n            width: width.toString() + 'px',\n            height: height.toString() + 'px',\n            position: 'absolute'\n          };\n          setAll$1(img, css);\n          memBg.getOpt(panel).each(function (bg) {\n            setAll$1(bg.element(), css);\n          });\n          cropRect.get().each(function (cRect) {\n            var rect = rectState.get();\n            cRect.setRect({\n              x: rect.x * zoom + left,\n              y: rect.y * zoom + top,\n              w: rect.w * zoom,\n              h: rect.h * zoom\n            });\n            cRect.setClampRect({\n              x: left,\n              y: top,\n              w: width,\n              h: height\n            });\n            cRect.setViewPortRect({\n              x: 0,\n              y: 0,\n              w: panelW,\n              h: panelH\n            });\n          });\n        });\n      };\n      var zoomFit = function (anyInSystem, img) {\n        memContainer.getOpt(anyInSystem).each(function (panel) {\n          var panelW = get$7(panel.element());\n          var panelH = get$6(panel.element());\n          var width = img.dom().naturalWidth;\n          var height = img.dom().naturalHeight;\n          var zoom = Math.min(panelW / width, panelH / height);\n          if (zoom >= 1) {\n            zoomState.set(1);\n          } else {\n            zoomState.set(zoom);\n          }\n        });\n      };\n      var updateSrc = function (anyInSystem, url) {\n        var img = Element.fromTag('img');\n        set$1(img, 'src', url);\n        return loadImage(img.dom()).then(function () {\n          return memContainer.getOpt(anyInSystem).map(function (panel) {\n            var aImg = external({ element: img });\n            Replacing.replaceAt(panel, 1, Option.some(aImg));\n            var lastViewRect = viewRectState.get();\n            var viewRect = {\n              x: 0,\n              y: 0,\n              w: img.dom().naturalWidth,\n              h: img.dom().naturalHeight\n            };\n            viewRectState.set(viewRect);\n            var rect = global$c.inflate(viewRect, -20, -20);\n            rectState.set(rect);\n            if (lastViewRect.w !== viewRect.w || lastViewRect.h !== viewRect.h) {\n              zoomFit(panel, img);\n            }\n            repaintImg(panel, img);\n            return img;\n          });\n        });\n      };\n      var zoom = function (anyInSystem, direction) {\n        var currentZoom = zoomState.get();\n        var newZoom = direction > 0 ? Math.min(2, currentZoom + 0.1) : Math.max(0.1, currentZoom - 0.1);\n        zoomState.set(newZoom);\n        memContainer.getOpt(anyInSystem).each(function (panel) {\n          var img = panel.components()[1].element();\n          repaintImg(panel, img);\n        });\n      };\n      var showCrop = function () {\n        cropRect.get().each(function (cRect) {\n          cRect.toggleVisibility(true);\n        });\n      };\n      var hideCrop = function () {\n        cropRect.get().each(function (cRect) {\n          cRect.toggleVisibility(false);\n        });\n      };\n      var getRect = function () {\n        return rectState.get();\n      };\n      var container = Container.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-image-tools__image']\n        },\n        components: [\n          memBg.asSpec(),\n          {\n            dom: {\n              tag: 'img',\n              attributes: { src: initialUrl }\n            }\n          },\n          {\n            dom: { tag: 'div' },\n            behaviours: derive$1([config('image-panel-crop-events', [runOnAttached(function (comp) {\n                  memContainer.getOpt(comp).each(function (container) {\n                    var el = container.element().dom();\n                    var cRect = CropRect.create({\n                      x: 10,\n                      y: 10,\n                      w: 100,\n                      h: 100\n                    }, {\n                      x: 0,\n                      y: 0,\n                      w: 200,\n                      h: 200\n                    }, {\n                      x: 0,\n                      y: 0,\n                      w: 200,\n                      h: 200\n                    }, el, function () {\n                    });\n                    cRect.toggleVisibility(false);\n                    cRect.on('updateRect', function (e) {\n                      var rect = e.rect;\n                      var zoom = zoomState.get();\n                      var newRect = {\n                        x: Math.round(rect.x / zoom),\n                        y: Math.round(rect.y / zoom),\n                        w: Math.round(rect.w / zoom),\n                        h: Math.round(rect.h / zoom)\n                      };\n                      rectState.set(newRect);\n                    });\n                    cropRect.set(Option.some(cRect));\n                  });\n                })])])\n          }\n        ],\n        containerBehaviours: derive$1([\n          Replacing.config({}),\n          config('image-panel-events', [runOnAttached(function (comp) {\n              updateSrc(comp, initialUrl);\n            })])\n        ])\n      });\n      var memContainer = record(container);\n      var getMeasurements = function () {\n        var viewRect = viewRectState.get();\n        return {\n          width: viewRect.w,\n          height: viewRect.h\n        };\n      };\n      return {\n        memContainer: memContainer,\n        updateSrc: updateSrc,\n        zoom: zoom,\n        showCrop: showCrop,\n        hideCrop: hideCrop,\n        getRect: getRect,\n        getMeasurements: getMeasurements\n      };\n    };\n\n    var createButton = function (innerHtml, icon, disabled, action, providersBackstage) {\n      return renderIconButton({\n        name: innerHtml,\n        icon: Option.some(icon),\n        disabled: disabled,\n        tooltip: Option.some(innerHtml),\n        primary: false,\n        borderless: false\n      }, action, providersBackstage);\n    };\n    var setButtonEnabled = function (button, enabled) {\n      if (enabled) {\n        Disabling.enable(button);\n      } else {\n        Disabling.disable(button);\n      }\n    };\n    var renderSideBar = function (providersBackstage) {\n      var updateButtonUndoStates = function (anyInSystem, undoEnabled, redoEnabled) {\n        memUndo.getOpt(anyInSystem).each(function (undo) {\n          setButtonEnabled(undo, undoEnabled);\n        });\n        memRedo.getOpt(anyInSystem).each(function (redo) {\n          setButtonEnabled(redo, redoEnabled);\n        });\n      };\n      var memUndo = record(createButton('Undo', 'undo', true, function (button) {\n        emitWith(button, internal.undo(), { direction: 1 });\n      }, providersBackstage));\n      var memRedo = record(createButton('Redo', 'redo', true, function (button) {\n        emitWith(button, internal.redo(), { direction: 1 });\n      }, providersBackstage));\n      var container = Container.sketch({\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-image-tools__toolbar',\n            'tox-image-tools__sidebar'\n          ]\n        },\n        components: [\n          memUndo.asSpec(),\n          memRedo.asSpec(),\n          createButton('Zoom in', 'zoom-in', false, function (button) {\n            emitWith(button, internal.zoom(), { direction: 1 });\n          }, providersBackstage),\n          createButton('Zoom out', 'zoom-out', false, function (button) {\n            emitWith(button, internal.zoom(), { direction: -1 });\n          }, providersBackstage)\n        ]\n      });\n      return {\n        container: container,\n        updateButtonUndoStates: updateButtonUndoStates\n      };\n    };\n\n    function UndoStack () {\n      var data = [];\n      var index = -1;\n      function add(state) {\n        var removed;\n        removed = data.splice(++index);\n        data.push(state);\n        return {\n          state: state,\n          removed: removed\n        };\n      }\n      function undo() {\n        if (canUndo()) {\n          return data[--index];\n        }\n      }\n      function redo() {\n        if (canRedo()) {\n          return data[++index];\n        }\n      }\n      function canUndo() {\n        return index > 0;\n      }\n      function canRedo() {\n        return index !== -1 && index < data.length - 1;\n      }\n      return {\n        data: data,\n        add: add,\n        undo: undo,\n        redo: redo,\n        canUndo: canUndo,\n        canRedo: canRedo\n      };\n    }\n\n    var makeState = function (initialState) {\n      var blobState = Cell(initialState);\n      var tempState = Cell(Option.none());\n      var undoStack = UndoStack();\n      undoStack.add(initialState);\n      var getBlobState = function () {\n        return blobState.get();\n      };\n      var setBlobState = function (state) {\n        blobState.set(state);\n      };\n      var getTempState = function () {\n        return tempState.get().fold(function () {\n          return blobState.get();\n        }, function (temp) {\n          return temp;\n        });\n      };\n      var updateTempState = function (blob) {\n        var newTempState = createState(blob);\n        destroyTempState();\n        tempState.set(Option.some(newTempState));\n        return newTempState.url;\n      };\n      var createState = function (blob) {\n        return {\n          blob: blob,\n          url: domGlobals.URL.createObjectURL(blob)\n        };\n      };\n      var destroyState = function (state) {\n        domGlobals.URL.revokeObjectURL(state.url);\n      };\n      var destroyStates = function (states) {\n        global$e.each(states, destroyState);\n      };\n      var destroyTempState = function () {\n        tempState.get().each(destroyState);\n        tempState.set(Option.none());\n      };\n      var addBlobState = function (blob) {\n        var newState = createState(blob);\n        setBlobState(newState);\n        var removed = undoStack.add(newState).removed;\n        destroyStates(removed);\n        return newState.url;\n      };\n      var addTempState = function (blob) {\n        var newState = createState(blob);\n        tempState.set(Option.some(newState));\n        return newState.url;\n      };\n      var applyTempState = function (postApply) {\n        return tempState.get().fold(function () {\n        }, function (temp) {\n          addBlobState(temp.blob);\n          postApply();\n        });\n      };\n      var undo = function () {\n        var currentState = undoStack.undo();\n        setBlobState(currentState);\n        return currentState.url;\n      };\n      var redo = function () {\n        var currentState = undoStack.redo();\n        setBlobState(currentState);\n        return currentState.url;\n      };\n      var getHistoryStates = function () {\n        var undoEnabled = undoStack.canUndo();\n        var redoEnabled = undoStack.canRedo();\n        return {\n          undoEnabled: undoEnabled,\n          redoEnabled: redoEnabled\n        };\n      };\n      return {\n        getBlobState: getBlobState,\n        setBlobState: setBlobState,\n        addBlobState: addBlobState,\n        getTempState: getTempState,\n        updateTempState: updateTempState,\n        addTempState: addTempState,\n        applyTempState: applyTempState,\n        destroyTempState: destroyTempState,\n        undo: undo,\n        redo: redo,\n        getHistoryStates: getHistoryStates\n      };\n    };\n\n    var renderImageTools = function (detail, providersBackstage) {\n      var state = makeState(detail.currentState);\n      var zoom = function (anyInSystem, simulatedEvent) {\n        var direction = simulatedEvent.event().direction();\n        imagePanel.zoom(anyInSystem, direction);\n      };\n      var updateButtonUndoStates = function (anyInSystem) {\n        var historyStates = state.getHistoryStates();\n        sideBar.updateButtonUndoStates(anyInSystem, historyStates.undoEnabled, historyStates.redoEnabled);\n        emitWith(anyInSystem, external$2.formActionEvent, {\n          name: external$2.saveState(),\n          value: historyStates.undoEnabled\n        });\n      };\n      var disableUndoRedo = function (anyInSystem) {\n        sideBar.updateButtonUndoStates(anyInSystem, false, false);\n      };\n      var undo = function (anyInSystem, _simulatedEvent) {\n        var url = state.undo();\n        updateSrc(anyInSystem, url).then(function (oImg) {\n          unblock(anyInSystem);\n          updateButtonUndoStates(anyInSystem);\n        });\n      };\n      var redo = function (anyInSystem, _simulatedEvent) {\n        var url = state.redo();\n        updateSrc(anyInSystem, url).then(function (oImg) {\n          unblock(anyInSystem);\n          updateButtonUndoStates(anyInSystem);\n        });\n      };\n      var imageResultToBlob = function (ir) {\n        return ir.toBlob();\n      };\n      var block = function (anyInSystem) {\n        emitWith(anyInSystem, external$2.formActionEvent, {\n          name: external$2.disable(),\n          value: {}\n        });\n      };\n      var unblock = function (anyInSystem) {\n        editPanel.getApplyButton(anyInSystem).each(function (applyButton) {\n          Disabling.enable(applyButton);\n        });\n        emitWith(anyInSystem, external$2.formActionEvent, {\n          name: external$2.enable(),\n          value: {}\n        });\n      };\n      var updateSrc = function (anyInSystem, src) {\n        block(anyInSystem);\n        return imagePanel.updateSrc(anyInSystem, src);\n      };\n      var blobManipulate = function (anyInSystem, blob, filter, action, swap) {\n        block(anyInSystem);\n        return blobToImageResult(blob).then(filter).then(imageResultToBlob).then(action).then(function (url) {\n          return updateSrc(anyInSystem, url).then(function (oImg) {\n            updateButtonUndoStates(anyInSystem);\n            swap();\n            unblock(anyInSystem);\n            return oImg;\n          });\n        }).catch(function (err) {\n          domGlobals.console.log(err);\n          unblock(anyInSystem);\n          return err;\n        });\n      };\n      var manipulate = function (anyInSystem, filter, swap) {\n        var blob = state.getBlobState().blob;\n        var action = function (blob) {\n          return state.updateTempState(blob);\n        };\n        blobManipulate(anyInSystem, blob, filter, action, swap);\n      };\n      var tempManipulate = function (anyInSystem, filter) {\n        var blob = state.getTempState().blob;\n        var action = function (blob) {\n          return state.addTempState(blob);\n        };\n        blobManipulate(anyInSystem, blob, filter, action, noop);\n      };\n      var manipulateApply = function (anyInSystem, filter, swap) {\n        var blob = state.getBlobState().blob;\n        var action = function (blob) {\n          var url = state.addBlobState(blob);\n          destroyTempState(anyInSystem);\n          return url;\n        };\n        blobManipulate(anyInSystem, blob, filter, action, swap);\n      };\n      var apply = function (anyInSystem, simulatedEvent) {\n        var postApply = function () {\n          destroyTempState(anyInSystem);\n          var swap = simulatedEvent.event().swap();\n          swap();\n        };\n        state.applyTempState(postApply);\n      };\n      var destroyTempState = function (anyInSystem) {\n        var currentUrl = state.getBlobState().url;\n        state.destroyTempState();\n        updateButtonUndoStates(anyInSystem);\n        return currentUrl;\n      };\n      var cancel = function (anyInSystem) {\n        var currentUrl = destroyTempState(anyInSystem);\n        updateSrc(anyInSystem, currentUrl).then(function (oImg) {\n          unblock(anyInSystem);\n        });\n      };\n      var back = function (anyInSystem, simulatedEvent) {\n        cancel(anyInSystem);\n        var swap = simulatedEvent.event().swap();\n        swap();\n        imagePanel.hideCrop();\n      };\n      var transform = function (anyInSystem, simulatedEvent) {\n        return manipulate(anyInSystem, simulatedEvent.event().transform(), noop);\n      };\n      var tempTransform = function (anyInSystem, simulatedEvent) {\n        return tempManipulate(anyInSystem, simulatedEvent.event().transform());\n      };\n      var transformApply = function (anyInSystem, simulatedEvent) {\n        return manipulateApply(anyInSystem, simulatedEvent.event().transform(), simulatedEvent.event().swap());\n      };\n      var imagePanel = renderImagePanel(detail.currentState.url);\n      var sideBar = renderSideBar(providersBackstage);\n      var editPanel = renderEditPanel(imagePanel, providersBackstage);\n      var swap = function (anyInSystem, simulatedEvent) {\n        disableUndoRedo(anyInSystem);\n        var transform = simulatedEvent.event().transform();\n        var swap = simulatedEvent.event().swap();\n        transform.fold(function () {\n          swap();\n        }, function (transform) {\n          manipulate(anyInSystem, transform, swap);\n        });\n      };\n      return {\n        dom: {\n          tag: 'div',\n          attributes: { role: 'presentation' }\n        },\n        components: [\n          editPanel.memContainer.asSpec(),\n          imagePanel.memContainer.asSpec(),\n          sideBar.container\n        ],\n        behaviours: derive$1([\n          Representing.config({\n            store: {\n              mode: 'manual',\n              getValue: function () {\n                return state.getBlobState();\n              }\n            }\n          }),\n          config('image-tools-events', [\n            run(internal.undo(), undo),\n            run(internal.redo(), redo),\n            run(internal.zoom(), zoom),\n            run(internal.back(), back),\n            run(internal.apply(), apply),\n            run(internal.transform(), transform),\n            run(internal.tempTransform(), tempTransform),\n            run(internal.transformApply(), transformApply),\n            run(internal.swap(), swap)\n          ]),\n          ComposingConfigs.self()\n        ])\n      };\n    };\n\n    var factory$8 = function (detail, spec) {\n      var options = map(detail.options, function (option) {\n        return {\n          dom: {\n            tag: 'option',\n            value: option.value,\n            innerHtml: option.text\n          }\n        };\n      });\n      var initialValues = detail.data.map(function (v) {\n        return wrap$1('initialValue', v);\n      }).getOr({});\n      return {\n        uid: detail.uid,\n        dom: {\n          tag: 'select',\n          classes: detail.selectClasses,\n          attributes: detail.selectAttributes\n        },\n        components: options,\n        behaviours: augment(detail.selectBehaviours, [\n          Focusing.config({}),\n          Representing.config({\n            store: __assign({\n              mode: 'manual',\n              getValue: function (select) {\n                return get$5(select.element());\n              },\n              setValue: function (select, newValue) {\n                var found = find(detail.options, function (opt) {\n                  return opt.value === newValue;\n                });\n                if (found.isSome()) {\n                  set$3(select.element(), newValue);\n                }\n              }\n            }, initialValues)\n          })\n        ])\n      };\n    };\n    var HtmlSelect = single$2({\n      name: 'HtmlSelect',\n      configFields: [\n        strict$1('options'),\n        field$1('selectBehaviours', [\n          Focusing,\n          Representing\n        ]),\n        defaulted$1('selectClasses', []),\n        defaulted$1('selectAttributes', {}),\n        option('data')\n      ],\n      factory: factory$8\n    });\n\n    var renderSelectBox = function (spec, providersBackstage) {\n      var translatedOptions = map(spec.items, function (item) {\n        return {\n          text: providersBackstage.translate(item.text),\n          value: item.value\n        };\n      });\n      var pLabel = spec.label.map(function (label) {\n        return renderLabel(label, providersBackstage);\n      });\n      var pField = FormField.parts().field({\n        dom: {},\n        selectAttributes: { size: spec.size },\n        options: translatedOptions,\n        factory: HtmlSelect,\n        selectBehaviours: derive$1([\n          Disabling.config({ disabled: spec.disabled }),\n          Tabstopping.config({}),\n          config('selectbox-change', [run(change(), function (component, _) {\n              emitWith(component, formChangeEvent, { name: spec.name });\n            })])\n        ])\n      });\n      var chevron = spec.size > 1 ? Option.none() : Option.some({\n        dom: {\n          tag: 'div',\n          classes: ['tox-selectfield__icon-js'],\n          innerHtml: get$d('chevron-down', providersBackstage.icons)\n        }\n      });\n      var selectWrap = {\n        dom: {\n          tag: 'div',\n          classes: ['tox-selectfield']\n        },\n        components: flatten([\n          [pField],\n          chevron.toArray()\n        ])\n      };\n      return FormField.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components: flatten([\n          pLabel.toArray(),\n          [selectWrap]\n        ]),\n        fieldBehaviours: derive$1([Disabling.config({\n            disabled: spec.disabled,\n            onDisabled: function (comp) {\n              FormField.getField(comp).each(Disabling.disable);\n            },\n            onEnabled: function (comp) {\n              FormField.getField(comp).each(Disabling.enable);\n            }\n          })])\n      });\n    };\n\n    var renderTextField = function (spec, providersBackstage) {\n      var pLabel = spec.label.map(function (label) {\n        return renderLabel(label, providersBackstage);\n      });\n      var baseInputBehaviours = [\n        Disabling.config({ disabled: spec.disabled }),\n        Keying.config({\n          mode: 'execution',\n          useEnter: spec.multiline !== true,\n          useControlEnter: spec.multiline === true,\n          execute: function (comp) {\n            emit(comp, formSubmitEvent);\n            return Option.some(true);\n          }\n        }),\n        config('textfield-change', [\n          run(input(), function (component, _) {\n            emitWith(component, formChangeEvent, { name: spec.name });\n          }),\n          run(postPaste(), function (component, _) {\n            emitWith(component, formChangeEvent, { name: spec.name });\n          })\n        ]),\n        Tabstopping.config({})\n      ];\n      var validatingBehaviours = spec.validation.map(function (vl) {\n        return Invalidating.config({\n          getRoot: function (input) {\n            return parent(input.element());\n          },\n          invalidClass: 'tox-invalid',\n          validator: {\n            validate: function (input) {\n              var v = Representing.getValue(input);\n              var result = vl.validator(v);\n              return Future.pure(result === true ? Result.value(v) : Result.error(result));\n            },\n            validateOnLoad: vl.validateOnLoad\n          }\n        });\n      }).toArray();\n      var placeholder = spec.placeholder.fold(constant({}), function (p) {\n        return { placeholder: providersBackstage.translate(p) };\n      });\n      var inputMode = spec.inputMode.fold(constant({}), function (mode) {\n        return { inputmode: mode };\n      });\n      var inputAttributes = __assign(__assign({}, placeholder), inputMode);\n      var pField = FormField.parts().field({\n        tag: spec.multiline === true ? 'textarea' : 'input',\n        inputAttributes: inputAttributes,\n        inputClasses: [spec.classname],\n        inputBehaviours: derive$1(flatten([\n          baseInputBehaviours,\n          validatingBehaviours\n        ])),\n        selectOnFocus: false,\n        factory: Input\n      });\n      var extraClasses = spec.flex ? ['tox-form__group--stretched'] : [];\n      var extraClasses2 = extraClasses.concat(spec.maximized ? ['tox-form-group--maximize'] : []);\n      var extraBehaviours = [Disabling.config({\n          disabled: spec.disabled,\n          onDisabled: function (comp) {\n            FormField.getField(comp).each(Disabling.disable);\n          },\n          onEnabled: function (comp) {\n            FormField.getField(comp).each(Disabling.enable);\n          }\n        })];\n      return renderFormFieldWith(pLabel, pField, extraClasses2, extraBehaviours);\n    };\n    var renderInput = function (spec, providersBackstage) {\n      return renderTextField({\n        name: spec.name,\n        multiline: false,\n        label: spec.label,\n        inputMode: spec.inputMode,\n        placeholder: spec.placeholder,\n        flex: false,\n        disabled: spec.disabled,\n        classname: 'tox-textfield',\n        validation: Option.none(),\n        maximized: spec.maximized\n      }, providersBackstage);\n    };\n    var renderTextarea = function (spec, providersBackstage) {\n      return renderTextField({\n        name: spec.name,\n        multiline: true,\n        label: spec.label,\n        inputMode: Option.none(),\n        placeholder: spec.placeholder,\n        flex: true,\n        disabled: spec.disabled,\n        classname: 'tox-textarea',\n        validation: Option.none(),\n        maximized: spec.maximized\n      }, providersBackstage);\n    };\n\n    var events$c = function (streamConfig, streamState) {\n      var streams = streamConfig.stream.streams;\n      var processor = streams.setup(streamConfig, streamState);\n      return derive([\n        run(streamConfig.event, processor),\n        runOnDetached(function () {\n          return streamState.cancel();\n        })\n      ].concat(streamConfig.cancelEvent.map(function (e) {\n        return [run(e, function () {\n            return streamState.cancel();\n          })];\n      }).getOr([])));\n    };\n\n    var ActiveStreaming = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$c\n    });\n\n    var throttle = function (_config) {\n      var state = Cell(null);\n      var readState = function () {\n        return { timer: state.get() !== null ? 'set' : 'unset' };\n      };\n      var setTimer = function (t) {\n        state.set(t);\n      };\n      var cancel = function () {\n        var t = state.get();\n        if (t !== null) {\n          t.cancel();\n        }\n      };\n      return nu$5({\n        readState: readState,\n        setTimer: setTimer,\n        cancel: cancel\n      });\n    };\n    var init$6 = function (spec) {\n      return spec.stream.streams.state(spec);\n    };\n\n    var StreamingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        throttle: throttle,\n        init: init$6\n    });\n\n    var setup$2 = function (streamInfo, streamState) {\n      var sInfo = streamInfo.stream;\n      var throttler = last$2(streamInfo.onStream, sInfo.delay);\n      streamState.setTimer(throttler);\n      return function (component, simulatedEvent) {\n        throttler.throttle(component, simulatedEvent);\n        if (sInfo.stopEvent) {\n          simulatedEvent.stop();\n        }\n      };\n    };\n    var StreamingSchema = [\n      strictOf('stream', choose$1('mode', {\n        throttle: [\n          strict$1('delay'),\n          defaulted$1('stopEvent', true),\n          output('streams', {\n            setup: setup$2,\n            state: throttle\n          })\n        ]\n      })),\n      defaulted$1('event', 'input'),\n      option('cancelEvent'),\n      onStrictHandler('onStream')\n    ];\n\n    var Streaming = create$1({\n      fields: StreamingSchema,\n      name: 'streaming',\n      active: ActiveStreaming,\n      state: StreamingState\n    });\n\n    var setValueFromItem = function (model, input, item) {\n      var itemData = Representing.getValue(item);\n      Representing.setValue(input, itemData);\n      setCursorAtEnd(input);\n    };\n    var setSelectionOn = function (input, f) {\n      var el = input.element();\n      var value = get$5(el);\n      var node = el.dom();\n      if (get$2(el, 'type') !== 'number') {\n        f(node, value);\n      }\n    };\n    var setCursorAtEnd = function (input) {\n      setSelectionOn(input, function (node, value) {\n        return node.setSelectionRange(value.length, value.length);\n      });\n    };\n    var setSelectionToEnd = function (input, startOffset) {\n      setSelectionOn(input, function (node, value) {\n        return node.setSelectionRange(startOffset, value.length);\n      });\n    };\n    var attemptSelectOver = function (model, input, item) {\n      if (!model.selectsOver) {\n        return Option.none();\n      } else {\n        var currentValue = Representing.getValue(input);\n        var inputDisplay_1 = model.getDisplayText(currentValue);\n        var itemValue = Representing.getValue(item);\n        var itemDisplay = model.getDisplayText(itemValue);\n        return itemDisplay.indexOf(inputDisplay_1) === 0 ? Option.some(function () {\n          setValueFromItem(model, input, item);\n          setSelectionToEnd(input, inputDisplay_1.length);\n        }) : Option.none();\n      }\n    };\n\n    var itemExecute = constant('alloy.typeahead.itemexecute');\n\n    var make$5 = function (detail, components, spec, externals) {\n      var navigateList = function (comp, simulatedEvent, highlighter) {\n        detail.previewing.set(false);\n        var sandbox = Coupling.getCoupled(comp, 'sandbox');\n        if (Sandboxing.isOpen(sandbox)) {\n          Composing.getCurrent(sandbox).each(function (menu) {\n            Highlighting.getHighlighted(menu).fold(function () {\n              highlighter(menu);\n            }, function () {\n              dispatchEvent(sandbox, menu.element(), 'keydown', simulatedEvent);\n            });\n          });\n        } else {\n          var onOpenSync = function (sandbox) {\n            Composing.getCurrent(sandbox).each(highlighter);\n          };\n          open$1(detail, mapFetch(comp), comp, sandbox, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);\n        }\n      };\n      var focusBehaviours$1 = focusBehaviours(detail);\n      var mapFetch = function (comp) {\n        return function (tdata) {\n          return tdata.map(function (data) {\n            var menus = values(data.menus);\n            var items = bind(menus, function (menu) {\n              return filter(menu.items, function (item) {\n                return item.type === 'item';\n              });\n            });\n            var repState = Representing.getState(comp);\n            repState.update(map(items, function (item) {\n              return item.data;\n            }));\n            return data;\n          });\n        };\n      };\n      var behaviours = [\n        Focusing.config({}),\n        Representing.config({\n          onSetValue: detail.onSetValue,\n          store: __assign({\n            mode: 'dataset',\n            getDataKey: function (comp) {\n              return get$5(comp.element());\n            },\n            getFallbackEntry: function (itemString) {\n              return {\n                value: itemString,\n                meta: {}\n              };\n            },\n            setValue: function (comp, data) {\n              set$3(comp.element(), detail.model.getDisplayText(data));\n            }\n          }, detail.initialData.map(function (d) {\n            return wrap$1('initialValue', d);\n          }).getOr({}))\n        }),\n        Streaming.config({\n          stream: {\n            mode: 'throttle',\n            delay: detail.responseTime,\n            stopEvent: false\n          },\n          onStream: function (component, simulatedEvent) {\n            var sandbox = Coupling.getCoupled(component, 'sandbox');\n            var focusInInput = Focusing.isFocused(component);\n            if (focusInInput) {\n              if (get$5(component.element()).length >= detail.minChars) {\n                var previousValue_1 = Composing.getCurrent(sandbox).bind(function (menu) {\n                  return Highlighting.getHighlighted(menu).map(Representing.getValue);\n                });\n                detail.previewing.set(true);\n                var onOpenSync = function (_sandbox) {\n                  Composing.getCurrent(sandbox).each(function (menu) {\n                    previousValue_1.fold(function () {\n                      if (detail.model.selectsOver) {\n                        Highlighting.highlightFirst(menu);\n                      }\n                    }, function (pv) {\n                      Highlighting.highlightBy(menu, function (item) {\n                        var itemData = Representing.getValue(item);\n                        return itemData.value === pv.value;\n                      });\n                      Highlighting.getHighlighted(menu).orThunk(function () {\n                        Highlighting.highlightFirst(menu);\n                        return Option.none();\n                      });\n                    });\n                  });\n                };\n                open$1(detail, mapFetch(component), component, sandbox, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);\n              }\n            }\n          },\n          cancelEvent: typeaheadCancel()\n        }),\n        Keying.config({\n          mode: 'special',\n          onDown: function (comp, simulatedEvent) {\n            navigateList(comp, simulatedEvent, Highlighting.highlightFirst);\n            return Option.some(true);\n          },\n          onEscape: function (comp) {\n            var sandbox = Coupling.getCoupled(comp, 'sandbox');\n            if (Sandboxing.isOpen(sandbox)) {\n              Sandboxing.close(sandbox);\n              return Option.some(true);\n            }\n            return Option.none();\n          },\n          onUp: function (comp, simulatedEvent) {\n            navigateList(comp, simulatedEvent, Highlighting.highlightLast);\n            return Option.some(true);\n          },\n          onEnter: function (comp) {\n            var sandbox = Coupling.getCoupled(comp, 'sandbox');\n            var sandboxIsOpen = Sandboxing.isOpen(sandbox);\n            if (sandboxIsOpen && !detail.previewing.get()) {\n              return Composing.getCurrent(sandbox).bind(function (menu) {\n                return Highlighting.getHighlighted(menu);\n              }).map(function (item) {\n                emitWith(comp, itemExecute(), { item: item });\n                return true;\n              });\n            } else {\n              var currentValue = Representing.getValue(comp);\n              emit(comp, typeaheadCancel());\n              detail.onExecute(sandbox, comp, currentValue);\n              if (sandboxIsOpen) {\n                Sandboxing.close(sandbox);\n              }\n              return Option.some(true);\n            }\n          }\n        }),\n        Toggling.config({\n          toggleClass: detail.markers.openClass,\n          aria: { mode: 'expanded' }\n        }),\n        Coupling.config({\n          others: {\n            sandbox: function (hotspot) {\n              return makeSandbox(detail, hotspot, {\n                onOpen: function () {\n                  return Toggling.on(hotspot);\n                },\n                onClose: function () {\n                  return Toggling.off(hotspot);\n                }\n              });\n            }\n          }\n        }),\n        config('typeaheadevents', [\n          runOnExecute(function (comp) {\n            var onOpenSync = noop;\n            togglePopup(detail, mapFetch(comp), comp, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);\n          }),\n          run(itemExecute(), function (comp, se) {\n            var sandbox = Coupling.getCoupled(comp, 'sandbox');\n            setValueFromItem(detail.model, comp, se.event().item());\n            emit(comp, typeaheadCancel());\n            detail.onItemExecute(comp, sandbox, se.event().item(), Representing.getValue(comp));\n            Sandboxing.close(sandbox);\n            setCursorAtEnd(comp);\n          })\n        ].concat(detail.dismissOnBlur ? [run(postBlur(), function (typeahead) {\n            var sandbox = Coupling.getCoupled(typeahead, 'sandbox');\n            if (search(sandbox.element()).isNone()) {\n              Sandboxing.close(sandbox);\n            }\n          })] : []))\n      ];\n      return {\n        uid: detail.uid,\n        dom: dom$2(deepMerge(detail, {\n          inputAttributes: {\n            'role': 'combobox',\n            'aria-autocomplete': 'list',\n            'aria-haspopup': 'true'\n          }\n        })),\n        behaviours: __assign(__assign({}, focusBehaviours$1), augment(detail.typeaheadBehaviours, behaviours)),\n        eventOrder: detail.eventOrder\n      };\n    };\n\n    var schema$j = constant([\n      option('lazySink'),\n      strict$1('fetch'),\n      defaulted$1('minChars', 5),\n      defaulted$1('responseTime', 1000),\n      onHandler('onOpen'),\n      defaulted$1('getHotspot', Option.some),\n      defaulted$1('getAnchorOverrides', constant({})),\n      defaulted$1('layouts', Option.none()),\n      defaulted$1('eventOrder', {}),\n      defaultedObjOf('model', {}, [\n        defaulted$1('getDisplayText', function (itemData) {\n          return itemData.meta !== undefined && itemData.meta.text !== undefined ? itemData.meta.text : itemData.value;\n        }),\n        defaulted$1('selectsOver', true),\n        defaulted$1('populateFromBrowse', true)\n      ]),\n      onHandler('onSetValue'),\n      onKeyboardHandler('onExecute'),\n      onHandler('onItemExecute'),\n      defaulted$1('inputClasses', []),\n      defaulted$1('inputAttributes', {}),\n      defaulted$1('inputStyles', {}),\n      defaulted$1('matchWidth', true),\n      defaulted$1('useMinWidth', false),\n      defaulted$1('dismissOnBlur', true),\n      markers(['openClass']),\n      option('initialData'),\n      field$1('typeaheadBehaviours', [\n        Focusing,\n        Representing,\n        Streaming,\n        Keying,\n        Toggling,\n        Coupling\n      ]),\n      state$1('previewing', function () {\n        return Cell(true);\n      })\n    ].concat(schema$f()).concat(sandboxFields()));\n    var parts$6 = constant([external$1({\n        schema: [tieredMenuMarkers()],\n        name: 'menu',\n        overrides: function (detail) {\n          return {\n            fakeFocus: true,\n            onHighlight: function (menu, item) {\n              if (!detail.previewing.get()) {\n                menu.getSystem().getByUid(detail.uid).each(function (input) {\n                  if (detail.model.populateFromBrowse) {\n                    setValueFromItem(detail.model, input, item);\n                  }\n                });\n              } else {\n                menu.getSystem().getByUid(detail.uid).each(function (input) {\n                  attemptSelectOver(detail.model, input, item).fold(function () {\n                    return Highlighting.dehighlight(menu, item);\n                  }, function (fn) {\n                    return fn();\n                  });\n                });\n              }\n              detail.previewing.set(false);\n            },\n            onExecute: function (menu, item) {\n              return menu.getSystem().getByUid(detail.uid).toOption().map(function (typeahead) {\n                emitWith(typeahead, itemExecute(), { item: item });\n                return true;\n              });\n            },\n            onHover: function (menu, item) {\n              detail.previewing.set(false);\n              menu.getSystem().getByUid(detail.uid).each(function (input) {\n                if (detail.model.populateFromBrowse) {\n                  setValueFromItem(detail.model, input, item);\n                }\n              });\n            }\n          };\n        }\n      })]);\n\n    var Typeahead = composite$1({\n      name: 'Typeahead',\n      configFields: schema$j(),\n      partFields: parts$6(),\n      factory: make$5\n    });\n\n    var wrap$2 = function (delegate) {\n      var toCached = function () {\n        return wrap$2(delegate.toCached());\n      };\n      var bindFuture = function (f) {\n        return wrap$2(delegate.bind(function (resA) {\n          return resA.fold(function (err) {\n            return Future.pure(Result.error(err));\n          }, function (a) {\n            return f(a);\n          });\n        }));\n      };\n      var bindResult = function (f) {\n        return wrap$2(delegate.map(function (resA) {\n          return resA.bind(f);\n        }));\n      };\n      var mapResult = function (f) {\n        return wrap$2(delegate.map(function (resA) {\n          return resA.map(f);\n        }));\n      };\n      var mapError = function (f) {\n        return wrap$2(delegate.map(function (resA) {\n          return resA.mapError(f);\n        }));\n      };\n      var foldResult = function (whenError, whenValue) {\n        return delegate.map(function (res) {\n          return res.fold(whenError, whenValue);\n        });\n      };\n      var withTimeout = function (timeout, errorThunk) {\n        return wrap$2(Future.nu(function (callback) {\n          var timedOut = false;\n          var timer = domGlobals.setTimeout(function () {\n            timedOut = true;\n            callback(Result.error(errorThunk()));\n          }, timeout);\n          delegate.get(function (result) {\n            if (!timedOut) {\n              domGlobals.clearTimeout(timer);\n              callback(result);\n            }\n          });\n        }));\n      };\n      return __assign(__assign({}, delegate), {\n        toCached: toCached,\n        bindFuture: bindFuture,\n        bindResult: bindResult,\n        mapResult: mapResult,\n        mapError: mapError,\n        foldResult: foldResult,\n        withTimeout: withTimeout\n      });\n    };\n    var nu$c = function (worker) {\n      return wrap$2(Future.nu(worker));\n    };\n    var value$2 = function (value) {\n      return wrap$2(Future.pure(Result.value(value)));\n    };\n    var error$1 = function (error) {\n      return wrap$2(Future.pure(Result.error(error)));\n    };\n    var fromResult$1 = function (result) {\n      return wrap$2(Future.pure(result));\n    };\n    var fromFuture = function (future) {\n      return wrap$2(future.map(Result.value));\n    };\n    var fromPromise = function (promise) {\n      return nu$c(function (completer) {\n        promise.then(function (value) {\n          completer(Result.value(value));\n        }, function (error) {\n          completer(Result.error(error));\n        });\n      });\n    };\n    var FutureResult = {\n      nu: nu$c,\n      wrap: wrap$2,\n      pure: value$2,\n      value: value$2,\n      error: error$1,\n      fromResult: fromResult$1,\n      fromFuture: fromFuture,\n      fromPromise: fromPromise\n    };\n\n    var separator$2 = { type: 'separator' };\n    var toMenuItem = function (target) {\n      return {\n        type: 'menuitem',\n        value: target.url,\n        text: target.title,\n        meta: { attach: target.attach },\n        onAction: function () {\n        }\n      };\n    };\n    var staticMenuItem = function (title, url) {\n      return {\n        type: 'menuitem',\n        value: url,\n        text: title,\n        meta: { attach: undefined },\n        onAction: function () {\n        }\n      };\n    };\n    var toMenuItems = function (targets) {\n      return map(targets, toMenuItem);\n    };\n    var filterLinkTargets = function (type, targets) {\n      return filter(targets, function (target) {\n        return target.type === type;\n      });\n    };\n    var filteredTargets = function (type, targets) {\n      return toMenuItems(filterLinkTargets(type, targets));\n    };\n    var headerTargets = function (linkInfo) {\n      return filteredTargets('header', linkInfo.targets);\n    };\n    var anchorTargets = function (linkInfo) {\n      return filteredTargets('anchor', linkInfo.targets);\n    };\n    var anchorTargetTop = function (linkInfo) {\n      return Option.from(linkInfo.anchorTop).map(function (url) {\n        return staticMenuItem('<top>', url);\n      }).toArray();\n    };\n    var anchorTargetBottom = function (linkInfo) {\n      return Option.from(linkInfo.anchorBottom).map(function (url) {\n        return staticMenuItem('<bottom>', url);\n      }).toArray();\n    };\n    var historyTargets = function (history) {\n      return map(history, function (url) {\n        return staticMenuItem(url, url);\n      });\n    };\n    var joinMenuLists = function (items) {\n      return foldl(items, function (a, b) {\n        var bothEmpty = a.length === 0 || b.length === 0;\n        return bothEmpty ? a.concat(b) : a.concat(separator$2, b);\n      }, []);\n    };\n    var filterByQuery = function (term, menuItems) {\n      var lowerCaseTerm = term.toLowerCase();\n      return filter(menuItems, function (item) {\n        var text = item.meta !== undefined && item.meta.text !== undefined ? item.meta.text : item.text;\n        return contains$1(text.toLowerCase(), lowerCaseTerm) || contains$1(item.value.toLowerCase(), lowerCaseTerm);\n      });\n    };\n\n    var getItems = function (fileType, input, urlBackstage) {\n      var urlInputValue = Representing.getValue(input);\n      var term = urlInputValue.meta.text !== undefined ? urlInputValue.meta.text : urlInputValue.value;\n      var info = urlBackstage.getLinkInformation();\n      return info.fold(function () {\n        return [];\n      }, function (linkInfo) {\n        var history = filterByQuery(term, historyTargets(urlBackstage.getHistory(fileType)));\n        return fileType === 'file' ? joinMenuLists([\n          history,\n          filterByQuery(term, headerTargets(linkInfo)),\n          filterByQuery(term, flatten([\n            anchorTargetTop(linkInfo),\n            anchorTargets(linkInfo),\n            anchorTargetBottom(linkInfo)\n          ]))\n        ]) : history;\n      });\n    };\n    var errorId = generate$1('aria-invalid');\n    var renderUrlInput = function (spec, backstage, urlBackstage) {\n      var _a;\n      var providersBackstage = backstage.shared.providers;\n      var updateHistory = function (component) {\n        var urlEntry = Representing.getValue(component);\n        urlBackstage.addToHistory(urlEntry.value, spec.filetype);\n      };\n      var pField = FormField.parts().field({\n        factory: Typeahead,\n        dismissOnBlur: true,\n        inputClasses: ['tox-textfield'],\n        sandboxClasses: ['tox-dialog__popups'],\n        inputAttributes: {\n          'aria-errormessage': errorId,\n          'type': 'url'\n        },\n        minChars: 0,\n        responseTime: 0,\n        fetch: function (input) {\n          var items = getItems(spec.filetype, input, urlBackstage);\n          var tdata = build$2(items, ItemResponse$1.BUBBLE_TO_SANDBOX, backstage, false);\n          return Future.pure(tdata);\n        },\n        getHotspot: function (comp) {\n          return memUrlBox.getOpt(comp);\n        },\n        onSetValue: function (comp, newValue) {\n          if (comp.hasConfigured(Invalidating)) {\n            Invalidating.run(comp).get(noop);\n          }\n        },\n        typeaheadBehaviours: derive$1(flatten([\n          urlBackstage.getValidationHandler().map(function (handler) {\n            return Invalidating.config({\n              getRoot: function (comp) {\n                return parent(comp.element());\n              },\n              invalidClass: 'tox-control-wrap--status-invalid',\n              notify: {\n                onInvalid: function (comp, err) {\n                  memInvalidIcon.getOpt(comp).each(function (invalidComp) {\n                    set$1(invalidComp.element(), 'title', providersBackstage.translate(err));\n                  });\n                }\n              },\n              validator: {\n                validate: function (input) {\n                  var urlEntry = Representing.getValue(input);\n                  return FutureResult.nu(function (completer) {\n                    handler({\n                      type: spec.filetype,\n                      url: urlEntry.value\n                    }, function (validation) {\n                      if (validation.status === 'invalid') {\n                        var err = Result.error(validation.message);\n                        completer(err);\n                      } else {\n                        var val = Result.value(validation.message);\n                        completer(val);\n                      }\n                    });\n                  });\n                },\n                validateOnLoad: false\n              }\n            });\n          }).toArray(),\n          [\n            Disabling.config({ disabled: spec.disabled }),\n            Tabstopping.config({}),\n            config('urlinput-events', flatten([\n              spec.filetype === 'file' ? [run(input(), function (comp) {\n                  emitWith(comp, formChangeEvent, { name: spec.name });\n                })] : [],\n              [\n                run(change(), function (comp) {\n                  emitWith(comp, formChangeEvent, { name: spec.name });\n                  updateHistory(comp);\n                }),\n                run(postPaste(), function (comp) {\n                  emitWith(comp, formChangeEvent, { name: spec.name });\n                  updateHistory(comp);\n                })\n              ]\n            ]))\n          ]\n        ])),\n        eventOrder: (_a = {}, _a[input()] = [\n          'streaming',\n          'urlinput-events',\n          'invalidating'\n        ], _a),\n        model: {\n          getDisplayText: function (itemData) {\n            return itemData.value;\n          },\n          selectsOver: false,\n          populateFromBrowse: false\n        },\n        markers: { openClass: 'tox-textfield--popup-open' },\n        lazySink: backstage.shared.getSink,\n        parts: { menu: part(false, 1, 'normal') },\n        onExecute: function (_menu, component, _entry) {\n          emitWith(component, formSubmitEvent, {});\n        },\n        onItemExecute: function (typeahead, _sandbox, _item, _value) {\n          updateHistory(typeahead);\n          emitWith(typeahead, formChangeEvent, { name: spec.name });\n        }\n      });\n      var pLabel = spec.label.map(function (label) {\n        return renderLabel(label, providersBackstage);\n      });\n      var makeIcon = function (name, errId, icon, label) {\n        if (icon === void 0) {\n          icon = name;\n        }\n        if (label === void 0) {\n          label = name;\n        }\n        return {\n          dom: {\n            tag: 'div',\n            classes: [\n              'tox-icon',\n              'tox-control-wrap__status-icon-' + name\n            ],\n            innerHtml: get$d(icon, providersBackstage.icons),\n            attributes: __assign({\n              'title': providersBackstage.translate(label),\n              'aria-live': 'polite'\n            }, errId.fold(function () {\n              return {};\n            }, function (id) {\n              return { id: id };\n            }))\n          }\n        };\n      };\n      var memInvalidIcon = record(makeIcon('invalid', Option.some(errorId), 'warning'));\n      var memStatus = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-control-wrap__status-icon-wrap']\n        },\n        components: [memInvalidIcon.asSpec()]\n      });\n      var optUrlPicker = urlBackstage.getUrlPicker(spec.filetype);\n      var browseUrlEvent = generate$1('browser.url.event');\n      var memUrlBox = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-control-wrap']\n        },\n        components: [\n          pField,\n          memStatus.asSpec()\n        ],\n        behaviours: derive$1([Disabling.config({ disabled: spec.disabled })])\n      });\n      var memUrlPickerButton = record(renderButton({\n        name: spec.name,\n        icon: Option.some('browse'),\n        text: spec.label.getOr(''),\n        disabled: spec.disabled,\n        primary: false,\n        borderless: true\n      }, function (component) {\n        return emit(component, browseUrlEvent);\n      }, providersBackstage, [], ['tox-browse-url']));\n      var controlHWrapper = function () {\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-form__controls-h-stack']\n          },\n          components: flatten([\n            [memUrlBox.asSpec()],\n            optUrlPicker.map(function () {\n              return memUrlPickerButton.asSpec();\n            }).toArray()\n          ])\n        };\n      };\n      var openUrlPicker = function (comp) {\n        Composing.getCurrent(comp).each(function (field) {\n          var componentData = Representing.getValue(field);\n          var urlData = __assign({ fieldname: spec.name }, componentData);\n          optUrlPicker.each(function (picker) {\n            picker(urlData).get(function (chosenData) {\n              Representing.setValue(field, chosenData);\n              emitWith(comp, formChangeEvent, { name: spec.name });\n            });\n          });\n        });\n      };\n      return FormField.sketch({\n        dom: renderFormFieldDom(),\n        components: pLabel.toArray().concat([controlHWrapper()]),\n        fieldBehaviours: derive$1([\n          Disabling.config({\n            disabled: spec.disabled,\n            onDisabled: function (comp) {\n              FormField.getField(comp).each(Disabling.disable);\n              memUrlPickerButton.getOpt(comp).each(Disabling.disable);\n            },\n            onEnabled: function (comp) {\n              FormField.getField(comp).each(Disabling.enable);\n              memUrlPickerButton.getOpt(comp).each(Disabling.enable);\n            }\n          }),\n          config('url-input-events', [run(browseUrlEvent, openUrlPicker)])\n        ])\n      });\n    };\n\n    var renderCheckbox = function (spec, providerBackstage) {\n      var repBehaviour = Representing.config({\n        store: {\n          mode: 'manual',\n          getValue: function (comp) {\n            var el = comp.element().dom();\n            return el.checked;\n          },\n          setValue: function (comp, value) {\n            var el = comp.element().dom();\n            el.checked = value;\n          }\n        }\n      });\n      var toggleCheckboxHandler = function (comp) {\n        comp.element().dom().click();\n        return Option.some(true);\n      };\n      var pField = FormField.parts().field({\n        factory: { sketch: identity },\n        dom: {\n          tag: 'input',\n          classes: ['tox-checkbox__input'],\n          attributes: { type: 'checkbox' }\n        },\n        behaviours: derive$1([\n          ComposingConfigs.self(),\n          Disabling.config({ disabled: spec.disabled }),\n          Tabstopping.config({}),\n          Focusing.config({}),\n          repBehaviour,\n          Keying.config({\n            mode: 'special',\n            onEnter: toggleCheckboxHandler,\n            onSpace: toggleCheckboxHandler,\n            stopSpaceKeyup: true\n          }),\n          config('checkbox-events', [run(change(), function (component, _) {\n              emitWith(component, formChangeEvent, { name: spec.name });\n            })])\n        ])\n      });\n      var pLabel = FormField.parts().label({\n        dom: {\n          tag: 'span',\n          classes: ['tox-checkbox__label'],\n          innerHtml: providerBackstage.translate(spec.label)\n        },\n        behaviours: derive$1([Unselecting.config({})])\n      });\n      var makeIcon = function (className) {\n        var iconName = className === 'checked' ? 'selected' : 'unselected';\n        return {\n          dom: {\n            tag: 'span',\n            classes: [\n              'tox-icon',\n              'tox-checkbox-icon__' + className\n            ],\n            innerHtml: get$d(iconName, providerBackstage.icons)\n          }\n        };\n      };\n      var memIcons = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-checkbox__icons']\n        },\n        components: [\n          makeIcon('checked'),\n          makeIcon('unchecked')\n        ]\n      });\n      return FormField.sketch({\n        dom: {\n          tag: 'label',\n          classes: ['tox-checkbox']\n        },\n        components: [\n          pField,\n          memIcons.asSpec(),\n          pLabel\n        ],\n        fieldBehaviours: derive$1([Disabling.config({\n            disabled: spec.disabled,\n            disableClass: 'tox-checkbox--disabled',\n            onDisabled: function (comp) {\n              FormField.getField(comp).each(Disabling.disable);\n            },\n            onEnabled: function (comp) {\n              FormField.getField(comp).each(Disabling.enable);\n            }\n          })])\n      });\n    };\n\n    var renderHtmlPanel = function (spec) {\n      if (spec.presets === 'presentation') {\n        return Container.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-form__group'],\n            innerHtml: spec.html\n          }\n        });\n      } else {\n        return Container.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-form__group'],\n            innerHtml: spec.html,\n            attributes: { role: 'document' }\n          },\n          containerBehaviours: derive$1([\n            Tabstopping.config({}),\n            Focusing.config({})\n          ])\n        });\n      }\n    };\n\n    var renderLabel$2 = function (spec, backstageShared) {\n      var label = {\n        dom: {\n          tag: 'label',\n          innerHtml: backstageShared.providers.translate(spec.label),\n          classes: ['tox-label']\n        }\n      };\n      var comps = map(spec.items, backstageShared.interpreter);\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-form__group']\n        },\n        components: [label].concat(comps),\n        behaviours: derive$1([\n          ComposingConfigs.self(),\n          Replacing.config({}),\n          RepresentingConfigs.domHtml(Option.none()),\n          Keying.config({ mode: 'acyclic' })\n        ])\n      };\n    };\n\n    var renderCollection = function (spec, providersBackstage) {\n      var pLabel = spec.label.map(function (label) {\n        return renderLabel(label, providersBackstage);\n      });\n      var runOnItem = function (f) {\n        return function (comp, se) {\n          closest$3(se.event().target(), '[data-collection-item-value]').each(function (target) {\n            f(comp, se, target, get$2(target, 'data-collection-item-value'));\n          });\n        };\n      };\n      var escapeAttribute = function (ch) {\n        if (ch === '\"') {\n          return '&quot;';\n        }\n        return ch;\n      };\n      var setContents = function (comp, items) {\n        var htmlLines = map(items, function (item) {\n          var itemText = global$7.translate(item.text);\n          var textContent = spec.columns === 1 ? '<div class=\"tox-collection__item-label\">' + itemText + '</div>' : '';\n          var iconContent = '<div class=\"tox-collection__item-icon\">' + item.icon + '</div>';\n          var mapItemName = {\n            '_': ' ',\n            ' - ': ' ',\n            '-': ' '\n          };\n          var ariaLabel = itemText.replace(/\\_| \\- |\\-/g, function (match) {\n            return mapItemName[match];\n          });\n          return '<div class=\"tox-collection__item\" tabindex=\"-1\" data-collection-item-value=\"' + escapeAttribute(item.value) + '\" title=\"' + ariaLabel + '\" aria-label=\"' + ariaLabel + '\">' + iconContent + textContent + '</div>';\n        });\n        var chunks = spec.columns > 1 && spec.columns !== 'auto' ? chunk(htmlLines, spec.columns) : [htmlLines];\n        var html = map(chunks, function (ch) {\n          return '<div class=\"tox-collection__group\">' + ch.join('') + '</div>';\n        });\n        set(comp.element(), html.join(''));\n      };\n      var onClick = runOnItem(function (comp, se, tgt, itemValue) {\n        se.stop();\n        emitWith(comp, formActionEvent, {\n          name: spec.name,\n          value: itemValue\n        });\n      });\n      var collectionEvents = [\n        run(mouseover(), runOnItem(function (comp, se, tgt) {\n          focus$1(tgt);\n        })),\n        run(click(), onClick),\n        run(tap(), onClick),\n        run(focusin(), runOnItem(function (comp, se, tgt) {\n          descendant$1(comp.element(), '.' + activeClass).each(function (currentActive) {\n            remove$4(currentActive, activeClass);\n          });\n          add$2(tgt, activeClass);\n        })),\n        run(focusout(), runOnItem(function (comp) {\n          descendant$1(comp.element(), '.' + activeClass).each(function (currentActive) {\n            remove$4(currentActive, activeClass);\n          });\n        })),\n        runOnExecute(runOnItem(function (comp, se, tgt, itemValue) {\n          emitWith(comp, formActionEvent, {\n            name: spec.name,\n            value: itemValue\n          });\n        }))\n      ];\n      var pField = FormField.parts().field({\n        dom: {\n          tag: 'div',\n          classes: ['tox-collection'].concat(spec.columns !== 1 ? ['tox-collection--grid'] : ['tox-collection--list'])\n        },\n        components: [],\n        factory: { sketch: identity },\n        behaviours: derive$1([\n          Replacing.config({}),\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: []\n            },\n            onSetValue: function (comp, items) {\n              setContents(comp, items);\n              if (spec.columns === 'auto') {\n                detectSize(comp, 5, 'tox-collection__item').each(function (_a) {\n                  var numRows = _a.numRows, numColumns = _a.numColumns;\n                  Keying.setGridSize(comp, numRows, numColumns);\n                });\n              }\n              emit(comp, formResizeEvent);\n            }\n          }),\n          Tabstopping.config({}),\n          Keying.config(deriveCollectionMovement(spec.columns, 'normal')),\n          config('collection-events', collectionEvents)\n        ])\n      });\n      var extraClasses = ['tox-form__group--collection'];\n      return renderFormFieldWith(pLabel, pField, extraClasses, []);\n    };\n\n    var renderTable = function (spec, providersBackstage) {\n      var renderTh = function (text) {\n        return {\n          dom: {\n            tag: 'th',\n            innerHtml: providersBackstage.translate(text)\n          }\n        };\n      };\n      var renderHeader = function (header) {\n        return {\n          dom: { tag: 'thead' },\n          components: [{\n              dom: { tag: 'tr' },\n              components: map(header, renderTh)\n            }]\n        };\n      };\n      var renderTd = function (text) {\n        return {\n          dom: {\n            tag: 'td',\n            innerHtml: providersBackstage.translate(text)\n          }\n        };\n      };\n      var renderTr = function (row) {\n        return {\n          dom: { tag: 'tr' },\n          components: map(row, renderTd)\n        };\n      };\n      var renderRows = function (rows) {\n        return {\n          dom: { tag: 'tbody' },\n          components: map(rows, renderTr)\n        };\n      };\n      return {\n        dom: {\n          tag: 'table',\n          classes: ['tox-dialog__table']\n        },\n        components: [\n          renderHeader(spec.header),\n          renderRows(spec.cells)\n        ],\n        behaviours: derive$1([\n          Tabstopping.config({}),\n          Focusing.config({})\n        ])\n      };\n    };\n\n    var renderPanel = function (spec, backstage) {\n      return {\n        dom: {\n          tag: 'div',\n          classes: spec.classes\n        },\n        components: map(spec.items, backstage.shared.interpreter)\n      };\n    };\n\n    var make$6 = function (render) {\n      return function (parts, spec, backstage) {\n        return get(spec, 'name').fold(function () {\n          return render(spec, backstage);\n        }, function (fieldName) {\n          return parts.field(fieldName, render(spec, backstage));\n        });\n      };\n    };\n    var makeIframe = function (render) {\n      return function (parts, spec, backstage) {\n        var iframeSpec = deepMerge(spec, { source: 'dynamic' });\n        return make$6(render)(parts, iframeSpec, backstage);\n      };\n    };\n    var factories = {\n      bar: make$6(function (spec, backstage) {\n        return renderBar(spec, backstage.shared);\n      }),\n      collection: make$6(function (spec, backstage) {\n        return renderCollection(spec, backstage.shared.providers);\n      }),\n      alertbanner: make$6(function (spec, backstage) {\n        return renderAlertBanner(spec, backstage.shared.providers);\n      }),\n      input: make$6(function (spec, backstage) {\n        return renderInput(spec, backstage.shared.providers);\n      }),\n      textarea: make$6(function (spec, backstage) {\n        return renderTextarea(spec, backstage.shared.providers);\n      }),\n      label: make$6(function (spec, backstage) {\n        return renderLabel$2(spec, backstage.shared);\n      }),\n      iframe: makeIframe(function (spec, backstage) {\n        return renderIFrame(spec, backstage.shared.providers);\n      }),\n      button: make$6(function (spec, backstage) {\n        return renderDialogButton(spec, backstage.shared.providers);\n      }),\n      checkbox: make$6(function (spec, backstage) {\n        return renderCheckbox(spec, backstage.shared.providers);\n      }),\n      colorinput: make$6(function (spec, backstage) {\n        return renderColorInput(spec, backstage.shared, backstage.colorinput);\n      }),\n      colorpicker: make$6(renderColorPicker),\n      dropzone: make$6(function (spec, backstage) {\n        return renderDropZone(spec, backstage.shared.providers);\n      }),\n      grid: make$6(function (spec, backstage) {\n        return renderGrid(spec, backstage.shared);\n      }),\n      selectbox: make$6(function (spec, backstage) {\n        return renderSelectBox(spec, backstage.shared.providers);\n      }),\n      sizeinput: make$6(function (spec, backstage) {\n        return renderSizeInput(spec, backstage.shared.providers);\n      }),\n      urlinput: make$6(function (spec, backstage) {\n        return renderUrlInput(spec, backstage, backstage.urlinput);\n      }),\n      customeditor: make$6(renderCustomEditor),\n      htmlpanel: make$6(renderHtmlPanel),\n      imagetools: make$6(function (spec, backstage) {\n        return renderImageTools(spec, backstage.shared.providers);\n      }),\n      table: make$6(function (spec, backstage) {\n        return renderTable(spec, backstage.shared.providers);\n      }),\n      panel: make$6(function (spec, backstage) {\n        return renderPanel(spec, backstage);\n      })\n    };\n    var noFormParts = {\n      field: function (_name, spec) {\n        return spec;\n      }\n    };\n    var interpretInForm = function (parts, spec, oldBackstage) {\n      var newBackstage = deepMerge(oldBackstage, {\n        shared: {\n          interpreter: function (childSpec) {\n            return interpretParts(parts, childSpec, newBackstage);\n          }\n        }\n      });\n      return interpretParts(parts, spec, newBackstage);\n    };\n    var interpretParts = function (parts, spec, backstage) {\n      return get(factories, spec.type).fold(function () {\n        domGlobals.console.error('Unknown factory type \"' + spec.type + '\", defaulting to container: ', spec);\n        return spec;\n      }, function (factory) {\n        return factory(parts, spec, backstage);\n      });\n    };\n    var interpretWithoutForm = function (spec, backstage) {\n      var parts = noFormParts;\n      return interpretParts(parts, spec, backstage);\n    };\n\n    var bubbleAlignments = {\n      valignCentre: [],\n      alignCentre: [],\n      alignLeft: [],\n      alignRight: [],\n      right: [],\n      left: [],\n      bottom: [],\n      top: []\n    };\n    var getInlineDialogAnchor = function (contentAreaElement, lazyAnchorbar, useEditableAreaAnchor) {\n      var bubble = nu$8(-12, 12, bubbleAlignments);\n      var overrides = { maxHeightFunction: expandable() };\n      var editableAreaAnchor = function () {\n        return {\n          anchor: 'node',\n          root: getBody(owner(contentAreaElement())),\n          node: Option.from(contentAreaElement()),\n          bubble: bubble,\n          layouts: {\n            onRtl: function () {\n              return [northwest$3];\n            },\n            onLtr: function () {\n              return [northeast$3];\n            }\n          },\n          overrides: overrides\n        };\n      };\n      var standardAnchor = function () {\n        return {\n          anchor: 'hotspot',\n          hotspot: lazyAnchorbar(),\n          bubble: bubble,\n          layouts: {\n            onRtl: function () {\n              return [southeast$1];\n            },\n            onLtr: function () {\n              return [southwest$1];\n            }\n          },\n          overrides: overrides\n        };\n      };\n      return useEditableAreaAnchor ? editableAreaAnchor : standardAnchor;\n    };\n    var getBannerAnchor = function (contentAreaElement, lazyAnchorbar, useEditableAreaAnchor) {\n      var editableAreaAnchor = function () {\n        return {\n          anchor: 'node',\n          root: getBody(owner(contentAreaElement())),\n          node: Option.from(contentAreaElement()),\n          layouts: {\n            onRtl: function () {\n              return [north$3];\n            },\n            onLtr: function () {\n              return [north$3];\n            }\n          }\n        };\n      };\n      var standardAnchor = function () {\n        return {\n          anchor: 'hotspot',\n          hotspot: lazyAnchorbar(),\n          layouts: {\n            onRtl: function () {\n              return [south$1];\n            },\n            onLtr: function () {\n              return [south$1];\n            }\n          }\n        };\n      };\n      return useEditableAreaAnchor ? editableAreaAnchor : standardAnchor;\n    };\n    var getCursorAnchor = function (editor, bodyElement) {\n      return function () {\n        return {\n          anchor: 'selection',\n          root: bodyElement(),\n          getSelection: function () {\n            var rng = editor.selection.getRng();\n            return Option.some(Selection.range(Element.fromDom(rng.startContainer), rng.startOffset, Element.fromDom(rng.endContainer), rng.endOffset));\n          }\n        };\n      };\n    };\n    var getNodeAnchor = function (bodyElement) {\n      return function (element) {\n        return {\n          anchor: 'node',\n          root: bodyElement(),\n          node: element\n        };\n      };\n    };\n    var getAnchors = function (editor, lazyAnchorbar) {\n      var useFixedToolbarContainer = useFixedContainer(editor);\n      var bodyElement = function () {\n        return Element.fromDom(editor.getBody());\n      };\n      var contentAreaElement = function () {\n        return Element.fromDom(editor.getContentAreaContainer());\n      };\n      var useEditableAreaAnchor = useFixedToolbarContainer || !isToolbarLocationTop(editor);\n      return {\n        inlineDialog: getInlineDialogAnchor(contentAreaElement, lazyAnchorbar, useEditableAreaAnchor),\n        banner: getBannerAnchor(contentAreaElement, lazyAnchorbar, useEditableAreaAnchor),\n        cursor: getCursorAnchor(editor, bodyElement),\n        node: getNodeAnchor(bodyElement)\n      };\n    };\n    var Anchors = { getAnchors: getAnchors };\n\n    var colorPicker = function (editor) {\n      return function (callback, value) {\n        var dialog = ColorSwatch.colorPickerDialog(editor);\n        dialog(callback, value);\n      };\n    };\n    var hasCustomColors$1 = function (editor) {\n      return function () {\n        return Settings.hasCustomColors(editor);\n      };\n    };\n    var getColors$1 = function (editor) {\n      return function () {\n        return Settings.getColors(editor);\n      };\n    };\n    var getColorCols$2 = function (editor) {\n      return function () {\n        return ColorSwatch.getColorCols(editor);\n      };\n    };\n    var ColorInputBackstage = function (editor) {\n      return {\n        colorPicker: colorPicker(editor),\n        hasCustomColors: hasCustomColors$1(editor),\n        getColors: getColors$1(editor),\n        getColorCols: getColorCols$2(editor)\n      };\n    };\n\n    var isDraggableModal$1 = function (editor) {\n      return function () {\n        return isDraggableModal(editor);\n      };\n    };\n    var DialogBackstage = function (editor) {\n      return { isDraggableModal: isDraggableModal$1(editor) };\n    };\n\n    var defaultStyleFormats = [\n      {\n        title: 'Headings',\n        items: [\n          {\n            title: 'Heading 1',\n            format: 'h1'\n          },\n          {\n            title: 'Heading 2',\n            format: 'h2'\n          },\n          {\n            title: 'Heading 3',\n            format: 'h3'\n          },\n          {\n            title: 'Heading 4',\n            format: 'h4'\n          },\n          {\n            title: 'Heading 5',\n            format: 'h5'\n          },\n          {\n            title: 'Heading 6',\n            format: 'h6'\n          }\n        ]\n      },\n      {\n        title: 'Inline',\n        items: [\n          {\n            title: 'Bold',\n            icon: 'bold',\n            format: 'bold'\n          },\n          {\n            title: 'Italic',\n            icon: 'italic',\n            format: 'italic'\n          },\n          {\n            title: 'Underline',\n            icon: 'underline',\n            format: 'underline'\n          },\n          {\n            title: 'Strikethrough',\n            icon: 'strike-through',\n            format: 'strikethrough'\n          },\n          {\n            title: 'Superscript',\n            icon: 'superscript',\n            format: 'superscript'\n          },\n          {\n            title: 'Subscript',\n            icon: 'subscript',\n            format: 'subscript'\n          },\n          {\n            title: 'Code',\n            icon: 'code',\n            format: 'code'\n          }\n        ]\n      },\n      {\n        title: 'Blocks',\n        items: [\n          {\n            title: 'Paragraph',\n            format: 'p'\n          },\n          {\n            title: 'Blockquote',\n            format: 'blockquote'\n          },\n          {\n            title: 'Div',\n            format: 'div'\n          },\n          {\n            title: 'Pre',\n            format: 'pre'\n          }\n        ]\n      },\n      {\n        title: 'Align',\n        items: [\n          {\n            title: 'Left',\n            icon: 'align-left',\n            format: 'alignleft'\n          },\n          {\n            title: 'Center',\n            icon: 'align-center',\n            format: 'aligncenter'\n          },\n          {\n            title: 'Right',\n            icon: 'align-right',\n            format: 'alignright'\n          },\n          {\n            title: 'Justify',\n            icon: 'align-justify',\n            format: 'alignjustify'\n          }\n        ]\n      }\n    ];\n    var isNestedFormat = function (format) {\n      return has(format, 'items');\n    };\n    var isBlockFormat = function (format) {\n      return has(format, 'block');\n    };\n    var isInlineFormat = function (format) {\n      return has(format, 'inline');\n    };\n    var isSelectorFormat = function (format) {\n      return has(format, 'selector');\n    };\n    var mapFormats = function (userFormats) {\n      return foldl(userFormats, function (acc, fmt) {\n        if (isNestedFormat(fmt)) {\n          var result = mapFormats(fmt.items);\n          return {\n            customFormats: acc.customFormats.concat(result.customFormats),\n            formats: acc.formats.concat([{\n                title: fmt.title,\n                items: result.formats\n              }])\n          };\n        } else if (isInlineFormat(fmt) || isBlockFormat(fmt) || isSelectorFormat(fmt)) {\n          var formatName = 'custom-' + fmt.title.toLowerCase();\n          return {\n            customFormats: acc.customFormats.concat([{\n                name: formatName,\n                format: fmt\n              }]),\n            formats: acc.formats.concat([{\n                title: fmt.title,\n                format: formatName,\n                icon: fmt.icon\n              }])\n          };\n        } else {\n          return __assign(__assign({}, acc), { formats: acc.formats.concat(fmt) });\n        }\n      }, {\n        customFormats: [],\n        formats: []\n      });\n    };\n    var registerCustomFormats = function (editor, userFormats) {\n      var result = mapFormats(userFormats);\n      var registerFormats = function (customFormats) {\n        each(customFormats, function (fmt) {\n          if (!editor.formatter.has(fmt.name)) {\n            editor.formatter.register(fmt.name, fmt.format);\n          }\n        });\n      };\n      if (editor.formatter) {\n        registerFormats(result.customFormats);\n      } else {\n        editor.on('init', function () {\n          registerFormats(result.customFormats);\n        });\n      }\n      return result.formats;\n    };\n    var getStyleFormats = function (editor) {\n      return getUserStyleFormats(editor).map(function (userFormats) {\n        var registeredUserFormats = registerCustomFormats(editor, userFormats);\n        return isMergeStyleFormats(editor) ? defaultStyleFormats.concat(registeredUserFormats) : registeredUserFormats;\n      }).getOr(defaultStyleFormats);\n    };\n\n    var processBasic = function (item, isSelectedFor, getPreviewFor) {\n      var formatterSpec = {\n        type: 'formatter',\n        isSelected: isSelectedFor(item.format),\n        getStylePreview: getPreviewFor(item.format)\n      };\n      return deepMerge(item, formatterSpec);\n    };\n    var register$3 = function (editor, formats, isSelectedFor, getPreviewFor) {\n      var enrichSupported = function (item) {\n        return processBasic(item, isSelectedFor, getPreviewFor);\n      };\n      var enrichMenu = function (item) {\n        var submenuSpec = { type: 'submenu' };\n        return deepMerge(item, submenuSpec);\n      };\n      var enrichCustom = function (item) {\n        var formatName = generate$1(item.title);\n        var customSpec = {\n          type: 'formatter',\n          format: formatName,\n          isSelected: isSelectedFor(formatName),\n          getStylePreview: getPreviewFor(formatName)\n        };\n        var newItem = deepMerge(item, customSpec);\n        editor.formatter.register(formatName, newItem);\n        return newItem;\n      };\n      var doEnrich = function (items) {\n        return map(items, function (item) {\n          var keys$1 = keys(item);\n          if (hasNonNullableKey(item, 'items')) {\n            var newItems_1 = doEnrich(item.items);\n            return deepMerge(enrichMenu(item), {\n              getStyleItems: function () {\n                return newItems_1;\n              }\n            });\n          } else if (hasNonNullableKey(item, 'format')) {\n            return enrichSupported(item);\n          } else if (keys$1.length === 1 && contains(keys$1, 'title')) {\n            return deepMerge(item, { type: 'separator' });\n          } else {\n            return enrichCustom(item);\n          }\n        });\n      };\n      return doEnrich(formats);\n    };\n\n    var init$7 = function (editor) {\n      var isSelectedFor = function (format) {\n        return function () {\n          return editor.formatter.match(format);\n        };\n      };\n      var getPreviewFor = function (format) {\n        return function () {\n          var fmt = editor.formatter.get(format);\n          return fmt !== undefined ? Option.some({\n            tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',\n            styles: editor.dom.parseStyle(editor.formatter.getCssText(format))\n          }) : Option.none();\n        };\n      };\n      var flatten = function (fmt) {\n        var subs = fmt.items;\n        return subs !== undefined && subs.length > 0 ? bind(subs, flatten) : [fmt.format];\n      };\n      var settingsFormats = Cell([]);\n      var settingsFlattenedFormats = Cell([]);\n      var eventsFormats = Cell([]);\n      var eventsFlattenedFormats = Cell([]);\n      var replaceSettings = Cell(false);\n      editor.on('PreInit', function (e) {\n        var formats = getStyleFormats(editor);\n        var enriched = register$3(editor, formats, isSelectedFor, getPreviewFor);\n        settingsFormats.set(enriched);\n        settingsFlattenedFormats.set(bind(enriched, flatten));\n      });\n      editor.on('addStyleModifications', function (e) {\n        var modifications = register$3(editor, e.items, isSelectedFor, getPreviewFor);\n        eventsFormats.set(modifications);\n        replaceSettings.set(e.replace);\n        eventsFlattenedFormats.set(bind(modifications, flatten));\n      });\n      var getData = function () {\n        var fromSettings = replaceSettings.get() ? [] : settingsFormats.get();\n        var fromEvents = eventsFormats.get();\n        return fromSettings.concat(fromEvents);\n      };\n      var getFlattenedKeys = function () {\n        var fromSettings = replaceSettings.get() ? [] : settingsFlattenedFormats.get();\n        var fromEvents = eventsFlattenedFormats.get();\n        return fromSettings.concat(fromEvents);\n      };\n      return {\n        getData: getData,\n        getFlattenedKeys: getFlattenedKeys\n      };\n    };\n\n    var trim$1 = global$e.trim;\n    var hasContentEditableState = function (value) {\n      return function (node) {\n        if (node && node.nodeType === 1) {\n          if (node.contentEditable === value) {\n            return true;\n          }\n          if (node.getAttribute('data-mce-contenteditable') === value) {\n            return true;\n          }\n        }\n        return false;\n      };\n    };\n    var isContentEditableTrue = hasContentEditableState('true');\n    var isContentEditableFalse = hasContentEditableState('false');\n    var create$8 = function (type, title, url, level, attach) {\n      return {\n        type: type,\n        title: title,\n        url: url,\n        level: level,\n        attach: attach\n      };\n    };\n    var isChildOfContentEditableTrue = function (node) {\n      while (node = node.parentNode) {\n        var value = node.contentEditable;\n        if (value && value !== 'inherit') {\n          return isContentEditableTrue(node);\n        }\n      }\n      return false;\n    };\n    var select = function (selector, root) {\n      return map(descendants(Element.fromDom(root), selector), function (element) {\n        return element.dom();\n      });\n    };\n    var getElementText = function (elm) {\n      return elm.innerText || elm.textContent;\n    };\n    var getOrGenerateId = function (elm) {\n      return elm.id ? elm.id : generate$1('h');\n    };\n    var isAnchor = function (elm) {\n      return elm && elm.nodeName === 'A' && (elm.id || elm.name) !== undefined;\n    };\n    var isValidAnchor = function (elm) {\n      return isAnchor(elm) && isEditable(elm);\n    };\n    var isHeader = function (elm) {\n      return elm && /^(H[1-6])$/.test(elm.nodeName);\n    };\n    var isEditable = function (elm) {\n      return isChildOfContentEditableTrue(elm) && !isContentEditableFalse(elm);\n    };\n    var isValidHeader = function (elm) {\n      return isHeader(elm) && isEditable(elm);\n    };\n    var getLevel = function (elm) {\n      return isHeader(elm) ? parseInt(elm.nodeName.substr(1), 10) : 0;\n    };\n    var headerTarget = function (elm) {\n      var headerId = getOrGenerateId(elm);\n      var attach = function () {\n        elm.id = headerId;\n      };\n      return create$8('header', getElementText(elm), '#' + headerId, getLevel(elm), attach);\n    };\n    var anchorTarget = function (elm) {\n      var anchorId = elm.id || elm.name;\n      var anchorText = getElementText(elm);\n      return create$8('anchor', anchorText ? anchorText : '#' + anchorId, '#' + anchorId, 0, noop);\n    };\n    var getHeaderTargets = function (elms) {\n      return map(filter(elms, isValidHeader), headerTarget);\n    };\n    var getAnchorTargets = function (elms) {\n      return map(filter(elms, isValidAnchor), anchorTarget);\n    };\n    var getTargetElements = function (elm) {\n      var elms = select('h1,h2,h3,h4,h5,h6,a:not([href])', elm);\n      return elms;\n    };\n    var hasTitle = function (target) {\n      return trim$1(target.title).length > 0;\n    };\n    var find$5 = function (elm) {\n      var elms = getTargetElements(elm);\n      return filter(getHeaderTargets(elms).concat(getAnchorTargets(elms)), hasTitle);\n    };\n    var LinkTargets = { find: find$5 };\n\n    var STORAGE_KEY = 'tinymce-url-history';\n    var HISTORY_LENGTH = 5;\n    var isHttpUrl = function (url) {\n      return isString(url) && /^https?/.test(url);\n    };\n    var isArrayOfUrl = function (a) {\n      return isArray(a) && a.length <= HISTORY_LENGTH && forall(a, isHttpUrl);\n    };\n    var isRecordOfUrlArray = function (r) {\n      return isObject(r) && find$1(r, function (value) {\n        return !isArrayOfUrl(value);\n      }).isNone();\n    };\n    var getAllHistory = function () {\n      var unparsedHistory = domGlobals.localStorage.getItem(STORAGE_KEY);\n      if (unparsedHistory === null) {\n        return {};\n      }\n      var history;\n      try {\n        history = JSON.parse(unparsedHistory);\n      } catch (e) {\n        if (e instanceof SyntaxError) {\n          domGlobals.console.log('Local storage ' + STORAGE_KEY + ' was not valid JSON', e);\n          return {};\n        }\n        throw e;\n      }\n      if (!isRecordOfUrlArray(history)) {\n        domGlobals.console.log('Local storage ' + STORAGE_KEY + ' was not valid format', history);\n        return {};\n      }\n      return history;\n    };\n    var setAllHistory = function (history) {\n      if (!isRecordOfUrlArray(history)) {\n        throw new Error('Bad format for history:\\n' + JSON.stringify(history));\n      }\n      domGlobals.localStorage.setItem(STORAGE_KEY, JSON.stringify(history));\n    };\n    var getHistory = function (fileType) {\n      var history = getAllHistory();\n      return Object.prototype.hasOwnProperty.call(history, fileType) ? history[fileType] : [];\n    };\n    var addToHistory = function (url, fileType) {\n      if (!isHttpUrl(url)) {\n        return;\n      }\n      var history = getAllHistory();\n      var items = Object.prototype.hasOwnProperty.call(history, fileType) ? history[fileType] : [];\n      var itemsWithoutUrl = filter(items, function (item) {\n        return item !== url;\n      });\n      history[fileType] = [url].concat(itemsWithoutUrl).slice(0, HISTORY_LENGTH);\n      setAllHistory(history);\n    };\n\n    var hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n    var isTruthy = function (value) {\n      return !!value;\n    };\n    var makeMap = function (value) {\n      return map$1(global$e.makeMap(value, /[, ]/), isTruthy);\n    };\n    var getOpt$1 = function (obj, key) {\n      return hasOwnProperty$2.call(obj, key) ? Option.some(obj[key]) : Option.none();\n    };\n    var getTextSetting = function (settings, name, defaultValue) {\n      var value = getOpt$1(settings, name).getOr(defaultValue);\n      return isString(value) ? Option.some(value) : Option.none();\n    };\n    var getPicker = function (settings) {\n      return Option.some(settings.file_picker_callback).filter(isFunction);\n    };\n    var getPickerTypes = function (settings) {\n      var optFileTypes = Option.some(settings.file_picker_types).filter(isTruthy);\n      var optLegacyTypes = Option.some(settings.file_browser_callback_types).filter(isTruthy);\n      var optTypes = optFileTypes.or(optLegacyTypes).map(makeMap);\n      return getPicker(settings).fold(function () {\n        return false;\n      }, function (_picker) {\n        return optTypes.fold(function () {\n          return true;\n        }, function (types) {\n          return keys(types).length > 0 ? types : false;\n        });\n      });\n    };\n    var getPickerSetting = function (settings, filetype) {\n      var pickerTypes = getPickerTypes(settings);\n      if (isBoolean(pickerTypes)) {\n        return pickerTypes ? getPicker(settings) : Option.none();\n      } else {\n        return pickerTypes[filetype] ? getPicker(settings) : Option.none();\n      }\n    };\n    var getUrlPicker = function (editor, filetype) {\n      return getPickerSetting(editor.settings, filetype).map(function (picker) {\n        return function (entry) {\n          return Future.nu(function (completer) {\n            var handler = function (value, meta) {\n              if (!isString(value)) {\n                throw new Error('Expected value to be string');\n              }\n              if (meta !== undefined && !isObject(meta)) {\n                throw new Error('Expected meta to be a object');\n              }\n              var r = {\n                value: value,\n                meta: meta\n              };\n              completer(r);\n            };\n            var meta = __assign({\n              filetype: filetype,\n              fieldname: entry.fieldname\n            }, Option.from(entry.meta).getOr({}));\n            picker.call(editor, handler, entry.value, meta);\n          });\n        };\n      });\n    };\n    var getLinkInformation = function (editor) {\n      if (editor.settings.typeahead_urls === false) {\n        return Option.none();\n      }\n      return Option.some({\n        targets: LinkTargets.find(editor.getBody()),\n        anchorTop: getTextSetting(editor.settings, 'anchor_top', '#top').getOrUndefined(),\n        anchorBottom: getTextSetting(editor.settings, 'anchor_bottom', '#bottom').getOrUndefined()\n      });\n    };\n    var getValidationHandler = function (editor) {\n      var optValidator = Option.from(editor.settings.file_picker_validator_handler).filter(isFunction);\n      return optValidator.orThunk(function () {\n        return Option.from(editor.settings.filepicker_validator_handler).filter(isFunction);\n      });\n    };\n    var UrlInputBackstage = function (editor) {\n      return {\n        getHistory: getHistory,\n        addToHistory: addToHistory,\n        getLinkInformation: function () {\n          return getLinkInformation(editor);\n        },\n        getValidationHandler: function () {\n          return getValidationHandler(editor);\n        },\n        getUrlPicker: function (filetype) {\n          return getUrlPicker(editor, filetype);\n        }\n      };\n    };\n\n    var init$8 = function (sink, editor, lazyAnchorbar) {\n      var contextMenuState = Cell(false);\n      var backstage = {\n        shared: {\n          providers: {\n            icons: function () {\n              return editor.ui.registry.getAll().icons;\n            },\n            menuItems: function () {\n              return editor.ui.registry.getAll().menuItems;\n            },\n            translate: global$7.translate\n          },\n          interpreter: function (s) {\n            return interpretWithoutForm(s, backstage);\n          },\n          anchors: Anchors.getAnchors(editor, lazyAnchorbar),\n          getSink: function () {\n            return Result.value(sink);\n          }\n        },\n        urlinput: UrlInputBackstage(editor),\n        styleselect: init$7(editor),\n        colorinput: ColorInputBackstage(editor),\n        dialog: DialogBackstage(editor),\n        isContextMenuOpen: function () {\n          return contextMenuState.get();\n        },\n        setContextMenuState: function (state) {\n          return contextMenuState.set(state);\n        }\n      };\n      return backstage;\n    };\n\n    var expandable$1 = constant(function (element, available) {\n      setMax$1(element, Math.floor(available));\n    });\n\n    var showContextToolbarEvent = 'contexttoolbar-show';\n    var hideContextToolbarEvent = 'contexttoolbar-hide';\n\n    var schema$k = constant([\n      strict$1('items'),\n      markers(['itemSelector']),\n      field$1('tgroupBehaviours', [Keying])\n    ]);\n    var parts$7 = constant([group({\n        name: 'items',\n        unit: 'item'\n      })]);\n\n    var factory$9 = function (detail, components, spec, _externals) {\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: augment(detail.tgroupBehaviours, [Keying.config({\n            mode: 'flow',\n            selector: detail.markers.itemSelector\n          })]),\n        domModification: { attributes: { role: 'toolbar' } }\n      };\n    };\n    var ToolbarGroup = composite$1({\n      name: 'ToolbarGroup',\n      configFields: schema$k(),\n      partFields: parts$7(),\n      factory: factory$9\n    });\n\n    var schema$l = constant([\n      strict$1('dom'),\n      defaulted$1('shell', true),\n      field$1('toolbarBehaviours', [Replacing])\n    ]);\n    var enhanceGroups = function () {\n      return { behaviours: derive$1([Replacing.config({})]) };\n    };\n    var parts$8 = constant([optional({\n        name: 'groups',\n        overrides: enhanceGroups\n      })]);\n\n    var factory$a = function (detail, components, spec, _externals) {\n      var setGroups = function (toolbar, groups) {\n        getGroupContainer(toolbar).fold(function () {\n          domGlobals.console.error('Toolbar was defined to not be a shell, but no groups container was specified in components');\n          throw new Error('Toolbar was defined to not be a shell, but no groups container was specified in components');\n        }, function (container) {\n          Replacing.set(container, groups);\n        });\n      };\n      var getGroupContainer = function (component) {\n        return detail.shell ? Option.some(component) : getPart(component, detail, 'groups');\n      };\n      var extra = detail.shell ? {\n        behaviours: [Replacing.config({})],\n        components: []\n      } : {\n        behaviours: [],\n        components: components\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: extra.components,\n        behaviours: augment(detail.toolbarBehaviours, extra.behaviours),\n        apis: { setGroups: setGroups },\n        domModification: { attributes: { role: 'group' } }\n      };\n    };\n    var Toolbar = composite$1({\n      name: 'Toolbar',\n      configFields: schema$l(),\n      partFields: parts$8(),\n      factory: factory$a,\n      apis: {\n        setGroups: function (apis, toolbar, groups) {\n          apis.setGroups(toolbar, groups);\n        }\n      }\n    });\n\n    var generate$6 = function (xs, f) {\n      var init = {\n        len: 0,\n        list: []\n      };\n      var r = foldl(xs, function (b, a) {\n        var value = f(a, b.len);\n        return value.fold(constant(b), function (v) {\n          return {\n            len: v.finish(),\n            list: b.list.concat([v])\n          };\n        });\n      }, init);\n      return r.list;\n    };\n\n    var output$1 = Immutable('within', 'extra', 'withinWidth');\n    var apportion = function (units, total, len) {\n      var parray = generate$6(units, function (unit, current) {\n        var width = len(unit);\n        return Option.some({\n          element: constant(unit),\n          start: constant(current),\n          finish: constant(current + width),\n          width: constant(width)\n        });\n      });\n      var within = filter(parray, function (unit) {\n        return unit.finish() <= total;\n      });\n      var withinWidth = foldr(within, function (acc, el) {\n        return acc + el.width();\n      }, 0);\n      var extra = parray.slice(within.length);\n      return {\n        within: constant(within),\n        extra: constant(extra),\n        withinWidth: constant(withinWidth)\n      };\n    };\n    var toUnit = function (parray) {\n      return map(parray, function (unit) {\n        return unit.element();\n      });\n    };\n    var fitLast = function (within, extra, withinWidth) {\n      var fits = toUnit(within.concat(extra));\n      return output$1(fits, [], withinWidth);\n    };\n    var overflow = function (within, extra, overflower, withinWidth) {\n      var fits = toUnit(within).concat([overflower]);\n      return output$1(fits, toUnit(extra), withinWidth);\n    };\n    var fitAll = function (within, extra, withinWidth) {\n      return output$1(toUnit(within), [], withinWidth);\n    };\n    var tryFit = function (total, units, len) {\n      var divide = apportion(units, total, len);\n      return divide.extra().length === 0 ? Option.some(divide) : Option.none();\n    };\n    var partition$3 = function (total, units, len, overflower) {\n      var divide = tryFit(total, units, len).getOrThunk(function () {\n        return apportion(units, total - len(overflower), len);\n      });\n      var within = divide.within();\n      var extra = divide.extra();\n      var withinWidth = divide.withinWidth();\n      if (extra.length === 1 && extra[0].width() <= len(overflower)) {\n        return fitLast(within, extra, withinWidth);\n      } else if (extra.length >= 1) {\n        return overflow(within, extra, overflower, withinWidth);\n      } else {\n        return fitAll(within, extra, withinWidth);\n      }\n    };\n\n    var setGroups = function (toolbar, storedGroups) {\n      var bGroups = map(storedGroups, function (g) {\n        return premade$1(g);\n      });\n      Toolbar.setGroups(toolbar, bGroups);\n    };\n    var findFocusedComp = function (comps) {\n      return findMap(comps, function (comp) {\n        return search(comp.element()).bind(function (focusedElm) {\n          return comp.getSystem().getByDom(focusedElm).toOption();\n        });\n      });\n    };\n    var refresh = function (toolbar, detail, setOverflow) {\n      var primary = getPartOrDie(toolbar, detail, 'primary');\n      var overflowGroup = Coupling.getCoupled(toolbar, 'overflowGroup');\n      set$2(primary.element(), 'visibility', 'hidden');\n      var groups = detail.builtGroups.get().concat([overflowGroup]);\n      var focusedComp = findFocusedComp(groups);\n      setOverflow([]);\n      setGroups(primary, groups);\n      var availableWidth = get$7(primary.element());\n      var overflows = partition$3(availableWidth, detail.builtGroups.get(), function (comp) {\n        return get$7(comp.element());\n      }, overflowGroup);\n      if (overflows.extra().length === 0) {\n        Replacing.remove(primary, overflowGroup);\n        setOverflow([]);\n      } else {\n        setGroups(primary, overflows.within());\n        setOverflow(overflows.extra());\n      }\n      remove$6(primary.element(), 'visibility');\n      reflow(primary.element());\n      focusedComp.each(Focusing.focus);\n    };\n\n    var schema$m = constant([\n      field$1('splitToolbarBehaviours', [Coupling]),\n      state$1('builtGroups', function () {\n        return Cell([]);\n      })\n    ]);\n\n    var schema$n = constant([\n      markers(['overflowToggledClass']),\n      optionFunction('getOverflowBounds'),\n      strict$1('lazySink'),\n      state$1('overflowGroups', function () {\n        return Cell([]);\n      })\n    ].concat(schema$m()));\n    var parts$9 = constant([\n      required({\n        factory: Toolbar,\n        schema: schema$l(),\n        name: 'primary'\n      }),\n      external$1({\n        schema: schema$l(),\n        name: 'overflow'\n      }),\n      external$1({ name: 'overflow-button' }),\n      external$1({ name: 'overflow-group' })\n    ]);\n\n    var schema$o = constant([\n      markers(['toggledClass']),\n      strict$1('lazySink'),\n      strictFunction('fetch'),\n      optionFunction('getBounds'),\n      optionObjOf('fireDismissalEventInstead', [defaulted$1('event', dismissRequested())]),\n      schema$1()\n    ]);\n    var parts$a = constant([\n      external$1({\n        name: 'button',\n        overrides: function (detail) {\n          return {\n            dom: { attributes: { 'aria-haspopup': 'true' } },\n            buttonBehaviours: derive$1([Toggling.config({\n                toggleClass: detail.markers.toggledClass,\n                aria: { mode: 'expanded' },\n                toggleOnExecute: false\n              })])\n          };\n        }\n      }),\n      external$1({\n        factory: Toolbar,\n        schema: schema$l(),\n        name: 'toolbar',\n        overrides: function (detail) {\n          return {\n            toolbarBehaviours: derive$1([Keying.config({\n                mode: 'cyclic',\n                onEscape: function (comp) {\n                  getPart(comp, detail, 'button').each(Focusing.focus);\n                  return Option.none();\n                }\n              })])\n          };\n        }\n      })\n    ]);\n\n    var toggle$2 = function (button, externals) {\n      var toolbarSandbox = Coupling.getCoupled(button, 'toolbarSandbox');\n      if (Sandboxing.isOpen(toolbarSandbox)) {\n        Sandboxing.close(toolbarSandbox);\n      } else {\n        Sandboxing.open(toolbarSandbox, externals.toolbar());\n      }\n    };\n    var position$2 = function (button, toolbar, detail, layouts) {\n      var bounds = detail.getBounds.map(function (bounder) {\n        return bounder();\n      });\n      var sink = detail.lazySink(button).getOrDie();\n      Positioning.positionWithinBounds(sink, {\n        anchor: 'hotspot',\n        hotspot: button,\n        layouts: layouts,\n        overrides: { maxWidthFunction: expandable$1() }\n      }, toolbar, bounds);\n    };\n    var setGroups$1 = function (button, toolbar, detail, layouts, groups) {\n      Toolbar.setGroups(toolbar, groups);\n      position$2(button, toolbar, detail, layouts);\n      Toggling.on(button);\n    };\n    var makeSandbox$1 = function (button, spec, detail) {\n      var ariaOwner = manager();\n      var onOpen = function (sandbox, toolbar) {\n        detail.fetch().get(function (groups) {\n          setGroups$1(button, toolbar, detail, spec.layouts, groups);\n          ariaOwner.link(button.element());\n          Keying.focusIn(toolbar);\n        });\n      };\n      var onClose = function () {\n        Toggling.off(button);\n        Focusing.focus(button);\n        ariaOwner.unlink(button.element());\n      };\n      return {\n        dom: {\n          tag: 'div',\n          attributes: { id: ariaOwner.id() }\n        },\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'special',\n            onEscape: function (comp) {\n              Sandboxing.close(comp);\n              return Option.some(true);\n            }\n          }),\n          Sandboxing.config({\n            onOpen: onOpen,\n            onClose: onClose,\n            isPartOf: function (container, data, queryElem) {\n              return isPartOf(data, queryElem) || isPartOf(button, queryElem);\n            },\n            getAttachPoint: function () {\n              return detail.lazySink(button).getOrDie();\n            }\n          }),\n          Receiving.config({\n            channels: __assign(__assign({}, receivingChannel(__assign({ isExtraPart: never }, detail.fireDismissalEventInstead.map(function (fe) {\n              return { fireEventInstead: { event: fe.event } };\n            }).getOr({})))), receivingChannel$1({\n              doReposition: function () {\n                Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(function (toolbar) {\n                  position$2(button, toolbar, detail, spec.layouts);\n                });\n              }\n            }))\n          })\n        ])\n      };\n    };\n    var factory$b = function (detail, components, spec, externals) {\n      return __assign(__assign({}, Button.sketch(__assign(__assign({}, externals.button()), {\n        action: function (button) {\n          toggle$2(button, externals);\n        },\n        buttonBehaviours: SketchBehaviours.augment({ dump: externals.button().buttonBehaviours }, [Coupling.config({\n            others: {\n              toolbarSandbox: function (button) {\n                return makeSandbox$1(button, spec, detail);\n              }\n            }\n          })])\n      }))), {\n        apis: {\n          setGroups: function (button, groups) {\n            Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(function (toolbar) {\n              setGroups$1(button, toolbar, detail, spec.layouts, groups);\n            });\n          },\n          reposition: function (button) {\n            Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(function (toolbar) {\n              position$2(button, toolbar, detail, spec.layouts);\n            });\n          },\n          toggle: function (button) {\n            toggle$2(button, externals);\n          },\n          getToolbar: function (button) {\n            return Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox'));\n          }\n        }\n      });\n    };\n    var FloatingToolbarButton = composite$1({\n      name: 'FloatingToolbarButton',\n      factory: factory$b,\n      configFields: schema$o(),\n      partFields: parts$a(),\n      apis: {\n        setGroups: function (apis, button, groups) {\n          apis.setGroups(button, groups);\n        },\n        reposition: function (apis, button) {\n          apis.reposition(button);\n        },\n        toggle: function (apis, button) {\n          apis.toggle(button);\n        },\n        getToolbar: function (apis, button) {\n          return apis.getToolbar(button);\n        }\n      }\n    });\n\n    var buildGroups = function (comps) {\n      return map(comps, function (g) {\n        return premade$1(g);\n      });\n    };\n    var refresh$1 = function (toolbar, memFloatingToolbarButton, detail) {\n      refresh(toolbar, detail, function (overflowGroups) {\n        detail.overflowGroups.set(overflowGroups);\n        memFloatingToolbarButton.getOpt(toolbar).each(function (floatingToolbarButton) {\n          FloatingToolbarButton.setGroups(floatingToolbarButton, buildGroups(overflowGroups));\n        });\n      });\n    };\n    var factory$c = function (detail, components, spec, externals) {\n      var memFloatingToolbarButton = record(FloatingToolbarButton.sketch({\n        fetch: function () {\n          return Future.nu(function (resolve) {\n            resolve(buildGroups(detail.overflowGroups.get()));\n          });\n        },\n        layouts: {\n          onLtr: function () {\n            return [\n              southwest$1,\n              southeast$1\n            ];\n          },\n          onRtl: function () {\n            return [\n              southeast$1,\n              southwest$1\n            ];\n          },\n          onBottomLtr: function () {\n            return [\n              northwest$1,\n              northeast$1\n            ];\n          },\n          onBottomRtl: function () {\n            return [\n              northeast$1,\n              northwest$1\n            ];\n          }\n        },\n        getBounds: spec.getOverflowBounds,\n        lazySink: detail.lazySink,\n        fireDismissalEventInstead: {},\n        markers: { toggledClass: detail.markers.overflowToggledClass },\n        parts: {\n          button: externals['overflow-button'](),\n          toolbar: externals.overflow()\n        }\n      }));\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: augment(detail.splitToolbarBehaviours, [Coupling.config({\n            others: {\n              overflowGroup: function () {\n                return ToolbarGroup.sketch(__assign(__assign({}, externals['overflow-group']()), { items: [memFloatingToolbarButton.asSpec()] }));\n              }\n            }\n          })]),\n        apis: {\n          setGroups: function (toolbar, groups) {\n            detail.builtGroups.set(map(groups, toolbar.getSystem().build));\n            refresh$1(toolbar, memFloatingToolbarButton, detail);\n          },\n          refresh: function (toolbar) {\n            return refresh$1(toolbar, memFloatingToolbarButton, detail);\n          },\n          toggle: function (toolbar) {\n            memFloatingToolbarButton.getOpt(toolbar).each(function (floatingToolbarButton) {\n              FloatingToolbarButton.toggle(floatingToolbarButton);\n            });\n          },\n          reposition: function (toolbar) {\n            memFloatingToolbarButton.getOpt(toolbar).each(function (floatingToolbarButton) {\n              FloatingToolbarButton.reposition(floatingToolbarButton);\n            });\n          },\n          getOverflow: function (toolbar) {\n            return memFloatingToolbarButton.getOpt(toolbar).bind(function (floatingToolbarButton) {\n              return FloatingToolbarButton.getToolbar(floatingToolbarButton);\n            });\n          }\n        },\n        domModification: { attributes: { role: 'group' } }\n      };\n    };\n    var SplitFloatingToolbar = composite$1({\n      name: 'SplitFloatingToolbar',\n      configFields: schema$n(),\n      partFields: parts$9(),\n      factory: factory$c,\n      apis: {\n        setGroups: function (apis, toolbar, groups) {\n          apis.setGroups(toolbar, groups);\n        },\n        refresh: function (apis, toolbar) {\n          apis.refresh(toolbar);\n        },\n        reposition: function (apis, toolbar) {\n          apis.reposition(toolbar);\n        },\n        toggle: function (apis, toolbar) {\n          apis.toggle(toolbar);\n        },\n        getOverflow: function (apis, toolbar) {\n          return apis.getOverflow(toolbar);\n        }\n      }\n    });\n\n    var getAnimationRoot = function (component, slideConfig) {\n      return slideConfig.getAnimationRoot.fold(function () {\n        return component.element();\n      }, function (get) {\n        return get(component);\n      });\n    };\n\n    var getDimensionProperty = function (slideConfig) {\n      return slideConfig.dimension.property;\n    };\n    var getDimension = function (slideConfig, elem) {\n      return slideConfig.dimension.getDimension(elem);\n    };\n    var disableTransitions = function (component, slideConfig) {\n      var root = getAnimationRoot(component, slideConfig);\n      remove$5(root, [\n        slideConfig.shrinkingClass,\n        slideConfig.growingClass\n      ]);\n    };\n    var setShrunk = function (component, slideConfig) {\n      remove$4(component.element(), slideConfig.openClass);\n      add$2(component.element(), slideConfig.closedClass);\n      set$2(component.element(), getDimensionProperty(slideConfig), '0px');\n      reflow(component.element());\n    };\n    var setGrown = function (component, slideConfig) {\n      remove$4(component.element(), slideConfig.closedClass);\n      add$2(component.element(), slideConfig.openClass);\n      remove$6(component.element(), getDimensionProperty(slideConfig));\n    };\n    var doImmediateShrink = function (component, slideConfig, slideState, _calculatedSize) {\n      slideState.setCollapsed();\n      set$2(component.element(), getDimensionProperty(slideConfig), getDimension(slideConfig, component.element()));\n      reflow(component.element());\n      disableTransitions(component, slideConfig);\n      setShrunk(component, slideConfig);\n      slideConfig.onStartShrink(component);\n      slideConfig.onShrunk(component);\n    };\n    var doStartShrink = function (component, slideConfig, slideState, calculatedSize) {\n      var size = calculatedSize.getOrThunk(function () {\n        return getDimension(slideConfig, component.element());\n      });\n      slideState.setCollapsed();\n      set$2(component.element(), getDimensionProperty(slideConfig), size);\n      reflow(component.element());\n      var root = getAnimationRoot(component, slideConfig);\n      remove$4(root, slideConfig.growingClass);\n      add$2(root, slideConfig.shrinkingClass);\n      setShrunk(component, slideConfig);\n      slideConfig.onStartShrink(component);\n    };\n    var doStartSmartShrink = function (component, slideConfig, slideState) {\n      var size = getDimension(slideConfig, component.element());\n      var shrinker = size === '0px' ? doImmediateShrink : doStartShrink;\n      shrinker(component, slideConfig, slideState, Option.some(size));\n    };\n    var doStartGrow = function (component, slideConfig, slideState) {\n      var root = getAnimationRoot(component, slideConfig);\n      var wasShrinking = has$2(root, slideConfig.shrinkingClass);\n      var beforeSize = getDimension(slideConfig, component.element());\n      setGrown(component, slideConfig);\n      var fullSize = getDimension(slideConfig, component.element());\n      var startPartialGrow = function () {\n        set$2(component.element(), getDimensionProperty(slideConfig), beforeSize);\n        reflow(component.element());\n      };\n      var startCompleteGrow = function () {\n        setShrunk(component, slideConfig);\n      };\n      var setStartSize = wasShrinking ? startPartialGrow : startCompleteGrow;\n      setStartSize();\n      remove$4(root, slideConfig.shrinkingClass);\n      add$2(root, slideConfig.growingClass);\n      setGrown(component, slideConfig);\n      set$2(component.element(), getDimensionProperty(slideConfig), fullSize);\n      slideState.setExpanded();\n      slideConfig.onStartGrow(component);\n    };\n    var refresh$2 = function (component, slideConfig, slideState) {\n      if (slideState.isExpanded()) {\n        remove$6(component.element(), getDimensionProperty(slideConfig));\n        var fullSize = getDimension(slideConfig, component.element());\n        set$2(component.element(), getDimensionProperty(slideConfig), fullSize);\n      }\n    };\n    var grow = function (component, slideConfig, slideState) {\n      if (!slideState.isExpanded()) {\n        doStartGrow(component, slideConfig, slideState);\n      }\n    };\n    var shrink = function (component, slideConfig, slideState) {\n      if (slideState.isExpanded()) {\n        doStartSmartShrink(component, slideConfig, slideState);\n      }\n    };\n    var immediateShrink = function (component, slideConfig, slideState) {\n      if (slideState.isExpanded()) {\n        doImmediateShrink(component, slideConfig, slideState, Option.none());\n      }\n    };\n    var hasGrown = function (component, slideConfig, slideState) {\n      return slideState.isExpanded();\n    };\n    var hasShrunk = function (component, slideConfig, slideState) {\n      return slideState.isCollapsed();\n    };\n    var isGrowing = function (component, slideConfig, slideState) {\n      var root = getAnimationRoot(component, slideConfig);\n      return has$2(root, slideConfig.growingClass) === true;\n    };\n    var isShrinking = function (component, slideConfig, slideState) {\n      var root = getAnimationRoot(component, slideConfig);\n      return has$2(root, slideConfig.shrinkingClass) === true;\n    };\n    var isTransitioning = function (component, slideConfig, slideState) {\n      return isGrowing(component, slideConfig) === true || isShrinking(component, slideConfig) === true;\n    };\n    var toggleGrow = function (component, slideConfig, slideState) {\n      var f = slideState.isExpanded() ? doStartSmartShrink : doStartGrow;\n      f(component, slideConfig, slideState);\n    };\n\n    var SlidingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        refresh: refresh$2,\n        grow: grow,\n        shrink: shrink,\n        immediateShrink: immediateShrink,\n        hasGrown: hasGrown,\n        hasShrunk: hasShrunk,\n        isGrowing: isGrowing,\n        isShrinking: isShrinking,\n        isTransitioning: isTransitioning,\n        toggleGrow: toggleGrow,\n        disableTransitions: disableTransitions\n    });\n\n    var exhibit$6 = function (base, slideConfig) {\n      var expanded = slideConfig.expanded;\n      return expanded ? nu$6({\n        classes: [slideConfig.openClass],\n        styles: {}\n      }) : nu$6({\n        classes: [slideConfig.closedClass],\n        styles: wrap$1(slideConfig.dimension.property, '0px')\n      });\n    };\n    var events$d = function (slideConfig, slideState) {\n      return derive([runOnSource(transitionend(), function (component, simulatedEvent) {\n          var raw = simulatedEvent.event().raw();\n          if (raw.propertyName === slideConfig.dimension.property) {\n            disableTransitions(component, slideConfig);\n            if (slideState.isExpanded()) {\n              remove$6(component.element(), slideConfig.dimension.property);\n            }\n            var notify = slideState.isExpanded() ? slideConfig.onGrown : slideConfig.onShrunk;\n            notify(component);\n          }\n        })]);\n    };\n\n    var ActiveSliding = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        exhibit: exhibit$6,\n        events: events$d\n    });\n\n    var SlidingSchema = [\n      strict$1('closedClass'),\n      strict$1('openClass'),\n      strict$1('shrinkingClass'),\n      strict$1('growingClass'),\n      option('getAnimationRoot'),\n      onHandler('onShrunk'),\n      onHandler('onStartShrink'),\n      onHandler('onGrown'),\n      onHandler('onStartGrow'),\n      defaulted$1('expanded', false),\n      strictOf('dimension', choose$1('property', {\n        width: [\n          output('property', 'width'),\n          output('getDimension', function (elem) {\n            return get$7(elem) + 'px';\n          })\n        ],\n        height: [\n          output('property', 'height'),\n          output('getDimension', function (elem) {\n            return get$6(elem) + 'px';\n          })\n        ]\n      }))\n    ];\n\n    var init$9 = function (spec) {\n      var state = Cell(spec.expanded);\n      var readState = function () {\n        return 'expanded: ' + state.get();\n      };\n      return nu$5({\n        isExpanded: function () {\n          return state.get() === true;\n        },\n        isCollapsed: function () {\n          return state.get() === false;\n        },\n        setCollapsed: curry(state.set, false),\n        setExpanded: curry(state.set, true),\n        readState: readState\n      });\n    };\n\n    var SlidingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$9\n    });\n\n    var Sliding = create$1({\n      fields: SlidingSchema,\n      name: 'sliding',\n      active: ActiveSliding,\n      apis: SlidingApis,\n      state: SlidingState\n    });\n\n    var schema$p = constant([\n      markers([\n        'closedClass',\n        'openClass',\n        'shrinkingClass',\n        'growingClass',\n        'overflowToggledClass'\n      ]),\n      onHandler('onOpened'),\n      onHandler('onClosed')\n    ].concat(schema$m()));\n    var parts$b = constant([\n      required({\n        factory: Toolbar,\n        schema: schema$l(),\n        name: 'primary'\n      }),\n      required({\n        factory: Toolbar,\n        schema: schema$l(),\n        name: 'overflow',\n        overrides: function (detail) {\n          return {\n            toolbarBehaviours: derive$1([\n              Sliding.config({\n                dimension: { property: 'height' },\n                closedClass: detail.markers.closedClass,\n                openClass: detail.markers.openClass,\n                shrinkingClass: detail.markers.shrinkingClass,\n                growingClass: detail.markers.growingClass,\n                onShrunk: function (comp) {\n                  getPart(comp, detail, 'overflow-button').each(function (button) {\n                    Toggling.off(button);\n                    Focusing.focus(button);\n                  });\n                  detail.onClosed(comp);\n                },\n                onGrown: function (comp) {\n                  Keying.focusIn(comp);\n                  detail.onOpened(comp);\n                },\n                onStartGrow: function (comp) {\n                  getPart(comp, detail, 'overflow-button').each(Toggling.on);\n                }\n              }),\n              Keying.config({\n                mode: 'acyclic',\n                onEscape: function (comp) {\n                  getPart(comp, detail, 'overflow-button').each(Focusing.focus);\n                  return Option.some(true);\n                }\n              })\n            ])\n          };\n        }\n      }),\n      external$1({\n        name: 'overflow-button',\n        overrides: function (detail) {\n          return {\n            buttonBehaviours: derive$1([Toggling.config({\n                toggleClass: detail.markers.overflowToggledClass,\n                aria: { mode: 'pressed' },\n                toggleOnExecute: false\n              })])\n          };\n        }\n      }),\n      external$1({ name: 'overflow-group' })\n    ]);\n\n    var toggleToolbar = function (toolbar, detail) {\n      getPart(toolbar, detail, 'overflow').each(function (overf) {\n        refresh$3(toolbar, detail);\n        Sliding.toggleGrow(overf);\n      });\n    };\n    var refresh$3 = function (toolbar, detail) {\n      getPart(toolbar, detail, 'overflow').each(function (overflow) {\n        refresh(toolbar, detail, function (groups) {\n          var builtGroups = map(groups, function (g) {\n            return premade$1(g);\n          });\n          Toolbar.setGroups(overflow, builtGroups);\n        });\n        getPart(toolbar, detail, 'overflow-button').each(function (button) {\n          if (Sliding.hasGrown(overflow)) {\n            Toggling.on(button);\n          }\n        });\n        Sliding.refresh(overflow);\n      });\n    };\n    var factory$d = function (detail, components, spec, externals) {\n      var toolbarToggleEvent = 'alloy.toolbar.toggle';\n      var doSetGroups = function (toolbar, groups) {\n        var built = map(groups, toolbar.getSystem().build);\n        detail.builtGroups.set(built);\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: augment(detail.splitToolbarBehaviours, [\n          Coupling.config({\n            others: {\n              overflowGroup: function (toolbar) {\n                return ToolbarGroup.sketch(__assign(__assign({}, externals['overflow-group']()), {\n                  items: [Button.sketch(__assign(__assign({}, externals['overflow-button']()), {\n                      action: function (_button) {\n                        emit(toolbar, toolbarToggleEvent);\n                      }\n                    }))]\n                }));\n              }\n            }\n          }),\n          config('toolbar-toggle-events', [run(toolbarToggleEvent, function (toolbar) {\n              getPart(toolbar, detail, 'overflow').each(function (overf) {\n                refresh$3(toolbar, detail);\n                Sliding.toggleGrow(overf);\n              });\n            })])\n        ]),\n        apis: {\n          setGroups: function (toolbar, groups) {\n            doSetGroups(toolbar, groups);\n            refresh$3(toolbar, detail);\n          },\n          refresh: function (toolbar) {\n            return refresh$3(toolbar, detail);\n          },\n          toggle: function (toolbar) {\n            return toggleToolbar(toolbar, detail);\n          }\n        },\n        domModification: { attributes: { role: 'group' } }\n      };\n    };\n    var SplitSlidingToolbar = composite$1({\n      name: 'SplitSlidingToolbar',\n      configFields: schema$p(),\n      partFields: parts$b(),\n      factory: factory$d,\n      apis: {\n        setGroups: function (apis, toolbar, groups) {\n          apis.setGroups(toolbar, groups);\n        },\n        refresh: function (apis, toolbar) {\n          apis.refresh(toolbar);\n        },\n        toggle: function (apis, toolbar) {\n          apis.toggle(toolbar);\n        }\n      }\n    });\n\n    var toolbarHeightChange = constant(generate$1('toolbar-height-change'));\n\n    var ReadOnlyChannel = 'silver.readonly';\n    var ReadOnlyDataSchema = objOf([strictBoolean('readonly')]);\n    var setDisabledAll = function (element, state) {\n      all('*', element.element()).forEach(function (elm) {\n        element.getSystem().getByDom(elm).each(function (comp) {\n          if (comp.hasConfigured(Disabling)) {\n            Disabling.set(comp, state);\n          }\n        });\n      });\n    };\n    var broadcastReadonly = function (uiComponents, readonly) {\n      var outerContainer = uiComponents.outerContainer;\n      var target = outerContainer.element();\n      if (readonly) {\n        uiComponents.mothership.broadcastOn([dismissPopups()], { target: target });\n        uiComponents.uiMothership.broadcastOn([dismissPopups()], { target: target });\n      }\n      uiComponents.mothership.broadcastOn([ReadOnlyChannel], { readonly: readonly });\n      uiComponents.uiMothership.broadcastOn([ReadOnlyChannel], { readonly: readonly });\n    };\n    var toggleToReadOnly = function (uiComponents, readonly) {\n      var outerContainer = uiComponents.outerContainer;\n      broadcastReadonly(uiComponents, readonly);\n      all('*', outerContainer.element()).forEach(function (elm) {\n        outerContainer.getSystem().getByDom(elm).each(function (comp) {\n          if (comp.hasConfigured(Disabling)) {\n            Disabling.set(comp, readonly);\n          }\n        });\n      });\n    };\n    var setupReadonlyModeSwitch = function (editor, uiComponents) {\n      editor.on('init', function () {\n        if (editor.mode.isReadOnly()) {\n          toggleToReadOnly(uiComponents, true);\n        }\n      });\n      editor.on('SwitchMode', function () {\n        return toggleToReadOnly(uiComponents, editor.mode.isReadOnly());\n      });\n      if (isReadOnly(editor)) {\n        editor.setMode('readonly');\n      }\n    };\n    var createReadonlyReceivingForOverflow = function (getOverflow) {\n      var _a;\n      return Receiving.config({\n        channels: (_a = {}, _a[ReadOnlyChannel] = {\n          schema: ReadOnlyDataSchema,\n          onReceive: function (comp, data) {\n            getOverflow(comp).each(function (toolbar) {\n              setDisabledAll(toolbar, data.readonly);\n            });\n          }\n        }, _a)\n      });\n    };\n\n    var renderToolbarGroupCommon = function (toolbarGroup) {\n      var attributes = toolbarGroup.title.fold(function () {\n        return {};\n      }, function (title) {\n        return { attributes: { title: title } };\n      });\n      return {\n        dom: __assign({\n          tag: 'div',\n          classes: ['tox-toolbar__group']\n        }, attributes),\n        components: [ToolbarGroup.parts().items({})],\n        items: toolbarGroup.items,\n        markers: { itemSelector: '*:not(.tox-split-button) > .tox-tbtn:not([disabled]), .tox-split-button:not([disabled]), .tox-toolbar-nav-js:not([disabled])' },\n        tgroupBehaviours: derive$1([\n          Tabstopping.config({}),\n          Focusing.config({})\n        ])\n      };\n    };\n    var renderToolbarGroup = function (toolbarGroup) {\n      return ToolbarGroup.sketch(renderToolbarGroupCommon(toolbarGroup));\n    };\n    var getToolbarbehaviours = function (toolbarSpec, modeName, getOverflow) {\n      var onAttached = runOnAttached(function (component) {\n        var groups = map(toolbarSpec.initGroups, renderToolbarGroup);\n        Toolbar.setGroups(component, groups);\n      });\n      return derive$1([\n        Keying.config({\n          mode: modeName,\n          onEscape: toolbarSpec.onEscape,\n          selector: '.tox-toolbar__group'\n        }),\n        config('toolbar-events', [onAttached]),\n        createReadonlyReceivingForOverflow(getOverflow)\n      ]);\n    };\n    var renderMoreToolbarCommon = function (toolbarSpec, getOverflow) {\n      var modeName = toolbarSpec.cyclicKeying ? 'cyclic' : 'acyclic';\n      return {\n        uid: toolbarSpec.uid,\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar-overlord']\n        },\n        parts: {\n          'overflow-group': renderToolbarGroupCommon({\n            title: Option.none(),\n            items: []\n          }),\n          'overflow-button': renderIconButtonSpec({\n            name: 'more',\n            icon: Option.some('more-drawer'),\n            disabled: false,\n            tooltip: Option.some('More...'),\n            primary: false,\n            borderless: false\n          }, Option.none(), toolbarSpec.backstage.shared.providers)\n        },\n        splitToolbarBehaviours: getToolbarbehaviours(toolbarSpec, modeName, getOverflow)\n      };\n    };\n    var renderFloatingMoreToolbar = function (toolbarSpec) {\n      var baseSpec = renderMoreToolbarCommon(toolbarSpec, SplitFloatingToolbar.getOverflow);\n      var overflowXOffset = 4;\n      var primary = SplitFloatingToolbar.parts().primary({\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar__primary']\n        }\n      });\n      return SplitFloatingToolbar.sketch(__assign(__assign({}, baseSpec), {\n        lazySink: toolbarSpec.getSink,\n        getOverflowBounds: function () {\n          var headerElem = toolbarSpec.moreDrawerData.lazyHeader().element();\n          var headerBounds = absolute$1(headerElem);\n          var docElem = documentElement(headerElem);\n          var docBounds = absolute$1(docElem);\n          var height = Math.max(docElem.dom().scrollHeight, docBounds.height());\n          return bounds$1(headerBounds.x() + overflowXOffset, docBounds.y(), headerBounds.width() - overflowXOffset * 2, height);\n        },\n        parts: __assign(__assign({}, baseSpec.parts), {\n          overflow: {\n            dom: {\n              tag: 'div',\n              classes: ['tox-toolbar__overflow'],\n              attributes: toolbarSpec.attributes\n            }\n          }\n        }),\n        components: [primary],\n        markers: { overflowToggledClass: 'tox-tbtn--enabled' }\n      }));\n    };\n    var renderSlidingMoreToolbar = function (toolbarSpec) {\n      var primary = SplitSlidingToolbar.parts().primary({\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar__primary']\n        }\n      });\n      var overflow = SplitSlidingToolbar.parts().overflow({\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar__overflow']\n        }\n      });\n      var baseSpec = renderMoreToolbarCommon(toolbarSpec, Option.none);\n      return SplitSlidingToolbar.sketch(__assign(__assign({}, baseSpec), {\n        components: [\n          primary,\n          overflow\n        ],\n        markers: {\n          openClass: 'tox-toolbar__overflow--open',\n          closedClass: 'tox-toolbar__overflow--closed',\n          growingClass: 'tox-toolbar__overflow--growing',\n          shrinkingClass: 'tox-toolbar__overflow--shrinking',\n          overflowToggledClass: 'tox-tbtn--enabled'\n        },\n        onOpened: function (comp) {\n          comp.getSystem().broadcastOn([toolbarHeightChange()], { type: 'opened' });\n        },\n        onClosed: function (comp) {\n          comp.getSystem().broadcastOn([toolbarHeightChange()], { type: 'closed' });\n        }\n      }));\n    };\n    var renderToolbar = function (toolbarSpec) {\n      var modeName = toolbarSpec.cyclicKeying ? 'cyclic' : 'acyclic';\n      return Toolbar.sketch({\n        uid: toolbarSpec.uid,\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar'].concat(toolbarSpec.type === ToolbarMode.scrolling ? ['tox-toolbar--scrolling'] : [])\n        },\n        components: [Toolbar.parts().groups({})],\n        toolbarBehaviours: getToolbarbehaviours(toolbarSpec, modeName, constant(Option.none()))\n      });\n    };\n\n    var baseToolbarButtonFields = [\n      defaultedBoolean('disabled', false),\n      optionString('tooltip'),\n      optionString('icon'),\n      optionString('text'),\n      defaultedFunction('onSetup', function () {\n        return noop;\n      })\n    ];\n    var toolbarButtonSchema = objOf([\n      strictString('type'),\n      strictFunction('onAction')\n    ].concat(baseToolbarButtonFields));\n    var createToolbarButton = function (spec) {\n      return asRaw('toolbarbutton', toolbarButtonSchema, spec);\n    };\n\n    var baseMenuButtonFields = [\n      optionString('text'),\n      optionString('tooltip'),\n      optionString('icon'),\n      strictFunction('fetch'),\n      defaultedFunction('onSetup', function () {\n        return noop;\n      })\n    ];\n\n    var MenuButtonSchema = objOf(__spreadArrays([strictString('type')], baseMenuButtonFields));\n    var createMenuButton = function (spec) {\n      return asRaw('menubutton', MenuButtonSchema, spec);\n    };\n\n    var splitButtonSchema = objOf([\n      strictString('type'),\n      optionString('tooltip'),\n      optionString('icon'),\n      optionString('text'),\n      optionFunction('select'),\n      strictFunction('fetch'),\n      defaultedFunction('onSetup', function () {\n        return noop;\n      }),\n      defaultedStringEnum('presets', 'normal', [\n        'normal',\n        'color',\n        'listpreview'\n      ]),\n      defaulted$1('columns', 1),\n      strictFunction('onAction'),\n      strictFunction('onItemAction')\n    ]);\n    var createSplitButton = function (spec) {\n      return asRaw('SplitButton', splitButtonSchema, spec);\n    };\n\n    var baseToolbarToggleButtonFields = [defaultedBoolean('active', false)].concat(baseToolbarButtonFields);\n    var toggleButtonSchema = objOf(baseToolbarToggleButtonFields.concat([\n      strictString('type'),\n      strictFunction('onAction')\n    ]));\n    var createToggleButton = function (spec) {\n      return asRaw('ToggleButton', toggleButtonSchema, spec);\n    };\n\n    var groupToolbarButtonSchema = objOf([\n      strictString('type'),\n      strictOf('items', oneOf([\n        arrOfObj$1([\n          strictString('name'),\n          strictArrayOf('items', string)\n        ]),\n        string\n      ]))\n    ].concat(baseToolbarButtonFields));\n    var createGroupToolbarButton = function (spec) {\n      return asRaw('GroupToolbarButton', groupToolbarButtonSchema, spec);\n    };\n\n    var contextBarFields = [\n      defaultedFunction('predicate', function () {\n        return false;\n      }),\n      defaultedStringEnum('scope', 'node', [\n        'node',\n        'editor'\n      ]),\n      defaultedStringEnum('position', 'selection', [\n        'node',\n        'selection',\n        'line'\n      ])\n    ];\n    var contextButtonFields = baseToolbarButtonFields.concat([\n      defaulted$1('type', 'contextformbutton'),\n      defaulted$1('primary', false),\n      strictFunction('onAction'),\n      state$1('original', identity)\n    ]);\n    var contextToggleButtonFields = baseToolbarToggleButtonFields.concat([\n      defaulted$1('type', 'contextformbutton'),\n      defaulted$1('primary', false),\n      strictFunction('onAction'),\n      state$1('original', identity)\n    ]);\n    var launchButtonFields = baseToolbarButtonFields.concat([defaulted$1('type', 'contextformbutton')]);\n    var launchToggleButtonFields = baseToolbarToggleButtonFields.concat([defaulted$1('type', 'contextformtogglebutton')]);\n    var toggleOrNormal = choose$1('type', {\n      contextformbutton: contextButtonFields,\n      contextformtogglebutton: contextToggleButtonFields\n    });\n    var contextFormSchema = objOf([\n      defaulted$1('type', 'contextform'),\n      defaultedFunction('initValue', function () {\n        return '';\n      }),\n      optionString('label'),\n      strictArrayOf('commands', toggleOrNormal),\n      optionOf('launch', choose$1('type', {\n        contextformbutton: launchButtonFields,\n        contextformtogglebutton: launchToggleButtonFields\n      }))\n    ].concat(contextBarFields));\n    var contextToolbarSchema = objOf([\n      defaulted$1('type', 'contexttoolbar'),\n      strictString('items')\n    ].concat(contextBarFields));\n    var createContextToolbar = function (spec) {\n      return asRaw('ContextToolbar', contextToolbarSchema, spec);\n    };\n    var createContextForm = function (spec) {\n      return asRaw('ContextForm', contextFormSchema, spec);\n    };\n\n    var getState$2 = function (component, replaceConfig, reflectState) {\n      return reflectState;\n    };\n\n    var ReflectingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getState: getState$2\n    });\n\n    var events$e = function (reflectingConfig, reflectingState) {\n      var update = function (component, data) {\n        reflectingConfig.updateState.each(function (updateState) {\n          var newState = updateState(component, data);\n          reflectingState.set(newState);\n        });\n        reflectingConfig.renderComponents.each(function (renderComponents) {\n          var newComponents = renderComponents(data, reflectingState.get());\n          var newChildren = map(newComponents, component.getSystem().build);\n          replaceChildren(component, newChildren);\n        });\n      };\n      return derive([\n        run(receive(), function (component, message) {\n          var receivingData = message;\n          var channel = reflectingConfig.channel;\n          if (contains(receivingData.channels(), channel)) {\n            update(component, receivingData.data());\n          }\n        }),\n        runOnAttached(function (comp, se) {\n          reflectingConfig.initialData.each(function (rawData) {\n            update(comp, rawData);\n          });\n        })\n      ]);\n    };\n\n    var ActiveReflecting = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$e\n    });\n\n    var init$a = function () {\n      var cell = Cell(Option.none());\n      var set = function (optS) {\n        return cell.set(optS);\n      };\n      var clear = function () {\n        return cell.set(Option.none());\n      };\n      var get = function () {\n        return cell.get();\n      };\n      var readState = function () {\n        return cell.get().fold(function () {\n          return 'none';\n        }, function (x) {\n          return x;\n        });\n      };\n      return {\n        readState: readState,\n        get: get,\n        set: set,\n        clear: clear\n      };\n    };\n\n    var ReflectingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$a\n    });\n\n    var ReflectingSchema = [\n      strict$1('channel'),\n      option('renderComponents'),\n      option('updateState'),\n      option('initialData')\n    ];\n\n    var Reflecting = create$1({\n      fields: ReflectingSchema,\n      name: 'reflecting',\n      active: ActiveReflecting,\n      apis: ReflectingApis,\n      state: ReflectingState\n    });\n\n    var schema$q = constant([\n      strict$1('toggleClass'),\n      strict$1('fetch'),\n      onStrictHandler('onExecute'),\n      defaulted$1('getHotspot', Option.some),\n      defaulted$1('getAnchorOverrides', constant({})),\n      schema$1(),\n      onStrictHandler('onItemExecute'),\n      option('lazySink'),\n      strict$1('dom'),\n      onHandler('onOpen'),\n      field$1('splitDropdownBehaviours', [\n        Coupling,\n        Keying,\n        Focusing\n      ]),\n      defaulted$1('matchWidth', false),\n      defaulted$1('useMinWidth', false),\n      defaulted$1('eventOrder', {}),\n      option('role')\n    ].concat(sandboxFields()));\n    var arrowPart = required({\n      factory: Button,\n      schema: [strict$1('dom')],\n      name: 'arrow',\n      defaults: function () {\n        return { buttonBehaviours: derive$1([Focusing.revoke()]) };\n      },\n      overrides: function (detail) {\n        return {\n          dom: {\n            tag: 'span',\n            attributes: { role: 'presentation' }\n          },\n          action: function (arrow) {\n            arrow.getSystem().getByUid(detail.uid).each(emitExecute);\n          },\n          buttonBehaviours: derive$1([Toggling.config({\n              toggleOnExecute: false,\n              toggleClass: detail.toggleClass\n            })])\n        };\n      }\n    });\n    var buttonPart = required({\n      factory: Button,\n      schema: [strict$1('dom')],\n      name: 'button',\n      defaults: function () {\n        return { buttonBehaviours: derive$1([Focusing.revoke()]) };\n      },\n      overrides: function (detail) {\n        return {\n          dom: {\n            tag: 'span',\n            attributes: { role: 'presentation' }\n          },\n          action: function (btn) {\n            btn.getSystem().getByUid(detail.uid).each(function (splitDropdown) {\n              detail.onExecute(splitDropdown, btn);\n            });\n          }\n        };\n      }\n    });\n    var parts$c = constant([\n      arrowPart,\n      buttonPart,\n      optional({\n        factory: {\n          sketch: function (spec) {\n            return {\n              uid: spec.uid,\n              dom: {\n                tag: 'span',\n                styles: { display: 'none' },\n                attributes: { 'aria-hidden': 'true' },\n                innerHtml: spec.text\n              }\n            };\n          }\n        },\n        schema: [strict$1('text')],\n        name: 'aria-descriptor'\n      }),\n      external$1({\n        schema: [tieredMenuMarkers()],\n        name: 'menu',\n        defaults: function (detail) {\n          return {\n            onExecute: function (tmenu, item) {\n              tmenu.getSystem().getByUid(detail.uid).each(function (splitDropdown) {\n                detail.onItemExecute(splitDropdown, tmenu, item);\n              });\n            }\n          };\n        }\n      }),\n      partType()\n    ]);\n\n    var factory$e = function (detail, components, spec, externals) {\n      var switchToMenu = function (sandbox) {\n        Composing.getCurrent(sandbox).each(function (current) {\n          Highlighting.highlightFirst(current);\n          Keying.focusIn(current);\n        });\n      };\n      var action = function (component) {\n        var onOpenSync = switchToMenu;\n        togglePopup(detail, function (x) {\n          return x;\n        }, component, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);\n      };\n      var openMenu = function (comp) {\n        action(comp);\n        return Option.some(true);\n      };\n      var executeOnButton = function (comp) {\n        var button = getPartOrDie(comp, detail, 'button');\n        emitExecute(button);\n        return Option.some(true);\n      };\n      var buttonEvents = __assign(__assign({}, derive([runOnAttached(function (component, simulatedEvent) {\n          var ariaDescriptor = getPart(component, detail, 'aria-descriptor');\n          ariaDescriptor.each(function (descriptor) {\n            var descriptorId = generate$1('aria');\n            set$1(descriptor.element(), 'id', descriptorId);\n            set$1(component.element(), 'aria-describedby', descriptorId);\n          });\n        })])), events$7(Option.some(action)));\n      var apis = {\n        repositionMenus: function (comp) {\n          if (Toggling.isOn(comp)) {\n            repositionMenus(comp);\n          }\n        }\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        apis: apis,\n        eventOrder: __assign(__assign({}, detail.eventOrder), {\n          'alloy.execute': [\n            'disabling',\n            'toggling',\n            'alloy.base.behaviour'\n          ]\n        }),\n        events: buttonEvents,\n        behaviours: augment(detail.splitDropdownBehaviours, [\n          Coupling.config({\n            others: {\n              sandbox: function (hotspot) {\n                var arrow = getPartOrDie(hotspot, detail, 'arrow');\n                var extras = {\n                  onOpen: function () {\n                    Toggling.on(arrow);\n                    Toggling.on(hotspot);\n                  },\n                  onClose: function () {\n                    Toggling.off(arrow);\n                    Toggling.off(hotspot);\n                  }\n                };\n                return makeSandbox(detail, hotspot, extras);\n              }\n            }\n          }),\n          Keying.config({\n            mode: 'special',\n            onSpace: executeOnButton,\n            onEnter: executeOnButton,\n            onDown: openMenu\n          }),\n          Focusing.config({}),\n          Toggling.config({\n            toggleOnExecute: false,\n            aria: { mode: 'expanded' }\n          })\n        ]),\n        domModification: {\n          attributes: {\n            'role': detail.role.getOr('button'),\n            'aria-haspopup': true\n          }\n        }\n      };\n    };\n    var SplitDropdown = composite$1({\n      name: 'SplitDropdown',\n      configFields: schema$q(),\n      partFields: parts$c(),\n      factory: factory$e,\n      apis: {\n        repositionMenus: function (apis, comp) {\n          return apis.repositionMenus(comp);\n        }\n      }\n    });\n\n    var getButtonApi = function (component) {\n      return {\n        isDisabled: function () {\n          return Disabling.isDisabled(component);\n        },\n        setDisabled: function (state) {\n          return Disabling.set(component, state);\n        }\n      };\n    };\n    var getToggleApi = function (component) {\n      return {\n        setActive: function (state) {\n          Toggling.set(component, state);\n        },\n        isActive: function () {\n          return Toggling.isOn(component);\n        },\n        isDisabled: function () {\n          return Disabling.isDisabled(component);\n        },\n        setDisabled: function (state) {\n          return Disabling.set(component, state);\n        }\n      };\n    };\n    var getTooltipAttributes = function (tooltip, providersBackstage) {\n      return tooltip.map(function (tooltip) {\n        return {\n          'aria-label': providersBackstage.translate(tooltip),\n          'title': providersBackstage.translate(tooltip)\n        };\n      }).getOr({});\n    };\n    var focusButtonEvent = generate$1('focus-button');\n    var rtlIcon$1 = [\n      'checklist',\n      'ordered-list'\n    ];\n    var rtlTransform$1 = [\n      'indent',\n      'outdent',\n      'table-insert-column-after',\n      'table-insert-column-before',\n      'unordered-list'\n    ];\n    var renderCommonStructure = function (icon, text, tooltip, receiver, behaviours, providersBackstage) {\n      var _a;\n      var getIconName = function (iconName) {\n        return global$7.isRtl() && contains(rtlIcon$1, iconName) ? iconName + '-rtl' : iconName;\n      };\n      var needsRtlClass = global$7.isRtl() && icon.exists(function (name) {\n        return contains(rtlTransform$1, name);\n      });\n      return {\n        dom: {\n          tag: 'button',\n          classes: ['tox-tbtn'].concat(text.isSome() ? ['tox-tbtn--select'] : []).concat(needsRtlClass ? ['tox-tbtn__icon-rtl'] : []),\n          attributes: getTooltipAttributes(tooltip, providersBackstage)\n        },\n        components: componentRenderPipeline([\n          icon.map(function (iconName) {\n            return renderIconFromPack(getIconName(iconName), providersBackstage.icons);\n          }),\n          text.map(function (text) {\n            return renderLabel$1(text, 'tox-tbtn', providersBackstage);\n          })\n        ]),\n        eventOrder: (_a = {}, _a[mousedown()] = [\n          'focusing',\n          'alloy.base.behaviour',\n          'common-button-display-events'\n        ], _a),\n        buttonBehaviours: derive$1([config('common-button-display-events', [run(mousedown(), function (button, se) {\n              se.event().prevent();\n              emit(button, focusButtonEvent);\n            })])].concat(receiver.map(function (r) {\n          return Reflecting.config({\n            channel: r,\n            initialData: {\n              icon: icon,\n              text: text\n            },\n            renderComponents: function (data, _state) {\n              return componentRenderPipeline([\n                data.icon.map(function (iconName) {\n                  return renderIconFromPack(getIconName(iconName), providersBackstage.icons);\n                }),\n                data.text.map(function (text) {\n                  return renderLabel$1(text, 'tox-tbtn', providersBackstage);\n                })\n              ]);\n            }\n          });\n        }).toArray()).concat(behaviours.getOr([])))\n      };\n    };\n    var renderFloatingToolbarButton = function (spec, backstage, identifyButtons, attributes) {\n      var sharedBackstage = backstage.shared;\n      return FloatingToolbarButton.sketch({\n        lazySink: sharedBackstage.getSink,\n        fetch: function () {\n          return Future.nu(function (resolve) {\n            resolve(map(identifyButtons(spec.items), renderToolbarGroup));\n          });\n        },\n        markers: { toggledClass: 'tox-tbtn--enabled' },\n        parts: {\n          button: renderCommonStructure(spec.icon, spec.text, spec.tooltip, Option.none(), Option.none(), sharedBackstage.providers),\n          toolbar: {\n            dom: {\n              tag: 'div',\n              classes: ['tox-toolbar__overflow'],\n              attributes: attributes\n            }\n          }\n        }\n      });\n    };\n    var renderCommonToolbarButton = function (spec, specialisation, providersBackstage) {\n      var editorOffCell = Cell(noop);\n      var structure = renderCommonStructure(spec.icon, spec.text, spec.tooltip, Option.none(), Option.none(), providersBackstage);\n      return Button.sketch({\n        dom: structure.dom,\n        components: structure.components,\n        eventOrder: toolbarButtonEventOrder,\n        buttonBehaviours: derive$1([\n          config('toolbar-button-events', [\n            onToolbarButtonExecute({\n              onAction: spec.onAction,\n              getApi: specialisation.getApi\n            }),\n            onControlAttached(specialisation, editorOffCell),\n            onControlDetached(specialisation, editorOffCell)\n          ]),\n          DisablingConfigs.toolbarButton(spec.disabled)\n        ].concat(specialisation.toolbarButtonBehaviours))\n      });\n    };\n    var renderToolbarButton = function (spec, providersBackstage) {\n      return renderToolbarButtonWith(spec, providersBackstage, []);\n    };\n    var renderToolbarButtonWith = function (spec, providersBackstage, bonusEvents) {\n      return renderCommonToolbarButton(spec, {\n        toolbarButtonBehaviours: [].concat(bonusEvents.length > 0 ? [config('toolbarButtonWith', bonusEvents)] : []),\n        getApi: getButtonApi,\n        onSetup: spec.onSetup\n      }, providersBackstage);\n    };\n    var renderToolbarToggleButton = function (spec, providersBackstage) {\n      return renderToolbarToggleButtonWith(spec, providersBackstage, []);\n    };\n    var renderToolbarToggleButtonWith = function (spec, providersBackstage, bonusEvents) {\n      return deepMerge(renderCommonToolbarButton(spec, {\n        toolbarButtonBehaviours: [\n          Replacing.config({}),\n          Toggling.config({\n            toggleClass: 'tox-tbtn--enabled',\n            aria: { mode: 'pressed' },\n            toggleOnExecute: false\n          })\n        ].concat(bonusEvents.length > 0 ? [config('toolbarToggleButtonWith', bonusEvents)] : []),\n        getApi: getToggleApi,\n        onSetup: spec.onSetup\n      }, providersBackstage));\n    };\n    var fetchChoices = function (getApi, spec, providersBackstage) {\n      return function (comp) {\n        return Future.nu(function (callback) {\n          return spec.fetch(callback);\n        }).map(function (items) {\n          return Option.from(createTieredDataFrom(deepMerge(createPartialChoiceMenu(generate$1('menu-value'), items, function (value) {\n            spec.onItemAction(getApi(comp), value);\n          }, spec.columns, spec.presets, ItemResponse$1.CLOSE_ON_EXECUTE, spec.select.getOr(function () {\n            return false;\n          }), providersBackstage), {\n            movement: deriveMenuMovement(spec.columns, spec.presets),\n            menuBehaviours: SimpleBehaviours.unnamedEvents(spec.columns !== 'auto' ? [] : [runOnAttached(function (comp, se) {\n                detectSize(comp, 4, classForPreset(spec.presets)).each(function (_a) {\n                  var numRows = _a.numRows, numColumns = _a.numColumns;\n                  Keying.setGridSize(comp, numRows, numColumns);\n                });\n              })])\n          })));\n        });\n      };\n    };\n    var renderSplitButton = function (spec, sharedBackstage) {\n      var _a;\n      var displayChannel = generate$1('channel-update-split-dropdown-display');\n      var getApi = function (comp) {\n        return {\n          isDisabled: function () {\n            return Disabling.isDisabled(comp);\n          },\n          setDisabled: function (state) {\n            return Disabling.set(comp, state);\n          },\n          setIconFill: function (id, value) {\n            descendant$1(comp.element(), 'svg path[id=\"' + id + '\"], rect[id=\"' + id + '\"]').each(function (underlinePath) {\n              set$1(underlinePath, 'fill', value);\n            });\n          },\n          setIconStroke: function (id, value) {\n            descendant$1(comp.element(), 'svg path[id=\"' + id + '\"], rect[id=\"' + id + '\"]').each(function (underlinePath) {\n              set$1(underlinePath, 'stroke', value);\n            });\n          },\n          setActive: function (state) {\n            set$1(comp.element(), 'aria-pressed', state);\n            descendant$1(comp.element(), 'span').each(function (button) {\n              comp.getSystem().getByDom(button).each(function (buttonComp) {\n                return Toggling.set(buttonComp, state);\n              });\n            });\n          },\n          isActive: function () {\n            return descendant$1(comp.element(), 'span').exists(function (button) {\n              return comp.getSystem().getByDom(button).exists(Toggling.isOn);\n            });\n          }\n        };\n      };\n      var editorOffCell = Cell(noop);\n      var specialisation = {\n        getApi: getApi,\n        onSetup: spec.onSetup\n      };\n      return SplitDropdown.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-split-button'],\n          attributes: __assign({ 'aria-pressed': false }, getTooltipAttributes(spec.tooltip, sharedBackstage.providers))\n        },\n        onExecute: function (button) {\n          spec.onAction(getApi(button));\n        },\n        onItemExecute: function (a, b, c) {\n        },\n        splitDropdownBehaviours: derive$1([\n          DisablingConfigs.splitButton(false),\n          config('split-dropdown-events', [\n            run(focusButtonEvent, Focusing.focus),\n            onControlAttached(specialisation, editorOffCell),\n            onControlDetached(specialisation, editorOffCell)\n          ]),\n          Unselecting.config({})\n        ]),\n        eventOrder: (_a = {}, _a[attachedToDom()] = [\n          'alloy.base.behaviour',\n          'split-dropdown-events'\n        ], _a),\n        toggleClass: 'tox-tbtn--enabled',\n        lazySink: sharedBackstage.getSink,\n        fetch: fetchChoices(getApi, spec, sharedBackstage.providers),\n        parts: { menu: part(false, spec.columns, spec.presets) },\n        components: [\n          SplitDropdown.parts().button(renderCommonStructure(spec.icon, spec.text, Option.none(), Option.some(displayChannel), Option.some([Toggling.config({\n              toggleClass: 'tox-tbtn--enabled',\n              toggleOnExecute: false\n            })]), sharedBackstage.providers)),\n          SplitDropdown.parts().arrow({\n            dom: {\n              tag: 'button',\n              classes: [\n                'tox-tbtn',\n                'tox-split-button__chevron'\n              ],\n              innerHtml: get$d('chevron-down', sharedBackstage.providers.icons)\n            }\n          }),\n          SplitDropdown.parts()['aria-descriptor']({ text: sharedBackstage.providers.translate('To open the popup, press Shift+Enter') })\n        ]\n      });\n    };\n\n    var getFormApi = function (input) {\n      return {\n        hide: function () {\n          return emit(input, sandboxClose());\n        },\n        getValue: function () {\n          return Representing.getValue(input);\n        }\n      };\n    };\n    var runOnExecute$1 = function (memInput, original) {\n      return run(internalToolbarButtonExecute, function (comp, se) {\n        var input = memInput.get(comp);\n        var formApi = getFormApi(input);\n        original.onAction(formApi, se.event().buttonApi());\n      });\n    };\n    var renderContextButton = function (memInput, button, extras) {\n      var _a = button.original, primary = _a.primary, rest = __rest(_a, ['primary']);\n      var bridged = getOrDie(createToolbarButton(__assign(__assign({}, rest), {\n        type: 'button',\n        onAction: function () {\n        }\n      })));\n      return renderToolbarButtonWith(bridged, extras.backstage.shared.providers, [runOnExecute$1(memInput, button)]);\n    };\n    var renderContextToggleButton = function (memInput, button, extras) {\n      var _a = button.original, primary = _a.primary, rest = __rest(_a, ['primary']);\n      var bridged = getOrDie(createToggleButton(__assign(__assign({}, rest), {\n        type: 'togglebutton',\n        onAction: function () {\n        }\n      })));\n      return renderToolbarToggleButtonWith(bridged, extras.backstage.shared.providers, [runOnExecute$1(memInput, button)]);\n    };\n    var generateOne$1 = function (memInput, button, providersBackstage) {\n      var extras = { backstage: { shared: { providers: providersBackstage } } };\n      if (button.type === 'contextformtogglebutton') {\n        return renderContextToggleButton(memInput, button, extras);\n      } else {\n        return renderContextButton(memInput, button, extras);\n      }\n    };\n    var generate$7 = function (memInput, buttons, providersBackstage) {\n      var mementos = map(buttons, function (button) {\n        return record(generateOne$1(memInput, button, providersBackstage));\n      });\n      var asSpecs = function () {\n        return map(mementos, function (mem) {\n          return mem.asSpec();\n        });\n      };\n      var findPrimary = function (compInSystem) {\n        return findMap(buttons, function (button, i) {\n          if (button.primary) {\n            return Option.from(mementos[i]).bind(function (mem) {\n              return mem.getOpt(compInSystem);\n            }).filter(not(Disabling.isDisabled));\n          } else {\n            return Option.none();\n          }\n        });\n      };\n      return {\n        asSpecs: asSpecs,\n        findPrimary: findPrimary\n      };\n    };\n\n    var renderContextForm = function (toolbarType, ctx, backstage) {\n      var inputAttributes = ctx.label.fold(function () {\n        return {};\n      }, function (label) {\n        return { 'aria-label': label };\n      });\n      var memInput = record(Input.sketch({\n        inputClasses: [\n          'tox-toolbar-textfield',\n          'tox-toolbar-nav-js'\n        ],\n        data: ctx.initValue(),\n        inputAttributes: inputAttributes,\n        selectOnFocus: true,\n        inputBehaviours: derive$1([Keying.config({\n            mode: 'special',\n            onEnter: function (input) {\n              return commands.findPrimary(input).map(function (primary) {\n                emitExecute(primary);\n                return true;\n              });\n            },\n            onLeft: function (comp, se) {\n              se.cut();\n              return Option.none();\n            },\n            onRight: function (comp, se) {\n              se.cut();\n              return Option.none();\n            }\n          })])\n      }));\n      var commands = generate$7(memInput, ctx.commands, backstage.shared.providers);\n      return renderToolbar({\n        type: toolbarType,\n        uid: generate$1('context-toolbar'),\n        initGroups: [\n          {\n            title: Option.none(),\n            items: [memInput.asSpec()]\n          },\n          {\n            title: Option.none(),\n            items: commands.asSpecs()\n          }\n        ],\n        onEscape: Option.none,\n        cyclicKeying: true\n      });\n    };\n    var ContextForm = { renderContextForm: renderContextForm };\n\n    var getHorizontalBounds = function (contentAreaBox, viewportBounds) {\n      var x = Math.max(viewportBounds.x(), contentAreaBox.x());\n      var contentBoxWidth = contentAreaBox.right() - x;\n      var maxViewportWidth = viewportBounds.width() - (x - viewportBounds.x());\n      var width = Math.min(contentBoxWidth, maxViewportWidth);\n      return {\n        x: x,\n        width: width\n      };\n    };\n    var getVerticalBounds = function (editor, contentAreaBox, viewportBounds) {\n      var container = Element.fromDom(editor.getContainer());\n      var header = descendant$1(container, '.tox-editor-header').getOr(container);\n      var headerBox = box(header);\n      var isToolbarBelowContentArea = headerBox.y() >= contentAreaBox.bottom();\n      var isToolbarLocationTop$1 = isToolbarLocationTop(editor);\n      var isToolbarAbove = isToolbarLocationTop$1 && !isToolbarBelowContentArea;\n      if (editor.inline && isToolbarAbove) {\n        return {\n          y: Math.max(headerBox.bottom(), viewportBounds.y()),\n          bottom: viewportBounds.bottom()\n        };\n      }\n      if (editor.inline && !isToolbarAbove) {\n        return {\n          y: viewportBounds.y(),\n          bottom: Math.min(headerBox.y(), viewportBounds.bottom())\n        };\n      }\n      var containerBounds = box(container);\n      if (isToolbarAbove) {\n        return {\n          y: Math.max(headerBox.bottom(), viewportBounds.y()),\n          bottom: Math.min(containerBounds.bottom(), viewportBounds.bottom())\n        };\n      }\n      return {\n        y: Math.max(containerBounds.y(), viewportBounds.y()),\n        bottom: Math.min(headerBox.y(), viewportBounds.bottom())\n      };\n    };\n    var getContextToolbarBounds = function (editor) {\n      var viewportBounds = getBounds(domGlobals.window);\n      var contentAreaBox = box(Element.fromDom(editor.getContentAreaContainer()));\n      var toolbarOrMenubarEnabled = isMenubarEnabled(editor) || isToolbarEnabled(editor) || isMultipleToolbars(editor);\n      var _a = getHorizontalBounds(contentAreaBox, viewportBounds), x = _a.x, width = _a.width;\n      if (editor.inline && !toolbarOrMenubarEnabled) {\n        return bounds$1(x, viewportBounds.y(), width, viewportBounds.height());\n      } else {\n        var _b = getVerticalBounds(editor, contentAreaBox, viewportBounds), y = _b.y, bottom = _b.bottom;\n        return bounds$1(x, y, width, bottom - y);\n      }\n    };\n\n    var matchTargetWith = function (elem, toolbars) {\n      return findMap(toolbars, function (toolbarApi) {\n        return toolbarApi.predicate(elem.dom()) ? Option.some({\n          toolbarApi: toolbarApi,\n          elem: elem\n        }) : Option.none();\n      });\n    };\n    var lookup$1 = function (scopes, editor) {\n      var rootElem = Element.fromDom(editor.getBody());\n      var isRoot = function (elem) {\n        return eq(elem, rootElem);\n      };\n      var isOutsideRoot = function (startNode) {\n        return !isRoot(startNode) && !contains$2(rootElem, startNode);\n      };\n      var startNode = Element.fromDom(editor.selection.getNode());\n      if (isOutsideRoot(startNode)) {\n        return Option.none();\n      }\n      return matchTargetWith(startNode, scopes.inNodeScope).orThunk(function () {\n        return matchTargetWith(startNode, scopes.inEditorScope).orThunk(function () {\n          if (isRoot(startNode)) {\n            return Option.none();\n          } else {\n            return ancestor(startNode, function (elem) {\n              return matchTargetWith(elem, scopes.inNodeScope);\n            }, isRoot);\n          }\n        });\n      });\n    };\n    var ToolbarLookup = { lookup: lookup$1 };\n\n    var categorise = function (contextToolbars, navigate) {\n      var forms = {};\n      var inNodeScope = [];\n      var inEditorScope = [];\n      var formNavigators = {};\n      var lookupTable = {};\n      var registerForm = function (key, toolbarApi) {\n        var contextForm = getOrDie(createContextForm(toolbarApi));\n        forms[key] = contextForm;\n        contextForm.launch.map(function (launch) {\n          formNavigators['form:' + key + ''] = __assign(__assign({}, toolbarApi.launch), {\n            type: launch.type === 'contextformtogglebutton' ? 'togglebutton' : 'button',\n            onAction: function () {\n              navigate(contextForm);\n            }\n          });\n        });\n        if (contextForm.scope === 'editor') {\n          inEditorScope.push(contextForm);\n        } else {\n          inNodeScope.push(contextForm);\n        }\n        lookupTable[key] = contextForm;\n      };\n      var registerToolbar = function (key, toolbarApi) {\n        createContextToolbar(toolbarApi).each(function (contextToolbar) {\n          if (toolbarApi.scope === 'editor') {\n            inEditorScope.push(contextToolbar);\n          } else {\n            inNodeScope.push(contextToolbar);\n          }\n          lookupTable[key] = contextToolbar;\n        });\n      };\n      var keys$1 = keys(contextToolbars);\n      each(keys$1, function (key) {\n        var toolbarApi = contextToolbars[key];\n        if (toolbarApi.type === 'contextform') {\n          registerForm(key, toolbarApi);\n        } else if (toolbarApi.type === 'contexttoolbar') {\n          registerToolbar(key, toolbarApi);\n        }\n      });\n      return {\n        forms: forms,\n        inNodeScope: inNodeScope,\n        inEditorScope: inEditorScope,\n        lookupTable: lookupTable,\n        formNavigators: formNavigators\n      };\n    };\n    var ToolbarScopes = { categorise: categorise };\n\n    var forwardSlideEvent = generate$1('forward-slide');\n    var backSlideEvent = generate$1('backward-slide');\n    var changeSlideEvent = generate$1('change-slide-event');\n    var resizingClass = 'tox-pop--resizing';\n    var renderContextToolbar = function (spec) {\n      var stack = Cell([]);\n      return InlineView.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-pop']\n        },\n        fireDismissalEventInstead: { event: 'doNotDismissYet' },\n        onShow: function (comp) {\n          stack.set([]);\n          InlineView.getContent(comp).each(function (c) {\n            remove$6(c.element(), 'visibility');\n          });\n          remove$4(comp.element(), resizingClass);\n          remove$6(comp.element(), 'width');\n        },\n        inlineBehaviours: derive$1([\n          config('context-toolbar-events', [\n            runOnSource(transitionend(), function (comp, se) {\n              InlineView.getContent(comp).each(function (c) {\n              });\n              remove$4(comp.element(), resizingClass);\n              remove$6(comp.element(), 'width');\n            }),\n            run(changeSlideEvent, function (comp, se) {\n              remove$6(comp.element(), 'width');\n              var currentWidth = get$7(comp.element());\n              InlineView.setContent(comp, se.event().contents());\n              add$2(comp.element(), resizingClass);\n              var newWidth = get$7(comp.element());\n              set$2(comp.element(), 'width', currentWidth + 'px');\n              InlineView.getContent(comp).each(function (newContents) {\n                se.event().focus().bind(function (f) {\n                  focus$1(f);\n                  return search(comp.element());\n                }).orThunk(function () {\n                  Keying.focusIn(newContents);\n                  return active();\n                });\n              });\n              global$2.setTimeout(function () {\n                set$2(comp.element(), 'width', newWidth + 'px');\n              }, 0);\n            }),\n            run(forwardSlideEvent, function (comp, se) {\n              InlineView.getContent(comp).each(function (oldContents) {\n                stack.set(stack.get().concat([{\n                    bar: oldContents,\n                    focus: active()\n                  }]));\n              });\n              emitWith(comp, changeSlideEvent, {\n                contents: se.event().forwardContents(),\n                focus: Option.none()\n              });\n            }),\n            run(backSlideEvent, function (comp, se) {\n              last(stack.get()).each(function (last) {\n                stack.set(stack.get().slice(0, stack.get().length - 1));\n                emitWith(comp, changeSlideEvent, {\n                  contents: premade$1(last.bar),\n                  focus: last.focus\n                });\n              });\n            })\n          ]),\n          Keying.config({\n            mode: 'special',\n            onEscape: function (comp) {\n              return last(stack.get()).fold(function () {\n                return spec.onEscape();\n              }, function (_) {\n                emit(comp, backSlideEvent);\n                return Option.some(true);\n              });\n            }\n          })\n        ]),\n        lazySink: function () {\n          return Result.value(spec.sink);\n        }\n      });\n    };\n\n    var generateSelectItems = function (_editor, backstage, spec) {\n      var generateItem = function (rawItem, response, disabled, value) {\n        var translatedText = backstage.shared.providers.translate(rawItem.title);\n        if (rawItem.type === 'separator') {\n          return Option.some({\n            type: 'separator',\n            text: translatedText\n          });\n        } else if (rawItem.type === 'submenu') {\n          var items = bind(rawItem.getStyleItems(), function (si) {\n            return validate(si, response, value);\n          });\n          if (response === 0 && items.length <= 0) {\n            return Option.none();\n          } else {\n            return Option.some({\n              type: 'nestedmenuitem',\n              text: translatedText,\n              disabled: items.length <= 0,\n              getSubmenuItems: function () {\n                return bind(rawItem.getStyleItems(), function (si) {\n                  return validate(si, response, value);\n                });\n              }\n            });\n          }\n        } else {\n          return Option.some(__assign({\n            type: 'togglemenuitem',\n            text: translatedText,\n            active: rawItem.isSelected(value),\n            disabled: disabled,\n            onAction: spec.onAction(rawItem)\n          }, rawItem.getStylePreview().fold(function () {\n            return {};\n          }, function (preview) {\n            return { meta: { style: preview } };\n          })));\n        }\n      };\n      var validate = function (item, response, value) {\n        var invalid = item.type === 'formatter' && spec.isInvalid(item);\n        if (response === 0) {\n          return invalid ? [] : generateItem(item, response, false, value).toArray();\n        } else {\n          return generateItem(item, response, invalid, value).toArray();\n        }\n      };\n      var validateItems = function (preItems) {\n        var value = spec.getCurrentValue();\n        var response = spec.shouldHide ? 0 : 1;\n        return bind(preItems, function (item) {\n          return validate(item, response, value);\n        });\n      };\n      var getFetch = function (backstage, getStyleItems) {\n        return function (callback) {\n          var preItems = getStyleItems();\n          var items = validateItems(preItems);\n          var menu = build$2(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false);\n          callback(menu);\n        };\n      };\n      return {\n        validateItems: validateItems,\n        getFetch: getFetch\n      };\n    };\n    var createMenuItems = function (editor, backstage, spec) {\n      var dataset = spec.dataset;\n      var getStyleItems = dataset.type === 'basic' ? function () {\n        return map(dataset.data, function (d) {\n          return processBasic(d, spec.isSelectedFor, spec.getPreviewFor);\n        });\n      } : dataset.getData;\n      return {\n        items: generateSelectItems(editor, backstage, spec),\n        getStyleItems: getStyleItems\n      };\n    };\n    var createSelectButton = function (editor, backstage, spec) {\n      var _a = createMenuItems(editor, backstage, spec), items = _a.items, getStyleItems = _a.getStyleItems;\n      var getApi = function (comp) {\n        return {\n          getComponent: function () {\n            return comp;\n          }\n        };\n      };\n      var onSetup = function (api) {\n        spec.setInitialValue.each(function (f) {\n          return f(api.getComponent());\n        });\n        return spec.nodeChangeHandler.map(function (f) {\n          var handler = f(api.getComponent());\n          editor.on('NodeChange', handler);\n          return function () {\n            editor.off('NodeChange', handler);\n          };\n        }).getOr(noop);\n      };\n      return renderCommonDropdown({\n        text: spec.icon.isSome() ? Option.none() : Option.some(''),\n        icon: spec.icon,\n        tooltip: Option.from(spec.tooltip),\n        role: Option.none(),\n        fetch: items.getFetch(backstage, getStyleItems),\n        onSetup: onSetup,\n        getApi: getApi,\n        columns: 1,\n        presets: 'normal',\n        classes: spec.icon.isSome() ? [] : ['bespoke'],\n        dropdownBehaviours: []\n      }, 'tox-tbtn', backstage.shared);\n    };\n\n    var process = function (rawFormats) {\n      return map(rawFormats, function (item) {\n        var title = item, format = item;\n        var values = item.split('=');\n        if (values.length > 1) {\n          title = values[0];\n          format = values[1];\n        }\n        return {\n          title: title,\n          format: format\n        };\n      });\n    };\n    var buildBasicStaticDataset = function (data) {\n      return {\n        type: 'basic',\n        data: data\n      };\n    };\n    var Delimiter;\n    (function (Delimiter) {\n      Delimiter[Delimiter['SemiColon'] = 0] = 'SemiColon';\n      Delimiter[Delimiter['Space'] = 1] = 'Space';\n    }(Delimiter || (Delimiter = {})));\n    var split = function (rawFormats, delimiter) {\n      if (delimiter === Delimiter.SemiColon) {\n        return rawFormats.replace(/;$/, '').split(';');\n      } else {\n        return rawFormats.split(' ');\n      }\n    };\n    var buildBasicSettingsDataset = function (editor, settingName, defaults, delimiter) {\n      var rawFormats = get(editor.settings, settingName).getOr(defaults);\n      var data = process(split(rawFormats, delimiter));\n      return {\n        type: 'basic',\n        data: data\n      };\n    };\n\n    var alignMenuItems = [\n      {\n        title: 'Left',\n        icon: 'align-left',\n        format: 'alignleft',\n        command: 'JustifyLeft'\n      },\n      {\n        title: 'Center',\n        icon: 'align-center',\n        format: 'aligncenter',\n        command: 'JustifyCenter'\n      },\n      {\n        title: 'Right',\n        icon: 'align-right',\n        format: 'alignright',\n        command: 'JustifyRight'\n      },\n      {\n        title: 'Justify',\n        icon: 'align-justify',\n        format: 'alignjustify',\n        command: 'JustifyFull'\n      }\n    ];\n    var getSpec = function (editor) {\n      var getMatchingValue = function () {\n        return find(alignMenuItems, function (item) {\n          return editor.formatter.match(item.format);\n        });\n      };\n      var isSelectedFor = function (format) {\n        return function () {\n          return editor.formatter.match(format);\n        };\n      };\n      var getPreviewFor = function (_format) {\n        return function () {\n          return Option.none();\n        };\n      };\n      var updateSelectMenuIcon = function (comp) {\n        var match = getMatchingValue();\n        var alignment = match.fold(function () {\n          return 'left';\n        }, function (item) {\n          return item.title.toLowerCase();\n        });\n        emitWith(comp, updateMenuIcon, { icon: 'align-' + alignment });\n      };\n      var nodeChangeHandler = Option.some(function (comp) {\n        return function () {\n          return updateSelectMenuIcon(comp);\n        };\n      });\n      var setInitialValue = Option.some(function (comp) {\n        return updateSelectMenuIcon(comp);\n      });\n      var dataset = buildBasicStaticDataset(alignMenuItems);\n      var onAction = function (rawItem) {\n        return function () {\n          return find(alignMenuItems, function (item) {\n            return item.format === rawItem.format;\n          }).each(function (item) {\n            return editor.execCommand(item.command);\n          });\n        };\n      };\n      return {\n        tooltip: 'Align',\n        icon: Option.some('align-left'),\n        isSelectedFor: isSelectedFor,\n        getCurrentValue: constant(Option.none()),\n        getPreviewFor: getPreviewFor,\n        onAction: onAction,\n        setInitialValue: setInitialValue,\n        nodeChangeHandler: nodeChangeHandler,\n        dataset: dataset,\n        shouldHide: false,\n        isInvalid: function (item) {\n          return !editor.formatter.canApply(item.format);\n        }\n      };\n    };\n    var createAlignSelect = function (editor, backstage) {\n      return createSelectButton(editor, backstage, getSpec(editor));\n    };\n    var alignSelectMenu = function (editor, backstage) {\n      var menuItems = createMenuItems(editor, backstage, getSpec(editor));\n      editor.ui.registry.addNestedMenuItem('align', {\n        text: backstage.shared.providers.translate('Align'),\n        getSubmenuItems: function () {\n          return menuItems.items.validateItems(menuItems.getStyleItems());\n        }\n      });\n    };\n\n    var defaultFontsFormats = 'Andale Mono=andale mono,monospace;' + 'Arial=arial,helvetica,sans-serif;' + 'Arial Black=arial black,sans-serif;' + 'Book Antiqua=book antiqua,palatino,serif;' + 'Comic Sans MS=comic sans ms,sans-serif;' + 'Courier New=courier new,courier,monospace;' + 'Georgia=georgia,palatino,serif;' + 'Helvetica=helvetica,arial,sans-serif;' + 'Impact=impact,sans-serif;' + 'Symbol=symbol;' + 'Tahoma=tahoma,arial,helvetica,sans-serif;' + 'Terminal=terminal,monaco,monospace;' + 'Times New Roman=times new roman,times,serif;' + 'Trebuchet MS=trebuchet ms,geneva,sans-serif;' + 'Verdana=verdana,geneva,sans-serif;' + 'Webdings=webdings;' + 'Wingdings=wingdings,zapf dingbats';\n    var systemStackFonts = [\n      '-apple-system',\n      'Segoe UI',\n      'Roboto',\n      'Helvetica Neue',\n      'sans-serif'\n    ];\n    var splitFonts = function (fontFamily) {\n      var fonts = fontFamily.split(/\\s*,\\s*/);\n      return map(fonts, function (font) {\n        return font.replace(/^['\"]+|['\"]+$/g, '');\n      });\n    };\n    var isSystemFontStack = function (fontFamily) {\n      var matchesSystemStack = function () {\n        var fonts = splitFonts(fontFamily.toLowerCase());\n        return forall(systemStackFonts, function (font) {\n          return fonts.indexOf(font.toLowerCase()) > -1;\n        });\n      };\n      return fontFamily.indexOf('-apple-system') === 0 && matchesSystemStack();\n    };\n    var getSpec$1 = function (editor) {\n      var getMatchingValue = function () {\n        var getFirstFont = function (fontFamily) {\n          return fontFamily ? splitFonts(fontFamily)[0] : '';\n        };\n        var fontFamily = editor.queryCommandValue('FontName');\n        var items = dataset.data;\n        var font = fontFamily ? fontFamily.toLowerCase() : '';\n        var matchOpt = find(items, function (item) {\n          var format = item.format;\n          return format.toLowerCase() === font || getFirstFont(format).toLowerCase() === getFirstFont(font).toLowerCase();\n        }).orThunk(function () {\n          if (isSystemFontStack(font)) {\n            return Option.from({\n              title: 'System Font',\n              format: font\n            });\n          } else {\n            return Option.none();\n          }\n        });\n        return {\n          matchOpt: matchOpt,\n          font: fontFamily\n        };\n      };\n      var isSelectedFor = function (item) {\n        return function (valueOpt) {\n          return valueOpt.exists(function (value) {\n            return value.format === item;\n          });\n        };\n      };\n      var getCurrentValue = function () {\n        var matchOpt = getMatchingValue().matchOpt;\n        return matchOpt;\n      };\n      var getPreviewFor = function (item) {\n        return function () {\n          return Option.some({\n            tag: 'div',\n            styles: item.indexOf('dings') === -1 ? { 'font-family': item } : {}\n          });\n        };\n      };\n      var onAction = function (rawItem) {\n        return function () {\n          editor.undoManager.transact(function () {\n            editor.focus();\n            editor.execCommand('FontName', false, rawItem.format);\n          });\n        };\n      };\n      var updateSelectMenuText = function (comp) {\n        var _a = getMatchingValue(), matchOpt = _a.matchOpt, font = _a.font;\n        var text = matchOpt.fold(function () {\n          return font;\n        }, function (item) {\n          return item.title;\n        });\n        emitWith(comp, updateMenuText, { text: text });\n      };\n      var nodeChangeHandler = Option.some(function (comp) {\n        return function () {\n          return updateSelectMenuText(comp);\n        };\n      });\n      var setInitialValue = Option.some(function (comp) {\n        return updateSelectMenuText(comp);\n      });\n      var dataset = buildBasicSettingsDataset(editor, 'font_formats', defaultFontsFormats, Delimiter.SemiColon);\n      return {\n        tooltip: 'Fonts',\n        icon: Option.none(),\n        isSelectedFor: isSelectedFor,\n        getCurrentValue: getCurrentValue,\n        getPreviewFor: getPreviewFor,\n        onAction: onAction,\n        setInitialValue: setInitialValue,\n        nodeChangeHandler: nodeChangeHandler,\n        dataset: dataset,\n        shouldHide: false,\n        isInvalid: function () {\n          return false;\n        }\n      };\n    };\n    var createFontSelect = function (editor, backstage) {\n      return createSelectButton(editor, backstage, getSpec$1(editor));\n    };\n    var fontSelectMenu = function (editor, backstage) {\n      var menuItems = createMenuItems(editor, backstage, getSpec$1(editor));\n      editor.ui.registry.addNestedMenuItem('fontformats', {\n        text: backstage.shared.providers.translate('Fonts'),\n        getSubmenuItems: function () {\n          return menuItems.items.validateItems(menuItems.getStyleItems());\n        }\n      });\n    };\n\n    var defaultFontsizeFormats = '8pt 10pt 12pt 14pt 18pt 24pt 36pt';\n    var legacyFontSizes = {\n      '8pt': '1',\n      '10pt': '2',\n      '12pt': '3',\n      '14pt': '4',\n      '18pt': '5',\n      '24pt': '6',\n      '36pt': '7'\n    };\n    var round$1 = function (number, precision) {\n      var factor = Math.pow(10, precision);\n      return Math.round(number * factor) / factor;\n    };\n    var toPt = function (fontSize, precision) {\n      if (/[0-9.]+px$/.test(fontSize)) {\n        return round$1(parseInt(fontSize, 10) * 72 / 96, precision || 0) + 'pt';\n      }\n      return fontSize;\n    };\n    var toLegacy = function (fontSize) {\n      return get(legacyFontSizes, fontSize).getOr('');\n    };\n    var getSpec$2 = function (editor) {\n      var getMatchingValue = function () {\n        var matchOpt = Option.none();\n        var items = dataset.data;\n        var fontSize = editor.queryCommandValue('FontSize');\n        if (fontSize) {\n          var _loop_1 = function (precision) {\n            var pt = toPt(fontSize, precision);\n            var legacy = toLegacy(pt);\n            matchOpt = find(items, function (item) {\n              return item.format === fontSize || item.format === pt || item.format === legacy;\n            });\n          };\n          for (var precision = 3; matchOpt.isNone() && precision >= 0; precision--) {\n            _loop_1(precision);\n          }\n        }\n        return {\n          matchOpt: matchOpt,\n          size: fontSize\n        };\n      };\n      var isSelectedFor = function (item) {\n        return function (valueOpt) {\n          return valueOpt.exists(function (value) {\n            return value.format === item;\n          });\n        };\n      };\n      var getCurrentValue = function () {\n        var matchOpt = getMatchingValue().matchOpt;\n        return matchOpt;\n      };\n      var getPreviewFor = constant(constant(Option.none()));\n      var onAction = function (rawItem) {\n        return function () {\n          editor.undoManager.transact(function () {\n            editor.focus();\n            editor.execCommand('FontSize', false, rawItem.format);\n          });\n        };\n      };\n      var updateSelectMenuText = function (comp) {\n        var _a = getMatchingValue(), matchOpt = _a.matchOpt, size = _a.size;\n        var text = matchOpt.fold(function () {\n          return size;\n        }, function (match) {\n          return match.title;\n        });\n        emitWith(comp, updateMenuText, { text: text });\n      };\n      var nodeChangeHandler = Option.some(function (comp) {\n        return function () {\n          return updateSelectMenuText(comp);\n        };\n      });\n      var setInitialValue = Option.some(function (comp) {\n        return updateSelectMenuText(comp);\n      });\n      var dataset = buildBasicSettingsDataset(editor, 'fontsize_formats', defaultFontsizeFormats, Delimiter.Space);\n      return {\n        tooltip: 'Font sizes',\n        icon: Option.none(),\n        isSelectedFor: isSelectedFor,\n        getPreviewFor: getPreviewFor,\n        getCurrentValue: getCurrentValue,\n        onAction: onAction,\n        setInitialValue: setInitialValue,\n        nodeChangeHandler: nodeChangeHandler,\n        dataset: dataset,\n        shouldHide: false,\n        isInvalid: function () {\n          return false;\n        }\n      };\n    };\n    var createFontsizeSelect = function (editor, backstage) {\n      return createSelectButton(editor, backstage, getSpec$2(editor));\n    };\n    var fontsizeSelectMenu = function (editor, backstage) {\n      var menuItems = createMenuItems(editor, backstage, getSpec$2(editor));\n      editor.ui.registry.addNestedMenuItem('fontsizes', {\n        text: 'Font sizes',\n        getSubmenuItems: function () {\n          return menuItems.items.validateItems(menuItems.getStyleItems());\n        }\n      });\n    };\n\n    var findNearest = function (editor, getStyles, parents) {\n      var styles = getStyles();\n      return findMap(parents, function (parent) {\n        return find(styles, function (fmt) {\n          return editor.formatter.matchNode(parent, fmt.format);\n        });\n      }).orThunk(function () {\n        if (editor.formatter.match('p')) {\n          return Option.some({\n            title: 'Paragraph',\n            format: 'p'\n          });\n        }\n        return Option.none();\n      });\n    };\n    var getCurrentSelectionParents = function (editor) {\n      var currentNode = editor.selection.getStart(true) || editor.getBody();\n      return editor.dom.getParents(currentNode, function () {\n        return true;\n      }, editor.getBody());\n    };\n\n    var onSetupFormatToggle = function (editor, name) {\n      return function (api) {\n        var unbindCell = Cell(Option.none());\n        var init = function () {\n          api.setActive(editor.formatter.match(name));\n          var unbind = editor.formatter.formatChanged(name, api.setActive).unbind;\n          unbindCell.set(Option.some(unbind));\n        };\n        editor.initialized ? init() : editor.on('init', init);\n        return function () {\n          return unbindCell.get().each(function (unbind) {\n            return unbind();\n          });\n        };\n      };\n    };\n    var onActionToggleFormat = function (editor) {\n      return function (rawItem) {\n        return function () {\n          editor.undoManager.transact(function () {\n            editor.focus();\n            editor.execCommand('mceToggleFormat', false, rawItem.format);\n          });\n        };\n      };\n    };\n\n    var defaultBlocks = 'Paragraph=p;' + 'Heading 1=h1;' + 'Heading 2=h2;' + 'Heading 3=h3;' + 'Heading 4=h4;' + 'Heading 5=h5;' + 'Heading 6=h6;' + 'Preformatted=pre';\n    var getSpec$3 = function (editor) {\n      var getMatchingValue = function (nodeChangeEvent) {\n        return findNearest(editor, function () {\n          return dataset.data;\n        }, nodeChangeEvent);\n      };\n      var isSelectedFor = function (format) {\n        return function () {\n          return editor.formatter.match(format);\n        };\n      };\n      var getPreviewFor = function (format) {\n        return function () {\n          var fmt = editor.formatter.get(format);\n          return Option.some({\n            tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',\n            styles: editor.dom.parseStyle(editor.formatter.getCssText(format))\n          });\n        };\n      };\n      var updateSelectMenuText = function (parents, comp) {\n        var detectedFormat = getMatchingValue(parents);\n        var text = detectedFormat.fold(function () {\n          return 'Paragraph';\n        }, function (fmt) {\n          return fmt.title;\n        });\n        emitWith(comp, updateMenuText, { text: text });\n      };\n      var nodeChangeHandler = Option.some(function (comp) {\n        return function (e) {\n          return updateSelectMenuText(e.parents, comp);\n        };\n      });\n      var setInitialValue = Option.some(function (comp) {\n        var parents = getCurrentSelectionParents(editor);\n        updateSelectMenuText(parents, comp);\n      });\n      var dataset = buildBasicSettingsDataset(editor, 'block_formats', defaultBlocks, Delimiter.SemiColon);\n      return {\n        tooltip: 'Blocks',\n        icon: Option.none(),\n        isSelectedFor: isSelectedFor,\n        getCurrentValue: constant(Option.none()),\n        getPreviewFor: getPreviewFor,\n        onAction: onActionToggleFormat(editor),\n        setInitialValue: setInitialValue,\n        nodeChangeHandler: nodeChangeHandler,\n        dataset: dataset,\n        shouldHide: false,\n        isInvalid: function (item) {\n          return !editor.formatter.canApply(item.format);\n        }\n      };\n    };\n    var createFormatSelect = function (editor, backstage) {\n      return createSelectButton(editor, backstage, getSpec$3(editor));\n    };\n    var formatSelectMenu = function (editor, backstage) {\n      var menuItems = createMenuItems(editor, backstage, getSpec$3(editor));\n      editor.ui.registry.addNestedMenuItem('blockformats', {\n        text: 'Blocks',\n        getSubmenuItems: function () {\n          return menuItems.items.validateItems(menuItems.getStyleItems());\n        }\n      });\n    };\n\n    var getSpec$4 = function (editor, dataset) {\n      var isSelectedFor = function (format) {\n        return function () {\n          return editor.formatter.match(format);\n        };\n      };\n      var getPreviewFor = function (format) {\n        return function () {\n          var fmt = editor.formatter.get(format);\n          return fmt !== undefined ? Option.some({\n            tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',\n            styles: editor.dom.parseStyle(editor.formatter.getCssText(format))\n          }) : Option.none();\n        };\n      };\n      var updateSelectMenuText = function (parents, comp) {\n        var getFormatItems = function (fmt) {\n          var subs = fmt.items;\n          return subs !== undefined && subs.length > 0 ? bind(subs, getFormatItems) : [{\n              title: fmt.title,\n              format: fmt.format\n            }];\n        };\n        var flattenedItems = bind(getStyleFormats(editor), getFormatItems);\n        var detectedFormat = findNearest(editor, function () {\n          return flattenedItems;\n        }, parents);\n        var text = detectedFormat.fold(function () {\n          return 'Paragraph';\n        }, function (fmt) {\n          return fmt.title;\n        });\n        emitWith(comp, updateMenuText, { text: text });\n      };\n      var nodeChangeHandler = Option.some(function (comp) {\n        return function (e) {\n          return updateSelectMenuText(e.parents, comp);\n        };\n      });\n      var setInitialValue = Option.some(function (comp) {\n        var parents = getCurrentSelectionParents(editor);\n        updateSelectMenuText(parents, comp);\n      });\n      return {\n        tooltip: 'Formats',\n        icon: Option.none(),\n        isSelectedFor: isSelectedFor,\n        getCurrentValue: constant(Option.none()),\n        getPreviewFor: getPreviewFor,\n        onAction: onActionToggleFormat(editor),\n        setInitialValue: setInitialValue,\n        nodeChangeHandler: nodeChangeHandler,\n        shouldHide: editor.getParam('style_formats_autohide', false, 'boolean'),\n        isInvalid: function (item) {\n          return !editor.formatter.canApply(item.format);\n        },\n        dataset: dataset\n      };\n    };\n    var createStyleSelect = function (editor, backstage) {\n      var dataset = __assign({ type: 'advanced' }, backstage.styleselect);\n      return createSelectButton(editor, backstage, getSpec$4(editor, dataset));\n    };\n    var styleSelectMenu = function (editor, backstage) {\n      var dataset = __assign({ type: 'advanced' }, backstage.styleselect);\n      var menuItems = createMenuItems(editor, backstage, getSpec$4(editor, dataset));\n      editor.ui.registry.addNestedMenuItem('formats', {\n        text: 'Formats',\n        getSubmenuItems: function () {\n          return menuItems.items.validateItems(menuItems.getStyleItems());\n        }\n      });\n    };\n\n    var defaultToolbar = [\n      {\n        name: 'history',\n        items: [\n          'undo',\n          'redo'\n        ]\n      },\n      {\n        name: 'styles',\n        items: ['styleselect']\n      },\n      {\n        name: 'formatting',\n        items: [\n          'bold',\n          'italic'\n        ]\n      },\n      {\n        name: 'alignment',\n        items: [\n          'alignleft',\n          'aligncenter',\n          'alignright',\n          'alignjustify'\n        ]\n      },\n      {\n        name: 'indentation',\n        items: [\n          'outdent',\n          'indent'\n        ]\n      },\n      {\n        name: 'permanent pen',\n        items: ['permanentpen']\n      },\n      {\n        name: 'comments',\n        items: ['addcomment']\n      }\n    ];\n    var renderFromBridge = function (bridgeBuilder, render) {\n      return function (spec, extras, editor) {\n        var internal = bridgeBuilder(spec).mapError(function (errInfo) {\n          return formatError(errInfo);\n        }).getOrDie();\n        return render(internal, extras, editor);\n      };\n    };\n    var types = {\n      button: renderFromBridge(createToolbarButton, function (s, extras) {\n        return renderToolbarButton(s, extras.backstage.shared.providers);\n      }),\n      togglebutton: renderFromBridge(createToggleButton, function (s, extras) {\n        return renderToolbarToggleButton(s, extras.backstage.shared.providers);\n      }),\n      menubutton: renderFromBridge(createMenuButton, function (s, extras) {\n        return renderMenuButton(s, 'tox-tbtn', extras.backstage, Option.none());\n      }),\n      splitbutton: renderFromBridge(createSplitButton, function (s, extras) {\n        return renderSplitButton(s, extras.backstage.shared);\n      }),\n      grouptoolbarbutton: renderFromBridge(createGroupToolbarButton, function (s, extras, editor) {\n        var _a;\n        var buttons = editor.ui.registry.getAll().buttons;\n        var identify = function (toolbar) {\n          return identifyButtons(editor, {\n            buttons: buttons,\n            toolbar: toolbar,\n            allowToolbarGroups: false\n          }, extras, Option.none());\n        };\n        var attributes = (_a = {}, _a[Attribute] = isToolbarLocationTop(editor) ? AttributeValue.TopToBottom : AttributeValue.BottomToTop, _a);\n        switch (getToolbarMode(editor)) {\n        case ToolbarMode.floating:\n          return renderFloatingToolbarButton(s, extras.backstage, identify, attributes);\n        default:\n          throw new Error('Toolbar groups are only supported when using floating toolbar mode');\n        }\n      }),\n      styleSelectButton: function (editor, extras) {\n        return createStyleSelect(editor, extras.backstage);\n      },\n      fontsizeSelectButton: function (editor, extras) {\n        return createFontsizeSelect(editor, extras.backstage);\n      },\n      fontSelectButton: function (editor, extras) {\n        return createFontSelect(editor, extras.backstage);\n      },\n      formatButton: function (editor, extras) {\n        return createFormatSelect(editor, extras.backstage);\n      },\n      alignMenuButton: function (editor, extras) {\n        return createAlignSelect(editor, extras.backstage);\n      }\n    };\n    var extractFrom = function (spec, extras, editor) {\n      return get(types, spec.type).fold(function () {\n        domGlobals.console.error('skipping button defined by', spec);\n        return Option.none();\n      }, function (render) {\n        return Option.some(render(spec, extras, editor));\n      });\n    };\n    var bespokeButtons = {\n      styleselect: types.styleSelectButton,\n      fontsizeselect: types.fontsizeSelectButton,\n      fontselect: types.fontSelectButton,\n      formatselect: types.formatButton,\n      align: types.alignMenuButton\n    };\n    var removeUnusedDefaults = function (buttons) {\n      var filteredItemGroups = map(defaultToolbar, function (group) {\n        var items = filter(group.items, function (subItem) {\n          return has(buttons, subItem) || has(bespokeButtons, subItem);\n        });\n        return {\n          name: group.name,\n          items: items\n        };\n      });\n      return filter(filteredItemGroups, function (group) {\n        return group.items.length > 0;\n      });\n    };\n    var convertStringToolbar = function (strToolbar) {\n      var groupsStrings = strToolbar.split('|');\n      return map(groupsStrings, function (g) {\n        return { items: g.trim().split(' ') };\n      });\n    };\n    var isToolbarGroupSettingArray = function (toolbar) {\n      return isArrayOf(toolbar, function (t) {\n        return has(t, 'name') && has(t, 'items');\n      });\n    };\n    var createToolbar = function (toolbarConfig) {\n      var toolbar = toolbarConfig.toolbar;\n      var buttons = toolbarConfig.buttons;\n      if (toolbar === false) {\n        return [];\n      } else if (toolbar === undefined || toolbar === true) {\n        return removeUnusedDefaults(buttons);\n      } else if (isString(toolbar)) {\n        return convertStringToolbar(toolbar);\n      } else if (isToolbarGroupSettingArray(toolbar)) {\n        return toolbar;\n      } else {\n        domGlobals.console.error('Toolbar type should be string, string[], boolean or ToolbarGroup[]');\n        return [];\n      }\n    };\n    var lookupButton = function (editor, buttons, toolbarItem, allowToolbarGroups, extras, prefixes) {\n      return get(buttons, toolbarItem.toLowerCase()).orThunk(function () {\n        return prefixes.bind(function (ps) {\n          return findMap(ps, function (prefix) {\n            return get(buttons, prefix + toolbarItem.toLowerCase());\n          });\n        });\n      }).fold(function () {\n        return get(bespokeButtons, toolbarItem.toLowerCase()).map(function (r) {\n          return r(editor, extras);\n        }).orThunk(function () {\n          return Option.none();\n        });\n      }, function (spec) {\n        if (spec.type === 'grouptoolbarbutton' && !allowToolbarGroups) {\n          domGlobals.console.warn('Ignoring the \\'' + toolbarItem + '\\' toolbar button. Group toolbar buttons are only supported when using floating toolbar mode and cannot be nested.');\n          return Option.none();\n        } else {\n          return extractFrom(spec, extras, editor);\n        }\n      });\n    };\n    var identifyButtons = function (editor, toolbarConfig, extras, prefixes) {\n      var toolbarGroups = createToolbar(toolbarConfig);\n      var groups = map(toolbarGroups, function (group) {\n        var items = bind(group.items, function (toolbarItem) {\n          return toolbarItem.trim().length === 0 ? [] : lookupButton(editor, toolbarConfig.buttons, toolbarItem, toolbarConfig.allowToolbarGroups, extras, prefixes).toArray();\n        });\n        return {\n          title: Option.from(editor.translate(group.name)),\n          items: items\n        };\n      });\n      return filter(groups, function (group) {\n        return group.items.length > 0;\n      });\n    };\n\n    var bubbleSize = 12;\n    var bubbleAlignments$1 = {\n      valignCentre: [],\n      alignCentre: [],\n      alignLeft: ['tox-pop--align-left'],\n      alignRight: ['tox-pop--align-right'],\n      right: ['tox-pop--right'],\n      left: ['tox-pop--left'],\n      bottom: ['tox-pop--bottom'],\n      top: ['tox-pop--top']\n    };\n    var anchorOverrides = {\n      maxHeightFunction: expandable(),\n      maxWidthFunction: expandable$1()\n    };\n    var desktopAnchorSpecLayouts = {\n      onLtr: function () {\n        return [\n          north$1,\n          south$1,\n          northeast$1,\n          southeast$1,\n          northwest$1,\n          southwest$1,\n          north$3,\n          south$3,\n          northeast$3,\n          southeast$3,\n          northwest$3,\n          southwest$3\n        ];\n      },\n      onRtl: function () {\n        return [\n          north$1,\n          south$1,\n          northwest$1,\n          southwest$1,\n          northeast$1,\n          southeast$1,\n          north$3,\n          south$3,\n          northwest$3,\n          southwest$3,\n          northeast$3,\n          southeast$3\n        ];\n      }\n    };\n    var mobileAnchorSpecLayouts = {\n      onLtr: function () {\n        return [\n          south$1,\n          southeast$1,\n          southwest$1,\n          northeast$1,\n          northwest$1,\n          north$1,\n          north$3,\n          south$3,\n          northeast$3,\n          southeast$3,\n          northwest$3,\n          southwest$3\n        ];\n      },\n      onRtl: function () {\n        return [\n          south$1,\n          southwest$1,\n          southeast$1,\n          northwest$1,\n          northeast$1,\n          north$1,\n          north$3,\n          south$3,\n          northwest$3,\n          southwest$3,\n          northeast$3,\n          southeast$3\n        ];\n      }\n    };\n    var getAnchorLayout = function (position, isTouch) {\n      if (position === 'line') {\n        return {\n          bubble: nu$8(bubbleSize, 0, bubbleAlignments$1),\n          layouts: {\n            onLtr: function () {\n              return [east$1];\n            },\n            onRtl: function () {\n              return [west$1];\n            }\n          },\n          overrides: anchorOverrides\n        };\n      } else {\n        return {\n          bubble: nu$8(0, bubbleSize, bubbleAlignments$1),\n          layouts: isTouch ? mobileAnchorSpecLayouts : desktopAnchorSpecLayouts,\n          overrides: anchorOverrides\n        };\n      }\n    };\n    var register$4 = function (editor, registryContextToolbars, sink, extras) {\n      var isTouch = detect$3().deviceType.isTouch;\n      var contextbar = build$1(renderContextToolbar({\n        sink: sink,\n        onEscape: function () {\n          editor.focus();\n          return Option.some(true);\n        }\n      }));\n      var getBounds = function () {\n        return getContextToolbarBounds(editor);\n      };\n      var isRangeOverlapping = function (aTop, aBottom, bTop, bBottom) {\n        return Math.max(aTop, bTop) <= Math.min(aBottom, bBottom);\n      };\n      var getLastElementVerticalBound = function () {\n        var nodeBounds = lastElement.get().map(function (ele) {\n          return ele.getBoundingClientRect();\n        }).getOrThunk(function () {\n          return editor.selection.getRng().getBoundingClientRect();\n        });\n        var diffTop = editor.inline ? get$8().top() : absolute$1(Element.fromDom(editor.getBody())).y();\n        return {\n          y: nodeBounds.top + diffTop,\n          bottom: nodeBounds.bottom + diffTop\n        };\n      };\n      var shouldContextToolbarHide = function () {\n        if (isTouch() && extras.backstage.isContextMenuOpen()) {\n          return true;\n        }\n        var lastElementBounds = getLastElementVerticalBound();\n        var contextToolbarBounds = getBounds();\n        return !isRangeOverlapping(lastElementBounds.y, lastElementBounds.bottom, contextToolbarBounds.y(), contextToolbarBounds.bottom());\n      };\n      var forceHide = function () {\n        InlineView.hide(contextbar);\n      };\n      var hideOrRepositionIfNecessary = function () {\n        lastAnchor.get().each(function (anchor) {\n          var contextBarEle = contextbar.element();\n          remove$6(contextBarEle, 'display');\n          if (shouldContextToolbarHide()) {\n            set$2(contextBarEle, 'display', 'none');\n          } else {\n            Positioning.positionWithinBounds(sink, anchor, contextbar, Option.some(getBounds()));\n          }\n        });\n      };\n      var lastAnchor = Cell(Option.none());\n      var lastElement = Cell(Option.none());\n      var timer = Cell(null);\n      var wrapInPopDialog = function (toolbarSpec) {\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-pop__dialog']\n          },\n          components: [toolbarSpec],\n          behaviours: derive$1([\n            Keying.config({ mode: 'acyclic' }),\n            config('pop-dialog-wrap-events', [\n              runOnAttached(function (comp) {\n                editor.shortcuts.add('ctrl+F9', 'focus statusbar', function () {\n                  return Keying.focusIn(comp);\n                });\n              }),\n              runOnDetached(function (comp) {\n                editor.shortcuts.remove('ctrl+F9');\n              })\n            ])\n          ])\n        };\n      };\n      var getScopes = cached(function () {\n        return ToolbarScopes.categorise(registryContextToolbars, function (toolbarApi) {\n          var alloySpec = buildToolbar(toolbarApi);\n          emitWith(contextbar, forwardSlideEvent, { forwardContents: wrapInPopDialog(alloySpec) });\n        });\n      });\n      var buildToolbar = function (ctx) {\n        var buttons = editor.ui.registry.getAll().buttons;\n        var toolbarType = getToolbarMode(editor) === ToolbarMode.scrolling ? ToolbarMode.scrolling : ToolbarMode.default;\n        var scopes = getScopes();\n        return ctx.type === 'contexttoolbar' ? function () {\n          var allButtons = __assign(__assign({}, buttons), scopes.formNavigators);\n          var initGroups = identifyButtons(editor, {\n            buttons: allButtons,\n            toolbar: ctx.items,\n            allowToolbarGroups: false\n          }, extras, Option.some(['form:']));\n          return renderToolbar({\n            type: toolbarType,\n            uid: generate$1('context-toolbar'),\n            initGroups: initGroups,\n            onEscape: Option.none,\n            cyclicKeying: true\n          });\n        }() : function () {\n          return ContextForm.renderContextForm(toolbarType, ctx, extras.backstage);\n        }();\n      };\n      editor.on(showContextToolbarEvent, function (e) {\n        var scopes = getScopes();\n        get(scopes.lookupTable, e.toolbarKey).each(function (ctx) {\n          launchContext(ctx, e.target === editor ? Option.none() : Option.some(e));\n          InlineView.getContent(contextbar).each(Keying.focusIn);\n        });\n      });\n      var getAnchor = function (position, element) {\n        var anchorage = position === 'node' ? extras.backstage.shared.anchors.node(element) : extras.backstage.shared.anchors.cursor();\n        return deepMerge(anchorage, getAnchorLayout(position, isTouch()));\n      };\n      var launchContext = function (toolbarApi, elem) {\n        clearTimer();\n        if (isTouch() && extras.backstage.isContextMenuOpen()) {\n          return;\n        }\n        var toolbarSpec = buildToolbar(toolbarApi);\n        var sElem = elem.map(Element.fromDom);\n        var anchor = getAnchor(toolbarApi.position, sElem);\n        lastAnchor.set(Option.some(anchor));\n        lastElement.set(elem);\n        var contextBarEle = contextbar.element();\n        remove$6(contextBarEle, 'display');\n        InlineView.showWithinBounds(contextbar, anchor, wrapInPopDialog(toolbarSpec), function () {\n          return Option.some(getBounds());\n        });\n        if (shouldContextToolbarHide()) {\n          set$2(contextBarEle, 'display', 'none');\n        }\n      };\n      var launchContextToolbar = function () {\n        if (!editor.hasFocus()) {\n          return;\n        }\n        var scopes = getScopes();\n        ToolbarLookup.lookup(scopes, editor).fold(function () {\n          lastAnchor.set(Option.none());\n          InlineView.hide(contextbar);\n        }, function (info) {\n          launchContext(info.toolbarApi, Option.some(info.elem.dom()));\n        });\n      };\n      var clearTimer = function () {\n        var current = timer.get();\n        if (current !== null) {\n          global$2.clearTimeout(current);\n          timer.set(null);\n        }\n      };\n      var resetTimer = function (t) {\n        clearTimer();\n        timer.set(t);\n      };\n      editor.on('init', function () {\n        editor.on(hideContextToolbarEvent, forceHide);\n        editor.on('ScrollContent ScrollWindow longpress', hideOrRepositionIfNecessary);\n        editor.on('click keyup focus SetContent ObjectResized ResizeEditor', function () {\n          resetTimer(global$2.setEditorTimeout(editor, launchContextToolbar, 0));\n        });\n        editor.on('focusout', function (e) {\n          global$2.setEditorTimeout(editor, function () {\n            if (search(sink.element()).isNone() && search(contextbar.element()).isNone()) {\n              lastAnchor.set(Option.none());\n              InlineView.hide(contextbar);\n            }\n          }, 0);\n        });\n        editor.on('SwitchMode', function () {\n          if (editor.mode.isReadOnly()) {\n            lastAnchor.set(Option.none());\n            InlineView.hide(contextbar);\n          }\n        });\n        editor.on('NodeChange', function (e) {\n          search(contextbar.element()).fold(function () {\n            resetTimer(global$2.setEditorTimeout(editor, launchContextToolbar, 0));\n          }, function (_) {\n          });\n        });\n      });\n    };\n    var ContextToolbar = { register: register$4 };\n\n    var setup$3 = function (editor, mothership, uiMothership) {\n      var broadcastEvent = function (name, evt) {\n        each([\n          mothership,\n          uiMothership\n        ], function (ship) {\n          ship.broadcastEvent(name, evt);\n        });\n      };\n      var broadcastOn = function (channel, message) {\n        each([\n          mothership,\n          uiMothership\n        ], function (ship) {\n          ship.broadcastOn([channel], message);\n        });\n      };\n      var fireDismissPopups = function (evt) {\n        return broadcastOn(dismissPopups(), { target: evt.target() });\n      };\n      var onTouchstart = bind$3(Element.fromDom(domGlobals.document), 'touchstart', fireDismissPopups);\n      var onTouchmove = bind$3(Element.fromDom(domGlobals.document), 'touchmove', function (evt) {\n        return broadcastEvent(documentTouchmove(), evt);\n      });\n      var onTouchend = bind$3(Element.fromDom(domGlobals.document), 'touchend', function (evt) {\n        return broadcastEvent(documentTouchend(), evt);\n      });\n      var onMousedown = bind$3(Element.fromDom(domGlobals.document), 'mousedown', fireDismissPopups);\n      var onMouseup = bind$3(Element.fromDom(domGlobals.document), 'mouseup', function (evt) {\n        if (evt.raw().button === 0) {\n          broadcastOn(mouseReleased(), { target: evt.target() });\n        }\n      });\n      var onContentClick = function (raw) {\n        return broadcastOn(dismissPopups(), { target: Element.fromDom(raw.target) });\n      };\n      var onContentMouseup = function (raw) {\n        if (raw.button === 0) {\n          broadcastOn(mouseReleased(), { target: Element.fromDom(raw.target) });\n        }\n      };\n      var onWindowScroll = function (evt) {\n        return broadcastEvent(windowScroll(), fromRawEvent$1(evt));\n      };\n      var onWindowResize = function (evt) {\n        broadcastOn(repositionPopups(), {});\n        broadcastEvent(windowResize(), fromRawEvent$1(evt));\n      };\n      var onEditorResize = function () {\n        return broadcastOn(repositionPopups(), {});\n      };\n      editor.on('PostRender', function () {\n        editor.on('click', onContentClick);\n        editor.on('tap', onContentClick);\n        editor.on('mouseup', onContentMouseup);\n        editor.on('ScrollWindow', onWindowScroll);\n        editor.on('ResizeWindow', onWindowResize);\n        editor.on('ResizeEditor', onEditorResize);\n      });\n      editor.on('remove', function () {\n        editor.off('click', onContentClick);\n        editor.off('tap', onContentClick);\n        editor.off('mouseup', onContentMouseup);\n        editor.off('ScrollWindow', onWindowScroll);\n        editor.off('ResizeWindow', onWindowResize);\n        editor.off('ResizeEditor', onEditorResize);\n        onMousedown.unbind();\n        onTouchstart.unbind();\n        onTouchmove.unbind();\n        onTouchend.unbind();\n        onMouseup.unbind();\n      });\n      editor.on('detach', function () {\n        detachSystem(mothership);\n        detachSystem(uiMothership);\n        mothership.destroy();\n        uiMothership.destroy();\n      });\n    };\n    var Events$1 = { setup: setup$3 };\n\n    var parts$d = AlloyParts;\n    var partType$1 = PartType;\n\n    var schema$r = constant([\n      defaulted$1('shell', false),\n      strict$1('makeItem'),\n      defaulted$1('setupItem', noop),\n      SketchBehaviours.field('listBehaviours', [Replacing])\n    ]);\n    var customListDetail = function () {\n      return { behaviours: derive$1([Replacing.config({})]) };\n    };\n    var itemsPart = optional({\n      name: 'items',\n      overrides: customListDetail\n    });\n    var parts$e = constant([itemsPart]);\n    var name$2 = constant('CustomList');\n\n    var factory$f = function (detail, components, spec, external) {\n      var setItems = function (list, items) {\n        getListContainer(list).fold(function () {\n          domGlobals.console.error('Custom List was defined to not be a shell, but no item container was specified in components');\n          throw new Error('Custom List was defined to not be a shell, but no item container was specified in components');\n        }, function (container) {\n          var itemComps = Replacing.contents(container);\n          var numListsRequired = items.length;\n          var numListsToAdd = numListsRequired - itemComps.length;\n          var itemsToAdd = numListsToAdd > 0 ? range(numListsToAdd, function () {\n            return detail.makeItem();\n          }) : [];\n          var itemsToRemove = itemComps.slice(numListsRequired);\n          each(itemsToRemove, function (item) {\n            return Replacing.remove(container, item);\n          });\n          each(itemsToAdd, function (item) {\n            return Replacing.append(container, item);\n          });\n          var builtLists = Replacing.contents(container);\n          each(builtLists, function (item, i) {\n            detail.setupItem(list, item, items[i], i);\n          });\n        });\n      };\n      var extra = detail.shell ? {\n        behaviours: [Replacing.config({})],\n        components: []\n      } : {\n        behaviours: [],\n        components: components\n      };\n      var getListContainer = function (component) {\n        return detail.shell ? Option.some(component) : getPart(component, detail, 'items');\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: extra.components,\n        behaviours: augment(detail.listBehaviours, extra.behaviours),\n        apis: { setItems: setItems }\n      };\n    };\n    var CustomList = composite$1({\n      name: name$2(),\n      configFields: schema$r(),\n      partFields: parts$e(),\n      factory: factory$f,\n      apis: {\n        setItems: function (apis, list, items) {\n          apis.setItems(list, items);\n        }\n      }\n    });\n\n    var getOffsetParent = function (element) {\n      var isFixed = getRaw(element, 'position').is('fixed');\n      var offsetParent$1 = isFixed ? Option.none() : offsetParent(element);\n      return offsetParent$1.orThunk(function () {\n        var marker = Element.fromTag('span');\n        return parent(element).bind(function (parent) {\n          append(parent, marker);\n          var offsetParent$1 = offsetParent(marker);\n          remove(marker);\n          return offsetParent$1;\n        });\n      });\n    };\n    var getOrigin = function (element) {\n      return getOffsetParent(element).map(absolute).getOrThunk(function () {\n        return Position(0, 0);\n      });\n    };\n\n    var morphAdt = Adt.generate([\n      { static: [] },\n      { absolute: ['positionCss'] },\n      { fixed: ['positionCss'] }\n    ]);\n    var appear = function (component, contextualInfo) {\n      var elem = component.element();\n      add$2(elem, contextualInfo.transitionClass);\n      remove$4(elem, contextualInfo.fadeOutClass);\n      add$2(elem, contextualInfo.fadeInClass);\n      contextualInfo.onShow(component);\n    };\n    var disappear = function (component, contextualInfo) {\n      var elem = component.element();\n      add$2(elem, contextualInfo.transitionClass);\n      remove$4(elem, contextualInfo.fadeInClass);\n      add$2(elem, contextualInfo.fadeOutClass);\n      contextualInfo.onHide(component);\n    };\n    var isPartiallyVisible = function (box, viewport) {\n      return box.y() < viewport.bottom() && box.bottom() > viewport.y();\n    };\n    var isTopCompletelyVisible = function (box, viewport) {\n      return box.y() >= viewport.y();\n    };\n    var isBottomCompletelyVisible = function (box, viewport) {\n      return box.bottom() <= viewport.bottom();\n    };\n    var isVisibleForModes = function (modes, box, viewport) {\n      return forall(modes, function (mode) {\n        switch (mode) {\n        case 'bottom':\n          return isBottomCompletelyVisible(box, viewport);\n        case 'top':\n          return isTopCompletelyVisible(box, viewport);\n        }\n      });\n    };\n    var getPrior = function (elem, state) {\n      return state.getInitialPosition().map(function (pos) {\n        return bounds$1(pos.bounds.x(), pos.bounds.y(), get$7(elem), get$6(elem));\n      });\n    };\n    var storePrior = function (elem, box, state) {\n      state.setInitialPosition(Option.some({\n        style: getAllRaw(elem),\n        position: get$4(elem, 'position') || 'static',\n        bounds: box\n      }));\n    };\n    var revertToOriginal = function (elem, box$1, state) {\n      return state.getInitialPosition().bind(function (position) {\n        state.setInitialPosition(Option.none());\n        switch (position.position) {\n        case 'static':\n          return Option.some(morphAdt.static());\n        case 'absolute':\n          var offsetBox_1 = getOffsetParent(elem).map(box).getOrThunk(function () {\n            return box(body());\n          });\n          return Option.some(morphAdt.absolute(NuPositionCss('absolute', get(position.style, 'left').map(function (_) {\n            return box$1.x() - offsetBox_1.x();\n          }), get(position.style, 'top').map(function (_) {\n            return box$1.y() - offsetBox_1.y();\n          }), get(position.style, 'right').map(function (_) {\n            return offsetBox_1.right() - box$1.right();\n          }), get(position.style, 'bottom').map(function (_) {\n            return offsetBox_1.bottom() - box$1.bottom();\n          }))));\n        default:\n          return Option.none();\n        }\n      });\n    };\n    var morphToOriginal = function (elem, dockInfo, viewport, state) {\n      return getPrior(elem, state).filter(function (box) {\n        return isVisibleForModes(dockInfo.modes, box, viewport);\n      }).bind(function (box) {\n        return revertToOriginal(elem, box, state);\n      });\n    };\n    var morphToFixed = function (elem, dockInfo, viewport, state) {\n      var box$1 = box(elem);\n      if (!isVisibleForModes(dockInfo.modes, box$1, viewport)) {\n        storePrior(elem, box$1, state);\n        var winBox = win();\n        var left = box$1.x() - winBox.x();\n        var top = viewport.y() - winBox.y();\n        var bottom = winBox.bottom() - viewport.bottom();\n        var isTop = box$1.y() <= viewport.y();\n        return Option.some(morphAdt.fixed(NuPositionCss('fixed', Option.some(left), isTop ? Option.some(top) : Option.none(), Option.none(), !isTop ? Option.some(bottom) : Option.none())));\n      } else {\n        return Option.none();\n      }\n    };\n    var getMorph = function (component, dockInfo, viewport, state) {\n      var elem = component.element();\n      var isDocked = getRaw(elem, 'position').is('fixed');\n      return isDocked ? morphToOriginal(elem, dockInfo, viewport, state) : morphToFixed(elem, dockInfo, viewport, state);\n    };\n    var getMorphToOriginal = function (component, state) {\n      var elem = component.element();\n      return getPrior(elem, state).bind(function (box) {\n        return revertToOriginal(elem, box, state);\n      });\n    };\n\n    var morphToStatic = function (component, config) {\n      each([\n        'left',\n        'right',\n        'top',\n        'bottom',\n        'position'\n      ], function (prop) {\n        return remove$6(component.element(), prop);\n      });\n      config.onUndocked(component);\n    };\n    var morphToCoord = function (component, config, position) {\n      applyPositionCss(component.element(), position);\n      var method = position.position() === 'fixed' ? config.onDocked : config.onUndocked;\n      method(component);\n    };\n    var updateVisibility = function (component, config, state, viewport, morphToDocked) {\n      if (morphToDocked === void 0) {\n        morphToDocked = false;\n      }\n      config.contextual.each(function (contextInfo) {\n        contextInfo.lazyContext(component).each(function (box) {\n          var isVisible = isPartiallyVisible(box, viewport);\n          if (isVisible !== state.isVisible()) {\n            state.setVisible(isVisible);\n            if (morphToDocked && !isVisible) {\n              add$3(component.element(), [contextInfo.fadeOutClass]);\n              contextInfo.onHide(component);\n            } else {\n              var method = isVisible ? appear : disappear;\n              method(component, contextInfo);\n            }\n          }\n        });\n      });\n    };\n    var refreshInternal = function (component, config, state) {\n      var viewport = config.lazyViewport(component);\n      var isDocked = state.isDocked();\n      if (isDocked) {\n        updateVisibility(component, config, state, viewport);\n      }\n      getMorph(component, config, viewport, state).each(function (morph) {\n        state.setDocked(!isDocked);\n        morph.fold(function () {\n          return morphToStatic(component, config);\n        }, function (position) {\n          return morphToCoord(component, config, position);\n        }, function (position) {\n          updateVisibility(component, config, state, viewport, true);\n          morphToCoord(component, config, position);\n        });\n      });\n    };\n    var resetInternal = function (component, config, state) {\n      var elem = component.element();\n      state.setDocked(false);\n      getMorphToOriginal(component, state).each(function (morph) {\n        morph.fold(function () {\n          return morphToStatic(component, config);\n        }, function (position) {\n          return morphToCoord(component, config, position);\n        }, noop);\n      });\n      state.setVisible(true);\n      config.contextual.each(function (contextInfo) {\n        remove$5(elem, [\n          contextInfo.fadeInClass,\n          contextInfo.fadeOutClass,\n          contextInfo.transitionClass\n        ]);\n        contextInfo.onShow(component);\n      });\n      refresh$4(component, config, state);\n    };\n    var refresh$4 = function (component, config, state) {\n      if (component.getSystem().isConnected()) {\n        refreshInternal(component, config, state);\n      }\n    };\n    var reset = function (component, config, state) {\n      if (state.isDocked()) {\n        resetInternal(component, config, state);\n      }\n    };\n    var isDocked = function (component, config, state) {\n      return state.isDocked();\n    };\n\n    var DockingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        refresh: refresh$4,\n        reset: reset,\n        isDocked: isDocked\n    });\n\n    var events$f = function (dockInfo, dockState) {\n      return derive([\n        runOnSource(transitionend(), function (component, simulatedEvent) {\n          dockInfo.contextual.each(function (contextInfo) {\n            if (has$2(component.element(), contextInfo.transitionClass)) {\n              remove$5(component.element(), [\n                contextInfo.transitionClass,\n                contextInfo.fadeInClass\n              ]);\n              var notify = dockState.isVisible() ? contextInfo.onShown : contextInfo.onHidden;\n              notify(component);\n            }\n            simulatedEvent.stop();\n          });\n        }),\n        run(windowScroll(), function (component, _) {\n          refresh$4(component, dockInfo, dockState);\n        }),\n        run(windowResize(), function (component, _) {\n          reset(component, dockInfo, dockState);\n        })\n      ]);\n    };\n\n    var ActiveDocking = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        events: events$f\n    });\n\n    var DockingSchema = [\n      optionObjOf('contextual', [\n        strictString('fadeInClass'),\n        strictString('fadeOutClass'),\n        strictString('transitionClass'),\n        strictFunction('lazyContext'),\n        onHandler('onShow'),\n        onHandler('onShown'),\n        onHandler('onHide'),\n        onHandler('onHidden')\n      ]),\n      defaultedFunction('lazyViewport', win),\n      defaultedArrayOf('modes', [\n        'top',\n        'bottom'\n      ], string),\n      onHandler('onDocked'),\n      onHandler('onUndocked')\n    ];\n\n    var init$b = function () {\n      var docked = Cell(false);\n      var visible = Cell(true);\n      var initialBounds = Cell(Option.none());\n      var readState = function () {\n        return 'docked:  ' + docked.get() + ', visible: ' + visible.get();\n      };\n      return nu$5({\n        isDocked: function () {\n          return docked.get();\n        },\n        setDocked: function (state) {\n          return docked.set(state);\n        },\n        getInitialPosition: function () {\n          return initialBounds.get();\n        },\n        setInitialPosition: function (pos) {\n          return initialBounds.set(pos);\n        },\n        isVisible: function () {\n          return visible.get();\n        },\n        setVisible: function (state) {\n          return visible.set(state);\n        },\n        readState: readState\n      });\n    };\n\n    var DockingState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$b\n    });\n\n    var Docking = create$1({\n      fields: DockingSchema,\n      name: 'docking',\n      active: ActiveDocking,\n      apis: DockingApis,\n      state: DockingState\n    });\n\n    var visibility = {\n      fadeInClass: 'tox-editor-dock-fadein',\n      fadeOutClass: 'tox-editor-dock-fadeout',\n      transitionClass: 'tox-editor-dock-transition'\n    };\n    var editorStickyOnClass = 'tox-tinymce--toolbar-sticky-on';\n    var editorStickyOffClass = 'tox-tinymce--toolbar-sticky-off';\n    var scrollFromBehindHeader = function (e, containerHeader) {\n      var doc = owner(containerHeader);\n      var viewHeight = doc.dom().defaultView.innerHeight;\n      var scrollPos = get$8(doc);\n      var markerElement = Element.fromDom(e.elm);\n      var markerPos = absolute$1(markerElement);\n      var markerHeight = get$6(markerElement);\n      var markerTop = markerPos.y();\n      var markerBottom = markerTop + markerHeight;\n      var editorHeaderPos = absolute(containerHeader);\n      var editorHeaderHeight = get$6(containerHeader);\n      var editorHeaderTop = editorHeaderPos.top();\n      var editorHeaderBottom = editorHeaderTop + editorHeaderHeight;\n      var editorHeaderDockedAtTop = Math.abs(editorHeaderTop - scrollPos.top()) < 2;\n      var editorHeaderDockedAtBottom = Math.abs(editorHeaderBottom - (scrollPos.top() + viewHeight)) < 2;\n      if (editorHeaderDockedAtTop && markerTop < editorHeaderBottom) {\n        to(scrollPos.left(), markerTop - editorHeaderHeight, doc);\n      } else if (editorHeaderDockedAtBottom && markerBottom > editorHeaderTop) {\n        var y = markerTop - viewHeight + markerHeight + editorHeaderHeight;\n        to(scrollPos.left(), y, doc);\n      }\n    };\n    var updateIframeContentFlow = function (header, isToolbarTop) {\n      var getOccupiedHeight = function (elm) {\n        return getOuter$1(elm) + (parseInt(get$4(elm, 'margin-top'), 10) || 0) + (parseInt(get$4(elm, 'margin-bottom'), 10) || 0);\n      };\n      var elm = header.element();\n      parent(elm).each(function (parentElem) {\n        var padding = 'padding-' + (isToolbarTop ? 'top' : 'bottom');\n        if (Docking.isDocked(header)) {\n          var parentWidth = get$7(parentElem);\n          set$2(elm, 'width', parentWidth + 'px');\n          set$2(parentElem, padding, getOccupiedHeight(elm) + 'px');\n        } else {\n          remove$6(elm, 'width');\n          remove$6(parentElem, padding);\n        }\n      });\n    };\n    var updateSinkVisibility = function (sinkElem, visible) {\n      if (visible) {\n        remove$4(sinkElem, visibility.fadeOutClass);\n        add$3(sinkElem, [\n          visibility.transitionClass,\n          visibility.fadeInClass\n        ]);\n      } else {\n        remove$4(sinkElem, visibility.fadeInClass);\n        add$3(sinkElem, [\n          visibility.fadeOutClass,\n          visibility.transitionClass\n        ]);\n      }\n    };\n    var updateEditorClasses = function (editor, docked) {\n      var editorContainer = Element.fromDom(editor.getContainer());\n      if (docked) {\n        add$2(editorContainer, editorStickyOnClass);\n        remove$4(editorContainer, editorStickyOffClass);\n      } else {\n        add$2(editorContainer, editorStickyOffClass);\n        remove$4(editorContainer, editorStickyOnClass);\n      }\n    };\n    var restoreFocus = function (headerElem, focusedElem) {\n      var ownerDoc = owner(focusedElem);\n      active(ownerDoc).filter(function (activeElm) {\n        return !eq(focusedElem, activeElm);\n      }).filter(function (activeElm) {\n        return eq(activeElm, Element.fromDom(ownerDoc.dom().body)) || contains$2(headerElem, activeElm);\n      }).each(function () {\n        return focus$1(focusedElem);\n      });\n    };\n    var findFocusedElem = function (rootElm, lazySink) {\n      return search(rootElm).orThunk(function () {\n        return lazySink().toOption().bind(function (sink) {\n          return search(sink.element());\n        });\n      });\n    };\n    var setup$4 = function (editor, lazyHeader) {\n      if (!editor.inline) {\n        if (!isToolbarLocationTop(editor)) {\n          editor.on('ResizeEditor', function () {\n            lazyHeader().each(Docking.reset);\n          });\n        }\n        editor.on('ResizeWindow ResizeEditor', function () {\n          lazyHeader().each(function (header) {\n            return updateIframeContentFlow(header, isToolbarLocationTop(editor));\n          });\n        });\n        editor.on('SkinLoaded', function () {\n          lazyHeader().each(function (comp) {\n            Docking.isDocked(comp) ? Docking.reset(comp) : Docking.refresh(comp);\n          });\n        });\n        editor.on('FullscreenStateChanged', function () {\n          lazyHeader().each(Docking.reset);\n        });\n      }\n      editor.on('AfterScrollIntoView', function (e) {\n        lazyHeader().each(function (header) {\n          Docking.refresh(header);\n          var headerElem = header.element();\n          if (isVisible(headerElem)) {\n            scrollFromBehindHeader(e, headerElem);\n          }\n        });\n      });\n      editor.on('PostRender', function () {\n        updateEditorClasses(editor, false);\n      });\n    };\n    var isDocked$1 = function (lazyHeader) {\n      return lazyHeader().map(Docking.isDocked).getOr(false);\n    };\n    var getIframeBehaviours = function (isToolbarTop) {\n      var _a;\n      return [Receiving.config({\n          channels: (_a = {}, _a[toolbarHeightChange()] = {\n            onReceive: function (comp) {\n              updateIframeContentFlow(comp, isToolbarTop);\n            }\n          }, _a)\n        })];\n    };\n    var getBehaviours$2 = function (editor, lazySink) {\n      var focusedElm = Cell(Option.none());\n      var isToolbarTop = isToolbarLocationTop(editor);\n      var runOnSinkElement = function (f) {\n        lazySink().each(function (sink) {\n          return f(sink.element());\n        });\n      };\n      var onDockingSwitch = function (comp) {\n        if (!editor.inline) {\n          updateIframeContentFlow(comp, isToolbarTop);\n        }\n        updateEditorClasses(editor, Docking.isDocked(comp));\n        comp.getSystem().broadcastOn([repositionPopups()], {});\n        lazySink().each(function (sink) {\n          return sink.getSystem().broadcastOn([repositionPopups()], {});\n        });\n      };\n      var additionalBehaviours = editor.inline ? [] : getIframeBehaviours(isToolbarTop);\n      return __spreadArrays([\n        Focusing.config({}),\n        Docking.config({\n          contextual: __assign({\n            lazyContext: function (comp) {\n              var headerHeight = getOuter$1(comp.element());\n              var container = editor.inline ? editor.getContentAreaContainer() : editor.getContainer();\n              var box$1 = box(Element.fromDom(container));\n              var boxHeight = box$1.height() - headerHeight;\n              var topBound = box$1.y() + (isToolbarTop ? 0 : headerHeight);\n              return Option.some(bounds$1(box$1.x(), topBound, box$1.width(), boxHeight));\n            },\n            onShow: function () {\n              runOnSinkElement(function (elem) {\n                return updateSinkVisibility(elem, true);\n              });\n            },\n            onShown: function (comp) {\n              runOnSinkElement(function (elem) {\n                return remove$5(elem, [\n                  visibility.transitionClass,\n                  visibility.fadeInClass\n                ]);\n              });\n              focusedElm.get().each(function (elem) {\n                restoreFocus(comp.element(), elem);\n                focusedElm.set(Option.none());\n              });\n            },\n            onHide: function (comp) {\n              focusedElm.set(findFocusedElem(comp.element(), lazySink));\n              runOnSinkElement(function (elem) {\n                return updateSinkVisibility(elem, false);\n              });\n            },\n            onHidden: function () {\n              runOnSinkElement(function (elem) {\n                return remove$5(elem, [visibility.transitionClass]);\n              });\n            }\n          }, visibility),\n          modes: [isToolbarTop ? 'top' : 'bottom'],\n          onDocked: onDockingSwitch,\n          onUndocked: onDockingSwitch\n        })\n      ], additionalBehaviours);\n    };\n\n    var StickyHeader = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setup: setup$4,\n        isDocked: isDocked$1,\n        getBehaviours: getBehaviours$2\n    });\n\n    var setup$5 = noop;\n    var isDocked$2 = never;\n    var getBehaviours$3 = constant([]);\n\n    var StaticHeader = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        setup: setup$5,\n        isDocked: isDocked$2,\n        getBehaviours: getBehaviours$3\n    });\n\n    var renderHeader = function (spec) {\n      var editor = spec.editor;\n      var getBehaviours = spec.sticky ? getBehaviours$2 : getBehaviours$3;\n      return {\n        uid: spec.uid,\n        dom: spec.dom,\n        components: spec.components,\n        behaviours: derive$1(getBehaviours(editor, spec.getSink))\n      };\n    };\n\n    var factory$g = function (detail, spec) {\n      var setMenus = function (comp, menus) {\n        var newMenus = map(menus, function (m) {\n          var buttonSpec = {\n            type: 'menubutton',\n            text: m.text,\n            fetch: function (callback) {\n              callback(m.getItems());\n            }\n          };\n          var internal = createMenuButton(buttonSpec).mapError(function (errInfo) {\n            return formatError(errInfo);\n          }).getOrDie();\n          return renderMenuButton(internal, 'tox-mbtn', spec.backstage, Option.some('menuitem'));\n        });\n        Replacing.set(comp, newMenus);\n      };\n      var apis = {\n        focus: Keying.focusIn,\n        setMenus: setMenus\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: [],\n        behaviours: derive$1([\n          Replacing.config({}),\n          config('menubar-events', [\n            runOnAttached(function (component) {\n              detail.onSetup(component);\n            }),\n            run(mouseover(), function (comp, se) {\n              descendant$1(comp.element(), '.' + 'tox-mbtn--active').each(function (activeButton) {\n                closest$3(se.event().target(), '.' + 'tox-mbtn').each(function (hoveredButton) {\n                  if (!eq(activeButton, hoveredButton)) {\n                    comp.getSystem().getByDom(activeButton).each(function (activeComp) {\n                      comp.getSystem().getByDom(hoveredButton).each(function (hoveredComp) {\n                        Dropdown.expand(hoveredComp);\n                        Dropdown.close(activeComp);\n                        Focusing.focus(hoveredComp);\n                      });\n                    });\n                  }\n                });\n              });\n            }),\n            run(focusShifted(), function (comp, se) {\n              se.event().prevFocus().bind(function (prev) {\n                return comp.getSystem().getByDom(prev).toOption();\n              }).each(function (prev) {\n                se.event().newFocus().bind(function (nu) {\n                  return comp.getSystem().getByDom(nu).toOption();\n                }).each(function (nu) {\n                  if (Dropdown.isOpen(prev)) {\n                    Dropdown.expand(nu);\n                    Dropdown.close(prev);\n                  }\n                });\n              });\n            })\n          ]),\n          Keying.config({\n            mode: 'flow',\n            selector: '.' + 'tox-mbtn',\n            onEscape: function (comp) {\n              detail.onEscape(comp);\n              return Option.some(true);\n            }\n          }),\n          Tabstopping.config({})\n        ]),\n        apis: apis,\n        domModification: { attributes: { role: 'menubar' } }\n      };\n    };\n    var SilverMenubar = single$2({\n      factory: factory$g,\n      name: 'silver.Menubar',\n      configFields: [\n        strict$1('dom'),\n        strict$1('uid'),\n        strict$1('onEscape'),\n        strict$1('backstage'),\n        defaulted$1('onSetup', noop)\n      ],\n      apis: {\n        focus: function (apis, comp) {\n          apis.focus(comp);\n        },\n        setMenus: function (apis, comp, menus) {\n          apis.setMenus(comp, menus);\n        }\n      }\n    });\n\n    var owner$4 = 'container';\n    var schema$s = [field$1('slotBehaviours', [])];\n    var getPartName$1 = function (name) {\n      return '<alloy.field.' + name + '>';\n    };\n    var sketch$2 = function (sSpec) {\n      var parts = function () {\n        var record = [];\n        var slot = function (name, config) {\n          record.push(name);\n          return generateOne(owner$4, getPartName$1(name), config);\n        };\n        return {\n          slot: slot,\n          record: function () {\n            return record;\n          }\n        };\n      }();\n      var spec = sSpec(parts);\n      var partNames = parts.record();\n      var fieldParts = map(partNames, function (n) {\n        return required({\n          name: n,\n          pname: getPartName$1(n)\n        });\n      });\n      return composite(owner$4, schema$s, fieldParts, make$7, spec);\n    };\n    var make$7 = function (detail, components) {\n      var getSlotNames = function (_) {\n        return getAllPartNames(detail);\n      };\n      var getSlot = function (container, key) {\n        return getPart(container, detail, key);\n      };\n      var onSlot = function (f, def) {\n        return function (container, key) {\n          return getPart(container, detail, key).map(function (slot) {\n            return f(slot, key);\n          }).getOr(def);\n        };\n      };\n      var onSlots = function (f) {\n        return function (container, keys) {\n          each(keys, function (key) {\n            return f(container, key);\n          });\n        };\n      };\n      var doShowing = function (comp, key) {\n        return get$2(comp.element(), 'aria-hidden') !== 'true';\n      };\n      var doShow = function (comp, key) {\n        if (!doShowing(comp)) {\n          var element = comp.element();\n          remove$6(element, 'display');\n          remove$1(element, 'aria-hidden');\n          emitWith(comp, slotVisibility(), {\n            name: key,\n            visible: true\n          });\n        }\n      };\n      var doHide = function (comp, key) {\n        if (doShowing(comp)) {\n          var element = comp.element();\n          set$2(element, 'display', 'none');\n          set$1(element, 'aria-hidden', 'true');\n          emitWith(comp, slotVisibility(), {\n            name: key,\n            visible: false\n          });\n        }\n      };\n      var isShowing = onSlot(doShowing, false);\n      var hideSlot = onSlot(doHide);\n      var hideSlots = onSlots(hideSlot);\n      var hideAllSlots = function (container) {\n        return hideSlots(container, getSlotNames());\n      };\n      var showSlot = onSlot(doShow);\n      var apis = {\n        getSlotNames: getSlotNames,\n        getSlot: getSlot,\n        isShowing: isShowing,\n        hideSlot: hideSlot,\n        hideAllSlots: hideAllSlots,\n        showSlot: showSlot\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: get$c(detail.slotBehaviours),\n        apis: apis\n      };\n    };\n    var slotApis = map$1({\n      getSlotNames: function (apis, c) {\n        return apis.getSlotNames(c);\n      },\n      getSlot: function (apis, c, key) {\n        return apis.getSlot(c, key);\n      },\n      isShowing: function (apis, c, key) {\n        return apis.isShowing(c, key);\n      },\n      hideSlot: function (apis, c, key) {\n        return apis.hideSlot(c, key);\n      },\n      hideAllSlots: function (apis, c) {\n        return apis.hideAllSlots(c);\n      },\n      showSlot: function (apis, c, key) {\n        return apis.showSlot(c, key);\n      }\n    }, function (value) {\n      return makeApi(value);\n    });\n    var SlotContainer = __assign(__assign({}, slotApis), { sketch: sketch$2 });\n\n    var sidebarSchema = objOf([\n      optionString('icon'),\n      optionString('tooltip'),\n      defaultedFunction('onShow', noop),\n      defaultedFunction('onHide', noop),\n      defaultedFunction('onSetup', function () {\n        return noop;\n      })\n    ]);\n    var createSidebar = function (spec) {\n      return asRaw('sidebar', sidebarSchema, spec);\n    };\n\n    var setup$6 = function (editor) {\n      var sidebars = editor.ui.registry.getAll().sidebars;\n      each(keys(sidebars), function (name) {\n        var spec = sidebars[name];\n        var isActive = function () {\n          return Option.from(editor.queryCommandValue('ToggleSidebar')).is(name);\n        };\n        editor.ui.registry.addToggleButton(name, {\n          icon: spec.icon,\n          tooltip: spec.tooltip,\n          onAction: function (buttonApi) {\n            editor.execCommand('ToggleSidebar', false, name);\n            buttonApi.setActive(isActive());\n          },\n          onSetup: function (buttonApi) {\n            var handleToggle = function () {\n              return buttonApi.setActive(isActive());\n            };\n            editor.on('ToggleSidebar', handleToggle);\n            return function () {\n              editor.off('ToggleSidebar', handleToggle);\n            };\n          }\n        });\n      });\n    };\n    var getApi = function (comp) {\n      return {\n        element: function () {\n          return comp.element().dom();\n        }\n      };\n    };\n    var makePanels = function (parts, panelConfigs) {\n      var specs = map(keys(panelConfigs), function (name) {\n        var spec = panelConfigs[name];\n        var bridged = getOrDie(createSidebar(spec));\n        return {\n          name: name,\n          getApi: getApi,\n          onSetup: bridged.onSetup,\n          onShow: bridged.onShow,\n          onHide: bridged.onHide\n        };\n      });\n      return map(specs, function (spec) {\n        var editorOffCell = Cell(noop);\n        return parts.slot(spec.name, {\n          dom: {\n            tag: 'div',\n            classes: ['tox-sidebar__pane']\n          },\n          behaviours: SimpleBehaviours.unnamedEvents([\n            onControlAttached(spec, editorOffCell),\n            onControlDetached(spec, editorOffCell),\n            run(slotVisibility(), function (sidepanel, se) {\n              var data = se.event();\n              var optSidePanelSpec = find(specs, function (config) {\n                return config.name === data.name();\n              });\n              optSidePanelSpec.each(function (sidePanelSpec) {\n                var handler = data.visible() ? sidePanelSpec.onShow : sidePanelSpec.onHide;\n                handler(sidePanelSpec.getApi(sidepanel));\n              });\n            })\n          ])\n        });\n      });\n    };\n    var makeSidebar = function (panelConfigs) {\n      return SlotContainer.sketch(function (parts) {\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-sidebar__pane-container']\n          },\n          components: makePanels(parts, panelConfigs),\n          slotBehaviours: SimpleBehaviours.unnamedEvents([runOnAttached(function (slotContainer) {\n              return SlotContainer.hideAllSlots(slotContainer);\n            })])\n        };\n      });\n    };\n    var setSidebar = function (sidebar, panelConfigs) {\n      var optSlider = Composing.getCurrent(sidebar);\n      optSlider.each(function (slider) {\n        return Replacing.set(slider, [makeSidebar(panelConfigs)]);\n      });\n    };\n    var toggleSidebar = function (sidebar, name) {\n      var optSlider = Composing.getCurrent(sidebar);\n      optSlider.each(function (slider) {\n        var optSlotContainer = Composing.getCurrent(slider);\n        optSlotContainer.each(function (slotContainer) {\n          if (Sliding.hasGrown(slider)) {\n            if (SlotContainer.isShowing(slotContainer, name)) {\n              Sliding.shrink(slider);\n            } else {\n              SlotContainer.hideAllSlots(slotContainer);\n              SlotContainer.showSlot(slotContainer, name);\n            }\n          } else {\n            SlotContainer.hideAllSlots(slotContainer);\n            SlotContainer.showSlot(slotContainer, name);\n            Sliding.grow(slider);\n          }\n        });\n      });\n    };\n    var whichSidebar = function (sidebar) {\n      var optSlider = Composing.getCurrent(sidebar);\n      return optSlider.bind(function (slider) {\n        var sidebarOpen = Sliding.isGrowing(slider) || Sliding.hasGrown(slider);\n        if (sidebarOpen) {\n          var optSlotContainer = Composing.getCurrent(slider);\n          return optSlotContainer.bind(function (slotContainer) {\n            return find(SlotContainer.getSlotNames(slotContainer), function (name) {\n              return SlotContainer.isShowing(slotContainer, name);\n            });\n          });\n        } else {\n          return Option.none();\n        }\n      });\n    };\n    var fixSize = generate$1('FixSizeEvent');\n    var autoSize = generate$1('AutoSizeEvent');\n    var renderSidebar = function (spec) {\n      return {\n        uid: spec.uid,\n        dom: {\n          tag: 'div',\n          classes: ['tox-sidebar'],\n          attributes: { role: 'complementary' }\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-sidebar__slider']\n            },\n            components: [],\n            behaviours: derive$1([\n              Tabstopping.config({}),\n              Focusing.config({}),\n              Sliding.config({\n                dimension: { property: 'width' },\n                closedClass: 'tox-sidebar--sliding-closed',\n                openClass: 'tox-sidebar--sliding-open',\n                shrinkingClass: 'tox-sidebar--sliding-shrinking',\n                growingClass: 'tox-sidebar--sliding-growing',\n                onShrunk: function (slider) {\n                  var optSlotContainer = Composing.getCurrent(slider);\n                  optSlotContainer.each(SlotContainer.hideAllSlots);\n                  emit(slider, autoSize);\n                },\n                onGrown: function (slider) {\n                  emit(slider, autoSize);\n                },\n                onStartGrow: function (slider) {\n                  emitWith(slider, fixSize, { width: getRaw(slider.element(), 'width').getOr('') });\n                },\n                onStartShrink: function (slider) {\n                  emitWith(slider, fixSize, { width: get$7(slider.element()) + 'px' });\n                }\n              }),\n              Replacing.config({}),\n              Composing.config({\n                find: function (comp) {\n                  var children = Replacing.contents(comp);\n                  return head(children);\n                }\n              })\n            ])\n          }],\n        behaviours: derive$1([\n          ComposingConfigs.childAt(0),\n          config('sidebar-sliding-events', [\n            run(fixSize, function (comp, se) {\n              set$2(comp.element(), 'width', se.event().width());\n            }),\n            run(autoSize, function (comp, se) {\n              remove$6(comp.element(), 'width');\n            })\n          ])\n        ])\n      };\n    };\n\n    var getAttrs = function (elem) {\n      var attributes = elem.dom().attributes !== undefined ? elem.dom().attributes : [];\n      return foldl(attributes, function (b, attr) {\n        var _a;\n        if (attr.name === 'class') {\n          return b;\n        } else {\n          return __assign(__assign({}, b), (_a = {}, _a[attr.name] = attr.value, _a));\n        }\n      }, {});\n    };\n    var getClasses = function (elem) {\n      return Array.prototype.slice.call(elem.dom().classList, 0);\n    };\n    var fromHtml$2 = function (html) {\n      var elem = Element.fromHtml(html);\n      var children$1 = children(elem);\n      var attrs = getAttrs(elem);\n      var classes = getClasses(elem);\n      var contents = children$1.length === 0 ? {} : { innerHtml: get$1(elem) };\n      return __assign({\n        tag: name(elem),\n        classes: classes,\n        attributes: attrs\n      }, contents);\n    };\n\n    var renderSpinner = function (providerBackstage) {\n      return {\n        dom: {\n          tag: 'div',\n          attributes: { 'aria-label': providerBackstage.translate('Loading...') },\n          classes: ['tox-throbber__busy-spinner']\n        },\n        components: [{ dom: fromHtml$2('<div class=\"tox-spinner\"><div></div><div></div><div></div></div>') }],\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'special',\n            onTab: function () {\n              return Option.some(true);\n            },\n            onShiftTab: function () {\n              return Option.some(true);\n            }\n          }),\n          Focusing.config({})\n        ])\n      };\n    };\n    var toggleThrobber = function (comp, state, providerBackstage) {\n      var element = comp.element();\n      if (state === true) {\n        Replacing.set(comp, [renderSpinner(providerBackstage)]);\n        remove$6(element, 'display');\n        remove$1(element, 'aria-hidden');\n      } else {\n        Replacing.set(comp, []);\n        set$2(element, 'display', 'none');\n        set$1(element, 'aria-hidden', 'true');\n      }\n    };\n    var renderThrobber = function (spec) {\n      return {\n        uid: spec.uid,\n        dom: {\n          tag: 'div',\n          attributes: { 'aria-hidden': 'true' },\n          classes: ['tox-throbber'],\n          styles: { display: 'none' }\n        },\n        behaviours: derive$1([Replacing.config({})]),\n        components: []\n      };\n    };\n    var setup$7 = function (editor, lazyThrobber, sharedBackstage) {\n      var throbberState = Cell(false);\n      var timer = Cell(Option.none());\n      var toggle = function (state) {\n        if (state !== throbberState.get()) {\n          toggleThrobber(lazyThrobber(), state, sharedBackstage.providers);\n          throbberState.set(state);\n        }\n      };\n      editor.on('ProgressState', function (e) {\n        timer.get().each(global$2.clearTimeout);\n        if (isNumber(e.time)) {\n          var timerId = global$2.setEditorTimeout(editor, function () {\n            return toggle(e.state);\n          }, e.time);\n          timer.set(Option.some(timerId));\n        } else {\n          toggle(e.state);\n          timer.set(Option.none());\n        }\n      });\n    };\n\n    var factory$h = function (detail, components, spec) {\n      var apis = {\n        getSocket: function (comp) {\n          return parts$d.getPart(comp, detail, 'socket');\n        },\n        setSidebar: function (comp, panelConfigs) {\n          parts$d.getPart(comp, detail, 'sidebar').each(function (sidebar) {\n            return setSidebar(sidebar, panelConfigs);\n          });\n        },\n        toggleSidebar: function (comp, name) {\n          parts$d.getPart(comp, detail, 'sidebar').each(function (sidebar) {\n            return toggleSidebar(sidebar, name);\n          });\n        },\n        whichSidebar: function (comp) {\n          return parts$d.getPart(comp, detail, 'sidebar').bind(whichSidebar).getOrNull();\n        },\n        getHeader: function (comp) {\n          return parts$d.getPart(comp, detail, 'header');\n        },\n        getToolbar: function (comp) {\n          return parts$d.getPart(comp, detail, 'toolbar');\n        },\n        setToolbar: function (comp, groups) {\n          parts$d.getPart(comp, detail, 'toolbar').each(function (toolbar) {\n            toolbar.getApis().setGroups(toolbar, groups);\n          });\n        },\n        setToolbars: function (comp, toolbars) {\n          parts$d.getPart(comp, detail, 'multiple-toolbar').each(function (mToolbar) {\n            CustomList.setItems(mToolbar, toolbars);\n          });\n        },\n        refreshToolbar: function (comp) {\n          var toolbar = parts$d.getPart(comp, detail, 'toolbar');\n          toolbar.each(function (toolbar) {\n            return toolbar.getApis().refresh(toolbar);\n          });\n        },\n        getThrobber: function (comp) {\n          return parts$d.getPart(comp, detail, 'throbber');\n        },\n        focusToolbar: function (comp) {\n          var optToolbar = parts$d.getPart(comp, detail, 'toolbar').orThunk(function () {\n            return parts$d.getPart(comp, detail, 'multiple-toolbar');\n          });\n          optToolbar.each(function (toolbar) {\n            Keying.focusIn(toolbar);\n          });\n        },\n        setMenubar: function (comp, menus) {\n          parts$d.getPart(comp, detail, 'menubar').each(function (menubar) {\n            SilverMenubar.setMenus(menubar, menus);\n          });\n        },\n        focusMenubar: function (comp) {\n          parts$d.getPart(comp, detail, 'menubar').each(function (menubar) {\n            SilverMenubar.focus(menubar);\n          });\n        }\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        apis: apis,\n        behaviours: detail.behaviours\n      };\n    };\n    var partMenubar = partType$1.optional({\n      factory: SilverMenubar,\n      name: 'menubar',\n      schema: [strict$1('backstage')]\n    });\n    var toolbarFactory = function (spec) {\n      if (spec.type === ToolbarMode.sliding) {\n        return renderSlidingMoreToolbar;\n      } else if (spec.type === ToolbarMode.floating) {\n        return renderFloatingMoreToolbar;\n      } else {\n        return renderToolbar;\n      }\n    };\n    var partMultipleToolbar = partType$1.optional({\n      factory: {\n        sketch: function (spec) {\n          return CustomList.sketch({\n            uid: spec.uid,\n            dom: spec.dom,\n            listBehaviours: derive$1([Keying.config({\n                mode: 'acyclic',\n                selector: '.tox-toolbar'\n              })]),\n            makeItem: function () {\n              return renderToolbar({\n                type: spec.type,\n                uid: generate$1('multiple-toolbar-item'),\n                cyclicKeying: false,\n                initGroups: [],\n                onEscape: function () {\n                  return Option.none();\n                }\n              });\n            },\n            setupItem: function (mToolbar, tc, data, index) {\n              Toolbar.setGroups(tc, data);\n            },\n            shell: true\n          });\n        }\n      },\n      name: 'multiple-toolbar',\n      schema: [\n        strict$1('dom'),\n        strict$1('onEscape')\n      ]\n    });\n    var partToolbar = partType$1.optional({\n      factory: {\n        sketch: function (spec) {\n          var renderer = toolbarFactory(spec);\n          var toolbarSpec = {\n            type: spec.type,\n            uid: spec.uid,\n            onEscape: function () {\n              spec.onEscape();\n              return Option.some(true);\n            },\n            cyclicKeying: false,\n            initGroups: [],\n            getSink: spec.getSink,\n            backstage: spec.backstage,\n            moreDrawerData: {\n              lazyToolbar: spec.lazyToolbar,\n              lazyMoreButton: spec.lazyMoreButton,\n              lazyHeader: spec.lazyHeader\n            },\n            attributes: spec.attributes\n          };\n          return renderer(toolbarSpec);\n        }\n      },\n      name: 'toolbar',\n      schema: [\n        strict$1('dom'),\n        strict$1('onEscape'),\n        strict$1('getSink')\n      ]\n    });\n    var partHeader = partType$1.optional({\n      factory: { sketch: renderHeader },\n      name: 'header',\n      schema: [strict$1('dom')]\n    });\n    var partSocket = partType$1.optional({\n      name: 'socket',\n      schema: [strict$1('dom')]\n    });\n    var partSidebar = partType$1.optional({\n      factory: { sketch: renderSidebar },\n      name: 'sidebar',\n      schema: [strict$1('dom')]\n    });\n    var partThrobber = partType$1.optional({\n      factory: { sketch: renderThrobber },\n      name: 'throbber',\n      schema: [strict$1('dom')]\n    });\n    var OuterContainer = composite$1({\n      name: 'OuterContainer',\n      factory: factory$h,\n      configFields: [\n        strict$1('dom'),\n        strict$1('behaviours')\n      ],\n      partFields: [\n        partHeader,\n        partMenubar,\n        partToolbar,\n        partMultipleToolbar,\n        partSocket,\n        partSidebar,\n        partThrobber\n      ],\n      apis: {\n        getSocket: function (apis, comp) {\n          return apis.getSocket(comp);\n        },\n        setSidebar: function (apis, comp, panelConfigs) {\n          apis.setSidebar(comp, panelConfigs);\n        },\n        toggleSidebar: function (apis, comp, name) {\n          apis.toggleSidebar(comp, name);\n        },\n        whichSidebar: function (apis, comp) {\n          return apis.whichSidebar(comp);\n        },\n        getHeader: function (apis, comp) {\n          return apis.getHeader(comp);\n        },\n        getToolbar: function (apis, comp) {\n          return apis.getToolbar(comp);\n        },\n        setToolbar: function (apis, comp, grps) {\n          var groups = map(grps, function (grp) {\n            return renderToolbarGroup(grp);\n          });\n          apis.setToolbar(comp, groups);\n        },\n        setToolbars: function (apis, comp, ts) {\n          var renderedToolbars = map(ts, function (g) {\n            return map(g, renderToolbarGroup);\n          });\n          apis.setToolbars(comp, renderedToolbars);\n        },\n        refreshToolbar: function (apis, comp) {\n          return apis.refreshToolbar(comp);\n        },\n        getThrobber: function (apis, comp) {\n          return apis.getThrobber(comp);\n        },\n        setMenubar: function (apis, comp, menus) {\n          apis.setMenubar(comp, menus);\n        },\n        focusMenubar: function (apis, comp) {\n          apis.focusMenubar(comp);\n        },\n        focusToolbar: function (apis, comp) {\n          apis.focusToolbar(comp);\n        }\n      }\n    });\n\n    var defaultMenubar = 'file edit view insert format tools table help';\n    var defaultMenus = {\n      file: {\n        title: 'File',\n        items: 'newdocument restoredraft | preview | print | deleteallconversations'\n      },\n      edit: {\n        title: 'Edit',\n        items: 'undo redo | cut copy paste pastetext | selectall | searchreplace'\n      },\n      view: {\n        title: 'View',\n        items: 'code | visualaid visualchars visualblocks | spellchecker | preview fullscreen | showcomments'\n      },\n      insert: {\n        title: 'Insert',\n        items: 'image link media addcomment pageembed template codesample inserttable | charmap emoticons hr | pagebreak nonbreaking anchor toc | insertdatetime'\n      },\n      format: {\n        title: 'Format',\n        items: 'bold italic underline strikethrough superscript subscript codeformat | formats blockformats fontformats fontsizes align | forecolor backcolor | removeformat'\n      },\n      tools: {\n        title: 'Tools',\n        items: 'spellchecker spellcheckerlanguage | a11ycheck code wordcount'\n      },\n      table: {\n        title: 'Table',\n        items: 'inserttable | cell row column | advtablesort | tableprops deletetable'\n      },\n      help: {\n        title: 'Help',\n        items: 'help'\n      }\n    };\n    var make$8 = function (menu, registry, editor) {\n      var removedMenuItems = getRemovedMenuItems(editor).split(/[ ,]/);\n      return {\n        text: menu.title,\n        getItems: function () {\n          return bind(menu.items, function (i) {\n            var itemName = i.toLowerCase();\n            if (itemName.trim().length === 0) {\n              return [];\n            } else if (exists(removedMenuItems, function (removedMenuItem) {\n                return removedMenuItem === itemName;\n              })) {\n              return [];\n            } else if (itemName === 'separator' || itemName === '|') {\n              return [{ type: 'separator' }];\n            } else if (registry.menuItems[itemName]) {\n              return [registry.menuItems[itemName]];\n            } else {\n              return [];\n            }\n          });\n        }\n      };\n    };\n    var parseItemsString = function (items) {\n      if (typeof items === 'string') {\n        return items.split(' ');\n      }\n      return items;\n    };\n    var identifyMenus = function (editor, registry) {\n      var rawMenuData = __assign(__assign({}, defaultMenus), registry.menus);\n      var userDefinedMenus = keys(registry.menus).length > 0;\n      var menubar = registry.menubar === undefined || registry.menubar === true ? parseItemsString(defaultMenubar) : parseItemsString(registry.menubar === false ? '' : registry.menubar);\n      var validMenus = filter(menubar, function (menuName) {\n        return userDefinedMenus ? registry.menus.hasOwnProperty(menuName) && registry.menus[menuName].hasOwnProperty('items') || defaultMenus.hasOwnProperty(menuName) : defaultMenus.hasOwnProperty(menuName);\n      });\n      var menus = map(validMenus, function (menuName) {\n        var menuData = rawMenuData[menuName];\n        return make$8({\n          title: menuData.title,\n          items: parseItemsString(menuData.items)\n        }, registry, editor);\n      });\n      return filter(menus, function (menu) {\n        var isNotSeparator = function (item) {\n          return item.type !== 'separator';\n        };\n        return menu.getItems().length > 0 && exists(menu.getItems(), isNotSeparator);\n      });\n    };\n\n    var fireSkinLoaded$1 = function (editor) {\n      var done = function () {\n        editor._skinLoaded = true;\n        Events.fireSkinLoaded(editor);\n      };\n      return function () {\n        if (editor.initialized) {\n          done();\n        } else {\n          editor.on('init', done);\n        }\n      };\n    };\n    var fireSkinLoadError$1 = function (editor, err) {\n      return function () {\n        return Events.fireSkinLoadError(editor, { message: err });\n      };\n    };\n    var SkinLoaded = {\n      fireSkinLoaded: fireSkinLoaded$1,\n      fireSkinLoadError: fireSkinLoadError$1\n    };\n\n    var loadSkin = function (isInline, editor) {\n      var skinUrl = getSkinUrl(editor);\n      var skinUiCss;\n      if (skinUrl) {\n        skinUiCss = skinUrl + '/skin.min.css';\n        editor.contentCSS.push(skinUrl + (isInline ? '/content.inline' : '/content') + '.min.css');\n      }\n      if (isSkinDisabled(editor) === false && skinUiCss) {\n        global$3.DOM.styleSheetLoader.load(skinUiCss, SkinLoaded.fireSkinLoaded(editor), SkinLoaded.fireSkinLoadError(editor, 'Skin could not be loaded'));\n      } else {\n        SkinLoaded.fireSkinLoaded(editor)();\n      }\n    };\n    var iframe = curry(loadSkin, false);\n    var inline = curry(loadSkin, true);\n\n    var setToolbar = function (editor, uiComponents, rawUiConfig, backstage) {\n      var comp = uiComponents.outerContainer;\n      var toolbarConfig = rawUiConfig.toolbar;\n      var toolbarButtonsConfig = rawUiConfig.buttons;\n      if (isArrayOf(toolbarConfig, isString)) {\n        var toolbars = toolbarConfig.map(function (t) {\n          var config = {\n            toolbar: t,\n            buttons: toolbarButtonsConfig,\n            allowToolbarGroups: rawUiConfig.allowToolbarGroups\n          };\n          return identifyButtons(editor, config, { backstage: backstage }, Option.none());\n        });\n        OuterContainer.setToolbars(comp, toolbars);\n      } else {\n        OuterContainer.setToolbar(comp, identifyButtons(editor, rawUiConfig, { backstage: backstage }, Option.none()));\n      }\n    };\n\n    var DOM = global$3.DOM;\n    var detection = detect$3();\n    var isiOS12 = detection.os.isiOS() && detection.os.version.major <= 12;\n    var setupEvents = function (editor) {\n      var contentWindow = editor.getWin();\n      var initialDocEle = editor.getDoc().documentElement;\n      var lastWindowDimensions = Cell(Position(contentWindow.innerWidth, contentWindow.innerHeight));\n      var lastDocumentDimensions = Cell(Position(initialDocEle.offsetWidth, initialDocEle.offsetHeight));\n      var resize = function (e) {\n        var docEle = editor.getDoc().documentElement;\n        var outer = lastWindowDimensions.get();\n        var inner = lastDocumentDimensions.get();\n        if (outer.left() !== contentWindow.innerWidth || outer.top() !== contentWindow.innerHeight) {\n          lastWindowDimensions.set(Position(contentWindow.innerWidth, contentWindow.innerHeight));\n          Events.fireResizeContent(editor, e);\n        } else if (inner.left() !== docEle.offsetWidth || inner.top() !== docEle.offsetHeight) {\n          lastDocumentDimensions.set(Position(docEle.offsetWidth, docEle.offsetHeight));\n          Events.fireResizeContent(editor, e);\n        }\n      };\n      var scroll = function (e) {\n        return Events.fireScrollContent(editor, e);\n      };\n      DOM.bind(contentWindow, 'resize', resize);\n      DOM.bind(contentWindow, 'scroll', scroll);\n      var elementLoad = capture$1(Element.fromDom(editor.getBody()), 'load', resize);\n      editor.on('remove', function () {\n        elementLoad.unbind();\n        DOM.unbind(contentWindow, 'resize', resize);\n        DOM.unbind(contentWindow, 'scroll', scroll);\n      });\n    };\n    var render = function (editor, uiComponents, rawUiConfig, backstage, args) {\n      var lastToolbarWidth = Cell(0);\n      iframe(editor);\n      attachSystemAfter(Element.fromDom(args.targetNode), uiComponents.mothership);\n      attachSystem(body(), uiComponents.uiMothership);\n      editor.on('PostRender', function () {\n        setToolbar(editor, uiComponents, rawUiConfig, backstage);\n        lastToolbarWidth.set(editor.getWin().innerWidth);\n        OuterContainer.setMenubar(uiComponents.outerContainer, identifyMenus(editor, rawUiConfig));\n        OuterContainer.setSidebar(uiComponents.outerContainer, rawUiConfig.sidebar);\n        setupEvents(editor);\n      });\n      var socket = OuterContainer.getSocket(uiComponents.outerContainer).getOrDie('Could not find expected socket element');\n      if (isiOS12 === true) {\n        setAll$1(socket.element(), {\n          'overflow': 'scroll',\n          '-webkit-overflow-scrolling': 'touch'\n        });\n        var limit = first(function () {\n          editor.fire('ScrollContent');\n        }, 20);\n        bind$3(socket.element(), 'scroll', limit.throttle);\n      }\n      setupReadonlyModeSwitch(editor, uiComponents);\n      editor.addCommand('ToggleSidebar', function (ui, value) {\n        OuterContainer.toggleSidebar(uiComponents.outerContainer, value);\n        editor.fire('ToggleSidebar');\n      });\n      editor.addQueryValueHandler('ToggleSidebar', function () {\n        return OuterContainer.whichSidebar(uiComponents.outerContainer);\n      });\n      var toolbarMode = getToolbarMode(editor);\n      var refreshDrawer = function () {\n        OuterContainer.refreshToolbar(uiComponents.outerContainer);\n      };\n      if (toolbarMode === ToolbarMode.sliding || toolbarMode === ToolbarMode.floating) {\n        editor.on('ResizeWindow ResizeEditor ResizeContent', function () {\n          var width = editor.getWin().innerWidth;\n          if (width !== lastToolbarWidth.get()) {\n            refreshDrawer();\n            lastToolbarWidth.set(width);\n          }\n        });\n      }\n      return {\n        iframeContainer: socket.element().dom(),\n        editorContainer: uiComponents.outerContainer.element().dom()\n      };\n    };\n    var Iframe = { render: render };\n\n    var parseToInt = function (val) {\n      var re = /^[0-9\\.]+(|px)$/i;\n      if (re.test('' + val)) {\n        return Option.some(parseInt('' + val, 10));\n      }\n      return Option.none();\n    };\n    var numToPx = function (val) {\n      return isNumber(val) ? val + 'px' : val;\n    };\n    var calcCappedSize = function (size, minSize, maxSize) {\n      var minOverride = minSize.filter(function (min) {\n        return size < min;\n      });\n      var maxOverride = maxSize.filter(function (max) {\n        return size > max;\n      });\n      return minOverride.or(maxOverride).getOr(size);\n    };\n    var Utils = {\n      calcCappedSize: calcCappedSize,\n      parseToInt: parseToInt,\n      numToPx: numToPx\n    };\n\n    var getHeight$1 = function (editor) {\n      var baseHeight = getHeightSetting(editor);\n      var minHeight = getMinHeightSetting(editor);\n      var maxHeight = getMaxHeightSetting(editor);\n      return Utils.parseToInt(baseHeight).map(function (height) {\n        return Utils.calcCappedSize(height, minHeight, maxHeight);\n      });\n    };\n    var getHeightWithFallback = function (editor) {\n      var height = getHeight$1(editor);\n      return height.getOr(getHeightSetting(editor));\n    };\n    var getWidth$1 = function (editor) {\n      var baseWidth = getWidthSetting(editor);\n      var minWidth = getMinWidthSetting(editor);\n      var maxWidth = getMaxWidthSetting(editor);\n      return Utils.parseToInt(baseWidth).map(function (width) {\n        return Utils.calcCappedSize(width, minWidth, maxWidth);\n      });\n    };\n    var getWidthWithFallback = function (editor) {\n      var width = getWidth$1(editor);\n      return width.getOr(getWidthSetting(editor));\n    };\n\n    var getTargetPosAndHeight = function (targetElm, isToolbarTop) {\n      var pos = box(targetElm);\n      return {\n        pos: isToolbarTop ? pos.y() : pos.bottom(),\n        height: pos.height()\n      };\n    };\n    var render$1 = function (editor, uiComponents, rawUiConfig, backstage, args) {\n      var mothership = uiComponents.mothership, uiMothership = uiComponents.uiMothership, outerContainer = uiComponents.outerContainer;\n      var floatContainer;\n      var DOM = global$3.DOM;\n      var useFixedToolbarContainer = useFixedContainer(editor);\n      var isSticky = isStickyToolbar(editor);\n      var targetElm = Element.fromDom(args.targetNode);\n      var editorMaxWidthOpt = getMaxWidthSetting(editor).or(getWidth$1(editor));\n      var toolbarMode = getToolbarMode(editor);\n      var isSplitToolbar = toolbarMode === ToolbarMode.sliding || toolbarMode === ToolbarMode.floating;\n      var isToolbarTop = isToolbarLocationTop(editor);\n      var prevPosAndHeight = Cell(getTargetPosAndHeight(targetElm, isToolbarTop));\n      var visible = Cell(false);\n      inline(editor);\n      var updateChromePosition = function (toolbar) {\n        var offset = isSplitToolbar ? toolbar.fold(function () {\n          return 0;\n        }, function (tbar) {\n          return tbar.components().length > 1 ? get$6(tbar.components()[1].element()) : 0;\n        }) : 0;\n        var targetBounds = box(targetElm);\n        var top = isToolbarTop ? targetBounds.y() - get$6(floatContainer.element()) + offset : targetBounds.bottom();\n        setAll$1(outerContainer.element(), {\n          position: 'absolute',\n          top: Math.round(top) + 'px',\n          left: Math.round(targetBounds.x()) + 'px'\n        });\n        var maxWidth = editorMaxWidthOpt.getOrThunk(function () {\n          var bodyMargin = Utils.parseToInt(get$4(body(), 'margin-left')).getOr(0);\n          return get$7(body()) - targetBounds.x() + bodyMargin;\n        });\n        set$2(floatContainer.element(), 'max-width', maxWidth + 'px');\n      };\n      var repositionFloatingUiComponents = function () {\n        uiMothership.broadcastOn([repositionPopups()], {});\n      };\n      var updateChromeUi = function (resetDocking) {\n        if (resetDocking === void 0) {\n          resetDocking = false;\n        }\n        if (isSplitToolbar) {\n          OuterContainer.refreshToolbar(outerContainer);\n        }\n        if (!useFixedToolbarContainer) {\n          var toolbar_1 = OuterContainer.getToolbar(outerContainer);\n          updateChromePosition(toolbar_1);\n        }\n        if (isSticky) {\n          resetDocking ? Docking.reset(floatContainer) : Docking.refresh(floatContainer);\n        }\n        repositionFloatingUiComponents();\n      };\n      var show = function () {\n        visible.set(true);\n        set$2(outerContainer.element(), 'display', 'flex');\n        DOM.addClass(editor.getBody(), 'mce-edit-focus');\n        remove$6(uiMothership.element(), 'display');\n        updateChromeUi();\n      };\n      var hide = function () {\n        visible.set(false);\n        if (uiComponents.outerContainer) {\n          set$2(outerContainer.element(), 'display', 'none');\n          DOM.removeClass(editor.getBody(), 'mce-edit-focus');\n        }\n        set$2(uiMothership.element(), 'display', 'none');\n      };\n      var render = function () {\n        if (floatContainer) {\n          show();\n          return;\n        }\n        floatContainer = OuterContainer.getHeader(outerContainer).getOrDie();\n        var uiContainer = getUiContainer(editor);\n        attachSystem(uiContainer, mothership);\n        attachSystem(uiContainer, uiMothership);\n        setToolbar(editor, uiComponents, rawUiConfig, backstage);\n        OuterContainer.setMenubar(outerContainer, identifyMenus(editor, rawUiConfig));\n        show();\n        editor.on('activate', show);\n        editor.on('deactivate', hide);\n        editor.on('SkinLoaded ResizeWindow', function () {\n          if (visible.get()) {\n            updateChromeUi(true);\n          }\n        });\n        editor.on('NodeChange keydown', function () {\n          global$2.requestAnimationFrame(function () {\n            var posAndHeight = getTargetPosAndHeight(targetElm, isToolbarTop);\n            var prev = prevPosAndHeight.get();\n            if (visible.get()) {\n              if (posAndHeight.pos !== prev.pos) {\n                updateChromeUi(true);\n                prevPosAndHeight.set(posAndHeight);\n              } else if (posAndHeight.height !== prev.height) {\n                repositionFloatingUiComponents();\n                prevPosAndHeight.set(posAndHeight);\n              }\n            }\n          });\n        });\n        editor.nodeChanged();\n      };\n      editor.on('focus', render);\n      editor.on('blur hide', hide);\n      editor.on('init', function () {\n        if (editor.hasFocus()) {\n          render();\n        }\n      });\n      setupReadonlyModeSwitch(editor, uiComponents);\n      return { editorContainer: outerContainer.element().dom() };\n    };\n    var Inline = { render: render$1 };\n\n    var register$5 = function (editor) {\n      var alignToolbarButtons = [\n        {\n          name: 'alignleft',\n          text: 'Align left',\n          cmd: 'JustifyLeft',\n          icon: 'align-left'\n        },\n        {\n          name: 'aligncenter',\n          text: 'Align center',\n          cmd: 'JustifyCenter',\n          icon: 'align-center'\n        },\n        {\n          name: 'alignright',\n          text: 'Align right',\n          cmd: 'JustifyRight',\n          icon: 'align-right'\n        },\n        {\n          name: 'alignjustify',\n          text: 'Justify',\n          cmd: 'JustifyFull',\n          icon: 'align-justify'\n        }\n      ];\n      global$e.each(alignToolbarButtons, function (item) {\n        editor.ui.registry.addToggleButton(item.name, {\n          tooltip: item.text,\n          onAction: function () {\n            return editor.execCommand(item.cmd);\n          },\n          icon: item.icon,\n          onSetup: onSetupFormatToggle(editor, item.name)\n        });\n      });\n      var alignNoneToolbarButton = {\n        name: 'alignnone',\n        text: 'No alignment',\n        cmd: 'JustifyNone',\n        icon: 'align-none'\n      };\n      editor.ui.registry.addButton(alignNoneToolbarButton.name, {\n        tooltip: alignNoneToolbarButton.text,\n        onAction: function () {\n          return editor.execCommand(alignNoneToolbarButton.cmd);\n        },\n        icon: alignNoneToolbarButton.icon\n      });\n    };\n    var AlignmentButtons = { register: register$5 };\n\n    var toggleFormat = function (editor, fmt) {\n      return function () {\n        editor.execCommand('mceToggleFormat', false, fmt);\n      };\n    };\n    var registerFormatButtons = function (editor) {\n      global$e.each([\n        {\n          name: 'bold',\n          text: 'Bold',\n          icon: 'bold'\n        },\n        {\n          name: 'italic',\n          text: 'Italic',\n          icon: 'italic'\n        },\n        {\n          name: 'underline',\n          text: 'Underline',\n          icon: 'underline'\n        },\n        {\n          name: 'strikethrough',\n          text: 'Strikethrough',\n          icon: 'strike-through'\n        },\n        {\n          name: 'subscript',\n          text: 'Subscript',\n          icon: 'subscript'\n        },\n        {\n          name: 'superscript',\n          text: 'Superscript',\n          icon: 'superscript'\n        }\n      ], function (btn, idx) {\n        editor.ui.registry.addToggleButton(btn.name, {\n          tooltip: btn.text,\n          icon: btn.icon,\n          onSetup: onSetupFormatToggle(editor, btn.name),\n          onAction: toggleFormat(editor, btn.name)\n        });\n      });\n      for (var i = 1; i <= 6; i++) {\n        var name_1 = 'h' + i;\n        editor.ui.registry.addToggleButton(name_1, {\n          text: name_1.toUpperCase(),\n          tooltip: 'Heading ' + i,\n          onSetup: onSetupFormatToggle(editor, name_1),\n          onAction: toggleFormat(editor, name_1)\n        });\n      }\n    };\n    var registerCommandButtons = function (editor) {\n      global$e.each([\n        {\n          name: 'cut',\n          text: 'Cut',\n          action: 'Cut',\n          icon: 'cut'\n        },\n        {\n          name: 'copy',\n          text: 'Copy',\n          action: 'Copy',\n          icon: 'copy'\n        },\n        {\n          name: 'paste',\n          text: 'Paste',\n          action: 'Paste',\n          icon: 'paste'\n        },\n        {\n          name: 'help',\n          text: 'Help',\n          action: 'mceHelp',\n          icon: 'help'\n        },\n        {\n          name: 'selectall',\n          text: 'Select all',\n          action: 'SelectAll',\n          icon: 'select-all'\n        },\n        {\n          name: 'newdocument',\n          text: 'New document',\n          action: 'mceNewDocument',\n          icon: 'new-document'\n        },\n        {\n          name: 'removeformat',\n          text: 'Clear formatting',\n          action: 'RemoveFormat',\n          icon: 'remove-formatting'\n        },\n        {\n          name: 'remove',\n          text: 'Remove',\n          action: 'Delete',\n          icon: 'remove'\n        }\n      ], function (btn) {\n        editor.ui.registry.addButton(btn.name, {\n          tooltip: btn.text,\n          icon: btn.icon,\n          onAction: function () {\n            return editor.execCommand(btn.action);\n          }\n        });\n      });\n    };\n    var registerCommandToggleButtons = function (editor) {\n      global$e.each([{\n          name: 'blockquote',\n          text: 'Blockquote',\n          action: 'mceBlockQuote',\n          icon: 'quote'\n        }], function (btn) {\n        editor.ui.registry.addToggleButton(btn.name, {\n          tooltip: btn.text,\n          icon: btn.icon,\n          onAction: function () {\n            return editor.execCommand(btn.action);\n          },\n          onSetup: onSetupFormatToggle(editor, btn.name)\n        });\n      });\n    };\n    var registerButtons = function (editor) {\n      registerFormatButtons(editor);\n      registerCommandButtons(editor);\n      registerCommandToggleButtons(editor);\n    };\n    var registerMenuItems = function (editor) {\n      global$e.each([\n        {\n          name: 'bold',\n          text: 'Bold',\n          action: 'Bold',\n          icon: 'bold',\n          shortcut: 'Meta+B'\n        },\n        {\n          name: 'italic',\n          text: 'Italic',\n          action: 'Italic',\n          icon: 'italic',\n          shortcut: 'Meta+I'\n        },\n        {\n          name: 'underline',\n          text: 'Underline',\n          action: 'Underline',\n          icon: 'underline',\n          shortcut: 'Meta+U'\n        },\n        {\n          name: 'strikethrough',\n          text: 'Strikethrough',\n          action: 'Strikethrough',\n          icon: 'strike-through',\n          shortcut: ''\n        },\n        {\n          name: 'subscript',\n          text: 'Subscript',\n          action: 'Subscript',\n          icon: 'subscript',\n          shortcut: ''\n        },\n        {\n          name: 'superscript',\n          text: 'Superscript',\n          action: 'Superscript',\n          icon: 'superscript',\n          shortcut: ''\n        },\n        {\n          name: 'removeformat',\n          text: 'Clear formatting',\n          action: 'RemoveFormat',\n          icon: 'remove-formatting',\n          shortcut: ''\n        },\n        {\n          name: 'newdocument',\n          text: 'New document',\n          action: 'mceNewDocument',\n          icon: 'new-document',\n          shortcut: ''\n        },\n        {\n          name: 'cut',\n          text: 'Cut',\n          action: 'Cut',\n          icon: 'cut',\n          shortcut: 'Meta+X'\n        },\n        {\n          name: 'copy',\n          text: 'Copy',\n          action: 'Copy',\n          icon: 'copy',\n          shortcut: 'Meta+C'\n        },\n        {\n          name: 'paste',\n          text: 'Paste',\n          action: 'Paste',\n          icon: 'paste',\n          shortcut: 'Meta+V'\n        },\n        {\n          name: 'selectall',\n          text: 'Select all',\n          action: 'SelectAll',\n          icon: 'select-all',\n          shortcut: 'Meta+A'\n        }\n      ], function (btn) {\n        editor.ui.registry.addMenuItem(btn.name, {\n          text: btn.text,\n          icon: btn.icon,\n          shortcut: btn.shortcut,\n          onAction: function () {\n            return editor.execCommand(btn.action);\n          }\n        });\n      });\n      editor.ui.registry.addMenuItem('codeformat', {\n        text: 'Code',\n        icon: 'sourcecode',\n        onAction: toggleFormat(editor, 'code')\n      });\n    };\n    var register$6 = function (editor) {\n      registerButtons(editor);\n      registerMenuItems(editor);\n    };\n    var SimpleControls = { register: register$6 };\n\n    var toggleUndoRedoState = function (api, editor, type) {\n      var checkState = function () {\n        return editor.undoManager ? editor.undoManager[type]() : false;\n      };\n      var onUndoStateChange = function () {\n        api.setDisabled(editor.mode.isReadOnly() || !checkState());\n      };\n      api.setDisabled(!checkState());\n      editor.on('Undo Redo AddUndo TypingUndo ClearUndos SwitchMode', onUndoStateChange);\n      return function () {\n        return editor.off('Undo Redo AddUndo TypingUndo ClearUndos SwitchMode', onUndoStateChange);\n      };\n    };\n    var registerMenuItems$1 = function (editor) {\n      editor.ui.registry.addMenuItem('undo', {\n        text: 'Undo',\n        icon: 'undo',\n        shortcut: 'Meta+Z',\n        onSetup: function (api) {\n          return toggleUndoRedoState(api, editor, 'hasUndo');\n        },\n        onAction: function () {\n          return editor.execCommand('undo');\n        }\n      });\n      editor.ui.registry.addMenuItem('redo', {\n        text: 'Redo',\n        icon: 'redo',\n        shortcut: 'Meta+Y',\n        onSetup: function (api) {\n          return toggleUndoRedoState(api, editor, 'hasRedo');\n        },\n        onAction: function () {\n          return editor.execCommand('redo');\n        }\n      });\n    };\n    var registerButtons$1 = function (editor) {\n      editor.ui.registry.addButton('undo', {\n        tooltip: 'Undo',\n        icon: 'undo',\n        onSetup: function (api) {\n          return toggleUndoRedoState(api, editor, 'hasUndo');\n        },\n        onAction: function () {\n          return editor.execCommand('undo');\n        }\n      });\n      editor.ui.registry.addButton('redo', {\n        tooltip: 'Redo',\n        icon: 'redo',\n        onSetup: function (api) {\n          return toggleUndoRedoState(api, editor, 'hasRedo');\n        },\n        onAction: function () {\n          return editor.execCommand('redo');\n        }\n      });\n    };\n    var register$7 = function (editor) {\n      registerMenuItems$1(editor);\n      registerButtons$1(editor);\n    };\n    var UndoRedo = { register: register$7 };\n\n    var toggleVisualAidState = function (api, editor) {\n      api.setActive(editor.hasVisual);\n      var onVisualAid = function (e) {\n        api.setActive(e.hasVisual);\n      };\n      editor.on('VisualAid', onVisualAid);\n      return function () {\n        return editor.off('VisualAid', onVisualAid);\n      };\n    };\n    var registerMenuItems$2 = function (editor) {\n      editor.ui.registry.addToggleMenuItem('visualaid', {\n        text: 'Visual aids',\n        onSetup: function (api) {\n          return toggleVisualAidState(api, editor);\n        },\n        onAction: function () {\n          editor.execCommand('mceToggleVisualAid');\n        }\n      });\n    };\n    var registerToolbarButton = function (editor) {\n      editor.ui.registry.addButton('visualaid', {\n        tooltip: 'Visual aids',\n        text: 'Visual aids',\n        onAction: function () {\n          return editor.execCommand('mceToggleVisualAid');\n        }\n      });\n    };\n    var register$8 = function (editor) {\n      registerToolbarButton(editor);\n      registerMenuItems$2(editor);\n    };\n    var VisualAid = { register: register$8 };\n\n    var toggleOutdentState = function (api, editor) {\n      api.setDisabled(!editor.queryCommandState('outdent'));\n      var onNodeChange = function () {\n        api.setDisabled(!editor.queryCommandState('outdent'));\n      };\n      editor.on('NodeChange', onNodeChange);\n      return function () {\n        return editor.off('NodeChange', onNodeChange);\n      };\n    };\n    var registerButtons$2 = function (editor) {\n      editor.ui.registry.addButton('outdent', {\n        tooltip: 'Decrease indent',\n        icon: 'outdent',\n        onSetup: function (api) {\n          return toggleOutdentState(api, editor);\n        },\n        onAction: function () {\n          return editor.execCommand('outdent');\n        }\n      });\n      editor.ui.registry.addButton('indent', {\n        tooltip: 'Increase indent',\n        icon: 'indent',\n        onAction: function () {\n          return editor.execCommand('indent');\n        }\n      });\n    };\n    var register$9 = function (editor) {\n      registerButtons$2(editor);\n    };\n    var IndentOutdent = { register: register$9 };\n\n    var register$a = function (editor, backstage) {\n      alignSelectMenu(editor, backstage);\n      fontSelectMenu(editor, backstage);\n      styleSelectMenu(editor, backstage);\n      formatSelectMenu(editor, backstage);\n      fontsizeSelectMenu(editor, backstage);\n    };\n    var ComplexControls = { register: register$a };\n\n    var setup$8 = function (editor, backstage) {\n      AlignmentButtons.register(editor);\n      SimpleControls.register(editor);\n      ComplexControls.register(editor, backstage);\n      UndoRedo.register(editor);\n      ColorSwatch.register(editor);\n      VisualAid.register(editor);\n      IndentOutdent.register(editor);\n    };\n    var FormatControls = { setup: setup$8 };\n\n    var nu$d = function (x, y) {\n      return {\n        anchor: 'makeshift',\n        x: x,\n        y: y\n      };\n    };\n    var transpose$1 = function (pos, dx, dy) {\n      return nu$d(pos.x + dx, pos.y + dy);\n    };\n    var isTouchEvent$1 = function (e) {\n      return e.type === 'longpress' || e.type.indexOf('touch') === 0;\n    };\n    var fromPageXY = function (e) {\n      if (isTouchEvent$1(e)) {\n        var touch = e.touches[0];\n        return nu$d(touch.pageX, touch.pageY);\n      } else {\n        return nu$d(e.pageX, e.pageY);\n      }\n    };\n    var fromClientXY = function (e) {\n      if (isTouchEvent$1(e)) {\n        var touch = e.touches[0];\n        return nu$d(touch.clientX, touch.clientY);\n      } else {\n        return nu$d(e.clientX, e.clientY);\n      }\n    };\n    var transposeContentAreaContainer = function (element, pos) {\n      var containerPos = global$3.DOM.getPos(element);\n      return transpose$1(pos, containerPos.x, containerPos.y);\n    };\n    var getPointAnchor = function (editor, e) {\n      if (e.type === 'contextmenu' || e.type === 'longpress') {\n        if (editor.inline) {\n          return fromPageXY(e);\n        } else {\n          return transposeContentAreaContainer(editor.getContentAreaContainer(), fromClientXY(e));\n        }\n      } else {\n        return getSelectionAnchor(editor);\n      }\n    };\n    var getSelectionAnchor = function (editor) {\n      return {\n        anchor: 'selection',\n        root: Element.fromDom(editor.selection.getNode())\n      };\n    };\n    var getNodeAnchor$1 = function (editor) {\n      return {\n        anchor: 'node',\n        node: Option.some(Element.fromDom(editor.selection.getNode())),\n        root: Element.fromDom(editor.getBody())\n      };\n    };\n\n    var getAnchorSpec = function (editor, e, isTriggeredByKeyboardEvent) {\n      return isTriggeredByKeyboardEvent ? getNodeAnchor$1(editor) : getPointAnchor(editor, e);\n    };\n    var initAndShow = function (editor, e, buildMenu, backstage, contextmenu, isTriggeredByKeyboardEvent) {\n      var items = buildMenu();\n      var anchorSpec = getAnchorSpec(editor, e, isTriggeredByKeyboardEvent);\n      build$2(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false).map(function (menuData) {\n        e.preventDefault();\n        InlineView.showMenuAt(contextmenu, anchorSpec, {\n          menu: { markers: markers$1('normal') },\n          data: menuData\n        });\n      });\n    };\n\n    var layouts = {\n      onLtr: function () {\n        return [\n          south$1,\n          southeast$1,\n          southwest$1,\n          northeast$1,\n          northwest$1,\n          north$1,\n          north$3,\n          south$3,\n          northeast$3,\n          southeast$3,\n          northwest$3,\n          southwest$3\n        ];\n      },\n      onRtl: function () {\n        return [\n          south$1,\n          southwest$1,\n          southeast$1,\n          northwest$1,\n          northeast$1,\n          north$1,\n          north$3,\n          south$3,\n          northwest$3,\n          southwest$3,\n          northeast$3,\n          southeast$3\n        ];\n      }\n    };\n    var bubbleSize$1 = 12;\n    var bubbleAlignments$2 = {\n      valignCentre: [],\n      alignCentre: [],\n      alignLeft: ['tox-pop--align-left'],\n      alignRight: ['tox-pop--align-right'],\n      right: ['tox-pop--right'],\n      left: ['tox-pop--left'],\n      bottom: ['tox-pop--bottom'],\n      top: ['tox-pop--top']\n    };\n    var isTouchWithinSelection = function (editor, e) {\n      var selection = editor.selection;\n      if (selection.isCollapsed() || e.touches.length < 1) {\n        return false;\n      } else {\n        var touch_1 = e.touches[0];\n        var rng = selection.getRng();\n        var rngRectOpt = getFirstRect$1(editor.getWin(), Selection.domRange(rng));\n        return rngRectOpt.exists(function (rngRect) {\n          return rngRect.left() <= touch_1.clientX && rngRect.right() >= touch_1.clientX && rngRect.top() <= touch_1.clientY && rngRect.bottom() >= touch_1.clientY;\n        });\n      }\n    };\n    var getAnchorSpec$1 = function (editor, isTriggeredByKeyboardEvent, e) {\n      var anchorSpec = isTriggeredByKeyboardEvent ? getNodeAnchor$1(editor) : getPointAnchor(editor, e);\n      return __assign({\n        bubble: nu$8(0, bubbleSize$1, bubbleAlignments$2),\n        layouts: layouts,\n        overrides: {\n          maxWidthFunction: expandable$1(),\n          maxHeightFunction: expandable()\n        }\n      }, anchorSpec);\n    };\n    var setupiOSOverrides = function (editor) {\n      var originalSelection = editor.selection.getRng();\n      var selectionReset = function () {\n        global$2.setEditorTimeout(editor, function () {\n          editor.selection.setRng(originalSelection);\n        }, 10);\n        unbindEventListeners();\n      };\n      editor.once('touchend', selectionReset);\n      var preventMousedown = function (e) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n      };\n      editor.on('mousedown', preventMousedown, true);\n      var clearSelectionReset = function () {\n        return unbindEventListeners();\n      };\n      editor.once('longpresscancel', clearSelectionReset);\n      var unbindEventListeners = function () {\n        editor.off('touchend', selectionReset);\n        editor.off('longpresscancel', clearSelectionReset);\n        editor.off('mousedown', preventMousedown);\n      };\n    };\n    var show = function (editor, e, items, backstage, contextmenu, isTriggeredByKeyboardEvent, highlightImmediately) {\n      var anchorSpec = getAnchorSpec$1(editor, isTriggeredByKeyboardEvent, e);\n      build$2(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, true).map(function (menuData) {\n        e.preventDefault();\n        InlineView.showMenuWithinBounds(contextmenu, anchorSpec, {\n          menu: {\n            markers: markers$1('normal'),\n            highlightImmediately: highlightImmediately\n          },\n          data: menuData,\n          type: 'horizontal'\n        }, function () {\n          return Option.some(getContextToolbarBounds(editor));\n        });\n        editor.fire(hideContextToolbarEvent);\n      });\n    };\n    var initAndShow$1 = function (editor, e, buildMenu, backstage, contextmenu, isTriggeredByKeyboardEvent) {\n      var detection = detect$3();\n      var isiOS = detection.os.isiOS();\n      var isOSX = detection.os.isOSX();\n      var isAndroid = detection.os.isAndroid();\n      var isTouch = detection.deviceType.isTouch();\n      var shouldHighlightImmediately = function () {\n        return !(isAndroid || isiOS || isOSX && isTouch);\n      };\n      var open = function () {\n        var items = buildMenu();\n        show(editor, e, items, backstage, contextmenu, isTriggeredByKeyboardEvent, shouldHighlightImmediately());\n      };\n      if ((isOSX || isiOS) && !isTriggeredByKeyboardEvent) {\n        var openiOS_1 = function () {\n          setupiOSOverrides(editor);\n          open();\n        };\n        if (isTouchWithinSelection(editor, e)) {\n          openiOS_1();\n        } else {\n          editor.once('selectionchange', openiOS_1);\n          editor.once('touchend', function () {\n            return editor.off('selectionchange', openiOS_1);\n          });\n        }\n      } else {\n        if (isAndroid && !isTriggeredByKeyboardEvent) {\n          editor.selection.setCursorLocation(e.target, 0);\n        }\n        open();\n      }\n    };\n\n    var patchPipeConfig = function (config) {\n      return typeof config === 'string' ? config.split(/[ ,]/) : config;\n    };\n    var shouldNeverUseNative = function (editor) {\n      return editor.settings.contextmenu_never_use_native || false;\n    };\n    var getMenuItems = function (editor, name, defaultItems) {\n      var contextMenus = editor.ui.registry.getAll().contextMenus;\n      return get(editor.settings, name).map(patchPipeConfig).getOrThunk(function () {\n        return filter(patchPipeConfig(defaultItems), function (item) {\n          return has(contextMenus, item);\n        });\n      });\n    };\n    var isContextMenuDisabled = function (editor) {\n      return editor.getParam('contextmenu') === false;\n    };\n    var getContextMenu = function (editor) {\n      return getMenuItems(editor, 'contextmenu', 'link linkchecker image imagetools table spellchecker configurepermanentpen');\n    };\n    var Settings$1 = {\n      shouldNeverUseNative: shouldNeverUseNative,\n      getContextMenu: getContextMenu,\n      isContextMenuDisabled: isContextMenuDisabled\n    };\n\n    var isSeparator$1 = function (item) {\n      return isString(item) ? item === '|' : item.type === 'separator';\n    };\n    var separator$3 = { type: 'separator' };\n    var makeContextItem = function (item) {\n      if (isString(item)) {\n        return item;\n      } else {\n        switch (item.type) {\n        case 'separator':\n          return separator$3;\n        case 'submenu':\n          return {\n            type: 'nestedmenuitem',\n            text: item.text,\n            icon: item.icon,\n            getSubmenuItems: function () {\n              var items = item.getSubmenuItems();\n              if (isString(items)) {\n                return items;\n              } else {\n                return map(items, makeContextItem);\n              }\n            }\n          };\n        default:\n          return {\n            type: 'menuitem',\n            text: item.text,\n            icon: item.icon,\n            onAction: noarg(item.onAction)\n          };\n        }\n      }\n    };\n    var addContextMenuGroup = function (xs, groupItems) {\n      if (groupItems.length === 0) {\n        return xs;\n      }\n      var lastMenuItem = last(xs).filter(function (item) {\n        return !isSeparator$1(item);\n      });\n      var before = lastMenuItem.fold(function () {\n        return [];\n      }, function (_) {\n        return [separator$3];\n      });\n      return xs.concat(before).concat(groupItems).concat([separator$3]);\n    };\n    var generateContextMenu = function (contextMenus, menuConfig, selectedElement) {\n      var sections = foldl(menuConfig, function (acc, name) {\n        if (has(contextMenus, name)) {\n          var items = contextMenus[name].update(selectedElement);\n          if (isString(items)) {\n            return addContextMenuGroup(acc, items.split(' '));\n          } else if (items.length > 0) {\n            var allItems = map(items, makeContextItem);\n            return addContextMenuGroup(acc, allItems);\n          } else {\n            return acc;\n          }\n        } else {\n          return acc.concat([name]);\n        }\n      }, []);\n      if (sections.length > 0 && isSeparator$1(sections[sections.length - 1])) {\n        sections.pop();\n      }\n      return sections;\n    };\n    var isNativeOverrideKeyEvent = function (editor, e) {\n      return e.ctrlKey && !Settings$1.shouldNeverUseNative(editor);\n    };\n    var isTriggeredByKeyboard = function (editor, e) {\n      return e.type !== 'longpress' && (e.button !== 2 || e.target === editor.getBody() && e.pointerType === '');\n    };\n    var setup$9 = function (editor, lazySink, backstage) {\n      var detection = detect$3();\n      var isTouch = detection.deviceType.isTouch;\n      var contextmenu = build$1(InlineView.sketch({\n        dom: { tag: 'div' },\n        lazySink: lazySink,\n        onEscape: function () {\n          return editor.focus();\n        },\n        onShow: function () {\n          return backstage.setContextMenuState(true);\n        },\n        onHide: function () {\n          return backstage.setContextMenuState(false);\n        },\n        fireDismissalEventInstead: {},\n        inlineBehaviours: derive$1([config('dismissContextMenu', [run(dismissRequested(), function (comp, se) {\n              Sandboxing.close(comp);\n              editor.focus();\n            })])])\n      }));\n      var hideContextMenu = function (_e) {\n        return InlineView.hide(contextmenu);\n      };\n      var showContextMenu = function (e) {\n        if (Settings$1.shouldNeverUseNative(editor)) {\n          e.preventDefault();\n        }\n        if (isNativeOverrideKeyEvent(editor, e) || Settings$1.isContextMenuDisabled(editor)) {\n          return;\n        }\n        var isTriggeredByKeyboardEvent = isTriggeredByKeyboard(editor, e);\n        var buildMenu = function () {\n          var selectedElement = isTriggeredByKeyboardEvent ? editor.selection.getStart(true) : e.target;\n          var registry = editor.ui.registry.getAll();\n          var menuConfig = Settings$1.getContextMenu(editor);\n          return generateContextMenu(registry.contextMenus, menuConfig, selectedElement);\n        };\n        var initAndShow$2 = isTouch() ? initAndShow$1 : initAndShow;\n        initAndShow$2(editor, e, buildMenu, backstage, contextmenu, isTriggeredByKeyboardEvent);\n      };\n      editor.on('init', function () {\n        var hideEvents = 'ResizeEditor ScrollContent ScrollWindow longpresscancel' + (isTouch() ? '' : ' ResizeWindow');\n        editor.on(hideEvents, hideContextMenu);\n        editor.on('longpress contextmenu', showContextMenu);\n      });\n    };\n\n    var adt$c = Adt.generate([\n      {\n        offset: [\n          'x',\n          'y'\n        ]\n      },\n      {\n        absolute: [\n          'x',\n          'y'\n        ]\n      },\n      {\n        fixed: [\n          'x',\n          'y'\n        ]\n      }\n    ]);\n    var subtract = function (change) {\n      return function (point) {\n        return point.translate(-change.left(), -change.top());\n      };\n    };\n    var add$4 = function (change) {\n      return function (point) {\n        return point.translate(change.left(), change.top());\n      };\n    };\n    var transform$1 = function (changes) {\n      return function (x, y) {\n        return foldl(changes, function (rest, f) {\n          return f(rest);\n        }, Position(x, y));\n      };\n    };\n    var asFixed = function (coord, scroll, origin) {\n      return coord.fold(transform$1([\n        add$4(origin),\n        subtract(scroll)\n      ]), transform$1([subtract(scroll)]), transform$1([]));\n    };\n    var asAbsolute = function (coord, scroll, origin) {\n      return coord.fold(transform$1([add$4(origin)]), transform$1([]), transform$1([add$4(scroll)]));\n    };\n    var asOffset = function (coord, scroll, origin) {\n      return coord.fold(transform$1([]), transform$1([subtract(origin)]), transform$1([\n        add$4(scroll),\n        subtract(origin)\n      ]));\n    };\n    var withinRange = function (coord1, coord2, xRange, yRange, scroll, origin) {\n      var a1 = asAbsolute(coord1, scroll, origin);\n      var a2 = asAbsolute(coord2, scroll, origin);\n      return Math.abs(a1.left() - a2.left()) <= xRange && Math.abs(a1.top() - a2.top()) <= yRange;\n    };\n    var getDeltas = function (coord1, coord2, xRange, yRange, scroll, origin) {\n      var a1 = asAbsolute(coord1, scroll, origin);\n      var a2 = asAbsolute(coord2, scroll, origin);\n      var left = Math.abs(a1.left() - a2.left());\n      var top = Math.abs(a1.top() - a2.top());\n      return Position(left, top);\n    };\n    var toStyles = function (coord, scroll, origin) {\n      var stylesOpt = coord.fold(function (x, y) {\n        return {\n          position: Option.some('absolute'),\n          left: Option.some(x + 'px'),\n          top: Option.some(y + 'px')\n        };\n      }, function (x, y) {\n        return {\n          position: Option.some('absolute'),\n          left: Option.some(x - origin.left() + 'px'),\n          top: Option.some(y - origin.top() + 'px')\n        };\n      }, function (x, y) {\n        return {\n          position: Option.some('fixed'),\n          left: Option.some(x + 'px'),\n          top: Option.some(y + 'px')\n        };\n      });\n      return __assign({\n        right: Option.none(),\n        bottom: Option.none()\n      }, stylesOpt);\n    };\n    var translate$2 = function (coord, deltaX, deltaY) {\n      return coord.fold(function (x, y) {\n        return offset(x + deltaX, y + deltaY);\n      }, function (x, y) {\n        return absolute$3(x + deltaX, y + deltaY);\n      }, function (x, y) {\n        return fixed$1(x + deltaX, y + deltaY);\n      });\n    };\n    var absorb = function (partialCoord, originalCoord, scroll, origin) {\n      var absorbOne = function (stencil, nu) {\n        return function (optX, optY) {\n          var original = stencil(originalCoord, scroll, origin);\n          return nu(optX.getOr(original.left()), optY.getOr(original.top()));\n        };\n      };\n      return partialCoord.fold(absorbOne(asOffset, offset), absorbOne(asAbsolute, absolute$3), absorbOne(asFixed, fixed$1));\n    };\n    var offset = adt$c.offset;\n    var absolute$3 = adt$c.absolute;\n    var fixed$1 = adt$c.fixed;\n\n    var get$e = function (component, snapsInfo) {\n      var element = component.element();\n      var x = parseInt(get$2(element, snapsInfo.leftAttr), 10);\n      var y = parseInt(get$2(element, snapsInfo.topAttr), 10);\n      return isNaN(x) || isNaN(y) ? Option.none() : Option.some(Position(x, y));\n    };\n    var set$8 = function (component, snapsInfo, pt) {\n      var element = component.element();\n      set$1(element, snapsInfo.leftAttr, pt.left() + 'px');\n      set$1(element, snapsInfo.topAttr, pt.top() + 'px');\n    };\n    var clear = function (component, snapsInfo) {\n      var element = component.element();\n      remove$1(element, snapsInfo.leftAttr);\n      remove$1(element, snapsInfo.topAttr);\n    };\n\n    var getCoords = function (component, snapInfo, coord, delta) {\n      return get$e(component, snapInfo).fold(function () {\n        return coord;\n      }, function (fixed) {\n        return fixed$1(fixed.left() + delta.left(), fixed.top() + delta.top());\n      });\n    };\n    var moveOrSnap = function (component, snapInfo, coord, delta, scroll, origin) {\n      var newCoord = getCoords(component, snapInfo, coord, delta);\n      var snap = snapInfo.mustSnap ? findClosestSnap(component, snapInfo, newCoord, scroll, origin) : findSnap(component, snapInfo, newCoord, scroll, origin);\n      var fixedCoord = asFixed(newCoord, scroll, origin);\n      set$8(component, snapInfo, fixedCoord);\n      return snap.fold(function () {\n        return {\n          coord: fixed$1(fixedCoord.left(), fixedCoord.top()),\n          extra: Option.none()\n        };\n      }, function (spanned) {\n        return {\n          coord: spanned.output(),\n          extra: spanned.extra()\n        };\n      });\n    };\n    var stopDrag = function (component, snapInfo) {\n      clear(component, snapInfo);\n    };\n    var findMatchingSnap = function (snaps, newCoord, scroll, origin) {\n      return findMap(snaps, function (snap) {\n        var sensor = snap.sensor();\n        var inRange = withinRange(newCoord, sensor, snap.range().left(), snap.range().top(), scroll, origin);\n        return inRange ? Option.some({\n          output: constant(absorb(snap.output(), newCoord, scroll, origin)),\n          extra: snap.extra\n        }) : Option.none();\n      });\n    };\n    var findClosestSnap = function (component, snapInfo, newCoord, scroll, origin) {\n      var snaps = snapInfo.getSnapPoints(component);\n      var matchSnap = findMatchingSnap(snaps, newCoord, scroll, origin);\n      return matchSnap.orThunk(function () {\n        var bestSnap = foldl(snaps, function (acc, snap) {\n          var sensor = snap.sensor();\n          var deltas = getDeltas(newCoord, sensor, snap.range().left(), snap.range().top(), scroll, origin);\n          return acc.deltas.fold(function () {\n            return {\n              deltas: Option.some(deltas),\n              snap: Option.some(snap)\n            };\n          }, function (bestDeltas) {\n            var currAvg = (deltas.left() + deltas.top()) / 2;\n            var bestAvg = (bestDeltas.left() + bestDeltas.top()) / 2;\n            if (currAvg <= bestAvg) {\n              return {\n                deltas: Option.some(deltas),\n                snap: Option.some(snap)\n              };\n            } else {\n              return acc;\n            }\n          });\n        }, {\n          deltas: Option.none(),\n          snap: Option.none()\n        });\n        return bestSnap.snap.map(function (snap) {\n          return {\n            output: constant(absorb(snap.output(), newCoord, scroll, origin)),\n            extra: snap.extra\n          };\n        });\n      });\n    };\n    var findSnap = function (component, snapInfo, newCoord, scroll, origin) {\n      var snaps = snapInfo.getSnapPoints(component);\n      return findMatchingSnap(snaps, newCoord, scroll, origin);\n    };\n    var snapTo = function (snap, scroll, origin) {\n      return {\n        coord: absorb(snap.output(), snap.output(), scroll, origin),\n        extra: snap.extra()\n      };\n    };\n\n    var snapTo$1 = function (component, dragConfig, _state, snap) {\n      var target = dragConfig.getTarget(component.element());\n      if (dragConfig.repositionTarget) {\n        var doc = owner(component.element());\n        var scroll = get$8(doc);\n        var origin = getOrigin(target);\n        var snapPin = snapTo(snap, scroll, origin);\n        var styles = toStyles(snapPin.coord, scroll, origin);\n        setOptions(target, styles);\n      }\n    };\n\n    var DraggingApis = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        snapTo: snapTo$1\n    });\n\n    var initialAttribute = 'data-initial-z-index';\n    var resetZIndex = function (blocker) {\n      parent(blocker.element()).filter(isElement).each(function (root) {\n        var initZIndex = get$2(root, initialAttribute);\n        if (has$1(root, initialAttribute)) {\n          set$2(root, 'z-index', initZIndex);\n        } else {\n          remove$6(root, 'z-index');\n        }\n        remove$1(root, initialAttribute);\n      });\n    };\n    var changeZIndex = function (blocker) {\n      parent(blocker.element()).filter(isElement).each(function (root) {\n        getRaw(root, 'z-index').each(function (zindex) {\n          set$1(root, initialAttribute, zindex);\n        });\n        set$2(root, 'z-index', get$4(blocker.element(), 'z-index'));\n      });\n    };\n    var instigate = function (anyComponent, blocker) {\n      anyComponent.getSystem().addToGui(blocker);\n      changeZIndex(blocker);\n    };\n    var discard = function (blocker) {\n      resetZIndex(blocker);\n      blocker.getSystem().removeFromGui(blocker);\n    };\n    var createComponent = function (component, blockerClass, blockerEvents) {\n      return component.getSystem().build(Container.sketch({\n        dom: {\n          styles: {\n            'left': '0px',\n            'top': '0px',\n            'width': '100%',\n            'height': '100%',\n            'position': 'fixed',\n            'z-index': '1000000000000000'\n          },\n          classes: [blockerClass]\n        },\n        events: blockerEvents\n      }));\n    };\n\n    var SnapSchema = optionObjOf('snaps', [\n      strict$1('getSnapPoints'),\n      onHandler('onSensor'),\n      strict$1('leftAttr'),\n      strict$1('topAttr'),\n      defaulted$1('lazyViewport', win),\n      defaulted$1('mustSnap', false)\n    ]);\n\n    var schema$t = [\n      defaulted$1('useFixed', never),\n      strict$1('blockerClass'),\n      defaulted$1('getTarget', identity),\n      defaulted$1('onDrag', noop),\n      defaulted$1('repositionTarget', true),\n      defaulted$1('onDrop', noop),\n      defaultedFunction('getBounds', win),\n      SnapSchema\n    ];\n\n    var getCurrentCoord = function (target) {\n      return lift3(getRaw(target, 'left'), getRaw(target, 'top'), getRaw(target, 'position'), function (left, top, position) {\n        var nu = position === 'fixed' ? fixed$1 : offset;\n        return nu(parseInt(left, 10), parseInt(top, 10));\n      }).getOrThunk(function () {\n        var location = absolute(target);\n        return absolute$3(location.left(), location.top());\n      });\n    };\n    var clampCoords = function (component, coords, scroll, origin, startData) {\n      var bounds = startData.bounds;\n      var absoluteCoord = asAbsolute(coords, scroll, origin);\n      var newX = clamp(absoluteCoord.left(), bounds.x(), bounds.x() + bounds.width() - startData.width);\n      var newY = clamp(absoluteCoord.top(), bounds.y(), bounds.y() + bounds.height() - startData.height);\n      var newCoords = absolute$3(newX, newY);\n      return coords.fold(function () {\n        var offset$1 = asOffset(newCoords, scroll, origin);\n        return offset(offset$1.left(), offset$1.top());\n      }, function () {\n        return newCoords;\n      }, function () {\n        var fixed = asFixed(newCoords, scroll, origin);\n        return fixed$1(fixed.left(), fixed.top());\n      });\n    };\n    var calcNewCoord = function (component, optSnaps, currentCoord, scroll, origin, delta, startData) {\n      var newCoord = optSnaps.fold(function () {\n        var translated = translate$2(currentCoord, delta.left(), delta.top());\n        var fixedCoord = asFixed(translated, scroll, origin);\n        return fixed$1(fixedCoord.left(), fixedCoord.top());\n      }, function (snapInfo) {\n        var snapping = moveOrSnap(component, snapInfo, currentCoord, delta, scroll, origin);\n        snapping.extra.each(function (extra) {\n          snapInfo.onSensor(component, extra);\n        });\n        return snapping.coord;\n      });\n      return clampCoords(component, newCoord, scroll, origin, startData);\n    };\n    var dragBy = function (component, dragConfig, startData, delta) {\n      var target = dragConfig.getTarget(component.element());\n      if (dragConfig.repositionTarget) {\n        var doc = owner(component.element());\n        var scroll = get$8(doc);\n        var origin = getOrigin(target);\n        var currentCoord = getCurrentCoord(target);\n        var newCoord = calcNewCoord(component, dragConfig.snaps, currentCoord, scroll, origin, delta, startData);\n        var styles = toStyles(newCoord, scroll, origin);\n        setOptions(target, styles);\n      }\n      dragConfig.onDrag(component, target, delta);\n    };\n\n    var calcStartData = function (dragConfig, comp) {\n      return {\n        bounds: dragConfig.getBounds(),\n        height: getOuter$1(comp.element()),\n        width: getOuter$2(comp.element())\n      };\n    };\n    var move$1 = function (component, dragConfig, dragState, dragMode, event) {\n      var delta = dragState.update(dragMode, event);\n      var dragStartData = dragState.getStartData().getOrThunk(function () {\n        return calcStartData(dragConfig, component);\n      });\n      delta.each(function (dlt) {\n        dragBy(component, dragConfig, dragStartData, dlt);\n      });\n    };\n    var stop = function (component, blocker, dragConfig, dragState) {\n      blocker.each(discard);\n      dragConfig.snaps.each(function (snapInfo) {\n        stopDrag(component, snapInfo);\n      });\n      var target = dragConfig.getTarget(component.element());\n      dragState.reset();\n      dragConfig.onDrop(component, target);\n    };\n    var handlers = function (events) {\n      return function (dragConfig, dragState) {\n        var updateStartState = function (comp) {\n          dragState.setStartData(calcStartData(dragConfig, comp));\n        };\n        return derive(__spreadArrays([run(windowScroll(), function (comp) {\n            dragState.getStartData().each(function () {\n              return updateStartState(comp);\n            });\n          })], events(dragConfig, dragState, updateStartState)));\n      };\n    };\n\n    var init$c = function (dragApi) {\n      return derive([\n        run(mousedown(), dragApi.forceDrop),\n        run(mouseup(), dragApi.drop),\n        run(mousemove(), function (comp, simulatedEvent) {\n          dragApi.move(simulatedEvent.event());\n        }),\n        run(mouseout(), dragApi.delayDrop)\n      ]);\n    };\n\n    var getData$1 = function (event) {\n      return Option.from(Position(event.x(), event.y()));\n    };\n    var getDelta$1 = function (old, nu) {\n      return Position(nu.left() - old.left(), nu.top() - old.top());\n    };\n\n    var MouseData = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getData: getData$1,\n        getDelta: getDelta$1\n    });\n\n    var events$g = function (dragConfig, dragState, updateStartState) {\n      return [run(mousedown(), function (component, simulatedEvent) {\n          var raw = simulatedEvent.event().raw();\n          if (raw.button !== 0) {\n            return;\n          }\n          simulatedEvent.stop();\n          var stop$1 = function () {\n            return stop(component, Option.some(blocker), dragConfig, dragState);\n          };\n          var delayDrop = DelayedFunction(stop$1, 200);\n          var dragApi = {\n            drop: stop$1,\n            delayDrop: delayDrop.schedule,\n            forceDrop: stop$1,\n            move: function (event) {\n              delayDrop.cancel();\n              move$1(component, dragConfig, dragState, MouseData, event);\n            }\n          };\n          var blocker = createComponent(component, dragConfig.blockerClass, init$c(dragApi));\n          var start = function () {\n            updateStartState(component);\n            instigate(component, blocker);\n          };\n          start();\n        })];\n    };\n    var schema$u = __spreadArrays(schema$t, [output('dragger', { handlers: handlers(events$g) })]);\n\n    var init$d = function (dragApi) {\n      return derive([\n        run(touchstart(), dragApi.forceDrop),\n        run(touchend(), dragApi.drop),\n        run(touchcancel(), dragApi.drop),\n        run(touchmove(), function (comp, simulatedEvent) {\n          dragApi.move(simulatedEvent.event());\n        })\n      ]);\n    };\n\n    var getDataFrom = function (touches) {\n      var touch = touches[0];\n      return Option.some(Position(touch.clientX, touch.clientY));\n    };\n    var getData$2 = function (event) {\n      var raw = event.raw();\n      var touches = raw.touches;\n      return touches.length === 1 ? getDataFrom(touches) : Option.none();\n    };\n    var getDelta$2 = function (old, nu) {\n      return Position(nu.left() - old.left(), nu.top() - old.top());\n    };\n\n    var TouchData = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getData: getData$2,\n        getDelta: getDelta$2\n    });\n\n    var events$h = function (dragConfig, dragState, updateStartState) {\n      var blockerCell = Cell(Option.none());\n      return [\n        run(touchstart(), function (component, simulatedEvent) {\n          simulatedEvent.stop();\n          var stop$1 = function () {\n            stop(component, blockerCell.get(), dragConfig, dragState);\n            blockerCell.set(Option.none());\n          };\n          var dragApi = {\n            drop: stop$1,\n            delayDrop: function () {\n            },\n            forceDrop: stop$1,\n            move: function (event) {\n              move$1(component, dragConfig, dragState, TouchData, event);\n            }\n          };\n          var blocker = createComponent(component, dragConfig.blockerClass, init$d(dragApi));\n          blockerCell.set(Option.some(blocker));\n          var start = function () {\n            updateStartState(component);\n            instigate(component, blocker);\n          };\n          start();\n        }),\n        run(touchmove(), function (component, simulatedEvent) {\n          simulatedEvent.stop();\n          move$1(component, dragConfig, dragState, TouchData, simulatedEvent.event());\n        }),\n        run(touchend(), function (component, simulatedEvent) {\n          simulatedEvent.stop();\n          stop(component, blockerCell.get(), dragConfig, dragState);\n          blockerCell.set(Option.none());\n        }),\n        run(touchcancel(), function (component) {\n          stop(component, blockerCell.get(), dragConfig, dragState);\n          blockerCell.set(Option.none());\n        })\n      ];\n    };\n    var schema$v = __spreadArrays(schema$t, [output('dragger', { handlers: handlers(events$h) })]);\n\n    var events$i = function (dragConfig, dragState, updateStartState) {\n      return __spreadArrays(events$g(dragConfig, dragState, updateStartState), events$h(dragConfig, dragState, updateStartState));\n    };\n    var schema$w = __spreadArrays(schema$t, [output('dragger', { handlers: handlers(events$i) })]);\n\n    var mouse = schema$u;\n    var touch = schema$v;\n    var mouseOrTouch = schema$w;\n\n    var DraggingBranches = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        mouse: mouse,\n        touch: touch,\n        mouseOrTouch: mouseOrTouch\n    });\n\n    var init$e = function () {\n      var previous = Option.none();\n      var startData = Option.none();\n      var reset = function () {\n        previous = Option.none();\n        startData = Option.none();\n      };\n      var calculateDelta = function (mode, nu) {\n        var result = previous.map(function (old) {\n          return mode.getDelta(old, nu);\n        });\n        previous = Option.some(nu);\n        return result;\n      };\n      var update = function (mode, dragEvent) {\n        return mode.getData(dragEvent).bind(function (nuData) {\n          return calculateDelta(mode, nuData);\n        });\n      };\n      var setStartData = function (data) {\n        startData = Option.some(data);\n      };\n      var getStartData = function () {\n        return startData;\n      };\n      var readState = constant({});\n      return nu$5({\n        readState: readState,\n        reset: reset,\n        update: update,\n        getStartData: getStartData,\n        setStartData: setStartData\n      });\n    };\n\n    var DragState = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        init: init$e\n    });\n\n    var Dragging = createModes$1({\n      branchKey: 'mode',\n      branches: DraggingBranches,\n      name: 'dragging',\n      active: {\n        events: function (dragConfig, dragState) {\n          var dragger = dragConfig.dragger;\n          return dragger.handlers(dragConfig, dragState);\n        }\n      },\n      extra: {\n        snap: MixedBag([\n          'sensor',\n          'range',\n          'output'\n        ], ['extra'])\n      },\n      state: DragState,\n      apis: DraggingApis\n    });\n\n    var platform$1 = detect$3();\n    var snapWidth = 40;\n    var snapOffset = snapWidth / 2;\n    var calcSnap = function (selectorOpt, td, x, y, width, height) {\n      return selectorOpt.fold(function () {\n        return Dragging.snap({\n          sensor: absolute$3(x - snapOffset, y - snapOffset),\n          range: Position(width, height),\n          output: absolute$3(Option.some(x), Option.some(y)),\n          extra: { td: td }\n        });\n      }, function (selectorHandle) {\n        var sensorLeft = x - snapOffset;\n        var sensorTop = y - snapOffset;\n        var sensorWidth = snapWidth;\n        var sensorHeight = snapWidth;\n        var rect = selectorHandle.element().dom().getBoundingClientRect();\n        return Dragging.snap({\n          sensor: absolute$3(sensorLeft, sensorTop),\n          range: Position(sensorWidth, sensorHeight),\n          output: absolute$3(Option.some(x - rect.width / 2), Option.some(y - rect.height / 2)),\n          extra: { td: td }\n        });\n      });\n    };\n    var getSnapsConfig = function (getSnapPoints, cell, onChange) {\n      var isSameCell = function (cellOpt, td) {\n        return cellOpt.exists(function (currentTd) {\n          return eq(currentTd, td);\n        });\n      };\n      return {\n        getSnapPoints: getSnapPoints,\n        leftAttr: 'data-drag-left',\n        topAttr: 'data-drag-top',\n        onSensor: function (component, extra) {\n          var td = extra.td;\n          if (!isSameCell(cell.get(), td)) {\n            cell.set(Option.some(td));\n            onChange(td);\n          }\n        },\n        mustSnap: true\n      };\n    };\n    var createSelector = function (snaps) {\n      return record(Button.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-selector']\n        },\n        buttonBehaviours: derive$1([\n          Dragging.config({\n            mode: 'mouseOrTouch',\n            blockerClass: 'blocker',\n            snaps: snaps\n          }),\n          Unselecting.config({})\n        ]),\n        eventOrder: {\n          mousedown: [\n            'dragging',\n            'alloy.base.behaviour'\n          ],\n          touchstart: [\n            'dragging',\n            'alloy.base.behaviour'\n          ]\n        }\n      }));\n    };\n    var setup$a = function (editor, sink) {\n      var tlTds = Cell([]);\n      var brTds = Cell([]);\n      var isVisible = Cell(false);\n      var startCell = Cell(Option.none());\n      var finishCell = Cell(Option.none());\n      var getTopLeftSnap = function (td) {\n        var box = absolute$1(td);\n        return calcSnap(memTopLeft.getOpt(sink), td, box.x(), box.y(), box.width(), box.height());\n      };\n      var getTopLeftSnaps = function () {\n        return map(tlTds.get(), function (td) {\n          return getTopLeftSnap(td);\n        });\n      };\n      var getBottomRightSnap = function (td) {\n        var box = absolute$1(td);\n        return calcSnap(memBottomRight.getOpt(sink), td, box.right(), box.bottom(), box.width(), box.height());\n      };\n      var getBottomRightSnaps = function () {\n        return map(brTds.get(), function (td) {\n          return getBottomRightSnap(td);\n        });\n      };\n      var topLeftSnaps = getSnapsConfig(getTopLeftSnaps, startCell, function (start) {\n        finishCell.get().each(function (finish) {\n          editor.fire('TableSelectorChange', {\n            start: start,\n            finish: finish\n          });\n        });\n      });\n      var bottomRightSnaps = getSnapsConfig(getBottomRightSnaps, finishCell, function (finish) {\n        startCell.get().each(function (start) {\n          editor.fire('TableSelectorChange', {\n            start: start,\n            finish: finish\n          });\n        });\n      });\n      var memTopLeft = createSelector(topLeftSnaps);\n      var memBottomRight = createSelector(bottomRightSnaps);\n      var topLeft = build$1(memTopLeft.asSpec());\n      var bottomRight = build$1(memBottomRight.asSpec());\n      var showOrHideHandle = function (selector, cell, isAbove, isBelow) {\n        var cellRect = cell.dom().getBoundingClientRect();\n        remove$6(selector.element(), 'display');\n        var viewportHeight = defaultView(Element.fromDom(editor.getBody())).dom().innerHeight;\n        var aboveViewport = isAbove(cellRect);\n        var belowViewport = isBelow(cellRect, viewportHeight);\n        if (aboveViewport || belowViewport) {\n          set$2(selector.element(), 'display', 'none');\n        }\n      };\n      var snapTo = function (selector, cell, getSnapConfig, pos) {\n        var snap = getSnapConfig(cell);\n        Dragging.snapTo(selector, snap);\n        var isAbove = function (rect) {\n          return rect[pos] < 0;\n        };\n        var isBelow = function (rect, viewportHeight) {\n          return rect[pos] > viewportHeight;\n        };\n        showOrHideHandle(selector, cell, isAbove, isBelow);\n      };\n      var snapTopLeft = function (cell) {\n        return snapTo(topLeft, cell, getTopLeftSnap, 'top');\n      };\n      var snapLastTopLeft = function () {\n        return startCell.get().each(snapTopLeft);\n      };\n      var snapBottomRight = function (cell) {\n        return snapTo(bottomRight, cell, getBottomRightSnap, 'bottom');\n      };\n      var snapLastBottomRight = function () {\n        return finishCell.get().each(snapBottomRight);\n      };\n      if (platform$1.deviceType.isTouch()) {\n        editor.on('TableSelectionChange', function (e) {\n          if (!isVisible.get()) {\n            attach$1(sink, topLeft);\n            attach$1(sink, bottomRight);\n            isVisible.set(true);\n          }\n          startCell.set(Option.some(e.start));\n          finishCell.set(Option.some(e.finish));\n          e.otherCells.each(function (otherCells) {\n            tlTds.set(otherCells.upOrLeftCells);\n            brTds.set(otherCells.downOrRightCells);\n            snapTopLeft(e.start);\n            snapBottomRight(e.finish);\n          });\n        });\n        editor.on('ResizeEditor ResizeWindow ScrollContent', function () {\n          snapLastTopLeft();\n          snapLastBottomRight();\n        });\n        editor.on('TableSelectionClear', function () {\n          if (isVisible.get()) {\n            detach(topLeft);\n            detach(bottomRight);\n            isVisible.set(false);\n          }\n          startCell.set(Option.none());\n          finishCell.set(Option.none());\n        });\n      }\n    };\n    var TableSelectorHandles = { setup: setup$a };\n\n    var ResizeTypes;\n    (function (ResizeTypes) {\n      ResizeTypes[ResizeTypes['None'] = 0] = 'None';\n      ResizeTypes[ResizeTypes['Both'] = 1] = 'Both';\n      ResizeTypes[ResizeTypes['Vertical'] = 2] = 'Vertical';\n    }(ResizeTypes || (ResizeTypes = {})));\n    var getDimensions = function (editor, deltas, resizeType, originalHeight, originalWidth) {\n      var dimensions = {};\n      dimensions.height = Utils.calcCappedSize(originalHeight + deltas.top(), getMinHeightSetting(editor), getMaxHeightSetting(editor));\n      if (resizeType === ResizeTypes.Both) {\n        dimensions.width = Utils.calcCappedSize(originalWidth + deltas.left(), getMinWidthSetting(editor), getMaxWidthSetting(editor));\n      }\n      return dimensions;\n    };\n    var resize$3 = function (editor, deltas, resizeType) {\n      var container = Element.fromDom(editor.getContainer());\n      var dimensions = getDimensions(editor, deltas, resizeType, get$6(container), get$7(container));\n      each$1(dimensions, function (val, dim) {\n        return set$2(container, dim, Utils.numToPx(val));\n      });\n      Events.fireResizeEditor(editor);\n    };\n\n    var isHidden$1 = function (elm) {\n      if (elm.nodeType === 1) {\n        if (elm.nodeName === 'BR' || !!elm.getAttribute('data-mce-bogus')) {\n          return true;\n        }\n        if (elm.getAttribute('data-mce-type') === 'bookmark') {\n          return true;\n        }\n      }\n      return false;\n    };\n    var renderElementPath = function (editor, settings) {\n      if (!settings.delimiter) {\n        settings.delimiter = '\\xBB';\n      }\n      var getDataPath = function (data) {\n        var parts = data || [];\n        var newPathElements = map(parts, function (part, index) {\n          return Button.sketch({\n            dom: {\n              tag: 'div',\n              classes: ['tox-statusbar__path-item'],\n              attributes: {\n                'role': 'button',\n                'data-index': index,\n                'tab-index': -1,\n                'aria-level': index + 1\n              },\n              innerHtml: part.name\n            },\n            action: function (btn) {\n              editor.focus();\n              editor.selection.select(part.element);\n              editor.nodeChanged();\n            }\n          });\n        });\n        var divider = {\n          dom: {\n            tag: 'div',\n            classes: ['tox-statusbar__path-divider'],\n            attributes: { 'aria-hidden': true },\n            innerHtml: ' ' + settings.delimiter + ' '\n          }\n        };\n        return foldl(newPathElements.slice(1), function (acc, element) {\n          var newAcc = acc;\n          newAcc.push(divider);\n          newAcc.push(element);\n          return newAcc;\n        }, [newPathElements[0]]);\n      };\n      var updatePath = function (parents) {\n        var newPath = [];\n        var i = parents.length;\n        while (i-- > 0) {\n          var parent_1 = parents[i];\n          if (parent_1.nodeType === 1 && !isHidden$1(parent_1)) {\n            var args = editor.fire('ResolveName', {\n              name: parent_1.nodeName.toLowerCase(),\n              target: parent_1\n            });\n            if (!args.isDefaultPrevented()) {\n              newPath.push({\n                name: args.name,\n                element: parent_1\n              });\n            }\n            if (args.isPropagationStopped()) {\n              break;\n            }\n          }\n        }\n        return newPath;\n      };\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-statusbar__path'],\n          attributes: { role: 'navigation' }\n        },\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'flow',\n            selector: 'div[role=button]'\n          }),\n          Tabstopping.config({}),\n          Replacing.config({}),\n          config('elementPathEvents', [runOnAttached(function (comp, e) {\n              editor.shortcuts.add('alt+F11', 'focus statusbar elementpath', function () {\n                return Keying.focusIn(comp);\n              });\n              editor.on('NodeChange', function (e) {\n                var newPath = updatePath(e.parents);\n                if (newPath.length > 0) {\n                  Replacing.set(comp, getDataPath(newPath));\n                } else {\n                  Replacing.set(comp, []);\n                }\n              });\n            })])\n        ]),\n        components: []\n      };\n    };\n    var ElementPath = { renderElementPath: renderElementPath };\n\n    var renderWordCount = function (editor, providersBackstage) {\n      var replaceCountText = function (comp, count, mode) {\n        return Replacing.set(comp, [text(providersBackstage.translate([\n            '{0} ' + mode,\n            count[mode]\n          ]))]);\n      };\n      return Button.sketch({\n        dom: {\n          tag: 'button',\n          classes: ['tox-statusbar__wordcount']\n        },\n        components: [],\n        buttonBehaviours: derive$1([\n          Tabstopping.config({}),\n          Replacing.config({}),\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: {\n                mode: 'words',\n                count: {\n                  words: 0,\n                  characters: 0\n                }\n              }\n            }\n          }),\n          config('wordcount-events', [\n            runOnExecute(function (comp) {\n              var currentVal = Representing.getValue(comp);\n              var newMode = currentVal.mode === 'words' ? 'characters' : 'words';\n              Representing.setValue(comp, {\n                mode: newMode,\n                count: currentVal.count\n              });\n              replaceCountText(comp, currentVal.count, newMode);\n            }),\n            runOnAttached(function (comp) {\n              editor.on('wordCountUpdate', function (e) {\n                var mode = Representing.getValue(comp).mode;\n                Representing.setValue(comp, {\n                  mode: mode,\n                  count: e.wordCount\n                });\n                replaceCountText(comp, e.wordCount, mode);\n              });\n            })\n          ])\n        ])\n      });\n    };\n\n    var renderStatusbar = function (editor, providersBackstage) {\n      var renderResizeHandlerIcon = function (resizeType) {\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-statusbar__resize-handle'],\n            attributes: {\n              'title': providersBackstage.translate('Resize'),\n              'aria-hidden': 'true'\n            },\n            innerHtml: get$d('resize-handle', providersBackstage.icons)\n          },\n          behaviours: derive$1([Dragging.config({\n              mode: 'mouse',\n              repositionTarget: false,\n              onDrag: function (comp, target, delta) {\n                resize$3(editor, delta, resizeType);\n              },\n              blockerClass: 'tox-blocker'\n            })])\n        };\n      };\n      var renderBranding = function () {\n        var label = global$7.translate([\n          'Powered by {0}',\n          'Tiny'\n        ]);\n        var linkHtml = '<a href=\"https://www.tiny.cloud/?utm_campaign=editor_referral&amp;utm_medium=poweredby&amp;utm_source=tinymce&amp;utm_content=v5\" rel=\"noopener\" target=\"_blank\" tabindex=\"-1\" aria-label=\"' + label + '\">' + label + '</a>';\n        return {\n          dom: {\n            tag: 'span',\n            classes: ['tox-statusbar__branding'],\n            innerHtml: linkHtml\n          }\n        };\n      };\n      var getResizeType = function (editor) {\n        var fallback = !contains$1(editor.settings.plugins, 'autoresize');\n        var resize = editor.getParam('resize', fallback);\n        if (resize === false) {\n          return ResizeTypes.None;\n        } else if (resize === 'both') {\n          return ResizeTypes.Both;\n        } else {\n          return ResizeTypes.Vertical;\n        }\n      };\n      var getTextComponents = function () {\n        var components = [];\n        if (editor.getParam('elementpath', true, 'boolean')) {\n          components.push(ElementPath.renderElementPath(editor, {}));\n        }\n        if (contains$1(editor.settings.plugins, 'wordcount')) {\n          components.push(renderWordCount(editor, providersBackstage));\n        }\n        if (editor.getParam('branding', true, 'boolean')) {\n          components.push(renderBranding());\n        }\n        if (components.length > 0) {\n          return [{\n              dom: {\n                tag: 'div',\n                classes: ['tox-statusbar__text-container']\n              },\n              components: components\n            }];\n        }\n        return [];\n      };\n      var getComponents = function () {\n        var components = getTextComponents();\n        var resizeType = getResizeType(editor);\n        if (resizeType !== ResizeTypes.None) {\n          components.push(renderResizeHandlerIcon(resizeType));\n        }\n        return components;\n      };\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-statusbar']\n        },\n        components: getComponents()\n      };\n    };\n\n    var setup$b = function (editor) {\n      var _a;\n      var isInline = editor.inline;\n      var mode = isInline ? Inline : Iframe;\n      var header = isStickyToolbar(editor) ? StickyHeader : StaticHeader;\n      var lazyOuterContainer = Option.none();\n      var platform = detect$3();\n      var isIE = platform.browser.isIE();\n      var platformClasses = isIE ? ['tox-platform-ie'] : [];\n      var isTouch = platform.deviceType.isTouch();\n      var touchPlatformClass = 'tox-platform-touch';\n      var deviceClasses = isTouch ? [touchPlatformClass] : [];\n      var isToolbarTop = isToolbarLocationTop(editor);\n      var dirAttributes = global$7.isRtl() ? { attributes: { dir: 'rtl' } } : {};\n      var verticalDirAttributes = { attributes: (_a = {}, _a[Attribute] = isToolbarTop ? AttributeValue.TopToBottom : AttributeValue.BottomToTop, _a) };\n      var lazyHeader = function () {\n        return lazyOuterContainer.bind(OuterContainer.getHeader);\n      };\n      var isHeaderDocked = function () {\n        return header.isDocked(lazyHeader);\n      };\n      var sink = build$1({\n        dom: __assign({\n          tag: 'div',\n          classes: [\n            'tox',\n            'tox-silver-sink',\n            'tox-tinymce-aux'\n          ].concat(platformClasses).concat(deviceClasses)\n        }, dirAttributes),\n        behaviours: derive$1([Positioning.config({\n            useFixed: function () {\n              return isHeaderDocked();\n            }\n          })])\n      });\n      var lazySink = function () {\n        return Result.value(sink);\n      };\n      var memAnchorBar = record({\n        dom: {\n          tag: 'div',\n          classes: ['tox-anchorbar']\n        }\n      });\n      var lazyAnchorBar = function () {\n        return lazyOuterContainer.bind(function (container) {\n          return memAnchorBar.getOpt(container);\n        }).getOrDie('Could not find a anchor bar element');\n      };\n      var lazyToolbar = function () {\n        return lazyOuterContainer.bind(function (container) {\n          return OuterContainer.getToolbar(container);\n        }).getOrDie('Could not find more toolbar element');\n      };\n      var lazyThrobber = function () {\n        return lazyOuterContainer.bind(function (container) {\n          return OuterContainer.getThrobber(container);\n        }).getOrDie('Could not find throbber element');\n      };\n      var backstage = init$8(sink, editor, lazyAnchorBar);\n      var partMenubar = OuterContainer.parts().menubar({\n        dom: {\n          tag: 'div',\n          classes: ['tox-menubar']\n        },\n        backstage: backstage,\n        onEscape: function () {\n          editor.focus();\n        }\n      });\n      var toolbarMode = getToolbarMode(editor);\n      var partToolbar = OuterContainer.parts().toolbar(__assign({\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar']\n        },\n        getSink: lazySink,\n        backstage: backstage,\n        onEscape: function () {\n          editor.focus();\n        },\n        type: toolbarMode,\n        lazyToolbar: lazyToolbar,\n        lazyHeader: function () {\n          return lazyHeader().getOrDie('Could not find header element');\n        }\n      }, verticalDirAttributes));\n      var partMultipleToolbar = OuterContainer.parts()['multiple-toolbar']({\n        dom: {\n          tag: 'div',\n          classes: ['tox-toolbar-overlord']\n        },\n        onEscape: function () {\n        },\n        type: toolbarMode\n      });\n      var partSocket = OuterContainer.parts().socket({\n        dom: {\n          tag: 'div',\n          classes: ['tox-edit-area']\n        }\n      });\n      var partSidebar = OuterContainer.parts().sidebar({\n        dom: {\n          tag: 'div',\n          classes: ['tox-sidebar']\n        }\n      });\n      var partThrobber = OuterContainer.parts().throbber({\n        dom: {\n          tag: 'div',\n          classes: ['tox-throbber']\n        },\n        backstage: backstage\n      });\n      var sb = editor.getParam('statusbar', true, 'boolean');\n      var statusbar = sb && !isInline ? Option.some(renderStatusbar(editor, backstage.shared.providers)) : Option.none();\n      var socketSidebarContainer = {\n        dom: {\n          tag: 'div',\n          classes: ['tox-sidebar-wrap']\n        },\n        components: [\n          partSocket,\n          partSidebar\n        ]\n      };\n      var hasMultipleToolbar = isMultipleToolbars(editor);\n      var hasToolbar = isToolbarEnabled(editor);\n      var hasMenubar = isMenubarEnabled(editor);\n      var getPartToolbar = function () {\n        if (hasMultipleToolbar) {\n          return [partMultipleToolbar];\n        } else if (hasToolbar) {\n          return [partToolbar];\n        } else {\n          return [];\n        }\n      };\n      var partHeader = OuterContainer.parts().header({\n        dom: __assign({\n          tag: 'div',\n          classes: ['tox-editor-header']\n        }, verticalDirAttributes),\n        components: flatten([\n          hasMenubar ? [partMenubar] : [],\n          getPartToolbar(),\n          useFixedContainer(editor) ? [] : [memAnchorBar.asSpec()]\n        ]),\n        sticky: isStickyToolbar(editor),\n        editor: editor,\n        getSink: lazySink\n      });\n      var editorComponents = flatten([\n        isToolbarTop ? [partHeader] : [],\n        isInline ? [] : [socketSidebarContainer],\n        isToolbarTop ? [] : [partHeader]\n      ]);\n      var editorContainer = {\n        dom: {\n          tag: 'div',\n          classes: ['tox-editor-container']\n        },\n        components: editorComponents\n      };\n      var containerComponents = flatten([\n        [editorContainer],\n        isInline ? [] : statusbar.toArray(),\n        [partThrobber]\n      ]);\n      var isHidden = isDistractionFree(editor);\n      var attributes = __assign(__assign({ role: 'application' }, global$7.isRtl() ? { dir: 'rtl' } : {}), isHidden ? { 'aria-hidden': 'true' } : {});\n      var outerContainer = build$1(OuterContainer.sketch({\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox',\n            'tox-tinymce'\n          ].concat(isInline ? ['tox-tinymce-inline'] : []).concat(isToolbarTop ? [] : ['tox-tinymce--toolbar-bottom']).concat(deviceClasses).concat(platformClasses),\n          styles: __assign({ visibility: 'hidden' }, isHidden ? {\n            opacity: '0',\n            border: '0'\n          } : {}),\n          attributes: attributes\n        },\n        components: containerComponents,\n        behaviours: derive$1([Keying.config({\n            mode: 'cyclic',\n            selector: '.tox-menubar, .tox-toolbar, .tox-toolbar__primary, .tox-toolbar__overflow--open, .tox-sidebar__overflow--open, .tox-statusbar__path, .tox-statusbar__wordcount, .tox-statusbar__branding a'\n          })])\n      }));\n      lazyOuterContainer = Option.some(outerContainer);\n      editor.shortcuts.add('alt+F9', 'focus menubar', function () {\n        OuterContainer.focusMenubar(outerContainer);\n      });\n      editor.shortcuts.add('alt+F10', 'focus toolbar', function () {\n        OuterContainer.focusToolbar(outerContainer);\n      });\n      var mothership = takeover(outerContainer);\n      var uiMothership = takeover(sink);\n      Events$1.setup(editor, mothership, uiMothership);\n      var getUi = function () {\n        var channels = {\n          broadcastAll: uiMothership.broadcast,\n          broadcastOn: uiMothership.broadcastOn,\n          register: function () {\n          }\n        };\n        return { channels: channels };\n      };\n      var setEditorSize = function () {\n        var parsedHeight = Utils.numToPx(getHeightWithFallback(editor));\n        var parsedWidth = Utils.numToPx(getWidthWithFallback(editor));\n        if (!editor.inline) {\n          if (isValidValue('div', 'width', parsedWidth)) {\n            set$2(outerContainer.element(), 'width', parsedWidth);\n          }\n          if (isValidValue('div', 'height', parsedHeight)) {\n            set$2(outerContainer.element(), 'height', parsedHeight);\n          } else {\n            set$2(outerContainer.element(), 'height', '200px');\n          }\n        }\n        return parsedHeight;\n      };\n      var renderUI = function () {\n        header.setup(editor, lazyHeader);\n        FormatControls.setup(editor, backstage);\n        setup$9(editor, lazySink, backstage);\n        setup$6(editor);\n        setup$7(editor, lazyThrobber, backstage.shared);\n        map$1(getToolbarGroups(editor), function (toolbarGroupButtonConfig, name) {\n          editor.ui.registry.addGroupToolbarButton(name, toolbarGroupButtonConfig);\n        });\n        var _a = editor.ui.registry.getAll(), buttons = _a.buttons, menuItems = _a.menuItems, contextToolbars = _a.contextToolbars, sidebars = _a.sidebars;\n        var toolbarOpt = getMultipleToolbarsSetting(editor);\n        var rawUiConfig = {\n          menuItems: menuItems,\n          menus: !editor.settings.menu ? {} : map$1(editor.settings.menu, function (menu) {\n            return __assign(__assign({}, menu), { items: menu.items });\n          }),\n          menubar: editor.settings.menubar,\n          toolbar: toolbarOpt.getOrThunk(function () {\n            return editor.getParam('toolbar', true);\n          }),\n          allowToolbarGroups: toolbarMode === ToolbarMode.floating,\n          buttons: buttons,\n          sidebar: sidebars\n        };\n        ContextToolbar.register(editor, contextToolbars, sink, { backstage: backstage });\n        TableSelectorHandles.setup(editor, sink);\n        var elm = editor.getElement();\n        var height = setEditorSize();\n        var uiComponents = {\n          mothership: mothership,\n          uiMothership: uiMothership,\n          outerContainer: outerContainer\n        };\n        var args = {\n          targetNode: elm,\n          height: height\n        };\n        return mode.render(editor, uiComponents, rawUiConfig, backstage, args);\n      };\n      return {\n        mothership: mothership,\n        uiMothership: uiMothership,\n        backstage: backstage,\n        renderUI: renderUI,\n        getUi: getUi\n      };\n    };\n    var Render = { setup: setup$b };\n\n    var describedBy = function (describedElement, describeElement) {\n      var describeId = Option.from(get$2(describedElement, 'id')).fold(function () {\n        var id = generate$1('dialog-describe');\n        set$1(describeElement, 'id', id);\n        return id;\n      }, identity);\n      set$1(describedElement, 'aria-describedby', describeId);\n    };\n\n    var AriaLabel = {\n      labelledBy: function (labelledElement, labelElement) {\n        var labelId = Option.from(get$2(labelledElement, 'id')).fold(function () {\n          var id = generate$1('dialog-label');\n          set$1(labelElement, 'id', id);\n          return id;\n        }, identity);\n        set$1(labelledElement, 'aria-labelledby', labelId);\n      }\n    };\n\n    var schema$x = constant([\n      strict$1('lazySink'),\n      option('dragBlockClass'),\n      defaultedFunction('getBounds', win),\n      defaulted$1('useTabstopAt', constant(true)),\n      defaulted$1('eventOrder', {}),\n      field$1('modalBehaviours', [Keying]),\n      onKeyboardHandler('onExecute'),\n      onStrictKeyboardHandler('onEscape')\n    ]);\n    var basic = { sketch: identity };\n    var parts$f = constant([\n      optional({\n        name: 'draghandle',\n        overrides: function (detail, spec) {\n          return {\n            behaviours: derive$1([Dragging.config({\n                mode: 'mouse',\n                getTarget: function (handle) {\n                  return ancestor$2(handle, '[role=\"dialog\"]').getOr(handle);\n                },\n                blockerClass: detail.dragBlockClass.getOrDie(new Error('The drag blocker class was not specified for a dialog with a drag handle: \\n' + JSON.stringify(spec, null, 2)).message),\n                getBounds: detail.getDragBounds\n              })])\n          };\n        }\n      }),\n      required({\n        schema: [strict$1('dom')],\n        name: 'title'\n      }),\n      required({\n        factory: basic,\n        schema: [strict$1('dom')],\n        name: 'close'\n      }),\n      required({\n        factory: basic,\n        schema: [strict$1('dom')],\n        name: 'body'\n      }),\n      optional({\n        factory: basic,\n        schema: [strict$1('dom')],\n        name: 'footer'\n      }),\n      external$1({\n        factory: {\n          sketch: function (spec, detail) {\n            return __assign(__assign({}, spec), {\n              dom: detail.dom,\n              components: detail.components\n            });\n          }\n        },\n        schema: [\n          defaulted$1('dom', {\n            tag: 'div',\n            styles: {\n              position: 'fixed',\n              left: '0px',\n              top: '0px',\n              right: '0px',\n              bottom: '0px'\n            }\n          }),\n          defaulted$1('components', [])\n        ],\n        name: 'blocker'\n      })\n    ]);\n\n    var factory$i = function (detail, components, spec, externals) {\n      var dialogBusyEvent = generate$1('alloy.dialog.busy');\n      var dialogIdleEvent = generate$1('alloy.dialog.idle');\n      var busyBehaviours = derive$1([\n        Keying.config({\n          mode: 'special',\n          onTab: function () {\n            return Option.some(true);\n          },\n          onShiftTab: function () {\n            return Option.some(true);\n          }\n        }),\n        Focusing.config({})\n      ]);\n      var showDialog = function (dialog) {\n        var sink = detail.lazySink(dialog).getOrDie();\n        var busyComp = Cell(Option.none());\n        var externalBlocker = externals.blocker();\n        var blocker = sink.getSystem().build(__assign(__assign({}, externalBlocker), {\n          components: externalBlocker.components.concat([premade$1(dialog)]),\n          behaviours: derive$1([\n            Focusing.config({}),\n            config('dialog-blocker-events', [\n              runOnSource(focusin(), function () {\n                Keying.focusIn(dialog);\n              }),\n              run(dialogIdleEvent, function (blocker, se) {\n                if (has$1(dialog.element(), 'aria-busy')) {\n                  remove$1(dialog.element(), 'aria-busy');\n                  busyComp.get().each(function (bc) {\n                    return Replacing.remove(dialog, bc);\n                  });\n                }\n              }),\n              run(dialogBusyEvent, function (blocker, se) {\n                set$1(dialog.element(), 'aria-busy', 'true');\n                var getBusySpec = se.event().getBusySpec();\n                busyComp.get().each(function (bc) {\n                  Replacing.remove(dialog, bc);\n                });\n                var busySpec = getBusySpec(dialog, busyBehaviours);\n                var busy = blocker.getSystem().build(busySpec);\n                busyComp.set(Option.some(busy));\n                Replacing.append(dialog, premade$1(busy));\n                if (busy.hasConfigured(Keying)) {\n                  Keying.focusIn(busy);\n                }\n              })\n            ])\n          ])\n        }));\n        attach$1(sink, blocker);\n        Keying.focusIn(dialog);\n      };\n      var hideDialog = function (dialog) {\n        parent(dialog.element()).each(function (blockerDom) {\n          dialog.getSystem().getByDom(blockerDom).each(function (blocker) {\n            detach(blocker);\n          });\n        });\n      };\n      var getDialogBody = function (dialog) {\n        return getPartOrDie(dialog, detail, 'body');\n      };\n      var getDialogFooter = function (dialog) {\n        return getPartOrDie(dialog, detail, 'footer');\n      };\n      var setBusy = function (dialog, getBusySpec) {\n        emitWith(dialog, dialogBusyEvent, { getBusySpec: getBusySpec });\n      };\n      var setIdle = function (dialog) {\n        emit(dialog, dialogIdleEvent);\n      };\n      var modalEventsId = generate$1('modal-events');\n      var eventOrder = __assign(__assign({}, detail.eventOrder), { 'alloy.system.attached': [modalEventsId].concat(detail.eventOrder['alloy.system.attached'] || []) });\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        apis: {\n          show: showDialog,\n          hide: hideDialog,\n          getBody: getDialogBody,\n          getFooter: getDialogFooter,\n          setIdle: setIdle,\n          setBusy: setBusy\n        },\n        eventOrder: eventOrder,\n        domModification: {\n          attributes: {\n            'role': 'dialog',\n            'aria-modal': 'true'\n          }\n        },\n        behaviours: augment(detail.modalBehaviours, [\n          Replacing.config({}),\n          Keying.config({\n            mode: 'cyclic',\n            onEnter: detail.onExecute,\n            onEscape: detail.onEscape,\n            useTabstopAt: detail.useTabstopAt\n          }),\n          config(modalEventsId, [runOnAttached(function (c) {\n              AriaLabel.labelledBy(c.element(), getPartOrDie(c, detail, 'title').element());\n              describedBy(c.element(), getPartOrDie(c, detail, 'body').element());\n            })])\n        ])\n      };\n    };\n    var ModalDialog = composite$1({\n      name: 'ModalDialog',\n      configFields: schema$x(),\n      partFields: parts$f(),\n      factory: factory$i,\n      apis: {\n        show: function (apis, dialog) {\n          apis.show(dialog);\n        },\n        hide: function (apis, dialog) {\n          apis.hide(dialog);\n        },\n        getBody: function (apis, dialog) {\n          return apis.getBody(dialog);\n        },\n        getFooter: function (apis, dialog) {\n          return apis.getFooter(dialog);\n        },\n        setBusy: function (apis, dialog, getBusySpec) {\n          apis.setBusy(dialog, getBusySpec);\n        },\n        setIdle: function (apis, dialog) {\n          apis.setIdle(dialog);\n        }\n      }\n    });\n\n    var alertBannerFields = [\n      strictString('type'),\n      strictString('text'),\n      strictStringEnum('level', [\n        'info',\n        'warn',\n        'error',\n        'success'\n      ]),\n      strictString('icon'),\n      defaulted$1('url', '')\n    ];\n    var alertBannerSchema = objOf(alertBannerFields);\n\n    var createBarFields = function (itemsField) {\n      return [\n        strictString('type'),\n        itemsField\n      ];\n    };\n\n    var buttonFields = [\n      strictString('type'),\n      strictString('text'),\n      defaultedBoolean('disabled', false),\n      defaultedBoolean('primary', false),\n      field('name', 'name', defaultedThunk(function () {\n        return generate$1('button-name');\n      }), string),\n      optionString('icon'),\n      defaultedBoolean('borderless', false)\n    ];\n    var buttonSchema = objOf(buttonFields);\n\n    var checkboxFields = [\n      strictString('type'),\n      strictString('name'),\n      strictString('label'),\n      defaultedBoolean('disabled', false)\n    ];\n    var checkboxSchema = objOf(checkboxFields);\n    var checkboxDataProcessor = boolean;\n\n    var formComponentFields = [\n      strictString('type'),\n      strictString('name')\n    ];\n    var formComponentWithLabelFields = formComponentFields.concat([optionString('label')]);\n\n    var colorInputFields = formComponentWithLabelFields;\n    var colorInputSchema = objOf(colorInputFields);\n    var colorInputDataProcessor = string;\n\n    var colorPickerFields = formComponentWithLabelFields;\n    var colorPickerSchema = objOf(colorPickerFields);\n    var colorPickerDataProcessor = string;\n\n    var dropZoneFields = formComponentWithLabelFields;\n    var dropZoneSchema = objOf(dropZoneFields);\n    var dropZoneDataProcessor = arrOfVal();\n\n    var createGridFields = function (itemsField) {\n      return [\n        strictString('type'),\n        strictNumber('columns'),\n        itemsField\n      ];\n    };\n\n    var iframeFields = formComponentWithLabelFields.concat([defaultedBoolean('sandboxed', true)]);\n    var iframeSchema = objOf(iframeFields);\n    var iframeDataProcessor = string;\n\n    var inputFields = formComponentWithLabelFields.concat([\n      optionString('inputMode'),\n      optionString('placeholder'),\n      defaultedBoolean('maximized', false),\n      defaultedBoolean('disabled', false)\n    ]);\n    var inputSchema = objOf(inputFields);\n    var inputDataProcessor = string;\n\n    var selectBoxFields = formComponentWithLabelFields.concat([\n      strictArrayOfObj('items', [\n        strictString('text'),\n        strictString('value')\n      ]),\n      defaultedNumber('size', 1),\n      defaultedBoolean('disabled', false)\n    ]);\n    var selectBoxSchema = objOf(selectBoxFields);\n    var selectBoxDataProcessor = string;\n\n    var sizeInputFields = formComponentWithLabelFields.concat([\n      defaultedBoolean('constrain', true),\n      defaultedBoolean('disabled', false)\n    ]);\n    var sizeInputSchema = objOf(sizeInputFields);\n    var sizeInputDataProcessor = objOf([\n      strictString('width'),\n      strictString('height')\n    ]);\n\n    var textAreaFields = formComponentWithLabelFields.concat([\n      optionString('placeholder'),\n      defaultedBoolean('maximized', false),\n      defaultedBoolean('disabled', false)\n    ]);\n    var textAreaSchema = objOf(textAreaFields);\n    var textAreaDataProcessor = string;\n\n    var urlInputFields = formComponentWithLabelFields.concat([\n      defaultedStringEnum('filetype', 'file', [\n        'image',\n        'media',\n        'file'\n      ]),\n      defaulted$1('disabled', false)\n    ]);\n    var urlInputSchema = objOf(urlInputFields);\n    var urlInputDataProcessor = objOf([\n      strictString('value'),\n      defaulted$1('meta', {})\n    ]);\n\n    var customEditorFields = formComponentFields.concat([\n      defaultedString('tag', 'textarea'),\n      strictString('scriptId'),\n      strictString('scriptUrl'),\n      defaultedPostMsg('settings', undefined)\n    ]);\n    var customEditorFieldsOld = formComponentFields.concat([\n      defaultedString('tag', 'textarea'),\n      strictFunction('init')\n    ]);\n    var customEditorSchema = valueOf(function (v) {\n      return asRaw('customeditor.old', objOfOnly(customEditorFieldsOld), v).orThunk(function () {\n        return asRaw('customeditor.new', objOfOnly(customEditorFields), v);\n      });\n    });\n    var customEditorDataProcessor = string;\n\n    var htmlPanelFields = [\n      strictString('type'),\n      strictString('html'),\n      defaultedStringEnum('presets', 'presentation', [\n        'presentation',\n        'document'\n      ])\n    ];\n    var htmlPanelSchema = objOf(htmlPanelFields);\n\n    var imageToolsFields = formComponentWithLabelFields.concat([strictOf('currentState', objOf([\n        strict$1('blob'),\n        strictString('url')\n      ]))]);\n    var imageToolsSchema = objOf(imageToolsFields);\n\n    var collectionFields = formComponentWithLabelFields.concat([defaulted$1('columns', 'auto')]);\n    var collectionSchema = objOf(collectionFields);\n    var collectionDataProcessor = arrOfObj$1([\n      strictString('value'),\n      strictString('text'),\n      strictString('icon')\n    ]);\n\n    var createLabelFields = function (itemsField) {\n      return [\n        strictString('type'),\n        strictString('label'),\n        itemsField\n      ];\n    };\n\n    var tableFields = [\n      strictString('type'),\n      strictArrayOf('header', string),\n      strictArrayOf('cells', arrOf(string))\n    ];\n    var tableSchema = objOf(tableFields);\n\n    var createItemsField = function (name) {\n      return field('items', 'items', strict(), arrOf(valueOf(function (v) {\n        return asRaw('Checking item of ' + name, itemSchema$2, v).fold(function (sErr) {\n          return Result.error(formatError(sErr));\n        }, function (passValue) {\n          return Result.value(passValue);\n        });\n      })));\n    };\n    var itemSchema$2 = valueThunkOf(function () {\n      return chooseProcessor('type', {\n        alertbanner: alertBannerSchema,\n        bar: objOf(createBarFields(createItemsField('bar'))),\n        button: buttonSchema,\n        checkbox: checkboxSchema,\n        colorinput: colorInputSchema,\n        colorpicker: colorPickerSchema,\n        dropzone: dropZoneSchema,\n        grid: objOf(createGridFields(createItemsField('grid'))),\n        iframe: iframeSchema,\n        input: inputSchema,\n        selectbox: selectBoxSchema,\n        sizeinput: sizeInputSchema,\n        textarea: textAreaSchema,\n        urlinput: urlInputSchema,\n        customeditor: customEditorSchema,\n        htmlpanel: htmlPanelSchema,\n        imagetools: imageToolsSchema,\n        collection: collectionSchema,\n        label: objOf(createLabelFields(createItemsField('label'))),\n        table: tableSchema,\n        panel: panelSchema\n      });\n    });\n    var panelFields = [\n      strictString('type'),\n      defaulted$1('classes', []),\n      strictArrayOf('items', itemSchema$2)\n    ];\n    var panelSchema = objOf(panelFields);\n\n    var tabFields = [\n      field('name', 'name', defaultedThunk(function () {\n        return generate$1('tab-name');\n      }), string),\n      strictString('title'),\n      strictArrayOf('items', itemSchema$2)\n    ];\n    var tabPanelFields = [\n      strictString('type'),\n      strictArrayOfObj('tabs', tabFields)\n    ];\n    var tabPanelSchema = objOf(tabPanelFields);\n\n    var dialogToggleMenuItemSchema = objOf([\n      strictString('type'),\n      strictString('name')\n    ].concat(commonMenuItemFields));\n    var dialogToggleMenuItemDataProcessor = boolean;\n\n    var baseButtonFields = [\n      field('name', 'name', defaultedThunk(function () {\n        return generate$1('button-name');\n      }), string),\n      optionString('icon'),\n      defaultedStringEnum('align', 'end', [\n        'start',\n        'end'\n      ]),\n      defaultedBoolean('primary', false),\n      defaultedBoolean('disabled', false)\n    ];\n    var dialogButtonFields = __spreadArrays(baseButtonFields, [strictString('text')]);\n    var normalButtonFields = __spreadArrays([strictStringEnum('type', [\n        'submit',\n        'cancel',\n        'custom'\n      ])], dialogButtonFields);\n    var menuButtonFields = __spreadArrays([\n      strictStringEnum('type', ['menu']),\n      optionString('text'),\n      optionString('tooltip'),\n      optionString('icon'),\n      strictArrayOf('items', dialogToggleMenuItemSchema)\n    ], baseButtonFields);\n    var dialogButtonSchema = choose$1('type', {\n      submit: normalButtonFields,\n      cancel: normalButtonFields,\n      custom: normalButtonFields,\n      menu: menuButtonFields\n    });\n\n    var dialogButtonFields$1 = dialogButtonFields;\n    var dialogButtonSchema$1 = dialogButtonSchema;\n    var dialogSchema = objOf([\n      strictString('title'),\n      strictOf('body', chooseProcessor('type', {\n        panel: panelSchema,\n        tabpanel: tabPanelSchema\n      })),\n      defaultedString('size', 'normal'),\n      strictArrayOf('buttons', dialogButtonSchema$1),\n      defaulted$1('initialData', {}),\n      defaultedFunction('onAction', noop),\n      defaultedFunction('onChange', noop),\n      defaultedFunction('onSubmit', noop),\n      defaultedFunction('onClose', noop),\n      defaultedFunction('onCancel', noop),\n      defaulted$1('onTabChange', noop)\n    ]);\n    var createDialog = function (spec) {\n      return asRaw('dialog', dialogSchema, spec);\n    };\n\n    var getAllObjects = function (obj) {\n      if (isObject(obj)) {\n        return [obj].concat(bind(values(obj), getAllObjects));\n      } else if (isArray(obj)) {\n        return bind(obj, getAllObjects);\n      } else {\n        return [];\n      }\n    };\n\n    var isNamedItem = function (obj) {\n      return isString(obj.type) && isString(obj.name);\n    };\n    var dataProcessors = {\n      checkbox: checkboxDataProcessor,\n      colorinput: colorInputDataProcessor,\n      colorpicker: colorPickerDataProcessor,\n      dropzone: dropZoneDataProcessor,\n      input: inputDataProcessor,\n      iframe: iframeDataProcessor,\n      sizeinput: sizeInputDataProcessor,\n      selectbox: selectBoxDataProcessor,\n      size: sizeInputDataProcessor,\n      textarea: textAreaDataProcessor,\n      urlinput: urlInputDataProcessor,\n      customeditor: customEditorDataProcessor,\n      collection: collectionDataProcessor,\n      togglemenuitem: dialogToggleMenuItemDataProcessor\n    };\n    var getDataProcessor = function (item) {\n      return Option.from(dataProcessors[item.type]);\n    };\n    var getNamedItems = function (structure) {\n      return filter(getAllObjects(structure), isNamedItem);\n    };\n\n    var createDataValidator = function (structure) {\n      var namedItems = getNamedItems(structure);\n      var fields = bind(namedItems, function (item) {\n        return getDataProcessor(item).fold(function () {\n          return [];\n        }, function (schema) {\n          return [strictOf(item.name, schema)];\n        });\n      });\n      return objOf(fields);\n    };\n\n    var urlDialogButtonSchema = objOf(__spreadArrays([strictStringEnum('type', [\n        'cancel',\n        'custom'\n      ])], dialogButtonFields$1));\n    var urlDialogSchema = objOf([\n      strictString('title'),\n      strictString('url'),\n      optionNumber('height'),\n      optionNumber('width'),\n      optionArrayOf('buttons', urlDialogButtonSchema),\n      defaultedFunction('onAction', noop),\n      defaultedFunction('onCancel', noop),\n      defaultedFunction('onClose', noop),\n      defaultedFunction('onMessage', noop)\n    ]);\n    var createUrlDialog = function (spec) {\n      return asRaw('dialog', urlDialogSchema, spec);\n    };\n\n    var extract$1 = function (structure) {\n      var internalDialog = getOrDie(createDialog(structure));\n      var dataValidator = createDataValidator(structure);\n      var initialData = structure.initialData;\n      return {\n        internalDialog: internalDialog,\n        dataValidator: dataValidator,\n        initialData: initialData\n      };\n    };\n    var DialogManager = {\n      open: function (factory, structure) {\n        var extraction = extract$1(structure);\n        return factory(extraction.internalDialog, extraction.initialData, extraction.dataValidator);\n      },\n      openUrl: function (factory, structure) {\n        var internalDialog = getOrDie(createUrlDialog(structure));\n        return factory(internalDialog);\n      },\n      redial: function (structure) {\n        return extract$1(structure);\n      }\n    };\n\n    var value$3 = function () {\n      var subject = Cell(Option.none());\n      var clear = function () {\n        subject.set(Option.none());\n      };\n      var set = function (s) {\n        subject.set(Option.some(s));\n      };\n      var on = function (f) {\n        subject.get().each(f);\n      };\n      var isSet = function () {\n        return subject.get().isSome();\n      };\n      return {\n        clear: clear,\n        set: set,\n        isSet: isSet,\n        on: on\n      };\n    };\n\n    var toValidValues = function (values) {\n      var errors = [];\n      var result = {};\n      each$1(values, function (value, name) {\n        value.fold(function () {\n          errors.push(name);\n        }, function (v) {\n          result[name] = v;\n        });\n      });\n      return errors.length > 0 ? Result.error(errors) : Result.value(result);\n    };\n\n    var renderBodyPanel = function (spec, backstage) {\n      var memForm = record(Form.sketch(function (parts) {\n        return {\n          dom: {\n            tag: 'div',\n            classes: ['tox-form'].concat(spec.classes)\n          },\n          components: map(spec.items, function (item) {\n            return interpretInForm(parts, item, backstage);\n          })\n        };\n      }));\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__body']\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-dialog__body-content']\n            },\n            components: [memForm.asSpec()]\n          }],\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'acyclic',\n            useTabstopAt: not(NavigableObject.isPseudoStop)\n          }),\n          ComposingConfigs.memento(memForm),\n          RepresentingConfigs.memento(memForm, {\n            postprocess: function (formValue) {\n              return toValidValues(formValue).fold(function (err) {\n                domGlobals.console.error(err);\n                return {};\n              }, function (vals) {\n                return vals;\n              });\n            }\n          })\n        ])\n      };\n    };\n\n    var factory$j = function (detail, spec) {\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: detail.components,\n        events: events$7(detail.action),\n        behaviours: augment(detail.tabButtonBehaviours, [\n          Focusing.config({}),\n          Keying.config({\n            mode: 'execution',\n            useSpace: true,\n            useEnter: true\n          }),\n          Representing.config({\n            store: {\n              mode: 'memory',\n              initialValue: detail.value\n            }\n          })\n        ]),\n        domModification: detail.domModification\n      };\n    };\n    var TabButton = single$2({\n      name: 'TabButton',\n      configFields: [\n        defaulted$1('uid', undefined),\n        strict$1('value'),\n        field('dom', 'dom', mergeWithThunk(function () {\n          return {\n            attributes: {\n              'role': 'tab',\n              'id': generate$1('aria'),\n              'aria-selected': 'false'\n            }\n          };\n        }), anyValue$1()),\n        option('action'),\n        defaulted$1('domModification', {}),\n        field$1('tabButtonBehaviours', [\n          Focusing,\n          Keying,\n          Representing\n        ]),\n        strict$1('view')\n      ],\n      factory: factory$j\n    });\n\n    var schema$y = constant([\n      strict$1('tabs'),\n      strict$1('dom'),\n      defaulted$1('clickToDismiss', false),\n      field$1('tabbarBehaviours', [\n        Highlighting,\n        Keying\n      ]),\n      markers([\n        'tabClass',\n        'selectedClass'\n      ])\n    ]);\n    var tabsPart = group({\n      factory: TabButton,\n      name: 'tabs',\n      unit: 'tab',\n      overrides: function (barDetail) {\n        var dismissTab$1 = function (tabbar, button) {\n          Highlighting.dehighlight(tabbar, button);\n          emitWith(tabbar, dismissTab(), {\n            tabbar: tabbar,\n            button: button\n          });\n        };\n        var changeTab$1 = function (tabbar, button) {\n          Highlighting.highlight(tabbar, button);\n          emitWith(tabbar, changeTab(), {\n            tabbar: tabbar,\n            button: button\n          });\n        };\n        return {\n          action: function (button) {\n            var tabbar = button.getSystem().getByUid(barDetail.uid).getOrDie();\n            var activeButton = Highlighting.isHighlighted(tabbar, button);\n            var response = function () {\n              if (activeButton && barDetail.clickToDismiss) {\n                return dismissTab$1;\n              } else if (!activeButton) {\n                return changeTab$1;\n              } else {\n                return noop;\n              }\n            }();\n            response(tabbar, button);\n          },\n          domModification: { classes: [barDetail.markers.tabClass] }\n        };\n      }\n    });\n    var parts$g = constant([tabsPart]);\n\n    var factory$k = function (detail, components, spec, externals) {\n      return {\n        'uid': detail.uid,\n        'dom': detail.dom,\n        'components': components,\n        'debug.sketcher': 'Tabbar',\n        'domModification': { attributes: { role: 'tablist' } },\n        'behaviours': augment(detail.tabbarBehaviours, [\n          Highlighting.config({\n            highlightClass: detail.markers.selectedClass,\n            itemClass: detail.markers.tabClass,\n            onHighlight: function (tabbar, tab) {\n              set$1(tab.element(), 'aria-selected', 'true');\n            },\n            onDehighlight: function (tabbar, tab) {\n              set$1(tab.element(), 'aria-selected', 'false');\n            }\n          }),\n          Keying.config({\n            mode: 'flow',\n            getInitial: function (tabbar) {\n              return Highlighting.getHighlighted(tabbar).map(function (tab) {\n                return tab.element();\n              });\n            },\n            selector: '.' + detail.markers.tabClass,\n            executeOnMove: true\n          })\n        ])\n      };\n    };\n    var Tabbar = composite$1({\n      name: 'Tabbar',\n      configFields: schema$y(),\n      partFields: parts$g(),\n      factory: factory$k\n    });\n\n    var factory$l = function (detail, spec) {\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        behaviours: augment(detail.tabviewBehaviours, [Replacing.config({})]),\n        domModification: { attributes: { role: 'tabpanel' } }\n      };\n    };\n    var Tabview = single$2({\n      name: 'Tabview',\n      configFields: [field$1('tabviewBehaviours', [Replacing])],\n      factory: factory$l\n    });\n\n    var schema$z = constant([\n      defaulted$1('selectFirst', true),\n      onHandler('onChangeTab'),\n      onHandler('onDismissTab'),\n      defaulted$1('tabs', []),\n      field$1('tabSectionBehaviours', [])\n    ]);\n    var barPart = required({\n      factory: Tabbar,\n      schema: [\n        strict$1('dom'),\n        strictObjOf('markers', [\n          strict$1('tabClass'),\n          strict$1('selectedClass')\n        ])\n      ],\n      name: 'tabbar',\n      defaults: function (detail) {\n        return { tabs: detail.tabs };\n      }\n    });\n    var viewPart = required({\n      factory: Tabview,\n      name: 'tabview'\n    });\n    var parts$h = constant([\n      barPart,\n      viewPart\n    ]);\n\n    var factory$m = function (detail, components, spec, externals) {\n      var changeTab$1 = function (button) {\n        var tabValue = Representing.getValue(button);\n        getPart(button, detail, 'tabview').each(function (tabview) {\n          var tabWithValue = find(detail.tabs, function (t) {\n            return t.value === tabValue;\n          });\n          tabWithValue.each(function (tabData) {\n            var panel = tabData.view();\n            getOpt(button.element(), 'id').each(function (id) {\n              set$1(tabview.element(), 'aria-labelledby', id);\n            });\n            Replacing.set(tabview, panel);\n            detail.onChangeTab(tabview, button, panel);\n          });\n        });\n      };\n      var changeTabBy = function (section, byPred) {\n        getPart(section, detail, 'tabbar').each(function (tabbar) {\n          byPred(tabbar).each(emitExecute);\n        });\n      };\n      return {\n        uid: detail.uid,\n        dom: detail.dom,\n        components: components,\n        behaviours: get$c(detail.tabSectionBehaviours),\n        events: derive(flatten([\n          detail.selectFirst ? [runOnAttached(function (section, simulatedEvent) {\n              changeTabBy(section, Highlighting.getFirst);\n            })] : [],\n          [\n            run(changeTab(), function (section, simulatedEvent) {\n              var button = simulatedEvent.event().button();\n              changeTab$1(button);\n            }),\n            run(dismissTab(), function (section, simulatedEvent) {\n              var button = simulatedEvent.event().button();\n              detail.onDismissTab(section, button);\n            })\n          ]\n        ])),\n        apis: {\n          getViewItems: function (section) {\n            return getPart(section, detail, 'tabview').map(function (tabview) {\n              return Replacing.contents(tabview);\n            }).getOr([]);\n          },\n          showTab: function (section, tabKey) {\n            var getTabIfNotActive = function (tabbar) {\n              var candidates = Highlighting.getCandidates(tabbar);\n              var optTab = find(candidates, function (c) {\n                return Representing.getValue(c) === tabKey;\n              });\n              return optTab.filter(function (tab) {\n                return !Highlighting.isHighlighted(tabbar, tab);\n              });\n            };\n            changeTabBy(section, getTabIfNotActive);\n          }\n        }\n      };\n    };\n    var TabSection = composite$1({\n      name: 'TabSection',\n      configFields: schema$z(),\n      partFields: parts$h(),\n      factory: factory$m,\n      apis: {\n        getViewItems: function (apis, component) {\n          return apis.getViewItems(component);\n        },\n        showTab: function (apis, component, tabKey) {\n          apis.showTab(component, tabKey);\n        }\n      }\n    });\n\n    var measureHeights = function (allTabs, tabview, tabviewComp) {\n      return map(allTabs, function (tab, i) {\n        Replacing.set(tabviewComp, allTabs[i].view());\n        var rect = tabview.dom().getBoundingClientRect();\n        Replacing.set(tabviewComp, []);\n        return rect.height;\n      });\n    };\n    var getMaxHeight = function (heights) {\n      return head(sort(heights, function (a, b) {\n        if (a > b) {\n          return -1;\n        } else if (a < b) {\n          return +1;\n        } else {\n          return 0;\n        }\n      }));\n    };\n    var getMaxTabviewHeight = function (dialog, tabview, tablist) {\n      var documentElement$1 = documentElement(dialog).dom();\n      var rootElm = ancestor$2(dialog, '.tox-dialog-wrap').getOr(dialog);\n      var isFixed = get$4(rootElm, 'position') === 'fixed';\n      var maxHeight;\n      if (isFixed) {\n        maxHeight = Math.max(documentElement$1.clientHeight, domGlobals.window.innerHeight);\n      } else {\n        maxHeight = Math.max(documentElement$1.offsetHeight, documentElement$1.scrollHeight);\n      }\n      var tabviewHeight = get$6(tabview);\n      var isTabListBeside = tabview.dom().offsetLeft >= tablist.dom().offsetLeft + get$7(tablist);\n      var currentTabHeight = isTabListBeside ? Math.max(get$6(tablist), tabviewHeight) : tabviewHeight;\n      var dialogTopMargin = parseInt(get$4(dialog, 'margin-top'), 10) || 0;\n      var dialogBottomMargin = parseInt(get$4(dialog, 'margin-bottom'), 10) || 0;\n      var dialogHeight = get$6(dialog) + dialogTopMargin + dialogBottomMargin;\n      var chromeHeight = dialogHeight - currentTabHeight;\n      return maxHeight - chromeHeight;\n    };\n    var showTab = function (allTabs, comp) {\n      head(allTabs).each(function (tab) {\n        return TabSection.showTab(comp, tab.value);\n      });\n    };\n    var setTabviewHeight = function (tabview, height) {\n      set$2(tabview, 'height', height + 'px');\n      if (!detect$3().browser.isIE()) {\n        set$2(tabview, 'flex-basis', height + 'px');\n      } else {\n        remove$6(tabview, 'flex-basis');\n      }\n    };\n    var updateTabviewHeight = function (dialogBody, tabview, maxTabHeight) {\n      ancestor$2(dialogBody, '[role=\"dialog\"]').each(function (dialog) {\n        descendant$1(dialog, '[role=\"tablist\"]').each(function (tablist) {\n          maxTabHeight.get().map(function (height) {\n            set$2(tabview, 'height', '0');\n            set$2(tabview, 'flex-basis', '0');\n            return Math.min(height, getMaxTabviewHeight(dialog, tabview, tablist));\n          }).each(function (height) {\n            setTabviewHeight(tabview, height);\n          });\n        });\n      });\n    };\n    var getTabview = function (dialog) {\n      return descendant$1(dialog, '[role=\"tabpanel\"]');\n    };\n    var setMode = function (allTabs) {\n      var smartTabHeight = function () {\n        var maxTabHeight = Cell(Option.none());\n        var extraEvents = [\n          runOnAttached(function (comp) {\n            var dialog = comp.element();\n            getTabview(dialog).each(function (tabview) {\n              set$2(tabview, 'visibility', 'hidden');\n              comp.getSystem().getByDom(tabview).toOption().each(function (tabviewComp) {\n                var heights = measureHeights(allTabs, tabview, tabviewComp);\n                var maxTabHeightOpt = getMaxHeight(heights);\n                maxTabHeight.set(maxTabHeightOpt);\n              });\n              updateTabviewHeight(dialog, tabview, maxTabHeight);\n              remove$6(tabview, 'visibility');\n              showTab(allTabs, comp);\n              global$2.requestAnimationFrame(function () {\n                updateTabviewHeight(dialog, tabview, maxTabHeight);\n              });\n            });\n          }),\n          run(windowResize(), function (comp) {\n            var dialog = comp.element();\n            getTabview(dialog).each(function (tabview) {\n              updateTabviewHeight(dialog, tabview, maxTabHeight);\n            });\n          }),\n          run(formResizeEvent, function (comp, se) {\n            var dialog = comp.element();\n            getTabview(dialog).each(function (tabview) {\n              var oldFocus = active();\n              set$2(tabview, 'visibility', 'hidden');\n              var oldHeight = getRaw(tabview, 'height').map(function (h) {\n                return parseInt(h, 10);\n              });\n              remove$6(tabview, 'height');\n              remove$6(tabview, 'flex-basis');\n              var newHeight = tabview.dom().getBoundingClientRect().height;\n              var hasGrown = oldHeight.forall(function (h) {\n                return newHeight > h;\n              });\n              if (hasGrown) {\n                maxTabHeight.set(Option.from(newHeight));\n                updateTabviewHeight(dialog, tabview, maxTabHeight);\n              } else {\n                oldHeight.each(function (h) {\n                  setTabviewHeight(tabview, h);\n                });\n              }\n              remove$6(tabview, 'visibility');\n              oldFocus.each(focus$1);\n            });\n          })\n        ];\n        var selectFirst = false;\n        return {\n          extraEvents: extraEvents,\n          selectFirst: selectFirst\n        };\n      }();\n      var naiveTabHeight = function () {\n        var extraEvents = [];\n        var selectFirst = true;\n        return {\n          extraEvents: extraEvents,\n          selectFirst: selectFirst\n        };\n      }();\n      return {\n        smartTabHeight: smartTabHeight,\n        naiveTabHeight: naiveTabHeight\n      };\n    };\n\n    var SendDataToSectionChannel = 'send-data-to-section';\n    var SendDataToViewChannel = 'send-data-to-view';\n    var renderTabPanel = function (spec, backstage) {\n      var storedValue = Cell({});\n      var updateDataWithForm = function (form) {\n        var formData = Representing.getValue(form);\n        var validData = toValidValues(formData).getOr({});\n        var currentData = storedValue.get();\n        var newData = deepMerge(currentData, validData);\n        storedValue.set(newData);\n      };\n      var setDataOnForm = function (form) {\n        var tabData = storedValue.get();\n        Representing.setValue(form, tabData);\n      };\n      var oldTab = Cell(null);\n      var allTabs = map(spec.tabs, function (tab) {\n        return {\n          value: tab.name,\n          dom: {\n            tag: 'div',\n            classes: ['tox-dialog__body-nav-item'],\n            innerHtml: backstage.shared.providers.translate(tab.title)\n          },\n          view: function () {\n            return [Form.sketch(function (parts) {\n                return {\n                  dom: {\n                    tag: 'div',\n                    classes: ['tox-form']\n                  },\n                  components: map(tab.items, function (item) {\n                    return interpretInForm(parts, item, backstage);\n                  }),\n                  formBehaviours: derive$1([\n                    Keying.config({\n                      mode: 'acyclic',\n                      useTabstopAt: not(NavigableObject.isPseudoStop)\n                    }),\n                    config('TabView.form.events', [\n                      runOnAttached(setDataOnForm),\n                      runOnDetached(updateDataWithForm)\n                    ]),\n                    Receiving.config({\n                      channels: wrapAll$1([\n                        {\n                          key: SendDataToSectionChannel,\n                          value: { onReceive: updateDataWithForm }\n                        },\n                        {\n                          key: SendDataToViewChannel,\n                          value: { onReceive: setDataOnForm }\n                        }\n                      ])\n                    })\n                  ])\n                };\n              })];\n          }\n        };\n      });\n      var tabMode = setMode(allTabs).smartTabHeight;\n      return TabSection.sketch({\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__body']\n        },\n        onChangeTab: function (section, button, _viewItems) {\n          var name = Representing.getValue(button);\n          emitWith(section, formTabChangeEvent, {\n            name: name,\n            oldName: oldTab.get()\n          });\n          oldTab.set(name);\n        },\n        tabs: allTabs,\n        components: [\n          TabSection.parts().tabbar({\n            dom: {\n              tag: 'div',\n              classes: ['tox-dialog__body-nav']\n            },\n            components: [Tabbar.parts().tabs({})],\n            markers: {\n              tabClass: 'tox-tab',\n              selectedClass: 'tox-dialog__body-nav-item--active'\n            },\n            tabbarBehaviours: derive$1([Tabstopping.config({})])\n          }),\n          TabSection.parts().tabview({\n            dom: {\n              tag: 'div',\n              classes: ['tox-dialog__body-content']\n            }\n          })\n        ],\n        selectFirst: tabMode.selectFirst,\n        tabSectionBehaviours: derive$1([\n          config('tabpanel', tabMode.extraEvents),\n          Keying.config({ mode: 'acyclic' }),\n          Composing.config({\n            find: function (comp) {\n              return head(TabSection.getViewItems(comp));\n            }\n          }),\n          Representing.config({\n            store: {\n              mode: 'manual',\n              getValue: function (tsection) {\n                tsection.getSystem().broadcastOn([SendDataToSectionChannel], {});\n                return storedValue.get();\n              },\n              setValue: function (tsection, value) {\n                storedValue.set(value);\n                tsection.getSystem().broadcastOn([SendDataToViewChannel], {});\n              }\n            }\n          })\n        ])\n      });\n    };\n\n    var dialogChannel = generate$1('update-dialog');\n    var titleChannel = generate$1('update-title');\n    var bodyChannel = generate$1('update-body');\n    var footerChannel = generate$1('update-footer');\n    var bodySendMessageChannel = generate$1('body-send-message');\n\n    var renderBody = function (spec, id, backstage, ariaAttrs) {\n      var renderComponents = function (incoming) {\n        switch (incoming.body.type) {\n        case 'tabpanel': {\n            return [renderTabPanel(incoming.body, backstage)];\n          }\n        default: {\n            return [renderBodyPanel(incoming.body, backstage)];\n          }\n        }\n      };\n      var updateState = function (_comp, incoming) {\n        return Option.some({\n          isTabPanel: function () {\n            return incoming.body.type === 'tabpanel';\n          }\n        });\n      };\n      var ariaAttributes = { 'aria-live': 'polite' };\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__content-js'],\n          attributes: __assign(__assign({}, id.map(function (x) {\n            return { id: x };\n          }).getOr({})), ariaAttrs ? ariaAttributes : {})\n        },\n        components: [],\n        behaviours: derive$1([\n          ComposingConfigs.childAt(0),\n          Reflecting.config({\n            channel: bodyChannel,\n            updateState: updateState,\n            renderComponents: renderComponents,\n            initialData: spec\n          })\n        ])\n      };\n    };\n    var renderInlineBody = function (spec, contentId, backstage, ariaAttrs) {\n      return renderBody(spec, Option.some(contentId), backstage, ariaAttrs);\n    };\n    var renderModalBody = function (spec, backstage) {\n      var bodySpec = renderBody(spec, Option.none(), backstage, false);\n      return ModalDialog.parts().body(bodySpec);\n    };\n    var renderIframeBody = function (spec) {\n      var bodySpec = {\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__content-js']\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-dialog__body-iframe']\n            },\n            components: [NavigableObject.craft({\n                dom: {\n                  tag: 'iframe',\n                  attributes: { src: spec.url }\n                },\n                behaviours: derive$1([\n                  Tabstopping.config({}),\n                  Focusing.config({})\n                ])\n              })]\n          }],\n        behaviours: derive$1([Keying.config({\n            mode: 'acyclic',\n            useTabstopAt: not(NavigableObject.isPseudoStop)\n          })])\n      };\n      return ModalDialog.parts().body(bodySpec);\n    };\n\n    var isTouch = global$8.deviceType.isTouch();\n    var hiddenHeader = function (title, close) {\n      return {\n        dom: {\n          tag: 'div',\n          styles: { display: 'none' },\n          classes: ['tox-dialog__header']\n        },\n        components: [\n          title,\n          close\n        ]\n      };\n    };\n    var pClose = function (onClose, providersBackstage) {\n      return ModalDialog.parts().close(Button.sketch({\n        dom: {\n          tag: 'button',\n          classes: [\n            'tox-button',\n            'tox-button--icon',\n            'tox-button--naked'\n          ],\n          attributes: {\n            'type': 'button',\n            'aria-label': providersBackstage.translate('Close')\n          }\n        },\n        action: onClose,\n        buttonBehaviours: derive$1([Tabstopping.config({})])\n      }));\n    };\n    var pUntitled = function () {\n      return ModalDialog.parts().title({\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__title'],\n          innerHtml: '',\n          styles: { display: 'none' }\n        }\n      });\n    };\n    var pBodyMessage = function (message, providersBackstage) {\n      return ModalDialog.parts().body({\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__body']\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-dialog__body-content']\n            },\n            components: [{ dom: fromHtml$2('<p>' + providersBackstage.translate(message) + '</p>') }]\n          }]\n      });\n    };\n    var pFooter = function (buttons) {\n      return ModalDialog.parts().footer({\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__footer']\n        },\n        components: buttons\n      });\n    };\n    var pFooterGroup = function (startButtons, endButtons) {\n      return [\n        Container.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-dialog__footer-start']\n          },\n          components: startButtons\n        }),\n        Container.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-dialog__footer-end']\n          },\n          components: endButtons\n        })\n      ];\n    };\n    var renderDialog = function (spec) {\n      var _a;\n      var dialogClass = 'tox-dialog';\n      var blockerClass = dialogClass + '-wrap';\n      var blockerBackdropClass = blockerClass + '__backdrop';\n      var scrollLockClass = dialogClass + '__disable-scroll';\n      return ModalDialog.sketch({\n        lazySink: spec.lazySink,\n        onEscape: function (comp) {\n          spec.onEscape(comp);\n          return Option.some(true);\n        },\n        useTabstopAt: function (elem) {\n          return !NavigableObject.isPseudoStop(elem);\n        },\n        dom: {\n          tag: 'div',\n          classes: [dialogClass].concat(spec.extraClasses),\n          styles: __assign({ position: 'relative' }, spec.extraStyles)\n        },\n        components: __spreadArrays([\n          spec.header,\n          spec.body\n        ], spec.footer.toArray()),\n        parts: {\n          blocker: {\n            dom: fromHtml$2('<div class=\"' + blockerClass + '\"></div>'),\n            components: [{\n                dom: {\n                  tag: 'div',\n                  classes: isTouch ? [\n                    blockerBackdropClass,\n                    blockerBackdropClass + '--opaque'\n                  ] : [blockerBackdropClass]\n                }\n              }]\n          }\n        },\n        dragBlockClass: blockerClass,\n        modalBehaviours: derive$1(__spreadArrays([\n          Focusing.config({}),\n          config('dialog-events', spec.dialogEvents.concat([runOnSource(focusin(), function (comp, se) {\n              Keying.focusIn(comp);\n            })])),\n          config('scroll-lock', [\n            runOnAttached(function () {\n              add$2(body(), scrollLockClass);\n            }),\n            runOnDetached(function () {\n              remove$4(body(), scrollLockClass);\n            })\n          ])\n        ], spec.extraBehaviours)),\n        eventOrder: __assign((_a = {}, _a[execute()] = ['dialog-events'], _a[attachedToDom()] = [\n          'scroll-lock',\n          'dialog-events',\n          'alloy.base.behaviour'\n        ], _a[detachedFromDom()] = [\n          'alloy.base.behaviour',\n          'dialog-events',\n          'scroll-lock'\n        ], _a), spec.eventOrder)\n      });\n    };\n\n    var renderClose = function (providersBackstage) {\n      return Button.sketch({\n        dom: {\n          tag: 'button',\n          classes: [\n            'tox-button',\n            'tox-button--icon',\n            'tox-button--naked'\n          ],\n          attributes: {\n            'type': 'button',\n            'aria-label': providersBackstage.translate('Close'),\n            'title': providersBackstage.translate('Close')\n          }\n        },\n        components: [{\n            dom: {\n              tag: 'div',\n              classes: ['tox-icon'],\n              innerHtml: '<svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M17.953 7.453L13.422 12l4.531 4.547-1.406 1.406L12 13.422l-4.547 4.531-1.406-1.406L10.578 12 6.047 7.453l1.406-1.406L12 10.578l4.547-4.531z\" fill-rule=\"evenodd\"></path></svg>'\n            }\n          }],\n        action: function (comp) {\n          emit(comp, formCancelEvent);\n        }\n      });\n    };\n    var renderTitle = function (spec, id, providersBackstage) {\n      var renderComponents = function (data) {\n        return [text(providersBackstage.translate(data.title))];\n      };\n      return {\n        dom: {\n          tag: 'div',\n          classes: ['tox-dialog__title'],\n          attributes: __assign({}, id.map(function (x) {\n            return { id: x };\n          }).getOr({}))\n        },\n        components: renderComponents(spec),\n        behaviours: derive$1([Reflecting.config({\n            channel: titleChannel,\n            renderComponents: renderComponents\n          })])\n      };\n    };\n    var renderDragHandle = function () {\n      return { dom: fromHtml$2('<div class=\"tox-dialog__draghandle\"></div>') };\n    };\n    var renderInlineHeader = function (spec, titleId, providersBackstage) {\n      return Container.sketch({\n        dom: fromHtml$2('<div class=\"tox-dialog__header\"></div>'),\n        components: [\n          renderTitle(spec, Option.some(titleId), providersBackstage),\n          renderDragHandle(),\n          renderClose(providersBackstage)\n        ],\n        containerBehaviours: derive$1([Dragging.config({\n            mode: 'mouse',\n            blockerClass: 'blocker',\n            getTarget: function (handle) {\n              return closest$3(handle, '[role=\"dialog\"]').getOrDie();\n            },\n            snaps: {\n              getSnapPoints: function () {\n                return [];\n              },\n              leftAttr: 'data-drag-left',\n              topAttr: 'data-drag-top'\n            }\n          })])\n      });\n    };\n    var renderModalHeader = function (spec, providersBackstage) {\n      var pTitle = ModalDialog.parts().title(renderTitle(spec, Option.none(), providersBackstage));\n      var pHandle = ModalDialog.parts().draghandle(renderDragHandle());\n      var pClose = ModalDialog.parts().close(renderClose(providersBackstage));\n      var components = [pTitle].concat(spec.draggable ? [pHandle] : []).concat([pClose]);\n      return Container.sketch({\n        dom: fromHtml$2('<div class=\"tox-dialog__header\"></div>'),\n        components: components\n      });\n    };\n\n    var getHeader = function (title, backstage) {\n      return renderModalHeader({\n        title: backstage.shared.providers.translate(title),\n        draggable: backstage.dialog.isDraggableModal()\n      }, backstage.shared.providers);\n    };\n    var getEventExtras = function (lazyDialog, extra) {\n      return {\n        onClose: function () {\n          return extra.closeWindow();\n        },\n        onBlock: function (blockEvent) {\n          ModalDialog.setBusy(lazyDialog(), function (d, bs) {\n            return {\n              dom: {\n                tag: 'div',\n                classes: ['tox-dialog__busy-spinner'],\n                attributes: { 'aria-label': blockEvent.message() },\n                styles: {\n                  left: '0px',\n                  right: '0px',\n                  bottom: '0px',\n                  top: '0px',\n                  position: 'absolute'\n                }\n              },\n              behaviours: bs,\n              components: [{ dom: fromHtml$2('<div class=\"tox-spinner\"><div></div><div></div><div></div></div>') }]\n            };\n          });\n        },\n        onUnblock: function () {\n          ModalDialog.setIdle(lazyDialog());\n        }\n      };\n    };\n    var renderModalDialog = function (spec, initialData, dialogEvents, backstage) {\n      var _a;\n      var updateState = function (_comp, incoming) {\n        return Option.some(incoming);\n      };\n      return build$1(renderDialog(__assign(__assign({}, spec), {\n        lazySink: backstage.shared.getSink,\n        extraBehaviours: __spreadArrays([\n          Reflecting.config({\n            channel: dialogChannel,\n            updateState: updateState,\n            initialData: initialData\n          }),\n          RepresentingConfigs.memory({})\n        ], spec.extraBehaviours),\n        onEscape: function (comp) {\n          emit(comp, formCancelEvent);\n        },\n        dialogEvents: dialogEvents,\n        eventOrder: (_a = {}, _a[receive()] = [\n          'reflecting',\n          'receiving'\n        ], _a[attachedToDom()] = [\n          'scroll-lock',\n          'reflecting',\n          'messages',\n          'dialog-events',\n          'alloy.base.behaviour'\n        ], _a[detachedFromDom()] = [\n          'alloy.base.behaviour',\n          'dialog-events',\n          'messages',\n          'reflecting',\n          'scroll-lock'\n        ], _a)\n      })));\n    };\n    var mapMenuButtons = function (buttons) {\n      var mapItems = function (button) {\n        var items = map(button.items, function (item) {\n          var cell = Cell(false);\n          return __assign(__assign({}, item), { storage: cell });\n        });\n        return __assign(__assign({}, button), { items: items });\n      };\n      return map(buttons, function (button) {\n        if (button.type === 'menu') {\n          return mapItems(button);\n        }\n        return button;\n      });\n    };\n    var extractCellsToObject = function (buttons) {\n      return foldl(buttons, function (acc, button) {\n        if (button.type === 'menu') {\n          var menuButton = button;\n          return foldl(menuButton.items, function (innerAcc, item) {\n            innerAcc[item.name] = item.storage;\n            return innerAcc;\n          }, acc);\n        }\n        return acc;\n      }, {});\n    };\n\n    var initCommonEvents = function (fireApiEvent, extras) {\n      return [\n        runWithTarget(focusin(), NavigableObject.onFocus),\n        fireApiEvent(formCloseEvent, function (api, spec) {\n          extras.onClose();\n          spec.onClose();\n        }),\n        fireApiEvent(formCancelEvent, function (api, spec, _event, self) {\n          spec.onCancel(api);\n          emit(self, formCloseEvent);\n        }),\n        run(formUnblockEvent, function (c, se) {\n          return extras.onUnblock();\n        }),\n        run(formBlockEvent, function (c, se) {\n          return extras.onBlock(se.event());\n        })\n      ];\n    };\n    var initUrlDialog = function (getInstanceApi, extras) {\n      var fireApiEvent = function (eventName, f) {\n        return run(eventName, function (c, se) {\n          withSpec(c, function (spec, _c) {\n            f(getInstanceApi(), spec, se.event(), c);\n          });\n        });\n      };\n      var withSpec = function (c, f) {\n        Reflecting.getState(c).get().each(function (currentDialog) {\n          f(currentDialog, c);\n        });\n      };\n      return __spreadArrays(initCommonEvents(fireApiEvent, extras), [fireApiEvent(formActionEvent, function (api, spec, event) {\n          spec.onAction(api, { name: event.name() });\n        })]);\n    };\n    var initDialog = function (getInstanceApi, extras, getSink) {\n      var fireApiEvent = function (eventName, f) {\n        return run(eventName, function (c, se) {\n          withSpec(c, function (spec, _c) {\n            f(getInstanceApi(), spec, se.event(), c);\n          });\n        });\n      };\n      var withSpec = function (c, f) {\n        Reflecting.getState(c).get().each(function (currentDialogInit) {\n          f(currentDialogInit.internalDialog, c);\n        });\n      };\n      return __spreadArrays(initCommonEvents(fireApiEvent, extras), [\n        fireApiEvent(formSubmitEvent, function (api, spec) {\n          return spec.onSubmit(api);\n        }),\n        fireApiEvent(formChangeEvent, function (api, spec, event) {\n          spec.onChange(api, { name: event.name() });\n        }),\n        fireApiEvent(formActionEvent, function (api, spec, event, component) {\n          var focusIn = function () {\n            return Keying.focusIn(component);\n          };\n          var isDisabled = function (focused) {\n            return has$1(focused, 'disabled') || getOpt(focused, 'aria-disabled').exists(function (val) {\n              return val === 'true';\n            });\n          };\n          var current = active();\n          spec.onAction(api, {\n            name: event.name(),\n            value: event.value()\n          });\n          active().fold(focusIn, function (focused) {\n            if (isDisabled(focused)) {\n              focusIn();\n            } else if (current.exists(function (cur) {\n                return contains$2(focused, cur) && isDisabled(cur);\n              })) {\n              focusIn();\n            } else {\n              getSink().toOption().filter(function (sink) {\n                return !contains$2(sink.element(), focused);\n              }).each(focusIn);\n            }\n          });\n        }),\n        fireApiEvent(formTabChangeEvent, function (api, spec, event) {\n          spec.onTabChange(api, {\n            newTabName: event.name(),\n            oldTabName: event.oldName()\n          });\n        }),\n        runOnDetached(function (component) {\n          var api = getInstanceApi();\n          Representing.setValue(component, api.getData());\n        })\n      ]);\n    };\n    var SilverDialogEvents = {\n      initUrlDialog: initUrlDialog,\n      initDialog: initDialog\n    };\n\n    var makeButton = function (button, backstage) {\n      return renderFooterButton(button, button.type, backstage);\n    };\n    var lookup$2 = function (compInSystem, footerButtons, buttonName) {\n      return find(footerButtons, function (button) {\n        return button.name === buttonName;\n      }).bind(function (memButton) {\n        return memButton.memento.getOpt(compInSystem);\n      });\n    };\n    var renderComponents = function (_data, state) {\n      var footerButtons = state.map(function (s) {\n        return s.footerButtons;\n      }).getOr([]);\n      var buttonGroups = partition(footerButtons, function (button) {\n        return button.align === 'start';\n      });\n      var makeGroup = function (edge, buttons) {\n        return Container.sketch({\n          dom: {\n            tag: 'div',\n            classes: ['tox-dialog__footer-' + edge]\n          },\n          components: map(buttons, function (button) {\n            return button.memento.asSpec();\n          })\n        });\n      };\n      var startButtons = makeGroup('start', buttonGroups.pass);\n      var endButtons = makeGroup('end', buttonGroups.fail);\n      return [\n        startButtons,\n        endButtons\n      ];\n    };\n    var renderFooter = function (initSpec, backstage) {\n      var updateState = function (_comp, data) {\n        var footerButtons = map(data.buttons, function (button) {\n          var memButton = record(makeButton(button, backstage));\n          return {\n            name: button.name,\n            align: button.align,\n            memento: memButton\n          };\n        });\n        var lookupByName = function (compInSystem, buttonName) {\n          return lookup$2(compInSystem, footerButtons, buttonName);\n        };\n        return Option.some({\n          lookupByName: lookupByName,\n          footerButtons: footerButtons\n        });\n      };\n      return {\n        dom: fromHtml$2('<div class=\"tox-dialog__footer\"></div>'),\n        components: [],\n        behaviours: derive$1([Reflecting.config({\n            channel: footerChannel,\n            initialData: initSpec,\n            updateState: updateState,\n            renderComponents: renderComponents\n          })])\n      };\n    };\n    var renderInlineFooter = function (initSpec, backstage) {\n      return renderFooter(initSpec, backstage);\n    };\n    var renderModalFooter = function (initSpec, backstage) {\n      return ModalDialog.parts().footer(renderFooter(initSpec, backstage));\n    };\n\n    var getCompByName = function (access, name) {\n      var root = access.getRoot();\n      if (root.getSystem().isConnected()) {\n        var form_1 = Composing.getCurrent(access.getFormWrapper()).getOr(access.getFormWrapper());\n        return Form.getField(form_1, name).fold(function () {\n          var footer = access.getFooter();\n          var footerState = Reflecting.getState(footer);\n          return footerState.get().bind(function (f) {\n            return f.lookupByName(form_1, name);\n          });\n        }, function (comp) {\n          return Option.some(comp);\n        });\n      } else {\n        return Option.none();\n      }\n    };\n    var validateData = function (access, data) {\n      var root = access.getRoot();\n      return Reflecting.getState(root).get().map(function (dialogState) {\n        return getOrDie(asRaw('data', dialogState.dataValidator, data));\n      }).getOr(data);\n    };\n    var getDialogApi = function (access, doRedial, menuItemStates) {\n      var withRoot = function (f) {\n        var root = access.getRoot();\n        if (root.getSystem().isConnected()) {\n          f(root);\n        }\n      };\n      var getData = function () {\n        var root = access.getRoot();\n        var valueComp = root.getSystem().isConnected() ? access.getFormWrapper() : root;\n        var representedValues = Representing.getValue(valueComp);\n        var menuItemCurrentState = map$1(menuItemStates, function (cell) {\n          return cell.get();\n        });\n        return __assign(__assign({}, representedValues), menuItemCurrentState);\n      };\n      var setData = function (newData) {\n        withRoot(function (_) {\n          var prevData = instanceApi.getData();\n          var mergedData = __assign(__assign({}, prevData), newData);\n          var newInternalData = validateData(access, mergedData);\n          var form = access.getFormWrapper();\n          Representing.setValue(form, newInternalData);\n          each$1(menuItemStates, function (v, k) {\n            if (has(mergedData, k)) {\n              v.set(mergedData[k]);\n            }\n          });\n        });\n      };\n      var disable = function (name) {\n        getCompByName(access, name).each(Disabling.disable);\n      };\n      var enable = function (name) {\n        getCompByName(access, name).each(Disabling.enable);\n      };\n      var focus = function (name) {\n        getCompByName(access, name).each(Focusing.focus);\n      };\n      var block = function (message) {\n        if (!isString(message)) {\n          throw new Error('The dialogInstanceAPI.block function should be passed a blocking message of type string as an argument');\n        }\n        withRoot(function (root) {\n          emitWith(root, formBlockEvent, { message: message });\n        });\n      };\n      var unblock = function () {\n        withRoot(function (root) {\n          emit(root, formUnblockEvent);\n        });\n      };\n      var showTab = function (name) {\n        withRoot(function (_) {\n          var body = access.getBody();\n          var bodyState = Reflecting.getState(body);\n          if (bodyState.get().exists(function (b) {\n              return b.isTabPanel();\n            })) {\n            Composing.getCurrent(body).each(function (tabSection) {\n              TabSection.showTab(tabSection, name);\n            });\n          }\n        });\n      };\n      var redial = function (d) {\n        withRoot(function (root) {\n          var dialogInit = doRedial(d);\n          root.getSystem().broadcastOn([dialogChannel], dialogInit);\n          root.getSystem().broadcastOn([titleChannel], dialogInit.internalDialog);\n          root.getSystem().broadcastOn([bodyChannel], dialogInit.internalDialog);\n          root.getSystem().broadcastOn([footerChannel], dialogInit.internalDialog);\n          instanceApi.setData(dialogInit.initialData);\n        });\n      };\n      var close = function () {\n        withRoot(function (root) {\n          emit(root, formCloseEvent);\n        });\n      };\n      var instanceApi = {\n        getData: getData,\n        setData: setData,\n        disable: disable,\n        enable: enable,\n        focus: focus,\n        block: block,\n        unblock: unblock,\n        showTab: showTab,\n        redial: redial,\n        close: close\n      };\n      return instanceApi;\n    };\n\n    var renderDialog$1 = function (dialogInit, extra, backstage) {\n      var header = getHeader(dialogInit.internalDialog.title, backstage);\n      var body = renderModalBody({ body: dialogInit.internalDialog.body }, backstage);\n      var storagedMenuButtons = mapMenuButtons(dialogInit.internalDialog.buttons);\n      var objOfCells = extractCellsToObject(storagedMenuButtons);\n      var footer = renderModalFooter({ buttons: storagedMenuButtons }, backstage);\n      var dialogEvents = SilverDialogEvents.initDialog(function () {\n        return instanceApi;\n      }, getEventExtras(function () {\n        return dialog;\n      }, extra), backstage.shared.getSink);\n      var dialogSize = dialogInit.internalDialog.size !== 'normal' ? dialogInit.internalDialog.size === 'large' ? ['tox-dialog--width-lg'] : ['tox-dialog--width-md'] : [];\n      var spec = {\n        header: header,\n        body: body,\n        footer: Option.some(footer),\n        extraClasses: dialogSize,\n        extraBehaviours: [],\n        extraStyles: {}\n      };\n      var dialog = renderModalDialog(spec, dialogInit, dialogEvents, backstage);\n      var modalAccess = function () {\n        var getForm = function () {\n          var outerForm = ModalDialog.getBody(dialog);\n          return Composing.getCurrent(outerForm).getOr(outerForm);\n        };\n        return {\n          getRoot: function () {\n            return dialog;\n          },\n          getBody: function () {\n            return ModalDialog.getBody(dialog);\n          },\n          getFooter: function () {\n            return ModalDialog.getFooter(dialog);\n          },\n          getFormWrapper: getForm\n        };\n      }();\n      var instanceApi = getDialogApi(modalAccess, extra.redial, objOfCells);\n      return {\n        dialog: dialog,\n        instanceApi: instanceApi\n      };\n    };\n\n    var renderInlineDialog = function (dialogInit, extra, backstage, ariaAttrs) {\n      var _a, _b;\n      var dialogLabelId = generate$1('dialog-label');\n      var dialogContentId = generate$1('dialog-content');\n      var updateState = function (_comp, incoming) {\n        return Option.some(incoming);\n      };\n      var memHeader = record(renderInlineHeader({\n        title: dialogInit.internalDialog.title,\n        draggable: true\n      }, dialogLabelId, backstage.shared.providers));\n      var memBody = record(renderInlineBody({ body: dialogInit.internalDialog.body }, dialogContentId, backstage, ariaAttrs));\n      var storagedMenuButtons = mapMenuButtons(dialogInit.internalDialog.buttons);\n      var objOfCells = extractCellsToObject(storagedMenuButtons);\n      var memFooter = record(renderInlineFooter({ buttons: storagedMenuButtons }, backstage));\n      var dialogEvents = SilverDialogEvents.initDialog(function () {\n        return instanceApi;\n      }, {\n        onBlock: function () {\n        },\n        onUnblock: function () {\n        },\n        onClose: function () {\n          return extra.closeWindow();\n        }\n      }, backstage.shared.getSink);\n      var dialog = build$1({\n        dom: {\n          tag: 'div',\n          classes: [\n            'tox-dialog',\n            'tox-dialog-inline'\n          ],\n          attributes: (_a = { role: 'dialog' }, _a['aria-labelledby'] = dialogLabelId, _a['aria-describedby'] = '' + dialogContentId, _a)\n        },\n        eventOrder: (_b = {}, _b[receive()] = [\n          Reflecting.name(),\n          Receiving.name()\n        ], _b[execute()] = ['execute-on-form'], _b[attachedToDom()] = [\n          'reflecting',\n          'execute-on-form'\n        ], _b),\n        behaviours: derive$1([\n          Keying.config({\n            mode: 'cyclic',\n            onEscape: function (c) {\n              emit(c, formCloseEvent);\n              return Option.some(true);\n            },\n            useTabstopAt: function (elem) {\n              return !NavigableObject.isPseudoStop(elem) && (name(elem) !== 'button' || get$2(elem, 'disabled') !== 'disabled');\n            }\n          }),\n          Reflecting.config({\n            channel: dialogChannel,\n            updateState: updateState,\n            initialData: dialogInit\n          }),\n          Focusing.config({}),\n          config('execute-on-form', dialogEvents.concat([runOnSource(focusin(), function (comp, se) {\n              Keying.focusIn(comp);\n            })])),\n          RepresentingConfigs.memory({})\n        ]),\n        components: [\n          memHeader.asSpec(),\n          memBody.asSpec(),\n          memFooter.asSpec()\n        ]\n      });\n      var instanceApi = getDialogApi({\n        getRoot: function () {\n          return dialog;\n        },\n        getFooter: function () {\n          return memFooter.get(dialog);\n        },\n        getBody: function () {\n          return memBody.get(dialog);\n        },\n        getFormWrapper: function () {\n          var body = memBody.get(dialog);\n          return Composing.getCurrent(body).getOr(body);\n        }\n      }, extra.redial, objOfCells);\n      return {\n        dialog: dialog,\n        instanceApi: instanceApi\n      };\n    };\n\n    var global$g = tinymce.util.Tools.resolve('tinymce.util.URI');\n\n    var getUrlDialogApi = function (root) {\n      var withRoot = function (f) {\n        if (root.getSystem().isConnected()) {\n          f(root);\n        }\n      };\n      var block = function (message) {\n        if (!isString(message)) {\n          throw new Error('The urlDialogInstanceAPI.block function should be passed a blocking message of type string as an argument');\n        }\n        withRoot(function (root) {\n          emitWith(root, formBlockEvent, { message: message });\n        });\n      };\n      var unblock = function () {\n        withRoot(function (root) {\n          emit(root, formUnblockEvent);\n        });\n      };\n      var close = function () {\n        withRoot(function (root) {\n          emit(root, formCloseEvent);\n        });\n      };\n      var sendMessage = function (data) {\n        withRoot(function (root) {\n          root.getSystem().broadcastOn([bodySendMessageChannel], data);\n        });\n      };\n      return {\n        block: block,\n        unblock: unblock,\n        close: close,\n        sendMessage: sendMessage\n      };\n    };\n\n    var SUPPORTED_MESSAGE_ACTIONS = [\n      'insertContent',\n      'setContent',\n      'execCommand',\n      'close',\n      'block',\n      'unblock'\n    ];\n    var isSupportedMessage = function (data) {\n      return isObject(data) && SUPPORTED_MESSAGE_ACTIONS.indexOf(data.mceAction) !== -1;\n    };\n    var isCustomMessage = function (data) {\n      return !isSupportedMessage(data) && isObject(data) && has(data, 'mceAction');\n    };\n    var handleMessage = function (editor, api, data) {\n      switch (data.mceAction) {\n      case 'insertContent':\n        editor.insertContent(data.content);\n        break;\n      case 'setContent':\n        editor.setContent(data.content);\n        break;\n      case 'execCommand':\n        var ui = isBoolean(data.ui) ? data.ui : false;\n        editor.execCommand(data.cmd, ui, data.value);\n        break;\n      case 'close':\n        api.close();\n        break;\n      case 'block':\n        api.block(data.message);\n        break;\n      case 'unblock':\n        api.unblock();\n        break;\n      }\n    };\n    var renderUrlDialog = function (internalDialog, extra, editor, backstage) {\n      var _a;\n      var header = getHeader(internalDialog.title, backstage);\n      var body = renderIframeBody(internalDialog);\n      var footer = internalDialog.buttons.bind(function (buttons) {\n        if (buttons.length === 0) {\n          return Option.none();\n        } else {\n          return Option.some(renderModalFooter({ buttons: buttons }, backstage));\n        }\n      });\n      var dialogEvents = SilverDialogEvents.initUrlDialog(function () {\n        return instanceApi;\n      }, getEventExtras(function () {\n        return dialog;\n      }, extra));\n      var styles = __assign(__assign({}, internalDialog.height.fold(function () {\n        return {};\n      }, function (height) {\n        return {\n          'height': height + 'px',\n          'max-height': height + 'px'\n        };\n      })), internalDialog.width.fold(function () {\n        return {};\n      }, function (width) {\n        return {\n          'width': width + 'px',\n          'max-width': width + 'px'\n        };\n      }));\n      var classes = internalDialog.width.isNone() && internalDialog.height.isNone() ? ['tox-dialog--width-lg'] : [];\n      var iframeUri = new global$g(internalDialog.url, { base_uri: new global$g(domGlobals.window.location.href) });\n      var iframeDomain = iframeUri.protocol + '://' + iframeUri.host + (iframeUri.port ? ':' + iframeUri.port : '');\n      var messageHandlerUnbinder = Cell(Option.none());\n      var extraBehaviours = [\n        config('messages', [\n          runOnAttached(function () {\n            var unbind = bind$3(Element.fromDom(domGlobals.window), 'message', function (e) {\n              if (iframeUri.isSameOrigin(new global$g(e.raw().origin))) {\n                var data = e.raw().data;\n                if (isSupportedMessage(data)) {\n                  handleMessage(editor, instanceApi, data);\n                } else if (isCustomMessage(data)) {\n                  internalDialog.onMessage(instanceApi, data);\n                }\n              }\n            });\n            messageHandlerUnbinder.set(Option.some(unbind));\n          }),\n          runOnDetached(function () {\n            messageHandlerUnbinder.get().each(function (unbinder) {\n              return unbinder.unbind();\n            });\n          })\n        ]),\n        Receiving.config({\n          channels: (_a = {}, _a[bodySendMessageChannel] = {\n            onReceive: function (comp, data) {\n              descendant$1(comp.element(), 'iframe').each(function (iframeEle) {\n                var iframeWin = iframeEle.dom().contentWindow;\n                iframeWin.postMessage(data, iframeDomain);\n              });\n            }\n          }, _a)\n        })\n      ];\n      var spec = {\n        header: header,\n        body: body,\n        footer: footer,\n        extraClasses: classes,\n        extraBehaviours: extraBehaviours,\n        extraStyles: styles\n      };\n      var dialog = renderModalDialog(spec, internalDialog, dialogEvents, backstage);\n      var instanceApi = getUrlDialogApi(dialog);\n      return {\n        dialog: dialog,\n        instanceApi: instanceApi\n      };\n    };\n\n    var setup$c = function (extras) {\n      var sharedBackstage = extras.backstage.shared;\n      var open = function (message, callback) {\n        var closeDialog = function () {\n          ModalDialog.hide(alertDialog);\n          callback();\n        };\n        var memFooterClose = record(renderFooterButton({\n          name: 'close-alert',\n          text: 'OK',\n          primary: true,\n          align: 'end',\n          disabled: false,\n          icon: Option.none()\n        }, 'cancel', extras.backstage));\n        var titleSpec = pUntitled();\n        var closeSpec = pClose(closeDialog, sharedBackstage.providers);\n        var alertDialog = build$1(renderDialog({\n          lazySink: function () {\n            return sharedBackstage.getSink();\n          },\n          header: hiddenHeader(titleSpec, closeSpec),\n          body: pBodyMessage(message, sharedBackstage.providers),\n          footer: Option.some(pFooter(pFooterGroup([], [memFooterClose.asSpec()]))),\n          onEscape: closeDialog,\n          extraClasses: ['tox-alert-dialog'],\n          extraBehaviours: [],\n          extraStyles: {},\n          dialogEvents: [run(formCancelEvent, closeDialog)],\n          eventOrder: {}\n        }));\n        ModalDialog.show(alertDialog);\n        var footerCloseButton = memFooterClose.get(alertDialog);\n        Focusing.focus(footerCloseButton);\n      };\n      return { open: open };\n    };\n\n    var setup$d = function (extras) {\n      var sharedBackstage = extras.backstage.shared;\n      var open = function (message, callback) {\n        var closeDialog = function (state) {\n          ModalDialog.hide(confirmDialog);\n          callback(state);\n        };\n        var memFooterYes = record(renderFooterButton({\n          name: 'yes',\n          text: 'Yes',\n          primary: true,\n          align: 'end',\n          disabled: false,\n          icon: Option.none()\n        }, 'submit', extras.backstage));\n        var footerNo = renderFooterButton({\n          name: 'no',\n          text: 'No',\n          primary: false,\n          align: 'end',\n          disabled: false,\n          icon: Option.none()\n        }, 'cancel', extras.backstage);\n        var titleSpec = pUntitled();\n        var closeSpec = pClose(function () {\n          return closeDialog(false);\n        }, sharedBackstage.providers);\n        var confirmDialog = build$1(renderDialog({\n          lazySink: function () {\n            return sharedBackstage.getSink();\n          },\n          header: hiddenHeader(titleSpec, closeSpec),\n          body: pBodyMessage(message, sharedBackstage.providers),\n          footer: Option.some(pFooter(pFooterGroup([], [\n            footerNo,\n            memFooterYes.asSpec()\n          ]))),\n          onEscape: function () {\n            return closeDialog(false);\n          },\n          extraClasses: ['tox-confirm-dialog'],\n          extraBehaviours: [],\n          extraStyles: {},\n          dialogEvents: [\n            run(formCancelEvent, function () {\n              return closeDialog(false);\n            }),\n            run(formSubmitEvent, function () {\n              return closeDialog(true);\n            })\n          ],\n          eventOrder: {}\n        }));\n        ModalDialog.show(confirmDialog);\n        var footerYesButton = memFooterYes.get(confirmDialog);\n        Focusing.focus(footerYesButton);\n      };\n      return { open: open };\n    };\n\n    var validateData$1 = function (data, validator) {\n      return getOrDie(asRaw('data', validator, data));\n    };\n    var isAlertOrConfirmDialog = function (target) {\n      return closest$4(target, '.tox-alert-dialog') || closest$4(target, '.tox-confirm-dialog');\n    };\n    var inlineAdditionalBehaviours = function (editor, isStickyToolbar, isToolbarLocationTop) {\n      if (isStickyToolbar && isToolbarLocationTop) {\n        return [];\n      } else {\n        return [Docking.config({\n            contextual: {\n              lazyContext: function () {\n                return Option.some(box(Element.fromDom(editor.getContentAreaContainer())));\n              },\n              fadeInClass: 'tox-dialog-dock-fadein',\n              fadeOutClass: 'tox-dialog-dock-fadeout',\n              transitionClass: 'tox-dialog-dock-transition'\n            },\n            modes: ['top']\n          })];\n      }\n    };\n    var setup$e = function (extras) {\n      var backstage = extras.backstage;\n      var editor = extras.editor;\n      var isStickyToolbar$1 = isStickyToolbar(editor);\n      var isToolbarLocationTop$1 = isToolbarLocationTop(editor);\n      var alertDialog = setup$c(extras);\n      var confirmDialog = setup$d(extras);\n      var open = function (config, params, closeWindow) {\n        if (params !== undefined && params.inline === 'toolbar') {\n          return openInlineDialog(config, backstage.shared.anchors.inlineDialog(), closeWindow, params.ariaAttrs);\n        } else if (params !== undefined && params.inline === 'cursor') {\n          return openInlineDialog(config, backstage.shared.anchors.cursor(), closeWindow, params.ariaAttrs);\n        } else {\n          return openModalDialog(config, closeWindow);\n        }\n      };\n      var openUrl = function (config, closeWindow) {\n        return openModalUrlDialog(config, closeWindow);\n      };\n      var openModalUrlDialog = function (config, closeWindow) {\n        var factory = function (contents) {\n          var dialog = renderUrlDialog(contents, {\n            closeWindow: function () {\n              ModalDialog.hide(dialog.dialog);\n              closeWindow(dialog.instanceApi);\n            }\n          }, editor, backstage);\n          ModalDialog.show(dialog.dialog);\n          return dialog.instanceApi;\n        };\n        return DialogManager.openUrl(factory, config);\n      };\n      var openModalDialog = function (config, closeWindow) {\n        var factory = function (contents, internalInitialData, dataValidator) {\n          var initialData = internalInitialData;\n          var dialogInit = {\n            dataValidator: dataValidator,\n            initialData: initialData,\n            internalDialog: contents\n          };\n          var dialog = renderDialog$1(dialogInit, {\n            redial: DialogManager.redial,\n            closeWindow: function () {\n              ModalDialog.hide(dialog.dialog);\n              closeWindow(dialog.instanceApi);\n            }\n          }, backstage);\n          ModalDialog.show(dialog.dialog);\n          dialog.instanceApi.setData(initialData);\n          return dialog.instanceApi;\n        };\n        return DialogManager.open(factory, config);\n      };\n      var openInlineDialog = function (config$1, anchor, closeWindow, ariaAttrs) {\n        var factory = function (contents, internalInitialData, dataValidator) {\n          var initialData = validateData$1(internalInitialData, dataValidator);\n          var inlineDialog = value$3();\n          var dialogInit = {\n            dataValidator: dataValidator,\n            initialData: initialData,\n            internalDialog: contents\n          };\n          var refreshDocking = function () {\n            return inlineDialog.on(function (dialog) {\n              InlineView.reposition(dialog);\n              Docking.refresh(dialog);\n            });\n          };\n          var dialogUi = renderInlineDialog(dialogInit, {\n            redial: DialogManager.redial,\n            closeWindow: function () {\n              inlineDialog.on(InlineView.hide);\n              editor.off('ResizeEditor', refreshDocking);\n              inlineDialog.clear();\n              closeWindow(dialogUi.instanceApi);\n            }\n          }, backstage, ariaAttrs);\n          var inlineDialogComp = build$1(InlineView.sketch(__assign(__assign({\n            lazySink: backstage.shared.getSink,\n            dom: {\n              tag: 'div',\n              classes: []\n            },\n            fireDismissalEventInstead: {}\n          }, isToolbarLocationTop$1 ? {} : { fireRepositionEventInstead: {} }), {\n            inlineBehaviours: derive$1(__spreadArrays([config('window-manager-inline-events', [run(dismissRequested(), function (comp, se) {\n                  emit(dialogUi.dialog, formCancelEvent);\n                })])], inlineAdditionalBehaviours(editor, isStickyToolbar$1, isToolbarLocationTop$1))),\n            isExtraPart: function (comp, target) {\n              return isAlertOrConfirmDialog(target);\n            }\n          })));\n          inlineDialog.set(inlineDialogComp);\n          InlineView.showWithin(inlineDialogComp, anchor, premade$1(dialogUi.dialog), Option.some(body()));\n          if (!isStickyToolbar$1 || !isToolbarLocationTop$1) {\n            Docking.refresh(inlineDialogComp);\n            editor.on('ResizeEditor', refreshDocking);\n          }\n          dialogUi.instanceApi.setData(initialData);\n          Keying.focusIn(dialogUi.dialog);\n          return dialogUi.instanceApi;\n        };\n        return DialogManager.open(factory, config$1);\n      };\n      var confirm = function (message, callback) {\n        confirmDialog.open(message, function (state) {\n          callback(state);\n        });\n      };\n      var alert = function (message, callback) {\n        alertDialog.open(message, function () {\n          callback();\n        });\n      };\n      var close = function (instanceApi) {\n        instanceApi.close();\n      };\n      return {\n        open: open,\n        openUrl: openUrl,\n        alert: alert,\n        close: close,\n        confirm: confirm\n      };\n    };\n    var WindowManager = { setup: setup$e };\n\n    function Theme () {\n      global$1.add('silver', function (editor) {\n        var _a = Render.setup(editor), uiMothership = _a.uiMothership, backstage = _a.backstage, renderUI = _a.renderUI, getUi = _a.getUi;\n        Autocompleter.register(editor, backstage.shared);\n        var windowMgr = WindowManager.setup({\n          editor: editor,\n          backstage: backstage\n        });\n        return {\n          renderUI: renderUI,\n          getWindowManagerImpl: constant(windowMgr),\n          getNotificationManagerImpl: function () {\n            return NotificationManagerImpl(editor, { backstage: backstage }, uiMothership);\n          },\n          ui: getUi()\n        };\n      });\n    }\n\n    Theme();\n\n}(window));\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function () {\n    'use strict';\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.Env');\n\n    var getSeparatorHtml = function (editor) {\n      return editor.getParam('pagebreak_separator', '<!-- pagebreak -->');\n    };\n    var shouldSplitBlock = function (editor) {\n      return editor.getParam('pagebreak_split_block', false);\n    };\n    var Settings = {\n      getSeparatorHtml: getSeparatorHtml,\n      shouldSplitBlock: shouldSplitBlock\n    };\n\n    var getPageBreakClass = function () {\n      return 'mce-pagebreak';\n    };\n    var getPlaceholderHtml = function () {\n      return '<img src=\"' + global$1.transparentSrc + '\" class=\"' + getPageBreakClass() + '\" data-mce-resize=\"false\" data-mce-placeholder />';\n    };\n    var setup = function (editor) {\n      var separatorHtml = Settings.getSeparatorHtml(editor);\n      var pageBreakSeparatorRegExp = new RegExp(separatorHtml.replace(/[\\?\\.\\*\\[\\]\\(\\)\\{\\}\\+\\^\\$\\:]/g, function (a) {\n        return '\\\\' + a;\n      }), 'gi');\n      editor.on('BeforeSetContent', function (e) {\n        e.content = e.content.replace(pageBreakSeparatorRegExp, getPlaceholderHtml());\n      });\n      editor.on('PreInit', function () {\n        editor.serializer.addNodeFilter('img', function (nodes) {\n          var i = nodes.length, node, className;\n          while (i--) {\n            node = nodes[i];\n            className = node.attr('class');\n            if (className && className.indexOf('mce-pagebreak') !== -1) {\n              var parentNode = node.parent;\n              if (editor.schema.getBlockElements()[parentNode.name] && Settings.shouldSplitBlock(editor)) {\n                parentNode.type = 3;\n                parentNode.value = separatorHtml;\n                parentNode.raw = true;\n                node.remove();\n                continue;\n              }\n              node.type = 3;\n              node.value = separatorHtml;\n              node.raw = true;\n            }\n          }\n        });\n      });\n    };\n    var FilterContent = {\n      setup: setup,\n      getPlaceholderHtml: getPlaceholderHtml,\n      getPageBreakClass: getPageBreakClass\n    };\n\n    var register = function (editor) {\n      editor.addCommand('mcePageBreak', function () {\n        if (editor.settings.pagebreak_split_block) {\n          editor.insertContent('<p>' + FilterContent.getPlaceholderHtml() + '</p>');\n        } else {\n          editor.insertContent(FilterContent.getPlaceholderHtml());\n        }\n      });\n    };\n    var Commands = { register: register };\n\n    var setup$1 = function (editor) {\n      editor.on('ResolveName', function (e) {\n        if (e.target.nodeName === 'IMG' && editor.dom.hasClass(e.target, FilterContent.getPageBreakClass())) {\n          e.name = 'pagebreak';\n        }\n      });\n    };\n    var ResolveName = { setup: setup$1 };\n\n    var register$1 = function (editor) {\n      editor.ui.registry.addButton('pagebreak', {\n        icon: 'page-break',\n        tooltip: 'Page break',\n        onAction: function () {\n          return editor.execCommand('mcePageBreak');\n        }\n      });\n      editor.ui.registry.addMenuItem('pagebreak', {\n        text: 'Page break',\n        icon: 'page-break',\n        onAction: function () {\n          return editor.execCommand('mcePageBreak');\n        }\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global.add('pagebreak', function (editor) {\n        Commands.register(editor);\n        Buttons.register(editor);\n        FilterContent.setup(editor);\n        ResolveName.setup(editor);\n      });\n    }\n\n    Plugin();\n\n}());\n","// Exports the \"silver\" theme for usage with module loaders\n// Usage:\n//   CommonJS:\n//     require('tinymce/themes/silver')\n//   ES2015:\n//     import 'tinymce/themes/silver'\nrequire('./theme.js');","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"interface-wysiwyg\"},[_c('Editor',{ref:\"editorElement\",attrs:{\"init\":_vm.initOptions,\"value\":_vm.value},on:{\"onKeyUp\":_vm.updateValue,\"onExecCommand\":_vm.updateValue,\"onBlur\":_vm.updateValue,\"onPaste\":_vm.updateValue,\"onUndo\":_vm.updateValue,\"onRedo\":_vm.updateValue}}),(_vm.newInlineFile)?_c('v-modal',{attrs:{\"title\":_vm.$t('file_upload'),\"buttons\":{\n\t\t\tdone: {\n\t\t\t\ttext: _vm.$t('done')\n\t\t\t}\n\t\t}},on:{\"close\":function($event){_vm.newInlineFile = false},\"done\":_vm.selectCallback}},[_c('div',{staticClass:\"body\"},[_c('v-ext-input',{attrs:{\"id\":\"file\",\"name\":\"file\",\"required\":false,\"readonly\":false,\"options\":_vm.fileInputOptions,\"type\":\"file\",\"datatype\":\"INT\",\"value\":_vm.selectedFile,\"relation\":_vm.relation,\"fields\":null,\"collection\":\"directus_files\",\"values\":null,\"length\":10,\"new-item\":_vm.newItem,\"width\":\"full\"},on:{\"input\":function($event){_vm.selectedFile = $event}}})],1)]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * Copyright (c) 2018-present, Ephox, Inc.\n *\n * This source code is licensed under the Apache 2 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nvar validEvents = [\n    'onActivate',\n    'onAddUndo',\n    'onBeforeAddUndo',\n    'onBeforeExecCommand',\n    'onBeforeGetContent',\n    'onBeforeRenderUI',\n    'onBeforeSetContent',\n    'onBeforePaste',\n    'onBlur',\n    'onChange',\n    'onClearUndos',\n    'onClick',\n    'onContextMenu',\n    'onCopy',\n    'onCut',\n    'onDblclick',\n    'onDeactivate',\n    'onDirty',\n    'onDrag',\n    'onDragDrop',\n    'onDragEnd',\n    'onDragGesture',\n    'onDragOver',\n    'onDrop',\n    'onExecCommand',\n    'onFocus',\n    'onFocusIn',\n    'onFocusOut',\n    'onGetContent',\n    'onHide',\n    'onInit',\n    'onKeyDown',\n    'onKeyPress',\n    'onKeyUp',\n    'onLoadContent',\n    'onMouseDown',\n    'onMouseEnter',\n    'onMouseLeave',\n    'onMouseMove',\n    'onMouseOut',\n    'onMouseOver',\n    'onMouseUp',\n    'onNodeChange',\n    'onObjectResizeStart',\n    'onObjectResized',\n    'onObjectSelected',\n    'onPaste',\n    'onPostProcess',\n    'onPostRender',\n    'onPreProcess',\n    'onProgressState',\n    'onRedo',\n    'onRemove',\n    'onReset',\n    'onSaveContent',\n    'onSelectionChange',\n    'onSetAttrib',\n    'onSetContent',\n    'onShow',\n    'onSubmit',\n    'onUndo',\n    'onVisualAid'\n];\nvar isValidKey = function (key) { return validEvents.indexOf(key) !== -1; };\nexport var bindHandlers = function (initEvent, listeners, editor) {\n    Object.keys(listeners)\n        .filter(isValidKey)\n        .forEach(function (key) {\n        var handler = listeners[key];\n        if (typeof handler === 'function') {\n            if (key === 'onInit') {\n                handler(initEvent, editor);\n            }\n            else {\n                editor.on(key.substring(2), function (e) { return handler(e, editor); });\n            }\n        }\n    });\n};\nexport var bindModelHandlers = function (ctx, editor) {\n    var modelEvents = ctx.$props.modelEvents ? ctx.$props.modelEvents : null;\n    var normalizedEvents = Array.isArray(modelEvents) ? modelEvents.join(' ') : modelEvents;\n    var currentContent;\n    ctx.$watch('value', function (val, prevVal) {\n        if (editor && typeof val === 'string' && val !== currentContent && val !== prevVal) {\n            editor.setContent(val);\n            currentContent = val;\n        }\n    });\n    editor.on(normalizedEvents ? normalizedEvents : 'change keyup undo redo', function () {\n        currentContent = editor.getContent();\n        ctx.$emit('input', currentContent);\n    });\n};\nexport var initEditor = function (initEvent, ctx, editor) {\n    var value = ctx.$props.value ? ctx.$props.value : '';\n    var initialValue = ctx.$props.initialValue ? ctx.$props.initialValue : '';\n    editor.setContent(value || initialValue);\n    // checks if the v-model shorthand is used (which sets an v-on:input listener) and then binds either\n    // specified the events or defaults to \"change keyup\" event and emits the editor content on that event\n    if (ctx.$listeners.input) {\n        bindModelHandlers(ctx, editor);\n    }\n    bindHandlers(initEvent, ctx.$listeners, editor);\n};\nvar unique = 0;\nexport var uuid = function (prefix) {\n    var time = Date.now();\n    var random = Math.floor(Math.random() * 1000000000);\n    unique++;\n    return prefix + '_' + random + unique + String(time);\n};\nexport var isTextarea = function (element) {\n    return element !== null && element.tagName.toLowerCase() === 'textarea';\n};\nvar normalizePluginArray = function (plugins) {\n    if (typeof plugins === 'undefined' || plugins === '') {\n        return [];\n    }\n    return Array.isArray(plugins) ? plugins : plugins.split(' ');\n};\nexport var mergePlugins = function (initPlugins, inputPlugins) {\n    return normalizePluginArray(initPlugins).concat(normalizePluginArray(inputPlugins));\n};\n","/**\n * Copyright (c) 2018-present, Ephox, Inc.\n *\n * This source code is licensed under the Apache 2 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport { uuid } from './Utils';\nvar injectScriptTag = function (scriptId, doc, url, callback) {\n    var scriptTag = doc.createElement('script');\n    scriptTag.referrerPolicy = 'origin';\n    scriptTag.type = 'application/javascript';\n    scriptTag.id = scriptId;\n    scriptTag.addEventListener('load', callback);\n    scriptTag.src = url;\n    if (doc.head) {\n        doc.head.appendChild(scriptTag);\n    }\n};\nexport var create = function () {\n    return {\n        listeners: [],\n        scriptId: uuid('tiny-script'),\n        scriptLoaded: false\n    };\n};\nexport var load = function (state, doc, url, callback) {\n    if (state.scriptLoaded) {\n        callback();\n    }\n    else {\n        state.listeners.push(callback);\n        if (!doc.getElementById(state.scriptId)) {\n            injectScriptTag(state.scriptId, doc, url, function () {\n                state.listeners.forEach(function (fn) { return fn(); });\n                state.scriptLoaded = true;\n            });\n        }\n    }\n};\n","/**\n * Copyright (c) 2018-present, Ephox, Inc.\n *\n * This source code is licensed under the Apache 2 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nexport var editorProps = {\n    apiKey: String,\n    cloudChannel: String,\n    id: String,\n    init: Object,\n    initialValue: String,\n    inline: Boolean,\n    modelEvents: [String, Array],\n    plugins: [String, Array],\n    tagName: String,\n    toolbar: [String, Array],\n    value: String,\n    disabled: Boolean\n};\n","/**\n * Copyright (c) 2018-present, Ephox, Inc.\n *\n * This source code is licensed under the Apache 2 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nimport * as ScriptLoader from '../ScriptLoader';\nimport { getTinymce } from '../TinyMCE';\nimport { initEditor, isTextarea, mergePlugins, uuid } from '../Utils';\nimport { editorProps } from './EditorPropTypes';\nvar scriptState = ScriptLoader.create();\nvar renderInline = function (h, id, tagName) {\n    return h(tagName ? tagName : 'div', {\n        attrs: { id: id }\n    });\n};\nvar renderIframe = function (h, id) {\n    return h('textarea', {\n        attrs: { id: id },\n        style: { visibility: 'hidden' }\n    });\n};\nvar initialise = function (ctx) { return function () {\n    var finalInit = __assign({}, ctx.$props.init, { readonly: ctx.$props.disabled, selector: \"#\" + ctx.elementId, plugins: mergePlugins(ctx.$props.init && ctx.$props.init.plugins, ctx.$props.plugins), toolbar: ctx.$props.toolbar || (ctx.$props.init && ctx.$props.init.toolbar), inline: ctx.inlineEditor, setup: function (editor) {\n            ctx.editor = editor;\n            editor.on('init', function (e) { return initEditor(e, ctx, editor); });\n            if (ctx.$props.init && typeof ctx.$props.init.setup === 'function') {\n                ctx.$props.init.setup(editor);\n            }\n        } });\n    if (isTextarea(ctx.element)) {\n        ctx.element.style.visibility = '';\n    }\n    getTinymce().init(finalInit);\n}; };\nexport var Editor = {\n    props: editorProps,\n    created: function () {\n        this.elementId = this.$props.id || uuid('tiny-vue');\n        this.inlineEditor = (this.$props.init && this.$props.init.inline) || this.$props.inline;\n    },\n    watch: {\n        disabled: function () {\n            this.editor.setMode(this.disabled ? 'readonly' : 'design');\n        }\n    },\n    mounted: function () {\n        this.element = this.$el;\n        if (getTinymce() !== null) {\n            initialise(this)();\n        }\n        else if (this.element && this.element.ownerDocument) {\n            var doc = this.element.ownerDocument;\n            var channel = this.$props.cloudChannel ? this.$props.cloudChannel : '5';\n            var apiKey = this.$props.apiKey ? this.$props.apiKey : 'no-api-key';\n            ScriptLoader.load(scriptState, doc, \"https://cdn.tiny.cloud/1/\" + apiKey + \"/tinymce/\" + channel + \"/tinymce.min.js\", initialise(this));\n        }\n    },\n    beforeDestroy: function () {\n        if (getTinymce() !== null) {\n            getTinymce().remove(this.editor);\n        }\n    },\n    render: function (h) {\n        return this.inlineEditor ? renderInline(h, this.elementId, this.$props.tagName) : renderIframe(h, this.elementId);\n    }\n};\n","/**\n * Copyright (c) 2018-present, Ephox, Inc.\n *\n * This source code is licensed under the Apache 2 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport { Editor } from './components/Editor';\nexport default Editor;\n","<template>\n\t<div class=\"interface-wysiwyg\">\n\t\t<Editor\n\t\t\tref=\"editorElement\"\n\t\t\t:init=\"initOptions\"\n\t\t\t:value=\"value\"\n\t\t\t@onKeyUp=\"updateValue\"\n\t\t\t@onExecCommand=\"updateValue\"\n\t\t\t@onBlur=\"updateValue\"\n\t\t\t@onPaste=\"updateValue\"\n\t\t\t@onUndo=\"updateValue\"\n\t\t\t@onRedo=\"updateValue\"\n\t\t/>\n\t\t<v-modal\n\t\t\tv-if=\"newInlineFile\"\n\t\t\t:title=\"$t('file_upload')\"\n\t\t\t:buttons=\"{\n\t\t\t\tdone: {\n\t\t\t\t\ttext: $t('done')\n\t\t\t\t}\n\t\t\t}\"\n\t\t\t@close=\"newInlineFile = false\"\n\t\t\t@done=\"selectCallback\"\n\t\t>\n\t\t\t<div class=\"body\">\n\t\t\t\t<v-ext-input\n\t\t\t\t\tid=\"file\"\n\t\t\t\t\tname=\"file\"\n\t\t\t\t\t:required=\"false\"\n\t\t\t\t\t:readonly=\"false\"\n\t\t\t\t\t:options=\"fileInputOptions\"\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\tdatatype=\"INT\"\n\t\t\t\t\t:value=\"selectedFile\"\n\t\t\t\t\t:relation=\"relation\"\n\t\t\t\t\t:fields=\"null\"\n\t\t\t\t\tcollection=\"directus_files\"\n\t\t\t\t\t:values=\"null\"\n\t\t\t\t\t:length=\"10\"\n\t\t\t\t\t:new-item=\"newItem\"\n\t\t\t\t\twidth=\"full\"\n\t\t\t\t\t@input=\"selectedFile = $event\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</v-modal>\n\t</div>\n</template>\n\n<script>\nimport mixin from '@directus/extension-toolkit/mixins/interface';\n\nimport 'tinymce/tinymce';\nimport 'tinymce/themes/silver';\nimport 'tinymce/plugins/media/plugin';\nimport 'tinymce/plugins/table/plugin';\nimport 'tinymce/plugins/hr/plugin';\nimport 'tinymce/plugins/lists/plugin';\nimport 'tinymce/plugins/image/plugin';\nimport 'tinymce/plugins/imagetools/plugin';\nimport 'tinymce/plugins/link/plugin';\nimport 'tinymce/plugins/pagebreak/plugin';\nimport 'tinymce/plugins/code/plugin';\nimport 'tinymce/plugins/insertdatetime/plugin';\nimport 'tinymce/plugins/autoresize/plugin';\nimport 'tinymce/plugins/paste/plugin';\nimport 'tinymce/plugins/preview/plugin';\nimport 'tinymce/plugins/fullscreen/plugin';\nimport 'tinymce/plugins/directionality/plugin';\n\nimport Editor from '@tinymce/tinymce-vue';\nimport { debounce } from 'lodash';\n\nfunction cssVar(name) {\n\treturn getComputedStyle(document.body).getPropertyValue(name);\n}\n\nexport default {\n\tcomponents: {\n\t\tEditor\n\t},\n\tmixins: [mixin],\n\tdata() {\n\t\treturn {\n\t\t\tnewInlineFile: false,\n\t\t\tselectedFile: null,\n\t\t\tselectCallback: () => {}\n\t\t};\n\t},\n\tcomputed: {\n\t\tfileInputOptions() {\n\t\t\treturn {\n\t\t\t\tviewOptions: {\n\t\t\t\t\tcontent: 'description',\n\t\t\t\t\tsrc: 'data',\n\t\t\t\t\tsubtitle: 'type',\n\t\t\t\t\ttitle: 'title'\n\t\t\t\t},\n\t\t\t\tviewType: 'cards'\n\t\t\t};\n\t\t},\n\t\tinitOptions() {\n\t\t\tconst styleFormats = this.getStyleFormats();\n\t\t\tlet toolbarString = this.options.toolbar.join(' ');\n\n\t\t\tif (styleFormats) {\n\t\t\t\ttoolbarString += ' styleselect';\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tskin: false,\n\t\t\t\tskin_url: false,\n\t\t\t\tcontent_css: false,\n\t\t\t\tcontent_style: this.contentStyle,\n\t\t\t\tplugins:\n\t\t\t\t\t'media table hr lists image link pagebreak code insertdatetime autoresize paste preview fullscreen directionality',\n\t\t\t\tbranding: false,\n\t\t\t\tmax_height: 1000,\n\t\t\t\telementpath: false,\n\t\t\t\tstatusbar: false,\n\t\t\t\tmenubar: false,\n\t\t\t\tconvert_urls: false,\n\t\t\t\treadonly: this.readonly,\n\t\t\t\textended_valid_elements: 'audio[loop],source',\n\t\t\t\ttoolbar: toolbarString,\n\t\t\t\tstyle_formats: styleFormats,\n\t\t\t\tfile_picker_callback: this.selectFile,\n\t\t\t\t...this.options.tinymce_options\n\t\t\t};\n\t\t},\n\t\tcontentStyle() {\n\t\t\treturn `\n        body {\n          color: ${cssVar('--input-text-color')};\n          background-color: ${cssVar('--input-background-color')};\n          margin: 20px;\n          font-family: 'Roboto', sans-serif;\n          -webkit-font-smoothing: antialiased;\n          text-rendering: optimizeLegibility;\n          -moz-osx-font-smoothing: grayscale;\n        }\n        h1 {\n          font-family: 'Merriweather', serif;\n          font-size: 44px;\n          line-height: 52px;\n          font-weight: 300;\n          margin-bottom: 0;\n        }\n        h2 {\n          font-size: 34px;\n          line-height: 38px;\n          font-weight: 600;\n          margin-top: 60px;\n          margin-bottom: 0;\n        }\n        h3 {\n          font-size: 26px;\n          line-height: 31px;\n          font-weight: 600;\n          margin-top: 40px;\n          margin-bottom: 0;\n        }\n        h4 {\n          font-size: 22px;\n          line-height: 28px;\n          font-weight: 600;\n          margin-top: 40px;\n          margin-bottom: 0;\n        }\n        h5 {\n          font-size: 18px;\n          line-height: 26px;\n          font-weight: 600;\n          margin-top: 40px;\n          margin-bottom: 0;\n        }\n        h6 {\n          font-size: 16px;\n          line-height: 24px;\n          font-weight: 600;\n          margin-top: 40px;\n          margin-bottom: 0;\n        }\n        p {\n          font-family: 'Merriweather', serif;\n          font-size: 16px;\n          line-height: 32px;\n          margin-top: 20px;\n          margin-bottom: 20px;\n        }\n        a {\n          color: #546e7a;\n        }\n        ul,ol {\n          font-family: 'Merriweather', serif;\n          font-size: 18px;\n          line-height: 34px;\n          margin: 24px 0;\n        }\n        ul ul,\n        ol ol,\n        ul ol,\n        ol ul {\n          margin: 0;\n        }\n        b,strong {\n          font-weight: 600;\n        }\n        code {\n          font-size: 18px;\n          line-height: 34px;\n          padding: 2px 4px;\n          font-family: 'Roboto Mono', monospace;\n          background-color: #eceff1;\n          border-radius: 3px;\n          overflow-wrap: break-word;\n        }\n        pre {\n          font-size: 18px;\n          line-height: 24px;\n          padding: 20px;\n          font-family: 'Roboto Mono', monospace;\n          background-color: #eceff1;\n          border-radius: 3px;\n          overflow: auto;\n        }\n        blockquote {\n          font-family: 'Merriweather', serif;\n          font-size: 18px;\n          line-height: 34px;\n          border-left: 2px solid #546e7a;\n          padding-left: 10px;\n          margin-left: -10px;\n          font-style: italic;\n        }\n        video,\n        iframe,\n        img {\n          max-width: 100%;\n          border-radius: 3px;\n          height: auto;\n        }\n        hr {\n          border: 0;\n          margin-top: 52px;\n          margin-bottom: 56px;\n          text-align: center;\n        }\n        hr:after {\n          content: \"...\";\n          font-size: 28px;\n          letter-spacing: 16px;\n          line-height: 0;\n        }\n        table {\n          border-collapse: collapse;\n        }\n        table th,\n        table td {\n          border: 1px solid #cfd8dc;\n          padding: 0.4rem;\n        }\n        figure {\n          display: table;\n          margin: 1rem auto;\n        }\n        figure figcaption {\n          color: #999;\n          display: block;\n          margin-top: 0.25rem;\n          text-align: center;\n        }\n      `;\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.updateValue = debounce(this.updateValue, 200);\n\t},\n\tmethods: {\n\t\tupdateValue() {\n\t\t\tconst editor = this.$refs.editorElement.editor;\n\t\t\tconst newValue = editor.getContent();\n\t\t\tthis.$emit('input', newValue);\n\t\t},\n\t\tgetStyleFormats() {\n\t\t\tif (\n\t\t\t\tArray.isArray(this.options.custom_formats) &&\n\t\t\t\tthis.options.custom_formats.length > 0\n\t\t\t) {\n\t\t\t\treturn this.options.custom_formats;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tselectFile(callback) {\n\t\t\tthis.newInlineFile = true;\n\t\t\tthis.selectCallback = async () => {\n\t\t\t\tlet id;\n\n\t\t\t\tif (typeof this.selectedFile === 'object') {\n\t\t\t\t\tid = this.selectedFile.id;\n\t\t\t\t} else {\n\t\t\t\t\tid = this.selectedFile;\n\t\t\t\t}\n\n\t\t\t\tconst { data: file } = await this.$api.getItem('directus_files', id);\n\t\t\t\tthis.newInlineFile = false;\n\n\t\t\t\t// TODO: Make sure it returns the correct keys for non-image type files. See\n\t\t\t\t// https://www.tiny.cloud/docs/configure/file-image-upload/#example for an example\n\t\t\t\tcallback(file.data.full_url, { alt: file.title });\n\n\t\t\t\t// Empty the selectedfile so the file isn't selected again when you add an additional file\n\t\t\t\tthis.selectedFile = null;\n\t\t\t};\n\t\t}\n\t}\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.body {\n\tpadding: 20px;\n}\n\n// The content CSS is not scoped, but is also not needed.\n// The CSS below can be referenced for other core editor\n// styles we might want to include in our override.\n\n// @import \"~tinymce/skins/ui/oxide/content.css\";\n// @import \"~tinymce/skins/content/default/content.css\";\n\n@import '~tinymce/skins/ui/oxide/skin.css';\n@import './tinymce-overrides.css';\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./input.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./input.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./input.vue?vue&type=template&id=5895c425&scoped=true&\"\nimport script from \"./input.vue?vue&type=script&lang=js&\"\nexport * from \"./input.vue?vue&type=script&lang=js&\"\nimport style0 from \"./input.vue?vue&type=style&index=0&id=5895c425&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5895c425\",\n  null\n  \n)\n\nexport default component.exports","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var noop = function () {\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var not = function (f) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return !f.apply(null, args);\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isString = isType('string');\n    var isArray = isType('array');\n    var isBoolean = isType('boolean');\n    var isFunction = isType('function');\n    var isNumber = isType('number');\n\n    var nativeSlice = Array.prototype.slice;\n    var nativePush = Array.prototype.push;\n    var map = function (xs, f) {\n      var len = xs.length;\n      var r = new Array(len);\n      for (var i = 0; i < len; i++) {\n        var x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    var each = function (xs, f) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var filter = function (xs, pred) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n    var groupBy = function (xs, f) {\n      if (xs.length === 0) {\n        return [];\n      } else {\n        var wasType = f(xs[0]);\n        var r = [];\n        var group = [];\n        for (var i = 0, len = xs.length; i < len; i++) {\n          var x = xs[i];\n          var type = f(x);\n          if (type !== wasType) {\n            r.push(group);\n            group = [];\n          }\n          wasType = type;\n          group.push(x);\n        }\n        if (group.length !== 0) {\n          r.push(group);\n        }\n        return r;\n      }\n    };\n    var foldl = function (xs, f, acc) {\n      each(xs, function (x) {\n        acc = f(acc, x);\n      });\n      return acc;\n    };\n    var find = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return Option.some(x);\n        }\n      }\n      return Option.none();\n    };\n    var flatten = function (xs) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    var bind = function (xs, f) {\n      return flatten(map(xs, f));\n    };\n    var reverse = function (xs) {\n      var r = nativeSlice.call(xs, 0);\n      r.reverse();\n      return r;\n    };\n    var head = function (xs) {\n      return xs.length === 0 ? Option.none() : Option.some(xs[0]);\n    };\n    var last = function (xs) {\n      return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]);\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n\n    var compareDocumentPosition = function (a, b, match) {\n      return (a.compareDocumentPosition(b) & match) !== 0;\n    };\n    var documentPositionPreceding = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING);\n    };\n    var documentPositionContainedBy = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY);\n    };\n    var Node = {\n      documentPositionPreceding: documentPositionPreceding,\n      documentPositionContainedBy: documentPositionContainedBy\n    };\n\n    var __assign = function () {\n      __assign = Object.assign || function __assign(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p))\n              t[p] = s[p];\n        }\n        return t;\n      };\n      return __assign.apply(this, arguments);\n    };\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var firstMatch = function (regexes, s) {\n      for (var i = 0; i < regexes.length; i++) {\n        var x = regexes[i];\n        if (x.test(s)) {\n          return x;\n        }\n      }\n      return undefined;\n    };\n    var find$1 = function (regexes, agent) {\n      var r = firstMatch(regexes, agent);\n      if (!r) {\n        return {\n          major: 0,\n          minor: 0\n        };\n      }\n      var group = function (i) {\n        return Number(agent.replace(r, '$' + i));\n      };\n      return nu(group(1), group(2));\n    };\n    var detect = function (versionRegexes, agent) {\n      var cleanedAgent = String(agent).toLowerCase();\n      if (versionRegexes.length === 0) {\n        return unknown();\n      }\n      return find$1(versionRegexes, cleanedAgent);\n    };\n    var unknown = function () {\n      return nu(0, 0);\n    };\n    var nu = function (major, minor) {\n      return {\n        major: major,\n        minor: minor\n      };\n    };\n    var Version = {\n      nu: nu,\n      detect: detect,\n      unknown: unknown\n    };\n\n    var edge = 'Edge';\n    var chrome = 'Chrome';\n    var ie = 'IE';\n    var opera = 'Opera';\n    var firefox = 'Firefox';\n    var safari = 'Safari';\n    var isBrowser = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$1 = function () {\n      return nu$1({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$1 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isEdge: isBrowser(edge, current),\n        isChrome: isBrowser(chrome, current),\n        isIE: isBrowser(ie, current),\n        isOpera: isBrowser(opera, current),\n        isFirefox: isBrowser(firefox, current),\n        isSafari: isBrowser(safari, current)\n      };\n    };\n    var Browser = {\n      unknown: unknown$1,\n      nu: nu$1,\n      edge: constant(edge),\n      chrome: constant(chrome),\n      ie: constant(ie),\n      opera: constant(opera),\n      firefox: constant(firefox),\n      safari: constant(safari)\n    };\n\n    var windows = 'Windows';\n    var ios = 'iOS';\n    var android = 'Android';\n    var linux = 'Linux';\n    var osx = 'OSX';\n    var solaris = 'Solaris';\n    var freebsd = 'FreeBSD';\n    var chromeos = 'ChromeOS';\n    var isOS = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$2 = function () {\n      return nu$2({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$2 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isWindows: isOS(windows, current),\n        isiOS: isOS(ios, current),\n        isAndroid: isOS(android, current),\n        isOSX: isOS(osx, current),\n        isLinux: isOS(linux, current),\n        isSolaris: isOS(solaris, current),\n        isFreeBSD: isOS(freebsd, current),\n        isChromeOS: isOS(chromeos, current)\n      };\n    };\n    var OperatingSystem = {\n      unknown: unknown$2,\n      nu: nu$2,\n      windows: constant(windows),\n      ios: constant(ios),\n      android: constant(android),\n      linux: constant(linux),\n      osx: constant(osx),\n      solaris: constant(solaris),\n      freebsd: constant(freebsd),\n      chromeos: constant(chromeos)\n    };\n\n    var DeviceType = function (os, browser, userAgent, mediaMatch) {\n      var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;\n      var isiPhone = os.isiOS() && !isiPad;\n      var isMobile = os.isiOS() || os.isAndroid();\n      var isTouch = isMobile || mediaMatch('(pointer:coarse)');\n      var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');\n      var isPhone = isiPhone || isMobile && !isTablet;\n      var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;\n      var isDesktop = !isPhone && !isTablet && !iOSwebview;\n      return {\n        isiPad: constant(isiPad),\n        isiPhone: constant(isiPhone),\n        isTablet: constant(isTablet),\n        isPhone: constant(isPhone),\n        isTouch: constant(isTouch),\n        isAndroid: os.isAndroid,\n        isiOS: os.isiOS,\n        isWebView: constant(iOSwebview),\n        isDesktop: constant(isDesktop)\n      };\n    };\n\n    var detect$1 = function (candidates, userAgent) {\n      var agent = String(userAgent).toLowerCase();\n      return find(candidates, function (candidate) {\n        return candidate.search(agent);\n      });\n    };\n    var detectBrowser = function (browsers, userAgent) {\n      return detect$1(browsers, userAgent).map(function (browser) {\n        var version = Version.detect(browser.versionRegexes, userAgent);\n        return {\n          current: browser.name,\n          version: version\n        };\n      });\n    };\n    var detectOs = function (oses, userAgent) {\n      return detect$1(oses, userAgent).map(function (os) {\n        var version = Version.detect(os.versionRegexes, userAgent);\n        return {\n          current: os.name,\n          version: version\n        };\n      });\n    };\n    var UaString = {\n      detectBrowser: detectBrowser,\n      detectOs: detectOs\n    };\n\n    var contains = function (str, substr) {\n      return str.indexOf(substr) !== -1;\n    };\n\n    var normalVersionRegex = /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/;\n    var checkContains = function (target) {\n      return function (uastring) {\n        return contains(uastring, target);\n      };\n    };\n    var browsers = [\n      {\n        name: 'Edge',\n        versionRegexes: [/.*?edge\\/ ?([0-9]+)\\.([0-9]+)$/],\n        search: function (uastring) {\n          return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');\n        }\n      },\n      {\n        name: 'Chrome',\n        versionRegexes: [\n          /.*?chrome\\/([0-9]+)\\.([0-9]+).*/,\n          normalVersionRegex\n        ],\n        search: function (uastring) {\n          return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');\n        }\n      },\n      {\n        name: 'IE',\n        versionRegexes: [\n          /.*?msie\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*?rv:([0-9]+)\\.([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return contains(uastring, 'msie') || contains(uastring, 'trident');\n        }\n      },\n      {\n        name: 'Opera',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?opera\\/([0-9]+)\\.([0-9]+).*/\n        ],\n        search: checkContains('opera')\n      },\n      {\n        name: 'Firefox',\n        versionRegexes: [/.*?firefox\\/\\ ?([0-9]+)\\.([0-9]+).*/],\n        search: checkContains('firefox')\n      },\n      {\n        name: 'Safari',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?cpu os ([0-9]+)_([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');\n        }\n      }\n    ];\n    var oses = [\n      {\n        name: 'Windows',\n        search: checkContains('win'),\n        versionRegexes: [/.*?windows\\ nt\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'iOS',\n        search: function (uastring) {\n          return contains(uastring, 'iphone') || contains(uastring, 'ipad');\n        },\n        versionRegexes: [\n          /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*cpu os ([0-9]+)_([0-9]+).*/,\n          /.*cpu iphone os ([0-9]+)_([0-9]+).*/\n        ]\n      },\n      {\n        name: 'Android',\n        search: checkContains('android'),\n        versionRegexes: [/.*?android\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'OSX',\n        search: checkContains('mac os x'),\n        versionRegexes: [/.*?mac\\ os\\ x\\ ?([0-9]+)_([0-9]+).*/]\n      },\n      {\n        name: 'Linux',\n        search: checkContains('linux'),\n        versionRegexes: []\n      },\n      {\n        name: 'Solaris',\n        search: checkContains('sunos'),\n        versionRegexes: []\n      },\n      {\n        name: 'FreeBSD',\n        search: checkContains('freebsd'),\n        versionRegexes: []\n      },\n      {\n        name: 'ChromeOS',\n        search: checkContains('cros'),\n        versionRegexes: [/.*?chrome\\/([0-9]+)\\.([0-9]+).*/]\n      }\n    ];\n    var PlatformInfo = {\n      browsers: constant(browsers),\n      oses: constant(oses)\n    };\n\n    var detect$2 = function (userAgent, mediaMatch) {\n      var browsers = PlatformInfo.browsers();\n      var oses = PlatformInfo.oses();\n      var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);\n      var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);\n      var deviceType = DeviceType(os, browser, userAgent, mediaMatch);\n      return {\n        browser: browser,\n        os: os,\n        deviceType: deviceType\n      };\n    };\n    var PlatformDetection = { detect: detect$2 };\n\n    var mediaMatch = function (query) {\n      return domGlobals.window.matchMedia(query).matches;\n    };\n    var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch));\n    var detect$3 = function () {\n      return platform.get();\n    };\n\n    var fromHtml = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        domGlobals.console.error('HTML does not have a single root node', html);\n        throw new Error('HTML must have a single root node');\n      }\n      return fromDom(div.childNodes[0]);\n    };\n    var fromTag = function (tag, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createElement(tag);\n      return fromDom(node);\n    };\n    var fromText = function (text, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createTextNode(text);\n      return fromDom(node);\n    };\n    var fromDom = function (node) {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: constant(node) };\n    };\n    var fromPoint = function (docElm, x, y) {\n      var doc = docElm.dom();\n      return Option.from(doc.elementFromPoint(x, y)).map(fromDom);\n    };\n    var Element = {\n      fromHtml: fromHtml,\n      fromTag: fromTag,\n      fromText: fromText,\n      fromDom: fromDom,\n      fromPoint: fromPoint\n    };\n\n    var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;\n    var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;\n    var COMMENT = domGlobals.Node.COMMENT_NODE;\n    var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;\n    var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;\n    var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;\n    var ELEMENT = domGlobals.Node.ELEMENT_NODE;\n    var TEXT = domGlobals.Node.TEXT_NODE;\n    var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;\n    var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;\n    var ENTITY = domGlobals.Node.ENTITY_NODE;\n    var NOTATION = domGlobals.Node.NOTATION_NODE;\n\n    var ELEMENT$1 = ELEMENT;\n    var is = function (element, selector) {\n      var dom = element.dom();\n      if (dom.nodeType !== ELEMENT$1) {\n        return false;\n      } else {\n        var elem = dom;\n        if (elem.matches !== undefined) {\n          return elem.matches(selector);\n        } else if (elem.msMatchesSelector !== undefined) {\n          return elem.msMatchesSelector(selector);\n        } else if (elem.webkitMatchesSelector !== undefined) {\n          return elem.webkitMatchesSelector(selector);\n        } else if (elem.mozMatchesSelector !== undefined) {\n          return elem.mozMatchesSelector(selector);\n        } else {\n          throw new Error('Browser lacks native selectors');\n        }\n      }\n    };\n\n    var eq = function (e1, e2) {\n      return e1.dom() === e2.dom();\n    };\n    var regularContains = function (e1, e2) {\n      var d1 = e1.dom();\n      var d2 = e2.dom();\n      return d1 === d2 ? false : d1.contains(d2);\n    };\n    var ieContains = function (e1, e2) {\n      return Node.documentPositionContainedBy(e1.dom(), e2.dom());\n    };\n    var browser = detect$3().browser;\n    var contains$1 = browser.isIE() ? ieContains : regularContains;\n    var is$1 = is;\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils');\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');\n\n    var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK');\n\n    var lift2 = function (oa, ob, f) {\n      return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none();\n    };\n\n    var fromElements = function (elements, scope) {\n      var doc = scope || domGlobals.document;\n      var fragment = doc.createDocumentFragment();\n      each(elements, function (element) {\n        fragment.appendChild(element.dom());\n      });\n      return Element.fromDom(fragment);\n    };\n\n    var Immutable = function () {\n      var fields = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        fields[_i] = arguments[_i];\n      }\n      return function () {\n        var values = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          values[_i] = arguments[_i];\n        }\n        if (fields.length !== values.length) {\n          throw new Error('Wrong number of arguments to struct. Expected \"[' + fields.length + ']\", got ' + values.length + ' arguments');\n        }\n        var struct = {};\n        each(fields, function (name, i) {\n          struct[name] = constant(values[i]);\n        });\n        return struct;\n      };\n    };\n\n    var keys = Object.keys;\n    var each$1 = function (obj, f) {\n      var props = keys(obj);\n      for (var k = 0, len = props.length; k < len; k++) {\n        var i = props[k];\n        var x = obj[i];\n        f(x, i);\n      }\n    };\n\n    var parent = function (element) {\n      return Option.from(element.dom().parentNode).map(Element.fromDom);\n    };\n    var children = function (element) {\n      return map(element.dom().childNodes, Element.fromDom);\n    };\n    var child = function (element, index) {\n      var cs = element.dom().childNodes;\n      return Option.from(cs[index]).map(Element.fromDom);\n    };\n    var firstChild = function (element) {\n      return child(element, 0);\n    };\n    var lastChild = function (element) {\n      return child(element, element.dom().childNodes.length - 1);\n    };\n    var spot = Immutable('element', 'offset');\n\n    var before = function (marker, element) {\n      var parent$1 = parent(marker);\n      parent$1.each(function (v) {\n        v.dom().insertBefore(element.dom(), marker.dom());\n      });\n    };\n    var append = function (parent, element) {\n      parent.dom().appendChild(element.dom());\n    };\n\n    var before$1 = function (marker, elements) {\n      each(elements, function (x) {\n        before(marker, x);\n      });\n    };\n    var append$1 = function (parent, elements) {\n      each(elements, function (x) {\n        append(parent, x);\n      });\n    };\n\n    var remove = function (element) {\n      var dom = element.dom();\n      if (dom.parentNode !== null) {\n        dom.parentNode.removeChild(dom);\n      }\n    };\n\n    var fireListEvent = function (editor, action, element) {\n      return editor.fire('ListMutation', {\n        action: action,\n        element: element\n      });\n    };\n\n    var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();\n\n    var path = function (parts, scope) {\n      var o = scope !== undefined && scope !== null ? scope : Global;\n      for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) {\n        o = o[parts[i]];\n      }\n      return o;\n    };\n    var resolve = function (p, scope) {\n      var parts = p.split('.');\n      return path(parts, scope);\n    };\n\n    var unsafe = function (name, scope) {\n      return resolve(name, scope);\n    };\n    var getOrDie = function (name, scope) {\n      var actual = unsafe(name, scope);\n      if (actual === undefined || actual === null) {\n        throw new Error(name + ' not available on this browser');\n      }\n      return actual;\n    };\n    var Global$1 = { getOrDie: getOrDie };\n\n    var htmlElement = function (scope) {\n      return Global$1.getOrDie('HTMLElement', scope);\n    };\n    var isPrototypeOf = function (x) {\n      var scope = resolve('ownerDocument.defaultView', x);\n      return htmlElement(scope).prototype.isPrototypeOf(x);\n    };\n    var HTMLElement = { isPrototypeOf: isPrototypeOf };\n\n    var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery');\n\n    var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var isTextNode = function (node) {\n      return node && node.nodeType === 3;\n    };\n    var isListNode = function (node) {\n      return node && /^(OL|UL|DL)$/.test(node.nodeName);\n    };\n    var isOlUlNode = function (node) {\n      return node && /^(OL|UL)$/.test(node.nodeName);\n    };\n    var isListItemNode = function (node) {\n      return node && /^(LI|DT|DD)$/.test(node.nodeName);\n    };\n    var isDlItemNode = function (node) {\n      return node && /^(DT|DD)$/.test(node.nodeName);\n    };\n    var isTableCellNode = function (node) {\n      return node && /^(TH|TD)$/.test(node.nodeName);\n    };\n    var isBr = function (node) {\n      return node && node.nodeName === 'BR';\n    };\n    var isFirstChild = function (node) {\n      return node.parentNode.firstChild === node;\n    };\n    var isLastChild = function (node) {\n      return node.parentNode.lastChild === node;\n    };\n    var isTextBlock = function (editor, node) {\n      return node && !!editor.schema.getTextBlockElements()[node.nodeName];\n    };\n    var isBlock = function (node, blockElements) {\n      return node && node.nodeName in blockElements;\n    };\n    var isBogusBr = function (dom, node) {\n      if (!isBr(node)) {\n        return false;\n      }\n      if (dom.isBlock(node.nextSibling) && !isBr(node.previousSibling)) {\n        return true;\n      }\n      return false;\n    };\n    var isEmpty = function (dom, elm, keepBookmarks) {\n      var empty = dom.isEmpty(elm);\n      if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) {\n        return false;\n      }\n      return empty;\n    };\n    var isChildOfBody = function (dom, elm) {\n      return dom.isChildOf(elm, dom.getRoot());\n    };\n    var NodeType = {\n      isTextNode: isTextNode,\n      isListNode: isListNode,\n      isOlUlNode: isOlUlNode,\n      isDlItemNode: isDlItemNode,\n      isListItemNode: isListItemNode,\n      isTableCellNode: isTableCellNode,\n      isBr: isBr,\n      isFirstChild: isFirstChild,\n      isLastChild: isLastChild,\n      isTextBlock: isTextBlock,\n      isBlock: isBlock,\n      isBogusBr: isBogusBr,\n      isEmpty: isEmpty,\n      isChildOfBody: isChildOfBody\n    };\n\n    var getParentList = function (editor) {\n      var selectionStart = editor.selection.getStart(true);\n      return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart));\n    };\n    var isParentListSelected = function (parentList, selectedBlocks) {\n      return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList;\n    };\n    var findSubLists = function (parentList) {\n      return global$5.grep(parentList.querySelectorAll('ol,ul,dl'), function (elm) {\n        return NodeType.isListNode(elm);\n      });\n    };\n    var getSelectedSubLists = function (editor) {\n      var parentList = getParentList(editor);\n      var selectedBlocks = editor.selection.getSelectedBlocks();\n      if (isParentListSelected(parentList, selectedBlocks)) {\n        return findSubLists(parentList);\n      } else {\n        return global$5.grep(selectedBlocks, function (elm) {\n          return NodeType.isListNode(elm) && parentList !== elm;\n        });\n      }\n    };\n    var findParentListItemsNodes = function (editor, elms) {\n      var listItemsElms = global$5.map(elms, function (elm) {\n        var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm));\n        return parentLi ? parentLi : elm;\n      });\n      return global$4.unique(listItemsElms);\n    };\n    var getSelectedListItems = function (editor) {\n      var selectedBlocks = editor.selection.getSelectedBlocks();\n      return global$5.grep(findParentListItemsNodes(editor, selectedBlocks), function (block) {\n        return NodeType.isListItemNode(block);\n      });\n    };\n    var getSelectedDlItems = function (editor) {\n      return filter(getSelectedListItems(editor), NodeType.isDlItemNode);\n    };\n    var getClosestListRootElm = function (editor, elm) {\n      var parentTableCell = editor.dom.getParents(elm, 'TD,TH');\n      var root = parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody();\n      return root;\n    };\n    var findLastParentListNode = function (editor, elm) {\n      var parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm));\n      return last(parentLists);\n    };\n    var getSelectedLists = function (editor) {\n      var firstList = findLastParentListNode(editor, editor.selection.getStart());\n      var subsequentLists = filter(editor.selection.getSelectedBlocks(), NodeType.isOlUlNode);\n      return firstList.toArray().concat(subsequentLists);\n    };\n    var getSelectedListRoots = function (editor) {\n      var selectedLists = getSelectedLists(editor);\n      return getUniqueListRoots(editor, selectedLists);\n    };\n    var getUniqueListRoots = function (editor, lists) {\n      var listRoots = map(lists, function (list) {\n        return findLastParentListNode(editor, list).getOr(list);\n      });\n      return global$4.unique(listRoots);\n    };\n    var isList = function (editor) {\n      var list = getParentList(editor);\n      return HTMLElement.isPrototypeOf(list);\n    };\n    var Selection = {\n      isList: isList,\n      getParentList: getParentList,\n      getSelectedSubLists: getSelectedSubLists,\n      getSelectedListItems: getSelectedListItems,\n      getClosestListRootElm: getClosestListRootElm,\n      getSelectedDlItems: getSelectedDlItems,\n      getSelectedListRoots: getSelectedListRoots\n    };\n\n    var shouldIndentOnTab = function (editor) {\n      return editor.getParam('lists_indent_on_tab', true);\n    };\n    var getForcedRootBlock = function (editor) {\n      var block = editor.getParam('forced_root_block', 'p');\n      if (block === false) {\n        return '';\n      } else if (block === true) {\n        return 'p';\n      } else {\n        return block;\n      }\n    };\n    var getForcedRootBlockAttrs = function (editor) {\n      return editor.getParam('forced_root_block_attrs', {});\n    };\n    var Settings = {\n      shouldIndentOnTab: shouldIndentOnTab,\n      getForcedRootBlock: getForcedRootBlock,\n      getForcedRootBlockAttrs: getForcedRootBlockAttrs\n    };\n\n    var createTextBlock = function (editor, contentNode) {\n      var dom = editor.dom;\n      var blockElements = editor.schema.getBlockElements();\n      var fragment = dom.createFragment();\n      var blockName = Settings.getForcedRootBlock(editor);\n      var node, textBlock, hasContentNode;\n      if (blockName) {\n        textBlock = dom.create(blockName);\n        if (textBlock.tagName === blockName.toUpperCase()) {\n          dom.setAttribs(textBlock, Settings.getForcedRootBlockAttrs(editor));\n        }\n        if (!NodeType.isBlock(contentNode.firstChild, blockElements)) {\n          fragment.appendChild(textBlock);\n        }\n      }\n      if (contentNode) {\n        while (node = contentNode.firstChild) {\n          var nodeName = node.nodeName;\n          if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) {\n            hasContentNode = true;\n          }\n          if (NodeType.isBlock(node, blockElements)) {\n            fragment.appendChild(node);\n            textBlock = null;\n          } else {\n            if (blockName) {\n              if (!textBlock) {\n                textBlock = dom.create(blockName);\n                fragment.appendChild(textBlock);\n              }\n              textBlock.appendChild(node);\n            } else {\n              fragment.appendChild(node);\n            }\n          }\n        }\n      }\n      if (!blockName) {\n        fragment.appendChild(dom.create('br'));\n      } else {\n        if (!hasContentNode) {\n          textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' }));\n        }\n      }\n      return fragment;\n    };\n\n    var name = function (element) {\n      var r = element.dom().nodeName;\n      return r.toLowerCase();\n    };\n    var type = function (element) {\n      return element.dom().nodeType;\n    };\n    var isType$1 = function (t) {\n      return function (element) {\n        return type(element) === t;\n      };\n    };\n    var isElement = isType$1(ELEMENT);\n\n    var rawSet = function (dom, key, value) {\n      if (isString(value) || isBoolean(value) || isNumber(value)) {\n        dom.setAttribute(key, value + '');\n      } else {\n        domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n        throw new Error('Attribute value was not simple');\n      }\n    };\n    var setAll = function (element, attrs) {\n      var dom = element.dom();\n      each$1(attrs, function (v, k) {\n        rawSet(dom, k, v);\n      });\n    };\n    var clone = function (element) {\n      return foldl(element.dom().attributes, function (acc, attr) {\n        acc[attr.name] = attr.value;\n        return acc;\n      }, {});\n    };\n\n    var isSupported = function (dom) {\n      return dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n    };\n\n    var internalSet = function (dom, property, value) {\n      if (!isString(value)) {\n        domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);\n        throw new Error('CSS value must be a string: ' + value);\n      }\n      if (isSupported(dom)) {\n        dom.style.setProperty(property, value);\n      }\n    };\n    var set = function (element, property, value) {\n      var dom = element.dom();\n      internalSet(dom, property, value);\n    };\n\n    var clone$1 = function (original, isDeep) {\n      return Element.fromDom(original.dom().cloneNode(isDeep));\n    };\n    var deep = function (original) {\n      return clone$1(original, true);\n    };\n    var shallowAs = function (original, tag) {\n      var nu = Element.fromTag(tag);\n      var attributes = clone(original);\n      setAll(nu, attributes);\n      return nu;\n    };\n    var mutate = function (original, tag) {\n      var nu = shallowAs(original, tag);\n      before(original, nu);\n      var children$1 = children(original);\n      append$1(nu, children$1);\n      remove(original);\n      return nu;\n    };\n\n    var joinSegment = function (parent, child) {\n      append(parent.item, child.list);\n    };\n    var joinSegments = function (segments) {\n      for (var i = 1; i < segments.length; i++) {\n        joinSegment(segments[i - 1], segments[i]);\n      }\n    };\n    var appendSegments = function (head$1, tail) {\n      lift2(last(head$1), head(tail), joinSegment);\n    };\n    var createSegment = function (scope, listType) {\n      var segment = {\n        list: Element.fromTag(listType, scope),\n        item: Element.fromTag('li', scope)\n      };\n      append(segment.list, segment.item);\n      return segment;\n    };\n    var createSegments = function (scope, entry, size) {\n      var segments = [];\n      for (var i = 0; i < size; i++) {\n        segments.push(createSegment(scope, entry.listType));\n      }\n      return segments;\n    };\n    var populateSegments = function (segments, entry) {\n      for (var i = 0; i < segments.length - 1; i++) {\n        set(segments[i].item, 'list-style-type', 'none');\n      }\n      last(segments).each(function (segment) {\n        setAll(segment.list, entry.listAttributes);\n        setAll(segment.item, entry.itemAttributes);\n        append$1(segment.item, entry.content);\n      });\n    };\n    var normalizeSegment = function (segment, entry) {\n      if (name(segment.list) !== entry.listType) {\n        segment.list = mutate(segment.list, entry.listType);\n      }\n      setAll(segment.list, entry.listAttributes);\n    };\n    var createItem = function (scope, attr, content) {\n      var item = Element.fromTag('li', scope);\n      setAll(item, attr);\n      append$1(item, content);\n      return item;\n    };\n    var appendItem = function (segment, item) {\n      append(segment.list, item);\n      segment.item = item;\n    };\n    var writeShallow = function (scope, cast, entry) {\n      var newCast = cast.slice(0, entry.depth);\n      last(newCast).each(function (segment) {\n        var item = createItem(scope, entry.itemAttributes, entry.content);\n        appendItem(segment, item);\n        normalizeSegment(segment, entry);\n      });\n      return newCast;\n    };\n    var writeDeep = function (scope, cast, entry) {\n      var segments = createSegments(scope, entry, entry.depth - cast.length);\n      joinSegments(segments);\n      populateSegments(segments, entry);\n      appendSegments(cast, segments);\n      return cast.concat(segments);\n    };\n    var composeList = function (scope, entries) {\n      var cast = foldl(entries, function (cast, entry) {\n        return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry);\n      }, []);\n      return head(cast).map(function (segment) {\n        return segment.list;\n      });\n    };\n\n    var isList$1 = function (el) {\n      return is$1(el, 'OL,UL');\n    };\n    var hasFirstChildList = function (el) {\n      return firstChild(el).map(isList$1).getOr(false);\n    };\n    var hasLastChildList = function (el) {\n      return lastChild(el).map(isList$1).getOr(false);\n    };\n\n    var isIndented = function (entry) {\n      return entry.depth > 0;\n    };\n    var isSelected = function (entry) {\n      return entry.isSelected;\n    };\n    var cloneItemContent = function (li) {\n      var children$1 = children(li);\n      var content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1;\n      return map(content, deep);\n    };\n    var createEntry = function (li, depth, isSelected) {\n      return parent(li).filter(isElement).map(function (list) {\n        return {\n          depth: depth,\n          isSelected: isSelected,\n          content: cloneItemContent(li),\n          itemAttributes: clone(li),\n          listAttributes: clone(list),\n          listType: name(list)\n        };\n      });\n    };\n\n    var indentEntry = function (indentation, entry) {\n      switch (indentation) {\n      case 'Indent':\n        entry.depth++;\n        break;\n      case 'Outdent':\n        entry.depth--;\n        break;\n      case 'Flatten':\n        entry.depth = 0;\n      }\n    };\n\n    var cloneListProperties = function (target, source) {\n      target.listType = source.listType;\n      target.listAttributes = __assign({}, source.listAttributes);\n    };\n    var previousSiblingEntry = function (entries, start) {\n      var depth = entries[start].depth;\n      for (var i = start - 1; i >= 0; i--) {\n        if (entries[i].depth === depth) {\n          return Option.some(entries[i]);\n        }\n        if (entries[i].depth < depth) {\n          break;\n        }\n      }\n      return Option.none();\n    };\n    var normalizeEntries = function (entries) {\n      each(entries, function (entry, i) {\n        previousSiblingEntry(entries, i).each(function (matchingEntry) {\n          cloneListProperties(entry, matchingEntry);\n        });\n      });\n    };\n\n    var parseItem = function (depth, itemSelection, selectionState, item) {\n      return firstChild(item).filter(isList$1).fold(function () {\n        itemSelection.each(function (selection) {\n          if (eq(selection.start, item)) {\n            selectionState.set(true);\n          }\n        });\n        var currentItemEntry = createEntry(item, depth, selectionState.get());\n        itemSelection.each(function (selection) {\n          if (eq(selection.end, item)) {\n            selectionState.set(false);\n          }\n        });\n        var childListEntries = lastChild(item).filter(isList$1).map(function (list) {\n          return parseList(depth, itemSelection, selectionState, list);\n        }).getOr([]);\n        return currentItemEntry.toArray().concat(childListEntries);\n      }, function (list) {\n        return parseList(depth, itemSelection, selectionState, list);\n      });\n    };\n    var parseList = function (depth, itemSelection, selectionState, list) {\n      return bind(children(list), function (element) {\n        var parser = isList$1(element) ? parseList : parseItem;\n        var newDepth = depth + 1;\n        return parser(newDepth, itemSelection, selectionState, element);\n      });\n    };\n    var parseLists = function (lists, itemSelection) {\n      var selectionState = Cell(false);\n      var initialDepth = 0;\n      return map(lists, function (list) {\n        return {\n          sourceList: list,\n          entries: parseList(initialDepth, itemSelection, selectionState, list)\n        };\n      });\n    };\n\n    var outdentedComposer = function (editor, entries) {\n      return map(entries, function (entry) {\n        var content = fromElements(entry.content);\n        return Element.fromDom(createTextBlock(editor, content.dom()));\n      });\n    };\n    var indentedComposer = function (editor, entries) {\n      normalizeEntries(entries);\n      return composeList(editor.contentDocument, entries).toArray();\n    };\n    var composeEntries = function (editor, entries) {\n      return bind(groupBy(entries, isIndented), function (entries) {\n        var groupIsIndented = head(entries).map(isIndented).getOr(false);\n        return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries);\n      });\n    };\n    var indentSelectedEntries = function (entries, indentation) {\n      each(filter(entries, isSelected), function (entry) {\n        return indentEntry(indentation, entry);\n      });\n    };\n    var getItemSelection = function (editor) {\n      var selectedListItems = map(Selection.getSelectedListItems(editor), Element.fromDom);\n      return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) {\n        return {\n          start: start,\n          end: end\n        };\n      });\n    };\n    var listIndentation = function (editor, lists, indentation) {\n      var entrySets = parseLists(lists, getItemSelection(editor));\n      each(entrySets, function (entrySet) {\n        indentSelectedEntries(entrySet.entries, indentation);\n        var composedLists = composeEntries(editor, entrySet.entries);\n        each(composedLists, function (composedList) {\n          fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom());\n        });\n        before$1(entrySet.sourceList, composedLists);\n        remove(entrySet.sourceList);\n      });\n    };\n\n    var global$6 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n    var DOM = global$6.DOM;\n    var splitList = function (editor, ul, li) {\n      var tmpRng, fragment, bookmarks, node, newBlock;\n      var removeAndKeepBookmarks = function (targetNode) {\n        global$5.each(bookmarks, function (node) {\n          targetNode.parentNode.insertBefore(node, li.parentNode);\n        });\n        DOM.remove(targetNode);\n      };\n      bookmarks = DOM.select('span[data-mce-type=\"bookmark\"]', ul);\n      newBlock = createTextBlock(editor, li);\n      tmpRng = DOM.createRng();\n      tmpRng.setStartAfter(li);\n      tmpRng.setEndAfter(ul);\n      fragment = tmpRng.extractContents();\n      for (node = fragment.firstChild; node; node = node.firstChild) {\n        if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) {\n          DOM.remove(node);\n          break;\n        }\n      }\n      if (!editor.dom.isEmpty(fragment)) {\n        DOM.insertAfter(fragment, ul);\n      }\n      DOM.insertAfter(newBlock, ul);\n      if (NodeType.isEmpty(editor.dom, li.parentNode)) {\n        removeAndKeepBookmarks(li.parentNode);\n      }\n      DOM.remove(li);\n      if (NodeType.isEmpty(editor.dom, ul)) {\n        DOM.remove(ul);\n      }\n    };\n    var SplitList = { splitList: splitList };\n\n    var outdentDlItem = function (editor, item) {\n      if (is$1(item, 'dd')) {\n        mutate(item, 'dt');\n      } else if (is$1(item, 'dt')) {\n        parent(item).each(function (dl) {\n          return SplitList.splitList(editor, dl.dom(), item.dom());\n        });\n      }\n    };\n    var indentDlItem = function (item) {\n      if (is$1(item, 'dt')) {\n        mutate(item, 'dd');\n      }\n    };\n    var dlIndentation = function (editor, indentation, dlItems) {\n      if (indentation === 'Indent') {\n        each(dlItems, indentDlItem);\n      } else {\n        each(dlItems, function (item) {\n          return outdentDlItem(editor, item);\n        });\n      }\n    };\n\n    var getNormalizedPoint = function (container, offset) {\n      if (NodeType.isTextNode(container)) {\n        return {\n          container: container,\n          offset: offset\n        };\n      }\n      var node = global$1.getNode(container, offset);\n      if (NodeType.isTextNode(node)) {\n        return {\n          container: node,\n          offset: offset >= container.childNodes.length ? node.data.length : 0\n        };\n      } else if (node.previousSibling && NodeType.isTextNode(node.previousSibling)) {\n        return {\n          container: node.previousSibling,\n          offset: node.previousSibling.data.length\n        };\n      } else if (node.nextSibling && NodeType.isTextNode(node.nextSibling)) {\n        return {\n          container: node.nextSibling,\n          offset: 0\n        };\n      }\n      return {\n        container: container,\n        offset: offset\n      };\n    };\n    var normalizeRange = function (rng) {\n      var outRng = rng.cloneRange();\n      var rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset);\n      outRng.setStart(rangeStart.container, rangeStart.offset);\n      var rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset);\n      outRng.setEnd(rangeEnd.container, rangeEnd.offset);\n      return outRng;\n    };\n    var Range = {\n      getNormalizedPoint: getNormalizedPoint,\n      normalizeRange: normalizeRange\n    };\n\n    var selectionIndentation = function (editor, indentation) {\n      var lists = map(Selection.getSelectedListRoots(editor), Element.fromDom);\n      var dlItems = map(Selection.getSelectedDlItems(editor), Element.fromDom);\n      var isHandled = false;\n      if (lists.length || dlItems.length) {\n        var bookmark = editor.selection.getBookmark();\n        listIndentation(editor, lists, indentation);\n        dlIndentation(editor, indentation, dlItems);\n        editor.selection.moveToBookmark(bookmark);\n        editor.selection.setRng(Range.normalizeRange(editor.selection.getRng()));\n        editor.nodeChanged();\n        isHandled = true;\n      }\n      return isHandled;\n    };\n    var indentListSelection = function (editor) {\n      return selectionIndentation(editor, 'Indent');\n    };\n    var outdentListSelection = function (editor) {\n      return selectionIndentation(editor, 'Outdent');\n    };\n    var flattenListSelection = function (editor) {\n      return selectionIndentation(editor, 'Flatten');\n    };\n\n    var global$7 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager');\n\n    var DOM$1 = global$6.DOM;\n    var createBookmark = function (rng) {\n      var bookmark = {};\n      var setupEndPoint = function (start) {\n        var offsetNode, container, offset;\n        container = rng[start ? 'startContainer' : 'endContainer'];\n        offset = rng[start ? 'startOffset' : 'endOffset'];\n        if (container.nodeType === 1) {\n          offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' });\n          if (container.hasChildNodes()) {\n            offset = Math.min(offset, container.childNodes.length - 1);\n            if (start) {\n              container.insertBefore(offsetNode, container.childNodes[offset]);\n            } else {\n              DOM$1.insertAfter(offsetNode, container.childNodes[offset]);\n            }\n          } else {\n            container.appendChild(offsetNode);\n          }\n          container = offsetNode;\n          offset = 0;\n        }\n        bookmark[start ? 'startContainer' : 'endContainer'] = container;\n        bookmark[start ? 'startOffset' : 'endOffset'] = offset;\n      };\n      setupEndPoint(true);\n      if (!rng.collapsed) {\n        setupEndPoint();\n      }\n      return bookmark;\n    };\n    var resolveBookmark = function (bookmark) {\n      function restoreEndPoint(start) {\n        var container, offset, node;\n        var nodeIndex = function (container) {\n          var node = container.parentNode.firstChild, idx = 0;\n          while (node) {\n            if (node === container) {\n              return idx;\n            }\n            if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') {\n              idx++;\n            }\n            node = node.nextSibling;\n          }\n          return -1;\n        };\n        container = node = bookmark[start ? 'startContainer' : 'endContainer'];\n        offset = bookmark[start ? 'startOffset' : 'endOffset'];\n        if (!container) {\n          return;\n        }\n        if (container.nodeType === 1) {\n          offset = nodeIndex(container);\n          container = container.parentNode;\n          DOM$1.remove(node);\n          if (!container.hasChildNodes() && DOM$1.isBlock(container)) {\n            container.appendChild(DOM$1.create('br'));\n          }\n        }\n        bookmark[start ? 'startContainer' : 'endContainer'] = container;\n        bookmark[start ? 'startOffset' : 'endOffset'] = offset;\n      }\n      restoreEndPoint(true);\n      restoreEndPoint();\n      var rng = DOM$1.createRng();\n      rng.setStart(bookmark.startContainer, bookmark.startOffset);\n      if (bookmark.endContainer) {\n        rng.setEnd(bookmark.endContainer, bookmark.endOffset);\n      }\n      return Range.normalizeRange(rng);\n    };\n    var Bookmark = {\n      createBookmark: createBookmark,\n      resolveBookmark: resolveBookmark\n    };\n\n    var isCustomList = function (list) {\n      return /\\btox\\-/.test(list.className);\n    };\n\n    var listToggleActionFromListName = function (listName) {\n      switch (listName) {\n      case 'UL':\n        return 'ToggleUlList';\n      case 'OL':\n        return 'ToggleOlList';\n      case 'DL':\n        return 'ToggleDLList';\n      }\n    };\n\n    var updateListStyle = function (dom, el, detail) {\n      var type = detail['list-style-type'] ? detail['list-style-type'] : null;\n      dom.setStyle(el, 'list-style-type', type);\n    };\n    var setAttribs = function (elm, attrs) {\n      global$5.each(attrs, function (value, key) {\n        elm.setAttribute(key, value);\n      });\n    };\n    var updateListAttrs = function (dom, el, detail) {\n      setAttribs(el, detail['list-attributes']);\n      global$5.each(dom.select('li', el), function (li) {\n        setAttribs(li, detail['list-item-attributes']);\n      });\n    };\n    var updateListWithDetails = function (dom, el, detail) {\n      updateListStyle(dom, el, detail);\n      updateListAttrs(dom, el, detail);\n    };\n    var removeStyles = function (dom, element, styles) {\n      global$5.each(styles, function (style) {\n        var _a;\n        return dom.setStyle(element, (_a = {}, _a[style] = '', _a));\n      });\n    };\n    var getEndPointNode = function (editor, rng, start, root) {\n      var container, offset;\n      container = rng[start ? 'startContainer' : 'endContainer'];\n      offset = rng[start ? 'startOffset' : 'endOffset'];\n      if (container.nodeType === 1) {\n        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;\n      }\n      if (!start && NodeType.isBr(container.nextSibling)) {\n        container = container.nextSibling;\n      }\n      while (container.parentNode !== root) {\n        if (NodeType.isTextBlock(editor, container)) {\n          return container;\n        }\n        if (/^(TD|TH)$/.test(container.parentNode.nodeName)) {\n          return container;\n        }\n        container = container.parentNode;\n      }\n      return container;\n    };\n    var getSelectedTextBlocks = function (editor, rng, root) {\n      var textBlocks = [], dom = editor.dom;\n      var startNode = getEndPointNode(editor, rng, true, root);\n      var endNode = getEndPointNode(editor, rng, false, root);\n      var block;\n      var siblings = [];\n      for (var node = startNode; node; node = node.nextSibling) {\n        siblings.push(node);\n        if (node === endNode) {\n          break;\n        }\n      }\n      global$5.each(siblings, function (node) {\n        if (NodeType.isTextBlock(editor, node)) {\n          textBlocks.push(node);\n          block = null;\n          return;\n        }\n        if (dom.isBlock(node) || NodeType.isBr(node)) {\n          if (NodeType.isBr(node)) {\n            dom.remove(node);\n          }\n          block = null;\n          return;\n        }\n        var nextSibling = node.nextSibling;\n        if (global$7.isBookmarkNode(node)) {\n          if (NodeType.isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) {\n            block = null;\n            return;\n          }\n        }\n        if (!block) {\n          block = dom.create('p');\n          node.parentNode.insertBefore(block, node);\n          textBlocks.push(block);\n        }\n        block.appendChild(node);\n      });\n      return textBlocks;\n    };\n    var hasCompatibleStyle = function (dom, sib, detail) {\n      var sibStyle = dom.getStyle(sib, 'list-style-type');\n      var detailStyle = detail ? detail['list-style-type'] : '';\n      detailStyle = detailStyle === null ? '' : detailStyle;\n      return sibStyle === detailStyle;\n    };\n    var applyList = function (editor, listName, detail) {\n      if (detail === void 0) {\n        detail = {};\n      }\n      var rng = editor.selection.getRng(true);\n      var bookmark;\n      var listItemName = 'LI';\n      var root = Selection.getClosestListRootElm(editor, editor.selection.getStart(true));\n      var dom = editor.dom;\n      if (dom.getContentEditable(editor.selection.getNode()) === 'false') {\n        return;\n      }\n      listName = listName.toUpperCase();\n      if (listName === 'DL') {\n        listItemName = 'DT';\n      }\n      bookmark = Bookmark.createBookmark(rng);\n      global$5.each(getSelectedTextBlocks(editor, rng, root), function (block) {\n        var listBlock, sibling;\n        sibling = block.previousSibling;\n        if (sibling && NodeType.isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) {\n          listBlock = sibling;\n          block = dom.rename(block, listItemName);\n          sibling.appendChild(block);\n        } else {\n          listBlock = dom.create(listName);\n          block.parentNode.insertBefore(listBlock, block);\n          listBlock.appendChild(block);\n          block = dom.rename(block, listItemName);\n        }\n        removeStyles(dom, block, [\n          'margin',\n          'margin-right',\n          'margin-bottom',\n          'margin-left',\n          'margin-top',\n          'padding',\n          'padding-right',\n          'padding-bottom',\n          'padding-left',\n          'padding-top'\n        ]);\n        updateListWithDetails(dom, listBlock, detail);\n        mergeWithAdjacentLists(editor.dom, listBlock);\n      });\n      editor.selection.setRng(Bookmark.resolveBookmark(bookmark));\n    };\n    var isValidLists = function (list1, list2) {\n      return list1 && list2 && NodeType.isListNode(list1) && list1.nodeName === list2.nodeName;\n    };\n    var hasSameListStyle = function (dom, list1, list2) {\n      var targetStyle = dom.getStyle(list1, 'list-style-type', true);\n      var style = dom.getStyle(list2, 'list-style-type', true);\n      return targetStyle === style;\n    };\n    var hasSameClasses = function (elm1, elm2) {\n      return elm1.className === elm2.className;\n    };\n    var shouldMerge = function (dom, list1, list2) {\n      return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2);\n    };\n    var mergeWithAdjacentLists = function (dom, listBlock) {\n      var sibling, node;\n      sibling = listBlock.nextSibling;\n      if (shouldMerge(dom, listBlock, sibling)) {\n        while (node = sibling.firstChild) {\n          listBlock.appendChild(node);\n        }\n        dom.remove(sibling);\n      }\n      sibling = listBlock.previousSibling;\n      if (shouldMerge(dom, listBlock, sibling)) {\n        while (node = sibling.lastChild) {\n          listBlock.insertBefore(node, listBlock.firstChild);\n        }\n        dom.remove(sibling);\n      }\n    };\n    var updateList = function (editor, list, listName, detail) {\n      if (list.nodeName !== listName) {\n        var newList = editor.dom.rename(list, listName);\n        updateListWithDetails(editor.dom, newList, detail);\n        fireListEvent(editor, listToggleActionFromListName(listName), newList);\n      } else {\n        updateListWithDetails(editor.dom, list, detail);\n        fireListEvent(editor, listToggleActionFromListName(listName), list);\n      }\n    };\n    var toggleMultipleLists = function (editor, parentList, lists, listName, detail) {\n      if (parentList.nodeName === listName && !hasListStyleDetail(detail)) {\n        flattenListSelection(editor);\n      } else {\n        var bookmark = Bookmark.createBookmark(editor.selection.getRng(true));\n        global$5.each([parentList].concat(lists), function (elm) {\n          updateList(editor, elm, listName, detail);\n        });\n        editor.selection.setRng(Bookmark.resolveBookmark(bookmark));\n      }\n    };\n    var hasListStyleDetail = function (detail) {\n      return 'list-style-type' in detail;\n    };\n    var toggleSingleList = function (editor, parentList, listName, detail) {\n      if (parentList === editor.getBody()) {\n        return;\n      }\n      if (parentList) {\n        if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) {\n          flattenListSelection(editor);\n        } else {\n          var bookmark = Bookmark.createBookmark(editor.selection.getRng(true));\n          updateListWithDetails(editor.dom, parentList, detail);\n          var newList = editor.dom.rename(parentList, listName);\n          mergeWithAdjacentLists(editor.dom, newList);\n          editor.selection.setRng(Bookmark.resolveBookmark(bookmark));\n          fireListEvent(editor, listToggleActionFromListName(listName), newList);\n        }\n      } else {\n        applyList(editor, listName, detail);\n        fireListEvent(editor, listToggleActionFromListName(listName), parentList);\n      }\n    };\n    var toggleList = function (editor, listName, detail) {\n      var parentList = Selection.getParentList(editor);\n      var selectedSubLists = Selection.getSelectedSubLists(editor);\n      detail = detail ? detail : {};\n      if (parentList && selectedSubLists.length > 0) {\n        toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail);\n      } else {\n        toggleSingleList(editor, parentList, listName, detail);\n      }\n    };\n    var ToggleList = {\n      toggleList: toggleList,\n      mergeWithAdjacentLists: mergeWithAdjacentLists\n    };\n\n    var DOM$2 = global$6.DOM;\n    var normalizeList = function (dom, ul) {\n      var sibling;\n      var parentNode = ul.parentNode;\n      if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) {\n        sibling = parentNode.previousSibling;\n        if (sibling && sibling.nodeName === 'LI') {\n          sibling.appendChild(ul);\n          if (NodeType.isEmpty(dom, parentNode)) {\n            DOM$2.remove(parentNode);\n          }\n        } else {\n          DOM$2.setStyle(parentNode, 'listStyleType', 'none');\n        }\n      }\n      if (NodeType.isListNode(parentNode)) {\n        sibling = parentNode.previousSibling;\n        if (sibling && sibling.nodeName === 'LI') {\n          sibling.appendChild(ul);\n        }\n      }\n    };\n    var normalizeLists = function (dom, element) {\n      global$5.each(global$5.grep(dom.select('ol,ul', element)), function (ul) {\n        normalizeList(dom, ul);\n      });\n    };\n    var NormalizeLists = {\n      normalizeList: normalizeList,\n      normalizeLists: normalizeLists\n    };\n\n    var findNextCaretContainer = function (editor, rng, isForward, root) {\n      var node = rng.startContainer;\n      var offset = rng.startOffset;\n      if (NodeType.isTextNode(node) && (isForward ? offset < node.data.length : offset > 0)) {\n        return node;\n      }\n      var nonEmptyBlocks = editor.schema.getNonEmptyElements();\n      if (node.nodeType === 1) {\n        node = global$1.getNode(node, offset);\n      }\n      var walker = new global$2(node, root);\n      if (isForward) {\n        if (NodeType.isBogusBr(editor.dom, node)) {\n          walker.next();\n        }\n      }\n      while (node = walker[isForward ? 'next' : 'prev2']()) {\n        if (node.nodeName === 'LI' && !node.hasChildNodes()) {\n          return node;\n        }\n        if (nonEmptyBlocks[node.nodeName]) {\n          return node;\n        }\n        if (NodeType.isTextNode(node) && node.data.length > 0) {\n          return node;\n        }\n      }\n    };\n    var hasOnlyOneBlockChild = function (dom, elm) {\n      var childNodes = elm.childNodes;\n      return childNodes.length === 1 && !NodeType.isListNode(childNodes[0]) && dom.isBlock(childNodes[0]);\n    };\n    var unwrapSingleBlockChild = function (dom, elm) {\n      if (hasOnlyOneBlockChild(dom, elm)) {\n        dom.remove(elm.firstChild, true);\n      }\n    };\n    var moveChildren = function (dom, fromElm, toElm) {\n      var node, targetElm;\n      targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm;\n      unwrapSingleBlockChild(dom, fromElm);\n      if (!NodeType.isEmpty(dom, fromElm, true)) {\n        while (node = fromElm.firstChild) {\n          targetElm.appendChild(node);\n        }\n      }\n    };\n    var mergeLiElements = function (dom, fromElm, toElm) {\n      var node, listNode;\n      var ul = fromElm.parentNode;\n      if (!NodeType.isChildOfBody(dom, fromElm) || !NodeType.isChildOfBody(dom, toElm)) {\n        return;\n      }\n      if (NodeType.isListNode(toElm.lastChild)) {\n        listNode = toElm.lastChild;\n      }\n      if (ul === toElm.lastChild) {\n        if (NodeType.isBr(ul.previousSibling)) {\n          dom.remove(ul.previousSibling);\n        }\n      }\n      node = toElm.lastChild;\n      if (node && NodeType.isBr(node) && fromElm.hasChildNodes()) {\n        dom.remove(node);\n      }\n      if (NodeType.isEmpty(dom, toElm, true)) {\n        dom.$(toElm).empty();\n      }\n      moveChildren(dom, fromElm, toElm);\n      if (listNode) {\n        toElm.appendChild(listNode);\n      }\n      var contains = contains$1(Element.fromDom(toElm), Element.fromDom(fromElm));\n      var nestedLists = contains ? dom.getParents(fromElm, NodeType.isListNode, toElm) : [];\n      dom.remove(fromElm);\n      each(nestedLists, function (list) {\n        if (NodeType.isEmpty(dom, list) && list !== dom.getRoot()) {\n          dom.remove(list);\n        }\n      });\n    };\n    var mergeIntoEmptyLi = function (editor, fromLi, toLi) {\n      editor.dom.$(toLi).empty();\n      mergeLiElements(editor.dom, fromLi, toLi);\n      editor.selection.setCursorLocation(toLi);\n    };\n    var mergeForward = function (editor, rng, fromLi, toLi) {\n      var dom = editor.dom;\n      if (dom.isEmpty(toLi)) {\n        mergeIntoEmptyLi(editor, fromLi, toLi);\n      } else {\n        var bookmark = Bookmark.createBookmark(rng);\n        mergeLiElements(dom, fromLi, toLi);\n        editor.selection.setRng(Bookmark.resolveBookmark(bookmark));\n      }\n    };\n    var mergeBackward = function (editor, rng, fromLi, toLi) {\n      var bookmark = Bookmark.createBookmark(rng);\n      mergeLiElements(editor.dom, fromLi, toLi);\n      var resolvedBookmark = Bookmark.resolveBookmark(bookmark);\n      editor.selection.setRng(resolvedBookmark);\n    };\n    var backspaceDeleteFromListToListCaret = function (editor, isForward) {\n      var dom = editor.dom, selection = editor.selection;\n      var selectionStartElm = selection.getStart();\n      var root = Selection.getClosestListRootElm(editor, selectionStartElm);\n      var li = dom.getParent(selection.getStart(), 'LI', root);\n      if (li) {\n        var ul = li.parentNode;\n        if (ul === editor.getBody() && NodeType.isEmpty(dom, ul)) {\n          return true;\n        }\n        var rng_1 = Range.normalizeRange(selection.getRng());\n        var otherLi_1 = dom.getParent(findNextCaretContainer(editor, rng_1, isForward, root), 'LI', root);\n        if (otherLi_1 && otherLi_1 !== li) {\n          editor.undoManager.transact(function () {\n            if (isForward) {\n              mergeForward(editor, rng_1, otherLi_1, li);\n            } else {\n              if (NodeType.isFirstChild(li)) {\n                outdentListSelection(editor);\n              } else {\n                mergeBackward(editor, rng_1, li, otherLi_1);\n              }\n            }\n          });\n          return true;\n        } else if (!otherLi_1) {\n          if (!isForward && rng_1.startOffset === 0 && rng_1.endOffset === 0) {\n            editor.undoManager.transact(function () {\n              flattenListSelection(editor);\n            });\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n    var removeBlock = function (dom, block, root) {\n      var parentBlock = dom.getParent(block.parentNode, dom.isBlock, root);\n      dom.remove(block);\n      if (parentBlock && dom.isEmpty(parentBlock)) {\n        dom.remove(parentBlock);\n      }\n    };\n    var backspaceDeleteIntoListCaret = function (editor, isForward) {\n      var dom = editor.dom;\n      var selectionStartElm = editor.selection.getStart();\n      var root = Selection.getClosestListRootElm(editor, selectionStartElm);\n      var block = dom.getParent(selectionStartElm, dom.isBlock, root);\n      if (block && dom.isEmpty(block)) {\n        var rng = Range.normalizeRange(editor.selection.getRng());\n        var otherLi_2 = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root);\n        if (otherLi_2) {\n          editor.undoManager.transact(function () {\n            removeBlock(dom, block, root);\n            ToggleList.mergeWithAdjacentLists(dom, otherLi_2.parentNode);\n            editor.selection.select(otherLi_2, true);\n            editor.selection.collapse(isForward);\n          });\n          return true;\n        }\n      }\n      return false;\n    };\n    var backspaceDeleteCaret = function (editor, isForward) {\n      return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward);\n    };\n    var backspaceDeleteRange = function (editor) {\n      var selectionStartElm = editor.selection.getStart();\n      var root = Selection.getClosestListRootElm(editor, selectionStartElm);\n      var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root);\n      if (startListParent || Selection.getSelectedListItems(editor).length > 0) {\n        editor.undoManager.transact(function () {\n          editor.execCommand('Delete');\n          NormalizeLists.normalizeLists(editor.dom, editor.getBody());\n        });\n        return true;\n      }\n      return false;\n    };\n    var backspaceDelete = function (editor, isForward) {\n      return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor);\n    };\n    var setup = function (editor) {\n      editor.on('keydown', function (e) {\n        if (e.keyCode === global$3.BACKSPACE) {\n          if (backspaceDelete(editor, false)) {\n            e.preventDefault();\n          }\n        } else if (e.keyCode === global$3.DELETE) {\n          if (backspaceDelete(editor, true)) {\n            e.preventDefault();\n          }\n        }\n      });\n    };\n    var Delete = {\n      setup: setup,\n      backspaceDelete: backspaceDelete\n    };\n\n    var get = function (editor) {\n      return {\n        backspaceDelete: function (isForward) {\n          Delete.backspaceDelete(editor, isForward);\n        }\n      };\n    };\n    var Api = { get: get };\n\n    var queryListCommandState = function (editor, listName) {\n      return function () {\n        var parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL');\n        return parentList && parentList.nodeName === listName;\n      };\n    };\n    var register = function (editor) {\n      editor.on('BeforeExecCommand', function (e) {\n        var cmd = e.command.toLowerCase();\n        if (cmd === 'indent') {\n          indentListSelection(editor);\n        } else if (cmd === 'outdent') {\n          outdentListSelection(editor);\n        }\n      });\n      editor.addCommand('InsertUnorderedList', function (ui, detail) {\n        ToggleList.toggleList(editor, 'UL', detail);\n      });\n      editor.addCommand('InsertOrderedList', function (ui, detail) {\n        ToggleList.toggleList(editor, 'OL', detail);\n      });\n      editor.addCommand('InsertDefinitionList', function (ui, detail) {\n        ToggleList.toggleList(editor, 'DL', detail);\n      });\n      editor.addCommand('RemoveList', function () {\n        flattenListSelection(editor);\n      });\n      editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL'));\n      editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL'));\n      editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL'));\n    };\n    var Commands = { register: register };\n\n    var setupTabKey = function (editor) {\n      editor.on('keydown', function (e) {\n        if (e.keyCode !== global$3.TAB || global$3.metaKeyPressed(e)) {\n          return;\n        }\n        editor.undoManager.transact(function () {\n          if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) {\n            e.preventDefault();\n          }\n        });\n      });\n    };\n    var setup$1 = function (editor) {\n      if (Settings.shouldIndentOnTab(editor)) {\n        setupTabKey(editor);\n      }\n      Delete.setup(editor);\n    };\n    var Keyboard = { setup: setup$1 };\n\n    var findIndex = function (list, predicate) {\n      for (var index = 0; index < list.length; index++) {\n        var element = list[index];\n        if (predicate(element)) {\n          return index;\n        }\n      }\n      return -1;\n    };\n    var listState = function (editor, listName) {\n      return function (buttonApi) {\n        var nodeChangeHandler = function (e) {\n          var tableCellIndex = findIndex(e.parents, NodeType.isTableCellNode);\n          var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents;\n          var lists = global$5.grep(parents, NodeType.isListNode);\n          buttonApi.setActive(lists.length > 0 && lists[0].nodeName === listName && !isCustomList(lists[0]));\n        };\n        editor.on('NodeChange', nodeChangeHandler);\n        return function () {\n          return editor.off('NodeChange', nodeChangeHandler);\n        };\n      };\n    };\n    var register$1 = function (editor) {\n      var hasPlugin = function (editor, plugin) {\n        var plugins = editor.settings.plugins ? editor.settings.plugins : '';\n        return global$5.inArray(plugins.split(/[ ,]/), plugin) !== -1;\n      };\n      var exec = function (command) {\n        return function () {\n          return editor.execCommand(command);\n        };\n      };\n      if (!hasPlugin(editor, 'advlist')) {\n        editor.ui.registry.addToggleButton('numlist', {\n          icon: 'ordered-list',\n          active: false,\n          tooltip: 'Numbered list',\n          onAction: exec('InsertOrderedList'),\n          onSetup: listState(editor, 'OL')\n        });\n        editor.ui.registry.addToggleButton('bullist', {\n          icon: 'unordered-list',\n          active: false,\n          tooltip: 'Bullet list',\n          onAction: exec('InsertUnorderedList'),\n          onSetup: listState(editor, 'UL')\n        });\n      }\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global.add('lists', function (editor) {\n        Keyboard.setup(editor);\n        Buttons.register(editor);\n        Commands.register(editor);\n        return Api.get(editor);\n      });\n    }\n\n    Plugin();\n\n}(window));\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function () {\n    'use strict';\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var __assign = function () {\n      __assign = Object.assign || function __assign(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p))\n              t[p] = s[p];\n        }\n        return t;\n      };\n      return __assign.apply(this, arguments);\n    };\n\n    var noop = function () {\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isString = isType('string');\n    var isObject = isType('object');\n    var isArray = isType('array');\n    var isFunction = isType('function');\n\n    var nativeSlice = Array.prototype.slice;\n    var nativePush = Array.prototype.push;\n    var each = function (xs, f) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var flatten = function (xs) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var hasOwnProperty = Object.hasOwnProperty;\n    var get = function (obj, key) {\n      return has(obj, key) ? Option.from(obj[key]) : Option.none();\n    };\n    var has = function (obj, key) {\n      return hasOwnProperty.call(obj, key);\n    };\n\n    var getScripts = function (editor) {\n      return editor.getParam('media_scripts');\n    };\n    var getAudioTemplateCallback = function (editor) {\n      return editor.getParam('audio_template_callback');\n    };\n    var getVideoTemplateCallback = function (editor) {\n      return editor.getParam('video_template_callback');\n    };\n    var hasLiveEmbeds = function (editor) {\n      return editor.getParam('media_live_embeds', true);\n    };\n    var shouldFilterHtml = function (editor) {\n      return editor.getParam('media_filter_html', true);\n    };\n    var getUrlResolver = function (editor) {\n      return editor.getParam('media_url_resolver');\n    };\n    var hasAltSource = function (editor) {\n      return editor.getParam('media_alt_source', true);\n    };\n    var hasPoster = function (editor) {\n      return editor.getParam('media_poster', true);\n    };\n    var hasDimensions = function (editor) {\n      return editor.getParam('media_dimensions', true);\n    };\n    var Settings = {\n      getScripts: getScripts,\n      getAudioTemplateCallback: getAudioTemplateCallback,\n      getVideoTemplateCallback: getVideoTemplateCallback,\n      hasLiveEmbeds: hasLiveEmbeds,\n      shouldFilterHtml: shouldFilterHtml,\n      getUrlResolver: getUrlResolver,\n      hasAltSource: hasAltSource,\n      hasPoster: hasPoster,\n      hasDimensions: hasDimensions\n    };\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n    var global$3 = tinymce.util.Tools.resolve('tinymce.html.SaxParser');\n\n    var getVideoScriptMatch = function (prefixes, src) {\n      if (prefixes) {\n        for (var i = 0; i < prefixes.length; i++) {\n          if (src.indexOf(prefixes[i].filter) !== -1) {\n            return prefixes[i];\n          }\n        }\n      }\n    };\n\n    var DOM = global$2.DOM;\n    var trimPx = function (value) {\n      return value.replace(/px$/, '');\n    };\n    var getEphoxEmbedData = function (attrs) {\n      var style = attrs.map.style;\n      var styles = style ? DOM.parseStyle(style) : {};\n      return {\n        type: 'ephox-embed-iri',\n        source: attrs.map['data-ephox-embed-iri'],\n        altsource: '',\n        poster: '',\n        width: get(styles, 'max-width').map(trimPx).getOr(''),\n        height: get(styles, 'max-height').map(trimPx).getOr('')\n      };\n    };\n    var htmlToData = function (prefixes, html) {\n      var isEphoxEmbed = Cell(false);\n      var data = {};\n      global$3({\n        validate: false,\n        allow_conditional_comments: true,\n        start: function (name, attrs) {\n          if (isEphoxEmbed.get()) ; else if (has(attrs.map, 'data-ephox-embed-iri')) {\n            isEphoxEmbed.set(true);\n            data = getEphoxEmbedData(attrs);\n          } else {\n            if (!data.source && name === 'param') {\n              data.source = attrs.map.movie;\n            }\n            if (name === 'iframe' || name === 'object' || name === 'embed' || name === 'video' || name === 'audio') {\n              if (!data.type) {\n                data.type = name;\n              }\n              data = global$1.extend(attrs.map, data);\n            }\n            if (name === 'script') {\n              var videoScript = getVideoScriptMatch(prefixes, attrs.map.src);\n              if (!videoScript) {\n                return;\n              }\n              data = {\n                type: 'script',\n                source: attrs.map.src,\n                width: String(videoScript.width),\n                height: String(videoScript.height)\n              };\n            }\n            if (name === 'source') {\n              if (!data.source) {\n                data.source = attrs.map.src;\n              } else if (!data.altsource) {\n                data.altsource = attrs.map.src;\n              }\n            }\n            if (name === 'img' && !data.poster) {\n              data.poster = attrs.map.src;\n            }\n          }\n        }\n      }).parse(html);\n      data.source = data.source || data.src || data.data;\n      data.altsource = data.altsource || '';\n      data.poster = data.poster || '';\n      return data;\n    };\n\n    var guess = function (url) {\n      var mimes = {\n        mp3: 'audio/mpeg',\n        m4a: 'audio/x-m4a',\n        wav: 'audio/wav',\n        mp4: 'video/mp4',\n        webm: 'video/webm',\n        ogg: 'video/ogg',\n        swf: 'application/x-shockwave-flash'\n      };\n      var fileEnd = url.toLowerCase().split('.').pop();\n      var mime = mimes[fileEnd];\n      return mime ? mime : '';\n    };\n    var Mime = { guess: guess };\n\n    var global$4 = tinymce.util.Tools.resolve('tinymce.html.Schema');\n\n    var global$5 = tinymce.util.Tools.resolve('tinymce.html.Writer');\n\n    var DOM$1 = global$2.DOM;\n    var addPx = function (value) {\n      return /^[0-9.]+$/.test(value) ? value + 'px' : value;\n    };\n    var setAttributes = function (attrs, updatedAttrs) {\n      for (var name_1 in updatedAttrs) {\n        var value = '' + updatedAttrs[name_1];\n        if (attrs.map[name_1]) {\n          var i = attrs.length;\n          while (i--) {\n            var attr = attrs[i];\n            if (attr.name === name_1) {\n              if (value) {\n                attrs.map[name_1] = value;\n                attr.value = value;\n              } else {\n                delete attrs.map[name_1];\n                attrs.splice(i, 1);\n              }\n            }\n          }\n        } else if (value) {\n          attrs.push({\n            name: name_1,\n            value: value\n          });\n          attrs.map[name_1] = value;\n        }\n      }\n    };\n    var updateEphoxEmbed = function (data, attrs) {\n      var style = attrs.map.style;\n      var styleMap = style ? DOM$1.parseStyle(style) : {};\n      styleMap['max-width'] = addPx(data.width);\n      styleMap['max-height'] = addPx(data.height);\n      setAttributes(attrs, { style: DOM$1.serializeStyle(styleMap) });\n    };\n    var sources = [\n      'source',\n      'altsource'\n    ];\n    var updateHtml = function (html, data, updateAll) {\n      var writer = global$5();\n      var isEphoxEmbed = Cell(false);\n      var sourceCount = 0;\n      var hasImage;\n      global$3({\n        validate: false,\n        allow_conditional_comments: true,\n        comment: function (text) {\n          writer.comment(text);\n        },\n        cdata: function (text) {\n          writer.cdata(text);\n        },\n        text: function (text, raw) {\n          writer.text(text, raw);\n        },\n        start: function (name, attrs, empty) {\n          if (isEphoxEmbed.get()) ; else if (has(attrs.map, 'data-ephox-embed-iri')) {\n            isEphoxEmbed.set(true);\n            updateEphoxEmbed(data, attrs);\n          } else {\n            switch (name) {\n            case 'video':\n            case 'object':\n            case 'embed':\n            case 'img':\n            case 'iframe':\n              if (data.height !== undefined && data.width !== undefined) {\n                setAttributes(attrs, {\n                  width: data.width,\n                  height: data.height\n                });\n              }\n              break;\n            }\n            if (updateAll) {\n              switch (name) {\n              case 'video':\n                setAttributes(attrs, {\n                  poster: data.poster,\n                  src: ''\n                });\n                if (data.altsource) {\n                  setAttributes(attrs, { src: '' });\n                }\n                break;\n              case 'iframe':\n                setAttributes(attrs, { src: data.source });\n                break;\n              case 'source':\n                if (sourceCount < 2) {\n                  setAttributes(attrs, {\n                    src: data[sources[sourceCount]],\n                    type: data[sources[sourceCount] + 'mime']\n                  });\n                  if (!data[sources[sourceCount]]) {\n                    return;\n                  }\n                }\n                sourceCount++;\n                break;\n              case 'img':\n                if (!data.poster) {\n                  return;\n                }\n                hasImage = true;\n                break;\n              }\n            }\n          }\n          writer.start(name, attrs, empty);\n        },\n        end: function (name) {\n          if (!isEphoxEmbed.get()) {\n            if (name === 'video' && updateAll) {\n              for (var index = 0; index < 2; index++) {\n                if (data[sources[index]]) {\n                  var attrs = [];\n                  attrs.map = {};\n                  if (sourceCount < index) {\n                    setAttributes(attrs, {\n                      src: data[sources[index]],\n                      type: data[sources[index] + 'mime']\n                    });\n                    writer.start('source', attrs, true);\n                  }\n                }\n              }\n            }\n            if (data.poster && name === 'object' && updateAll && !hasImage) {\n              var imgAttrs = [];\n              imgAttrs.map = {};\n              setAttributes(imgAttrs, {\n                src: data.poster,\n                width: data.width,\n                height: data.height\n              });\n              writer.start('img', imgAttrs, true);\n            }\n          }\n          writer.end(name);\n        }\n      }, global$4({})).parse(html);\n      return writer.getContent();\n    };\n    var UpdateHtml = { updateHtml: updateHtml };\n\n    var urlPatterns = [\n      {\n        regex: /youtu\\.be\\/([\\w\\-_\\?&=.]+)/i,\n        type: 'iframe',\n        w: 560,\n        h: 314,\n        url: 'www.youtube.com/embed/$1',\n        allowFullscreen: true\n      },\n      {\n        regex: /youtube\\.com(.+)v=([^&]+)(&([a-z0-9&=\\-_]+))?/i,\n        type: 'iframe',\n        w: 560,\n        h: 314,\n        url: 'www.youtube.com/embed/$2?$4',\n        allowFullscreen: true\n      },\n      {\n        regex: /youtube.com\\/embed\\/([a-z0-9\\?&=\\-_]+)/i,\n        type: 'iframe',\n        w: 560,\n        h: 314,\n        url: 'www.youtube.com/embed/$1',\n        allowFullscreen: true\n      },\n      {\n        regex: /vimeo\\.com\\/([0-9]+)/,\n        type: 'iframe',\n        w: 425,\n        h: 350,\n        url: 'player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc',\n        allowFullscreen: true\n      },\n      {\n        regex: /vimeo\\.com\\/(.*)\\/([0-9]+)/,\n        type: 'iframe',\n        w: 425,\n        h: 350,\n        url: 'player.vimeo.com/video/$2?title=0&amp;byline=0',\n        allowFullscreen: true\n      },\n      {\n        regex: /maps\\.google\\.([a-z]{2,3})\\/maps\\/(.+)msid=(.+)/,\n        type: 'iframe',\n        w: 425,\n        h: 350,\n        url: 'maps.google.com/maps/ms?msid=$2&output=embed\"',\n        allowFullscreen: false\n      },\n      {\n        regex: /dailymotion\\.com\\/video\\/([^_]+)/,\n        type: 'iframe',\n        w: 480,\n        h: 270,\n        url: 'www.dailymotion.com/embed/video/$1',\n        allowFullscreen: true\n      },\n      {\n        regex: /dai\\.ly\\/([^_]+)/,\n        type: 'iframe',\n        w: 480,\n        h: 270,\n        url: 'www.dailymotion.com/embed/video/$1',\n        allowFullscreen: true\n      }\n    ];\n    var getProtocol = function (url) {\n      var protocolMatches = url.match(/^(https?:\\/\\/|www\\.)(.+)$/i);\n      if (protocolMatches && protocolMatches.length > 1) {\n        return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1];\n      } else {\n        return 'https://';\n      }\n    };\n    var getUrl = function (pattern, url) {\n      var protocol = getProtocol(url);\n      var match = pattern.regex.exec(url);\n      var newUrl = protocol + pattern.url;\n      var _loop_1 = function (i) {\n        newUrl = newUrl.replace('$' + i, function () {\n          return match[i] ? match[i] : '';\n        });\n      };\n      for (var i = 0; i < match.length; i++) {\n        _loop_1(i);\n      }\n      return newUrl.replace(/\\?$/, '');\n    };\n    var matchPattern = function (url) {\n      var patterns = urlPatterns.filter(function (pattern) {\n        return pattern.regex.test(url);\n      });\n      if (patterns.length > 0) {\n        return global$1.extend({}, patterns[0], { url: getUrl(patterns[0], url) });\n      } else {\n        return null;\n      }\n    };\n\n    var getIframeHtml = function (data) {\n      var allowFullscreen = data.allowFullscreen ? ' allowFullscreen=\"1\"' : '';\n      return '<iframe src=\"' + data.source + '\" width=\"' + data.width + '\" height=\"' + data.height + '\"' + allowFullscreen + '></iframe>';\n    };\n    var getFlashHtml = function (data) {\n      var html = '<object data=\"' + data.source + '\" width=\"' + data.width + '\" height=\"' + data.height + '\" type=\"application/x-shockwave-flash\">';\n      if (data.poster) {\n        html += '<img src=\"' + data.poster + '\" width=\"' + data.width + '\" height=\"' + data.height + '\" />';\n      }\n      html += '</object>';\n      return html;\n    };\n    var getAudioHtml = function (data, audioTemplateCallback) {\n      if (audioTemplateCallback) {\n        return audioTemplateCallback(data);\n      } else {\n        return '<audio controls=\"controls\" src=\"' + data.source + '\">' + (data.altsource ? '\\n<source src=\"' + data.altsource + '\"' + (data.altsourcemime ? ' type=\"' + data.altsourcemime + '\"' : '') + ' />\\n' : '') + '</audio>';\n      }\n    };\n    var getVideoHtml = function (data, videoTemplateCallback) {\n      if (videoTemplateCallback) {\n        return videoTemplateCallback(data);\n      } else {\n        return '<video width=\"' + data.width + '\" height=\"' + data.height + '\"' + (data.poster ? ' poster=\"' + data.poster + '\"' : '') + ' controls=\"controls\">\\n' + '<source src=\"' + data.source + '\"' + (data.sourcemime ? ' type=\"' + data.sourcemime + '\"' : '') + ' />\\n' + (data.altsource ? '<source src=\"' + data.altsource + '\"' + (data.altsourcemime ? ' type=\"' + data.altsourcemime + '\"' : '') + ' />\\n' : '') + '</video>';\n      }\n    };\n    var getScriptHtml = function (data) {\n      return '<script src=\"' + data.source + '\"></script>';\n    };\n    var dataToHtml = function (editor, dataIn) {\n      var data = global$1.extend({}, dataIn);\n      if (!data.source) {\n        global$1.extend(data, htmlToData(Settings.getScripts(editor), data.embed));\n        if (!data.source) {\n          return '';\n        }\n      }\n      if (!data.altsource) {\n        data.altsource = '';\n      }\n      if (!data.poster) {\n        data.poster = '';\n      }\n      data.source = editor.convertURL(data.source, 'source');\n      data.altsource = editor.convertURL(data.altsource, 'source');\n      data.sourcemime = Mime.guess(data.source);\n      data.altsourcemime = Mime.guess(data.altsource);\n      data.poster = editor.convertURL(data.poster, 'poster');\n      var pattern = matchPattern(data.source);\n      if (pattern) {\n        data.source = pattern.url;\n        data.type = pattern.type;\n        data.allowFullscreen = pattern.allowFullscreen;\n        data.width = data.width || String(pattern.w);\n        data.height = data.height || String(pattern.h);\n      }\n      if (data.embed) {\n        return UpdateHtml.updateHtml(data.embed, data, true);\n      } else {\n        var videoScript = getVideoScriptMatch(Settings.getScripts(editor), data.source);\n        if (videoScript) {\n          data.type = 'script';\n          data.width = String(videoScript.width);\n          data.height = String(videoScript.height);\n        }\n        var audioTemplateCallback = Settings.getAudioTemplateCallback(editor);\n        var videoTemplateCallback = Settings.getVideoTemplateCallback(editor);\n        data.width = data.width || '300';\n        data.height = data.height || '150';\n        global$1.each(data, function (value, key) {\n          data[key] = editor.dom.encode('' + value);\n        });\n        if (data.type === 'iframe') {\n          return getIframeHtml(data);\n        } else if (data.sourcemime === 'application/x-shockwave-flash') {\n          return getFlashHtml(data);\n        } else if (data.sourcemime.indexOf('audio') !== -1) {\n          return getAudioHtml(data, audioTemplateCallback);\n        } else if (data.type === 'script') {\n          return getScriptHtml(data);\n        } else {\n          return getVideoHtml(data, videoTemplateCallback);\n        }\n      }\n    };\n\n    var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n    var cache = {};\n    var embedPromise = function (data, dataToHtml, handler) {\n      return new global$6(function (res, rej) {\n        var wrappedResolve = function (response) {\n          if (response.html) {\n            cache[data.source] = response;\n          }\n          return res({\n            url: data.source,\n            html: response.html ? response.html : dataToHtml(data)\n          });\n        };\n        if (cache[data.source]) {\n          wrappedResolve(cache[data.source]);\n        } else {\n          handler({ url: data.source }, wrappedResolve, rej);\n        }\n      });\n    };\n    var defaultPromise = function (data, dataToHtml) {\n      return new global$6(function (res) {\n        res({\n          html: dataToHtml(data),\n          url: data.source\n        });\n      });\n    };\n    var loadedData = function (editor) {\n      return function (data) {\n        return dataToHtml(editor, data);\n      };\n    };\n    var getEmbedHtml = function (editor, data) {\n      var embedHandler = Settings.getUrlResolver(editor);\n      return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor));\n    };\n    var isCached = function (url) {\n      return cache.hasOwnProperty(url);\n    };\n    var Service = {\n      getEmbedHtml: getEmbedHtml,\n      isCached: isCached\n    };\n\n    var extractMeta = function (sourceInput, data) {\n      return get(data, sourceInput).bind(function (mainData) {\n        return get(mainData, 'meta');\n      });\n    };\n    var getValue = function (data, metaData, sourceInput) {\n      return function (prop) {\n        var _a;\n        var getFromData = function () {\n          return get(data, prop);\n        };\n        var getFromMetaData = function () {\n          return get(metaData, prop);\n        };\n        var getNonEmptyValue = function (c) {\n          return get(c, 'value').bind(function (v) {\n            return v.length > 0 ? Option.some(v) : Option.none();\n          });\n        };\n        var getFromValueFirst = function () {\n          return getFromData().bind(function (child) {\n            return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () {\n              return Option.from(child);\n            });\n          });\n        };\n        var getFromMetaFirst = function () {\n          return getFromMetaData().orThunk(function () {\n            return getFromData().bind(function (child) {\n              return isObject(child) ? getNonEmptyValue(child) : Option.from(child);\n            });\n          });\n        };\n        return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a;\n      };\n    };\n    var getDimensions = function (data, metaData) {\n      var dimensions = {};\n      get(data, 'dimensions').each(function (dims) {\n        each([\n          'width',\n          'height'\n        ], function (prop) {\n          get(metaData, prop).orThunk(function () {\n            return get(dims, prop);\n          }).each(function (value) {\n            return dimensions[prop] = value;\n          });\n        });\n      });\n      return dimensions;\n    };\n    var unwrap = function (data, sourceInput) {\n      var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {};\n      var get = getValue(data, metaData, sourceInput);\n      return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData));\n    };\n    var wrap = function (data) {\n      var wrapped = __assign(__assign({}, data), {\n        source: { value: get(data, 'source').getOr('') },\n        altsource: { value: get(data, 'altsource').getOr('') },\n        poster: { value: get(data, 'poster').getOr('') }\n      });\n      each([\n        'width',\n        'height'\n      ], function (prop) {\n        get(data, prop).each(function (value) {\n          var dimensions = wrapped.dimensions || {};\n          dimensions[prop] = value;\n          wrapped.dimensions = dimensions;\n        });\n      });\n      return wrapped;\n    };\n    var handleError = function (editor) {\n      return function (error) {\n        var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.';\n        editor.notificationManager.open({\n          type: 'error',\n          text: errorMessage\n        });\n      };\n    };\n    var snippetToData = function (editor, embedSnippet) {\n      return htmlToData(Settings.getScripts(editor), embedSnippet);\n    };\n    var isMediaElement = function (element) {\n      return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri');\n    };\n    var getEditorData = function (editor) {\n      var element = editor.selection.getNode();\n      var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : '';\n      return __assign({ embed: snippet }, htmlToData(Settings.getScripts(editor), snippet));\n    };\n    var addEmbedHtml = function (api, editor) {\n      return function (response) {\n        if (isString(response.url) && response.url.trim().length > 0) {\n          var html = response.html;\n          var snippetData = snippetToData(editor, html);\n          var nuData = __assign(__assign({}, snippetData), {\n            source: response.url,\n            embed: html\n          });\n          api.setData(wrap(nuData));\n        }\n      };\n    };\n    var selectPlaceholder = function (editor, beforeObjects) {\n      var afterObjects = editor.dom.select('img[data-mce-object]');\n      for (var i = 0; i < beforeObjects.length; i++) {\n        for (var y = afterObjects.length - 1; y >= 0; y--) {\n          if (beforeObjects[i] === afterObjects[y]) {\n            afterObjects.splice(y, 1);\n          }\n        }\n      }\n      editor.selection.select(afterObjects[0]);\n    };\n    var handleInsert = function (editor, html) {\n      var beforeObjects = editor.dom.select('img[data-mce-object]');\n      editor.insertContent(html);\n      selectPlaceholder(editor, beforeObjects);\n      editor.nodeChanged();\n    };\n    var submitForm = function (prevData, newData, editor) {\n      newData.embed = UpdateHtml.updateHtml(newData.embed, newData);\n      if (newData.embed && (prevData.source === newData.source || Service.isCached(newData.source))) {\n        handleInsert(editor, newData.embed);\n      } else {\n        Service.getEmbedHtml(editor, newData).then(function (response) {\n          handleInsert(editor, response.html);\n        }).catch(handleError(editor));\n      }\n    };\n    var showDialog = function (editor) {\n      var editorData = getEditorData(editor);\n      var currentData = Cell(editorData);\n      var initialData = wrap(editorData);\n      var handleSource = function (prevData, api) {\n        var serviceData = unwrap(api.getData(), 'source');\n        if (prevData.source !== serviceData.source) {\n          addEmbedHtml(win, editor)({\n            url: serviceData.source,\n            html: ''\n          });\n          Service.getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor));\n        }\n      };\n      var handleEmbed = function (api) {\n        var data = unwrap(api.getData());\n        var dataFromEmbed = snippetToData(editor, data.embed);\n        api.setData(wrap(dataFromEmbed));\n      };\n      var handleUpdate = function (api, sourceInput) {\n        var data = unwrap(api.getData(), sourceInput);\n        var embed = dataToHtml(editor, data);\n        api.setData(wrap(__assign(__assign({}, data), { embed: embed })));\n      };\n      var mediaInput = [{\n          name: 'source',\n          type: 'urlinput',\n          filetype: 'media',\n          label: 'Source'\n        }];\n      var sizeInput = !Settings.hasDimensions(editor) ? [] : [{\n          type: 'sizeinput',\n          name: 'dimensions',\n          label: 'Constrain proportions',\n          constrain: true\n        }];\n      var generalTab = {\n        title: 'General',\n        name: 'general',\n        items: flatten([\n          mediaInput,\n          sizeInput\n        ])\n      };\n      var embedTextarea = {\n        type: 'textarea',\n        name: 'embed',\n        label: 'Paste your embed code below:'\n      };\n      var embedTab = {\n        title: 'Embed',\n        items: [embedTextarea]\n      };\n      var advancedFormItems = [];\n      if (Settings.hasAltSource(editor)) {\n        advancedFormItems.push({\n          name: 'altsource',\n          type: 'urlinput',\n          filetype: 'media',\n          label: 'Alternative source URL'\n        });\n      }\n      if (Settings.hasPoster(editor)) {\n        advancedFormItems.push({\n          name: 'poster',\n          type: 'urlinput',\n          filetype: 'image',\n          label: 'Media poster (Image URL)'\n        });\n      }\n      var advancedTab = {\n        title: 'Advanced',\n        name: 'advanced',\n        items: advancedFormItems\n      };\n      var tabs = [\n        generalTab,\n        embedTab\n      ];\n      if (advancedFormItems.length > 0) {\n        tabs.push(advancedTab);\n      }\n      var body = {\n        type: 'tabpanel',\n        tabs: tabs\n      };\n      var win = editor.windowManager.open({\n        title: 'Insert/Edit Media',\n        size: 'normal',\n        body: body,\n        buttons: [\n          {\n            type: 'cancel',\n            name: 'cancel',\n            text: 'Cancel'\n          },\n          {\n            type: 'submit',\n            name: 'save',\n            text: 'Save',\n            primary: true\n          }\n        ],\n        onSubmit: function (api) {\n          var serviceData = unwrap(api.getData());\n          submitForm(currentData.get(), serviceData, editor);\n          api.close();\n        },\n        onChange: function (api, detail) {\n          switch (detail.name) {\n          case 'source':\n            handleSource(currentData.get(), api);\n            break;\n          case 'embed':\n            handleEmbed(api);\n            break;\n          case 'dimensions':\n          case 'altsource':\n          case 'poster':\n            handleUpdate(api, detail.name);\n            break;\n          }\n          currentData.set(unwrap(api.getData()));\n        },\n        initialData: initialData\n      });\n    };\n    var Dialog = {\n      showDialog: showDialog,\n      unwrap: unwrap\n    };\n\n    var get$1 = function (editor) {\n      var showDialog = function () {\n        Dialog.showDialog(editor);\n      };\n      return { showDialog: showDialog };\n    };\n    var Api = { get: get$1 };\n\n    var register = function (editor) {\n      var showDialog = function () {\n        Dialog.showDialog(editor);\n      };\n      editor.addCommand('mceMedia', showDialog);\n    };\n    var Commands = { register: register };\n\n    var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node');\n\n    var global$8 = tinymce.util.Tools.resolve('tinymce.Env');\n\n    var sanitize = function (editor, html) {\n      if (Settings.shouldFilterHtml(editor) === false) {\n        return html;\n      }\n      var writer = global$5();\n      var blocked;\n      global$3({\n        validate: false,\n        allow_conditional_comments: false,\n        comment: function (text) {\n          writer.comment(text);\n        },\n        cdata: function (text) {\n          writer.cdata(text);\n        },\n        text: function (text, raw) {\n          writer.text(text, raw);\n        },\n        start: function (name, attrs, empty) {\n          blocked = true;\n          if (name === 'script' || name === 'noscript' || name === 'svg') {\n            return;\n          }\n          for (var i = attrs.length - 1; i >= 0; i--) {\n            var attrName = attrs[i].name;\n            if (attrName.indexOf('on') === 0) {\n              delete attrs.map[attrName];\n              attrs.splice(i, 1);\n            }\n            if (attrName === 'style') {\n              attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name);\n            }\n          }\n          writer.start(name, attrs, empty);\n          blocked = false;\n        },\n        end: function (name) {\n          if (blocked) {\n            return;\n          }\n          writer.end(name);\n        }\n      }, global$4({})).parse(html);\n      return writer.getContent();\n    };\n    var Sanitize = { sanitize: sanitize };\n\n    var createPlaceholderNode = function (editor, node) {\n      var placeHolder;\n      var name = node.name;\n      placeHolder = new global$7('img', 1);\n      placeHolder.shortEnded = true;\n      retainAttributesAndInnerHtml(editor, node, placeHolder);\n      placeHolder.attr({\n        'width': node.attr('width') || '300',\n        'height': node.attr('height') || (name === 'audio' ? '30' : '150'),\n        'style': node.attr('style'),\n        'src': global$8.transparentSrc,\n        'data-mce-object': name,\n        'class': 'mce-object mce-object-' + name\n      });\n      return placeHolder;\n    };\n    var createPreviewIframeNode = function (editor, node) {\n      var previewWrapper;\n      var previewNode;\n      var shimNode;\n      var name = node.name;\n      previewWrapper = new global$7('span', 1);\n      previewWrapper.attr({\n        'contentEditable': 'false',\n        'style': node.attr('style'),\n        'data-mce-object': name,\n        'class': 'mce-preview-object mce-object-' + name\n      });\n      retainAttributesAndInnerHtml(editor, node, previewWrapper);\n      previewNode = new global$7(name, 1);\n      previewNode.attr({\n        src: node.attr('src'),\n        allowfullscreen: node.attr('allowfullscreen'),\n        style: node.attr('style'),\n        class: node.attr('class'),\n        width: node.attr('width'),\n        height: node.attr('height'),\n        frameborder: '0'\n      });\n      shimNode = new global$7('span', 1);\n      shimNode.attr('class', 'mce-shim');\n      previewWrapper.append(previewNode);\n      previewWrapper.append(shimNode);\n      return previewWrapper;\n    };\n    var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) {\n      var attrName;\n      var attrValue;\n      var attribs;\n      var ai;\n      var innerHtml;\n      attribs = sourceNode.attributes;\n      ai = attribs.length;\n      while (ai--) {\n        attrName = attribs[ai].name;\n        attrValue = attribs[ai].value;\n        if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') {\n          if (attrName === 'data' || attrName === 'src') {\n            attrValue = editor.convertURL(attrValue, attrName);\n          }\n          targetNode.attr('data-mce-p-' + attrName, attrValue);\n        }\n      }\n      innerHtml = sourceNode.firstChild && sourceNode.firstChild.value;\n      if (innerHtml) {\n        targetNode.attr('data-mce-html', escape(Sanitize.sanitize(editor, innerHtml)));\n        targetNode.firstChild = null;\n      }\n    };\n    var isPageEmbedWrapper = function (node) {\n      var nodeClass = node.attr('class');\n      return nodeClass && /\\btiny-pageembed\\b/.test(nodeClass);\n    };\n    var isWithinEmbedWrapper = function (node) {\n      while (node = node.parent) {\n        if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    var placeHolderConverter = function (editor) {\n      return function (nodes) {\n        var i = nodes.length;\n        var node;\n        var videoScript;\n        while (i--) {\n          node = nodes[i];\n          if (!node.parent) {\n            continue;\n          }\n          if (node.parent.attr('data-mce-object')) {\n            continue;\n          }\n          if (node.name === 'script') {\n            videoScript = getVideoScriptMatch(Settings.getScripts(editor), node.attr('src'));\n            if (!videoScript) {\n              continue;\n            }\n          }\n          if (videoScript) {\n            if (videoScript.width) {\n              node.attr('width', videoScript.width.toString());\n            }\n            if (videoScript.height) {\n              node.attr('height', videoScript.height.toString());\n            }\n          }\n          if (node.name === 'iframe' && Settings.hasLiveEmbeds(editor) && global$8.ceFalse) {\n            if (!isWithinEmbedWrapper(node)) {\n              node.replace(createPreviewIframeNode(editor, node));\n            }\n          } else {\n            if (!isWithinEmbedWrapper(node)) {\n              node.replace(createPlaceholderNode(editor, node));\n            }\n          }\n        }\n      };\n    };\n    var Nodes = {\n      createPreviewIframeNode: createPreviewIframeNode,\n      createPlaceholderNode: createPlaceholderNode,\n      placeHolderConverter: placeHolderConverter\n    };\n\n    var setup = function (editor) {\n      editor.on('preInit', function () {\n        var specialElements = editor.schema.getSpecialElements();\n        global$1.each('video audio iframe object'.split(' '), function (name) {\n          specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');\n        });\n        var boolAttrs = editor.schema.getBoolAttrs();\n        global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) {\n          boolAttrs[name] = {};\n        });\n        editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', Nodes.placeHolderConverter(editor));\n        editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) {\n          var i = nodes.length;\n          var node;\n          var realElm;\n          var ai;\n          var attribs;\n          var innerHtml;\n          var innerNode;\n          var realElmName;\n          var className;\n          while (i--) {\n            node = nodes[i];\n            if (!node.parent) {\n              continue;\n            }\n            realElmName = node.attr(name);\n            realElm = new global$7(realElmName, 1);\n            if (realElmName !== 'audio' && realElmName !== 'script') {\n              className = node.attr('class');\n              if (className && className.indexOf('mce-preview-object') !== -1) {\n                realElm.attr({\n                  width: node.firstChild.attr('width'),\n                  height: node.firstChild.attr('height')\n                });\n              } else {\n                realElm.attr({\n                  width: node.attr('width'),\n                  height: node.attr('height')\n                });\n              }\n            }\n            realElm.attr({ style: node.attr('style') });\n            attribs = node.attributes;\n            ai = attribs.length;\n            while (ai--) {\n              var attrName = attribs[ai].name;\n              if (attrName.indexOf('data-mce-p-') === 0) {\n                realElm.attr(attrName.substr(11), attribs[ai].value);\n              }\n            }\n            if (realElmName === 'script') {\n              realElm.attr('type', 'text/javascript');\n            }\n            innerHtml = node.attr('data-mce-html');\n            if (innerHtml) {\n              innerNode = new global$7('#text', 3);\n              innerNode.raw = true;\n              innerNode.value = Sanitize.sanitize(editor, unescape(innerHtml));\n              realElm.append(innerNode);\n            }\n            node.replace(realElm);\n          }\n        });\n      });\n      editor.on('SetContent', function () {\n        editor.$('span.mce-preview-object').each(function (index, elm) {\n          var $elm = editor.$(elm);\n          if ($elm.find('span.mce-shim').length === 0) {\n            $elm.append('<span class=\"mce-shim\"></span>');\n          }\n        });\n      });\n    };\n    var FilterContent = { setup: setup };\n\n    var setup$1 = function (editor) {\n      editor.on('ResolveName', function (e) {\n        var name;\n        if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) {\n          e.name = name;\n        }\n      });\n    };\n    var ResolveName = { setup: setup$1 };\n\n    var setup$2 = function (editor) {\n      editor.on('click keyup touchend', function () {\n        var selectedNode = editor.selection.getNode();\n        if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) {\n          if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) {\n            selectedNode.setAttribute('data-mce-selected', '2');\n          }\n        }\n      });\n      editor.on('ObjectSelected', function (e) {\n        var objectType = e.target.getAttribute('data-mce-object');\n        if (objectType === 'audio' || objectType === 'script') {\n          e.preventDefault();\n        }\n      });\n      editor.on('ObjectResized', function (e) {\n        var target = e.target;\n        var html;\n        if (target.getAttribute('data-mce-object')) {\n          html = target.getAttribute('data-mce-html');\n          if (html) {\n            html = unescape(html);\n            target.setAttribute('data-mce-html', escape(UpdateHtml.updateHtml(html, {\n              width: String(e.width),\n              height: String(e.height)\n            })));\n          }\n        }\n      });\n    };\n    var Selection = { setup: setup$2 };\n\n    var stateSelectorAdapter = function (editor, selector) {\n      return function (buttonApi) {\n        return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind;\n      };\n    };\n    var register$1 = function (editor) {\n      editor.ui.registry.addToggleButton('media', {\n        tooltip: 'Insert/edit media',\n        icon: 'embed',\n        onAction: function () {\n          editor.execCommand('mceMedia');\n        },\n        onSetup: stateSelectorAdapter(editor, [\n          'img[data-mce-object]',\n          'span[data-mce-object]',\n          'div[data-ephox-embed-iri]'\n        ])\n      });\n      editor.ui.registry.addMenuItem('media', {\n        icon: 'embed',\n        text: 'Media...',\n        onAction: function () {\n          editor.execCommand('mceMedia');\n        }\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global.add('media', function (editor) {\n        Commands.register(editor);\n        Buttons.register(editor);\n        ResolveName.setup(editor);\n        FilterContent.setup(editor);\n        Selection.setup(editor);\n        return Api.get(editor);\n      });\n    }\n\n    Plugin();\n\n}());\n","export default function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function () {\n    'use strict';\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var getPreviewDialogWidth = function (editor) {\n      return parseInt(editor.getParam('plugin_preview_width', '650'), 10);\n    };\n    var getPreviewDialogHeight = function (editor) {\n      return parseInt(editor.getParam('plugin_preview_height', '500'), 10);\n    };\n    var getContentStyle = function (editor) {\n      return editor.getParam('content_style', '');\n    };\n    var shouldUseContentCssCors = function (editor) {\n      return editor.getParam('content_css_cors', false, 'boolean');\n    };\n    var Settings = {\n      getPreviewDialogWidth: getPreviewDialogWidth,\n      getPreviewDialogHeight: getPreviewDialogHeight,\n      getContentStyle: getContentStyle,\n      shouldUseContentCssCors: shouldUseContentCssCors\n    };\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.Env');\n\n    var getPreviewHtml = function (editor) {\n      var headHtml = '';\n      var encode = editor.dom.encode;\n      var contentStyle = Settings.getContentStyle(editor);\n      headHtml += '<base href=\"' + encode(editor.documentBaseURI.getURI()) + '\">';\n      if (contentStyle) {\n        headHtml += '<style type=\"text/css\">' + contentStyle + '</style>';\n      }\n      var cors = Settings.shouldUseContentCssCors(editor) ? ' crossorigin=\"anonymous\"' : '';\n      global$1.each(editor.contentCSS, function (url) {\n        headHtml += '<link type=\"text/css\" rel=\"stylesheet\" href=\"' + encode(editor.documentBaseURI.toAbsolute(url)) + '\"' + cors + '>';\n      });\n      var bodyId = editor.settings.body_id || 'tinymce';\n      if (bodyId.indexOf('=') !== -1) {\n        bodyId = editor.getParam('body_id', '', 'hash');\n        bodyId = bodyId[editor.id] || bodyId;\n      }\n      var bodyClass = editor.settings.body_class || '';\n      if (bodyClass.indexOf('=') !== -1) {\n        bodyClass = editor.getParam('body_class', '', 'hash');\n        bodyClass = bodyClass[editor.id] || '';\n      }\n      var isMetaKeyPressed = global$2.mac ? 'e.metaKey' : 'e.ctrlKey && !e.altKey';\n      var preventClicksOnLinksScript = '<script>' + 'document.addEventListener && document.addEventListener(\"click\", function(e) {' + 'for (var elm = e.target; elm; elm = elm.parentNode) {' + 'if (elm.nodeName === \"A\" && !(' + isMetaKeyPressed + ')) {' + 'e.preventDefault();' + '}' + '}' + '}, false);' + '</script> ';\n      var directionality = editor.getBody().dir;\n      var dirAttr = directionality ? ' dir=\"' + encode(directionality) + '\"' : '';\n      var previewHtml = '<!DOCTYPE html>' + '<html>' + '<head>' + headHtml + '</head>' + '<body id=\"' + encode(bodyId) + '\" class=\"mce-content-body ' + encode(bodyClass) + '\"' + dirAttr + '>' + editor.getContent() + preventClicksOnLinksScript + '</body>' + '</html>';\n      return previewHtml;\n    };\n    var IframeContent = { getPreviewHtml: getPreviewHtml };\n\n    var open = function (editor) {\n      var content = IframeContent.getPreviewHtml(editor);\n      var dataApi = editor.windowManager.open({\n        title: 'Preview',\n        size: 'large',\n        body: {\n          type: 'panel',\n          items: [{\n              name: 'preview',\n              type: 'iframe',\n              sandboxed: true\n            }]\n        },\n        buttons: [{\n            type: 'cancel',\n            name: 'close',\n            text: 'Close',\n            primary: true\n          }],\n        initialData: { preview: content }\n      });\n      dataApi.focus('close');\n    };\n\n    var register = function (editor) {\n      editor.addCommand('mcePreview', function () {\n        open(editor);\n      });\n    };\n    var Commands = { register: register };\n\n    var register$1 = function (editor) {\n      editor.ui.registry.addButton('preview', {\n        icon: 'preview',\n        tooltip: 'Preview',\n        onAction: function () {\n          return editor.execCommand('mcePreview');\n        }\n      });\n      editor.ui.registry.addMenuItem('preview', {\n        icon: 'preview',\n        text: 'Preview',\n        onAction: function () {\n          return editor.execCommand('mcePreview');\n        }\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global.add('preview', function (editor) {\n        Commands.register(editor);\n        Buttons.register(editor);\n      });\n    }\n\n    Plugin();\n\n}());\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var hasProPlugin = function (editor) {\n      if (/(^|[ ,])powerpaste([, ]|$)/.test(editor.settings.plugins) && global$1.get('powerpaste')) {\n        if (typeof domGlobals.window.console !== 'undefined' && domGlobals.window.console.log) {\n          domGlobals.window.console.log('PowerPaste is incompatible with Paste plugin! Remove \\'paste\\' from the \\'plugins\\' option.');\n        }\n        return true;\n      } else {\n        return false;\n      }\n    };\n    var DetectProPlugin = { hasProPlugin: hasProPlugin };\n\n    var get = function (clipboard, quirks) {\n      return {\n        clipboard: clipboard,\n        quirks: quirks\n      };\n    };\n    var Api = { get: get };\n\n    var firePastePreProcess = function (editor, html, internal, isWordHtml) {\n      return editor.fire('PastePreProcess', {\n        content: html,\n        internal: internal,\n        wordContent: isWordHtml\n      });\n    };\n    var firePastePostProcess = function (editor, node, internal, isWordHtml) {\n      return editor.fire('PastePostProcess', {\n        node: node,\n        internal: internal,\n        wordContent: isWordHtml\n      });\n    };\n    var firePastePlainTextToggle = function (editor, state) {\n      return editor.fire('PastePlainTextToggle', { state: state });\n    };\n    var firePaste = function (editor, ieFake) {\n      return editor.fire('paste', { ieFake: ieFake });\n    };\n    var Events = {\n      firePastePreProcess: firePastePreProcess,\n      firePastePostProcess: firePastePostProcess,\n      firePastePlainTextToggle: firePastePlainTextToggle,\n      firePaste: firePaste\n    };\n\n    var togglePlainTextPaste = function (editor, clipboard) {\n      if (clipboard.pasteFormat.get() === 'text') {\n        clipboard.pasteFormat.set('html');\n        Events.firePastePlainTextToggle(editor, false);\n      } else {\n        clipboard.pasteFormat.set('text');\n        Events.firePastePlainTextToggle(editor, true);\n      }\n      editor.focus();\n    };\n    var Actions = { togglePlainTextPaste: togglePlainTextPaste };\n\n    var register = function (editor, clipboard) {\n      editor.addCommand('mceTogglePlainTextPaste', function () {\n        Actions.togglePlainTextPaste(editor, clipboard);\n      });\n      editor.addCommand('mceInsertClipboardContent', function (ui, value) {\n        if (value.content) {\n          clipboard.pasteHtml(value.content, value.internal);\n        }\n        if (value.text) {\n          clipboard.pasteText(value.text);\n        }\n      });\n    };\n    var Commands = { register: register };\n\n    var noop = function () {\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isFunction = isType('function');\n\n    var nativeSlice = Array.prototype.slice;\n    var map = function (xs, f) {\n      var len = xs.length;\n      var r = new Array(len);\n      for (var i = 0; i < len; i++) {\n        var x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    var each = function (xs, f) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var filter = function (xs, pred) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n    var foldl = function (xs, f, acc) {\n      each(xs, function (x) {\n        acc = f(acc, x);\n      });\n      return acc;\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n\n    var exports$1 = {}, module = { exports: exports$1 };\n    (function (define, exports, module, require) {\n      (function (f) {\n        if (typeof exports === 'object' && typeof module !== 'undefined') {\n          module.exports = f();\n        } else if (typeof define === 'function' && define.amd) {\n          define([], f);\n        } else {\n          var g;\n          if (typeof window !== 'undefined') {\n            g = window;\n          } else if (typeof global !== 'undefined') {\n            g = global;\n          } else if (typeof self !== 'undefined') {\n            g = self;\n          } else {\n            g = this;\n          }\n          g.EphoxContactWrapper = f();\n        }\n      }(function () {\n        return function () {\n          function r(e, n, t) {\n            function o(i, f) {\n              if (!n[i]) {\n                if (!e[i]) {\n                  var c = 'function' == typeof require && require;\n                  if (!f && c)\n                    return c(i, !0);\n                  if (u)\n                    return u(i, !0);\n                  var a = new Error('Cannot find module \\'' + i + '\\'');\n                  throw a.code = 'MODULE_NOT_FOUND', a;\n                }\n                var p = n[i] = { exports: {} };\n                e[i][0].call(p.exports, function (r) {\n                  var n = e[i][1][r];\n                  return o(n || r);\n                }, p, p.exports, r, e, n, t);\n              }\n              return n[i].exports;\n            }\n            for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++)\n              o(t[i]);\n            return o;\n          }\n          return r;\n        }()({\n          1: [\n            function (require, module, exports) {\n              var process = module.exports = {};\n              var cachedSetTimeout;\n              var cachedClearTimeout;\n              function defaultSetTimout() {\n                throw new Error('setTimeout has not been defined');\n              }\n              function defaultClearTimeout() {\n                throw new Error('clearTimeout has not been defined');\n              }\n              (function () {\n                try {\n                  if (typeof setTimeout === 'function') {\n                    cachedSetTimeout = setTimeout;\n                  } else {\n                    cachedSetTimeout = defaultSetTimout;\n                  }\n                } catch (e) {\n                  cachedSetTimeout = defaultSetTimout;\n                }\n                try {\n                  if (typeof clearTimeout === 'function') {\n                    cachedClearTimeout = clearTimeout;\n                  } else {\n                    cachedClearTimeout = defaultClearTimeout;\n                  }\n                } catch (e) {\n                  cachedClearTimeout = defaultClearTimeout;\n                }\n              }());\n              function runTimeout(fun) {\n                if (cachedSetTimeout === setTimeout) {\n                  return setTimeout(fun, 0);\n                }\n                if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n                  cachedSetTimeout = setTimeout;\n                  return setTimeout(fun, 0);\n                }\n                try {\n                  return cachedSetTimeout(fun, 0);\n                } catch (e) {\n                  try {\n                    return cachedSetTimeout.call(null, fun, 0);\n                  } catch (e) {\n                    return cachedSetTimeout.call(this, fun, 0);\n                  }\n                }\n              }\n              function runClearTimeout(marker) {\n                if (cachedClearTimeout === clearTimeout) {\n                  return clearTimeout(marker);\n                }\n                if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n                  cachedClearTimeout = clearTimeout;\n                  return clearTimeout(marker);\n                }\n                try {\n                  return cachedClearTimeout(marker);\n                } catch (e) {\n                  try {\n                    return cachedClearTimeout.call(null, marker);\n                  } catch (e) {\n                    return cachedClearTimeout.call(this, marker);\n                  }\n                }\n              }\n              var queue = [];\n              var draining = false;\n              var currentQueue;\n              var queueIndex = -1;\n              function cleanUpNextTick() {\n                if (!draining || !currentQueue) {\n                  return;\n                }\n                draining = false;\n                if (currentQueue.length) {\n                  queue = currentQueue.concat(queue);\n                } else {\n                  queueIndex = -1;\n                }\n                if (queue.length) {\n                  drainQueue();\n                }\n              }\n              function drainQueue() {\n                if (draining) {\n                  return;\n                }\n                var timeout = runTimeout(cleanUpNextTick);\n                draining = true;\n                var len = queue.length;\n                while (len) {\n                  currentQueue = queue;\n                  queue = [];\n                  while (++queueIndex < len) {\n                    if (currentQueue) {\n                      currentQueue[queueIndex].run();\n                    }\n                  }\n                  queueIndex = -1;\n                  len = queue.length;\n                }\n                currentQueue = null;\n                draining = false;\n                runClearTimeout(timeout);\n              }\n              process.nextTick = function (fun) {\n                var args = new Array(arguments.length - 1);\n                if (arguments.length > 1) {\n                  for (var i = 1; i < arguments.length; i++) {\n                    args[i - 1] = arguments[i];\n                  }\n                }\n                queue.push(new Item(fun, args));\n                if (queue.length === 1 && !draining) {\n                  runTimeout(drainQueue);\n                }\n              };\n              function Item(fun, array) {\n                this.fun = fun;\n                this.array = array;\n              }\n              Item.prototype.run = function () {\n                this.fun.apply(null, this.array);\n              };\n              process.title = 'browser';\n              process.browser = true;\n              process.env = {};\n              process.argv = [];\n              process.version = '';\n              process.versions = {};\n              function noop() {\n              }\n              process.on = noop;\n              process.addListener = noop;\n              process.once = noop;\n              process.off = noop;\n              process.removeListener = noop;\n              process.removeAllListeners = noop;\n              process.emit = noop;\n              process.prependListener = noop;\n              process.prependOnceListener = noop;\n              process.listeners = function (name) {\n                return [];\n              };\n              process.binding = function (name) {\n                throw new Error('process.binding is not supported');\n              };\n              process.cwd = function () {\n                return '/';\n              };\n              process.chdir = function (dir) {\n                throw new Error('process.chdir is not supported');\n              };\n              process.umask = function () {\n                return 0;\n              };\n            },\n            {}\n          ],\n          2: [\n            function (require, module, exports) {\n              (function (setImmediate) {\n                (function (root) {\n                  var setTimeoutFunc = setTimeout;\n                  function noop() {\n                  }\n                  function bind(fn, thisArg) {\n                    return function () {\n                      fn.apply(thisArg, arguments);\n                    };\n                  }\n                  function Promise(fn) {\n                    if (typeof this !== 'object')\n                      throw new TypeError('Promises must be constructed via new');\n                    if (typeof fn !== 'function')\n                      throw new TypeError('not a function');\n                    this._state = 0;\n                    this._handled = false;\n                    this._value = undefined;\n                    this._deferreds = [];\n                    doResolve(fn, this);\n                  }\n                  function handle(self, deferred) {\n                    while (self._state === 3) {\n                      self = self._value;\n                    }\n                    if (self._state === 0) {\n                      self._deferreds.push(deferred);\n                      return;\n                    }\n                    self._handled = true;\n                    Promise._immediateFn(function () {\n                      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n                      if (cb === null) {\n                        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n                        return;\n                      }\n                      var ret;\n                      try {\n                        ret = cb(self._value);\n                      } catch (e) {\n                        reject(deferred.promise, e);\n                        return;\n                      }\n                      resolve(deferred.promise, ret);\n                    });\n                  }\n                  function resolve(self, newValue) {\n                    try {\n                      if (newValue === self)\n                        throw new TypeError('A promise cannot be resolved with itself.');\n                      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n                        var then = newValue.then;\n                        if (newValue instanceof Promise) {\n                          self._state = 3;\n                          self._value = newValue;\n                          finale(self);\n                          return;\n                        } else if (typeof then === 'function') {\n                          doResolve(bind(then, newValue), self);\n                          return;\n                        }\n                      }\n                      self._state = 1;\n                      self._value = newValue;\n                      finale(self);\n                    } catch (e) {\n                      reject(self, e);\n                    }\n                  }\n                  function reject(self, newValue) {\n                    self._state = 2;\n                    self._value = newValue;\n                    finale(self);\n                  }\n                  function finale(self) {\n                    if (self._state === 2 && self._deferreds.length === 0) {\n                      Promise._immediateFn(function () {\n                        if (!self._handled) {\n                          Promise._unhandledRejectionFn(self._value);\n                        }\n                      });\n                    }\n                    for (var i = 0, len = self._deferreds.length; i < len; i++) {\n                      handle(self, self._deferreds[i]);\n                    }\n                    self._deferreds = null;\n                  }\n                  function Handler(onFulfilled, onRejected, promise) {\n                    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n                    this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n                    this.promise = promise;\n                  }\n                  function doResolve(fn, self) {\n                    var done = false;\n                    try {\n                      fn(function (value) {\n                        if (done)\n                          return;\n                        done = true;\n                        resolve(self, value);\n                      }, function (reason) {\n                        if (done)\n                          return;\n                        done = true;\n                        reject(self, reason);\n                      });\n                    } catch (ex) {\n                      if (done)\n                        return;\n                      done = true;\n                      reject(self, ex);\n                    }\n                  }\n                  Promise.prototype['catch'] = function (onRejected) {\n                    return this.then(null, onRejected);\n                  };\n                  Promise.prototype.then = function (onFulfilled, onRejected) {\n                    var prom = new this.constructor(noop);\n                    handle(this, new Handler(onFulfilled, onRejected, prom));\n                    return prom;\n                  };\n                  Promise.all = function (arr) {\n                    var args = Array.prototype.slice.call(arr);\n                    return new Promise(function (resolve, reject) {\n                      if (args.length === 0)\n                        return resolve([]);\n                      var remaining = args.length;\n                      function res(i, val) {\n                        try {\n                          if (val && (typeof val === 'object' || typeof val === 'function')) {\n                            var then = val.then;\n                            if (typeof then === 'function') {\n                              then.call(val, function (val) {\n                                res(i, val);\n                              }, reject);\n                              return;\n                            }\n                          }\n                          args[i] = val;\n                          if (--remaining === 0) {\n                            resolve(args);\n                          }\n                        } catch (ex) {\n                          reject(ex);\n                        }\n                      }\n                      for (var i = 0; i < args.length; i++) {\n                        res(i, args[i]);\n                      }\n                    });\n                  };\n                  Promise.resolve = function (value) {\n                    if (value && typeof value === 'object' && value.constructor === Promise) {\n                      return value;\n                    }\n                    return new Promise(function (resolve) {\n                      resolve(value);\n                    });\n                  };\n                  Promise.reject = function (value) {\n                    return new Promise(function (resolve, reject) {\n                      reject(value);\n                    });\n                  };\n                  Promise.race = function (values) {\n                    return new Promise(function (resolve, reject) {\n                      for (var i = 0, len = values.length; i < len; i++) {\n                        values[i].then(resolve, reject);\n                      }\n                    });\n                  };\n                  Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {\n                    setImmediate(fn);\n                  } : function (fn) {\n                    setTimeoutFunc(fn, 0);\n                  };\n                  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n                    if (typeof console !== 'undefined' && console) {\n                      console.warn('Possible Unhandled Promise Rejection:', err);\n                    }\n                  };\n                  Promise._setImmediateFn = function _setImmediateFn(fn) {\n                    Promise._immediateFn = fn;\n                  };\n                  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {\n                    Promise._unhandledRejectionFn = fn;\n                  };\n                  if (typeof module !== 'undefined' && module.exports) {\n                    module.exports = Promise;\n                  } else if (!root.Promise) {\n                    root.Promise = Promise;\n                  }\n                }(this));\n              }.call(this, require('timers').setImmediate));\n            },\n            { 'timers': 3 }\n          ],\n          3: [\n            function (require, module, exports) {\n              (function (setImmediate, clearImmediate) {\n                var nextTick = require('process/browser.js').nextTick;\n                var apply = Function.prototype.apply;\n                var slice = Array.prototype.slice;\n                var immediateIds = {};\n                var nextImmediateId = 0;\n                exports.setTimeout = function () {\n                  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n                };\n                exports.setInterval = function () {\n                  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n                };\n                exports.clearTimeout = exports.clearInterval = function (timeout) {\n                  timeout.close();\n                };\n                function Timeout(id, clearFn) {\n                  this._id = id;\n                  this._clearFn = clearFn;\n                }\n                Timeout.prototype.unref = Timeout.prototype.ref = function () {\n                };\n                Timeout.prototype.close = function () {\n                  this._clearFn.call(window, this._id);\n                };\n                exports.enroll = function (item, msecs) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = msecs;\n                };\n                exports.unenroll = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = -1;\n                };\n                exports._unrefActive = exports.active = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  var msecs = item._idleTimeout;\n                  if (msecs >= 0) {\n                    item._idleTimeoutId = setTimeout(function onTimeout() {\n                      if (item._onTimeout)\n                        item._onTimeout();\n                    }, msecs);\n                  }\n                };\n                exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) {\n                  var id = nextImmediateId++;\n                  var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n                  immediateIds[id] = true;\n                  nextTick(function onNextTick() {\n                    if (immediateIds[id]) {\n                      if (args) {\n                        fn.apply(null, args);\n                      } else {\n                        fn.call(null);\n                      }\n                      exports.clearImmediate(id);\n                    }\n                  });\n                  return id;\n                };\n                exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) {\n                  delete immediateIds[id];\n                };\n              }.call(this, require('timers').setImmediate, require('timers').clearImmediate));\n            },\n            {\n              'process/browser.js': 1,\n              'timers': 3\n            }\n          ],\n          4: [\n            function (require, module, exports) {\n              var promisePolyfill = require('promise-polyfill');\n              var Global = function () {\n                if (typeof window !== 'undefined') {\n                  return window;\n                } else {\n                  return Function('return this;')();\n                }\n              }();\n              module.exports = { boltExport: Global.Promise || promisePolyfill };\n            },\n            { 'promise-polyfill': 2 }\n          ]\n        }, {}, [4])(4);\n      }));\n    }(undefined, exports$1, module, undefined));\n    var Promise = module.exports.boltExport;\n\n    var nu = function (baseFn) {\n      var data = Option.none();\n      var callbacks = [];\n      var map = function (f) {\n        return nu(function (nCallback) {\n          get(function (data) {\n            nCallback(f(data));\n          });\n        });\n      };\n      var get = function (nCallback) {\n        if (isReady()) {\n          call(nCallback);\n        } else {\n          callbacks.push(nCallback);\n        }\n      };\n      var set = function (x) {\n        data = Option.some(x);\n        run(callbacks);\n        callbacks = [];\n      };\n      var isReady = function () {\n        return data.isSome();\n      };\n      var run = function (cbs) {\n        each(cbs, call);\n      };\n      var call = function (cb) {\n        data.each(function (x) {\n          domGlobals.setTimeout(function () {\n            cb(x);\n          }, 0);\n        });\n      };\n      baseFn(set);\n      return {\n        get: get,\n        map: map,\n        isReady: isReady\n      };\n    };\n    var pure = function (a) {\n      return nu(function (callback) {\n        callback(a);\n      });\n    };\n    var LazyValue = {\n      nu: nu,\n      pure: pure\n    };\n\n    var errorReporter = function (err) {\n      domGlobals.setTimeout(function () {\n        throw err;\n      }, 0);\n    };\n    var make = function (run) {\n      var get = function (callback) {\n        run().then(callback, errorReporter);\n      };\n      var map = function (fab) {\n        return make(function () {\n          return run().then(fab);\n        });\n      };\n      var bind = function (aFutureB) {\n        return make(function () {\n          return run().then(function (v) {\n            return aFutureB(v).toPromise();\n          });\n        });\n      };\n      var anonBind = function (futureB) {\n        return make(function () {\n          return run().then(function () {\n            return futureB.toPromise();\n          });\n        });\n      };\n      var toLazy = function () {\n        return LazyValue.nu(get);\n      };\n      var toCached = function () {\n        var cache = null;\n        return make(function () {\n          if (cache === null) {\n            cache = run();\n          }\n          return cache;\n        });\n      };\n      var toPromise = run;\n      return {\n        map: map,\n        bind: bind,\n        anonBind: anonBind,\n        toLazy: toLazy,\n        toCached: toCached,\n        toPromise: toPromise,\n        get: get\n      };\n    };\n    var nu$1 = function (baseFn) {\n      return make(function () {\n        return new Promise(baseFn);\n      });\n    };\n    var pure$1 = function (a) {\n      return make(function () {\n        return Promise.resolve(a);\n      });\n    };\n    var Future = {\n      nu: nu$1,\n      pure: pure$1\n    };\n\n    var par = function (asyncValues, nu) {\n      return nu(function (callback) {\n        var r = [];\n        var count = 0;\n        var cb = function (i) {\n          return function (value) {\n            r[i] = value;\n            count++;\n            if (count >= asyncValues.length) {\n              callback(r);\n            }\n          };\n        };\n        if (asyncValues.length === 0) {\n          callback([]);\n        } else {\n          each(asyncValues, function (asyncValue, i) {\n            asyncValue.get(cb(i));\n          });\n        }\n      });\n    };\n\n    var par$1 = function (futures) {\n      return par(futures, Future.nu);\n    };\n    var traverse = function (array, fn) {\n      return par$1(map(array, fn));\n    };\n\n    var value = function () {\n      var subject = Cell(Option.none());\n      var clear = function () {\n        subject.set(Option.none());\n      };\n      var set = function (s) {\n        subject.set(Option.some(s));\n      };\n      var on = function (f) {\n        subject.get().each(f);\n      };\n      var isSet = function () {\n        return subject.get().isSome();\n      };\n      return {\n        clear: clear,\n        set: set,\n        isSet: isSet,\n        on: on\n      };\n    };\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.Env');\n\n    var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n    var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var global$5 = tinymce.util.Tools.resolve('tinymce.util.VK');\n\n    var internalMimeType = 'x-tinymce/html';\n    var internalMark = '<!-- ' + internalMimeType + ' -->';\n    var mark = function (html) {\n      return internalMark + html;\n    };\n    var unmark = function (html) {\n      return html.replace(internalMark, '');\n    };\n    var isMarked = function (html) {\n      return html.indexOf(internalMark) !== -1;\n    };\n    var InternalHtml = {\n      mark: mark,\n      unmark: unmark,\n      isMarked: isMarked,\n      internalHtmlMime: function () {\n        return internalMimeType;\n      }\n    };\n\n    var global$6 = tinymce.util.Tools.resolve('tinymce.html.Entities');\n\n    var isPlainText = function (text) {\n      return !/<(?:\\/?(?!(?:div|p|br|span)>)\\w+|(?:(?!(?:span style=\"white-space:\\s?pre;?\">)|br\\s?\\/>))\\w+\\s[^>]+)>/i.test(text);\n    };\n    var toBRs = function (text) {\n      return text.replace(/\\r?\\n/g, '<br>');\n    };\n    var openContainer = function (rootTag, rootAttrs) {\n      var key;\n      var attrs = [];\n      var tag = '<' + rootTag;\n      if (typeof rootAttrs === 'object') {\n        for (key in rootAttrs) {\n          if (rootAttrs.hasOwnProperty(key)) {\n            attrs.push(key + '=\"' + global$6.encodeAllRaw(rootAttrs[key]) + '\"');\n          }\n        }\n        if (attrs.length) {\n          tag += ' ' + attrs.join(' ');\n        }\n      }\n      return tag + '>';\n    };\n    var toBlockElements = function (text, rootTag, rootAttrs) {\n      var blocks = text.split(/\\n\\n/);\n      var tagOpen = openContainer(rootTag, rootAttrs);\n      var tagClose = '</' + rootTag + '>';\n      var paragraphs = global$4.map(blocks, function (p) {\n        return p.split(/\\n/).join('<br />');\n      });\n      var stitch = function (p) {\n        return tagOpen + p + tagClose;\n      };\n      return paragraphs.length === 1 ? paragraphs[0] : global$4.map(paragraphs, stitch).join('');\n    };\n    var convert = function (text, rootTag, rootAttrs) {\n      return rootTag ? toBlockElements(text, rootTag === true ? 'p' : rootTag, rootAttrs) : toBRs(text);\n    };\n    var Newlines = {\n      isPlainText: isPlainText,\n      convert: convert,\n      toBRs: toBRs,\n      toBlockElements: toBlockElements\n    };\n\n    var global$7 = tinymce.util.Tools.resolve('tinymce.html.DomParser');\n\n    var global$8 = tinymce.util.Tools.resolve('tinymce.html.Serializer');\n\n    var global$9 = tinymce.util.Tools.resolve('tinymce.html.Node');\n\n    var global$a = tinymce.util.Tools.resolve('tinymce.html.Schema');\n\n    var shouldBlockDrop = function (editor) {\n      return editor.getParam('paste_block_drop', false);\n    };\n    var shouldPasteDataImages = function (editor) {\n      return editor.getParam('paste_data_images', false);\n    };\n    var shouldFilterDrop = function (editor) {\n      return editor.getParam('paste_filter_drop', true);\n    };\n    var getPreProcess = function (editor) {\n      return editor.getParam('paste_preprocess');\n    };\n    var getPostProcess = function (editor) {\n      return editor.getParam('paste_postprocess');\n    };\n    var getWebkitStyles = function (editor) {\n      return editor.getParam('paste_webkit_styles');\n    };\n    var shouldRemoveWebKitStyles = function (editor) {\n      return editor.getParam('paste_remove_styles_if_webkit', true);\n    };\n    var shouldMergeFormats = function (editor) {\n      return editor.getParam('paste_merge_formats', true);\n    };\n    var isSmartPasteEnabled = function (editor) {\n      return editor.getParam('smart_paste', true);\n    };\n    var isPasteAsTextEnabled = function (editor) {\n      return editor.getParam('paste_as_text', false);\n    };\n    var getRetainStyleProps = function (editor) {\n      return editor.getParam('paste_retain_style_properties');\n    };\n    var getWordValidElements = function (editor) {\n      var defaultValidElements = '-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,' + '-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,' + 'td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody';\n      return editor.getParam('paste_word_valid_elements', defaultValidElements);\n    };\n    var shouldConvertWordFakeLists = function (editor) {\n      return editor.getParam('paste_convert_word_fake_lists', true);\n    };\n    var shouldUseDefaultFilters = function (editor) {\n      return editor.getParam('paste_enable_default_filters', true);\n    };\n    var Settings = {\n      shouldBlockDrop: shouldBlockDrop,\n      shouldPasteDataImages: shouldPasteDataImages,\n      shouldFilterDrop: shouldFilterDrop,\n      getPreProcess: getPreProcess,\n      getPostProcess: getPostProcess,\n      getWebkitStyles: getWebkitStyles,\n      shouldRemoveWebKitStyles: shouldRemoveWebKitStyles,\n      shouldMergeFormats: shouldMergeFormats,\n      isSmartPasteEnabled: isSmartPasteEnabled,\n      isPasteAsTextEnabled: isPasteAsTextEnabled,\n      getRetainStyleProps: getRetainStyleProps,\n      getWordValidElements: getWordValidElements,\n      shouldConvertWordFakeLists: shouldConvertWordFakeLists,\n      shouldUseDefaultFilters: shouldUseDefaultFilters\n    };\n\n    var nbsp = '\\xA0';\n\n    function filter$1(content, items) {\n      global$4.each(items, function (v) {\n        if (v.constructor === RegExp) {\n          content = content.replace(v, '');\n        } else {\n          content = content.replace(v[0], v[1]);\n        }\n      });\n      return content;\n    }\n    function innerText(html) {\n      var schema = global$a();\n      var domParser = global$7({}, schema);\n      var text = '';\n      var shortEndedElements = schema.getShortEndedElements();\n      var ignoreElements = global$4.makeMap('script noscript style textarea video audio iframe object', ' ');\n      var blockElements = schema.getBlockElements();\n      function walk(node) {\n        var name = node.name, currentNode = node;\n        if (name === 'br') {\n          text += '\\n';\n          return;\n        }\n        if (name === 'wbr') {\n          return;\n        }\n        if (shortEndedElements[name]) {\n          text += ' ';\n        }\n        if (ignoreElements[name]) {\n          text += ' ';\n          return;\n        }\n        if (node.type === 3) {\n          text += node.value;\n        }\n        if (!node.shortEnded) {\n          if (node = node.firstChild) {\n            do {\n              walk(node);\n            } while (node = node.next);\n          }\n        }\n        if (blockElements[name] && currentNode.next) {\n          text += '\\n';\n          if (name === 'p') {\n            text += '\\n';\n          }\n        }\n      }\n      html = filter$1(html, [/<!\\[[^\\]]+\\]>/g]);\n      walk(domParser.parse(html));\n      return text;\n    }\n    function trimHtml(html) {\n      function trimSpaces(all, s1, s2) {\n        if (!s1 && !s2) {\n          return ' ';\n        }\n        return nbsp;\n      }\n      html = filter$1(html, [\n        /^[\\s\\S]*<body[^>]*>\\s*|\\s*<\\/body[^>]*>[\\s\\S]*$/ig,\n        /<!--StartFragment-->|<!--EndFragment-->/g,\n        [\n          /( ?)<span class=\"Apple-converted-space\">\\u00a0<\\/span>( ?)/g,\n          trimSpaces\n        ],\n        /<br class=\"Apple-interchange-newline\">/g,\n        /<br>$/i\n      ]);\n      return html;\n    }\n    function createIdGenerator(prefix) {\n      var count = 0;\n      return function () {\n        return prefix + count++;\n      };\n    }\n    var isMsEdge = function () {\n      return domGlobals.navigator.userAgent.indexOf(' Edge/') !== -1;\n    };\n    var Utils = {\n      filter: filter$1,\n      innerText: innerText,\n      trimHtml: trimHtml,\n      createIdGenerator: createIdGenerator,\n      isMsEdge: isMsEdge\n    };\n\n    function isWordContent(content) {\n      return /<font face=\"Times New Roman\"|class=\"?Mso|style=\"[^\"]*\\bmso-|style='[^'']*\\bmso-|w:WordDocument/i.test(content) || /class=\"OutlineElement/.test(content) || /id=\"?docs\\-internal\\-guid\\-/.test(content);\n    }\n    function isNumericList(text) {\n      var found, patterns;\n      patterns = [\n        /^[IVXLMCD]{1,2}\\.[ \\u00a0]/,\n        /^[ivxlmcd]{1,2}\\.[ \\u00a0]/,\n        /^[a-z]{1,2}[\\.\\)][ \\u00a0]/,\n        /^[A-Z]{1,2}[\\.\\)][ \\u00a0]/,\n        /^[0-9]+\\.[ \\u00a0]/,\n        /^[\\u3007\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d]+\\.[ \\u00a0]/,\n        /^[\\u58f1\\u5f10\\u53c2\\u56db\\u4f0d\\u516d\\u4e03\\u516b\\u4e5d\\u62fe]+\\.[ \\u00a0]/\n      ];\n      text = text.replace(/^[\\u00a0 ]+/, '');\n      global$4.each(patterns, function (pattern) {\n        if (pattern.test(text)) {\n          found = true;\n          return false;\n        }\n      });\n      return found;\n    }\n    function isBulletList(text) {\n      return /^[\\s\\u00a0]*[\\u2022\\u00b7\\u00a7\\u25CF]\\s*/.test(text);\n    }\n    function convertFakeListsToProperLists(node) {\n      var currentListNode, prevListNode, lastLevel = 1;\n      function getText(node) {\n        var txt = '';\n        if (node.type === 3) {\n          return node.value;\n        }\n        if (node = node.firstChild) {\n          do {\n            txt += getText(node);\n          } while (node = node.next);\n        }\n        return txt;\n      }\n      function trimListStart(node, regExp) {\n        if (node.type === 3) {\n          if (regExp.test(node.value)) {\n            node.value = node.value.replace(regExp, '');\n            return false;\n          }\n        }\n        if (node = node.firstChild) {\n          do {\n            if (!trimListStart(node, regExp)) {\n              return false;\n            }\n          } while (node = node.next);\n        }\n        return true;\n      }\n      function removeIgnoredNodes(node) {\n        if (node._listIgnore) {\n          node.remove();\n          return;\n        }\n        if (node = node.firstChild) {\n          do {\n            removeIgnoredNodes(node);\n          } while (node = node.next);\n        }\n      }\n      function convertParagraphToLi(paragraphNode, listName, start) {\n        var level = paragraphNode._listLevel || lastLevel;\n        if (level !== lastLevel) {\n          if (level < lastLevel) {\n            if (currentListNode) {\n              currentListNode = currentListNode.parent.parent;\n            }\n          } else {\n            prevListNode = currentListNode;\n            currentListNode = null;\n          }\n        }\n        if (!currentListNode || currentListNode.name !== listName) {\n          prevListNode = prevListNode || currentListNode;\n          currentListNode = new global$9(listName, 1);\n          if (start > 1) {\n            currentListNode.attr('start', '' + start);\n          }\n          paragraphNode.wrap(currentListNode);\n        } else {\n          currentListNode.append(paragraphNode);\n        }\n        paragraphNode.name = 'li';\n        if (level > lastLevel && prevListNode) {\n          prevListNode.lastChild.append(currentListNode);\n        }\n        lastLevel = level;\n        removeIgnoredNodes(paragraphNode);\n        trimListStart(paragraphNode, /^\\u00a0+/);\n        trimListStart(paragraphNode, /^\\s*([\\u2022\\u00b7\\u00a7\\u25CF]|\\w+\\.)/);\n        trimListStart(paragraphNode, /^\\u00a0+/);\n      }\n      var elements = [];\n      var child = node.firstChild;\n      while (typeof child !== 'undefined' && child !== null) {\n        elements.push(child);\n        child = child.walk();\n        if (child !== null) {\n          while (typeof child !== 'undefined' && child.parent !== node) {\n            child = child.walk();\n          }\n        }\n      }\n      for (var i = 0; i < elements.length; i++) {\n        node = elements[i];\n        if (node.name === 'p' && node.firstChild) {\n          var nodeText = getText(node);\n          if (isBulletList(nodeText)) {\n            convertParagraphToLi(node, 'ul');\n            continue;\n          }\n          if (isNumericList(nodeText)) {\n            var matches = /([0-9]+)\\./.exec(nodeText);\n            var start = 1;\n            if (matches) {\n              start = parseInt(matches[1], 10);\n            }\n            convertParagraphToLi(node, 'ol', start);\n            continue;\n          }\n          if (node._listLevel) {\n            convertParagraphToLi(node, 'ul', 1);\n            continue;\n          }\n          currentListNode = null;\n        } else {\n          prevListNode = currentListNode;\n          currentListNode = null;\n        }\n      }\n    }\n    function filterStyles(editor, validStyles, node, styleValue) {\n      var outputStyles = {}, matches;\n      var styles = editor.dom.parseStyle(styleValue);\n      global$4.each(styles, function (value, name) {\n        switch (name) {\n        case 'mso-list':\n          matches = /\\w+ \\w+([0-9]+)/i.exec(styleValue);\n          if (matches) {\n            node._listLevel = parseInt(matches[1], 10);\n          }\n          if (/Ignore/i.test(value) && node.firstChild) {\n            node._listIgnore = true;\n            node.firstChild._listIgnore = true;\n          }\n          break;\n        case 'horiz-align':\n          name = 'text-align';\n          break;\n        case 'vert-align':\n          name = 'vertical-align';\n          break;\n        case 'font-color':\n        case 'mso-foreground':\n          name = 'color';\n          break;\n        case 'mso-background':\n        case 'mso-highlight':\n          name = 'background';\n          break;\n        case 'font-weight':\n        case 'font-style':\n          if (value !== 'normal') {\n            outputStyles[name] = value;\n          }\n          return;\n        case 'mso-element':\n          if (/^(comment|comment-list)$/i.test(value)) {\n            node.remove();\n            return;\n          }\n          break;\n        }\n        if (name.indexOf('mso-comment') === 0) {\n          node.remove();\n          return;\n        }\n        if (name.indexOf('mso-') === 0) {\n          return;\n        }\n        if (Settings.getRetainStyleProps(editor) === 'all' || validStyles && validStyles[name]) {\n          outputStyles[name] = value;\n        }\n      });\n      if (/(bold)/i.test(outputStyles['font-weight'])) {\n        delete outputStyles['font-weight'];\n        node.wrap(new global$9('b', 1));\n      }\n      if (/(italic)/i.test(outputStyles['font-style'])) {\n        delete outputStyles['font-style'];\n        node.wrap(new global$9('i', 1));\n      }\n      outputStyles = editor.dom.serializeStyle(outputStyles, node.name);\n      if (outputStyles) {\n        return outputStyles;\n      }\n      return null;\n    }\n    var filterWordContent = function (editor, content) {\n      var retainStyleProperties, validStyles;\n      retainStyleProperties = Settings.getRetainStyleProps(editor);\n      if (retainStyleProperties) {\n        validStyles = global$4.makeMap(retainStyleProperties.split(/[, ]/));\n      }\n      content = Utils.filter(content, [\n        /<br class=\"?Apple-interchange-newline\"?>/gi,\n        /<b[^>]+id=\"?docs-internal-[^>]*>/gi,\n        /<!--[\\s\\S]+?-->/gi,\n        /<(!|script[^>]*>.*?<\\/script(?=[>\\s])|\\/?(\\?xml(:\\w+)?|img|meta|link|style|\\w:\\w+)(?=[\\s\\/>]))[^>]*>/gi,\n        [\n          /<(\\/?)s>/gi,\n          '<$1strike>'\n        ],\n        [\n          /&nbsp;/gi,\n          nbsp\n        ],\n        [\n          /<span\\s+style\\s*=\\s*\"\\s*mso-spacerun\\s*:\\s*yes\\s*;?\\s*\"\\s*>([\\s\\u00a0]*)<\\/span>/gi,\n          function (str, spaces) {\n            return spaces.length > 0 ? spaces.replace(/./, ' ').slice(Math.floor(spaces.length / 2)).split('').join(nbsp) : '';\n          }\n        ]\n      ]);\n      var validElements = Settings.getWordValidElements(editor);\n      var schema = global$a({\n        valid_elements: validElements,\n        valid_children: '-li[p]'\n      });\n      global$4.each(schema.elements, function (rule) {\n        if (!rule.attributes.class) {\n          rule.attributes.class = {};\n          rule.attributesOrder.push('class');\n        }\n        if (!rule.attributes.style) {\n          rule.attributes.style = {};\n          rule.attributesOrder.push('style');\n        }\n      });\n      var domParser = global$7({}, schema);\n      domParser.addAttributeFilter('style', function (nodes) {\n        var i = nodes.length, node;\n        while (i--) {\n          node = nodes[i];\n          node.attr('style', filterStyles(editor, validStyles, node, node.attr('style')));\n          if (node.name === 'span' && node.parent && !node.attributes.length) {\n            node.unwrap();\n          }\n        }\n      });\n      domParser.addAttributeFilter('class', function (nodes) {\n        var i = nodes.length, node, className;\n        while (i--) {\n          node = nodes[i];\n          className = node.attr('class');\n          if (/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(className)) {\n            node.remove();\n          }\n          node.attr('class', null);\n        }\n      });\n      domParser.addNodeFilter('del', function (nodes) {\n        var i = nodes.length;\n        while (i--) {\n          nodes[i].remove();\n        }\n      });\n      domParser.addNodeFilter('a', function (nodes) {\n        var i = nodes.length, node, href, name;\n        while (i--) {\n          node = nodes[i];\n          href = node.attr('href');\n          name = node.attr('name');\n          if (href && href.indexOf('#_msocom_') !== -1) {\n            node.remove();\n            continue;\n          }\n          if (href && href.indexOf('file://') === 0) {\n            href = href.split('#')[1];\n            if (href) {\n              href = '#' + href;\n            }\n          }\n          if (!href && !name) {\n            node.unwrap();\n          } else {\n            if (name && !/^_?(?:toc|edn|ftn)/i.test(name)) {\n              node.unwrap();\n              continue;\n            }\n            node.attr({\n              href: href,\n              name: name\n            });\n          }\n        }\n      });\n      var rootNode = domParser.parse(content);\n      if (Settings.shouldConvertWordFakeLists(editor)) {\n        convertFakeListsToProperLists(rootNode);\n      }\n      content = global$8({ validate: editor.settings.validate }, schema).serialize(rootNode);\n      return content;\n    };\n    var preProcess = function (editor, content) {\n      return Settings.shouldUseDefaultFilters(editor) ? filterWordContent(editor, content) : content;\n    };\n    var WordFilter = {\n      preProcess: preProcess,\n      isWordContent: isWordContent\n    };\n\n    var preProcess$1 = function (editor, html) {\n      var parser = global$7({}, editor.schema);\n      parser.addNodeFilter('meta', function (nodes) {\n        global$4.each(nodes, function (node) {\n          return node.remove();\n        });\n      });\n      var fragment = parser.parse(html, {\n        forced_root_block: false,\n        isRootContent: true\n      });\n      return global$8({ validate: editor.settings.validate }, editor.schema).serialize(fragment);\n    };\n    var processResult = function (content, cancelled) {\n      return {\n        content: content,\n        cancelled: cancelled\n      };\n    };\n    var postProcessFilter = function (editor, html, internal, isWordHtml) {\n      var tempBody = editor.dom.create('div', { style: 'display:none' }, html);\n      var postProcessArgs = Events.firePastePostProcess(editor, tempBody, internal, isWordHtml);\n      return processResult(postProcessArgs.node.innerHTML, postProcessArgs.isDefaultPrevented());\n    };\n    var filterContent = function (editor, content, internal, isWordHtml) {\n      var preProcessArgs = Events.firePastePreProcess(editor, content, internal, isWordHtml);\n      var filteredContent = preProcess$1(editor, preProcessArgs.content);\n      if (editor.hasEventListeners('PastePostProcess') && !preProcessArgs.isDefaultPrevented()) {\n        return postProcessFilter(editor, filteredContent, internal, isWordHtml);\n      } else {\n        return processResult(filteredContent, preProcessArgs.isDefaultPrevented());\n      }\n    };\n    var process = function (editor, html, internal) {\n      var isWordHtml = WordFilter.isWordContent(html);\n      var content = isWordHtml ? WordFilter.preProcess(editor, html) : html;\n      return filterContent(editor, content, internal, isWordHtml);\n    };\n    var ProcessFilters = { process: process };\n\n    var pasteHtml = function (editor, html) {\n      editor.insertContent(html, {\n        merge: Settings.shouldMergeFormats(editor),\n        paste: true\n      });\n      return true;\n    };\n    var isAbsoluteUrl = function (url) {\n      return /^https?:\\/\\/[\\w\\?\\-\\/+=.&%@~#]+$/i.test(url);\n    };\n    var isImageUrl = function (url) {\n      return isAbsoluteUrl(url) && /.(gif|jpe?g|png)$/.test(url);\n    };\n    var createImage = function (editor, url, pasteHtmlFn) {\n      editor.undoManager.extra(function () {\n        pasteHtmlFn(editor, url);\n      }, function () {\n        editor.insertContent('<img src=\"' + url + '\">');\n      });\n      return true;\n    };\n    var createLink = function (editor, url, pasteHtmlFn) {\n      editor.undoManager.extra(function () {\n        pasteHtmlFn(editor, url);\n      }, function () {\n        editor.execCommand('mceInsertLink', false, url);\n      });\n      return true;\n    };\n    var linkSelection = function (editor, html, pasteHtmlFn) {\n      return editor.selection.isCollapsed() === false && isAbsoluteUrl(html) ? createLink(editor, html, pasteHtmlFn) : false;\n    };\n    var insertImage = function (editor, html, pasteHtmlFn) {\n      return isImageUrl(html) ? createImage(editor, html, pasteHtmlFn) : false;\n    };\n    var smartInsertContent = function (editor, html) {\n      global$4.each([\n        linkSelection,\n        insertImage,\n        pasteHtml\n      ], function (action) {\n        return action(editor, html, pasteHtml) !== true;\n      });\n    };\n    var insertContent = function (editor, html, pasteAsText) {\n      if (pasteAsText || Settings.isSmartPasteEnabled(editor) === false) {\n        pasteHtml(editor, html);\n      } else {\n        smartInsertContent(editor, html);\n      }\n    };\n    var SmartPaste = {\n      isImageUrl: isImageUrl,\n      isAbsoluteUrl: isAbsoluteUrl,\n      insertContent: insertContent\n    };\n\n    var isCollapsibleWhitespace = function (c) {\n      return ' \\f\\t\\x0B'.indexOf(c) !== -1;\n    };\n    var isNewLineChar = function (c) {\n      return c === '\\n' || c === '\\r';\n    };\n    var isNewline = function (text, idx) {\n      return idx < text.length && idx >= 0 ? isNewLineChar(text[idx]) : false;\n    };\n    var normalizeWhitespace = function (text) {\n      var result = foldl(text, function (acc, c) {\n        if (isCollapsibleWhitespace(c) || c === nbsp) {\n          if (acc.pcIsSpace || acc.str === '' || acc.str.length === text.length - 1 || isNewline(text, acc.str.length + 1)) {\n            return {\n              pcIsSpace: false,\n              str: acc.str + nbsp\n            };\n          } else {\n            return {\n              pcIsSpace: true,\n              str: acc.str + ' '\n            };\n          }\n        } else {\n          return {\n            pcIsSpace: isNewLineChar(c),\n            str: acc.str + c\n          };\n        }\n      }, {\n        pcIsSpace: false,\n        str: ''\n      });\n      return result.str;\n    };\n\n    var doPaste = function (editor, content, internal, pasteAsText) {\n      var args = ProcessFilters.process(editor, content, internal);\n      if (args.cancelled === false) {\n        SmartPaste.insertContent(editor, args.content, pasteAsText);\n      }\n    };\n    var pasteHtml$1 = function (editor, html, internalFlag) {\n      var internal = internalFlag ? internalFlag : InternalHtml.isMarked(html);\n      doPaste(editor, InternalHtml.unmark(html), internal, false);\n    };\n    var pasteText = function (editor, text) {\n      var encodedText = editor.dom.encode(text).replace(/\\r\\n/g, '\\n');\n      var normalizedText = normalizeWhitespace(encodedText);\n      var html = Newlines.convert(normalizedText, editor.settings.forced_root_block, editor.settings.forced_root_block_attrs);\n      doPaste(editor, html, false, true);\n    };\n    var getDataTransferItems = function (dataTransfer) {\n      var items = {};\n      var mceInternalUrlPrefix = 'data:text/mce-internal,';\n      if (dataTransfer) {\n        if (dataTransfer.getData) {\n          var legacyText = dataTransfer.getData('Text');\n          if (legacyText && legacyText.length > 0) {\n            if (legacyText.indexOf(mceInternalUrlPrefix) === -1) {\n              items['text/plain'] = legacyText;\n            }\n          }\n        }\n        if (dataTransfer.types) {\n          for (var i = 0; i < dataTransfer.types.length; i++) {\n            var contentType = dataTransfer.types[i];\n            try {\n              items[contentType] = dataTransfer.getData(contentType);\n            } catch (ex) {\n              items[contentType] = '';\n            }\n          }\n        }\n      }\n      return items;\n    };\n    var getClipboardContent = function (editor, clipboardEvent) {\n      var content = getDataTransferItems(clipboardEvent.clipboardData || editor.getDoc().dataTransfer);\n      return Utils.isMsEdge() ? global$4.extend(content, { 'text/html': '' }) : content;\n    };\n    var hasContentType = function (clipboardContent, mimeType) {\n      return mimeType in clipboardContent && clipboardContent[mimeType].length > 0;\n    };\n    var hasHtmlOrText = function (content) {\n      return hasContentType(content, 'text/html') || hasContentType(content, 'text/plain');\n    };\n    var getBase64FromUri = function (uri) {\n      var idx;\n      idx = uri.indexOf(',');\n      if (idx !== -1) {\n        return uri.substr(idx + 1);\n      }\n      return null;\n    };\n    var isValidDataUriImage = function (settings, imgElm) {\n      return settings.images_dataimg_filter ? settings.images_dataimg_filter(imgElm) : true;\n    };\n    var extractFilename = function (editor, str) {\n      var m = str.match(/([\\s\\S]+?)\\.(?:jpeg|jpg|png|gif)$/i);\n      return m ? editor.dom.encode(m[1]) : null;\n    };\n    var uniqueId = Utils.createIdGenerator('mceclip');\n    var pasteImage = function (editor, imageItem) {\n      var base64 = getBase64FromUri(imageItem.uri);\n      var id = uniqueId();\n      var name = editor.settings.images_reuse_filename && imageItem.blob.name ? extractFilename(editor, imageItem.blob.name) : id;\n      var img = new domGlobals.Image();\n      img.src = imageItem.uri;\n      if (isValidDataUriImage(editor.settings, img)) {\n        var blobCache = editor.editorUpload.blobCache;\n        var blobInfo = void 0, existingBlobInfo = void 0;\n        existingBlobInfo = blobCache.findFirst(function (cachedBlobInfo) {\n          return cachedBlobInfo.base64() === base64;\n        });\n        if (!existingBlobInfo) {\n          blobInfo = blobCache.create(id, imageItem.blob, base64, name);\n          blobCache.add(blobInfo);\n        } else {\n          blobInfo = existingBlobInfo;\n        }\n        pasteHtml$1(editor, '<img src=\"' + blobInfo.blobUri() + '\">', false);\n      } else {\n        pasteHtml$1(editor, '<img src=\"' + imageItem.uri + '\">', false);\n      }\n    };\n    var isClipboardEvent = function (event) {\n      return event.type === 'paste';\n    };\n    var readBlobsAsDataUris = function (items) {\n      return traverse(items, function (item) {\n        return Future.nu(function (resolve) {\n          var blob = item.getAsFile ? item.getAsFile() : item;\n          var reader = new window.FileReader();\n          reader.onload = function () {\n            resolve({\n              blob: blob,\n              uri: reader.result\n            });\n          };\n          reader.readAsDataURL(blob);\n        });\n      });\n    };\n    var getImagesFromDataTransfer = function (dataTransfer) {\n      var items = dataTransfer.items ? map(from$1(dataTransfer.items), function (item) {\n        return item.getAsFile();\n      }) : [];\n      var files = dataTransfer.files ? from$1(dataTransfer.files) : [];\n      var images = filter(items.length > 0 ? items : files, function (file) {\n        return /^image\\/(jpeg|png|gif|bmp)$/.test(file.type);\n      });\n      return images;\n    };\n    var pasteImageData = function (editor, e, rng) {\n      var dataTransfer = isClipboardEvent(e) ? e.clipboardData : e.dataTransfer;\n      if (editor.settings.paste_data_images && dataTransfer) {\n        var images = getImagesFromDataTransfer(dataTransfer);\n        if (images.length > 0) {\n          e.preventDefault();\n          readBlobsAsDataUris(images).get(function (blobResults) {\n            if (rng) {\n              editor.selection.setRng(rng);\n            }\n            each(blobResults, function (result) {\n              pasteImage(editor, result);\n            });\n          });\n          return true;\n        }\n      }\n      return false;\n    };\n    var isBrokenAndroidClipboardEvent = function (e) {\n      var clipboardData = e.clipboardData;\n      return domGlobals.navigator.userAgent.indexOf('Android') !== -1 && clipboardData && clipboardData.items && clipboardData.items.length === 0;\n    };\n    var isKeyboardPasteEvent = function (e) {\n      return global$5.metaKeyPressed(e) && e.keyCode === 86 || e.shiftKey && e.keyCode === 45;\n    };\n    var registerEventHandlers = function (editor, pasteBin, pasteFormat) {\n      var keyboardPasteEvent = value();\n      var keyboardPastePlainTextState;\n      editor.on('keydown', function (e) {\n        function removePasteBinOnKeyUp(e) {\n          if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) {\n            pasteBin.remove();\n          }\n        }\n        if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) {\n          keyboardPastePlainTextState = e.shiftKey && e.keyCode === 86;\n          if (keyboardPastePlainTextState && global$2.webkit && domGlobals.navigator.userAgent.indexOf('Version/') !== -1) {\n            return;\n          }\n          e.stopImmediatePropagation();\n          keyboardPasteEvent.set(e);\n          window.setTimeout(function () {\n            keyboardPasteEvent.clear();\n          }, 100);\n          if (global$2.ie && keyboardPastePlainTextState) {\n            e.preventDefault();\n            Events.firePaste(editor, true);\n            return;\n          }\n          pasteBin.remove();\n          pasteBin.create();\n          editor.once('keyup', removePasteBinOnKeyUp);\n          editor.once('paste', function () {\n            editor.off('keyup', removePasteBinOnKeyUp);\n          });\n        }\n      });\n      function insertClipboardContent(clipboardContent, isKeyBoardPaste, plainTextMode, internal) {\n        var content, isPlainTextHtml, isImage;\n        if (hasContentType(clipboardContent, 'text/html')) {\n          content = clipboardContent['text/html'];\n        } else {\n          content = pasteBin.getHtml();\n          internal = internal ? internal : InternalHtml.isMarked(content);\n          if (pasteBin.isDefaultContent(content)) {\n            plainTextMode = true;\n          }\n        }\n        content = Utils.trimHtml(content);\n        pasteBin.remove();\n        isPlainTextHtml = internal === false && Newlines.isPlainText(content);\n        isImage = SmartPaste.isImageUrl(content);\n        if (!content.length || isPlainTextHtml && !isImage) {\n          plainTextMode = true;\n        }\n        if (plainTextMode || isImage) {\n          if (hasContentType(clipboardContent, 'text/plain') && isPlainTextHtml) {\n            content = clipboardContent['text/plain'];\n          } else {\n            content = Utils.innerText(content);\n          }\n        }\n        if (pasteBin.isDefaultContent(content)) {\n          if (!isKeyBoardPaste) {\n            editor.windowManager.alert('Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.');\n          }\n          return;\n        }\n        if (plainTextMode) {\n          pasteText(editor, content);\n        } else {\n          pasteHtml$1(editor, content, internal);\n        }\n      }\n      var getLastRng = function () {\n        return pasteBin.getLastRng() || editor.selection.getRng();\n      };\n      editor.on('paste', function (e) {\n        var isKeyBoardPaste = keyboardPasteEvent.isSet();\n        var clipboardContent = getClipboardContent(editor, e);\n        var plainTextMode = pasteFormat.get() === 'text' || keyboardPastePlainTextState;\n        var internal = hasContentType(clipboardContent, InternalHtml.internalHtmlMime());\n        keyboardPastePlainTextState = false;\n        if (e.isDefaultPrevented() || isBrokenAndroidClipboardEvent(e)) {\n          pasteBin.remove();\n          return;\n        }\n        if (!hasHtmlOrText(clipboardContent) && pasteImageData(editor, e, getLastRng())) {\n          pasteBin.remove();\n          return;\n        }\n        if (!isKeyBoardPaste) {\n          e.preventDefault();\n        }\n        if (global$2.ie && (!isKeyBoardPaste || e.ieFake) && !hasContentType(clipboardContent, 'text/html')) {\n          pasteBin.create();\n          editor.dom.bind(pasteBin.getEl(), 'paste', function (e) {\n            e.stopPropagation();\n          });\n          editor.getDoc().execCommand('Paste', false, null);\n          clipboardContent['text/html'] = pasteBin.getHtml();\n        }\n        if (hasContentType(clipboardContent, 'text/html')) {\n          e.preventDefault();\n          if (!internal) {\n            internal = InternalHtml.isMarked(clipboardContent['text/html']);\n          }\n          insertClipboardContent(clipboardContent, isKeyBoardPaste, plainTextMode, internal);\n        } else {\n          global$3.setEditorTimeout(editor, function () {\n            insertClipboardContent(clipboardContent, isKeyBoardPaste, plainTextMode, internal);\n          }, 0);\n        }\n      });\n    };\n    var registerEventsAndFilters = function (editor, pasteBin, pasteFormat) {\n      registerEventHandlers(editor, pasteBin, pasteFormat);\n      var src;\n      editor.parser.addNodeFilter('img', function (nodes, name, args) {\n        var isPasteInsert = function (args) {\n          return args.data && args.data.paste === true;\n        };\n        var remove = function (node) {\n          if (!node.attr('data-mce-object') && src !== global$2.transparentSrc) {\n            node.remove();\n          }\n        };\n        var isWebKitFakeUrl = function (src) {\n          return src.indexOf('webkit-fake-url') === 0;\n        };\n        var isDataUri = function (src) {\n          return src.indexOf('data:') === 0;\n        };\n        if (!editor.settings.paste_data_images && isPasteInsert(args)) {\n          var i = nodes.length;\n          while (i--) {\n            src = nodes[i].attr('src');\n            if (!src) {\n              continue;\n            }\n            if (isWebKitFakeUrl(src)) {\n              remove(nodes[i]);\n            } else if (!editor.settings.allow_html_data_urls && isDataUri(src)) {\n              remove(nodes[i]);\n            }\n          }\n        }\n      });\n    };\n\n    var getPasteBinParent = function (editor) {\n      return global$2.ie && editor.inline ? domGlobals.document.body : editor.getBody();\n    };\n    var isExternalPasteBin = function (editor) {\n      return getPasteBinParent(editor) !== editor.getBody();\n    };\n    var delegatePasteEvents = function (editor, pasteBinElm, pasteBinDefaultContent) {\n      if (isExternalPasteBin(editor)) {\n        editor.dom.bind(pasteBinElm, 'paste keyup', function (e) {\n          if (!isDefault(editor, pasteBinDefaultContent)) {\n            editor.fire('paste');\n          }\n        });\n      }\n    };\n    var create = function (editor, lastRngCell, pasteBinDefaultContent) {\n      var dom = editor.dom, body = editor.getBody();\n      var pasteBinElm;\n      lastRngCell.set(editor.selection.getRng());\n      pasteBinElm = editor.dom.add(getPasteBinParent(editor), 'div', {\n        'id': 'mcepastebin',\n        'class': 'mce-pastebin',\n        'contentEditable': true,\n        'data-mce-bogus': 'all',\n        'style': 'position: fixed; top: 50%; width: 10px; height: 10px; overflow: hidden; opacity: 0'\n      }, pasteBinDefaultContent);\n      if (global$2.ie || global$2.gecko) {\n        dom.setStyle(pasteBinElm, 'left', dom.getStyle(body, 'direction', true) === 'rtl' ? 65535 : -65535);\n      }\n      dom.bind(pasteBinElm, 'beforedeactivate focusin focusout', function (e) {\n        e.stopPropagation();\n      });\n      delegatePasteEvents(editor, pasteBinElm, pasteBinDefaultContent);\n      pasteBinElm.focus();\n      editor.selection.select(pasteBinElm, true);\n    };\n    var remove = function (editor, lastRngCell) {\n      if (getEl(editor)) {\n        var pasteBinClone = void 0;\n        var lastRng = lastRngCell.get();\n        while (pasteBinClone = editor.dom.get('mcepastebin')) {\n          editor.dom.remove(pasteBinClone);\n          editor.dom.unbind(pasteBinClone);\n        }\n        if (lastRng) {\n          editor.selection.setRng(lastRng);\n        }\n      }\n      lastRngCell.set(null);\n    };\n    var getEl = function (editor) {\n      return editor.dom.get('mcepastebin');\n    };\n    var getHtml = function (editor) {\n      var pasteBinElm, pasteBinClones, i, dirtyWrappers, cleanWrapper;\n      var copyAndRemove = function (toElm, fromElm) {\n        toElm.appendChild(fromElm);\n        editor.dom.remove(fromElm, true);\n      };\n      pasteBinClones = global$4.grep(getPasteBinParent(editor).childNodes, function (elm) {\n        return elm.id === 'mcepastebin';\n      });\n      pasteBinElm = pasteBinClones.shift();\n      global$4.each(pasteBinClones, function (pasteBinClone) {\n        copyAndRemove(pasteBinElm, pasteBinClone);\n      });\n      dirtyWrappers = editor.dom.select('div[id=mcepastebin]', pasteBinElm);\n      for (i = dirtyWrappers.length - 1; i >= 0; i--) {\n        cleanWrapper = editor.dom.create('div');\n        pasteBinElm.insertBefore(cleanWrapper, dirtyWrappers[i]);\n        copyAndRemove(cleanWrapper, dirtyWrappers[i]);\n      }\n      return pasteBinElm ? pasteBinElm.innerHTML : '';\n    };\n    var getLastRng = function (lastRng) {\n      return lastRng.get();\n    };\n    var isDefaultContent = function (pasteBinDefaultContent, content) {\n      return content === pasteBinDefaultContent;\n    };\n    var isPasteBin = function (elm) {\n      return elm && elm.id === 'mcepastebin';\n    };\n    var isDefault = function (editor, pasteBinDefaultContent) {\n      var pasteBinElm = getEl(editor);\n      return isPasteBin(pasteBinElm) && isDefaultContent(pasteBinDefaultContent, pasteBinElm.innerHTML);\n    };\n    var PasteBin = function (editor) {\n      var lastRng = Cell(null);\n      var pasteBinDefaultContent = '%MCEPASTEBIN%';\n      return {\n        create: function () {\n          return create(editor, lastRng, pasteBinDefaultContent);\n        },\n        remove: function () {\n          return remove(editor, lastRng);\n        },\n        getEl: function () {\n          return getEl(editor);\n        },\n        getHtml: function () {\n          return getHtml(editor);\n        },\n        getLastRng: function () {\n          return getLastRng(lastRng);\n        },\n        isDefault: function () {\n          return isDefault(editor, pasteBinDefaultContent);\n        },\n        isDefaultContent: function (content) {\n          return isDefaultContent(pasteBinDefaultContent, content);\n        }\n      };\n    };\n\n    var Clipboard = function (editor, pasteFormat) {\n      var pasteBin = PasteBin(editor);\n      editor.on('PreInit', function () {\n        return registerEventsAndFilters(editor, pasteBin, pasteFormat);\n      });\n      return {\n        pasteFormat: pasteFormat,\n        pasteHtml: function (html, internalFlag) {\n          return pasteHtml$1(editor, html, internalFlag);\n        },\n        pasteText: function (text) {\n          return pasteText(editor, text);\n        },\n        pasteImageData: function (e, rng) {\n          return pasteImageData(editor, e, rng);\n        },\n        getDataTransferItems: getDataTransferItems,\n        hasHtmlOrText: hasHtmlOrText,\n        hasContentType: hasContentType\n      };\n    };\n\n    var hasWorkingClipboardApi = function (clipboardData) {\n      return global$2.iOS === false && clipboardData !== undefined && typeof clipboardData.setData === 'function' && Utils.isMsEdge() !== true;\n    };\n    var setHtml5Clipboard = function (clipboardData, html, text) {\n      if (hasWorkingClipboardApi(clipboardData)) {\n        try {\n          clipboardData.clearData();\n          clipboardData.setData('text/html', html);\n          clipboardData.setData('text/plain', text);\n          clipboardData.setData(InternalHtml.internalHtmlMime(), html);\n          return true;\n        } catch (e) {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    };\n    var setClipboardData = function (evt, data, fallback, done) {\n      if (setHtml5Clipboard(evt.clipboardData, data.html, data.text)) {\n        evt.preventDefault();\n        done();\n      } else {\n        fallback(data.html, done);\n      }\n    };\n    var fallback = function (editor) {\n      return function (html, done) {\n        var markedHtml = InternalHtml.mark(html);\n        var outer = editor.dom.create('div', {\n          'contenteditable': 'false',\n          'data-mce-bogus': 'all'\n        });\n        var inner = editor.dom.create('div', { contenteditable: 'true' }, markedHtml);\n        editor.dom.setStyles(outer, {\n          position: 'fixed',\n          top: '0',\n          left: '-3000px',\n          width: '1000px',\n          overflow: 'hidden'\n        });\n        outer.appendChild(inner);\n        editor.dom.add(editor.getBody(), outer);\n        var range = editor.selection.getRng();\n        inner.focus();\n        var offscreenRange = editor.dom.createRng();\n        offscreenRange.selectNodeContents(inner);\n        editor.selection.setRng(offscreenRange);\n        global$3.setTimeout(function () {\n          editor.selection.setRng(range);\n          outer.parentNode.removeChild(outer);\n          done();\n        }, 0);\n      };\n    };\n    var getData = function (editor) {\n      return {\n        html: editor.selection.getContent({ contextual: true }),\n        text: editor.selection.getContent({ format: 'text' })\n      };\n    };\n    var isTableSelection = function (editor) {\n      return !!editor.dom.getParent(editor.selection.getStart(), 'td[data-mce-selected],th[data-mce-selected]', editor.getBody());\n    };\n    var hasSelectedContent = function (editor) {\n      return !editor.selection.isCollapsed() || isTableSelection(editor);\n    };\n    var cut = function (editor) {\n      return function (evt) {\n        if (hasSelectedContent(editor)) {\n          setClipboardData(evt, getData(editor), fallback(editor), function () {\n            if (global$2.browser.isChrome()) {\n              var rng_1 = editor.selection.getRng();\n              global$3.setEditorTimeout(editor, function () {\n                editor.selection.setRng(rng_1);\n                editor.execCommand('Delete');\n              }, 0);\n            } else {\n              editor.execCommand('Delete');\n            }\n          });\n        }\n      };\n    };\n    var copy = function (editor) {\n      return function (evt) {\n        if (hasSelectedContent(editor)) {\n          setClipboardData(evt, getData(editor), fallback(editor), function () {\n          });\n        }\n      };\n    };\n    var register$1 = function (editor) {\n      editor.on('cut', cut(editor));\n      editor.on('copy', copy(editor));\n    };\n    var CutCopy = { register: register$1 };\n\n    var global$b = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils');\n\n    var getCaretRangeFromEvent = function (editor, e) {\n      return global$b.getCaretRangeFromPoint(e.clientX, e.clientY, editor.getDoc());\n    };\n    var isPlainTextFileUrl = function (content) {\n      var plainTextContent = content['text/plain'];\n      return plainTextContent ? plainTextContent.indexOf('file://') === 0 : false;\n    };\n    var setFocusedRange = function (editor, rng) {\n      editor.focus();\n      editor.selection.setRng(rng);\n    };\n    var setup = function (editor, clipboard, draggingInternallyState) {\n      if (Settings.shouldBlockDrop(editor)) {\n        editor.on('dragend dragover draggesture dragdrop drop drag', function (e) {\n          e.preventDefault();\n          e.stopPropagation();\n        });\n      }\n      if (!Settings.shouldPasteDataImages(editor)) {\n        editor.on('drop', function (e) {\n          var dataTransfer = e.dataTransfer;\n          if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) {\n            e.preventDefault();\n          }\n        });\n      }\n      editor.on('drop', function (e) {\n        var dropContent, rng;\n        rng = getCaretRangeFromEvent(editor, e);\n        if (e.isDefaultPrevented() || draggingInternallyState.get()) {\n          return;\n        }\n        dropContent = clipboard.getDataTransferItems(e.dataTransfer);\n        var internal = clipboard.hasContentType(dropContent, InternalHtml.internalHtmlMime());\n        if ((!clipboard.hasHtmlOrText(dropContent) || isPlainTextFileUrl(dropContent)) && clipboard.pasteImageData(e, rng)) {\n          return;\n        }\n        if (rng && Settings.shouldFilterDrop(editor)) {\n          var content_1 = dropContent['mce-internal'] || dropContent['text/html'] || dropContent['text/plain'];\n          if (content_1) {\n            e.preventDefault();\n            global$3.setEditorTimeout(editor, function () {\n              editor.undoManager.transact(function () {\n                if (dropContent['mce-internal']) {\n                  editor.execCommand('Delete');\n                }\n                setFocusedRange(editor, rng);\n                content_1 = Utils.trimHtml(content_1);\n                if (!dropContent['text/html']) {\n                  clipboard.pasteText(content_1);\n                } else {\n                  clipboard.pasteHtml(content_1, internal);\n                }\n              });\n            });\n          }\n        }\n      });\n      editor.on('dragstart', function (e) {\n        draggingInternallyState.set(true);\n      });\n      editor.on('dragover dragend', function (e) {\n        if (Settings.shouldPasteDataImages(editor) && draggingInternallyState.get() === false) {\n          e.preventDefault();\n          setFocusedRange(editor, getCaretRangeFromEvent(editor, e));\n        }\n        if (e.type === 'dragend') {\n          draggingInternallyState.set(false);\n        }\n      });\n    };\n    var DragDrop = { setup: setup };\n\n    var setup$1 = function (editor) {\n      var plugin = editor.plugins.paste;\n      var preProcess = Settings.getPreProcess(editor);\n      if (preProcess) {\n        editor.on('PastePreProcess', function (e) {\n          preProcess.call(plugin, plugin, e);\n        });\n      }\n      var postProcess = Settings.getPostProcess(editor);\n      if (postProcess) {\n        editor.on('PastePostProcess', function (e) {\n          postProcess.call(plugin, plugin, e);\n        });\n      }\n    };\n    var PrePostProcess = { setup: setup$1 };\n\n    function addPreProcessFilter(editor, filterFunc) {\n      editor.on('PastePreProcess', function (e) {\n        e.content = filterFunc(editor, e.content, e.internal, e.wordContent);\n      });\n    }\n    function addPostProcessFilter(editor, filterFunc) {\n      editor.on('PastePostProcess', function (e) {\n        filterFunc(editor, e.node);\n      });\n    }\n    function removeExplorerBrElementsAfterBlocks(editor, html) {\n      if (!WordFilter.isWordContent(html)) {\n        return html;\n      }\n      var blockElements = [];\n      global$4.each(editor.schema.getBlockElements(), function (block, blockName) {\n        blockElements.push(blockName);\n      });\n      var explorerBlocksRegExp = new RegExp('(?:<br>&nbsp;[\\\\s\\\\r\\\\n]+|<br>)*(<\\\\/?(' + blockElements.join('|') + ')[^>]*>)(?:<br>&nbsp;[\\\\s\\\\r\\\\n]+|<br>)*', 'g');\n      html = Utils.filter(html, [[\n          explorerBlocksRegExp,\n          '$1'\n        ]]);\n      html = Utils.filter(html, [\n        [\n          /<br><br>/g,\n          '<BR><BR>'\n        ],\n        [\n          /<br>/g,\n          ' '\n        ],\n        [\n          /<BR><BR>/g,\n          '<br>'\n        ]\n      ]);\n      return html;\n    }\n    function removeWebKitStyles(editor, content, internal, isWordHtml) {\n      if (isWordHtml || internal) {\n        return content;\n      }\n      var webKitStylesSetting = Settings.getWebkitStyles(editor);\n      var webKitStyles;\n      if (Settings.shouldRemoveWebKitStyles(editor) === false || webKitStylesSetting === 'all') {\n        return content;\n      }\n      if (webKitStylesSetting) {\n        webKitStyles = webKitStylesSetting.split(/[, ]/);\n      }\n      if (webKitStyles) {\n        var dom_1 = editor.dom, node_1 = editor.selection.getNode();\n        content = content.replace(/(<[^>]+) style=\"([^\"]*)\"([^>]*>)/gi, function (all, before, value, after) {\n          var inputStyles = dom_1.parseStyle(dom_1.decode(value));\n          var outputStyles = {};\n          if (webKitStyles === 'none') {\n            return before + after;\n          }\n          for (var i = 0; i < webKitStyles.length; i++) {\n            var inputValue = inputStyles[webKitStyles[i]], currentValue = dom_1.getStyle(node_1, webKitStyles[i], true);\n            if (/color/.test(webKitStyles[i])) {\n              inputValue = dom_1.toHex(inputValue);\n              currentValue = dom_1.toHex(currentValue);\n            }\n            if (currentValue !== inputValue) {\n              outputStyles[webKitStyles[i]] = inputValue;\n            }\n          }\n          outputStyles = dom_1.serializeStyle(outputStyles, 'span');\n          if (outputStyles) {\n            return before + ' style=\"' + outputStyles + '\"' + after;\n          }\n          return before + after;\n        });\n      } else {\n        content = content.replace(/(<[^>]+) style=\"([^\"]*)\"([^>]*>)/gi, '$1$3');\n      }\n      content = content.replace(/(<[^>]+) data-mce-style=\"([^\"]+)\"([^>]*>)/gi, function (all, before, value, after) {\n        return before + ' style=\"' + value + '\"' + after;\n      });\n      return content;\n    }\n    function removeUnderlineAndFontInAnchor(editor, root) {\n      editor.$('a', root).find('font,u').each(function (i, node) {\n        editor.dom.remove(node, true);\n      });\n    }\n    var setup$2 = function (editor) {\n      if (global$2.webkit) {\n        addPreProcessFilter(editor, removeWebKitStyles);\n      }\n      if (global$2.ie) {\n        addPreProcessFilter(editor, removeExplorerBrElementsAfterBlocks);\n        addPostProcessFilter(editor, removeUnderlineAndFontInAnchor);\n      }\n    };\n    var Quirks = { setup: setup$2 };\n\n    var makeSetupHandler = function (editor, clipboard) {\n      return function (api) {\n        api.setActive(clipboard.pasteFormat.get() === 'text');\n        var pastePlainTextToggleHandler = function (e) {\n          return api.setActive(e.state);\n        };\n        editor.on('PastePlainTextToggle', pastePlainTextToggleHandler);\n        return function () {\n          return editor.off('PastePlainTextToggle', pastePlainTextToggleHandler);\n        };\n      };\n    };\n    var register$2 = function (editor, clipboard) {\n      editor.ui.registry.addToggleButton('pastetext', {\n        active: false,\n        icon: 'paste-text',\n        tooltip: 'Paste as text',\n        onAction: function () {\n          return editor.execCommand('mceTogglePlainTextPaste');\n        },\n        onSetup: makeSetupHandler(editor, clipboard)\n      });\n      editor.ui.registry.addToggleMenuItem('pastetext', {\n        text: 'Paste as text',\n        onAction: function () {\n          return editor.execCommand('mceTogglePlainTextPaste');\n        },\n        onSetup: makeSetupHandler(editor, clipboard)\n      });\n    };\n    var Buttons = { register: register$2 };\n\n    function Plugin () {\n      global$1.add('paste', function (editor) {\n        if (DetectProPlugin.hasProPlugin(editor) === false) {\n          var draggingInternallyState = Cell(false);\n          var pasteFormat = Cell(Settings.isPasteAsTextEnabled(editor) ? 'text' : 'html');\n          var clipboard = Clipboard(editor, pasteFormat);\n          var quirks = Quirks.setup(editor);\n          Buttons.register(editor, clipboard);\n          Commands.register(editor, clipboard);\n          PrePostProcess.setup(editor);\n          CutCopy.register(editor);\n          DragDrop.setup(editor, clipboard, draggingInternallyState);\n          return Api.get(clipboard, quirks);\n        }\n      });\n    }\n\n    Plugin();\n\n}(window));\n","module.exports = {\n  props: {\n    // Unique id for this interface. Should be added to the lower level \n    // HTML input element if applicable. This ID will be used in the label's\n    // `for` attribute\n    id: {\n      type: String,\n      required: true\n    },\n    // Name of the field\n    name: {\n      type: String,\n      required: true\n    },\n    // The current value. This can either be the default value, the saved database\n    // value or the current state after the user made an edit\n    value: {\n      type: null,\n      default: null\n    },\n    // Type of the field, eg `string`, `hash`, or `array`\n    type: {\n      type: String,\n      required: true\n    },\n    // Max length\n    length: {\n      type: [String, Number],\n      default: null\n    },\n    // If the field is readonly or not\n    readonly: {\n      type: Boolean,\n      default: false\n    },\n    // Name of the collection\n    collection: {\n      type: String,\n      default: null\n    },\n    // Primary key of the item you're editing in this context\n    primaryKey: {\n      type: [Number, String],\n      default: null\n    },\n    // If the field is required or not\n    required: {\n      type: Boolean,\n      default: false\n    },\n    // Field options. A json object based on the interface's meta.json file\n    options: {\n      type: Object,\n      default: () => ({})\n    },\n    // If the item that's currently being edited is new\n    newItem: {\n      type: Boolean,\n      default: false\n    },\n    // The relation of the current field. Will contain information on the related\n    // collection and field(s)\n    relation: {\n      type: Object,\n      default: null\n    },\n    // The other fields in the current edit page\n    fields: {\n      type: Object,\n      default: null\n    },\n    // The values of the other fields on the edit page. Can be used for things like\n    // automatically generating a slug based on another field\n    values: {\n      type: Object,\n      default: null\n    },\n    width: {\n      type: String,\n      default: null,\n      validator(val) {\n        return [\n          'half',\n          'half-left',\n          'half-right',\n          'full',\n          'fill'\n        ].includes(val);\n      }\n    }\n  }\n};\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var noop = function () {\n    };\n    var compose = function (fa, fb) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return fa(fb.apply(null, args));\n      };\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var identity = function (x) {\n      return x;\n    };\n    function curry(fn) {\n      var initialArgs = [];\n      for (var _i = 1; _i < arguments.length; _i++) {\n        initialArgs[_i - 1] = arguments[_i];\n      }\n      return function () {\n        var restArgs = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          restArgs[_i] = arguments[_i];\n        }\n        var all = initialArgs.concat(restArgs);\n        return fn.apply(null, all);\n      };\n    }\n    var not = function (f) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return !f.apply(null, args);\n      };\n    };\n    var die = function (msg) {\n      return function () {\n        throw new Error(msg);\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isString = isType('string');\n    var isArray = isType('array');\n    var isBoolean = isType('boolean');\n    var isFunction = isType('function');\n    var isNumber = isType('number');\n\n    var nativeSlice = Array.prototype.slice;\n    var nativeIndexOf = Array.prototype.indexOf;\n    var nativePush = Array.prototype.push;\n    var rawIndexOf = function (ts, t) {\n      return nativeIndexOf.call(ts, t);\n    };\n    var contains = function (xs, x) {\n      return rawIndexOf(xs, x) > -1;\n    };\n    var exists = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    var map = function (xs, f) {\n      var len = xs.length;\n      var r = new Array(len);\n      for (var i = 0; i < len; i++) {\n        var x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    var each = function (xs, f) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var eachr = function (xs, f) {\n      for (var i = xs.length - 1; i >= 0; i--) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var filter = function (xs, pred) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n    var foldr = function (xs, f, acc) {\n      eachr(xs, function (x) {\n        acc = f(acc, x);\n      });\n      return acc;\n    };\n    var foldl = function (xs, f, acc) {\n      each(xs, function (x) {\n        acc = f(acc, x);\n      });\n      return acc;\n    };\n    var find = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return Option.some(x);\n        }\n      }\n      return Option.none();\n    };\n    var findIndex = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return Option.some(i);\n        }\n      }\n      return Option.none();\n    };\n    var flatten = function (xs) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    var bind = function (xs, f) {\n      return flatten(map(xs, f));\n    };\n    var forall = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        var x = xs[i];\n        if (pred(x, i) !== true) {\n          return false;\n        }\n      }\n      return true;\n    };\n    var reverse = function (xs) {\n      var r = nativeSlice.call(xs, 0);\n      r.reverse();\n      return r;\n    };\n    var last = function (xs) {\n      return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]);\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n    var findMap = function (arr, f) {\n      for (var i = 0; i < arr.length; i++) {\n        var r = f(arr[i], i);\n        if (r.isSome()) {\n          return r;\n        }\n      }\n      return Option.none();\n    };\n\n    var keys = Object.keys;\n    var hasOwnProperty = Object.hasOwnProperty;\n    var each$1 = function (obj, f) {\n      var props = keys(obj);\n      for (var k = 0, len = props.length; k < len; k++) {\n        var i = props[k];\n        var x = obj[i];\n        f(x, i);\n      }\n    };\n    var map$1 = function (obj, f) {\n      return tupleMap(obj, function (x, i) {\n        return {\n          k: i,\n          v: f(x, i)\n        };\n      });\n    };\n    var tupleMap = function (obj, f) {\n      var r = {};\n      each$1(obj, function (x, i) {\n        var tuple = f(x, i);\n        r[tuple.k] = tuple.v;\n      });\n      return r;\n    };\n    var get = function (obj, key) {\n      return has(obj, key) ? Option.from(obj[key]) : Option.none();\n    };\n    var has = function (obj, key) {\n      return hasOwnProperty.call(obj, key);\n    };\n\n    var Immutable = function () {\n      var fields = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        fields[_i] = arguments[_i];\n      }\n      return function () {\n        var values = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          values[_i] = arguments[_i];\n        }\n        if (fields.length !== values.length) {\n          throw new Error('Wrong number of arguments to struct. Expected \"[' + fields.length + ']\", got ' + values.length + ' arguments');\n        }\n        var struct = {};\n        each(fields, function (name, i) {\n          struct[name] = constant(values[i]);\n        });\n        return struct;\n      };\n    };\n\n    var sort = function (arr) {\n      return arr.slice(0).sort();\n    };\n    var reqMessage = function (required, keys) {\n      throw new Error('All required keys (' + sort(required).join(', ') + ') were not specified. Specified keys were: ' + sort(keys).join(', ') + '.');\n    };\n    var unsuppMessage = function (unsupported) {\n      throw new Error('Unsupported keys for object: ' + sort(unsupported).join(', '));\n    };\n    var validateStrArr = function (label, array) {\n      if (!isArray(array)) {\n        throw new Error('The ' + label + ' fields must be an array. Was: ' + array + '.');\n      }\n      each(array, function (a) {\n        if (!isString(a)) {\n          throw new Error('The value ' + a + ' in the ' + label + ' fields was not a string.');\n        }\n      });\n    };\n    var invalidTypeMessage = function (incorrect, type) {\n      throw new Error('All values need to be of type: ' + type + '. Keys (' + sort(incorrect).join(', ') + ') were not.');\n    };\n    var checkDupes = function (everything) {\n      var sorted = sort(everything);\n      var dupe = find(sorted, function (s, i) {\n        return i < sorted.length - 1 && s === sorted[i + 1];\n      });\n      dupe.each(function (d) {\n        throw new Error('The field: ' + d + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].');\n      });\n    };\n\n    var MixedBag = function (required, optional) {\n      var everything = required.concat(optional);\n      if (everything.length === 0) {\n        throw new Error('You must specify at least one required or optional field.');\n      }\n      validateStrArr('required', required);\n      validateStrArr('optional', optional);\n      checkDupes(everything);\n      return function (obj) {\n        var keys$1 = keys(obj);\n        var allReqd = forall(required, function (req) {\n          return contains(keys$1, req);\n        });\n        if (!allReqd) {\n          reqMessage(required, keys$1);\n        }\n        var unsupported = filter(keys$1, function (key) {\n          return !contains(everything, key);\n        });\n        if (unsupported.length > 0) {\n          unsuppMessage(unsupported);\n        }\n        var r = {};\n        each(required, function (req) {\n          r[req] = constant(obj[req]);\n        });\n        each(optional, function (opt) {\n          r[opt] = constant(Object.prototype.hasOwnProperty.call(obj, opt) ? Option.some(obj[opt]) : Option.none());\n        });\n        return r;\n      };\n    };\n\n    var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;\n    var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;\n    var COMMENT = domGlobals.Node.COMMENT_NODE;\n    var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;\n    var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;\n    var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;\n    var ELEMENT = domGlobals.Node.ELEMENT_NODE;\n    var TEXT = domGlobals.Node.TEXT_NODE;\n    var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;\n    var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;\n    var ENTITY = domGlobals.Node.ENTITY_NODE;\n    var NOTATION = domGlobals.Node.NOTATION_NODE;\n\n    var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();\n\n    var name = function (element) {\n      var r = element.dom().nodeName;\n      return r.toLowerCase();\n    };\n    var type = function (element) {\n      return element.dom().nodeType;\n    };\n    var isType$1 = function (t) {\n      return function (element) {\n        return type(element) === t;\n      };\n    };\n    var isComment = function (element) {\n      return type(element) === COMMENT || name(element) === '#comment';\n    };\n    var isElement = isType$1(ELEMENT);\n    var isText = isType$1(TEXT);\n\n    var rawSet = function (dom, key, value) {\n      if (isString(value) || isBoolean(value) || isNumber(value)) {\n        dom.setAttribute(key, value + '');\n      } else {\n        domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n        throw new Error('Attribute value was not simple');\n      }\n    };\n    var set = function (element, key, value) {\n      rawSet(element.dom(), key, value);\n    };\n    var setAll = function (element, attrs) {\n      var dom = element.dom();\n      each$1(attrs, function (v, k) {\n        rawSet(dom, k, v);\n      });\n    };\n    var get$1 = function (element, key) {\n      var v = element.dom().getAttribute(key);\n      return v === null ? undefined : v;\n    };\n    var has$1 = function (element, key) {\n      var dom = element.dom();\n      return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;\n    };\n    var remove = function (element, key) {\n      element.dom().removeAttribute(key);\n    };\n    var clone = function (element) {\n      return foldl(element.dom().attributes, function (acc, attr) {\n        acc[attr.name] = attr.value;\n        return acc;\n      }, {});\n    };\n\n    var checkRange = function (str, substr, start) {\n      if (substr === '') {\n        return true;\n      }\n      if (str.length < substr.length) {\n        return false;\n      }\n      var x = str.substr(start, start + substr.length);\n      return x === substr;\n    };\n    var contains$1 = function (str, substr) {\n      return str.indexOf(substr) !== -1;\n    };\n    var startsWith = function (str, prefix) {\n      return checkRange(str, prefix, 0);\n    };\n    var endsWith = function (str, suffix) {\n      return checkRange(str, suffix, str.length - suffix.length);\n    };\n    var trim = function (str) {\n      return str.replace(/^\\s+|\\s+$/g, '');\n    };\n\n    var isSupported = function (dom) {\n      return dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n    };\n\n    var cached = function (f) {\n      var called = false;\n      var r;\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        if (!called) {\n          called = true;\n          r = f.apply(null, args);\n        }\n        return r;\n      };\n    };\n\n    var fromHtml = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        domGlobals.console.error('HTML does not have a single root node', html);\n        throw new Error('HTML must have a single root node');\n      }\n      return fromDom(div.childNodes[0]);\n    };\n    var fromTag = function (tag, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createElement(tag);\n      return fromDom(node);\n    };\n    var fromText = function (text, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createTextNode(text);\n      return fromDom(node);\n    };\n    var fromDom = function (node) {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: constant(node) };\n    };\n    var fromPoint = function (docElm, x, y) {\n      var doc = docElm.dom();\n      return Option.from(doc.elementFromPoint(x, y)).map(fromDom);\n    };\n    var Element = {\n      fromHtml: fromHtml,\n      fromTag: fromTag,\n      fromText: fromText,\n      fromDom: fromDom,\n      fromPoint: fromPoint\n    };\n\n    var inBody = function (element) {\n      var dom = isText(element) ? element.dom().parentNode : element.dom();\n      return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom);\n    };\n    var body = cached(function () {\n      return getBody(Element.fromDom(domGlobals.document));\n    });\n    var getBody = function (doc) {\n      var b = doc.dom().body;\n      if (b === null || b === undefined) {\n        throw new Error('Body is not available yet');\n      }\n      return Element.fromDom(b);\n    };\n\n    var internalSet = function (dom, property, value) {\n      if (!isString(value)) {\n        domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);\n        throw new Error('CSS value must be a string: ' + value);\n      }\n      if (isSupported(dom)) {\n        dom.style.setProperty(property, value);\n      }\n    };\n    var internalRemove = function (dom, property) {\n      if (isSupported(dom)) {\n        dom.style.removeProperty(property);\n      }\n    };\n    var set$1 = function (element, property, value) {\n      var dom = element.dom();\n      internalSet(dom, property, value);\n    };\n    var setAll$1 = function (element, css) {\n      var dom = element.dom();\n      each$1(css, function (v, k) {\n        internalSet(dom, k, v);\n      });\n    };\n    var get$2 = function (element, property) {\n      var dom = element.dom();\n      var styles = domGlobals.window.getComputedStyle(dom);\n      var r = styles.getPropertyValue(property);\n      var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n      return v === null ? undefined : v;\n    };\n    var getUnsafeProperty = function (dom, property) {\n      return isSupported(dom) ? dom.style.getPropertyValue(property) : '';\n    };\n    var getRaw = function (element, property) {\n      var dom = element.dom();\n      var raw = getUnsafeProperty(dom, property);\n      return Option.from(raw).filter(function (r) {\n        return r.length > 0;\n      });\n    };\n    var remove$1 = function (element, property) {\n      var dom = element.dom();\n      internalRemove(dom, property);\n      if (has$1(element, 'style') && trim(get$1(element, 'style')) === '') {\n        remove(element, 'style');\n      }\n    };\n    var copy = function (source, target) {\n      var sourceDom = source.dom();\n      var targetDom = target.dom();\n      if (isSupported(sourceDom) && isSupported(targetDom)) {\n        targetDom.style.cssText = sourceDom.style.cssText;\n      }\n    };\n\n    var compareDocumentPosition = function (a, b, match) {\n      return (a.compareDocumentPosition(b) & match) !== 0;\n    };\n    var documentPositionPreceding = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING);\n    };\n    var documentPositionContainedBy = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY);\n    };\n    var Node = {\n      documentPositionPreceding: documentPositionPreceding,\n      documentPositionContainedBy: documentPositionContainedBy\n    };\n\n    var __assign = function () {\n      __assign = Object.assign || function __assign(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p))\n              t[p] = s[p];\n        }\n        return t;\n      };\n      return __assign.apply(this, arguments);\n    };\n\n    var firstMatch = function (regexes, s) {\n      for (var i = 0; i < regexes.length; i++) {\n        var x = regexes[i];\n        if (x.test(s)) {\n          return x;\n        }\n      }\n      return undefined;\n    };\n    var find$1 = function (regexes, agent) {\n      var r = firstMatch(regexes, agent);\n      if (!r) {\n        return {\n          major: 0,\n          minor: 0\n        };\n      }\n      var group = function (i) {\n        return Number(agent.replace(r, '$' + i));\n      };\n      return nu(group(1), group(2));\n    };\n    var detect = function (versionRegexes, agent) {\n      var cleanedAgent = String(agent).toLowerCase();\n      if (versionRegexes.length === 0) {\n        return unknown();\n      }\n      return find$1(versionRegexes, cleanedAgent);\n    };\n    var unknown = function () {\n      return nu(0, 0);\n    };\n    var nu = function (major, minor) {\n      return {\n        major: major,\n        minor: minor\n      };\n    };\n    var Version = {\n      nu: nu,\n      detect: detect,\n      unknown: unknown\n    };\n\n    var edge = 'Edge';\n    var chrome = 'Chrome';\n    var ie = 'IE';\n    var opera = 'Opera';\n    var firefox = 'Firefox';\n    var safari = 'Safari';\n    var isBrowser = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$1 = function () {\n      return nu$1({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$1 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isEdge: isBrowser(edge, current),\n        isChrome: isBrowser(chrome, current),\n        isIE: isBrowser(ie, current),\n        isOpera: isBrowser(opera, current),\n        isFirefox: isBrowser(firefox, current),\n        isSafari: isBrowser(safari, current)\n      };\n    };\n    var Browser = {\n      unknown: unknown$1,\n      nu: nu$1,\n      edge: constant(edge),\n      chrome: constant(chrome),\n      ie: constant(ie),\n      opera: constant(opera),\n      firefox: constant(firefox),\n      safari: constant(safari)\n    };\n\n    var windows = 'Windows';\n    var ios = 'iOS';\n    var android = 'Android';\n    var linux = 'Linux';\n    var osx = 'OSX';\n    var solaris = 'Solaris';\n    var freebsd = 'FreeBSD';\n    var chromeos = 'ChromeOS';\n    var isOS = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$2 = function () {\n      return nu$2({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$2 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isWindows: isOS(windows, current),\n        isiOS: isOS(ios, current),\n        isAndroid: isOS(android, current),\n        isOSX: isOS(osx, current),\n        isLinux: isOS(linux, current),\n        isSolaris: isOS(solaris, current),\n        isFreeBSD: isOS(freebsd, current),\n        isChromeOS: isOS(chromeos, current)\n      };\n    };\n    var OperatingSystem = {\n      unknown: unknown$2,\n      nu: nu$2,\n      windows: constant(windows),\n      ios: constant(ios),\n      android: constant(android),\n      linux: constant(linux),\n      osx: constant(osx),\n      solaris: constant(solaris),\n      freebsd: constant(freebsd),\n      chromeos: constant(chromeos)\n    };\n\n    var DeviceType = function (os, browser, userAgent, mediaMatch) {\n      var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;\n      var isiPhone = os.isiOS() && !isiPad;\n      var isMobile = os.isiOS() || os.isAndroid();\n      var isTouch = isMobile || mediaMatch('(pointer:coarse)');\n      var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');\n      var isPhone = isiPhone || isMobile && !isTablet;\n      var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;\n      var isDesktop = !isPhone && !isTablet && !iOSwebview;\n      return {\n        isiPad: constant(isiPad),\n        isiPhone: constant(isiPhone),\n        isTablet: constant(isTablet),\n        isPhone: constant(isPhone),\n        isTouch: constant(isTouch),\n        isAndroid: os.isAndroid,\n        isiOS: os.isiOS,\n        isWebView: constant(iOSwebview),\n        isDesktop: constant(isDesktop)\n      };\n    };\n\n    var detect$1 = function (candidates, userAgent) {\n      var agent = String(userAgent).toLowerCase();\n      return find(candidates, function (candidate) {\n        return candidate.search(agent);\n      });\n    };\n    var detectBrowser = function (browsers, userAgent) {\n      return detect$1(browsers, userAgent).map(function (browser) {\n        var version = Version.detect(browser.versionRegexes, userAgent);\n        return {\n          current: browser.name,\n          version: version\n        };\n      });\n    };\n    var detectOs = function (oses, userAgent) {\n      return detect$1(oses, userAgent).map(function (os) {\n        var version = Version.detect(os.versionRegexes, userAgent);\n        return {\n          current: os.name,\n          version: version\n        };\n      });\n    };\n    var UaString = {\n      detectBrowser: detectBrowser,\n      detectOs: detectOs\n    };\n\n    var normalVersionRegex = /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/;\n    var checkContains = function (target) {\n      return function (uastring) {\n        return contains$1(uastring, target);\n      };\n    };\n    var browsers = [\n      {\n        name: 'Edge',\n        versionRegexes: [/.*?edge\\/ ?([0-9]+)\\.([0-9]+)$/],\n        search: function (uastring) {\n          return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit');\n        }\n      },\n      {\n        name: 'Chrome',\n        versionRegexes: [\n          /.*?chrome\\/([0-9]+)\\.([0-9]+).*/,\n          normalVersionRegex\n        ],\n        search: function (uastring) {\n          return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe');\n        }\n      },\n      {\n        name: 'IE',\n        versionRegexes: [\n          /.*?msie\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*?rv:([0-9]+)\\.([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return contains$1(uastring, 'msie') || contains$1(uastring, 'trident');\n        }\n      },\n      {\n        name: 'Opera',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?opera\\/([0-9]+)\\.([0-9]+).*/\n        ],\n        search: checkContains('opera')\n      },\n      {\n        name: 'Firefox',\n        versionRegexes: [/.*?firefox\\/\\ ?([0-9]+)\\.([0-9]+).*/],\n        search: checkContains('firefox')\n      },\n      {\n        name: 'Safari',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?cpu os ([0-9]+)_([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit');\n        }\n      }\n    ];\n    var oses = [\n      {\n        name: 'Windows',\n        search: checkContains('win'),\n        versionRegexes: [/.*?windows\\ nt\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'iOS',\n        search: function (uastring) {\n          return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad');\n        },\n        versionRegexes: [\n          /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*cpu os ([0-9]+)_([0-9]+).*/,\n          /.*cpu iphone os ([0-9]+)_([0-9]+).*/\n        ]\n      },\n      {\n        name: 'Android',\n        search: checkContains('android'),\n        versionRegexes: [/.*?android\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'OSX',\n        search: checkContains('mac os x'),\n        versionRegexes: [/.*?mac\\ os\\ x\\ ?([0-9]+)_([0-9]+).*/]\n      },\n      {\n        name: 'Linux',\n        search: checkContains('linux'),\n        versionRegexes: []\n      },\n      {\n        name: 'Solaris',\n        search: checkContains('sunos'),\n        versionRegexes: []\n      },\n      {\n        name: 'FreeBSD',\n        search: checkContains('freebsd'),\n        versionRegexes: []\n      },\n      {\n        name: 'ChromeOS',\n        search: checkContains('cros'),\n        versionRegexes: [/.*?chrome\\/([0-9]+)\\.([0-9]+).*/]\n      }\n    ];\n    var PlatformInfo = {\n      browsers: constant(browsers),\n      oses: constant(oses)\n    };\n\n    var detect$2 = function (userAgent, mediaMatch) {\n      var browsers = PlatformInfo.browsers();\n      var oses = PlatformInfo.oses();\n      var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);\n      var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);\n      var deviceType = DeviceType(os, browser, userAgent, mediaMatch);\n      return {\n        browser: browser,\n        os: os,\n        deviceType: deviceType\n      };\n    };\n    var PlatformDetection = { detect: detect$2 };\n\n    var mediaMatch = function (query) {\n      return domGlobals.window.matchMedia(query).matches;\n    };\n    var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch));\n    var detect$3 = function () {\n      return platform.get();\n    };\n\n    var ELEMENT$1 = ELEMENT;\n    var DOCUMENT$1 = DOCUMENT;\n    var is = function (element, selector) {\n      var dom = element.dom();\n      if (dom.nodeType !== ELEMENT$1) {\n        return false;\n      } else {\n        var elem = dom;\n        if (elem.matches !== undefined) {\n          return elem.matches(selector);\n        } else if (elem.msMatchesSelector !== undefined) {\n          return elem.msMatchesSelector(selector);\n        } else if (elem.webkitMatchesSelector !== undefined) {\n          return elem.webkitMatchesSelector(selector);\n        } else if (elem.mozMatchesSelector !== undefined) {\n          return elem.mozMatchesSelector(selector);\n        } else {\n          throw new Error('Browser lacks native selectors');\n        }\n      }\n    };\n    var bypassSelector = function (dom) {\n      return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0;\n    };\n    var all = function (selector, scope) {\n      var base = scope === undefined ? domGlobals.document : scope.dom();\n      return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom);\n    };\n    var one = function (selector, scope) {\n      var base = scope === undefined ? domGlobals.document : scope.dom();\n      return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom);\n    };\n\n    var eq = function (e1, e2) {\n      return e1.dom() === e2.dom();\n    };\n    var regularContains = function (e1, e2) {\n      var d1 = e1.dom();\n      var d2 = e2.dom();\n      return d1 === d2 ? false : d1.contains(d2);\n    };\n    var ieContains = function (e1, e2) {\n      return Node.documentPositionContainedBy(e1.dom(), e2.dom());\n    };\n    var browser = detect$3().browser;\n    var contains$2 = browser.isIE() ? ieContains : regularContains;\n    var is$1 = is;\n\n    var owner = function (element) {\n      return Element.fromDom(element.dom().ownerDocument);\n    };\n    var defaultView = function (element) {\n      return Element.fromDom(element.dom().ownerDocument.defaultView);\n    };\n    var parent = function (element) {\n      return Option.from(element.dom().parentNode).map(Element.fromDom);\n    };\n    var parents = function (element, isRoot) {\n      var stop = isFunction(isRoot) ? isRoot : never;\n      var dom = element.dom();\n      var ret = [];\n      while (dom.parentNode !== null && dom.parentNode !== undefined) {\n        var rawParent = dom.parentNode;\n        var p = Element.fromDom(rawParent);\n        ret.push(p);\n        if (stop(p) === true) {\n          break;\n        } else {\n          dom = rawParent;\n        }\n      }\n      return ret;\n    };\n    var prevSibling = function (element) {\n      return Option.from(element.dom().previousSibling).map(Element.fromDom);\n    };\n    var nextSibling = function (element) {\n      return Option.from(element.dom().nextSibling).map(Element.fromDom);\n    };\n    var children = function (element) {\n      return map(element.dom().childNodes, Element.fromDom);\n    };\n    var child = function (element, index) {\n      var cs = element.dom().childNodes;\n      return Option.from(cs[index]).map(Element.fromDom);\n    };\n    var firstChild = function (element) {\n      return child(element, 0);\n    };\n    var spot = Immutable('element', 'offset');\n\n    var before = function (marker, element) {\n      var parent$1 = parent(marker);\n      parent$1.each(function (v) {\n        v.dom().insertBefore(element.dom(), marker.dom());\n      });\n    };\n    var after = function (marker, element) {\n      var sibling = nextSibling(marker);\n      sibling.fold(function () {\n        var parent$1 = parent(marker);\n        parent$1.each(function (v) {\n          append(v, element);\n        });\n      }, function (v) {\n        before(v, element);\n      });\n    };\n    var prepend = function (parent, element) {\n      var firstChild$1 = firstChild(parent);\n      firstChild$1.fold(function () {\n        append(parent, element);\n      }, function (v) {\n        parent.dom().insertBefore(element.dom(), v.dom());\n      });\n    };\n    var append = function (parent, element) {\n      parent.dom().appendChild(element.dom());\n    };\n    var wrap = function (element, wrapper) {\n      before(element, wrapper);\n      append(wrapper, element);\n    };\n\n    var before$1 = function (marker, elements) {\n      each(elements, function (x) {\n        before(marker, x);\n      });\n    };\n    var after$1 = function (marker, elements) {\n      each(elements, function (x, i) {\n        var e = i === 0 ? marker : elements[i - 1];\n        after(e, x);\n      });\n    };\n    var append$1 = function (parent, elements) {\n      each(elements, function (x) {\n        append(parent, x);\n      });\n    };\n\n    var empty = function (element) {\n      element.dom().textContent = '';\n      each(children(element), function (rogue) {\n        remove$2(rogue);\n      });\n    };\n    var remove$2 = function (element) {\n      var dom = element.dom();\n      if (dom.parentNode !== null) {\n        dom.parentNode.removeChild(dom);\n      }\n    };\n    var unwrap = function (wrapper) {\n      var children$1 = children(wrapper);\n      if (children$1.length > 0) {\n        before$1(wrapper, children$1);\n      }\n      remove$2(wrapper);\n    };\n\n    var dimension = Immutable('width', 'height');\n    var dimensions = Immutable('width', 'height');\n    var grid = Immutable('rows', 'columns');\n    var address = Immutable('row', 'column');\n    var coords = Immutable('x', 'y');\n    var detail = Immutable('element', 'rowspan', 'colspan');\n    var detailnew = Immutable('element', 'rowspan', 'colspan', 'isNew');\n    var extended = Immutable('element', 'rowspan', 'colspan', 'row', 'column');\n    var rowdata = Immutable('element', 'cells', 'section');\n    var elementnew = Immutable('element', 'isNew');\n    var rowdatanew = Immutable('element', 'cells', 'section', 'isNew');\n    var rowcells = Immutable('cells', 'section');\n    var rowdetails = Immutable('details', 'section');\n    var bounds = Immutable('startRow', 'startCol', 'finishRow', 'finishCol');\n\n    var ancestors = function (scope, predicate, isRoot) {\n      return filter(parents(scope, isRoot), predicate);\n    };\n    var children$1 = function (scope, predicate) {\n      return filter(children(scope), predicate);\n    };\n    var descendants = function (scope, predicate) {\n      var result = [];\n      each(children(scope), function (x) {\n        if (predicate(x)) {\n          result = result.concat([x]);\n        }\n        result = result.concat(descendants(x, predicate));\n      });\n      return result;\n    };\n\n    var ancestors$1 = function (scope, selector, isRoot) {\n      return ancestors(scope, function (e) {\n        return is(e, selector);\n      }, isRoot);\n    };\n    var children$2 = function (scope, selector) {\n      return children$1(scope, function (e) {\n        return is(e, selector);\n      });\n    };\n    var descendants$1 = function (scope, selector) {\n      return all(selector, scope);\n    };\n\n    function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {\n      return is(scope, a) ? Option.some(scope) : isFunction(isRoot) && isRoot(scope) ? Option.none() : ancestor(scope, a, isRoot);\n    }\n\n    var ancestor = function (scope, predicate, isRoot) {\n      var element = scope.dom();\n      var stop = isFunction(isRoot) ? isRoot : constant(false);\n      while (element.parentNode) {\n        element = element.parentNode;\n        var el = Element.fromDom(element);\n        if (predicate(el)) {\n          return Option.some(el);\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Option.none();\n    };\n    var closest = function (scope, predicate, isRoot) {\n      var is = function (s, test) {\n        return test(s);\n      };\n      return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot);\n    };\n    var child$1 = function (scope, predicate) {\n      var pred = function (node) {\n        return predicate(Element.fromDom(node));\n      };\n      var result = find(scope.dom().childNodes, pred);\n      return result.map(Element.fromDom);\n    };\n    var descendant = function (scope, predicate) {\n      var descend = function (node) {\n        for (var i = 0; i < node.childNodes.length; i++) {\n          var child_1 = Element.fromDom(node.childNodes[i]);\n          if (predicate(child_1)) {\n            return Option.some(child_1);\n          }\n          var res = descend(node.childNodes[i]);\n          if (res.isSome()) {\n            return res;\n          }\n        }\n        return Option.none();\n      };\n      return descend(scope.dom());\n    };\n\n    var ancestor$1 = function (scope, selector, isRoot) {\n      return ancestor(scope, function (e) {\n        return is(e, selector);\n      }, isRoot);\n    };\n    var child$2 = function (scope, selector) {\n      return child$1(scope, function (e) {\n        return is(e, selector);\n      });\n    };\n    var descendant$1 = function (scope, selector) {\n      return one(selector, scope);\n    };\n    var closest$1 = function (scope, selector, isRoot) {\n      return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot);\n    };\n\n    var firstLayer = function (scope, selector) {\n      return filterFirstLayer(scope, selector, constant(true));\n    };\n    var filterFirstLayer = function (scope, selector, predicate) {\n      return bind(children(scope), function (x) {\n        return is(x, selector) ? predicate(x) ? [x] : [] : filterFirstLayer(x, selector, predicate);\n      });\n    };\n    var LayerSelector = {\n      firstLayer: firstLayer,\n      filterFirstLayer: filterFirstLayer\n    };\n\n    var lookup = function (tags, element, isRoot) {\n      if (isRoot === void 0) {\n        isRoot = never;\n      }\n      if (isRoot(element)) {\n        return Option.none();\n      }\n      if (contains(tags, name(element))) {\n        return Option.some(element);\n      }\n      var isRootOrUpperTable = function (elm) {\n        return is(elm, 'table') || isRoot(elm);\n      };\n      return ancestor$1(element, tags.join(','), isRootOrUpperTable);\n    };\n    var cell = function (element, isRoot) {\n      return lookup([\n        'td',\n        'th'\n      ], element, isRoot);\n    };\n    var cells = function (ancestor) {\n      return LayerSelector.firstLayer(ancestor, 'th,td');\n    };\n    var notCell = function (element, isRoot) {\n      return lookup([\n        'caption',\n        'tr',\n        'tbody',\n        'tfoot',\n        'thead'\n      ], element, isRoot);\n    };\n    var neighbours = function (selector, element) {\n      return parent(element).map(function (parent) {\n        return children$2(parent, selector);\n      });\n    };\n    var neighbourCells = curry(neighbours, 'th,td');\n    var neighbourRows = curry(neighbours, 'tr');\n    var firstCell = function (ancestor) {\n      return descendant$1(ancestor, 'th,td');\n    };\n    var table = function (element, isRoot) {\n      return closest$1(element, 'table', isRoot);\n    };\n    var row = function (element, isRoot) {\n      return lookup(['tr'], element, isRoot);\n    };\n    var rows = function (ancestor) {\n      return LayerSelector.firstLayer(ancestor, 'tr');\n    };\n    var attr = function (element, property) {\n      return parseInt(get$1(element, property), 10);\n    };\n    var grid$1 = function (element, rowProp, colProp) {\n      var rowsCount = attr(element, rowProp);\n      var cols = attr(element, colProp);\n      return grid(rowsCount, cols);\n    };\n    var TableLookup = {\n      cell: cell,\n      firstCell: firstCell,\n      cells: cells,\n      neighbourCells: neighbourCells,\n      table: table,\n      row: row,\n      rows: rows,\n      notCell: notCell,\n      neighbourRows: neighbourRows,\n      attr: attr,\n      grid: grid$1\n    };\n\n    var fromTable = function (table) {\n      var rows = TableLookup.rows(table);\n      return map(rows, function (row) {\n        var element = row;\n        var parent$1 = parent(element);\n        var parentSection = parent$1.map(function (p) {\n          var parentName = name(p);\n          return parentName === 'tfoot' || parentName === 'thead' || parentName === 'tbody' ? parentName : 'tbody';\n        }).getOr('tbody');\n        var cells = map(TableLookup.cells(row), function (cell) {\n          var rowspan = has$1(cell, 'rowspan') ? parseInt(get$1(cell, 'rowspan'), 10) : 1;\n          var colspan = has$1(cell, 'colspan') ? parseInt(get$1(cell, 'colspan'), 10) : 1;\n          return detail(cell, rowspan, colspan);\n        });\n        return rowdata(element, cells, parentSection);\n      });\n    };\n    var fromPastedRows = function (rows, example) {\n      return map(rows, function (row) {\n        var cells = map(TableLookup.cells(row), function (cell) {\n          var rowspan = has$1(cell, 'rowspan') ? parseInt(get$1(cell, 'rowspan'), 10) : 1;\n          var colspan = has$1(cell, 'colspan') ? parseInt(get$1(cell, 'colspan'), 10) : 1;\n          return detail(cell, rowspan, colspan);\n        });\n        return rowdata(row, cells, example.section());\n      });\n    };\n    var DetailsList = {\n      fromTable: fromTable,\n      fromPastedRows: fromPastedRows\n    };\n\n    var key = function (row, column) {\n      return row + ',' + column;\n    };\n    var getAt = function (warehouse, row, column) {\n      var raw = warehouse.access()[key(row, column)];\n      return raw !== undefined ? Option.some(raw) : Option.none();\n    };\n    var findItem = function (warehouse, item, comparator) {\n      var filtered = filterItems(warehouse, function (detail) {\n        return comparator(item, detail.element());\n      });\n      return filtered.length > 0 ? Option.some(filtered[0]) : Option.none();\n    };\n    var filterItems = function (warehouse, predicate) {\n      var all = bind(warehouse.all(), function (r) {\n        return r.cells();\n      });\n      return filter(all, predicate);\n    };\n    var generate = function (list) {\n      var access = {};\n      var cells = [];\n      var maxRows = list.length;\n      var maxColumns = 0;\n      each(list, function (details, r) {\n        var currentRow = [];\n        each(details.cells(), function (detail) {\n          var start = 0;\n          while (access[key(r, start)] !== undefined) {\n            start++;\n          }\n          var current = extended(detail.element(), detail.rowspan(), detail.colspan(), r, start);\n          for (var i = 0; i < detail.colspan(); i++) {\n            for (var j = 0; j < detail.rowspan(); j++) {\n              var cr = r + j;\n              var cc = start + i;\n              var newpos = key(cr, cc);\n              access[newpos] = current;\n              maxColumns = Math.max(maxColumns, cc + 1);\n            }\n          }\n          currentRow.push(current);\n        });\n        cells.push(rowdata(details.element(), currentRow, details.section()));\n      });\n      var grid$1 = grid(maxRows, maxColumns);\n      return {\n        grid: constant(grid$1),\n        access: constant(access),\n        all: constant(cells)\n      };\n    };\n    var justCells = function (warehouse) {\n      var rows = map(warehouse.all(), function (w) {\n        return w.cells();\n      });\n      return flatten(rows);\n    };\n    var Warehouse = {\n      generate: generate,\n      getAt: getAt,\n      findItem: findItem,\n      filterItems: filterItems,\n      justCells: justCells\n    };\n\n    var statsStruct = Immutable('minRow', 'minCol', 'maxRow', 'maxCol');\n    var findSelectedStats = function (house, isSelected) {\n      var totalColumns = house.grid().columns();\n      var totalRows = house.grid().rows();\n      var minRow = totalRows;\n      var minCol = totalColumns;\n      var maxRow = 0;\n      var maxCol = 0;\n      each$1(house.access(), function (detail) {\n        if (isSelected(detail)) {\n          var startRow = detail.row();\n          var endRow = startRow + detail.rowspan() - 1;\n          var startCol = detail.column();\n          var endCol = startCol + detail.colspan() - 1;\n          if (startRow < minRow) {\n            minRow = startRow;\n          } else if (endRow > maxRow) {\n            maxRow = endRow;\n          }\n          if (startCol < minCol) {\n            minCol = startCol;\n          } else if (endCol > maxCol) {\n            maxCol = endCol;\n          }\n        }\n      });\n      return statsStruct(minRow, minCol, maxRow, maxCol);\n    };\n    var makeCell = function (list, seenSelected, rowIndex) {\n      var row = list[rowIndex].element();\n      var td = Element.fromTag('td');\n      append(td, Element.fromTag('br'));\n      var f = seenSelected ? append : prepend;\n      f(row, td);\n    };\n    var fillInGaps = function (list, house, stats, isSelected) {\n      var totalColumns = house.grid().columns();\n      var totalRows = house.grid().rows();\n      for (var i = 0; i < totalRows; i++) {\n        var seenSelected = false;\n        for (var j = 0; j < totalColumns; j++) {\n          if (!(i < stats.minRow() || i > stats.maxRow() || j < stats.minCol() || j > stats.maxCol())) {\n            var needCell = Warehouse.getAt(house, i, j).filter(isSelected).isNone();\n            if (needCell) {\n              makeCell(list, seenSelected, i);\n            } else {\n              seenSelected = true;\n            }\n          }\n        }\n      }\n    };\n    var clean = function (table, stats) {\n      var emptyRows = filter(LayerSelector.firstLayer(table, 'tr'), function (row) {\n        return row.dom().childElementCount === 0;\n      });\n      each(emptyRows, remove$2);\n      if (stats.minCol() === stats.maxCol() || stats.minRow() === stats.maxRow()) {\n        each(LayerSelector.firstLayer(table, 'th,td'), function (cell) {\n          remove(cell, 'rowspan');\n          remove(cell, 'colspan');\n        });\n      }\n      remove(table, 'width');\n      remove(table, 'height');\n      remove$1(table, 'width');\n      remove$1(table, 'height');\n    };\n    var extract = function (table, selectedSelector) {\n      var isSelected = function (detail) {\n        return is(detail.element(), selectedSelector);\n      };\n      var list = DetailsList.fromTable(table);\n      var house = Warehouse.generate(list);\n      var stats = findSelectedStats(house, isSelected);\n      var selector = 'th:not(' + selectedSelector + ')' + ',td:not(' + selectedSelector + ')';\n      var unselectedCells = LayerSelector.filterFirstLayer(table, 'th,td', function (cell) {\n        return is(cell, selector);\n      });\n      each(unselectedCells, remove$2);\n      fillInGaps(list, house, stats, isSelected);\n      clean(table, stats);\n      return table;\n    };\n    var CopySelected = { extract: extract };\n\n    var nbsp = '\\xA0';\n\n    function NodeValue (is, name) {\n      var get = function (element) {\n        if (!is(element)) {\n          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');\n        }\n        return getOption(element).getOr('');\n      };\n      var getOption = function (element) {\n        return is(element) ? Option.from(element.dom().nodeValue) : Option.none();\n      };\n      var set = function (element, value) {\n        if (!is(element)) {\n          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');\n        }\n        element.dom().nodeValue = value;\n      };\n      return {\n        get: get,\n        getOption: getOption,\n        set: set\n      };\n    }\n\n    var api = NodeValue(isText, 'text');\n    var get$3 = function (element) {\n      return api.get(element);\n    };\n    var getOption = function (element) {\n      return api.getOption(element);\n    };\n    var set$2 = function (element, value) {\n      api.set(element, value);\n    };\n\n    var getEnd = function (element) {\n      return name(element) === 'img' ? 1 : getOption(element).fold(function () {\n        return children(element).length;\n      }, function (v) {\n        return v.length;\n      });\n    };\n    var isTextNodeWithCursorPosition = function (el) {\n      return getOption(el).filter(function (text) {\n        return text.trim().length !== 0 || text.indexOf(nbsp) > -1;\n      }).isSome();\n    };\n    var elementsWithCursorPosition = [\n      'img',\n      'br'\n    ];\n    var isCursorPosition = function (elem) {\n      var hasCursorPosition = isTextNodeWithCursorPosition(elem);\n      return hasCursorPosition || contains(elementsWithCursorPosition, name(elem));\n    };\n\n    var first = function (element) {\n      return descendant(element, isCursorPosition);\n    };\n    var last$1 = function (element) {\n      return descendantRtl(element, isCursorPosition);\n    };\n    var descendantRtl = function (scope, predicate) {\n      var descend = function (element) {\n        var children$1 = children(element);\n        for (var i = children$1.length - 1; i >= 0; i--) {\n          var child = children$1[i];\n          if (predicate(child)) {\n            return Option.some(child);\n          }\n          var res = descend(child);\n          if (res.isSome()) {\n            return res;\n          }\n        }\n        return Option.none();\n      };\n      return descend(scope);\n    };\n\n    var clone$1 = function (original, isDeep) {\n      return Element.fromDom(original.dom().cloneNode(isDeep));\n    };\n    var shallow = function (original) {\n      return clone$1(original, false);\n    };\n    var deep = function (original) {\n      return clone$1(original, true);\n    };\n    var shallowAs = function (original, tag) {\n      var nu = Element.fromTag(tag);\n      var attributes = clone(original);\n      setAll(nu, attributes);\n      return nu;\n    };\n    var copy$1 = function (original, tag) {\n      var nu = shallowAs(original, tag);\n      var cloneChildren = children(deep(original));\n      append$1(nu, cloneChildren);\n      return nu;\n    };\n\n    var createCell = function () {\n      var td = Element.fromTag('td');\n      append(td, Element.fromTag('br'));\n      return td;\n    };\n    var replace = function (cell, tag, attrs) {\n      var replica = copy$1(cell, tag);\n      each$1(attrs, function (v, k) {\n        if (v === null) {\n          remove(replica, k);\n        } else {\n          set(replica, k, v);\n        }\n      });\n      return replica;\n    };\n    var pasteReplace = function (cell) {\n      return cell;\n    };\n    var newRow = function (doc) {\n      return function () {\n        return Element.fromTag('tr', doc.dom());\n      };\n    };\n    var cloneFormats = function (oldCell, newCell, formats) {\n      var first$1 = first(oldCell);\n      return first$1.map(function (firstText) {\n        var formatSelector = formats.join(',');\n        var parents = ancestors$1(firstText, formatSelector, function (element) {\n          return eq(element, oldCell);\n        });\n        return foldr(parents, function (last, parent) {\n          var clonedFormat = shallow(parent);\n          remove(clonedFormat, 'contenteditable');\n          append(last, clonedFormat);\n          return clonedFormat;\n        }, newCell);\n      }).getOr(newCell);\n    };\n    var cellOperations = function (mutate, doc, formatsToClone) {\n      var newCell = function (prev) {\n        var docu = owner(prev.element());\n        var td = Element.fromTag(name(prev.element()), docu.dom());\n        var formats = formatsToClone.getOr([\n          'strong',\n          'em',\n          'b',\n          'i',\n          'span',\n          'font',\n          'h1',\n          'h2',\n          'h3',\n          'h4',\n          'h5',\n          'h6',\n          'p',\n          'div'\n        ]);\n        var lastNode = formats.length > 0 ? cloneFormats(prev.element(), td, formats) : td;\n        append(lastNode, Element.fromTag('br'));\n        copy(prev.element(), td);\n        remove$1(td, 'height');\n        if (prev.colspan() !== 1) {\n          remove$1(prev.element(), 'width');\n        }\n        mutate(prev.element(), td);\n        return td;\n      };\n      return {\n        row: newRow(doc),\n        cell: newCell,\n        replace: replace,\n        gap: createCell\n      };\n    };\n    var paste = function (doc) {\n      return {\n        row: newRow(doc),\n        cell: createCell,\n        replace: pasteReplace,\n        gap: createCell\n      };\n    };\n    var TableFill = {\n      cellOperations: cellOperations,\n      paste: paste\n    };\n\n    var fromHtml$1 = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      return children(Element.fromDom(div));\n    };\n\n    var inSelection = function (bounds, detail) {\n      var leftEdge = detail.column();\n      var rightEdge = detail.column() + detail.colspan() - 1;\n      var topEdge = detail.row();\n      var bottomEdge = detail.row() + detail.rowspan() - 1;\n      return leftEdge <= bounds.finishCol() && rightEdge >= bounds.startCol() && (topEdge <= bounds.finishRow() && bottomEdge >= bounds.startRow());\n    };\n    var isWithin = function (bounds, detail) {\n      return detail.column() >= bounds.startCol() && detail.column() + detail.colspan() - 1 <= bounds.finishCol() && detail.row() >= bounds.startRow() && detail.row() + detail.rowspan() - 1 <= bounds.finishRow();\n    };\n    var isRectangular = function (warehouse, bounds) {\n      var isRect = true;\n      var detailIsWithin = curry(isWithin, bounds);\n      for (var i = bounds.startRow(); i <= bounds.finishRow(); i++) {\n        for (var j = bounds.startCol(); j <= bounds.finishCol(); j++) {\n          isRect = isRect && Warehouse.getAt(warehouse, i, j).exists(detailIsWithin);\n        }\n      }\n      return isRect ? Option.some(bounds) : Option.none();\n    };\n    var CellBounds = {\n      inSelection: inSelection,\n      isWithin: isWithin,\n      isRectangular: isRectangular\n    };\n\n    var getBounds = function (detailA, detailB) {\n      return bounds(Math.min(detailA.row(), detailB.row()), Math.min(detailA.column(), detailB.column()), Math.max(detailA.row() + detailA.rowspan() - 1, detailB.row() + detailB.rowspan() - 1), Math.max(detailA.column() + detailA.colspan() - 1, detailB.column() + detailB.colspan() - 1));\n    };\n    var getAnyBox = function (warehouse, startCell, finishCell) {\n      var startCoords = Warehouse.findItem(warehouse, startCell, eq);\n      var finishCoords = Warehouse.findItem(warehouse, finishCell, eq);\n      return startCoords.bind(function (sc) {\n        return finishCoords.map(function (fc) {\n          return getBounds(sc, fc);\n        });\n      });\n    };\n    var getBox = function (warehouse, startCell, finishCell) {\n      return getAnyBox(warehouse, startCell, finishCell).bind(function (bounds) {\n        return CellBounds.isRectangular(warehouse, bounds);\n      });\n    };\n    var CellGroup = {\n      getAnyBox: getAnyBox,\n      getBox: getBox\n    };\n\n    var moveBy = function (warehouse, cell, row, column) {\n      return Warehouse.findItem(warehouse, cell, eq).bind(function (detail) {\n        var startRow = row > 0 ? detail.row() + detail.rowspan() - 1 : detail.row();\n        var startCol = column > 0 ? detail.column() + detail.colspan() - 1 : detail.column();\n        var dest = Warehouse.getAt(warehouse, startRow + row, startCol + column);\n        return dest.map(function (d) {\n          return d.element();\n        });\n      });\n    };\n    var intercepts = function (warehouse, start, finish) {\n      return CellGroup.getAnyBox(warehouse, start, finish).map(function (bounds) {\n        var inside = Warehouse.filterItems(warehouse, curry(CellBounds.inSelection, bounds));\n        return map(inside, function (detail) {\n          return detail.element();\n        });\n      });\n    };\n    var parentCell = function (warehouse, innerCell) {\n      var isContainedBy = function (c1, c2) {\n        return contains$2(c2, c1);\n      };\n      return Warehouse.findItem(warehouse, innerCell, isContainedBy).map(function (detail) {\n        return detail.element();\n      });\n    };\n    var CellFinder = {\n      moveBy: moveBy,\n      intercepts: intercepts,\n      parentCell: parentCell\n    };\n\n    var moveBy$1 = function (cell, deltaRow, deltaColumn) {\n      return TableLookup.table(cell).bind(function (table) {\n        var warehouse = getWarehouse(table);\n        return CellFinder.moveBy(warehouse, cell, deltaRow, deltaColumn);\n      });\n    };\n    var intercepts$1 = function (table, first, last) {\n      var warehouse = getWarehouse(table);\n      return CellFinder.intercepts(warehouse, first, last);\n    };\n    var nestedIntercepts = function (table, first, firstTable, last, lastTable) {\n      var warehouse = getWarehouse(table);\n      var optStartCell = eq(table, firstTable) ? Option.some(first) : CellFinder.parentCell(warehouse, first);\n      var optLastCell = eq(table, lastTable) ? Option.some(last) : CellFinder.parentCell(warehouse, last);\n      return optStartCell.bind(function (startCell) {\n        return optLastCell.bind(function (lastCell) {\n          return CellFinder.intercepts(warehouse, startCell, lastCell);\n        });\n      });\n    };\n    var getBox$1 = function (table, first, last) {\n      var warehouse = getWarehouse(table);\n      return CellGroup.getBox(warehouse, first, last);\n    };\n    var getWarehouse = function (table) {\n      var list = DetailsList.fromTable(table);\n      return Warehouse.generate(list);\n    };\n    var TablePositions = {\n      moveBy: moveBy$1,\n      intercepts: intercepts$1,\n      nestedIntercepts: nestedIntercepts,\n      getBox: getBox$1\n    };\n\n    var TagBoundaries = [\n      'body',\n      'p',\n      'div',\n      'article',\n      'aside',\n      'figcaption',\n      'figure',\n      'footer',\n      'header',\n      'nav',\n      'section',\n      'ol',\n      'ul',\n      'li',\n      'table',\n      'thead',\n      'tbody',\n      'tfoot',\n      'caption',\n      'tr',\n      'td',\n      'th',\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'blockquote',\n      'pre',\n      'address'\n    ];\n\n    function DomUniverse () {\n      var clone$1 = function (element) {\n        return Element.fromDom(element.dom().cloneNode(false));\n      };\n      var document = function (element) {\n        return element.dom().ownerDocument;\n      };\n      var isBoundary = function (element) {\n        if (!isElement(element)) {\n          return false;\n        }\n        if (name(element) === 'body') {\n          return true;\n        }\n        return contains(TagBoundaries, name(element));\n      };\n      var isEmptyTag = function (element) {\n        if (!isElement(element)) {\n          return false;\n        }\n        return contains([\n          'br',\n          'img',\n          'hr',\n          'input'\n        ], name(element));\n      };\n      var isNonEditable = function (element) {\n        return isElement(element) && get$1(element, 'contenteditable') === 'false';\n      };\n      var comparePosition = function (element, other) {\n        return element.dom().compareDocumentPosition(other.dom());\n      };\n      var copyAttributesTo = function (source, destination) {\n        var as = clone(source);\n        setAll(destination, as);\n      };\n      return {\n        up: constant({\n          selector: ancestor$1,\n          closest: closest$1,\n          predicate: ancestor,\n          all: parents\n        }),\n        down: constant({\n          selector: descendants$1,\n          predicate: descendants\n        }),\n        styles: constant({\n          get: get$2,\n          getRaw: getRaw,\n          set: set$1,\n          remove: remove$1\n        }),\n        attrs: constant({\n          get: get$1,\n          set: set,\n          remove: remove,\n          copyTo: copyAttributesTo\n        }),\n        insert: constant({\n          before: before,\n          after: after,\n          afterAll: after$1,\n          append: append,\n          appendAll: append$1,\n          prepend: prepend,\n          wrap: wrap\n        }),\n        remove: constant({\n          unwrap: unwrap,\n          remove: remove$2\n        }),\n        create: constant({\n          nu: Element.fromTag,\n          clone: clone$1,\n          text: Element.fromText\n        }),\n        query: constant({\n          comparePosition: comparePosition,\n          prevSibling: prevSibling,\n          nextSibling: nextSibling\n        }),\n        property: constant({\n          children: children,\n          name: name,\n          parent: parent,\n          document: document,\n          isText: isText,\n          isComment: isComment,\n          isElement: isElement,\n          getText: get$3,\n          setText: set$2,\n          isBoundary: isBoundary,\n          isEmptyTag: isEmptyTag,\n          isNonEditable: isNonEditable\n        }),\n        eq: eq,\n        is: is$1\n      };\n    }\n\n    var leftRight = Immutable('left', 'right');\n    var brokenPath = Immutable('first', 'second', 'splits');\n    var bisect = function (universe, parent, child) {\n      var children = universe.property().children(parent);\n      var index = findIndex(children, curry(universe.eq, child));\n      return index.map(function (ind) {\n        return {\n          before: constant(children.slice(0, ind)),\n          after: constant(children.slice(ind + 1))\n        };\n      });\n    };\n    var breakToRight = function (universe, parent, child) {\n      return bisect(universe, parent, child).map(function (parts) {\n        var second = universe.create().clone(parent);\n        universe.insert().appendAll(second, parts.after());\n        universe.insert().after(parent, second);\n        return leftRight(parent, second);\n      });\n    };\n    var breakToLeft = function (universe, parent, child) {\n      return bisect(universe, parent, child).map(function (parts) {\n        var prior = universe.create().clone(parent);\n        universe.insert().appendAll(prior, parts.before().concat([child]));\n        universe.insert().appendAll(parent, parts.after());\n        universe.insert().before(parent, prior);\n        return leftRight(prior, parent);\n      });\n    };\n    var breakPath = function (universe, item, isTop, breaker) {\n      var next = function (child, group, splits) {\n        var fallback = brokenPath(child, Option.none(), splits);\n        if (isTop(child)) {\n          return brokenPath(child, group, splits);\n        } else {\n          return universe.property().parent(child).bind(function (parent) {\n            return breaker(universe, parent, child).map(function (breakage) {\n              var extra = [{\n                  first: breakage.left,\n                  second: breakage.right\n                }];\n              var nextChild = isTop(parent) ? parent : breakage.left();\n              return next(nextChild, Option.some(breakage.right()), splits.concat(extra));\n            });\n          }).getOr(fallback);\n        }\n      };\n      return next(item, Option.none(), []);\n    };\n\n    var all$1 = function (universe, look, elements, f) {\n      var head = elements[0];\n      var tail = elements.slice(1);\n      return f(universe, look, head, tail);\n    };\n    var oneAll = function (universe, look, elements) {\n      return elements.length > 0 ? all$1(universe, look, elements, unsafeOne) : Option.none();\n    };\n    var unsafeOne = function (universe, look, head, tail) {\n      var start = look(universe, head);\n      return foldr(tail, function (b, a) {\n        var current = look(universe, a);\n        return commonElement(universe, b, current);\n      }, start);\n    };\n    var commonElement = function (universe, start, end) {\n      return start.bind(function (s) {\n        return end.filter(curry(universe.eq, s));\n      });\n    };\n\n    var eq$1 = function (universe, item) {\n      return curry(universe.eq, item);\n    };\n    var unsafeSubset = function (universe, common, ps1, ps2) {\n      var children = universe.property().children(common);\n      if (universe.eq(common, ps1[0])) {\n        return Option.some([ps1[0]]);\n      }\n      if (universe.eq(common, ps2[0])) {\n        return Option.some([ps2[0]]);\n      }\n      var finder = function (ps) {\n        var topDown = reverse(ps);\n        var index = findIndex(topDown, eq$1(universe, common)).getOr(-1);\n        var item = index < topDown.length - 1 ? topDown[index + 1] : topDown[index];\n        return findIndex(children, eq$1(universe, item));\n      };\n      var startIndex = finder(ps1);\n      var endIndex = finder(ps2);\n      return startIndex.bind(function (sIndex) {\n        return endIndex.map(function (eIndex) {\n          var first = Math.min(sIndex, eIndex);\n          var last = Math.max(sIndex, eIndex);\n          return children.slice(first, last + 1);\n        });\n      });\n    };\n    var ancestors$2 = function (universe, start, end, isRoot) {\n      if (isRoot === void 0) {\n        isRoot = never;\n      }\n      var ps1 = [start].concat(universe.up().all(start));\n      var ps2 = [end].concat(universe.up().all(end));\n      var prune = function (path) {\n        var index = findIndex(path, isRoot);\n        return index.fold(function () {\n          return path;\n        }, function (ind) {\n          return path.slice(0, ind + 1);\n        });\n      };\n      var pruned1 = prune(ps1);\n      var pruned2 = prune(ps2);\n      var shared = find(pruned1, function (x) {\n        return exists(pruned2, eq$1(universe, x));\n      });\n      return {\n        firstpath: constant(pruned1),\n        secondpath: constant(pruned2),\n        shared: constant(shared)\n      };\n    };\n    var subset = function (universe, start, end) {\n      var ancs = ancestors$2(universe, start, end);\n      return ancs.shared().bind(function (shared) {\n        return unsafeSubset(universe, shared, ancs.firstpath(), ancs.secondpath());\n      });\n    };\n    var SubsetFn = {\n      subset: subset,\n      ancestors: ancestors$2\n    };\n\n    var sharedOne = oneAll;\n    var subset$1 = SubsetFn.subset;\n    var ancestors$3 = SubsetFn.ancestors;\n    var breakToLeft$1 = breakToLeft;\n    var breakToRight$1 = breakToRight;\n    var breakPath$1 = breakPath;\n    var Parent = {\n      sharedOne: sharedOne,\n      subset: subset$1,\n      ancestors: ancestors$3,\n      breakToLeft: breakToLeft$1,\n      breakToRight: breakToRight$1,\n      breakPath: breakPath$1\n    };\n\n    var universe = DomUniverse();\n    var sharedOne$1 = function (look, elements) {\n      return Parent.sharedOne(universe, function (_universe, element) {\n        return look(element);\n      }, elements);\n    };\n    var subset$2 = function (start, finish) {\n      return Parent.subset(universe, start, finish);\n    };\n    var ancestors$4 = function (start, finish, isRoot) {\n      return Parent.ancestors(universe, start, finish, isRoot);\n    };\n    var breakToLeft$2 = function (parent, child) {\n      return Parent.breakToLeft(universe, parent, child);\n    };\n    var breakToRight$2 = function (parent, child) {\n      return Parent.breakToRight(universe, parent, child);\n    };\n    var breakPath$2 = function (child, isTop, breaker) {\n      return Parent.breakPath(universe, child, isTop, function (u, p, c) {\n        return breaker(p, c);\n      });\n    };\n    var DomParent = {\n      sharedOne: sharedOne$1,\n      subset: subset$2,\n      ancestors: ancestors$4,\n      breakToLeft: breakToLeft$2,\n      breakToRight: breakToRight$2,\n      breakPath: breakPath$2\n    };\n\n    var create = MixedBag([\n      'boxes',\n      'start',\n      'finish'\n    ], []);\n    var Identified = { create: create };\n\n    var lookupTable = function (container) {\n      return ancestor$1(container, 'table');\n    };\n    var identify = function (start, finish, isRoot) {\n      var getIsRoot = function (rootTable) {\n        return function (element) {\n          return isRoot !== undefined && isRoot(element) || eq(element, rootTable);\n        };\n      };\n      if (eq(start, finish)) {\n        return Option.some(Identified.create({\n          boxes: Option.some([start]),\n          start: start,\n          finish: finish\n        }));\n      } else {\n        return lookupTable(start).bind(function (startTable) {\n          return lookupTable(finish).bind(function (finishTable) {\n            if (eq(startTable, finishTable)) {\n              return Option.some(Identified.create({\n                boxes: TablePositions.intercepts(startTable, start, finish),\n                start: start,\n                finish: finish\n              }));\n            } else if (contains$2(startTable, finishTable)) {\n              var ancestorCells = ancestors$1(finish, 'td,th', getIsRoot(startTable));\n              var finishCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : finish;\n              return Option.some(Identified.create({\n                boxes: TablePositions.nestedIntercepts(startTable, start, startTable, finish, finishTable),\n                start: start,\n                finish: finishCell\n              }));\n            } else if (contains$2(finishTable, startTable)) {\n              var ancestorCells = ancestors$1(start, 'td,th', getIsRoot(finishTable));\n              var startCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : start;\n              return Option.some(Identified.create({\n                boxes: TablePositions.nestedIntercepts(finishTable, start, startTable, finish, finishTable),\n                start: start,\n                finish: startCell\n              }));\n            } else {\n              return DomParent.ancestors(start, finish).shared().bind(function (lca) {\n                return closest$1(lca, 'table', isRoot).bind(function (lcaTable) {\n                  var finishAncestorCells = ancestors$1(finish, 'td,th', getIsRoot(lcaTable));\n                  var finishCell = finishAncestorCells.length > 0 ? finishAncestorCells[finishAncestorCells.length - 1] : finish;\n                  var startAncestorCells = ancestors$1(start, 'td,th', getIsRoot(lcaTable));\n                  var startCell = startAncestorCells.length > 0 ? startAncestorCells[startAncestorCells.length - 1] : start;\n                  return Option.some(Identified.create({\n                    boxes: TablePositions.nestedIntercepts(lcaTable, start, startTable, finish, finishTable),\n                    start: startCell,\n                    finish: finishCell\n                  }));\n                });\n              });\n            }\n          });\n        });\n      }\n    };\n    var retrieve = function (container, selector) {\n      var sels = descendants$1(container, selector);\n      return sels.length > 0 ? Option.some(sels) : Option.none();\n    };\n    var getLast = function (boxes, lastSelectedSelector) {\n      return find(boxes, function (box) {\n        return is(box, lastSelectedSelector);\n      });\n    };\n    var getEdges = function (container, firstSelectedSelector, lastSelectedSelector) {\n      return descendant$1(container, firstSelectedSelector).bind(function (first) {\n        return descendant$1(container, lastSelectedSelector).bind(function (last) {\n          return DomParent.sharedOne(lookupTable, [\n            first,\n            last\n          ]).map(function (tbl) {\n            return {\n              first: constant(first),\n              last: constant(last),\n              table: constant(tbl)\n            };\n          });\n        });\n      });\n    };\n    var expandTo = function (finish, firstSelectedSelector) {\n      return ancestor$1(finish, 'table').bind(function (table) {\n        return descendant$1(table, firstSelectedSelector).bind(function (start) {\n          return identify(start, finish).bind(function (identified) {\n            return identified.boxes().map(function (boxes) {\n              return {\n                boxes: constant(boxes),\n                start: constant(identified.start()),\n                finish: constant(identified.finish())\n              };\n            });\n          });\n        });\n      });\n    };\n    var shiftSelection = function (boxes, deltaRow, deltaColumn, firstSelectedSelector, lastSelectedSelector) {\n      return getLast(boxes, lastSelectedSelector).bind(function (last) {\n        return TablePositions.moveBy(last, deltaRow, deltaColumn).bind(function (finish) {\n          return expandTo(finish, firstSelectedSelector);\n        });\n      });\n    };\n    var CellSelection = {\n      identify: identify,\n      retrieve: retrieve,\n      shiftSelection: shiftSelection,\n      getEdges: getEdges\n    };\n\n    var retrieve$1 = function (container, selector) {\n      return CellSelection.retrieve(container, selector);\n    };\n    var retrieveBox = function (container, firstSelectedSelector, lastSelectedSelector) {\n      return CellSelection.getEdges(container, firstSelectedSelector, lastSelectedSelector).bind(function (edges) {\n        var isRoot = function (ancestor) {\n          return eq(container, ancestor);\n        };\n        var firstAncestor = ancestor$1(edges.first(), 'thead,tfoot,tbody,table', isRoot);\n        var lastAncestor = ancestor$1(edges.last(), 'thead,tfoot,tbody,table', isRoot);\n        return firstAncestor.bind(function (fA) {\n          return lastAncestor.bind(function (lA) {\n            return eq(fA, lA) ? TablePositions.getBox(edges.table(), edges.first(), edges.last()) : Option.none();\n          });\n        });\n      });\n    };\n    var TableSelection = {\n      retrieve: retrieve$1,\n      retrieveBox: retrieveBox\n    };\n\n    var selected = 'data-mce-selected';\n    var selectedSelector = 'td[' + selected + '],th[' + selected + ']';\n    var attributeSelector = '[' + selected + ']';\n    var firstSelected = 'data-mce-first-selected';\n    var firstSelectedSelector = 'td[' + firstSelected + '],th[' + firstSelected + ']';\n    var lastSelected = 'data-mce-last-selected';\n    var lastSelectedSelector = 'td[' + lastSelected + '],th[' + lastSelected + ']';\n    var Ephemera = {\n      selected: constant(selected),\n      selectedSelector: constant(selectedSelector),\n      attributeSelector: constant(attributeSelector),\n      firstSelected: constant(firstSelected),\n      firstSelectedSelector: constant(firstSelectedSelector),\n      lastSelected: constant(lastSelected),\n      lastSelectedSelector: constant(lastSelectedSelector)\n    };\n\n    var generate$1 = function (cases) {\n      if (!isArray(cases)) {\n        throw new Error('cases must be an array');\n      }\n      if (cases.length === 0) {\n        throw new Error('there must be at least one case');\n      }\n      var constructors = [];\n      var adt = {};\n      each(cases, function (acase, count) {\n        var keys$1 = keys(acase);\n        if (keys$1.length !== 1) {\n          throw new Error('one and only one name per case');\n        }\n        var key = keys$1[0];\n        var value = acase[key];\n        if (adt[key] !== undefined) {\n          throw new Error('duplicate key detected:' + key);\n        } else if (key === 'cata') {\n          throw new Error('cannot have a case named cata (sorry)');\n        } else if (!isArray(value)) {\n          throw new Error('case arguments must be an array');\n        }\n        constructors.push(key);\n        adt[key] = function () {\n          var argLength = arguments.length;\n          if (argLength !== value.length) {\n            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);\n          }\n          var args = new Array(argLength);\n          for (var i = 0; i < args.length; i++) {\n            args[i] = arguments[i];\n          }\n          var match = function (branches) {\n            var branchKeys = keys(branches);\n            if (constructors.length !== branchKeys.length) {\n              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\\nActual: ' + branchKeys.join(','));\n            }\n            var allReqd = forall(constructors, function (reqKey) {\n              return contains(branchKeys, reqKey);\n            });\n            if (!allReqd) {\n              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\\nRequired: ' + constructors.join(', '));\n            }\n            return branches[key].apply(null, args);\n          };\n          return {\n            fold: function () {\n              if (arguments.length !== cases.length) {\n                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + arguments.length);\n              }\n              var target = arguments[count];\n              return target.apply(null, args);\n            },\n            match: match,\n            log: function (label) {\n              domGlobals.console.log(label, {\n                constructors: constructors,\n                constructor: key,\n                params: args\n              });\n            }\n          };\n        };\n      });\n      return adt;\n    };\n    var Adt = { generate: generate$1 };\n\n    var type$1 = Adt.generate([\n      { none: [] },\n      { multiple: ['elements'] },\n      { single: ['selection'] }\n    ]);\n    var cata = function (subject, onNone, onMultiple, onSingle) {\n      return subject.fold(onNone, onMultiple, onSingle);\n    };\n    var SelectionTypes = {\n      cata: cata,\n      none: type$1.none,\n      multiple: type$1.multiple,\n      single: type$1.single\n    };\n\n    var selection = function (cell, selections) {\n      return SelectionTypes.cata(selections.get(), constant([]), identity, constant([cell]));\n    };\n    var unmergable = function (cell, selections) {\n      var hasSpan = function (elem) {\n        return has$1(elem, 'rowspan') && parseInt(get$1(elem, 'rowspan'), 10) > 1 || has$1(elem, 'colspan') && parseInt(get$1(elem, 'colspan'), 10) > 1;\n      };\n      var candidates = selection(cell, selections);\n      return candidates.length > 0 && forall(candidates, hasSpan) ? Option.some(candidates) : Option.none();\n    };\n    var mergable = function (table, selections) {\n      return SelectionTypes.cata(selections.get(), Option.none, function (cells, _env) {\n        if (cells.length === 0) {\n          return Option.none();\n        }\n        return TableSelection.retrieveBox(table, Ephemera.firstSelectedSelector(), Ephemera.lastSelectedSelector()).bind(function (bounds) {\n          return cells.length > 1 ? Option.some({\n            bounds: constant(bounds),\n            cells: constant(cells)\n          }) : Option.none();\n        });\n      }, Option.none);\n    };\n    var CellOperations = {\n      mergable: mergable,\n      unmergable: unmergable,\n      selection: selection\n    };\n\n    var noMenu = function (cell) {\n      return {\n        element: constant(cell),\n        mergable: Option.none,\n        unmergable: Option.none,\n        selection: constant([cell])\n      };\n    };\n    var forMenu = function (selections, table, cell) {\n      return {\n        element: constant(cell),\n        mergable: constant(CellOperations.mergable(table, selections)),\n        unmergable: constant(CellOperations.unmergable(cell, selections)),\n        selection: constant(CellOperations.selection(cell, selections))\n      };\n    };\n    var notCell$1 = function (element) {\n      return noMenu(element);\n    };\n    var paste$1 = Immutable('element', 'clipboard', 'generators');\n    var pasteRows = function (selections, table, cell, clipboard, generators) {\n      return {\n        element: constant(cell),\n        mergable: Option.none,\n        unmergable: Option.none,\n        selection: constant(CellOperations.selection(cell, selections)),\n        clipboard: constant(clipboard),\n        generators: constant(generators)\n      };\n    };\n    var TableTargets = {\n      noMenu: noMenu,\n      forMenu: forMenu,\n      notCell: notCell$1,\n      paste: paste$1,\n      pasteRows: pasteRows\n    };\n\n    var extractSelected = function (cells) {\n      return TableLookup.table(cells[0]).map(deep).map(function (replica) {\n        return [CopySelected.extract(replica, Ephemera.attributeSelector())];\n      });\n    };\n    var serializeElements = function (editor, elements) {\n      return map(elements, function (elm) {\n        return editor.selection.serializer.serialize(elm.dom(), {});\n      }).join('');\n    };\n    var getTextContent = function (elements) {\n      return map(elements, function (element) {\n        return element.dom().innerText;\n      }).join('');\n    };\n    var registerEvents = function (editor, selections, actions, cellSelection) {\n      editor.on('BeforeGetContent', function (e) {\n        var multiCellContext = function (cells) {\n          e.preventDefault();\n          extractSelected(cells).each(function (elements) {\n            e.content = e.format === 'text' ? getTextContent(elements) : serializeElements(editor, elements);\n          });\n        };\n        if (e.selection === true) {\n          SelectionTypes.cata(selections.get(), noop, multiCellContext, noop);\n        }\n      });\n      editor.on('BeforeSetContent', function (e) {\n        if (e.selection === true && e.paste === true) {\n          var cellOpt = Option.from(editor.dom.getParent(editor.selection.getStart(), 'th,td'));\n          cellOpt.each(function (domCell) {\n            var cell = Element.fromDom(domCell);\n            TableLookup.table(cell).each(function (table) {\n              var elements = filter(fromHtml$1(e.content), function (content) {\n                return name(content) !== 'meta';\n              });\n              if (elements.length === 1 && name(elements[0]) === 'table') {\n                e.preventDefault();\n                var doc = Element.fromDom(editor.getDoc());\n                var generators = TableFill.paste(doc);\n                var targets = TableTargets.paste(cell, elements[0], generators);\n                actions.pasteCells(table, targets).each(function (rng) {\n                  editor.selection.setRng(rng);\n                  editor.focus();\n                  cellSelection.clear(table);\n                });\n              }\n            });\n          });\n        }\n      });\n    };\n    var Clipboard = { registerEvents: registerEvents };\n\n    function Dimension (name, getOffset) {\n      var set = function (element, h) {\n        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {\n          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);\n        }\n        var dom = element.dom();\n        if (isSupported(dom)) {\n          dom.style[name] = h + 'px';\n        }\n      };\n      var get = function (element) {\n        var r = getOffset(element);\n        if (r <= 0 || r === null) {\n          var css = get$2(element, name);\n          return parseFloat(css) || 0;\n        }\n        return r;\n      };\n      var getOuter = get;\n      var aggregate = function (element, properties) {\n        return foldl(properties, function (acc, property) {\n          var val = get$2(element, property);\n          var value = val === undefined ? 0 : parseInt(val, 10);\n          return isNaN(value) ? acc : acc + value;\n        }, 0);\n      };\n      var max = function (element, value, properties) {\n        var cumulativeInclusions = aggregate(element, properties);\n        var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;\n        return absoluteMax;\n      };\n      return {\n        set: set,\n        get: get,\n        getOuter: getOuter,\n        aggregate: aggregate,\n        max: max\n      };\n    }\n\n    var api$1 = Dimension('height', function (element) {\n      var dom = element.dom();\n      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;\n    });\n    var get$4 = function (element) {\n      return api$1.get(element);\n    };\n    var getOuter = function (element) {\n      return api$1.getOuter(element);\n    };\n\n    var api$2 = Dimension('width', function (element) {\n      return element.dom().offsetWidth;\n    });\n    var get$5 = function (element) {\n      return api$2.get(element);\n    };\n    var getOuter$1 = function (element) {\n      return api$2.getOuter(element);\n    };\n\n    var platform$1 = detect$3();\n    var needManualCalc = function () {\n      return platform$1.browser.isIE() || platform$1.browser.isEdge();\n    };\n    var toNumber = function (px, fallback) {\n      var num = parseFloat(px);\n      return isNaN(num) ? fallback : num;\n    };\n    var getProp = function (elm, name, fallback) {\n      return toNumber(get$2(elm, name), fallback);\n    };\n    var getCalculatedHeight = function (cell) {\n      var paddingTop = getProp(cell, 'padding-top', 0);\n      var paddingBottom = getProp(cell, 'padding-bottom', 0);\n      var borderTop = getProp(cell, 'border-top-width', 0);\n      var borderBottom = getProp(cell, 'border-bottom-width', 0);\n      var height = cell.dom().getBoundingClientRect().height;\n      var boxSizing = get$2(cell, 'box-sizing');\n      var borders = borderTop + borderBottom;\n      return boxSizing === 'border-box' ? height : height - paddingTop - paddingBottom - borders;\n    };\n    var getWidth = function (cell) {\n      return getProp(cell, 'width', get$5(cell));\n    };\n    var getHeight = function (cell) {\n      return needManualCalc() ? getCalculatedHeight(cell) : getProp(cell, 'height', get$4(cell));\n    };\n    var RuntimeSize = {\n      getWidth: getWidth,\n      getHeight: getHeight\n    };\n\n    var genericSizeRegex = /(\\d+(\\.\\d+)?)(\\w|%)*/;\n    var percentageBasedSizeRegex = /(\\d+(\\.\\d+)?)%/;\n    var pixelBasedSizeRegex = /(\\d+(\\.\\d+)?)px|em/;\n    var setPixelWidth = function (cell, amount) {\n      set$1(cell, 'width', amount + 'px');\n    };\n    var setPercentageWidth = function (cell, amount) {\n      set$1(cell, 'width', amount + '%');\n    };\n    var setHeight = function (cell, amount) {\n      set$1(cell, 'height', amount + 'px');\n    };\n    var getHeightValue = function (cell) {\n      return getRaw(cell, 'height').getOrThunk(function () {\n        return RuntimeSize.getHeight(cell) + 'px';\n      });\n    };\n    var convert = function (cell, number, getter, setter) {\n      var newSize = TableLookup.table(cell).map(function (table) {\n        var total = getter(table);\n        return Math.floor(number / 100 * total);\n      }).getOr(number);\n      setter(cell, newSize);\n      return newSize;\n    };\n    var normalizePixelSize = function (value, cell, getter, setter) {\n      var number = parseInt(value, 10);\n      return endsWith(value, '%') && name(cell) !== 'table' ? convert(cell, number, getter, setter) : number;\n    };\n    var getTotalHeight = function (cell) {\n      var value = getHeightValue(cell);\n      if (!value) {\n        return get$4(cell);\n      }\n      return normalizePixelSize(value, cell, get$4, setHeight);\n    };\n    var get$6 = function (cell, type, f) {\n      var v = f(cell);\n      var span = getSpan(cell, type);\n      return v / span;\n    };\n    var getSpan = function (cell, type) {\n      return has$1(cell, type) ? parseInt(get$1(cell, type), 10) : 1;\n    };\n    var getRawWidth = function (element) {\n      var cssWidth = getRaw(element, 'width');\n      return cssWidth.fold(function () {\n        return Option.from(get$1(element, 'width'));\n      }, function (width) {\n        return Option.some(width);\n      });\n    };\n    var normalizePercentageWidth = function (cellWidth, tableSize) {\n      return cellWidth / tableSize.pixelWidth() * 100;\n    };\n    var choosePercentageSize = function (element, width, tableSize) {\n      var percentMatch = percentageBasedSizeRegex.exec(width);\n      if (percentMatch !== null) {\n        return parseFloat(percentMatch[1]);\n      } else {\n        var intWidth = get$5(element);\n        return normalizePercentageWidth(intWidth, tableSize);\n      }\n    };\n    var getPercentageWidth = function (cell, tableSize) {\n      var width = getRawWidth(cell);\n      return width.fold(function () {\n        var intWidth = get$5(cell);\n        return normalizePercentageWidth(intWidth, tableSize);\n      }, function (w) {\n        return choosePercentageSize(cell, w, tableSize);\n      });\n    };\n    var normalizePixelWidth = function (cellWidth, tableSize) {\n      return cellWidth / 100 * tableSize.pixelWidth();\n    };\n    var choosePixelSize = function (element, width, tableSize) {\n      var pixelMatch = pixelBasedSizeRegex.exec(width);\n      if (pixelMatch !== null) {\n        return parseInt(pixelMatch[1], 10);\n      }\n      var percentMatch = percentageBasedSizeRegex.exec(width);\n      if (percentMatch !== null) {\n        var floatWidth = parseFloat(percentMatch[1]);\n        return normalizePixelWidth(floatWidth, tableSize);\n      }\n      return get$5(element);\n    };\n    var getPixelWidth = function (cell, tableSize) {\n      var width = getRawWidth(cell);\n      return width.fold(function () {\n        return get$5(cell);\n      }, function (w) {\n        return choosePixelSize(cell, w, tableSize);\n      });\n    };\n    var getHeight$1 = function (cell) {\n      return get$6(cell, 'rowspan', getTotalHeight);\n    };\n    var getGenericWidth = function (cell) {\n      var width = getRawWidth(cell);\n      return width.bind(function (w) {\n        var match = genericSizeRegex.exec(w);\n        if (match !== null) {\n          return Option.some({\n            width: constant(parseFloat(match[1])),\n            unit: constant(match[3])\n          });\n        } else {\n          return Option.none();\n        }\n      });\n    };\n    var setGenericWidth = function (cell, amount, unit) {\n      set$1(cell, 'width', amount + unit);\n    };\n    var Sizes = {\n      percentageBasedSizeRegex: constant(percentageBasedSizeRegex),\n      pixelBasedSizeRegex: constant(pixelBasedSizeRegex),\n      setPixelWidth: setPixelWidth,\n      setPercentageWidth: setPercentageWidth,\n      setHeight: setHeight,\n      getPixelWidth: getPixelWidth,\n      getPercentageWidth: getPercentageWidth,\n      getGenericWidth: getGenericWidth,\n      setGenericWidth: setGenericWidth,\n      getHeight: getHeight$1,\n      getRawWidth: getRawWidth\n    };\n\n    var halve = function (main, other) {\n      var width = Sizes.getGenericWidth(main);\n      width.each(function (w) {\n        var newWidth = w.width() / 2;\n        Sizes.setGenericWidth(main, newWidth, w.unit());\n        Sizes.setGenericWidth(other, newWidth, w.unit());\n      });\n    };\n    var CellMutations = { halve: halve };\n\n    var r = function (left, top) {\n      var translate = function (x, y) {\n        return r(left + x, top + y);\n      };\n      return {\n        left: constant(left),\n        top: constant(top),\n        translate: translate\n      };\n    };\n    var Position = r;\n\n    var boxPosition = function (dom) {\n      var box = dom.getBoundingClientRect();\n      return Position(box.left, box.top);\n    };\n    var firstDefinedOrZero = function (a, b) {\n      return a !== undefined ? a : b !== undefined ? b : 0;\n    };\n    var absolute = function (element) {\n      var doc = element.dom().ownerDocument;\n      var body = doc.body;\n      var win = doc.defaultView;\n      var html = doc.documentElement;\n      if (body === element.dom()) {\n        return Position(body.offsetLeft, body.offsetTop);\n      }\n      var scrollTop = firstDefinedOrZero(win.pageYOffset, html.scrollTop);\n      var scrollLeft = firstDefinedOrZero(win.pageXOffset, html.scrollLeft);\n      var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);\n      var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);\n      return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);\n    };\n    var viewport = function (element) {\n      var dom = element.dom();\n      var doc = dom.ownerDocument;\n      var body = doc.body;\n      if (body === dom) {\n        return Position(body.offsetLeft, body.offsetTop);\n      }\n      if (!inBody(element)) {\n        return Position(0, 0);\n      }\n      return boxPosition(dom);\n    };\n\n    var rowInfo = Immutable('row', 'y');\n    var colInfo = Immutable('col', 'x');\n    var rtlEdge = function (cell) {\n      var pos = absolute(cell);\n      return pos.left() + getOuter$1(cell);\n    };\n    var ltrEdge = function (cell) {\n      return absolute(cell).left();\n    };\n    var getLeftEdge = function (index, cell) {\n      return colInfo(index, ltrEdge(cell));\n    };\n    var getRightEdge = function (index, cell) {\n      return colInfo(index, rtlEdge(cell));\n    };\n    var getTop = function (cell) {\n      return absolute(cell).top();\n    };\n    var getTopEdge = function (index, cell) {\n      return rowInfo(index, getTop(cell));\n    };\n    var getBottomEdge = function (index, cell) {\n      return rowInfo(index, getTop(cell) + getOuter(cell));\n    };\n    var findPositions = function (getInnerEdge, getOuterEdge, array) {\n      if (array.length === 0) {\n        return [];\n      }\n      var lines = map(array.slice(1), function (cellOption, index) {\n        return cellOption.map(function (cell) {\n          return getInnerEdge(index, cell);\n        });\n      });\n      var lastLine = array[array.length - 1].map(function (cell) {\n        return getOuterEdge(array.length - 1, cell);\n      });\n      return lines.concat([lastLine]);\n    };\n    var negate = function (step) {\n      return -step;\n    };\n    var height = {\n      delta: identity,\n      positions: function (optElements) {\n        return findPositions(getTopEdge, getBottomEdge, optElements);\n      },\n      edge: getTop\n    };\n    var ltr = {\n      delta: identity,\n      edge: ltrEdge,\n      positions: function (optElements) {\n        return findPositions(getLeftEdge, getRightEdge, optElements);\n      }\n    };\n    var rtl = {\n      delta: negate,\n      edge: rtlEdge,\n      positions: function (optElements) {\n        return findPositions(getRightEdge, getLeftEdge, optElements);\n      }\n    };\n    var BarPositions = {\n      height: height,\n      rtl: rtl,\n      ltr: ltr\n    };\n\n    var ResizeDirection = {\n      ltr: BarPositions.ltr,\n      rtl: BarPositions.rtl\n    };\n\n    function TableDirection (directionAt) {\n      var auto = function (table) {\n        return directionAt(table).isRtl() ? ResizeDirection.rtl : ResizeDirection.ltr;\n      };\n      var delta = function (amount, table) {\n        return auto(table).delta(amount, table);\n      };\n      var positions = function (cols, table) {\n        return auto(table).positions(cols, table);\n      };\n      var edge = function (cell) {\n        return auto(cell).edge(cell);\n      };\n      return {\n        delta: delta,\n        edge: edge,\n        positions: positions\n      };\n    }\n\n    var getGridSize = function (table) {\n      var input = DetailsList.fromTable(table);\n      var warehouse = Warehouse.generate(input);\n      return warehouse.grid();\n    };\n    var TableGridSize = { getGridSize: getGridSize };\n\n    var cat = function (arr) {\n      var r = [];\n      var push = function (x) {\n        r.push(x);\n      };\n      for (var i = 0; i < arr.length; i++) {\n        arr[i].each(push);\n      }\n      return r;\n    };\n\n    var setIfNot = function (element, property, value, ignore) {\n      if (value === ignore) {\n        remove(element, property);\n      } else {\n        set(element, property, value);\n      }\n    };\n    var render = function (table, grid) {\n      var newRows = [];\n      var newCells = [];\n      var renderSection = function (gridSection, sectionName) {\n        var section = child$2(table, sectionName).getOrThunk(function () {\n          var tb = Element.fromTag(sectionName, owner(table).dom());\n          append(table, tb);\n          return tb;\n        });\n        empty(section);\n        var rows = map(gridSection, function (row) {\n          if (row.isNew()) {\n            newRows.push(row.element());\n          }\n          var tr = row.element();\n          empty(tr);\n          each(row.cells(), function (cell) {\n            if (cell.isNew()) {\n              newCells.push(cell.element());\n            }\n            setIfNot(cell.element(), 'colspan', cell.colspan(), 1);\n            setIfNot(cell.element(), 'rowspan', cell.rowspan(), 1);\n            append(tr, cell.element());\n          });\n          return tr;\n        });\n        append$1(section, rows);\n      };\n      var removeSection = function (sectionName) {\n        child$2(table, sectionName).each(remove$2);\n      };\n      var renderOrRemoveSection = function (gridSection, sectionName) {\n        if (gridSection.length > 0) {\n          renderSection(gridSection, sectionName);\n        } else {\n          removeSection(sectionName);\n        }\n      };\n      var headSection = [];\n      var bodySection = [];\n      var footSection = [];\n      each(grid, function (row) {\n        switch (row.section()) {\n        case 'thead':\n          headSection.push(row);\n          break;\n        case 'tbody':\n          bodySection.push(row);\n          break;\n        case 'tfoot':\n          footSection.push(row);\n          break;\n        }\n      });\n      renderOrRemoveSection(headSection, 'thead');\n      renderOrRemoveSection(bodySection, 'tbody');\n      renderOrRemoveSection(footSection, 'tfoot');\n      return {\n        newRows: constant(newRows),\n        newCells: constant(newCells)\n      };\n    };\n    var copy$2 = function (grid) {\n      var rows = map(grid, function (row) {\n        var tr = shallow(row.element());\n        each(row.cells(), function (cell) {\n          var clonedCell = deep(cell.element());\n          setIfNot(clonedCell, 'colspan', cell.colspan(), 1);\n          setIfNot(clonedCell, 'rowspan', cell.rowspan(), 1);\n          append(tr, clonedCell);\n        });\n        return tr;\n      });\n      return rows;\n    };\n    var Redraw = {\n      render: render,\n      copy: copy$2\n    };\n\n    var read = function (element, attr) {\n      var value = get$1(element, attr);\n      return value === undefined || value === '' ? [] : value.split(' ');\n    };\n    var add = function (element, attr, id) {\n      var old = read(element, attr);\n      var nu = old.concat([id]);\n      set(element, attr, nu.join(' '));\n      return true;\n    };\n    var remove$3 = function (element, attr, id) {\n      var nu = filter(read(element, attr), function (v) {\n        return v !== id;\n      });\n      if (nu.length > 0) {\n        set(element, attr, nu.join(' '));\n      } else {\n        remove(element, attr);\n      }\n      return false;\n    };\n\n    var supports = function (element) {\n      return element.dom().classList !== undefined;\n    };\n    var get$7 = function (element) {\n      return read(element, 'class');\n    };\n    var add$1 = function (element, clazz) {\n      return add(element, 'class', clazz);\n    };\n    var remove$4 = function (element, clazz) {\n      return remove$3(element, 'class', clazz);\n    };\n\n    var add$2 = function (element, clazz) {\n      if (supports(element)) {\n        element.dom().classList.add(clazz);\n      } else {\n        add$1(element, clazz);\n      }\n    };\n    var cleanClass = function (element) {\n      var classList = supports(element) ? element.dom().classList : get$7(element);\n      if (classList.length === 0) {\n        remove(element, 'class');\n      }\n    };\n    var remove$5 = function (element, clazz) {\n      if (supports(element)) {\n        var classList = element.dom().classList;\n        classList.remove(clazz);\n      } else {\n        remove$4(element, clazz);\n      }\n      cleanClass(element);\n    };\n    var has$2 = function (element, clazz) {\n      return supports(element) && element.dom().classList.contains(clazz);\n    };\n\n    var repeat = function (repititions, f) {\n      var r = [];\n      for (var i = 0; i < repititions; i++) {\n        r.push(f(i));\n      }\n      return r;\n    };\n    var range = function (start, end) {\n      var r = [];\n      for (var i = start; i < end; i++) {\n        r.push(i);\n      }\n      return r;\n    };\n    var deduce = function (xs, index) {\n      if (index < 0 || index >= xs.length - 1) {\n        return Option.none();\n      }\n      var current = xs[index].fold(function () {\n        var rest = reverse(xs.slice(0, index));\n        return findMap(rest, function (a, i) {\n          return a.map(function (aa) {\n            return {\n              value: aa,\n              delta: i + 1\n            };\n          });\n        });\n      }, function (c) {\n        return Option.some({\n          value: c,\n          delta: 0\n        });\n      });\n      var next = xs[index + 1].fold(function () {\n        var rest = xs.slice(index + 1);\n        return findMap(rest, function (a, i) {\n          return a.map(function (aa) {\n            return {\n              value: aa,\n              delta: i + 1\n            };\n          });\n        });\n      }, function (n) {\n        return Option.some({\n          value: n,\n          delta: 1\n        });\n      });\n      return current.bind(function (c) {\n        return next.map(function (n) {\n          var extras = n.delta + c.delta;\n          return Math.abs(n.value - c.value) / extras;\n        });\n      });\n    };\n\n    var columns = function (warehouse) {\n      var grid = warehouse.grid();\n      var cols = range(0, grid.columns());\n      var rowsArr = range(0, grid.rows());\n      return map(cols, function (col) {\n        var getBlock = function () {\n          return bind(rowsArr, function (r) {\n            return Warehouse.getAt(warehouse, r, col).filter(function (detail) {\n              return detail.column() === col;\n            }).fold(constant([]), function (detail) {\n              return [detail];\n            });\n          });\n        };\n        var isSingle = function (detail) {\n          return detail.colspan() === 1;\n        };\n        var getFallback = function () {\n          return Warehouse.getAt(warehouse, 0, col);\n        };\n        return decide(getBlock, isSingle, getFallback);\n      });\n    };\n    var decide = function (getBlock, isSingle, getFallback) {\n      var inBlock = getBlock();\n      var singleInBlock = find(inBlock, isSingle);\n      var detailOption = singleInBlock.orThunk(function () {\n        return Option.from(inBlock[0]).orThunk(getFallback);\n      });\n      return detailOption.map(function (detail) {\n        return detail.element();\n      });\n    };\n    var rows$1 = function (warehouse) {\n      var grid = warehouse.grid();\n      var rowsArr = range(0, grid.rows());\n      var cols = range(0, grid.columns());\n      return map(rowsArr, function (row) {\n        var getBlock = function () {\n          return bind(cols, function (c) {\n            return Warehouse.getAt(warehouse, row, c).filter(function (detail) {\n              return detail.row() === row;\n            }).fold(constant([]), function (detail) {\n              return [detail];\n            });\n          });\n        };\n        var isSingle = function (detail) {\n          return detail.rowspan() === 1;\n        };\n        var getFallback = function () {\n          return Warehouse.getAt(warehouse, row, 0);\n        };\n        return decide(getBlock, isSingle, getFallback);\n      });\n    };\n    var Blocks = {\n      columns: columns,\n      rows: rows$1\n    };\n\n    var css = function (namespace) {\n      var dashNamespace = namespace.replace(/\\./g, '-');\n      var resolve = function (str) {\n        return dashNamespace + '-' + str;\n      };\n      return { resolve: resolve };\n    };\n\n    var styles = css('ephox-snooker');\n    var Styles = { resolve: styles.resolve };\n\n    var col = function (column, x, y, w, h) {\n      var bar = Element.fromTag('div');\n      setAll$1(bar, {\n        position: 'absolute',\n        left: x - w / 2 + 'px',\n        top: y + 'px',\n        height: h + 'px',\n        width: w + 'px'\n      });\n      setAll(bar, {\n        'data-column': column,\n        'role': 'presentation'\n      });\n      return bar;\n    };\n    var row$1 = function (r, x, y, w, h) {\n      var bar = Element.fromTag('div');\n      setAll$1(bar, {\n        position: 'absolute',\n        left: x + 'px',\n        top: y - h / 2 + 'px',\n        height: h + 'px',\n        width: w + 'px'\n      });\n      setAll(bar, {\n        'data-row': r,\n        'role': 'presentation'\n      });\n      return bar;\n    };\n    var Bar = {\n      col: col,\n      row: row$1\n    };\n\n    var resizeBar = Styles.resolve('resizer-bar');\n    var resizeRowBar = Styles.resolve('resizer-rows');\n    var resizeColBar = Styles.resolve('resizer-cols');\n    var BAR_THICKNESS = 7;\n    var destroy = function (wire) {\n      var previous = descendants$1(wire.parent(), '.' + resizeBar);\n      each(previous, remove$2);\n    };\n    var drawBar = function (wire, positions, create) {\n      var origin = wire.origin();\n      each(positions, function (cpOption, i) {\n        cpOption.each(function (cp) {\n          var bar = create(origin, cp);\n          add$2(bar, resizeBar);\n          append(wire.parent(), bar);\n        });\n      });\n    };\n    var refreshCol = function (wire, colPositions, position, tableHeight) {\n      drawBar(wire, colPositions, function (origin, cp) {\n        var colBar = Bar.col(cp.col(), cp.x() - origin.left(), position.top() - origin.top(), BAR_THICKNESS, tableHeight);\n        add$2(colBar, resizeColBar);\n        return colBar;\n      });\n    };\n    var refreshRow = function (wire, rowPositions, position, tableWidth) {\n      drawBar(wire, rowPositions, function (origin, cp) {\n        var rowBar = Bar.row(cp.row(), position.left() - origin.left(), cp.y() - origin.top(), tableWidth, BAR_THICKNESS);\n        add$2(rowBar, resizeRowBar);\n        return rowBar;\n      });\n    };\n    var refreshGrid = function (wire, table, rows, cols, hdirection, vdirection) {\n      var position = absolute(table);\n      var rowPositions = rows.length > 0 ? hdirection.positions(rows, table) : [];\n      refreshRow(wire, rowPositions, position, getOuter$1(table));\n      var colPositions = cols.length > 0 ? vdirection.positions(cols, table) : [];\n      refreshCol(wire, colPositions, position, getOuter(table));\n    };\n    var refresh = function (wire, table, hdirection, vdirection) {\n      destroy(wire);\n      var list = DetailsList.fromTable(table);\n      var warehouse = Warehouse.generate(list);\n      var rows = Blocks.rows(warehouse);\n      var cols = Blocks.columns(warehouse);\n      refreshGrid(wire, table, rows, cols, hdirection, vdirection);\n    };\n    var each$2 = function (wire, f) {\n      var bars = descendants$1(wire.parent(), '.' + resizeBar);\n      each(bars, f);\n    };\n    var hide = function (wire) {\n      each$2(wire, function (bar) {\n        set$1(bar, 'display', 'none');\n      });\n    };\n    var show = function (wire) {\n      each$2(wire, function (bar) {\n        set$1(bar, 'display', 'block');\n      });\n    };\n    var isRowBar = function (element) {\n      return has$2(element, resizeRowBar);\n    };\n    var isColBar = function (element) {\n      return has$2(element, resizeColBar);\n    };\n    var Bars = {\n      refresh: refresh,\n      hide: hide,\n      show: show,\n      destroy: destroy,\n      isRowBar: isRowBar,\n      isColBar: isColBar\n    };\n\n    var addCell = function (gridRow, index, cell) {\n      var cells = gridRow.cells();\n      var before = cells.slice(0, index);\n      var after = cells.slice(index);\n      var newCells = before.concat([cell]).concat(after);\n      return setCells(gridRow, newCells);\n    };\n    var mutateCell = function (gridRow, index, cell) {\n      var cells = gridRow.cells();\n      cells[index] = cell;\n    };\n    var setCells = function (gridRow, cells) {\n      return rowcells(cells, gridRow.section());\n    };\n    var mapCells = function (gridRow, f) {\n      var cells = gridRow.cells();\n      var r = map(cells, f);\n      return rowcells(r, gridRow.section());\n    };\n    var getCell = function (gridRow, index) {\n      return gridRow.cells()[index];\n    };\n    var getCellElement = function (gridRow, index) {\n      return getCell(gridRow, index).element();\n    };\n    var cellLength = function (gridRow) {\n      return gridRow.cells().length;\n    };\n    var GridRow = {\n      addCell: addCell,\n      setCells: setCells,\n      mutateCell: mutateCell,\n      getCell: getCell,\n      getCellElement: getCellElement,\n      mapCells: mapCells,\n      cellLength: cellLength\n    };\n\n    var getColumn = function (grid, index) {\n      return map(grid, function (row) {\n        return GridRow.getCell(row, index);\n      });\n    };\n    var getRow = function (grid, index) {\n      return grid[index];\n    };\n    var findDiff = function (xs, comp) {\n      if (xs.length === 0) {\n        return 0;\n      }\n      var first = xs[0];\n      var index = findIndex(xs, function (x) {\n        return !comp(first.element(), x.element());\n      });\n      return index.fold(function () {\n        return xs.length;\n      }, function (ind) {\n        return ind;\n      });\n    };\n    var subgrid = function (grid, row, column, comparator) {\n      var restOfRow = getRow(grid, row).cells().slice(column);\n      var endColIndex = findDiff(restOfRow, comparator);\n      var restOfColumn = getColumn(grid, column).slice(row);\n      var endRowIndex = findDiff(restOfColumn, comparator);\n      return {\n        colspan: constant(endColIndex),\n        rowspan: constant(endRowIndex)\n      };\n    };\n    var TableGrid = { subgrid: subgrid };\n\n    var toDetails = function (grid, comparator) {\n      var seen = map(grid, function (row, ri) {\n        return map(row.cells(), function (col, ci) {\n          return false;\n        });\n      });\n      var updateSeen = function (ri, ci, rowspan, colspan) {\n        for (var r = ri; r < ri + rowspan; r++) {\n          for (var c = ci; c < ci + colspan; c++) {\n            seen[r][c] = true;\n          }\n        }\n      };\n      return map(grid, function (row, ri) {\n        var details = bind(row.cells(), function (cell, ci) {\n          if (seen[ri][ci] === false) {\n            var result = TableGrid.subgrid(grid, ri, ci, comparator);\n            updateSeen(ri, ci, result.rowspan(), result.colspan());\n            return [detailnew(cell.element(), result.rowspan(), result.colspan(), cell.isNew())];\n          } else {\n            return [];\n          }\n        });\n        return rowdetails(details, row.section());\n      });\n    };\n    var toGrid = function (warehouse, generators, isNew) {\n      var grid = [];\n      for (var i = 0; i < warehouse.grid().rows(); i++) {\n        var rowCells = [];\n        for (var j = 0; j < warehouse.grid().columns(); j++) {\n          var element = Warehouse.getAt(warehouse, i, j).map(function (item) {\n            return elementnew(item.element(), isNew);\n          }).getOrThunk(function () {\n            return elementnew(generators.gap(), true);\n          });\n          rowCells.push(element);\n        }\n        var row = rowcells(rowCells, warehouse.all()[i].section());\n        grid.push(row);\n      }\n      return grid;\n    };\n    var Transitions = {\n      toDetails: toDetails,\n      toGrid: toGrid\n    };\n\n    var fromWarehouse = function (warehouse, generators) {\n      return Transitions.toGrid(warehouse, generators, false);\n    };\n    var deriveRows = function (rendered, generators) {\n      var findRow = function (details) {\n        var rowOfCells = findMap(details, function (detail) {\n          return parent(detail.element()).map(function (row) {\n            var isNew = parent(row).isNone();\n            return elementnew(row, isNew);\n          });\n        });\n        return rowOfCells.getOrThunk(function () {\n          return elementnew(generators.row(), true);\n        });\n      };\n      return map(rendered, function (details) {\n        var row = findRow(details.details());\n        return rowdatanew(row.element(), details.details(), details.section(), row.isNew());\n      });\n    };\n    var toDetailList = function (grid, generators) {\n      var rendered = Transitions.toDetails(grid, eq);\n      return deriveRows(rendered, generators);\n    };\n    var findInWarehouse = function (warehouse, element) {\n      var all = flatten(map(warehouse.all(), function (r) {\n        return r.cells();\n      }));\n      return find(all, function (e) {\n        return eq(element, e.element());\n      });\n    };\n    var run = function (operation, extract, adjustment, postAction, genWrappers) {\n      return function (wire, table, target, generators, direction) {\n        var input = DetailsList.fromTable(table);\n        var warehouse = Warehouse.generate(input);\n        var output = extract(warehouse, target).map(function (info) {\n          var model = fromWarehouse(warehouse, generators);\n          var result = operation(model, info, eq, genWrappers(generators));\n          var grid = toDetailList(result.grid(), generators);\n          return {\n            grid: constant(grid),\n            cursor: result.cursor\n          };\n        });\n        return output.fold(function () {\n          return Option.none();\n        }, function (out) {\n          var newElements = Redraw.render(table, out.grid());\n          adjustment(table, out.grid(), direction);\n          postAction(table);\n          Bars.refresh(wire, table, BarPositions.height, direction);\n          return Option.some({\n            cursor: out.cursor,\n            newRows: newElements.newRows,\n            newCells: newElements.newCells\n          });\n        });\n      };\n    };\n    var onCell = function (warehouse, target) {\n      return TableLookup.cell(target.element()).bind(function (cell) {\n        return findInWarehouse(warehouse, cell);\n      });\n    };\n    var onPaste = function (warehouse, target) {\n      return TableLookup.cell(target.element()).bind(function (cell) {\n        return findInWarehouse(warehouse, cell).map(function (details) {\n          var value = __assign(__assign({}, details), {\n            generators: target.generators,\n            clipboard: target.clipboard\n          });\n          return value;\n        });\n      });\n    };\n    var onPasteRows = function (warehouse, target) {\n      var details = map(target.selection(), function (cell) {\n        return TableLookup.cell(cell).bind(function (lc) {\n          return findInWarehouse(warehouse, lc);\n        });\n      });\n      var cells = cat(details);\n      return cells.length > 0 ? Option.some({\n        cells: cells,\n        generators: target.generators,\n        clipboard: target.clipboard\n      }) : Option.none();\n    };\n    var onMergable = function (_warehouse, target) {\n      return target.mergable();\n    };\n    var onUnmergable = function (_warehouse, target) {\n      return target.unmergable();\n    };\n    var onCells = function (warehouse, target) {\n      var details = map(target.selection(), function (cell) {\n        return TableLookup.cell(cell).bind(function (lc) {\n          return findInWarehouse(warehouse, lc);\n        });\n      });\n      var cells = cat(details);\n      return cells.length > 0 ? Option.some(cells) : Option.none();\n    };\n\n    var value = function (o) {\n      var is = function (v) {\n        return o === v;\n      };\n      var or = function (opt) {\n        return value(o);\n      };\n      var orThunk = function (f) {\n        return value(o);\n      };\n      var map = function (f) {\n        return value(f(o));\n      };\n      var mapError = function (f) {\n        return value(o);\n      };\n      var each = function (f) {\n        f(o);\n      };\n      var bind = function (f) {\n        return f(o);\n      };\n      var fold = function (_, onValue) {\n        return onValue(o);\n      };\n      var exists = function (f) {\n        return f(o);\n      };\n      var forall = function (f) {\n        return f(o);\n      };\n      var toOption = function () {\n        return Option.some(o);\n      };\n      return {\n        is: is,\n        isValue: always,\n        isError: never,\n        getOr: constant(o),\n        getOrThunk: constant(o),\n        getOrDie: constant(o),\n        or: or,\n        orThunk: orThunk,\n        fold: fold,\n        map: map,\n        mapError: mapError,\n        each: each,\n        bind: bind,\n        exists: exists,\n        forall: forall,\n        toOption: toOption\n      };\n    };\n    var error = function (message) {\n      var getOrThunk = function (f) {\n        return f();\n      };\n      var getOrDie = function () {\n        return die(String(message))();\n      };\n      var or = function (opt) {\n        return opt;\n      };\n      var orThunk = function (f) {\n        return f();\n      };\n      var map = function (f) {\n        return error(message);\n      };\n      var mapError = function (f) {\n        return error(f(message));\n      };\n      var bind = function (f) {\n        return error(message);\n      };\n      var fold = function (onError, _) {\n        return onError(message);\n      };\n      return {\n        is: never,\n        isValue: never,\n        isError: always,\n        getOr: identity,\n        getOrThunk: getOrThunk,\n        getOrDie: getOrDie,\n        or: or,\n        orThunk: orThunk,\n        fold: fold,\n        map: map,\n        mapError: mapError,\n        each: noop,\n        bind: bind,\n        exists: never,\n        forall: always,\n        toOption: Option.none\n      };\n    };\n    var fromOption = function (opt, err) {\n      return opt.fold(function () {\n        return error(err);\n      }, value);\n    };\n    var Result = {\n      value: value,\n      error: error,\n      fromOption: fromOption\n    };\n\n    var measure = function (startAddress, gridA, gridB) {\n      if (startAddress.row() >= gridA.length || startAddress.column() > GridRow.cellLength(gridA[0])) {\n        return Result.error('invalid start address out of table bounds, row: ' + startAddress.row() + ', column: ' + startAddress.column());\n      }\n      var rowRemainder = gridA.slice(startAddress.row());\n      var colRemainder = rowRemainder[0].cells().slice(startAddress.column());\n      var colRequired = GridRow.cellLength(gridB[0]);\n      var rowRequired = gridB.length;\n      return Result.value({\n        rowDelta: constant(rowRemainder.length - rowRequired),\n        colDelta: constant(colRemainder.length - colRequired)\n      });\n    };\n    var measureWidth = function (gridA, gridB) {\n      var colLengthA = GridRow.cellLength(gridA[0]);\n      var colLengthB = GridRow.cellLength(gridB[0]);\n      return {\n        rowDelta: constant(0),\n        colDelta: constant(colLengthA - colLengthB)\n      };\n    };\n    var fill = function (cells, generator) {\n      return map(cells, function () {\n        return elementnew(generator.cell(), true);\n      });\n    };\n    var rowFill = function (grid, amount, generator) {\n      return grid.concat(repeat(amount, function (_row) {\n        return GridRow.setCells(grid[grid.length - 1], fill(grid[grid.length - 1].cells(), generator));\n      }));\n    };\n    var colFill = function (grid, amount, generator) {\n      return map(grid, function (row) {\n        return GridRow.setCells(row, row.cells().concat(fill(range(0, amount), generator)));\n      });\n    };\n    var tailor = function (gridA, delta, generator) {\n      var fillCols = delta.colDelta() < 0 ? colFill : identity;\n      var fillRows = delta.rowDelta() < 0 ? rowFill : identity;\n      var modifiedCols = fillCols(gridA, Math.abs(delta.colDelta()), generator);\n      var tailoredGrid = fillRows(modifiedCols, Math.abs(delta.rowDelta()), generator);\n      return tailoredGrid;\n    };\n    var Fitment = {\n      measure: measure,\n      measureWidth: measureWidth,\n      tailor: tailor\n    };\n\n    var merge = function (grid, bounds, comparator, substitution) {\n      if (grid.length === 0) {\n        return grid;\n      }\n      for (var i = bounds.startRow(); i <= bounds.finishRow(); i++) {\n        for (var j = bounds.startCol(); j <= bounds.finishCol(); j++) {\n          GridRow.mutateCell(grid[i], j, elementnew(substitution(), false));\n        }\n      }\n      return grid;\n    };\n    var unmerge = function (grid, target, comparator, substitution) {\n      var first = true;\n      for (var i = 0; i < grid.length; i++) {\n        for (var j = 0; j < GridRow.cellLength(grid[0]); j++) {\n          var current = GridRow.getCellElement(grid[i], j);\n          var isToReplace = comparator(current, target);\n          if (isToReplace === true && first === false) {\n            GridRow.mutateCell(grid[i], j, elementnew(substitution(), true));\n          } else if (isToReplace === true) {\n            first = false;\n          }\n        }\n      }\n      return grid;\n    };\n    var uniqueCells = function (row, comparator) {\n      return foldl(row, function (rest, cell) {\n        return exists(rest, function (currentCell) {\n          return comparator(currentCell.element(), cell.element());\n        }) ? rest : rest.concat([cell]);\n      }, []);\n    };\n    var splitRows = function (grid, index, comparator, substitution) {\n      if (index > 0 && index < grid.length) {\n        var rowPrevCells = grid[index - 1].cells();\n        var cells = uniqueCells(rowPrevCells, comparator);\n        each(cells, function (cell) {\n          var replacement = Option.none();\n          var _loop_1 = function (i) {\n            var _loop_2 = function (j) {\n              var current = grid[i].cells()[j];\n              var isToReplace = comparator(current.element(), cell.element());\n              if (isToReplace) {\n                if (replacement.isNone()) {\n                  replacement = Option.some(substitution());\n                }\n                replacement.each(function (sub) {\n                  GridRow.mutateCell(grid[i], j, elementnew(sub, true));\n                });\n              }\n            };\n            for (var j = 0; j < GridRow.cellLength(grid[0]); j++) {\n              _loop_2(j);\n            }\n          };\n          for (var i = index; i < grid.length; i++) {\n            _loop_1(i);\n          }\n        });\n      }\n      return grid;\n    };\n    var MergingOperations = {\n      merge: merge,\n      unmerge: unmerge,\n      splitRows: splitRows\n    };\n\n    var isSpanning = function (grid, row, col, comparator) {\n      var candidate = GridRow.getCell(grid[row], col);\n      var matching = curry(comparator, candidate.element());\n      var currentRow = grid[row];\n      return grid.length > 1 && GridRow.cellLength(currentRow) > 1 && (col > 0 && matching(GridRow.getCellElement(currentRow, col - 1)) || col < currentRow.cells().length - 1 && matching(GridRow.getCellElement(currentRow, col + 1)) || row > 0 && matching(GridRow.getCellElement(grid[row - 1], col)) || row < grid.length - 1 && matching(GridRow.getCellElement(grid[row + 1], col)));\n    };\n    var mergeTables = function (startAddress, gridA, gridB, generator, comparator) {\n      var startRow = startAddress.row();\n      var startCol = startAddress.column();\n      var mergeHeight = gridB.length;\n      var mergeWidth = GridRow.cellLength(gridB[0]);\n      var endRow = startRow + mergeHeight;\n      var endCol = startCol + mergeWidth;\n      for (var r = startRow; r < endRow; r++) {\n        for (var c = startCol; c < endCol; c++) {\n          if (isSpanning(gridA, r, c, comparator)) {\n            MergingOperations.unmerge(gridA, GridRow.getCellElement(gridA[r], c), comparator, generator.cell);\n          }\n          var newCell = GridRow.getCellElement(gridB[r - startRow], c - startCol);\n          var replacement = generator.replace(newCell);\n          GridRow.mutateCell(gridA[r], c, elementnew(replacement, true));\n        }\n      }\n      return gridA;\n    };\n    var merge$1 = function (startAddress, gridA, gridB, generator, comparator) {\n      var result = Fitment.measure(startAddress, gridA, gridB);\n      return result.map(function (delta) {\n        var fittedGrid = Fitment.tailor(gridA, delta, generator);\n        return mergeTables(startAddress, fittedGrid, gridB, generator, comparator);\n      });\n    };\n    var insert = function (index, gridA, gridB, generator, comparator) {\n      MergingOperations.splitRows(gridA, index, comparator, generator.cell);\n      var delta = Fitment.measureWidth(gridB, gridA);\n      var fittedNewGrid = Fitment.tailor(gridB, delta, generator);\n      var secondDelta = Fitment.measureWidth(gridA, fittedNewGrid);\n      var fittedOldGrid = Fitment.tailor(gridA, secondDelta, generator);\n      return fittedOldGrid.slice(0, index).concat(fittedNewGrid).concat(fittedOldGrid.slice(index, fittedOldGrid.length));\n    };\n    var TableMerge = {\n      merge: merge$1,\n      insert: insert\n    };\n\n    var insertRowAt = function (grid, index, example, comparator, substitution) {\n      var before = grid.slice(0, index);\n      var after = grid.slice(index);\n      var between = GridRow.mapCells(grid[example], function (ex, c) {\n        var withinSpan = index > 0 && index < grid.length && comparator(GridRow.getCellElement(grid[index - 1], c), GridRow.getCellElement(grid[index], c));\n        var ret = withinSpan ? GridRow.getCell(grid[index], c) : elementnew(substitution(ex.element(), comparator), true);\n        return ret;\n      });\n      return before.concat([between]).concat(after);\n    };\n    var insertColumnAt = function (grid, index, example, comparator, substitution) {\n      return map(grid, function (row) {\n        var withinSpan = index > 0 && index < GridRow.cellLength(row) && comparator(GridRow.getCellElement(row, index - 1), GridRow.getCellElement(row, index));\n        var sub = withinSpan ? GridRow.getCell(row, index) : elementnew(substitution(GridRow.getCellElement(row, example), comparator), true);\n        return GridRow.addCell(row, index, sub);\n      });\n    };\n    var splitCellIntoColumns = function (grid, exampleRow, exampleCol, comparator, substitution) {\n      var index = exampleCol + 1;\n      return map(grid, function (row, i) {\n        var isTargetCell = i === exampleRow;\n        var sub = isTargetCell ? elementnew(substitution(GridRow.getCellElement(row, exampleCol), comparator), true) : GridRow.getCell(row, exampleCol);\n        return GridRow.addCell(row, index, sub);\n      });\n    };\n    var splitCellIntoRows = function (grid, exampleRow, exampleCol, comparator, substitution) {\n      var index = exampleRow + 1;\n      var before = grid.slice(0, index);\n      var after = grid.slice(index);\n      var between = GridRow.mapCells(grid[exampleRow], function (ex, i) {\n        var isTargetCell = i === exampleCol;\n        return isTargetCell ? elementnew(substitution(ex.element(), comparator), true) : ex;\n      });\n      return before.concat([between]).concat(after);\n    };\n    var deleteColumnsAt = function (grid, start, finish) {\n      var rows = map(grid, function (row) {\n        var cells = row.cells().slice(0, start).concat(row.cells().slice(finish + 1));\n        return rowcells(cells, row.section());\n      });\n      return filter(rows, function (row) {\n        return row.cells().length > 0;\n      });\n    };\n    var deleteRowsAt = function (grid, start, finish) {\n      return grid.slice(0, start).concat(grid.slice(finish + 1));\n    };\n    var ModificationOperations = {\n      insertRowAt: insertRowAt,\n      insertColumnAt: insertColumnAt,\n      splitCellIntoColumns: splitCellIntoColumns,\n      splitCellIntoRows: splitCellIntoRows,\n      deleteRowsAt: deleteRowsAt,\n      deleteColumnsAt: deleteColumnsAt\n    };\n\n    var replaceIn = function (grid, targets, comparator, substitution) {\n      var isTarget = function (cell) {\n        return exists(targets, function (target) {\n          return comparator(cell.element(), target.element());\n        });\n      };\n      return map(grid, function (row) {\n        return GridRow.mapCells(row, function (cell) {\n          return isTarget(cell) ? elementnew(substitution(cell.element(), comparator), true) : cell;\n        });\n      });\n    };\n    var notStartRow = function (grid, rowIndex, colIndex, comparator) {\n      return GridRow.getCellElement(grid[rowIndex], colIndex) !== undefined && (rowIndex > 0 && comparator(GridRow.getCellElement(grid[rowIndex - 1], colIndex), GridRow.getCellElement(grid[rowIndex], colIndex)));\n    };\n    var notStartColumn = function (row, index, comparator) {\n      return index > 0 && comparator(GridRow.getCellElement(row, index - 1), GridRow.getCellElement(row, index));\n    };\n    var replaceColumn = function (grid, index, comparator, substitution) {\n      var targets = bind(grid, function (row, i) {\n        var alreadyAdded = notStartRow(grid, i, index, comparator) || notStartColumn(row, index, comparator);\n        return alreadyAdded ? [] : [GridRow.getCell(row, index)];\n      });\n      return replaceIn(grid, targets, comparator, substitution);\n    };\n    var replaceRow = function (grid, index, comparator, substitution) {\n      var targetRow = grid[index];\n      var targets = bind(targetRow.cells(), function (item, i) {\n        var alreadyAdded = notStartRow(grid, index, i, comparator) || notStartColumn(targetRow, i, comparator);\n        return alreadyAdded ? [] : [item];\n      });\n      return replaceIn(grid, targets, comparator, substitution);\n    };\n    var TransformOperations = {\n      replaceColumn: replaceColumn,\n      replaceRow: replaceRow\n    };\n\n    var adt = Adt.generate([\n      { none: [] },\n      { only: ['index'] },\n      {\n        left: [\n          'index',\n          'next'\n        ]\n      },\n      {\n        middle: [\n          'prev',\n          'index',\n          'next'\n        ]\n      },\n      {\n        right: [\n          'prev',\n          'index'\n        ]\n      }\n    ]);\n    var ColumnContext = __assign({}, adt);\n\n    var neighbours$1 = function (input, index) {\n      if (input.length === 0) {\n        return ColumnContext.none();\n      }\n      if (input.length === 1) {\n        return ColumnContext.only(0);\n      }\n      if (index === 0) {\n        return ColumnContext.left(0, 1);\n      }\n      if (index === input.length - 1) {\n        return ColumnContext.right(index - 1, index);\n      }\n      if (index > 0 && index < input.length - 1) {\n        return ColumnContext.middle(index - 1, index, index + 1);\n      }\n      return ColumnContext.none();\n    };\n    var determine = function (input, column, step, tableSize) {\n      var result = input.slice(0);\n      var context = neighbours$1(input, column);\n      var zero = function (array) {\n        return map(array, constant(0));\n      };\n      var onNone = constant(zero(result));\n      var onOnly = function (index) {\n        return tableSize.singleColumnWidth(result[index], step);\n      };\n      var onChange = function (index, next) {\n        if (step >= 0) {\n          var newNext = Math.max(tableSize.minCellWidth(), result[next] - step);\n          return zero(result.slice(0, index)).concat([\n            step,\n            newNext - result[next]\n          ]).concat(zero(result.slice(next + 1)));\n        } else {\n          var newThis = Math.max(tableSize.minCellWidth(), result[index] + step);\n          var diffx = result[index] - newThis;\n          return zero(result.slice(0, index)).concat([\n            newThis - result[index],\n            diffx\n          ]).concat(zero(result.slice(next + 1)));\n        }\n      };\n      var onLeft = onChange;\n      var onMiddle = function (_prev, index, next) {\n        return onChange(index, next);\n      };\n      var onRight = function (_prev, index) {\n        if (step >= 0) {\n          return zero(result.slice(0, index)).concat([step]);\n        } else {\n          var size = Math.max(tableSize.minCellWidth(), result[index] + step);\n          return zero(result.slice(0, index)).concat([size - result[index]]);\n        }\n      };\n      return context.fold(onNone, onOnly, onLeft, onMiddle, onRight);\n    };\n    var Deltas = { determine: determine };\n\n    var getSpan$1 = function (cell, type) {\n      return has$1(cell, type) && parseInt(get$1(cell, type), 10) > 1;\n    };\n    var hasColspan = function (cell) {\n      return getSpan$1(cell, 'colspan');\n    };\n    var hasRowspan = function (cell) {\n      return getSpan$1(cell, 'rowspan');\n    };\n    var getInt = function (element, property) {\n      return parseInt(get$2(element, property), 10);\n    };\n    var CellUtils = {\n      hasColspan: hasColspan,\n      hasRowspan: hasRowspan,\n      minWidth: constant(10),\n      minHeight: constant(10),\n      getInt: getInt\n    };\n\n    var getRaw$1 = function (cell, property, getter) {\n      return getRaw(cell, property).fold(function () {\n        return getter(cell) + 'px';\n      }, function (raw) {\n        return raw;\n      });\n    };\n    var getRawW = function (cell, tableSize) {\n      return getRaw$1(cell, 'width', function (e) {\n        return Sizes.getPixelWidth(e, tableSize);\n      });\n    };\n    var getRawH = function (cell) {\n      return getRaw$1(cell, 'height', Sizes.getHeight);\n    };\n    var getWidthFrom = function (warehouse, direction, getWidth, fallback, tableSize) {\n      var columns = Blocks.columns(warehouse);\n      var backups = map(columns, function (cellOption) {\n        return cellOption.map(direction.edge);\n      });\n      return map(columns, function (cellOption, c) {\n        var columnCell = cellOption.filter(not(CellUtils.hasColspan));\n        return columnCell.fold(function () {\n          var deduced = deduce(backups, c);\n          return fallback(deduced);\n        }, function (cell) {\n          return getWidth(cell, tableSize);\n        });\n      });\n    };\n    var getDeduced = function (deduced) {\n      return deduced.map(function (d) {\n        return d + 'px';\n      }).getOr('');\n    };\n    var getRawWidths = function (warehouse, direction, tableSize) {\n      return getWidthFrom(warehouse, direction, getRawW, getDeduced, tableSize);\n    };\n    var getPercentageWidths = function (warehouse, direction, tableSize) {\n      return getWidthFrom(warehouse, direction, Sizes.getPercentageWidth, function (deduced) {\n        return deduced.fold(function () {\n          return tableSize.minCellWidth();\n        }, function (cellWidth) {\n          return cellWidth / tableSize.pixelWidth() * 100;\n        });\n      }, tableSize);\n    };\n    var getPixelWidths = function (warehouse, direction, tableSize) {\n      return getWidthFrom(warehouse, direction, Sizes.getPixelWidth, function (deduced) {\n        return deduced.getOrThunk(tableSize.minCellWidth);\n      }, tableSize);\n    };\n    var getHeightFrom = function (warehouse, direction, getHeight, fallback) {\n      var rows = Blocks.rows(warehouse);\n      var backups = map(rows, function (cellOption) {\n        return cellOption.map(direction.edge);\n      });\n      return map(rows, function (cellOption, c) {\n        var rowCell = cellOption.filter(not(CellUtils.hasRowspan));\n        return rowCell.fold(function () {\n          var deduced = deduce(backups, c);\n          return fallback(deduced);\n        }, function (cell) {\n          return getHeight(cell);\n        });\n      });\n    };\n    var getPixelHeights = function (warehouse, direction) {\n      return getHeightFrom(warehouse, direction, Sizes.getHeight, function (deduced) {\n        return deduced.getOrThunk(CellUtils.minHeight);\n      });\n    };\n    var getRawHeights = function (warehouse, direction) {\n      return getHeightFrom(warehouse, direction, getRawH, getDeduced);\n    };\n    var ColumnSizes = {\n      getRawWidths: getRawWidths,\n      getPixelWidths: getPixelWidths,\n      getPercentageWidths: getPercentageWidths,\n      getPixelHeights: getPixelHeights,\n      getRawHeights: getRawHeights\n    };\n\n    var total = function (start, end, measures) {\n      var r = 0;\n      for (var i = start; i < end; i++) {\n        r += measures[i] !== undefined ? measures[i] : 0;\n      }\n      return r;\n    };\n    var recalculateWidth = function (warehouse, widths) {\n      var all = Warehouse.justCells(warehouse);\n      return map(all, function (cell) {\n        var width = total(cell.column(), cell.column() + cell.colspan(), widths);\n        return {\n          element: cell.element,\n          width: constant(width),\n          colspan: cell.colspan\n        };\n      });\n    };\n    var recalculateHeight = function (warehouse, heights) {\n      var all = Warehouse.justCells(warehouse);\n      return map(all, function (cell) {\n        var height = total(cell.row(), cell.row() + cell.rowspan(), heights);\n        return {\n          element: cell.element,\n          height: constant(height),\n          rowspan: cell.rowspan\n        };\n      });\n    };\n    var matchRowHeight = function (warehouse, heights) {\n      return map(warehouse.all(), function (row, i) {\n        return {\n          element: row.element,\n          height: constant(heights[i])\n        };\n      });\n    };\n    var Recalculations = {\n      recalculateWidth: recalculateWidth,\n      recalculateHeight: recalculateHeight,\n      matchRowHeight: matchRowHeight\n    };\n\n    var percentageSize = function (width, element) {\n      var floatWidth = parseFloat(width);\n      var pixelWidth = get$5(element);\n      var getCellDelta = function (delta) {\n        return delta / pixelWidth * 100;\n      };\n      var singleColumnWidth = function (w, _delta) {\n        return [100 - w];\n      };\n      var minCellWidth = function () {\n        return CellUtils.minWidth() / pixelWidth * 100;\n      };\n      var setTableWidth = function (table, _newWidths, delta) {\n        var ratio = delta / 100;\n        var change = ratio * floatWidth;\n        Sizes.setPercentageWidth(table, floatWidth + change);\n      };\n      return {\n        width: constant(floatWidth),\n        pixelWidth: constant(pixelWidth),\n        getWidths: ColumnSizes.getPercentageWidths,\n        getCellDelta: getCellDelta,\n        singleColumnWidth: singleColumnWidth,\n        minCellWidth: minCellWidth,\n        setElementWidth: Sizes.setPercentageWidth,\n        setTableWidth: setTableWidth\n      };\n    };\n    var pixelSize = function (width) {\n      var getCellDelta = identity;\n      var singleColumnWidth = function (w, delta) {\n        var newNext = Math.max(CellUtils.minWidth(), w + delta);\n        return [newNext - w];\n      };\n      var setTableWidth = function (table, newWidths, _delta) {\n        var total = foldr(newWidths, function (b, a) {\n          return b + a;\n        }, 0);\n        Sizes.setPixelWidth(table, total);\n      };\n      return {\n        width: constant(width),\n        pixelWidth: constant(width),\n        getWidths: ColumnSizes.getPixelWidths,\n        getCellDelta: getCellDelta,\n        singleColumnWidth: singleColumnWidth,\n        minCellWidth: CellUtils.minWidth,\n        setElementWidth: Sizes.setPixelWidth,\n        setTableWidth: setTableWidth\n      };\n    };\n    var chooseSize = function (element, width) {\n      var percentMatch = Sizes.percentageBasedSizeRegex().exec(width);\n      if (percentMatch !== null) {\n        return percentageSize(percentMatch[1], element);\n      }\n      var pixelMatch = Sizes.pixelBasedSizeRegex().exec(width);\n      if (pixelMatch !== null) {\n        var intWidth = parseInt(pixelMatch[1], 10);\n        return pixelSize(intWidth);\n      }\n      var fallbackWidth = get$5(element);\n      return pixelSize(fallbackWidth);\n    };\n    var getTableSize = function (element) {\n      var width = Sizes.getRawWidth(element);\n      return width.fold(function () {\n        var fallbackWidth = get$5(element);\n        return pixelSize(fallbackWidth);\n      }, function (w) {\n        return chooseSize(element, w);\n      });\n    };\n    var TableSize = { getTableSize: getTableSize };\n\n    var getWarehouse$1 = function (list) {\n      return Warehouse.generate(list);\n    };\n    var sumUp = function (newSize) {\n      return foldr(newSize, function (b, a) {\n        return b + a;\n      }, 0);\n    };\n    var getTableWarehouse = function (table) {\n      var list = DetailsList.fromTable(table);\n      return getWarehouse$1(list);\n    };\n    var adjustWidth = function (table, delta, index, direction) {\n      var tableSize = TableSize.getTableSize(table);\n      var step = tableSize.getCellDelta(delta);\n      var warehouse = getTableWarehouse(table);\n      var widths = tableSize.getWidths(warehouse, direction, tableSize);\n      var deltas = Deltas.determine(widths, index, step, tableSize);\n      var newWidths = map(deltas, function (dx, i) {\n        return dx + widths[i];\n      });\n      var newSizes = Recalculations.recalculateWidth(warehouse, newWidths);\n      each(newSizes, function (cell) {\n        tableSize.setElementWidth(cell.element(), cell.width());\n      });\n      if (index === warehouse.grid().columns() - 1) {\n        tableSize.setTableWidth(table, newWidths, step);\n      }\n    };\n    var adjustHeight = function (table, delta, index, direction) {\n      var warehouse = getTableWarehouse(table);\n      var heights = ColumnSizes.getPixelHeights(warehouse, direction);\n      var newHeights = map(heights, function (dy, i) {\n        return index === i ? Math.max(delta + dy, CellUtils.minHeight()) : dy;\n      });\n      var newCellSizes = Recalculations.recalculateHeight(warehouse, newHeights);\n      var newRowSizes = Recalculations.matchRowHeight(warehouse, newHeights);\n      each(newRowSizes, function (row) {\n        Sizes.setHeight(row.element(), row.height());\n      });\n      each(newCellSizes, function (cell) {\n        Sizes.setHeight(cell.element(), cell.height());\n      });\n      var total = sumUp(newHeights);\n      Sizes.setHeight(table, total);\n    };\n    var adjustWidthTo = function (table, list, direction) {\n      var tableSize = TableSize.getTableSize(table);\n      var warehouse = getWarehouse$1(list);\n      var widths = tableSize.getWidths(warehouse, direction, tableSize);\n      var newSizes = Recalculations.recalculateWidth(warehouse, widths);\n      each(newSizes, function (cell) {\n        tableSize.setElementWidth(cell.element(), cell.width());\n      });\n      if (newSizes.length > 0) {\n        tableSize.setTableWidth(table, widths, tableSize.getCellDelta(0));\n      }\n    };\n    var Adjustments = {\n      adjustWidth: adjustWidth,\n      adjustHeight: adjustHeight,\n      adjustWidthTo: adjustWidthTo\n    };\n\n    var base = function (handleUnsupported, required) {\n      return baseWith(handleUnsupported, required, {\n        validate: isFunction,\n        label: 'function'\n      });\n    };\n    var baseWith = function (handleUnsupported, required, pred) {\n      if (required.length === 0) {\n        throw new Error('You must specify at least one required field.');\n      }\n      validateStrArr('required', required);\n      checkDupes(required);\n      return function (obj) {\n        var keys$1 = keys(obj);\n        var allReqd = forall(required, function (req) {\n          return contains(keys$1, req);\n        });\n        if (!allReqd) {\n          reqMessage(required, keys$1);\n        }\n        handleUnsupported(required, keys$1);\n        var invalidKeys = filter(required, function (key) {\n          return !pred.validate(obj[key], key);\n        });\n        if (invalidKeys.length > 0) {\n          invalidTypeMessage(invalidKeys, pred.label);\n        }\n        return obj;\n      };\n    };\n    var handleExact = function (required, keys) {\n      var unsupported = filter(keys, function (key) {\n        return !contains(required, key);\n      });\n      if (unsupported.length > 0) {\n        unsuppMessage(unsupported);\n      }\n    };\n    var exactly = function (required) {\n      return base(handleExact, required);\n    };\n\n    var verifyGenerators = exactly([\n      'cell',\n      'row',\n      'replace',\n      'gap'\n    ]);\n    var elementToData = function (element) {\n      var colspan = has$1(element, 'colspan') ? parseInt(get$1(element, 'colspan'), 10) : 1;\n      var rowspan = has$1(element, 'rowspan') ? parseInt(get$1(element, 'rowspan'), 10) : 1;\n      return {\n        element: constant(element),\n        colspan: constant(colspan),\n        rowspan: constant(rowspan)\n      };\n    };\n    var modification = function (generators, toData) {\n      if (toData === void 0) {\n        toData = elementToData;\n      }\n      verifyGenerators(generators);\n      var position = Cell(Option.none());\n      var nu = function (data) {\n        return generators.cell(data);\n      };\n      var nuFrom = function (element) {\n        var data = toData(element);\n        return nu(data);\n      };\n      var add = function (element) {\n        var replacement = nuFrom(element);\n        if (position.get().isNone()) {\n          position.set(Option.some(replacement));\n        }\n        recent = Option.some({\n          item: element,\n          replacement: replacement\n        });\n        return replacement;\n      };\n      var recent = Option.none();\n      var getOrInit = function (element, comparator) {\n        return recent.fold(function () {\n          return add(element);\n        }, function (p) {\n          return comparator(element, p.item) ? p.replacement : add(element);\n        });\n      };\n      return {\n        getOrInit: getOrInit,\n        cursor: position.get\n      };\n    };\n    var transform = function (scope, tag) {\n      return function (generators) {\n        var position = Cell(Option.none());\n        verifyGenerators(generators);\n        var list = [];\n        var find$1 = function (element, comparator) {\n          return find(list, function (x) {\n            return comparator(x.item, element);\n          });\n        };\n        var makeNew = function (element) {\n          var attrs = { scope: scope };\n          var cell = generators.replace(element, tag, attrs);\n          list.push({\n            item: element,\n            sub: cell\n          });\n          if (position.get().isNone()) {\n            position.set(Option.some(cell));\n          }\n          return cell;\n        };\n        var replaceOrInit = function (element, comparator) {\n          return find$1(element, comparator).fold(function () {\n            return makeNew(element);\n          }, function (p) {\n            return comparator(element, p.item) ? p.sub : makeNew(element);\n          });\n        };\n        return {\n          replaceOrInit: replaceOrInit,\n          cursor: position.get\n        };\n      };\n    };\n    var merging = function (generators) {\n      verifyGenerators(generators);\n      var position = Cell(Option.none());\n      var combine = function (cell) {\n        if (position.get().isNone()) {\n          position.set(Option.some(cell));\n        }\n        return function () {\n          var raw = generators.cell({\n            element: constant(cell),\n            colspan: constant(1),\n            rowspan: constant(1)\n          });\n          remove$1(raw, 'width');\n          remove$1(cell, 'width');\n          return raw;\n        };\n      };\n      return {\n        combine: combine,\n        cursor: position.get\n      };\n    };\n    var Generators = {\n      modification: modification,\n      transform: transform,\n      merging: merging\n    };\n\n    var blockList = [\n      'body',\n      'p',\n      'div',\n      'article',\n      'aside',\n      'figcaption',\n      'figure',\n      'footer',\n      'header',\n      'nav',\n      'section',\n      'ol',\n      'ul',\n      'table',\n      'thead',\n      'tfoot',\n      'tbody',\n      'caption',\n      'tr',\n      'td',\n      'th',\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'blockquote',\n      'pre',\n      'address'\n    ];\n    var isList = function (universe, item) {\n      var tagName = universe.property().name(item);\n      return contains([\n        'ol',\n        'ul'\n      ], tagName);\n    };\n    var isBlock = function (universe, item) {\n      var tagName = universe.property().name(item);\n      return contains(blockList, tagName);\n    };\n    var isFormatting = function (universe, item) {\n      var tagName = universe.property().name(item);\n      return contains([\n        'address',\n        'pre',\n        'p',\n        'h1',\n        'h2',\n        'h3',\n        'h4',\n        'h5',\n        'h6'\n      ], tagName);\n    };\n    var isHeading = function (universe, item) {\n      var tagName = universe.property().name(item);\n      return contains([\n        'h1',\n        'h2',\n        'h3',\n        'h4',\n        'h5',\n        'h6'\n      ], tagName);\n    };\n    var isContainer = function (universe, item) {\n      return contains([\n        'div',\n        'li',\n        'td',\n        'th',\n        'blockquote',\n        'body',\n        'caption'\n      ], universe.property().name(item));\n    };\n    var isEmptyTag = function (universe, item) {\n      return contains([\n        'br',\n        'img',\n        'hr',\n        'input'\n      ], universe.property().name(item));\n    };\n    var isFrame = function (universe, item) {\n      return universe.property().name(item) === 'iframe';\n    };\n    var isInline = function (universe, item) {\n      return !(isBlock(universe, item) || isEmptyTag(universe, item)) && universe.property().name(item) !== 'li';\n    };\n    var Structure = {\n      isBlock: isBlock,\n      isList: isList,\n      isFormatting: isFormatting,\n      isHeading: isHeading,\n      isContainer: isContainer,\n      isEmptyTag: isEmptyTag,\n      isFrame: isFrame,\n      isInline: isInline\n    };\n\n    var universe$1 = DomUniverse();\n    var isBlock$1 = function (element) {\n      return Structure.isBlock(universe$1, element);\n    };\n    var isList$1 = function (element) {\n      return Structure.isList(universe$1, element);\n    };\n    var isFormatting$1 = function (element) {\n      return Structure.isFormatting(universe$1, element);\n    };\n    var isHeading$1 = function (element) {\n      return Structure.isHeading(universe$1, element);\n    };\n    var isContainer$1 = function (element) {\n      return Structure.isContainer(universe$1, element);\n    };\n    var isEmptyTag$1 = function (element) {\n      return Structure.isEmptyTag(universe$1, element);\n    };\n    var isFrame$1 = function (element) {\n      return Structure.isFrame(universe$1, element);\n    };\n    var isInline$1 = function (element) {\n      return Structure.isInline(universe$1, element);\n    };\n    var DomStructure = {\n      isBlock: isBlock$1,\n      isList: isList$1,\n      isFormatting: isFormatting$1,\n      isHeading: isHeading$1,\n      isContainer: isContainer$1,\n      isEmptyTag: isEmptyTag$1,\n      isFrame: isFrame$1,\n      isInline: isInline$1\n    };\n\n    var merge$2 = function (cells) {\n      var isBr = function (el) {\n        return name(el) === 'br';\n      };\n      var advancedBr = function (children) {\n        return forall(children, function (c) {\n          return isBr(c) || isText(c) && get$3(c).trim().length === 0;\n        });\n      };\n      var isListItem = function (el) {\n        return name(el) === 'li' || ancestor(el, DomStructure.isList).isSome();\n      };\n      var siblingIsBlock = function (el) {\n        return nextSibling(el).map(function (rightSibling) {\n          if (DomStructure.isBlock(rightSibling)) {\n            return true;\n          }\n          if (DomStructure.isEmptyTag(rightSibling)) {\n            return name(rightSibling) === 'img' ? false : true;\n          }\n          return false;\n        }).getOr(false);\n      };\n      var markCell = function (cell) {\n        return last$1(cell).bind(function (rightEdge) {\n          var rightSiblingIsBlock = siblingIsBlock(rightEdge);\n          return parent(rightEdge).map(function (parent) {\n            return rightSiblingIsBlock === true || isListItem(parent) || isBr(rightEdge) || DomStructure.isBlock(parent) && !eq(cell, parent) ? [] : [Element.fromTag('br')];\n          });\n        }).getOr([]);\n      };\n      var markContent = function () {\n        var content = bind(cells, function (cell) {\n          var children$1 = children(cell);\n          return advancedBr(children$1) ? [] : children$1.concat(markCell(cell));\n        });\n        return content.length === 0 ? [Element.fromTag('br')] : content;\n      };\n      var contents = markContent();\n      empty(cells[0]);\n      append$1(cells[0], contents);\n    };\n    var TableContent = { merge: merge$2 };\n\n    var prune = function (table) {\n      var cells = TableLookup.cells(table);\n      if (cells.length === 0) {\n        remove$2(table);\n      }\n    };\n    var outcome = Immutable('grid', 'cursor');\n    var elementFromGrid = function (grid, row, column) {\n      return findIn(grid, row, column).orThunk(function () {\n        return findIn(grid, 0, 0);\n      });\n    };\n    var findIn = function (grid, row, column) {\n      return Option.from(grid[row]).bind(function (r) {\n        return Option.from(r.cells()[column]).bind(function (c) {\n          return Option.from(c.element());\n        });\n      });\n    };\n    var bundle = function (grid, row, column) {\n      return outcome(grid, findIn(grid, row, column));\n    };\n    var uniqueRows = function (details) {\n      return foldl(details, function (rest, detail) {\n        return exists(rest, function (currentDetail) {\n          return currentDetail.row() === detail.row();\n        }) ? rest : rest.concat([detail]);\n      }, []).sort(function (detailA, detailB) {\n        return detailA.row() - detailB.row();\n      });\n    };\n    var uniqueColumns = function (details) {\n      return foldl(details, function (rest, detail) {\n        return exists(rest, function (currentDetail) {\n          return currentDetail.column() === detail.column();\n        }) ? rest : rest.concat([detail]);\n      }, []).sort(function (detailA, detailB) {\n        return detailA.column() - detailB.column();\n      });\n    };\n    var insertRowBefore = function (grid, detail, comparator, genWrappers) {\n      var example = detail.row();\n      var targetIndex = detail.row();\n      var newGrid = ModificationOperations.insertRowAt(grid, targetIndex, example, comparator, genWrappers.getOrInit);\n      return bundle(newGrid, targetIndex, detail.column());\n    };\n    var insertRowsBefore = function (grid, details, comparator, genWrappers) {\n      var example = details[0].row();\n      var targetIndex = details[0].row();\n      var rows = uniqueRows(details);\n      var newGrid = foldl(rows, function (newG, _row) {\n        return ModificationOperations.insertRowAt(newG, targetIndex, example, comparator, genWrappers.getOrInit);\n      }, grid);\n      return bundle(newGrid, targetIndex, details[0].column());\n    };\n    var insertRowAfter = function (grid, detail, comparator, genWrappers) {\n      var example = detail.row();\n      var targetIndex = detail.row() + detail.rowspan();\n      var newGrid = ModificationOperations.insertRowAt(grid, targetIndex, example, comparator, genWrappers.getOrInit);\n      return bundle(newGrid, targetIndex, detail.column());\n    };\n    var insertRowsAfter = function (grid, details, comparator, genWrappers) {\n      var rows = uniqueRows(details);\n      var example = rows[rows.length - 1].row();\n      var targetIndex = rows[rows.length - 1].row() + rows[rows.length - 1].rowspan();\n      var newGrid = foldl(rows, function (newG, _row) {\n        return ModificationOperations.insertRowAt(newG, targetIndex, example, comparator, genWrappers.getOrInit);\n      }, grid);\n      return bundle(newGrid, targetIndex, details[0].column());\n    };\n    var insertColumnBefore = function (grid, detail, comparator, genWrappers) {\n      var example = detail.column();\n      var targetIndex = detail.column();\n      var newGrid = ModificationOperations.insertColumnAt(grid, targetIndex, example, comparator, genWrappers.getOrInit);\n      return bundle(newGrid, detail.row(), targetIndex);\n    };\n    var insertColumnsBefore = function (grid, details, comparator, genWrappers) {\n      var columns = uniqueColumns(details);\n      var example = columns[0].column();\n      var targetIndex = columns[0].column();\n      var newGrid = foldl(columns, function (newG, _row) {\n        return ModificationOperations.insertColumnAt(newG, targetIndex, example, comparator, genWrappers.getOrInit);\n      }, grid);\n      return bundle(newGrid, details[0].row(), targetIndex);\n    };\n    var insertColumnAfter = function (grid, detail, comparator, genWrappers) {\n      var example = detail.column();\n      var targetIndex = detail.column() + detail.colspan();\n      var newGrid = ModificationOperations.insertColumnAt(grid, targetIndex, example, comparator, genWrappers.getOrInit);\n      return bundle(newGrid, detail.row(), targetIndex);\n    };\n    var insertColumnsAfter = function (grid, details, comparator, genWrappers) {\n      var example = details[details.length - 1].column();\n      var targetIndex = details[details.length - 1].column() + details[details.length - 1].colspan();\n      var columns = uniqueColumns(details);\n      var newGrid = foldl(columns, function (newG, _row) {\n        return ModificationOperations.insertColumnAt(newG, targetIndex, example, comparator, genWrappers.getOrInit);\n      }, grid);\n      return bundle(newGrid, details[0].row(), targetIndex);\n    };\n    var makeRowHeader = function (grid, detail, comparator, genWrappers) {\n      var newGrid = TransformOperations.replaceRow(grid, detail.row(), comparator, genWrappers.replaceOrInit);\n      return bundle(newGrid, detail.row(), detail.column());\n    };\n    var makeColumnHeader = function (grid, detail, comparator, genWrappers) {\n      var newGrid = TransformOperations.replaceColumn(grid, detail.column(), comparator, genWrappers.replaceOrInit);\n      return bundle(newGrid, detail.row(), detail.column());\n    };\n    var unmakeRowHeader = function (grid, detail, comparator, genWrappers) {\n      var newGrid = TransformOperations.replaceRow(grid, detail.row(), comparator, genWrappers.replaceOrInit);\n      return bundle(newGrid, detail.row(), detail.column());\n    };\n    var unmakeColumnHeader = function (grid, detail, comparator, genWrappers) {\n      var newGrid = TransformOperations.replaceColumn(grid, detail.column(), comparator, genWrappers.replaceOrInit);\n      return bundle(newGrid, detail.row(), detail.column());\n    };\n    var splitCellIntoColumns$1 = function (grid, detail, comparator, genWrappers) {\n      var newGrid = ModificationOperations.splitCellIntoColumns(grid, detail.row(), detail.column(), comparator, genWrappers.getOrInit);\n      return bundle(newGrid, detail.row(), detail.column());\n    };\n    var splitCellIntoRows$1 = function (grid, detail, comparator, genWrappers) {\n      var newGrid = ModificationOperations.splitCellIntoRows(grid, detail.row(), detail.column(), comparator, genWrappers.getOrInit);\n      return bundle(newGrid, detail.row(), detail.column());\n    };\n    var eraseColumns = function (grid, details, _comparator, _genWrappers) {\n      var columns = uniqueColumns(details);\n      var newGrid = ModificationOperations.deleteColumnsAt(grid, columns[0].column(), columns[columns.length - 1].column());\n      var cursor = elementFromGrid(newGrid, details[0].row(), details[0].column());\n      return outcome(newGrid, cursor);\n    };\n    var eraseRows = function (grid, details, _comparator, _genWrappers) {\n      var rows = uniqueRows(details);\n      var newGrid = ModificationOperations.deleteRowsAt(grid, rows[0].row(), rows[rows.length - 1].row());\n      var cursor = elementFromGrid(newGrid, details[0].row(), details[0].column());\n      return outcome(newGrid, cursor);\n    };\n    var mergeCells = function (grid, mergable, comparator, _genWrappers) {\n      var cells = mergable.cells();\n      TableContent.merge(cells);\n      var newGrid = MergingOperations.merge(grid, mergable.bounds(), comparator, constant(cells[0]));\n      return outcome(newGrid, Option.from(cells[0]));\n    };\n    var unmergeCells = function (grid, unmergable, comparator, genWrappers) {\n      var newGrid = foldr(unmergable, function (b, cell) {\n        return MergingOperations.unmerge(b, cell, comparator, genWrappers.combine(cell));\n      }, grid);\n      return outcome(newGrid, Option.from(unmergable[0]));\n    };\n    var pasteCells = function (grid, pasteDetails, comparator, _genWrappers) {\n      var gridify = function (table, generators) {\n        var list = DetailsList.fromTable(table);\n        var wh = Warehouse.generate(list);\n        return Transitions.toGrid(wh, generators, true);\n      };\n      var gridB = gridify(pasteDetails.clipboard(), pasteDetails.generators());\n      var startAddress = address(pasteDetails.row(), pasteDetails.column());\n      var mergedGrid = TableMerge.merge(startAddress, grid, gridB, pasteDetails.generators(), comparator);\n      return mergedGrid.fold(function () {\n        return outcome(grid, Option.some(pasteDetails.element()));\n      }, function (nuGrid) {\n        var cursor = elementFromGrid(nuGrid, pasteDetails.row(), pasteDetails.column());\n        return outcome(nuGrid, cursor);\n      });\n    };\n    var gridifyRows = function (rows, generators, example) {\n      var pasteDetails = DetailsList.fromPastedRows(rows, example);\n      var wh = Warehouse.generate(pasteDetails);\n      return Transitions.toGrid(wh, generators, true);\n    };\n    var pasteRowsBefore = function (grid, pasteDetails, comparator, _genWrappers) {\n      var example = grid[pasteDetails.cells[0].row()];\n      var index = pasteDetails.cells[0].row();\n      var gridB = gridifyRows(pasteDetails.clipboard(), pasteDetails.generators(), example);\n      var mergedGrid = TableMerge.insert(index, grid, gridB, pasteDetails.generators(), comparator);\n      var cursor = elementFromGrid(mergedGrid, pasteDetails.cells[0].row(), pasteDetails.cells[0].column());\n      return outcome(mergedGrid, cursor);\n    };\n    var pasteRowsAfter = function (grid, pasteDetails, comparator, _genWrappers) {\n      var example = grid[pasteDetails.cells[0].row()];\n      var index = pasteDetails.cells[pasteDetails.cells.length - 1].row() + pasteDetails.cells[pasteDetails.cells.length - 1].rowspan();\n      var gridB = gridifyRows(pasteDetails.clipboard(), pasteDetails.generators(), example);\n      var mergedGrid = TableMerge.insert(index, grid, gridB, pasteDetails.generators(), comparator);\n      var cursor = elementFromGrid(mergedGrid, pasteDetails.cells[0].row(), pasteDetails.cells[0].column());\n      return outcome(mergedGrid, cursor);\n    };\n    var resize = Adjustments.adjustWidthTo;\n    var TableOperations = {\n      insertRowBefore: run(insertRowBefore, onCell, noop, noop, Generators.modification),\n      insertRowsBefore: run(insertRowsBefore, onCells, noop, noop, Generators.modification),\n      insertRowAfter: run(insertRowAfter, onCell, noop, noop, Generators.modification),\n      insertRowsAfter: run(insertRowsAfter, onCells, noop, noop, Generators.modification),\n      insertColumnBefore: run(insertColumnBefore, onCell, resize, noop, Generators.modification),\n      insertColumnsBefore: run(insertColumnsBefore, onCells, resize, noop, Generators.modification),\n      insertColumnAfter: run(insertColumnAfter, onCell, resize, noop, Generators.modification),\n      insertColumnsAfter: run(insertColumnsAfter, onCells, resize, noop, Generators.modification),\n      splitCellIntoColumns: run(splitCellIntoColumns$1, onCell, resize, noop, Generators.modification),\n      splitCellIntoRows: run(splitCellIntoRows$1, onCell, noop, noop, Generators.modification),\n      eraseColumns: run(eraseColumns, onCells, resize, prune, Generators.modification),\n      eraseRows: run(eraseRows, onCells, noop, prune, Generators.modification),\n      makeColumnHeader: run(makeColumnHeader, onCell, noop, noop, Generators.transform('row', 'th')),\n      unmakeColumnHeader: run(unmakeColumnHeader, onCell, noop, noop, Generators.transform(null, 'td')),\n      makeRowHeader: run(makeRowHeader, onCell, noop, noop, Generators.transform('col', 'th')),\n      unmakeRowHeader: run(unmakeRowHeader, onCell, noop, noop, Generators.transform(null, 'td')),\n      mergeCells: run(mergeCells, onMergable, noop, noop, Generators.merging),\n      unmergeCells: run(unmergeCells, onUnmergable, resize, noop, Generators.merging),\n      pasteCells: run(pasteCells, onPaste, resize, noop, Generators.modification),\n      pasteRowsBefore: run(pasteRowsBefore, onPasteRows, noop, noop, Generators.modification),\n      pasteRowsAfter: run(pasteRowsAfter, onPasteRows, noop, noop, Generators.modification)\n    };\n\n    var getBody$1 = function (editor) {\n      return Element.fromDom(editor.getBody());\n    };\n    var getPixelWidth$1 = function (elm) {\n      return elm.getBoundingClientRect().width;\n    };\n    var getPixelHeight = function (elm) {\n      return elm.getBoundingClientRect().height;\n    };\n    var getIsRoot = function (editor) {\n      return function (element) {\n        return eq(element, getBody$1(editor));\n      };\n    };\n    var removePxSuffix = function (size) {\n      return size ? size.replace(/px$/, '') : '';\n    };\n    var addSizeSuffix = function (size) {\n      if (/^[0-9]+$/.test(size)) {\n        size += 'px';\n      }\n      return size;\n    };\n    var removeDataStyle = function (table) {\n      var dataStyleCells = descendants$1(table, 'td[data-mce-style],th[data-mce-style]');\n      remove(table, 'data-mce-style');\n      each(dataStyleCells, function (cell) {\n        remove(cell, 'data-mce-style');\n      });\n    };\n\n    var getDirection = function (element) {\n      return get$2(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';\n    };\n\n    var ltr$1 = { isRtl: constant(false) };\n    var rtl$1 = { isRtl: constant(true) };\n    var directionAt = function (element) {\n      var dir = getDirection(element);\n      return dir === 'rtl' ? rtl$1 : ltr$1;\n    };\n    var Direction = { directionAt: directionAt };\n\n    var defaultTableToolbar = 'tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol';\n    var defaultStyles = {\n      'border-collapse': 'collapse',\n      'width': '100%'\n    };\n    var defaultAttributes = { border: '1' };\n    var getDefaultAttributes = function (editor) {\n      return editor.getParam('table_default_attributes', defaultAttributes, 'object');\n    };\n    var getDefaultStyles = function (editor) {\n      return editor.getParam('table_default_styles', defaultStyles, 'object');\n    };\n    var hasTableResizeBars = function (editor) {\n      return editor.getParam('table_resize_bars', true, 'boolean');\n    };\n    var hasTabNavigation = function (editor) {\n      return editor.getParam('table_tab_navigation', true, 'boolean');\n    };\n    var hasAdvancedCellTab = function (editor) {\n      return editor.getParam('table_cell_advtab', true, 'boolean');\n    };\n    var hasAdvancedRowTab = function (editor) {\n      return editor.getParam('table_row_advtab', true, 'boolean');\n    };\n    var hasAdvancedTableTab = function (editor) {\n      return editor.getParam('table_advtab', true, 'boolean');\n    };\n    var hasAppearanceOptions = function (editor) {\n      return editor.getParam('table_appearance_options', true, 'boolean');\n    };\n    var hasTableGrid = function (editor) {\n      return editor.getParam('table_grid', true, 'boolean');\n    };\n    var shouldStyleWithCss = function (editor) {\n      return editor.getParam('table_style_by_css', false, 'boolean');\n    };\n    var getCellClassList = function (editor) {\n      return editor.getParam('table_cell_class_list', [], 'array');\n    };\n    var getRowClassList = function (editor) {\n      return editor.getParam('table_row_class_list', [], 'array');\n    };\n    var getTableClassList = function (editor) {\n      return editor.getParam('table_class_list', [], 'array');\n    };\n    var isPercentagesForced = function (editor) {\n      return editor.getParam('table_responsive_width') === true;\n    };\n    var isPixelsForced = function (editor) {\n      return editor.getParam('table_responsive_width') === false;\n    };\n    var getToolbar = function (editor) {\n      return editor.getParam('table_toolbar', defaultTableToolbar);\n    };\n    var getCloneElements = function (editor) {\n      var cloneElements = editor.getParam('table_clone_elements');\n      if (isString(cloneElements)) {\n        return Option.some(cloneElements.split(/[ ,]/));\n      } else if (Array.isArray(cloneElements)) {\n        return Option.some(cloneElements);\n      } else {\n        return Option.none();\n      }\n    };\n    var hasObjectResizing = function (editor) {\n      var objectResizing = editor.getParam('object_resizing', true);\n      return isString(objectResizing) ? objectResizing === 'table' : objectResizing;\n    };\n\n    var fireNewRow = function (editor, row) {\n      return editor.fire('newrow', { node: row });\n    };\n    var fireNewCell = function (editor, cell) {\n      return editor.fire('newcell', { node: cell });\n    };\n    var fireObjectResizeStart = function (editor, target, width, height) {\n      editor.fire('ObjectResizeStart', {\n        target: target,\n        width: width,\n        height: height\n      });\n    };\n    var fireObjectResized = function (editor, target, width, height) {\n      editor.fire('ObjectResized', {\n        target: target,\n        width: width,\n        height: height\n      });\n    };\n    var fireTableSelectionChange = function (editor, cells, start, finish, otherCells) {\n      editor.fire('TableSelectionChange', {\n        cells: cells,\n        start: start,\n        finish: finish,\n        otherCells: otherCells\n      });\n    };\n    var fireTableSelectionClear = function (editor) {\n      editor.fire('TableSelectionClear');\n    };\n\n    var point = Immutable('element', 'offset');\n    var delta = Immutable('element', 'deltaOffset');\n    var range$1 = Immutable('element', 'start', 'finish');\n    var points = Immutable('begin', 'end');\n    var text = Immutable('element', 'text');\n\n    var scan = function (universe, element, direction) {\n      if (universe.property().isText(element) && universe.property().getText(element).trim().length === 0 || universe.property().isComment(element)) {\n        return direction(element).bind(function (elem) {\n          return scan(universe, elem, direction).orThunk(function () {\n            return Option.some(elem);\n          });\n        });\n      } else {\n        return Option.none();\n      }\n    };\n    var toEnd = function (universe, element) {\n      if (universe.property().isText(element)) {\n        return universe.property().getText(element).length;\n      }\n      var children = universe.property().children(element);\n      return children.length;\n    };\n    var freefallRtl = function (universe, element) {\n      var candidate = scan(universe, element, universe.query().prevSibling).getOr(element);\n      if (universe.property().isText(candidate)) {\n        return point(candidate, toEnd(universe, candidate));\n      }\n      var children = universe.property().children(candidate);\n      return children.length > 0 ? freefallRtl(universe, children[children.length - 1]) : point(candidate, toEnd(universe, candidate));\n    };\n\n    var freefallRtl$1 = freefallRtl;\n\n    var universe$2 = DomUniverse();\n    var freefallRtl$2 = function (element) {\n      return freefallRtl$1(universe$2, element);\n    };\n\n    var TableActions = function (editor, lazyWire) {\n      var isTableBody = function (editor) {\n        return name(getBody$1(editor)) === 'table';\n      };\n      var lastRowGuard = function (table) {\n        var size = TableGridSize.getGridSize(table);\n        return isTableBody(editor) === false || size.rows() > 1;\n      };\n      var lastColumnGuard = function (table) {\n        var size = TableGridSize.getGridSize(table);\n        return isTableBody(editor) === false || size.columns() > 1;\n      };\n      var cloneFormats = getCloneElements(editor);\n      var execute = function (operation, guard, mutate, lazyWire) {\n        return function (table, target) {\n          removeDataStyle(table);\n          var wire = lazyWire();\n          var doc = Element.fromDom(editor.getDoc());\n          var direction = TableDirection(Direction.directionAt);\n          var generators = TableFill.cellOperations(mutate, doc, cloneFormats);\n          return guard(table) ? operation(wire, table, target, generators, direction).bind(function (result) {\n            each(result.newRows(), function (row) {\n              fireNewRow(editor, row.dom());\n            });\n            each(result.newCells(), function (cell) {\n              fireNewCell(editor, cell.dom());\n            });\n            return result.cursor().map(function (cell) {\n              var des = freefallRtl$2(cell);\n              var rng = editor.dom.createRng();\n              rng.setStart(des.element().dom(), des.offset());\n              rng.setEnd(des.element().dom(), des.offset());\n              return rng;\n            });\n          }) : Option.none();\n        };\n      };\n      var deleteRow = execute(TableOperations.eraseRows, lastRowGuard, noop, lazyWire);\n      var deleteColumn = execute(TableOperations.eraseColumns, lastColumnGuard, noop, lazyWire);\n      var insertRowsBefore = execute(TableOperations.insertRowsBefore, always, noop, lazyWire);\n      var insertRowsAfter = execute(TableOperations.insertRowsAfter, always, noop, lazyWire);\n      var insertColumnsBefore = execute(TableOperations.insertColumnsBefore, always, CellMutations.halve, lazyWire);\n      var insertColumnsAfter = execute(TableOperations.insertColumnsAfter, always, CellMutations.halve, lazyWire);\n      var mergeCells = execute(TableOperations.mergeCells, always, noop, lazyWire);\n      var unmergeCells = execute(TableOperations.unmergeCells, always, noop, lazyWire);\n      var pasteRowsBefore = execute(TableOperations.pasteRowsBefore, always, noop, lazyWire);\n      var pasteRowsAfter = execute(TableOperations.pasteRowsAfter, always, noop, lazyWire);\n      var pasteCells = execute(TableOperations.pasteCells, always, noop, lazyWire);\n      return {\n        deleteRow: deleteRow,\n        deleteColumn: deleteColumn,\n        insertRowsBefore: insertRowsBefore,\n        insertRowsAfter: insertRowsAfter,\n        insertColumnsBefore: insertColumnsBefore,\n        insertColumnsAfter: insertColumnsAfter,\n        mergeCells: mergeCells,\n        unmergeCells: unmergeCells,\n        pasteRowsBefore: pasteRowsBefore,\n        pasteRowsAfter: pasteRowsAfter,\n        pasteCells: pasteCells\n      };\n    };\n\n    var copyRows = function (table, target, generators) {\n      var list = DetailsList.fromTable(table);\n      var house = Warehouse.generate(list);\n      var details = onCells(house, target);\n      return details.map(function (selectedCells) {\n        var grid = Transitions.toGrid(house, generators, false);\n        var slicedGrid = grid.slice(selectedCells[0].row(), selectedCells[selectedCells.length - 1].row() + selectedCells[selectedCells.length - 1].rowspan());\n        var slicedDetails = toDetailList(slicedGrid, generators);\n        return Redraw.copy(slicedDetails);\n      });\n    };\n    var CopyRows = { copyRows: copyRows };\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var getTDTHOverallStyle = function (dom, elm, name) {\n      var cells = dom.select('td,th', elm);\n      var firstChildStyle;\n      var checkChildren = function (firstChildStyle, elms) {\n        for (var i = 0; i < elms.length; i++) {\n          var currentStyle = dom.getStyle(elms[i], name);\n          if (typeof firstChildStyle === 'undefined') {\n            firstChildStyle = currentStyle;\n          }\n          if (firstChildStyle !== currentStyle) {\n            return '';\n          }\n        }\n        return firstChildStyle;\n      };\n      firstChildStyle = checkChildren(firstChildStyle, cells);\n      return firstChildStyle;\n    };\n    var applyAlign = function (editor, elm, name) {\n      if (name) {\n        editor.formatter.apply('align' + name, {}, elm);\n      }\n    };\n    var applyVAlign = function (editor, elm, name) {\n      if (name) {\n        editor.formatter.apply('valign' + name, {}, elm);\n      }\n    };\n    var unApplyAlign = function (editor, elm) {\n      global$1.each('left center right'.split(' '), function (name) {\n        editor.formatter.remove('align' + name, {}, elm);\n      });\n    };\n    var unApplyVAlign = function (editor, elm) {\n      global$1.each('top middle bottom'.split(' '), function (name) {\n        editor.formatter.remove('valign' + name, {}, elm);\n      });\n    };\n    var Styles$1 = {\n      applyAlign: applyAlign,\n      applyVAlign: applyVAlign,\n      unApplyAlign: unApplyAlign,\n      unApplyVAlign: unApplyVAlign,\n      getTDTHOverallStyle: getTDTHOverallStyle\n    };\n\n    var buildListItems = function (inputList, itemCallback, startItems) {\n      var appendItems = function (values, output) {\n        output = output || [];\n        global$1.each(values, function (item) {\n          var menuItem = { text: item.text || item.title };\n          if (item.menu) {\n            menuItem.menu = appendItems(item.menu);\n          } else {\n            menuItem.value = item.value;\n            if (itemCallback) {\n              itemCallback(menuItem);\n            }\n          }\n          output.push(menuItem);\n        });\n        return output;\n      };\n      return appendItems(inputList, startItems || []);\n    };\n    var extractAdvancedStyles = function (dom, elm) {\n      var rgbToHex = function (value) {\n        return startsWith(value, 'rgb') ? dom.toHex(value) : value;\n      };\n      var borderWidth = getRaw(Element.fromDom(elm), 'border-width').getOr('');\n      var borderStyle = getRaw(Element.fromDom(elm), 'border-style').getOr('');\n      var borderColor = getRaw(Element.fromDom(elm), 'border-color').map(rgbToHex).getOr('');\n      var bgColor = getRaw(Element.fromDom(elm), 'background-color').map(rgbToHex).getOr('');\n      return {\n        borderwidth: borderWidth,\n        borderstyle: borderStyle,\n        bordercolor: borderColor,\n        backgroundcolor: bgColor\n      };\n    };\n    var getSharedValues = function (data) {\n      var baseData = data[0];\n      var comparisonData = data.slice(1);\n      var keys$1 = keys(baseData);\n      each(comparisonData, function (items) {\n        each(keys$1, function (key) {\n          each$1(items, function (itemValue, itemKey) {\n            var comparisonValue = baseData[key];\n            if (comparisonValue !== '' && key === itemKey) {\n              if (comparisonValue !== itemValue) {\n                baseData[key] = '';\n              }\n            }\n          });\n        });\n      });\n      return baseData;\n    };\n    var getAdvancedTab = function (dialogName) {\n      var advTabItems = [\n        {\n          name: 'borderstyle',\n          type: 'selectbox',\n          label: 'Border style',\n          items: [\n            {\n              text: 'Select...',\n              value: ''\n            },\n            {\n              text: 'Solid',\n              value: 'solid'\n            },\n            {\n              text: 'Dotted',\n              value: 'dotted'\n            },\n            {\n              text: 'Dashed',\n              value: 'dashed'\n            },\n            {\n              text: 'Double',\n              value: 'double'\n            },\n            {\n              text: 'Groove',\n              value: 'groove'\n            },\n            {\n              text: 'Ridge',\n              value: 'ridge'\n            },\n            {\n              text: 'Inset',\n              value: 'inset'\n            },\n            {\n              text: 'Outset',\n              value: 'outset'\n            },\n            {\n              text: 'None',\n              value: 'none'\n            },\n            {\n              text: 'Hidden',\n              value: 'hidden'\n            }\n          ]\n        },\n        {\n          name: 'bordercolor',\n          type: 'colorinput',\n          label: 'Border color'\n        },\n        {\n          name: 'backgroundcolor',\n          type: 'colorinput',\n          label: 'Background color'\n        }\n      ];\n      var borderWidth = {\n        name: 'borderwidth',\n        type: 'input',\n        label: 'Border width'\n      };\n      var items = dialogName === 'cell' ? [borderWidth].concat(advTabItems) : advTabItems;\n      return {\n        title: 'Advanced',\n        name: 'advanced',\n        items: items\n      };\n    };\n    var getAlignment = function (alignments, formatName, dataName, editor, elm) {\n      var alignmentData = {};\n      global$1.each(alignments.split(' '), function (name) {\n        if (editor.formatter.matchNode(elm, formatName + name)) {\n          alignmentData[dataName] = name;\n        }\n      });\n      if (!alignmentData[dataName]) {\n        alignmentData[dataName] = '';\n      }\n      return alignmentData;\n    };\n    var getHAlignment = curry(getAlignment, 'left center right');\n    var getVAlignment = curry(getAlignment, 'top middle bottom');\n    var extractDataFromSettings = function (editor, hasAdvTableTab) {\n      var style = getDefaultStyles(editor);\n      var attrs = getDefaultAttributes(editor);\n      var extractAdvancedStyleData = function (dom) {\n        var rgbToHex = function (value) {\n          return startsWith(value, 'rgb') ? dom.toHex(value) : value;\n        };\n        var borderStyle = get(style, 'border-style').getOr('');\n        var borderColor = get(style, 'border-color').getOr('');\n        var bgColor = get(style, 'background-color').getOr('');\n        return {\n          borderstyle: borderStyle,\n          bordercolor: rgbToHex(borderColor),\n          backgroundcolor: rgbToHex(bgColor)\n        };\n      };\n      var defaultData = {\n        height: '',\n        width: '100%',\n        cellspacing: '',\n        cellpadding: '',\n        caption: false,\n        class: '',\n        align: '',\n        border: ''\n      };\n      var getBorder = function () {\n        var borderWidth = style['border-width'];\n        if (shouldStyleWithCss(editor) && borderWidth) {\n          return { border: borderWidth };\n        }\n        return get(attrs, 'border').fold(function () {\n          return {};\n        }, function (border) {\n          return { border: border };\n        });\n      };\n      var dom = editor.dom;\n      var advStyle = hasAdvTableTab ? extractAdvancedStyleData(dom) : {};\n      var getCellPaddingCellSpacing = function () {\n        var spacing = get(style, 'border-spacing').or(get(attrs, 'cellspacing')).fold(function () {\n          return {};\n        }, function (cellspacing) {\n          return { cellspacing: cellspacing };\n        });\n        var padding = get(style, 'border-padding').or(get(attrs, 'cellpadding')).fold(function () {\n          return {};\n        }, function (cellpadding) {\n          return { cellpadding: cellpadding };\n        });\n        return __assign(__assign({}, spacing), padding);\n      };\n      var data = __assign(__assign(__assign(__assign(__assign(__assign({}, defaultData), style), attrs), advStyle), getBorder()), getCellPaddingCellSpacing());\n      return data;\n    };\n    var extractDataFromTableElement = function (editor, elm, hasAdvTableTab) {\n      var getBorder = function (dom, elm) {\n        var optBorderWidth = getRaw(Element.fromDom(elm), 'border-width');\n        if (shouldStyleWithCss(editor) && optBorderWidth.isSome()) {\n          return optBorderWidth.getOr('');\n        }\n        return dom.getAttrib(elm, 'border') || Styles$1.getTDTHOverallStyle(editor.dom, elm, 'border-width') || Styles$1.getTDTHOverallStyle(editor.dom, elm, 'border');\n      };\n      var dom = editor.dom;\n      var data = __assign(__assign({\n        width: dom.getStyle(elm, 'width') || dom.getAttrib(elm, 'width'),\n        height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'),\n        cellspacing: dom.getStyle(elm, 'border-spacing') || dom.getAttrib(elm, 'cellspacing'),\n        cellpadding: dom.getAttrib(elm, 'cellpadding') || Styles$1.getTDTHOverallStyle(editor.dom, elm, 'padding'),\n        border: getBorder(dom, elm),\n        caption: !!dom.select('caption', elm)[0],\n        class: dom.getAttrib(elm, 'class', '')\n      }, getHAlignment('align', 'align', editor, elm)), hasAdvTableTab ? extractAdvancedStyles(dom, elm) : {});\n      return data;\n    };\n    var extractDataFromRowElement = function (editor, elm, hasAdvancedRowTab) {\n      var dom = editor.dom;\n      var data = __assign(__assign({\n        height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'),\n        scope: dom.getAttrib(elm, 'scope'),\n        class: dom.getAttrib(elm, 'class', ''),\n        align: '',\n        type: elm.parentNode.nodeName.toLowerCase()\n      }, getHAlignment('align', 'align', editor, elm)), hasAdvancedRowTab ? extractAdvancedStyles(dom, elm) : {});\n      return data;\n    };\n    var extractDataFromCellElement = function (editor, elm, hasAdvancedCellTab) {\n      var dom = editor.dom;\n      var data = __assign(__assign(__assign({\n        width: dom.getStyle(elm, 'width') || dom.getAttrib(elm, 'width'),\n        height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'),\n        scope: dom.getAttrib(elm, 'scope'),\n        celltype: elm.nodeName.toLowerCase(),\n        class: dom.getAttrib(elm, 'class', '')\n      }, getHAlignment('align', 'halign', editor, elm)), getVAlignment('valign', 'valign', editor, elm)), hasAdvancedCellTab ? extractAdvancedStyles(dom, elm) : {});\n      return data;\n    };\n    var Helpers = {\n      buildListItems: buildListItems,\n      extractAdvancedStyles: extractAdvancedStyles,\n      getSharedValues: getSharedValues,\n      getAdvancedTab: getAdvancedTab,\n      extractDataFromTableElement: extractDataFromTableElement,\n      extractDataFromRowElement: extractDataFromRowElement,\n      extractDataFromCellElement: extractDataFromCellElement,\n      extractDataFromSettings: extractDataFromSettings\n    };\n\n    var getClassList = function (editor) {\n      var rowClassList = getCellClassList(editor);\n      var classes = Helpers.buildListItems(rowClassList, function (item) {\n        if (item.value) {\n          item.textStyle = function () {\n            return editor.formatter.getCssText({\n              block: 'tr',\n              classes: [item.value]\n            });\n          };\n        }\n      });\n      if (rowClassList.length > 0) {\n        return Option.some({\n          name: 'class',\n          type: 'selectbox',\n          label: 'Class',\n          items: classes\n        });\n      }\n      return Option.none();\n    };\n    var children$3 = [\n      {\n        name: 'width',\n        type: 'input',\n        label: 'Width'\n      },\n      {\n        name: 'height',\n        type: 'input',\n        label: 'Height'\n      },\n      {\n        name: 'celltype',\n        type: 'selectbox',\n        label: 'Cell type',\n        items: [\n          {\n            text: 'Cell',\n            value: 'td'\n          },\n          {\n            text: 'Header cell',\n            value: 'th'\n          }\n        ]\n      },\n      {\n        name: 'scope',\n        type: 'selectbox',\n        label: 'Scope',\n        items: [\n          {\n            text: 'None',\n            value: ''\n          },\n          {\n            text: 'Row',\n            value: 'row'\n          },\n          {\n            text: 'Column',\n            value: 'col'\n          },\n          {\n            text: 'Row group',\n            value: 'rowgroup'\n          },\n          {\n            text: 'Column group',\n            value: 'colgroup'\n          }\n        ]\n      },\n      {\n        name: 'halign',\n        type: 'selectbox',\n        label: 'H Align',\n        items: [\n          {\n            text: 'None',\n            value: ''\n          },\n          {\n            text: 'Left',\n            value: 'left'\n          },\n          {\n            text: 'Center',\n            value: 'center'\n          },\n          {\n            text: 'Right',\n            value: 'right'\n          }\n        ]\n      },\n      {\n        name: 'valign',\n        type: 'selectbox',\n        label: 'V Align',\n        items: [\n          {\n            text: 'None',\n            value: ''\n          },\n          {\n            text: 'Top',\n            value: 'top'\n          },\n          {\n            text: 'Middle',\n            value: 'middle'\n          },\n          {\n            text: 'Bottom',\n            value: 'bottom'\n          }\n        ]\n      }\n    ];\n    var getItems = function (editor) {\n      return getClassList(editor).fold(function () {\n        return children$3;\n      }, function (classlist) {\n        return children$3.concat(classlist);\n      });\n    };\n    var CellDialogGeneralTab = { getItems: getItems };\n\n    var normal = function (dom, node) {\n      var setAttrib = function (attr, value) {\n        dom.setAttrib(node, attr, value);\n      };\n      var setStyle = function (prop, value) {\n        dom.setStyle(node, prop, value);\n      };\n      return {\n        setAttrib: setAttrib,\n        setStyle: setStyle\n      };\n    };\n    var ifTruthy = function (dom, node) {\n      var setAttrib = function (attr, value) {\n        if (value) {\n          dom.setAttrib(node, attr, value);\n        }\n      };\n      var setStyle = function (prop, value) {\n        if (value) {\n          dom.setStyle(node, prop, value);\n        }\n      };\n      return {\n        setAttrib: setAttrib,\n        setStyle: setStyle\n      };\n    };\n    var DomModifier = {\n      normal: normal,\n      ifTruthy: ifTruthy\n    };\n\n    var updateSimpleProps = function (modifiers, data) {\n      modifiers.setAttrib('scope', data.scope);\n      modifiers.setAttrib('class', data.class);\n      modifiers.setStyle('width', addSizeSuffix(data.width));\n      modifiers.setStyle('height', addSizeSuffix(data.height));\n    };\n    var updateAdvancedProps = function (modifiers, data) {\n      modifiers.setStyle('background-color', data.backgroundcolor);\n      modifiers.setStyle('border-color', data.bordercolor);\n      modifiers.setStyle('border-style', data.borderstyle);\n      modifiers.setStyle('border-width', addSizeSuffix(data.borderwidth));\n    };\n    var applyToSingle = function (editor, cells, data) {\n      var dom = editor.dom;\n      var cellElm = data.celltype && cells[0].nodeName.toLowerCase() !== data.celltype ? dom.rename(cells[0], data.celltype) : cells[0];\n      var modifiers = DomModifier.normal(dom, cellElm);\n      updateSimpleProps(modifiers, data);\n      if (hasAdvancedCellTab(editor)) {\n        updateAdvancedProps(modifiers, data);\n      }\n      Styles$1.unApplyAlign(editor, cellElm);\n      Styles$1.unApplyVAlign(editor, cellElm);\n      if (data.halign) {\n        Styles$1.applyAlign(editor, cellElm, data.halign);\n      }\n      if (data.valign) {\n        Styles$1.applyVAlign(editor, cellElm, data.valign);\n      }\n    };\n    var applyToMultiple = function (editor, cells, data) {\n      var dom = editor.dom;\n      global$1.each(cells, function (cellElm) {\n        if (data.celltype && cellElm.nodeName.toLowerCase() !== data.celltype) {\n          cellElm = dom.rename(cellElm, data.celltype);\n        }\n        var modifiers = DomModifier.ifTruthy(dom, cellElm);\n        updateSimpleProps(modifiers, data);\n        if (hasAdvancedCellTab(editor)) {\n          updateAdvancedProps(modifiers, data);\n        }\n        if (data.halign) {\n          Styles$1.applyAlign(editor, cellElm, data.halign);\n        }\n        if (data.valign) {\n          Styles$1.applyVAlign(editor, cellElm, data.valign);\n        }\n      });\n    };\n    var onSubmitCellForm = function (editor, cells, api) {\n      var data = api.getData();\n      api.close();\n      editor.undoManager.transact(function () {\n        var applicator = cells.length === 1 ? applyToSingle : applyToMultiple;\n        applicator(editor, cells, data);\n        editor.focus();\n      });\n    };\n    var open = function (editor) {\n      var cellElm, cells = [];\n      cells = editor.dom.select('td[data-mce-selected],th[data-mce-selected]');\n      cellElm = editor.dom.getParent(editor.selection.getStart(), 'td,th');\n      if (!cells.length && cellElm) {\n        cells.push(cellElm);\n      }\n      cellElm = cellElm || cells[0];\n      if (!cellElm) {\n        return;\n      }\n      var cellsData = global$1.map(cells, function (cellElm) {\n        return Helpers.extractDataFromCellElement(editor, cellElm, hasAdvancedCellTab(editor));\n      });\n      var data = Helpers.getSharedValues(cellsData);\n      var dialogTabPanel = {\n        type: 'tabpanel',\n        tabs: [\n          {\n            title: 'General',\n            name: 'general',\n            items: CellDialogGeneralTab.getItems(editor)\n          },\n          Helpers.getAdvancedTab('cell')\n        ]\n      };\n      var dialogPanel = {\n        type: 'panel',\n        items: [{\n            type: 'grid',\n            columns: 2,\n            items: CellDialogGeneralTab.getItems(editor)\n          }]\n      };\n      editor.windowManager.open({\n        title: 'Cell Properties',\n        size: 'normal',\n        body: hasAdvancedCellTab(editor) ? dialogTabPanel : dialogPanel,\n        buttons: [\n          {\n            type: 'cancel',\n            name: 'cancel',\n            text: 'Cancel'\n          },\n          {\n            type: 'submit',\n            name: 'save',\n            text: 'Save',\n            primary: true\n          }\n        ],\n        initialData: data,\n        onSubmit: curry(onSubmitCellForm, editor, cells)\n      });\n    };\n    var CellDialog = { open: open };\n\n    var getClassList$1 = function (editor) {\n      var rowClassList = getRowClassList(editor);\n      var classes = Helpers.buildListItems(rowClassList, function (item) {\n        if (item.value) {\n          item.textStyle = function () {\n            return editor.formatter.getCssText({\n              block: 'tr',\n              classes: [item.value]\n            });\n          };\n        }\n      });\n      if (rowClassList.length > 0) {\n        return Option.some({\n          name: 'class',\n          type: 'selectbox',\n          label: 'Class',\n          items: classes\n        });\n      }\n      return Option.none();\n    };\n    var formChildren = [\n      {\n        type: 'selectbox',\n        name: 'type',\n        label: 'Row type',\n        items: [\n          {\n            text: 'Header',\n            value: 'thead'\n          },\n          {\n            text: 'Body',\n            value: 'tbody'\n          },\n          {\n            text: 'Footer',\n            value: 'tfoot'\n          }\n        ]\n      },\n      {\n        type: 'selectbox',\n        name: 'align',\n        label: 'Alignment',\n        items: [\n          {\n            text: 'None',\n            value: ''\n          },\n          {\n            text: 'Left',\n            value: 'left'\n          },\n          {\n            text: 'Center',\n            value: 'center'\n          },\n          {\n            text: 'Right',\n            value: 'right'\n          }\n        ]\n      },\n      {\n        label: 'Height',\n        name: 'height',\n        type: 'input'\n      }\n    ];\n    var getItems$1 = function (editor) {\n      return getClassList$1(editor).fold(function () {\n        return formChildren;\n      }, function (classes) {\n        return formChildren.concat(classes);\n      });\n    };\n    var RowDialogGeneralTab = { getItems: getItems$1 };\n\n    var switchRowType = function (dom, rowElm, toType) {\n      var tableElm = dom.getParent(rowElm, 'table');\n      var oldParentElm = rowElm.parentNode;\n      var parentElm = dom.select(toType, tableElm)[0];\n      if (!parentElm) {\n        parentElm = dom.create(toType);\n        if (tableElm.firstChild) {\n          if (tableElm.firstChild.nodeName === 'CAPTION') {\n            dom.insertAfter(parentElm, tableElm.firstChild);\n          } else {\n            tableElm.insertBefore(parentElm, tableElm.firstChild);\n          }\n        } else {\n          tableElm.appendChild(parentElm);\n        }\n      }\n      if (toType === 'tbody' && oldParentElm.nodeName === 'THEAD' && parentElm.firstChild) {\n        parentElm.insertBefore(rowElm, parentElm.firstChild);\n      } else {\n        parentElm.appendChild(rowElm);\n      }\n      if (!oldParentElm.hasChildNodes()) {\n        dom.remove(oldParentElm);\n      }\n    };\n    var updateAdvancedProps$1 = function (modifier, data) {\n      modifier.setStyle('background-color', data.backgroundcolor);\n      modifier.setStyle('border-color', data.bordercolor);\n      modifier.setStyle('border-style', data.borderstyle);\n    };\n    var onSubmitRowForm = function (editor, rows, oldData, api) {\n      var dom = editor.dom;\n      var data = api.getData();\n      api.close();\n      var createModifier = rows.length === 1 ? DomModifier.normal : DomModifier.ifTruthy;\n      editor.undoManager.transact(function () {\n        global$1.each(rows, function (rowElm) {\n          if (data.type !== rowElm.parentNode.nodeName.toLowerCase()) {\n            switchRowType(editor.dom, rowElm, data.type);\n          }\n          var modifier = createModifier(dom, rowElm);\n          modifier.setAttrib('scope', data.scope);\n          modifier.setAttrib('class', data.class);\n          modifier.setStyle('height', addSizeSuffix(data.height));\n          if (hasAdvancedRowTab(editor)) {\n            updateAdvancedProps$1(modifier, data);\n          }\n          if (data.align !== oldData.align) {\n            Styles$1.unApplyAlign(editor, rowElm);\n            Styles$1.applyAlign(editor, rowElm, data.align);\n          }\n        });\n        editor.focus();\n      });\n    };\n    var open$1 = function (editor) {\n      var dom = editor.dom;\n      var tableElm, cellElm, rowElm;\n      var rows = [];\n      tableElm = dom.getParent(editor.selection.getStart(), 'table');\n      if (!tableElm) {\n        return;\n      }\n      cellElm = dom.getParent(editor.selection.getStart(), 'td,th');\n      global$1.each(tableElm.rows, function (row) {\n        global$1.each(row.cells, function (cell) {\n          if ((dom.getAttrib(cell, 'data-mce-selected') || cell === cellElm) && rows.indexOf(row) < 0) {\n            rows.push(row);\n            return false;\n          }\n        });\n      });\n      rowElm = rows[0];\n      if (!rowElm) {\n        return;\n      }\n      var rowsData = global$1.map(rows, function (rowElm) {\n        return Helpers.extractDataFromRowElement(editor, rowElm, hasAdvancedRowTab(editor));\n      });\n      var data = Helpers.getSharedValues(rowsData);\n      var dialogTabPanel = {\n        type: 'tabpanel',\n        tabs: [\n          {\n            title: 'General',\n            name: 'general',\n            items: RowDialogGeneralTab.getItems(editor)\n          },\n          Helpers.getAdvancedTab('row')\n        ]\n      };\n      var dialogPanel = {\n        type: 'panel',\n        items: [{\n            type: 'grid',\n            columns: 2,\n            items: RowDialogGeneralTab.getItems(editor)\n          }]\n      };\n      editor.windowManager.open({\n        title: 'Row Properties',\n        size: 'normal',\n        body: hasAdvancedRowTab(editor) ? dialogTabPanel : dialogPanel,\n        buttons: [\n          {\n            type: 'cancel',\n            name: 'cancel',\n            text: 'Cancel'\n          },\n          {\n            type: 'submit',\n            name: 'save',\n            text: 'Save',\n            primary: true\n          }\n        ],\n        initialData: data,\n        onSubmit: curry(onSubmitRowForm, editor, rows, data)\n      });\n    };\n    var RowDialog = { open: open$1 };\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.Env');\n\n    var DefaultRenderOptions = {\n      styles: {\n        'border-collapse': 'collapse',\n        'width': '100%'\n      },\n      attributes: { border: '1' },\n      percentages: true\n    };\n    var makeTable = function () {\n      return Element.fromTag('table');\n    };\n    var tableBody = function () {\n      return Element.fromTag('tbody');\n    };\n    var tableRow = function () {\n      return Element.fromTag('tr');\n    };\n    var tableHeaderCell = function () {\n      return Element.fromTag('th');\n    };\n    var tableCell = function () {\n      return Element.fromTag('td');\n    };\n    var render$1 = function (rows, columns, rowHeaders, columnHeaders, renderOpts) {\n      if (renderOpts === void 0) {\n        renderOpts = DefaultRenderOptions;\n      }\n      var table = makeTable();\n      setAll$1(table, renderOpts.styles);\n      setAll(table, renderOpts.attributes);\n      var tbody = tableBody();\n      append(table, tbody);\n      var trs = [];\n      for (var i = 0; i < rows; i++) {\n        var tr = tableRow();\n        for (var j = 0; j < columns; j++) {\n          var td = i < rowHeaders || j < columnHeaders ? tableHeaderCell() : tableCell();\n          if (j < columnHeaders) {\n            set(td, 'scope', 'row');\n          }\n          if (i < rowHeaders) {\n            set(td, 'scope', 'col');\n          }\n          append(td, Element.fromTag('br'));\n          if (renderOpts.percentages) {\n            set$1(td, 'width', 100 / columns + '%');\n          }\n          append(tr, td);\n        }\n        trs.push(tr);\n      }\n      append$1(tbody, trs);\n      return table;\n    };\n\n    var get$8 = function (element) {\n      return element.dom().innerHTML;\n    };\n    var getOuter$2 = function (element) {\n      var container = Element.fromTag('div');\n      var clone = Element.fromDom(element.dom().cloneNode(true));\n      append(container, clone);\n      return get$8(container);\n    };\n\n    var placeCaretInCell = function (editor, cell) {\n      editor.selection.select(cell.dom(), true);\n      editor.selection.collapse(true);\n    };\n    var selectFirstCellInTable = function (editor, tableElm) {\n      descendant$1(tableElm, 'td,th').each(curry(placeCaretInCell, editor));\n    };\n    var fireEvents = function (editor, table) {\n      each(descendants$1(table, 'tr'), function (row) {\n        fireNewRow(editor, row.dom());\n        each(descendants$1(row, 'th,td'), function (cell) {\n          fireNewCell(editor, cell.dom());\n        });\n      });\n    };\n    var isPercentage = function (width) {\n      return isString(width) && width.indexOf('%') !== -1;\n    };\n    var insert$1 = function (editor, columns, rows) {\n      var defaultStyles = getDefaultStyles(editor);\n      var options = {\n        styles: defaultStyles,\n        attributes: getDefaultAttributes(editor),\n        percentages: isPercentage(defaultStyles.width) && !isPixelsForced(editor)\n      };\n      var table = render$1(rows, columns, 0, 0, options);\n      set(table, 'data-mce-id', '__mce');\n      var html = getOuter$2(table);\n      editor.insertContent(html);\n      return descendant$1(getBody$1(editor), 'table[data-mce-id=\"__mce\"]').map(function (table) {\n        if (isPixelsForced(editor)) {\n          set$1(table, 'width', get$2(table, 'width'));\n        }\n        remove(table, 'data-mce-id');\n        fireEvents(editor, table);\n        selectFirstCellInTable(editor, table);\n        return table.dom();\n      }).getOr(null);\n    };\n    var InsertTable = { insert: insert$1 };\n\n    var getItems$2 = function (editor, hasClasses, insertNewTable) {\n      var rowColCountItems = !insertNewTable ? [] : [\n        {\n          type: 'input',\n          name: 'cols',\n          label: 'Cols',\n          inputMode: 'numeric'\n        },\n        {\n          type: 'input',\n          name: 'rows',\n          label: 'Rows',\n          inputMode: 'numeric'\n        }\n      ];\n      var alwaysItems = [\n        {\n          type: 'input',\n          name: 'width',\n          label: 'Width'\n        },\n        {\n          type: 'input',\n          name: 'height',\n          label: 'Height'\n        }\n      ];\n      var appearanceItems = hasAppearanceOptions(editor) ? [\n        {\n          type: 'input',\n          name: 'cellspacing',\n          label: 'Cell spacing',\n          inputMode: 'numeric'\n        },\n        {\n          type: 'input',\n          name: 'cellpadding',\n          label: 'Cell padding',\n          inputMode: 'numeric'\n        },\n        {\n          type: 'input',\n          name: 'border',\n          label: 'Border width'\n        },\n        {\n          type: 'label',\n          label: 'Caption',\n          items: [{\n              type: 'checkbox',\n              name: 'caption',\n              label: 'Show caption'\n            }]\n        }\n      ] : [];\n      var alignmentItem = [{\n          type: 'selectbox',\n          name: 'align',\n          label: 'Alignment',\n          items: [\n            {\n              text: 'None',\n              value: ''\n            },\n            {\n              text: 'Left',\n              value: 'left'\n            },\n            {\n              text: 'Center',\n              value: 'center'\n            },\n            {\n              text: 'Right',\n              value: 'right'\n            }\n          ]\n        }];\n      var classListItem = hasClasses ? [{\n          type: 'selectbox',\n          name: 'class',\n          label: 'Class',\n          items: Helpers.buildListItems(getTableClassList(editor), function (item) {\n            if (item.value) {\n              item.textStyle = function () {\n                return editor.formatter.getCssText({\n                  block: 'table',\n                  classes: [item.value]\n                });\n              };\n            }\n          })\n        }] : [];\n      return rowColCountItems.concat(alwaysItems).concat(appearanceItems).concat(alignmentItem).concat(classListItem);\n    };\n    var TableDialogGeneralTab = { getItems: getItems$2 };\n\n    var styleTDTH = function (dom, elm, name, value) {\n      if (elm.tagName === 'TD' || elm.tagName === 'TH') {\n        if (isString(name)) {\n          dom.setStyle(elm, name, value);\n        } else {\n          dom.setStyle(elm, name);\n        }\n      } else {\n        if (elm.children) {\n          for (var i = 0; i < elm.children.length; i++) {\n            styleTDTH(dom, elm.children[i], name, value);\n          }\n        }\n      }\n    };\n    var applyDataToElement = function (editor, tableElm, data) {\n      var dom = editor.dom;\n      var attrs = {};\n      var styles = {};\n      attrs.class = data.class;\n      styles.height = addSizeSuffix(data.height);\n      if (dom.getAttrib(tableElm, 'width') && !shouldStyleWithCss(editor)) {\n        attrs.width = removePxSuffix(data.width);\n      } else {\n        styles.width = addSizeSuffix(data.width);\n      }\n      if (shouldStyleWithCss(editor)) {\n        styles['border-width'] = addSizeSuffix(data.border);\n        styles['border-spacing'] = addSizeSuffix(data.cellspacing);\n      } else {\n        attrs.border = data.border;\n        attrs.cellpadding = data.cellpadding;\n        attrs.cellspacing = data.cellspacing;\n      }\n      if (shouldStyleWithCss(editor) && tableElm.children) {\n        for (var i = 0; i < tableElm.children.length; i++) {\n          styleTDTH(dom, tableElm.children[i], {\n            'border-width': addSizeSuffix(data.border),\n            'padding': addSizeSuffix(data.cellpadding)\n          });\n          if (hasAdvancedTableTab(editor)) {\n            styleTDTH(dom, tableElm.children[i], { 'border-color': data.bordercolor });\n          }\n        }\n      }\n      if (hasAdvancedTableTab(editor)) {\n        styles['background-color'] = data.backgroundcolor;\n        styles['border-color'] = data.bordercolor;\n        styles['border-style'] = data.borderstyle;\n      }\n      attrs.style = dom.serializeStyle(__assign(__assign({}, getDefaultStyles(editor)), styles));\n      dom.setAttribs(tableElm, __assign(__assign({}, getDefaultAttributes(editor)), attrs));\n    };\n    var onSubmitTableForm = function (editor, tableElm, api) {\n      var dom = editor.dom;\n      var captionElm;\n      var data = api.getData();\n      api.close();\n      if (data.class === '') {\n        delete data.class;\n      }\n      editor.undoManager.transact(function () {\n        if (!tableElm) {\n          var cols = parseInt(data.cols, 10) || 1;\n          var rows = parseInt(data.rows, 10) || 1;\n          tableElm = InsertTable.insert(editor, cols, rows);\n        }\n        applyDataToElement(editor, tableElm, data);\n        captionElm = dom.select('caption', tableElm)[0];\n        if (captionElm && !data.caption) {\n          dom.remove(captionElm);\n        }\n        if (!captionElm && data.caption) {\n          captionElm = dom.create('caption');\n          captionElm.innerHTML = !global$2.ie ? '<br data-mce-bogus=\"1\"/>' : nbsp;\n          tableElm.insertBefore(captionElm, tableElm.firstChild);\n        }\n        if (data.align === '') {\n          Styles$1.unApplyAlign(editor, tableElm);\n        } else {\n          Styles$1.applyAlign(editor, tableElm, data.align);\n        }\n        editor.focus();\n        editor.addVisual();\n      });\n    };\n    var open$2 = function (editor, insertNewTable) {\n      var dom = editor.dom;\n      var tableElm;\n      var data = Helpers.extractDataFromSettings(editor, hasAdvancedTableTab(editor));\n      if (insertNewTable === false) {\n        tableElm = dom.getParent(editor.selection.getStart(), 'table');\n        if (tableElm) {\n          data = Helpers.extractDataFromTableElement(editor, tableElm, hasAdvancedTableTab(editor));\n        } else {\n          if (hasAdvancedTableTab(editor)) {\n            data.borderstyle = '';\n            data.bordercolor = '';\n            data.backgroundcolor = '';\n          }\n        }\n      } else {\n        data.cols = '1';\n        data.rows = '1';\n        if (hasAdvancedTableTab(editor)) {\n          data.borderstyle = '';\n          data.bordercolor = '';\n          data.backgroundcolor = '';\n        }\n      }\n      var hasClasses = getTableClassList(editor).length > 0;\n      if (hasClasses) {\n        if (data.class) {\n          data.class = data.class.replace(/\\s*mce\\-item\\-table\\s*/g, '');\n        }\n      }\n      var generalPanel = {\n        type: 'grid',\n        columns: 2,\n        items: TableDialogGeneralTab.getItems(editor, hasClasses, insertNewTable)\n      };\n      var nonAdvancedForm = function () {\n        return {\n          type: 'panel',\n          items: [generalPanel]\n        };\n      };\n      var advancedForm = function () {\n        return {\n          type: 'tabpanel',\n          tabs: [\n            {\n              title: 'General',\n              name: 'general',\n              items: [generalPanel]\n            },\n            Helpers.getAdvancedTab('table')\n          ]\n        };\n      };\n      var dialogBody = hasAdvancedTableTab(editor) ? advancedForm() : nonAdvancedForm();\n      editor.windowManager.open({\n        title: 'Table Properties',\n        size: 'normal',\n        body: dialogBody,\n        onSubmit: curry(onSubmitTableForm, editor, tableElm),\n        buttons: [\n          {\n            type: 'cancel',\n            name: 'cancel',\n            text: 'Cancel'\n          },\n          {\n            type: 'submit',\n            name: 'save',\n            text: 'Save',\n            primary: true\n          }\n        ],\n        initialData: data\n      });\n    };\n    var TableDialog = { open: open$2 };\n\n    var getSelectionStartFromSelector = function (selector) {\n      return function (editor) {\n        return Option.from(editor.dom.getParent(editor.selection.getStart(), selector)).map(Element.fromDom);\n      };\n    };\n    var getSelectionStartCell = getSelectionStartFromSelector('th,td');\n    var getSelectionStartCellOrCaption = getSelectionStartFromSelector('th,td,caption');\n\n    var each$3 = global$1.each;\n    var registerCommands = function (editor, actions, cellSelection, selections, clipboardRows) {\n      var isRoot = getIsRoot(editor);\n      var eraseTable = function () {\n        getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) {\n          var tableOpt = TableLookup.table(cellOrCaption, isRoot);\n          tableOpt.filter(not(isRoot)).each(function (table) {\n            var cursor = Element.fromText('');\n            after(table, cursor);\n            remove$2(table);\n            if (editor.dom.isEmpty(editor.getBody())) {\n              editor.setContent('');\n              editor.selection.setCursorLocation();\n            } else {\n              var rng = editor.dom.createRng();\n              rng.setStart(cursor.dom(), 0);\n              rng.setEnd(cursor.dom(), 0);\n              editor.selection.setRng(rng);\n              editor.nodeChanged();\n            }\n          });\n        });\n      };\n      var getTableFromCell = function (cell) {\n        return TableLookup.table(cell, isRoot);\n      };\n      var getSize = function (table) {\n        return {\n          width: getPixelWidth$1(table.dom()),\n          height: getPixelWidth$1(table.dom())\n        };\n      };\n      var resizeChange = function (editor, oldSize, table) {\n        var newSize = getSize(table);\n        if (oldSize.width !== newSize.width || oldSize.height !== newSize.height) {\n          fireObjectResizeStart(editor, table.dom(), oldSize.width, oldSize.height);\n          fireObjectResized(editor, table.dom(), newSize.width, newSize.height);\n        }\n      };\n      var actOnSelection = function (execute) {\n        getSelectionStartCell(editor).each(function (cell) {\n          getTableFromCell(cell).each(function (table) {\n            var targets = TableTargets.forMenu(selections, table, cell);\n            var beforeSize = getSize(table);\n            execute(table, targets).each(function (rng) {\n              resizeChange(editor, beforeSize, table);\n              editor.selection.setRng(rng);\n              editor.focus();\n              cellSelection.clear(table);\n              removeDataStyle(table);\n            });\n          });\n        });\n      };\n      var copyRowSelection = function (execute) {\n        return getSelectionStartCell(editor).map(function (cell) {\n          return getTableFromCell(cell).bind(function (table) {\n            var doc = Element.fromDom(editor.getDoc());\n            var targets = TableTargets.forMenu(selections, table, cell);\n            var generators = TableFill.cellOperations(noop, doc, Option.none());\n            return CopyRows.copyRows(table, targets, generators);\n          });\n        });\n      };\n      var pasteOnSelection = function (execute) {\n        clipboardRows.get().each(function (rows) {\n          var clonedRows = map(rows, function (row) {\n            return deep(row);\n          });\n          getSelectionStartCell(editor).each(function (cell) {\n            getTableFromCell(cell).each(function (table) {\n              var doc = Element.fromDom(editor.getDoc());\n              var generators = TableFill.paste(doc);\n              var targets = TableTargets.pasteRows(selections, table, cell, clonedRows, generators);\n              execute(table, targets).each(function (rng) {\n                editor.selection.setRng(rng);\n                editor.focus();\n                cellSelection.clear(table);\n              });\n            });\n          });\n        });\n      };\n      each$3({\n        mceTableSplitCells: function () {\n          actOnSelection(actions.unmergeCells);\n        },\n        mceTableMergeCells: function () {\n          actOnSelection(actions.mergeCells);\n        },\n        mceTableInsertRowBefore: function () {\n          actOnSelection(actions.insertRowsBefore);\n        },\n        mceTableInsertRowAfter: function () {\n          actOnSelection(actions.insertRowsAfter);\n        },\n        mceTableInsertColBefore: function () {\n          actOnSelection(actions.insertColumnsBefore);\n        },\n        mceTableInsertColAfter: function () {\n          actOnSelection(actions.insertColumnsAfter);\n        },\n        mceTableDeleteCol: function () {\n          actOnSelection(actions.deleteColumn);\n        },\n        mceTableDeleteRow: function () {\n          actOnSelection(actions.deleteRow);\n        },\n        mceTableCutRow: function (grid) {\n          copyRowSelection().each(function (selection) {\n            clipboardRows.set(selection);\n            actOnSelection(actions.deleteRow);\n          });\n        },\n        mceTableCopyRow: function (grid) {\n          copyRowSelection().each(function (selection) {\n            clipboardRows.set(selection);\n          });\n        },\n        mceTablePasteRowBefore: function (grid) {\n          pasteOnSelection(actions.pasteRowsBefore);\n        },\n        mceTablePasteRowAfter: function (grid) {\n          pasteOnSelection(actions.pasteRowsAfter);\n        },\n        mceTableDelete: eraseTable\n      }, function (func, name) {\n        editor.addCommand(name, func);\n      });\n      each$3({\n        mceInsertTable: curry(TableDialog.open, editor, true),\n        mceTableProps: curry(TableDialog.open, editor, false),\n        mceTableRowProps: curry(RowDialog.open, editor),\n        mceTableCellProps: curry(CellDialog.open, editor)\n      }, function (func, name) {\n        editor.addCommand(name, function () {\n          func();\n        });\n      });\n    };\n    var Commands = { registerCommands: registerCommands };\n\n    var only = function (element) {\n      var parent = Option.from(element.dom().documentElement).map(Element.fromDom).getOr(element);\n      return {\n        parent: constant(parent),\n        view: constant(element),\n        origin: constant(Position(0, 0))\n      };\n    };\n    var detached = function (editable, chrome) {\n      var origin = function () {\n        return absolute(chrome);\n      };\n      return {\n        parent: constant(chrome),\n        view: constant(editable),\n        origin: origin\n      };\n    };\n    var body$1 = function (editable, chrome) {\n      return {\n        parent: constant(chrome),\n        view: constant(editable),\n        origin: constant(Position(0, 0))\n      };\n    };\n    var ResizeWire = {\n      only: only,\n      detached: detached,\n      body: body$1\n    };\n\n    var Event = function (fields) {\n      var struct = Immutable.apply(null, fields);\n      var handlers = [];\n      var bind = function (handler) {\n        if (handler === undefined) {\n          throw new Error('Event bind error: undefined handler');\n        }\n        handlers.push(handler);\n      };\n      var unbind = function (handler) {\n        handlers = filter(handlers, function (h) {\n          return h !== handler;\n        });\n      };\n      var trigger = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        var event = struct.apply(null, args);\n        each(handlers, function (handler) {\n          handler(event);\n        });\n      };\n      return {\n        bind: bind,\n        unbind: unbind,\n        trigger: trigger\n      };\n    };\n\n    var create$1 = function (typeDefs) {\n      var registry = map$1(typeDefs, function (event) {\n        return {\n          bind: event.bind,\n          unbind: event.unbind\n        };\n      });\n      var trigger = map$1(typeDefs, function (event) {\n        return event.trigger;\n      });\n      return {\n        registry: registry,\n        trigger: trigger\n      };\n    };\n    var Events = { create: create$1 };\n\n    var mkEvent = function (target, x, y, stop, prevent, kill, raw) {\n      return {\n        target: constant(target),\n        x: constant(x),\n        y: constant(y),\n        stop: stop,\n        prevent: prevent,\n        kill: kill,\n        raw: constant(raw)\n      };\n    };\n    var fromRawEvent = function (rawEvent) {\n      var target = Element.fromDom(rawEvent.target);\n      var stop = function () {\n        rawEvent.stopPropagation();\n      };\n      var prevent = function () {\n        rawEvent.preventDefault();\n      };\n      var kill = compose(prevent, stop);\n      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);\n    };\n    var handle = function (filter, handler) {\n      return function (rawEvent) {\n        if (!filter(rawEvent)) {\n          return;\n        }\n        handler(fromRawEvent(rawEvent));\n      };\n    };\n    var binder = function (element, event, filter, handler, useCapture) {\n      var wrapped = handle(filter, handler);\n      element.dom().addEventListener(event, wrapped, useCapture);\n      return { unbind: curry(unbind, element, event, wrapped, useCapture) };\n    };\n    var bind$1 = function (element, event, filter, handler) {\n      return binder(element, event, filter, handler, false);\n    };\n    var unbind = function (element, event, handler, useCapture) {\n      element.dom().removeEventListener(event, handler, useCapture);\n    };\n\n    var filter$1 = constant(true);\n    var bind$2 = function (element, event, handler) {\n      return bind$1(element, event, filter$1, handler);\n    };\n    var fromRawEvent$1 = fromRawEvent;\n\n    var styles$1 = css('ephox-dragster');\n    var Styles$2 = { resolve: styles$1.resolve };\n\n    var Blocker = function (options) {\n      var settings = __assign({ layerClass: Styles$2.resolve('blocker') }, options);\n      var div = Element.fromTag('div');\n      set(div, 'role', 'presentation');\n      setAll$1(div, {\n        position: 'fixed',\n        left: '0px',\n        top: '0px',\n        width: '100%',\n        height: '100%'\n      });\n      add$2(div, Styles$2.resolve('blocker'));\n      add$2(div, settings.layerClass);\n      var element = function () {\n        return div;\n      };\n      var destroy = function () {\n        remove$2(div);\n      };\n      return {\n        element: element,\n        destroy: destroy\n      };\n    };\n\n    var DragMode = exactly([\n      'compare',\n      'extract',\n      'mutate',\n      'sink'\n    ]);\n    var DragSink = exactly([\n      'element',\n      'start',\n      'stop',\n      'destroy'\n    ]);\n    var DragApi = exactly([\n      'forceDrop',\n      'drop',\n      'move',\n      'delayDrop'\n    ]);\n\n    var compare = function (old, nu) {\n      return Position(nu.left() - old.left(), nu.top() - old.top());\n    };\n    var extract$1 = function (event) {\n      return Option.some(Position(event.x(), event.y()));\n    };\n    var mutate = function (mutation, info) {\n      mutation.mutate(info.left(), info.top());\n    };\n    var sink = function (dragApi, settings) {\n      var blocker = Blocker(settings);\n      var mdown = bind$2(blocker.element(), 'mousedown', dragApi.forceDrop);\n      var mup = bind$2(blocker.element(), 'mouseup', dragApi.drop);\n      var mmove = bind$2(blocker.element(), 'mousemove', dragApi.move);\n      var mout = bind$2(blocker.element(), 'mouseout', dragApi.delayDrop);\n      var destroy = function () {\n        blocker.destroy();\n        mup.unbind();\n        mmove.unbind();\n        mout.unbind();\n        mdown.unbind();\n      };\n      var start = function (parent) {\n        append(parent, blocker.element());\n      };\n      var stop = function () {\n        remove$2(blocker.element());\n      };\n      return DragSink({\n        element: blocker.element,\n        start: start,\n        stop: stop,\n        destroy: destroy\n      });\n    };\n    var MouseDrag = DragMode({\n      compare: compare,\n      extract: extract$1,\n      sink: sink,\n      mutate: mutate\n    });\n\n    var last$2 = function (fn, rate) {\n      var timer = null;\n      var cancel = function () {\n        if (timer !== null) {\n          domGlobals.clearTimeout(timer);\n          timer = null;\n        }\n      };\n      var throttle = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        if (timer !== null) {\n          domGlobals.clearTimeout(timer);\n        }\n        timer = domGlobals.setTimeout(function () {\n          fn.apply(null, args);\n          timer = null;\n        }, rate);\n      };\n      return {\n        cancel: cancel,\n        throttle: throttle\n      };\n    };\n\n    function InDrag () {\n      var previous = Option.none();\n      var reset = function () {\n        previous = Option.none();\n      };\n      var update = function (mode, nu) {\n        var result = previous.map(function (old) {\n          return mode.compare(old, nu);\n        });\n        previous = Option.some(nu);\n        return result;\n      };\n      var onEvent = function (event, mode) {\n        var dataOption = mode.extract(event);\n        dataOption.each(function (data) {\n          var offset = update(mode, data);\n          offset.each(function (d) {\n            events.trigger.move(d);\n          });\n        });\n      };\n      var events = Events.create({ move: Event(['info']) });\n      return {\n        onEvent: onEvent,\n        reset: reset,\n        events: events.registry\n      };\n    }\n\n    function NoDrag () {\n      return {\n        onEvent: noop,\n        reset: noop\n      };\n    }\n\n    function Movement () {\n      var noDragState = NoDrag();\n      var inDragState = InDrag();\n      var dragState = noDragState;\n      var on = function () {\n        dragState.reset();\n        dragState = inDragState;\n      };\n      var off = function () {\n        dragState.reset();\n        dragState = noDragState;\n      };\n      var onEvent = function (event, mode) {\n        dragState.onEvent(event, mode);\n      };\n      var isOn = function () {\n        return dragState === inDragState;\n      };\n      return {\n        on: on,\n        off: off,\n        isOn: isOn,\n        onEvent: onEvent,\n        events: inDragState.events\n      };\n    }\n\n    var setup = function (mutation, mode, settings) {\n      var active = false;\n      var events = Events.create({\n        start: Event([]),\n        stop: Event([])\n      });\n      var movement = Movement();\n      var drop = function () {\n        sink.stop();\n        if (movement.isOn()) {\n          movement.off();\n          events.trigger.stop();\n        }\n      };\n      var throttledDrop = last$2(drop, 200);\n      var go = function (parent) {\n        sink.start(parent);\n        movement.on();\n        events.trigger.start();\n      };\n      var mousemove = function (event) {\n        throttledDrop.cancel();\n        movement.onEvent(event, mode);\n      };\n      movement.events.move.bind(function (event) {\n        mode.mutate(mutation, event.info());\n      });\n      var on = function () {\n        active = true;\n      };\n      var off = function () {\n        active = false;\n      };\n      var runIfActive = function (f) {\n        return function () {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          if (active) {\n            f.apply(null, args);\n          }\n        };\n      };\n      var sink = mode.sink(DragApi({\n        forceDrop: drop,\n        drop: runIfActive(drop),\n        move: runIfActive(mousemove),\n        delayDrop: runIfActive(throttledDrop.throttle)\n      }), settings);\n      var destroy = function () {\n        sink.destroy();\n      };\n      return {\n        element: sink.element,\n        go: go,\n        on: on,\n        off: off,\n        destroy: destroy,\n        events: events.registry\n      };\n    };\n    var Dragging = { setup: setup };\n\n    var transform$1 = function (mutation, settings) {\n      if (settings === void 0) {\n        settings = {};\n      }\n      var mode = settings.mode !== undefined ? settings.mode : MouseDrag;\n      return Dragging.setup(mutation, mode, settings);\n    };\n    var Dragger = { transform: transform$1 };\n\n    var Mutation = function () {\n      var events = Events.create({\n        drag: Event([\n          'xDelta',\n          'yDelta'\n        ])\n      });\n      var mutate = function (x, y) {\n        events.trigger.drag(x, y);\n      };\n      return {\n        mutate: mutate,\n        events: events.registry\n      };\n    };\n\n    var BarMutation = function () {\n      var events = Events.create({\n        drag: Event([\n          'xDelta',\n          'yDelta',\n          'target'\n        ])\n      });\n      var target = Option.none();\n      var delegate = Mutation();\n      delegate.events.drag.bind(function (event) {\n        target.each(function (t) {\n          events.trigger.drag(event.xDelta(), event.yDelta(), t);\n        });\n      });\n      var assign = function (t) {\n        target = Option.some(t);\n      };\n      var get = function () {\n        return target;\n      };\n      return {\n        assign: assign,\n        get: get,\n        mutate: delegate.mutate,\n        events: events.registry\n      };\n    };\n\n    var isContentEditableTrue = function (elm) {\n      return get$1(elm, 'contenteditable') === 'true';\n    };\n    var findClosestContentEditable = function (target, isRoot) {\n      return closest$1(target, '[contenteditable]', isRoot);\n    };\n\n    var resizeBarDragging = Styles.resolve('resizer-bar-dragging');\n    var BarManager = function (wire, direction, hdirection) {\n      var mutation = BarMutation();\n      var resizing = Dragger.transform(mutation, {});\n      var hoverTable = Option.none();\n      var getResizer = function (element, type) {\n        return Option.from(get$1(element, type));\n      };\n      mutation.events.drag.bind(function (event) {\n        getResizer(event.target(), 'data-row').each(function (_dataRow) {\n          var currentRow = CellUtils.getInt(event.target(), 'top');\n          set$1(event.target(), 'top', currentRow + event.yDelta() + 'px');\n        });\n        getResizer(event.target(), 'data-column').each(function (_dataCol) {\n          var currentCol = CellUtils.getInt(event.target(), 'left');\n          set$1(event.target(), 'left', currentCol + event.xDelta() + 'px');\n        });\n      });\n      var getDelta = function (target, dir) {\n        var newX = CellUtils.getInt(target, dir);\n        var oldX = parseInt(get$1(target, 'data-initial-' + dir), 10);\n        return newX - oldX;\n      };\n      resizing.events.stop.bind(function () {\n        mutation.get().each(function (target) {\n          hoverTable.each(function (table) {\n            getResizer(target, 'data-row').each(function (row) {\n              var delta = getDelta(target, 'top');\n              remove(target, 'data-initial-top');\n              events.trigger.adjustHeight(table, delta, parseInt(row, 10));\n            });\n            getResizer(target, 'data-column').each(function (column) {\n              var delta = getDelta(target, 'left');\n              remove(target, 'data-initial-left');\n              events.trigger.adjustWidth(table, delta, parseInt(column, 10));\n            });\n            Bars.refresh(wire, table, hdirection, direction);\n          });\n        });\n      });\n      var handler = function (target, dir) {\n        events.trigger.startAdjust();\n        mutation.assign(target);\n        set(target, 'data-initial-' + dir, parseInt(get$2(target, dir), 10));\n        add$2(target, resizeBarDragging);\n        set$1(target, 'opacity', '0.2');\n        resizing.go(wire.parent());\n      };\n      var mousedown = bind$2(wire.parent(), 'mousedown', function (event) {\n        if (Bars.isRowBar(event.target())) {\n          handler(event.target(), 'top');\n        }\n        if (Bars.isColBar(event.target())) {\n          handler(event.target(), 'left');\n        }\n      });\n      var isRoot = function (e) {\n        return eq(e, wire.view());\n      };\n      var findClosestEditableTable = function (target) {\n        return closest$1(target, 'table', isRoot).filter(function (table) {\n          return findClosestContentEditable(table, isRoot).exists(isContentEditableTrue);\n        });\n      };\n      var mouseover = bind$2(wire.view(), 'mouseover', function (event) {\n        findClosestEditableTable(event.target()).fold(function () {\n          if (inBody(event.target())) {\n            Bars.destroy(wire);\n          }\n        }, function (table) {\n          hoverTable = Option.some(table);\n          Bars.refresh(wire, table, hdirection, direction);\n        });\n      });\n      var destroy = function () {\n        mousedown.unbind();\n        mouseover.unbind();\n        resizing.destroy();\n        Bars.destroy(wire);\n      };\n      var refresh = function (tbl) {\n        Bars.refresh(wire, tbl, hdirection, direction);\n      };\n      var events = Events.create({\n        adjustHeight: Event([\n          'table',\n          'delta',\n          'row'\n        ]),\n        adjustWidth: Event([\n          'table',\n          'delta',\n          'column'\n        ]),\n        startAdjust: Event([])\n      });\n      return {\n        destroy: destroy,\n        refresh: refresh,\n        on: resizing.on,\n        off: resizing.off,\n        hideBars: curry(Bars.hide, wire),\n        showBars: curry(Bars.show, wire),\n        events: events.registry\n      };\n    };\n\n    var create$2 = function (wire, vdirection) {\n      var hdirection = BarPositions.height;\n      var manager = BarManager(wire, vdirection, hdirection);\n      var events = Events.create({\n        beforeResize: Event(['table']),\n        afterResize: Event(['table']),\n        startDrag: Event([])\n      });\n      manager.events.adjustHeight.bind(function (event) {\n        events.trigger.beforeResize(event.table());\n        var delta = hdirection.delta(event.delta(), event.table());\n        Adjustments.adjustHeight(event.table(), delta, event.row(), hdirection);\n        events.trigger.afterResize(event.table());\n      });\n      manager.events.startAdjust.bind(function (event) {\n        events.trigger.startDrag();\n      });\n      manager.events.adjustWidth.bind(function (event) {\n        events.trigger.beforeResize(event.table());\n        var delta = vdirection.delta(event.delta(), event.table());\n        Adjustments.adjustWidth(event.table(), delta, event.column(), vdirection);\n        events.trigger.afterResize(event.table());\n      });\n      return {\n        on: manager.on,\n        off: manager.off,\n        hideBars: manager.hideBars,\n        showBars: manager.showBars,\n        destroy: manager.destroy,\n        events: events.registry\n      };\n    };\n    var TableResize = { create: create$2 };\n\n    var createContainer = function () {\n      var container = Element.fromTag('div');\n      setAll$1(container, {\n        position: 'static',\n        height: '0',\n        width: '0',\n        padding: '0',\n        margin: '0',\n        border: '0'\n      });\n      append(body(), container);\n      return container;\n    };\n    var get$9 = function (editor, container) {\n      return editor.inline ? ResizeWire.body(getBody$1(editor), createContainer()) : ResizeWire.only(Element.fromDom(editor.getDoc()));\n    };\n    var remove$6 = function (editor, wire) {\n      if (editor.inline) {\n        remove$2(wire.parent());\n      }\n    };\n    var TableWire = {\n      get: get$9,\n      remove: remove$6\n    };\n\n    var calculatePercentageWidth = function (element, parent) {\n      return getPixelWidth$1(element.dom()) / getPixelWidth$1(parent.dom()) * 100 + '%';\n    };\n    var enforcePercentage = function (rawTable) {\n      var table = Element.fromDom(rawTable);\n      parent(table).map(function (parent) {\n        return calculatePercentageWidth(table, parent);\n      }).each(function (tablePercentage) {\n        set$1(table, 'width', tablePercentage);\n        each(descendants$1(table, 'tr'), function (tr) {\n          each(children(tr), function (td) {\n            set$1(td, 'width', calculatePercentageWidth(td, tr));\n          });\n        });\n      });\n    };\n    var enforcePixels = function (table) {\n      set$1(Element.fromDom(table), 'width', getPixelWidth$1(table).toString() + 'px');\n    };\n\n    var getResizeHandler = function (editor) {\n      var selectionRng = Option.none();\n      var resize = Option.none();\n      var wire = Option.none();\n      var percentageBasedSizeRegex = /(\\d+(\\.\\d+)?)%/;\n      var startW;\n      var startRawW;\n      var isTable = function (elm) {\n        return elm.nodeName === 'TABLE';\n      };\n      var getRawWidth = function (elm) {\n        var raw = editor.dom.getStyle(elm, 'width') || editor.dom.getAttrib(elm, 'width');\n        return Option.from(raw).filter(function (s) {\n          return s.length > 0;\n        });\n      };\n      var lazyResize = function () {\n        return resize;\n      };\n      var lazyWire = function () {\n        return wire.getOr(ResizeWire.only(Element.fromDom(editor.getBody())));\n      };\n      var destroy = function () {\n        resize.each(function (sz) {\n          sz.destroy();\n        });\n        wire.each(function (w) {\n          TableWire.remove(editor, w);\n        });\n      };\n      editor.on('init', function () {\n        var direction = TableDirection(Direction.directionAt);\n        var rawWire = TableWire.get(editor);\n        wire = Option.some(rawWire);\n        if (hasObjectResizing(editor) && hasTableResizeBars(editor)) {\n          var sz = TableResize.create(rawWire, direction);\n          sz.on();\n          sz.events.startDrag.bind(function (event) {\n            selectionRng = Option.some(editor.selection.getRng());\n          });\n          sz.events.beforeResize.bind(function (event) {\n            var rawTable = event.table().dom();\n            fireObjectResizeStart(editor, rawTable, getPixelWidth$1(rawTable), getPixelHeight(rawTable));\n          });\n          sz.events.afterResize.bind(function (event) {\n            var table = event.table();\n            var rawTable = table.dom();\n            removeDataStyle(table);\n            selectionRng.each(function (rng) {\n              editor.selection.setRng(rng);\n              editor.focus();\n            });\n            fireObjectResized(editor, rawTable, getPixelWidth$1(rawTable), getPixelHeight(rawTable));\n            editor.undoManager.add();\n          });\n          resize = Option.some(sz);\n        }\n      });\n      editor.on('ObjectResizeStart', function (e) {\n        var targetElm = e.target;\n        if (isTable(targetElm)) {\n          var tableHasPercentage = getRawWidth(targetElm).map(function (w) {\n            return percentageBasedSizeRegex.test(w);\n          }).getOr(false);\n          if (tableHasPercentage && isPixelsForced(editor)) {\n            enforcePixels(targetElm);\n          } else if (!tableHasPercentage && isPercentagesForced(editor)) {\n            enforcePercentage(targetElm);\n          }\n          startW = e.width;\n          startRawW = getRawWidth(targetElm).getOr('');\n        }\n      });\n      editor.on('ObjectResized', function (e) {\n        var targetElm = e.target;\n        if (isTable(targetElm)) {\n          var table = targetElm;\n          if (percentageBasedSizeRegex.test(startRawW)) {\n            var percentW = parseFloat(percentageBasedSizeRegex.exec(startRawW)[1]);\n            var targetPercentW = e.width * percentW / startW;\n            editor.dom.setStyle(table, 'width', targetPercentW + '%');\n          } else {\n            var newCellSizes_1 = [];\n            global$1.each(table.rows, function (row) {\n              global$1.each(row.cells, function (cell) {\n                var width = editor.dom.getStyle(cell, 'width', true);\n                newCellSizes_1.push({\n                  cell: cell,\n                  width: width\n                });\n              });\n            });\n            global$1.each(newCellSizes_1, function (newCellSize) {\n              editor.dom.setStyle(newCellSize.cell, 'width', newCellSize.width);\n              editor.dom.setAttrib(newCellSize.cell, 'width', null);\n            });\n          }\n        }\n      });\n      editor.on('SwitchMode', function () {\n        lazyResize().each(function (resize) {\n          if (editor.mode.isReadOnly()) {\n            resize.hideBars();\n          } else {\n            resize.showBars();\n          }\n        });\n      });\n      return {\n        lazyResize: lazyResize,\n        lazyWire: lazyWire,\n        destroy: destroy\n      };\n    };\n\n    var adt$1 = Adt.generate([\n      { none: ['current'] },\n      { first: ['current'] },\n      {\n        middle: [\n          'current',\n          'target'\n        ]\n      },\n      { last: ['current'] }\n    ]);\n    var none$1 = function (current) {\n      if (current === void 0) {\n        current = undefined;\n      }\n      return adt$1.none(current);\n    };\n    var CellLocation = __assign(__assign({}, adt$1), { none: none$1 });\n\n    var detect$4 = function (current, isRoot) {\n      return TableLookup.table(current, isRoot).bind(function (table) {\n        var all = TableLookup.cells(table);\n        var index = findIndex(all, function (x) {\n          return eq(current, x);\n        });\n        return index.map(function (ind) {\n          return {\n            index: constant(ind),\n            all: constant(all)\n          };\n        });\n      });\n    };\n    var next = function (current, isRoot) {\n      var detection = detect$4(current, isRoot);\n      return detection.fold(function () {\n        return CellLocation.none(current);\n      }, function (info) {\n        return info.index() + 1 < info.all().length ? CellLocation.middle(current, info.all()[info.index() + 1]) : CellLocation.last(current);\n      });\n    };\n    var prev = function (current, isRoot) {\n      var detection = detect$4(current, isRoot);\n      return detection.fold(function () {\n        return CellLocation.none();\n      }, function (info) {\n        return info.index() - 1 >= 0 ? CellLocation.middle(current, info.all()[info.index() - 1]) : CellLocation.first(current);\n      });\n    };\n    var CellNavigation = {\n      next: next,\n      prev: prev\n    };\n\n    var create$3 = Immutable('start', 'soffset', 'finish', 'foffset');\n    var SimRange = { create: create$3 };\n\n    var adt$2 = Adt.generate([\n      { before: ['element'] },\n      {\n        on: [\n          'element',\n          'offset'\n        ]\n      },\n      { after: ['element'] }\n    ]);\n    var cata$1 = function (subject, onBefore, onOn, onAfter) {\n      return subject.fold(onBefore, onOn, onAfter);\n    };\n    var getStart = function (situ) {\n      return situ.fold(identity, identity, identity);\n    };\n    var before$2 = adt$2.before;\n    var on = adt$2.on;\n    var after$2 = adt$2.after;\n    var Situ = {\n      before: before$2,\n      on: on,\n      after: after$2,\n      cata: cata$1,\n      getStart: getStart\n    };\n\n    var adt$3 = Adt.generate([\n      { domRange: ['rng'] },\n      {\n        relative: [\n          'startSitu',\n          'finishSitu'\n        ]\n      },\n      {\n        exact: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    var exactFromRange = function (simRange) {\n      return adt$3.exact(simRange.start(), simRange.soffset(), simRange.finish(), simRange.foffset());\n    };\n    var getStart$1 = function (selection) {\n      return selection.match({\n        domRange: function (rng) {\n          return Element.fromDom(rng.startContainer);\n        },\n        relative: function (startSitu, finishSitu) {\n          return Situ.getStart(startSitu);\n        },\n        exact: function (start, soffset, finish, foffset) {\n          return start;\n        }\n      });\n    };\n    var domRange = adt$3.domRange;\n    var relative = adt$3.relative;\n    var exact = adt$3.exact;\n    var getWin = function (selection) {\n      var start = getStart$1(selection);\n      return defaultView(start);\n    };\n    var range$2 = SimRange.create;\n    var Selection = {\n      domRange: domRange,\n      relative: relative,\n      exact: exact,\n      exactFromRange: exactFromRange,\n      getWin: getWin,\n      range: range$2\n    };\n\n    var selectNodeContents = function (win, element) {\n      var rng = win.document.createRange();\n      selectNodeContentsUsing(rng, element);\n      return rng;\n    };\n    var selectNodeContentsUsing = function (rng, element) {\n      rng.selectNodeContents(element.dom());\n    };\n    var setStart = function (rng, situ) {\n      situ.fold(function (e) {\n        rng.setStartBefore(e.dom());\n      }, function (e, o) {\n        rng.setStart(e.dom(), o);\n      }, function (e) {\n        rng.setStartAfter(e.dom());\n      });\n    };\n    var setFinish = function (rng, situ) {\n      situ.fold(function (e) {\n        rng.setEndBefore(e.dom());\n      }, function (e, o) {\n        rng.setEnd(e.dom(), o);\n      }, function (e) {\n        rng.setEndAfter(e.dom());\n      });\n    };\n    var relativeToNative = function (win, startSitu, finishSitu) {\n      var range = win.document.createRange();\n      setStart(range, startSitu);\n      setFinish(range, finishSitu);\n      return range;\n    };\n    var exactToNative = function (win, start, soffset, finish, foffset) {\n      var rng = win.document.createRange();\n      rng.setStart(start.dom(), soffset);\n      rng.setEnd(finish.dom(), foffset);\n      return rng;\n    };\n    var toRect = function (rect) {\n      return {\n        left: constant(rect.left),\n        top: constant(rect.top),\n        right: constant(rect.right),\n        bottom: constant(rect.bottom),\n        width: constant(rect.width),\n        height: constant(rect.height)\n      };\n    };\n    var getFirstRect = function (rng) {\n      var rects = rng.getClientRects();\n      var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect();\n      return rect.width > 0 || rect.height > 0 ? Option.some(rect).map(toRect) : Option.none();\n    };\n\n    var adt$4 = Adt.generate([\n      {\n        ltr: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      },\n      {\n        rtl: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    var fromRange = function (win, type, range) {\n      return type(Element.fromDom(range.startContainer), range.startOffset, Element.fromDom(range.endContainer), range.endOffset);\n    };\n    var getRanges = function (win, selection) {\n      return selection.match({\n        domRange: function (rng) {\n          return {\n            ltr: constant(rng),\n            rtl: Option.none\n          };\n        },\n        relative: function (startSitu, finishSitu) {\n          return {\n            ltr: cached(function () {\n              return relativeToNative(win, startSitu, finishSitu);\n            }),\n            rtl: cached(function () {\n              return Option.some(relativeToNative(win, finishSitu, startSitu));\n            })\n          };\n        },\n        exact: function (start, soffset, finish, foffset) {\n          return {\n            ltr: cached(function () {\n              return exactToNative(win, start, soffset, finish, foffset);\n            }),\n            rtl: cached(function () {\n              return Option.some(exactToNative(win, finish, foffset, start, soffset));\n            })\n          };\n        }\n      });\n    };\n    var doDiagnose = function (win, ranges) {\n      var rng = ranges.ltr();\n      if (rng.collapsed) {\n        var reversed = ranges.rtl().filter(function (rev) {\n          return rev.collapsed === false;\n        });\n        return reversed.map(function (rev) {\n          return adt$4.rtl(Element.fromDom(rev.endContainer), rev.endOffset, Element.fromDom(rev.startContainer), rev.startOffset);\n        }).getOrThunk(function () {\n          return fromRange(win, adt$4.ltr, rng);\n        });\n      } else {\n        return fromRange(win, adt$4.ltr, rng);\n      }\n    };\n    var diagnose = function (win, selection) {\n      var ranges = getRanges(win, selection);\n      return doDiagnose(win, ranges);\n    };\n    var asLtrRange = function (win, selection) {\n      var diagnosis = diagnose(win, selection);\n      return diagnosis.match({\n        ltr: function (start, soffset, finish, foffset) {\n          var rng = win.document.createRange();\n          rng.setStart(start.dom(), soffset);\n          rng.setEnd(finish.dom(), foffset);\n          return rng;\n        },\n        rtl: function (start, soffset, finish, foffset) {\n          var rng = win.document.createRange();\n          rng.setStart(finish.dom(), foffset);\n          rng.setEnd(start.dom(), soffset);\n          return rng;\n        }\n      });\n    };\n    var ltr$2 = adt$4.ltr;\n    var rtl$2 = adt$4.rtl;\n\n    var searchForPoint = function (rectForOffset, x, y, maxX, length) {\n      if (length === 0) {\n        return 0;\n      } else if (x === maxX) {\n        return length - 1;\n      }\n      var xDelta = maxX;\n      for (var i = 1; i < length; i++) {\n        var rect = rectForOffset(i);\n        var curDeltaX = Math.abs(x - rect.left);\n        if (y <= rect.bottom) {\n          if (y < rect.top || curDeltaX > xDelta) {\n            return i - 1;\n          } else {\n            xDelta = curDeltaX;\n          }\n        }\n      }\n      return 0;\n    };\n    var inRect = function (rect, x, y) {\n      return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n    };\n\n    var locateOffset = function (doc, textnode, x, y, rect) {\n      var rangeForOffset = function (o) {\n        var r = doc.dom().createRange();\n        r.setStart(textnode.dom(), o);\n        r.collapse(true);\n        return r;\n      };\n      var rectForOffset = function (o) {\n        var r = rangeForOffset(o);\n        return r.getBoundingClientRect();\n      };\n      var length = get$3(textnode).length;\n      var offset = searchForPoint(rectForOffset, x, y, rect.right, length);\n      return rangeForOffset(offset);\n    };\n    var locate = function (doc, node, x, y) {\n      var r = doc.dom().createRange();\n      r.selectNode(node.dom());\n      var rects = r.getClientRects();\n      var foundRect = findMap(rects, function (rect) {\n        return inRect(rect, x, y) ? Option.some(rect) : Option.none();\n      });\n      return foundRect.map(function (rect) {\n        return locateOffset(doc, node, x, y, rect);\n      });\n    };\n\n    var searchInChildren = function (doc, node, x, y) {\n      var r = doc.dom().createRange();\n      var nodes = children(node);\n      return findMap(nodes, function (n) {\n        r.selectNode(n.dom());\n        return inRect(r.getBoundingClientRect(), x, y) ? locateNode(doc, n, x, y) : Option.none();\n      });\n    };\n    var locateNode = function (doc, node, x, y) {\n      return isText(node) ? locate(doc, node, x, y) : searchInChildren(doc, node, x, y);\n    };\n    var locate$1 = function (doc, node, x, y) {\n      var r = doc.dom().createRange();\n      r.selectNode(node.dom());\n      var rect = r.getBoundingClientRect();\n      var boundedX = Math.max(rect.left, Math.min(rect.right, x));\n      var boundedY = Math.max(rect.top, Math.min(rect.bottom, y));\n      return locateNode(doc, node, boundedX, boundedY);\n    };\n\n    var COLLAPSE_TO_LEFT = true;\n    var COLLAPSE_TO_RIGHT = false;\n    var getCollapseDirection = function (rect, x) {\n      return x - rect.left < rect.right - x ? COLLAPSE_TO_LEFT : COLLAPSE_TO_RIGHT;\n    };\n    var createCollapsedNode = function (doc, target, collapseDirection) {\n      var r = doc.dom().createRange();\n      r.selectNode(target.dom());\n      r.collapse(collapseDirection);\n      return r;\n    };\n    var locateInElement = function (doc, node, x) {\n      var cursorRange = doc.dom().createRange();\n      cursorRange.selectNode(node.dom());\n      var rect = cursorRange.getBoundingClientRect();\n      var collapseDirection = getCollapseDirection(rect, x);\n      var f = collapseDirection === COLLAPSE_TO_LEFT ? first : last$1;\n      return f(node).map(function (target) {\n        return createCollapsedNode(doc, target, collapseDirection);\n      });\n    };\n    var locateInEmpty = function (doc, node, x) {\n      var rect = node.dom().getBoundingClientRect();\n      var collapseDirection = getCollapseDirection(rect, x);\n      return Option.some(createCollapsedNode(doc, node, collapseDirection));\n    };\n    var search = function (doc, node, x) {\n      var f = children(node).length === 0 ? locateInEmpty : locateInElement;\n      return f(doc, node, x);\n    };\n\n    var caretPositionFromPoint = function (doc, x, y) {\n      return Option.from(doc.dom().caretPositionFromPoint(x, y)).bind(function (pos) {\n        if (pos.offsetNode === null) {\n          return Option.none();\n        }\n        var r = doc.dom().createRange();\n        r.setStart(pos.offsetNode, pos.offset);\n        r.collapse();\n        return Option.some(r);\n      });\n    };\n    var caretRangeFromPoint = function (doc, x, y) {\n      return Option.from(doc.dom().caretRangeFromPoint(x, y));\n    };\n    var searchTextNodes = function (doc, node, x, y) {\n      var r = doc.dom().createRange();\n      r.selectNode(node.dom());\n      var rect = r.getBoundingClientRect();\n      var boundedX = Math.max(rect.left, Math.min(rect.right, x));\n      var boundedY = Math.max(rect.top, Math.min(rect.bottom, y));\n      return locate$1(doc, node, boundedX, boundedY);\n    };\n    var searchFromPoint = function (doc, x, y) {\n      return Element.fromPoint(doc, x, y).bind(function (elem) {\n        var fallback = function () {\n          return search(doc, elem, x);\n        };\n        return children(elem).length === 0 ? fallback() : searchTextNodes(doc, elem, x, y).orThunk(fallback);\n      });\n    };\n    var availableSearch = document.caretPositionFromPoint ? caretPositionFromPoint : document.caretRangeFromPoint ? caretRangeFromPoint : searchFromPoint;\n    var fromPoint$1 = function (win, x, y) {\n      var doc = Element.fromDom(win.document);\n      return availableSearch(doc, x, y).map(function (rng) {\n        return SimRange.create(Element.fromDom(rng.startContainer), rng.startOffset, Element.fromDom(rng.endContainer), rng.endOffset);\n      });\n    };\n\n    var beforeSpecial = function (element, offset) {\n      var name$1 = name(element);\n      if ('input' === name$1) {\n        return Situ.after(element);\n      } else if (!contains([\n          'br',\n          'img'\n        ], name$1)) {\n        return Situ.on(element, offset);\n      } else {\n        return offset === 0 ? Situ.before(element) : Situ.after(element);\n      }\n    };\n    var preprocessRelative = function (startSitu, finishSitu) {\n      var start = startSitu.fold(Situ.before, beforeSpecial, Situ.after);\n      var finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after);\n      return Selection.relative(start, finish);\n    };\n    var preprocessExact = function (start, soffset, finish, foffset) {\n      var startSitu = beforeSpecial(start, soffset);\n      var finishSitu = beforeSpecial(finish, foffset);\n      return Selection.relative(startSitu, finishSitu);\n    };\n    var preprocess = function (selection) {\n      return selection.match({\n        domRange: function (rng) {\n          var start = Element.fromDom(rng.startContainer);\n          var finish = Element.fromDom(rng.endContainer);\n          return preprocessExact(start, rng.startOffset, finish, rng.endOffset);\n        },\n        relative: preprocessRelative,\n        exact: preprocessExact\n      });\n    };\n\n    var makeRange = function (start, soffset, finish, foffset) {\n      var doc = owner(start);\n      var rng = doc.dom().createRange();\n      rng.setStart(start.dom(), soffset);\n      rng.setEnd(finish.dom(), foffset);\n      return rng;\n    };\n    var after$3 = function (start, soffset, finish, foffset) {\n      var r = makeRange(start, soffset, finish, foffset);\n      var same = eq(start, finish) && soffset === foffset;\n      return r.collapsed && !same;\n    };\n\n    var doSetNativeRange = function (win, rng) {\n      Option.from(win.getSelection()).each(function (selection) {\n        selection.removeAllRanges();\n        selection.addRange(rng);\n      });\n    };\n    var doSetRange = function (win, start, soffset, finish, foffset) {\n      var rng = exactToNative(win, start, soffset, finish, foffset);\n      doSetNativeRange(win, rng);\n    };\n    var setLegacyRtlRange = function (win, selection, start, soffset, finish, foffset) {\n      selection.collapse(start.dom(), soffset);\n      selection.extend(finish.dom(), foffset);\n    };\n    var setRangeFromRelative = function (win, relative) {\n      return diagnose(win, relative).match({\n        ltr: function (start, soffset, finish, foffset) {\n          doSetRange(win, start, soffset, finish, foffset);\n        },\n        rtl: function (start, soffset, finish, foffset) {\n          var selection = win.getSelection();\n          if (selection.setBaseAndExtent) {\n            selection.setBaseAndExtent(start.dom(), soffset, finish.dom(), foffset);\n          } else if (selection.extend) {\n            try {\n              setLegacyRtlRange(win, selection, start, soffset, finish, foffset);\n            } catch (e) {\n              doSetRange(win, finish, foffset, start, soffset);\n            }\n          } else {\n            doSetRange(win, finish, foffset, start, soffset);\n          }\n        }\n      });\n    };\n    var setExact = function (win, start, soffset, finish, foffset) {\n      var relative = preprocessExact(start, soffset, finish, foffset);\n      setRangeFromRelative(win, relative);\n    };\n    var setRelative = function (win, startSitu, finishSitu) {\n      var relative = preprocessRelative(startSitu, finishSitu);\n      setRangeFromRelative(win, relative);\n    };\n    var toNative = function (selection) {\n      var win = Selection.getWin(selection).dom();\n      var getDomRange = function (start, soffset, finish, foffset) {\n        return exactToNative(win, start, soffset, finish, foffset);\n      };\n      var filtered = preprocess(selection);\n      return diagnose(win, filtered).match({\n        ltr: getDomRange,\n        rtl: getDomRange\n      });\n    };\n    var readRange = function (selection) {\n      if (selection.rangeCount > 0) {\n        var firstRng = selection.getRangeAt(0);\n        var lastRng = selection.getRangeAt(selection.rangeCount - 1);\n        return Option.some(SimRange.create(Element.fromDom(firstRng.startContainer), firstRng.startOffset, Element.fromDom(lastRng.endContainer), lastRng.endOffset));\n      } else {\n        return Option.none();\n      }\n    };\n    var doGetExact = function (selection) {\n      var anchor = Element.fromDom(selection.anchorNode);\n      var focus = Element.fromDom(selection.focusNode);\n      return after$3(anchor, selection.anchorOffset, focus, selection.focusOffset) ? Option.some(SimRange.create(anchor, selection.anchorOffset, focus, selection.focusOffset)) : readRange(selection);\n    };\n    var setToElement = function (win, element) {\n      var rng = selectNodeContents(win, element);\n      doSetNativeRange(win, rng);\n    };\n    var getExact = function (win) {\n      return Option.from(win.getSelection()).filter(function (sel) {\n        return sel.rangeCount > 0;\n      }).bind(doGetExact);\n    };\n    var get$a = function (win) {\n      return getExact(win).map(function (range) {\n        return Selection.exact(range.start(), range.soffset(), range.finish(), range.foffset());\n      });\n    };\n    var getFirstRect$1 = function (win, selection) {\n      var rng = asLtrRange(win, selection);\n      return getFirstRect(rng);\n    };\n    var getAtPoint = function (win, x, y) {\n      return fromPoint$1(win, x, y);\n    };\n    var clear = function (win) {\n      var selection = win.getSelection();\n      selection.removeAllRanges();\n    };\n\n    var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK');\n\n    var forward = function (editor, isRoot, cell, lazyWire) {\n      return go(editor, isRoot, CellNavigation.next(cell), lazyWire);\n    };\n    var backward = function (editor, isRoot, cell, lazyWire) {\n      return go(editor, isRoot, CellNavigation.prev(cell), lazyWire);\n    };\n    var getCellFirstCursorPosition = function (editor, cell) {\n      var selection = Selection.exact(cell, 0, cell, 0);\n      return toNative(selection);\n    };\n    var getNewRowCursorPosition = function (editor, table) {\n      var rows = descendants$1(table, 'tr');\n      return last(rows).bind(function (last) {\n        return descendant$1(last, 'td,th').map(function (first) {\n          return getCellFirstCursorPosition(editor, first);\n        });\n      });\n    };\n    var go = function (editor, isRoot, cell, actions, lazyWire) {\n      return cell.fold(Option.none, Option.none, function (current, next) {\n        return first(next).map(function (cell) {\n          return getCellFirstCursorPosition(editor, cell);\n        });\n      }, function (current) {\n        return TableLookup.table(current, isRoot).bind(function (table) {\n          var targets = TableTargets.noMenu(current);\n          editor.undoManager.transact(function () {\n            actions.insertRowsAfter(table, targets);\n          });\n          return getNewRowCursorPosition(editor, table);\n        });\n      });\n    };\n    var rootElements = [\n      'table',\n      'li',\n      'dl'\n    ];\n    var handle$1 = function (event, editor, actions, lazyWire) {\n      if (event.keyCode === global$3.TAB) {\n        var body_1 = getBody$1(editor);\n        var isRoot_1 = function (element) {\n          var name$1 = name(element);\n          return eq(element, body_1) || contains(rootElements, name$1);\n        };\n        var rng = editor.selection.getRng();\n        if (rng.collapsed) {\n          var start = Element.fromDom(rng.startContainer);\n          TableLookup.cell(start, isRoot_1).each(function (cell) {\n            event.preventDefault();\n            var navigation = event.shiftKey ? backward : forward;\n            var rng = navigation(editor, isRoot_1, cell, actions, lazyWire);\n            rng.each(function (range) {\n              editor.selection.setRng(range);\n            });\n          });\n        }\n      }\n    };\n    var TabContext = { handle: handle$1 };\n\n    var create$4 = Immutable('selection', 'kill');\n    var Response = { create: create$4 };\n\n    var create$5 = function (start, soffset, finish, foffset) {\n      return {\n        start: constant(Situ.on(start, soffset)),\n        finish: constant(Situ.on(finish, foffset))\n      };\n    };\n    var Situs = { create: create$5 };\n\n    var convertToRange = function (win, selection) {\n      var rng = asLtrRange(win, selection);\n      return SimRange.create(Element.fromDom(rng.startContainer), rng.startOffset, Element.fromDom(rng.endContainer), rng.endOffset);\n    };\n    var makeSitus = Situs.create;\n    var Util = {\n      convertToRange: convertToRange,\n      makeSitus: makeSitus\n    };\n\n    var sync = function (container, isRoot, start, soffset, finish, foffset, selectRange) {\n      if (!(eq(start, finish) && soffset === foffset)) {\n        return closest$1(start, 'td,th', isRoot).bind(function (s) {\n          return closest$1(finish, 'td,th', isRoot).bind(function (f) {\n            return detect$5(container, isRoot, s, f, selectRange);\n          });\n        });\n      } else {\n        return Option.none();\n      }\n    };\n    var detect$5 = function (container, isRoot, start, finish, selectRange) {\n      if (!eq(start, finish)) {\n        return CellSelection.identify(start, finish, isRoot).bind(function (cellSel) {\n          var boxes = cellSel.boxes().getOr([]);\n          if (boxes.length > 0) {\n            selectRange(container, boxes, cellSel.start(), cellSel.finish());\n            return Option.some(Response.create(Option.some(Util.makeSitus(start, 0, start, getEnd(start))), true));\n          } else {\n            return Option.none();\n          }\n        });\n      } else {\n        return Option.none();\n      }\n    };\n    var update = function (rows, columns, container, selected, annotations) {\n      var updateSelection = function (newSels) {\n        annotations.clearBeforeUpdate(container);\n        annotations.selectRange(container, newSels.boxes(), newSels.start(), newSels.finish());\n        return newSels.boxes();\n      };\n      return CellSelection.shiftSelection(selected, rows, columns, annotations.firstSelectedSelector(), annotations.lastSelectedSelector()).map(updateSelection);\n    };\n    var KeySelection = {\n      sync: sync,\n      detect: detect$5,\n      update: update\n    };\n\n    var traverse = Immutable('item', 'mode');\n    var backtrack = function (universe, item, _direction, transition) {\n      if (transition === void 0) {\n        transition = sidestep;\n      }\n      return universe.property().parent(item).map(function (p) {\n        return traverse(p, transition);\n      });\n    };\n    var sidestep = function (universe, item, direction, transition) {\n      if (transition === void 0) {\n        transition = advance;\n      }\n      return direction.sibling(universe, item).map(function (p) {\n        return traverse(p, transition);\n      });\n    };\n    var advance = function (universe, item, direction, transition) {\n      if (transition === void 0) {\n        transition = advance;\n      }\n      var children = universe.property().children(item);\n      var result = direction.first(children);\n      return result.map(function (r) {\n        return traverse(r, transition);\n      });\n    };\n    var successors = [\n      {\n        current: backtrack,\n        next: sidestep,\n        fallback: Option.none()\n      },\n      {\n        current: sidestep,\n        next: advance,\n        fallback: Option.some(backtrack)\n      },\n      {\n        current: advance,\n        next: advance,\n        fallback: Option.some(sidestep)\n      }\n    ];\n    var go$1 = function (universe, item, mode, direction, rules) {\n      if (rules === void 0) {\n        rules = successors;\n      }\n      var ruleOpt = find(rules, function (succ) {\n        return succ.current === mode;\n      });\n      return ruleOpt.bind(function (rule) {\n        return rule.current(universe, item, direction, rule.next).orThunk(function () {\n          return rule.fallback.bind(function (fb) {\n            return go$1(universe, item, fb, direction);\n          });\n        });\n      });\n    };\n\n    var left = function () {\n      var sibling = function (universe, item) {\n        return universe.query().prevSibling(item);\n      };\n      var first = function (children) {\n        return children.length > 0 ? Option.some(children[children.length - 1]) : Option.none();\n      };\n      return {\n        sibling: sibling,\n        first: first\n      };\n    };\n    var right = function () {\n      var sibling = function (universe, item) {\n        return universe.query().nextSibling(item);\n      };\n      var first = function (children) {\n        return children.length > 0 ? Option.some(children[0]) : Option.none();\n      };\n      return {\n        sibling: sibling,\n        first: first\n      };\n    };\n    var Walkers = {\n      left: left,\n      right: right\n    };\n\n    var hone = function (universe, item, predicate, mode, direction, isRoot) {\n      var next = go$1(universe, item, mode, direction);\n      return next.bind(function (n) {\n        if (isRoot(n.item())) {\n          return Option.none();\n        } else {\n          return predicate(n.item()) ? Option.some(n.item()) : hone(universe, n.item(), predicate, n.mode(), direction, isRoot);\n        }\n      });\n    };\n    var left$1 = function (universe, item, predicate, isRoot) {\n      return hone(universe, item, predicate, sidestep, Walkers.left(), isRoot);\n    };\n    var right$1 = function (universe, item, predicate, isRoot) {\n      return hone(universe, item, predicate, sidestep, Walkers.right(), isRoot);\n    };\n\n    var isLeaf = function (universe) {\n      return function (element) {\n        return universe.property().children(element).length === 0;\n      };\n    };\n    var before$3 = function (universe, item, isRoot) {\n      return seekLeft(universe, item, isLeaf(universe), isRoot);\n    };\n    var after$4 = function (universe, item, isRoot) {\n      return seekRight(universe, item, isLeaf(universe), isRoot);\n    };\n    var seekLeft = left$1;\n    var seekRight = right$1;\n\n    var universe$3 = DomUniverse();\n    var before$4 = function (element, isRoot) {\n      return before$3(universe$3, element, isRoot);\n    };\n    var after$5 = function (element, isRoot) {\n      return after$4(universe$3, element, isRoot);\n    };\n    var seekLeft$1 = function (element, predicate, isRoot) {\n      return seekLeft(universe$3, element, predicate, isRoot);\n    };\n    var seekRight$1 = function (element, predicate, isRoot) {\n      return seekRight(universe$3, element, predicate, isRoot);\n    };\n\n    var ancestor$2 = function (scope, predicate, isRoot) {\n      return ancestor(scope, predicate, isRoot).isSome();\n    };\n\n    var adt$5 = Adt.generate([\n      { none: ['message'] },\n      { success: [] },\n      { failedUp: ['cell'] },\n      { failedDown: ['cell'] }\n    ]);\n    var isOverlapping = function (bridge, before, after) {\n      var beforeBounds = bridge.getRect(before);\n      var afterBounds = bridge.getRect(after);\n      return afterBounds.right > beforeBounds.left && afterBounds.left < beforeBounds.right;\n    };\n    var isRow = function (elem) {\n      return closest$1(elem, 'tr');\n    };\n    var verify = function (bridge, before, beforeOffset, after, afterOffset, failure, isRoot) {\n      return closest$1(after, 'td,th', isRoot).bind(function (afterCell) {\n        return closest$1(before, 'td,th', isRoot).map(function (beforeCell) {\n          if (!eq(afterCell, beforeCell)) {\n            return DomParent.sharedOne(isRow, [\n              afterCell,\n              beforeCell\n            ]).fold(function () {\n              return isOverlapping(bridge, beforeCell, afterCell) ? adt$5.success() : failure(beforeCell);\n            }, function (_sharedRow) {\n              return failure(beforeCell);\n            });\n          } else {\n            return eq(after, afterCell) && getEnd(afterCell) === afterOffset ? failure(beforeCell) : adt$5.none('in same cell');\n          }\n        });\n      }).getOr(adt$5.none('default'));\n    };\n    var cata$2 = function (subject, onNone, onSuccess, onFailedUp, onFailedDown) {\n      return subject.fold(onNone, onSuccess, onFailedUp, onFailedDown);\n    };\n    var BeforeAfter = __assign(__assign({}, adt$5), {\n      verify: verify,\n      cata: cata$2\n    });\n\n    var inAncestor = Immutable('ancestor', 'descendants', 'element', 'index');\n    var inParent = Immutable('parent', 'children', 'element', 'index');\n    var indexInParent = function (element) {\n      return parent(element).bind(function (parent) {\n        var children$1 = children(parent);\n        return indexOf(children$1, element).map(function (index) {\n          return inParent(parent, children$1, element, index);\n        });\n      });\n    };\n    var indexOf = function (elements, element) {\n      return findIndex(elements, curry(eq, element));\n    };\n\n    var isBr = function (elem) {\n      return name(elem) === 'br';\n    };\n    var gatherer = function (cand, gather, isRoot) {\n      return gather(cand, isRoot).bind(function (target) {\n        return isText(target) && get$3(target).trim().length === 0 ? gatherer(target, gather, isRoot) : Option.some(target);\n      });\n    };\n    var handleBr = function (isRoot, element, direction) {\n      return direction.traverse(element).orThunk(function () {\n        return gatherer(element, direction.gather, isRoot);\n      }).map(direction.relative);\n    };\n    var findBr = function (element, offset) {\n      return child(element, offset).filter(isBr).orThunk(function () {\n        return child(element, offset - 1).filter(isBr);\n      });\n    };\n    var handleParent = function (isRoot, element, offset, direction) {\n      return findBr(element, offset).bind(function (br) {\n        return direction.traverse(br).fold(function () {\n          return gatherer(br, direction.gather, isRoot).map(direction.relative);\n        }, function (adjacent) {\n          return indexInParent(adjacent).map(function (info) {\n            return Situ.on(info.parent(), info.index());\n          });\n        });\n      });\n    };\n    var tryBr = function (isRoot, element, offset, direction) {\n      var target = isBr(element) ? handleBr(isRoot, element, direction) : handleParent(isRoot, element, offset, direction);\n      return target.map(function (tgt) {\n        return {\n          start: constant(tgt),\n          finish: constant(tgt)\n        };\n      });\n    };\n    var process = function (analysis) {\n      return BeforeAfter.cata(analysis, function (message) {\n        return Option.none();\n      }, function () {\n        return Option.none();\n      }, function (cell) {\n        return Option.some(point(cell, 0));\n      }, function (cell) {\n        return Option.some(point(cell, getEnd(cell)));\n      });\n    };\n    var BrTags = {\n      tryBr: tryBr,\n      process: process\n    };\n\n    var nu$3 = MixedBag([\n      'left',\n      'top',\n      'right',\n      'bottom'\n    ], []);\n    var moveDown = function (caret, amount) {\n      return nu$3({\n        left: caret.left(),\n        top: caret.top() + amount,\n        right: caret.right(),\n        bottom: caret.bottom() + amount\n      });\n    };\n    var moveUp = function (caret, amount) {\n      return nu$3({\n        left: caret.left(),\n        top: caret.top() - amount,\n        right: caret.right(),\n        bottom: caret.bottom() - amount\n      });\n    };\n    var moveBottomTo = function (caret, bottom) {\n      var height = caret.bottom() - caret.top();\n      return nu$3({\n        left: caret.left(),\n        top: bottom - height,\n        right: caret.right(),\n        bottom: bottom\n      });\n    };\n    var moveTopTo = function (caret, top) {\n      var height = caret.bottom() - caret.top();\n      return nu$3({\n        left: caret.left(),\n        top: top,\n        right: caret.right(),\n        bottom: top + height\n      });\n    };\n    var translate = function (caret, xDelta, yDelta) {\n      return nu$3({\n        left: caret.left() + xDelta,\n        top: caret.top() + yDelta,\n        right: caret.right() + xDelta,\n        bottom: caret.bottom() + yDelta\n      });\n    };\n    var getTop$1 = function (caret) {\n      return caret.top();\n    };\n    var getBottom = function (caret) {\n      return caret.bottom();\n    };\n    var toString = function (caret) {\n      return '(' + caret.left() + ', ' + caret.top() + ') -> (' + caret.right() + ', ' + caret.bottom() + ')';\n    };\n    var Carets = {\n      nu: nu$3,\n      moveUp: moveUp,\n      moveDown: moveDown,\n      moveBottomTo: moveBottomTo,\n      moveTopTo: moveTopTo,\n      getTop: getTop$1,\n      getBottom: getBottom,\n      translate: translate,\n      toString: toString\n    };\n\n    var getPartialBox = function (bridge, element, offset) {\n      if (offset >= 0 && offset < getEnd(element)) {\n        return bridge.getRangedRect(element, offset, element, offset + 1);\n      } else if (offset > 0) {\n        return bridge.getRangedRect(element, offset - 1, element, offset);\n      }\n      return Option.none();\n    };\n    var toCaret = function (rect) {\n      return Carets.nu({\n        left: rect.left,\n        top: rect.top,\n        right: rect.right,\n        bottom: rect.bottom\n      });\n    };\n    var getElemBox = function (bridge, element) {\n      return Option.some(bridge.getRect(element));\n    };\n    var getBoxAt = function (bridge, element, offset) {\n      if (isElement(element)) {\n        return getElemBox(bridge, element).map(toCaret);\n      } else if (isText(element)) {\n        return getPartialBox(bridge, element, offset).map(toCaret);\n      } else {\n        return Option.none();\n      }\n    };\n    var getEntireBox = function (bridge, element) {\n      if (isElement(element)) {\n        return getElemBox(bridge, element).map(toCaret);\n      } else if (isText(element)) {\n        return bridge.getRangedRect(element, 0, element, getEnd(element)).map(toCaret);\n      } else {\n        return Option.none();\n      }\n    };\n    var Rectangles = {\n      getBoxAt: getBoxAt,\n      getEntireBox: getEntireBox\n    };\n\n    var JUMP_SIZE = 5;\n    var NUM_RETRIES = 100;\n    var adt$6 = Adt.generate([\n      { none: [] },\n      { retry: ['caret'] }\n    ]);\n    var isOutside = function (caret, box) {\n      return caret.left() < box.left() || Math.abs(box.right() - caret.left()) < 1 || caret.left() > box.right();\n    };\n    var inOutsideBlock = function (bridge, element, caret) {\n      return closest(element, DomStructure.isBlock).fold(constant(false), function (cell) {\n        return Rectangles.getEntireBox(bridge, cell).exists(function (box) {\n          return isOutside(caret, box);\n        });\n      });\n    };\n    var adjustDown = function (bridge, element, guessBox, original, caret) {\n      var lowerCaret = Carets.moveDown(caret, JUMP_SIZE);\n      if (Math.abs(guessBox.bottom() - original.bottom()) < 1) {\n        return adt$6.retry(lowerCaret);\n      } else if (guessBox.top() > caret.bottom()) {\n        return adt$6.retry(lowerCaret);\n      } else if (guessBox.top() === caret.bottom()) {\n        return adt$6.retry(Carets.moveDown(caret, 1));\n      } else {\n        return inOutsideBlock(bridge, element, caret) ? adt$6.retry(Carets.translate(lowerCaret, JUMP_SIZE, 0)) : adt$6.none();\n      }\n    };\n    var adjustUp = function (bridge, element, guessBox, original, caret) {\n      var higherCaret = Carets.moveUp(caret, JUMP_SIZE);\n      if (Math.abs(guessBox.top() - original.top()) < 1) {\n        return adt$6.retry(higherCaret);\n      } else if (guessBox.bottom() < caret.top()) {\n        return adt$6.retry(higherCaret);\n      } else if (guessBox.bottom() === caret.top()) {\n        return adt$6.retry(Carets.moveUp(caret, 1));\n      } else {\n        return inOutsideBlock(bridge, element, caret) ? adt$6.retry(Carets.translate(higherCaret, JUMP_SIZE, 0)) : adt$6.none();\n      }\n    };\n    var upMovement = {\n      point: Carets.getTop,\n      adjuster: adjustUp,\n      move: Carets.moveUp,\n      gather: before$4\n    };\n    var downMovement = {\n      point: Carets.getBottom,\n      adjuster: adjustDown,\n      move: Carets.moveDown,\n      gather: after$5\n    };\n    var isAtTable = function (bridge, x, y) {\n      return bridge.elementFromPoint(x, y).filter(function (elm) {\n        return name(elm) === 'table';\n      }).isSome();\n    };\n    var adjustForTable = function (bridge, movement, original, caret, numRetries) {\n      return adjustTil(bridge, movement, original, movement.move(caret, JUMP_SIZE), numRetries);\n    };\n    var adjustTil = function (bridge, movement, original, caret, numRetries) {\n      if (numRetries === 0) {\n        return Option.some(caret);\n      }\n      if (isAtTable(bridge, caret.left(), movement.point(caret))) {\n        return adjustForTable(bridge, movement, original, caret, numRetries - 1);\n      }\n      return bridge.situsFromPoint(caret.left(), movement.point(caret)).bind(function (guess) {\n        return guess.start().fold(Option.none, function (element) {\n          return Rectangles.getEntireBox(bridge, element).bind(function (guessBox) {\n            return movement.adjuster(bridge, element, guessBox, original, caret).fold(Option.none, function (newCaret) {\n              return adjustTil(bridge, movement, original, newCaret, numRetries - 1);\n            });\n          }).orThunk(function () {\n            return Option.some(caret);\n          });\n        }, Option.none);\n      });\n    };\n    var ieTryDown = function (bridge, caret) {\n      return bridge.situsFromPoint(caret.left(), caret.bottom() + JUMP_SIZE);\n    };\n    var ieTryUp = function (bridge, caret) {\n      return bridge.situsFromPoint(caret.left(), caret.top() - JUMP_SIZE);\n    };\n    var checkScroll = function (movement, adjusted, bridge) {\n      if (movement.point(adjusted) > bridge.getInnerHeight()) {\n        return Option.some(movement.point(adjusted) - bridge.getInnerHeight());\n      } else if (movement.point(adjusted) < 0) {\n        return Option.some(-movement.point(adjusted));\n      } else {\n        return Option.none();\n      }\n    };\n    var retry = function (movement, bridge, caret) {\n      var moved = movement.move(caret, JUMP_SIZE);\n      var adjusted = adjustTil(bridge, movement, caret, moved, NUM_RETRIES).getOr(moved);\n      return checkScroll(movement, adjusted, bridge).fold(function () {\n        return bridge.situsFromPoint(adjusted.left(), movement.point(adjusted));\n      }, function (delta) {\n        bridge.scrollBy(0, delta);\n        return bridge.situsFromPoint(adjusted.left(), movement.point(adjusted) - delta);\n      });\n    };\n    var Retries = {\n      tryUp: curry(retry, upMovement),\n      tryDown: curry(retry, downMovement),\n      ieTryUp: ieTryUp,\n      ieTryDown: ieTryDown,\n      getJumpSize: constant(JUMP_SIZE)\n    };\n\n    var MAX_RETRIES = 20;\n    var platform$2 = detect$3();\n    var findSpot = function (bridge, isRoot, direction) {\n      return bridge.getSelection().bind(function (sel) {\n        return BrTags.tryBr(isRoot, sel.finish(), sel.foffset(), direction).fold(function () {\n          return Option.some(point(sel.finish(), sel.foffset()));\n        }, function (brNeighbour) {\n          var range = bridge.fromSitus(brNeighbour);\n          var analysis = BeforeAfter.verify(bridge, sel.finish(), sel.foffset(), range.finish(), range.foffset(), direction.failure, isRoot);\n          return BrTags.process(analysis);\n        });\n      });\n    };\n    var scan$1 = function (bridge, isRoot, element, offset, direction, numRetries) {\n      if (numRetries === 0) {\n        return Option.none();\n      }\n      return tryCursor(bridge, isRoot, element, offset, direction).bind(function (situs) {\n        var range = bridge.fromSitus(situs);\n        var analysis = BeforeAfter.verify(bridge, element, offset, range.finish(), range.foffset(), direction.failure, isRoot);\n        return BeforeAfter.cata(analysis, function () {\n          return Option.none();\n        }, function () {\n          return Option.some(situs);\n        }, function (cell) {\n          if (eq(element, cell) && offset === 0) {\n            return tryAgain(bridge, element, offset, Carets.moveUp, direction);\n          } else {\n            return scan$1(bridge, isRoot, cell, 0, direction, numRetries - 1);\n          }\n        }, function (cell) {\n          if (eq(element, cell) && offset === getEnd(cell)) {\n            return tryAgain(bridge, element, offset, Carets.moveDown, direction);\n          } else {\n            return scan$1(bridge, isRoot, cell, getEnd(cell), direction, numRetries - 1);\n          }\n        });\n      });\n    };\n    var tryAgain = function (bridge, element, offset, move, direction) {\n      return Rectangles.getBoxAt(bridge, element, offset).bind(function (box) {\n        return tryAt(bridge, direction, move(box, Retries.getJumpSize()));\n      });\n    };\n    var tryAt = function (bridge, direction, box) {\n      if (platform$2.browser.isChrome() || platform$2.browser.isSafari() || platform$2.browser.isFirefox() || platform$2.browser.isEdge()) {\n        return direction.otherRetry(bridge, box);\n      } else if (platform$2.browser.isIE()) {\n        return direction.ieRetry(bridge, box);\n      } else {\n        return Option.none();\n      }\n    };\n    var tryCursor = function (bridge, isRoot, element, offset, direction) {\n      return Rectangles.getBoxAt(bridge, element, offset).bind(function (box) {\n        return tryAt(bridge, direction, box);\n      });\n    };\n    var handle$2 = function (bridge, isRoot, direction) {\n      return findSpot(bridge, isRoot, direction).bind(function (spot) {\n        return scan$1(bridge, isRoot, spot.element(), spot.offset(), direction, MAX_RETRIES).map(bridge.fromSitus);\n      });\n    };\n    var TableKeys = { handle: handle$2 };\n\n    var detection = detect$3();\n    var inSameTable = function (elem, table) {\n      return ancestor$2(elem, function (e) {\n        return parent(e).exists(function (p) {\n          return eq(p, table);\n        });\n      });\n    };\n    var simulate = function (bridge, isRoot, direction, initial, anchor) {\n      return closest$1(initial, 'td,th', isRoot).bind(function (start) {\n        return closest$1(start, 'table', isRoot).bind(function (table) {\n          if (!inSameTable(anchor, table)) {\n            return Option.none();\n          }\n          return TableKeys.handle(bridge, isRoot, direction).bind(function (range) {\n            return closest$1(range.finish(), 'td,th', isRoot).map(function (finish) {\n              return {\n                start: constant(start),\n                finish: constant(finish),\n                range: constant(range)\n              };\n            });\n          });\n        });\n      });\n    };\n    var navigate = function (bridge, isRoot, direction, initial, anchor, precheck) {\n      if (detection.browser.isIE()) {\n        return Option.none();\n      } else {\n        return precheck(initial, isRoot).orThunk(function () {\n          return simulate(bridge, isRoot, direction, initial, anchor).map(function (info) {\n            var range = info.range();\n            return Response.create(Option.some(Util.makeSitus(range.start(), range.soffset(), range.finish(), range.foffset())), true);\n          });\n        });\n      }\n    };\n    var firstUpCheck = function (initial, isRoot) {\n      return closest$1(initial, 'tr', isRoot).bind(function (startRow) {\n        return closest$1(startRow, 'table', isRoot).bind(function (table) {\n          var rows = descendants$1(table, 'tr');\n          if (eq(startRow, rows[0])) {\n            return seekLeft$1(table, function (element) {\n              return last$1(element).isSome();\n            }, isRoot).map(function (last) {\n              var lastOffset = getEnd(last);\n              return Response.create(Option.some(Util.makeSitus(last, lastOffset, last, lastOffset)), true);\n            });\n          } else {\n            return Option.none();\n          }\n        });\n      });\n    };\n    var lastDownCheck = function (initial, isRoot) {\n      return closest$1(initial, 'tr', isRoot).bind(function (startRow) {\n        return closest$1(startRow, 'table', isRoot).bind(function (table) {\n          var rows = descendants$1(table, 'tr');\n          if (eq(startRow, rows[rows.length - 1])) {\n            return seekRight$1(table, function (element) {\n              return first(element).isSome();\n            }, isRoot).map(function (first) {\n              return Response.create(Option.some(Util.makeSitus(first, 0, first, 0)), true);\n            });\n          } else {\n            return Option.none();\n          }\n        });\n      });\n    };\n    var select = function (bridge, container, isRoot, direction, initial, anchor, selectRange) {\n      return simulate(bridge, isRoot, direction, initial, anchor).bind(function (info) {\n        return KeySelection.detect(container, isRoot, info.start(), info.finish(), selectRange);\n      });\n    };\n    var VerticalMovement = {\n      navigate: navigate,\n      select: select,\n      firstUpCheck: firstUpCheck,\n      lastDownCheck: lastDownCheck\n    };\n\n    var findCell = function (target, isRoot) {\n      return closest$1(target, 'td,th', isRoot);\n    };\n    function MouseSelection (bridge, container, isRoot, annotations) {\n      var cursor = Option.none();\n      var clearState = function () {\n        cursor = Option.none();\n      };\n      var mousedown = function (event) {\n        annotations.clear(container);\n        cursor = findCell(event.target(), isRoot);\n      };\n      var mouseover = function (event) {\n        cursor.each(function (start) {\n          annotations.clearBeforeUpdate(container);\n          findCell(event.target(), isRoot).each(function (finish) {\n            CellSelection.identify(start, finish, isRoot).each(function (cellSel) {\n              var boxes = cellSel.boxes().getOr([]);\n              if (boxes.length > 1 || boxes.length === 1 && !eq(start, finish)) {\n                annotations.selectRange(container, boxes, cellSel.start(), cellSel.finish());\n                bridge.selectContents(finish);\n              }\n            });\n          });\n        });\n      };\n      var mouseup = function (_event) {\n        cursor.each(clearState);\n      };\n      return {\n        mousedown: mousedown,\n        mouseover: mouseover,\n        mouseup: mouseup\n      };\n    }\n\n    var down = {\n      traverse: nextSibling,\n      gather: after$5,\n      relative: Situ.before,\n      otherRetry: Retries.tryDown,\n      ieRetry: Retries.ieTryDown,\n      failure: BeforeAfter.failedDown\n    };\n    var up = {\n      traverse: prevSibling,\n      gather: before$4,\n      relative: Situ.before,\n      otherRetry: Retries.tryUp,\n      ieRetry: Retries.ieTryUp,\n      failure: BeforeAfter.failedUp\n    };\n    var KeyDirection = {\n      down: down,\n      up: up\n    };\n\n    var isKey = function (key) {\n      return function (keycode) {\n        return keycode === key;\n      };\n    };\n    var isUp = isKey(38);\n    var isDown = isKey(40);\n    var isNavigation = function (keycode) {\n      return keycode >= 37 && keycode <= 40;\n    };\n    var SelectionKeys = {\n      ltr: {\n        isBackward: isKey(37),\n        isForward: isKey(39)\n      },\n      rtl: {\n        isBackward: isKey(39),\n        isForward: isKey(37)\n      },\n      isUp: isUp,\n      isDown: isDown,\n      isNavigation: isNavigation\n    };\n\n    var toRaw = function (sr) {\n      return {\n        left: sr.left(),\n        top: sr.top(),\n        right: sr.right(),\n        bottom: sr.bottom(),\n        width: sr.width(),\n        height: sr.height()\n      };\n    };\n    var Rect = { toRaw: toRaw };\n\n    var isSafari = detect$3().browser.isSafari();\n    var get$b = function (_DOC) {\n      var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document;\n      var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n      var y = doc.body.scrollTop || doc.documentElement.scrollTop;\n      return Position(x, y);\n    };\n    var by = function (x, y, _DOC) {\n      var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document;\n      var win = doc.defaultView;\n      win.scrollBy(x, y);\n    };\n\n    var WindowBridge = function (win) {\n      var elementFromPoint = function (x, y) {\n        return Element.fromPoint(Element.fromDom(win.document), x, y);\n      };\n      var getRect = function (element) {\n        return element.dom().getBoundingClientRect();\n      };\n      var getRangedRect = function (start, soffset, finish, foffset) {\n        var sel = Selection.exact(start, soffset, finish, foffset);\n        return getFirstRect$1(win, sel).map(Rect.toRaw);\n      };\n      var getSelection = function () {\n        return get$a(win).map(function (exactAdt) {\n          return Util.convertToRange(win, exactAdt);\n        });\n      };\n      var fromSitus = function (situs) {\n        var relative = Selection.relative(situs.start(), situs.finish());\n        return Util.convertToRange(win, relative);\n      };\n      var situsFromPoint = function (x, y) {\n        return getAtPoint(win, x, y).map(function (exact) {\n          return Situs.create(exact.start(), exact.soffset(), exact.finish(), exact.foffset());\n        });\n      };\n      var clearSelection = function () {\n        clear(win);\n      };\n      var collapseSelection = function (toStart) {\n        if (toStart === void 0) {\n          toStart = false;\n        }\n        get$a(win).each(function (sel) {\n          return sel.fold(function (rng) {\n            return rng.collapse(toStart);\n          }, function (startSitu, finishSitu) {\n            var situ = toStart ? startSitu : finishSitu;\n            setRelative(win, situ, situ);\n          }, function (start, soffset, finish, foffset) {\n            var node = toStart ? start : finish;\n            var offset = toStart ? soffset : foffset;\n            setExact(win, node, offset, node, offset);\n          });\n        });\n      };\n      var selectContents = function (element) {\n        setToElement(win, element);\n      };\n      var setSelection = function (sel) {\n        setExact(win, sel.start(), sel.soffset(), sel.finish(), sel.foffset());\n      };\n      var setRelativeSelection = function (start, finish) {\n        setRelative(win, start, finish);\n      };\n      var getInnerHeight = function () {\n        return win.innerHeight;\n      };\n      var getScrollY = function () {\n        var pos = get$b(Element.fromDom(win.document));\n        return pos.top();\n      };\n      var scrollBy = function (x, y) {\n        by(x, y, Element.fromDom(win.document));\n      };\n      return {\n        elementFromPoint: elementFromPoint,\n        getRect: getRect,\n        getRangedRect: getRangedRect,\n        getSelection: getSelection,\n        fromSitus: fromSitus,\n        situsFromPoint: situsFromPoint,\n        clearSelection: clearSelection,\n        collapseSelection: collapseSelection,\n        setSelection: setSelection,\n        setRelativeSelection: setRelativeSelection,\n        selectContents: selectContents,\n        getInnerHeight: getInnerHeight,\n        getScrollY: getScrollY,\n        scrollBy: scrollBy\n      };\n    };\n\n    var rc = Immutable('rows', 'cols');\n    var mouse = function (win, container, isRoot, annotations) {\n      var bridge = WindowBridge(win);\n      var handlers = MouseSelection(bridge, container, isRoot, annotations);\n      return {\n        mousedown: handlers.mousedown,\n        mouseover: handlers.mouseover,\n        mouseup: handlers.mouseup\n      };\n    };\n    var keyboard = function (win, container, isRoot, annotations) {\n      var bridge = WindowBridge(win);\n      var clearToNavigate = function () {\n        annotations.clear(container);\n        return Option.none();\n      };\n      var keydown = function (event, start, soffset, finish, foffset, direction) {\n        var realEvent = event.raw();\n        var keycode = realEvent.which;\n        var shiftKey = realEvent.shiftKey === true;\n        var handler = CellSelection.retrieve(container, annotations.selectedSelector()).fold(function () {\n          if (SelectionKeys.isDown(keycode) && shiftKey) {\n            return curry(VerticalMovement.select, bridge, container, isRoot, KeyDirection.down, finish, start, annotations.selectRange);\n          } else if (SelectionKeys.isUp(keycode) && shiftKey) {\n            return curry(VerticalMovement.select, bridge, container, isRoot, KeyDirection.up, finish, start, annotations.selectRange);\n          } else if (SelectionKeys.isDown(keycode)) {\n            return curry(VerticalMovement.navigate, bridge, isRoot, KeyDirection.down, finish, start, VerticalMovement.lastDownCheck);\n          } else if (SelectionKeys.isUp(keycode)) {\n            return curry(VerticalMovement.navigate, bridge, isRoot, KeyDirection.up, finish, start, VerticalMovement.firstUpCheck);\n          } else {\n            return Option.none;\n          }\n        }, function (selected) {\n          var update = function (attempts) {\n            return function () {\n              var navigation = findMap(attempts, function (delta) {\n                return KeySelection.update(delta.rows(), delta.cols(), container, selected, annotations);\n              });\n              return navigation.fold(function () {\n                return CellSelection.getEdges(container, annotations.firstSelectedSelector(), annotations.lastSelectedSelector()).map(function (edges) {\n                  var relative = SelectionKeys.isDown(keycode) || direction.isForward(keycode) ? Situ.after : Situ.before;\n                  bridge.setRelativeSelection(Situ.on(edges.first(), 0), relative(edges.table()));\n                  annotations.clear(container);\n                  return Response.create(Option.none(), true);\n                });\n              }, function (_) {\n                return Option.some(Response.create(Option.none(), true));\n              });\n            };\n          };\n          if (SelectionKeys.isDown(keycode) && shiftKey) {\n            return update([rc(+1, 0)]);\n          } else if (SelectionKeys.isUp(keycode) && shiftKey) {\n            return update([rc(-1, 0)]);\n          } else if (direction.isBackward(keycode) && shiftKey) {\n            return update([\n              rc(0, -1),\n              rc(-1, 0)\n            ]);\n          } else if (direction.isForward(keycode) && shiftKey) {\n            return update([\n              rc(0, +1),\n              rc(+1, 0)\n            ]);\n          } else if (SelectionKeys.isNavigation(keycode) && shiftKey === false) {\n            return clearToNavigate;\n          } else {\n            return Option.none;\n          }\n        });\n        return handler();\n      };\n      var keyup = function (event, start, soffset, finish, foffset) {\n        return CellSelection.retrieve(container, annotations.selectedSelector()).fold(function () {\n          var realEvent = event.raw();\n          var keycode = realEvent.which;\n          var shiftKey = realEvent.shiftKey === true;\n          if (shiftKey === false) {\n            return Option.none();\n          }\n          if (SelectionKeys.isNavigation(keycode)) {\n            return KeySelection.sync(container, isRoot, start, soffset, finish, foffset, annotations.selectRange);\n          } else {\n            return Option.none();\n          }\n        }, Option.none);\n      };\n      return {\n        keydown: keydown,\n        keyup: keyup\n      };\n    };\n    var external = function (win, container, isRoot, annotations) {\n      var bridge = WindowBridge(win);\n      return function (start, finish) {\n        annotations.clearBeforeUpdate(container);\n        CellSelection.identify(start, finish, isRoot).each(function (cellSel) {\n          var boxes = cellSel.boxes().getOr([]);\n          annotations.selectRange(container, boxes, cellSel.start(), cellSel.finish());\n          bridge.selectContents(finish);\n          bridge.collapseSelection();\n        });\n      };\n    };\n    var InputHandlers = {\n      mouse: mouse,\n      keyboard: keyboard,\n      external: external\n    };\n\n    var remove$7 = function (element, classes) {\n      each(classes, function (x) {\n        remove$5(element, x);\n      });\n    };\n\n    var addClass = function (clazz) {\n      return function (element) {\n        add$2(element, clazz);\n      };\n    };\n    var removeClasses = function (classes) {\n      return function (element) {\n        remove$7(element, classes);\n      };\n    };\n\n    var byClass = function (ephemera) {\n      var addSelectionClass = addClass(ephemera.selected());\n      var removeSelectionClasses = removeClasses([\n        ephemera.selected(),\n        ephemera.lastSelected(),\n        ephemera.firstSelected()\n      ]);\n      var clear = function (container) {\n        var sels = descendants$1(container, ephemera.selectedSelector());\n        each(sels, removeSelectionClasses);\n      };\n      var selectRange = function (container, cells, start, finish) {\n        clear(container);\n        each(cells, addSelectionClass);\n        add$2(start, ephemera.firstSelected());\n        add$2(finish, ephemera.lastSelected());\n      };\n      return {\n        clearBeforeUpdate: clear,\n        clear: clear,\n        selectRange: selectRange,\n        selectedSelector: ephemera.selectedSelector,\n        firstSelectedSelector: ephemera.firstSelectedSelector,\n        lastSelectedSelector: ephemera.lastSelectedSelector\n      };\n    };\n    var byAttr = function (ephemera, onSelection, onClear) {\n      var removeSelectionAttributes = function (element) {\n        remove(element, ephemera.selected());\n        remove(element, ephemera.firstSelected());\n        remove(element, ephemera.lastSelected());\n      };\n      var addSelectionAttribute = function (element) {\n        set(element, ephemera.selected(), '1');\n      };\n      var clear = function (container) {\n        clearBeforeUpdate(container);\n        onClear();\n      };\n      var clearBeforeUpdate = function (container) {\n        var sels = descendants$1(container, ephemera.selectedSelector());\n        each(sels, removeSelectionAttributes);\n      };\n      var selectRange = function (container, cells, start, finish) {\n        clear(container);\n        each(cells, addSelectionAttribute);\n        set(start, ephemera.firstSelected(), '1');\n        set(finish, ephemera.lastSelected(), '1');\n        onSelection(cells, start, finish);\n      };\n      return {\n        clearBeforeUpdate: clearBeforeUpdate,\n        clear: clear,\n        selectRange: selectRange,\n        selectedSelector: ephemera.selectedSelector,\n        firstSelectedSelector: ephemera.firstSelectedSelector,\n        lastSelectedSelector: ephemera.lastSelectedSelector\n      };\n    };\n    var SelectionAnnotation = {\n      byClass: byClass,\n      byAttr: byAttr\n    };\n\n    var getUpOrLeftCells = function (grid, selectedCells, generators) {\n      var upGrid = grid.slice(0, selectedCells[selectedCells.length - 1].row() + 1);\n      var upDetails = toDetailList(upGrid, generators);\n      return bind(upDetails, function (detail) {\n        var slicedCells = detail.cells().slice(0, selectedCells[selectedCells.length - 1].column() + 1);\n        return map(slicedCells, function (cell) {\n          return cell.element();\n        });\n      });\n    };\n    var getDownOrRightCells = function (grid, selectedCells, generators) {\n      var downGrid = grid.slice(selectedCells[0].row() + selectedCells[0].rowspan() - 1, grid.length);\n      var downDetails = toDetailList(downGrid, generators);\n      return bind(downDetails, function (detail) {\n        var slicedCells = detail.cells().slice(selectedCells[0].column() + selectedCells[0].colspan() - 1, +detail.cells().length);\n        return map(slicedCells, function (cell) {\n          return cell.element();\n        });\n      });\n    };\n    var getOtherCells = function (table, target, generators) {\n      var list = DetailsList.fromTable(table);\n      var house = Warehouse.generate(list);\n      var details = onCells(house, target);\n      return details.map(function (selectedCells) {\n        var grid = Transitions.toGrid(house, generators, false);\n        var upOrLeftCells = getUpOrLeftCells(grid, selectedCells, generators);\n        var downOrRightCells = getDownOrRightCells(grid, selectedCells, generators);\n        return {\n          upOrLeftCells: upOrLeftCells,\n          downOrRightCells: downOrRightCells\n        };\n      });\n    };\n    var OtherCells = { getOtherCells: getOtherCells };\n\n    var hasInternalTarget = function (e) {\n      return has$2(Element.fromDom(e.target), 'ephox-snooker-resizer-bar') === false;\n    };\n    function CellSelection$1 (editor, lazyResize, selectionTargets) {\n      var handlerStruct = MixedBag([\n        'mousedown',\n        'mouseover',\n        'mouseup',\n        'keyup',\n        'keydown'\n      ], []);\n      var handlers = Option.none();\n      var cloneFormats = getCloneElements(editor);\n      var onSelection = function (cells, start, finish) {\n        selectionTargets.targets().each(function (targets) {\n          var tableOpt = TableLookup.table(start);\n          tableOpt.each(function (table) {\n            var doc = Element.fromDom(editor.getDoc());\n            var generators = TableFill.cellOperations(noop, doc, cloneFormats);\n            var otherCells = OtherCells.getOtherCells(table, targets, generators);\n            fireTableSelectionChange(editor, cells, start, finish, otherCells);\n          });\n        });\n      };\n      var onClear = function () {\n        fireTableSelectionClear(editor);\n      };\n      var annotations = SelectionAnnotation.byAttr(Ephemera, onSelection, onClear);\n      editor.on('init', function (e) {\n        var win = editor.getWin();\n        var body = getBody$1(editor);\n        var isRoot = getIsRoot(editor);\n        var syncSelection = function () {\n          var sel = editor.selection;\n          var start = Element.fromDom(sel.getStart());\n          var end = Element.fromDom(sel.getEnd());\n          var shared = DomParent.sharedOne(TableLookup.table, [\n            start,\n            end\n          ]);\n          shared.fold(function () {\n            annotations.clear(body);\n          }, noop);\n        };\n        var mouseHandlers = InputHandlers.mouse(win, body, isRoot, annotations);\n        var keyHandlers = InputHandlers.keyboard(win, body, isRoot, annotations);\n        var external = InputHandlers.external(win, body, isRoot, annotations);\n        var hasShiftKey = function (event) {\n          return event.raw().shiftKey === true;\n        };\n        editor.on('TableSelectorChange', function (e) {\n          external(e.start, e.finish);\n        });\n        var handleResponse = function (event, response) {\n          if (!hasShiftKey(event)) {\n            return;\n          }\n          if (response.kill()) {\n            event.kill();\n          }\n          response.selection().each(function (ns) {\n            var relative = Selection.relative(ns.start(), ns.finish());\n            var rng = asLtrRange(win, relative);\n            editor.selection.setRng(rng);\n          });\n        };\n        var keyup = function (event) {\n          var wrappedEvent = fromRawEvent$1(event);\n          if (wrappedEvent.raw().shiftKey && SelectionKeys.isNavigation(wrappedEvent.raw().which)) {\n            var rng = editor.selection.getRng();\n            var start = Element.fromDom(rng.startContainer);\n            var end = Element.fromDom(rng.endContainer);\n            keyHandlers.keyup(wrappedEvent, start, rng.startOffset, end, rng.endOffset).each(function (response) {\n              handleResponse(wrappedEvent, response);\n            });\n          }\n        };\n        var keydown = function (event) {\n          var wrappedEvent = fromRawEvent$1(event);\n          lazyResize().each(function (resize) {\n            resize.hideBars();\n          });\n          var rng = editor.selection.getRng();\n          var startContainer = Element.fromDom(editor.selection.getStart());\n          var start = Element.fromDom(rng.startContainer);\n          var end = Element.fromDom(rng.endContainer);\n          var direction = Direction.directionAt(startContainer).isRtl() ? SelectionKeys.rtl : SelectionKeys.ltr;\n          keyHandlers.keydown(wrappedEvent, start, rng.startOffset, end, rng.endOffset, direction).each(function (response) {\n            handleResponse(wrappedEvent, response);\n          });\n          lazyResize().each(function (resize) {\n            resize.showBars();\n          });\n        };\n        var isLeftMouse = function (raw) {\n          return raw.button === 0;\n        };\n        var isLeftButtonPressed = function (raw) {\n          if (raw.buttons === undefined) {\n            return true;\n          }\n          if (global$2.browser.isEdge() && raw.buttons === 0) {\n            return true;\n          }\n          return (raw.buttons & 1) !== 0;\n        };\n        var mouseDown = function (e) {\n          if (isLeftMouse(e) && hasInternalTarget(e)) {\n            mouseHandlers.mousedown(fromRawEvent$1(e));\n          }\n        };\n        var mouseOver = function (e) {\n          if (isLeftButtonPressed(e) && hasInternalTarget(e)) {\n            mouseHandlers.mouseover(fromRawEvent$1(e));\n          }\n        };\n        var mouseUp = function (e) {\n          if (isLeftMouse(e) && hasInternalTarget(e)) {\n            mouseHandlers.mouseup(fromRawEvent$1(e));\n          }\n        };\n        var getDoubleTap = function () {\n          var lastTarget = Cell(Element.fromDom(body));\n          var lastTimeStamp = Cell(0);\n          var touchEnd = function (t) {\n            var target = Element.fromDom(t.target);\n            if (name(target) === 'td' || name(target) === 'th') {\n              var lT = lastTarget.get();\n              var lTS = lastTimeStamp.get();\n              if (eq(lT, target) && t.timeStamp - lTS < 300) {\n                t.preventDefault();\n                external(target, target);\n              }\n            }\n            lastTarget.set(target);\n            lastTimeStamp.set(t.timeStamp);\n          };\n          return { touchEnd: touchEnd };\n        };\n        var doubleTap = getDoubleTap();\n        editor.on('mousedown', mouseDown);\n        editor.on('mouseover', mouseOver);\n        editor.on('mouseup', mouseUp);\n        editor.on('touchend', doubleTap.touchEnd);\n        editor.on('keyup', keyup);\n        editor.on('keydown', keydown);\n        editor.on('NodeChange', syncSelection);\n        handlers = Option.some(handlerStruct({\n          mousedown: mouseDown,\n          mouseover: mouseOver,\n          mouseup: mouseUp,\n          keyup: keyup,\n          keydown: keydown\n        }));\n      });\n      var destroy = function () {\n        handlers.each(function (handlers) {\n        });\n      };\n      return {\n        clear: annotations.clear,\n        destroy: destroy\n      };\n    }\n\n    var Selections = function (editor) {\n      var get = function () {\n        var body = getBody$1(editor);\n        return TableSelection.retrieve(body, Ephemera.selectedSelector()).fold(function () {\n          if (editor.selection.getStart() === undefined) {\n            return SelectionTypes.none();\n          } else {\n            return SelectionTypes.single(editor.selection);\n          }\n        }, function (cells) {\n          return SelectionTypes.multiple(cells);\n        });\n      };\n      return { get: get };\n    };\n\n    var getSelectionTargets = function (editor, selections) {\n      var targets = Cell(Option.none());\n      var changeHandlers = Cell([]);\n      var findTargets = function () {\n        return getSelectionStartCellOrCaption(editor).bind(function (cellOrCaption) {\n          var table = TableLookup.table(cellOrCaption);\n          return table.map(function (table) {\n            if (name(cellOrCaption) === 'caption') {\n              return TableTargets.notCell(cellOrCaption);\n            } else {\n              return TableTargets.forMenu(selections, table, cellOrCaption);\n            }\n          });\n        });\n      };\n      var resetTargets = function () {\n        targets.set(cached(findTargets)());\n        each(changeHandlers.get(), function (handler) {\n          return handler();\n        });\n      };\n      var onSetup = function (api, isDisabled) {\n        var handler = function () {\n          return targets.get().fold(function () {\n            api.setDisabled(true);\n          }, function (targets) {\n            api.setDisabled(isDisabled(targets));\n          });\n        };\n        handler();\n        changeHandlers.set(changeHandlers.get().concat([handler]));\n        return function () {\n          changeHandlers.set(filter(changeHandlers.get(), function (h) {\n            return h !== handler;\n          }));\n        };\n      };\n      var onSetupTable = function (api) {\n        return onSetup(api, function (_) {\n          return false;\n        });\n      };\n      var onSetupCellOrRow = function (api) {\n        return onSetup(api, function (targets) {\n          return name(targets.element()) === 'caption';\n        });\n      };\n      var onSetupMergeable = function (api) {\n        return onSetup(api, function (targets) {\n          return targets.mergable().isNone();\n        });\n      };\n      var onSetupUnmergeable = function (api) {\n        return onSetup(api, function (targets) {\n          return targets.unmergable().isNone();\n        });\n      };\n      editor.on('NodeChange TableSelectorChange', resetTargets);\n      return {\n        onSetupTable: onSetupTable,\n        onSetupCellOrRow: onSetupCellOrRow,\n        onSetupMergeable: onSetupMergeable,\n        onSetupUnmergeable: onSetupUnmergeable,\n        resetTargets: resetTargets,\n        targets: function () {\n          return targets.get();\n        }\n      };\n    };\n\n    var addButtons = function (editor, selectionTargets) {\n      editor.ui.registry.addMenuButton('table', {\n        tooltip: 'Table',\n        icon: 'table',\n        fetch: function (callback) {\n          return callback('inserttable | cell row column | advtablesort | tableprops deletetable');\n        }\n      });\n      var cmd = function (command) {\n        return function () {\n          return editor.execCommand(command);\n        };\n      };\n      editor.ui.registry.addButton('tableprops', {\n        tooltip: 'Table properties',\n        onAction: cmd('mceTableProps'),\n        icon: 'table',\n        onSetup: selectionTargets.onSetupTable\n      });\n      editor.ui.registry.addButton('tabledelete', {\n        tooltip: 'Delete table',\n        onAction: cmd('mceTableDelete'),\n        icon: 'table-delete-table',\n        onSetup: selectionTargets.onSetupTable\n      });\n      editor.ui.registry.addButton('tablecellprops', {\n        tooltip: 'Cell properties',\n        onAction: cmd('mceTableCellProps'),\n        icon: 'table-cell-properties',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tablemergecells', {\n        tooltip: 'Merge cells',\n        onAction: cmd('mceTableMergeCells'),\n        icon: 'table-merge-cells',\n        onSetup: selectionTargets.onSetupMergeable\n      });\n      editor.ui.registry.addButton('tablesplitcells', {\n        tooltip: 'Split cell',\n        onAction: cmd('mceTableSplitCells'),\n        icon: 'table-split-cells',\n        onSetup: selectionTargets.onSetupUnmergeable\n      });\n      editor.ui.registry.addButton('tableinsertrowbefore', {\n        tooltip: 'Insert row before',\n        onAction: cmd('mceTableInsertRowBefore'),\n        icon: 'table-insert-row-above',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tableinsertrowafter', {\n        tooltip: 'Insert row after',\n        onAction: cmd('mceTableInsertRowAfter'),\n        icon: 'table-insert-row-after',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tabledeleterow', {\n        tooltip: 'Delete row',\n        onAction: cmd('mceTableDeleteRow'),\n        icon: 'table-delete-row',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tablerowprops', {\n        tooltip: 'Row properties',\n        onAction: cmd('mceTableRowProps'),\n        icon: 'table-row-properties',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tableinsertcolbefore', {\n        tooltip: 'Insert column before',\n        onAction: cmd('mceTableInsertColBefore'),\n        icon: 'table-insert-column-before',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tableinsertcolafter', {\n        tooltip: 'Insert column after',\n        onAction: cmd('mceTableInsertColAfter'),\n        icon: 'table-insert-column-after',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tabledeletecol', {\n        tooltip: 'Delete column',\n        onAction: cmd('mceTableDeleteCol'),\n        icon: 'table-delete-column',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tablecutrow', {\n        tooltip: 'Cut row',\n        onAction: cmd('mceTableCutRow'),\n        icon: 'temporary-placeholder',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tablecopyrow', {\n        tooltip: 'Copy row',\n        onAction: cmd('mceTableCopyRow'),\n        icon: 'temporary-placeholder',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tablepasterowbefore', {\n        tooltip: 'Paste row before',\n        onAction: cmd('mceTablePasteRowBefore'),\n        icon: 'temporary-placeholder',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tablepasterowafter', {\n        tooltip: 'Paste row after',\n        onAction: cmd('mceTablePasteRowAfter'),\n        icon: 'temporary-placeholder',\n        onSetup: selectionTargets.onSetupCellOrRow\n      });\n      editor.ui.registry.addButton('tableinsertdialog', {\n        tooltip: 'Insert table',\n        onAction: cmd('mceInsertTable'),\n        icon: 'table'\n      });\n    };\n    var addToolbars = function (editor) {\n      var isTable = function (table) {\n        return editor.dom.is(table, 'table') && editor.getBody().contains(table);\n      };\n      var toolbar = getToolbar(editor);\n      if (toolbar.length > 0) {\n        editor.ui.registry.addContextToolbar('table', {\n          predicate: isTable,\n          items: toolbar,\n          scope: 'node',\n          position: 'node'\n        });\n      }\n    };\n    var Buttons = {\n      addButtons: addButtons,\n      addToolbars: addToolbars\n    };\n\n    var addMenuItems = function (editor, selectionTargets) {\n      var cmd = function (command) {\n        return function () {\n          return editor.execCommand(command);\n        };\n      };\n      var insertTableAction = function (_a) {\n        var numRows = _a.numRows, numColumns = _a.numColumns;\n        editor.undoManager.transact(function () {\n          InsertTable.insert(editor, numColumns, numRows);\n        });\n        editor.addVisual();\n      };\n      var tableProperties = {\n        text: 'Table properties',\n        onSetup: selectionTargets.onSetupTable,\n        onAction: cmd('mceTableProps')\n      };\n      var deleteTable = {\n        text: 'Delete table',\n        icon: 'table-delete-table',\n        onSetup: selectionTargets.onSetupTable,\n        onAction: cmd('mceTableDelete')\n      };\n      var rowItems = [\n        {\n          type: 'menuitem',\n          text: 'Insert row before',\n          icon: 'table-insert-row-above',\n          onAction: cmd('mceTableInsertRowBefore'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        {\n          type: 'menuitem',\n          text: 'Insert row after',\n          icon: 'table-insert-row-after',\n          onAction: cmd('mceTableInsertRowAfter'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        {\n          type: 'menuitem',\n          text: 'Delete row',\n          icon: 'table-delete-row',\n          onAction: cmd('mceTableDeleteRow'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        {\n          type: 'menuitem',\n          text: 'Row properties',\n          icon: 'table-row-properties',\n          onAction: cmd('mceTableRowProps'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        { type: 'separator' },\n        {\n          type: 'menuitem',\n          text: 'Cut row',\n          onAction: cmd('mceTableCutRow'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        {\n          type: 'menuitem',\n          text: 'Copy row',\n          onAction: cmd('mceTableCopyRow'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        {\n          type: 'menuitem',\n          text: 'Paste row before',\n          onAction: cmd('mceTablePasteRowBefore'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        {\n          type: 'menuitem',\n          text: 'Paste row after',\n          onAction: cmd('mceTablePasteRowAfter'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        }\n      ];\n      var row = {\n        type: 'nestedmenuitem',\n        text: 'Row',\n        getSubmenuItems: function () {\n          return rowItems;\n        }\n      };\n      var columnItems = [\n        {\n          type: 'menuitem',\n          text: 'Insert column before',\n          icon: 'table-insert-column-before',\n          onAction: cmd('mceTableInsertColBefore'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        {\n          type: 'menuitem',\n          text: 'Insert column after',\n          icon: 'table-insert-column-after',\n          onAction: cmd('mceTableInsertColAfter'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        {\n          type: 'menuitem',\n          text: 'Delete column',\n          icon: 'table-delete-column',\n          onAction: cmd('mceTableDeleteCol'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        }\n      ];\n      var column = {\n        type: 'nestedmenuitem',\n        text: 'Column',\n        getSubmenuItems: function () {\n          return columnItems;\n        }\n      };\n      var cellItems = [\n        {\n          type: 'menuitem',\n          text: 'Cell properties',\n          icon: 'table-cell-properties',\n          onAction: cmd('mceTableCellProps'),\n          onSetup: selectionTargets.onSetupCellOrRow\n        },\n        {\n          type: 'menuitem',\n          text: 'Merge cells',\n          icon: 'table-merge-cells',\n          onAction: cmd('mceTableMergeCells'),\n          onSetup: selectionTargets.onSetupMergeable\n        },\n        {\n          type: 'menuitem',\n          text: 'Split cell',\n          icon: 'table-split-cells',\n          onAction: cmd('mceTableSplitCells'),\n          onSetup: selectionTargets.onSetupUnmergeable\n        }\n      ];\n      var cell = {\n        type: 'nestedmenuitem',\n        text: 'Cell',\n        getSubmenuItems: function () {\n          return cellItems;\n        }\n      };\n      if (hasTableGrid(editor) === false) {\n        editor.ui.registry.addMenuItem('inserttable', {\n          text: 'Table',\n          icon: 'table',\n          onAction: cmd('mceInsertTable')\n        });\n      } else {\n        editor.ui.registry.addNestedMenuItem('inserttable', {\n          text: 'Table',\n          icon: 'table',\n          getSubmenuItems: function () {\n            return [{\n                type: 'fancymenuitem',\n                fancytype: 'inserttable',\n                onAction: insertTableAction\n              }];\n          }\n        });\n      }\n      editor.ui.registry.addMenuItem('inserttabledialog', {\n        text: 'Insert table',\n        icon: 'table',\n        onAction: cmd('mceInsertTable')\n      });\n      editor.ui.registry.addMenuItem('tableprops', tableProperties);\n      editor.ui.registry.addMenuItem('deletetable', deleteTable);\n      editor.ui.registry.addNestedMenuItem('row', row);\n      editor.ui.registry.addNestedMenuItem('column', column);\n      editor.ui.registry.addNestedMenuItem('cell', cell);\n      editor.ui.registry.addContextMenu('table', {\n        update: function () {\n          selectionTargets.resetTargets();\n          return selectionTargets.targets().fold(function () {\n            return '';\n          }, function (targets) {\n            if (name(targets.element()) === 'caption') {\n              return 'tableprops deletetable';\n            } else {\n              return 'cell row column | advtablesort | tableprops deletetable';\n            }\n          });\n        }\n      });\n    };\n    var MenuItems = { addMenuItems: addMenuItems };\n\n    var getClipboardRows = function (clipboardRows) {\n      return clipboardRows.get().fold(function () {\n        return;\n      }, function (rows) {\n        return map(rows, function (row) {\n          return row.dom();\n        });\n      });\n    };\n    var setClipboardRows = function (rows, clipboardRows) {\n      var sugarRows = map(rows, Element.fromDom);\n      clipboardRows.set(Option.from(sugarRows));\n    };\n    var getApi = function (editor, clipboardRows, resizeHandler, selectionTargets) {\n      return {\n        insertTable: function (columns, rows) {\n          return InsertTable.insert(editor, columns, rows);\n        },\n        setClipboardRows: function (rows) {\n          return setClipboardRows(rows, clipboardRows);\n        },\n        getClipboardRows: function () {\n          return getClipboardRows(clipboardRows);\n        },\n        resizeHandler: resizeHandler,\n        selectionTargets: selectionTargets\n      };\n    };\n\n    function Plugin(editor) {\n      var selections = Selections(editor);\n      var selectionTargets = getSelectionTargets(editor, selections);\n      var resizeHandler = getResizeHandler(editor);\n      var cellSelection = CellSelection$1(editor, resizeHandler.lazyResize, selectionTargets);\n      var actions = TableActions(editor, resizeHandler.lazyWire);\n      var clipboardRows = Cell(Option.none());\n      Commands.registerCommands(editor, actions, cellSelection, selections, clipboardRows);\n      Clipboard.registerEvents(editor, selections, actions, cellSelection);\n      MenuItems.addMenuItems(editor, selectionTargets);\n      Buttons.addButtons(editor, selectionTargets);\n      Buttons.addToolbars(editor);\n      editor.on('PreInit', function () {\n        editor.serializer.addTempAttr(Ephemera.firstSelected());\n        editor.serializer.addTempAttr(Ephemera.lastSelected());\n      });\n      if (hasTabNavigation(editor)) {\n        editor.on('keydown', function (e) {\n          TabContext.handle(e, editor, actions, resizeHandler.lazyWire);\n        });\n      }\n      editor.on('remove', function () {\n        resizeHandler.destroy();\n        cellSelection.destroy();\n      });\n      return getApi(editor, clipboardRows, resizeHandler, selectionTargets);\n    }\n    function Plugin$1 () {\n      global.add('table', Plugin);\n    }\n\n    Plugin$1();\n\n}(window));\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var noop = function () {\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    function create(width, height) {\n      return resize(domGlobals.document.createElement('canvas'), width, height);\n    }\n    function clone(canvas) {\n      var tCanvas = create(canvas.width, canvas.height);\n      var ctx = get2dContext(tCanvas);\n      ctx.drawImage(canvas, 0, 0);\n      return tCanvas;\n    }\n    function get2dContext(canvas) {\n      return canvas.getContext('2d');\n    }\n    function resize(canvas, width, height) {\n      canvas.width = width;\n      canvas.height = height;\n      return canvas;\n    }\n\n    function getWidth(image) {\n      return image.naturalWidth || image.width;\n    }\n    function getHeight(image) {\n      return image.naturalHeight || image.height;\n    }\n\n    var promise = function () {\n      var Promise = function (fn) {\n        if (typeof this !== 'object') {\n          throw new TypeError('Promises must be constructed via new');\n        }\n        if (typeof fn !== 'function') {\n          throw new TypeError('not a function');\n        }\n        this._state = null;\n        this._value = null;\n        this._deferreds = [];\n        doResolve(fn, bind(resolve, this), bind(reject, this));\n      };\n      var asap = Promise.immediateFn || typeof window.setImmediate === 'function' && window.setImmediate || function (fn) {\n        domGlobals.setTimeout(fn, 1);\n      };\n      function bind(fn, thisArg) {\n        return function () {\n          return fn.apply(thisArg, arguments);\n        };\n      }\n      var isArray = Array.isArray || function (value) {\n        return Object.prototype.toString.call(value) === '[object Array]';\n      };\n      function handle(deferred) {\n        var me = this;\n        if (this._state === null) {\n          this._deferreds.push(deferred);\n          return;\n        }\n        asap(function () {\n          var cb = me._state ? deferred.onFulfilled : deferred.onRejected;\n          if (cb === null) {\n            (me._state ? deferred.resolve : deferred.reject)(me._value);\n            return;\n          }\n          var ret;\n          try {\n            ret = cb(me._value);\n          } catch (e) {\n            deferred.reject(e);\n            return;\n          }\n          deferred.resolve(ret);\n        });\n      }\n      function resolve(newValue) {\n        try {\n          if (newValue === this) {\n            throw new TypeError('A promise cannot be resolved with itself.');\n          }\n          if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n            var then = newValue.then;\n            if (typeof then === 'function') {\n              doResolve(bind(then, newValue), bind(resolve, this), bind(reject, this));\n              return;\n            }\n          }\n          this._state = true;\n          this._value = newValue;\n          finale.call(this);\n        } catch (e) {\n          reject.call(this, e);\n        }\n      }\n      function reject(newValue) {\n        this._state = false;\n        this._value = newValue;\n        finale.call(this);\n      }\n      function finale() {\n        for (var _i = 0, _a = this._deferreds; _i < _a.length; _i++) {\n          var deferred = _a[_i];\n          handle.call(this, deferred);\n        }\n        this._deferreds = [];\n      }\n      function Handler(onFulfilled, onRejected, resolve, reject) {\n        this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n        this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n        this.resolve = resolve;\n        this.reject = reject;\n      }\n      function doResolve(fn, onFulfilled, onRejected) {\n        var done = false;\n        try {\n          fn(function (value) {\n            if (done) {\n              return;\n            }\n            done = true;\n            onFulfilled(value);\n          }, function (reason) {\n            if (done) {\n              return;\n            }\n            done = true;\n            onRejected(reason);\n          });\n        } catch (ex) {\n          if (done) {\n            return;\n          }\n          done = true;\n          onRejected(ex);\n        }\n      }\n      Promise.prototype.catch = function (onRejected) {\n        return this.then(null, onRejected);\n      };\n      Promise.prototype.then = function (onFulfilled, onRejected) {\n        var me = this;\n        return new Promise(function (resolve, reject) {\n          handle.call(me, new Handler(onFulfilled, onRejected, resolve, reject));\n        });\n      };\n      Promise.all = function () {\n        var values = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          values[_i] = arguments[_i];\n        }\n        var args = Array.prototype.slice.call(values.length === 1 && isArray(values[0]) ? values[0] : values);\n        return new Promise(function (resolve, reject) {\n          if (args.length === 0) {\n            return resolve([]);\n          }\n          var remaining = args.length;\n          function res(i, val) {\n            try {\n              if (val && (typeof val === 'object' || typeof val === 'function')) {\n                var then = val.then;\n                if (typeof then === 'function') {\n                  then.call(val, function (val) {\n                    res(i, val);\n                  }, reject);\n                  return;\n                }\n              }\n              args[i] = val;\n              if (--remaining === 0) {\n                resolve(args);\n              }\n            } catch (ex) {\n              reject(ex);\n            }\n          }\n          for (var i = 0; i < args.length; i++) {\n            res(i, args[i]);\n          }\n        });\n      };\n      Promise.resolve = function (value) {\n        if (value && typeof value === 'object' && value.constructor === Promise) {\n          return value;\n        }\n        return new Promise(function (resolve) {\n          resolve(value);\n        });\n      };\n      Promise.reject = function (reason) {\n        return new Promise(function (resolve, reject) {\n          reject(reason);\n        });\n      };\n      Promise.race = function (values) {\n        return new Promise(function (resolve, reject) {\n          for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {\n            var value = values_1[_i];\n            value.then(resolve, reject);\n          }\n        });\n      };\n      return Promise;\n    };\n    var Promise = window.Promise ? window.Promise : promise();\n\n    function imageToBlob(image) {\n      var src = image.src;\n      if (src.indexOf('data:') === 0) {\n        return dataUriToBlob(src);\n      }\n      return anyUriToBlob(src);\n    }\n    function blobToImage(blob) {\n      return new Promise(function (resolve, reject) {\n        var blobUrl = domGlobals.URL.createObjectURL(blob);\n        var image = new domGlobals.Image();\n        var removeListeners = function () {\n          image.removeEventListener('load', loaded);\n          image.removeEventListener('error', error);\n        };\n        function loaded() {\n          removeListeners();\n          resolve(image);\n        }\n        function error() {\n          removeListeners();\n          reject('Unable to load data of type ' + blob.type + ': ' + blobUrl);\n        }\n        image.addEventListener('load', loaded);\n        image.addEventListener('error', error);\n        image.src = blobUrl;\n        if (image.complete) {\n          loaded();\n        }\n      });\n    }\n    function anyUriToBlob(url) {\n      return new Promise(function (resolve, reject) {\n        var xhr = new domGlobals.XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'blob';\n        xhr.onload = function () {\n          if (this.status === 200) {\n            resolve(this.response);\n          }\n        };\n        xhr.onerror = function () {\n          var _this = this;\n          var corsError = function () {\n            var obj = new Error('No access to download image');\n            obj.code = 18;\n            obj.name = 'SecurityError';\n            return obj;\n          };\n          var genericError = function () {\n            return new Error('Error ' + _this.status + ' downloading image');\n          };\n          reject(this.status === 0 ? corsError() : genericError());\n        };\n        xhr.send();\n      });\n    }\n    function dataUriToBlobSync(uri) {\n      var data = uri.split(',');\n      var matches = /data:([^;]+)/.exec(data[0]);\n      if (!matches) {\n        return Option.none();\n      }\n      var mimetype = matches[1];\n      var base64 = data[1];\n      var sliceSize = 1024;\n      var byteCharacters = domGlobals.atob(base64);\n      var bytesLength = byteCharacters.length;\n      var slicesCount = Math.ceil(bytesLength / sliceSize);\n      var byteArrays = new Array(slicesCount);\n      for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n        var begin = sliceIndex * sliceSize;\n        var end = Math.min(begin + sliceSize, bytesLength);\n        var bytes = new Array(end - begin);\n        for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\n          bytes[i] = byteCharacters[offset].charCodeAt(0);\n        }\n        byteArrays[sliceIndex] = new Uint8Array(bytes);\n      }\n      return Option.some(new domGlobals.Blob(byteArrays, { type: mimetype }));\n    }\n    function dataUriToBlob(uri) {\n      return new Promise(function (resolve, reject) {\n        dataUriToBlobSync(uri).fold(function () {\n          reject('uri is not base64: ' + uri);\n        }, resolve);\n      });\n    }\n    function canvasToBlob(canvas, type, quality) {\n      type = type || 'image/png';\n      if (domGlobals.HTMLCanvasElement.prototype.toBlob) {\n        return new Promise(function (resolve, reject) {\n          canvas.toBlob(function (blob) {\n            if (blob) {\n              resolve(blob);\n            } else {\n              reject();\n            }\n          }, type, quality);\n        });\n      } else {\n        return dataUriToBlob(canvas.toDataURL(type, quality));\n      }\n    }\n    function canvasToDataURL(canvas, type, quality) {\n      type = type || 'image/png';\n      return canvas.toDataURL(type, quality);\n    }\n    function blobToCanvas(blob) {\n      return blobToImage(blob).then(function (image) {\n        revokeImageUrl(image);\n        var canvas = create(getWidth(image), getHeight(image));\n        var context = get2dContext(canvas);\n        context.drawImage(image, 0, 0);\n        return canvas;\n      });\n    }\n    function blobToDataUri(blob) {\n      return new Promise(function (resolve) {\n        var reader = new domGlobals.FileReader();\n        reader.onloadend = function () {\n          resolve(reader.result);\n        };\n        reader.readAsDataURL(blob);\n      });\n    }\n    function revokeImageUrl(image) {\n      domGlobals.URL.revokeObjectURL(image.src);\n    }\n\n    var blobToImage$1 = function (blob) {\n      return blobToImage(blob);\n    };\n    var imageToBlob$1 = function (image) {\n      return imageToBlob(image);\n    };\n\n    function create$1(getCanvas, blob, uri) {\n      var initialType = blob.type;\n      var getType = constant(initialType);\n      function toBlob() {\n        return Promise.resolve(blob);\n      }\n      function toDataURL() {\n        return uri;\n      }\n      function toBase64() {\n        return uri.split(',')[1];\n      }\n      function toAdjustedBlob(type, quality) {\n        return getCanvas.then(function (canvas) {\n          return canvasToBlob(canvas, type, quality);\n        });\n      }\n      function toAdjustedDataURL(type, quality) {\n        return getCanvas.then(function (canvas) {\n          return canvasToDataURL(canvas, type, quality);\n        });\n      }\n      function toAdjustedBase64(type, quality) {\n        return toAdjustedDataURL(type, quality).then(function (dataurl) {\n          return dataurl.split(',')[1];\n        });\n      }\n      function toCanvas() {\n        return getCanvas.then(clone);\n      }\n      return {\n        getType: getType,\n        toBlob: toBlob,\n        toDataURL: toDataURL,\n        toBase64: toBase64,\n        toAdjustedBlob: toAdjustedBlob,\n        toAdjustedDataURL: toAdjustedDataURL,\n        toAdjustedBase64: toAdjustedBase64,\n        toCanvas: toCanvas\n      };\n    }\n    function fromBlob(blob) {\n      return blobToDataUri(blob).then(function (uri) {\n        return create$1(blobToCanvas(blob), blob, uri);\n      });\n    }\n    function fromCanvas(canvas, type) {\n      return canvasToBlob(canvas, type).then(function (blob) {\n        return create$1(Promise.resolve(canvas), blob, canvas.toDataURL());\n      });\n    }\n\n    function rotate(ir, angle) {\n      return ir.toCanvas().then(function (canvas) {\n        return applyRotate(canvas, ir.getType(), angle);\n      });\n    }\n    function applyRotate(image, type, angle) {\n      var canvas = create(image.width, image.height);\n      var context = get2dContext(canvas);\n      var translateX = 0;\n      var translateY = 0;\n      angle = angle < 0 ? 360 + angle : angle;\n      if (angle === 90 || angle === 270) {\n        resize(canvas, canvas.height, canvas.width);\n      }\n      if (angle === 90 || angle === 180) {\n        translateX = canvas.width;\n      }\n      if (angle === 270 || angle === 180) {\n        translateY = canvas.height;\n      }\n      context.translate(translateX, translateY);\n      context.rotate(angle * Math.PI / 180);\n      context.drawImage(image, 0, 0);\n      return fromCanvas(canvas, type);\n    }\n    function flip(ir, axis) {\n      return ir.toCanvas().then(function (canvas) {\n        return applyFlip(canvas, ir.getType(), axis);\n      });\n    }\n    function applyFlip(image, type, axis) {\n      var canvas = create(image.width, image.height);\n      var context = get2dContext(canvas);\n      if (axis === 'v') {\n        context.scale(1, -1);\n        context.drawImage(image, 0, -canvas.height);\n      } else {\n        context.scale(-1, 1);\n        context.drawImage(image, -canvas.width, 0);\n      }\n      return fromCanvas(canvas, type);\n    }\n\n    var flip$1 = function (ir, axis) {\n      return flip(ir, axis);\n    };\n    var rotate$1 = function (ir, angle) {\n      return rotate(ir, angle);\n    };\n\n    var blobToImageResult = function (blob) {\n      return fromBlob(blob);\n    };\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n    var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n    var global$4 = tinymce.util.Tools.resolve('tinymce.util.URI');\n\n    var getToolbarItems = function (editor) {\n      return editor.getParam('imagetools_toolbar', 'rotateleft rotateright flipv fliph editimage imageoptions');\n    };\n    var getProxyUrl = function (editor) {\n      return editor.getParam('imagetools_proxy');\n    };\n    var getCorsHosts = function (editor) {\n      return editor.getParam('imagetools_cors_hosts', [], 'string[]');\n    };\n    var getCredentialsHosts = function (editor) {\n      return editor.getParam('imagetools_credentials_hosts', [], 'string[]');\n    };\n    var getFetchImage = function (editor) {\n      return Option.from(editor.getParam('imagetools_fetch_image', null, 'function'));\n    };\n    var getApiKey = function (editor) {\n      return editor.getParam('api_key', editor.getParam('imagetools_api_key', '', 'string'), 'string');\n    };\n    var getUploadTimeout = function (editor) {\n      return editor.getParam('images_upload_timeout', 30000, 'number');\n    };\n    var shouldReuseFilename = function (editor) {\n      return editor.getParam('images_reuse_filename', false, 'boolean');\n    };\n\n    function getImageSize(img) {\n      var width, height;\n      function isPxValue(value) {\n        return /^[0-9\\.]+px$/.test(value);\n      }\n      width = img.style.width;\n      height = img.style.height;\n      if (width || height) {\n        if (isPxValue(width) && isPxValue(height)) {\n          return {\n            w: parseInt(width, 10),\n            h: parseInt(height, 10)\n          };\n        }\n        return null;\n      }\n      width = img.width;\n      height = img.height;\n      if (width && height) {\n        return {\n          w: parseInt(width, 10),\n          h: parseInt(height, 10)\n        };\n      }\n      return null;\n    }\n    function setImageSize(img, size) {\n      var width, height;\n      if (size) {\n        width = img.style.width;\n        height = img.style.height;\n        if (width || height) {\n          img.style.width = size.w + 'px';\n          img.style.height = size.h + 'px';\n          img.removeAttribute('data-mce-style');\n        }\n        width = img.width;\n        height = img.height;\n        if (width || height) {\n          img.setAttribute('width', size.w);\n          img.setAttribute('height', size.h);\n        }\n      }\n    }\n    function getNaturalImageSize(img) {\n      return {\n        w: img.naturalWidth,\n        h: img.naturalHeight\n      };\n    }\n    var ImageSize = {\n      getImageSize: getImageSize,\n      setImageSize: setImageSize,\n      getNaturalImageSize: getNaturalImageSize\n    };\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isFunction = isType('function');\n\n    var nativeSlice = Array.prototype.slice;\n    var find = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return Option.some(x);\n        }\n      }\n      return Option.none();\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n\n    var isValue = function (obj) {\n      return obj !== null && obj !== undefined;\n    };\n    var traverse = function (json, path) {\n      var value;\n      value = path.reduce(function (result, key) {\n        return isValue(result) ? result[key] : undefined;\n      }, json);\n      return isValue(value) ? value : null;\n    };\n    var requestUrlAsBlob = function (url, headers, withCredentials) {\n      return new global$3(function (resolve) {\n        var xhr;\n        xhr = new domGlobals.XMLHttpRequest();\n        xhr.onreadystatechange = function () {\n          if (xhr.readyState === 4) {\n            resolve({\n              status: xhr.status,\n              blob: this.response\n            });\n          }\n        };\n        xhr.open('GET', url, true);\n        xhr.withCredentials = withCredentials;\n        global$1.each(headers, function (value, key) {\n          xhr.setRequestHeader(key, value);\n        });\n        xhr.responseType = 'blob';\n        xhr.send();\n      });\n    };\n    var readBlob = function (blob) {\n      return new global$3(function (resolve) {\n        var fr = new domGlobals.FileReader();\n        fr.onload = function (e) {\n          var data = e.target;\n          resolve(data.result);\n        };\n        fr.readAsText(blob);\n      });\n    };\n    var parseJson = function (text) {\n      var json;\n      try {\n        json = JSON.parse(text);\n      } catch (ex) {\n      }\n      return json;\n    };\n    var Utils = {\n      traverse: traverse,\n      readBlob: readBlob,\n      requestUrlAsBlob: requestUrlAsBlob,\n      parseJson: parseJson\n    };\n\n    var friendlyHttpErrors = [\n      {\n        code: 404,\n        message: 'Could not find Image Proxy'\n      },\n      {\n        code: 403,\n        message: 'Rejected request'\n      },\n      {\n        code: 0,\n        message: 'Incorrect Image Proxy URL'\n      }\n    ];\n    var friendlyServiceErrors = [\n      {\n        type: 'key_missing',\n        message: 'The request did not include an api key.'\n      },\n      {\n        type: 'key_not_found',\n        message: 'The provided api key could not be found.'\n      },\n      {\n        type: 'domain_not_trusted',\n        message: 'The api key is not valid for the request origins.'\n      }\n    ];\n    var isServiceErrorCode = function (code) {\n      return code === 400 || code === 403 || code === 500;\n    };\n    var getHttpErrorMsg = function (status) {\n      var message = find(friendlyHttpErrors, function (error) {\n        return status === error.code;\n      }).fold(constant('Unknown ImageProxy error'), function (error) {\n        return error.message;\n      });\n      return 'ImageProxy HTTP error: ' + message;\n    };\n    var handleHttpError = function (status) {\n      var message = getHttpErrorMsg(status);\n      return global$3.reject(message);\n    };\n    var getServiceErrorMsg = function (type) {\n      return find(friendlyServiceErrors, function (error) {\n        return error.type === type;\n      }).fold(constant('Unknown service error'), function (error) {\n        return error.message;\n      });\n    };\n    var getServiceError = function (text) {\n      var serviceError = Utils.parseJson(text);\n      var errorType = Utils.traverse(serviceError, [\n        'error',\n        'type'\n      ]);\n      var errorMsg = errorType ? getServiceErrorMsg(errorType) : 'Invalid JSON in service error message';\n      return 'ImageProxy Service error: ' + errorMsg;\n    };\n    var handleServiceError = function (status, blob) {\n      return Utils.readBlob(blob).then(function (text) {\n        var serviceError = getServiceError(text);\n        return global$3.reject(serviceError);\n      });\n    };\n    var handleServiceErrorResponse = function (status, blob) {\n      return isServiceErrorCode(status) ? handleServiceError(status, blob) : handleHttpError(status);\n    };\n    var Errors = {\n      handleServiceErrorResponse: handleServiceErrorResponse,\n      handleHttpError: handleHttpError,\n      getHttpErrorMsg: getHttpErrorMsg,\n      getServiceErrorMsg: getServiceErrorMsg\n    };\n\n    var appendApiKey = function (url, apiKey) {\n      var separator = url.indexOf('?') === -1 ? '?' : '&';\n      if (/[?&]apiKey=/.test(url) || !apiKey) {\n        return url;\n      } else {\n        return url + separator + 'apiKey=' + encodeURIComponent(apiKey);\n      }\n    };\n    var requestServiceBlob = function (url, apiKey) {\n      var headers = {\n        'Content-Type': 'application/json;charset=UTF-8',\n        'tiny-api-key': apiKey\n      };\n      return Utils.requestUrlAsBlob(appendApiKey(url, apiKey), headers, false).then(function (result) {\n        return result.status < 200 || result.status >= 300 ? Errors.handleServiceErrorResponse(result.status, result.blob) : global$3.resolve(result.blob);\n      });\n    };\n    function requestBlob(url, withCredentials) {\n      return Utils.requestUrlAsBlob(url, {}, withCredentials).then(function (result) {\n        return result.status < 200 || result.status >= 300 ? Errors.handleHttpError(result.status) : global$3.resolve(result.blob);\n      });\n    }\n    var getUrl = function (url, apiKey, withCredentials) {\n      return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url, withCredentials);\n    };\n\n    var compareDocumentPosition = function (a, b, match) {\n      return (a.compareDocumentPosition(b) & match) !== 0;\n    };\n    var documentPositionPreceding = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING);\n    };\n    var documentPositionContainedBy = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY);\n    };\n    var Node = {\n      documentPositionPreceding: documentPositionPreceding,\n      documentPositionContainedBy: documentPositionContainedBy\n    };\n\n    var firstMatch = function (regexes, s) {\n      for (var i = 0; i < regexes.length; i++) {\n        var x = regexes[i];\n        if (x.test(s)) {\n          return x;\n        }\n      }\n      return undefined;\n    };\n    var find$1 = function (regexes, agent) {\n      var r = firstMatch(regexes, agent);\n      if (!r) {\n        return {\n          major: 0,\n          minor: 0\n        };\n      }\n      var group = function (i) {\n        return Number(agent.replace(r, '$' + i));\n      };\n      return nu(group(1), group(2));\n    };\n    var detect = function (versionRegexes, agent) {\n      var cleanedAgent = String(agent).toLowerCase();\n      if (versionRegexes.length === 0) {\n        return unknown();\n      }\n      return find$1(versionRegexes, cleanedAgent);\n    };\n    var unknown = function () {\n      return nu(0, 0);\n    };\n    var nu = function (major, minor) {\n      return {\n        major: major,\n        minor: minor\n      };\n    };\n    var Version = {\n      nu: nu,\n      detect: detect,\n      unknown: unknown\n    };\n\n    var edge = 'Edge';\n    var chrome = 'Chrome';\n    var ie = 'IE';\n    var opera = 'Opera';\n    var firefox = 'Firefox';\n    var safari = 'Safari';\n    var isBrowser = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$1 = function () {\n      return nu$1({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$1 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isEdge: isBrowser(edge, current),\n        isChrome: isBrowser(chrome, current),\n        isIE: isBrowser(ie, current),\n        isOpera: isBrowser(opera, current),\n        isFirefox: isBrowser(firefox, current),\n        isSafari: isBrowser(safari, current)\n      };\n    };\n    var Browser = {\n      unknown: unknown$1,\n      nu: nu$1,\n      edge: constant(edge),\n      chrome: constant(chrome),\n      ie: constant(ie),\n      opera: constant(opera),\n      firefox: constant(firefox),\n      safari: constant(safari)\n    };\n\n    var windows = 'Windows';\n    var ios = 'iOS';\n    var android = 'Android';\n    var linux = 'Linux';\n    var osx = 'OSX';\n    var solaris = 'Solaris';\n    var freebsd = 'FreeBSD';\n    var chromeos = 'ChromeOS';\n    var isOS = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$2 = function () {\n      return nu$2({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$2 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isWindows: isOS(windows, current),\n        isiOS: isOS(ios, current),\n        isAndroid: isOS(android, current),\n        isOSX: isOS(osx, current),\n        isLinux: isOS(linux, current),\n        isSolaris: isOS(solaris, current),\n        isFreeBSD: isOS(freebsd, current),\n        isChromeOS: isOS(chromeos, current)\n      };\n    };\n    var OperatingSystem = {\n      unknown: unknown$2,\n      nu: nu$2,\n      windows: constant(windows),\n      ios: constant(ios),\n      android: constant(android),\n      linux: constant(linux),\n      osx: constant(osx),\n      solaris: constant(solaris),\n      freebsd: constant(freebsd),\n      chromeos: constant(chromeos)\n    };\n\n    var DeviceType = function (os, browser, userAgent, mediaMatch) {\n      var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;\n      var isiPhone = os.isiOS() && !isiPad;\n      var isMobile = os.isiOS() || os.isAndroid();\n      var isTouch = isMobile || mediaMatch('(pointer:coarse)');\n      var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');\n      var isPhone = isiPhone || isMobile && !isTablet;\n      var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;\n      var isDesktop = !isPhone && !isTablet && !iOSwebview;\n      return {\n        isiPad: constant(isiPad),\n        isiPhone: constant(isiPhone),\n        isTablet: constant(isTablet),\n        isPhone: constant(isPhone),\n        isTouch: constant(isTouch),\n        isAndroid: os.isAndroid,\n        isiOS: os.isiOS,\n        isWebView: constant(iOSwebview),\n        isDesktop: constant(isDesktop)\n      };\n    };\n\n    var detect$1 = function (candidates, userAgent) {\n      var agent = String(userAgent).toLowerCase();\n      return find(candidates, function (candidate) {\n        return candidate.search(agent);\n      });\n    };\n    var detectBrowser = function (browsers, userAgent) {\n      return detect$1(browsers, userAgent).map(function (browser) {\n        var version = Version.detect(browser.versionRegexes, userAgent);\n        return {\n          current: browser.name,\n          version: version\n        };\n      });\n    };\n    var detectOs = function (oses, userAgent) {\n      return detect$1(oses, userAgent).map(function (os) {\n        var version = Version.detect(os.versionRegexes, userAgent);\n        return {\n          current: os.name,\n          version: version\n        };\n      });\n    };\n    var UaString = {\n      detectBrowser: detectBrowser,\n      detectOs: detectOs\n    };\n\n    var contains = function (str, substr) {\n      return str.indexOf(substr) !== -1;\n    };\n\n    var normalVersionRegex = /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/;\n    var checkContains = function (target) {\n      return function (uastring) {\n        return contains(uastring, target);\n      };\n    };\n    var browsers = [\n      {\n        name: 'Edge',\n        versionRegexes: [/.*?edge\\/ ?([0-9]+)\\.([0-9]+)$/],\n        search: function (uastring) {\n          return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');\n        }\n      },\n      {\n        name: 'Chrome',\n        versionRegexes: [\n          /.*?chrome\\/([0-9]+)\\.([0-9]+).*/,\n          normalVersionRegex\n        ],\n        search: function (uastring) {\n          return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');\n        }\n      },\n      {\n        name: 'IE',\n        versionRegexes: [\n          /.*?msie\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*?rv:([0-9]+)\\.([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return contains(uastring, 'msie') || contains(uastring, 'trident');\n        }\n      },\n      {\n        name: 'Opera',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?opera\\/([0-9]+)\\.([0-9]+).*/\n        ],\n        search: checkContains('opera')\n      },\n      {\n        name: 'Firefox',\n        versionRegexes: [/.*?firefox\\/\\ ?([0-9]+)\\.([0-9]+).*/],\n        search: checkContains('firefox')\n      },\n      {\n        name: 'Safari',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?cpu os ([0-9]+)_([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');\n        }\n      }\n    ];\n    var oses = [\n      {\n        name: 'Windows',\n        search: checkContains('win'),\n        versionRegexes: [/.*?windows\\ nt\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'iOS',\n        search: function (uastring) {\n          return contains(uastring, 'iphone') || contains(uastring, 'ipad');\n        },\n        versionRegexes: [\n          /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*cpu os ([0-9]+)_([0-9]+).*/,\n          /.*cpu iphone os ([0-9]+)_([0-9]+).*/\n        ]\n      },\n      {\n        name: 'Android',\n        search: checkContains('android'),\n        versionRegexes: [/.*?android\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'OSX',\n        search: checkContains('mac os x'),\n        versionRegexes: [/.*?mac\\ os\\ x\\ ?([0-9]+)_([0-9]+).*/]\n      },\n      {\n        name: 'Linux',\n        search: checkContains('linux'),\n        versionRegexes: []\n      },\n      {\n        name: 'Solaris',\n        search: checkContains('sunos'),\n        versionRegexes: []\n      },\n      {\n        name: 'FreeBSD',\n        search: checkContains('freebsd'),\n        versionRegexes: []\n      },\n      {\n        name: 'ChromeOS',\n        search: checkContains('cros'),\n        versionRegexes: [/.*?chrome\\/([0-9]+)\\.([0-9]+).*/]\n      }\n    ];\n    var PlatformInfo = {\n      browsers: constant(browsers),\n      oses: constant(oses)\n    };\n\n    var detect$2 = function (userAgent, mediaMatch) {\n      var browsers = PlatformInfo.browsers();\n      var oses = PlatformInfo.oses();\n      var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);\n      var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);\n      var deviceType = DeviceType(os, browser, userAgent, mediaMatch);\n      return {\n        browser: browser,\n        os: os,\n        deviceType: deviceType\n      };\n    };\n    var PlatformDetection = { detect: detect$2 };\n\n    var mediaMatch = function (query) {\n      return domGlobals.window.matchMedia(query).matches;\n    };\n    var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch));\n    var detect$3 = function () {\n      return platform.get();\n    };\n\n    var fromHtml = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        domGlobals.console.error('HTML does not have a single root node', html);\n        throw new Error('HTML must have a single root node');\n      }\n      return fromDom(div.childNodes[0]);\n    };\n    var fromTag = function (tag, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createElement(tag);\n      return fromDom(node);\n    };\n    var fromText = function (text, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createTextNode(text);\n      return fromDom(node);\n    };\n    var fromDom = function (node) {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: constant(node) };\n    };\n    var fromPoint = function (docElm, x, y) {\n      var doc = docElm.dom();\n      return Option.from(doc.elementFromPoint(x, y)).map(fromDom);\n    };\n    var Element = {\n      fromHtml: fromHtml,\n      fromTag: fromTag,\n      fromText: fromText,\n      fromDom: fromDom,\n      fromPoint: fromPoint\n    };\n\n    var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;\n    var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;\n    var COMMENT = domGlobals.Node.COMMENT_NODE;\n    var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;\n    var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;\n    var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;\n    var ELEMENT = domGlobals.Node.ELEMENT_NODE;\n    var TEXT = domGlobals.Node.TEXT_NODE;\n    var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;\n    var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;\n    var ENTITY = domGlobals.Node.ENTITY_NODE;\n    var NOTATION = domGlobals.Node.NOTATION_NODE;\n\n    var ELEMENT$1 = ELEMENT;\n    var is = function (element, selector) {\n      var dom = element.dom();\n      if (dom.nodeType !== ELEMENT$1) {\n        return false;\n      } else {\n        var elem = dom;\n        if (elem.matches !== undefined) {\n          return elem.matches(selector);\n        } else if (elem.msMatchesSelector !== undefined) {\n          return elem.msMatchesSelector(selector);\n        } else if (elem.webkitMatchesSelector !== undefined) {\n          return elem.webkitMatchesSelector(selector);\n        } else if (elem.mozMatchesSelector !== undefined) {\n          return elem.mozMatchesSelector(selector);\n        } else {\n          throw new Error('Browser lacks native selectors');\n        }\n      }\n    };\n\n    var regularContains = function (e1, e2) {\n      var d1 = e1.dom();\n      var d2 = e2.dom();\n      return d1 === d2 ? false : d1.contains(d2);\n    };\n    var ieContains = function (e1, e2) {\n      return Node.documentPositionContainedBy(e1.dom(), e2.dom());\n    };\n    var browser = detect$3().browser;\n    var contains$1 = browser.isIE() ? ieContains : regularContains;\n\n    var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();\n\n    var child = function (scope, predicate) {\n      var pred = function (node) {\n        return predicate(Element.fromDom(node));\n      };\n      var result = find(scope.dom().childNodes, pred);\n      return result.map(Element.fromDom);\n    };\n\n    var child$1 = function (scope, selector) {\n      return child(scope, function (e) {\n        return is(e, selector);\n      });\n    };\n\n    var count = 0;\n    var getFigureImg = function (elem) {\n      return child$1(Element.fromDom(elem), 'img');\n    };\n    var isFigure = function (editor, elem) {\n      return editor.dom.is(elem, 'figure');\n    };\n    var getEditableImage = function (editor, elem) {\n      var isImage = function (imgNode) {\n        return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])');\n      };\n      var isEditable = function (imgNode) {\n        return isImage(imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || editor.settings.imagetools_proxy);\n      };\n      if (isFigure(editor, elem)) {\n        var imgOpt = getFigureImg(elem);\n        return imgOpt.map(function (img) {\n          return isEditable(img.dom()) ? Option.some(img.dom()) : Option.none();\n        });\n      }\n      return isEditable(elem) ? Option.some(elem) : Option.none();\n    };\n    var displayError = function (editor, error) {\n      editor.notificationManager.open({\n        text: error,\n        type: 'error'\n      });\n    };\n    var getSelectedImage = function (editor) {\n      var elem = editor.selection.getNode();\n      if (isFigure(editor, elem)) {\n        return getFigureImg(elem);\n      } else {\n        return Option.some(Element.fromDom(elem));\n      }\n    };\n    var extractFilename = function (editor, url) {\n      var m = url.match(/\\/([^\\/\\?]+)?\\.(?:jpeg|jpg|png|gif)(?:\\?|$)/i);\n      if (m) {\n        return editor.dom.encode(m[1]);\n      }\n      return null;\n    };\n    var createId = function () {\n      return 'imagetools' + count++;\n    };\n    var isLocalImage = function (editor, img) {\n      var url = img.src;\n      return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$4(url).host === editor.documentBaseURI.host;\n    };\n    var isCorsImage = function (editor, img) {\n      return global$1.inArray(getCorsHosts(editor), new global$4(img.src).host) !== -1;\n    };\n    var isCorsWithCredentialsImage = function (editor, img) {\n      return global$1.inArray(getCredentialsHosts(editor), new global$4(img.src).host) !== -1;\n    };\n    var defaultFetchImage = function (editor, img) {\n      var src = img.src, apiKey;\n      if (isCorsImage(editor, img)) {\n        return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img));\n      }\n      if (!isLocalImage(editor, img)) {\n        src = getProxyUrl(editor);\n        src += (src.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src);\n        apiKey = getApiKey(editor);\n        return getUrl(src, apiKey, false);\n      }\n      return imageToBlob$1(img);\n    };\n    var imageToBlob$2 = function (editor, img) {\n      return getFetchImage(editor).fold(function () {\n        return defaultFetchImage(editor, img);\n      }, function (customFetchImage) {\n        return customFetchImage(img);\n      });\n    };\n    var findBlob = function (editor, img) {\n      var blobInfo;\n      blobInfo = editor.editorUpload.blobCache.getByUri(img.src);\n      if (blobInfo) {\n        return global$3.resolve(blobInfo.blob());\n      }\n      return imageToBlob$2(editor, img);\n    };\n    var startTimedUpload = function (editor, imageUploadTimerState) {\n      var imageUploadTimer = global$2.setEditorTimeout(editor, function () {\n        editor.editorUpload.uploadImagesAuto();\n      }, getUploadTimeout(editor));\n      imageUploadTimerState.set(imageUploadTimer);\n    };\n    var cancelTimedUpload = function (imageUploadTimerState) {\n      global$2.clearTimeout(imageUploadTimerState.get());\n    };\n    var updateSelectedImage = function (editor, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) {\n      return ir.toBlob().then(function (blob) {\n        var uri, name, blobCache, blobInfo;\n        blobCache = editor.editorUpload.blobCache;\n        uri = selectedImage.src;\n        if (shouldReuseFilename(editor)) {\n          blobInfo = blobCache.getByUri(uri);\n          if (blobInfo) {\n            uri = blobInfo.uri();\n            name = blobInfo.name();\n          } else {\n            name = extractFilename(editor, uri);\n          }\n        }\n        blobInfo = blobCache.create({\n          id: createId(),\n          blob: blob,\n          base64: ir.toBase64(),\n          uri: uri,\n          name: name\n        });\n        blobCache.add(blobInfo);\n        editor.undoManager.transact(function () {\n          function imageLoadedHandler() {\n            editor.$(selectedImage).off('load', imageLoadedHandler);\n            editor.nodeChanged();\n            if (uploadImmediately) {\n              editor.editorUpload.uploadImagesAuto();\n            } else {\n              cancelTimedUpload(imageUploadTimerState);\n              startTimedUpload(editor, imageUploadTimerState);\n            }\n          }\n          editor.$(selectedImage).on('load', imageLoadedHandler);\n          if (size) {\n            editor.$(selectedImage).attr({\n              width: size.w,\n              height: size.h\n            });\n          }\n          editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src');\n        });\n        return blobInfo;\n      });\n    };\n    var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) {\n      return function () {\n        var imgOpt = getSelectedImage(editor);\n        return imgOpt.fold(function () {\n          displayError(editor, 'Could not find selected image');\n        }, function (img) {\n          return editor._scanForImages().then(function () {\n            return findBlob(editor, img.dom());\n          }).then(blobToImageResult).then(fn).then(function (imageResult) {\n            return updateSelectedImage(editor, imageResult, false, imageUploadTimerState, img.dom(), size);\n          }, function (error) {\n            displayError(editor, error);\n          });\n        });\n      };\n    };\n    var rotate$2 = function (editor, imageUploadTimerState, angle) {\n      return function () {\n        var imgOpt = getSelectedImage(editor);\n        var flippedSize = imgOpt.fold(function () {\n          return null;\n        }, function (img) {\n          var size = ImageSize.getImageSize(img.dom());\n          return size ? {\n            w: size.h,\n            h: size.w\n          } : null;\n        });\n        return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) {\n          return rotate$1(imageResult, angle);\n        }, flippedSize)();\n      };\n    };\n    var flip$2 = function (editor, imageUploadTimerState, axis) {\n      return function () {\n        return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) {\n          return flip$1(imageResult, axis);\n        })();\n      };\n    };\n    var handleDialogBlob = function (editor, imageUploadTimerState, img, originalSize, blob) {\n      return new global$3(function (resolve) {\n        blobToImage$1(blob).then(function (newImage) {\n          var newSize = ImageSize.getNaturalImageSize(newImage);\n          if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) {\n            if (ImageSize.getImageSize(img)) {\n              ImageSize.setImageSize(img, newSize);\n            }\n          }\n          domGlobals.URL.revokeObjectURL(newImage.src);\n          return blob;\n        }).then(blobToImageResult).then(function (imageResult) {\n          return updateSelectedImage(editor, imageResult, true, imageUploadTimerState, img);\n        }, function () {\n        });\n      });\n    };\n    var Actions = {\n      rotate: rotate$2,\n      flip: flip$2,\n      getEditableImage: getEditableImage,\n      cancelTimedUpload: cancelTimedUpload,\n      findBlob: findBlob,\n      getSelectedImage: getSelectedImage,\n      handleDialogBlob: handleDialogBlob\n    };\n\n    var saveState = constant('save-state');\n    var disable = constant('disable');\n    var enable = constant('enable');\n\n    var createState = function (blob) {\n      return {\n        blob: blob,\n        url: domGlobals.URL.createObjectURL(blob)\n      };\n    };\n    var makeOpen = function (editor, imageUploadTimerState) {\n      return function () {\n        var getLoadedSpec = function (currentState) {\n          return {\n            title: 'Edit Image',\n            size: 'large',\n            body: {\n              type: 'panel',\n              items: [{\n                  type: 'imagetools',\n                  name: 'imagetools',\n                  label: 'Edit Image',\n                  currentState: currentState\n                }]\n            },\n            buttons: [\n              {\n                type: 'cancel',\n                name: 'cancel',\n                text: 'Cancel'\n              },\n              {\n                type: 'submit',\n                name: 'save',\n                text: 'Save',\n                primary: true,\n                disabled: true\n              }\n            ],\n            onSubmit: function (api) {\n              var blob = api.getData().imagetools.blob;\n              originalImgOpt.each(function (originalImg) {\n                originalSizeOpt.each(function (originalSize) {\n                  Actions.handleDialogBlob(editor, imageUploadTimerState, originalImg.dom(), originalSize, blob);\n                });\n              });\n              api.close();\n            },\n            onCancel: function () {\n            },\n            onAction: function (api, details) {\n              switch (details.name) {\n              case saveState():\n                if (details.value) {\n                  api.enable('save');\n                } else {\n                  api.disable('save');\n                }\n                break;\n              case disable():\n                api.disable('save');\n                api.disable('cancel');\n                break;\n              case enable():\n                api.enable('cancel');\n                break;\n              }\n            }\n          };\n        };\n        var originalImgOpt = Actions.getSelectedImage(editor);\n        var originalSizeOpt = originalImgOpt.map(function (origImg) {\n          return ImageSize.getNaturalImageSize(origImg.dom());\n        });\n        var imgOpt = Actions.getSelectedImage(editor);\n        imgOpt.each(function (img) {\n          Actions.getEditableImage(editor, img.dom()).each(function (_) {\n            Actions.findBlob(editor, img.dom()).then(function (blob) {\n              var state = createState(blob);\n              editor.windowManager.open(getLoadedSpec(state));\n            });\n          });\n        });\n      };\n    };\n    var Dialog = { makeOpen: makeOpen };\n\n    var register = function (editor, imageUploadTimerState) {\n      global$1.each({\n        mceImageRotateLeft: Actions.rotate(editor, imageUploadTimerState, -90),\n        mceImageRotateRight: Actions.rotate(editor, imageUploadTimerState, 90),\n        mceImageFlipVertical: Actions.flip(editor, imageUploadTimerState, 'v'),\n        mceImageFlipHorizontal: Actions.flip(editor, imageUploadTimerState, 'h'),\n        mceEditImage: Dialog.makeOpen(editor, imageUploadTimerState)\n      }, function (fn, cmd) {\n        editor.addCommand(cmd, fn);\n      });\n    };\n    var Commands = { register: register };\n\n    var setup = function (editor, imageUploadTimerState, lastSelectedImageState) {\n      editor.on('NodeChange', function (e) {\n        var lastSelectedImage = lastSelectedImageState.get();\n        if (lastSelectedImage && lastSelectedImage.src !== e.element.src) {\n          Actions.cancelTimedUpload(imageUploadTimerState);\n          editor.editorUpload.uploadImagesAuto();\n          lastSelectedImageState.set(null);\n        }\n        Actions.getEditableImage(editor, e.element).each(lastSelectedImageState.set);\n      });\n    };\n    var UploadSelectedImage = { setup: setup };\n\n    var register$1 = function (editor) {\n      var cmd = function (command) {\n        return function () {\n          return editor.execCommand(command);\n        };\n      };\n      editor.ui.registry.addButton('rotateleft', {\n        tooltip: 'Rotate counterclockwise',\n        icon: 'rotate-left',\n        onAction: cmd('mceImageRotateLeft')\n      });\n      editor.ui.registry.addButton('rotateright', {\n        tooltip: 'Rotate clockwise',\n        icon: 'rotate-right',\n        onAction: cmd('mceImageRotateRight')\n      });\n      editor.ui.registry.addButton('flipv', {\n        tooltip: 'Flip vertically',\n        icon: 'flip-vertically',\n        onAction: cmd('mceImageFlipVertical')\n      });\n      editor.ui.registry.addButton('fliph', {\n        tooltip: 'Flip horizontally',\n        icon: 'flip-horizontally',\n        onAction: cmd('mceImageFlipHorizontal')\n      });\n      editor.ui.registry.addButton('editimage', {\n        tooltip: 'Edit image',\n        icon: 'edit-image',\n        onAction: cmd('mceEditImage'),\n        onSetup: function (buttonApi) {\n          var setDisabled = function () {\n            var elementOpt = Actions.getSelectedImage(editor);\n            elementOpt.each(function (element) {\n              var disabled = Actions.getEditableImage(editor, element.dom()).isNone();\n              buttonApi.setDisabled(disabled);\n            });\n          };\n          editor.on('NodeChange', setDisabled);\n          return function () {\n            editor.off('NodeChange', setDisabled);\n          };\n        }\n      });\n      editor.ui.registry.addButton('imageoptions', {\n        tooltip: 'Image options',\n        icon: 'image-options',\n        onAction: cmd('mceImage')\n      });\n      editor.ui.registry.addContextMenu('imagetools', {\n        update: function (element) {\n          return Actions.getEditableImage(editor, element).fold(function () {\n            return [];\n          }, function (_) {\n            return [{\n                text: 'Edit image',\n                icon: 'edit-image',\n                onAction: cmd('mceEditImage')\n              }];\n          });\n        }\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    var register$2 = function (editor) {\n      editor.ui.registry.addContextToolbar('imagetools', {\n        items: getToolbarItems(editor),\n        predicate: function (elem) {\n          return Actions.getEditableImage(editor, elem).isSome();\n        },\n        position: 'node',\n        scope: 'node'\n      });\n    };\n    var ContextToolbar = { register: register$2 };\n\n    function Plugin () {\n      global.add('imagetools', function (editor) {\n        var imageUploadTimerState = Cell(0);\n        var lastSelectedImageState = Cell(null);\n        Commands.register(editor, imageUploadTimerState);\n        Buttons.register(editor);\n        ContextToolbar.register(editor);\n        UploadSelectedImage.setup(editor, imageUploadTimerState, lastSelectedImageState);\n      });\n    }\n\n    Plugin();\n\n}(window));\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function () {\n    'use strict';\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var getDateFormat = function (editor) {\n      return editor.getParam('insertdatetime_dateformat', editor.translate('%Y-%m-%d'));\n    };\n    var getTimeFormat = function (editor) {\n      return editor.getParam('insertdatetime_timeformat', editor.translate('%H:%M:%S'));\n    };\n    var getFormats = function (editor) {\n      return editor.getParam('insertdatetime_formats', [\n        '%H:%M:%S',\n        '%Y-%m-%d',\n        '%I:%M:%S %p',\n        '%D'\n      ]);\n    };\n    var getDefaultDateTime = function (editor) {\n      var formats = getFormats(editor);\n      return formats.length > 0 ? formats[0] : getTimeFormat(editor);\n    };\n    var shouldInsertTimeElement = function (editor) {\n      return editor.getParam('insertdatetime_element', false);\n    };\n    var Settings = {\n      getDateFormat: getDateFormat,\n      getTimeFormat: getTimeFormat,\n      getFormats: getFormats,\n      getDefaultDateTime: getDefaultDateTime,\n      shouldInsertTimeElement: shouldInsertTimeElement\n    };\n\n    var daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' ');\n    var daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' ');\n    var monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ');\n    var monthsLong = 'January February March April May June July August September October November December'.split(' ');\n    var addZeros = function (value, len) {\n      value = '' + value;\n      if (value.length < len) {\n        for (var i = 0; i < len - value.length; i++) {\n          value = '0' + value;\n        }\n      }\n      return value;\n    };\n    var getDateTime = function (editor, fmt, date) {\n      date = date || new Date();\n      fmt = fmt.replace('%D', '%m/%d/%Y');\n      fmt = fmt.replace('%r', '%I:%M:%S %p');\n      fmt = fmt.replace('%Y', '' + date.getFullYear());\n      fmt = fmt.replace('%y', '' + date.getYear());\n      fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2));\n      fmt = fmt.replace('%d', addZeros(date.getDate(), 2));\n      fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2));\n      fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2));\n      fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2));\n      fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1));\n      fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM'));\n      fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()]));\n      fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()]));\n      fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()]));\n      fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()]));\n      fmt = fmt.replace('%%', '%');\n      return fmt;\n    };\n    var updateElement = function (editor, timeElm, computerTime, userTime) {\n      var newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime);\n      timeElm.parentNode.insertBefore(newTimeElm, timeElm);\n      editor.dom.remove(timeElm);\n      editor.selection.select(newTimeElm, true);\n      editor.selection.collapse(false);\n    };\n    var insertDateTime = function (editor, format) {\n      if (Settings.shouldInsertTimeElement(editor)) {\n        var userTime = getDateTime(editor, format);\n        var computerTime = void 0;\n        if (/%[HMSIp]/.test(format)) {\n          computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M');\n        } else {\n          computerTime = getDateTime(editor, '%Y-%m-%d');\n        }\n        var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time');\n        if (timeElm) {\n          updateElement(editor, timeElm, computerTime, userTime);\n        } else {\n          editor.insertContent('<time datetime=\"' + computerTime + '\">' + userTime + '</time>');\n        }\n      } else {\n        editor.insertContent(getDateTime(editor, format));\n      }\n    };\n    var Actions = {\n      insertDateTime: insertDateTime,\n      getDateTime: getDateTime\n    };\n\n    var register = function (editor) {\n      editor.addCommand('mceInsertDate', function () {\n        Actions.insertDateTime(editor, Settings.getDateFormat(editor));\n      });\n      editor.addCommand('mceInsertTime', function () {\n        Actions.insertDateTime(editor, Settings.getTimeFormat(editor));\n      });\n    };\n    var Commands = { register: register };\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var register$1 = function (editor) {\n      var formats = Settings.getFormats(editor);\n      var defaultFormat = Cell(Settings.getDefaultDateTime(editor));\n      editor.ui.registry.addSplitButton('insertdatetime', {\n        icon: 'insert-time',\n        tooltip: 'Insert date/time',\n        select: function (value) {\n          return value === defaultFormat.get();\n        },\n        fetch: function (done) {\n          done(global$1.map(formats, function (format) {\n            return {\n              type: 'choiceitem',\n              text: Actions.getDateTime(editor, format),\n              value: format\n            };\n          }));\n        },\n        onAction: function () {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          Actions.insertDateTime(editor, defaultFormat.get());\n        },\n        onItemAction: function (_, value) {\n          defaultFormat.set(value);\n          Actions.insertDateTime(editor, value);\n        }\n      });\n      var makeMenuItemHandler = function (format) {\n        return function () {\n          defaultFormat.set(format);\n          Actions.insertDateTime(editor, format);\n        };\n      };\n      editor.ui.registry.addNestedMenuItem('insertdatetime', {\n        icon: 'insert-time',\n        text: 'Date/time',\n        getSubmenuItems: function () {\n          return global$1.map(formats, function (format) {\n            return {\n              type: 'menuitem',\n              text: Actions.getDateTime(editor, format),\n              onAction: makeMenuItemHandler(format)\n            };\n          });\n        }\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global.add('insertdatetime', function (editor) {\n        Commands.register(editor);\n        Buttons.register(editor);\n      });\n    }\n\n    Plugin();\n\n}());\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function () {\n    'use strict';\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.Env');\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n    var fireResizeEditor = function (editor) {\n      return editor.fire('ResizeEditor');\n    };\n    var Events = { fireResizeEditor: fireResizeEditor };\n\n    var getAutoResizeMinHeight = function (editor) {\n      return editor.getParam('min_height', editor.getElement().offsetHeight, 'number');\n    };\n    var getAutoResizeMaxHeight = function (editor) {\n      return editor.getParam('max_height', 0, 'number');\n    };\n    var getAutoResizeOverflowPadding = function (editor) {\n      return editor.getParam('autoresize_overflow_padding', 1, 'number');\n    };\n    var getAutoResizeBottomMargin = function (editor) {\n      return editor.getParam('autoresize_bottom_margin', 50, 'number');\n    };\n    var shouldAutoResizeOnInit = function (editor) {\n      return editor.getParam('autoresize_on_init', true, 'boolean');\n    };\n    var Settings = {\n      getAutoResizeMinHeight: getAutoResizeMinHeight,\n      getAutoResizeMaxHeight: getAutoResizeMaxHeight,\n      getAutoResizeOverflowPadding: getAutoResizeOverflowPadding,\n      getAutoResizeBottomMargin: getAutoResizeBottomMargin,\n      shouldAutoResizeOnInit: shouldAutoResizeOnInit\n    };\n\n    var isFullscreen = function (editor) {\n      return editor.plugins.fullscreen && editor.plugins.fullscreen.isFullscreen();\n    };\n    var wait = function (editor, oldSize, times, interval, callback) {\n      global$2.setEditorTimeout(editor, function () {\n        resize(editor, oldSize);\n        if (times--) {\n          wait(editor, oldSize, times, interval, callback);\n        } else if (callback) {\n          callback();\n        }\n      }, interval);\n    };\n    var toggleScrolling = function (editor, state) {\n      var body = editor.getBody();\n      if (body) {\n        body.style.overflowY = state ? '' : 'hidden';\n        if (!state) {\n          body.scrollTop = 0;\n        }\n      }\n    };\n    var parseCssValueToInt = function (dom, elm, name, computed) {\n      var value = parseInt(dom.getStyle(elm, name, computed), 10);\n      return isNaN(value) ? 0 : value;\n    };\n    var resize = function (editor, oldSize) {\n      var deltaSize, resizeHeight, contentHeight;\n      var dom = editor.dom;\n      var doc = editor.getDoc();\n      if (!doc) {\n        return;\n      }\n      if (isFullscreen(editor)) {\n        toggleScrolling(editor, true);\n        return;\n      }\n      var docEle = doc.documentElement;\n      var resizeBottomMargin = Settings.getAutoResizeBottomMargin(editor);\n      resizeHeight = Settings.getAutoResizeMinHeight(editor);\n      var marginTop = parseCssValueToInt(dom, docEle, 'margin-top', true);\n      var marginBottom = parseCssValueToInt(dom, docEle, 'margin-bottom', true);\n      contentHeight = docEle.offsetHeight + marginTop + marginBottom + resizeBottomMargin;\n      if (contentHeight < 0) {\n        contentHeight = 0;\n      }\n      var containerHeight = editor.getContainer().offsetHeight;\n      var contentAreaHeight = editor.getContentAreaContainer().offsetHeight;\n      var chromeHeight = containerHeight - contentAreaHeight;\n      if (contentHeight + chromeHeight > Settings.getAutoResizeMinHeight(editor)) {\n        resizeHeight = contentHeight + chromeHeight;\n      }\n      var maxHeight = Settings.getAutoResizeMaxHeight(editor);\n      if (maxHeight && resizeHeight > maxHeight) {\n        resizeHeight = maxHeight;\n        toggleScrolling(editor, true);\n      } else {\n        toggleScrolling(editor, false);\n      }\n      if (resizeHeight !== oldSize.get()) {\n        deltaSize = resizeHeight - oldSize.get();\n        dom.setStyle(editor.getContainer(), 'height', resizeHeight + 'px');\n        oldSize.set(resizeHeight);\n        Events.fireResizeEditor(editor);\n        if (global$1.browser.isSafari() && global$1.mac) {\n          var win = editor.getWin();\n          win.scrollTo(win.pageXOffset, win.pageYOffset);\n        }\n        if (editor.hasFocus()) {\n          editor.selection.scrollIntoView(editor.selection.getNode());\n        }\n        if (global$1.webkit && deltaSize < 0) {\n          resize(editor, oldSize);\n        }\n      }\n    };\n    var setup = function (editor, oldSize) {\n      editor.on('init', function () {\n        var overflowPadding = Settings.getAutoResizeOverflowPadding(editor);\n        var dom = editor.dom;\n        dom.setStyles(editor.getBody(), {\n          'paddingLeft': overflowPadding,\n          'paddingRight': overflowPadding,\n          'min-height': 0\n        });\n      });\n      editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', function () {\n        resize(editor, oldSize);\n      });\n      if (Settings.shouldAutoResizeOnInit(editor)) {\n        editor.on('init', function () {\n          wait(editor, oldSize, 20, 100, function () {\n            wait(editor, oldSize, 5, 1000);\n          });\n        });\n      }\n    };\n    var Resize = {\n      setup: setup,\n      resize: resize\n    };\n\n    var register = function (editor, oldSize) {\n      editor.addCommand('mceAutoResize', function () {\n        Resize.resize(editor, oldSize);\n      });\n    };\n    var Commands = { register: register };\n\n    function Plugin () {\n      global.add('autoresize', function (editor) {\n        if (!editor.settings.hasOwnProperty('resize')) {\n          editor.settings.resize = false;\n        }\n        if (!editor.inline) {\n          var oldSize = Cell(0);\n          Commands.register(editor, oldSize);\n          Resize.setup(editor, oldSize);\n        }\n      });\n    }\n\n    Plugin();\n\n}());\n","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./input.vue?vue&type=style&index=0&id=5895c425&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./input.vue?vue&type=style&index=0&id=5895c425&lang=scss&scoped=true&\"","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.util.VK');\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isString = isType('string');\n    var isArray = isType('array');\n    var isBoolean = isType('boolean');\n    var isFunction = isType('function');\n\n    var assumeExternalTargets = function (editor) {\n      var externalTargets = editor.getParam('link_assume_external_targets', false);\n      if (isBoolean(externalTargets) && externalTargets) {\n        return 1;\n      } else if (isString(externalTargets) && (externalTargets === 'http' || externalTargets === 'https')) {\n        return externalTargets;\n      }\n      return 0;\n    };\n    var hasContextToolbar = function (editor) {\n      return editor.getParam('link_context_toolbar', false, 'boolean');\n    };\n    var getLinkList = function (editor) {\n      return editor.getParam('link_list');\n    };\n    var getDefaultLinkTarget = function (editor) {\n      return editor.getParam('default_link_target');\n    };\n    var getTargetList = function (editor) {\n      return editor.getParam('target_list', true);\n    };\n    var getRelList = function (editor) {\n      return editor.getParam('rel_list', [], 'array');\n    };\n    var getLinkClassList = function (editor) {\n      return editor.getParam('link_class_list', [], 'array');\n    };\n    var shouldShowLinkTitle = function (editor) {\n      return editor.getParam('link_title', true, 'boolean');\n    };\n    var allowUnsafeLinkTarget = function (editor) {\n      return editor.getParam('allow_unsafe_link_target', false, 'boolean');\n    };\n    var useQuickLink = function (editor) {\n      return editor.getParam('link_quicklink', false, 'boolean');\n    };\n    var getDefaultLinkProtocol = function (editor) {\n      return editor.getParam('link_default_protocol', 'http', 'string');\n    };\n    var Settings = {\n      assumeExternalTargets: assumeExternalTargets,\n      hasContextToolbar: hasContextToolbar,\n      getLinkList: getLinkList,\n      getDefaultLinkTarget: getDefaultLinkTarget,\n      getTargetList: getTargetList,\n      getRelList: getRelList,\n      getLinkClassList: getLinkClassList,\n      shouldShowLinkTitle: shouldShowLinkTitle,\n      allowUnsafeLinkTarget: allowUnsafeLinkTarget,\n      useQuickLink: useQuickLink,\n      getDefaultLinkProtocol: getDefaultLinkProtocol\n    };\n\n    var appendClickRemove = function (link, evt) {\n      domGlobals.document.body.appendChild(link);\n      link.dispatchEvent(evt);\n      domGlobals.document.body.removeChild(link);\n    };\n    var open = function (url) {\n      var link = domGlobals.document.createElement('a');\n      link.target = '_blank';\n      link.href = url;\n      link.rel = 'noreferrer noopener';\n      var evt = domGlobals.document.createEvent('MouseEvents');\n      evt.initMouseEvent('click', true, true, domGlobals.window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n      appendClickRemove(link, evt);\n    };\n    var OpenUrl = { open: open };\n\n    var __assign = function () {\n      __assign = Object.assign || function __assign(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p))\n              t[p] = s[p];\n        }\n        return t;\n      };\n      return __assign.apply(this, arguments);\n    };\n\n    var noop = function () {\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var nativeSlice = Array.prototype.slice;\n    var nativeIndexOf = Array.prototype.indexOf;\n    var nativePush = Array.prototype.push;\n    var rawIndexOf = function (ts, t) {\n      return nativeIndexOf.call(ts, t);\n    };\n    var contains = function (xs, x) {\n      return rawIndexOf(xs, x) > -1;\n    };\n    var map = function (xs, f) {\n      var len = xs.length;\n      var r = new Array(len);\n      for (var i = 0; i < len; i++) {\n        var x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    var each = function (xs, f) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var foldl = function (xs, f, acc) {\n      each(xs, function (x) {\n        acc = f(acc, x);\n      });\n      return acc;\n    };\n    var flatten = function (xs) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    var bind = function (xs, f) {\n      return flatten(map(xs, f));\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n    var findMap = function (arr, f) {\n      for (var i = 0; i < arr.length; i++) {\n        var r = f(arr[i], i);\n        if (r.isSome()) {\n          return r;\n        }\n      }\n      return Option.none();\n    };\n\n    var global$3 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var hasProtocol = function (url) {\n      return /^\\w+:/i.test(url);\n    };\n    var getHref = function (elm) {\n      var href = elm.getAttribute('data-mce-href');\n      return href ? href : elm.getAttribute('href');\n    };\n    var applyRelTargetRules = function (rel, isUnsafe) {\n      var rules = ['noopener'];\n      var rels = rel ? rel.split(/\\s+/) : [];\n      var toString = function (rels) {\n        return global$3.trim(rels.sort().join(' '));\n      };\n      var addTargetRules = function (rels) {\n        rels = removeTargetRules(rels);\n        return rels.length > 0 ? rels.concat(rules) : rules;\n      };\n      var removeTargetRules = function (rels) {\n        return rels.filter(function (val) {\n          return global$3.inArray(rules, val) === -1;\n        });\n      };\n      var newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels);\n      return newRels.length > 0 ? toString(newRels) : '';\n    };\n    var trimCaretContainers = function (text) {\n      return text.replace(/\\uFEFF/g, '');\n    };\n    var getAnchorElement = function (editor, selectedElm) {\n      selectedElm = selectedElm || editor.selection.getNode();\n      if (isImageFigure(selectedElm)) {\n        return editor.dom.select('a[href]', selectedElm)[0];\n      } else {\n        return editor.dom.getParent(selectedElm, 'a[href]');\n      }\n    };\n    var getAnchorText = function (selection, anchorElm) {\n      var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' });\n      return trimCaretContainers(text);\n    };\n    var isLink = function (elm) {\n      return elm && elm.nodeName === 'A' && !!getHref(elm);\n    };\n    var hasLinks = function (elements) {\n      return global$3.grep(elements, isLink).length > 0;\n    };\n    var isOnlyTextSelected = function (html) {\n      if (/</.test(html) && (!/^<a [^>]+>[^<]+<\\/a>$/.test(html) || html.indexOf('href=') === -1)) {\n        return false;\n      }\n      return true;\n    };\n    var isImageFigure = function (elm) {\n      return elm && elm.nodeName === 'FIGURE' && /\\bimage\\b/i.test(elm.className);\n    };\n    var getLinkAttrs = function (data) {\n      return foldl([\n        'title',\n        'rel',\n        'class',\n        'target'\n      ], function (acc, key) {\n        data[key].each(function (value) {\n          acc[key] = value.length > 0 ? value : null;\n        });\n        return acc;\n      }, { href: data.href });\n    };\n    var handleExternalTargets = function (href, assumeExternalTargets) {\n      if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) {\n        return assumeExternalTargets + '://' + href;\n      }\n      return href;\n    };\n    var applyLinkOverrides = function (editor, linkAttrs) {\n      var newLinkAttrs = __assign({}, linkAttrs);\n      if (!(Settings.getRelList(editor).length > 0) && Settings.allowUnsafeLinkTarget(editor) === false) {\n        var newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank');\n        newLinkAttrs.rel = newRel ? newRel : null;\n      }\n      if (Option.from(newLinkAttrs.target).isNone() && Settings.getTargetList(editor) === false) {\n        newLinkAttrs.target = Settings.getDefaultLinkTarget(editor);\n      }\n      newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, Settings.assumeExternalTargets(editor));\n      return newLinkAttrs;\n    };\n    var updateLink = function (editor, anchorElm, text, linkAttrs) {\n      text.each(function (text) {\n        if (anchorElm.hasOwnProperty('innerText')) {\n          anchorElm.innerText = text;\n        } else {\n          anchorElm.textContent = text;\n        }\n      });\n      editor.dom.setAttribs(anchorElm, linkAttrs);\n      editor.selection.select(anchorElm);\n    };\n    var createLink = function (editor, selectedElm, text, linkAttrs) {\n      if (isImageFigure(selectedElm)) {\n        linkImageFigure(editor, selectedElm, linkAttrs);\n      } else {\n        text.fold(function () {\n          editor.execCommand('mceInsertLink', false, linkAttrs);\n        }, function (text) {\n          editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(text)));\n        });\n      }\n    };\n    var link = function (editor, attachState, data) {\n      var selectedElm = editor.selection.getNode();\n      var anchorElm = getAnchorElement(editor, selectedElm);\n      var linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data));\n      editor.undoManager.transact(function () {\n        if (data.href === attachState.href) {\n          attachState.attach();\n        }\n        if (anchorElm) {\n          editor.focus();\n          updateLink(editor, anchorElm, data.text, linkAttrs);\n        } else {\n          createLink(editor, selectedElm, data.text, linkAttrs);\n        }\n      });\n    };\n    var unlink = function (editor) {\n      editor.undoManager.transact(function () {\n        var node = editor.selection.getNode();\n        if (isImageFigure(node)) {\n          unlinkImageFigure(editor, node);\n        } else {\n          var anchorElm = editor.dom.getParent(node, 'a[href]', editor.getBody());\n          if (anchorElm) {\n            editor.dom.remove(anchorElm, true);\n          }\n        }\n        editor.focus();\n      });\n    };\n    var unlinkImageFigure = function (editor, fig) {\n      var img = editor.dom.select('img', fig)[0];\n      if (img) {\n        var a = editor.dom.getParents(img, 'a[href]', fig)[0];\n        if (a) {\n          a.parentNode.insertBefore(img, a);\n          editor.dom.remove(a);\n        }\n      }\n    };\n    var linkImageFigure = function (editor, fig, attrs) {\n      var img = editor.dom.select('img', fig)[0];\n      if (img) {\n        var a = editor.dom.create('a', attrs);\n        img.parentNode.insertBefore(a, img);\n        a.appendChild(img);\n      }\n    };\n    var Utils = {\n      link: link,\n      unlink: unlink,\n      isLink: isLink,\n      hasLinks: hasLinks,\n      getHref: getHref,\n      isOnlyTextSelected: isOnlyTextSelected,\n      getAnchorElement: getAnchorElement,\n      getAnchorText: getAnchorText,\n      applyRelTargetRules: applyRelTargetRules,\n      hasProtocol: hasProtocol\n    };\n\n    var cat = function (arr) {\n      var r = [];\n      var push = function (x) {\n        r.push(x);\n      };\n      for (var i = 0; i < arr.length; i++) {\n        arr[i].each(push);\n      }\n      return r;\n    };\n\n    var getValue = function (item) {\n      return isString(item.value) ? item.value : '';\n    };\n    var sanitizeList = function (list, extractValue) {\n      var out = [];\n      global$3.each(list, function (item) {\n        var text = isString(item.text) ? item.text : isString(item.title) ? item.title : '';\n        if (item.menu !== undefined) ; else {\n          var value = extractValue(item);\n          out.push({\n            text: text,\n            value: value\n          });\n        }\n      });\n      return out;\n    };\n    var sanitizeWith = function (extracter) {\n      if (extracter === void 0) {\n        extracter = getValue;\n      }\n      return function (list) {\n        return Option.from(list).map(function (list) {\n          return sanitizeList(list, extracter);\n        });\n      };\n    };\n    var sanitize = function (list) {\n      return sanitizeWith(getValue)(list);\n    };\n    var createUi = function (name, label) {\n      return function (items) {\n        return {\n          name: name,\n          type: 'selectbox',\n          label: label,\n          items: items\n        };\n      };\n    };\n    var ListOptions = {\n      sanitize: sanitize,\n      sanitizeWith: sanitizeWith,\n      createUi: createUi,\n      getValue: getValue\n    };\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var findTextByValue = function (value, catalog) {\n      return findMap(catalog, function (item) {\n        return Option.some(item).filter(function (i) {\n          return i.value === value;\n        });\n      });\n    };\n    var getDelta = function (persistentText, fieldName, catalog, data) {\n      var value = data[fieldName];\n      var hasPersistentText = persistentText.length > 0;\n      return value !== undefined ? findTextByValue(value, catalog).map(function (i) {\n        return {\n          url: {\n            value: i.value,\n            meta: {\n              text: hasPersistentText ? persistentText : i.text,\n              attach: noop\n            }\n          },\n          text: hasPersistentText ? persistentText : i.text\n        };\n      }) : Option.none();\n    };\n    var findCatalog = function (settings, fieldName) {\n      if (fieldName === 'link') {\n        return settings.catalogs.link;\n      } else if (fieldName === 'anchor') {\n        return settings.catalogs.anchor;\n      } else {\n        return Option.none();\n      }\n    };\n    var init = function (initialData, linkSettings) {\n      var persistentText = Cell(initialData.text);\n      var onUrlChange = function (data) {\n        if (persistentText.get().length <= 0) {\n          var urlText = data.url.meta.text !== undefined ? data.url.meta.text : data.url.value;\n          var urlTitle = data.url.meta.title !== undefined ? data.url.meta.title : '';\n          return Option.some({\n            text: urlText,\n            title: urlTitle\n          });\n        } else {\n          return Option.none();\n        }\n      };\n      var onCatalogChange = function (data, change) {\n        var catalog = findCatalog(linkSettings, change.name).getOr([]);\n        return getDelta(persistentText.get(), change.name, catalog, data);\n      };\n      var onChange = function (getData, change) {\n        if (change.name === 'url') {\n          return onUrlChange(getData());\n        } else if (contains([\n            'anchor',\n            'link'\n          ], change.name)) {\n          return onCatalogChange(getData(), change);\n        } else if (change.name === 'text') {\n          persistentText.set(getData().text);\n          return Option.none();\n        } else {\n          return Option.none();\n        }\n      };\n      return { onChange: onChange };\n    };\n    var DialogChanges = {\n      init: init,\n      getDelta: getDelta\n    };\n\n    var exports$1 = {}, module = { exports: exports$1 };\n    (function (define, exports, module, require) {\n      (function (f) {\n        if (typeof exports === 'object' && typeof module !== 'undefined') {\n          module.exports = f();\n        } else if (typeof define === 'function' && define.amd) {\n          define([], f);\n        } else {\n          var g;\n          if (typeof window !== 'undefined') {\n            g = window;\n          } else if (typeof global !== 'undefined') {\n            g = global;\n          } else if (typeof self !== 'undefined') {\n            g = self;\n          } else {\n            g = this;\n          }\n          g.EphoxContactWrapper = f();\n        }\n      }(function () {\n        return function () {\n          function r(e, n, t) {\n            function o(i, f) {\n              if (!n[i]) {\n                if (!e[i]) {\n                  var c = 'function' == typeof require && require;\n                  if (!f && c)\n                    return c(i, !0);\n                  if (u)\n                    return u(i, !0);\n                  var a = new Error('Cannot find module \\'' + i + '\\'');\n                  throw a.code = 'MODULE_NOT_FOUND', a;\n                }\n                var p = n[i] = { exports: {} };\n                e[i][0].call(p.exports, function (r) {\n                  var n = e[i][1][r];\n                  return o(n || r);\n                }, p, p.exports, r, e, n, t);\n              }\n              return n[i].exports;\n            }\n            for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++)\n              o(t[i]);\n            return o;\n          }\n          return r;\n        }()({\n          1: [\n            function (require, module, exports) {\n              var process = module.exports = {};\n              var cachedSetTimeout;\n              var cachedClearTimeout;\n              function defaultSetTimout() {\n                throw new Error('setTimeout has not been defined');\n              }\n              function defaultClearTimeout() {\n                throw new Error('clearTimeout has not been defined');\n              }\n              (function () {\n                try {\n                  if (typeof setTimeout === 'function') {\n                    cachedSetTimeout = setTimeout;\n                  } else {\n                    cachedSetTimeout = defaultSetTimout;\n                  }\n                } catch (e) {\n                  cachedSetTimeout = defaultSetTimout;\n                }\n                try {\n                  if (typeof clearTimeout === 'function') {\n                    cachedClearTimeout = clearTimeout;\n                  } else {\n                    cachedClearTimeout = defaultClearTimeout;\n                  }\n                } catch (e) {\n                  cachedClearTimeout = defaultClearTimeout;\n                }\n              }());\n              function runTimeout(fun) {\n                if (cachedSetTimeout === setTimeout) {\n                  return setTimeout(fun, 0);\n                }\n                if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n                  cachedSetTimeout = setTimeout;\n                  return setTimeout(fun, 0);\n                }\n                try {\n                  return cachedSetTimeout(fun, 0);\n                } catch (e) {\n                  try {\n                    return cachedSetTimeout.call(null, fun, 0);\n                  } catch (e) {\n                    return cachedSetTimeout.call(this, fun, 0);\n                  }\n                }\n              }\n              function runClearTimeout(marker) {\n                if (cachedClearTimeout === clearTimeout) {\n                  return clearTimeout(marker);\n                }\n                if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n                  cachedClearTimeout = clearTimeout;\n                  return clearTimeout(marker);\n                }\n                try {\n                  return cachedClearTimeout(marker);\n                } catch (e) {\n                  try {\n                    return cachedClearTimeout.call(null, marker);\n                  } catch (e) {\n                    return cachedClearTimeout.call(this, marker);\n                  }\n                }\n              }\n              var queue = [];\n              var draining = false;\n              var currentQueue;\n              var queueIndex = -1;\n              function cleanUpNextTick() {\n                if (!draining || !currentQueue) {\n                  return;\n                }\n                draining = false;\n                if (currentQueue.length) {\n                  queue = currentQueue.concat(queue);\n                } else {\n                  queueIndex = -1;\n                }\n                if (queue.length) {\n                  drainQueue();\n                }\n              }\n              function drainQueue() {\n                if (draining) {\n                  return;\n                }\n                var timeout = runTimeout(cleanUpNextTick);\n                draining = true;\n                var len = queue.length;\n                while (len) {\n                  currentQueue = queue;\n                  queue = [];\n                  while (++queueIndex < len) {\n                    if (currentQueue) {\n                      currentQueue[queueIndex].run();\n                    }\n                  }\n                  queueIndex = -1;\n                  len = queue.length;\n                }\n                currentQueue = null;\n                draining = false;\n                runClearTimeout(timeout);\n              }\n              process.nextTick = function (fun) {\n                var args = new Array(arguments.length - 1);\n                if (arguments.length > 1) {\n                  for (var i = 1; i < arguments.length; i++) {\n                    args[i - 1] = arguments[i];\n                  }\n                }\n                queue.push(new Item(fun, args));\n                if (queue.length === 1 && !draining) {\n                  runTimeout(drainQueue);\n                }\n              };\n              function Item(fun, array) {\n                this.fun = fun;\n                this.array = array;\n              }\n              Item.prototype.run = function () {\n                this.fun.apply(null, this.array);\n              };\n              process.title = 'browser';\n              process.browser = true;\n              process.env = {};\n              process.argv = [];\n              process.version = '';\n              process.versions = {};\n              function noop() {\n              }\n              process.on = noop;\n              process.addListener = noop;\n              process.once = noop;\n              process.off = noop;\n              process.removeListener = noop;\n              process.removeAllListeners = noop;\n              process.emit = noop;\n              process.prependListener = noop;\n              process.prependOnceListener = noop;\n              process.listeners = function (name) {\n                return [];\n              };\n              process.binding = function (name) {\n                throw new Error('process.binding is not supported');\n              };\n              process.cwd = function () {\n                return '/';\n              };\n              process.chdir = function (dir) {\n                throw new Error('process.chdir is not supported');\n              };\n              process.umask = function () {\n                return 0;\n              };\n            },\n            {}\n          ],\n          2: [\n            function (require, module, exports) {\n              (function (setImmediate) {\n                (function (root) {\n                  var setTimeoutFunc = setTimeout;\n                  function noop() {\n                  }\n                  function bind(fn, thisArg) {\n                    return function () {\n                      fn.apply(thisArg, arguments);\n                    };\n                  }\n                  function Promise(fn) {\n                    if (typeof this !== 'object')\n                      throw new TypeError('Promises must be constructed via new');\n                    if (typeof fn !== 'function')\n                      throw new TypeError('not a function');\n                    this._state = 0;\n                    this._handled = false;\n                    this._value = undefined;\n                    this._deferreds = [];\n                    doResolve(fn, this);\n                  }\n                  function handle(self, deferred) {\n                    while (self._state === 3) {\n                      self = self._value;\n                    }\n                    if (self._state === 0) {\n                      self._deferreds.push(deferred);\n                      return;\n                    }\n                    self._handled = true;\n                    Promise._immediateFn(function () {\n                      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n                      if (cb === null) {\n                        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n                        return;\n                      }\n                      var ret;\n                      try {\n                        ret = cb(self._value);\n                      } catch (e) {\n                        reject(deferred.promise, e);\n                        return;\n                      }\n                      resolve(deferred.promise, ret);\n                    });\n                  }\n                  function resolve(self, newValue) {\n                    try {\n                      if (newValue === self)\n                        throw new TypeError('A promise cannot be resolved with itself.');\n                      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n                        var then = newValue.then;\n                        if (newValue instanceof Promise) {\n                          self._state = 3;\n                          self._value = newValue;\n                          finale(self);\n                          return;\n                        } else if (typeof then === 'function') {\n                          doResolve(bind(then, newValue), self);\n                          return;\n                        }\n                      }\n                      self._state = 1;\n                      self._value = newValue;\n                      finale(self);\n                    } catch (e) {\n                      reject(self, e);\n                    }\n                  }\n                  function reject(self, newValue) {\n                    self._state = 2;\n                    self._value = newValue;\n                    finale(self);\n                  }\n                  function finale(self) {\n                    if (self._state === 2 && self._deferreds.length === 0) {\n                      Promise._immediateFn(function () {\n                        if (!self._handled) {\n                          Promise._unhandledRejectionFn(self._value);\n                        }\n                      });\n                    }\n                    for (var i = 0, len = self._deferreds.length; i < len; i++) {\n                      handle(self, self._deferreds[i]);\n                    }\n                    self._deferreds = null;\n                  }\n                  function Handler(onFulfilled, onRejected, promise) {\n                    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n                    this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n                    this.promise = promise;\n                  }\n                  function doResolve(fn, self) {\n                    var done = false;\n                    try {\n                      fn(function (value) {\n                        if (done)\n                          return;\n                        done = true;\n                        resolve(self, value);\n                      }, function (reason) {\n                        if (done)\n                          return;\n                        done = true;\n                        reject(self, reason);\n                      });\n                    } catch (ex) {\n                      if (done)\n                        return;\n                      done = true;\n                      reject(self, ex);\n                    }\n                  }\n                  Promise.prototype['catch'] = function (onRejected) {\n                    return this.then(null, onRejected);\n                  };\n                  Promise.prototype.then = function (onFulfilled, onRejected) {\n                    var prom = new this.constructor(noop);\n                    handle(this, new Handler(onFulfilled, onRejected, prom));\n                    return prom;\n                  };\n                  Promise.all = function (arr) {\n                    var args = Array.prototype.slice.call(arr);\n                    return new Promise(function (resolve, reject) {\n                      if (args.length === 0)\n                        return resolve([]);\n                      var remaining = args.length;\n                      function res(i, val) {\n                        try {\n                          if (val && (typeof val === 'object' || typeof val === 'function')) {\n                            var then = val.then;\n                            if (typeof then === 'function') {\n                              then.call(val, function (val) {\n                                res(i, val);\n                              }, reject);\n                              return;\n                            }\n                          }\n                          args[i] = val;\n                          if (--remaining === 0) {\n                            resolve(args);\n                          }\n                        } catch (ex) {\n                          reject(ex);\n                        }\n                      }\n                      for (var i = 0; i < args.length; i++) {\n                        res(i, args[i]);\n                      }\n                    });\n                  };\n                  Promise.resolve = function (value) {\n                    if (value && typeof value === 'object' && value.constructor === Promise) {\n                      return value;\n                    }\n                    return new Promise(function (resolve) {\n                      resolve(value);\n                    });\n                  };\n                  Promise.reject = function (value) {\n                    return new Promise(function (resolve, reject) {\n                      reject(value);\n                    });\n                  };\n                  Promise.race = function (values) {\n                    return new Promise(function (resolve, reject) {\n                      for (var i = 0, len = values.length; i < len; i++) {\n                        values[i].then(resolve, reject);\n                      }\n                    });\n                  };\n                  Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {\n                    setImmediate(fn);\n                  } : function (fn) {\n                    setTimeoutFunc(fn, 0);\n                  };\n                  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n                    if (typeof console !== 'undefined' && console) {\n                      console.warn('Possible Unhandled Promise Rejection:', err);\n                    }\n                  };\n                  Promise._setImmediateFn = function _setImmediateFn(fn) {\n                    Promise._immediateFn = fn;\n                  };\n                  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {\n                    Promise._unhandledRejectionFn = fn;\n                  };\n                  if (typeof module !== 'undefined' && module.exports) {\n                    module.exports = Promise;\n                  } else if (!root.Promise) {\n                    root.Promise = Promise;\n                  }\n                }(this));\n              }.call(this, require('timers').setImmediate));\n            },\n            { 'timers': 3 }\n          ],\n          3: [\n            function (require, module, exports) {\n              (function (setImmediate, clearImmediate) {\n                var nextTick = require('process/browser.js').nextTick;\n                var apply = Function.prototype.apply;\n                var slice = Array.prototype.slice;\n                var immediateIds = {};\n                var nextImmediateId = 0;\n                exports.setTimeout = function () {\n                  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n                };\n                exports.setInterval = function () {\n                  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n                };\n                exports.clearTimeout = exports.clearInterval = function (timeout) {\n                  timeout.close();\n                };\n                function Timeout(id, clearFn) {\n                  this._id = id;\n                  this._clearFn = clearFn;\n                }\n                Timeout.prototype.unref = Timeout.prototype.ref = function () {\n                };\n                Timeout.prototype.close = function () {\n                  this._clearFn.call(window, this._id);\n                };\n                exports.enroll = function (item, msecs) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = msecs;\n                };\n                exports.unenroll = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = -1;\n                };\n                exports._unrefActive = exports.active = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  var msecs = item._idleTimeout;\n                  if (msecs >= 0) {\n                    item._idleTimeoutId = setTimeout(function onTimeout() {\n                      if (item._onTimeout)\n                        item._onTimeout();\n                    }, msecs);\n                  }\n                };\n                exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) {\n                  var id = nextImmediateId++;\n                  var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n                  immediateIds[id] = true;\n                  nextTick(function onNextTick() {\n                    if (immediateIds[id]) {\n                      if (args) {\n                        fn.apply(null, args);\n                      } else {\n                        fn.call(null);\n                      }\n                      exports.clearImmediate(id);\n                    }\n                  });\n                  return id;\n                };\n                exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) {\n                  delete immediateIds[id];\n                };\n              }.call(this, require('timers').setImmediate, require('timers').clearImmediate));\n            },\n            {\n              'process/browser.js': 1,\n              'timers': 3\n            }\n          ],\n          4: [\n            function (require, module, exports) {\n              var promisePolyfill = require('promise-polyfill');\n              var Global = function () {\n                if (typeof window !== 'undefined') {\n                  return window;\n                } else {\n                  return Function('return this;')();\n                }\n              }();\n              module.exports = { boltExport: Global.Promise || promisePolyfill };\n            },\n            { 'promise-polyfill': 2 }\n          ]\n        }, {}, [4])(4);\n      }));\n    }(undefined, exports$1, module, undefined));\n    var Promise = module.exports.boltExport;\n\n    var nu = function (baseFn) {\n      var data = Option.none();\n      var callbacks = [];\n      var map = function (f) {\n        return nu(function (nCallback) {\n          get(function (data) {\n            nCallback(f(data));\n          });\n        });\n      };\n      var get = function (nCallback) {\n        if (isReady()) {\n          call(nCallback);\n        } else {\n          callbacks.push(nCallback);\n        }\n      };\n      var set = function (x) {\n        data = Option.some(x);\n        run(callbacks);\n        callbacks = [];\n      };\n      var isReady = function () {\n        return data.isSome();\n      };\n      var run = function (cbs) {\n        each(cbs, call);\n      };\n      var call = function (cb) {\n        data.each(function (x) {\n          domGlobals.setTimeout(function () {\n            cb(x);\n          }, 0);\n        });\n      };\n      baseFn(set);\n      return {\n        get: get,\n        map: map,\n        isReady: isReady\n      };\n    };\n    var pure = function (a) {\n      return nu(function (callback) {\n        callback(a);\n      });\n    };\n    var LazyValue = {\n      nu: nu,\n      pure: pure\n    };\n\n    var errorReporter = function (err) {\n      domGlobals.setTimeout(function () {\n        throw err;\n      }, 0);\n    };\n    var make = function (run) {\n      var get = function (callback) {\n        run().then(callback, errorReporter);\n      };\n      var map = function (fab) {\n        return make(function () {\n          return run().then(fab);\n        });\n      };\n      var bind = function (aFutureB) {\n        return make(function () {\n          return run().then(function (v) {\n            return aFutureB(v).toPromise();\n          });\n        });\n      };\n      var anonBind = function (futureB) {\n        return make(function () {\n          return run().then(function () {\n            return futureB.toPromise();\n          });\n        });\n      };\n      var toLazy = function () {\n        return LazyValue.nu(get);\n      };\n      var toCached = function () {\n        var cache = null;\n        return make(function () {\n          if (cache === null) {\n            cache = run();\n          }\n          return cache;\n        });\n      };\n      var toPromise = run;\n      return {\n        map: map,\n        bind: bind,\n        anonBind: anonBind,\n        toLazy: toLazy,\n        toCached: toCached,\n        toPromise: toPromise,\n        get: get\n      };\n    };\n    var nu$1 = function (baseFn) {\n      return make(function () {\n        return new Promise(baseFn);\n      });\n    };\n    var pure$1 = function (a) {\n      return make(function () {\n        return Promise.resolve(a);\n      });\n    };\n    var Future = {\n      nu: nu$1,\n      pure: pure$1\n    };\n\n    var global$4 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n    var delayedConfirm = function (editor, message, callback) {\n      var rng = editor.selection.getRng();\n      global$4.setEditorTimeout(editor, function () {\n        editor.windowManager.confirm(message, function (state) {\n          editor.selection.setRng(rng);\n          callback(state);\n        });\n      });\n    };\n    var tryEmailTransform = function (data) {\n      var url = data.href;\n      var suggestMailTo = url.indexOf('@') > 0 && url.indexOf('//') === -1 && url.indexOf('mailto:') === -1;\n      return suggestMailTo ? Option.some({\n        message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?',\n        preprocess: function (oldData) {\n          return __assign(__assign({}, oldData), { href: 'mailto:' + url });\n        }\n      }) : Option.none();\n    };\n    var tryProtocolTransform = function (assumeExternalTargets, defaultLinkProtocol) {\n      return function (data) {\n        var url = data.href;\n        var suggestProtocol = assumeExternalTargets === 1 && !Utils.hasProtocol(url) || assumeExternalTargets === 0 && /^\\s*www[\\.|\\d\\.]/i.test(url);\n        return suggestProtocol ? Option.some({\n          message: 'The URL you entered seems to be an external link. Do you want to add the required ' + defaultLinkProtocol + ':// prefix?',\n          preprocess: function (oldData) {\n            return __assign(__assign({}, oldData), { href: defaultLinkProtocol + '://' + url });\n          }\n        }) : Option.none();\n      };\n    };\n    var preprocess = function (editor, data) {\n      return findMap([\n        tryEmailTransform,\n        tryProtocolTransform(Settings.assumeExternalTargets(editor), Settings.getDefaultLinkProtocol(editor))\n      ], function (f) {\n        return f(data);\n      }).fold(function () {\n        return Future.pure(data);\n      }, function (transform) {\n        return Future.nu(function (callback) {\n          delayedConfirm(editor, transform.message, function (state) {\n            callback(state ? transform.preprocess(data) : data);\n          });\n        });\n      });\n    };\n    var DialogConfirms = { preprocess: preprocess };\n\n    var getAnchors = function (editor) {\n      var anchorNodes = editor.dom.select('a:not([href])');\n      var anchors = bind(anchorNodes, function (anchor) {\n        var id = anchor.name || anchor.id;\n        return id ? [{\n            text: id,\n            value: '#' + id\n          }] : [];\n      });\n      return anchors.length > 0 ? Option.some([{\n          text: 'None',\n          value: ''\n        }].concat(anchors)) : Option.none();\n    };\n    var AnchorListOptions = { getAnchors: getAnchors };\n\n    var getClasses = function (editor) {\n      var list = Settings.getLinkClassList(editor);\n      if (list.length > 0) {\n        return ListOptions.sanitize(list);\n      }\n      return Option.none();\n    };\n    var ClassListOptions = { getClasses: getClasses };\n\n    var global$5 = tinymce.util.Tools.resolve('tinymce.util.XHR');\n\n    var parseJson = function (text) {\n      try {\n        return Option.some(JSON.parse(text));\n      } catch (err) {\n        return Option.none();\n      }\n    };\n    var getLinks = function (editor) {\n      var extractor = function (item) {\n        return editor.convertURL(item.value || item.url, 'href');\n      };\n      var linkList = Settings.getLinkList(editor);\n      return Future.nu(function (callback) {\n        if (isString(linkList)) {\n          global$5.send({\n            url: linkList,\n            success: function (text) {\n              return callback(parseJson(text));\n            },\n            error: function (_) {\n              return callback(Option.none());\n            }\n          });\n        } else if (isFunction(linkList)) {\n          linkList(function (output) {\n            return callback(Option.some(output));\n          });\n        } else {\n          callback(Option.from(linkList));\n        }\n      }).map(function (optItems) {\n        return optItems.bind(ListOptions.sanitizeWith(extractor)).map(function (items) {\n          if (items.length > 0) {\n            return [{\n                text: 'None',\n                value: ''\n              }].concat(items);\n          } else {\n            return items;\n          }\n        });\n      });\n    };\n    var LinkListOptions = { getLinks: getLinks };\n\n    var getRels = function (editor, initialTarget) {\n      var list = Settings.getRelList(editor);\n      if (list.length > 0) {\n        var isTargetBlank_1 = initialTarget.is('_blank');\n        var enforceSafe = Settings.allowUnsafeLinkTarget(editor) === false;\n        var safeRelExtractor = function (item) {\n          return Utils.applyRelTargetRules(ListOptions.getValue(item), isTargetBlank_1);\n        };\n        var sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize;\n        return sanitizer(list);\n      }\n      return Option.none();\n    };\n    var RelOptions = { getRels: getRels };\n\n    var fallbacks = [\n      {\n        text: 'Current window',\n        value: ''\n      },\n      {\n        text: 'New window',\n        value: '_blank'\n      }\n    ];\n    var getTargets = function (editor) {\n      var list = Settings.getTargetList(editor);\n      if (isArray(list)) {\n        return ListOptions.sanitize(list).orThunk(function () {\n          return Option.some(fallbacks);\n        });\n      } else if (list === false) {\n        return Option.none();\n      }\n      return Option.some(fallbacks);\n    };\n    var TargetOptions = { getTargets: getTargets };\n\n    var nonEmptyAttr = function (dom, elem, name) {\n      var val = dom.getAttrib(elem, name);\n      return val !== null && val.length > 0 ? Option.some(val) : Option.none();\n    };\n    var extractFromAnchor = function (editor, anchor) {\n      var dom = editor.dom;\n      var onlyText = Utils.isOnlyTextSelected(editor.selection.getContent());\n      var text = onlyText ? Option.some(Utils.getAnchorText(editor.selection, anchor)) : Option.none();\n      var url = anchor ? Option.some(dom.getAttrib(anchor, 'href')) : Option.none();\n      var target = anchor ? Option.from(dom.getAttrib(anchor, 'target')) : Option.none();\n      var rel = nonEmptyAttr(dom, anchor, 'rel');\n      var linkClass = nonEmptyAttr(dom, anchor, 'class');\n      var title = nonEmptyAttr(dom, anchor, 'title');\n      return {\n        url: url,\n        text: text,\n        title: title,\n        target: target,\n        rel: rel,\n        linkClass: linkClass\n      };\n    };\n    var collect = function (editor, linkNode) {\n      return LinkListOptions.getLinks(editor).map(function (links) {\n        var anchor = extractFromAnchor(editor, linkNode);\n        return {\n          anchor: anchor,\n          catalogs: {\n            targets: TargetOptions.getTargets(editor),\n            rels: RelOptions.getRels(editor, anchor.target),\n            classes: ClassListOptions.getClasses(editor),\n            anchor: AnchorListOptions.getAnchors(editor),\n            link: links\n          },\n          optNode: Option.from(linkNode),\n          flags: { titleEnabled: Settings.shouldShowLinkTitle(editor) }\n        };\n      });\n    };\n    var DialogInfo = { collect: collect };\n\n    var handleSubmit = function (editor, info) {\n      return function (api) {\n        var data = api.getData();\n        if (!data.url.value) {\n          Utils.unlink(editor);\n          api.close();\n          return;\n        }\n        var getChangedValue = function (key) {\n          return Option.from(data[key]).filter(function (value) {\n            return !info.anchor[key].is(value);\n          });\n        };\n        var changedData = {\n          href: data.url.value,\n          text: getChangedValue('text'),\n          target: getChangedValue('target'),\n          rel: getChangedValue('rel'),\n          class: getChangedValue('linkClass'),\n          title: getChangedValue('title')\n        };\n        var attachState = {\n          href: data.url.value,\n          attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : function () {\n          }\n        };\n        DialogConfirms.preprocess(editor, changedData).get(function (pData) {\n          Utils.link(editor, attachState, pData);\n        });\n        api.close();\n      };\n    };\n    var collectData = function (editor) {\n      var anchorNode = Utils.getAnchorElement(editor);\n      return DialogInfo.collect(editor, anchorNode);\n    };\n    var getInitialData = function (info, defaultTarget) {\n      return {\n        url: {\n          value: info.anchor.url.getOr(''),\n          meta: {\n            attach: function () {\n            },\n            text: info.anchor.url.fold(function () {\n              return '';\n            }, function () {\n              return info.anchor.text.getOr('');\n            }),\n            original: { value: info.anchor.url.getOr('') }\n          }\n        },\n        text: info.anchor.text.getOr(''),\n        title: info.anchor.title.getOr(''),\n        anchor: info.anchor.url.getOr(''),\n        link: info.anchor.url.getOr(''),\n        rel: info.anchor.rel.getOr(''),\n        target: info.anchor.target.or(defaultTarget).getOr(''),\n        linkClass: info.anchor.linkClass.getOr('')\n      };\n    };\n    var makeDialog = function (settings, onSubmit, editor) {\n      var urlInput = [{\n          name: 'url',\n          type: 'urlinput',\n          filetype: 'file',\n          label: 'URL'\n        }];\n      var displayText = settings.anchor.text.map(function () {\n        return {\n          name: 'text',\n          type: 'input',\n          label: 'Text to display'\n        };\n      }).toArray();\n      var titleText = settings.flags.titleEnabled ? [{\n          name: 'title',\n          type: 'input',\n          label: 'Title'\n        }] : [];\n      var defaultTarget = Option.from(Settings.getDefaultLinkTarget(editor));\n      var initialData = getInitialData(settings, defaultTarget);\n      var dialogDelta = DialogChanges.init(initialData, settings);\n      var catalogs = settings.catalogs;\n      var body = {\n        type: 'panel',\n        items: flatten([\n          urlInput,\n          displayText,\n          titleText,\n          cat([\n            catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')),\n            catalogs.rels.map(ListOptions.createUi('rel', 'Rel')),\n            catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')),\n            catalogs.link.map(ListOptions.createUi('link', 'Link list')),\n            catalogs.classes.map(ListOptions.createUi('linkClass', 'Class'))\n          ])\n        ])\n      };\n      return {\n        title: 'Insert/Edit Link',\n        size: 'normal',\n        body: body,\n        buttons: [\n          {\n            type: 'cancel',\n            name: 'cancel',\n            text: 'Cancel'\n          },\n          {\n            type: 'submit',\n            name: 'save',\n            text: 'Save',\n            primary: true\n          }\n        ],\n        initialData: initialData,\n        onChange: function (api, _a) {\n          var name = _a.name;\n          dialogDelta.onChange(api.getData, { name: name }).each(function (newData) {\n            api.setData(newData);\n          });\n        },\n        onSubmit: onSubmit\n      };\n    };\n    var open$1 = function (editor) {\n      var data = collectData(editor);\n      data.map(function (info) {\n        var onSubmit = handleSubmit(editor, info);\n        return makeDialog(info, onSubmit, editor);\n      }).get(function (spec) {\n        editor.windowManager.open(spec);\n      });\n    };\n    var Dialog = { open: open$1 };\n\n    var getLink = function (editor, elm) {\n      return editor.dom.getParent(elm, 'a[href]');\n    };\n    var getSelectedLink = function (editor) {\n      return getLink(editor, editor.selection.getStart());\n    };\n    var hasOnlyAltModifier = function (e) {\n      return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false;\n    };\n    var gotoLink = function (editor, a) {\n      if (a) {\n        var href = Utils.getHref(a);\n        if (/^#/.test(href)) {\n          var targetEl = editor.$(href);\n          if (targetEl.length) {\n            editor.selection.scrollIntoView(targetEl[0], true);\n          }\n        } else {\n          OpenUrl.open(a.href);\n        }\n      }\n    };\n    var openDialog = function (editor) {\n      return function () {\n        Dialog.open(editor);\n      };\n    };\n    var gotoSelectedLink = function (editor) {\n      return function () {\n        gotoLink(editor, getSelectedLink(editor));\n      };\n    };\n    var leftClickedOnAHref = function (editor) {\n      return function (elm) {\n        var sel, rng, node;\n        if (Settings.hasContextToolbar(editor) && Utils.isLink(elm)) {\n          sel = editor.selection;\n          rng = sel.getRng();\n          node = rng.startContainer;\n          if (node.nodeType === 3 && sel.isCollapsed() && rng.startOffset > 0 && rng.startOffset < node.data.length) {\n            return true;\n          }\n        }\n        return false;\n      };\n    };\n    var setupGotoLinks = function (editor) {\n      editor.on('click', function (e) {\n        var link = getLink(editor, e.target);\n        if (link && global$2.metaKeyPressed(e)) {\n          e.preventDefault();\n          gotoLink(editor, link);\n        }\n      });\n      editor.on('keydown', function (e) {\n        var link = getSelectedLink(editor);\n        if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) {\n          e.preventDefault();\n          gotoLink(editor, link);\n        }\n      });\n    };\n    var toggleActiveState = function (editor) {\n      return function (api) {\n        var nodeChangeHandler = function (e) {\n          return api.setActive(!editor.mode.isReadOnly() && !!Utils.getAnchorElement(editor, e.element));\n        };\n        editor.on('NodeChange', nodeChangeHandler);\n        return function () {\n          return editor.off('NodeChange', nodeChangeHandler);\n        };\n      };\n    };\n    var toggleEnabledState = function (editor) {\n      return function (api) {\n        var parents = editor.dom.getParents(editor.selection.getStart());\n        api.setDisabled(!Utils.hasLinks(parents));\n        var nodeChangeHandler = function (e) {\n          return api.setDisabled(!Utils.hasLinks(e.parents));\n        };\n        editor.on('NodeChange', nodeChangeHandler);\n        return function () {\n          return editor.off('NodeChange', nodeChangeHandler);\n        };\n      };\n    };\n    var Actions = {\n      openDialog: openDialog,\n      gotoSelectedLink: gotoSelectedLink,\n      leftClickedOnAHref: leftClickedOnAHref,\n      setupGotoLinks: setupGotoLinks,\n      toggleActiveState: toggleActiveState,\n      toggleEnabledState: toggleEnabledState\n    };\n\n    var register = function (editor) {\n      editor.addCommand('mceLink', function () {\n        if (Settings.useQuickLink(editor)) {\n          editor.fire('contexttoolbar-show', { toolbarKey: 'quicklink' });\n        } else {\n          Actions.openDialog(editor)();\n        }\n      });\n    };\n    var Commands = { register: register };\n\n    var setup = function (editor) {\n      editor.addShortcut('Meta+K', '', function () {\n        editor.execCommand('mceLink');\n      });\n    };\n    var Keyboard = { setup: setup };\n\n    var setupButtons = function (editor) {\n      editor.ui.registry.addToggleButton('link', {\n        icon: 'link',\n        tooltip: 'Insert/edit link',\n        onAction: Actions.openDialog(editor),\n        onSetup: Actions.toggleActiveState(editor)\n      });\n      editor.ui.registry.addButton('openlink', {\n        icon: 'new-tab',\n        tooltip: 'Open link',\n        onAction: Actions.gotoSelectedLink(editor),\n        onSetup: Actions.toggleEnabledState(editor)\n      });\n      editor.ui.registry.addButton('unlink', {\n        icon: 'unlink',\n        tooltip: 'Remove link',\n        onAction: function () {\n          return Utils.unlink(editor);\n        },\n        onSetup: Actions.toggleEnabledState(editor)\n      });\n    };\n    var setupMenuItems = function (editor) {\n      editor.ui.registry.addMenuItem('openlink', {\n        text: 'Open link',\n        icon: 'new-tab',\n        onAction: Actions.gotoSelectedLink(editor),\n        onSetup: Actions.toggleEnabledState(editor)\n      });\n      editor.ui.registry.addMenuItem('link', {\n        icon: 'link',\n        text: 'Link...',\n        shortcut: 'Meta+K',\n        onAction: Actions.openDialog(editor)\n      });\n      editor.ui.registry.addMenuItem('unlink', {\n        icon: 'unlink',\n        text: 'Remove link',\n        onAction: function () {\n          return Utils.unlink(editor);\n        },\n        onSetup: Actions.toggleEnabledState(editor)\n      });\n    };\n    var setupContextMenu = function (editor) {\n      var inLink = 'link unlink openlink';\n      var noLink = 'link';\n      editor.ui.registry.addContextMenu('link', {\n        update: function (element) {\n          return Utils.hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink;\n        }\n      });\n    };\n    var setupContextToolbars = function (editor) {\n      var collapseSelectionToEnd = function (editor) {\n        editor.selection.collapse(false);\n      };\n      var onSetupLink = function (buttonApi) {\n        var node = editor.selection.getNode();\n        buttonApi.setDisabled(!Utils.getAnchorElement(editor, node));\n        return function () {\n        };\n      };\n      editor.ui.registry.addContextForm('quicklink', {\n        launch: {\n          type: 'contextformtogglebutton',\n          icon: 'link',\n          tooltip: 'Link',\n          onSetup: Actions.toggleActiveState(editor)\n        },\n        label: 'Link',\n        predicate: function (node) {\n          return !!Utils.getAnchorElement(editor, node) && Settings.hasContextToolbar(editor);\n        },\n        initValue: function () {\n          var elm = Utils.getAnchorElement(editor);\n          return !!elm ? Utils.getHref(elm) : '';\n        },\n        commands: [\n          {\n            type: 'contextformtogglebutton',\n            icon: 'link',\n            tooltip: 'Link',\n            primary: true,\n            onSetup: function (buttonApi) {\n              var node = editor.selection.getNode();\n              buttonApi.setActive(!!Utils.getAnchorElement(editor, node));\n              return Actions.toggleActiveState(editor)(buttonApi);\n            },\n            onAction: function (formApi) {\n              var anchor = Utils.getAnchorElement(editor);\n              var value = formApi.getValue();\n              if (!anchor) {\n                var attachState = {\n                  href: value,\n                  attach: function () {\n                  }\n                };\n                var onlyText = Utils.isOnlyTextSelected(editor.selection.getContent());\n                var text = onlyText ? Option.some(Utils.getAnchorText(editor.selection, anchor)).filter(function (t) {\n                  return t.length > 0;\n                }).or(Option.from(value)) : Option.none();\n                Utils.link(editor, attachState, {\n                  href: value,\n                  text: text,\n                  title: Option.none(),\n                  rel: Option.none(),\n                  target: Option.none(),\n                  class: Option.none()\n                });\n                formApi.hide();\n              } else {\n                editor.dom.setAttrib(anchor, 'href', value);\n                collapseSelectionToEnd(editor);\n                formApi.hide();\n              }\n            }\n          },\n          {\n            type: 'contextformbutton',\n            icon: 'unlink',\n            tooltip: 'Remove link',\n            onSetup: onSetupLink,\n            onAction: function (formApi) {\n              Utils.unlink(editor);\n              formApi.hide();\n            }\n          },\n          {\n            type: 'contextformbutton',\n            icon: 'new-tab',\n            tooltip: 'Open link',\n            onSetup: onSetupLink,\n            onAction: function (formApi) {\n              Actions.gotoSelectedLink(editor)();\n              formApi.hide();\n            }\n          }\n        ]\n      });\n    };\n    var Controls = {\n      setupButtons: setupButtons,\n      setupMenuItems: setupMenuItems,\n      setupContextMenu: setupContextMenu,\n      setupContextToolbars: setupContextToolbars\n    };\n\n    function Plugin () {\n      global$1.add('link', function (editor) {\n        Controls.setupButtons(editor);\n        Controls.setupMenuItems(editor);\n        Controls.setupContextMenu(editor);\n        Controls.setupContextToolbars(editor);\n        Actions.setupGotoLinks(editor);\n        Commands.register(editor);\n        Keyboard.setup(editor);\n      });\n    }\n\n    Plugin();\n\n}(window));\n","/**\n * Copyright (c) 2018-present, Ephox, Inc.\n *\n * This source code is licensed under the Apache 2 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nvar getGlobal = function () { return (typeof window !== 'undefined' ? window : global); };\nvar getTinymce = function () {\n    var global = getGlobal();\n    return global && global.tinymce ? global.tinymce : null;\n};\nexport { getTinymce };\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var noop = function () {\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var identity = function (x) {\n      return x;\n    };\n    var die = function (msg) {\n      return function () {\n        throw new Error(msg);\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isString = isType('string');\n    var isObject = isType('object');\n    var isArray = isType('array');\n    var isBoolean = isType('boolean');\n    var isFunction = isType('function');\n    var isNumber = isType('number');\n\n    var nativeSlice = Array.prototype.slice;\n    var nativePush = Array.prototype.push;\n    var each = function (xs, f) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var flatten = function (xs) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    var head = function (xs) {\n      return xs.length === 0 ? Option.none() : Option.some(xs[0]);\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n    var findMap = function (arr, f) {\n      for (var i = 0; i < arr.length; i++) {\n        var r = f(arr[i], i);\n        if (r.isSome()) {\n          return r;\n        }\n      }\n      return Option.none();\n    };\n\n    var __assign = function () {\n      __assign = Object.assign || function __assign(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p))\n              t[p] = s[p];\n        }\n        return t;\n      };\n      return __assign.apply(this, arguments);\n    };\n\n    var exports$1 = {}, module = { exports: exports$1 };\n    (function (define, exports, module, require) {\n      (function (f) {\n        if (typeof exports === 'object' && typeof module !== 'undefined') {\n          module.exports = f();\n        } else if (typeof define === 'function' && define.amd) {\n          define([], f);\n        } else {\n          var g;\n          if (typeof window !== 'undefined') {\n            g = window;\n          } else if (typeof global !== 'undefined') {\n            g = global;\n          } else if (typeof self !== 'undefined') {\n            g = self;\n          } else {\n            g = this;\n          }\n          g.EphoxContactWrapper = f();\n        }\n      }(function () {\n        return function () {\n          function r(e, n, t) {\n            function o(i, f) {\n              if (!n[i]) {\n                if (!e[i]) {\n                  var c = 'function' == typeof require && require;\n                  if (!f && c)\n                    return c(i, !0);\n                  if (u)\n                    return u(i, !0);\n                  var a = new Error('Cannot find module \\'' + i + '\\'');\n                  throw a.code = 'MODULE_NOT_FOUND', a;\n                }\n                var p = n[i] = { exports: {} };\n                e[i][0].call(p.exports, function (r) {\n                  var n = e[i][1][r];\n                  return o(n || r);\n                }, p, p.exports, r, e, n, t);\n              }\n              return n[i].exports;\n            }\n            for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++)\n              o(t[i]);\n            return o;\n          }\n          return r;\n        }()({\n          1: [\n            function (require, module, exports) {\n              var process = module.exports = {};\n              var cachedSetTimeout;\n              var cachedClearTimeout;\n              function defaultSetTimout() {\n                throw new Error('setTimeout has not been defined');\n              }\n              function defaultClearTimeout() {\n                throw new Error('clearTimeout has not been defined');\n              }\n              (function () {\n                try {\n                  if (typeof setTimeout === 'function') {\n                    cachedSetTimeout = setTimeout;\n                  } else {\n                    cachedSetTimeout = defaultSetTimout;\n                  }\n                } catch (e) {\n                  cachedSetTimeout = defaultSetTimout;\n                }\n                try {\n                  if (typeof clearTimeout === 'function') {\n                    cachedClearTimeout = clearTimeout;\n                  } else {\n                    cachedClearTimeout = defaultClearTimeout;\n                  }\n                } catch (e) {\n                  cachedClearTimeout = defaultClearTimeout;\n                }\n              }());\n              function runTimeout(fun) {\n                if (cachedSetTimeout === setTimeout) {\n                  return setTimeout(fun, 0);\n                }\n                if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n                  cachedSetTimeout = setTimeout;\n                  return setTimeout(fun, 0);\n                }\n                try {\n                  return cachedSetTimeout(fun, 0);\n                } catch (e) {\n                  try {\n                    return cachedSetTimeout.call(null, fun, 0);\n                  } catch (e) {\n                    return cachedSetTimeout.call(this, fun, 0);\n                  }\n                }\n              }\n              function runClearTimeout(marker) {\n                if (cachedClearTimeout === clearTimeout) {\n                  return clearTimeout(marker);\n                }\n                if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n                  cachedClearTimeout = clearTimeout;\n                  return clearTimeout(marker);\n                }\n                try {\n                  return cachedClearTimeout(marker);\n                } catch (e) {\n                  try {\n                    return cachedClearTimeout.call(null, marker);\n                  } catch (e) {\n                    return cachedClearTimeout.call(this, marker);\n                  }\n                }\n              }\n              var queue = [];\n              var draining = false;\n              var currentQueue;\n              var queueIndex = -1;\n              function cleanUpNextTick() {\n                if (!draining || !currentQueue) {\n                  return;\n                }\n                draining = false;\n                if (currentQueue.length) {\n                  queue = currentQueue.concat(queue);\n                } else {\n                  queueIndex = -1;\n                }\n                if (queue.length) {\n                  drainQueue();\n                }\n              }\n              function drainQueue() {\n                if (draining) {\n                  return;\n                }\n                var timeout = runTimeout(cleanUpNextTick);\n                draining = true;\n                var len = queue.length;\n                while (len) {\n                  currentQueue = queue;\n                  queue = [];\n                  while (++queueIndex < len) {\n                    if (currentQueue) {\n                      currentQueue[queueIndex].run();\n                    }\n                  }\n                  queueIndex = -1;\n                  len = queue.length;\n                }\n                currentQueue = null;\n                draining = false;\n                runClearTimeout(timeout);\n              }\n              process.nextTick = function (fun) {\n                var args = new Array(arguments.length - 1);\n                if (arguments.length > 1) {\n                  for (var i = 1; i < arguments.length; i++) {\n                    args[i - 1] = arguments[i];\n                  }\n                }\n                queue.push(new Item(fun, args));\n                if (queue.length === 1 && !draining) {\n                  runTimeout(drainQueue);\n                }\n              };\n              function Item(fun, array) {\n                this.fun = fun;\n                this.array = array;\n              }\n              Item.prototype.run = function () {\n                this.fun.apply(null, this.array);\n              };\n              process.title = 'browser';\n              process.browser = true;\n              process.env = {};\n              process.argv = [];\n              process.version = '';\n              process.versions = {};\n              function noop() {\n              }\n              process.on = noop;\n              process.addListener = noop;\n              process.once = noop;\n              process.off = noop;\n              process.removeListener = noop;\n              process.removeAllListeners = noop;\n              process.emit = noop;\n              process.prependListener = noop;\n              process.prependOnceListener = noop;\n              process.listeners = function (name) {\n                return [];\n              };\n              process.binding = function (name) {\n                throw new Error('process.binding is not supported');\n              };\n              process.cwd = function () {\n                return '/';\n              };\n              process.chdir = function (dir) {\n                throw new Error('process.chdir is not supported');\n              };\n              process.umask = function () {\n                return 0;\n              };\n            },\n            {}\n          ],\n          2: [\n            function (require, module, exports) {\n              (function (setImmediate) {\n                (function (root) {\n                  var setTimeoutFunc = setTimeout;\n                  function noop() {\n                  }\n                  function bind(fn, thisArg) {\n                    return function () {\n                      fn.apply(thisArg, arguments);\n                    };\n                  }\n                  function Promise(fn) {\n                    if (typeof this !== 'object')\n                      throw new TypeError('Promises must be constructed via new');\n                    if (typeof fn !== 'function')\n                      throw new TypeError('not a function');\n                    this._state = 0;\n                    this._handled = false;\n                    this._value = undefined;\n                    this._deferreds = [];\n                    doResolve(fn, this);\n                  }\n                  function handle(self, deferred) {\n                    while (self._state === 3) {\n                      self = self._value;\n                    }\n                    if (self._state === 0) {\n                      self._deferreds.push(deferred);\n                      return;\n                    }\n                    self._handled = true;\n                    Promise._immediateFn(function () {\n                      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n                      if (cb === null) {\n                        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n                        return;\n                      }\n                      var ret;\n                      try {\n                        ret = cb(self._value);\n                      } catch (e) {\n                        reject(deferred.promise, e);\n                        return;\n                      }\n                      resolve(deferred.promise, ret);\n                    });\n                  }\n                  function resolve(self, newValue) {\n                    try {\n                      if (newValue === self)\n                        throw new TypeError('A promise cannot be resolved with itself.');\n                      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n                        var then = newValue.then;\n                        if (newValue instanceof Promise) {\n                          self._state = 3;\n                          self._value = newValue;\n                          finale(self);\n                          return;\n                        } else if (typeof then === 'function') {\n                          doResolve(bind(then, newValue), self);\n                          return;\n                        }\n                      }\n                      self._state = 1;\n                      self._value = newValue;\n                      finale(self);\n                    } catch (e) {\n                      reject(self, e);\n                    }\n                  }\n                  function reject(self, newValue) {\n                    self._state = 2;\n                    self._value = newValue;\n                    finale(self);\n                  }\n                  function finale(self) {\n                    if (self._state === 2 && self._deferreds.length === 0) {\n                      Promise._immediateFn(function () {\n                        if (!self._handled) {\n                          Promise._unhandledRejectionFn(self._value);\n                        }\n                      });\n                    }\n                    for (var i = 0, len = self._deferreds.length; i < len; i++) {\n                      handle(self, self._deferreds[i]);\n                    }\n                    self._deferreds = null;\n                  }\n                  function Handler(onFulfilled, onRejected, promise) {\n                    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n                    this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n                    this.promise = promise;\n                  }\n                  function doResolve(fn, self) {\n                    var done = false;\n                    try {\n                      fn(function (value) {\n                        if (done)\n                          return;\n                        done = true;\n                        resolve(self, value);\n                      }, function (reason) {\n                        if (done)\n                          return;\n                        done = true;\n                        reject(self, reason);\n                      });\n                    } catch (ex) {\n                      if (done)\n                        return;\n                      done = true;\n                      reject(self, ex);\n                    }\n                  }\n                  Promise.prototype['catch'] = function (onRejected) {\n                    return this.then(null, onRejected);\n                  };\n                  Promise.prototype.then = function (onFulfilled, onRejected) {\n                    var prom = new this.constructor(noop);\n                    handle(this, new Handler(onFulfilled, onRejected, prom));\n                    return prom;\n                  };\n                  Promise.all = function (arr) {\n                    var args = Array.prototype.slice.call(arr);\n                    return new Promise(function (resolve, reject) {\n                      if (args.length === 0)\n                        return resolve([]);\n                      var remaining = args.length;\n                      function res(i, val) {\n                        try {\n                          if (val && (typeof val === 'object' || typeof val === 'function')) {\n                            var then = val.then;\n                            if (typeof then === 'function') {\n                              then.call(val, function (val) {\n                                res(i, val);\n                              }, reject);\n                              return;\n                            }\n                          }\n                          args[i] = val;\n                          if (--remaining === 0) {\n                            resolve(args);\n                          }\n                        } catch (ex) {\n                          reject(ex);\n                        }\n                      }\n                      for (var i = 0; i < args.length; i++) {\n                        res(i, args[i]);\n                      }\n                    });\n                  };\n                  Promise.resolve = function (value) {\n                    if (value && typeof value === 'object' && value.constructor === Promise) {\n                      return value;\n                    }\n                    return new Promise(function (resolve) {\n                      resolve(value);\n                    });\n                  };\n                  Promise.reject = function (value) {\n                    return new Promise(function (resolve, reject) {\n                      reject(value);\n                    });\n                  };\n                  Promise.race = function (values) {\n                    return new Promise(function (resolve, reject) {\n                      for (var i = 0, len = values.length; i < len; i++) {\n                        values[i].then(resolve, reject);\n                      }\n                    });\n                  };\n                  Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {\n                    setImmediate(fn);\n                  } : function (fn) {\n                    setTimeoutFunc(fn, 0);\n                  };\n                  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n                    if (typeof console !== 'undefined' && console) {\n                      console.warn('Possible Unhandled Promise Rejection:', err);\n                    }\n                  };\n                  Promise._setImmediateFn = function _setImmediateFn(fn) {\n                    Promise._immediateFn = fn;\n                  };\n                  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {\n                    Promise._unhandledRejectionFn = fn;\n                  };\n                  if (typeof module !== 'undefined' && module.exports) {\n                    module.exports = Promise;\n                  } else if (!root.Promise) {\n                    root.Promise = Promise;\n                  }\n                }(this));\n              }.call(this, require('timers').setImmediate));\n            },\n            { 'timers': 3 }\n          ],\n          3: [\n            function (require, module, exports) {\n              (function (setImmediate, clearImmediate) {\n                var nextTick = require('process/browser.js').nextTick;\n                var apply = Function.prototype.apply;\n                var slice = Array.prototype.slice;\n                var immediateIds = {};\n                var nextImmediateId = 0;\n                exports.setTimeout = function () {\n                  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n                };\n                exports.setInterval = function () {\n                  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n                };\n                exports.clearTimeout = exports.clearInterval = function (timeout) {\n                  timeout.close();\n                };\n                function Timeout(id, clearFn) {\n                  this._id = id;\n                  this._clearFn = clearFn;\n                }\n                Timeout.prototype.unref = Timeout.prototype.ref = function () {\n                };\n                Timeout.prototype.close = function () {\n                  this._clearFn.call(window, this._id);\n                };\n                exports.enroll = function (item, msecs) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = msecs;\n                };\n                exports.unenroll = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = -1;\n                };\n                exports._unrefActive = exports.active = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  var msecs = item._idleTimeout;\n                  if (msecs >= 0) {\n                    item._idleTimeoutId = setTimeout(function onTimeout() {\n                      if (item._onTimeout)\n                        item._onTimeout();\n                    }, msecs);\n                  }\n                };\n                exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) {\n                  var id = nextImmediateId++;\n                  var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n                  immediateIds[id] = true;\n                  nextTick(function onNextTick() {\n                    if (immediateIds[id]) {\n                      if (args) {\n                        fn.apply(null, args);\n                      } else {\n                        fn.call(null);\n                      }\n                      exports.clearImmediate(id);\n                    }\n                  });\n                  return id;\n                };\n                exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) {\n                  delete immediateIds[id];\n                };\n              }.call(this, require('timers').setImmediate, require('timers').clearImmediate));\n            },\n            {\n              'process/browser.js': 1,\n              'timers': 3\n            }\n          ],\n          4: [\n            function (require, module, exports) {\n              var promisePolyfill = require('promise-polyfill');\n              var Global = function () {\n                if (typeof window !== 'undefined') {\n                  return window;\n                } else {\n                  return Function('return this;')();\n                }\n              }();\n              module.exports = { boltExport: Global.Promise || promisePolyfill };\n            },\n            { 'promise-polyfill': 2 }\n          ]\n        }, {}, [4])(4);\n      }));\n    }(undefined, exports$1, module, undefined));\n    var Promise = module.exports.boltExport;\n\n    var nu = function (baseFn) {\n      var data = Option.none();\n      var callbacks = [];\n      var map = function (f) {\n        return nu(function (nCallback) {\n          get(function (data) {\n            nCallback(f(data));\n          });\n        });\n      };\n      var get = function (nCallback) {\n        if (isReady()) {\n          call(nCallback);\n        } else {\n          callbacks.push(nCallback);\n        }\n      };\n      var set = function (x) {\n        data = Option.some(x);\n        run(callbacks);\n        callbacks = [];\n      };\n      var isReady = function () {\n        return data.isSome();\n      };\n      var run = function (cbs) {\n        each(cbs, call);\n      };\n      var call = function (cb) {\n        data.each(function (x) {\n          domGlobals.setTimeout(function () {\n            cb(x);\n          }, 0);\n        });\n      };\n      baseFn(set);\n      return {\n        get: get,\n        map: map,\n        isReady: isReady\n      };\n    };\n    var pure = function (a) {\n      return nu(function (callback) {\n        callback(a);\n      });\n    };\n    var LazyValue = {\n      nu: nu,\n      pure: pure\n    };\n\n    var errorReporter = function (err) {\n      domGlobals.setTimeout(function () {\n        throw err;\n      }, 0);\n    };\n    var make = function (run) {\n      var get = function (callback) {\n        run().then(callback, errorReporter);\n      };\n      var map = function (fab) {\n        return make(function () {\n          return run().then(fab);\n        });\n      };\n      var bind = function (aFutureB) {\n        return make(function () {\n          return run().then(function (v) {\n            return aFutureB(v).toPromise();\n          });\n        });\n      };\n      var anonBind = function (futureB) {\n        return make(function () {\n          return run().then(function () {\n            return futureB.toPromise();\n          });\n        });\n      };\n      var toLazy = function () {\n        return LazyValue.nu(get);\n      };\n      var toCached = function () {\n        var cache = null;\n        return make(function () {\n          if (cache === null) {\n            cache = run();\n          }\n          return cache;\n        });\n      };\n      var toPromise = run;\n      return {\n        map: map,\n        bind: bind,\n        anonBind: anonBind,\n        toLazy: toLazy,\n        toCached: toCached,\n        toPromise: toPromise,\n        get: get\n      };\n    };\n    var nu$1 = function (baseFn) {\n      return make(function () {\n        return new Promise(baseFn);\n      });\n    };\n    var pure$1 = function (a) {\n      return make(function () {\n        return Promise.resolve(a);\n      });\n    };\n    var Future = {\n      nu: nu$1,\n      pure: pure$1\n    };\n\n    var value = function (o) {\n      var is = function (v) {\n        return o === v;\n      };\n      var or = function (opt) {\n        return value(o);\n      };\n      var orThunk = function (f) {\n        return value(o);\n      };\n      var map = function (f) {\n        return value(f(o));\n      };\n      var mapError = function (f) {\n        return value(o);\n      };\n      var each = function (f) {\n        f(o);\n      };\n      var bind = function (f) {\n        return f(o);\n      };\n      var fold = function (_, onValue) {\n        return onValue(o);\n      };\n      var exists = function (f) {\n        return f(o);\n      };\n      var forall = function (f) {\n        return f(o);\n      };\n      var toOption = function () {\n        return Option.some(o);\n      };\n      return {\n        is: is,\n        isValue: always,\n        isError: never,\n        getOr: constant(o),\n        getOrThunk: constant(o),\n        getOrDie: constant(o),\n        or: or,\n        orThunk: orThunk,\n        fold: fold,\n        map: map,\n        mapError: mapError,\n        each: each,\n        bind: bind,\n        exists: exists,\n        forall: forall,\n        toOption: toOption\n      };\n    };\n    var error = function (message) {\n      var getOrThunk = function (f) {\n        return f();\n      };\n      var getOrDie = function () {\n        return die(String(message))();\n      };\n      var or = function (opt) {\n        return opt;\n      };\n      var orThunk = function (f) {\n        return f();\n      };\n      var map = function (f) {\n        return error(message);\n      };\n      var mapError = function (f) {\n        return error(f(message));\n      };\n      var bind = function (f) {\n        return error(message);\n      };\n      var fold = function (onError, _) {\n        return onError(message);\n      };\n      return {\n        is: never,\n        isValue: never,\n        isError: always,\n        getOr: identity,\n        getOrThunk: getOrThunk,\n        getOrDie: getOrDie,\n        or: or,\n        orThunk: orThunk,\n        fold: fold,\n        map: map,\n        mapError: mapError,\n        each: noop,\n        bind: bind,\n        exists: never,\n        forall: always,\n        toOption: Option.none\n      };\n    };\n    var fromOption = function (opt, err) {\n      return opt.fold(function () {\n        return error(err);\n      }, value);\n    };\n    var Result = {\n      value: value,\n      error: error,\n      fromOption: fromOption\n    };\n\n    var wrap = function (delegate) {\n      var toCached = function () {\n        return wrap(delegate.toCached());\n      };\n      var bindFuture = function (f) {\n        return wrap(delegate.bind(function (resA) {\n          return resA.fold(function (err) {\n            return Future.pure(Result.error(err));\n          }, function (a) {\n            return f(a);\n          });\n        }));\n      };\n      var bindResult = function (f) {\n        return wrap(delegate.map(function (resA) {\n          return resA.bind(f);\n        }));\n      };\n      var mapResult = function (f) {\n        return wrap(delegate.map(function (resA) {\n          return resA.map(f);\n        }));\n      };\n      var mapError = function (f) {\n        return wrap(delegate.map(function (resA) {\n          return resA.mapError(f);\n        }));\n      };\n      var foldResult = function (whenError, whenValue) {\n        return delegate.map(function (res) {\n          return res.fold(whenError, whenValue);\n        });\n      };\n      var withTimeout = function (timeout, errorThunk) {\n        return wrap(Future.nu(function (callback) {\n          var timedOut = false;\n          var timer = domGlobals.setTimeout(function () {\n            timedOut = true;\n            callback(Result.error(errorThunk()));\n          }, timeout);\n          delegate.get(function (result) {\n            if (!timedOut) {\n              domGlobals.clearTimeout(timer);\n              callback(result);\n            }\n          });\n        }));\n      };\n      return __assign(__assign({}, delegate), {\n        toCached: toCached,\n        bindFuture: bindFuture,\n        bindResult: bindResult,\n        mapResult: mapResult,\n        mapError: mapError,\n        foldResult: foldResult,\n        withTimeout: withTimeout\n      });\n    };\n    var nu$2 = function (worker) {\n      return wrap(Future.nu(worker));\n    };\n    var value$1 = function (value) {\n      return wrap(Future.pure(Result.value(value)));\n    };\n    var error$1 = function (error) {\n      return wrap(Future.pure(Result.error(error)));\n    };\n    var fromResult = function (result) {\n      return wrap(Future.pure(result));\n    };\n    var fromFuture = function (future) {\n      return wrap(future.map(Result.value));\n    };\n    var fromPromise = function (promise) {\n      return nu$2(function (completer) {\n        promise.then(function (value) {\n          completer(Result.value(value));\n        }, function (error) {\n          completer(Result.error(error));\n        });\n      });\n    };\n    var FutureResult = {\n      nu: nu$2,\n      wrap: wrap,\n      pure: value$1,\n      value: value$1,\n      error: error$1,\n      fromResult: fromResult,\n      fromFuture: fromFuture,\n      fromPromise: fromPromise\n    };\n\n    var hasOwnProperty = Object.prototype.hasOwnProperty;\n    var deep = function (old, nu) {\n      var bothObjects = isObject(old) && isObject(nu);\n      return bothObjects ? deepMerge(old, nu) : nu;\n    };\n    var baseMerge = function (merger) {\n      return function () {\n        var objects = new Array(arguments.length);\n        for (var i = 0; i < objects.length; i++) {\n          objects[i] = arguments[i];\n        }\n        if (objects.length === 0) {\n          throw new Error('Can\\'t merge zero objects');\n        }\n        var ret = {};\n        for (var j = 0; j < objects.length; j++) {\n          var curObject = objects[j];\n          for (var key in curObject) {\n            if (hasOwnProperty.call(curObject, key)) {\n              ret[key] = merger(ret[key], curObject[key]);\n            }\n          }\n        }\n        return ret;\n      };\n    };\n    var deepMerge = baseMerge(deep);\n\n    var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;\n    var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;\n    var COMMENT = domGlobals.Node.COMMENT_NODE;\n    var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;\n    var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;\n    var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;\n    var ELEMENT = domGlobals.Node.ELEMENT_NODE;\n    var TEXT = domGlobals.Node.TEXT_NODE;\n    var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;\n    var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;\n    var ENTITY = domGlobals.Node.ENTITY_NODE;\n    var NOTATION = domGlobals.Node.NOTATION_NODE;\n\n    var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();\n\n    var rawSet = function (dom, key, value) {\n      if (isString(value) || isBoolean(value) || isNumber(value)) {\n        dom.setAttribute(key, value + '');\n      } else {\n        domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n        throw new Error('Attribute value was not simple');\n      }\n    };\n    var set = function (element, key, value) {\n      rawSet(element.dom(), key, value);\n    };\n\n    var fromHtml = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        domGlobals.console.error('HTML does not have a single root node', html);\n        throw new Error('HTML must have a single root node');\n      }\n      return fromDom(div.childNodes[0]);\n    };\n    var fromTag = function (tag, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createElement(tag);\n      return fromDom(node);\n    };\n    var fromText = function (text, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createTextNode(text);\n      return fromDom(node);\n    };\n    var fromDom = function (node) {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: constant(node) };\n    };\n    var fromPoint = function (docElm, x, y) {\n      var doc = docElm.dom();\n      return Option.from(doc.elementFromPoint(x, y)).map(fromDom);\n    };\n    var Element = {\n      fromHtml: fromHtml,\n      fromTag: fromTag,\n      fromText: fromText,\n      fromDom: fromDom,\n      fromPoint: fromPoint\n    };\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n    var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n    var global$4 = tinymce.util.Tools.resolve('tinymce.util.XHR');\n\n    var hasDimensions = function (editor) {\n      return editor.getParam('image_dimensions', true, 'boolean');\n    };\n    var hasAdvTab = function (editor) {\n      return editor.getParam('image_advtab', false, 'boolean');\n    };\n    var hasUploadTab = function (editor) {\n      return editor.getParam('image_uploadtab', true, 'boolean');\n    };\n    var getPrependUrl = function (editor) {\n      return editor.getParam('image_prepend_url', '', 'string');\n    };\n    var getClassList = function (editor) {\n      return editor.getParam('image_class_list');\n    };\n    var hasDescription = function (editor) {\n      return editor.getParam('image_description', true, 'boolean');\n    };\n    var hasImageTitle = function (editor) {\n      return editor.getParam('image_title', false, 'boolean');\n    };\n    var hasImageCaption = function (editor) {\n      return editor.getParam('image_caption', false, 'boolean');\n    };\n    var getImageList = function (editor) {\n      return editor.getParam('image_list', false);\n    };\n    var hasUploadUrl = function (editor) {\n      return !!getUploadUrl(editor);\n    };\n    var hasUploadHandler = function (editor) {\n      return !!getUploadHandler(editor);\n    };\n    var getUploadUrl = function (editor) {\n      return editor.getParam('images_upload_url', '', 'string');\n    };\n    var getUploadHandler = function (editor) {\n      return editor.getParam('images_upload_handler', undefined, 'function');\n    };\n    var getUploadBasePath = function (editor) {\n      return editor.getParam('images_upload_base_path', undefined, 'string');\n    };\n    var getUploadCredentials = function (editor) {\n      return editor.getParam('images_upload_credentials', false, 'boolean');\n    };\n    var showAccessibilityOptions = function (editor) {\n      return editor.getParam('a11y_advanced_options', false, 'boolean');\n    };\n    var isAutomaticUploadsEnabled = function (editor) {\n      return editor.getParam('automatic_uploads', true, 'boolean');\n    };\n    var Settings = {\n      hasDimensions: hasDimensions,\n      hasUploadTab: hasUploadTab,\n      hasAdvTab: hasAdvTab,\n      getPrependUrl: getPrependUrl,\n      getClassList: getClassList,\n      hasDescription: hasDescription,\n      hasImageTitle: hasImageTitle,\n      hasImageCaption: hasImageCaption,\n      getImageList: getImageList,\n      hasUploadUrl: hasUploadUrl,\n      hasUploadHandler: hasUploadHandler,\n      getUploadUrl: getUploadUrl,\n      getUploadHandler: getUploadHandler,\n      getUploadBasePath: getUploadBasePath,\n      getUploadCredentials: getUploadCredentials,\n      showAccessibilityOptions: showAccessibilityOptions,\n      isAutomaticUploadsEnabled: isAutomaticUploadsEnabled\n    };\n\n    var parseIntAndGetMax = function (val1, val2) {\n      return Math.max(parseInt(val1, 10), parseInt(val2, 10));\n    };\n    var getImageSize = function (url, callback) {\n      var img = domGlobals.document.createElement('img');\n      var done = function (dimensions) {\n        if (img.parentNode) {\n          img.parentNode.removeChild(img);\n        }\n        callback(dimensions);\n      };\n      img.onload = function () {\n        var width = parseIntAndGetMax(img.width, img.clientWidth);\n        var height = parseIntAndGetMax(img.height, img.clientHeight);\n        var dimensions = {\n          width: width,\n          height: height\n        };\n        done(Result.value(dimensions));\n      };\n      img.onerror = function () {\n        done(Result.error('Failed to get image dimensions for: ' + url));\n      };\n      var style = img.style;\n      style.visibility = 'hidden';\n      style.position = 'fixed';\n      style.bottom = style.left = '0px';\n      style.width = style.height = 'auto';\n      domGlobals.document.body.appendChild(img);\n      img.src = url;\n    };\n    var removePixelSuffix = function (value) {\n      if (value) {\n        value = value.replace(/px$/, '');\n      }\n      return value;\n    };\n    var addPixelSuffix = function (value) {\n      if (value.length > 0 && /^[0-9]+$/.test(value)) {\n        value += 'px';\n      }\n      return value;\n    };\n    var mergeMargins = function (css) {\n      if (css.margin) {\n        var splitMargin = String(css.margin).split(' ');\n        switch (splitMargin.length) {\n        case 1:\n          css['margin-top'] = css['margin-top'] || splitMargin[0];\n          css['margin-right'] = css['margin-right'] || splitMargin[0];\n          css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];\n          css['margin-left'] = css['margin-left'] || splitMargin[0];\n          break;\n        case 2:\n          css['margin-top'] = css['margin-top'] || splitMargin[0];\n          css['margin-right'] = css['margin-right'] || splitMargin[1];\n          css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];\n          css['margin-left'] = css['margin-left'] || splitMargin[1];\n          break;\n        case 3:\n          css['margin-top'] = css['margin-top'] || splitMargin[0];\n          css['margin-right'] = css['margin-right'] || splitMargin[1];\n          css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];\n          css['margin-left'] = css['margin-left'] || splitMargin[1];\n          break;\n        case 4:\n          css['margin-top'] = css['margin-top'] || splitMargin[0];\n          css['margin-right'] = css['margin-right'] || splitMargin[1];\n          css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];\n          css['margin-left'] = css['margin-left'] || splitMargin[3];\n        }\n        delete css.margin;\n      }\n      return css;\n    };\n    var createImageList = function (editor, callback) {\n      var imageList = Settings.getImageList(editor);\n      if (typeof imageList === 'string') {\n        global$4.send({\n          url: imageList,\n          success: function (text) {\n            callback(JSON.parse(text));\n          }\n        });\n      } else if (typeof imageList === 'function') {\n        imageList(callback);\n      } else {\n        callback(imageList);\n      }\n    };\n    var waitLoadImage = function (editor, data, imgElm) {\n      var selectImage = function () {\n        imgElm.onload = imgElm.onerror = null;\n        if (editor.selection) {\n          editor.selection.select(imgElm);\n          editor.nodeChanged();\n        }\n      };\n      imgElm.onload = function () {\n        if (!data.width && !data.height && Settings.hasDimensions(editor)) {\n          editor.dom.setAttribs(imgElm, {\n            width: String(imgElm.clientWidth),\n            height: String(imgElm.clientHeight)\n          });\n        }\n        selectImage();\n      };\n      imgElm.onerror = selectImage;\n    };\n    var blobToDataUri = function (blob) {\n      return new global$3(function (resolve, reject) {\n        var reader = new domGlobals.FileReader();\n        reader.onload = function () {\n          resolve(reader.result);\n        };\n        reader.onerror = function () {\n          reject(reader.error.message);\n        };\n        reader.readAsDataURL(blob);\n      });\n    };\n    var isPlaceholderImage = function (imgElm) {\n      return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder'));\n    };\n    var Utils = {\n      getImageSize: getImageSize,\n      removePixelSuffix: removePixelSuffix,\n      addPixelSuffix: addPixelSuffix,\n      mergeMargins: mergeMargins,\n      createImageList: createImageList,\n      waitLoadImage: waitLoadImage,\n      blobToDataUri: blobToDataUri,\n      isPlaceholderImage: isPlaceholderImage\n    };\n\n    var DOM = global$2.DOM;\n    var getHspace = function (image) {\n      if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) {\n        return Utils.removePixelSuffix(image.style.marginLeft);\n      } else {\n        return '';\n      }\n    };\n    var getVspace = function (image) {\n      if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) {\n        return Utils.removePixelSuffix(image.style.marginTop);\n      } else {\n        return '';\n      }\n    };\n    var getBorder = function (image) {\n      if (image.style.borderWidth) {\n        return Utils.removePixelSuffix(image.style.borderWidth);\n      } else {\n        return '';\n      }\n    };\n    var getAttrib = function (image, name) {\n      if (image.hasAttribute(name)) {\n        return image.getAttribute(name);\n      } else {\n        return '';\n      }\n    };\n    var getStyle = function (image, name) {\n      return image.style[name] ? image.style[name] : '';\n    };\n    var hasCaption = function (image) {\n      return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE';\n    };\n    var setAttrib = function (image, name, value) {\n      image.setAttribute(name, value);\n    };\n    var wrapInFigure = function (image) {\n      var figureElm = DOM.create('figure', { class: 'image' });\n      DOM.insertAfter(figureElm, image);\n      figureElm.appendChild(image);\n      figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption'));\n      figureElm.contentEditable = 'false';\n    };\n    var removeFigure = function (image) {\n      var figureElm = image.parentNode;\n      DOM.insertAfter(image, figureElm);\n      DOM.remove(figureElm);\n    };\n    var toggleCaption = function (image) {\n      if (hasCaption(image)) {\n        removeFigure(image);\n      } else {\n        wrapInFigure(image);\n      }\n    };\n    var normalizeStyle = function (image, normalizeCss) {\n      var attrValue = image.getAttribute('style');\n      var value = normalizeCss(attrValue !== null ? attrValue : '');\n      if (value.length > 0) {\n        image.setAttribute('style', value);\n        image.setAttribute('data-mce-style', value);\n      } else {\n        image.removeAttribute('style');\n      }\n    };\n    var setSize = function (name, normalizeCss) {\n      return function (image, name, value) {\n        if (image.style[name]) {\n          image.style[name] = Utils.addPixelSuffix(value);\n          normalizeStyle(image, normalizeCss);\n        } else {\n          setAttrib(image, name, value);\n        }\n      };\n    };\n    var getSize = function (image, name) {\n      if (image.style[name]) {\n        return Utils.removePixelSuffix(image.style[name]);\n      } else {\n        return getAttrib(image, name);\n      }\n    };\n    var setHspace = function (image, value) {\n      var pxValue = Utils.addPixelSuffix(value);\n      image.style.marginLeft = pxValue;\n      image.style.marginRight = pxValue;\n    };\n    var setVspace = function (image, value) {\n      var pxValue = Utils.addPixelSuffix(value);\n      image.style.marginTop = pxValue;\n      image.style.marginBottom = pxValue;\n    };\n    var setBorder = function (image, value) {\n      var pxValue = Utils.addPixelSuffix(value);\n      image.style.borderWidth = pxValue;\n    };\n    var setBorderStyle = function (image, value) {\n      image.style.borderStyle = value;\n    };\n    var getBorderStyle = function (image) {\n      return getStyle(image, 'borderStyle');\n    };\n    var isFigure = function (elm) {\n      return elm.nodeName === 'FIGURE';\n    };\n    var isImage = function (elm) {\n      return elm.nodeName === 'IMG';\n    };\n    var getIsDecorative = function (image) {\n      return DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation';\n    };\n    var getAlt = function (image) {\n      if (getIsDecorative(image)) {\n        return '';\n      } else {\n        return getAttrib(image, 'alt');\n      }\n    };\n    var defaultData = function () {\n      return {\n        src: '',\n        alt: '',\n        title: '',\n        width: '',\n        height: '',\n        class: '',\n        style: '',\n        caption: false,\n        hspace: '',\n        vspace: '',\n        border: '',\n        borderStyle: '',\n        isDecorative: false\n      };\n    };\n    var getStyleValue = function (normalizeCss, data) {\n      var image = domGlobals.document.createElement('img');\n      setAttrib(image, 'style', data.style);\n      if (getHspace(image) || data.hspace !== '') {\n        setHspace(image, data.hspace);\n      }\n      if (getVspace(image) || data.vspace !== '') {\n        setVspace(image, data.vspace);\n      }\n      if (getBorder(image) || data.border !== '') {\n        setBorder(image, data.border);\n      }\n      if (getBorderStyle(image) || data.borderStyle !== '') {\n        setBorderStyle(image, data.borderStyle);\n      }\n      return normalizeCss(image.getAttribute('style'));\n    };\n    var create = function (normalizeCss, data, info) {\n      var image = domGlobals.document.createElement('img');\n      write(normalizeCss, __assign(__assign({}, data), { caption: false }), image, info);\n      setAlt(image, data.alt, data.isDecorative, info);\n      if (data.caption) {\n        var figure = DOM.create('figure', { class: 'image' });\n        figure.appendChild(image);\n        figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption'));\n        figure.contentEditable = 'false';\n        return figure;\n      } else {\n        return image;\n      }\n    };\n    var read = function (normalizeCss, image) {\n      return {\n        src: getAttrib(image, 'src'),\n        alt: getAlt(image),\n        title: getAttrib(image, 'title'),\n        width: getSize(image, 'width'),\n        height: getSize(image, 'height'),\n        class: getAttrib(image, 'class'),\n        style: normalizeCss(getAttrib(image, 'style')),\n        caption: hasCaption(image),\n        hspace: getHspace(image),\n        vspace: getVspace(image),\n        border: getBorder(image),\n        borderStyle: getStyle(image, 'borderStyle'),\n        isDecorative: getIsDecorative(image)\n      };\n    };\n    var updateProp = function (image, oldData, newData, name, set) {\n      if (newData[name] !== oldData[name]) {\n        set(image, name, newData[name]);\n      }\n    };\n    var setAlt = function (image, alt, isDecorative, info) {\n      if (isDecorative) {\n        DOM.setAttrib(image, 'role', 'presentation');\n        var sugarImage = Element.fromDom(image);\n        set(sugarImage, 'alt', '');\n      } else {\n        if (info.hasAccessibilityOptions) {\n          DOM.setAttrib(image, 'alt', alt);\n        } else {\n          var sugarImage = Element.fromDom(image);\n          set(sugarImage, 'alt', alt);\n        }\n        if (DOM.getAttrib(image, 'role') === 'presentation') {\n          DOM.setAttrib(image, 'role', '');\n        }\n      }\n    };\n    var updateAlt = function (image, oldData, newData, info) {\n      if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) {\n        setAlt(image, newData.alt, newData.isDecorative, info);\n      }\n    };\n    var normalized = function (set, normalizeCss) {\n      return function (image, name, value) {\n        set(image, value);\n        normalizeStyle(image, normalizeCss);\n      };\n    };\n    var write = function (normalizeCss, newData, image, info) {\n      var oldData = read(normalizeCss, image);\n      updateProp(image, oldData, newData, 'caption', function (image, _name, _value) {\n        return toggleCaption(image);\n      });\n      updateProp(image, oldData, newData, 'src', setAttrib);\n      updateProp(image, oldData, newData, 'title', setAttrib);\n      updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss));\n      updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss));\n      updateProp(image, oldData, newData, 'class', setAttrib);\n      updateProp(image, oldData, newData, 'style', normalized(function (image, value) {\n        return setAttrib(image, 'style', value);\n      }, normalizeCss));\n      updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss));\n      updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss));\n      updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss));\n      updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss));\n      updateAlt(image, oldData, newData, info);\n    };\n\n    var normalizeCss = function (editor, cssText) {\n      var css = editor.dom.styles.parse(cssText);\n      var mergedCss = Utils.mergeMargins(css);\n      var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss));\n      return editor.dom.styles.serialize(compressed);\n    };\n    var getSelectedImage = function (editor) {\n      var imgElm = editor.selection.getNode();\n      var figureElm = editor.dom.getParent(imgElm, 'figure.image');\n      if (figureElm) {\n        return editor.dom.select('img', figureElm)[0];\n      }\n      if (imgElm && (imgElm.nodeName !== 'IMG' || Utils.isPlaceholderImage(imgElm))) {\n        return null;\n      }\n      return imgElm;\n    };\n    var splitTextBlock = function (editor, figure) {\n      var dom = editor.dom;\n      var textBlock = dom.getParent(figure.parentNode, function (node) {\n        return !!editor.schema.getTextBlockElements()[node.nodeName];\n      }, editor.getBody());\n      if (textBlock) {\n        return dom.split(textBlock, figure);\n      } else {\n        return figure;\n      }\n    };\n    var readImageDataFromSelection = function (editor) {\n      var image = getSelectedImage(editor);\n      return image ? read(function (css) {\n        return normalizeCss(editor, css);\n      }, image) : defaultData();\n    };\n    var insertImageAtCaret = function (editor, data, info) {\n      var elm = create(function (css) {\n        return normalizeCss(editor, css);\n      }, data, info);\n      editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew');\n      editor.focus();\n      editor.selection.setContent(elm.outerHTML);\n      var insertedElm = editor.dom.select('*[data-mce-id=\"__mcenew\"]')[0];\n      editor.dom.setAttrib(insertedElm, 'data-mce-id', null);\n      if (isFigure(insertedElm)) {\n        var figure = splitTextBlock(editor, insertedElm);\n        editor.selection.select(figure);\n      } else {\n        editor.selection.select(insertedElm);\n      }\n    };\n    var syncSrcAttr = function (editor, image) {\n      editor.dom.setAttrib(image, 'src', image.getAttribute('src'));\n    };\n    var deleteImage = function (editor, image) {\n      if (image) {\n        var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image;\n        editor.dom.remove(elm);\n        editor.focus();\n        editor.nodeChanged();\n        if (editor.dom.isEmpty(editor.getBody())) {\n          editor.setContent('');\n          editor.selection.setCursorLocation();\n        }\n      }\n    };\n    var writeImageDataToSelection = function (editor, data, info) {\n      var image = getSelectedImage(editor);\n      write(function (css) {\n        return normalizeCss(editor, css);\n      }, data, image, info);\n      syncSrcAttr(editor, image);\n      if (isFigure(image.parentNode)) {\n        var figure = image.parentNode;\n        splitTextBlock(editor, figure);\n        editor.selection.select(image.parentNode);\n      } else {\n        editor.selection.select(image);\n        Utils.waitLoadImage(editor, data, image);\n      }\n    };\n    var insertOrUpdateImage = function (editor, data, info) {\n      var image = getSelectedImage(editor);\n      if (image) {\n        if (data.src) {\n          writeImageDataToSelection(editor, data, info);\n        } else {\n          deleteImage(editor, image);\n        }\n      } else if (data.src) {\n        insertImageAtCaret(editor, data, info);\n      }\n    };\n\n    var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var getValue = function (item) {\n      return isString(item.value) ? item.value : '';\n    };\n    var sanitizeList = function (list, extractValue) {\n      var out = [];\n      global$5.each(list, function (item) {\n        var text = isString(item.text) ? item.text : isString(item.title) ? item.title : '';\n        if (item.menu !== undefined) {\n          var items = sanitizeList(item.menu, extractValue);\n          out.push({\n            text: text,\n            items: items\n          });\n        } else {\n          var value = extractValue(item);\n          out.push({\n            text: text,\n            value: value\n          });\n        }\n      });\n      return out;\n    };\n    var sanitizer = function (extracter) {\n      if (extracter === void 0) {\n        extracter = getValue;\n      }\n      return function (list) {\n        if (list) {\n          return Option.from(list).map(function (list) {\n            return sanitizeList(list, extracter);\n          });\n        } else {\n          return Option.none();\n        }\n      };\n    };\n    var sanitize = function (list) {\n      return sanitizer(getValue)(list);\n    };\n    var isGroup = function (item) {\n      return Object.prototype.hasOwnProperty.call(item, 'items');\n    };\n    var findEntryDelegate = function (list, value) {\n      return findMap(list, function (item) {\n        if (isGroup(item)) {\n          return findEntryDelegate(item.items, value);\n        } else if (item.value === value) {\n          return Option.some(item);\n        } else {\n          return Option.none();\n        }\n      });\n    };\n    var findEntry = function (optList, value) {\n      return optList.bind(function (list) {\n        return findEntryDelegate(list, value);\n      });\n    };\n    var ListUtils = {\n      sanitizer: sanitizer,\n      sanitize: sanitize,\n      findEntry: findEntry\n    };\n\n    var pathJoin = function (path1, path2) {\n      if (path1) {\n        return path1.replace(/\\/$/, '') + '/' + path2.replace(/^\\//, '');\n      }\n      return path2;\n    };\n    function Uploader (settings) {\n      var defaultHandler = function (blobInfo, success, failure, progress) {\n        var xhr, formData;\n        xhr = new domGlobals.XMLHttpRequest();\n        xhr.open('POST', settings.url);\n        xhr.withCredentials = settings.credentials;\n        xhr.upload.onprogress = function (e) {\n          progress(e.loaded / e.total * 100);\n        };\n        xhr.onerror = function () {\n          failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);\n        };\n        xhr.onload = function () {\n          var json;\n          if (xhr.status < 200 || xhr.status >= 300) {\n            failure('HTTP Error: ' + xhr.status);\n            return;\n          }\n          json = JSON.parse(xhr.responseText);\n          if (!json || typeof json.location !== 'string') {\n            failure('Invalid JSON: ' + xhr.responseText);\n            return;\n          }\n          success(pathJoin(settings.basePath, json.location));\n        };\n        formData = new domGlobals.FormData();\n        formData.append('file', blobInfo.blob(), blobInfo.filename());\n        xhr.send(formData);\n      };\n      var uploadBlob = function (blobInfo, handler) {\n        return new global$3(function (resolve, reject) {\n          try {\n            handler(blobInfo, resolve, reject, noop);\n          } catch (ex) {\n            reject(ex.message);\n          }\n        });\n      };\n      var isDefaultHandler = function (handler) {\n        return handler === defaultHandler;\n      };\n      var upload = function (blobInfo) {\n        return !settings.url && isDefaultHandler(settings.handler) ? global$3.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler);\n      };\n      settings = global$5.extend({\n        credentials: false,\n        handler: defaultHandler\n      }, settings);\n      return { upload: upload };\n    }\n\n    var makeTab = function (info) {\n      return {\n        title: 'Advanced',\n        name: 'advanced',\n        items: [\n          {\n            type: 'input',\n            label: 'Style',\n            name: 'style'\n          },\n          {\n            type: 'grid',\n            columns: 2,\n            items: [\n              {\n                type: 'input',\n                label: 'Vertical space',\n                name: 'vspace',\n                inputMode: 'numeric'\n              },\n              {\n                type: 'input',\n                label: 'Horizontal space',\n                name: 'hspace',\n                inputMode: 'numeric'\n              },\n              {\n                type: 'input',\n                label: 'Border width',\n                name: 'border',\n                inputMode: 'numeric'\n              },\n              {\n                type: 'selectbox',\n                name: 'borderstyle',\n                label: 'Border style',\n                items: [\n                  {\n                    text: 'Select...',\n                    value: ''\n                  },\n                  {\n                    text: 'Solid',\n                    value: 'solid'\n                  },\n                  {\n                    text: 'Dotted',\n                    value: 'dotted'\n                  },\n                  {\n                    text: 'Dashed',\n                    value: 'dashed'\n                  },\n                  {\n                    text: 'Double',\n                    value: 'double'\n                  },\n                  {\n                    text: 'Groove',\n                    value: 'groove'\n                  },\n                  {\n                    text: 'Ridge',\n                    value: 'ridge'\n                  },\n                  {\n                    text: 'Inset',\n                    value: 'inset'\n                  },\n                  {\n                    text: 'Outset',\n                    value: 'outset'\n                  },\n                  {\n                    text: 'None',\n                    value: 'none'\n                  },\n                  {\n                    text: 'Hidden',\n                    value: 'hidden'\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      };\n    };\n    var AdvTab = { makeTab: makeTab };\n\n    var collect = function (editor) {\n      var urlListSanitizer = ListUtils.sanitizer(function (item) {\n        return editor.convertURL(item.value || item.url, 'src');\n      });\n      var futureImageList = Future.nu(function (completer) {\n        Utils.createImageList(editor, function (imageList) {\n          completer(urlListSanitizer(imageList).map(function (items) {\n            return flatten([\n              [{\n                  text: 'None',\n                  value: ''\n                }],\n              items\n            ]);\n          }));\n        });\n      });\n      var classList = ListUtils.sanitize(Settings.getClassList(editor));\n      var hasAdvTab = Settings.hasAdvTab(editor);\n      var hasUploadTab = Settings.hasUploadTab(editor);\n      var hasUploadUrl = Settings.hasUploadUrl(editor);\n      var hasUploadHandler = Settings.hasUploadHandler(editor);\n      var image = readImageDataFromSelection(editor);\n      var hasDescription = Settings.hasDescription(editor);\n      var hasImageTitle = Settings.hasImageTitle(editor);\n      var hasDimensions = Settings.hasDimensions(editor);\n      var hasImageCaption = Settings.hasImageCaption(editor);\n      var hasAccessibilityOptions = Settings.showAccessibilityOptions(editor);\n      var url = Settings.getUploadUrl(editor);\n      var basePath = Settings.getUploadBasePath(editor);\n      var credentials = Settings.getUploadCredentials(editor);\n      var handler = Settings.getUploadHandler(editor);\n      var automaticUploads = Settings.isAutomaticUploadsEnabled(editor);\n      var prependURL = Option.some(Settings.getPrependUrl(editor)).filter(function (preUrl) {\n        return isString(preUrl) && preUrl.length > 0;\n      });\n      return futureImageList.map(function (imageList) {\n        return {\n          image: image,\n          imageList: imageList,\n          classList: classList,\n          hasAdvTab: hasAdvTab,\n          hasUploadTab: hasUploadTab,\n          hasUploadUrl: hasUploadUrl,\n          hasUploadHandler: hasUploadHandler,\n          hasDescription: hasDescription,\n          hasImageTitle: hasImageTitle,\n          hasDimensions: hasDimensions,\n          hasImageCaption: hasImageCaption,\n          url: url,\n          basePath: basePath,\n          credentials: credentials,\n          handler: handler,\n          prependURL: prependURL,\n          hasAccessibilityOptions: hasAccessibilityOptions,\n          automaticUploads: automaticUploads\n        };\n      });\n    };\n\n    var makeItems = function (info) {\n      var imageUrl = {\n        name: 'src',\n        type: 'urlinput',\n        filetype: 'image',\n        label: 'Source'\n      };\n      var imageList = info.imageList.map(function (items) {\n        return {\n          name: 'images',\n          type: 'selectbox',\n          label: 'Image list',\n          items: items\n        };\n      });\n      var imageDescription = {\n        name: 'alt',\n        type: 'input',\n        label: 'Alternative description',\n        disabled: info.hasAccessibilityOptions && info.image.isDecorative\n      };\n      var imageTitle = {\n        name: 'title',\n        type: 'input',\n        label: 'Image title'\n      };\n      var imageDimensions = {\n        name: 'dimensions',\n        type: 'sizeinput'\n      };\n      var isDecorative = {\n        type: 'label',\n        label: 'Accessibility',\n        items: [{\n            name: 'isDecorative',\n            type: 'checkbox',\n            label: 'Image is decorative'\n          }]\n      };\n      var classList = info.classList.map(function (items) {\n        return {\n          name: 'classes',\n          type: 'selectbox',\n          label: 'Class',\n          items: items\n        };\n      });\n      var caption = {\n        type: 'label',\n        label: 'Caption',\n        items: [{\n            type: 'checkbox',\n            name: 'caption',\n            label: 'Show caption'\n          }]\n      };\n      return flatten([\n        [imageUrl],\n        imageList.toArray(),\n        info.hasAccessibilityOptions && info.hasDescription ? [isDecorative] : [],\n        info.hasDescription ? [imageDescription] : [],\n        info.hasImageTitle ? [imageTitle] : [],\n        info.hasDimensions ? [imageDimensions] : [],\n        [{\n            type: 'grid',\n            columns: 2,\n            items: flatten([\n              classList.toArray(),\n              info.hasImageCaption ? [caption] : []\n            ])\n          }]\n      ]);\n    };\n    var makeTab$1 = function (info) {\n      return {\n        title: 'General',\n        name: 'general',\n        items: makeItems(info)\n      };\n    };\n    var MainTab = {\n      makeTab: makeTab$1,\n      makeItems: makeItems\n    };\n\n    var makeTab$2 = function (info) {\n      var items = [{\n          type: 'dropzone',\n          name: 'fileinput'\n        }];\n      return {\n        title: 'Upload',\n        name: 'upload',\n        items: items\n      };\n    };\n    var UploadTab = { makeTab: makeTab$2 };\n\n    var createState = function (info) {\n      return {\n        prevImage: ListUtils.findEntry(info.imageList, info.image.src),\n        prevAlt: info.image.alt,\n        open: true\n      };\n    };\n    var fromImageData = function (image) {\n      return {\n        src: {\n          value: image.src,\n          meta: {}\n        },\n        images: image.src,\n        alt: image.alt,\n        title: image.title,\n        dimensions: {\n          width: image.width,\n          height: image.height\n        },\n        classes: image.class,\n        caption: image.caption,\n        style: image.style,\n        vspace: image.vspace,\n        border: image.border,\n        hspace: image.hspace,\n        borderstyle: image.borderStyle,\n        fileinput: [],\n        isDecorative: image.isDecorative\n      };\n    };\n    var toImageData = function (data) {\n      return {\n        src: data.src.value,\n        alt: data.alt,\n        title: data.title,\n        width: data.dimensions.width,\n        height: data.dimensions.height,\n        class: data.classes,\n        style: data.style,\n        caption: data.caption,\n        hspace: data.hspace,\n        vspace: data.vspace,\n        border: data.border,\n        borderStyle: data.borderstyle,\n        isDecorative: data.isDecorative\n      };\n    };\n    var addPrependUrl2 = function (info, srcURL) {\n      if (!/^(?:[a-zA-Z]+:)?\\/\\//.test(srcURL)) {\n        return info.prependURL.bind(function (prependUrl) {\n          if (srcURL.substring(0, prependUrl.length) !== prependUrl) {\n            return Option.some(prependUrl + srcURL);\n          }\n          return Option.none();\n        });\n      }\n      return Option.none();\n    };\n    var addPrependUrl = function (info, api) {\n      var data = api.getData();\n      addPrependUrl2(info, data.src.value).each(function (srcURL) {\n        api.setData({\n          src: {\n            value: srcURL,\n            meta: data.src.meta\n          }\n        });\n      });\n    };\n    var formFillFromMeta2 = function (info, data, meta) {\n      if (info.hasDescription && isString(meta.alt)) {\n        data.alt = meta.alt;\n      }\n      if (info.hasAccessibilityOptions) {\n        data.isDecorative = meta.isDecorative || data.isDecorative || false;\n      }\n      if (info.hasImageTitle && isString(meta.title)) {\n        data.title = meta.title;\n      }\n      if (info.hasDimensions) {\n        if (isString(meta.width)) {\n          data.dimensions.width = meta.width;\n        }\n        if (isString(meta.height)) {\n          data.dimensions.height = meta.height;\n        }\n      }\n      if (isString(meta.class)) {\n        ListUtils.findEntry(info.classList, meta.class).each(function (entry) {\n          data.classes = entry.value;\n        });\n      }\n      if (info.hasImageCaption) {\n        if (isBoolean(meta.caption)) {\n          data.caption = meta.caption;\n        }\n      }\n      if (info.hasAdvTab) {\n        if (isString(meta.style)) {\n          data.style = meta.style;\n        }\n        if (isString(meta.vspace)) {\n          data.vspace = meta.vspace;\n        }\n        if (isString(meta.border)) {\n          data.border = meta.border;\n        }\n        if (isString(meta.hspace)) {\n          data.hspace = meta.hspace;\n        }\n        if (isString(meta.borderstyle)) {\n          data.borderstyle = meta.borderstyle;\n        }\n      }\n    };\n    var formFillFromMeta = function (info, api) {\n      var data = api.getData();\n      var meta = data.src.meta;\n      if (meta !== undefined) {\n        var newData = deepMerge({}, data);\n        formFillFromMeta2(info, newData, meta);\n        api.setData(newData);\n      }\n    };\n    var calculateImageSize = function (helpers, info, state, api) {\n      var data = api.getData();\n      var url = data.src.value;\n      var meta = data.src.meta || {};\n      if (!meta.width && !meta.height && info.hasDimensions) {\n        helpers.imageSize(url).get(function (result) {\n          result.each(function (size) {\n            if (state.open) {\n              api.setData({ dimensions: size });\n            }\n          });\n        });\n      }\n    };\n    var updateImagesDropdown = function (info, state, api) {\n      var data = api.getData();\n      var image = ListUtils.findEntry(info.imageList, data.src.value);\n      state.prevImage = image;\n      api.setData({\n        images: image.map(function (entry) {\n          return entry.value;\n        }).getOr('')\n      });\n    };\n    var changeSrc = function (helpers, info, state, api) {\n      addPrependUrl(info, api);\n      formFillFromMeta(info, api);\n      calculateImageSize(helpers, info, state, api);\n      updateImagesDropdown(info, state, api);\n    };\n    var changeImages = function (helpers, info, state, api) {\n      var data = api.getData();\n      var image = ListUtils.findEntry(info.imageList, data.images);\n      image.each(function (img) {\n        var updateAlt = data.alt === '' || state.prevImage.map(function (image) {\n          return image.text === data.alt;\n        }).getOr(false);\n        if (updateAlt) {\n          if (img.value === '') {\n            api.setData({\n              src: img,\n              alt: state.prevAlt\n            });\n          } else {\n            api.setData({\n              src: img,\n              alt: img.text\n            });\n          }\n        } else {\n          api.setData({ src: img });\n        }\n      });\n      state.prevImage = image;\n      changeSrc(helpers, info, state, api);\n    };\n    var calcVSpace = function (css) {\n      var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom'];\n      return matchingTopBottom ? Utils.removePixelSuffix(String(css['margin-top'])) : '';\n    };\n    var calcHSpace = function (css) {\n      var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left'];\n      return matchingLeftRight ? Utils.removePixelSuffix(String(css['margin-right'])) : '';\n    };\n    var calcBorderWidth = function (css) {\n      return css['border-width'] ? Utils.removePixelSuffix(String(css['border-width'])) : '';\n    };\n    var calcBorderStyle = function (css) {\n      return css['border-style'] ? String(css['border-style']) : '';\n    };\n    var calcStyle = function (parseStyle, serializeStyle, css) {\n      return serializeStyle(parseStyle(serializeStyle(css)));\n    };\n    var changeStyle2 = function (parseStyle, serializeStyle, data) {\n      var css = Utils.mergeMargins(parseStyle(data.style));\n      var dataCopy = deepMerge({}, data);\n      dataCopy.vspace = calcVSpace(css);\n      dataCopy.hspace = calcHSpace(css);\n      dataCopy.border = calcBorderWidth(css);\n      dataCopy.borderstyle = calcBorderStyle(css);\n      dataCopy.style = calcStyle(parseStyle, serializeStyle, css);\n      return dataCopy;\n    };\n    var changeStyle = function (helpers, api) {\n      var data = api.getData();\n      var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data);\n      api.setData(newData);\n    };\n    var changeAStyle = function (helpers, info, api) {\n      var data = deepMerge(fromImageData(info.image), api.getData());\n      var style = getStyleValue(helpers.normalizeCss, toImageData(data));\n      api.setData({ style: style });\n    };\n    var changeFileInput = function (helpers, info, state, api) {\n      var data = api.getData();\n      api.block('Uploading image');\n      head(data.fileinput).fold(function () {\n        api.unblock();\n      }, function (file) {\n        var blobUri = domGlobals.URL.createObjectURL(file);\n        var uploader = Uploader({\n          url: info.url,\n          basePath: info.basePath,\n          credentials: info.credentials,\n          handler: info.handler\n        });\n        var finalize = function () {\n          api.unblock();\n          domGlobals.URL.revokeObjectURL(blobUri);\n        };\n        var updateSrcAndSwitchTab = function (url) {\n          api.setData({\n            src: {\n              value: url,\n              meta: {}\n            }\n          });\n          api.showTab('general');\n          changeSrc(helpers, info, state, api);\n        };\n        Utils.blobToDataUri(file).then(function (dataUrl) {\n          var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl);\n          if (info.automaticUploads) {\n            uploader.upload(blobInfo).then(function (url) {\n              updateSrcAndSwitchTab(url);\n              finalize();\n            }).catch(function (err) {\n              finalize();\n              helpers.alertErr(api, err);\n            });\n          } else {\n            helpers.addToBlobCache(blobInfo);\n            updateSrcAndSwitchTab(blobInfo.blobUri());\n            api.unblock();\n          }\n        });\n      });\n    };\n    var changeHandler = function (helpers, info, state) {\n      return function (api, evt) {\n        if (evt.name === 'src') {\n          changeSrc(helpers, info, state, api);\n        } else if (evt.name === 'images') {\n          changeImages(helpers, info, state, api);\n        } else if (evt.name === 'alt') {\n          state.prevAlt = api.getData().alt;\n        } else if (evt.name === 'style') {\n          changeStyle(helpers, api);\n        } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') {\n          changeAStyle(helpers, info, api);\n        } else if (evt.name === 'fileinput') {\n          changeFileInput(helpers, info, state, api);\n        } else if (evt.name === 'isDecorative') {\n          if (api.getData().isDecorative) {\n            api.disable('alt');\n          } else {\n            api.enable('alt');\n          }\n        }\n      };\n    };\n    var closeHandler = function (state) {\n      return function () {\n        state.open = false;\n      };\n    };\n    var makeDialogBody = function (info) {\n      if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) {\n        var tabPanel = {\n          type: 'tabpanel',\n          tabs: flatten([\n            [MainTab.makeTab(info)],\n            info.hasAdvTab ? [AdvTab.makeTab(info)] : [],\n            info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : []\n          ])\n        };\n        return tabPanel;\n      } else {\n        var panel = {\n          type: 'panel',\n          items: MainTab.makeItems(info)\n        };\n        return panel;\n      }\n    };\n    var makeDialog = function (helpers) {\n      return function (info) {\n        var state = createState(info);\n        return {\n          title: 'Insert/Edit Image',\n          size: 'normal',\n          body: makeDialogBody(info),\n          buttons: [\n            {\n              type: 'cancel',\n              name: 'cancel',\n              text: 'Cancel'\n            },\n            {\n              type: 'submit',\n              name: 'save',\n              text: 'Save',\n              primary: true\n            }\n          ],\n          initialData: fromImageData(info.image),\n          onSubmit: helpers.onSubmit(info),\n          onChange: changeHandler(helpers, info, state),\n          onClose: closeHandler(state)\n        };\n      };\n    };\n    var submitHandler = function (editor) {\n      return function (info) {\n        return function (api) {\n          var data = deepMerge(fromImageData(info.image), api.getData());\n          editor.undoManager.transact(function () {\n            insertOrUpdateImage(editor, toImageData(data), info);\n          });\n          editor.editorUpload.uploadImagesAuto();\n          api.close();\n        };\n      };\n    };\n    var imageSize = function (editor) {\n      return function (url) {\n        return FutureResult.nu(function (completer) {\n          Utils.getImageSize(editor.documentBaseURI.toAbsolute(url), function (data) {\n            var result = data.map(function (dimensions) {\n              return {\n                width: String(dimensions.width),\n                height: String(dimensions.height)\n              };\n            });\n            completer(result);\n          });\n        });\n      };\n    };\n    var createBlobCache = function (editor) {\n      return function (file, blobUri, dataUrl) {\n        return editor.editorUpload.blobCache.create({\n          blob: file,\n          blobUri: blobUri,\n          name: file.name ? file.name.replace(/\\.[^\\.]+$/, '') : null,\n          base64: dataUrl.split(',')[1]\n        });\n      };\n    };\n    var addToBlobCache = function (editor) {\n      return function (blobInfo) {\n        editor.editorUpload.blobCache.add(blobInfo);\n      };\n    };\n    var alertErr = function (editor) {\n      return function (api, message) {\n        editor.windowManager.alert(message, api.close);\n      };\n    };\n    var normalizeCss$1 = function (editor) {\n      return function (cssText) {\n        return normalizeCss(editor, cssText);\n      };\n    };\n    var parseStyle = function (editor) {\n      return function (cssText) {\n        return editor.dom.parseStyle(cssText);\n      };\n    };\n    var serializeStyle = function (editor) {\n      return function (stylesArg, name) {\n        return editor.dom.serializeStyle(stylesArg, name);\n      };\n    };\n    var Dialog = function (editor) {\n      var helpers = {\n        onSubmit: submitHandler(editor),\n        imageSize: imageSize(editor),\n        addToBlobCache: addToBlobCache(editor),\n        createBlobCache: createBlobCache(editor),\n        alertErr: alertErr(editor),\n        normalizeCss: normalizeCss$1(editor),\n        parseStyle: parseStyle(editor),\n        serializeStyle: serializeStyle(editor)\n      };\n      var open = function () {\n        return collect(editor).map(makeDialog(helpers)).get(function (spec) {\n          editor.windowManager.open(spec);\n        });\n      };\n      return { open: open };\n    };\n\n    var register = function (editor) {\n      editor.addCommand('mceImage', Dialog(editor).open);\n    };\n    var Commands = { register: register };\n\n    var hasImageClass = function (node) {\n      var className = node.attr('class');\n      return className && /\\bimage\\b/.test(className);\n    };\n    var toggleContentEditableState = function (state) {\n      return function (nodes) {\n        var i = nodes.length;\n        var toggleContentEditable = function (node) {\n          node.attr('contenteditable', state ? 'true' : null);\n        };\n        while (i--) {\n          var node = nodes[i];\n          if (hasImageClass(node)) {\n            node.attr('contenteditable', state ? 'false' : null);\n            global$5.each(node.getAll('figcaption'), toggleContentEditable);\n          }\n        }\n      };\n    };\n    var setup = function (editor) {\n      editor.on('PreInit', function () {\n        editor.parser.addNodeFilter('figure', toggleContentEditableState(true));\n        editor.serializer.addNodeFilter('figure', toggleContentEditableState(false));\n      });\n    };\n    var FilterContent = { setup: setup };\n\n    var register$1 = function (editor) {\n      editor.ui.registry.addToggleButton('image', {\n        icon: 'image',\n        tooltip: 'Insert/edit image',\n        onAction: Dialog(editor).open,\n        onSetup: function (buttonApi) {\n          return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind;\n        }\n      });\n      editor.ui.registry.addMenuItem('image', {\n        icon: 'image',\n        text: 'Image...',\n        onAction: Dialog(editor).open\n      });\n      editor.ui.registry.addContextMenu('image', {\n        update: function (element) {\n          return isFigure(element) || isImage(element) && !Utils.isPlaceholderImage(element) ? ['image'] : [];\n        }\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global$1.add('image', function (editor) {\n        FilterContent.setup(editor);\n        Buttons.register(editor);\n        Commands.register(editor);\n      });\n    }\n\n    Plugin();\n\n}(window));\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function () {\n    'use strict';\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var register = function (editor) {\n      editor.addCommand('InsertHorizontalRule', function () {\n        editor.execCommand('mceInsertContent', false, '<hr />');\n      });\n    };\n    var Commands = { register: register };\n\n    var register$1 = function (editor) {\n      editor.ui.registry.addButton('hr', {\n        icon: 'horizontal-rule',\n        tooltip: 'Horizontal line',\n        onAction: function () {\n          return editor.execCommand('InsertHorizontalRule');\n        }\n      });\n      editor.ui.registry.addMenuItem('hr', {\n        icon: 'horizontal-rule',\n        text: 'Horizontal line',\n        onAction: function () {\n          return editor.execCommand('InsertHorizontalRule');\n        }\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global.add('hr', function (editor) {\n        Commands.register(editor);\n        Buttons.register(editor);\n      });\n    }\n\n    Plugin();\n\n}());\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n    var setDir = function (editor, dir) {\n      var dom = editor.dom;\n      var curDir;\n      var blocks = editor.selection.getSelectedBlocks();\n      if (blocks.length) {\n        curDir = dom.getAttrib(blocks[0], 'dir');\n        global$1.each(blocks, function (block) {\n          if (!dom.getParent(block.parentNode, '*[dir=\"' + dir + '\"]', dom.getRoot())) {\n            dom.setAttrib(block, 'dir', curDir !== dir ? dir : null);\n          }\n        });\n        editor.nodeChanged();\n      }\n    };\n    var Direction = { setDir: setDir };\n\n    var register = function (editor) {\n      editor.addCommand('mceDirectionLTR', function () {\n        Direction.setDir(editor, 'ltr');\n      });\n      editor.addCommand('mceDirectionRTL', function () {\n        Direction.setDir(editor, 'rtl');\n      });\n    };\n    var Commands = { register: register };\n\n    var noop = function () {\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var fromHtml = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        domGlobals.console.error('HTML does not have a single root node', html);\n        throw new Error('HTML must have a single root node');\n      }\n      return fromDom(div.childNodes[0]);\n    };\n    var fromTag = function (tag, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createElement(tag);\n      return fromDom(node);\n    };\n    var fromText = function (text, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createTextNode(text);\n      return fromDom(node);\n    };\n    var fromDom = function (node) {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: constant(node) };\n    };\n    var fromPoint = function (docElm, x, y) {\n      var doc = docElm.dom();\n      return Option.from(doc.elementFromPoint(x, y)).map(fromDom);\n    };\n    var Element = {\n      fromHtml: fromHtml,\n      fromTag: fromTag,\n      fromText: fromText,\n      fromDom: fromDom,\n      fromPoint: fromPoint\n    };\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isFunction = isType('function');\n\n    var nativeSlice = Array.prototype.slice;\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n\n    var isSupported = function (dom) {\n      return dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n    };\n\n    var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;\n    var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;\n    var COMMENT = domGlobals.Node.COMMENT_NODE;\n    var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;\n    var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;\n    var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;\n    var ELEMENT = domGlobals.Node.ELEMENT_NODE;\n    var TEXT = domGlobals.Node.TEXT_NODE;\n    var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;\n    var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;\n    var ENTITY = domGlobals.Node.ENTITY_NODE;\n    var NOTATION = domGlobals.Node.NOTATION_NODE;\n\n    var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();\n\n    var type = function (element) {\n      return element.dom().nodeType;\n    };\n    var isType$1 = function (t) {\n      return function (element) {\n        return type(element) === t;\n      };\n    };\n    var isText = isType$1(TEXT);\n\n    var inBody = function (element) {\n      var dom = isText(element) ? element.dom().parentNode : element.dom();\n      return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom);\n    };\n\n    var get = function (element, property) {\n      var dom = element.dom();\n      var styles = domGlobals.window.getComputedStyle(dom);\n      var r = styles.getPropertyValue(property);\n      var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n      return v === null ? undefined : v;\n    };\n    var getUnsafeProperty = function (dom, property) {\n      return isSupported(dom) ? dom.style.getPropertyValue(property) : '';\n    };\n\n    var getDirection = function (element) {\n      return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';\n    };\n\n    var getNodeChangeHandler = function (editor, dir) {\n      return function (api) {\n        var nodeChangeHandler = function (e) {\n          var element = Element.fromDom(e.element);\n          api.setActive(getDirection(element) === dir);\n        };\n        editor.on('NodeChange', nodeChangeHandler);\n        return function () {\n          return editor.off('NodeChange', nodeChangeHandler);\n        };\n      };\n    };\n    var register$1 = function (editor) {\n      editor.ui.registry.addToggleButton('ltr', {\n        tooltip: 'Left to right',\n        icon: 'ltr',\n        onAction: function () {\n          return editor.execCommand('mceDirectionLTR');\n        },\n        onSetup: getNodeChangeHandler(editor, 'ltr')\n      });\n      editor.ui.registry.addToggleButton('rtl', {\n        tooltip: 'Right to left',\n        icon: 'rtl',\n        onAction: function () {\n          return editor.execCommand('mceDirectionRTL');\n        },\n        onSetup: getNodeChangeHandler(editor, 'rtl')\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global.add('directionality', function (editor) {\n        Commands.register(editor);\n        Buttons.register(editor);\n      });\n    }\n\n    Plugin();\n\n}(window));\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var noop = function () {\n    };\n    var compose = function (fa, fb) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return fa(fb.apply(null, args));\n      };\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var identity = function (x) {\n      return x;\n    };\n    function curry(fn) {\n      var initialArgs = [];\n      for (var _i = 1; _i < arguments.length; _i++) {\n        initialArgs[_i - 1] = arguments[_i];\n      }\n      return function () {\n        var restArgs = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          restArgs[_i] = arguments[_i];\n        }\n        var all = initialArgs.concat(restArgs);\n        return fn.apply(null, all);\n      };\n    }\n    var not = function (f) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return !f.apply(null, args);\n      };\n    };\n    var die = function (msg) {\n      return function () {\n        throw new Error(msg);\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isString = isType('string');\n    var isObject = isType('object');\n    var isArray = isType('array');\n    var isNull = isType('null');\n    var isBoolean = isType('boolean');\n    var isFunction = isType('function');\n    var isNumber = isType('number');\n\n    var nativeSlice = Array.prototype.slice;\n    var nativeIndexOf = Array.prototype.indexOf;\n    var nativePush = Array.prototype.push;\n    var rawIndexOf = function (ts, t) {\n      return nativeIndexOf.call(ts, t);\n    };\n    var indexOf = function (xs, x) {\n      var r = rawIndexOf(xs, x);\n      return r === -1 ? Option.none() : Option.some(r);\n    };\n    var contains = function (xs, x) {\n      return rawIndexOf(xs, x) > -1;\n    };\n    var exists = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    var map = function (xs, f) {\n      var len = xs.length;\n      var r = new Array(len);\n      for (var i = 0; i < len; i++) {\n        var x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    var each = function (xs, f) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var eachr = function (xs, f) {\n      for (var i = xs.length - 1; i >= 0; i--) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var partition = function (xs, pred) {\n      var pass = [];\n      var fail = [];\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        var arr = pred(x, i) ? pass : fail;\n        arr.push(x);\n      }\n      return {\n        pass: pass,\n        fail: fail\n      };\n    };\n    var filter = function (xs, pred) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n    var foldr = function (xs, f, acc) {\n      eachr(xs, function (x) {\n        acc = f(acc, x);\n      });\n      return acc;\n    };\n    var foldl = function (xs, f, acc) {\n      each(xs, function (x) {\n        acc = f(acc, x);\n      });\n      return acc;\n    };\n    var find = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return Option.some(x);\n        }\n      }\n      return Option.none();\n    };\n    var findIndex = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return Option.some(i);\n        }\n      }\n      return Option.none();\n    };\n    var flatten = function (xs) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    var bind = function (xs, f) {\n      return flatten(map(xs, f));\n    };\n    var forall = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        var x = xs[i];\n        if (pred(x, i) !== true) {\n          return false;\n        }\n      }\n      return true;\n    };\n    var reverse = function (xs) {\n      var r = nativeSlice.call(xs, 0);\n      r.reverse();\n      return r;\n    };\n    var difference = function (a1, a2) {\n      return filter(a1, function (x) {\n        return !contains(a2, x);\n      });\n    };\n    var mapToObject = function (xs, f) {\n      var r = {};\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        r[String(x)] = f(x, i);\n      }\n      return r;\n    };\n    var sort = function (xs, comparator) {\n      var copy = nativeSlice.call(xs, 0);\n      copy.sort(comparator);\n      return copy;\n    };\n    var head = function (xs) {\n      return xs.length === 0 ? Option.none() : Option.some(xs[0]);\n    };\n    var last = function (xs) {\n      return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]);\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n\n    var keys = Object.keys;\n    var hasOwnProperty = Object.hasOwnProperty;\n    var each$1 = function (obj, f) {\n      var props = keys(obj);\n      for (var k = 0, len = props.length; k < len; k++) {\n        var i = props[k];\n        var x = obj[i];\n        f(x, i);\n      }\n    };\n    var map$1 = function (obj, f) {\n      return tupleMap(obj, function (x, i) {\n        return {\n          k: i,\n          v: f(x, i)\n        };\n      });\n    };\n    var tupleMap = function (obj, f) {\n      var r = {};\n      each$1(obj, function (x, i) {\n        var tuple = f(x, i);\n        r[tuple.k] = tuple.v;\n      });\n      return r;\n    };\n    var objAcc = function (r) {\n      return function (x, i) {\n        r[i] = x;\n      };\n    };\n    var internalFilter = function (obj, pred, onTrue, onFalse) {\n      var r = {};\n      each$1(obj, function (x, i) {\n        (pred(x, i) ? onTrue : onFalse)(x, i);\n      });\n      return r;\n    };\n    var bifilter = function (obj, pred) {\n      var t = {};\n      var f = {};\n      internalFilter(obj, pred, objAcc(t), objAcc(f));\n      return {\n        t: t,\n        f: f\n      };\n    };\n    var filter$1 = function (obj, pred) {\n      var t = {};\n      internalFilter(obj, pred, objAcc(t), noop);\n      return t;\n    };\n    var get = function (obj, key) {\n      return has(obj, key) ? Option.from(obj[key]) : Option.none();\n    };\n    var has = function (obj, key) {\n      return hasOwnProperty.call(obj, key);\n    };\n\n    var __assign = function () {\n      __assign = Object.assign || function __assign(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p))\n              t[p] = s[p];\n        }\n        return t;\n      };\n      return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n      var t = {};\n      for (var p in s)\n        if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n          t[p] = s[p];\n      if (s != null && typeof Object.getOwnPropertySymbols === 'function')\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n            t[p[i]] = s[p[i]];\n        }\n      return t;\n    }\n    function __spreadArrays() {\n      for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n        s += arguments[i].length;\n      for (var r = Array(s), k = 0, i = 0; i < il; i++)\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n      return r;\n    }\n\n    var fromHtml = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        domGlobals.console.error('HTML does not have a single root node', html);\n        throw new Error('HTML must have a single root node');\n      }\n      return fromDom(div.childNodes[0]);\n    };\n    var fromTag = function (tag, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createElement(tag);\n      return fromDom(node);\n    };\n    var fromText = function (text, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createTextNode(text);\n      return fromDom(node);\n    };\n    var fromDom = function (node) {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: constant(node) };\n    };\n    var fromPoint = function (docElm, x, y) {\n      var doc = docElm.dom();\n      return Option.from(doc.elementFromPoint(x, y)).map(fromDom);\n    };\n    var Element = {\n      fromHtml: fromHtml,\n      fromTag: fromTag,\n      fromText: fromText,\n      fromDom: fromDom,\n      fromPoint: fromPoint\n    };\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var firstMatch = function (regexes, s) {\n      for (var i = 0; i < regexes.length; i++) {\n        var x = regexes[i];\n        if (x.test(s)) {\n          return x;\n        }\n      }\n      return undefined;\n    };\n    var find$1 = function (regexes, agent) {\n      var r = firstMatch(regexes, agent);\n      if (!r) {\n        return {\n          major: 0,\n          minor: 0\n        };\n      }\n      var group = function (i) {\n        return Number(agent.replace(r, '$' + i));\n      };\n      return nu(group(1), group(2));\n    };\n    var detect = function (versionRegexes, agent) {\n      var cleanedAgent = String(agent).toLowerCase();\n      if (versionRegexes.length === 0) {\n        return unknown();\n      }\n      return find$1(versionRegexes, cleanedAgent);\n    };\n    var unknown = function () {\n      return nu(0, 0);\n    };\n    var nu = function (major, minor) {\n      return {\n        major: major,\n        minor: minor\n      };\n    };\n    var Version = {\n      nu: nu,\n      detect: detect,\n      unknown: unknown\n    };\n\n    var edge = 'Edge';\n    var chrome = 'Chrome';\n    var ie = 'IE';\n    var opera = 'Opera';\n    var firefox = 'Firefox';\n    var safari = 'Safari';\n    var isBrowser = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$1 = function () {\n      return nu$1({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$1 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isEdge: isBrowser(edge, current),\n        isChrome: isBrowser(chrome, current),\n        isIE: isBrowser(ie, current),\n        isOpera: isBrowser(opera, current),\n        isFirefox: isBrowser(firefox, current),\n        isSafari: isBrowser(safari, current)\n      };\n    };\n    var Browser = {\n      unknown: unknown$1,\n      nu: nu$1,\n      edge: constant(edge),\n      chrome: constant(chrome),\n      ie: constant(ie),\n      opera: constant(opera),\n      firefox: constant(firefox),\n      safari: constant(safari)\n    };\n\n    var windows = 'Windows';\n    var ios = 'iOS';\n    var android = 'Android';\n    var linux = 'Linux';\n    var osx = 'OSX';\n    var solaris = 'Solaris';\n    var freebsd = 'FreeBSD';\n    var chromeos = 'ChromeOS';\n    var isOS = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$2 = function () {\n      return nu$2({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$2 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isWindows: isOS(windows, current),\n        isiOS: isOS(ios, current),\n        isAndroid: isOS(android, current),\n        isOSX: isOS(osx, current),\n        isLinux: isOS(linux, current),\n        isSolaris: isOS(solaris, current),\n        isFreeBSD: isOS(freebsd, current),\n        isChromeOS: isOS(chromeos, current)\n      };\n    };\n    var OperatingSystem = {\n      unknown: unknown$2,\n      nu: nu$2,\n      windows: constant(windows),\n      ios: constant(ios),\n      android: constant(android),\n      linux: constant(linux),\n      osx: constant(osx),\n      solaris: constant(solaris),\n      freebsd: constant(freebsd),\n      chromeos: constant(chromeos)\n    };\n\n    var DeviceType = function (os, browser, userAgent, mediaMatch) {\n      var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;\n      var isiPhone = os.isiOS() && !isiPad;\n      var isMobile = os.isiOS() || os.isAndroid();\n      var isTouch = isMobile || mediaMatch('(pointer:coarse)');\n      var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');\n      var isPhone = isiPhone || isMobile && !isTablet;\n      var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;\n      var isDesktop = !isPhone && !isTablet && !iOSwebview;\n      return {\n        isiPad: constant(isiPad),\n        isiPhone: constant(isiPhone),\n        isTablet: constant(isTablet),\n        isPhone: constant(isPhone),\n        isTouch: constant(isTouch),\n        isAndroid: os.isAndroid,\n        isiOS: os.isiOS,\n        isWebView: constant(iOSwebview),\n        isDesktop: constant(isDesktop)\n      };\n    };\n\n    var detect$1 = function (candidates, userAgent) {\n      var agent = String(userAgent).toLowerCase();\n      return find(candidates, function (candidate) {\n        return candidate.search(agent);\n      });\n    };\n    var detectBrowser = function (browsers, userAgent) {\n      return detect$1(browsers, userAgent).map(function (browser) {\n        var version = Version.detect(browser.versionRegexes, userAgent);\n        return {\n          current: browser.name,\n          version: version\n        };\n      });\n    };\n    var detectOs = function (oses, userAgent) {\n      return detect$1(oses, userAgent).map(function (os) {\n        var version = Version.detect(os.versionRegexes, userAgent);\n        return {\n          current: os.name,\n          version: version\n        };\n      });\n    };\n    var UaString = {\n      detectBrowser: detectBrowser,\n      detectOs: detectOs\n    };\n\n    var checkRange = function (str, substr, start) {\n      if (substr === '') {\n        return true;\n      }\n      if (str.length < substr.length) {\n        return false;\n      }\n      var x = str.substr(start, start + substr.length);\n      return x === substr;\n    };\n    var contains$1 = function (str, substr) {\n      return str.indexOf(substr) !== -1;\n    };\n    var startsWith = function (str, prefix) {\n      return checkRange(str, prefix, 0);\n    };\n    var trim = function (str) {\n      return str.replace(/^\\s+|\\s+$/g, '');\n    };\n    var lTrim = function (str) {\n      return str.replace(/^\\s+/g, '');\n    };\n    var rTrim = function (str) {\n      return str.replace(/\\s+$/g, '');\n    };\n\n    var normalVersionRegex = /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/;\n    var checkContains = function (target) {\n      return function (uastring) {\n        return contains$1(uastring, target);\n      };\n    };\n    var browsers = [\n      {\n        name: 'Edge',\n        versionRegexes: [/.*?edge\\/ ?([0-9]+)\\.([0-9]+)$/],\n        search: function (uastring) {\n          return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit');\n        }\n      },\n      {\n        name: 'Chrome',\n        versionRegexes: [\n          /.*?chrome\\/([0-9]+)\\.([0-9]+).*/,\n          normalVersionRegex\n        ],\n        search: function (uastring) {\n          return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe');\n        }\n      },\n      {\n        name: 'IE',\n        versionRegexes: [\n          /.*?msie\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*?rv:([0-9]+)\\.([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return contains$1(uastring, 'msie') || contains$1(uastring, 'trident');\n        }\n      },\n      {\n        name: 'Opera',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?opera\\/([0-9]+)\\.([0-9]+).*/\n        ],\n        search: checkContains('opera')\n      },\n      {\n        name: 'Firefox',\n        versionRegexes: [/.*?firefox\\/\\ ?([0-9]+)\\.([0-9]+).*/],\n        search: checkContains('firefox')\n      },\n      {\n        name: 'Safari',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?cpu os ([0-9]+)_([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit');\n        }\n      }\n    ];\n    var oses = [\n      {\n        name: 'Windows',\n        search: checkContains('win'),\n        versionRegexes: [/.*?windows\\ nt\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'iOS',\n        search: function (uastring) {\n          return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad');\n        },\n        versionRegexes: [\n          /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*cpu os ([0-9]+)_([0-9]+).*/,\n          /.*cpu iphone os ([0-9]+)_([0-9]+).*/\n        ]\n      },\n      {\n        name: 'Android',\n        search: checkContains('android'),\n        versionRegexes: [/.*?android\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'OSX',\n        search: checkContains('mac os x'),\n        versionRegexes: [/.*?mac\\ os\\ x\\ ?([0-9]+)_([0-9]+).*/]\n      },\n      {\n        name: 'Linux',\n        search: checkContains('linux'),\n        versionRegexes: []\n      },\n      {\n        name: 'Solaris',\n        search: checkContains('sunos'),\n        versionRegexes: []\n      },\n      {\n        name: 'FreeBSD',\n        search: checkContains('freebsd'),\n        versionRegexes: []\n      },\n      {\n        name: 'ChromeOS',\n        search: checkContains('cros'),\n        versionRegexes: [/.*?chrome\\/([0-9]+)\\.([0-9]+).*/]\n      }\n    ];\n    var PlatformInfo = {\n      browsers: constant(browsers),\n      oses: constant(oses)\n    };\n\n    var detect$2 = function (userAgent, mediaMatch) {\n      var browsers = PlatformInfo.browsers();\n      var oses = PlatformInfo.oses();\n      var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);\n      var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);\n      var deviceType = DeviceType(os, browser, userAgent, mediaMatch);\n      return {\n        browser: browser,\n        os: os,\n        deviceType: deviceType\n      };\n    };\n    var PlatformDetection = { detect: detect$2 };\n\n    var mediaMatch = function (query) {\n      return domGlobals.window.matchMedia(query).matches;\n    };\n    var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch));\n    var detect$3 = function () {\n      return platform.get();\n    };\n\n    var Immutable = function () {\n      var fields = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        fields[_i] = arguments[_i];\n      }\n      return function () {\n        var values = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          values[_i] = arguments[_i];\n        }\n        if (fields.length !== values.length) {\n          throw new Error('Wrong number of arguments to struct. Expected \"[' + fields.length + ']\", got ' + values.length + ' arguments');\n        }\n        var struct = {};\n        each(fields, function (name, i) {\n          struct[name] = constant(values[i]);\n        });\n        return struct;\n      };\n    };\n\n    var toArray = function (target, f) {\n      var r = [];\n      var recurse = function (e) {\n        r.push(e);\n        return f(e);\n      };\n      var cur = f(target);\n      do {\n        cur = cur.bind(recurse);\n      } while (cur.isSome());\n      return r;\n    };\n    var Recurse = { toArray: toArray };\n\n    var compareDocumentPosition = function (a, b, match) {\n      return (a.compareDocumentPosition(b) & match) !== 0;\n    };\n    var documentPositionPreceding = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING);\n    };\n    var documentPositionContainedBy = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY);\n    };\n    var Node = {\n      documentPositionPreceding: documentPositionPreceding,\n      documentPositionContainedBy: documentPositionContainedBy\n    };\n\n    var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;\n    var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;\n    var COMMENT = domGlobals.Node.COMMENT_NODE;\n    var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;\n    var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;\n    var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;\n    var ELEMENT = domGlobals.Node.ELEMENT_NODE;\n    var TEXT = domGlobals.Node.TEXT_NODE;\n    var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;\n    var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;\n    var ENTITY = domGlobals.Node.ENTITY_NODE;\n    var NOTATION = domGlobals.Node.NOTATION_NODE;\n\n    var ELEMENT$1 = ELEMENT;\n    var DOCUMENT$1 = DOCUMENT;\n    var is = function (element, selector) {\n      var dom = element.dom();\n      if (dom.nodeType !== ELEMENT$1) {\n        return false;\n      } else {\n        var elem = dom;\n        if (elem.matches !== undefined) {\n          return elem.matches(selector);\n        } else if (elem.msMatchesSelector !== undefined) {\n          return elem.msMatchesSelector(selector);\n        } else if (elem.webkitMatchesSelector !== undefined) {\n          return elem.webkitMatchesSelector(selector);\n        } else if (elem.mozMatchesSelector !== undefined) {\n          return elem.mozMatchesSelector(selector);\n        } else {\n          throw new Error('Browser lacks native selectors');\n        }\n      }\n    };\n    var bypassSelector = function (dom) {\n      return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0;\n    };\n    var all = function (selector, scope) {\n      var base = scope === undefined ? domGlobals.document : scope.dom();\n      return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom);\n    };\n    var one = function (selector, scope) {\n      var base = scope === undefined ? domGlobals.document : scope.dom();\n      return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom);\n    };\n\n    var eq = function (e1, e2) {\n      return e1.dom() === e2.dom();\n    };\n    var regularContains = function (e1, e2) {\n      var d1 = e1.dom();\n      var d2 = e2.dom();\n      return d1 === d2 ? false : d1.contains(d2);\n    };\n    var ieContains = function (e1, e2) {\n      return Node.documentPositionContainedBy(e1.dom(), e2.dom());\n    };\n    var browser = detect$3().browser;\n    var contains$2 = browser.isIE() ? ieContains : regularContains;\n\n    var owner = function (element) {\n      return Element.fromDom(element.dom().ownerDocument);\n    };\n    var documentElement = function (element) {\n      return Element.fromDom(element.dom().ownerDocument.documentElement);\n    };\n    var defaultView = function (element) {\n      return Element.fromDom(element.dom().ownerDocument.defaultView);\n    };\n    var parent = function (element) {\n      return Option.from(element.dom().parentNode).map(Element.fromDom);\n    };\n    var parents = function (element, isRoot) {\n      var stop = isFunction(isRoot) ? isRoot : never;\n      var dom = element.dom();\n      var ret = [];\n      while (dom.parentNode !== null && dom.parentNode !== undefined) {\n        var rawParent = dom.parentNode;\n        var p = Element.fromDom(rawParent);\n        ret.push(p);\n        if (stop(p) === true) {\n          break;\n        } else {\n          dom = rawParent;\n        }\n      }\n      return ret;\n    };\n    var prevSibling = function (element) {\n      return Option.from(element.dom().previousSibling).map(Element.fromDom);\n    };\n    var nextSibling = function (element) {\n      return Option.from(element.dom().nextSibling).map(Element.fromDom);\n    };\n    var prevSiblings = function (element) {\n      return reverse(Recurse.toArray(element, prevSibling));\n    };\n    var nextSiblings = function (element) {\n      return Recurse.toArray(element, nextSibling);\n    };\n    var children = function (element) {\n      return map(element.dom().childNodes, Element.fromDom);\n    };\n    var child = function (element, index) {\n      var cs = element.dom().childNodes;\n      return Option.from(cs[index]).map(Element.fromDom);\n    };\n    var firstChild = function (element) {\n      return child(element, 0);\n    };\n    var lastChild = function (element) {\n      return child(element, element.dom().childNodes.length - 1);\n    };\n    var childNodesCount = function (element) {\n      return element.dom().childNodes.length;\n    };\n    var spot = Immutable('element', 'offset');\n\n    var before = function (marker, element) {\n      var parent$1 = parent(marker);\n      parent$1.each(function (v) {\n        v.dom().insertBefore(element.dom(), marker.dom());\n      });\n    };\n    var after = function (marker, element) {\n      var sibling = nextSibling(marker);\n      sibling.fold(function () {\n        var parent$1 = parent(marker);\n        parent$1.each(function (v) {\n          append(v, element);\n        });\n      }, function (v) {\n        before(v, element);\n      });\n    };\n    var prepend = function (parent, element) {\n      var firstChild$1 = firstChild(parent);\n      firstChild$1.fold(function () {\n        append(parent, element);\n      }, function (v) {\n        parent.dom().insertBefore(element.dom(), v.dom());\n      });\n    };\n    var append = function (parent, element) {\n      parent.dom().appendChild(element.dom());\n    };\n    var wrap = function (element, wrapper) {\n      before(element, wrapper);\n      append(wrapper, element);\n    };\n\n    var before$1 = function (marker, elements) {\n      each(elements, function (x) {\n        before(marker, x);\n      });\n    };\n    var append$1 = function (parent, elements) {\n      each(elements, function (x) {\n        append(parent, x);\n      });\n    };\n\n    var empty = function (element) {\n      element.dom().textContent = '';\n      each(children(element), function (rogue) {\n        remove(rogue);\n      });\n    };\n    var remove = function (element) {\n      var dom = element.dom();\n      if (dom.parentNode !== null) {\n        dom.parentNode.removeChild(dom);\n      }\n    };\n    var unwrap = function (wrapper) {\n      var children$1 = children(wrapper);\n      if (children$1.length > 0) {\n        before$1(wrapper, children$1);\n      }\n      remove(wrapper);\n    };\n\n    var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();\n\n    var name = function (element) {\n      var r = element.dom().nodeName;\n      return r.toLowerCase();\n    };\n    var type = function (element) {\n      return element.dom().nodeType;\n    };\n    var isType$1 = function (t) {\n      return function (element) {\n        return type(element) === t;\n      };\n    };\n    var isElement = isType$1(ELEMENT);\n    var isText = isType$1(TEXT);\n\n    var inBody = function (element) {\n      var dom = isText(element) ? element.dom().parentNode : element.dom();\n      return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom);\n    };\n\n    var r = function (left, top) {\n      var translate = function (x, y) {\n        return r(left + x, top + y);\n      };\n      return {\n        left: constant(left),\n        top: constant(top),\n        translate: translate\n      };\n    };\n    var Position = r;\n\n    var boxPosition = function (dom) {\n      var box = dom.getBoundingClientRect();\n      return Position(box.left, box.top);\n    };\n    var firstDefinedOrZero = function (a, b) {\n      return a !== undefined ? a : b !== undefined ? b : 0;\n    };\n    var absolute = function (element) {\n      var doc = element.dom().ownerDocument;\n      var body = doc.body;\n      var win = doc.defaultView;\n      var html = doc.documentElement;\n      if (body === element.dom()) {\n        return Position(body.offsetLeft, body.offsetTop);\n      }\n      var scrollTop = firstDefinedOrZero(win.pageYOffset, html.scrollTop);\n      var scrollLeft = firstDefinedOrZero(win.pageXOffset, html.scrollLeft);\n      var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);\n      var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);\n      return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);\n    };\n    var viewport = function (element) {\n      var dom = element.dom();\n      var doc = dom.ownerDocument;\n      var body = doc.body;\n      if (body === dom) {\n        return Position(body.offsetLeft, body.offsetTop);\n      }\n      if (!inBody(element)) {\n        return Position(0, 0);\n      }\n      return boxPosition(dom);\n    };\n\n    var isSafari = detect$3().browser.isSafari();\n    var get$1 = function (_DOC) {\n      var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document;\n      var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n      var y = doc.body.scrollTop || doc.documentElement.scrollTop;\n      return Position(x, y);\n    };\n    var to = function (x, y, _DOC) {\n      var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document;\n      var win = doc.defaultView;\n      win.scrollTo(x, y);\n    };\n    var intoView = function (element, alignToTop) {\n      if (isSafari && isFunction(element.dom().scrollIntoViewIfNeeded)) {\n        element.dom().scrollIntoViewIfNeeded(false);\n      } else {\n        element.dom().scrollIntoView(alignToTop);\n      }\n    };\n\n    var get$2 = function (_win) {\n      var win = _win === undefined ? domGlobals.window : _win;\n      return Option.from(win['visualViewport']);\n    };\n    var bounds = function (x, y, width, height) {\n      return {\n        x: constant(x),\n        y: constant(y),\n        width: constant(width),\n        height: constant(height),\n        right: constant(x + width),\n        bottom: constant(y + height)\n      };\n    };\n    var getBounds = function (_win) {\n      var win = _win === undefined ? domGlobals.window : _win;\n      var doc = win.document;\n      var scroll = get$1(Element.fromDom(doc));\n      return get$2(win).fold(function () {\n        var html = win.document.documentElement;\n        var width = html.clientWidth;\n        var height = html.clientHeight;\n        return bounds(scroll.left(), scroll.top(), width, height);\n      }, function (visualViewport) {\n        return bounds(Math.max(visualViewport.pageLeft, scroll.left()), Math.max(visualViewport.pageTop, scroll.top()), visualViewport.width, visualViewport.height);\n      });\n    };\n\n    var isNodeType = function (type) {\n      return function (node) {\n        return !!node && node.nodeType === type;\n      };\n    };\n    var isRestrictedNode = function (node) {\n      return !!node && !Object.getPrototypeOf(node);\n    };\n    var isElement$1 = isNodeType(1);\n    var matchNodeNames = function (names) {\n      var lowercasedNames = names.map(function (s) {\n        return s.toLowerCase();\n      });\n      return function (node) {\n        if (node && node.nodeName) {\n          var nodeName = node.nodeName.toLowerCase();\n          return contains(lowercasedNames, nodeName);\n        }\n        return false;\n      };\n    };\n    var matchStyleValues = function (name, values) {\n      var items = values.toLowerCase().split(' ');\n      return function (node) {\n        var i, cssValue;\n        if (isElement$1(node)) {\n          for (i = 0; i < items.length; i++) {\n            var computed = node.ownerDocument.defaultView.getComputedStyle(node, null);\n            cssValue = computed ? computed.getPropertyValue(name) : null;\n            if (cssValue === items[i]) {\n              return true;\n            }\n          }\n        }\n        return false;\n      };\n    };\n    var hasPropValue = function (propName, propValue) {\n      return function (node) {\n        return isElement$1(node) && node[propName] === propValue;\n      };\n    };\n    var hasAttribute = function (attrName, attrValue) {\n      return function (node) {\n        return isElement$1(node) && node.hasAttribute(attrName);\n      };\n    };\n    var hasAttributeValue = function (attrName, attrValue) {\n      return function (node) {\n        return isElement$1(node) && node.getAttribute(attrName) === attrValue;\n      };\n    };\n    var isBogus = function (node) {\n      return isElement$1(node) && node.hasAttribute('data-mce-bogus');\n    };\n    var isBogusAll = function (node) {\n      return isElement$1(node) && node.getAttribute('data-mce-bogus') === 'all';\n    };\n    var isTable = function (node) {\n      return isElement$1(node) && node.tagName === 'TABLE';\n    };\n    var hasContentEditableState = function (value) {\n      return function (node) {\n        if (isElement$1(node)) {\n          if (node.contentEditable === value) {\n            return true;\n          }\n          if (node.getAttribute('data-mce-contenteditable') === value) {\n            return true;\n          }\n        }\n        return false;\n      };\n    };\n    var isTextareaOrInput = matchNodeNames([\n      'textarea',\n      'input'\n    ]);\n    var isText$1 = isNodeType(3);\n    var isComment = isNodeType(8);\n    var isDocument = isNodeType(9);\n    var isDocumentFragment = isNodeType(11);\n    var isBr = matchNodeNames(['br']);\n    var isContentEditableTrue = hasContentEditableState('true');\n    var isContentEditableFalse = hasContentEditableState('false');\n    var NodeType = {\n      isText: isText$1,\n      isElement: isElement$1,\n      isComment: isComment,\n      isDocument: isDocument,\n      isDocumentFragment: isDocumentFragment,\n      isBr: isBr,\n      isContentEditableTrue: isContentEditableTrue,\n      isContentEditableFalse: isContentEditableFalse,\n      isRestrictedNode: isRestrictedNode,\n      matchNodeNames: matchNodeNames,\n      hasPropValue: hasPropValue,\n      hasAttribute: hasAttribute,\n      hasAttributeValue: hasAttributeValue,\n      matchStyleValues: matchStyleValues,\n      isBogus: isBogus,\n      isBogusAll: isBogusAll,\n      isTable: isTable,\n      isTextareaOrInput: isTextareaOrInput\n    };\n\n    var isSupported = function (dom) {\n      return dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n    };\n\n    var rawSet = function (dom, key, value) {\n      if (isString(value) || isBoolean(value) || isNumber(value)) {\n        dom.setAttribute(key, value + '');\n      } else {\n        domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n        throw new Error('Attribute value was not simple');\n      }\n    };\n    var set = function (element, key, value) {\n      rawSet(element.dom(), key, value);\n    };\n    var setAll = function (element, attrs) {\n      var dom = element.dom();\n      each$1(attrs, function (v, k) {\n        rawSet(dom, k, v);\n      });\n    };\n    var get$3 = function (element, key) {\n      var v = element.dom().getAttribute(key);\n      return v === null ? undefined : v;\n    };\n    var getOpt = function (element, key) {\n      return Option.from(get$3(element, key));\n    };\n    var has$1 = function (element, key) {\n      var dom = element.dom();\n      return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;\n    };\n    var remove$1 = function (element, key) {\n      element.dom().removeAttribute(key);\n    };\n\n    var get$4 = function (element, property) {\n      var dom = element.dom();\n      var styles = domGlobals.window.getComputedStyle(dom);\n      var r = styles.getPropertyValue(property);\n      var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n      return v === null ? undefined : v;\n    };\n    var getUnsafeProperty = function (dom, property) {\n      return isSupported(dom) ? dom.style.getPropertyValue(property) : '';\n    };\n    var getRaw = function (element, property) {\n      var dom = element.dom();\n      var raw = getUnsafeProperty(dom, property);\n      return Option.from(raw).filter(function (r) {\n        return r.length > 0;\n      });\n    };\n    var getAllRaw = function (element) {\n      var css = {};\n      var dom = element.dom();\n      if (isSupported(dom)) {\n        for (var i = 0; i < dom.style.length; i++) {\n          var ruleName = dom.style.item(i);\n          css[ruleName] = dom.style[ruleName];\n        }\n      }\n      return css;\n    };\n    var reflow = function (e) {\n      return e.dom().offsetWidth;\n    };\n\n    var browser$1 = detect$3().browser;\n    var firstElement = function (nodes) {\n      return find(nodes, isElement);\n    };\n    var getTableCaptionDeltaY = function (elm) {\n      if (browser$1.isFirefox() && name(elm) === 'table') {\n        return firstElement(children(elm)).filter(function (elm) {\n          return name(elm) === 'caption';\n        }).bind(function (caption) {\n          return firstElement(nextSiblings(caption)).map(function (body) {\n            var bodyTop = body.dom().offsetTop;\n            var captionTop = caption.dom().offsetTop;\n            var captionHeight = caption.dom().offsetHeight;\n            return bodyTop <= captionTop ? -captionHeight : 0;\n          });\n        }).getOr(0);\n      } else {\n        return 0;\n      }\n    };\n    var hasChild = function (elm, child) {\n      return elm.children && contains(elm.children, child);\n    };\n    var getPos = function (body, elm, rootElm) {\n      var x = 0, y = 0, offsetParent;\n      var doc = body.ownerDocument;\n      var pos;\n      rootElm = rootElm ? rootElm : body;\n      if (elm) {\n        if (rootElm === body && elm.getBoundingClientRect && get$4(Element.fromDom(body), 'position') === 'static') {\n          pos = elm.getBoundingClientRect();\n          x = pos.left + (doc.documentElement.scrollLeft || body.scrollLeft) - doc.documentElement.clientLeft;\n          y = pos.top + (doc.documentElement.scrollTop || body.scrollTop) - doc.documentElement.clientTop;\n          return {\n            x: x,\n            y: y\n          };\n        }\n        offsetParent = elm;\n        while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {\n          x += offsetParent.offsetLeft || 0;\n          y += offsetParent.offsetTop || 0;\n          offsetParent = offsetParent.offsetParent;\n        }\n        offsetParent = elm.parentNode;\n        while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {\n          x -= offsetParent.scrollLeft || 0;\n          y -= offsetParent.scrollTop || 0;\n          offsetParent = offsetParent.parentNode;\n        }\n        y += getTableCaptionDeltaY(Element.fromDom(elm));\n      }\n      return {\n        x: x,\n        y: y\n      };\n    };\n    var Position$1 = { getPos: getPos };\n\n    var exports$1 = {}, module$1 = { exports: exports$1 };\n    (function (define, exports, module, require) {\n      (function (f) {\n        if (typeof exports === 'object' && typeof module !== 'undefined') {\n          module.exports = f();\n        } else if (typeof define === 'function' && define.amd) {\n          define([], f);\n        } else {\n          var g;\n          if (typeof window !== 'undefined') {\n            g = window;\n          } else if (typeof global !== 'undefined') {\n            g = global;\n          } else if (typeof self !== 'undefined') {\n            g = self;\n          } else {\n            g = this;\n          }\n          g.EphoxContactWrapper = f();\n        }\n      }(function () {\n        return function () {\n          function r(e, n, t) {\n            function o(i, f) {\n              if (!n[i]) {\n                if (!e[i]) {\n                  var c = 'function' == typeof require && require;\n                  if (!f && c)\n                    return c(i, !0);\n                  if (u)\n                    return u(i, !0);\n                  var a = new Error('Cannot find module \\'' + i + '\\'');\n                  throw a.code = 'MODULE_NOT_FOUND', a;\n                }\n                var p = n[i] = { exports: {} };\n                e[i][0].call(p.exports, function (r) {\n                  var n = e[i][1][r];\n                  return o(n || r);\n                }, p, p.exports, r, e, n, t);\n              }\n              return n[i].exports;\n            }\n            for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++)\n              o(t[i]);\n            return o;\n          }\n          return r;\n        }()({\n          1: [\n            function (require, module, exports) {\n              var process = module.exports = {};\n              var cachedSetTimeout;\n              var cachedClearTimeout;\n              function defaultSetTimout() {\n                throw new Error('setTimeout has not been defined');\n              }\n              function defaultClearTimeout() {\n                throw new Error('clearTimeout has not been defined');\n              }\n              (function () {\n                try {\n                  if (typeof setTimeout === 'function') {\n                    cachedSetTimeout = setTimeout;\n                  } else {\n                    cachedSetTimeout = defaultSetTimout;\n                  }\n                } catch (e) {\n                  cachedSetTimeout = defaultSetTimout;\n                }\n                try {\n                  if (typeof clearTimeout === 'function') {\n                    cachedClearTimeout = clearTimeout;\n                  } else {\n                    cachedClearTimeout = defaultClearTimeout;\n                  }\n                } catch (e) {\n                  cachedClearTimeout = defaultClearTimeout;\n                }\n              }());\n              function runTimeout(fun) {\n                if (cachedSetTimeout === setTimeout) {\n                  return setTimeout(fun, 0);\n                }\n                if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n                  cachedSetTimeout = setTimeout;\n                  return setTimeout(fun, 0);\n                }\n                try {\n                  return cachedSetTimeout(fun, 0);\n                } catch (e) {\n                  try {\n                    return cachedSetTimeout.call(null, fun, 0);\n                  } catch (e) {\n                    return cachedSetTimeout.call(this, fun, 0);\n                  }\n                }\n              }\n              function runClearTimeout(marker) {\n                if (cachedClearTimeout === clearTimeout) {\n                  return clearTimeout(marker);\n                }\n                if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n                  cachedClearTimeout = clearTimeout;\n                  return clearTimeout(marker);\n                }\n                try {\n                  return cachedClearTimeout(marker);\n                } catch (e) {\n                  try {\n                    return cachedClearTimeout.call(null, marker);\n                  } catch (e) {\n                    return cachedClearTimeout.call(this, marker);\n                  }\n                }\n              }\n              var queue = [];\n              var draining = false;\n              var currentQueue;\n              var queueIndex = -1;\n              function cleanUpNextTick() {\n                if (!draining || !currentQueue) {\n                  return;\n                }\n                draining = false;\n                if (currentQueue.length) {\n                  queue = currentQueue.concat(queue);\n                } else {\n                  queueIndex = -1;\n                }\n                if (queue.length) {\n                  drainQueue();\n                }\n              }\n              function drainQueue() {\n                if (draining) {\n                  return;\n                }\n                var timeout = runTimeout(cleanUpNextTick);\n                draining = true;\n                var len = queue.length;\n                while (len) {\n                  currentQueue = queue;\n                  queue = [];\n                  while (++queueIndex < len) {\n                    if (currentQueue) {\n                      currentQueue[queueIndex].run();\n                    }\n                  }\n                  queueIndex = -1;\n                  len = queue.length;\n                }\n                currentQueue = null;\n                draining = false;\n                runClearTimeout(timeout);\n              }\n              process.nextTick = function (fun) {\n                var args = new Array(arguments.length - 1);\n                if (arguments.length > 1) {\n                  for (var i = 1; i < arguments.length; i++) {\n                    args[i - 1] = arguments[i];\n                  }\n                }\n                queue.push(new Item(fun, args));\n                if (queue.length === 1 && !draining) {\n                  runTimeout(drainQueue);\n                }\n              };\n              function Item(fun, array) {\n                this.fun = fun;\n                this.array = array;\n              }\n              Item.prototype.run = function () {\n                this.fun.apply(null, this.array);\n              };\n              process.title = 'browser';\n              process.browser = true;\n              process.env = {};\n              process.argv = [];\n              process.version = '';\n              process.versions = {};\n              function noop() {\n              }\n              process.on = noop;\n              process.addListener = noop;\n              process.once = noop;\n              process.off = noop;\n              process.removeListener = noop;\n              process.removeAllListeners = noop;\n              process.emit = noop;\n              process.prependListener = noop;\n              process.prependOnceListener = noop;\n              process.listeners = function (name) {\n                return [];\n              };\n              process.binding = function (name) {\n                throw new Error('process.binding is not supported');\n              };\n              process.cwd = function () {\n                return '/';\n              };\n              process.chdir = function (dir) {\n                throw new Error('process.chdir is not supported');\n              };\n              process.umask = function () {\n                return 0;\n              };\n            },\n            {}\n          ],\n          2: [\n            function (require, module, exports) {\n              (function (setImmediate) {\n                (function (root) {\n                  var setTimeoutFunc = setTimeout;\n                  function noop() {\n                  }\n                  function bind(fn, thisArg) {\n                    return function () {\n                      fn.apply(thisArg, arguments);\n                    };\n                  }\n                  function Promise(fn) {\n                    if (typeof this !== 'object')\n                      throw new TypeError('Promises must be constructed via new');\n                    if (typeof fn !== 'function')\n                      throw new TypeError('not a function');\n                    this._state = 0;\n                    this._handled = false;\n                    this._value = undefined;\n                    this._deferreds = [];\n                    doResolve(fn, this);\n                  }\n                  function handle(self, deferred) {\n                    while (self._state === 3) {\n                      self = self._value;\n                    }\n                    if (self._state === 0) {\n                      self._deferreds.push(deferred);\n                      return;\n                    }\n                    self._handled = true;\n                    Promise._immediateFn(function () {\n                      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n                      if (cb === null) {\n                        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n                        return;\n                      }\n                      var ret;\n                      try {\n                        ret = cb(self._value);\n                      } catch (e) {\n                        reject(deferred.promise, e);\n                        return;\n                      }\n                      resolve(deferred.promise, ret);\n                    });\n                  }\n                  function resolve(self, newValue) {\n                    try {\n                      if (newValue === self)\n                        throw new TypeError('A promise cannot be resolved with itself.');\n                      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n                        var then = newValue.then;\n                        if (newValue instanceof Promise) {\n                          self._state = 3;\n                          self._value = newValue;\n                          finale(self);\n                          return;\n                        } else if (typeof then === 'function') {\n                          doResolve(bind(then, newValue), self);\n                          return;\n                        }\n                      }\n                      self._state = 1;\n                      self._value = newValue;\n                      finale(self);\n                    } catch (e) {\n                      reject(self, e);\n                    }\n                  }\n                  function reject(self, newValue) {\n                    self._state = 2;\n                    self._value = newValue;\n                    finale(self);\n                  }\n                  function finale(self) {\n                    if (self._state === 2 && self._deferreds.length === 0) {\n                      Promise._immediateFn(function () {\n                        if (!self._handled) {\n                          Promise._unhandledRejectionFn(self._value);\n                        }\n                      });\n                    }\n                    for (var i = 0, len = self._deferreds.length; i < len; i++) {\n                      handle(self, self._deferreds[i]);\n                    }\n                    self._deferreds = null;\n                  }\n                  function Handler(onFulfilled, onRejected, promise) {\n                    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n                    this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n                    this.promise = promise;\n                  }\n                  function doResolve(fn, self) {\n                    var done = false;\n                    try {\n                      fn(function (value) {\n                        if (done)\n                          return;\n                        done = true;\n                        resolve(self, value);\n                      }, function (reason) {\n                        if (done)\n                          return;\n                        done = true;\n                        reject(self, reason);\n                      });\n                    } catch (ex) {\n                      if (done)\n                        return;\n                      done = true;\n                      reject(self, ex);\n                    }\n                  }\n                  Promise.prototype['catch'] = function (onRejected) {\n                    return this.then(null, onRejected);\n                  };\n                  Promise.prototype.then = function (onFulfilled, onRejected) {\n                    var prom = new this.constructor(noop);\n                    handle(this, new Handler(onFulfilled, onRejected, prom));\n                    return prom;\n                  };\n                  Promise.all = function (arr) {\n                    var args = Array.prototype.slice.call(arr);\n                    return new Promise(function (resolve, reject) {\n                      if (args.length === 0)\n                        return resolve([]);\n                      var remaining = args.length;\n                      function res(i, val) {\n                        try {\n                          if (val && (typeof val === 'object' || typeof val === 'function')) {\n                            var then = val.then;\n                            if (typeof then === 'function') {\n                              then.call(val, function (val) {\n                                res(i, val);\n                              }, reject);\n                              return;\n                            }\n                          }\n                          args[i] = val;\n                          if (--remaining === 0) {\n                            resolve(args);\n                          }\n                        } catch (ex) {\n                          reject(ex);\n                        }\n                      }\n                      for (var i = 0; i < args.length; i++) {\n                        res(i, args[i]);\n                      }\n                    });\n                  };\n                  Promise.resolve = function (value) {\n                    if (value && typeof value === 'object' && value.constructor === Promise) {\n                      return value;\n                    }\n                    return new Promise(function (resolve) {\n                      resolve(value);\n                    });\n                  };\n                  Promise.reject = function (value) {\n                    return new Promise(function (resolve, reject) {\n                      reject(value);\n                    });\n                  };\n                  Promise.race = function (values) {\n                    return new Promise(function (resolve, reject) {\n                      for (var i = 0, len = values.length; i < len; i++) {\n                        values[i].then(resolve, reject);\n                      }\n                    });\n                  };\n                  Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {\n                    setImmediate(fn);\n                  } : function (fn) {\n                    setTimeoutFunc(fn, 0);\n                  };\n                  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n                    if (typeof console !== 'undefined' && console) {\n                      console.warn('Possible Unhandled Promise Rejection:', err);\n                    }\n                  };\n                  Promise._setImmediateFn = function _setImmediateFn(fn) {\n                    Promise._immediateFn = fn;\n                  };\n                  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {\n                    Promise._unhandledRejectionFn = fn;\n                  };\n                  if (typeof module !== 'undefined' && module.exports) {\n                    module.exports = Promise;\n                  } else if (!root.Promise) {\n                    root.Promise = Promise;\n                  }\n                }(this));\n              }.call(this, require('timers').setImmediate));\n            },\n            { 'timers': 3 }\n          ],\n          3: [\n            function (require, module, exports) {\n              (function (setImmediate, clearImmediate) {\n                var nextTick = require('process/browser.js').nextTick;\n                var apply = Function.prototype.apply;\n                var slice = Array.prototype.slice;\n                var immediateIds = {};\n                var nextImmediateId = 0;\n                exports.setTimeout = function () {\n                  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n                };\n                exports.setInterval = function () {\n                  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n                };\n                exports.clearTimeout = exports.clearInterval = function (timeout) {\n                  timeout.close();\n                };\n                function Timeout(id, clearFn) {\n                  this._id = id;\n                  this._clearFn = clearFn;\n                }\n                Timeout.prototype.unref = Timeout.prototype.ref = function () {\n                };\n                Timeout.prototype.close = function () {\n                  this._clearFn.call(window, this._id);\n                };\n                exports.enroll = function (item, msecs) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = msecs;\n                };\n                exports.unenroll = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  item._idleTimeout = -1;\n                };\n                exports._unrefActive = exports.active = function (item) {\n                  clearTimeout(item._idleTimeoutId);\n                  var msecs = item._idleTimeout;\n                  if (msecs >= 0) {\n                    item._idleTimeoutId = setTimeout(function onTimeout() {\n                      if (item._onTimeout)\n                        item._onTimeout();\n                    }, msecs);\n                  }\n                };\n                exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) {\n                  var id = nextImmediateId++;\n                  var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n                  immediateIds[id] = true;\n                  nextTick(function onNextTick() {\n                    if (immediateIds[id]) {\n                      if (args) {\n                        fn.apply(null, args);\n                      } else {\n                        fn.call(null);\n                      }\n                      exports.clearImmediate(id);\n                    }\n                  });\n                  return id;\n                };\n                exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) {\n                  delete immediateIds[id];\n                };\n              }.call(this, require('timers').setImmediate, require('timers').clearImmediate));\n            },\n            {\n              'process/browser.js': 1,\n              'timers': 3\n            }\n          ],\n          4: [\n            function (require, module, exports) {\n              var promisePolyfill = require('promise-polyfill');\n              var Global = function () {\n                if (typeof window !== 'undefined') {\n                  return window;\n                } else {\n                  return Function('return this;')();\n                }\n              }();\n              module.exports = { boltExport: Global.Promise || promisePolyfill };\n            },\n            { 'promise-polyfill': 2 }\n          ]\n        }, {}, [4])(4);\n      }));\n    }(undefined, exports$1, module$1, undefined));\n    var Promise = module$1.exports.boltExport;\n\n    var nu$3 = function (baseFn) {\n      var data = Option.none();\n      var callbacks = [];\n      var map = function (f) {\n        return nu$3(function (nCallback) {\n          get(function (data) {\n            nCallback(f(data));\n          });\n        });\n      };\n      var get = function (nCallback) {\n        if (isReady()) {\n          call(nCallback);\n        } else {\n          callbacks.push(nCallback);\n        }\n      };\n      var set = function (x) {\n        data = Option.some(x);\n        run(callbacks);\n        callbacks = [];\n      };\n      var isReady = function () {\n        return data.isSome();\n      };\n      var run = function (cbs) {\n        each(cbs, call);\n      };\n      var call = function (cb) {\n        data.each(function (x) {\n          domGlobals.setTimeout(function () {\n            cb(x);\n          }, 0);\n        });\n      };\n      baseFn(set);\n      return {\n        get: get,\n        map: map,\n        isReady: isReady\n      };\n    };\n    var pure = function (a) {\n      return nu$3(function (callback) {\n        callback(a);\n      });\n    };\n    var LazyValue = {\n      nu: nu$3,\n      pure: pure\n    };\n\n    var errorReporter = function (err) {\n      domGlobals.setTimeout(function () {\n        throw err;\n      }, 0);\n    };\n    var make = function (run) {\n      var get = function (callback) {\n        run().then(callback, errorReporter);\n      };\n      var map = function (fab) {\n        return make(function () {\n          return run().then(fab);\n        });\n      };\n      var bind = function (aFutureB) {\n        return make(function () {\n          return run().then(function (v) {\n            return aFutureB(v).toPromise();\n          });\n        });\n      };\n      var anonBind = function (futureB) {\n        return make(function () {\n          return run().then(function () {\n            return futureB.toPromise();\n          });\n        });\n      };\n      var toLazy = function () {\n        return LazyValue.nu(get);\n      };\n      var toCached = function () {\n        var cache = null;\n        return make(function () {\n          if (cache === null) {\n            cache = run();\n          }\n          return cache;\n        });\n      };\n      var toPromise = run;\n      return {\n        map: map,\n        bind: bind,\n        anonBind: anonBind,\n        toLazy: toLazy,\n        toCached: toCached,\n        toPromise: toPromise,\n        get: get\n      };\n    };\n    var nu$4 = function (baseFn) {\n      return make(function () {\n        return new Promise(baseFn);\n      });\n    };\n    var pure$1 = function (a) {\n      return make(function () {\n        return Promise.resolve(a);\n      });\n    };\n    var Future = {\n      nu: nu$4,\n      pure: pure$1\n    };\n\n    var par = function (asyncValues, nu) {\n      return nu(function (callback) {\n        var r = [];\n        var count = 0;\n        var cb = function (i) {\n          return function (value) {\n            r[i] = value;\n            count++;\n            if (count >= asyncValues.length) {\n              callback(r);\n            }\n          };\n        };\n        if (asyncValues.length === 0) {\n          callback([]);\n        } else {\n          each(asyncValues, function (asyncValue, i) {\n            asyncValue.get(cb(i));\n          });\n        }\n      });\n    };\n\n    var par$1 = function (futures) {\n      return par(futures, Future.nu);\n    };\n\n    var value = function (o) {\n      var is = function (v) {\n        return o === v;\n      };\n      var or = function (opt) {\n        return value(o);\n      };\n      var orThunk = function (f) {\n        return value(o);\n      };\n      var map = function (f) {\n        return value(f(o));\n      };\n      var mapError = function (f) {\n        return value(o);\n      };\n      var each = function (f) {\n        f(o);\n      };\n      var bind = function (f) {\n        return f(o);\n      };\n      var fold = function (_, onValue) {\n        return onValue(o);\n      };\n      var exists = function (f) {\n        return f(o);\n      };\n      var forall = function (f) {\n        return f(o);\n      };\n      var toOption = function () {\n        return Option.some(o);\n      };\n      return {\n        is: is,\n        isValue: always,\n        isError: never,\n        getOr: constant(o),\n        getOrThunk: constant(o),\n        getOrDie: constant(o),\n        or: or,\n        orThunk: orThunk,\n        fold: fold,\n        map: map,\n        mapError: mapError,\n        each: each,\n        bind: bind,\n        exists: exists,\n        forall: forall,\n        toOption: toOption\n      };\n    };\n    var error = function (message) {\n      var getOrThunk = function (f) {\n        return f();\n      };\n      var getOrDie = function () {\n        return die(String(message))();\n      };\n      var or = function (opt) {\n        return opt;\n      };\n      var orThunk = function (f) {\n        return f();\n      };\n      var map = function (f) {\n        return error(message);\n      };\n      var mapError = function (f) {\n        return error(f(message));\n      };\n      var bind = function (f) {\n        return error(message);\n      };\n      var fold = function (onError, _) {\n        return onError(message);\n      };\n      return {\n        is: never,\n        isValue: never,\n        isError: always,\n        getOr: identity,\n        getOrThunk: getOrThunk,\n        getOrDie: getOrDie,\n        or: or,\n        orThunk: orThunk,\n        fold: fold,\n        map: map,\n        mapError: mapError,\n        each: noop,\n        bind: bind,\n        exists: never,\n        forall: always,\n        toOption: Option.none\n      };\n    };\n    var fromOption = function (opt, err) {\n      return opt.fold(function () {\n        return error(err);\n      }, value);\n    };\n    var Result = {\n      value: value,\n      error: error,\n      fromOption: fromOption\n    };\n\n    var promise = function () {\n      function bind(fn, thisArg) {\n        return function () {\n          fn.apply(thisArg, arguments);\n        };\n      }\n      var isArray = Array.isArray || function (value) {\n        return Object.prototype.toString.call(value) === '[object Array]';\n      };\n      var Promise = function (fn) {\n        if (typeof this !== 'object') {\n          throw new TypeError('Promises must be constructed via new');\n        }\n        if (typeof fn !== 'function') {\n          throw new TypeError('not a function');\n        }\n        this._state = null;\n        this._value = null;\n        this._deferreds = [];\n        doResolve(fn, bind(resolve, this), bind(reject, this));\n      };\n      var asap = Promise.immediateFn || typeof domGlobals.setImmediate === 'function' && domGlobals.setImmediate || function (fn) {\n        domGlobals.setTimeout(fn, 1);\n      };\n      function handle(deferred) {\n        var me = this;\n        if (this._state === null) {\n          this._deferreds.push(deferred);\n          return;\n        }\n        asap(function () {\n          var cb = me._state ? deferred.onFulfilled : deferred.onRejected;\n          if (cb === null) {\n            (me._state ? deferred.resolve : deferred.reject)(me._value);\n            return;\n          }\n          var ret;\n          try {\n            ret = cb(me._value);\n          } catch (e) {\n            deferred.reject(e);\n            return;\n          }\n          deferred.resolve(ret);\n        });\n      }\n      function resolve(newValue) {\n        try {\n          if (newValue === this) {\n            throw new TypeError('A promise cannot be resolved with itself.');\n          }\n          if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n            var then = newValue.then;\n            if (typeof then === 'function') {\n              doResolve(bind(then, newValue), bind(resolve, this), bind(reject, this));\n              return;\n            }\n          }\n          this._state = true;\n          this._value = newValue;\n          finale.call(this);\n        } catch (e) {\n          reject.call(this, e);\n        }\n      }\n      function reject(newValue) {\n        this._state = false;\n        this._value = newValue;\n        finale.call(this);\n      }\n      function finale() {\n        for (var i = 0, len = this._deferreds.length; i < len; i++) {\n          handle.call(this, this._deferreds[i]);\n        }\n        this._deferreds = null;\n      }\n      function Handler(onFulfilled, onRejected, resolve, reject) {\n        this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n        this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n        this.resolve = resolve;\n        this.reject = reject;\n      }\n      function doResolve(fn, onFulfilled, onRejected) {\n        var done = false;\n        try {\n          fn(function (value) {\n            if (done) {\n              return;\n            }\n            done = true;\n            onFulfilled(value);\n          }, function (reason) {\n            if (done) {\n              return;\n            }\n            done = true;\n            onRejected(reason);\n          });\n        } catch (ex) {\n          if (done) {\n            return;\n          }\n          done = true;\n          onRejected(ex);\n        }\n      }\n      Promise.prototype.catch = function (onRejected) {\n        return this.then(null, onRejected);\n      };\n      Promise.prototype.then = function (onFulfilled, onRejected) {\n        var me = this;\n        return new Promise(function (resolve, reject) {\n          handle.call(me, new Handler(onFulfilled, onRejected, resolve, reject));\n        });\n      };\n      Promise.all = function () {\n        var args = Array.prototype.slice.call(arguments.length === 1 && isArray(arguments[0]) ? arguments[0] : arguments);\n        return new Promise(function (resolve, reject) {\n          if (args.length === 0) {\n            return resolve([]);\n          }\n          var remaining = args.length;\n          function res(i, val) {\n            try {\n              if (val && (typeof val === 'object' || typeof val === 'function')) {\n                var then = val.then;\n                if (typeof then === 'function') {\n                  then.call(val, function (val) {\n                    res(i, val);\n                  }, reject);\n                  return;\n                }\n              }\n              args[i] = val;\n              if (--remaining === 0) {\n                resolve(args);\n              }\n            } catch (ex) {\n              reject(ex);\n            }\n          }\n          for (var i = 0; i < args.length; i++) {\n            res(i, args[i]);\n          }\n        });\n      };\n      Promise.resolve = function (value) {\n        if (value && typeof value === 'object' && value.constructor === Promise) {\n          return value;\n        }\n        return new Promise(function (resolve) {\n          resolve(value);\n        });\n      };\n      Promise.reject = function (value) {\n        return new Promise(function (resolve, reject) {\n          reject(value);\n        });\n      };\n      Promise.race = function (values) {\n        return new Promise(function (resolve, reject) {\n          for (var i = 0, len = values.length; i < len; i++) {\n            values[i].then(resolve, reject);\n          }\n        });\n      };\n      return Promise;\n    };\n    var promiseObj = window.Promise ? window.Promise : promise();\n\n    var requestAnimationFramePromise;\n    var requestAnimationFrame = function (callback, element) {\n      var i, requestAnimationFrameFunc = domGlobals.window.requestAnimationFrame;\n      var vendors = [\n        'ms',\n        'moz',\n        'webkit'\n      ];\n      var featurefill = function (callback) {\n        domGlobals.window.setTimeout(callback, 0);\n      };\n      for (i = 0; i < vendors.length && !requestAnimationFrameFunc; i++) {\n        requestAnimationFrameFunc = domGlobals.window[vendors[i] + 'RequestAnimationFrame'];\n      }\n      if (!requestAnimationFrameFunc) {\n        requestAnimationFrameFunc = featurefill;\n      }\n      requestAnimationFrameFunc(callback, element);\n    };\n    var wrappedSetTimeout = function (callback, time) {\n      if (typeof time !== 'number') {\n        time = 0;\n      }\n      return domGlobals.setTimeout(callback, time);\n    };\n    var wrappedSetInterval = function (callback, time) {\n      if (typeof time !== 'number') {\n        time = 1;\n      }\n      return domGlobals.setInterval(callback, time);\n    };\n    var wrappedClearTimeout = function (id) {\n      return domGlobals.clearTimeout(id);\n    };\n    var wrappedClearInterval = function (id) {\n      return domGlobals.clearInterval(id);\n    };\n    var debounce = function (callback, time) {\n      var timer, func;\n      func = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        domGlobals.clearTimeout(timer);\n        timer = wrappedSetTimeout(function () {\n          callback.apply(this, args);\n        }, time);\n      };\n      func.stop = function () {\n        domGlobals.clearTimeout(timer);\n      };\n      return func;\n    };\n    var Delay = {\n      requestAnimationFrame: function (callback, element) {\n        if (requestAnimationFramePromise) {\n          requestAnimationFramePromise.then(callback);\n          return;\n        }\n        requestAnimationFramePromise = new promiseObj(function (resolve) {\n          if (!element) {\n            element = domGlobals.document.body;\n          }\n          requestAnimationFrame(resolve, element);\n        }).then(callback);\n      },\n      setTimeout: wrappedSetTimeout,\n      setInterval: wrappedSetInterval,\n      setEditorTimeout: function (editor, callback, time) {\n        return wrappedSetTimeout(function () {\n          if (!editor.removed) {\n            callback();\n          }\n        }, time);\n      },\n      setEditorInterval: function (editor, callback, time) {\n        var timer;\n        timer = wrappedSetInterval(function () {\n          if (!editor.removed) {\n            callback();\n          } else {\n            domGlobals.clearInterval(timer);\n          }\n        }, time);\n        return timer;\n      },\n      debounce: debounce,\n      throttle: debounce,\n      clearInterval: wrappedClearInterval,\n      clearTimeout: wrappedClearTimeout\n    };\n\n    var userAgent = domGlobals.navigator.userAgent;\n    var platform$1 = detect$3();\n    var browser$2 = platform$1.browser;\n    var os = platform$1.os;\n    var deviceType = platform$1.deviceType;\n    var webkit = /WebKit/.test(userAgent) && !browser$2.isEdge();\n    var fileApi = 'FormData' in domGlobals.window && 'FileReader' in domGlobals.window && 'URL' in domGlobals.window && !!domGlobals.URL.createObjectURL;\n    var windowsPhone = userAgent.indexOf('Windows Phone') !== -1;\n    var Env = {\n      opera: browser$2.isOpera(),\n      webkit: webkit,\n      ie: browser$2.isIE() || browser$2.isEdge() ? browser$2.version.major : false,\n      gecko: browser$2.isFirefox(),\n      mac: os.isOSX() || os.isiOS(),\n      iOS: deviceType.isiPad() || deviceType.isiPhone(),\n      android: os.isAndroid(),\n      contentEditable: true,\n      transparentSrc: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n      caretAfter: true,\n      range: domGlobals.window.getSelection && 'Range' in domGlobals.window,\n      documentMode: browser$2.isIE() ? domGlobals.document.documentMode || 7 : 10,\n      fileApi: fileApi,\n      ceFalse: true,\n      cacheSuffix: null,\n      container: null,\n      experimentalShadowDom: false,\n      canHaveCSP: !browser$2.isIE(),\n      desktop: deviceType.isDesktop(),\n      windowsPhone: windowsPhone,\n      browser: {\n        current: browser$2.current,\n        version: browser$2.version,\n        isChrome: browser$2.isChrome,\n        isEdge: browser$2.isEdge,\n        isFirefox: browser$2.isFirefox,\n        isIE: browser$2.isIE,\n        isOpera: browser$2.isOpera,\n        isSafari: browser$2.isSafari\n      },\n      os: {\n        current: os.current,\n        version: os.version,\n        isAndroid: os.isAndroid,\n        isChromeOS: os.isChromeOS,\n        isFreeBSD: os.isFreeBSD,\n        isiOS: os.isiOS,\n        isLinux: os.isLinux,\n        isOSX: os.isOSX,\n        isSolaris: os.isSolaris,\n        isWindows: os.isWindows\n      },\n      deviceType: {\n        isDesktop: deviceType.isDesktop,\n        isiPad: deviceType.isiPad,\n        isiPhone: deviceType.isiPhone,\n        isPhone: deviceType.isPhone,\n        isTablet: deviceType.isTablet,\n        isTouch: deviceType.isTouch,\n        isWebView: deviceType.isWebView\n      }\n    };\n\n    var isArray$1 = Array.isArray;\n    var toArray$1 = function (obj) {\n      var array = obj, i, l;\n      if (!isArray$1(obj)) {\n        array = [];\n        for (i = 0, l = obj.length; i < l; i++) {\n          array[i] = obj[i];\n        }\n      }\n      return array;\n    };\n    var each$2 = function (o, cb, s) {\n      var n, l;\n      if (!o) {\n        return 0;\n      }\n      s = s || o;\n      if (o.length !== undefined) {\n        for (n = 0, l = o.length; n < l; n++) {\n          if (cb.call(s, o[n], n, o) === false) {\n            return 0;\n          }\n        }\n      } else {\n        for (n in o) {\n          if (o.hasOwnProperty(n)) {\n            if (cb.call(s, o[n], n, o) === false) {\n              return 0;\n            }\n          }\n        }\n      }\n      return 1;\n    };\n    var map$2 = function (array, callback) {\n      var out = [];\n      each$2(array, function (item, index) {\n        out.push(callback(item, index, array));\n      });\n      return out;\n    };\n    var filter$2 = function (a, f) {\n      var o = [];\n      each$2(a, function (v, index) {\n        if (!f || f(v, index, a)) {\n          o.push(v);\n        }\n      });\n      return o;\n    };\n    var indexOf$1 = function (a, v) {\n      var i, l;\n      if (a) {\n        for (i = 0, l = a.length; i < l; i++) {\n          if (a[i] === v) {\n            return i;\n          }\n        }\n      }\n      return -1;\n    };\n    var reduce = function (collection, iteratee, accumulator, thisArg) {\n      var i = 0;\n      if (arguments.length < 3) {\n        accumulator = collection[0];\n      }\n      for (; i < collection.length; i++) {\n        accumulator = iteratee.call(thisArg, accumulator, collection[i], i);\n      }\n      return accumulator;\n    };\n    var findIndex$1 = function (array, predicate, thisArg) {\n      var i, l;\n      for (i = 0, l = array.length; i < l; i++) {\n        if (predicate.call(thisArg, array[i], i, array)) {\n          return i;\n        }\n      }\n      return -1;\n    };\n    var find$2 = function (array, predicate, thisArg) {\n      var idx = findIndex$1(array, predicate, thisArg);\n      if (idx !== -1) {\n        return array[idx];\n      }\n      return undefined;\n    };\n    var last$1 = function (collection) {\n      return collection[collection.length - 1];\n    };\n    var ArrUtils = {\n      isArray: isArray$1,\n      toArray: toArray$1,\n      each: each$2,\n      map: map$2,\n      filter: filter$2,\n      indexOf: indexOf$1,\n      reduce: reduce,\n      findIndex: findIndex$1,\n      find: find$2,\n      last: last$1\n    };\n\n    var whiteSpaceRegExp = /^\\s*|\\s*$/g;\n    var trim$1 = function (str) {\n      return str === null || str === undefined ? '' : ('' + str).replace(whiteSpaceRegExp, '');\n    };\n    var is$1 = function (obj, type) {\n      if (!type) {\n        return obj !== undefined;\n      }\n      if (type === 'array' && ArrUtils.isArray(obj)) {\n        return true;\n      }\n      return typeof obj === type;\n    };\n    var makeMap = function (items, delim, map) {\n      var i;\n      items = items || [];\n      delim = delim || ',';\n      if (typeof items === 'string') {\n        items = items.split(delim);\n      }\n      map = map || {};\n      i = items.length;\n      while (i--) {\n        map[items[i]] = {};\n      }\n      return map;\n    };\n    var hasOwnProperty$1 = function (obj, prop) {\n      return Object.prototype.hasOwnProperty.call(obj, prop);\n    };\n    var create = function (s, p, root) {\n      var self = this;\n      var sp, ns, cn, scn, c, de = 0;\n      s = /^((static) )?([\\w.]+)(:([\\w.]+))?/.exec(s);\n      cn = s[3].match(/(^|\\.)(\\w+)$/i)[2];\n      ns = self.createNS(s[3].replace(/\\.\\w+$/, ''), root);\n      if (ns[cn]) {\n        return;\n      }\n      if (s[2] === 'static') {\n        ns[cn] = p;\n        if (this.onCreate) {\n          this.onCreate(s[2], s[3], ns[cn]);\n        }\n        return;\n      }\n      if (!p[cn]) {\n        p[cn] = function () {\n        };\n        de = 1;\n      }\n      ns[cn] = p[cn];\n      self.extend(ns[cn].prototype, p);\n      if (s[5]) {\n        sp = self.resolve(s[5]).prototype;\n        scn = s[5].match(/\\.(\\w+)$/i)[1];\n        c = ns[cn];\n        if (de) {\n          ns[cn] = function () {\n            return sp[scn].apply(this, arguments);\n          };\n        } else {\n          ns[cn] = function () {\n            this.parent = sp[scn];\n            return c.apply(this, arguments);\n          };\n        }\n        ns[cn].prototype[cn] = ns[cn];\n        self.each(sp, function (f, n) {\n          ns[cn].prototype[n] = sp[n];\n        });\n        self.each(p, function (f, n) {\n          if (sp[n]) {\n            ns[cn].prototype[n] = function () {\n              this.parent = sp[n];\n              return f.apply(this, arguments);\n            };\n          } else {\n            if (n !== cn) {\n              ns[cn].prototype[n] = f;\n            }\n          }\n        });\n      }\n      self.each(p.static, function (f, n) {\n        ns[cn][n] = f;\n      });\n    };\n    var extend = function (obj, ext) {\n      var x = [];\n      for (var _i = 2; _i < arguments.length; _i++) {\n        x[_i - 2] = arguments[_i];\n      }\n      var i, l, name;\n      var args = arguments;\n      var value;\n      for (i = 1, l = args.length; i < l; i++) {\n        ext = args[i];\n        for (name in ext) {\n          if (ext.hasOwnProperty(name)) {\n            value = ext[name];\n            if (value !== undefined) {\n              obj[name] = value;\n            }\n          }\n        }\n      }\n      return obj;\n    };\n    var walk = function (o, f, n, s) {\n      s = s || this;\n      if (o) {\n        if (n) {\n          o = o[n];\n        }\n        ArrUtils.each(o, function (o, i) {\n          if (f.call(s, o, i, n) === false) {\n            return false;\n          }\n          walk(o, f, n, s);\n        });\n      }\n    };\n    var createNS = function (n, o) {\n      var i, v;\n      o = o || domGlobals.window;\n      n = n.split('.');\n      for (i = 0; i < n.length; i++) {\n        v = n[i];\n        if (!o[v]) {\n          o[v] = {};\n        }\n        o = o[v];\n      }\n      return o;\n    };\n    var resolve = function (n, o) {\n      var i, l;\n      o = o || domGlobals.window;\n      n = n.split('.');\n      for (i = 0, l = n.length; i < l; i++) {\n        o = o[n[i]];\n        if (!o) {\n          break;\n        }\n      }\n      return o;\n    };\n    var explode = function (s, d) {\n      if (!s || is$1(s, 'array')) {\n        return s;\n      }\n      return ArrUtils.map(s.split(d || ','), trim$1);\n    };\n    var _addCacheSuffix = function (url) {\n      var cacheSuffix = Env.cacheSuffix;\n      if (cacheSuffix) {\n        url += (url.indexOf('?') === -1 ? '?' : '&') + cacheSuffix;\n      }\n      return url;\n    };\n    var Tools = {\n      trim: trim$1,\n      isArray: ArrUtils.isArray,\n      is: is$1,\n      toArray: ArrUtils.toArray,\n      makeMap: makeMap,\n      each: ArrUtils.each,\n      map: ArrUtils.map,\n      grep: ArrUtils.filter,\n      inArray: ArrUtils.indexOf,\n      hasOwn: hasOwnProperty$1,\n      extend: extend,\n      create: create,\n      walk: walk,\n      createNS: createNS,\n      resolve: resolve,\n      explode: explode,\n      _addCacheSuffix: _addCacheSuffix\n    };\n\n    function StyleSheetLoader(document, settings) {\n      if (settings === void 0) {\n        settings = {};\n      }\n      var idCount = 0;\n      var loadedStates = {};\n      var maxLoadTime;\n      maxLoadTime = settings.maxLoadTime || 5000;\n      var _setReferrerPolicy = function (referrerPolicy) {\n        settings.referrerPolicy = referrerPolicy;\n      };\n      var appendToHead = function (node) {\n        document.getElementsByTagName('head')[0].appendChild(node);\n      };\n      var load = function (url, loadedCallback, errorCallback) {\n        var link, style, startTime, state;\n        var resolve = function (status) {\n          state.status = status;\n          state.passed = [];\n          state.failed = [];\n          if (link) {\n            link.onload = null;\n            link.onerror = null;\n            link = null;\n          }\n        };\n        var passed = function () {\n          var callbacks = state.passed;\n          var i = callbacks.length;\n          while (i--) {\n            callbacks[i]();\n          }\n          resolve(2);\n        };\n        var failed = function () {\n          var callbacks = state.failed;\n          var i = callbacks.length;\n          while (i--) {\n            callbacks[i]();\n          }\n          resolve(3);\n        };\n        var isOldWebKit = function () {\n          var webKitChunks = domGlobals.navigator.userAgent.match(/WebKit\\/(\\d*)/);\n          return !!(webKitChunks && parseInt(webKitChunks[1], 10) < 536);\n        };\n        var wait = function (testCallback, waitCallback) {\n          if (!testCallback()) {\n            if (new Date().getTime() - startTime < maxLoadTime) {\n              Delay.setTimeout(waitCallback);\n            } else {\n              failed();\n            }\n          }\n        };\n        var waitForWebKitLinkLoaded = function () {\n          wait(function () {\n            var styleSheets = document.styleSheets;\n            var styleSheet, i = styleSheets.length, owner;\n            while (i--) {\n              styleSheet = styleSheets[i];\n              owner = styleSheet.ownerNode ? styleSheet.ownerNode : styleSheet.owningElement;\n              if (owner && owner.id === link.id) {\n                passed();\n                return true;\n              }\n            }\n          }, waitForWebKitLinkLoaded);\n        };\n        var waitForGeckoLinkLoaded = function () {\n          wait(function () {\n            try {\n              var cssRules = style.sheet.cssRules;\n              passed();\n              return !!cssRules;\n            } catch (ex) {\n            }\n          }, waitForGeckoLinkLoaded);\n        };\n        url = Tools._addCacheSuffix(url);\n        if (!loadedStates[url]) {\n          state = {\n            passed: [],\n            failed: []\n          };\n          loadedStates[url] = state;\n        } else {\n          state = loadedStates[url];\n        }\n        if (loadedCallback) {\n          state.passed.push(loadedCallback);\n        }\n        if (errorCallback) {\n          state.failed.push(errorCallback);\n        }\n        if (state.status === 1) {\n          return;\n        }\n        if (state.status === 2) {\n          passed();\n          return;\n        }\n        if (state.status === 3) {\n          failed();\n          return;\n        }\n        state.status = 1;\n        link = document.createElement('link');\n        link.rel = 'stylesheet';\n        link.type = 'text/css';\n        link.id = 'u' + idCount++;\n        link.async = false;\n        link.defer = false;\n        startTime = new Date().getTime();\n        if (settings.contentCssCors) {\n          link.crossOrigin = 'anonymous';\n        }\n        if (settings.referrerPolicy) {\n          set(Element.fromDom(link), 'referrerpolicy', settings.referrerPolicy);\n        }\n        if ('onload' in link && !isOldWebKit()) {\n          link.onload = waitForWebKitLinkLoaded;\n          link.onerror = failed;\n        } else {\n          if (domGlobals.navigator.userAgent.indexOf('Firefox') > 0) {\n            style = document.createElement('style');\n            style.textContent = '@import \"' + url + '\"';\n            waitForGeckoLinkLoaded();\n            appendToHead(style);\n            return;\n          }\n          waitForWebKitLinkLoaded();\n        }\n        appendToHead(link);\n        link.href = url;\n      };\n      var loadF = function (url) {\n        return Future.nu(function (resolve) {\n          load(url, compose(resolve, constant(Result.value(url))), compose(resolve, constant(Result.error(url))));\n        });\n      };\n      var unbox = function (result) {\n        return result.fold(identity, identity);\n      };\n      var loadAll = function (urls, success, failure) {\n        par$1(map(urls, loadF)).get(function (result) {\n          var parts = partition(result, function (r) {\n            return r.isValue();\n          });\n          if (parts.fail.length > 0) {\n            failure(parts.fail.map(unbox));\n          } else {\n            success(parts.pass.map(unbox));\n          }\n        });\n      };\n      return {\n        load: load,\n        loadAll: loadAll,\n        _setReferrerPolicy: _setReferrerPolicy\n      };\n    }\n\n    var blocks = [\n      'article',\n      'aside',\n      'details',\n      'div',\n      'dt',\n      'figcaption',\n      'footer',\n      'form',\n      'fieldset',\n      'header',\n      'hgroup',\n      'html',\n      'main',\n      'nav',\n      'section',\n      'summary',\n      'body',\n      'p',\n      'dl',\n      'multicol',\n      'dd',\n      'figure',\n      'address',\n      'center',\n      'blockquote',\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'listing',\n      'xmp',\n      'pre',\n      'plaintext',\n      'menu',\n      'dir',\n      'ul',\n      'ol',\n      'li',\n      'hr',\n      'table',\n      'tbody',\n      'thead',\n      'tfoot',\n      'th',\n      'tr',\n      'td',\n      'caption'\n    ];\n    var voids = [\n      'area',\n      'base',\n      'basefont',\n      'br',\n      'col',\n      'frame',\n      'hr',\n      'img',\n      'input',\n      'isindex',\n      'link',\n      'meta',\n      'param',\n      'embed',\n      'source',\n      'wbr',\n      'track'\n    ];\n    var tableCells = [\n      'td',\n      'th'\n    ];\n    var tableSections = [\n      'thead',\n      'tbody',\n      'tfoot'\n    ];\n    var textBlocks = [\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'p',\n      'div',\n      'address',\n      'pre',\n      'form',\n      'blockquote',\n      'center',\n      'dir',\n      'fieldset',\n      'header',\n      'footer',\n      'article',\n      'section',\n      'hgroup',\n      'aside',\n      'nav',\n      'figure'\n    ];\n    var headings = [\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6'\n    ];\n    var listItems = [\n      'li',\n      'dd',\n      'dt'\n    ];\n    var lists = [\n      'ul',\n      'ol',\n      'dl'\n    ];\n    var wsElements = [\n      'pre',\n      'script',\n      'textarea',\n      'style'\n    ];\n    var lazyLookup = function (items) {\n      var lookup;\n      return function (node) {\n        lookup = lookup ? lookup : mapToObject(items, constant(true));\n        return lookup.hasOwnProperty(name(node));\n      };\n    };\n    var isHeading = lazyLookup(headings);\n    var isBlock = lazyLookup(blocks);\n    var isTable$1 = function (node) {\n      return name(node) === 'table';\n    };\n    var isInline = function (node) {\n      return isElement(node) && !isBlock(node);\n    };\n    var isBr$1 = function (node) {\n      return isElement(node) && name(node) === 'br';\n    };\n    var isTextBlock = lazyLookup(textBlocks);\n    var isList = lazyLookup(lists);\n    var isListItem = lazyLookup(listItems);\n    var isVoid = lazyLookup(voids);\n    var isTableSection = lazyLookup(tableSections);\n    var isTableCell = lazyLookup(tableCells);\n    var isWsPreserveElement = lazyLookup(wsElements);\n\n    var surroundedBySpans = function (node) {\n      var previousIsSpan = node.previousSibling && node.previousSibling.nodeName === 'SPAN';\n      var nextIsSpan = node.nextSibling && node.nextSibling.nodeName === 'SPAN';\n      return previousIsSpan && nextIsSpan;\n    };\n    var isBookmarkNode = function (node) {\n      return node && node.tagName === 'SPAN' && node.getAttribute('data-mce-type') === 'bookmark';\n    };\n    var trimNode = function (dom, node) {\n      var i, children = node.childNodes;\n      if (NodeType.isElement(node) && isBookmarkNode(node)) {\n        return;\n      }\n      for (i = children.length - 1; i >= 0; i--) {\n        trimNode(dom, children[i]);\n      }\n      if (NodeType.isDocument(node) === false) {\n        if (NodeType.isText(node) && node.nodeValue.length > 0) {\n          var trimmedLength = Tools.trim(node.nodeValue).length;\n          if (dom.isBlock(node.parentNode) || trimmedLength > 0) {\n            return;\n          }\n          if (trimmedLength === 0 && surroundedBySpans(node)) {\n            return;\n          }\n        } else if (NodeType.isElement(node)) {\n          children = node.childNodes;\n          if (children.length === 1 && isBookmarkNode(children[0])) {\n            node.parentNode.insertBefore(children[0], node);\n          }\n          if (children.length || isVoid(Element.fromDom(node))) {\n            return;\n          }\n        }\n        dom.remove(node);\n      }\n      return node;\n    };\n    var TrimNode = { trimNode: trimNode };\n\n    var makeMap$1 = Tools.makeMap;\n    var namedEntities, baseEntities, reverseEntities;\n    var attrsCharsRegExp = /[&<>\\\"\\u0060\\u007E-\\uD7FF\\uE000-\\uFFEF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n    var textCharsRegExp = /[<>&\\u007E-\\uD7FF\\uE000-\\uFFEF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n    var rawCharsRegExp = /[<>&\\\"\\']/g;\n    var entityRegExp = /&#([a-z0-9]+);?|&([a-z0-9]+);/gi;\n    var asciiMap = {\n      128: '\\u20AC',\n      130: '\\u201A',\n      131: '\\u0192',\n      132: '\\u201E',\n      133: '\\u2026',\n      134: '\\u2020',\n      135: '\\u2021',\n      136: '\\u02c6',\n      137: '\\u2030',\n      138: '\\u0160',\n      139: '\\u2039',\n      140: '\\u0152',\n      142: '\\u017d',\n      145: '\\u2018',\n      146: '\\u2019',\n      147: '\\u201C',\n      148: '\\u201D',\n      149: '\\u2022',\n      150: '\\u2013',\n      151: '\\u2014',\n      152: '\\u02DC',\n      153: '\\u2122',\n      154: '\\u0161',\n      155: '\\u203A',\n      156: '\\u0153',\n      158: '\\u017e',\n      159: '\\u0178'\n    };\n    baseEntities = {\n      '\"': '&quot;',\n      '\\'': '&#39;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '&': '&amp;',\n      '`': '&#96;'\n    };\n    reverseEntities = {\n      '&lt;': '<',\n      '&gt;': '>',\n      '&amp;': '&',\n      '&quot;': '\"',\n      '&apos;': '\\''\n    };\n    var nativeDecode = function (text) {\n      var elm;\n      elm = Element.fromTag('div').dom();\n      elm.innerHTML = text;\n      return elm.textContent || elm.innerText || text;\n    };\n    var buildEntitiesLookup = function (items, radix) {\n      var i, chr, entity;\n      var lookup = {};\n      if (items) {\n        items = items.split(',');\n        radix = radix || 10;\n        for (i = 0; i < items.length; i += 2) {\n          chr = String.fromCharCode(parseInt(items[i], radix));\n          if (!baseEntities[chr]) {\n            entity = '&' + items[i + 1] + ';';\n            lookup[chr] = entity;\n            lookup[entity] = chr;\n          }\n        }\n        return lookup;\n      }\n    };\n    namedEntities = buildEntitiesLookup('50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', 32);\n    var encodeRaw = function (text, attr) {\n      return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {\n        return baseEntities[chr] || chr;\n      });\n    };\n    var encodeAllRaw = function (text) {\n      return ('' + text).replace(rawCharsRegExp, function (chr) {\n        return baseEntities[chr] || chr;\n      });\n    };\n    var encodeNumeric = function (text, attr) {\n      return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {\n        if (chr.length > 1) {\n          return '&#' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';\n        }\n        return baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';';\n      });\n    };\n    var encodeNamed = function (text, attr, entities) {\n      entities = entities || namedEntities;\n      return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {\n        return baseEntities[chr] || entities[chr] || chr;\n      });\n    };\n    var getEncodeFunc = function (name, entities) {\n      var entitiesMap = buildEntitiesLookup(entities) || namedEntities;\n      var encodeNamedAndNumeric = function (text, attr) {\n        return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {\n          if (baseEntities[chr] !== undefined) {\n            return baseEntities[chr];\n          }\n          if (entitiesMap[chr] !== undefined) {\n            return entitiesMap[chr];\n          }\n          if (chr.length > 1) {\n            return '&#' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';\n          }\n          return '&#' + chr.charCodeAt(0) + ';';\n        });\n      };\n      var encodeCustomNamed = function (text, attr) {\n        return encodeNamed(text, attr, entitiesMap);\n      };\n      var nameMap = makeMap$1(name.replace(/\\+/g, ','));\n      if (nameMap.named && nameMap.numeric) {\n        return encodeNamedAndNumeric;\n      }\n      if (nameMap.named) {\n        if (entities) {\n          return encodeCustomNamed;\n        }\n        return encodeNamed;\n      }\n      if (nameMap.numeric) {\n        return encodeNumeric;\n      }\n      return encodeRaw;\n    };\n    var decode = function (text) {\n      return text.replace(entityRegExp, function (all, numeric) {\n        if (numeric) {\n          if (numeric.charAt(0).toLowerCase() === 'x') {\n            numeric = parseInt(numeric.substr(1), 16);\n          } else {\n            numeric = parseInt(numeric, 10);\n          }\n          if (numeric > 65535) {\n            numeric -= 65536;\n            return String.fromCharCode(55296 + (numeric >> 10), 56320 + (numeric & 1023));\n          }\n          return asciiMap[numeric] || String.fromCharCode(numeric);\n        }\n        return reverseEntities[all] || namedEntities[all] || nativeDecode(all);\n      });\n    };\n    var Entities = {\n      encodeRaw: encodeRaw,\n      encodeAllRaw: encodeAllRaw,\n      encodeNumeric: encodeNumeric,\n      encodeNamed: encodeNamed,\n      getEncodeFunc: getEncodeFunc,\n      decode: decode\n    };\n\n    var mapCache = {}, dummyObj = {};\n    var makeMap$2 = Tools.makeMap, each$3 = Tools.each, extend$1 = Tools.extend, explode$1 = Tools.explode, inArray = Tools.inArray;\n    var split = function (items, delim) {\n      items = Tools.trim(items);\n      return items ? items.split(delim || ' ') : [];\n    };\n    var compileSchema = function (type) {\n      var schema = {};\n      var globalAttributes, blockContent;\n      var phrasingContent, flowContent, html4BlockContent, html4PhrasingContent;\n      var add = function (name, attributes, children) {\n        var ni, attributesOrder, element;\n        var arrayToMap = function (array, obj) {\n          var map = {};\n          var i, l;\n          for (i = 0, l = array.length; i < l; i++) {\n            map[array[i]] = obj || {};\n          }\n          return map;\n        };\n        children = children || [];\n        attributes = attributes || '';\n        if (typeof children === 'string') {\n          children = split(children);\n        }\n        name = split(name);\n        ni = name.length;\n        while (ni--) {\n          attributesOrder = split([\n            globalAttributes,\n            attributes\n          ].join(' '));\n          element = {\n            attributes: arrayToMap(attributesOrder),\n            attributesOrder: attributesOrder,\n            children: arrayToMap(children, dummyObj)\n          };\n          schema[name[ni]] = element;\n        }\n      };\n      var addAttrs = function (name, attributes) {\n        var ni, schemaItem, i, l;\n        name = split(name);\n        ni = name.length;\n        attributes = split(attributes);\n        while (ni--) {\n          schemaItem = schema[name[ni]];\n          for (i = 0, l = attributes.length; i < l; i++) {\n            schemaItem.attributes[attributes[i]] = {};\n            schemaItem.attributesOrder.push(attributes[i]);\n          }\n        }\n      };\n      if (mapCache[type]) {\n        return mapCache[type];\n      }\n      globalAttributes = 'id accesskey class dir lang style tabindex title role';\n      blockContent = 'address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul';\n      phrasingContent = 'a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd ' + 'label map noscript object q s samp script select small span strong sub sup ' + 'textarea u var #text #comment';\n      if (type !== 'html4') {\n        globalAttributes += ' contenteditable contextmenu draggable dropzone ' + 'hidden spellcheck translate';\n        blockContent += ' article aside details dialog figure main header footer hgroup section nav';\n        phrasingContent += ' audio canvas command datalist mark meter output picture ' + 'progress time wbr video ruby bdi keygen';\n      }\n      if (type !== 'html5-strict') {\n        globalAttributes += ' xml:lang';\n        html4PhrasingContent = 'acronym applet basefont big font strike tt';\n        phrasingContent = [\n          phrasingContent,\n          html4PhrasingContent\n        ].join(' ');\n        each$3(split(html4PhrasingContent), function (name) {\n          add(name, '', phrasingContent);\n        });\n        html4BlockContent = 'center dir isindex noframes';\n        blockContent = [\n          blockContent,\n          html4BlockContent\n        ].join(' ');\n        flowContent = [\n          blockContent,\n          phrasingContent\n        ].join(' ');\n        each$3(split(html4BlockContent), function (name) {\n          add(name, '', flowContent);\n        });\n      }\n      flowContent = flowContent || [\n        blockContent,\n        phrasingContent\n      ].join(' ');\n      add('html', 'manifest', 'head body');\n      add('head', '', 'base command link meta noscript script style title');\n      add('title hr noscript br');\n      add('base', 'href target');\n      add('link', 'href rel media hreflang type sizes hreflang');\n      add('meta', 'name http-equiv content charset');\n      add('style', 'media type scoped');\n      add('script', 'src async defer type charset');\n      add('body', 'onafterprint onbeforeprint onbeforeunload onblur onerror onfocus ' + 'onhashchange onload onmessage onoffline ononline onpagehide onpageshow ' + 'onpopstate onresize onscroll onstorage onunload', flowContent);\n      add('address dt dd div caption', '', flowContent);\n      add('h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn', '', phrasingContent);\n      add('blockquote', 'cite', flowContent);\n      add('ol', 'reversed start type', 'li');\n      add('ul', '', 'li');\n      add('li', 'value', flowContent);\n      add('dl', '', 'dt dd');\n      add('a', 'href target rel media hreflang type', phrasingContent);\n      add('q', 'cite', phrasingContent);\n      add('ins del', 'cite datetime', flowContent);\n      add('img', 'src sizes srcset alt usemap ismap width height');\n      add('iframe', 'src name width height', flowContent);\n      add('embed', 'src type width height');\n      add('object', 'data type typemustmatch name usemap form width height', [\n        flowContent,\n        'param'\n      ].join(' '));\n      add('param', 'name value');\n      add('map', 'name', [\n        flowContent,\n        'area'\n      ].join(' '));\n      add('area', 'alt coords shape href target rel media hreflang type');\n      add('table', 'border', 'caption colgroup thead tfoot tbody tr' + (type === 'html4' ? ' col' : ''));\n      add('colgroup', 'span', 'col');\n      add('col', 'span');\n      add('tbody thead tfoot', '', 'tr');\n      add('tr', '', 'td th');\n      add('td', 'colspan rowspan headers', flowContent);\n      add('th', 'colspan rowspan headers scope abbr', flowContent);\n      add('form', 'accept-charset action autocomplete enctype method name novalidate target', flowContent);\n      add('fieldset', 'disabled form name', [\n        flowContent,\n        'legend'\n      ].join(' '));\n      add('label', 'form for', phrasingContent);\n      add('input', 'accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate ' + 'formtarget height list max maxlength min multiple name pattern readonly required size src step type value width');\n      add('button', 'disabled form formaction formenctype formmethod formnovalidate formtarget name type value', type === 'html4' ? flowContent : phrasingContent);\n      add('select', 'disabled form multiple name required size', 'option optgroup');\n      add('optgroup', 'disabled label', 'option');\n      add('option', 'disabled label selected value');\n      add('textarea', 'cols dirname disabled form maxlength name readonly required rows wrap');\n      add('menu', 'type label', [\n        flowContent,\n        'li'\n      ].join(' '));\n      add('noscript', '', flowContent);\n      if (type !== 'html4') {\n        add('wbr');\n        add('ruby', '', [\n          phrasingContent,\n          'rt rp'\n        ].join(' '));\n        add('figcaption', '', flowContent);\n        add('mark rt rp summary bdi', '', phrasingContent);\n        add('canvas', 'width height', flowContent);\n        add('video', 'src crossorigin poster preload autoplay mediagroup loop ' + 'muted controls width height buffered', [\n          flowContent,\n          'track source'\n        ].join(' '));\n        add('audio', 'src crossorigin preload autoplay mediagroup loop muted controls ' + 'buffered volume', [\n          flowContent,\n          'track source'\n        ].join(' '));\n        add('picture', '', 'img source');\n        add('source', 'src srcset type media sizes');\n        add('track', 'kind src srclang label default');\n        add('datalist', '', [\n          phrasingContent,\n          'option'\n        ].join(' '));\n        add('article section nav aside main header footer', '', flowContent);\n        add('hgroup', '', 'h1 h2 h3 h4 h5 h6');\n        add('figure', '', [\n          flowContent,\n          'figcaption'\n        ].join(' '));\n        add('time', 'datetime', phrasingContent);\n        add('dialog', 'open', flowContent);\n        add('command', 'type label icon disabled checked radiogroup command');\n        add('output', 'for form name', phrasingContent);\n        add('progress', 'value max', phrasingContent);\n        add('meter', 'value min max low high optimum', phrasingContent);\n        add('details', 'open', [\n          flowContent,\n          'summary'\n        ].join(' '));\n        add('keygen', 'autofocus challenge disabled form keytype name');\n      }\n      if (type !== 'html5-strict') {\n        addAttrs('script', 'language xml:space');\n        addAttrs('style', 'xml:space');\n        addAttrs('object', 'declare classid code codebase codetype archive standby align border hspace vspace');\n        addAttrs('embed', 'align name hspace vspace');\n        addAttrs('param', 'valuetype type');\n        addAttrs('a', 'charset name rev shape coords');\n        addAttrs('br', 'clear');\n        addAttrs('applet', 'codebase archive code object alt name width height align hspace vspace');\n        addAttrs('img', 'name longdesc align border hspace vspace');\n        addAttrs('iframe', 'longdesc frameborder marginwidth marginheight scrolling align');\n        addAttrs('font basefont', 'size color face');\n        addAttrs('input', 'usemap align');\n        addAttrs('select');\n        addAttrs('textarea');\n        addAttrs('h1 h2 h3 h4 h5 h6 div p legend caption', 'align');\n        addAttrs('ul', 'type compact');\n        addAttrs('li', 'type');\n        addAttrs('ol dl menu dir', 'compact');\n        addAttrs('pre', 'width xml:space');\n        addAttrs('hr', 'align noshade size width');\n        addAttrs('isindex', 'prompt');\n        addAttrs('table', 'summary width frame rules cellspacing cellpadding align bgcolor');\n        addAttrs('col', 'width align char charoff valign');\n        addAttrs('colgroup', 'width align char charoff valign');\n        addAttrs('thead', 'align char charoff valign');\n        addAttrs('tr', 'align char charoff valign bgcolor');\n        addAttrs('th', 'axis align char charoff valign nowrap bgcolor width height');\n        addAttrs('form', 'accept');\n        addAttrs('td', 'abbr axis scope align char charoff valign nowrap bgcolor width height');\n        addAttrs('tfoot', 'align char charoff valign');\n        addAttrs('tbody', 'align char charoff valign');\n        addAttrs('area', 'nohref');\n        addAttrs('body', 'background bgcolor text link vlink alink');\n      }\n      if (type !== 'html4') {\n        addAttrs('input button select textarea', 'autofocus');\n        addAttrs('input textarea', 'placeholder');\n        addAttrs('a', 'download');\n        addAttrs('link script img', 'crossorigin');\n        addAttrs('img', 'loading');\n        addAttrs('iframe', 'sandbox seamless allowfullscreen loading');\n      }\n      each$3(split('a form meter progress dfn'), function (name) {\n        if (schema[name]) {\n          delete schema[name].children[name];\n        }\n      });\n      delete schema.caption.children.table;\n      delete schema.script;\n      mapCache[type] = schema;\n      return schema;\n    };\n    var compileElementMap = function (value, mode) {\n      var styles;\n      if (value) {\n        styles = {};\n        if (typeof value === 'string') {\n          value = { '*': value };\n        }\n        each$3(value, function (value, key) {\n          styles[key] = styles[key.toUpperCase()] = mode === 'map' ? makeMap$2(value, /[, ]/) : explode$1(value, /[, ]/);\n        });\n      }\n      return styles;\n    };\n    function Schema(settings) {\n      var elements = {};\n      var children = {};\n      var patternElements = [];\n      var validStyles;\n      var invalidStyles;\n      var schemaItems;\n      var whiteSpaceElementsMap, selfClosingElementsMap, shortEndedElementsMap, boolAttrMap, validClasses;\n      var blockElementsMap, nonEmptyElementsMap, moveCaretBeforeOnEnterElementsMap, textBlockElementsMap, textInlineElementsMap;\n      var customElementsMap = {}, specialElements = {};\n      var createLookupTable = function (option, defaultValue, extendWith) {\n        var value = settings[option];\n        if (!value) {\n          value = mapCache[option];\n          if (!value) {\n            value = makeMap$2(defaultValue, ' ', makeMap$2(defaultValue.toUpperCase(), ' '));\n            value = extend$1(value, extendWith);\n            mapCache[option] = value;\n          }\n        } else {\n          value = makeMap$2(value, /[, ]/, makeMap$2(value.toUpperCase(), /[, ]/));\n        }\n        return value;\n      };\n      settings = settings || {};\n      schemaItems = compileSchema(settings.schema);\n      if (settings.verify_html === false) {\n        settings.valid_elements = '*[*]';\n      }\n      validStyles = compileElementMap(settings.valid_styles);\n      invalidStyles = compileElementMap(settings.invalid_styles, 'map');\n      validClasses = compileElementMap(settings.valid_classes, 'map');\n      whiteSpaceElementsMap = createLookupTable('whitespace_elements', 'pre script noscript style textarea video audio iframe object code');\n      selfClosingElementsMap = createLookupTable('self_closing_elements', 'colgroup dd dt li option p td tfoot th thead tr');\n      shortEndedElementsMap = createLookupTable('short_ended_elements', 'area base basefont br col frame hr img input isindex link ' + 'meta param embed source wbr track');\n      boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize ' + 'noshade nowrap readonly selected autoplay loop controls');\n      nonEmptyElementsMap = createLookupTable('non_empty_elements', 'td th iframe video audio object ' + 'script pre code', shortEndedElementsMap);\n      moveCaretBeforeOnEnterElementsMap = createLookupTable('move_caret_before_on_enter_elements', 'table', nonEmptyElementsMap);\n      textBlockElementsMap = createLookupTable('text_block_elements', 'h1 h2 h3 h4 h5 h6 p div address pre form ' + 'blockquote center dir fieldset header footer article section hgroup aside main nav figure');\n      blockElementsMap = createLookupTable('block_elements', 'hr table tbody thead tfoot ' + 'th tr td li ol ul caption dl dt dd noscript menu isindex option ' + 'datalist select optgroup figcaption details summary', textBlockElementsMap);\n      textInlineElementsMap = createLookupTable('text_inline_elements', 'span strong b em i font strike u var cite ' + 'dfn code mark q sup sub samp');\n      each$3((settings.special || 'script noscript noframes noembed title style textarea xmp').split(' '), function (name) {\n        specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');\n      });\n      var patternToRegExp = function (str) {\n        return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');\n      };\n      var addValidElements = function (validElements) {\n        var ei, el, ai, al, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder, prefix, outputName, globalAttributes, globalAttributesOrder, key, value;\n        var elementRuleRegExp = /^([#+\\-])?([^\\[!\\/]+)(?:\\/([^\\[!]+))?(?:(!?)\\[([^\\]]+)\\])?$/, attrRuleRegExp = /^([!\\-])?(\\w+[\\\\:]:\\w+|[^=:<]+)?(?:([=:<])(.*))?$/, hasPatternsRegExp = /[*?+]/;\n        if (validElements) {\n          validElements = split(validElements, ',');\n          if (elements['@']) {\n            globalAttributes = elements['@'].attributes;\n            globalAttributesOrder = elements['@'].attributesOrder;\n          }\n          for (ei = 0, el = validElements.length; ei < el; ei++) {\n            matches = elementRuleRegExp.exec(validElements[ei]);\n            if (matches) {\n              prefix = matches[1];\n              elementName = matches[2];\n              outputName = matches[3];\n              attrData = matches[5];\n              attributes = {};\n              attributesOrder = [];\n              element = {\n                attributes: attributes,\n                attributesOrder: attributesOrder\n              };\n              if (prefix === '#') {\n                element.paddEmpty = true;\n              }\n              if (prefix === '-') {\n                element.removeEmpty = true;\n              }\n              if (matches[4] === '!') {\n                element.removeEmptyAttrs = true;\n              }\n              if (globalAttributes) {\n                for (key in globalAttributes) {\n                  attributes[key] = globalAttributes[key];\n                }\n                attributesOrder.push.apply(attributesOrder, globalAttributesOrder);\n              }\n              if (attrData) {\n                attrData = split(attrData, '|');\n                for (ai = 0, al = attrData.length; ai < al; ai++) {\n                  matches = attrRuleRegExp.exec(attrData[ai]);\n                  if (matches) {\n                    attr = {};\n                    attrType = matches[1];\n                    attrName = matches[2].replace(/[\\\\:]:/g, ':');\n                    prefix = matches[3];\n                    value = matches[4];\n                    if (attrType === '!') {\n                      element.attributesRequired = element.attributesRequired || [];\n                      element.attributesRequired.push(attrName);\n                      attr.required = true;\n                    }\n                    if (attrType === '-') {\n                      delete attributes[attrName];\n                      attributesOrder.splice(inArray(attributesOrder, attrName), 1);\n                      continue;\n                    }\n                    if (prefix) {\n                      if (prefix === '=') {\n                        element.attributesDefault = element.attributesDefault || [];\n                        element.attributesDefault.push({\n                          name: attrName,\n                          value: value\n                        });\n                        attr.defaultValue = value;\n                      }\n                      if (prefix === ':') {\n                        element.attributesForced = element.attributesForced || [];\n                        element.attributesForced.push({\n                          name: attrName,\n                          value: value\n                        });\n                        attr.forcedValue = value;\n                      }\n                      if (prefix === '<') {\n                        attr.validValues = makeMap$2(value, '?');\n                      }\n                    }\n                    if (hasPatternsRegExp.test(attrName)) {\n                      element.attributePatterns = element.attributePatterns || [];\n                      attr.pattern = patternToRegExp(attrName);\n                      element.attributePatterns.push(attr);\n                    } else {\n                      if (!attributes[attrName]) {\n                        attributesOrder.push(attrName);\n                      }\n                      attributes[attrName] = attr;\n                    }\n                  }\n                }\n              }\n              if (!globalAttributes && elementName === '@') {\n                globalAttributes = attributes;\n                globalAttributesOrder = attributesOrder;\n              }\n              if (outputName) {\n                element.outputName = elementName;\n                elements[outputName] = element;\n              }\n              if (hasPatternsRegExp.test(elementName)) {\n                element.pattern = patternToRegExp(elementName);\n                patternElements.push(element);\n              } else {\n                elements[elementName] = element;\n              }\n            }\n          }\n        }\n      };\n      var setValidElements = function (validElements) {\n        elements = {};\n        patternElements = [];\n        addValidElements(validElements);\n        each$3(schemaItems, function (element, name) {\n          children[name] = element.children;\n        });\n      };\n      var addCustomElements = function (customElements) {\n        var customElementRegExp = /^(~)?(.+)$/;\n        if (customElements) {\n          mapCache.text_block_elements = mapCache.block_elements = null;\n          each$3(split(customElements, ','), function (rule) {\n            var matches = customElementRegExp.exec(rule), inline = matches[1] === '~', cloneName = inline ? 'span' : 'div', name = matches[2];\n            children[name] = children[cloneName];\n            customElementsMap[name] = cloneName;\n            if (!inline) {\n              blockElementsMap[name.toUpperCase()] = {};\n              blockElementsMap[name] = {};\n            }\n            if (!elements[name]) {\n              var customRule = elements[cloneName];\n              customRule = extend$1({}, customRule);\n              delete customRule.removeEmptyAttrs;\n              delete customRule.removeEmpty;\n              elements[name] = customRule;\n            }\n            each$3(children, function (element, elmName) {\n              if (element[cloneName]) {\n                children[elmName] = element = extend$1({}, children[elmName]);\n                element[name] = element[cloneName];\n              }\n            });\n          });\n        }\n      };\n      var addValidChildren = function (validChildren) {\n        var childRuleRegExp = /^([+\\-]?)(\\w+)\\[([^\\]]+)\\]$/;\n        mapCache[settings.schema] = null;\n        if (validChildren) {\n          each$3(split(validChildren, ','), function (rule) {\n            var matches = childRuleRegExp.exec(rule);\n            var parent, prefix;\n            if (matches) {\n              prefix = matches[1];\n              if (prefix) {\n                parent = children[matches[2]];\n              } else {\n                parent = children[matches[2]] = { '#comment': {} };\n              }\n              parent = children[matches[2]];\n              each$3(split(matches[3], '|'), function (child) {\n                if (prefix === '-') {\n                  delete parent[child];\n                } else {\n                  parent[child] = {};\n                }\n              });\n            }\n          });\n        }\n      };\n      var getElementRule = function (name) {\n        var element = elements[name], i;\n        if (element) {\n          return element;\n        }\n        i = patternElements.length;\n        while (i--) {\n          element = patternElements[i];\n          if (element.pattern.test(name)) {\n            return element;\n          }\n        }\n      };\n      if (!settings.valid_elements) {\n        each$3(schemaItems, function (element, name) {\n          elements[name] = {\n            attributes: element.attributes,\n            attributesOrder: element.attributesOrder\n          };\n          children[name] = element.children;\n        });\n        if (settings.schema !== 'html5') {\n          each$3(split('strong/b em/i'), function (item) {\n            item = split(item, '/');\n            elements[item[1]].outputName = item[0];\n          });\n        }\n        each$3(split('ol ul sub sup blockquote span font a table tbody tr strong em b i'), function (name) {\n          if (elements[name]) {\n            elements[name].removeEmpty = true;\n          }\n        });\n        each$3(split('p h1 h2 h3 h4 h5 h6 th td pre div address caption li'), function (name) {\n          elements[name].paddEmpty = true;\n        });\n        each$3(split('span'), function (name) {\n          elements[name].removeEmptyAttrs = true;\n        });\n      } else {\n        setValidElements(settings.valid_elements);\n      }\n      addCustomElements(settings.custom_elements);\n      addValidChildren(settings.valid_children);\n      addValidElements(settings.extended_valid_elements);\n      addValidChildren('+ol[ul|ol],+ul[ul|ol]');\n      each$3({\n        dd: 'dl',\n        dt: 'dl',\n        li: 'ul ol',\n        td: 'tr',\n        th: 'tr',\n        tr: 'tbody thead tfoot',\n        tbody: 'table',\n        thead: 'table',\n        tfoot: 'table',\n        legend: 'fieldset',\n        area: 'map',\n        param: 'video audio object'\n      }, function (parents, item) {\n        if (elements[item]) {\n          elements[item].parentsRequired = split(parents);\n        }\n      });\n      if (settings.invalid_elements) {\n        each$3(explode$1(settings.invalid_elements), function (item) {\n          if (elements[item]) {\n            delete elements[item];\n          }\n        });\n      }\n      if (!getElementRule('span')) {\n        addValidElements('span[!data-mce-type|*]');\n      }\n      var getValidStyles = function () {\n        return validStyles;\n      };\n      var getInvalidStyles = function () {\n        return invalidStyles;\n      };\n      var getValidClasses = function () {\n        return validClasses;\n      };\n      var getBoolAttrs = function () {\n        return boolAttrMap;\n      };\n      var getBlockElements = function () {\n        return blockElementsMap;\n      };\n      var getTextBlockElements = function () {\n        return textBlockElementsMap;\n      };\n      var getTextInlineElements = function () {\n        return textInlineElementsMap;\n      };\n      var getShortEndedElements = function () {\n        return shortEndedElementsMap;\n      };\n      var getSelfClosingElements = function () {\n        return selfClosingElementsMap;\n      };\n      var getNonEmptyElements = function () {\n        return nonEmptyElementsMap;\n      };\n      var getMoveCaretBeforeOnEnterElements = function () {\n        return moveCaretBeforeOnEnterElementsMap;\n      };\n      var getWhiteSpaceElements = function () {\n        return whiteSpaceElementsMap;\n      };\n      var getSpecialElements = function () {\n        return specialElements;\n      };\n      var isValidChild = function (name, child) {\n        var parent = children[name.toLowerCase()];\n        return !!(parent && parent[child.toLowerCase()]);\n      };\n      var isValid = function (name, attr) {\n        var attrPatterns, i;\n        var rule = getElementRule(name);\n        if (rule) {\n          if (attr) {\n            if (rule.attributes[attr]) {\n              return true;\n            }\n            attrPatterns = rule.attributePatterns;\n            if (attrPatterns) {\n              i = attrPatterns.length;\n              while (i--) {\n                if (attrPatterns[i].pattern.test(name)) {\n                  return true;\n                }\n              }\n            }\n          } else {\n            return true;\n          }\n        }\n        return false;\n      };\n      var getCustomElements = function () {\n        return customElementsMap;\n      };\n      return {\n        children: children,\n        elements: elements,\n        getValidStyles: getValidStyles,\n        getValidClasses: getValidClasses,\n        getBlockElements: getBlockElements,\n        getInvalidStyles: getInvalidStyles,\n        getShortEndedElements: getShortEndedElements,\n        getTextBlockElements: getTextBlockElements,\n        getTextInlineElements: getTextInlineElements,\n        getBoolAttrs: getBoolAttrs,\n        getElementRule: getElementRule,\n        getSelfClosingElements: getSelfClosingElements,\n        getNonEmptyElements: getNonEmptyElements,\n        getMoveCaretBeforeOnEnterElements: getMoveCaretBeforeOnEnterElements,\n        getWhiteSpaceElements: getWhiteSpaceElements,\n        getSpecialElements: getSpecialElements,\n        isValidChild: isValidChild,\n        isValid: isValid,\n        getCustomElements: getCustomElements,\n        addValidElements: addValidElements,\n        setValidElements: setValidElements,\n        addCustomElements: addCustomElements,\n        addValidChildren: addValidChildren\n      };\n    }\n\n    var zeroWidth = '\\uFEFF';\n    var nbsp = '\\xA0';\n\n    var toHex = function (match, r, g, b) {\n      var hex = function (val) {\n        val = parseInt(val, 10).toString(16);\n        return val.length > 1 ? val : '0' + val;\n      };\n      return '#' + hex(r) + hex(g) + hex(b);\n    };\n    var Styles = function (settings, schema) {\n      var rgbRegExp = /rgb\\s*\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)/gi;\n      var urlOrStrRegExp = /(?:url(?:(?:\\(\\s*\\\"([^\\\"]+)\\\"\\s*\\))|(?:\\(\\s*\\'([^\\']+)\\'\\s*\\))|(?:\\(\\s*([^)\\s]+)\\s*\\))))|(?:\\'([^\\']+)\\')|(?:\\\"([^\\\"]+)\\\")/gi;\n      var styleRegExp = /\\s*([^:]+):\\s*([^;]+);?/g;\n      var trimRightRegExp = /\\s+$/;\n      var i;\n      var encodingLookup = {};\n      var encodingItems;\n      var validStyles;\n      var invalidStyles;\n      var invisibleChar = zeroWidth;\n      settings = settings || {};\n      if (schema) {\n        validStyles = schema.getValidStyles();\n        invalidStyles = schema.getInvalidStyles();\n      }\n      encodingItems = ('\\\\\" \\\\\\' \\\\; \\\\: ; : ' + invisibleChar).split(' ');\n      for (i = 0; i < encodingItems.length; i++) {\n        encodingLookup[encodingItems[i]] = invisibleChar + i;\n        encodingLookup[invisibleChar + i] = encodingItems[i];\n      }\n      return {\n        toHex: function (color) {\n          return color.replace(rgbRegExp, toHex);\n        },\n        parse: function (css) {\n          var styles = {};\n          var matches, name, value, isEncoded;\n          var urlConverter = settings.url_converter;\n          var urlConverterScope = settings.url_converter_scope || this;\n          var compress = function (prefix, suffix, noJoin) {\n            var top, right, bottom, left;\n            top = styles[prefix + '-top' + suffix];\n            if (!top) {\n              return;\n            }\n            right = styles[prefix + '-right' + suffix];\n            if (!right) {\n              return;\n            }\n            bottom = styles[prefix + '-bottom' + suffix];\n            if (!bottom) {\n              return;\n            }\n            left = styles[prefix + '-left' + suffix];\n            if (!left) {\n              return;\n            }\n            var box = [\n              top,\n              right,\n              bottom,\n              left\n            ];\n            i = box.length - 1;\n            while (i--) {\n              if (box[i] !== box[i + 1]) {\n                break;\n              }\n            }\n            if (i > -1 && noJoin) {\n              return;\n            }\n            styles[prefix + suffix] = i === -1 ? box[0] : box.join(' ');\n            delete styles[prefix + '-top' + suffix];\n            delete styles[prefix + '-right' + suffix];\n            delete styles[prefix + '-bottom' + suffix];\n            delete styles[prefix + '-left' + suffix];\n          };\n          var canCompress = function (key) {\n            var value = styles[key], i;\n            if (!value) {\n              return;\n            }\n            value = value.split(' ');\n            i = value.length;\n            while (i--) {\n              if (value[i] !== value[0]) {\n                return false;\n              }\n            }\n            styles[key] = value[0];\n            return true;\n          };\n          var compress2 = function (target, a, b, c) {\n            if (!canCompress(a)) {\n              return;\n            }\n            if (!canCompress(b)) {\n              return;\n            }\n            if (!canCompress(c)) {\n              return;\n            }\n            styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c];\n            delete styles[a];\n            delete styles[b];\n            delete styles[c];\n          };\n          var encode = function (str) {\n            isEncoded = true;\n            return encodingLookup[str];\n          };\n          var decode = function (str, keepSlashes) {\n            if (isEncoded) {\n              str = str.replace(/\\uFEFF[0-9]/g, function (str) {\n                return encodingLookup[str];\n              });\n            }\n            if (!keepSlashes) {\n              str = str.replace(/\\\\([\\'\\\";:])/g, '$1');\n            }\n            return str;\n          };\n          var decodeSingleHexSequence = function (escSeq) {\n            return String.fromCharCode(parseInt(escSeq.slice(1), 16));\n          };\n          var decodeHexSequences = function (value) {\n            return value.replace(/\\\\[0-9a-f]+/gi, decodeSingleHexSequence);\n          };\n          var processUrl = function (match, url, url2, url3, str, str2) {\n            str = str || str2;\n            if (str) {\n              str = decode(str);\n              return '\\'' + str.replace(/\\'/g, '\\\\\\'') + '\\'';\n            }\n            url = decode(url || url2 || url3);\n            if (!settings.allow_script_urls) {\n              var scriptUrl = url.replace(/[\\s\\r\\n]+/g, '');\n              if (/(java|vb)script:/i.test(scriptUrl)) {\n                return '';\n              }\n              if (!settings.allow_svg_data_urls && /^data:image\\/svg/i.test(scriptUrl)) {\n                return '';\n              }\n            }\n            if (urlConverter) {\n              url = urlConverter.call(urlConverterScope, url, 'style');\n            }\n            return 'url(\\'' + url.replace(/\\'/g, '\\\\\\'') + '\\')';\n          };\n          if (css) {\n            css = css.replace(/[\\u0000-\\u001F]/g, '');\n            css = css.replace(/\\\\[\\\"\\';:\\uFEFF]/g, encode).replace(/\\\"[^\\\"]+\\\"|\\'[^\\']+\\'/g, function (str) {\n              return str.replace(/[;:]/g, encode);\n            });\n            while (matches = styleRegExp.exec(css)) {\n              styleRegExp.lastIndex = matches.index + matches[0].length;\n              name = matches[1].replace(trimRightRegExp, '').toLowerCase();\n              value = matches[2].replace(trimRightRegExp, '');\n              if (name && value) {\n                name = decodeHexSequences(name);\n                value = decodeHexSequences(value);\n                if (name.indexOf(invisibleChar) !== -1 || name.indexOf('\"') !== -1) {\n                  continue;\n                }\n                if (!settings.allow_script_urls && (name === 'behavior' || /expression\\s*\\(|\\/\\*|\\*\\//.test(value))) {\n                  continue;\n                }\n                if (name === 'font-weight' && value === '700') {\n                  value = 'bold';\n                } else if (name === 'color' || name === 'background-color') {\n                  value = value.toLowerCase();\n                }\n                value = value.replace(rgbRegExp, toHex);\n                value = value.replace(urlOrStrRegExp, processUrl);\n                styles[name] = isEncoded ? decode(value, true) : value;\n              }\n            }\n            compress('border', '', true);\n            compress('border', '-width');\n            compress('border', '-color');\n            compress('border', '-style');\n            compress('padding', '');\n            compress('margin', '');\n            compress2('border', 'border-width', 'border-style', 'border-color');\n            if (styles.border === 'medium none') {\n              delete styles.border;\n            }\n            if (styles['border-image'] === 'none') {\n              delete styles['border-image'];\n            }\n          }\n          return styles;\n        },\n        serialize: function (styles, elementName) {\n          var css = '', name, value;\n          var serializeStyles = function (name) {\n            var styleList, i, l, value;\n            styleList = validStyles[name];\n            if (styleList) {\n              for (i = 0, l = styleList.length; i < l; i++) {\n                name = styleList[i];\n                value = styles[name];\n                if (value) {\n                  css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';\n                }\n              }\n            }\n          };\n          var isValid = function (name, elementName) {\n            var styleMap;\n            styleMap = invalidStyles['*'];\n            if (styleMap && styleMap[name]) {\n              return false;\n            }\n            styleMap = invalidStyles[elementName];\n            if (styleMap && styleMap[name]) {\n              return false;\n            }\n            return true;\n          };\n          if (elementName && validStyles) {\n            serializeStyles('*');\n            serializeStyles(elementName);\n          } else {\n            for (name in styles) {\n              value = styles[name];\n              if (value && (!invalidStyles || isValid(name, elementName))) {\n                css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';\n              }\n            }\n          }\n          return css;\n        }\n      };\n    };\n\n    var eventExpandoPrefix = 'mce-data-';\n    var mouseEventRe = /^(?:mouse|contextmenu)|click/;\n    var deprecated = {\n      keyLocation: 1,\n      layerX: 1,\n      layerY: 1,\n      returnValue: 1,\n      webkitMovementX: 1,\n      webkitMovementY: 1,\n      keyIdentifier: 1,\n      mozPressure: 1\n    };\n    var hasIsDefaultPrevented = function (event) {\n      return event.isDefaultPrevented === returnTrue || event.isDefaultPrevented === returnFalse;\n    };\n    var returnFalse = function () {\n      return false;\n    };\n    var returnTrue = function () {\n      return true;\n    };\n    var addEvent = function (target, name, callback, capture) {\n      if (target.addEventListener) {\n        target.addEventListener(name, callback, capture || false);\n      } else if (target.attachEvent) {\n        target.attachEvent('on' + name, callback);\n      }\n    };\n    var removeEvent = function (target, name, callback, capture) {\n      if (target.removeEventListener) {\n        target.removeEventListener(name, callback, capture || false);\n      } else if (target.detachEvent) {\n        target.detachEvent('on' + name, callback);\n      }\n    };\n    var getTargetFromShadowDom = function (event, defaultTarget) {\n      if (event.composedPath) {\n        var composedPath = event.composedPath();\n        if (composedPath && composedPath.length > 0) {\n          return composedPath[0];\n        }\n      }\n      return defaultTarget;\n    };\n    var fix = function (originalEvent, data) {\n      var name;\n      var event = data || {};\n      for (name in originalEvent) {\n        if (!deprecated[name]) {\n          event[name] = originalEvent[name];\n        }\n      }\n      if (!event.target) {\n        event.target = event.srcElement || domGlobals.document;\n      }\n      if (Env.experimentalShadowDom) {\n        event.target = getTargetFromShadowDom(originalEvent, event.target);\n      }\n      if (originalEvent && mouseEventRe.test(originalEvent.type) && originalEvent.pageX === undefined && originalEvent.clientX !== undefined) {\n        var eventDoc = event.target.ownerDocument || domGlobals.document;\n        var doc = eventDoc.documentElement;\n        var body = eventDoc.body;\n        event.pageX = originalEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n        event.pageY = originalEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);\n      }\n      event.preventDefault = function () {\n        event.isDefaultPrevented = returnTrue;\n        if (originalEvent) {\n          if (originalEvent.preventDefault) {\n            originalEvent.preventDefault();\n          } else {\n            originalEvent.returnValue = false;\n          }\n        }\n      };\n      event.stopPropagation = function () {\n        event.isPropagationStopped = returnTrue;\n        if (originalEvent) {\n          if (originalEvent.stopPropagation) {\n            originalEvent.stopPropagation();\n          } else {\n            originalEvent.cancelBubble = true;\n          }\n        }\n      };\n      event.stopImmediatePropagation = function () {\n        event.isImmediatePropagationStopped = returnTrue;\n        event.stopPropagation();\n      };\n      if (hasIsDefaultPrevented(event) === false) {\n        event.isDefaultPrevented = returnFalse;\n        event.isPropagationStopped = returnFalse;\n        event.isImmediatePropagationStopped = returnFalse;\n      }\n      if (typeof event.metaKey === 'undefined') {\n        event.metaKey = false;\n      }\n      return event;\n    };\n    var bindOnReady = function (win, callback, eventUtils) {\n      var doc = win.document, event = { type: 'ready' };\n      if (eventUtils.domLoaded) {\n        callback(event);\n        return;\n      }\n      var isDocReady = function () {\n        return doc.readyState === 'complete' || doc.readyState === 'interactive' && doc.body;\n      };\n      var readyHandler = function () {\n        removeEvent(win, 'DOMContentLoaded', readyHandler);\n        removeEvent(win, 'load', readyHandler);\n        if (!eventUtils.domLoaded) {\n          eventUtils.domLoaded = true;\n          callback(event);\n        }\n      };\n      if (isDocReady()) {\n        readyHandler();\n      } else {\n        addEvent(win, 'DOMContentLoaded', readyHandler);\n      }\n      addEvent(win, 'load', readyHandler);\n    };\n    var EventUtils = function () {\n      function EventUtils() {\n        this.domLoaded = false;\n        this.events = {};\n        this.count = 1;\n        this.expando = eventExpandoPrefix + (+new Date()).toString(32);\n        this.hasMouseEnterLeave = 'onmouseenter' in domGlobals.document.documentElement;\n        this.hasFocusIn = 'onfocusin' in domGlobals.document.documentElement;\n        this.count = 1;\n      }\n      EventUtils.prototype.bind = function (target, names, callback, scope) {\n        var self = this;\n        var id, callbackList, i, name, fakeName, nativeHandler, capture;\n        var win = domGlobals.window;\n        var defaultNativeHandler = function (evt) {\n          self.executeHandlers(fix(evt || win.event), id);\n        };\n        if (!target || target.nodeType === 3 || target.nodeType === 8) {\n          return;\n        }\n        if (!target[self.expando]) {\n          id = self.count++;\n          target[self.expando] = id;\n          self.events[id] = {};\n        } else {\n          id = target[self.expando];\n        }\n        scope = scope || target;\n        var namesList = names.split(' ');\n        i = namesList.length;\n        while (i--) {\n          name = namesList[i];\n          nativeHandler = defaultNativeHandler;\n          fakeName = capture = false;\n          if (name === 'DOMContentLoaded') {\n            name = 'ready';\n          }\n          if (self.domLoaded && name === 'ready' && target.readyState === 'complete') {\n            callback.call(scope, fix({ type: name }));\n            continue;\n          }\n          if (!self.hasMouseEnterLeave) {\n            fakeName = self.mouseEnterLeave[name];\n            if (fakeName) {\n              nativeHandler = function (evt) {\n                var current, related;\n                current = evt.currentTarget;\n                related = evt.relatedTarget;\n                if (related && current.contains) {\n                  related = current.contains(related);\n                } else {\n                  while (related && related !== current) {\n                    related = related.parentNode;\n                  }\n                }\n                if (!related) {\n                  evt = fix(evt || win.event);\n                  evt.type = evt.type === 'mouseout' ? 'mouseleave' : 'mouseenter';\n                  evt.target = current;\n                  self.executeHandlers(evt, id);\n                }\n              };\n            }\n          }\n          if (!self.hasFocusIn && (name === 'focusin' || name === 'focusout')) {\n            capture = true;\n            fakeName = name === 'focusin' ? 'focus' : 'blur';\n            nativeHandler = function (evt) {\n              evt = fix(evt || win.event);\n              evt.type = evt.type === 'focus' ? 'focusin' : 'focusout';\n              self.executeHandlers(evt, id);\n            };\n          }\n          callbackList = self.events[id][name];\n          if (!callbackList) {\n            self.events[id][name] = callbackList = [{\n                func: callback,\n                scope: scope\n              }];\n            callbackList.fakeName = fakeName;\n            callbackList.capture = capture;\n            callbackList.nativeHandler = nativeHandler;\n            if (name === 'ready') {\n              bindOnReady(target, nativeHandler, self);\n            } else {\n              addEvent(target, fakeName || name, nativeHandler, capture);\n            }\n          } else {\n            if (name === 'ready' && self.domLoaded) {\n              callback(fix({ type: name }));\n            } else {\n              callbackList.push({\n                func: callback,\n                scope: scope\n              });\n            }\n          }\n        }\n        target = callbackList = 0;\n        return callback;\n      };\n      EventUtils.prototype.unbind = function (target, names, callback) {\n        var id, callbackList, i, ci, name, eventMap;\n        if (!target || target.nodeType === 3 || target.nodeType === 8) {\n          return this;\n        }\n        id = target[this.expando];\n        if (id) {\n          eventMap = this.events[id];\n          if (names) {\n            var namesList = names.split(' ');\n            i = namesList.length;\n            while (i--) {\n              name = namesList[i];\n              callbackList = eventMap[name];\n              if (callbackList) {\n                if (callback) {\n                  ci = callbackList.length;\n                  while (ci--) {\n                    if (callbackList[ci].func === callback) {\n                      var nativeHandler = callbackList.nativeHandler;\n                      var fakeName = callbackList.fakeName, capture = callbackList.capture;\n                      callbackList = callbackList.slice(0, ci).concat(callbackList.slice(ci + 1));\n                      callbackList.nativeHandler = nativeHandler;\n                      callbackList.fakeName = fakeName;\n                      callbackList.capture = capture;\n                      eventMap[name] = callbackList;\n                    }\n                  }\n                }\n                if (!callback || callbackList.length === 0) {\n                  delete eventMap[name];\n                  removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);\n                }\n              }\n            }\n          } else {\n            for (name in eventMap) {\n              callbackList = eventMap[name];\n              removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);\n            }\n            eventMap = {};\n          }\n          for (name in eventMap) {\n            return this;\n          }\n          delete this.events[id];\n          try {\n            delete target[this.expando];\n          } catch (ex) {\n            target[this.expando] = null;\n          }\n        }\n        return this;\n      };\n      EventUtils.prototype.fire = function (target, name, args) {\n        var id;\n        if (!target || target.nodeType === 3 || target.nodeType === 8) {\n          return this;\n        }\n        var event = fix(null, args);\n        event.type = name;\n        event.target = target;\n        do {\n          id = target[this.expando];\n          if (id) {\n            this.executeHandlers(event, id);\n          }\n          target = target.parentNode || target.ownerDocument || target.defaultView || target.parentWindow;\n        } while (target && !event.isPropagationStopped());\n        return this;\n      };\n      EventUtils.prototype.clean = function (target) {\n        var i, children;\n        if (!target || target.nodeType === 3 || target.nodeType === 8) {\n          return this;\n        }\n        if (target[this.expando]) {\n          this.unbind(target);\n        }\n        if (!target.getElementsByTagName) {\n          target = target.document;\n        }\n        if (target && target.getElementsByTagName) {\n          this.unbind(target);\n          children = target.getElementsByTagName('*');\n          i = children.length;\n          while (i--) {\n            target = children[i];\n            if (target[this.expando]) {\n              this.unbind(target);\n            }\n          }\n        }\n        return this;\n      };\n      EventUtils.prototype.destroy = function () {\n        this.events = {};\n      };\n      EventUtils.prototype.cancel = function (e) {\n        if (e) {\n          e.preventDefault();\n          e.stopImmediatePropagation();\n        }\n        return false;\n      };\n      EventUtils.prototype.executeHandlers = function (evt, id) {\n        var callbackList, i, l, callback;\n        var container = this.events[id];\n        callbackList = container && container[evt.type];\n        if (callbackList) {\n          for (i = 0, l = callbackList.length; i < l; i++) {\n            callback = callbackList[i];\n            if (callback && callback.func.call(callback.scope, evt) === false) {\n              evt.preventDefault();\n            }\n            if (evt.isImmediatePropagationStopped()) {\n              return;\n            }\n          }\n        }\n      };\n      EventUtils.Event = new EventUtils();\n      return EventUtils;\n    }();\n\n    var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains$3, expando = 'sizzle' + -new Date(), preferredDoc = domGlobals.window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function (a, b) {\n        if (a === b) {\n          hasDuplicate = true;\n        }\n        return 0;\n      }, strundefined = typeof undefined, MAX_NEGATIVE = 1 << 31, hasOwn = {}.hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, indexOf$2 = arr.indexOf || function (elem) {\n        var i = 0, len = this.length;\n        for (; i < len; i++) {\n          if (this[i] === elem) {\n            return i;\n          }\n        }\n        return -1;\n      }, booleans = 'checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped', whitespace = '[\\\\x20\\\\t\\\\r\\\\n\\\\f]', identifier = '(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+', attributes = '\\\\[' + whitespace + '*(' + identifier + ')(?:' + whitespace + '*([*^$|!~]?=)' + whitespace + '*(?:\\'((?:\\\\\\\\.|[^\\\\\\\\\\'])*)\\'|\"((?:\\\\\\\\.|[^\\\\\\\\\"])*)\"|(' + identifier + '))|)' + whitespace + '*\\\\]', pseudos = ':(' + identifier + ')(?:\\\\((' + '(\\'((?:\\\\\\\\.|[^\\\\\\\\\\'])*)\\'|\"((?:\\\\\\\\.|[^\\\\\\\\\"])*)\")|' + '((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|' + attributes + ')*)|' + '.*' + ')\\\\)|)', rtrim = new RegExp('^' + whitespace + '+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)' + whitespace + '+$', 'g'), rcomma = new RegExp('^' + whitespace + '*,' + whitespace + '*'), rcombinators = new RegExp('^' + whitespace + '*([>+~]|' + whitespace + ')' + whitespace + '*'), rattributeQuotes = new RegExp('=' + whitespace + '*([^\\\\]\\'\"]*?)' + whitespace + '*\\\\]', 'g'), rpseudo = new RegExp(pseudos), ridentifier = new RegExp('^' + identifier + '$'), matchExpr = {\n        ID: new RegExp('^#(' + identifier + ')'),\n        CLASS: new RegExp('^\\\\.(' + identifier + ')'),\n        TAG: new RegExp('^(' + identifier + '|[*])'),\n        ATTR: new RegExp('^' + attributes),\n        PSEUDO: new RegExp('^' + pseudos),\n        CHILD: new RegExp('^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(' + whitespace + '*(even|odd|(([+-]|)(\\\\d*)n|)' + whitespace + '*(?:([+-]|)' + whitespace + '*(\\\\d+)|))' + whitespace + '*\\\\)|)', 'i'),\n        bool: new RegExp('^(?:' + booleans + ')$', 'i'),\n        needsContext: new RegExp('^' + whitespace + '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(' + whitespace + '*((?:-\\\\d)?\\\\d*)' + whitespace + '*\\\\)|)(?=[^-]|$)', 'i')\n      }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\\d$/i, rnative = /^[^{]+\\{\\s*\\[native \\w/, rquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/, rsibling = /[+~]/, rescape = /'|\\\\/g, runescape = new RegExp('\\\\\\\\([\\\\da-f]{1,6}' + whitespace + '?|(' + whitespace + ')|.)', 'ig'), funescape = function (_, escaped, escapedWhitespace) {\n        var high = '0x' + escaped - 65536;\n        return high !== high || escapedWhitespace ? escaped : high < 0 ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, high & 1023 | 56320);\n      };\n    try {\n      push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);\n      arr[preferredDoc.childNodes.length].nodeType;\n    } catch (e) {\n      push = {\n        apply: arr.length ? function (target, els) {\n          push_native.apply(target, slice.call(els));\n        } : function (target, els) {\n          var j = target.length, i = 0;\n          while (target[j++] = els[i++]) {\n          }\n          target.length = j - 1;\n        }\n      };\n    }\n    var Sizzle = function (selector, context, results, seed) {\n      var match, elem, m, nodeType, i, groups, old, nid, newContext, newSelector;\n      if ((context ? context.ownerDocument || context : preferredDoc) !== document) {\n        setDocument(context);\n      }\n      context = context || document;\n      results = results || [];\n      if (!selector || typeof selector !== 'string') {\n        return results;\n      }\n      if ((nodeType = context.nodeType) !== 1 && nodeType !== 9) {\n        return [];\n      }\n      if (documentIsHTML && !seed) {\n        if (match = rquickExpr.exec(selector)) {\n          if (m = match[1]) {\n            if (nodeType === 9) {\n              elem = context.getElementById(m);\n              if (elem && elem.parentNode) {\n                if (elem.id === m) {\n                  results.push(elem);\n                  return results;\n                }\n              } else {\n                return results;\n              }\n            } else {\n              if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) && contains$3(context, elem) && elem.id === m) {\n                results.push(elem);\n                return results;\n              }\n            }\n          } else if (match[2]) {\n            push.apply(results, context.getElementsByTagName(selector));\n            return results;\n          } else if ((m = match[3]) && support.getElementsByClassName) {\n            push.apply(results, context.getElementsByClassName(m));\n            return results;\n          }\n        }\n        if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) {\n          nid = old = expando;\n          newContext = context;\n          newSelector = nodeType === 9 && selector;\n          if (nodeType === 1 && context.nodeName.toLowerCase() !== 'object') {\n            groups = tokenize(selector);\n            if (old = context.getAttribute('id')) {\n              nid = old.replace(rescape, '\\\\$&');\n            } else {\n              context.setAttribute('id', nid);\n            }\n            nid = '[id=\\'' + nid + '\\'] ';\n            i = groups.length;\n            while (i--) {\n              groups[i] = nid + toSelector(groups[i]);\n            }\n            newContext = rsibling.test(selector) && testContext(context.parentNode) || context;\n            newSelector = groups.join(',');\n          }\n          if (newSelector) {\n            try {\n              push.apply(results, newContext.querySelectorAll(newSelector));\n              return results;\n            } catch (qsaError) {\n            } finally {\n              if (!old) {\n                context.removeAttribute('id');\n              }\n            }\n          }\n        }\n      }\n      return select(selector.replace(rtrim, '$1'), context, results, seed);\n    };\n    function createCache() {\n      var keys = [];\n      function cache(key, value) {\n        if (keys.push(key + ' ') > Expr.cacheLength) {\n          delete cache[keys.shift()];\n        }\n        return cache[key + ' '] = value;\n      }\n      return cache;\n    }\n    function markFunction(fn) {\n      fn[expando] = true;\n      return fn;\n    }\n    function siblingCheck(a, b) {\n      var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE);\n      if (diff) {\n        return diff;\n      }\n      if (cur) {\n        while (cur = cur.nextSibling) {\n          if (cur === b) {\n            return -1;\n          }\n        }\n      }\n      return a ? 1 : -1;\n    }\n    function createInputPseudo(type) {\n      return function (elem) {\n        var name = elem.nodeName.toLowerCase();\n        return name === 'input' && elem.type === type;\n      };\n    }\n    function createButtonPseudo(type) {\n      return function (elem) {\n        var name = elem.nodeName.toLowerCase();\n        return (name === 'input' || name === 'button') && elem.type === type;\n      };\n    }\n    function createPositionalPseudo(fn) {\n      return markFunction(function (argument) {\n        argument = +argument;\n        return markFunction(function (seed, matches) {\n          var j, matchIndexes = fn([], seed.length, argument), i = matchIndexes.length;\n          while (i--) {\n            if (seed[j = matchIndexes[i]]) {\n              seed[j] = !(matches[j] = seed[j]);\n            }\n          }\n        });\n      });\n    }\n    function testContext(context) {\n      return context && typeof context.getElementsByTagName !== strundefined && context;\n    }\n    support = Sizzle.support = {};\n    isXML = Sizzle.isXML = function (elem) {\n      var documentElement = elem && (elem.ownerDocument || elem).documentElement;\n      return documentElement ? documentElement.nodeName !== 'HTML' : false;\n    };\n    setDocument = Sizzle.setDocument = function (node) {\n      var hasCompare, doc = node ? node.ownerDocument || node : preferredDoc, parent = doc.defaultView;\n      function getTop(win) {\n        try {\n          return win.top;\n        } catch (ex) {\n        }\n        return null;\n      }\n      if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {\n        return document;\n      }\n      document = doc;\n      docElem = doc.documentElement;\n      documentIsHTML = !isXML(doc);\n      if (parent && parent !== getTop(parent)) {\n        if (parent.addEventListener) {\n          parent.addEventListener('unload', function () {\n            setDocument();\n          }, false);\n        } else if (parent.attachEvent) {\n          parent.attachEvent('onunload', function () {\n            setDocument();\n          });\n        }\n      }\n      support.attributes = true;\n      support.getElementsByTagName = true;\n      support.getElementsByClassName = rnative.test(doc.getElementsByClassName);\n      support.getById = true;\n      Expr.find.ID = function (id, context) {\n        if (typeof context.getElementById !== strundefined && documentIsHTML) {\n          var m = context.getElementById(id);\n          return m && m.parentNode ? [m] : [];\n        }\n      };\n      Expr.filter.ID = function (id) {\n        var attrId = id.replace(runescape, funescape);\n        return function (elem) {\n          return elem.getAttribute('id') === attrId;\n        };\n      };\n      Expr.find.TAG = support.getElementsByTagName ? function (tag, context) {\n        if (typeof context.getElementsByTagName !== strundefined) {\n          return context.getElementsByTagName(tag);\n        }\n      } : function (tag, context) {\n        var elem, tmp = [], i = 0, results = context.getElementsByTagName(tag);\n        if (tag === '*') {\n          while (elem = results[i++]) {\n            if (elem.nodeType === 1) {\n              tmp.push(elem);\n            }\n          }\n          return tmp;\n        }\n        return results;\n      };\n      Expr.find.CLASS = support.getElementsByClassName && function (className, context) {\n        if (documentIsHTML) {\n          return context.getElementsByClassName(className);\n        }\n      };\n      rbuggyMatches = [];\n      rbuggyQSA = [];\n      support.disconnectedMatch = true;\n      rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join('|'));\n      rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join('|'));\n      hasCompare = rnative.test(docElem.compareDocumentPosition);\n      contains$3 = hasCompare || rnative.test(docElem.contains) ? function (a, b) {\n        var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode;\n        return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));\n      } : function (a, b) {\n        if (b) {\n          while (b = b.parentNode) {\n            if (b === a) {\n              return true;\n            }\n          }\n        }\n        return false;\n      };\n      sortOrder = hasCompare ? function (a, b) {\n        if (a === b) {\n          hasDuplicate = true;\n          return 0;\n        }\n        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n        if (compare) {\n          return compare;\n        }\n        compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 1;\n        if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {\n          if (a === doc || a.ownerDocument === preferredDoc && contains$3(preferredDoc, a)) {\n            return -1;\n          }\n          if (b === doc || b.ownerDocument === preferredDoc && contains$3(preferredDoc, b)) {\n            return 1;\n          }\n          return sortInput ? indexOf$2.call(sortInput, a) - indexOf$2.call(sortInput, b) : 0;\n        }\n        return compare & 4 ? -1 : 1;\n      } : function (a, b) {\n        if (a === b) {\n          hasDuplicate = true;\n          return 0;\n        }\n        var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [a], bp = [b];\n        if (!aup || !bup) {\n          return a === doc ? -1 : b === doc ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf$2.call(sortInput, a) - indexOf$2.call(sortInput, b) : 0;\n        } else if (aup === bup) {\n          return siblingCheck(a, b);\n        }\n        cur = a;\n        while (cur = cur.parentNode) {\n          ap.unshift(cur);\n        }\n        cur = b;\n        while (cur = cur.parentNode) {\n          bp.unshift(cur);\n        }\n        while (ap[i] === bp[i]) {\n          i++;\n        }\n        return i ? siblingCheck(ap[i], bp[i]) : ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0;\n      };\n      return doc;\n    };\n    Sizzle.matches = function (expr, elements) {\n      return Sizzle(expr, null, null, elements);\n    };\n    Sizzle.matchesSelector = function (elem, expr) {\n      if ((elem.ownerDocument || elem) !== document) {\n        setDocument(elem);\n      }\n      expr = expr.replace(rattributeQuotes, '=\\'$1\\']');\n      if (support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {\n        try {\n          var ret = matches.call(elem, expr);\n          if (ret || support.disconnectedMatch || elem.document && elem.document.nodeType !== 11) {\n            return ret;\n          }\n        } catch (e) {\n        }\n      }\n      return Sizzle(expr, document, null, [elem]).length > 0;\n    };\n    Sizzle.contains = function (context, elem) {\n      if ((context.ownerDocument || context) !== document) {\n        setDocument(context);\n      }\n      return contains$3(context, elem);\n    };\n    Sizzle.attr = function (elem, name) {\n      if ((elem.ownerDocument || elem) !== document) {\n        setDocument(elem);\n      }\n      var fn = Expr.attrHandle[name.toLowerCase()], val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;\n      return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;\n    };\n    Sizzle.error = function (msg) {\n      throw new Error('Syntax error, unrecognized expression: ' + msg);\n    };\n    Sizzle.uniqueSort = function (results) {\n      var elem, duplicates = [], j = 0, i = 0;\n      hasDuplicate = !support.detectDuplicates;\n      sortInput = !support.sortStable && results.slice(0);\n      results.sort(sortOrder);\n      if (hasDuplicate) {\n        while (elem = results[i++]) {\n          if (elem === results[i]) {\n            j = duplicates.push(i);\n          }\n        }\n        while (j--) {\n          results.splice(duplicates[j], 1);\n        }\n      }\n      sortInput = null;\n      return results;\n    };\n    getText = Sizzle.getText = function (elem) {\n      var node, ret = '', i = 0, nodeType = elem.nodeType;\n      if (!nodeType) {\n        while (node = elem[i++]) {\n          ret += getText(node);\n        }\n      } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {\n        if (typeof elem.textContent === 'string') {\n          return elem.textContent;\n        } else {\n          for (elem = elem.firstChild; elem; elem = elem.nextSibling) {\n            ret += getText(elem);\n          }\n        }\n      } else if (nodeType === 3 || nodeType === 4) {\n        return elem.nodeValue;\n      }\n      return ret;\n    };\n    Expr = Sizzle.selectors = {\n      cacheLength: 50,\n      createPseudo: markFunction,\n      match: matchExpr,\n      attrHandle: {},\n      find: {},\n      relative: {\n        '>': {\n          dir: 'parentNode',\n          first: true\n        },\n        ' ': { dir: 'parentNode' },\n        '+': {\n          dir: 'previousSibling',\n          first: true\n        },\n        '~': { dir: 'previousSibling' }\n      },\n      preFilter: {\n        ATTR: function (match) {\n          match[1] = match[1].replace(runescape, funescape);\n          match[3] = (match[3] || match[4] || match[5] || '').replace(runescape, funescape);\n          if (match[2] === '~=') {\n            match[3] = ' ' + match[3] + ' ';\n          }\n          return match.slice(0, 4);\n        },\n        CHILD: function (match) {\n          match[1] = match[1].toLowerCase();\n          if (match[1].slice(0, 3) === 'nth') {\n            if (!match[3]) {\n              Sizzle.error(match[0]);\n            }\n            match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === 'even' || match[3] === 'odd'));\n            match[5] = +(match[7] + match[8] || match[3] === 'odd');\n          } else if (match[3]) {\n            Sizzle.error(match[0]);\n          }\n          return match;\n        },\n        PSEUDO: function (match) {\n          var excess, unquoted = !match[6] && match[2];\n          if (matchExpr.CHILD.test(match[0])) {\n            return null;\n          }\n          if (match[3]) {\n            match[2] = match[4] || match[5] || '';\n          } else if (unquoted && rpseudo.test(unquoted) && (excess = tokenize(unquoted, true)) && (excess = unquoted.indexOf(')', unquoted.length - excess) - unquoted.length)) {\n            match[0] = match[0].slice(0, excess);\n            match[2] = unquoted.slice(0, excess);\n          }\n          return match.slice(0, 3);\n        }\n      },\n      filter: {\n        TAG: function (nodeNameSelector) {\n          var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();\n          return nodeNameSelector === '*' ? function () {\n            return true;\n          } : function (elem) {\n            return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n          };\n        },\n        CLASS: function (className) {\n          var pattern = classCache[className + ' '];\n          return pattern || (pattern = new RegExp('(^|' + whitespace + ')' + className + '(' + whitespace + '|$)')) && classCache(className, function (elem) {\n            return pattern.test(typeof elem.className === 'string' && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute('class') || '');\n          });\n        },\n        ATTR: function (name, operator, check) {\n          return function (elem) {\n            var result = Sizzle.attr(elem, name);\n            if (result == null) {\n              return operator === '!=';\n            }\n            if (!operator) {\n              return true;\n            }\n            result += '';\n            return operator === '=' ? result === check : operator === '!=' ? result !== check : operator === '^=' ? check && result.indexOf(check) === 0 : operator === '*=' ? check && result.indexOf(check) > -1 : operator === '$=' ? check && result.slice(-check.length) === check : operator === '~=' ? (' ' + result + ' ').indexOf(check) > -1 : operator === '|=' ? result === check || result.slice(0, check.length + 1) === check + '-' : false;\n          };\n        },\n        CHILD: function (type, what, argument, first, last) {\n          var simple = type.slice(0, 3) !== 'nth', forward = type.slice(-4) !== 'last', ofType = what === 'of-type';\n          return first === 1 && last === 0 ? function (elem) {\n            return !!elem.parentNode;\n          } : function (elem, context, xml) {\n            var cache, outerCache, node, diff, nodeIndex, start, dir = simple !== forward ? 'nextSibling' : 'previousSibling', parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType;\n            if (parent) {\n              if (simple) {\n                while (dir) {\n                  node = elem;\n                  while (node = node[dir]) {\n                    if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {\n                      return false;\n                    }\n                  }\n                  start = dir = type === 'only' && !start && 'nextSibling';\n                }\n                return true;\n              }\n              start = [forward ? parent.firstChild : parent.lastChild];\n              if (forward && useCache) {\n                outerCache = parent[expando] || (parent[expando] = {});\n                cache = outerCache[type] || [];\n                nodeIndex = cache[0] === dirruns && cache[1];\n                diff = cache[0] === dirruns && cache[2];\n                node = nodeIndex && parent.childNodes[nodeIndex];\n                while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {\n                  if (node.nodeType === 1 && ++diff && node === elem) {\n                    outerCache[type] = [\n                      dirruns,\n                      nodeIndex,\n                      diff\n                    ];\n                    break;\n                  }\n                }\n              } else if (useCache && (cache = (elem[expando] || (elem[expando] = {}))[type]) && cache[0] === dirruns) {\n                diff = cache[1];\n              } else {\n                while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {\n                  if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {\n                    if (useCache) {\n                      (node[expando] || (node[expando] = {}))[type] = [\n                        dirruns,\n                        diff\n                      ];\n                    }\n                    if (node === elem) {\n                      break;\n                    }\n                  }\n                }\n              }\n              diff -= last;\n              return diff === first || diff % first === 0 && diff / first >= 0;\n            }\n          };\n        },\n        PSEUDO: function (pseudo, argument) {\n          var args, fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error('unsupported pseudo: ' + pseudo);\n          if (fn[expando]) {\n            return fn(argument);\n          }\n          if (fn.length > 1) {\n            args = [\n              pseudo,\n              pseudo,\n              '',\n              argument\n            ];\n            return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {\n              var idx, matched = fn(seed, argument), i = matched.length;\n              while (i--) {\n                idx = indexOf$2.call(seed, matched[i]);\n                seed[idx] = !(matches[idx] = matched[i]);\n              }\n            }) : function (elem) {\n              return fn(elem, 0, args);\n            };\n          }\n          return fn;\n        }\n      },\n      pseudos: {\n        not: markFunction(function (selector) {\n          var input = [], results = [], matcher = compile(selector.replace(rtrim, '$1'));\n          return matcher[expando] ? markFunction(function (seed, matches, context, xml) {\n            var elem, unmatched = matcher(seed, null, xml, []), i = seed.length;\n            while (i--) {\n              if (elem = unmatched[i]) {\n                seed[i] = !(matches[i] = elem);\n              }\n            }\n          }) : function (elem, context, xml) {\n            input[0] = elem;\n            matcher(input, null, xml, results);\n            return !results.pop();\n          };\n        }),\n        has: markFunction(function (selector) {\n          return function (elem) {\n            return Sizzle(selector, elem).length > 0;\n          };\n        }),\n        contains: markFunction(function (text) {\n          text = text.replace(runescape, funescape);\n          return function (elem) {\n            return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;\n          };\n        }),\n        lang: markFunction(function (lang) {\n          if (!ridentifier.test(lang || '')) {\n            Sizzle.error('unsupported lang: ' + lang);\n          }\n          lang = lang.replace(runescape, funescape).toLowerCase();\n          return function (elem) {\n            var elemLang;\n            do {\n              if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute('xml:lang') || elem.getAttribute('lang')) {\n                elemLang = elemLang.toLowerCase();\n                return elemLang === lang || elemLang.indexOf(lang + '-') === 0;\n              }\n            } while ((elem = elem.parentNode) && elem.nodeType === 1);\n            return false;\n          };\n        }),\n        target: function (elem) {\n          var hash = domGlobals.window.location && domGlobals.window.location.hash;\n          return hash && hash.slice(1) === elem.id;\n        },\n        root: function (elem) {\n          return elem === docElem;\n        },\n        focus: function (elem) {\n          return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n        },\n        enabled: function (elem) {\n          return elem.disabled === false;\n        },\n        disabled: function (elem) {\n          return elem.disabled === true;\n        },\n        checked: function (elem) {\n          var nodeName = elem.nodeName.toLowerCase();\n          return nodeName === 'input' && !!elem.checked || nodeName === 'option' && !!elem.selected;\n        },\n        selected: function (elem) {\n          if (elem.parentNode) {\n            elem.parentNode.selectedIndex;\n          }\n          return elem.selected === true;\n        },\n        empty: function (elem) {\n          for (elem = elem.firstChild; elem; elem = elem.nextSibling) {\n            if (elem.nodeType < 6) {\n              return false;\n            }\n          }\n          return true;\n        },\n        parent: function (elem) {\n          return !Expr.pseudos.empty(elem);\n        },\n        header: function (elem) {\n          return rheader.test(elem.nodeName);\n        },\n        input: function (elem) {\n          return rinputs.test(elem.nodeName);\n        },\n        button: function (elem) {\n          var name = elem.nodeName.toLowerCase();\n          return name === 'input' && elem.type === 'button' || name === 'button';\n        },\n        text: function (elem) {\n          var attr;\n          return elem.nodeName.toLowerCase() === 'input' && elem.type === 'text' && ((attr = elem.getAttribute('type')) == null || attr.toLowerCase() === 'text');\n        },\n        first: createPositionalPseudo(function () {\n          return [0];\n        }),\n        last: createPositionalPseudo(function (matchIndexes, length) {\n          return [length - 1];\n        }),\n        eq: createPositionalPseudo(function (matchIndexes, length, argument) {\n          return [argument < 0 ? argument + length : argument];\n        }),\n        even: createPositionalPseudo(function (matchIndexes, length) {\n          var i = 0;\n          for (; i < length; i += 2) {\n            matchIndexes.push(i);\n          }\n          return matchIndexes;\n        }),\n        odd: createPositionalPseudo(function (matchIndexes, length) {\n          var i = 1;\n          for (; i < length; i += 2) {\n            matchIndexes.push(i);\n          }\n          return matchIndexes;\n        }),\n        lt: createPositionalPseudo(function (matchIndexes, length, argument) {\n          var i = argument < 0 ? argument + length : argument;\n          for (; --i >= 0;) {\n            matchIndexes.push(i);\n          }\n          return matchIndexes;\n        }),\n        gt: createPositionalPseudo(function (matchIndexes, length, argument) {\n          var i = argument < 0 ? argument + length : argument;\n          for (; ++i < length;) {\n            matchIndexes.push(i);\n          }\n          return matchIndexes;\n        })\n      }\n    };\n    Expr.pseudos.nth = Expr.pseudos.eq;\n    for (i in {\n        radio: true,\n        checkbox: true,\n        file: true,\n        password: true,\n        image: true\n      }) {\n      Expr.pseudos[i] = createInputPseudo(i);\n    }\n    for (i in {\n        submit: true,\n        reset: true\n      }) {\n      Expr.pseudos[i] = createButtonPseudo(i);\n    }\n    function setFilters() {\n    }\n    setFilters.prototype = Expr.filters = Expr.pseudos;\n    Expr.setFilters = new setFilters();\n    tokenize = Sizzle.tokenize = function (selector, parseOnly) {\n      var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[selector + ' '];\n      if (cached) {\n        return parseOnly ? 0 : cached.slice(0);\n      }\n      soFar = selector;\n      groups = [];\n      preFilters = Expr.preFilter;\n      while (soFar) {\n        if (!matched || (match = rcomma.exec(soFar))) {\n          if (match) {\n            soFar = soFar.slice(match[0].length) || soFar;\n          }\n          groups.push(tokens = []);\n        }\n        matched = false;\n        if (match = rcombinators.exec(soFar)) {\n          matched = match.shift();\n          tokens.push({\n            value: matched,\n            type: match[0].replace(rtrim, ' ')\n          });\n          soFar = soFar.slice(matched.length);\n        }\n        for (type in Expr.filter) {\n          if (!Expr.filter.hasOwnProperty(type))\n            continue;\n          if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {\n            matched = match.shift();\n            tokens.push({\n              value: matched,\n              type: type,\n              matches: match\n            });\n            soFar = soFar.slice(matched.length);\n          }\n        }\n        if (!matched) {\n          break;\n        }\n      }\n      return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) : tokenCache(selector, groups).slice(0);\n    };\n    function toSelector(tokens) {\n      var i = 0, len = tokens.length, selector = '';\n      for (; i < len; i++) {\n        selector += tokens[i].value;\n      }\n      return selector;\n    }\n    function addCombinator(matcher, combinator, base) {\n      var dir = combinator.dir, checkNonElements = base && dir === 'parentNode', doneName = done++;\n      return combinator.first ? function (elem, context, xml) {\n        while (elem = elem[dir]) {\n          if (elem.nodeType === 1 || checkNonElements) {\n            return matcher(elem, context, xml);\n          }\n        }\n      } : function (elem, context, xml) {\n        var oldCache, outerCache, newCache = [\n            dirruns,\n            doneName\n          ];\n        if (xml) {\n          while (elem = elem[dir]) {\n            if (elem.nodeType === 1 || checkNonElements) {\n              if (matcher(elem, context, xml)) {\n                return true;\n              }\n            }\n          }\n        } else {\n          while (elem = elem[dir]) {\n            if (elem.nodeType === 1 || checkNonElements) {\n              outerCache = elem[expando] || (elem[expando] = {});\n              if ((oldCache = outerCache[dir]) && oldCache[0] === dirruns && oldCache[1] === doneName) {\n                return newCache[2] = oldCache[2];\n              } else {\n                outerCache[dir] = newCache;\n                if (newCache[2] = matcher(elem, context, xml)) {\n                  return true;\n                }\n              }\n            }\n          }\n        }\n      };\n    }\n    function elementMatcher(matchers) {\n      return matchers.length > 1 ? function (elem, context, xml) {\n        var i = matchers.length;\n        while (i--) {\n          if (!matchers[i](elem, context, xml)) {\n            return false;\n          }\n        }\n        return true;\n      } : matchers[0];\n    }\n    function multipleContexts(selector, contexts, results) {\n      var i = 0, len = contexts.length;\n      for (; i < len; i++) {\n        Sizzle(selector, contexts[i], results);\n      }\n      return results;\n    }\n    function condense(unmatched, map, filter, context, xml) {\n      var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null;\n      for (; i < len; i++) {\n        if (elem = unmatched[i]) {\n          if (!filter || filter(elem, context, xml)) {\n            newUnmatched.push(elem);\n            if (mapped) {\n              map.push(i);\n            }\n          }\n        }\n      }\n      return newUnmatched;\n    }\n    function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {\n      if (postFilter && !postFilter[expando]) {\n        postFilter = setMatcher(postFilter);\n      }\n      if (postFinder && !postFinder[expando]) {\n        postFinder = setMatcher(postFinder, postSelector);\n      }\n      return markFunction(function (seed, results, context, xml) {\n        var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, elems = seed || multipleContexts(selector || '*', context.nodeType ? [context] : context, []), matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems, matcherOut = matcher ? postFinder || (seed ? preFilter : preexisting || postFilter) ? [] : results : matcherIn;\n        if (matcher) {\n          matcher(matcherIn, matcherOut, context, xml);\n        }\n        if (postFilter) {\n          temp = condense(matcherOut, postMap);\n          postFilter(temp, [], context, xml);\n          i = temp.length;\n          while (i--) {\n            if (elem = temp[i]) {\n              matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);\n            }\n          }\n        }\n        if (seed) {\n          if (postFinder || preFilter) {\n            if (postFinder) {\n              temp = [];\n              i = matcherOut.length;\n              while (i--) {\n                if (elem = matcherOut[i]) {\n                  temp.push(matcherIn[i] = elem);\n                }\n              }\n              postFinder(null, matcherOut = [], temp, xml);\n            }\n            i = matcherOut.length;\n            while (i--) {\n              if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf$2.call(seed, elem) : preMap[i]) > -1) {\n                seed[temp] = !(results[temp] = elem);\n              }\n            }\n          }\n        } else {\n          matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);\n          if (postFinder) {\n            postFinder(null, results, matcherOut, xml);\n          } else {\n            push.apply(results, matcherOut);\n          }\n        }\n      });\n    }\n    function matcherFromTokens(tokens) {\n      var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[tokens[0].type], implicitRelative = leadingRelative || Expr.relative[' '], i = leadingRelative ? 1 : 0, matchContext = addCombinator(function (elem) {\n          return elem === checkContext;\n        }, implicitRelative, true), matchAnyContext = addCombinator(function (elem) {\n          return indexOf$2.call(checkContext, elem) > -1;\n        }, implicitRelative, true), matchers = [function (elem, context, xml) {\n            return !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));\n          }];\n      for (; i < len; i++) {\n        if (matcher = Expr.relative[tokens[i].type]) {\n          matchers = [addCombinator(elementMatcher(matchers), matcher)];\n        } else {\n          matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);\n          if (matcher[expando]) {\n            j = ++i;\n            for (; j < len; j++) {\n              if (Expr.relative[tokens[j].type]) {\n                break;\n              }\n            }\n            return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === ' ' ? '*' : '' })).replace(rtrim, '$1'), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));\n          }\n          matchers.push(matcher);\n        }\n      }\n      return elementMatcher(matchers);\n    }\n    function matcherFromGroupMatchers(elementMatchers, setMatchers) {\n      var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function (seed, context, xml, results, outermost) {\n          var elem, j, matcher, matchedCount = 0, i = '0', unmatched = seed && [], setMatched = [], contextBackup = outermostContext, elems = seed || byElement && Expr.find.TAG('*', outermost), dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1, len = elems.length;\n          if (outermost) {\n            outermostContext = context !== document && context;\n          }\n          for (; i !== len && (elem = elems[i]) != null; i++) {\n            if (byElement && elem) {\n              j = 0;\n              while (matcher = elementMatchers[j++]) {\n                if (matcher(elem, context, xml)) {\n                  results.push(elem);\n                  break;\n                }\n              }\n              if (outermost) {\n                dirruns = dirrunsUnique;\n              }\n            }\n            if (bySet) {\n              if (elem = !matcher && elem) {\n                matchedCount--;\n              }\n              if (seed) {\n                unmatched.push(elem);\n              }\n            }\n          }\n          matchedCount += i;\n          if (bySet && i !== matchedCount) {\n            j = 0;\n            while (matcher = setMatchers[j++]) {\n              matcher(unmatched, setMatched, context, xml);\n            }\n            if (seed) {\n              if (matchedCount > 0) {\n                while (i--) {\n                  if (!(unmatched[i] || setMatched[i])) {\n                    setMatched[i] = pop.call(results);\n                  }\n                }\n              }\n              setMatched = condense(setMatched);\n            }\n            push.apply(results, setMatched);\n            if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {\n              Sizzle.uniqueSort(results);\n            }\n          }\n          if (outermost) {\n            dirruns = dirrunsUnique;\n            outermostContext = contextBackup;\n          }\n          return unmatched;\n        };\n      return bySet ? markFunction(superMatcher) : superMatcher;\n    }\n    compile = Sizzle.compile = function (selector, match) {\n      var i, setMatchers = [], elementMatchers = [], cached = compilerCache[selector + ' '];\n      if (!cached) {\n        if (!match) {\n          match = tokenize(selector);\n        }\n        i = match.length;\n        while (i--) {\n          cached = matcherFromTokens(match[i]);\n          if (cached[expando]) {\n            setMatchers.push(cached);\n          } else {\n            elementMatchers.push(cached);\n          }\n        }\n        cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));\n        cached.selector = selector;\n      }\n      return cached;\n    };\n    select = Sizzle.select = function (selector, context, results, seed) {\n      var i, tokens, token, type, find, compiled = typeof selector === 'function' && selector, match = !seed && tokenize(selector = compiled.selector || selector);\n      results = results || [];\n      if (match.length === 1) {\n        tokens = match[0] = match[0].slice(0);\n        if (tokens.length > 2 && (token = tokens[0]).type === 'ID' && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {\n          context = (Expr.find.ID(token.matches[0].replace(runescape, funescape), context) || [])[0];\n          if (!context) {\n            return results;\n          } else if (compiled) {\n            context = context.parentNode;\n          }\n          selector = selector.slice(tokens.shift().value.length);\n        }\n        i = matchExpr.needsContext.test(selector) ? 0 : tokens.length;\n        while (i--) {\n          token = tokens[i];\n          if (Expr.relative[type = token.type]) {\n            break;\n          }\n          if (find = Expr.find[type]) {\n            if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {\n              tokens.splice(i, 1);\n              selector = seed.length && toSelector(tokens);\n              if (!selector) {\n                push.apply(results, seed);\n                return results;\n              }\n              break;\n            }\n          }\n        }\n      }\n      (compiled || compile(selector, match))(seed, context, !documentIsHTML, results, rsibling.test(selector) && testContext(context.parentNode) || context);\n      return results;\n    };\n    support.sortStable = expando.split('').sort(sortOrder).join('') === expando;\n    support.detectDuplicates = !!hasDuplicate;\n    setDocument();\n    support.sortDetached = true;\n\n    var doc = domGlobals.document, push$1 = Array.prototype.push, slice$1 = Array.prototype.slice;\n    var rquickExpr$1 = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/;\n    var Event = EventUtils.Event;\n    var skipUniques = Tools.makeMap('children,contents,next,prev');\n    var isDefined = function (obj) {\n      return typeof obj !== 'undefined';\n    };\n    var isString$1 = function (obj) {\n      return typeof obj === 'string';\n    };\n    var isWindow = function (obj) {\n      return obj && obj === obj.window;\n    };\n    var createFragment = function (html, fragDoc) {\n      var frag, node, container;\n      fragDoc = fragDoc || doc;\n      container = fragDoc.createElement('div');\n      frag = fragDoc.createDocumentFragment();\n      container.innerHTML = html;\n      while (node = container.firstChild) {\n        frag.appendChild(node);\n      }\n      return frag;\n    };\n    var domManipulate = function (targetNodes, sourceItem, callback, reverse) {\n      var i;\n      if (isString$1(sourceItem)) {\n        sourceItem = createFragment(sourceItem, getElementDocument(targetNodes[0]));\n      } else if (sourceItem.length && !sourceItem.nodeType) {\n        sourceItem = DomQuery.makeArray(sourceItem);\n        if (reverse) {\n          for (i = sourceItem.length - 1; i >= 0; i--) {\n            domManipulate(targetNodes, sourceItem[i], callback, reverse);\n          }\n        } else {\n          for (i = 0; i < sourceItem.length; i++) {\n            domManipulate(targetNodes, sourceItem[i], callback, reverse);\n          }\n        }\n        return targetNodes;\n      }\n      if (sourceItem.nodeType) {\n        i = targetNodes.length;\n        while (i--) {\n          callback.call(targetNodes[i], sourceItem);\n        }\n      }\n      return targetNodes;\n    };\n    var hasClass = function (node, className) {\n      return node && className && (' ' + node.className + ' ').indexOf(' ' + className + ' ') !== -1;\n    };\n    var wrap$1 = function (elements, wrapper, all) {\n      var lastParent, newWrapper;\n      wrapper = DomQuery(wrapper)[0];\n      elements.each(function () {\n        var self = this;\n        if (!all || lastParent !== self.parentNode) {\n          lastParent = self.parentNode;\n          newWrapper = wrapper.cloneNode(false);\n          self.parentNode.insertBefore(newWrapper, self);\n          newWrapper.appendChild(self);\n        } else {\n          newWrapper.appendChild(self);\n        }\n      });\n      return elements;\n    };\n    var numericCssMap = Tools.makeMap('fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom', ' ');\n    var booleanMap = Tools.makeMap('checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected', ' ');\n    var propFix = {\n      for: 'htmlFor',\n      class: 'className',\n      readonly: 'readOnly'\n    };\n    var cssFix = { float: 'cssFloat' };\n    var attrHooks = {}, cssHooks = {};\n    var DomQueryConstructor = function (selector, context) {\n      return new DomQuery.fn.init(selector, context);\n    };\n    var inArray$1 = function (item, array) {\n      var i;\n      if (array.indexOf) {\n        return array.indexOf(item);\n      }\n      i = array.length;\n      while (i--) {\n        if (array[i] === item) {\n          return i;\n        }\n      }\n      return -1;\n    };\n    var whiteSpaceRegExp$1 = /^\\s*|\\s*$/g;\n    var trim$2 = function (str) {\n      return str === null || str === undefined ? '' : ('' + str).replace(whiteSpaceRegExp$1, '');\n    };\n    var each$4 = function (obj, callback) {\n      var length, key, i, value;\n      if (obj) {\n        length = obj.length;\n        if (length === undefined) {\n          for (key in obj) {\n            if (obj.hasOwnProperty(key)) {\n              value = obj[key];\n              if (callback.call(value, key, value) === false) {\n                break;\n              }\n            }\n          }\n        } else {\n          for (i = 0; i < length; i++) {\n            value = obj[i];\n            if (callback.call(value, i, value) === false) {\n              break;\n            }\n          }\n        }\n      }\n      return obj;\n    };\n    var grep = function (array, callback) {\n      var out = [];\n      each$4(array, function (i, item) {\n        if (callback(item, i)) {\n          out.push(item);\n        }\n      });\n      return out;\n    };\n    var getElementDocument = function (element) {\n      if (!element) {\n        return doc;\n      }\n      if (element.nodeType === 9) {\n        return element;\n      }\n      return element.ownerDocument;\n    };\n    DomQueryConstructor.fn = DomQueryConstructor.prototype = {\n      constructor: DomQueryConstructor,\n      selector: '',\n      context: null,\n      length: 0,\n      init: function (selector, context) {\n        var self = this;\n        var match, node;\n        if (!selector) {\n          return self;\n        }\n        if (selector.nodeType) {\n          self.context = self[0] = selector;\n          self.length = 1;\n          return self;\n        }\n        if (context && context.nodeType) {\n          self.context = context;\n        } else {\n          if (context) {\n            return DomQuery(selector).attr(context);\n          }\n          self.context = context = domGlobals.document;\n        }\n        if (isString$1(selector)) {\n          self.selector = selector;\n          if (selector.charAt(0) === '<' && selector.charAt(selector.length - 1) === '>' && selector.length >= 3) {\n            match = [\n              null,\n              selector,\n              null\n            ];\n          } else {\n            match = rquickExpr$1.exec(selector);\n          }\n          if (match) {\n            if (match[1]) {\n              node = createFragment(selector, getElementDocument(context)).firstChild;\n              while (node) {\n                push$1.call(self, node);\n                node = node.nextSibling;\n              }\n            } else {\n              node = getElementDocument(context).getElementById(match[2]);\n              if (!node) {\n                return self;\n              }\n              if (node.id !== match[2]) {\n                return self.find(selector);\n              }\n              self.length = 1;\n              self[0] = node;\n            }\n          } else {\n            return DomQuery(context).find(selector);\n          }\n        } else {\n          this.add(selector, false);\n        }\n        return self;\n      },\n      toArray: function () {\n        return Tools.toArray(this);\n      },\n      add: function (items, sort) {\n        var self = this;\n        var nodes, i;\n        if (isString$1(items)) {\n          return self.add(DomQuery(items));\n        }\n        if (sort !== false) {\n          nodes = DomQuery.unique(self.toArray().concat(DomQuery.makeArray(items)));\n          self.length = nodes.length;\n          for (i = 0; i < nodes.length; i++) {\n            self[i] = nodes[i];\n          }\n        } else {\n          push$1.apply(self, DomQuery.makeArray(items));\n        }\n        return self;\n      },\n      attr: function (name, value) {\n        var self = this;\n        var hook;\n        if (typeof name === 'object') {\n          each$4(name, function (name, value) {\n            self.attr(name, value);\n          });\n        } else if (isDefined(value)) {\n          this.each(function () {\n            var hook;\n            if (this.nodeType === 1) {\n              hook = attrHooks[name];\n              if (hook && hook.set) {\n                hook.set(this, value);\n                return;\n              }\n              if (value === null) {\n                this.removeAttribute(name, 2);\n              } else {\n                this.setAttribute(name, value, 2);\n              }\n            }\n          });\n        } else {\n          if (self[0] && self[0].nodeType === 1) {\n            hook = attrHooks[name];\n            if (hook && hook.get) {\n              return hook.get(self[0], name);\n            }\n            if (booleanMap[name]) {\n              return self.prop(name) ? name : undefined;\n            }\n            value = self[0].getAttribute(name, 2);\n            if (value === null) {\n              value = undefined;\n            }\n          }\n          return value;\n        }\n        return self;\n      },\n      removeAttr: function (name) {\n        return this.attr(name, null);\n      },\n      prop: function (name, value) {\n        var self = this;\n        name = propFix[name] || name;\n        if (typeof name === 'object') {\n          each$4(name, function (name, value) {\n            self.prop(name, value);\n          });\n        } else if (isDefined(value)) {\n          this.each(function () {\n            if (this.nodeType === 1) {\n              this[name] = value;\n            }\n          });\n        } else {\n          if (self[0] && self[0].nodeType && name in self[0]) {\n            return self[0][name];\n          }\n          return value;\n        }\n        return self;\n      },\n      css: function (name, value) {\n        var self = this;\n        var elm, hook;\n        var camel = function (name) {\n          return name.replace(/-(\\D)/g, function (a, b) {\n            return b.toUpperCase();\n          });\n        };\n        var dashed = function (name) {\n          return name.replace(/[A-Z]/g, function (a) {\n            return '-' + a;\n          });\n        };\n        if (typeof name === 'object') {\n          each$4(name, function (name, value) {\n            self.css(name, value);\n          });\n        } else {\n          if (isDefined(value)) {\n            name = camel(name);\n            if (typeof value === 'number' && !numericCssMap[name]) {\n              value = value.toString() + 'px';\n            }\n            self.each(function () {\n              var style = this.style;\n              hook = cssHooks[name];\n              if (hook && hook.set) {\n                hook.set(this, value);\n                return;\n              }\n              try {\n                this.style[cssFix[name] || name] = value;\n              } catch (ex) {\n              }\n              if (value === null || value === '') {\n                if (style.removeProperty) {\n                  style.removeProperty(dashed(name));\n                } else {\n                  style.removeAttribute(name);\n                }\n              }\n            });\n          } else {\n            elm = self[0];\n            hook = cssHooks[name];\n            if (hook && hook.get) {\n              return hook.get(elm);\n            }\n            if (elm.ownerDocument.defaultView) {\n              try {\n                return elm.ownerDocument.defaultView.getComputedStyle(elm, null).getPropertyValue(dashed(name));\n              } catch (ex) {\n                return undefined;\n              }\n            } else if (elm.currentStyle) {\n              return elm.currentStyle[camel(name)];\n            } else {\n              return '';\n            }\n          }\n        }\n        return self;\n      },\n      remove: function () {\n        var self = this;\n        var node, i = this.length;\n        while (i--) {\n          node = self[i];\n          Event.clean(node);\n          if (node.parentNode) {\n            node.parentNode.removeChild(node);\n          }\n        }\n        return this;\n      },\n      empty: function () {\n        var self = this;\n        var node, i = this.length;\n        while (i--) {\n          node = self[i];\n          while (node.firstChild) {\n            node.removeChild(node.firstChild);\n          }\n        }\n        return this;\n      },\n      html: function (value) {\n        var self = this;\n        var i;\n        if (isDefined(value)) {\n          i = self.length;\n          try {\n            while (i--) {\n              self[i].innerHTML = value;\n            }\n          } catch (ex) {\n            DomQuery(self[i]).empty().append(value);\n          }\n          return self;\n        }\n        return self[0] ? self[0].innerHTML : '';\n      },\n      text: function (value) {\n        var self = this;\n        var i;\n        if (isDefined(value)) {\n          i = self.length;\n          while (i--) {\n            if ('innerText' in self[i]) {\n              self[i].innerText = value;\n            } else {\n              self[0].textContent = value;\n            }\n          }\n          return self;\n        }\n        return self[0] ? self[0].innerText || self[0].textContent : '';\n      },\n      append: function () {\n        return domManipulate(this, arguments, function (node) {\n          if (this.nodeType === 1 || this.host && this.host.nodeType === 1) {\n            this.appendChild(node);\n          }\n        });\n      },\n      prepend: function () {\n        return domManipulate(this, arguments, function (node) {\n          if (this.nodeType === 1 || this.host && this.host.nodeType === 1) {\n            this.insertBefore(node, this.firstChild);\n          }\n        }, true);\n      },\n      before: function () {\n        var self = this;\n        if (self[0] && self[0].parentNode) {\n          return domManipulate(self, arguments, function (node) {\n            this.parentNode.insertBefore(node, this);\n          });\n        }\n        return self;\n      },\n      after: function () {\n        var self = this;\n        if (self[0] && self[0].parentNode) {\n          return domManipulate(self, arguments, function (node) {\n            this.parentNode.insertBefore(node, this.nextSibling);\n          }, true);\n        }\n        return self;\n      },\n      appendTo: function (val) {\n        DomQuery(val).append(this);\n        return this;\n      },\n      prependTo: function (val) {\n        DomQuery(val).prepend(this);\n        return this;\n      },\n      replaceWith: function (content) {\n        return this.before(content).remove();\n      },\n      wrap: function (content) {\n        return wrap$1(this, content);\n      },\n      wrapAll: function (content) {\n        return wrap$1(this, content, true);\n      },\n      wrapInner: function (content) {\n        this.each(function () {\n          DomQuery(this).contents().wrapAll(content);\n        });\n        return this;\n      },\n      unwrap: function () {\n        return this.parent().each(function () {\n          DomQuery(this).replaceWith(this.childNodes);\n        });\n      },\n      clone: function () {\n        var result = [];\n        this.each(function () {\n          result.push(this.cloneNode(true));\n        });\n        return DomQuery(result);\n      },\n      addClass: function (className) {\n        return this.toggleClass(className, true);\n      },\n      removeClass: function (className) {\n        return this.toggleClass(className, false);\n      },\n      toggleClass: function (className, state) {\n        var self = this;\n        if (typeof className !== 'string') {\n          return self;\n        }\n        if (className.indexOf(' ') !== -1) {\n          each$4(className.split(' '), function () {\n            self.toggleClass(this, state);\n          });\n        } else {\n          self.each(function (index, node) {\n            var existingClassName, classState;\n            classState = hasClass(node, className);\n            if (classState !== state) {\n              existingClassName = node.className;\n              if (classState) {\n                node.className = trim$2((' ' + existingClassName + ' ').replace(' ' + className + ' ', ' '));\n              } else {\n                node.className += existingClassName ? ' ' + className : className;\n              }\n            }\n          });\n        }\n        return self;\n      },\n      hasClass: function (className) {\n        return hasClass(this[0], className);\n      },\n      each: function (callback) {\n        return each$4(this, callback);\n      },\n      on: function (name, callback) {\n        return this.each(function () {\n          Event.bind(this, name, callback);\n        });\n      },\n      off: function (name, callback) {\n        return this.each(function () {\n          Event.unbind(this, name, callback);\n        });\n      },\n      trigger: function (name) {\n        return this.each(function () {\n          if (typeof name === 'object') {\n            Event.fire(this, name.type, name);\n          } else {\n            Event.fire(this, name);\n          }\n        });\n      },\n      show: function () {\n        return this.css('display', '');\n      },\n      hide: function () {\n        return this.css('display', 'none');\n      },\n      slice: function () {\n        return new DomQuery(slice$1.apply(this, arguments));\n      },\n      eq: function (index) {\n        return index === -1 ? this.slice(index) : this.slice(index, +index + 1);\n      },\n      first: function () {\n        return this.eq(0);\n      },\n      last: function () {\n        return this.eq(-1);\n      },\n      find: function (selector) {\n        var i, l;\n        var ret = [];\n        for (i = 0, l = this.length; i < l; i++) {\n          DomQuery.find(selector, this[i], ret);\n        }\n        return DomQuery(ret);\n      },\n      filter: function (selector) {\n        if (typeof selector === 'function') {\n          return DomQuery(grep(this.toArray(), function (item, i) {\n            return selector(i, item);\n          }));\n        }\n        return DomQuery(DomQuery.filter(selector, this.toArray()));\n      },\n      closest: function (selector) {\n        var result = [];\n        if (selector instanceof DomQuery) {\n          selector = selector[0];\n        }\n        this.each(function (i, node) {\n          while (node) {\n            if (typeof selector === 'string' && DomQuery(node).is(selector)) {\n              result.push(node);\n              break;\n            } else if (node === selector) {\n              result.push(node);\n              break;\n            }\n            node = node.parentNode;\n          }\n        });\n        return DomQuery(result);\n      },\n      offset: function (offset) {\n        var elm, doc, docElm;\n        var x = 0, y = 0, pos;\n        if (!offset) {\n          elm = this[0];\n          if (elm) {\n            doc = elm.ownerDocument;\n            docElm = doc.documentElement;\n            if (elm.getBoundingClientRect) {\n              pos = elm.getBoundingClientRect();\n              x = pos.left + (docElm.scrollLeft || doc.body.scrollLeft) - docElm.clientLeft;\n              y = pos.top + (docElm.scrollTop || doc.body.scrollTop) - docElm.clientTop;\n            }\n          }\n          return {\n            left: x,\n            top: y\n          };\n        }\n        return this.css(offset);\n      },\n      push: push$1,\n      sort: Array.prototype.sort,\n      splice: Array.prototype.splice\n    };\n    Tools.extend(DomQueryConstructor, {\n      extend: Tools.extend,\n      makeArray: function (object) {\n        if (isWindow(object) || object.nodeType) {\n          return [object];\n        }\n        return Tools.toArray(object);\n      },\n      inArray: inArray$1,\n      isArray: Tools.isArray,\n      each: each$4,\n      trim: trim$2,\n      grep: grep,\n      find: Sizzle,\n      expr: Sizzle.selectors,\n      unique: Sizzle.uniqueSort,\n      text: Sizzle.getText,\n      contains: Sizzle.contains,\n      filter: function (expr, elems, not) {\n        var i = elems.length;\n        if (not) {\n          expr = ':not(' + expr + ')';\n        }\n        while (i--) {\n          if (elems[i].nodeType !== 1) {\n            elems.splice(i, 1);\n          }\n        }\n        if (elems.length === 1) {\n          elems = DomQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : [];\n        } else {\n          elems = DomQuery.find.matches(expr, elems);\n        }\n        return elems;\n      }\n    });\n    var dir = function (el, prop, until) {\n      var matched = [];\n      var cur = el[prop];\n      if (typeof until !== 'string' && until instanceof DomQuery) {\n        until = until[0];\n      }\n      while (cur && cur.nodeType !== 9) {\n        if (until !== undefined) {\n          if (cur === until) {\n            break;\n          }\n          if (typeof until === 'string' && DomQuery(cur).is(until)) {\n            break;\n          }\n        }\n        if (cur.nodeType === 1) {\n          matched.push(cur);\n        }\n        cur = cur[prop];\n      }\n      return matched;\n    };\n    var sibling = function (node, siblingName, nodeType, until) {\n      var result = [];\n      if (until instanceof DomQuery) {\n        until = until[0];\n      }\n      for (; node; node = node[siblingName]) {\n        if (nodeType && node.nodeType !== nodeType) {\n          continue;\n        }\n        if (until !== undefined) {\n          if (node === until) {\n            break;\n          }\n          if (typeof until === 'string' && DomQuery(node).is(until)) {\n            break;\n          }\n        }\n        result.push(node);\n      }\n      return result;\n    };\n    var firstSibling = function (node, siblingName, nodeType) {\n      for (node = node[siblingName]; node; node = node[siblingName]) {\n        if (node.nodeType === nodeType) {\n          return node;\n        }\n      }\n      return null;\n    };\n    each$4({\n      parent: function (node) {\n        var parent = node.parentNode;\n        return parent && parent.nodeType !== 11 ? parent : null;\n      },\n      parents: function (node) {\n        return dir(node, 'parentNode');\n      },\n      next: function (node) {\n        return firstSibling(node, 'nextSibling', 1);\n      },\n      prev: function (node) {\n        return firstSibling(node, 'previousSibling', 1);\n      },\n      children: function (node) {\n        return sibling(node.firstChild, 'nextSibling', 1);\n      },\n      contents: function (node) {\n        return Tools.toArray((node.nodeName === 'iframe' ? node.contentDocument || node.contentWindow.document : node).childNodes);\n      }\n    }, function (name, fn) {\n      DomQueryConstructor.fn[name] = function (selector) {\n        var self = this;\n        var result = [];\n        self.each(function () {\n          var nodes = fn.call(result, this, selector, result);\n          if (nodes) {\n            if (DomQuery.isArray(nodes)) {\n              result.push.apply(result, nodes);\n            } else {\n              result.push(nodes);\n            }\n          }\n        });\n        if (this.length > 1) {\n          if (!skipUniques[name]) {\n            result = DomQuery.unique(result);\n          }\n          if (name.indexOf('parents') === 0) {\n            result = result.reverse();\n          }\n        }\n        var wrappedResult = DomQuery(result);\n        if (selector) {\n          return wrappedResult.filter(selector);\n        }\n        return wrappedResult;\n      };\n    });\n    each$4({\n      parentsUntil: function (node, until) {\n        return dir(node, 'parentNode', until);\n      },\n      nextUntil: function (node, until) {\n        return sibling(node, 'nextSibling', 1, until).slice(1);\n      },\n      prevUntil: function (node, until) {\n        return sibling(node, 'previousSibling', 1, until).slice(1);\n      }\n    }, function (name, fn) {\n      DomQueryConstructor.fn[name] = function (selector, filter) {\n        var self = this;\n        var result = [];\n        self.each(function () {\n          var nodes = fn.call(result, this, selector, result);\n          if (nodes) {\n            if (DomQuery.isArray(nodes)) {\n              result.push.apply(result, nodes);\n            } else {\n              result.push(nodes);\n            }\n          }\n        });\n        if (this.length > 1) {\n          result = DomQuery.unique(result);\n          if (name.indexOf('parents') === 0 || name === 'prevUntil') {\n            result = result.reverse();\n          }\n        }\n        var wrappedResult = DomQuery(result);\n        if (filter) {\n          return wrappedResult.filter(filter);\n        }\n        return wrappedResult;\n      };\n    });\n    DomQueryConstructor.fn.is = function (selector) {\n      return !!selector && this.filter(selector).length > 0;\n    };\n    DomQueryConstructor.fn.init.prototype = DomQueryConstructor.fn;\n    DomQueryConstructor.overrideDefaults = function (callback) {\n      var defaults;\n      var sub = function (selector, context) {\n        defaults = defaults || callback();\n        if (arguments.length === 0) {\n          selector = defaults.element;\n        }\n        if (!context) {\n          context = defaults.context;\n        }\n        return new sub.fn.init(selector, context);\n      };\n      DomQuery.extend(sub, this);\n      return sub;\n    };\n    DomQueryConstructor.attrHooks = attrHooks;\n    DomQueryConstructor.cssHooks = cssHooks;\n    var DomQuery = DomQueryConstructor;\n\n    var TreeWalker = function () {\n      function TreeWalker(startNode, rootNode) {\n        this.node = startNode;\n        this.rootNode = rootNode;\n        this.current = this.current.bind(this);\n        this.next = this.next.bind(this);\n        this.prev = this.prev.bind(this);\n        this.prev2 = this.prev2.bind(this);\n      }\n      TreeWalker.prototype.current = function () {\n        return this.node;\n      };\n      TreeWalker.prototype.next = function (shallow) {\n        this.node = this.findSibling(this.node, 'firstChild', 'nextSibling', shallow);\n        return this.node;\n      };\n      TreeWalker.prototype.prev = function (shallow) {\n        this.node = this.findSibling(this.node, 'lastChild', 'previousSibling', shallow);\n        return this.node;\n      };\n      TreeWalker.prototype.prev2 = function (shallow) {\n        this.node = this.findPreviousNode(this.node, 'lastChild', 'previousSibling', shallow);\n        return this.node;\n      };\n      TreeWalker.prototype.findSibling = function (node, startName, siblingName, shallow) {\n        var sibling, parent;\n        if (node) {\n          if (!shallow && node[startName]) {\n            return node[startName];\n          }\n          if (node !== this.rootNode) {\n            sibling = node[siblingName];\n            if (sibling) {\n              return sibling;\n            }\n            for (parent = node.parentNode; parent && parent !== this.rootNode; parent = parent.parentNode) {\n              sibling = parent[siblingName];\n              if (sibling) {\n                return sibling;\n              }\n            }\n          }\n        }\n      };\n      TreeWalker.prototype.findPreviousNode = function (node, startName, siblingName, shallow) {\n        var sibling, parent, child;\n        if (node) {\n          sibling = node[siblingName];\n          if (this.rootNode && sibling === this.rootNode) {\n            return;\n          }\n          if (sibling) {\n            if (!shallow) {\n              for (child = sibling[startName]; child; child = child[startName]) {\n                if (!child[startName]) {\n                  return child;\n                }\n              }\n            }\n            return sibling;\n          }\n          parent = node.parentNode;\n          if (parent && parent !== this.rootNode) {\n            return parent;\n          }\n        }\n      };\n      return TreeWalker;\n    }();\n\n    var each$5 = Tools.each;\n    var grep$1 = Tools.grep;\n    var isIE = Env.ie;\n    var simpleSelectorRe = /^([a-z0-9],?)+$/i;\n    var whiteSpaceRegExp$2 = /^[ \\t\\r\\n]*$/;\n    var setupAttrHooks = function (styles, settings, getContext) {\n      var keepValues = settings.keep_values;\n      var keepUrlHook = {\n        set: function ($elm, value, name) {\n          if (settings.url_converter) {\n            value = settings.url_converter.call(settings.url_converter_scope || getContext(), value, name, $elm[0]);\n          }\n          $elm.attr('data-mce-' + name, value).attr(name, value);\n        },\n        get: function ($elm, name) {\n          return $elm.attr('data-mce-' + name) || $elm.attr(name);\n        }\n      };\n      var attrHooks = {\n        style: {\n          set: function ($elm, value) {\n            if (value !== null && typeof value === 'object') {\n              $elm.css(value);\n              return;\n            }\n            if (keepValues) {\n              $elm.attr('data-mce-style', value);\n            }\n            if (value !== null && typeof value === 'string') {\n              $elm.removeAttr('style');\n              $elm.css(styles.parse(value));\n            } else {\n              $elm.attr('style', value);\n            }\n          },\n          get: function ($elm) {\n            var value = $elm.attr('data-mce-style') || $elm.attr('style');\n            value = styles.serialize(styles.parse(value), $elm[0].nodeName);\n            return value;\n          }\n        }\n      };\n      if (keepValues) {\n        attrHooks.href = attrHooks.src = keepUrlHook;\n      }\n      return attrHooks;\n    };\n    var updateInternalStyleAttr = function (styles, $elm) {\n      var rawValue = $elm.attr('style');\n      var value = styles.serialize(styles.parse(rawValue), $elm[0].nodeName);\n      if (!value) {\n        value = null;\n      }\n      $elm.attr('data-mce-style', value);\n    };\n    var findNodeIndex = function (node, normalized) {\n      var idx = 0, lastNodeType, nodeType;\n      if (node) {\n        for (lastNodeType = node.nodeType, node = node.previousSibling; node; node = node.previousSibling) {\n          nodeType = node.nodeType;\n          if (normalized && nodeType === 3) {\n            if (nodeType === lastNodeType || !node.nodeValue.length) {\n              continue;\n            }\n          }\n          idx++;\n          lastNodeType = nodeType;\n        }\n      }\n      return idx;\n    };\n    function DOMUtils(doc, settings) {\n      var _this = this;\n      if (settings === void 0) {\n        settings = {};\n      }\n      var attrHooks;\n      var addedStyles = {};\n      var win = domGlobals.window;\n      var files = {};\n      var counter = 0;\n      var stdMode = true;\n      var boxModel = true;\n      var styleSheetLoader = StyleSheetLoader(doc, {\n        contentCssCors: settings.contentCssCors,\n        referrerPolicy: settings.referrerPolicy\n      });\n      var boundEvents = [];\n      var schema = settings.schema ? settings.schema : Schema({});\n      var styles = Styles({\n        url_converter: settings.url_converter,\n        url_converter_scope: settings.url_converter_scope\n      }, settings.schema);\n      var events = settings.ownEvents ? new EventUtils() : EventUtils.Event;\n      var blockElementsMap = schema.getBlockElements();\n      var $ = DomQuery.overrideDefaults(function () {\n        return {\n          context: doc,\n          element: self.getRoot()\n        };\n      });\n      var isBlock = function (node) {\n        if (typeof node === 'string') {\n          return !!blockElementsMap[node];\n        } else if (node) {\n          var type = node.nodeType;\n          if (type) {\n            return !!(type === 1 && blockElementsMap[node.nodeName]);\n          }\n        }\n        return false;\n      };\n      var get = function (elm) {\n        if (elm && doc && typeof elm === 'string') {\n          var node = doc.getElementById(elm);\n          if (node && node.id !== elm) {\n            return doc.getElementsByName(elm)[1];\n          } else {\n            return node;\n          }\n        }\n        return elm;\n      };\n      var $$ = function (elm) {\n        if (typeof elm === 'string') {\n          elm = get(elm);\n        }\n        return $(elm);\n      };\n      var getAttrib = function (elm, name, defaultVal) {\n        var hook, value;\n        var $elm = $$(elm);\n        if ($elm.length) {\n          hook = attrHooks[name];\n          if (hook && hook.get) {\n            value = hook.get($elm, name);\n          } else {\n            value = $elm.attr(name);\n          }\n        }\n        if (typeof value === 'undefined') {\n          value = defaultVal || '';\n        }\n        return value;\n      };\n      var getAttribs = function (elm) {\n        var node = get(elm);\n        if (!node) {\n          return [];\n        }\n        return node.attributes;\n      };\n      var setAttrib = function (elm, name, value) {\n        var originalValue, hook;\n        if (value === '') {\n          value = null;\n        }\n        var $elm = $$(elm);\n        originalValue = $elm.attr(name);\n        if (!$elm.length) {\n          return;\n        }\n        hook = attrHooks[name];\n        if (hook && hook.set) {\n          hook.set($elm, value, name);\n        } else {\n          $elm.attr(name, value);\n        }\n        if (originalValue !== value && settings.onSetAttrib) {\n          settings.onSetAttrib({\n            attrElm: $elm,\n            attrName: name,\n            attrValue: value\n          });\n        }\n      };\n      var clone = function (node, deep) {\n        if (!isIE || node.nodeType !== 1 || deep) {\n          return node.cloneNode(deep);\n        }\n        if (!deep) {\n          var clone_1 = doc.createElement(node.nodeName);\n          each$5(getAttribs(node), function (attr) {\n            setAttrib(clone_1, attr.nodeName, getAttrib(node, attr.nodeName));\n          });\n          return clone_1;\n        }\n        return null;\n      };\n      var getRoot = function () {\n        return settings.root_element || doc.body;\n      };\n      var getViewPort = function (argWin) {\n        var vp = getBounds(argWin);\n        return {\n          x: vp.x(),\n          y: vp.y(),\n          w: vp.width(),\n          h: vp.height()\n        };\n      };\n      var getPos = function (elm, rootElm) {\n        return Position$1.getPos(doc.body, get(elm), rootElm);\n      };\n      var setStyle = function (elm, name, value) {\n        var $elm = isString(name) ? $$(elm).css(name, value) : $$(elm).css(name);\n        if (settings.update_styles) {\n          updateInternalStyleAttr(styles, $elm);\n        }\n      };\n      var setStyles = function (elm, stylesArg) {\n        var $elm = $$(elm).css(stylesArg);\n        if (settings.update_styles) {\n          updateInternalStyleAttr(styles, $elm);\n        }\n      };\n      var getStyle = function (elm, name, computed) {\n        var $elm = $$(elm);\n        if (computed) {\n          return $elm.css(name);\n        }\n        name = name.replace(/-(\\D)/g, function (a, b) {\n          return b.toUpperCase();\n        });\n        if (name === 'float') {\n          name = Env.browser.isIE() ? 'styleFloat' : 'cssFloat';\n        }\n        return $elm[0] && $elm[0].style ? $elm[0].style[name] : undefined;\n      };\n      var getSize = function (elm) {\n        var w, h;\n        elm = get(elm);\n        w = getStyle(elm, 'width');\n        h = getStyle(elm, 'height');\n        if (w.indexOf('px') === -1) {\n          w = 0;\n        }\n        if (h.indexOf('px') === -1) {\n          h = 0;\n        }\n        return {\n          w: parseInt(w, 10) || elm.offsetWidth || elm.clientWidth,\n          h: parseInt(h, 10) || elm.offsetHeight || elm.clientHeight\n        };\n      };\n      var getRect = function (elm) {\n        var pos, size;\n        elm = get(elm);\n        pos = getPos(elm);\n        size = getSize(elm);\n        return {\n          x: pos.x,\n          y: pos.y,\n          w: size.w,\n          h: size.h\n        };\n      };\n      var is = function (elm, selector) {\n        var i;\n        if (!elm) {\n          return false;\n        }\n        if (!Array.isArray(elm)) {\n          if (selector === '*') {\n            return elm.nodeType === 1;\n          }\n          if (simpleSelectorRe.test(selector)) {\n            var selectors = selector.toLowerCase().split(/,/);\n            var elmName = elm.nodeName.toLowerCase();\n            for (i = selectors.length - 1; i >= 0; i--) {\n              if (selectors[i] === elmName) {\n                return true;\n              }\n            }\n            return false;\n          }\n          if (elm.nodeType && elm.nodeType !== 1) {\n            return false;\n          }\n        }\n        var elms = !Array.isArray(elm) ? [elm] : elm;\n        return Sizzle(selector, elms[0].ownerDocument || elms[0], null, elms).length > 0;\n      };\n      var getParents = function (elm, selector, root, collect) {\n        var result = [];\n        var selectorVal;\n        var node = get(elm);\n        collect = collect === undefined;\n        root = root || (getRoot().nodeName !== 'BODY' ? getRoot().parentNode : null);\n        if (Tools.is(selector, 'string')) {\n          selectorVal = selector;\n          if (selector === '*') {\n            selector = function (node) {\n              return node.nodeType === 1;\n            };\n          } else {\n            selector = function (node) {\n              return is(node, selectorVal);\n            };\n          }\n        }\n        while (node) {\n          if (node === root || !node.nodeType || node.nodeType === 9) {\n            break;\n          }\n          if (!selector || typeof selector === 'function' && selector(node)) {\n            if (collect) {\n              result.push(node);\n            } else {\n              return [node];\n            }\n          }\n          node = node.parentNode;\n        }\n        return collect ? result : null;\n      };\n      var getParent = function (node, selector, root) {\n        var parents = getParents(node, selector, root, false);\n        return parents && parents.length > 0 ? parents[0] : null;\n      };\n      var _findSib = function (node, selector, name) {\n        var func = selector;\n        if (node) {\n          if (typeof selector === 'string') {\n            func = function (node) {\n              return is(node, selector);\n            };\n          }\n          for (node = node[name]; node; node = node[name]) {\n            if (typeof func === 'function' && func(node)) {\n              return node;\n            }\n          }\n        }\n        return null;\n      };\n      var getNext = function (node, selector) {\n        return _findSib(node, selector, 'nextSibling');\n      };\n      var getPrev = function (node, selector) {\n        return _findSib(node, selector, 'previousSibling');\n      };\n      var select = function (selector, scope) {\n        return Sizzle(selector, get(scope) || settings.root_element || doc, []);\n      };\n      var run = function (elm, func, scope) {\n        var result;\n        var node = typeof elm === 'string' ? get(elm) : elm;\n        if (!node) {\n          return false;\n        }\n        if (Tools.isArray(node) && (node.length || node.length === 0)) {\n          result = [];\n          each$5(node, function (elm, i) {\n            if (elm) {\n              if (typeof elm === 'string') {\n                elm = get(elm);\n              }\n              result.push(func.call(scope, elm, i));\n            }\n          });\n          return result;\n        }\n        var context = scope ? scope : _this;\n        return func.call(context, node);\n      };\n      var setAttribs = function (elm, attrs) {\n        $$(elm).each(function (i, node) {\n          each$5(attrs, function (value, name) {\n            setAttrib(node, name, value);\n          });\n        });\n      };\n      var setHTML = function (elm, html) {\n        var $elm = $$(elm);\n        if (isIE) {\n          $elm.each(function (i, target) {\n            if (target.canHaveHTML === false) {\n              return;\n            }\n            while (target.firstChild) {\n              target.removeChild(target.firstChild);\n            }\n            try {\n              target.innerHTML = '<br>' + html;\n              target.removeChild(target.firstChild);\n            } catch (ex) {\n              DomQuery('<div></div>').html('<br>' + html).contents().slice(1).appendTo(target);\n            }\n            return html;\n          });\n        } else {\n          $elm.html(html);\n        }\n      };\n      var add = function (parentElm, name, attrs, html, create) {\n        return run(parentElm, function (parentElm) {\n          var newElm = typeof name === 'string' ? doc.createElement(name) : name;\n          setAttribs(newElm, attrs);\n          if (html) {\n            if (typeof html !== 'string' && html.nodeType) {\n              newElm.appendChild(html);\n            } else if (typeof html === 'string') {\n              setHTML(newElm, html);\n            }\n          }\n          return !create ? parentElm.appendChild(newElm) : newElm;\n        });\n      };\n      var create = function (name, attrs, html) {\n        return add(doc.createElement(name), name, attrs, html, true);\n      };\n      var decode = Entities.decode;\n      var encode = Entities.encodeAllRaw;\n      var createHTML = function (name, attrs, html) {\n        var outHtml = '', key;\n        outHtml += '<' + name;\n        for (key in attrs) {\n          if (attrs.hasOwnProperty(key) && attrs[key] !== null && typeof attrs[key] !== 'undefined') {\n            outHtml += ' ' + key + '=\"' + encode(attrs[key]) + '\"';\n          }\n        }\n        if (typeof html !== 'undefined') {\n          return outHtml + '>' + html + '</' + name + '>';\n        }\n        return outHtml + ' />';\n      };\n      var createFragment = function (html) {\n        var node;\n        var container = doc.createElement('div');\n        var frag = doc.createDocumentFragment();\n        frag.appendChild(container);\n        if (html) {\n          container.innerHTML = html;\n        }\n        while (node = container.firstChild) {\n          frag.appendChild(node);\n        }\n        frag.removeChild(container);\n        return frag;\n      };\n      var remove = function (node, keepChildren) {\n        var $node = $$(node);\n        if (keepChildren) {\n          $node.each(function () {\n            var child;\n            while (child = this.firstChild) {\n              if (child.nodeType === 3 && child.data.length === 0) {\n                this.removeChild(child);\n              } else {\n                this.parentNode.insertBefore(child, this);\n              }\n            }\n          }).remove();\n        } else {\n          $node.remove();\n        }\n        return $node.length > 1 ? $node.toArray() : $node[0];\n      };\n      var removeAllAttribs = function (e) {\n        return run(e, function (e) {\n          var i;\n          var attrs = e.attributes;\n          for (i = attrs.length - 1; i >= 0; i--) {\n            e.removeAttributeNode(attrs.item(i));\n          }\n        });\n      };\n      var parseStyle = function (cssText) {\n        return styles.parse(cssText);\n      };\n      var serializeStyle = function (stylesArg, name) {\n        return styles.serialize(stylesArg, name);\n      };\n      var addStyle = function (cssText) {\n        var head, styleElm;\n        if (self !== DOMUtils.DOM && doc === domGlobals.document) {\n          if (addedStyles[cssText]) {\n            return;\n          }\n          addedStyles[cssText] = true;\n        }\n        styleElm = doc.getElementById('mceDefaultStyles');\n        if (!styleElm) {\n          styleElm = doc.createElement('style');\n          styleElm.id = 'mceDefaultStyles';\n          styleElm.type = 'text/css';\n          head = doc.getElementsByTagName('head')[0];\n          if (head.firstChild) {\n            head.insertBefore(styleElm, head.firstChild);\n          } else {\n            head.appendChild(styleElm);\n          }\n        }\n        if (styleElm.styleSheet) {\n          styleElm.styleSheet.cssText += cssText;\n        } else {\n          styleElm.appendChild(doc.createTextNode(cssText));\n        }\n      };\n      var loadCSS = function (url) {\n        var head;\n        if (self !== DOMUtils.DOM && doc === domGlobals.document) {\n          DOMUtils.DOM.loadCSS(url);\n          return;\n        }\n        if (!url) {\n          url = '';\n        }\n        head = doc.getElementsByTagName('head')[0];\n        each$5(url.split(','), function (url) {\n          var link;\n          url = Tools._addCacheSuffix(url);\n          if (files[url]) {\n            return;\n          }\n          files[url] = true;\n          link = create('link', __assign(__assign({\n            rel: 'stylesheet',\n            type: 'text/css',\n            href: url\n          }, settings.contentCssCors ? { crossOrigin: 'anonymous' } : {}), settings.referrerPolicy ? { referrerPolicy: settings.referrerPolicy } : {}));\n          head.appendChild(link);\n        });\n      };\n      var toggleClass = function (elm, cls, state) {\n        $$(elm).toggleClass(cls, state).each(function () {\n          if (this.className === '') {\n            DomQuery(this).attr('class', null);\n          }\n        });\n      };\n      var addClass = function (elm, cls) {\n        $$(elm).addClass(cls);\n      };\n      var removeClass = function (elm, cls) {\n        toggleClass(elm, cls, false);\n      };\n      var hasClass = function (elm, cls) {\n        return $$(elm).hasClass(cls);\n      };\n      var show = function (elm) {\n        $$(elm).show();\n      };\n      var hide = function (elm) {\n        $$(elm).hide();\n      };\n      var isHidden = function (elm) {\n        return $$(elm).css('display') === 'none';\n      };\n      var uniqueId = function (prefix) {\n        return (!prefix ? 'mce_' : prefix) + counter++;\n      };\n      var getOuterHTML = function (elm) {\n        var node = typeof elm === 'string' ? get(elm) : elm;\n        return NodeType.isElement(node) ? node.outerHTML : DomQuery('<div></div>').append(DomQuery(node).clone()).html();\n      };\n      var setOuterHTML = function (elm, html) {\n        $$(elm).each(function () {\n          try {\n            if ('outerHTML' in this) {\n              this.outerHTML = html;\n              return;\n            }\n          } catch (ex) {\n          }\n          remove(DomQuery(this).html(html), true);\n        });\n      };\n      var insertAfter = function (node, reference) {\n        var referenceNode = get(reference);\n        return run(node, function (node) {\n          var parent, nextSibling;\n          parent = referenceNode.parentNode;\n          nextSibling = referenceNode.nextSibling;\n          if (nextSibling) {\n            parent.insertBefore(node, nextSibling);\n          } else {\n            parent.appendChild(node);\n          }\n          return node;\n        });\n      };\n      var replace = function (newElm, oldElm, keepChildren) {\n        return run(oldElm, function (oldElm) {\n          if (Tools.is(oldElm, 'array')) {\n            newElm = newElm.cloneNode(true);\n          }\n          if (keepChildren) {\n            each$5(grep$1(oldElm.childNodes), function (node) {\n              newElm.appendChild(node);\n            });\n          }\n          return oldElm.parentNode.replaceChild(newElm, oldElm);\n        });\n      };\n      var rename = function (elm, name) {\n        var newElm;\n        if (elm.nodeName !== name.toUpperCase()) {\n          newElm = create(name);\n          each$5(getAttribs(elm), function (attrNode) {\n            setAttrib(newElm, attrNode.nodeName, getAttrib(elm, attrNode.nodeName));\n          });\n          replace(newElm, elm, true);\n        }\n        return newElm || elm;\n      };\n      var findCommonAncestor = function (a, b) {\n        var ps = a, pe;\n        while (ps) {\n          pe = b;\n          while (pe && ps !== pe) {\n            pe = pe.parentNode;\n          }\n          if (ps === pe) {\n            break;\n          }\n          ps = ps.parentNode;\n        }\n        if (!ps && a.ownerDocument) {\n          return a.ownerDocument.documentElement;\n        }\n        return ps;\n      };\n      var toHex = function (rgbVal) {\n        return styles.toHex(Tools.trim(rgbVal));\n      };\n      var isNonEmptyElement = function (node) {\n        if (NodeType.isElement(node)) {\n          var isNamedAnchor = node.nodeName.toLowerCase() === 'a' && !getAttrib(node, 'href') && getAttrib(node, 'id');\n          if (getAttrib(node, 'name') || getAttrib(node, 'data-mce-bookmark') || isNamedAnchor) {\n            return true;\n          }\n        }\n        return false;\n      };\n      var isEmpty = function (node, elements) {\n        var type, name, brCount = 0;\n        if (isNonEmptyElement(node)) {\n          return false;\n        }\n        node = node.firstChild;\n        if (node) {\n          var walker = new TreeWalker(node, node.parentNode);\n          var whitespace = schema ? schema.getWhiteSpaceElements() : {};\n          elements = elements || (schema ? schema.getNonEmptyElements() : null);\n          do {\n            type = node.nodeType;\n            if (NodeType.isElement(node)) {\n              var bogusVal = node.getAttribute('data-mce-bogus');\n              if (bogusVal) {\n                node = walker.next(bogusVal === 'all');\n                continue;\n              }\n              name = node.nodeName.toLowerCase();\n              if (elements && elements[name]) {\n                if (name === 'br') {\n                  brCount++;\n                  node = walker.next();\n                  continue;\n                }\n                return false;\n              }\n              if (isNonEmptyElement(node)) {\n                return false;\n              }\n            }\n            if (type === 8) {\n              return false;\n            }\n            if (type === 3 && !whiteSpaceRegExp$2.test(node.nodeValue)) {\n              return false;\n            }\n            if (type === 3 && node.parentNode && whitespace[node.parentNode.nodeName] && whiteSpaceRegExp$2.test(node.nodeValue)) {\n              return false;\n            }\n            node = walker.next();\n          } while (node);\n        }\n        return brCount <= 1;\n      };\n      var createRng = function () {\n        return doc.createRange();\n      };\n      var split = function (parentElm, splitElm, replacementElm) {\n        var r = createRng(), bef, aft, pa;\n        if (parentElm && splitElm) {\n          r.setStart(parentElm.parentNode, findNodeIndex(parentElm));\n          r.setEnd(splitElm.parentNode, findNodeIndex(splitElm));\n          bef = r.extractContents();\n          r = createRng();\n          r.setStart(splitElm.parentNode, findNodeIndex(splitElm) + 1);\n          r.setEnd(parentElm.parentNode, findNodeIndex(parentElm) + 1);\n          aft = r.extractContents();\n          pa = parentElm.parentNode;\n          pa.insertBefore(TrimNode.trimNode(self, bef), parentElm);\n          if (replacementElm) {\n            pa.insertBefore(replacementElm, parentElm);\n          } else {\n            pa.insertBefore(splitElm, parentElm);\n          }\n          pa.insertBefore(TrimNode.trimNode(self, aft), parentElm);\n          remove(parentElm);\n          return replacementElm || splitElm;\n        }\n      };\n      var bind = function (target, name, func, scope) {\n        if (Tools.isArray(target)) {\n          var i = target.length;\n          var rv = [];\n          while (i--) {\n            rv[i] = bind(target[i], name, func, scope);\n          }\n          return rv;\n        }\n        if (settings.collect && (target === doc || target === win)) {\n          boundEvents.push([\n            target,\n            name,\n            func,\n            scope\n          ]);\n        }\n        return events.bind(target, name, func, scope || self);\n      };\n      var unbind = function (target, name, func) {\n        var i;\n        if (Tools.isArray(target)) {\n          i = target.length;\n          var rv = [];\n          while (i--) {\n            rv[i] = unbind(target[i], name, func);\n          }\n          return rv;\n        }\n        if (boundEvents && (target === doc || target === win)) {\n          i = boundEvents.length;\n          while (i--) {\n            var item = boundEvents[i];\n            if (target === item[0] && (!name || name === item[1]) && (!func || func === item[2])) {\n              events.unbind(item[0], item[1], item[2]);\n            }\n          }\n        }\n        return events.unbind(target, name, func);\n      };\n      var fire = function (target, name, evt) {\n        return events.fire(target, name, evt);\n      };\n      var getContentEditable = function (node) {\n        if (node && NodeType.isElement(node)) {\n          var contentEditable = node.getAttribute('data-mce-contenteditable');\n          if (contentEditable && contentEditable !== 'inherit') {\n            return contentEditable;\n          }\n          return node.contentEditable !== 'inherit' ? node.contentEditable : null;\n        } else {\n          return null;\n        }\n      };\n      var getContentEditableParent = function (node) {\n        var root = getRoot();\n        var state = null;\n        for (; node && node !== root; node = node.parentNode) {\n          state = getContentEditable(node);\n          if (state !== null) {\n            break;\n          }\n        }\n        return state;\n      };\n      var destroy = function () {\n        if (boundEvents) {\n          var i = boundEvents.length;\n          while (i--) {\n            var item = boundEvents[i];\n            events.unbind(item[0], item[1], item[2]);\n          }\n        }\n        if (Sizzle.setDocument) {\n          Sizzle.setDocument();\n        }\n      };\n      var isChildOf = function (node, parent) {\n        while (node) {\n          if (parent === node) {\n            return true;\n          }\n          node = node.parentNode;\n        }\n        return false;\n      };\n      var dumpRng = function (r) {\n        return 'startContainer: ' + r.startContainer.nodeName + ', startOffset: ' + r.startOffset + ', endContainer: ' + r.endContainer.nodeName + ', endOffset: ' + r.endOffset;\n      };\n      var self = {\n        doc: doc,\n        settings: settings,\n        win: win,\n        files: files,\n        stdMode: stdMode,\n        boxModel: boxModel,\n        styleSheetLoader: styleSheetLoader,\n        boundEvents: boundEvents,\n        styles: styles,\n        schema: schema,\n        events: events,\n        isBlock: isBlock,\n        $: $,\n        $$: $$,\n        root: null,\n        clone: clone,\n        getRoot: getRoot,\n        getViewPort: getViewPort,\n        getRect: getRect,\n        getSize: getSize,\n        getParent: getParent,\n        getParents: getParents,\n        get: get,\n        getNext: getNext,\n        getPrev: getPrev,\n        select: select,\n        is: is,\n        add: add,\n        create: create,\n        createHTML: createHTML,\n        createFragment: createFragment,\n        remove: remove,\n        setStyle: setStyle,\n        getStyle: getStyle,\n        setStyles: setStyles,\n        removeAllAttribs: removeAllAttribs,\n        setAttrib: setAttrib,\n        setAttribs: setAttribs,\n        getAttrib: getAttrib,\n        getPos: getPos,\n        parseStyle: parseStyle,\n        serializeStyle: serializeStyle,\n        addStyle: addStyle,\n        loadCSS: loadCSS,\n        addClass: addClass,\n        removeClass: removeClass,\n        hasClass: hasClass,\n        toggleClass: toggleClass,\n        show: show,\n        hide: hide,\n        isHidden: isHidden,\n        uniqueId: uniqueId,\n        setHTML: setHTML,\n        getOuterHTML: getOuterHTML,\n        setOuterHTML: setOuterHTML,\n        decode: decode,\n        encode: encode,\n        insertAfter: insertAfter,\n        replace: replace,\n        rename: rename,\n        findCommonAncestor: findCommonAncestor,\n        toHex: toHex,\n        run: run,\n        getAttribs: getAttribs,\n        isEmpty: isEmpty,\n        createRng: createRng,\n        nodeIndex: findNodeIndex,\n        split: split,\n        bind: bind,\n        unbind: unbind,\n        fire: fire,\n        getContentEditable: getContentEditable,\n        getContentEditableParent: getContentEditableParent,\n        destroy: destroy,\n        isChildOf: isChildOf,\n        dumpRng: dumpRng\n      };\n      attrHooks = setupAttrHooks(styles, settings, function () {\n        return self;\n      });\n      return self;\n    }\n    (function (DOMUtils) {\n      DOMUtils.DOM = DOMUtils(domGlobals.document);\n      DOMUtils.nodeIndex = findNodeIndex;\n    }(DOMUtils || (DOMUtils = {})));\n    var DOMUtils$1 = DOMUtils;\n\n    var DOM = DOMUtils$1.DOM;\n    var each$6 = Tools.each, grep$2 = Tools.grep;\n    var QUEUED = 0;\n    var LOADING = 1;\n    var LOADED = 2;\n    var FAILED = 3;\n    var ScriptLoader = function () {\n      function ScriptLoader(settings) {\n        if (settings === void 0) {\n          settings = {};\n        }\n        this.states = {};\n        this.queue = [];\n        this.scriptLoadedCallbacks = {};\n        this.queueLoadedCallbacks = [];\n        this.loading = 0;\n        this.settings = settings;\n      }\n      ScriptLoader.prototype._setReferrerPolicy = function (referrerPolicy) {\n        this.settings.referrerPolicy = referrerPolicy;\n      };\n      ScriptLoader.prototype.loadScript = function (url, success, failure) {\n        var dom = DOM;\n        var elm, id;\n        var done = function () {\n          dom.remove(id);\n          if (elm) {\n            elm.onreadystatechange = elm.onload = elm = null;\n          }\n          success();\n        };\n        var error = function () {\n          if (isFunction(failure)) {\n            failure();\n          } else {\n            if (typeof domGlobals.console !== 'undefined' && domGlobals.console.log) {\n              domGlobals.console.log('Failed to load script: ' + url);\n            }\n          }\n        };\n        id = dom.uniqueId();\n        elm = domGlobals.document.createElement('script');\n        elm.id = id;\n        elm.type = 'text/javascript';\n        elm.src = Tools._addCacheSuffix(url);\n        if (this.settings.referrerPolicy) {\n          dom.setAttrib(elm, 'referrerpolicy', this.settings.referrerPolicy);\n        }\n        elm.onload = done;\n        elm.onerror = error;\n        (domGlobals.document.getElementsByTagName('head')[0] || domGlobals.document.body).appendChild(elm);\n      };\n      ScriptLoader.prototype.isDone = function (url) {\n        return this.states[url] === LOADED;\n      };\n      ScriptLoader.prototype.markDone = function (url) {\n        this.states[url] = LOADED;\n      };\n      ScriptLoader.prototype.add = function (url, success, scope, failure) {\n        var state = this.states[url];\n        if (state === undefined) {\n          this.queue.push(url);\n          this.states[url] = QUEUED;\n        }\n        if (success) {\n          if (!this.scriptLoadedCallbacks[url]) {\n            this.scriptLoadedCallbacks[url] = [];\n          }\n          this.scriptLoadedCallbacks[url].push({\n            success: success,\n            failure: failure,\n            scope: scope || this\n          });\n        }\n      };\n      ScriptLoader.prototype.load = function (url, success, scope, failure) {\n        return this.add(url, success, scope, failure);\n      };\n      ScriptLoader.prototype.remove = function (url) {\n        delete this.states[url];\n        delete this.scriptLoadedCallbacks[url];\n      };\n      ScriptLoader.prototype.loadQueue = function (success, scope, failure) {\n        this.loadScripts(this.queue, success, scope, failure);\n      };\n      ScriptLoader.prototype.loadScripts = function (scripts, success, scope, failure) {\n        var self = this;\n        var loadScripts;\n        var failures = [];\n        var execCallbacks = function (name, url) {\n          each$6(self.scriptLoadedCallbacks[url], function (callback) {\n            if (isFunction(callback[name])) {\n              callback[name].call(callback.scope);\n            }\n          });\n          self.scriptLoadedCallbacks[url] = undefined;\n        };\n        self.queueLoadedCallbacks.push({\n          success: success,\n          failure: failure,\n          scope: scope || this\n        });\n        loadScripts = function () {\n          var loadingScripts = grep$2(scripts);\n          scripts.length = 0;\n          each$6(loadingScripts, function (url) {\n            if (self.states[url] === LOADED) {\n              execCallbacks('success', url);\n              return;\n            }\n            if (self.states[url] === FAILED) {\n              execCallbacks('failure', url);\n              return;\n            }\n            if (self.states[url] !== LOADING) {\n              self.states[url] = LOADING;\n              self.loading++;\n              self.loadScript(url, function () {\n                self.states[url] = LOADED;\n                self.loading--;\n                execCallbacks('success', url);\n                loadScripts();\n              }, function () {\n                self.states[url] = FAILED;\n                self.loading--;\n                failures.push(url);\n                execCallbacks('failure', url);\n                loadScripts();\n              });\n            }\n          });\n          if (!self.loading) {\n            var notifyCallbacks = self.queueLoadedCallbacks.slice(0);\n            self.queueLoadedCallbacks.length = 0;\n            each$6(notifyCallbacks, function (callback) {\n              if (failures.length === 0) {\n                if (isFunction(callback.success)) {\n                  callback.success.call(callback.scope);\n                }\n              } else {\n                if (isFunction(callback.failure)) {\n                  callback.failure.call(callback.scope, failures);\n                }\n              }\n            });\n          }\n        };\n        loadScripts();\n      };\n      ScriptLoader.ScriptLoader = new ScriptLoader();\n      return ScriptLoader;\n    }();\n\n    var isRaw = function (str) {\n      return isObject(str) && has(str, 'raw');\n    };\n    var isTokenised = function (str) {\n      return isArray(str) && str.length > 1;\n    };\n    var data = {};\n    var currentCode = Cell('en');\n    var getLanguageData = function () {\n      return get(data, currentCode.get());\n    };\n    var getData = function () {\n      return map$1(data, function (value) {\n        return __assign({}, value);\n      });\n    };\n    var setCode = function (newCode) {\n      if (newCode) {\n        currentCode.set(newCode);\n      }\n    };\n    var getCode = function () {\n      return currentCode.get();\n    };\n    var add = function (code, items) {\n      var langData = data[code];\n      if (!langData) {\n        data[code] = langData = {};\n      }\n      each$1(items, function (translation, name) {\n        langData[name.toLowerCase()] = translation;\n      });\n    };\n    var translate = function (text) {\n      var langData = getLanguageData().getOr({});\n      var toString = function (obj) {\n        if (isFunction(obj)) {\n          return Object.prototype.toString.call(obj);\n        }\n        return !isEmpty(obj) ? '' + obj : '';\n      };\n      var isEmpty = function (text) {\n        return text === '' || text === null || text === undefined;\n      };\n      var getLangData = function (text) {\n        var textstr = toString(text);\n        return get(langData, textstr.toLowerCase()).map(toString).getOr(textstr);\n      };\n      var removeContext = function (str) {\n        return str.replace(/{context:\\w+}$/, '');\n      };\n      var translated = function (text) {\n        return text;\n      };\n      if (isEmpty(text)) {\n        return translated('');\n      }\n      if (isRaw(text)) {\n        return translated(toString(text.raw));\n      }\n      if (isTokenised(text)) {\n        var values_1 = text.slice(1);\n        var substitued = getLangData(text[0]).replace(/\\{([0-9]+)\\}/g, function ($1, $2) {\n          return has(values_1, $2) ? toString(values_1[$2]) : $1;\n        });\n        return translated(removeContext(substitued));\n      }\n      return translated(removeContext(getLangData(text)));\n    };\n    var isRtl = function () {\n      return getLanguageData().bind(function (items) {\n        return get(items, '_dir');\n      }).exists(function (dir) {\n        return dir === 'rtl';\n      });\n    };\n    var hasCode = function (code) {\n      return has(data, code);\n    };\n    var I18n = {\n      getData: getData,\n      setCode: setCode,\n      getCode: getCode,\n      add: add,\n      translate: translate,\n      isRtl: isRtl,\n      hasCode: hasCode\n    };\n\n    function AddOnManager() {\n      var _this = this;\n      var items = [];\n      var urls = {};\n      var lookup = {};\n      var _listeners = [];\n      var runListeners = function (name, state) {\n        var matchedListeners = filter(_listeners, function (listener) {\n          return listener.name === name && listener.state === state;\n        });\n        each(matchedListeners, function (listener) {\n          return listener.callback();\n        });\n      };\n      var get = function (name) {\n        if (lookup[name]) {\n          return lookup[name].instance;\n        }\n        return undefined;\n      };\n      var dependencies = function (name) {\n        var result;\n        if (lookup[name]) {\n          result = lookup[name].dependencies;\n        }\n        return result || [];\n      };\n      var requireLangPack = function (name, languages) {\n        if (AddOnManager.languageLoad !== false) {\n          waitFor(name, function () {\n            var language = I18n.getCode();\n            var wrappedLanguages = ',' + (languages || '') + ',';\n            if (!language || languages && wrappedLanguages.indexOf(',' + language + ',') === -1) {\n              return;\n            }\n            ScriptLoader.ScriptLoader.add(urls[name] + '/langs/' + language + '.js');\n          }, 'loaded');\n        }\n      };\n      var add = function (id, addOn, dependencies) {\n        var addOnConstructor = addOn;\n        items.push(addOnConstructor);\n        lookup[id] = {\n          instance: addOnConstructor,\n          dependencies: dependencies\n        };\n        runListeners(id, 'added');\n        return addOnConstructor;\n      };\n      var remove = function (name) {\n        delete urls[name];\n        delete lookup[name];\n      };\n      var createUrl = function (baseUrl, dep) {\n        if (typeof dep === 'object') {\n          return dep;\n        }\n        return typeof baseUrl === 'string' ? {\n          prefix: '',\n          resource: dep,\n          suffix: ''\n        } : {\n          prefix: baseUrl.prefix,\n          resource: dep,\n          suffix: baseUrl.suffix\n        };\n      };\n      var addComponents = function (pluginName, scripts) {\n        var pluginUrl = _this.urls[pluginName];\n        each(scripts, function (script) {\n          ScriptLoader.ScriptLoader.add(pluginUrl + '/' + script);\n        });\n      };\n      var loadDependencies = function (name, addOnUrl, success, scope) {\n        var deps = dependencies(name);\n        each(deps, function (dep) {\n          var newUrl = createUrl(addOnUrl, dep);\n          load(newUrl.resource, newUrl, undefined, undefined);\n        });\n        if (success) {\n          if (scope) {\n            success.call(scope);\n          } else {\n            success.call(ScriptLoader);\n          }\n        }\n      };\n      var load = function (name, addOnUrl, success, scope, failure) {\n        if (urls[name]) {\n          return;\n        }\n        var urlString = typeof addOnUrl === 'string' ? addOnUrl : addOnUrl.prefix + addOnUrl.resource + addOnUrl.suffix;\n        if (urlString.indexOf('/') !== 0 && urlString.indexOf('://') === -1) {\n          urlString = AddOnManager.baseURL + '/' + urlString;\n        }\n        urls[name] = urlString.substring(0, urlString.lastIndexOf('/'));\n        var done = function () {\n          runListeners(name, 'loaded');\n          loadDependencies(name, addOnUrl, success, scope);\n        };\n        if (lookup[name]) {\n          done();\n        } else {\n          ScriptLoader.ScriptLoader.add(urlString, done, scope, failure);\n        }\n      };\n      var waitFor = function (name, callback, state) {\n        if (state === void 0) {\n          state = 'added';\n        }\n        if (has(lookup, name) && state === 'added') {\n          callback();\n        } else if (has(urls, name) && state === 'loaded') {\n          callback();\n        } else {\n          _listeners.push({\n            name: name,\n            state: state,\n            callback: callback\n          });\n        }\n      };\n      return {\n        items: items,\n        urls: urls,\n        lookup: lookup,\n        _listeners: _listeners,\n        get: get,\n        dependencies: dependencies,\n        requireLangPack: requireLangPack,\n        add: add,\n        remove: remove,\n        createUrl: createUrl,\n        addComponents: addComponents,\n        load: load,\n        waitFor: waitFor\n      };\n    }\n    (function (AddOnManager) {\n      AddOnManager.PluginManager = AddOnManager();\n      AddOnManager.ThemeManager = AddOnManager();\n    }(AddOnManager || (AddOnManager = {})));\n    var AddOnManager$1 = AddOnManager;\n\n    var first = function (fn, rate) {\n      var timer = null;\n      var cancel = function () {\n        if (timer !== null) {\n          domGlobals.clearTimeout(timer);\n          timer = null;\n        }\n      };\n      var throttle = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        if (timer === null) {\n          timer = domGlobals.setTimeout(function () {\n            fn.apply(null, args);\n            timer = null;\n          }, rate);\n        }\n      };\n      return {\n        cancel: cancel,\n        throttle: throttle\n      };\n    };\n    var last$2 = function (fn, rate) {\n      var timer = null;\n      var cancel = function () {\n        if (timer !== null) {\n          domGlobals.clearTimeout(timer);\n          timer = null;\n        }\n      };\n      var throttle = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        if (timer !== null) {\n          domGlobals.clearTimeout(timer);\n        }\n        timer = domGlobals.setTimeout(function () {\n          fn.apply(null, args);\n          timer = null;\n        }, rate);\n      };\n      return {\n        cancel: cancel,\n        throttle: throttle\n      };\n    };\n\n    var read = function (element, attr) {\n      var value = get$3(element, attr);\n      return value === undefined || value === '' ? [] : value.split(' ');\n    };\n    var add$1 = function (element, attr, id) {\n      var old = read(element, attr);\n      var nu = old.concat([id]);\n      set(element, attr, nu.join(' '));\n      return true;\n    };\n    var remove$2 = function (element, attr, id) {\n      var nu = filter(read(element, attr), function (v) {\n        return v !== id;\n      });\n      if (nu.length > 0) {\n        set(element, attr, nu.join(' '));\n      } else {\n        remove$1(element, attr);\n      }\n      return false;\n    };\n\n    var supports = function (element) {\n      return element.dom().classList !== undefined;\n    };\n    var get$5 = function (element) {\n      return read(element, 'class');\n    };\n    var add$2 = function (element, clazz) {\n      return add$1(element, 'class', clazz);\n    };\n    var remove$3 = function (element, clazz) {\n      return remove$2(element, 'class', clazz);\n    };\n\n    var add$3 = function (element, clazz) {\n      if (supports(element)) {\n        element.dom().classList.add(clazz);\n      } else {\n        add$2(element, clazz);\n      }\n    };\n    var cleanClass = function (element) {\n      var classList = supports(element) ? element.dom().classList : get$5(element);\n      if (classList.length === 0) {\n        remove$1(element, 'class');\n      }\n    };\n    var remove$4 = function (element, clazz) {\n      if (supports(element)) {\n        var classList = element.dom().classList;\n        classList.remove(clazz);\n      } else {\n        remove$3(element, clazz);\n      }\n      cleanClass(element);\n    };\n    var has$2 = function (element, clazz) {\n      return supports(element) && element.dom().classList.contains(clazz);\n    };\n\n    var descendants = function (scope, predicate) {\n      var result = [];\n      each(children(scope), function (x) {\n        if (predicate(x)) {\n          result = result.concat([x]);\n        }\n        result = result.concat(descendants(x, predicate));\n      });\n      return result;\n    };\n\n    var descendants$1 = function (scope, selector) {\n      return all(selector, scope);\n    };\n\n    function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {\n      return is(scope, a) ? Option.some(scope) : isFunction(isRoot) && isRoot(scope) ? Option.none() : ancestor(scope, a, isRoot);\n    }\n\n    var ancestor = function (scope, predicate, isRoot) {\n      var element = scope.dom();\n      var stop = isFunction(isRoot) ? isRoot : constant(false);\n      while (element.parentNode) {\n        element = element.parentNode;\n        var el = Element.fromDom(element);\n        if (predicate(el)) {\n          return Option.some(el);\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Option.none();\n    };\n    var closest = function (scope, predicate, isRoot) {\n      var is = function (s, test) {\n        return test(s);\n      };\n      return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot);\n    };\n\n    var ancestor$1 = function (scope, selector, isRoot) {\n      return ancestor(scope, function (e) {\n        return is(e, selector);\n      }, isRoot);\n    };\n    var descendant = function (scope, selector) {\n      return one(selector, scope);\n    };\n    var closest$1 = function (scope, selector, isRoot) {\n      return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot);\n    };\n\n    var annotation = constant('mce-annotation');\n    var dataAnnotation = constant('data-mce-annotation');\n    var dataAnnotationId = constant('data-mce-annotation-uid');\n\n    var identify = function (editor, annotationName) {\n      var rng = editor.selection.getRng();\n      var start = Element.fromDom(rng.startContainer);\n      var root = Element.fromDom(editor.getBody());\n      var selector = annotationName.fold(function () {\n        return '.' + annotation();\n      }, function (an) {\n        return '[' + dataAnnotation() + '=\"' + an + '\"]';\n      });\n      var newStart = child(start, rng.startOffset).getOr(start);\n      var closest = closest$1(newStart, selector, function (n) {\n        return eq(n, root);\n      });\n      var getAttr = function (c, property) {\n        if (has$1(c, property)) {\n          return Option.some(get$3(c, property));\n        } else {\n          return Option.none();\n        }\n      };\n      return closest.bind(function (c) {\n        return getAttr(c, '' + dataAnnotationId()).bind(function (uid) {\n          return getAttr(c, '' + dataAnnotation()).map(function (name) {\n            var elements = findMarkers(editor, uid);\n            return {\n              uid: uid,\n              name: name,\n              elements: elements\n            };\n          });\n        });\n      });\n    };\n    var isAnnotation = function (elem) {\n      return isElement(elem) && has$2(elem, annotation());\n    };\n    var findMarkers = function (editor, uid) {\n      var body = Element.fromDom(editor.getBody());\n      return descendants$1(body, '[' + dataAnnotationId() + '=\"' + uid + '\"]');\n    };\n    var findAll = function (editor, name) {\n      var body = Element.fromDom(editor.getBody());\n      var markers = descendants$1(body, '[' + dataAnnotation() + '=\"' + name + '\"]');\n      var directory = {};\n      each(markers, function (m) {\n        var uid = get$3(m, dataAnnotationId());\n        var nodesAlready = directory.hasOwnProperty(uid) ? directory[uid] : [];\n        directory[uid] = nodesAlready.concat([m]);\n      });\n      return directory;\n    };\n\n    var setup = function (editor, registry) {\n      var changeCallbacks = Cell({});\n      var initData = function () {\n        return {\n          listeners: [],\n          previous: Cell(Option.none())\n        };\n      };\n      var withCallbacks = function (name, f) {\n        updateCallbacks(name, function (data) {\n          f(data);\n          return data;\n        });\n      };\n      var updateCallbacks = function (name, f) {\n        var callbackMap = changeCallbacks.get();\n        var data = callbackMap.hasOwnProperty(name) ? callbackMap[name] : initData();\n        var outputData = f(data);\n        callbackMap[name] = outputData;\n        changeCallbacks.set(callbackMap);\n      };\n      var fireCallbacks = function (name, uid, elements) {\n        withCallbacks(name, function (data) {\n          each(data.listeners, function (f) {\n            return f(true, name, {\n              uid: uid,\n              nodes: map(elements, function (elem) {\n                return elem.dom();\n              })\n            });\n          });\n        });\n      };\n      var fireNoAnnotation = function (name) {\n        withCallbacks(name, function (data) {\n          each(data.listeners, function (f) {\n            return f(false, name);\n          });\n        });\n      };\n      var onNodeChange = last$2(function () {\n        var callbackMap = changeCallbacks.get();\n        var annotations = sort(keys(callbackMap));\n        each(annotations, function (name) {\n          updateCallbacks(name, function (data) {\n            var prev = data.previous.get();\n            identify(editor, Option.some(name)).fold(function () {\n              if (prev.isSome()) {\n                fireNoAnnotation(name);\n                data.previous.set(Option.none());\n              }\n            }, function (_a) {\n              var uid = _a.uid, name = _a.name, elements = _a.elements;\n              if (!prev.is(uid)) {\n                fireCallbacks(name, uid, elements);\n                data.previous.set(Option.some(uid));\n              }\n            });\n            return {\n              previous: data.previous,\n              listeners: data.listeners\n            };\n          });\n        });\n      }, 30);\n      editor.on('remove', function () {\n        onNodeChange.cancel();\n      });\n      editor.on('NodeChange', function () {\n        onNodeChange.throttle();\n      });\n      var addListener = function (name, f) {\n        updateCallbacks(name, function (data) {\n          return {\n            previous: data.previous,\n            listeners: data.listeners.concat([f])\n          };\n        });\n      };\n      return { addListener: addListener };\n    };\n\n    var setup$1 = function (editor, registry) {\n      var identifyParserNode = function (span) {\n        return Option.from(span.attr(dataAnnotation())).bind(registry.lookup);\n      };\n      editor.on('init', function () {\n        editor.serializer.addNodeFilter('span', function (spans) {\n          each(spans, function (span) {\n            identifyParserNode(span).each(function (settings) {\n              if (settings.persistent === false) {\n                span.unwrap();\n              }\n            });\n          });\n        });\n      });\n    };\n\n    var create$1 = function () {\n      var annotations = {};\n      var register = function (name, settings) {\n        annotations[name] = {\n          name: name,\n          settings: settings\n        };\n      };\n      var lookup = function (name) {\n        return annotations.hasOwnProperty(name) ? Option.from(annotations[name]).map(function (a) {\n          return a.settings;\n        }) : Option.none();\n      };\n      return {\n        register: register,\n        lookup: lookup\n      };\n    };\n\n    var unique = 0;\n    var generate = function (prefix) {\n      var date = new Date();\n      var time = date.getTime();\n      var random = Math.floor(Math.random() * 1000000000);\n      unique++;\n      return prefix + '_' + random + unique + String(time);\n    };\n\n    var add$4 = function (element, classes) {\n      each(classes, function (x) {\n        add$3(element, x);\n      });\n    };\n\n    var fromHtml$1 = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      return children(Element.fromDom(div));\n    };\n\n    var get$6 = function (element) {\n      return element.dom().innerHTML;\n    };\n    var set$1 = function (element, content) {\n      var owner$1 = owner(element);\n      var docDom = owner$1.dom();\n      var fragment = Element.fromDom(docDom.createDocumentFragment());\n      var contentElements = fromHtml$1(content, docDom);\n      append$1(fragment, contentElements);\n      empty(element);\n      append(element, fragment);\n    };\n\n    var clone = function (original, isDeep) {\n      return Element.fromDom(original.dom().cloneNode(isDeep));\n    };\n    var shallow = function (original) {\n      return clone(original, false);\n    };\n    var deep = function (original) {\n      return clone(original, true);\n    };\n\n    var ZWSP = zeroWidth;\n    var isZwsp = function (chr) {\n      return chr === ZWSP;\n    };\n    var trim$3 = function (text) {\n      return text.replace(new RegExp(ZWSP, 'g'), '');\n    };\n    var Zwsp = {\n      isZwsp: isZwsp,\n      ZWSP: ZWSP,\n      trim: trim$3\n    };\n\n    var isElement$2 = NodeType.isElement;\n    var isText$2 = NodeType.isText;\n    var isCaretContainerBlock = function (node) {\n      if (isText$2(node)) {\n        node = node.parentNode;\n      }\n      return isElement$2(node) && node.hasAttribute('data-mce-caret');\n    };\n    var isCaretContainerInline = function (node) {\n      return isText$2(node) && Zwsp.isZwsp(node.data);\n    };\n    var isCaretContainer = function (node) {\n      return isCaretContainerBlock(node) || isCaretContainerInline(node);\n    };\n    var hasContent = function (node) {\n      return node.firstChild !== node.lastChild || !NodeType.isBr(node.firstChild);\n    };\n    var insertInline = function (node, before) {\n      var doc, sibling, textNode, parentNode;\n      doc = node.ownerDocument;\n      textNode = doc.createTextNode(Zwsp.ZWSP);\n      parentNode = node.parentNode;\n      if (!before) {\n        sibling = node.nextSibling;\n        if (isText$2(sibling)) {\n          if (isCaretContainer(sibling)) {\n            return sibling;\n          }\n          if (startsWithCaretContainer(sibling)) {\n            sibling.splitText(1);\n            return sibling;\n          }\n        }\n        if (node.nextSibling) {\n          parentNode.insertBefore(textNode, node.nextSibling);\n        } else {\n          parentNode.appendChild(textNode);\n        }\n      } else {\n        sibling = node.previousSibling;\n        if (isText$2(sibling)) {\n          if (isCaretContainer(sibling)) {\n            return sibling;\n          }\n          if (endsWithCaretContainer(sibling)) {\n            return sibling.splitText(sibling.data.length - 1);\n          }\n        }\n        parentNode.insertBefore(textNode, node);\n      }\n      return textNode;\n    };\n    var isBeforeInline = function (pos) {\n      var container = pos.container();\n      if (!pos || !NodeType.isText(container)) {\n        return false;\n      }\n      return container.data.charAt(pos.offset()) === Zwsp.ZWSP || pos.isAtStart() && isCaretContainerInline(container.previousSibling);\n    };\n    var isAfterInline = function (pos) {\n      var container = pos.container();\n      if (!pos || !NodeType.isText(container)) {\n        return false;\n      }\n      return container.data.charAt(pos.offset() - 1) === Zwsp.ZWSP || pos.isAtEnd() && isCaretContainerInline(container.nextSibling);\n    };\n    var createBogusBr = function () {\n      var br = domGlobals.document.createElement('br');\n      br.setAttribute('data-mce-bogus', '1');\n      return br;\n    };\n    var insertBlock = function (blockName, node, before) {\n      var doc, blockNode, parentNode;\n      doc = node.ownerDocument;\n      blockNode = doc.createElement(blockName);\n      blockNode.setAttribute('data-mce-caret', before ? 'before' : 'after');\n      blockNode.setAttribute('data-mce-bogus', 'all');\n      blockNode.appendChild(createBogusBr());\n      parentNode = node.parentNode;\n      if (!before) {\n        if (node.nextSibling) {\n          parentNode.insertBefore(blockNode, node.nextSibling);\n        } else {\n          parentNode.appendChild(blockNode);\n        }\n      } else {\n        parentNode.insertBefore(blockNode, node);\n      }\n      return blockNode;\n    };\n    var startsWithCaretContainer = function (node) {\n      return isText$2(node) && node.data[0] === Zwsp.ZWSP;\n    };\n    var endsWithCaretContainer = function (node) {\n      return isText$2(node) && node.data[node.data.length - 1] === Zwsp.ZWSP;\n    };\n    var trimBogusBr = function (elm) {\n      var brs = elm.getElementsByTagName('br');\n      var lastBr = brs[brs.length - 1];\n      if (NodeType.isBogus(lastBr)) {\n        lastBr.parentNode.removeChild(lastBr);\n      }\n    };\n    var showCaretContainerBlock = function (caretContainer) {\n      if (caretContainer && caretContainer.hasAttribute('data-mce-caret')) {\n        trimBogusBr(caretContainer);\n        caretContainer.removeAttribute('data-mce-caret');\n        caretContainer.removeAttribute('data-mce-bogus');\n        caretContainer.removeAttribute('style');\n        caretContainer.removeAttribute('_moz_abspos');\n        return caretContainer;\n      }\n      return null;\n    };\n    var isRangeInCaretContainerBlock = function (range) {\n      return isCaretContainerBlock(range.startContainer);\n    };\n\n    var isContentEditableTrue$1 = NodeType.isContentEditableTrue;\n    var isContentEditableFalse$1 = NodeType.isContentEditableFalse;\n    var isBr$2 = NodeType.isBr;\n    var isText$3 = NodeType.isText;\n    var isInvalidTextElement = NodeType.matchNodeNames([\n      'script',\n      'style',\n      'textarea'\n    ]);\n    var isAtomicInline = NodeType.matchNodeNames([\n      'img',\n      'input',\n      'textarea',\n      'hr',\n      'iframe',\n      'video',\n      'audio',\n      'object'\n    ]);\n    var isTable$2 = NodeType.matchNodeNames(['table']);\n    var isCaretContainer$1 = isCaretContainer;\n    var isCaretCandidate = function (node) {\n      if (isCaretContainer$1(node)) {\n        return false;\n      }\n      if (isText$3(node)) {\n        if (isInvalidTextElement(node.parentNode)) {\n          return false;\n        }\n        return true;\n      }\n      return isAtomicInline(node) || isBr$2(node) || isTable$2(node) || isNonUiContentEditableFalse(node);\n    };\n    var isUnselectable = function (node) {\n      return NodeType.isElement(node) && node.getAttribute('unselectable') === 'true';\n    };\n    var isNonUiContentEditableFalse = function (node) {\n      return isUnselectable(node) === false && isContentEditableFalse$1(node);\n    };\n    var isInEditable = function (node, root) {\n      for (node = node.parentNode; node && node !== root; node = node.parentNode) {\n        if (isNonUiContentEditableFalse(node)) {\n          return false;\n        }\n        if (isContentEditableTrue$1(node)) {\n          return true;\n        }\n      }\n      return true;\n    };\n    var isAtomicContentEditableFalse = function (node) {\n      if (!isNonUiContentEditableFalse(node)) {\n        return false;\n      }\n      return foldl(from$1(node.getElementsByTagName('*')), function (result, elm) {\n        return result || isContentEditableTrue$1(elm);\n      }, false) !== true;\n    };\n    var isAtomic = function (node) {\n      return isAtomicInline(node) || isAtomicContentEditableFalse(node);\n    };\n    var isEditableCaretCandidate = function (node, root) {\n      return isCaretCandidate(node) && isInEditable(node, root);\n    };\n\n    var round = Math.round;\n    var clone$1 = function (rect) {\n      if (!rect) {\n        return {\n          left: 0,\n          top: 0,\n          bottom: 0,\n          right: 0,\n          width: 0,\n          height: 0\n        };\n      }\n      return {\n        left: round(rect.left),\n        top: round(rect.top),\n        bottom: round(rect.bottom),\n        right: round(rect.right),\n        width: round(rect.width),\n        height: round(rect.height)\n      };\n    };\n    var collapse = function (rect, toStart) {\n      rect = clone$1(rect);\n      if (toStart) {\n        rect.right = rect.left;\n      } else {\n        rect.left = rect.left + rect.width;\n        rect.right = rect.left;\n      }\n      rect.width = 0;\n      return rect;\n    };\n    var isEqual = function (rect1, rect2) {\n      return rect1.left === rect2.left && rect1.top === rect2.top && rect1.bottom === rect2.bottom && rect1.right === rect2.right;\n    };\n    var isValidOverflow = function (overflowY, rect1, rect2) {\n      return overflowY >= 0 && overflowY <= Math.min(rect1.height, rect2.height) / 2;\n    };\n    var isAbove = function (rect1, rect2) {\n      if (rect1.bottom - rect1.height / 2 < rect2.top) {\n        return true;\n      }\n      if (rect1.top > rect2.bottom) {\n        return false;\n      }\n      return isValidOverflow(rect2.top - rect1.bottom, rect1, rect2);\n    };\n    var isBelow = function (rect1, rect2) {\n      if (rect1.top > rect2.bottom) {\n        return true;\n      }\n      if (rect1.bottom < rect2.top) {\n        return false;\n      }\n      return isValidOverflow(rect2.bottom - rect1.top, rect1, rect2);\n    };\n    var containsXY = function (rect, clientX, clientY) {\n      return clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;\n    };\n\n    var getSelectedNode = function (range) {\n      var startContainer = range.startContainer, startOffset = range.startOffset;\n      if (startContainer.hasChildNodes() && range.endOffset === startOffset + 1) {\n        return startContainer.childNodes[startOffset];\n      }\n      return null;\n    };\n    var getNode = function (container, offset) {\n      if (container.nodeType === 1 && container.hasChildNodes()) {\n        if (offset >= container.childNodes.length) {\n          offset = container.childNodes.length - 1;\n        }\n        container = container.childNodes[offset];\n      }\n      return container;\n    };\n\n    var extendingChars = new RegExp('[\\u0300-\\u036f\\u0483-\\u0487\\u0488-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u0610-\\u061a' + '\\u064b-\\u065f\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7-\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0' + '\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u08e3-\\u0902\\u093a\\u093c' + '\\u0941-\\u0948\\u094d\\u0951-\\u0957\\u0962-\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2-\\u09e3' + '\\u0a01-\\u0a02\\u0a3c\\u0a41-\\u0a42\\u0a47-\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70-\\u0a71\\u0a75\\u0a81-\\u0a82\\u0abc' + '\\u0ac1-\\u0ac5\\u0ac7-\\u0ac8\\u0acd\\u0ae2-\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57' + '\\u0b62-\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c00\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55-\\u0c56' + '\\u0c62-\\u0c63\\u0c81\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc-\\u0ccd\\u0cd5-\\u0cd6\\u0ce2-\\u0ce3\\u0d01\\u0d3e\\u0d41-\\u0d44' + '\\u0d4d\\u0d57\\u0d62-\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9' + '\\u0ebb-\\u0ebc\\u0ec8-\\u0ecd\\u0f18-\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86-\\u0f87\\u0f8d-\\u0f97' + '\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039-\\u103a\\u103d-\\u103e\\u1058-\\u1059\\u105e-\\u1060\\u1071-\\u1074' + '\\u1082\\u1085-\\u1086\\u108d\\u109d\\u135d-\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752-\\u1753\\u1772-\\u1773\\u17b4-\\u17b5' + '\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927-\\u1928\\u1932\\u1939-\\u193b\\u1a17-\\u1a18' + '\\u1a1b\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1ab0-\\u1abd\\u1ABE\\u1b00-\\u1b03\\u1b34' + '\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80-\\u1b81\\u1ba2-\\u1ba5\\u1ba8-\\u1ba9\\u1bab-\\u1bad\\u1be6\\u1be8-\\u1be9' + '\\u1bed\\u1bef-\\u1bf1\\u1c2c-\\u1c33\\u1c36-\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1cf4\\u1cf8-\\u1cf9' + '\\u1dc0-\\u1df5\\u1dfc-\\u1dff\\u200c-\\u200d\\u20d0-\\u20dc\\u20DD-\\u20E0\\u20e1\\u20E2-\\u20E4\\u20e5-\\u20f0\\u2cef-\\u2cf1' + '\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302d\\u302e-\\u302f\\u3099-\\u309a\\ua66f\\uA670-\\uA672\\ua674-\\ua67d\\ua69e-\\ua69f\\ua6f0-\\ua6f1' + '\\ua802\\ua806\\ua80b\\ua825-\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc' + '\\ua9e5\\uaa29-\\uaa2e\\uaa31-\\uaa32\\uaa35-\\uaa36\\uaa43\\uaa4c\\uaa7c\\uaab0\\uaab2-\\uaab4\\uaab7-\\uaab8\\uaabe-\\uaabf\\uaac1' + '\\uaaec-\\uaaed\\uaaf6\\uabe5\\uabe8\\uabed\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\uff9e-\\uff9f]');\n    var isExtendingChar = function (ch) {\n      return typeof ch === 'string' && ch.charCodeAt(0) >= 768 && extendingChars.test(ch);\n    };\n\n    var lift2 = function (oa, ob, f) {\n      return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none();\n    };\n    var lift3 = function (oa, ob, oc, f) {\n      return oa.isSome() && ob.isSome() && oc.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Option.none();\n    };\n    var someIf = function (b, a) {\n      return b ? Option.some(a) : Option.none();\n    };\n\n    var slice$2 = [].slice;\n    var or = function () {\n      var x = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        x[_i] = arguments[_i];\n      }\n      var args = slice$2.call(arguments);\n      return function (x) {\n        for (var i = 0; i < args.length; i++) {\n          if (args[i](x)) {\n            return true;\n          }\n        }\n        return false;\n      };\n    };\n    var and = function () {\n      var x = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        x[_i] = arguments[_i];\n      }\n      var args = slice$2.call(arguments);\n      return function (x) {\n        for (var i = 0; i < args.length; i++) {\n          if (!args[i](x)) {\n            return false;\n          }\n        }\n        return true;\n      };\n    };\n    var Predicate = {\n      and: and,\n      or: or\n    };\n\n    var isElement$3 = NodeType.isElement;\n    var isCaretCandidate$1 = isCaretCandidate;\n    var isBlock$1 = NodeType.matchStyleValues('display', 'block table');\n    var isFloated = NodeType.matchStyleValues('float', 'left right');\n    var isValidElementCaretCandidate = Predicate.and(isElement$3, isCaretCandidate$1, not(isFloated));\n    var isNotPre = not(NodeType.matchStyleValues('white-space', 'pre pre-line pre-wrap'));\n    var isText$4 = NodeType.isText;\n    var isBr$3 = NodeType.isBr;\n    var nodeIndex = DOMUtils$1.nodeIndex;\n    var resolveIndex = getNode;\n    var createRange = function (doc) {\n      return 'createRange' in doc ? doc.createRange() : DOMUtils$1.DOM.createRng();\n    };\n    var isWhiteSpace = function (chr) {\n      return chr && /[\\r\\n\\t ]/.test(chr);\n    };\n    var isRange = function (rng) {\n      return !!rng.setStart && !!rng.setEnd;\n    };\n    var isHiddenWhiteSpaceRange = function (range) {\n      var container = range.startContainer;\n      var offset = range.startOffset;\n      var text;\n      if (isWhiteSpace(range.toString()) && isNotPre(container.parentNode) && NodeType.isText(container)) {\n        text = container.data;\n        if (isWhiteSpace(text[offset - 1]) || isWhiteSpace(text[offset + 1])) {\n          return true;\n        }\n      }\n      return false;\n    };\n    var getBrClientRect = function (brNode) {\n      var doc = brNode.ownerDocument;\n      var rng = createRange(doc);\n      var nbsp$1 = doc.createTextNode(nbsp);\n      var parentNode = brNode.parentNode;\n      var clientRect;\n      parentNode.insertBefore(nbsp$1, brNode);\n      rng.setStart(nbsp$1, 0);\n      rng.setEnd(nbsp$1, 1);\n      clientRect = clone$1(rng.getBoundingClientRect());\n      parentNode.removeChild(nbsp$1);\n      return clientRect;\n    };\n    var getBoundingClientRectWebKitText = function (rng) {\n      var sc = rng.startContainer;\n      var ec = rng.endContainer;\n      var so = rng.startOffset;\n      var eo = rng.endOffset;\n      if (sc === ec && NodeType.isText(ec) && so === 0 && eo === 1) {\n        var newRng = rng.cloneRange();\n        newRng.setEndAfter(ec);\n        return getBoundingClientRect(newRng);\n      } else {\n        return null;\n      }\n    };\n    var isZeroRect = function (r) {\n      return r.left === 0 && r.right === 0 && r.top === 0 && r.bottom === 0;\n    };\n    var getBoundingClientRect = function (item) {\n      var clientRect, clientRects;\n      clientRects = item.getClientRects();\n      if (clientRects.length > 0) {\n        clientRect = clone$1(clientRects[0]);\n      } else {\n        clientRect = clone$1(item.getBoundingClientRect());\n      }\n      if (!isRange(item) && isBr$3(item) && isZeroRect(clientRect)) {\n        return getBrClientRect(item);\n      }\n      if (isZeroRect(clientRect) && isRange(item)) {\n        return getBoundingClientRectWebKitText(item);\n      }\n      return clientRect;\n    };\n    var collapseAndInflateWidth = function (clientRect, toStart) {\n      var newClientRect = collapse(clientRect, toStart);\n      newClientRect.width = 1;\n      newClientRect.right = newClientRect.left + 1;\n      return newClientRect;\n    };\n    var getCaretPositionClientRects = function (caretPosition) {\n      var clientRects = [];\n      var beforeNode, node;\n      var addUniqueAndValidRect = function (clientRect) {\n        if (clientRect.height === 0) {\n          return;\n        }\n        if (clientRects.length > 0) {\n          if (isEqual(clientRect, clientRects[clientRects.length - 1])) {\n            return;\n          }\n        }\n        clientRects.push(clientRect);\n      };\n      var addCharacterOffset = function (container, offset) {\n        var range = createRange(container.ownerDocument);\n        if (offset < container.data.length) {\n          if (isExtendingChar(container.data[offset])) {\n            return clientRects;\n          }\n          if (isExtendingChar(container.data[offset - 1])) {\n            range.setStart(container, offset);\n            range.setEnd(container, offset + 1);\n            if (!isHiddenWhiteSpaceRange(range)) {\n              addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), false));\n              return clientRects;\n            }\n          }\n        }\n        if (offset > 0) {\n          range.setStart(container, offset - 1);\n          range.setEnd(container, offset);\n          if (!isHiddenWhiteSpaceRange(range)) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), false));\n          }\n        }\n        if (offset < container.data.length) {\n          range.setStart(container, offset);\n          range.setEnd(container, offset + 1);\n          if (!isHiddenWhiteSpaceRange(range)) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), true));\n          }\n        }\n      };\n      if (isText$4(caretPosition.container())) {\n        addCharacterOffset(caretPosition.container(), caretPosition.offset());\n        return clientRects;\n      }\n      if (isElement$3(caretPosition.container())) {\n        if (caretPosition.isAtEnd()) {\n          node = resolveIndex(caretPosition.container(), caretPosition.offset());\n          if (isText$4(node)) {\n            addCharacterOffset(node, node.data.length);\n          }\n          if (isValidElementCaretCandidate(node) && !isBr$3(node)) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(node), false));\n          }\n        } else {\n          node = resolveIndex(caretPosition.container(), caretPosition.offset());\n          if (isText$4(node)) {\n            addCharacterOffset(node, 0);\n          }\n          if (isValidElementCaretCandidate(node) && caretPosition.isAtEnd()) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(node), false));\n            return clientRects;\n          }\n          beforeNode = resolveIndex(caretPosition.container(), caretPosition.offset() - 1);\n          if (isValidElementCaretCandidate(beforeNode) && !isBr$3(beforeNode)) {\n            if (isBlock$1(beforeNode) || isBlock$1(node) || !isValidElementCaretCandidate(node)) {\n              addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(beforeNode), false));\n            }\n          }\n          if (isValidElementCaretCandidate(node)) {\n            addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(node), true));\n          }\n        }\n      }\n      return clientRects;\n    };\n    function CaretPosition(container, offset, clientRects) {\n      var isAtStart = function () {\n        if (isText$4(container)) {\n          return offset === 0;\n        }\n        return offset === 0;\n      };\n      var isAtEnd = function () {\n        if (isText$4(container)) {\n          return offset >= container.data.length;\n        }\n        return offset >= container.childNodes.length;\n      };\n      var toRange = function () {\n        var range;\n        range = createRange(container.ownerDocument);\n        range.setStart(container, offset);\n        range.setEnd(container, offset);\n        return range;\n      };\n      var getClientRects = function () {\n        if (!clientRects) {\n          clientRects = getCaretPositionClientRects(CaretPosition(container, offset));\n        }\n        return clientRects;\n      };\n      var isVisible = function () {\n        return getClientRects().length > 0;\n      };\n      var isEqual = function (caretPosition) {\n        return caretPosition && container === caretPosition.container() && offset === caretPosition.offset();\n      };\n      var getNode = function (before) {\n        return resolveIndex(container, before ? offset - 1 : offset);\n      };\n      return {\n        container: constant(container),\n        offset: constant(offset),\n        toRange: toRange,\n        getClientRects: getClientRects,\n        isVisible: isVisible,\n        isAtStart: isAtStart,\n        isAtEnd: isAtEnd,\n        isEqual: isEqual,\n        getNode: getNode\n      };\n    }\n    (function (CaretPosition) {\n      CaretPosition.fromRangeStart = function (range) {\n        return CaretPosition(range.startContainer, range.startOffset);\n      };\n      CaretPosition.fromRangeEnd = function (range) {\n        return CaretPosition(range.endContainer, range.endOffset);\n      };\n      CaretPosition.after = function (node) {\n        return CaretPosition(node.parentNode, nodeIndex(node) + 1);\n      };\n      CaretPosition.before = function (node) {\n        return CaretPosition(node.parentNode, nodeIndex(node));\n      };\n      CaretPosition.isAbove = function (pos1, pos2) {\n        return lift2(head(pos2.getClientRects()), last(pos1.getClientRects()), isAbove).getOr(false);\n      };\n      CaretPosition.isBelow = function (pos1, pos2) {\n        return lift2(last(pos2.getClientRects()), head(pos1.getClientRects()), isBelow).getOr(false);\n      };\n      CaretPosition.isAtStart = function (pos) {\n        return pos ? pos.isAtStart() : false;\n      };\n      CaretPosition.isAtEnd = function (pos) {\n        return pos ? pos.isAtEnd() : false;\n      };\n      CaretPosition.isTextPosition = function (pos) {\n        return pos ? NodeType.isText(pos.container()) : false;\n      };\n      CaretPosition.isElementPosition = function (pos) {\n        return CaretPosition.isTextPosition(pos) === false;\n      };\n    }(CaretPosition || (CaretPosition = {})));\n    var CaretPosition$1 = CaretPosition;\n\n    var isText$5 = NodeType.isText;\n    var isBogus$1 = NodeType.isBogus;\n    var nodeIndex$1 = DOMUtils$1.nodeIndex;\n    var normalizedParent = function (node) {\n      var parentNode = node.parentNode;\n      if (isBogus$1(parentNode)) {\n        return normalizedParent(parentNode);\n      }\n      return parentNode;\n    };\n    var getChildNodes = function (node) {\n      if (!node) {\n        return [];\n      }\n      return ArrUtils.reduce(node.childNodes, function (result, node) {\n        if (isBogus$1(node) && node.nodeName !== 'BR') {\n          result = result.concat(getChildNodes(node));\n        } else {\n          result.push(node);\n        }\n        return result;\n      }, []);\n    };\n    var normalizedTextOffset = function (node, offset) {\n      while (node = node.previousSibling) {\n        if (!isText$5(node)) {\n          break;\n        }\n        offset += node.data.length;\n      }\n      return offset;\n    };\n    var equal = function (a) {\n      return function (b) {\n        return a === b;\n      };\n    };\n    var normalizedNodeIndex = function (node) {\n      var nodes, index, numTextFragments;\n      nodes = getChildNodes(normalizedParent(node));\n      index = ArrUtils.findIndex(nodes, equal(node), node);\n      nodes = nodes.slice(0, index + 1);\n      numTextFragments = ArrUtils.reduce(nodes, function (result, node, i) {\n        if (isText$5(node) && isText$5(nodes[i - 1])) {\n          result++;\n        }\n        return result;\n      }, 0);\n      nodes = ArrUtils.filter(nodes, NodeType.matchNodeNames([node.nodeName]));\n      index = ArrUtils.findIndex(nodes, equal(node), node);\n      return index - numTextFragments;\n    };\n    var createPathItem = function (node) {\n      var name;\n      if (isText$5(node)) {\n        name = 'text()';\n      } else {\n        name = node.nodeName.toLowerCase();\n      }\n      return name + '[' + normalizedNodeIndex(node) + ']';\n    };\n    var parentsUntil = function (root, node, predicate) {\n      var parents = [];\n      for (node = node.parentNode; node !== root; node = node.parentNode) {\n        if (predicate && predicate(node)) {\n          break;\n        }\n        parents.push(node);\n      }\n      return parents;\n    };\n    var create$2 = function (root, caretPosition) {\n      var container, offset, path = [], outputOffset, childNodes, parents;\n      container = caretPosition.container();\n      offset = caretPosition.offset();\n      if (isText$5(container)) {\n        outputOffset = normalizedTextOffset(container, offset);\n      } else {\n        childNodes = container.childNodes;\n        if (offset >= childNodes.length) {\n          outputOffset = 'after';\n          offset = childNodes.length - 1;\n        } else {\n          outputOffset = 'before';\n        }\n        container = childNodes[offset];\n      }\n      path.push(createPathItem(container));\n      parents = parentsUntil(root, container);\n      parents = ArrUtils.filter(parents, not(NodeType.isBogus));\n      path = path.concat(ArrUtils.map(parents, function (node) {\n        return createPathItem(node);\n      }));\n      return path.reverse().join('/') + ',' + outputOffset;\n    };\n    var resolvePathItem = function (node, name, index) {\n      var nodes = getChildNodes(node);\n      nodes = ArrUtils.filter(nodes, function (node, index) {\n        return !isText$5(node) || !isText$5(nodes[index - 1]);\n      });\n      nodes = ArrUtils.filter(nodes, NodeType.matchNodeNames([name]));\n      return nodes[index];\n    };\n    var findTextPosition = function (container, offset) {\n      var node = container, targetOffset = 0, dataLen;\n      while (isText$5(node)) {\n        dataLen = node.data.length;\n        if (offset >= targetOffset && offset <= targetOffset + dataLen) {\n          container = node;\n          offset = offset - targetOffset;\n          break;\n        }\n        if (!isText$5(node.nextSibling)) {\n          container = node;\n          offset = dataLen;\n          break;\n        }\n        targetOffset += dataLen;\n        node = node.nextSibling;\n      }\n      if (isText$5(container) && offset > container.data.length) {\n        offset = container.data.length;\n      }\n      return CaretPosition$1(container, offset);\n    };\n    var resolve$1 = function (root, path) {\n      var parts, container, offset;\n      if (!path) {\n        return null;\n      }\n      parts = path.split(',');\n      path = parts[0].split('/');\n      offset = parts.length > 1 ? parts[1] : 'before';\n      container = ArrUtils.reduce(path, function (result, value) {\n        value = /([\\w\\-\\(\\)]+)\\[([0-9]+)\\]/.exec(value);\n        if (!value) {\n          return null;\n        }\n        if (value[1] === 'text()') {\n          value[1] = '#text';\n        }\n        return resolvePathItem(result, value[1], parseInt(value[2], 10));\n      }, root);\n      if (!container) {\n        return null;\n      }\n      if (!isText$5(container)) {\n        if (offset === 'after') {\n          offset = nodeIndex$1(container) + 1;\n        } else {\n          offset = nodeIndex$1(container);\n        }\n        return CaretPosition$1(container.parentNode, offset);\n      }\n      return findTextPosition(container, parseInt(offset, 10));\n    };\n\n    var trimEmptyTextNode = function (dom, node) {\n      if (NodeType.isText(node) && node.data.length === 0) {\n        dom.remove(node);\n      }\n    };\n    var insertNode = function (dom, rng, node) {\n      rng.insertNode(node);\n      trimEmptyTextNode(dom, node.previousSibling);\n      trimEmptyTextNode(dom, node.nextSibling);\n    };\n    var insertFragment = function (dom, rng, frag) {\n      var firstChild = Option.from(frag.firstChild);\n      var lastChild = Option.from(frag.lastChild);\n      rng.insertNode(frag);\n      firstChild.each(function (child) {\n        return trimEmptyTextNode(dom, child.previousSibling);\n      });\n      lastChild.each(function (child) {\n        return trimEmptyTextNode(dom, child.nextSibling);\n      });\n    };\n    var rangeInsertNode = function (dom, rng, node) {\n      if (NodeType.isDocumentFragment(node)) {\n        insertFragment(dom, rng, node);\n      } else {\n        insertNode(dom, rng, node);\n      }\n    };\n\n    var isContentEditableFalse$2 = NodeType.isContentEditableFalse;\n    var getNormalizedTextOffset = function (trim, container, offset) {\n      var node, trimmedOffset;\n      trimmedOffset = trim(container.data.slice(0, offset)).length;\n      for (node = container.previousSibling; node && NodeType.isText(node); node = node.previousSibling) {\n        trimmedOffset += trim(node.data).length;\n      }\n      return trimmedOffset;\n    };\n    var getPoint = function (dom, trim, normalized, rng, start) {\n      var container = rng[start ? 'startContainer' : 'endContainer'];\n      var offset = rng[start ? 'startOffset' : 'endOffset'];\n      var point = [];\n      var childNodes, after = 0;\n      var root = dom.getRoot();\n      if (NodeType.isText(container)) {\n        point.push(normalized ? getNormalizedTextOffset(trim, container, offset) : offset);\n      } else {\n        childNodes = container.childNodes;\n        if (offset >= childNodes.length && childNodes.length) {\n          after = 1;\n          offset = Math.max(0, childNodes.length - 1);\n        }\n        point.push(dom.nodeIndex(childNodes[offset], normalized) + after);\n      }\n      for (; container && container !== root; container = container.parentNode) {\n        point.push(dom.nodeIndex(container, normalized));\n      }\n      return point;\n    };\n    var getLocation = function (trim, selection, normalized, rng) {\n      var dom = selection.dom, bookmark = {};\n      bookmark.start = getPoint(dom, trim, normalized, rng, true);\n      if (!selection.isCollapsed()) {\n        bookmark.end = getPoint(dom, trim, normalized, rng, false);\n      }\n      return bookmark;\n    };\n    var findIndex$2 = function (dom, name, element) {\n      var count = 0;\n      Tools.each(dom.select(name), function (node) {\n        if (node.getAttribute('data-mce-bogus') === 'all') {\n          return;\n        }\n        if (node === element) {\n          return false;\n        }\n        count++;\n      });\n      return count;\n    };\n    var moveEndPoint = function (rng, start) {\n      var container, offset, childNodes;\n      var prefix = start ? 'start' : 'end';\n      container = rng[prefix + 'Container'];\n      offset = rng[prefix + 'Offset'];\n      if (NodeType.isElement(container) && container.nodeName === 'TR') {\n        childNodes = container.childNodes;\n        container = childNodes[Math.min(start ? offset : offset - 1, childNodes.length - 1)];\n        if (container) {\n          offset = start ? 0 : container.childNodes.length;\n          rng['set' + (start ? 'Start' : 'End')](container, offset);\n        }\n      }\n    };\n    var normalizeTableCellSelection = function (rng) {\n      moveEndPoint(rng, true);\n      moveEndPoint(rng, false);\n      return rng;\n    };\n    var findSibling = function (node, offset) {\n      var sibling;\n      if (NodeType.isElement(node)) {\n        node = getNode(node, offset);\n        if (isContentEditableFalse$2(node)) {\n          return node;\n        }\n      }\n      if (isCaretContainer(node)) {\n        if (NodeType.isText(node) && isCaretContainerBlock(node)) {\n          node = node.parentNode;\n        }\n        sibling = node.previousSibling;\n        if (isContentEditableFalse$2(sibling)) {\n          return sibling;\n        }\n        sibling = node.nextSibling;\n        if (isContentEditableFalse$2(sibling)) {\n          return sibling;\n        }\n      }\n    };\n    var findAdjacentContentEditableFalseElm = function (rng) {\n      return findSibling(rng.startContainer, rng.startOffset) || findSibling(rng.endContainer, rng.endOffset);\n    };\n    var getOffsetBookmark = function (trim, normalized, selection) {\n      var element = selection.getNode();\n      var name = element ? element.nodeName : null;\n      var rng = selection.getRng();\n      if (isContentEditableFalse$2(element) || name === 'IMG') {\n        return {\n          name: name,\n          index: findIndex$2(selection.dom, name, element)\n        };\n      }\n      var sibling = findAdjacentContentEditableFalseElm(rng);\n      if (sibling) {\n        name = sibling.tagName;\n        return {\n          name: name,\n          index: findIndex$2(selection.dom, name, sibling)\n        };\n      }\n      return getLocation(trim, selection, normalized, rng);\n    };\n    var getCaretBookmark = function (selection) {\n      var rng = selection.getRng();\n      return {\n        start: create$2(selection.dom.getRoot(), CaretPosition$1.fromRangeStart(rng)),\n        end: create$2(selection.dom.getRoot(), CaretPosition$1.fromRangeEnd(rng))\n      };\n    };\n    var getRangeBookmark = function (selection) {\n      return { rng: selection.getRng() };\n    };\n    var createBookmarkSpan = function (dom, id, filled) {\n      var args = {\n        'data-mce-type': 'bookmark',\n        'id': id,\n        'style': 'overflow:hidden;line-height:0px'\n      };\n      return filled ? dom.create('span', args, '&#xFEFF;') : dom.create('span', args);\n    };\n    var getPersistentBookmark = function (selection, filled) {\n      var dom = selection.dom;\n      var rng = selection.getRng();\n      var id = dom.uniqueId();\n      var collapsed = selection.isCollapsed();\n      var element = selection.getNode();\n      var name = element.nodeName;\n      if (name === 'IMG') {\n        return {\n          name: name,\n          index: findIndex$2(dom, name, element)\n        };\n      }\n      var rng2 = normalizeTableCellSelection(rng.cloneRange());\n      if (!collapsed) {\n        rng2.collapse(false);\n        var endBookmarkNode = createBookmarkSpan(dom, id + '_end', filled);\n        rangeInsertNode(dom, rng2, endBookmarkNode);\n      }\n      rng = normalizeTableCellSelection(rng);\n      rng.collapse(true);\n      var startBookmarkNode = createBookmarkSpan(dom, id + '_start', filled);\n      rangeInsertNode(dom, rng, startBookmarkNode);\n      selection.moveToBookmark({\n        id: id,\n        keep: 1\n      });\n      return { id: id };\n    };\n    var getBookmark = function (selection, type, normalized) {\n      if (type === 2) {\n        return getOffsetBookmark(Zwsp.trim, normalized, selection);\n      } else if (type === 3) {\n        return getCaretBookmark(selection);\n      } else if (type) {\n        return getRangeBookmark(selection);\n      } else {\n        return getPersistentBookmark(selection, false);\n      }\n    };\n    var GetBookmark = {\n      getBookmark: getBookmark,\n      getUndoBookmark: curry(getOffsetBookmark, identity, true),\n      getPersistentBookmark: getPersistentBookmark\n    };\n\n    var TextWalker = function (startNode, rootNode, isBoundary) {\n      if (isBoundary === void 0) {\n        isBoundary = never;\n      }\n      var walker = new TreeWalker(startNode, rootNode);\n      var walk = function (direction) {\n        var next;\n        do {\n          next = walker[direction]();\n        } while (next && !NodeType.isText(next) && !isBoundary(next));\n        return Option.from(next).filter(NodeType.isText);\n      };\n      return {\n        current: function () {\n          return Option.from(walker.current()).filter(NodeType.isText);\n        },\n        next: function () {\n          return walk('next');\n        },\n        prev: function () {\n          return walk('prev');\n        },\n        prev2: function () {\n          return walk('prev2');\n        }\n      };\n    };\n\n    var TextSeeker = function (dom, isBoundary) {\n      var isBlockBoundary = isBoundary ? isBoundary : function (node) {\n        return dom.isBlock(node) || NodeType.isBr(node) || NodeType.isContentEditableFalse(node);\n      };\n      var walk = function (node, offset, walker, process) {\n        if (NodeType.isText(node)) {\n          var newOffset = process(node, offset, node.data);\n          if (newOffset !== -1) {\n            return Option.some({\n              container: node,\n              offset: newOffset\n            });\n          }\n        }\n        return walker().bind(function (next) {\n          return walk(next.container, next.offset, walker, process);\n        });\n      };\n      var backwards = function (node, offset, process, root) {\n        var walker = TextWalker(node, root, isBlockBoundary);\n        return walk(node, offset, function () {\n          return walker.prev().map(function (prev) {\n            return {\n              container: prev,\n              offset: prev.length\n            };\n          });\n        }, process).getOrNull();\n      };\n      var forwards = function (node, offset, process, root) {\n        var walker = TextWalker(node, root, isBlockBoundary);\n        return walk(node, offset, function () {\n          return walker.next().map(function (next) {\n            return {\n              container: next,\n              offset: 0\n            };\n          });\n        }, process).getOrNull();\n      };\n      return {\n        backwards: backwards,\n        forwards: forwards\n      };\n    };\n\n    var CARET_ID = '_mce_caret';\n    var isCaretNode = function (node) {\n      return NodeType.isElement(node) && node.id === CARET_ID;\n    };\n    var getParentCaretContainer = function (body, node) {\n      while (node && node !== body) {\n        if (node.id === CARET_ID) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    };\n\n    var isElement$4 = NodeType.isElement;\n    var isText$6 = NodeType.isText;\n    var removeNode = function (node) {\n      var parentNode = node.parentNode;\n      if (parentNode) {\n        parentNode.removeChild(node);\n      }\n    };\n    var getNodeValue = function (node) {\n      try {\n        return node.nodeValue;\n      } catch (ex) {\n        return '';\n      }\n    };\n    var setNodeValue = function (node, text) {\n      if (text.length === 0) {\n        removeNode(node);\n      } else {\n        node.nodeValue = text;\n      }\n    };\n    var trimCount = function (text) {\n      var trimmedText = Zwsp.trim(text);\n      return {\n        count: text.length - trimmedText.length,\n        text: trimmedText\n      };\n    };\n    var removeUnchanged = function (caretContainer, pos) {\n      remove$5(caretContainer);\n      return pos;\n    };\n    var removeTextAndReposition = function (caretContainer, pos) {\n      var before = trimCount(caretContainer.data.substr(0, pos.offset()));\n      var after = trimCount(caretContainer.data.substr(pos.offset()));\n      var text = before.text + after.text;\n      if (text.length > 0) {\n        setNodeValue(caretContainer, text);\n        return CaretPosition$1(caretContainer, pos.offset() - before.count);\n      } else {\n        return pos;\n      }\n    };\n    var removeElementAndReposition = function (caretContainer, pos) {\n      var parentNode = pos.container();\n      var newPosition = indexOf(from$1(parentNode.childNodes), caretContainer).map(function (index) {\n        return index < pos.offset() ? CaretPosition$1(parentNode, pos.offset() - 1) : pos;\n      }).getOr(pos);\n      remove$5(caretContainer);\n      return newPosition;\n    };\n    var removeTextCaretContainer = function (caretContainer, pos) {\n      return isText$6(caretContainer) && pos.container() === caretContainer ? removeTextAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);\n    };\n    var removeElementCaretContainer = function (caretContainer, pos) {\n      return pos.container() === caretContainer.parentNode ? removeElementAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);\n    };\n    var removeAndReposition = function (container, pos) {\n      return CaretPosition$1.isTextPosition(pos) ? removeTextCaretContainer(container, pos) : removeElementCaretContainer(container, pos);\n    };\n    var remove$5 = function (caretContainerNode) {\n      if (isElement$4(caretContainerNode) && isCaretContainer(caretContainerNode)) {\n        if (hasContent(caretContainerNode)) {\n          caretContainerNode.removeAttribute('data-mce-caret');\n        } else {\n          removeNode(caretContainerNode);\n        }\n      }\n      if (isText$6(caretContainerNode)) {\n        var text = Zwsp.trim(getNodeValue(caretContainerNode));\n        setNodeValue(caretContainerNode, text);\n      }\n    };\n    var CaretContainerRemove = {\n      removeAndReposition: removeAndReposition,\n      remove: remove$5\n    };\n\n    var DOM$1 = DOMUtils$1.DOM;\n    var getBodySetting = function (editor, name, defaultValue) {\n      var value = editor.getParam(name, defaultValue);\n      if (value.indexOf('=') !== -1) {\n        var bodyObj = editor.getParam(name, '', 'hash');\n        return bodyObj.hasOwnProperty(editor.id) ? bodyObj[editor.id] : defaultValue;\n      } else {\n        return value;\n      }\n    };\n    var getIframeAttrs = function (editor) {\n      return editor.getParam('iframe_attrs', {});\n    };\n    var getDocType = function (editor) {\n      return editor.getParam('doctype', '<!DOCTYPE html>');\n    };\n    var getDocumentBaseUrl = function (editor) {\n      return editor.getParam('document_base_url', '');\n    };\n    var getBodyId = function (editor) {\n      return getBodySetting(editor, 'body_id', 'tinymce');\n    };\n    var getBodyClass = function (editor) {\n      return getBodySetting(editor, 'body_class', '');\n    };\n    var getContentSecurityPolicy = function (editor) {\n      return editor.getParam('content_security_policy', '');\n    };\n    var shouldPutBrInPre = function (editor) {\n      return editor.getParam('br_in_pre', true);\n    };\n    var getForcedRootBlock = function (editor) {\n      if (editor.getParam('force_p_newlines', false)) {\n        return 'p';\n      }\n      var block = editor.getParam('forced_root_block', 'p');\n      if (block === false) {\n        return '';\n      } else if (block === true) {\n        return 'p';\n      } else {\n        return block;\n      }\n    };\n    var getForcedRootBlockAttrs = function (editor) {\n      return editor.getParam('forced_root_block_attrs', {});\n    };\n    var getBrNewLineSelector = function (editor) {\n      return editor.getParam('br_newline_selector', '.mce-toc h2,figcaption,caption');\n    };\n    var getNoNewLineSelector = function (editor) {\n      return editor.getParam('no_newline_selector', '');\n    };\n    var shouldKeepStyles = function (editor) {\n      return editor.getParam('keep_styles', true);\n    };\n    var shouldEndContainerOnEmptyBlock = function (editor) {\n      return editor.getParam('end_container_on_empty_block', false);\n    };\n    var getFontStyleValues = function (editor) {\n      return Tools.explode(editor.getParam('font_size_style_values', 'xx-small,x-small,small,medium,large,x-large,xx-large'));\n    };\n    var getFontSizeClasses = function (editor) {\n      return Tools.explode(editor.getParam('font_size_classes', ''));\n    };\n    var getImagesDataImgFilter = function (editor) {\n      return editor.getParam('images_dataimg_filter', constant(true), 'function');\n    };\n    var isAutomaticUploadsEnabled = function (editor) {\n      return editor.getParam('automatic_uploads', true, 'boolean');\n    };\n    var shouldReuseFileName = function (editor) {\n      return editor.getParam('images_reuse_filename', false, 'boolean');\n    };\n    var shouldReplaceBlobUris = function (editor) {\n      return editor.getParam('images_replace_blob_uris', true, 'boolean');\n    };\n    var getIconPackName = function (editor) {\n      return editor.getParam('icons', '', 'string');\n    };\n    var getIconsUrl = function (editor) {\n      return editor.getParam('icons_url', '', 'string');\n    };\n    var getImageUploadUrl = function (editor) {\n      return editor.getParam('images_upload_url', '', 'string');\n    };\n    var getImageUploadBasePath = function (editor) {\n      return editor.getParam('images_upload_base_path', '', 'string');\n    };\n    var getImagesUploadCredentials = function (editor) {\n      return editor.getParam('images_upload_credentials', false, 'boolean');\n    };\n    var getImagesUploadHandler = function (editor) {\n      return editor.getParam('images_upload_handler', null, 'function');\n    };\n    var shouldUseContentCssCors = function (editor) {\n      return editor.getParam('content_css_cors', false, 'boolean');\n    };\n    var getReferrerPolicy = function (editor) {\n      return editor.getParam('referrer_policy', '', 'string');\n    };\n    var getLanguageCode = function (editor) {\n      return editor.getParam('language', 'en', 'string');\n    };\n    var getLanguageUrl = function (editor) {\n      return editor.getParam('language_url', '', 'string');\n    };\n    var shouldIndentUseMargin = function (editor) {\n      return editor.getParam('indent_use_margin', false);\n    };\n    var getIndentation = function (editor) {\n      return editor.getParam('indentation', '40px', 'string');\n    };\n    var getContentCss = function (editor) {\n      var contentCss = editor.settings.content_css;\n      if (isString(contentCss)) {\n        return map(contentCss.split(','), trim);\n      } else if (isArray(contentCss)) {\n        return contentCss;\n      } else if (contentCss === false || editor.inline) {\n        return [];\n      } else {\n        return ['default'];\n      }\n    };\n    var getDirectionality = function (editor) {\n      return editor.getParam('directionality', I18n.isRtl() ? 'rtl' : undefined);\n    };\n    var getInlineBoundarySelector = function (editor) {\n      return editor.getParam('inline_boundaries_selector', 'a[href],code,.mce-annotation', 'string');\n    };\n    var getObjectResizing = function (editor) {\n      return editor.getParam('object_resizing');\n    };\n    var getResizeImgProportional = function (editor) {\n      return editor.getParam('resize_img_proportional', true, 'boolean');\n    };\n    var getPlaceholder = function (editor) {\n      return editor.getParam('placeholder', DOM$1.getAttrib(editor.getElement(), 'placeholder'), 'string');\n    };\n    var Settings = {\n      getIframeAttrs: getIframeAttrs,\n      getDocType: getDocType,\n      getDocumentBaseUrl: getDocumentBaseUrl,\n      getBodyId: getBodyId,\n      getBodyClass: getBodyClass,\n      getContentSecurityPolicy: getContentSecurityPolicy,\n      shouldPutBrInPre: shouldPutBrInPre,\n      getForcedRootBlock: getForcedRootBlock,\n      getForcedRootBlockAttrs: getForcedRootBlockAttrs,\n      getBrNewLineSelector: getBrNewLineSelector,\n      getNoNewLineSelector: getNoNewLineSelector,\n      shouldKeepStyles: shouldKeepStyles,\n      shouldEndContainerOnEmptyBlock: shouldEndContainerOnEmptyBlock,\n      getFontStyleValues: getFontStyleValues,\n      getFontSizeClasses: getFontSizeClasses,\n      getIconPackName: getIconPackName,\n      getIconsUrl: getIconsUrl,\n      getImagesDataImgFilter: getImagesDataImgFilter,\n      isAutomaticUploadsEnabled: isAutomaticUploadsEnabled,\n      shouldReuseFileName: shouldReuseFileName,\n      shouldReplaceBlobUris: shouldReplaceBlobUris,\n      getImageUploadUrl: getImageUploadUrl,\n      getImageUploadBasePath: getImageUploadBasePath,\n      getImagesUploadCredentials: getImagesUploadCredentials,\n      getImagesUploadHandler: getImagesUploadHandler,\n      shouldUseContentCssCors: shouldUseContentCssCors,\n      getReferrerPolicy: getReferrerPolicy,\n      getLanguageCode: getLanguageCode,\n      getLanguageUrl: getLanguageUrl,\n      shouldIndentUseMargin: shouldIndentUseMargin,\n      getIndentation: getIndentation,\n      getContentCss: getContentCss,\n      getDirectionality: getDirectionality,\n      getInlineBoundarySelector: getInlineBoundarySelector,\n      getObjectResizing: getObjectResizing,\n      getResizeImgProportional: getResizeImgProportional,\n      getPlaceholder: getPlaceholder\n    };\n\n    var browser$3 = detect$3().browser;\n    var isContentEditableFalse$3 = NodeType.isContentEditableFalse;\n    var isTableCell$1 = function (node) {\n      return NodeType.isElement(node) && /^(TD|TH)$/i.test(node.tagName);\n    };\n    var getAbsoluteClientRect = function (root, element, before) {\n      var clientRect = collapse(element.getBoundingClientRect(), before);\n      var docElm, scrollX, scrollY, margin, rootRect;\n      if (root.tagName === 'BODY') {\n        docElm = root.ownerDocument.documentElement;\n        scrollX = root.scrollLeft || docElm.scrollLeft;\n        scrollY = root.scrollTop || docElm.scrollTop;\n      } else {\n        rootRect = root.getBoundingClientRect();\n        scrollX = root.scrollLeft - rootRect.left;\n        scrollY = root.scrollTop - rootRect.top;\n      }\n      clientRect.left += scrollX;\n      clientRect.right += scrollX;\n      clientRect.top += scrollY;\n      clientRect.bottom += scrollY;\n      clientRect.width = 1;\n      margin = element.offsetWidth - element.clientWidth;\n      if (margin > 0) {\n        if (before) {\n          margin *= -1;\n        }\n        clientRect.left += margin;\n        clientRect.right += margin;\n      }\n      return clientRect;\n    };\n    var trimInlineCaretContainers = function (root) {\n      var contentEditableFalseNodes, node, sibling, i, data;\n      contentEditableFalseNodes = DomQuery('*[contentEditable=false]', root);\n      for (i = 0; i < contentEditableFalseNodes.length; i++) {\n        node = contentEditableFalseNodes[i];\n        sibling = node.previousSibling;\n        if (endsWithCaretContainer(sibling)) {\n          data = sibling.data;\n          if (data.length === 1) {\n            sibling.parentNode.removeChild(sibling);\n          } else {\n            sibling.deleteData(data.length - 1, 1);\n          }\n        }\n        sibling = node.nextSibling;\n        if (startsWithCaretContainer(sibling)) {\n          data = sibling.data;\n          if (data.length === 1) {\n            sibling.parentNode.removeChild(sibling);\n          } else {\n            sibling.deleteData(0, 1);\n          }\n        }\n      }\n    };\n    var FakeCaret = function (editor, root, isBlock, hasFocus) {\n      var lastVisualCaret = Cell(Option.none());\n      var cursorInterval, caretContainerNode;\n      var rootBlock = Settings.getForcedRootBlock(editor);\n      var caretBlock = rootBlock.length > 0 ? rootBlock : 'p';\n      var show = function (before, element) {\n        var clientRect, rng;\n        hide();\n        if (isTableCell$1(element)) {\n          return null;\n        }\n        if (isBlock(element)) {\n          caretContainerNode = insertBlock(caretBlock, element, before);\n          clientRect = getAbsoluteClientRect(root, element, before);\n          DomQuery(caretContainerNode).css('top', clientRect.top);\n          var caret = DomQuery('<div class=\"mce-visual-caret\" data-mce-bogus=\"all\"></div>').css(clientRect).appendTo(root)[0];\n          lastVisualCaret.set(Option.some({\n            caret: caret,\n            element: element,\n            before: before\n          }));\n          lastVisualCaret.get().each(function (caretState) {\n            if (before) {\n              DomQuery(caretState.caret).addClass('mce-visual-caret-before');\n            }\n          });\n          startBlink();\n          rng = element.ownerDocument.createRange();\n          rng.setStart(caretContainerNode, 0);\n          rng.setEnd(caretContainerNode, 0);\n        } else {\n          caretContainerNode = insertInline(element, before);\n          rng = element.ownerDocument.createRange();\n          if (isContentEditableFalse$3(caretContainerNode.nextSibling)) {\n            rng.setStart(caretContainerNode, 0);\n            rng.setEnd(caretContainerNode, 0);\n          } else {\n            rng.setStart(caretContainerNode, 1);\n            rng.setEnd(caretContainerNode, 1);\n          }\n          return rng;\n        }\n        return rng;\n      };\n      var hide = function () {\n        trimInlineCaretContainers(root);\n        if (caretContainerNode) {\n          CaretContainerRemove.remove(caretContainerNode);\n          caretContainerNode = null;\n        }\n        lastVisualCaret.get().each(function (caretState) {\n          DomQuery(caretState.caret).remove();\n          lastVisualCaret.set(Option.none());\n        });\n        Delay.clearInterval(cursorInterval);\n      };\n      var startBlink = function () {\n        cursorInterval = Delay.setInterval(function () {\n          if (hasFocus()) {\n            DomQuery('div.mce-visual-caret', root).toggleClass('mce-visual-caret-hidden');\n          } else {\n            DomQuery('div.mce-visual-caret', root).addClass('mce-visual-caret-hidden');\n          }\n        }, 500);\n      };\n      var reposition = function () {\n        lastVisualCaret.get().each(function (caretState) {\n          var clientRect = getAbsoluteClientRect(root, caretState.element, caretState.before);\n          DomQuery(caretState.caret).css(__assign({}, clientRect));\n        });\n      };\n      var destroy = function () {\n        return Delay.clearInterval(cursorInterval);\n      };\n      var getCss = function () {\n        return '.mce-visual-caret {' + 'position: absolute;' + 'background-color: black;' + 'background-color: currentcolor;' + '}' + '.mce-visual-caret-hidden {' + 'display: none;' + '}' + '*[data-mce-caret] {' + 'position: absolute;' + 'left: -1000px;' + 'right: auto;' + 'top: 0;' + 'margin: 0;' + 'padding: 0;' + '}';\n      };\n      return {\n        show: show,\n        hide: hide,\n        getCss: getCss,\n        reposition: reposition,\n        destroy: destroy\n      };\n    };\n    var isFakeCaretTableBrowser = function () {\n      return browser$3.isIE() || browser$3.isEdge() || browser$3.isFirefox();\n    };\n    var isFakeCaretTarget = function (node) {\n      return isContentEditableFalse$3(node) || NodeType.isTable(node) && isFakeCaretTableBrowser();\n    };\n\n    var isContentEditableFalse$4 = NodeType.isContentEditableFalse;\n    var isBlockLike = NodeType.matchStyleValues('display', 'block table table-cell table-caption list-item');\n    var isCaretContainer$2 = isCaretContainer;\n    var isCaretContainerBlock$1 = isCaretContainerBlock;\n    var isElement$5 = NodeType.isElement;\n    var isCaretCandidate$2 = isCaretCandidate;\n    var isForwards = function (direction) {\n      return direction > 0;\n    };\n    var isBackwards = function (direction) {\n      return direction < 0;\n    };\n    var skipCaretContainers = function (walk, shallow) {\n      var node;\n      while (node = walk(shallow)) {\n        if (!isCaretContainerBlock$1(node)) {\n          return node;\n        }\n      }\n      return null;\n    };\n    var findNode = function (node, direction, predicateFn, rootNode, shallow) {\n      var walker = new TreeWalker(node, rootNode);\n      if (isBackwards(direction)) {\n        if (isContentEditableFalse$4(node) || isCaretContainerBlock$1(node)) {\n          node = skipCaretContainers(walker.prev, true);\n          if (predicateFn(node)) {\n            return node;\n          }\n        }\n        while (node = skipCaretContainers(walker.prev, shallow)) {\n          if (predicateFn(node)) {\n            return node;\n          }\n        }\n      }\n      if (isForwards(direction)) {\n        if (isContentEditableFalse$4(node) || isCaretContainerBlock$1(node)) {\n          node = skipCaretContainers(walker.next, true);\n          if (predicateFn(node)) {\n            return node;\n          }\n        }\n        while (node = skipCaretContainers(walker.next, shallow)) {\n          if (predicateFn(node)) {\n            return node;\n          }\n        }\n      }\n      return null;\n    };\n    var getParentBlock = function (node, rootNode) {\n      while (node && node !== rootNode) {\n        if (isBlockLike(node)) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    };\n    var isInSameBlock = function (caretPosition1, caretPosition2, rootNode) {\n      return getParentBlock(caretPosition1.container(), rootNode) === getParentBlock(caretPosition2.container(), rootNode);\n    };\n    var getChildNodeAtRelativeOffset = function (relativeOffset, caretPosition) {\n      var container, offset;\n      if (!caretPosition) {\n        return null;\n      }\n      container = caretPosition.container();\n      offset = caretPosition.offset();\n      if (!isElement$5(container)) {\n        return null;\n      }\n      return container.childNodes[offset + relativeOffset];\n    };\n    var beforeAfter = function (before, node) {\n      var range = node.ownerDocument.createRange();\n      if (before) {\n        range.setStartBefore(node);\n        range.setEndBefore(node);\n      } else {\n        range.setStartAfter(node);\n        range.setEndAfter(node);\n      }\n      return range;\n    };\n    var isNodesInSameBlock = function (root, node1, node2) {\n      return getParentBlock(node1, root) === getParentBlock(node2, root);\n    };\n    var lean = function (left, root, node) {\n      var sibling, siblingName;\n      if (left) {\n        siblingName = 'previousSibling';\n      } else {\n        siblingName = 'nextSibling';\n      }\n      while (node && node !== root) {\n        sibling = node[siblingName];\n        if (isCaretContainer$2(sibling)) {\n          sibling = sibling[siblingName];\n        }\n        if (isContentEditableFalse$4(sibling)) {\n          if (isNodesInSameBlock(root, sibling, node)) {\n            return sibling;\n          }\n          break;\n        }\n        if (isCaretCandidate$2(sibling)) {\n          break;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    };\n    var before$2 = curry(beforeAfter, true);\n    var after$1 = curry(beforeAfter, false);\n    var normalizeRange = function (direction, root, range) {\n      var node, container, offset, location;\n      var leanLeft = curry(lean, true, root);\n      var leanRight = curry(lean, false, root);\n      container = range.startContainer;\n      offset = range.startOffset;\n      if (isCaretContainerBlock(container)) {\n        if (!isElement$5(container)) {\n          container = container.parentNode;\n        }\n        location = container.getAttribute('data-mce-caret');\n        if (location === 'before') {\n          node = container.nextSibling;\n          if (isFakeCaretTarget(node)) {\n            return before$2(node);\n          }\n        }\n        if (location === 'after') {\n          node = container.previousSibling;\n          if (isFakeCaretTarget(node)) {\n            return after$1(node);\n          }\n        }\n      }\n      if (!range.collapsed) {\n        return range;\n      }\n      if (NodeType.isText(container)) {\n        if (isCaretContainer$2(container)) {\n          if (direction === 1) {\n            node = leanRight(container);\n            if (node) {\n              return before$2(node);\n            }\n            node = leanLeft(container);\n            if (node) {\n              return after$1(node);\n            }\n          }\n          if (direction === -1) {\n            node = leanLeft(container);\n            if (node) {\n              return after$1(node);\n            }\n            node = leanRight(container);\n            if (node) {\n              return before$2(node);\n            }\n          }\n          return range;\n        }\n        if (endsWithCaretContainer(container) && offset >= container.data.length - 1) {\n          if (direction === 1) {\n            node = leanRight(container);\n            if (node) {\n              return before$2(node);\n            }\n          }\n          return range;\n        }\n        if (startsWithCaretContainer(container) && offset <= 1) {\n          if (direction === -1) {\n            node = leanLeft(container);\n            if (node) {\n              return after$1(node);\n            }\n          }\n          return range;\n        }\n        if (offset === container.data.length) {\n          node = leanRight(container);\n          if (node) {\n            return before$2(node);\n          }\n          return range;\n        }\n        if (offset === 0) {\n          node = leanLeft(container);\n          if (node) {\n            return after$1(node);\n          }\n          return range;\n        }\n      }\n      return range;\n    };\n    var getRelativeCefElm = function (forward, caretPosition) {\n      return Option.from(getChildNodeAtRelativeOffset(forward ? 0 : -1, caretPosition)).filter(isContentEditableFalse$4);\n    };\n    var getNormalizedRangeEndPoint = function (direction, root, range) {\n      var normalizedRange = normalizeRange(direction, root, range);\n      if (direction === -1) {\n        return CaretPosition.fromRangeStart(normalizedRange);\n      }\n      return CaretPosition.fromRangeEnd(normalizedRange);\n    };\n    var getElementFromPosition = function (pos) {\n      return Option.from(pos.getNode()).map(Element.fromDom);\n    };\n    var getElementFromPrevPosition = function (pos) {\n      return Option.from(pos.getNode(true)).map(Element.fromDom);\n    };\n    var getVisualCaretPosition = function (walkFn, caretPosition) {\n      while (caretPosition = walkFn(caretPosition)) {\n        if (caretPosition.isVisible()) {\n          return caretPosition;\n        }\n      }\n      return caretPosition;\n    };\n    var isMoveInsideSameBlock = function (from, to) {\n      var inSameBlock = isInSameBlock(from, to);\n      if (!inSameBlock && NodeType.isBr(from.getNode())) {\n        return true;\n      }\n      return inSameBlock;\n    };\n\n    var HDirection;\n    (function (HDirection) {\n      HDirection[HDirection['Backwards'] = -1] = 'Backwards';\n      HDirection[HDirection['Forwards'] = 1] = 'Forwards';\n    }(HDirection || (HDirection = {})));\n    var isContentEditableFalse$5 = NodeType.isContentEditableFalse;\n    var isText$7 = NodeType.isText;\n    var isElement$6 = NodeType.isElement;\n    var isBr$4 = NodeType.isBr;\n    var isCaretCandidate$3 = isCaretCandidate;\n    var isAtomic$1 = isAtomic;\n    var isEditableCaretCandidate$1 = isEditableCaretCandidate;\n    var getParents = function (node, root) {\n      var parents = [];\n      while (node && node !== root) {\n        parents.push(node);\n        node = node.parentNode;\n      }\n      return parents;\n    };\n    var nodeAtIndex = function (container, offset) {\n      if (container.hasChildNodes() && offset < container.childNodes.length) {\n        return container.childNodes[offset];\n      }\n      return null;\n    };\n    var getCaretCandidatePosition = function (direction, node) {\n      if (isForwards(direction)) {\n        if (isCaretCandidate$3(node.previousSibling) && !isText$7(node.previousSibling)) {\n          return CaretPosition$1.before(node);\n        }\n        if (isText$7(node)) {\n          return CaretPosition$1(node, 0);\n        }\n      }\n      if (isBackwards(direction)) {\n        if (isCaretCandidate$3(node.nextSibling) && !isText$7(node.nextSibling)) {\n          return CaretPosition$1.after(node);\n        }\n        if (isText$7(node)) {\n          return CaretPosition$1(node, node.data.length);\n        }\n      }\n      if (isBackwards(direction)) {\n        if (isBr$4(node)) {\n          return CaretPosition$1.before(node);\n        }\n        return CaretPosition$1.after(node);\n      }\n      return CaretPosition$1.before(node);\n    };\n    var moveForwardFromBr = function (root, nextNode) {\n      var nextSibling = nextNode.nextSibling;\n      if (nextSibling && isCaretCandidate$3(nextSibling)) {\n        if (isText$7(nextSibling)) {\n          return CaretPosition$1(nextSibling, 0);\n        } else {\n          return CaretPosition$1.before(nextSibling);\n        }\n      } else {\n        return findCaretPosition(HDirection.Forwards, CaretPosition$1.after(nextNode), root);\n      }\n    };\n    var findCaretPosition = function (direction, startPos, root) {\n      var node, nextNode, innerNode;\n      var rootContentEditableFalseElm, caretPosition;\n      if (!isElement$6(root) || !startPos) {\n        return null;\n      }\n      if (startPos.isEqual(CaretPosition$1.after(root)) && root.lastChild) {\n        caretPosition = CaretPosition$1.after(root.lastChild);\n        if (isBackwards(direction) && isCaretCandidate$3(root.lastChild) && isElement$6(root.lastChild)) {\n          return isBr$4(root.lastChild) ? CaretPosition$1.before(root.lastChild) : caretPosition;\n        }\n      } else {\n        caretPosition = startPos;\n      }\n      var container = caretPosition.container();\n      var offset = caretPosition.offset();\n      if (isText$7(container)) {\n        if (isBackwards(direction) && offset > 0) {\n          return CaretPosition$1(container, --offset);\n        }\n        if (isForwards(direction) && offset < container.length) {\n          return CaretPosition$1(container, ++offset);\n        }\n        node = container;\n      } else {\n        if (isBackwards(direction) && offset > 0) {\n          nextNode = nodeAtIndex(container, offset - 1);\n          if (isCaretCandidate$3(nextNode)) {\n            if (!isAtomic$1(nextNode)) {\n              innerNode = findNode(nextNode, direction, isEditableCaretCandidate$1, nextNode);\n              if (innerNode) {\n                if (isText$7(innerNode)) {\n                  return CaretPosition$1(innerNode, innerNode.data.length);\n                }\n                return CaretPosition$1.after(innerNode);\n              }\n            }\n            if (isText$7(nextNode)) {\n              return CaretPosition$1(nextNode, nextNode.data.length);\n            }\n            return CaretPosition$1.before(nextNode);\n          }\n        }\n        if (isForwards(direction) && offset < container.childNodes.length) {\n          nextNode = nodeAtIndex(container, offset);\n          if (isCaretCandidate$3(nextNode)) {\n            if (isBr$4(nextNode)) {\n              return moveForwardFromBr(root, nextNode);\n            }\n            if (!isAtomic$1(nextNode)) {\n              innerNode = findNode(nextNode, direction, isEditableCaretCandidate$1, nextNode);\n              if (innerNode) {\n                if (isText$7(innerNode)) {\n                  return CaretPosition$1(innerNode, 0);\n                }\n                return CaretPosition$1.before(innerNode);\n              }\n            }\n            if (isText$7(nextNode)) {\n              return CaretPosition$1(nextNode, 0);\n            }\n            return CaretPosition$1.after(nextNode);\n          }\n        }\n        node = nextNode ? nextNode : caretPosition.getNode();\n      }\n      if (isForwards(direction) && caretPosition.isAtEnd() || isBackwards(direction) && caretPosition.isAtStart()) {\n        node = findNode(node, direction, constant(true), root, true);\n        if (isEditableCaretCandidate$1(node, root)) {\n          return getCaretCandidatePosition(direction, node);\n        }\n      }\n      nextNode = findNode(node, direction, isEditableCaretCandidate$1, root);\n      rootContentEditableFalseElm = ArrUtils.last(filter(getParents(container, root), isContentEditableFalse$5));\n      if (rootContentEditableFalseElm && (!nextNode || !rootContentEditableFalseElm.contains(nextNode))) {\n        if (isForwards(direction)) {\n          caretPosition = CaretPosition$1.after(rootContentEditableFalseElm);\n        } else {\n          caretPosition = CaretPosition$1.before(rootContentEditableFalseElm);\n        }\n        return caretPosition;\n      }\n      if (nextNode) {\n        return getCaretCandidatePosition(direction, nextNode);\n      }\n      return null;\n    };\n    var CaretWalker = function (root) {\n      return {\n        next: function (caretPosition) {\n          return findCaretPosition(HDirection.Forwards, caretPosition, root);\n        },\n        prev: function (caretPosition) {\n          return findCaretPosition(HDirection.Backwards, caretPosition, root);\n        }\n      };\n    };\n\n    var walkToPositionIn = function (forward, root, start) {\n      var position = forward ? CaretPosition$1.before(start) : CaretPosition$1.after(start);\n      return fromPosition(forward, root, position);\n    };\n    var afterElement = function (node) {\n      return NodeType.isBr(node) ? CaretPosition$1.before(node) : CaretPosition$1.after(node);\n    };\n    var isBeforeOrStart = function (position) {\n      if (CaretPosition$1.isTextPosition(position)) {\n        return position.offset() === 0;\n      } else {\n        return isCaretCandidate(position.getNode());\n      }\n    };\n    var isAfterOrEnd = function (position) {\n      if (CaretPosition$1.isTextPosition(position)) {\n        var container = position.container();\n        return position.offset() === container.data.length;\n      } else {\n        return isCaretCandidate(position.getNode(true));\n      }\n    };\n    var isBeforeAfterSameElement = function (from, to) {\n      return !CaretPosition$1.isTextPosition(from) && !CaretPosition$1.isTextPosition(to) && from.getNode() === to.getNode(true);\n    };\n    var isAtBr = function (position) {\n      return !CaretPosition$1.isTextPosition(position) && NodeType.isBr(position.getNode());\n    };\n    var shouldSkipPosition = function (forward, from, to) {\n      if (forward) {\n        return !isBeforeAfterSameElement(from, to) && !isAtBr(from) && isAfterOrEnd(from) && isBeforeOrStart(to);\n      } else {\n        return !isBeforeAfterSameElement(to, from) && isBeforeOrStart(from) && isAfterOrEnd(to);\n      }\n    };\n    var fromPosition = function (forward, root, pos) {\n      var walker = CaretWalker(root);\n      return Option.from(forward ? walker.next(pos) : walker.prev(pos));\n    };\n    var navigate = function (forward, root, from) {\n      return fromPosition(forward, root, from).bind(function (to) {\n        if (isInSameBlock(from, to, root) && shouldSkipPosition(forward, from, to)) {\n          return fromPosition(forward, root, to);\n        } else {\n          return Option.some(to);\n        }\n      });\n    };\n    var navigateIgnore = function (forward, root, from, ignoreFilter) {\n      return navigate(forward, root, from).bind(function (pos) {\n        return ignoreFilter(pos) ? navigateIgnore(forward, root, pos, ignoreFilter) : Option.some(pos);\n      });\n    };\n    var positionIn = function (forward, element) {\n      var startNode = forward ? element.firstChild : element.lastChild;\n      if (NodeType.isText(startNode)) {\n        return Option.some(CaretPosition$1(startNode, forward ? 0 : startNode.data.length));\n      } else if (startNode) {\n        if (isCaretCandidate(startNode)) {\n          return Option.some(forward ? CaretPosition$1.before(startNode) : afterElement(startNode));\n        } else {\n          return walkToPositionIn(forward, element, startNode);\n        }\n      } else {\n        return Option.none();\n      }\n    };\n    var nextPosition = curry(fromPosition, true);\n    var prevPosition = curry(fromPosition, false);\n    var CaretFinder = {\n      fromPosition: fromPosition,\n      nextPosition: nextPosition,\n      prevPosition: prevPosition,\n      navigate: navigate,\n      navigateIgnore: navigateIgnore,\n      positionIn: positionIn,\n      firstPositionIn: curry(positionIn, true),\n      lastPositionIn: curry(positionIn, false)\n    };\n\n    var isStringPathBookmark = function (bookmark) {\n      return typeof bookmark.start === 'string';\n    };\n    var isRangeBookmark = function (bookmark) {\n      return bookmark.hasOwnProperty('rng');\n    };\n    var isIdBookmark = function (bookmark) {\n      return bookmark.hasOwnProperty('id');\n    };\n    var isIndexBookmark = function (bookmark) {\n      return bookmark.hasOwnProperty('name');\n    };\n    var isPathBookmark = function (bookmark) {\n      return Tools.isArray(bookmark.start);\n    };\n\n    var addBogus = function (dom, node) {\n      if (NodeType.isElement(node) && dom.isBlock(node) && !node.innerHTML && !Env.ie) {\n        node.innerHTML = '<br data-mce-bogus=\"1\" />';\n      }\n      return node;\n    };\n    var resolveCaretPositionBookmark = function (dom, bookmark) {\n      var rng, pos;\n      rng = dom.createRng();\n      pos = resolve$1(dom.getRoot(), bookmark.start);\n      rng.setStart(pos.container(), pos.offset());\n      pos = resolve$1(dom.getRoot(), bookmark.end);\n      rng.setEnd(pos.container(), pos.offset());\n      return rng;\n    };\n    var insertZwsp = function (node, rng) {\n      var textNode = node.ownerDocument.createTextNode(Zwsp.ZWSP);\n      node.appendChild(textNode);\n      rng.setStart(textNode, 0);\n      rng.setEnd(textNode, 0);\n    };\n    var isEmpty = function (node) {\n      return node.hasChildNodes() === false;\n    };\n    var tryFindRangePosition = function (node, rng) {\n      return CaretFinder.lastPositionIn(node).fold(function () {\n        return false;\n      }, function (pos) {\n        rng.setStart(pos.container(), pos.offset());\n        rng.setEnd(pos.container(), pos.offset());\n        return true;\n      });\n    };\n    var padEmptyCaretContainer = function (root, node, rng) {\n      if (isEmpty(node) && getParentCaretContainer(root, node)) {\n        insertZwsp(node, rng);\n        return true;\n      } else {\n        return false;\n      }\n    };\n    var setEndPoint = function (dom, start, bookmark, rng) {\n      var point = bookmark[start ? 'start' : 'end'];\n      var i, node, offset, children;\n      var root = dom.getRoot();\n      if (point) {\n        offset = point[0];\n        for (node = root, i = point.length - 1; i >= 1; i--) {\n          children = node.childNodes;\n          if (padEmptyCaretContainer(root, node, rng)) {\n            return true;\n          }\n          if (point[i] > children.length - 1) {\n            if (padEmptyCaretContainer(root, node, rng)) {\n              return true;\n            }\n            return tryFindRangePosition(node, rng);\n          }\n          node = children[point[i]];\n        }\n        if (node.nodeType === 3) {\n          offset = Math.min(point[0], node.nodeValue.length);\n        }\n        if (node.nodeType === 1) {\n          offset = Math.min(point[0], node.childNodes.length);\n        }\n        if (start) {\n          rng.setStart(node, offset);\n        } else {\n          rng.setEnd(node, offset);\n        }\n      }\n      return true;\n    };\n    var isValidTextNode = function (node) {\n      return NodeType.isText(node) && node.data.length > 0;\n    };\n    var restoreEndPoint = function (dom, suffix, bookmark) {\n      var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev;\n      var keep = bookmark.keep;\n      var container, offset;\n      if (marker) {\n        node = marker.parentNode;\n        if (suffix === 'start') {\n          if (!keep) {\n            idx = dom.nodeIndex(marker);\n          } else {\n            if (marker.hasChildNodes()) {\n              node = marker.firstChild;\n              idx = 1;\n            } else if (isValidTextNode(marker.nextSibling)) {\n              node = marker.nextSibling;\n              idx = 0;\n            } else if (isValidTextNode(marker.previousSibling)) {\n              node = marker.previousSibling;\n              idx = marker.previousSibling.data.length;\n            } else {\n              node = marker.parentNode;\n              idx = dom.nodeIndex(marker) + 1;\n            }\n          }\n          container = node;\n          offset = idx;\n        } else {\n          if (!keep) {\n            idx = dom.nodeIndex(marker);\n          } else {\n            if (marker.hasChildNodes()) {\n              node = marker.firstChild;\n              idx = 1;\n            } else if (isValidTextNode(marker.previousSibling)) {\n              node = marker.previousSibling;\n              idx = marker.previousSibling.data.length;\n            } else {\n              node = marker.parentNode;\n              idx = dom.nodeIndex(marker);\n            }\n          }\n          container = node;\n          offset = idx;\n        }\n        if (!keep) {\n          prev = marker.previousSibling;\n          next = marker.nextSibling;\n          Tools.each(Tools.grep(marker.childNodes), function (node) {\n            if (NodeType.isText(node)) {\n              node.nodeValue = node.nodeValue.replace(/\\uFEFF/g, '');\n            }\n          });\n          while (marker = dom.get(bookmark.id + '_' + suffix)) {\n            dom.remove(marker, true);\n          }\n          if (prev && next && prev.nodeType === next.nodeType && NodeType.isText(prev) && !Env.opera) {\n            idx = prev.nodeValue.length;\n            prev.appendData(next.nodeValue);\n            dom.remove(next);\n            if (suffix === 'start') {\n              container = prev;\n              offset = idx;\n            } else {\n              container = prev;\n              offset = idx;\n            }\n          }\n        }\n        return Option.some(CaretPosition$1(container, offset));\n      } else {\n        return Option.none();\n      }\n    };\n    var resolvePaths = function (dom, bookmark) {\n      var rng = dom.createRng();\n      if (setEndPoint(dom, true, bookmark, rng) && setEndPoint(dom, false, bookmark, rng)) {\n        return Option.some(rng);\n      } else {\n        return Option.none();\n      }\n    };\n    var resolveId = function (dom, bookmark) {\n      var startPos = restoreEndPoint(dom, 'start', bookmark);\n      var endPos = restoreEndPoint(dom, 'end', bookmark);\n      return lift2(startPos, endPos.or(startPos), function (spos, epos) {\n        var rng = dom.createRng();\n        rng.setStart(addBogus(dom, spos.container()), spos.offset());\n        rng.setEnd(addBogus(dom, epos.container()), epos.offset());\n        return rng;\n      });\n    };\n    var resolveIndex$1 = function (dom, bookmark) {\n      return Option.from(dom.select(bookmark.name)[bookmark.index]).map(function (elm) {\n        var rng = dom.createRng();\n        rng.selectNode(elm);\n        return rng;\n      });\n    };\n    var resolve$2 = function (selection, bookmark) {\n      var dom = selection.dom;\n      if (bookmark) {\n        if (isPathBookmark(bookmark)) {\n          return resolvePaths(dom, bookmark);\n        } else if (isStringPathBookmark(bookmark)) {\n          return Option.some(resolveCaretPositionBookmark(dom, bookmark));\n        } else if (isIdBookmark(bookmark)) {\n          return resolveId(dom, bookmark);\n        } else if (isIndexBookmark(bookmark)) {\n          return resolveIndex$1(dom, bookmark);\n        } else if (isRangeBookmark(bookmark)) {\n          return Option.some(bookmark.rng);\n        }\n      }\n      return Option.none();\n    };\n    var ResolveBookmark = { resolve: resolve$2 };\n\n    var getBookmark$1 = function (selection, type, normalized) {\n      return GetBookmark.getBookmark(selection, type, normalized);\n    };\n    var moveToBookmark = function (selection, bookmark) {\n      ResolveBookmark.resolve(selection, bookmark).each(function (rng) {\n        selection.setRng(rng);\n      });\n    };\n    var isBookmarkNode$1 = function (node) {\n      return NodeType.isElement(node) && node.tagName === 'SPAN' && node.getAttribute('data-mce-type') === 'bookmark';\n    };\n    var Bookmarks = {\n      getBookmark: getBookmark$1,\n      moveToBookmark: moveToBookmark,\n      isBookmarkNode: isBookmarkNode$1\n    };\n\n    var is$2 = function (expected) {\n      return function (actual) {\n        return expected === actual;\n      };\n    };\n    var isNbsp = is$2(nbsp);\n    var isWhiteSpace$1 = function (chr) {\n      return chr !== '' && ' \\f\\n\\r\\t\\x0B'.indexOf(chr) !== -1;\n    };\n    var isContent = function (chr) {\n      return !isWhiteSpace$1(chr) && !isNbsp(chr);\n    };\n\n    var isNode = function (node) {\n      return !!node.nodeType;\n    };\n    var isInlineBlock = function (node) {\n      return node && /^(IMG)$/.test(node.nodeName);\n    };\n    var moveStart = function (dom, selection, rng) {\n      var offset = rng.startOffset;\n      var container = rng.startContainer, walker, node, nodes;\n      if (rng.startContainer === rng.endContainer) {\n        if (isInlineBlock(rng.startContainer.childNodes[rng.startOffset])) {\n          return;\n        }\n      }\n      if (container.nodeType === 1) {\n        nodes = container.childNodes;\n        if (offset < nodes.length) {\n          container = nodes[offset];\n          walker = new TreeWalker(container, dom.getParent(container, dom.isBlock));\n        } else {\n          container = nodes[nodes.length - 1];\n          walker = new TreeWalker(container, dom.getParent(container, dom.isBlock));\n          walker.next(true);\n        }\n        for (node = walker.current(); node; node = walker.next()) {\n          if (node.nodeType === 3 && !isWhiteSpaceNode(node)) {\n            rng.setStart(node, 0);\n            selection.setRng(rng);\n            return;\n          }\n        }\n      }\n    };\n    var getNonWhiteSpaceSibling = function (node, next, inc) {\n      if (node) {\n        var nextName = next ? 'nextSibling' : 'previousSibling';\n        for (node = inc ? node : node[nextName]; node; node = node[nextName]) {\n          if (node.nodeType === 1 || !isWhiteSpaceNode(node)) {\n            return node;\n          }\n        }\n      }\n    };\n    var isTextBlock$1 = function (editor, name) {\n      if (isNode(name)) {\n        name = name.nodeName;\n      }\n      return !!editor.schema.getTextBlockElements()[name.toLowerCase()];\n    };\n    var isValid = function (ed, parent, child) {\n      return ed.schema.isValidChild(parent, child);\n    };\n    var isWhiteSpaceNode = function (node) {\n      return node && NodeType.isText(node) && /^([\\t \\r\\n]+|)$/.test(node.nodeValue);\n    };\n    var isEmptyTextNode = function (node) {\n      return node && NodeType.isText(node) && node.length === 0;\n    };\n    var replaceVars = function (value, vars) {\n      if (typeof value !== 'string') {\n        value = value(vars);\n      } else if (vars) {\n        value = value.replace(/%(\\w+)/g, function (str, name) {\n          return vars[name] || str;\n        });\n      }\n      return value;\n    };\n    var isEq = function (str1, str2) {\n      str1 = str1 || '';\n      str2 = str2 || '';\n      str1 = '' + (str1.nodeName || str1);\n      str2 = '' + (str2.nodeName || str2);\n      return str1.toLowerCase() === str2.toLowerCase();\n    };\n    var normalizeStyleValue = function (dom, value, name) {\n      if (name === 'color' || name === 'backgroundColor') {\n        value = dom.toHex(value);\n      }\n      if (name === 'fontWeight' && value === 700) {\n        value = 'bold';\n      }\n      if (name === 'fontFamily') {\n        value = value.replace(/[\\'\\\"]/g, '').replace(/,\\s+/g, ',');\n      }\n      return '' + value;\n    };\n    var getStyle = function (dom, node, name) {\n      return normalizeStyleValue(dom, dom.getStyle(node, name), name);\n    };\n    var getTextDecoration = function (dom, node) {\n      var decoration;\n      dom.getParent(node, function (n) {\n        decoration = dom.getStyle(n, 'text-decoration');\n        return decoration && decoration !== 'none';\n      });\n      return decoration;\n    };\n    var getParents$1 = function (dom, node, selector) {\n      return dom.getParents(node, selector, dom.getRoot());\n    };\n\n    var isBookmarkNode$2 = Bookmarks.isBookmarkNode;\n    var getParents$2 = getParents$1, isWhiteSpaceNode$1 = isWhiteSpaceNode, isTextBlock$2 = isTextBlock$1;\n    var isBogusBr = function (node) {\n      return node.nodeName === 'BR' && node.getAttribute('data-mce-bogus') && !node.nextSibling;\n    };\n    var findParentContentEditable = function (dom, node) {\n      var parent = node;\n      while (parent) {\n        if (NodeType.isElement(parent) && dom.getContentEditable(parent)) {\n          return dom.getContentEditable(parent) === 'false' ? parent : node;\n        }\n        parent = parent.parentNode;\n      }\n      return node;\n    };\n    var walkText = function (start, node, offset, predicate) {\n      var str = node.data;\n      for (var i = offset; start ? i >= 0 : i < str.length; start ? i-- : i++) {\n        if (predicate(str.charAt(i))) {\n          return start ? i + 1 : i;\n        }\n      }\n      return -1;\n    };\n    var findSpace = function (start, node, offset) {\n      return walkText(start, node, offset, function (c) {\n        return isNbsp(c) || isWhiteSpace$1(c);\n      });\n    };\n    var findContent = function (start, node, offset) {\n      return walkText(start, node, offset, isContent);\n    };\n    var findWordEndPoint = function (dom, body, container, offset, start, includeTrailingSpaces) {\n      var lastTextNode;\n      var rootNode = dom.getParent(container, dom.isBlock) || body;\n      var walk = function (container, offset, pred) {\n        var textSeeker = TextSeeker(dom);\n        var walker = start ? textSeeker.backwards : textSeeker.forwards;\n        return Option.from(walker(container, offset, function (text, textOffset) {\n          if (isBookmarkNode$2(text.parentNode)) {\n            return -1;\n          } else {\n            lastTextNode = text;\n            return pred(start, text, textOffset);\n          }\n        }, rootNode));\n      };\n      var spaceResult = walk(container, offset, findSpace);\n      return spaceResult.bind(function (result) {\n        return includeTrailingSpaces ? walk(result.container, result.offset + (start ? -1 : 0), findContent) : Option.some(result);\n      }).orThunk(function () {\n        return lastTextNode ? Option.some({\n          container: lastTextNode,\n          offset: start ? 0 : lastTextNode.length\n        }) : Option.none();\n      });\n    };\n    var findSelectorEndPoint = function (dom, format, rng, container, siblingName) {\n      if (NodeType.isText(container) && container.nodeValue.length === 0 && container[siblingName]) {\n        container = container[siblingName];\n      }\n      var parents = getParents$2(dom, container);\n      for (var i = 0; i < parents.length; i++) {\n        for (var y = 0; y < format.length; y++) {\n          var curFormat = format[y];\n          if ('collapsed' in curFormat && curFormat.collapsed !== rng.collapsed) {\n            continue;\n          }\n          if (dom.is(parents[i], curFormat.selector)) {\n            return parents[i];\n          }\n        }\n      }\n      return container;\n    };\n    var findBlockEndPoint = function (editor, format, container, siblingName) {\n      var node;\n      var dom = editor.dom;\n      var root = dom.getRoot();\n      if (!format[0].wrapper) {\n        node = dom.getParent(container, format[0].block, root);\n      }\n      if (!node) {\n        var scopeRoot = dom.getParent(container, 'LI,TD,TH');\n        node = dom.getParent(NodeType.isText(container) ? container.parentNode : container, function (node) {\n          return node !== root && isTextBlock$2(editor, node);\n        }, scopeRoot);\n      }\n      if (node && format[0].wrapper) {\n        node = getParents$2(dom, node, 'ul,ol').reverse()[0] || node;\n      }\n      if (!node) {\n        node = container;\n        while (node[siblingName] && !dom.isBlock(node[siblingName])) {\n          node = node[siblingName];\n          if (isEq(node, 'br')) {\n            break;\n          }\n        }\n      }\n      return node || container;\n    };\n    var findParentContainer = function (dom, format, startContainer, startOffset, endContainer, endOffset, start) {\n      var container, parent, sibling, siblingName, root;\n      container = parent = start ? startContainer : endContainer;\n      siblingName = start ? 'previousSibling' : 'nextSibling';\n      root = dom.getRoot();\n      if (NodeType.isText(container) && !isWhiteSpaceNode$1(container)) {\n        if (start ? startOffset > 0 : endOffset < container.nodeValue.length) {\n          return container;\n        }\n      }\n      while (true) {\n        if (!format[0].block_expand && dom.isBlock(parent)) {\n          return parent;\n        }\n        for (sibling = parent[siblingName]; sibling; sibling = sibling[siblingName]) {\n          if (!isBookmarkNode$2(sibling) && !isWhiteSpaceNode$1(sibling) && !isBogusBr(sibling)) {\n            return parent;\n          }\n        }\n        if (parent === root || parent.parentNode === root) {\n          container = parent;\n          break;\n        }\n        parent = parent.parentNode;\n      }\n      return container;\n    };\n    var expandRng = function (editor, rng, format, includeTrailingSpace) {\n      if (includeTrailingSpace === void 0) {\n        includeTrailingSpace = false;\n      }\n      var startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset;\n      var dom = editor.dom;\n      if (NodeType.isElement(startContainer) && startContainer.hasChildNodes()) {\n        startContainer = getNode(startContainer, startOffset);\n        if (NodeType.isText(startContainer)) {\n          startOffset = 0;\n        }\n      }\n      if (NodeType.isElement(endContainer) && endContainer.hasChildNodes()) {\n        endContainer = getNode(endContainer, rng.collapsed ? endOffset : endOffset - 1);\n        if (NodeType.isText(endContainer)) {\n          endOffset = endContainer.nodeValue.length;\n        }\n      }\n      startContainer = findParentContentEditable(dom, startContainer);\n      endContainer = findParentContentEditable(dom, endContainer);\n      if (isBookmarkNode$2(startContainer.parentNode) || isBookmarkNode$2(startContainer)) {\n        startContainer = isBookmarkNode$2(startContainer) ? startContainer : startContainer.parentNode;\n        if (rng.collapsed) {\n          startContainer = startContainer.previousSibling || startContainer;\n        } else {\n          startContainer = startContainer.nextSibling || startContainer;\n        }\n        if (NodeType.isText(startContainer)) {\n          startOffset = rng.collapsed ? startContainer.length : 0;\n        }\n      }\n      if (isBookmarkNode$2(endContainer.parentNode) || isBookmarkNode$2(endContainer)) {\n        endContainer = isBookmarkNode$2(endContainer) ? endContainer : endContainer.parentNode;\n        if (rng.collapsed) {\n          endContainer = endContainer.nextSibling || endContainer;\n        } else {\n          endContainer = endContainer.previousSibling || endContainer;\n        }\n        if (NodeType.isText(endContainer)) {\n          endOffset = rng.collapsed ? 0 : endContainer.length;\n        }\n      }\n      if (rng.collapsed) {\n        var startPoint = findWordEndPoint(dom, editor.getBody(), startContainer, startOffset, true, includeTrailingSpace);\n        startPoint.each(function (_a) {\n          var container = _a.container, offset = _a.offset;\n          startContainer = container;\n          startOffset = offset;\n        });\n        var endPoint = findWordEndPoint(dom, editor.getBody(), endContainer, endOffset, false, includeTrailingSpace);\n        endPoint.each(function (_a) {\n          var container = _a.container, offset = _a.offset;\n          endContainer = container;\n          endOffset = offset;\n        });\n      }\n      if (format[0].inline || format[0].block_expand) {\n        if (!format[0].inline || (!NodeType.isText(startContainer) || startOffset === 0)) {\n          startContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, true);\n        }\n        if (!format[0].inline || (!NodeType.isText(endContainer) || endOffset === endContainer.nodeValue.length)) {\n          endContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, false);\n        }\n      }\n      if (format[0].selector && format[0].expand !== false && !format[0].inline) {\n        startContainer = findSelectorEndPoint(dom, format, rng, startContainer, 'previousSibling');\n        endContainer = findSelectorEndPoint(dom, format, rng, endContainer, 'nextSibling');\n      }\n      if (format[0].block || format[0].selector) {\n        startContainer = findBlockEndPoint(editor, format, startContainer, 'previousSibling');\n        endContainer = findBlockEndPoint(editor, format, endContainer, 'nextSibling');\n        if (format[0].block) {\n          if (!dom.isBlock(startContainer)) {\n            startContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, true);\n          }\n          if (!dom.isBlock(endContainer)) {\n            endContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, false);\n          }\n        }\n      }\n      if (NodeType.isElement(startContainer)) {\n        startOffset = dom.nodeIndex(startContainer);\n        startContainer = startContainer.parentNode;\n      }\n      if (NodeType.isElement(endContainer)) {\n        endOffset = dom.nodeIndex(endContainer) + 1;\n        endContainer = endContainer.parentNode;\n      }\n      return {\n        startContainer: startContainer,\n        startOffset: startOffset,\n        endContainer: endContainer,\n        endOffset: endOffset\n      };\n    };\n\n    var each$7 = Tools.each;\n    var clampToExistingChildren = function (container, index) {\n      var childNodes = container.childNodes;\n      if (index >= childNodes.length) {\n        index = childNodes.length - 1;\n      } else if (index < 0) {\n        index = 0;\n      }\n      return childNodes[index] || container;\n    };\n    var getEndChild = function (container, index) {\n      return clampToExistingChildren(container, index - 1);\n    };\n    var walk$1 = function (dom, rng, callback) {\n      var startContainer = rng.startContainer;\n      var startOffset = rng.startOffset;\n      var endContainer = rng.endContainer;\n      var endOffset = rng.endOffset;\n      var nodes = dom.select('td[data-mce-selected],th[data-mce-selected]');\n      if (nodes.length > 0) {\n        each$7(nodes, function (node) {\n          callback([node]);\n        });\n        return;\n      }\n      var exclude = function (nodes) {\n        var node;\n        node = nodes[0];\n        if (node.nodeType === 3 && node === startContainer && startOffset >= node.nodeValue.length) {\n          nodes.splice(0, 1);\n        }\n        node = nodes[nodes.length - 1];\n        if (endOffset === 0 && nodes.length > 0 && node === endContainer && node.nodeType === 3) {\n          nodes.splice(nodes.length - 1, 1);\n        }\n        return nodes;\n      };\n      var collectSiblings = function (node, name, endNode) {\n        var siblings = [];\n        for (; node && node !== endNode; node = node[name]) {\n          siblings.push(node);\n        }\n        return siblings;\n      };\n      var findEndPoint = function (node, root) {\n        do {\n          if (node.parentNode === root) {\n            return node;\n          }\n          node = node.parentNode;\n        } while (node);\n      };\n      var walkBoundary = function (startNode, endNode, next) {\n        var siblingName = next ? 'nextSibling' : 'previousSibling';\n        for (var node = startNode, parent_1 = node.parentNode; node && node !== endNode; node = parent_1) {\n          parent_1 = node.parentNode;\n          var siblings_1 = collectSiblings(node === startNode ? node : node[siblingName], siblingName);\n          if (siblings_1.length) {\n            if (!next) {\n              siblings_1.reverse();\n            }\n            callback(exclude(siblings_1));\n          }\n        }\n      };\n      if (startContainer.nodeType === 1 && startContainer.hasChildNodes()) {\n        startContainer = clampToExistingChildren(startContainer, startOffset);\n      }\n      if (endContainer.nodeType === 1 && endContainer.hasChildNodes()) {\n        endContainer = getEndChild(endContainer, endOffset);\n      }\n      if (startContainer === endContainer) {\n        return callback(exclude([startContainer]));\n      }\n      var ancestor = dom.findCommonAncestor(startContainer, endContainer);\n      for (var node = startContainer; node; node = node.parentNode) {\n        if (node === endContainer) {\n          return walkBoundary(startContainer, ancestor, true);\n        }\n        if (node === ancestor) {\n          break;\n        }\n      }\n      for (var node = endContainer; node; node = node.parentNode) {\n        if (node === startContainer) {\n          return walkBoundary(endContainer, ancestor);\n        }\n        if (node === ancestor) {\n          break;\n        }\n      }\n      var startPoint = findEndPoint(startContainer, ancestor) || startContainer;\n      var endPoint = findEndPoint(endContainer, ancestor) || endContainer;\n      walkBoundary(startContainer, startPoint, true);\n      var siblings = collectSiblings(startPoint === startContainer ? startPoint : startPoint.nextSibling, 'nextSibling', endPoint === endContainer ? endPoint.nextSibling : endPoint);\n      if (siblings.length) {\n        callback(exclude(siblings));\n      }\n      walkBoundary(endContainer, endPoint);\n    };\n    var RangeWalk = { walk: walk$1 };\n\n    function NodeValue (is, name) {\n      var get = function (element) {\n        if (!is(element)) {\n          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');\n        }\n        return getOption(element).getOr('');\n      };\n      var getOption = function (element) {\n        return is(element) ? Option.from(element.dom().nodeValue) : Option.none();\n      };\n      var set = function (element, value) {\n        if (!is(element)) {\n          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');\n        }\n        element.dom().nodeValue = value;\n      };\n      return {\n        get: get,\n        getOption: getOption,\n        set: set\n      };\n    }\n\n    var api = NodeValue(isText, 'text');\n    var get$7 = function (element) {\n      return api.get(element);\n    };\n\n    var isZeroWidth = function (elem) {\n      return isText(elem) && get$7(elem) === zeroWidth;\n    };\n    var context = function (editor, elem, wrapName, nodeName) {\n      return parent(elem).fold(function () {\n        return 'skipping';\n      }, function (parent) {\n        if (nodeName === 'br' || isZeroWidth(elem)) {\n          return 'valid';\n        } else if (isAnnotation(elem)) {\n          return 'existing';\n        } else if (isCaretNode(elem)) {\n          return 'caret';\n        } else if (!isValid(editor, wrapName, nodeName) || !isValid(editor, name(parent), wrapName)) {\n          return 'invalid-child';\n        } else {\n          return 'valid';\n        }\n      });\n    };\n\n    var applyWordGrab = function (editor, rng) {\n      var r = expandRng(editor, rng, [{ inline: true }]);\n      rng.setStart(r.startContainer, r.startOffset);\n      rng.setEnd(r.endContainer, r.endOffset);\n      editor.selection.setRng(rng);\n    };\n    var makeAnnotation = function (eDoc, _a, annotationName, decorate) {\n      var _b = _a.uid, uid = _b === void 0 ? generate('mce-annotation') : _b, data = __rest(_a, ['uid']);\n      var master = Element.fromTag('span', eDoc);\n      add$3(master, annotation());\n      set(master, '' + dataAnnotationId(), uid);\n      set(master, '' + dataAnnotation(), annotationName);\n      var _c = decorate(uid, data), _d = _c.attributes, attributes = _d === void 0 ? {} : _d, _e = _c.classes, classes = _e === void 0 ? [] : _e;\n      setAll(master, attributes);\n      add$4(master, classes);\n      return master;\n    };\n    var annotate = function (editor, rng, annotationName, decorate, data) {\n      var newWrappers = [];\n      var master = makeAnnotation(editor.getDoc(), data, annotationName, decorate);\n      var wrapper = Cell(Option.none());\n      var finishWrapper = function () {\n        wrapper.set(Option.none());\n      };\n      var getOrOpenWrapper = function () {\n        return wrapper.get().getOrThunk(function () {\n          var nu = shallow(master);\n          newWrappers.push(nu);\n          wrapper.set(Option.some(nu));\n          return nu;\n        });\n      };\n      var processElements = function (elems) {\n        each(elems, processElement);\n      };\n      var processElement = function (elem) {\n        var ctx = context(editor, elem, 'span', name(elem));\n        switch (ctx) {\n        case 'invalid-child': {\n            finishWrapper();\n            var children$1 = children(elem);\n            processElements(children$1);\n            finishWrapper();\n            break;\n          }\n        case 'valid': {\n            var w = getOrOpenWrapper();\n            wrap(elem, w);\n            break;\n          }\n        }\n      };\n      var processNodes = function (nodes) {\n        var elems = map(nodes, Element.fromDom);\n        processElements(elems);\n      };\n      RangeWalk.walk(editor.dom, rng, function (nodes) {\n        finishWrapper();\n        processNodes(nodes);\n      });\n      return newWrappers;\n    };\n    var annotateWithBookmark = function (editor, name, settings, data) {\n      editor.undoManager.transact(function () {\n        var initialRng = editor.selection.getRng();\n        if (initialRng.collapsed) {\n          applyWordGrab(editor, initialRng);\n        }\n        if (editor.selection.getRng().collapsed) {\n          var wrapper = makeAnnotation(editor.getDoc(), data, name, settings.decorate);\n          set$1(wrapper, nbsp);\n          editor.selection.getRng().insertNode(wrapper.dom());\n          editor.selection.select(wrapper.dom());\n        } else {\n          var bookmark = GetBookmark.getPersistentBookmark(editor.selection, false);\n          var rng = editor.selection.getRng();\n          annotate(editor, rng, name, settings.decorate, data);\n          editor.selection.moveToBookmark(bookmark);\n        }\n      });\n    };\n\n    var Annotator = function (editor) {\n      var registry = create$1();\n      setup$1(editor, registry);\n      var changes = setup(editor);\n      return {\n        register: function (name, settings) {\n          registry.register(name, settings);\n        },\n        annotate: function (name, data) {\n          registry.lookup(name).each(function (settings) {\n            annotateWithBookmark(editor, name, settings, data);\n          });\n        },\n        annotationChanged: function (name, callback) {\n          changes.addListener(name, callback);\n        },\n        remove: function (name) {\n          identify(editor, Option.some(name)).each(function (_a) {\n            var elements = _a.elements;\n            each(elements, unwrap);\n          });\n        },\n        getAll: function (name) {\n          var directory = findAll(editor, name);\n          return map$1(directory, function (elems) {\n            return map(elems, function (elem) {\n              return elem.dom();\n            });\n          });\n        }\n      };\n    };\n\n    var whiteSpaceRegExp$3 = /^[ \\t\\r\\n]*$/;\n    var typeLookup = {\n      '#text': 3,\n      '#comment': 8,\n      '#cdata': 4,\n      '#pi': 7,\n      '#doctype': 10,\n      '#document-fragment': 11\n    };\n    var walk$2 = function (node, root, prev) {\n      var startName = prev ? 'lastChild' : 'firstChild';\n      var siblingName = prev ? 'prev' : 'next';\n      if (node[startName]) {\n        return node[startName];\n      }\n      if (node !== root) {\n        var sibling = node[siblingName];\n        if (sibling) {\n          return sibling;\n        }\n        for (var parent_1 = node.parent; parent_1 && parent_1 !== root; parent_1 = parent_1.parent) {\n          sibling = parent_1[siblingName];\n          if (sibling) {\n            return sibling;\n          }\n        }\n      }\n    };\n    var isEmptyTextNode$1 = function (node) {\n      if (!whiteSpaceRegExp$3.test(node.value)) {\n        return false;\n      }\n      var parentNode = node.parent;\n      if (parentNode && (parentNode.name !== 'span' || parentNode.attr('style')) && /^[ ]+$/.test(node.value)) {\n        return false;\n      }\n      return true;\n    };\n    var isNonEmptyElement = function (node) {\n      var isNamedAnchor = node.name === 'a' && !node.attr('href') && node.attr('id');\n      return node.attr('name') || node.attr('id') && !node.firstChild || node.attr('data-mce-bookmark') || isNamedAnchor;\n    };\n    var Node$1 = function () {\n      function Node(name, type) {\n        this.name = name;\n        this.type = type;\n        if (type === 1) {\n          this.attributes = [];\n          this.attributes.map = {};\n        }\n      }\n      Node.create = function (name, attrs) {\n        var node = new Node(name, typeLookup[name] || 1);\n        if (attrs) {\n          for (var attrName in attrs) {\n            node.attr(attrName, attrs[attrName]);\n          }\n        }\n        return node;\n      };\n      Node.prototype.replace = function (node) {\n        var self = this;\n        if (node.parent) {\n          node.remove();\n        }\n        self.insert(node, self);\n        self.remove();\n        return self;\n      };\n      Node.prototype.attr = function (name, value) {\n        var self = this;\n        var attrs;\n        if (typeof name !== 'string') {\n          for (var key in name) {\n            self.attr(key, name[key]);\n          }\n          return self;\n        }\n        if (attrs = self.attributes) {\n          if (value !== undefined) {\n            if (value === null) {\n              if (name in attrs.map) {\n                delete attrs.map[name];\n                var i = attrs.length;\n                while (i--) {\n                  if (attrs[i].name === name) {\n                    attrs.splice(i, 1);\n                    return self;\n                  }\n                }\n              }\n              return self;\n            }\n            if (name in attrs.map) {\n              var i = attrs.length;\n              while (i--) {\n                if (attrs[i].name === name) {\n                  attrs[i].value = value;\n                  break;\n                }\n              }\n            } else {\n              attrs.push({\n                name: name,\n                value: value\n              });\n            }\n            attrs.map[name] = value;\n            return self;\n          }\n          return attrs.map[name];\n        }\n      };\n      Node.prototype.clone = function () {\n        var self = this;\n        var clone = new Node(self.name, self.type);\n        var selfAttrs;\n        if (selfAttrs = self.attributes) {\n          var cloneAttrs = [];\n          cloneAttrs.map = {};\n          for (var i = 0, l = selfAttrs.length; i < l; i++) {\n            var selfAttr = selfAttrs[i];\n            if (selfAttr.name !== 'id') {\n              cloneAttrs[cloneAttrs.length] = {\n                name: selfAttr.name,\n                value: selfAttr.value\n              };\n              cloneAttrs.map[selfAttr.name] = selfAttr.value;\n            }\n          }\n          clone.attributes = cloneAttrs;\n        }\n        clone.value = self.value;\n        clone.shortEnded = self.shortEnded;\n        return clone;\n      };\n      Node.prototype.wrap = function (wrapper) {\n        var self = this;\n        self.parent.insert(wrapper, self);\n        wrapper.append(self);\n        return self;\n      };\n      Node.prototype.unwrap = function () {\n        var self = this;\n        for (var node = self.firstChild; node;) {\n          var next = node.next;\n          self.insert(node, self, true);\n          node = next;\n        }\n        self.remove();\n      };\n      Node.prototype.remove = function () {\n        var self = this, parent = self.parent, next = self.next, prev = self.prev;\n        if (parent) {\n          if (parent.firstChild === self) {\n            parent.firstChild = next;\n            if (next) {\n              next.prev = null;\n            }\n          } else {\n            prev.next = next;\n          }\n          if (parent.lastChild === self) {\n            parent.lastChild = prev;\n            if (prev) {\n              prev.next = null;\n            }\n          } else {\n            next.prev = prev;\n          }\n          self.parent = self.next = self.prev = null;\n        }\n        return self;\n      };\n      Node.prototype.append = function (node) {\n        var self = this;\n        if (node.parent) {\n          node.remove();\n        }\n        var last = self.lastChild;\n        if (last) {\n          last.next = node;\n          node.prev = last;\n          self.lastChild = node;\n        } else {\n          self.lastChild = self.firstChild = node;\n        }\n        node.parent = self;\n        return node;\n      };\n      Node.prototype.insert = function (node, refNode, before) {\n        if (node.parent) {\n          node.remove();\n        }\n        var parent = refNode.parent || this;\n        if (before) {\n          if (refNode === parent.firstChild) {\n            parent.firstChild = node;\n          } else {\n            refNode.prev.next = node;\n          }\n          node.prev = refNode.prev;\n          node.next = refNode;\n          refNode.prev = node;\n        } else {\n          if (refNode === parent.lastChild) {\n            parent.lastChild = node;\n          } else {\n            refNode.next.prev = node;\n          }\n          node.next = refNode.next;\n          node.prev = refNode;\n          refNode.next = node;\n        }\n        node.parent = parent;\n        return node;\n      };\n      Node.prototype.getAll = function (name) {\n        var self = this;\n        var collection = [];\n        for (var node = self.firstChild; node; node = walk$2(node, self)) {\n          if (node.name === name) {\n            collection.push(node);\n          }\n        }\n        return collection;\n      };\n      Node.prototype.empty = function () {\n        var self = this;\n        if (self.firstChild) {\n          var nodes = [];\n          for (var node = self.firstChild; node; node = walk$2(node, self)) {\n            nodes.push(node);\n          }\n          var i = nodes.length;\n          while (i--) {\n            var node = nodes[i];\n            node.parent = node.firstChild = node.lastChild = node.next = node.prev = null;\n          }\n        }\n        self.firstChild = self.lastChild = null;\n        return self;\n      };\n      Node.prototype.isEmpty = function (elements, whitespace, predicate) {\n        if (whitespace === void 0) {\n          whitespace = {};\n        }\n        var self = this;\n        var node = self.firstChild;\n        if (isNonEmptyElement(self)) {\n          return false;\n        }\n        if (node) {\n          do {\n            if (node.type === 1) {\n              if (node.attr('data-mce-bogus')) {\n                continue;\n              }\n              if (elements[node.name]) {\n                return false;\n              }\n              if (isNonEmptyElement(node)) {\n                return false;\n              }\n            }\n            if (node.type === 8) {\n              return false;\n            }\n            if (node.type === 3 && !isEmptyTextNode$1(node)) {\n              return false;\n            }\n            if (node.type === 3 && node.parent && whitespace[node.parent.name] && whiteSpaceRegExp$3.test(node.value)) {\n              return false;\n            }\n            if (predicate && predicate(node)) {\n              return false;\n            }\n          } while (node = walk$2(node, self));\n        }\n        return true;\n      };\n      Node.prototype.walk = function (prev) {\n        return walk$2(this, null, prev);\n      };\n      return Node;\n    }();\n\n    var isValidPrefixAttrName = function (name) {\n      return name.indexOf('data-') === 0 || name.indexOf('aria-') === 0;\n    };\n    var isInvalidUri = function (settings, uri) {\n      if (settings.allow_html_data_urls) {\n        return false;\n      } else if (/^data:image\\//i.test(uri)) {\n        return settings.allow_svg_data_urls === false && /^data:image\\/svg\\+xml/i.test(uri);\n      } else {\n        return /^data:/i.test(uri);\n      }\n    };\n    var findEndTagIndex = function (schema, html, startIndex) {\n      var count = 1, index, matches, tokenRegExp, shortEndedElements;\n      shortEndedElements = schema.getShortEndedElements();\n      tokenRegExp = /<([!?\\/])?([A-Za-z0-9\\-_\\:\\.]+)((?:\\s+[^\"\\'>]+(?:(?:\"[^\"]*\")|(?:\\'[^\\']*\\')|[^>]*))*|\\/|\\s+)>/g;\n      tokenRegExp.lastIndex = index = startIndex;\n      while (matches = tokenRegExp.exec(html)) {\n        index = tokenRegExp.lastIndex;\n        if (matches[1] === '/') {\n          count--;\n        } else if (!matches[1]) {\n          if (matches[2] in shortEndedElements) {\n            continue;\n          }\n          count++;\n        }\n        if (count === 0) {\n          break;\n        }\n      }\n      return index;\n    };\n    var isConditionalComment = function (html, startIndex) {\n      return /^\\s*\\[if [\\w\\W]+\\]>.*<!\\[endif\\](--!?)?>/.test(html.substr(startIndex));\n    };\n    var findCommentEndIndex = function (html, isBogus, startIndex) {\n      if (startIndex === void 0) {\n        startIndex = 0;\n      }\n      var lcHtml = html.toLowerCase();\n      if (lcHtml.indexOf('[if ', startIndex) !== -1 && isConditionalComment(lcHtml, startIndex)) {\n        var endIfIndex = lcHtml.indexOf('[endif]', startIndex);\n        return lcHtml.indexOf('>', endIfIndex);\n      } else {\n        if (isBogus) {\n          var endIndex = lcHtml.indexOf('>', startIndex);\n          return endIndex !== -1 ? endIndex : lcHtml.length;\n        } else {\n          var endCommentRegexp = /--!?>/;\n          endCommentRegexp.lastIndex = startIndex;\n          var match = endCommentRegexp.exec(html);\n          return match ? match.index + match[0].length : lcHtml.length;\n        }\n      }\n    };\n    var checkBogusAttribute = function (regExp, attrString) {\n      var matches = regExp.exec(attrString);\n      if (matches) {\n        var name_1 = matches[1];\n        var value = matches[2];\n        return typeof name_1 === 'string' && name_1.toLowerCase() === 'data-mce-bogus' ? value : null;\n      } else {\n        return null;\n      }\n    };\n    function SaxParser(settings, schema) {\n      if (schema === void 0) {\n        schema = Schema();\n      }\n      var noop = function () {\n      };\n      settings = settings || {};\n      if (settings.fix_self_closing !== false) {\n        settings.fix_self_closing = true;\n      }\n      var comment = settings.comment ? settings.comment : noop;\n      var cdata = settings.cdata ? settings.cdata : noop;\n      var text = settings.text ? settings.text : noop;\n      var start = settings.start ? settings.start : noop;\n      var end = settings.end ? settings.end : noop;\n      var pi = settings.pi ? settings.pi : noop;\n      var doctype = settings.doctype ? settings.doctype : noop;\n      var parse = function (html, format) {\n        if (format === void 0) {\n          format = 'html';\n        }\n        var matches, index = 0, value, endRegExp;\n        var stack = [];\n        var attrList, i, textData, name;\n        var isInternalElement, removeInternalElements, shortEndedElements, fillAttrsMap, isShortEnded;\n        var validate, elementRule, isValidElement, attr, attribsValue, validAttributesMap, validAttributePatterns;\n        var attributesRequired, attributesDefault, attributesForced, processHtml;\n        var anyAttributesRequired, selfClosing, tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0;\n        var decode = Entities.decode;\n        var fixSelfClosing;\n        var filteredUrlAttrs = Tools.makeMap('src,href,data,background,formaction,poster,xlink:href');\n        var scriptUriRegExp = /((java|vb)script|mhtml):/i;\n        var parsingMode = format === 'html' ? 0 : 1;\n        var processEndTag = function (name) {\n          var pos, i;\n          pos = stack.length;\n          while (pos--) {\n            if (stack[pos].name === name) {\n              break;\n            }\n          }\n          if (pos >= 0) {\n            for (i = stack.length - 1; i >= pos; i--) {\n              name = stack[i];\n              if (name.valid) {\n                end(name.name);\n              }\n            }\n            stack.length = pos;\n          }\n        };\n        var processComment = function (value) {\n          if (value === '') {\n            return;\n          }\n          if (value.charAt(0) === '>') {\n            value = ' ' + value;\n          }\n          if (!settings.allow_conditional_comments && value.substr(0, 3).toLowerCase() === '[if') {\n            value = ' ' + value;\n          }\n          comment(value);\n        };\n        var processMalformedComment = function (value, startIndex) {\n          var startTag = value || '';\n          var isBogus = !startsWith(startTag, '--');\n          var endIndex = findCommentEndIndex(html, isBogus, startIndex);\n          value = html.substr(startIndex, endIndex - startIndex);\n          processComment(isBogus ? startTag + value : value);\n          return endIndex + 1;\n        };\n        var parseAttribute = function (match, name, value, val2, val3) {\n          var attrRule, i;\n          var trimRegExp = /[\\s\\u0000-\\u001F]+/g;\n          name = name.toLowerCase();\n          value = name in fillAttrsMap ? name : decode(value || val2 || val3 || '');\n          if (validate && !isInternalElement && isValidPrefixAttrName(name) === false) {\n            attrRule = validAttributesMap[name];\n            if (!attrRule && validAttributePatterns) {\n              i = validAttributePatterns.length;\n              while (i--) {\n                attrRule = validAttributePatterns[i];\n                if (attrRule.pattern.test(name)) {\n                  break;\n                }\n              }\n              if (i === -1) {\n                attrRule = null;\n              }\n            }\n            if (!attrRule) {\n              return;\n            }\n            if (attrRule.validValues && !(value in attrRule.validValues)) {\n              return;\n            }\n          }\n          if (filteredUrlAttrs[name] && !settings.allow_script_urls) {\n            var uri = value.replace(trimRegExp, '');\n            try {\n              uri = decodeURIComponent(uri);\n            } catch (ex) {\n              uri = unescape(uri);\n            }\n            if (scriptUriRegExp.test(uri)) {\n              return;\n            }\n            if (isInvalidUri(settings, uri)) {\n              return;\n            }\n          }\n          if (isInternalElement && (name in filteredUrlAttrs || name.indexOf('on') === 0)) {\n            return;\n          }\n          attrList.map[name] = value;\n          attrList.push({\n            name: name,\n            value: value\n          });\n        };\n        tokenRegExp = new RegExp('<(?:' + '(?:!--([\\\\w\\\\W]*?)--!?>)|' + '(?:!\\\\[CDATA\\\\[([\\\\w\\\\W]*?)\\\\]\\\\]>)|' + '(?:![Dd][Oo][Cc][Tt][Yy][Pp][Ee]([\\\\w\\\\W]*?)>)|' + '(?:!(--)?)|' + '(?:\\\\?([^\\\\s\\\\/<>]+) ?([\\\\w\\\\W]*?)[?/]>)|' + '(?:\\\\/([A-Za-z][A-Za-z0-9\\\\-_\\\\:\\\\.]*)>)|' + '(?:([A-Za-z][A-Za-z0-9\\\\-_\\\\:\\\\.]*)((?:\\\\s+[^\"\\'>]+(?:(?:\"[^\"]*\")|(?:\\'[^\\']*\\')|[^>]*))*|\\\\/|\\\\s+)>)' + ')', 'g');\n        attrRegExp = /([\\w:\\-]+)(?:\\s*=\\s*(?:(?:\\\"((?:[^\\\"])*)\\\")|(?:\\'((?:[^\\'])*)\\')|([^>\\s]+)))?/g;\n        shortEndedElements = schema.getShortEndedElements();\n        selfClosing = settings.self_closing_elements || schema.getSelfClosingElements();\n        fillAttrsMap = schema.getBoolAttrs();\n        validate = settings.validate;\n        removeInternalElements = settings.remove_internals;\n        fixSelfClosing = settings.fix_self_closing;\n        specialElements = schema.getSpecialElements();\n        processHtml = html + '>';\n        while (matches = tokenRegExp.exec(processHtml)) {\n          var matchText = matches[0];\n          if (index < matches.index) {\n            text(decode(html.substr(index, matches.index - index)));\n          }\n          if (value = matches[7]) {\n            value = value.toLowerCase();\n            if (value.charAt(0) === ':') {\n              value = value.substr(1);\n            }\n            processEndTag(value);\n          } else if (value = matches[8]) {\n            if (matches.index + matchText.length > html.length) {\n              text(decode(html.substr(matches.index)));\n              index = matches.index + matchText.length;\n              continue;\n            }\n            value = value.toLowerCase();\n            if (value.charAt(0) === ':') {\n              value = value.substr(1);\n            }\n            isShortEnded = value in shortEndedElements;\n            if (fixSelfClosing && selfClosing[value] && stack.length > 0 && stack[stack.length - 1].name === value) {\n              processEndTag(value);\n            }\n            var bogusValue = checkBogusAttribute(attrRegExp, matches[9]);\n            if (bogusValue !== null) {\n              if (bogusValue === 'all') {\n                index = findEndTagIndex(schema, html, tokenRegExp.lastIndex);\n                tokenRegExp.lastIndex = index;\n                continue;\n              }\n              isValidElement = false;\n            }\n            if (!validate || (elementRule = schema.getElementRule(value))) {\n              isValidElement = true;\n              if (validate) {\n                validAttributesMap = elementRule.attributes;\n                validAttributePatterns = elementRule.attributePatterns;\n              }\n              if (attribsValue = matches[9]) {\n                isInternalElement = attribsValue.indexOf('data-mce-type') !== -1;\n                if (isInternalElement && removeInternalElements) {\n                  isValidElement = false;\n                }\n                attrList = [];\n                attrList.map = {};\n                attribsValue.replace(attrRegExp, parseAttribute);\n              } else {\n                attrList = [];\n                attrList.map = {};\n              }\n              if (validate && !isInternalElement) {\n                attributesRequired = elementRule.attributesRequired;\n                attributesDefault = elementRule.attributesDefault;\n                attributesForced = elementRule.attributesForced;\n                anyAttributesRequired = elementRule.removeEmptyAttrs;\n                if (anyAttributesRequired && !attrList.length) {\n                  isValidElement = false;\n                }\n                if (attributesForced) {\n                  i = attributesForced.length;\n                  while (i--) {\n                    attr = attributesForced[i];\n                    name = attr.name;\n                    attrValue = attr.value;\n                    if (attrValue === '{$uid}') {\n                      attrValue = 'mce_' + idCount++;\n                    }\n                    attrList.map[name] = attrValue;\n                    attrList.push({\n                      name: name,\n                      value: attrValue\n                    });\n                  }\n                }\n                if (attributesDefault) {\n                  i = attributesDefault.length;\n                  while (i--) {\n                    attr = attributesDefault[i];\n                    name = attr.name;\n                    if (!(name in attrList.map)) {\n                      attrValue = attr.value;\n                      if (attrValue === '{$uid}') {\n                        attrValue = 'mce_' + idCount++;\n                      }\n                      attrList.map[name] = attrValue;\n                      attrList.push({\n                        name: name,\n                        value: attrValue\n                      });\n                    }\n                  }\n                }\n                if (attributesRequired) {\n                  i = attributesRequired.length;\n                  while (i--) {\n                    if (attributesRequired[i] in attrList.map) {\n                      break;\n                    }\n                  }\n                  if (i === -1) {\n                    isValidElement = false;\n                  }\n                }\n                if (attr = attrList.map['data-mce-bogus']) {\n                  if (attr === 'all') {\n                    index = findEndTagIndex(schema, html, tokenRegExp.lastIndex);\n                    tokenRegExp.lastIndex = index;\n                    continue;\n                  }\n                  isValidElement = false;\n                }\n              }\n              if (isValidElement) {\n                start(value, attrList, isShortEnded);\n              }\n            } else {\n              isValidElement = false;\n            }\n            if (endRegExp = specialElements[value]) {\n              endRegExp.lastIndex = index = matches.index + matchText.length;\n              if (matches = endRegExp.exec(html)) {\n                if (isValidElement) {\n                  textData = html.substr(index, matches.index - index);\n                }\n                index = matches.index + matches[0].length;\n              } else {\n                textData = html.substr(index);\n                index = html.length;\n              }\n              if (isValidElement) {\n                if (textData.length > 0) {\n                  text(textData, true);\n                }\n                end(value);\n              }\n              tokenRegExp.lastIndex = index;\n              continue;\n            }\n            if (!isShortEnded) {\n              if (!attribsValue || attribsValue.indexOf('/') !== attribsValue.length - 1) {\n                stack.push({\n                  name: value,\n                  valid: isValidElement\n                });\n              } else if (isValidElement) {\n                end(value);\n              }\n            }\n          } else if (value = matches[1]) {\n            processComment(value);\n          } else if (value = matches[2]) {\n            var isValidCdataSection = parsingMode === 1 || settings.preserve_cdata || stack.length > 0 && schema.isValidChild(stack[stack.length - 1].name, '#cdata');\n            if (isValidCdataSection) {\n              cdata(value);\n            } else {\n              index = processMalformedComment('', matches.index + 2);\n              tokenRegExp.lastIndex = index;\n              continue;\n            }\n          } else if (value = matches[3]) {\n            doctype(value);\n          } else if ((value = matches[4]) || matchText === '<!') {\n            index = processMalformedComment(value, matches.index + matchText.length);\n            tokenRegExp.lastIndex = index;\n            continue;\n          } else if (value = matches[5]) {\n            if (parsingMode === 1) {\n              pi(value, matches[6]);\n            } else {\n              index = processMalformedComment('?', matches.index + 2);\n              tokenRegExp.lastIndex = index;\n              continue;\n            }\n          }\n          index = matches.index + matchText.length;\n        }\n        if (index < html.length) {\n          text(decode(html.substr(index)));\n        }\n        for (i = stack.length - 1; i >= 0; i--) {\n          value = stack[i];\n          if (value.valid) {\n            end(value.name);\n          }\n        }\n      };\n      return { parse: parse };\n    }\n    (function (SaxParser) {\n      SaxParser.findEndTag = findEndTagIndex;\n    }(SaxParser || (SaxParser = {})));\n    var SaxParser$1 = SaxParser;\n\n    var trimHtml = function (tempAttrs, html) {\n      var trimContentRegExp = new RegExp(['\\\\s?(' + tempAttrs.join('|') + ')=\"[^\"]+\"'].join('|'), 'gi');\n      return html.replace(trimContentRegExp, '');\n    };\n    var trimInternal = function (serializer, html) {\n      var content = html;\n      var bogusAllRegExp = /<(\\w+) [^>]*data-mce-bogus=\"all\"[^>]*>/g;\n      var endTagIndex, index, matchLength, matches, shortEndedElements;\n      var schema = serializer.schema;\n      content = trimHtml(serializer.getTempAttrs(), content);\n      shortEndedElements = schema.getShortEndedElements();\n      while (matches = bogusAllRegExp.exec(content)) {\n        index = bogusAllRegExp.lastIndex;\n        matchLength = matches[0].length;\n        if (shortEndedElements[matches[1]]) {\n          endTagIndex = index;\n        } else {\n          endTagIndex = SaxParser$1.findEndTag(schema, content, index);\n        }\n        content = content.substring(0, index - matchLength) + content.substring(endTagIndex);\n        bogusAllRegExp.lastIndex = index - matchLength;\n      }\n      return Zwsp.trim(content);\n    };\n    var trimExternal = trimInternal;\n    var TrimHtml = {\n      trimExternal: trimExternal,\n      trimInternal: trimInternal\n    };\n\n    var defaultFormat = 'html';\n    var trimEmptyContents = function (editor, html) {\n      var blockName = Settings.getForcedRootBlock(editor);\n      var emptyRegExp = new RegExp('^(<' + blockName + '[^>]*>(&nbsp;|&#160;|\\\\s|\\xA0|<br \\\\/>|)<\\\\/' + blockName + '>[\\r\\n]*|<br \\\\/>[\\r\\n]*)$');\n      return html.replace(emptyRegExp, '');\n    };\n    var getContentFromBody = function (editor, args, body) {\n      var content;\n      args.format = args.format ? args.format : defaultFormat;\n      args.get = true;\n      args.getInner = true;\n      if (!args.no_events) {\n        editor.fire('BeforeGetContent', args);\n      }\n      if (args.format === 'raw') {\n        content = Tools.trim(TrimHtml.trimExternal(editor.serializer, body.innerHTML));\n      } else if (args.format === 'text') {\n        content = Zwsp.trim(body.innerText || body.textContent);\n      } else if (args.format === 'tree') {\n        return editor.serializer.serialize(body, args);\n      } else {\n        content = trimEmptyContents(editor, editor.serializer.serialize(body, args));\n      }\n      if (args.format !== 'text' && !isWsPreserveElement(Element.fromDom(body))) {\n        args.content = Tools.trim(content);\n      } else {\n        args.content = content;\n      }\n      if (!args.no_events) {\n        editor.fire('GetContent', args);\n      }\n      return args.content;\n    };\n    var getContent = function (editor, args) {\n      if (args === void 0) {\n        args = {};\n      }\n      return Option.from(editor.getBody()).fold(constant(args.format === 'tree' ? new Node$1('body', 11) : ''), function (body) {\n        return getContentFromBody(editor, args, body);\n      });\n    };\n\n    var makeMap$3 = Tools.makeMap;\n    var Writer = function (settings) {\n      var html = [];\n      var indent, indentBefore, indentAfter, encode, htmlOutput;\n      settings = settings || {};\n      indent = settings.indent;\n      indentBefore = makeMap$3(settings.indent_before || '');\n      indentAfter = makeMap$3(settings.indent_after || '');\n      encode = Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities);\n      htmlOutput = settings.element_format === 'html';\n      return {\n        start: function (name, attrs, empty) {\n          var i, l, attr, value;\n          if (indent && indentBefore[name] && html.length > 0) {\n            value = html[html.length - 1];\n            if (value.length > 0 && value !== '\\n') {\n              html.push('\\n');\n            }\n          }\n          html.push('<', name);\n          if (attrs) {\n            for (i = 0, l = attrs.length; i < l; i++) {\n              attr = attrs[i];\n              html.push(' ', attr.name, '=\"', encode(attr.value, true), '\"');\n            }\n          }\n          if (!empty || htmlOutput) {\n            html[html.length] = '>';\n          } else {\n            html[html.length] = ' />';\n          }\n          if (empty && indent && indentAfter[name] && html.length > 0) {\n            value = html[html.length - 1];\n            if (value.length > 0 && value !== '\\n') {\n              html.push('\\n');\n            }\n          }\n        },\n        end: function (name) {\n          var value;\n          html.push('</', name, '>');\n          if (indent && indentAfter[name] && html.length > 0) {\n            value = html[html.length - 1];\n            if (value.length > 0 && value !== '\\n') {\n              html.push('\\n');\n            }\n          }\n        },\n        text: function (text, raw) {\n          if (text.length > 0) {\n            html[html.length] = raw ? text : encode(text);\n          }\n        },\n        cdata: function (text) {\n          html.push('<![CDATA[', text, ']]>');\n        },\n        comment: function (text) {\n          html.push('<!--', text, '-->');\n        },\n        pi: function (name, text) {\n          if (text) {\n            html.push('<?', name, ' ', encode(text), '?>');\n          } else {\n            html.push('<?', name, '?>');\n          }\n          if (indent) {\n            html.push('\\n');\n          }\n        },\n        doctype: function (text) {\n          html.push('<!DOCTYPE', text, '>', indent ? '\\n' : '');\n        },\n        reset: function () {\n          html.length = 0;\n        },\n        getContent: function () {\n          return html.join('').replace(/\\n$/, '');\n        }\n      };\n    };\n\n    var Serializer = function (settings, schema) {\n      if (schema === void 0) {\n        schema = Schema();\n      }\n      var writer = Writer(settings);\n      settings = settings || {};\n      settings.validate = 'validate' in settings ? settings.validate : true;\n      var serialize = function (node) {\n        var handlers, validate;\n        validate = settings.validate;\n        handlers = {\n          3: function (node) {\n            writer.text(node.value, node.raw);\n          },\n          8: function (node) {\n            writer.comment(node.value);\n          },\n          7: function (node) {\n            writer.pi(node.name, node.value);\n          },\n          10: function (node) {\n            writer.doctype(node.value);\n          },\n          4: function (node) {\n            writer.cdata(node.value);\n          },\n          11: function (node) {\n            if (node = node.firstChild) {\n              do {\n                walk(node);\n              } while (node = node.next);\n            }\n          }\n        };\n        writer.reset();\n        var walk = function (node) {\n          var handler = handlers[node.type];\n          var name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule;\n          if (!handler) {\n            name = node.name;\n            isEmpty = node.shortEnded;\n            attrs = node.attributes;\n            if (validate && attrs && attrs.length > 1) {\n              sortedAttrs = [];\n              sortedAttrs.map = {};\n              elementRule = schema.getElementRule(node.name);\n              if (elementRule) {\n                for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) {\n                  attrName = elementRule.attributesOrder[i];\n                  if (attrName in attrs.map) {\n                    attrValue = attrs.map[attrName];\n                    sortedAttrs.map[attrName] = attrValue;\n                    sortedAttrs.push({\n                      name: attrName,\n                      value: attrValue\n                    });\n                  }\n                }\n                for (i = 0, l = attrs.length; i < l; i++) {\n                  attrName = attrs[i].name;\n                  if (!(attrName in sortedAttrs.map)) {\n                    attrValue = attrs.map[attrName];\n                    sortedAttrs.map[attrName] = attrValue;\n                    sortedAttrs.push({\n                      name: attrName,\n                      value: attrValue\n                    });\n                  }\n                }\n                attrs = sortedAttrs;\n              }\n            }\n            writer.start(node.name, attrs, isEmpty);\n            if (!isEmpty) {\n              if (node = node.firstChild) {\n                do {\n                  walk(node);\n                } while (node = node.next);\n              }\n              writer.end(name);\n            }\n          } else {\n            handler(node);\n          }\n        };\n        if (node.type === 1 && !settings.inner) {\n          walk(node);\n        } else {\n          handlers[11](node);\n        }\n        return writer.getContent();\n      };\n      return { serialize: serialize };\n    };\n\n    var traverse = function (node, fn) {\n      fn(node);\n      if (node.firstChild) {\n        traverse(node.firstChild, fn);\n      }\n      if (node.next) {\n        traverse(node.next, fn);\n      }\n    };\n    var findMatchingNodes = function (nodeFilters, attributeFilters, node) {\n      var nodeMatches = {};\n      var attrMatches = {};\n      var matches = [];\n      if (node.firstChild) {\n        traverse(node.firstChild, function (node) {\n          each(nodeFilters, function (filter) {\n            if (filter.name === node.name) {\n              if (nodeMatches[filter.name]) {\n                nodeMatches[filter.name].nodes.push(node);\n              } else {\n                nodeMatches[filter.name] = {\n                  filter: filter,\n                  nodes: [node]\n                };\n              }\n            }\n          });\n          each(attributeFilters, function (filter) {\n            if (typeof node.attr(filter.name) === 'string') {\n              if (attrMatches[filter.name]) {\n                attrMatches[filter.name].nodes.push(node);\n              } else {\n                attrMatches[filter.name] = {\n                  filter: filter,\n                  nodes: [node]\n                };\n              }\n            }\n          });\n        });\n      }\n      for (var name_1 in nodeMatches) {\n        if (nodeMatches.hasOwnProperty(name_1)) {\n          matches.push(nodeMatches[name_1]);\n        }\n      }\n      for (var name_2 in attrMatches) {\n        if (attrMatches.hasOwnProperty(name_2)) {\n          matches.push(attrMatches[name_2]);\n        }\n      }\n      return matches;\n    };\n    var filter$3 = function (nodeFilters, attributeFilters, node) {\n      var matches = findMatchingNodes(nodeFilters, attributeFilters, node);\n      each(matches, function (match) {\n        each(match.filter.callbacks, function (callback) {\n          callback(match.nodes, match.filter.name, {});\n        });\n      });\n    };\n\n    var hasFocus = function (element) {\n      var doc = owner(element).dom();\n      return element.dom() === doc.activeElement;\n    };\n    var active = function (_doc) {\n      var doc = _doc !== undefined ? _doc.dom() : domGlobals.document;\n      return Option.from(doc.activeElement).map(Element.fromDom);\n    };\n    var search = function (element) {\n      return active(owner(element)).filter(function (e) {\n        return element.dom().contains(e.dom());\n      });\n    };\n\n    var generate$1 = function (cases) {\n      if (!isArray(cases)) {\n        throw new Error('cases must be an array');\n      }\n      if (cases.length === 0) {\n        throw new Error('there must be at least one case');\n      }\n      var constructors = [];\n      var adt = {};\n      each(cases, function (acase, count) {\n        var keys$1 = keys(acase);\n        if (keys$1.length !== 1) {\n          throw new Error('one and only one name per case');\n        }\n        var key = keys$1[0];\n        var value = acase[key];\n        if (adt[key] !== undefined) {\n          throw new Error('duplicate key detected:' + key);\n        } else if (key === 'cata') {\n          throw new Error('cannot have a case named cata (sorry)');\n        } else if (!isArray(value)) {\n          throw new Error('case arguments must be an array');\n        }\n        constructors.push(key);\n        adt[key] = function () {\n          var argLength = arguments.length;\n          if (argLength !== value.length) {\n            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);\n          }\n          var args = new Array(argLength);\n          for (var i = 0; i < args.length; i++) {\n            args[i] = arguments[i];\n          }\n          var match = function (branches) {\n            var branchKeys = keys(branches);\n            if (constructors.length !== branchKeys.length) {\n              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\\nActual: ' + branchKeys.join(','));\n            }\n            var allReqd = forall(constructors, function (reqKey) {\n              return contains(branchKeys, reqKey);\n            });\n            if (!allReqd) {\n              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\\nRequired: ' + constructors.join(', '));\n            }\n            return branches[key].apply(null, args);\n          };\n          return {\n            fold: function () {\n              if (arguments.length !== cases.length) {\n                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + arguments.length);\n              }\n              var target = arguments[count];\n              return target.apply(null, args);\n            },\n            match: match,\n            log: function (label) {\n              domGlobals.console.log(label, {\n                constructors: constructors,\n                constructor: key,\n                params: args\n              });\n            }\n          };\n        };\n      });\n      return adt;\n    };\n    var Adt = { generate: generate$1 };\n\n    var create$3 = Immutable('start', 'soffset', 'finish', 'foffset');\n    var SimRange = { create: create$3 };\n\n    var adt = Adt.generate([\n      { before: ['element'] },\n      {\n        on: [\n          'element',\n          'offset'\n        ]\n      },\n      { after: ['element'] }\n    ]);\n    var cata = function (subject, onBefore, onOn, onAfter) {\n      return subject.fold(onBefore, onOn, onAfter);\n    };\n    var getStart = function (situ) {\n      return situ.fold(identity, identity, identity);\n    };\n    var before$3 = adt.before;\n    var on = adt.on;\n    var after$2 = adt.after;\n    var Situ = {\n      before: before$3,\n      on: on,\n      after: after$2,\n      cata: cata,\n      getStart: getStart\n    };\n\n    var adt$1 = Adt.generate([\n      { domRange: ['rng'] },\n      {\n        relative: [\n          'startSitu',\n          'finishSitu'\n        ]\n      },\n      {\n        exact: [\n          'start',\n          'soffset',\n          'finish',\n          'foffset'\n        ]\n      }\n    ]);\n    var exactFromRange = function (simRange) {\n      return adt$1.exact(simRange.start(), simRange.soffset(), simRange.finish(), simRange.foffset());\n    };\n    var getStart$1 = function (selection) {\n      return selection.match({\n        domRange: function (rng) {\n          return Element.fromDom(rng.startContainer);\n        },\n        relative: function (startSitu, finishSitu) {\n          return Situ.getStart(startSitu);\n        },\n        exact: function (start, soffset, finish, foffset) {\n          return start;\n        }\n      });\n    };\n    var domRange = adt$1.domRange;\n    var relative = adt$1.relative;\n    var exact = adt$1.exact;\n    var getWin = function (selection) {\n      var start = getStart$1(selection);\n      return defaultView(start);\n    };\n    var range = SimRange.create;\n    var Selection = {\n      domRange: domRange,\n      relative: relative,\n      exact: exact,\n      exactFromRange: exactFromRange,\n      getWin: getWin,\n      range: range\n    };\n\n    var browser$4 = detect$3().browser;\n    var clamp = function (offset, element) {\n      var max = isText(element) ? get$7(element).length : children(element).length + 1;\n      if (offset > max) {\n        return max;\n      } else if (offset < 0) {\n        return 0;\n      }\n      return offset;\n    };\n    var normalizeRng = function (rng) {\n      return Selection.range(rng.start(), clamp(rng.soffset(), rng.start()), rng.finish(), clamp(rng.foffset(), rng.finish()));\n    };\n    var isOrContains = function (root, elm) {\n      return !NodeType.isRestrictedNode(elm.dom()) && (contains$2(root, elm) || eq(root, elm));\n    };\n    var isRngInRoot = function (root) {\n      return function (rng) {\n        return isOrContains(root, rng.start()) && isOrContains(root, rng.finish());\n      };\n    };\n    var shouldStore = function (editor) {\n      return editor.inline === true || browser$4.isIE();\n    };\n    var nativeRangeToSelectionRange = function (r) {\n      return Selection.range(Element.fromDom(r.startContainer), r.startOffset, Element.fromDom(r.endContainer), r.endOffset);\n    };\n    var readRange = function (win) {\n      var selection = win.getSelection();\n      var rng = !selection || selection.rangeCount === 0 ? Option.none() : Option.from(selection.getRangeAt(0));\n      return rng.map(nativeRangeToSelectionRange);\n    };\n    var getBookmark$2 = function (root) {\n      var win = defaultView(root);\n      return readRange(win.dom()).filter(isRngInRoot(root));\n    };\n    var validate = function (root, bookmark) {\n      return Option.from(bookmark).filter(isRngInRoot(root)).map(normalizeRng);\n    };\n    var bookmarkToNativeRng = function (bookmark) {\n      var rng = domGlobals.document.createRange();\n      try {\n        rng.setStart(bookmark.start().dom(), bookmark.soffset());\n        rng.setEnd(bookmark.finish().dom(), bookmark.foffset());\n        return Option.some(rng);\n      } catch (_) {\n        return Option.none();\n      }\n    };\n    var store = function (editor) {\n      var newBookmark = shouldStore(editor) ? getBookmark$2(Element.fromDom(editor.getBody())) : Option.none();\n      editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;\n    };\n    var storeNative = function (editor, rng) {\n      var root = Element.fromDom(editor.getBody());\n      var range = shouldStore(editor) ? Option.from(rng) : Option.none();\n      var newBookmark = range.map(nativeRangeToSelectionRange).filter(isRngInRoot(root));\n      editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;\n    };\n    var getRng = function (editor) {\n      var bookmark = editor.bookmark ? editor.bookmark : Option.none();\n      return bookmark.bind(function (x) {\n        return validate(Element.fromDom(editor.getBody()), x);\n      }).bind(bookmarkToNativeRng);\n    };\n    var restore = function (editor) {\n      getRng(editor).each(function (rng) {\n        editor.selection.setRng(rng);\n      });\n    };\n    var SelectionBookmark = {\n      store: store,\n      storeNative: storeNative,\n      readRange: readRange,\n      restore: restore,\n      getRng: getRng,\n      getBookmark: getBookmark$2,\n      validate: validate\n    };\n\n    var isEditorUIElement = function (elm) {\n      var className = elm.className.toString();\n      return className.indexOf('tox-') !== -1 || className.indexOf('mce-') !== -1;\n    };\n    var FocusManager = { isEditorUIElement: isEditorUIElement };\n\n    var isManualNodeChange = function (e) {\n      return e.type === 'nodechange' && e.selectionChange;\n    };\n    var registerPageMouseUp = function (editor, throttledStore) {\n      var mouseUpPage = function () {\n        throttledStore.throttle();\n      };\n      DOMUtils$1.DOM.bind(domGlobals.document, 'mouseup', mouseUpPage);\n      editor.on('remove', function () {\n        DOMUtils$1.DOM.unbind(domGlobals.document, 'mouseup', mouseUpPage);\n      });\n    };\n    var registerFocusOut = function (editor) {\n      editor.on('focusout', function () {\n        SelectionBookmark.store(editor);\n      });\n    };\n    var registerMouseUp = function (editor, throttledStore) {\n      editor.on('mouseup touchend', function (e) {\n        throttledStore.throttle();\n      });\n    };\n    var registerEditorEvents = function (editor, throttledStore) {\n      var browser = detect$3().browser;\n      if (browser.isIE()) {\n        registerFocusOut(editor);\n      } else {\n        registerMouseUp(editor, throttledStore);\n      }\n      editor.on('keyup NodeChange', function (e) {\n        if (!isManualNodeChange(e)) {\n          SelectionBookmark.store(editor);\n        }\n      });\n    };\n    var register = function (editor) {\n      var throttledStore = first(function () {\n        SelectionBookmark.store(editor);\n      }, 0);\n      editor.on('init', function () {\n        if (editor.inline) {\n          registerPageMouseUp(editor, throttledStore);\n        }\n        registerEditorEvents(editor, throttledStore);\n      });\n      editor.on('remove', function () {\n        throttledStore.cancel();\n      });\n    };\n    var SelectionRestore = { register: register };\n\n    var documentFocusInHandler;\n    var DOM$2 = DOMUtils$1.DOM;\n    var isEditorUIElement$1 = function (elm) {\n      return FocusManager.isEditorUIElement(elm);\n    };\n    var isEditorContentAreaElement = function (elm) {\n      var classList = elm.classList;\n      if (classList !== undefined) {\n        return classList.contains('tox-edit-area') || classList.contains('tox-edit-area__iframe') || classList.contains('mce-content-body');\n      } else {\n        return false;\n      }\n    };\n    var isUIElement = function (editor, elm) {\n      var customSelector = editor ? editor.settings.custom_ui_selector : '';\n      var parent = DOM$2.getParent(elm, function (elm) {\n        return isEditorUIElement$1(elm) || (customSelector ? editor.dom.is(elm, customSelector) : false);\n      });\n      return parent !== null;\n    };\n    var getActiveElement = function () {\n      try {\n        return domGlobals.document.activeElement;\n      } catch (ex) {\n        return domGlobals.document.body;\n      }\n    };\n    var registerEvents = function (editorManager, e) {\n      var editor = e.editor;\n      SelectionRestore.register(editor);\n      editor.on('focusin', function () {\n        var self = this;\n        var focusedEditor = editorManager.focusedEditor;\n        if (focusedEditor !== self) {\n          if (focusedEditor) {\n            focusedEditor.fire('blur', { focusedEditor: self });\n          }\n          editorManager.setActive(self);\n          editorManager.focusedEditor = self;\n          self.fire('focus', { blurredEditor: focusedEditor });\n          self.focus(true);\n        }\n      });\n      editor.on('focusout', function () {\n        var self = this;\n        Delay.setEditorTimeout(self, function () {\n          var focusedEditor = editorManager.focusedEditor;\n          if (!isUIElement(self, getActiveElement()) && focusedEditor === self) {\n            self.fire('blur', { focusedEditor: null });\n            editorManager.focusedEditor = null;\n          }\n        });\n      });\n      if (!documentFocusInHandler) {\n        documentFocusInHandler = function (e) {\n          var activeEditor = editorManager.activeEditor;\n          var target;\n          target = e.target;\n          if (activeEditor && target.ownerDocument === domGlobals.document) {\n            if (target !== domGlobals.document.body && !isUIElement(activeEditor, target) && editorManager.focusedEditor === activeEditor) {\n              activeEditor.fire('blur', { focusedEditor: null });\n              editorManager.focusedEditor = null;\n            }\n          }\n        };\n        DOM$2.bind(domGlobals.document, 'focusin', documentFocusInHandler);\n      }\n    };\n    var unregisterDocumentEvents = function (editorManager, e) {\n      if (editorManager.focusedEditor === e.editor) {\n        editorManager.focusedEditor = null;\n      }\n      if (!editorManager.activeEditor) {\n        DOM$2.unbind(domGlobals.document, 'focusin', documentFocusInHandler);\n        documentFocusInHandler = null;\n      }\n    };\n    var setup$2 = function (editorManager) {\n      editorManager.on('AddEditor', curry(registerEvents, editorManager));\n      editorManager.on('RemoveEditor', curry(unregisterDocumentEvents, editorManager));\n    };\n    var FocusController = {\n      setup: setup$2,\n      isEditorUIElement: isEditorUIElement$1,\n      isEditorContentAreaElement: isEditorContentAreaElement,\n      isUIElement: isUIElement\n    };\n\n    var getContentEditableHost = function (editor, node) {\n      return editor.dom.getParent(node, function (node) {\n        return editor.dom.getContentEditable(node) === 'true';\n      });\n    };\n    var getCollapsedNode = function (rng) {\n      return rng.collapsed ? Option.from(getNode(rng.startContainer, rng.startOffset)).map(Element.fromDom) : Option.none();\n    };\n    var getFocusInElement = function (root, rng) {\n      return getCollapsedNode(rng).bind(function (node) {\n        if (isTableSection(node)) {\n          return Option.some(node);\n        } else if (contains$2(root, node) === false) {\n          return Option.some(root);\n        } else {\n          return Option.none();\n        }\n      });\n    };\n    var normalizeSelection = function (editor, rng) {\n      getFocusInElement(Element.fromDom(editor.getBody()), rng).bind(function (elm) {\n        return CaretFinder.firstPositionIn(elm.dom());\n      }).fold(function () {\n        editor.selection.normalize();\n        return;\n      }, function (caretPos) {\n        return editor.selection.setRng(caretPos.toRange());\n      });\n    };\n    var focusBody = function (body) {\n      if (body.setActive) {\n        try {\n          body.setActive();\n        } catch (ex) {\n          body.focus();\n        }\n      } else {\n        body.focus();\n      }\n    };\n    var hasElementFocus = function (elm) {\n      return hasFocus(elm) || search(elm).isSome();\n    };\n    var hasIframeFocus = function (editor) {\n      return editor.iframeElement && hasFocus(Element.fromDom(editor.iframeElement));\n    };\n    var hasInlineFocus = function (editor) {\n      var rawBody = editor.getBody();\n      return rawBody && hasElementFocus(Element.fromDom(rawBody));\n    };\n    var hasUiFocus = function (editor) {\n      return active().filter(function (elem) {\n        return !FocusController.isEditorContentAreaElement(elem.dom()) && FocusController.isUIElement(editor, elem.dom());\n      }).isSome();\n    };\n    var hasFocus$1 = function (editor) {\n      return editor.inline ? hasInlineFocus(editor) : hasIframeFocus(editor);\n    };\n    var hasEditorOrUiFocus = function (editor) {\n      return hasFocus$1(editor) || hasUiFocus(editor);\n    };\n    var focusEditor = function (editor) {\n      var selection = editor.selection;\n      var body = editor.getBody();\n      var rng = selection.getRng();\n      editor.quirks.refreshContentEditable();\n      if (editor.bookmark !== undefined && hasFocus$1(editor) === false) {\n        SelectionBookmark.getRng(editor).each(function (bookmarkRng) {\n          editor.selection.setRng(bookmarkRng);\n          rng = bookmarkRng;\n        });\n      }\n      var contentEditableHost = getContentEditableHost(editor, selection.getNode());\n      if (editor.$.contains(body, contentEditableHost)) {\n        focusBody(contentEditableHost);\n        normalizeSelection(editor, rng);\n        activateEditor(editor);\n        return;\n      }\n      if (!editor.inline) {\n        if (!Env.opera) {\n          focusBody(body);\n        }\n        editor.getWin().focus();\n      }\n      if (Env.gecko || editor.inline) {\n        focusBody(body);\n        normalizeSelection(editor, rng);\n      }\n      activateEditor(editor);\n    };\n    var activateEditor = function (editor) {\n      return editor.editorManager.setActive(editor);\n    };\n    var focus = function (editor, skipFocus) {\n      if (editor.removed) {\n        return;\n      }\n      skipFocus ? activateEditor(editor) : focusEditor(editor);\n    };\n    var EditorFocus = {\n      focus: focus,\n      hasFocus: hasFocus$1,\n      hasEditorOrUiFocus: hasEditorOrUiFocus\n    };\n\n    var defaultFormat$1 = 'html';\n    var isTreeNode = function (content) {\n      return content instanceof Node$1;\n    };\n    var moveSelection = function (editor) {\n      if (EditorFocus.hasFocus(editor)) {\n        CaretFinder.firstPositionIn(editor.getBody()).each(function (pos) {\n          var node = pos.getNode();\n          var caretPos = NodeType.isTable(node) ? CaretFinder.firstPositionIn(node).getOr(pos) : pos;\n          editor.selection.setRng(caretPos.toRange());\n        });\n      }\n    };\n    var setEditorHtml = function (editor, html) {\n      editor.dom.setHTML(editor.getBody(), html);\n      moveSelection(editor);\n    };\n    var setContentString = function (editor, body, content, args) {\n      var forcedRootBlockName, padd;\n      if (content.length === 0 || /^\\s+$/.test(content)) {\n        padd = '<br data-mce-bogus=\"1\">';\n        if (body.nodeName === 'TABLE') {\n          content = '<tr><td>' + padd + '</td></tr>';\n        } else if (/^(UL|OL)$/.test(body.nodeName)) {\n          content = '<li>' + padd + '</li>';\n        }\n        forcedRootBlockName = Settings.getForcedRootBlock(editor);\n        if (forcedRootBlockName && editor.schema.isValidChild(body.nodeName.toLowerCase(), forcedRootBlockName.toLowerCase())) {\n          content = padd;\n          content = editor.dom.createHTML(forcedRootBlockName, editor.settings.forced_root_block_attrs, content);\n        } else if (!content) {\n          content = '<br data-mce-bogus=\"1\">';\n        }\n        setEditorHtml(editor, content);\n        editor.fire('SetContent', args);\n      } else {\n        if (args.format !== 'raw') {\n          content = Serializer({ validate: editor.validate }, editor.schema).serialize(editor.parser.parse(content, {\n            isRootContent: true,\n            insert: true\n          }));\n        }\n        args.content = isWsPreserveElement(Element.fromDom(body)) ? content : Tools.trim(content);\n        setEditorHtml(editor, args.content);\n        if (!args.no_events) {\n          editor.fire('SetContent', args);\n        }\n      }\n      return args.content;\n    };\n    var setContentTree = function (editor, body, content, args) {\n      filter$3(editor.parser.getNodeFilters(), editor.parser.getAttributeFilters(), content);\n      var html = Serializer({ validate: editor.validate }, editor.schema).serialize(content);\n      args.content = isWsPreserveElement(Element.fromDom(body)) ? html : Tools.trim(html);\n      setEditorHtml(editor, args.content);\n      if (!args.no_events) {\n        editor.fire('SetContent', args);\n      }\n      return content;\n    };\n    var setContent = function (editor, content, args) {\n      if (args === void 0) {\n        args = {};\n      }\n      args.format = args.format ? args.format : defaultFormat$1;\n      args.set = true;\n      args.content = isTreeNode(content) ? '' : content;\n      if (!isTreeNode(content) && !args.no_events) {\n        editor.fire('BeforeSetContent', args);\n        content = args.content;\n      }\n      return Option.from(editor.getBody()).fold(constant(content), function (body) {\n        return isTreeNode(content) ? setContentTree(editor, body, content, args) : setContentString(editor, body, content, args);\n      });\n    };\n\n    var firePreProcess = function (editor, args) {\n      return editor.fire('PreProcess', args);\n    };\n    var firePostProcess = function (editor, args) {\n      return editor.fire('PostProcess', args);\n    };\n    var fireRemove = function (editor) {\n      return editor.fire('remove');\n    };\n    var fireDetach = function (editor) {\n      return editor.fire('detach');\n    };\n    var fireSwitchMode = function (editor, mode) {\n      return editor.fire('SwitchMode', { mode: mode });\n    };\n    var fireObjectResizeStart = function (editor, target, width, height) {\n      editor.fire('ObjectResizeStart', {\n        target: target,\n        width: width,\n        height: height\n      });\n    };\n    var fireObjectResized = function (editor, target, width, height) {\n      editor.fire('ObjectResized', {\n        target: target,\n        width: width,\n        height: height\n      });\n    };\n    var firePreInit = function (editor) {\n      return editor.fire('PreInit');\n    };\n    var firePostRender = function (editor) {\n      return editor.fire('PostRender');\n    };\n    var fireInit = function (editor) {\n      return editor.fire('Init');\n    };\n    var firePlaceholderToggle = function (editor, state) {\n      return editor.fire('PlaceholderToggle', { state: state });\n    };\n    var fireError = function (editor, errorType, error) {\n      return editor.fire(errorType, error);\n    };\n\n    var DOM$3 = DOMUtils$1.DOM;\n    var restoreOriginalStyles = function (editor) {\n      DOM$3.setStyle(editor.id, 'display', editor.orgDisplay);\n    };\n    var safeDestroy = function (x) {\n      return Option.from(x).each(function (x) {\n        return x.destroy();\n      });\n    };\n    var clearDomReferences = function (editor) {\n      editor.contentAreaContainer = editor.formElement = editor.container = editor.editorContainer = null;\n      editor.bodyElement = editor.contentDocument = editor.contentWindow = null;\n      editor.iframeElement = editor.targetElm = null;\n      if (editor.selection) {\n        editor.selection = editor.selection.win = editor.selection.dom = editor.selection.dom.doc = null;\n      }\n    };\n    var restoreForm = function (editor) {\n      var form = editor.formElement;\n      if (form) {\n        if (form._mceOldSubmit) {\n          form.submit = form._mceOldSubmit;\n          form._mceOldSubmit = null;\n        }\n        DOM$3.unbind(form, 'submit reset', editor.formEventDelegate);\n      }\n    };\n    var remove$6 = function (editor) {\n      if (!editor.removed) {\n        var _selectionOverrides = editor._selectionOverrides, editorUpload = editor.editorUpload;\n        var body = editor.getBody();\n        var element = editor.getElement();\n        if (body) {\n          editor.save({ is_removing: true });\n        }\n        editor.removed = true;\n        editor.unbindAllNativeEvents();\n        if (editor.hasHiddenInput && element) {\n          DOM$3.remove(element.nextSibling);\n        }\n        fireRemove(editor);\n        editor.editorManager.remove(editor);\n        if (!editor.inline && body) {\n          restoreOriginalStyles(editor);\n        }\n        fireDetach(editor);\n        DOM$3.remove(editor.getContainer());\n        safeDestroy(_selectionOverrides);\n        safeDestroy(editorUpload);\n        editor.destroy();\n      }\n    };\n    var destroy = function (editor, automatic) {\n      var selection = editor.selection, dom = editor.dom;\n      if (editor.destroyed) {\n        return;\n      }\n      if (!automatic && !editor.removed) {\n        editor.remove();\n        return;\n      }\n      if (!automatic) {\n        editor.editorManager.off('beforeunload', editor._beforeUnload);\n        if (editor.theme && editor.theme.destroy) {\n          editor.theme.destroy();\n        }\n        safeDestroy(selection);\n        safeDestroy(dom);\n      }\n      restoreForm(editor);\n      clearDomReferences(editor);\n      editor.destroyed = true;\n    };\n\n    var hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n    var deep$1 = function (old, nu) {\n      var bothObjects = isObject(old) && isObject(nu);\n      return bothObjects ? deepMerge(old, nu) : nu;\n    };\n    var baseMerge = function (merger) {\n      return function () {\n        var objects = new Array(arguments.length);\n        for (var i = 0; i < objects.length; i++) {\n          objects[i] = arguments[i];\n        }\n        if (objects.length === 0) {\n          throw new Error('Can\\'t merge zero objects');\n        }\n        var ret = {};\n        for (var j = 0; j < objects.length; j++) {\n          var curObject = objects[j];\n          for (var key in curObject) {\n            if (hasOwnProperty$2.call(curObject, key)) {\n              ret[key] = merger(ret[key], curObject[key]);\n            }\n          }\n        }\n        return ret;\n      };\n    };\n    var deepMerge = baseMerge(deep$1);\n\n    var sectionResult = Immutable('sections', 'settings');\n    var deviceDetection = detect$3().deviceType;\n    var isTouch = deviceDetection.isTouch();\n    var isPhone = deviceDetection.isPhone();\n    var isTablet = deviceDetection.isTablet();\n    var legacyMobilePlugins = [\n      'lists',\n      'autolink',\n      'autosave'\n    ];\n    var defaultTouchSettings = {\n      table_grid: false,\n      object_resizing: false,\n      resize: false\n    };\n    var normalizePlugins = function (plugins) {\n      var pluginNames = isArray(plugins) ? plugins.join(' ') : plugins;\n      var trimmedPlugins = map(isString(pluginNames) ? pluginNames.split(' ') : [], trim);\n      return filter(trimmedPlugins, function (item) {\n        return item.length > 0;\n      });\n    };\n    var filterLegacyMobilePlugins = function (plugins) {\n      return filter(plugins, curry(contains, legacyMobilePlugins));\n    };\n    var extractSections = function (keys, settings) {\n      var result = bifilter(settings, function (value, key) {\n        return contains(keys, key);\n      });\n      return sectionResult(result.t, result.f);\n    };\n    var getSection = function (sectionResult, name, defaults) {\n      if (defaults === void 0) {\n        defaults = {};\n      }\n      var sections = sectionResult.sections();\n      var sectionSettings = sections.hasOwnProperty(name) ? sections[name] : {};\n      return Tools.extend({}, defaults, sectionSettings);\n    };\n    var hasSection = function (sectionResult, name) {\n      return sectionResult.sections().hasOwnProperty(name);\n    };\n    var isSectionTheme = function (sectionResult, name, theme) {\n      var section = sectionResult.sections();\n      return hasSection(sectionResult, name) && section[name].theme === theme;\n    };\n    var getSectionConfig = function (sectionResult, name) {\n      return hasSection(sectionResult, name) ? sectionResult.sections()[name] : {};\n    };\n    var getToolbarMode = function (settings, defaultVal) {\n      return get(settings, 'toolbar_mode').orThunk(function () {\n        return get(settings, 'toolbar_drawer').map(function (val) {\n          return val === false ? 'wrap' : val;\n        });\n      }).getOr(defaultVal);\n    };\n    var getDefaultSettings = function (settings, id, documentBaseUrl, isTouch, editor) {\n      var baseDefaults = {\n        id: id,\n        theme: 'silver',\n        toolbar_mode: getToolbarMode(settings, 'floating'),\n        plugins: '',\n        document_base_url: documentBaseUrl,\n        add_form_submit_trigger: true,\n        submit_patch: true,\n        add_unload_trigger: true,\n        convert_urls: true,\n        relative_urls: true,\n        remove_script_host: true,\n        object_resizing: true,\n        doctype: '<!DOCTYPE html>',\n        visual: true,\n        font_size_legacy_values: 'xx-small,small,medium,large,x-large,xx-large,300%',\n        forced_root_block: 'p',\n        hidden_input: true,\n        inline_styles: true,\n        convert_fonts_to_spans: true,\n        indent: true,\n        indent_before: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',\n        indent_after: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',\n        entity_encoding: 'named',\n        url_converter: editor.convertURL,\n        url_converter_scope: editor\n      };\n      return __assign(__assign({}, baseDefaults), isTouch ? defaultTouchSettings : {});\n    };\n    var getDefaultMobileSettings = function (settings, isPhone) {\n      var defaultMobileSettings = {\n        resize: false,\n        toolbar_mode: getToolbarMode(settings, 'scrolling'),\n        toolbar_sticky: false\n      };\n      var defaultPhoneSettings = { menubar: false };\n      return __assign(__assign(__assign({}, defaultTouchSettings), defaultMobileSettings), isPhone ? defaultPhoneSettings : {});\n    };\n    var getExternalPlugins = function (overrideSettings, settings) {\n      var userDefinedExternalPlugins = settings.external_plugins ? settings.external_plugins : {};\n      if (overrideSettings && overrideSettings.external_plugins) {\n        return Tools.extend({}, overrideSettings.external_plugins, userDefinedExternalPlugins);\n      } else {\n        return userDefinedExternalPlugins;\n      }\n    };\n    var combinePlugins = function (forcedPlugins, plugins) {\n      return [].concat(normalizePlugins(forcedPlugins)).concat(normalizePlugins(plugins));\n    };\n    var processPlugins = function (isMobileDevice, sectionResult, defaultOverrideSettings, settings) {\n      var forcedPlugins = normalizePlugins(defaultOverrideSettings.forced_plugins);\n      var desktopPlugins = normalizePlugins(settings.plugins);\n      var mobileConfig = getSectionConfig(sectionResult, 'mobile');\n      var mobilePlugins = mobileConfig.plugins ? normalizePlugins(mobileConfig.plugins) : desktopPlugins;\n      var platformPlugins = isMobileDevice && isSectionTheme(sectionResult, 'mobile', 'mobile') ? filterLegacyMobilePlugins(mobilePlugins) : isMobileDevice && hasSection(sectionResult, 'mobile') ? mobilePlugins : desktopPlugins;\n      var combinedPlugins = combinePlugins(forcedPlugins, platformPlugins);\n      return Tools.extend(settings, { plugins: combinedPlugins.join(' ') });\n    };\n    var isOnMobile = function (isMobileDevice, sectionResult) {\n      return isMobileDevice && hasSection(sectionResult, 'mobile');\n    };\n    var combineSettings = function (isMobileDevice, isPhone, defaultSettings, defaultOverrideSettings, settings) {\n      var defaultDeviceSettings = isMobileDevice ? { mobile: getDefaultMobileSettings(settings, isPhone) } : {};\n      var sectionResult = extractSections(['mobile'], deepMerge(defaultDeviceSettings, settings));\n      var extendedSettings = Tools.extend(defaultSettings, defaultOverrideSettings, sectionResult.settings(), isOnMobile(isMobileDevice, sectionResult) ? getSection(sectionResult, 'mobile') : {}, {\n        validate: true,\n        external_plugins: getExternalPlugins(defaultOverrideSettings, sectionResult.settings())\n      });\n      return processPlugins(isMobileDevice, sectionResult, defaultOverrideSettings, extendedSettings);\n    };\n    var getEditorSettings = function (editor, id, documentBaseUrl, defaultOverrideSettings, settings) {\n      var defaultSettings = getDefaultSettings(settings, id, documentBaseUrl, isTouch, editor);\n      return combineSettings(isPhone || isTablet, isPhone, defaultSettings, defaultOverrideSettings, settings);\n    };\n    var getFiltered = function (predicate, editor, name) {\n      return Option.from(editor.settings[name]).filter(predicate);\n    };\n    var getParamObject = function (value) {\n      var output = {};\n      if (typeof value === 'string') {\n        each(value.indexOf('=') > 0 ? value.split(/[;,](?![^=;,]*(?:[;,]|$))/) : value.split(','), function (val) {\n          var arr = val.split('=');\n          if (arr.length > 1) {\n            output[Tools.trim(arr[0])] = Tools.trim(arr[1]);\n          } else {\n            output[Tools.trim(arr[0])] = Tools.trim(arr[0]);\n          }\n        });\n      } else {\n        output = value;\n      }\n      return output;\n    };\n    var isArrayOf = function (p) {\n      return function (a) {\n        return isArray(a) && forall(a, p);\n      };\n    };\n    var getParam = function (editor, name, defaultVal, type) {\n      var value = name in editor.settings ? editor.settings[name] : defaultVal;\n      if (type === 'hash') {\n        return getParamObject(value);\n      } else if (type === 'string') {\n        return getFiltered(isString, editor, name).getOr(defaultVal);\n      } else if (type === 'number') {\n        return getFiltered(isNumber, editor, name).getOr(defaultVal);\n      } else if (type === 'boolean') {\n        return getFiltered(isBoolean, editor, name).getOr(defaultVal);\n      } else if (type === 'object') {\n        return getFiltered(isObject, editor, name).getOr(defaultVal);\n      } else if (type === 'array') {\n        return getFiltered(isArray, editor, name).getOr(defaultVal);\n      } else if (type === 'string[]') {\n        return getFiltered(isArrayOf(isString), editor, name).getOr(defaultVal);\n      } else if (type === 'function') {\n        return getFiltered(isFunction, editor, name).getOr(defaultVal);\n      } else {\n        return value;\n      }\n    };\n\n    var CreateIconManager = function () {\n      var lookup = {};\n      var add = function (id, iconPack) {\n        lookup[id] = iconPack;\n      };\n      var get = function (id) {\n        if (lookup[id]) {\n          return lookup[id];\n        }\n        return { icons: {} };\n      };\n      var has$1 = function (id) {\n        return has(lookup, id);\n      };\n      return {\n        add: add,\n        get: get,\n        has: has$1\n      };\n    };\n    var IconManager = CreateIconManager();\n\n    var getProp = function (propName, elm) {\n      var rawElm = elm.dom();\n      return rawElm[propName];\n    };\n    var getComputedSizeProp = function (propName, elm) {\n      return parseInt(get$4(elm, propName), 10);\n    };\n    var getClientWidth = curry(getProp, 'clientWidth');\n    var getClientHeight = curry(getProp, 'clientHeight');\n    var getMarginTop = curry(getComputedSizeProp, 'margin-top');\n    var getMarginLeft = curry(getComputedSizeProp, 'margin-left');\n    var getBoundingClientRect$1 = function (elm) {\n      return elm.dom().getBoundingClientRect();\n    };\n    var isInsideElementContentArea = function (bodyElm, clientX, clientY) {\n      var clientWidth = getClientWidth(bodyElm);\n      var clientHeight = getClientHeight(bodyElm);\n      return clientX >= 0 && clientY >= 0 && clientX <= clientWidth && clientY <= clientHeight;\n    };\n    var transpose = function (inline, elm, clientX, clientY) {\n      var clientRect = getBoundingClientRect$1(elm);\n      var deltaX = inline ? clientRect.left + elm.dom().clientLeft + getMarginLeft(elm) : 0;\n      var deltaY = inline ? clientRect.top + elm.dom().clientTop + getMarginTop(elm) : 0;\n      var x = clientX - deltaX;\n      var y = clientY - deltaY;\n      return {\n        x: x,\n        y: y\n      };\n    };\n    var isXYInContentArea = function (editor, clientX, clientY) {\n      var bodyElm = Element.fromDom(editor.getBody());\n      var targetElm = editor.inline ? bodyElm : documentElement(bodyElm);\n      var transposedPoint = transpose(editor.inline, targetElm, clientX, clientY);\n      return isInsideElementContentArea(targetElm, transposedPoint.x, transposedPoint.y);\n    };\n    var fromDomSafe = function (node) {\n      return Option.from(node).map(Element.fromDom);\n    };\n    var isEditorAttachedToDom = function (editor) {\n      var rawContainer = editor.inline ? editor.getBody() : editor.getContentAreaContainer();\n      return fromDomSafe(rawContainer).map(function (container) {\n        return contains$2(owner(container), container);\n      }).getOr(false);\n    };\n    var EditorView = {\n      isXYInContentArea: isXYInContentArea,\n      isEditorAttachedToDom: isEditorAttachedToDom\n    };\n\n    function NotificationManagerImpl() {\n      var unimplemented = function () {\n        throw new Error('Theme did not provide a NotificationManager implementation.');\n      };\n      return {\n        open: unimplemented,\n        close: unimplemented,\n        reposition: unimplemented,\n        getArgs: unimplemented\n      };\n    }\n\n    function NotificationManager(editor) {\n      var notifications = [];\n      var getImplementation = function () {\n        var theme = editor.theme;\n        return theme && theme.getNotificationManagerImpl ? theme.getNotificationManagerImpl() : NotificationManagerImpl();\n      };\n      var getTopNotification = function () {\n        return Option.from(notifications[0]);\n      };\n      var isEqual = function (a, b) {\n        return a.type === b.type && a.text === b.text && !a.progressBar && !a.timeout && !b.progressBar && !b.timeout;\n      };\n      var reposition = function () {\n        if (notifications.length > 0) {\n          getImplementation().reposition(notifications);\n        }\n      };\n      var addNotification = function (notification) {\n        notifications.push(notification);\n      };\n      var closeNotification = function (notification) {\n        findIndex(notifications, function (otherNotification) {\n          return otherNotification === notification;\n        }).each(function (index) {\n          notifications.splice(index, 1);\n        });\n      };\n      var open = function (spec) {\n        if (editor.removed || !EditorView.isEditorAttachedToDom(editor)) {\n          return;\n        }\n        return find(notifications, function (notification) {\n          return isEqual(getImplementation().getArgs(notification), spec);\n        }).getOrThunk(function () {\n          editor.editorManager.setActive(editor);\n          var notification = getImplementation().open(spec, function () {\n            closeNotification(notification);\n            reposition();\n          });\n          addNotification(notification);\n          reposition();\n          return notification;\n        });\n      };\n      var close = function () {\n        getTopNotification().each(function (notification) {\n          getImplementation().close(notification);\n          closeNotification(notification);\n          reposition();\n        });\n      };\n      var getNotifications = function () {\n        return notifications;\n      };\n      var registerEvents = function (editor) {\n        editor.on('SkinLoaded', function () {\n          var serviceMessage = editor.settings.service_message;\n          if (serviceMessage) {\n            open({\n              text: serviceMessage,\n              type: 'warning',\n              timeout: 0\n            });\n          }\n        });\n        editor.on('ResizeEditor ResizeWindow NodeChange', function () {\n          Delay.requestAnimationFrame(reposition);\n        });\n        editor.on('remove', function () {\n          each(notifications.slice(), function (notification) {\n            getImplementation().close(notification);\n          });\n        });\n      };\n      registerEvents(editor);\n      return {\n        open: open,\n        close: close,\n        getNotifications: getNotifications\n      };\n    }\n\n    var PluginManager = AddOnManager$1.PluginManager;\n\n    var ThemeManager = AddOnManager$1.ThemeManager;\n\n    function WindowManagerImpl () {\n      var unimplemented = function () {\n        throw new Error('Theme did not provide a WindowManager implementation.');\n      };\n      return {\n        open: unimplemented,\n        openUrl: unimplemented,\n        alert: unimplemented,\n        confirm: unimplemented,\n        close: unimplemented,\n        getParams: unimplemented,\n        setParams: unimplemented\n      };\n    }\n\n    var WindowManager = function (editor) {\n      var dialogs = [];\n      var getImplementation = function () {\n        var theme = editor.theme;\n        return theme && theme.getWindowManagerImpl ? theme.getWindowManagerImpl() : WindowManagerImpl();\n      };\n      var funcBind = function (scope, f) {\n        return function () {\n          return f ? f.apply(scope, arguments) : undefined;\n        };\n      };\n      var fireOpenEvent = function (dialog) {\n        editor.fire('OpenWindow', { dialog: dialog });\n      };\n      var fireCloseEvent = function (dialog) {\n        editor.fire('CloseWindow', { dialog: dialog });\n      };\n      var addDialog = function (dialog) {\n        dialogs.push(dialog);\n        fireOpenEvent(dialog);\n      };\n      var closeDialog = function (dialog) {\n        fireCloseEvent(dialog);\n        dialogs = filter(dialogs, function (otherDialog) {\n          return otherDialog !== dialog;\n        });\n        if (dialogs.length === 0) {\n          editor.focus();\n        }\n      };\n      var getTopDialog = function () {\n        return Option.from(dialogs[dialogs.length - 1]);\n      };\n      var storeSelectionAndOpenDialog = function (openDialog) {\n        editor.editorManager.setActive(editor);\n        SelectionBookmark.store(editor);\n        var dialog = openDialog();\n        addDialog(dialog);\n        return dialog;\n      };\n      var open = function (args, params) {\n        return storeSelectionAndOpenDialog(function () {\n          return getImplementation().open(args, params, closeDialog);\n        });\n      };\n      var openUrl = function (args) {\n        return storeSelectionAndOpenDialog(function () {\n          return getImplementation().openUrl(args, closeDialog);\n        });\n      };\n      var alert = function (message, callback, scope) {\n        getImplementation().alert(message, funcBind(scope ? scope : this, callback));\n      };\n      var confirm = function (message, callback, scope) {\n        getImplementation().confirm(message, funcBind(scope ? scope : this, callback));\n      };\n      var close = function () {\n        getTopDialog().each(function (dialog) {\n          getImplementation().close(dialog);\n          closeDialog(dialog);\n        });\n      };\n      editor.on('remove', function () {\n        each(dialogs, function (dialog) {\n          getImplementation().close(dialog);\n        });\n      });\n      return {\n        open: open,\n        openUrl: openUrl,\n        alert: alert,\n        confirm: confirm,\n        close: close\n      };\n    };\n\n    var displayNotification = function (editor, message) {\n      editor.notificationManager.open({\n        type: 'error',\n        text: message\n      });\n    };\n    var displayError = function (editor, message) {\n      if (editor._skinLoaded) {\n        displayNotification(editor, message);\n      } else {\n        editor.on('SkinLoaded', function () {\n          displayNotification(editor, message);\n        });\n      }\n    };\n    var uploadError = function (editor, message) {\n      displayError(editor, I18n.translate([\n        'Failed to upload image: {0}',\n        message\n      ]));\n    };\n    var logError = function (editor, errorType, msg) {\n      fireError(editor, errorType, { message: msg });\n      domGlobals.console.error(msg);\n    };\n    var createLoadError = function (type, url, name) {\n      return name ? 'Failed to load ' + type + ': ' + name + ' from url ' + url : 'Failed to load ' + type + ' url: ' + url;\n    };\n    var pluginLoadError = function (editor, url, name) {\n      logError(editor, 'PluginLoadError', createLoadError('plugin', url, name));\n    };\n    var iconsLoadError = function (editor, url, name) {\n      logError(editor, 'IconsLoadError', createLoadError('icons', url, name));\n    };\n    var languageLoadError = function (editor, url, name) {\n      logError(editor, 'LanguageLoadError', createLoadError('language', url, name));\n    };\n    var pluginInitError = function (editor, name, err) {\n      var message = I18n.translate([\n        'Failed to initialize plugin: {0}',\n        name\n      ]);\n      initError(message, err);\n      displayError(editor, message);\n    };\n    var initError = function (message) {\n      var x = [];\n      for (var _i = 1; _i < arguments.length; _i++) {\n        x[_i - 1] = arguments[_i];\n      }\n      var console = domGlobals.window.console;\n      if (console) {\n        if (console.error) {\n          console.error.apply(console, arguments);\n        } else {\n          console.log.apply(console, arguments);\n        }\n      }\n    };\n    var ErrorReporter = {\n      pluginLoadError: pluginLoadError,\n      iconsLoadError: iconsLoadError,\n      languageLoadError: languageLoadError,\n      pluginInitError: pluginInitError,\n      uploadError: uploadError,\n      displayError: displayError,\n      initError: initError\n    };\n\n    var getAll = function () {\n      return {\n        'accessibility-check': '<svg width=\"24\" height=\"24\"><path d=\"M12 2a2 2 0 0 1 2 2 2 2 0 0 1-2 2 2 2 0 0 1-2-2c0-1.1.9-2 2-2zm8 7h-5v12c0 .6-.4 1-1 1a1 1 0 0 1-1-1v-5c0-.6-.4-1-1-1a1 1 0 0 0-1 1v5c0 .6-.4 1-1 1a1 1 0 0 1-1-1V9H4a1 1 0 1 1 0-2h16c.6 0 1 .4 1 1s-.4 1-1 1z\" fill-rule=\"nonzero\"/></svg>',\n        'action-next': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M5.7 7.3a1 1 0 0 0-1.4 1.4l7.7 7.7 7.7-7.7a1 1 0 1 0-1.4-1.4L12 13.6 5.7 7.3z\"/></svg>',\n        'action-prev': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M18.3 15.7a1 1 0 0 0 1.4-1.4L12 6.6l-7.7 7.7a1 1 0 0 0 1.4 1.4L12 9.4l6.3 6.3z\"/></svg>',\n        'align-center': '<svg width=\"24\" height=\"24\"><path d=\"M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2zm3 4h8c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 1 1 0-2zm0 8h8c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 0 1 0-2zm-3-4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2z\" fill-rule=\"evenodd\"/></svg>',\n        'align-justify': '<svg width=\"24\" height=\"24\"><path d=\"M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2zm0 4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2zm0 4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2zm0 4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2z\" fill-rule=\"evenodd\"/></svg>',\n        'align-left': '<svg width=\"24\" height=\"24\"><path d=\"M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2zm0 4h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2zm0 8h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2zm0-4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2z\" fill-rule=\"evenodd\"/></svg>',\n        'align-none': '<svg width=\"24\" height=\"24\"><path d=\"M14.2 5L13 7H5a1 1 0 1 1 0-2h9.2zm4 0h.8a1 1 0 0 1 0 2h-2l1.2-2zm-6.4 4l-1.2 2H5a1 1 0 0 1 0-2h6.8zm4 0H19a1 1 0 0 1 0 2h-4.4l1.2-2zm-6.4 4l-1.2 2H5a1 1 0 0 1 0-2h4.4zm4 0H19a1 1 0 0 1 0 2h-6.8l1.2-2zM7 17l-1.2 2H5a1 1 0 0 1 0-2h2zm4 0h8a1 1 0 0 1 0 2H9.8l1.2-2zm5.2-13.5l1.3.7-9.7 16.3-1.3-.7 9.7-16.3z\" fill-rule=\"evenodd\"/></svg>',\n        'align-right': '<svg width=\"24\" height=\"24\"><path d=\"M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2zm6 4h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zm0 8h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zm-6-4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2z\" fill-rule=\"evenodd\"/></svg>',\n        'arrow-left': '<svg width=\"24\" height=\"24\"><path d=\"M5.6 13l12 6a1 1 0 0 0 1.4-1V6a1 1 0 0 0-1.4-.9l-12 6a1 1 0 0 0 0 1.8z\" fill-rule=\"evenodd\"/></svg>',\n        'arrow-right': '<svg width=\"24\" height=\"24\"><path d=\"M18.5 13l-12 6A1 1 0 0 1 5 18V6a1 1 0 0 1 1.4-.9l12 6a1 1 0 0 1 0 1.8z\" fill-rule=\"evenodd\"/></svg>',\n        'bold': '<svg width=\"24\" height=\"24\"><path d=\"M7.8 19c-.3 0-.5 0-.6-.2l-.2-.5V5.7c0-.2 0-.4.2-.5l.6-.2h5c1.5 0 2.7.3 3.5 1 .7.6 1.1 1.4 1.1 2.5a3 3 0 0 1-.6 1.9c-.4.6-1 1-1.6 1.2.4.1.9.3 1.3.6s.8.7 1 1.2c.4.4.5 1 .5 1.6 0 1.3-.4 2.3-1.3 3-.8.7-2.1 1-3.8 1H7.8zm5-8.3c.6 0 1.2-.1 1.6-.5.4-.3.6-.7.6-1.3 0-1.1-.8-1.7-2.3-1.7H9.3v3.5h3.4zm.5 6c.7 0 1.3-.1 1.7-.4.4-.4.6-.9.6-1.5s-.2-1-.7-1.4c-.4-.3-1-.4-2-.4H9.4v3.8h4z\" fill-rule=\"evenodd\"/></svg>',\n        'bookmark': '<svg width=\"24\" height=\"24\"><path d=\"M6 4v17l6-4 6 4V4c0-.6-.4-1-1-1H7a1 1 0 0 0-1 1z\" fill-rule=\"nonzero\"/></svg>',\n        'border-width': '<svg width=\"24\" height=\"24\"><path d=\"M5 14.8h14a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2zm-.5 3.7h15c.3 0 .5.2.5.5s-.2.5-.5.5h-15a.5.5 0 1 1 0-1zm.5-8.3h14c.6 0 1 .4 1 1v1c0 .5-.4 1-1 1H5a1 1 0 0 1-1-1v-1c0-.6.4-1 1-1zm0-5.7h14c.6 0 1 .4 1 1v2c0 .6-.4 1-1 1H5a1 1 0 0 1-1-1v-2c0-.6.4-1 1-1z\" fill-rule=\"evenodd\"/></svg>',\n        'brightness': '<svg width=\"24\" height=\"24\"><path d=\"M12 17c.3 0 .5.1.7.3.2.2.3.4.3.7v1c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3 1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7v-1c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3zm0-10a1 1 0 0 1-.7-.3A1 1 0 0 1 11 6V5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3.3 0 .5.1.7.3.2.2.3.4.3.7v1c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3zm7 4c.3 0 .5.1.7.3.2.2.3.4.3.7 0 .3-.1.5-.3.7a1 1 0 0 1-.7.3h-1a1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h1zM7 12c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3H5a1 1 0 0 1-.7-.3A1 1 0 0 1 4 12c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h1c.3 0 .5.1.7.3.2.2.3.4.3.7zm10 3.5l.7.8c.2.1.3.4.3.6 0 .3-.1.6-.3.8a1 1 0 0 1-.8.3 1 1 0 0 1-.6-.3l-.8-.7a1 1 0 0 1-.3-.8c0-.2.1-.5.3-.7a1 1 0 0 1 1.4 0zm-10-7l-.7-.8a1 1 0 0 1-.3-.6c0-.3.1-.6.3-.8.2-.2.5-.3.8-.3.2 0 .5.1.7.3l.7.7c.2.2.3.5.3.8 0 .2-.1.5-.3.7a1 1 0 0 1-.7.3 1 1 0 0 1-.8-.3zm10 0a1 1 0 0 1-.8.3 1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7c0-.3.1-.6.3-.8l.8-.7c.1-.2.4-.3.6-.3.3 0 .6.1.8.3.2.2.3.5.3.8 0 .2-.1.5-.3.7l-.7.7zm-10 7c.2-.2.5-.3.8-.3.2 0 .5.1.7.3a1 1 0 0 1 0 1.4l-.8.8a1 1 0 0 1-.6.3 1 1 0 0 1-.8-.3 1 1 0 0 1-.3-.8c0-.2.1-.5.3-.6l.7-.8zM12 8a4 4 0 0 1 3.7 2.4 4 4 0 0 1 0 3.2A4 4 0 0 1 12 16a4 4 0 0 1-3.7-2.4 4 4 0 0 1 0-3.2A4 4 0 0 1 12 8zm0 6.5c.7 0 1.3-.2 1.8-.7.5-.5.7-1.1.7-1.8s-.2-1.3-.7-1.8c-.5-.5-1.1-.7-1.8-.7s-1.3.2-1.8.7c-.5.5-.7 1.1-.7 1.8s.2 1.3.7 1.8c.5.5 1.1.7 1.8.7z\" fill-rule=\"evenodd\"/></svg>',\n        'browse': '<svg width=\"24\" height=\"24\"><path d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-4v-2h4V8H5v10h4v2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zm-8 9.4l-2.3 2.3a1 1 0 1 1-1.4-1.4l4-4a1 1 0 0 1 1.4 0l4 4a1 1 0 0 1-1.4 1.4L13 13.4V20a1 1 0 0 1-2 0v-6.6z\" fill-rule=\"nonzero\"/></svg>',\n        'cancel': '<svg width=\"24\" height=\"24\"><path d=\"M12 4.6a7.4 7.4 0 1 1 0 14.8 7.4 7.4 0 0 1 0-14.8zM12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18zm0 8L14.8 8l1 1.1-2.7 2.8 2.7 2.7-1.1 1.1-2.7-2.7-2.7 2.7-1-1.1 2.6-2.7-2.7-2.7 1-1.1 2.8 2.7z\" fill-rule=\"nonzero\"/></svg>',\n        'change-case': '<svg width=\"24\" height=\"24\"><path d=\"M18.4 18.2v-.6c-.5.8-1.3 1.2-2.4 1.2-2.2 0-3.3-1.6-3.3-4.8 0-3.1 1-4.7 3.3-4.7 1.1 0 1.8.3 2.4 1.1v-.6c0-.5.4-.8.8-.8s.8.3.8.8v8.4c0 .5-.4.8-.8.8a.8.8 0 0 1-.8-.8zm-2-7.4c-1.3 0-1.8.9-1.8 3.2 0 2.4.5 3.3 1.7 3.3 1.3 0 1.8-.9 1.8-3.2 0-2.4-.5-3.3-1.7-3.3zM10 15.7H5.5l-.8 2.6a1 1 0 0 1-1 .7h-.2a.7.7 0 0 1-.7-1l4-12a1 1 0 1 1 2 0l4 12a.7.7 0 0 1-.8 1h-.2a1 1 0 0 1-1-.7l-.8-2.6zm-.3-1.5l-2-6.5-1.9 6.5h3.9z\" fill-rule=\"evenodd\"/></svg>',\n        'character-count': '<svg width=\"24\" height=\"24\"><path d=\"M4 11.5h16v1H4v-1zm4.8-6.8V10H7.7V5.8h-1v-1h2zM11 8.3V9h2v1h-3V7.7l2-1v-.9h-2v-1h3v2.4l-2 1zm6.3-3.4V10h-3.1V9h2.1V8h-2.1V6.8h2.1v-1h-2.1v-1h3.1zM5.8 16.4c0-.5.2-.8.5-1 .2-.2.6-.3 1.2-.3l.8.1c.2 0 .4.2.5.3l.4.4v2.8l.2.3H8.2v-.1-.2l-.6.3H7c-.4 0-.7 0-1-.2a1 1 0 0 1-.3-.9c0-.3 0-.6.3-.8.3-.2.7-.4 1.2-.4l.6-.2h.3v-.2l-.1-.2a.8.8 0 0 0-.5-.1 1 1 0 0 0-.4 0l-.3.4h-1zm2.3.8h-.2l-.2.1-.4.1a1 1 0 0 0-.4.2l-.2.2.1.3.5.1h.4l.4-.4v-.6zm2-3.4h1.2v1.7l.5-.3h.5c.5 0 .9.1 1.2.5.3.4.5.8.5 1.4 0 .6-.2 1.1-.5 1.5-.3.4-.7.6-1.3.6l-.6-.1-.4-.4v.4h-1.1v-5.4zm1.1 3.3c0 .3 0 .6.2.8a.7.7 0 0 0 1.2 0l.2-.8c0-.4 0-.6-.2-.8a.7.7 0 0 0-.6-.3l-.6.3-.2.8zm6.1-.5c0-.2 0-.3-.2-.4a.8.8 0 0 0-.5-.2c-.3 0-.5.1-.6.3l-.2.9c0 .3 0 .6.2.8.1.2.3.3.6.3.2 0 .4 0 .5-.2l.2-.4h1.1c0 .5-.3.8-.6 1.1a2 2 0 0 1-1.3.4c-.5 0-1-.2-1.3-.6a2 2 0 0 1-.5-1.4c0-.6.1-1.1.5-1.5.3-.4.8-.5 1.4-.5.5 0 1 0 1.2.3.4.3.5.7.5 1.2h-1v-.1z\" fill-rule=\"evenodd\"/></svg>',\n        'checklist-rtl': '<svg width=\"24\" height=\"24\"><path d=\"M5 17h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 0 1 0-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 1 1 0-2zm14.2 11c.2-.4.6-.5.9-.3.3.2.4.6.2 1L18 20c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L18 14c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L18 8c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8z\" fill-rule=\"evenodd\"/></svg>',\n        'checklist': '<svg width=\"24\" height=\"24\"><path d=\"M11 17h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zm0-6h8a1 1 0 0 1 0 2h-8a1 1 0 0 1 0-2zM7.2 16c.2-.4.6-.5.9-.3.3.2.4.6.2 1L6 20c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L6 14c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L6 8c-.2.3-.7.4-1 0L3.8 6.9a.7.7 0 0 1 0-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8z\" fill-rule=\"evenodd\"/></svg>',\n        'checkmark': '<svg width=\"24\" height=\"24\"><path d=\"M18.2 5.4a1 1 0 0 1 1.6 1.2l-8 12a1 1 0 0 1-1.5.1l-5-5a1 1 0 1 1 1.4-1.4l4.1 4.1 7.4-11z\" fill-rule=\"nonzero\"/></svg>',\n        'chevron-down': '<svg width=\"10\" height=\"10\"><path d=\"M8.7 2.2c.3-.3.8-.3 1 0 .4.4.4.9 0 1.2L5.7 7.8c-.3.3-.9.3-1.2 0L.2 3.4a.8.8 0 0 1 0-1.2c.3-.3.8-.3 1.1 0L5 6l3.7-3.8z\" fill-rule=\"nonzero\"/></svg>',\n        'chevron-left': '<svg width=\"10\" height=\"10\"><path d=\"M7.8 1.3L4 5l3.8 3.7c.3.3.3.8 0 1-.4.4-.9.4-1.2 0L2.2 5.7a.8.8 0 0 1 0-1.2L6.6.2C7 0 7.4 0 7.8.2c.3.3.3.8 0 1.1z\" fill-rule=\"nonzero\"/></svg>',\n        'chevron-right': '<svg width=\"10\" height=\"10\"><path d=\"M2.2 1.3a.8.8 0 0 1 0-1c.4-.4.9-.4 1.2 0l4.4 4.1c.3.4.3.9 0 1.2L3.4 9.8c-.3.3-.8.3-1.2 0a.8.8 0 0 1 0-1.1L6 5 2.2 1.3z\" fill-rule=\"nonzero\"/></svg>',\n        'chevron-up': '<svg width=\"10\" height=\"10\"><path d=\"M8.7 7.8L5 4 1.3 7.8c-.3.3-.8.3-1 0a.8.8 0 0 1 0-1.2l4.1-4.4c.3-.3.9-.3 1.2 0l4.2 4.4c.3.3.3.9 0 1.2-.3.3-.8.3-1.1 0z\" fill-rule=\"nonzero\"/></svg>',\n        'close': '<svg width=\"24\" height=\"24\"><path d=\"M17.3 8.2L13.4 12l3.9 3.8a1 1 0 0 1-1.5 1.5L12 13.4l-3.8 3.9a1 1 0 0 1-1.5-1.5l3.9-3.8-3.9-3.8a1 1 0 0 1 1.5-1.5l3.8 3.9 3.8-3.9a1 1 0 0 1 1.5 1.5z\" fill-rule=\"evenodd\"/></svg>',\n        'code-sample': '<svg width=\"24\" height=\"26\"><path d=\"M7.1 11a2.8 2.8 0 0 1-.8 2 2.8 2.8 0 0 1 .8 2v1.7c0 .3.1.6.4.8.2.3.5.4.8.4.3 0 .4.2.4.4v.8c0 .2-.1.4-.4.4-.7 0-1.4-.3-2-.8-.5-.6-.8-1.3-.8-2V15c0-.3-.1-.6-.4-.8-.2-.3-.5-.4-.8-.4a.4.4 0 0 1-.4-.4v-.8c0-.2.2-.4.4-.4.3 0 .6-.1.8-.4.3-.2.4-.5.4-.8V9.3c0-.7.3-1.4.8-2 .6-.5 1.3-.8 2-.8.3 0 .4.2.4.4v.8c0 .2-.1.4-.4.4-.3 0-.6.1-.8.4-.3.2-.4.5-.4.8V11zm9.8 0V9.3c0-.3-.1-.6-.4-.8-.2-.3-.5-.4-.8-.4a.4.4 0 0 1-.4-.4V7c0-.2.1-.4.4-.4.7 0 1.4.3 2 .8.5.6.8 1.3.8 2V11c0 .3.1.6.4.8.2.3.5.4.8.4.2 0 .4.2.4.4v.8c0 .2-.2.4-.4.4-.3 0-.6.1-.8.4-.3.2-.4.5-.4.8v1.7c0 .7-.3 1.4-.8 2-.6.5-1.3.8-2 .8a.4.4 0 0 1-.4-.4v-.8c0-.2.1-.4.4-.4.3 0 .6-.1.8-.4.3-.2.4-.5.4-.8V15a2.8 2.8 0 0 1 .8-2 2.8 2.8 0 0 1-.8-2zm-3.3-.4c0 .4-.1.8-.5 1.1-.3.3-.7.5-1.1.5-.4 0-.8-.2-1.1-.5-.4-.3-.5-.7-.5-1.1 0-.5.1-.9.5-1.2.3-.3.7-.4 1.1-.4.4 0 .8.1 1.1.4.4.3.5.7.5 1.2zM12 13c.4 0 .8.1 1.1.5.4.3.5.7.5 1.1 0 1-.1 1.6-.5 2a3 3 0 0 1-1.1 1c-.4.3-.8.4-1.1.4a.5.5 0 0 1-.5-.5V17a3 3 0 0 0 1-.2l.6-.6c-.6 0-1-.2-1.3-.5-.2-.3-.3-.7-.3-1 0-.5.1-1 .5-1.2.3-.4.7-.5 1.1-.5z\" fill-rule=\"evenodd\"/></svg>',\n        'color-levels': '<svg width=\"24\" height=\"24\"><path d=\"M17.5 11.4A9 9 0 0 1 18 14c0 .5 0 1-.2 1.4 0 .4-.3.9-.5 1.3a6.2 6.2 0 0 1-3.7 3 5.7 5.7 0 0 1-3.2 0A5.9 5.9 0 0 1 7.6 18a6.2 6.2 0 0 1-1.4-2.6 6.7 6.7 0 0 1 0-2.8c0-.4.1-.9.3-1.3a13.6 13.6 0 0 1 2.3-4A20 20 0 0 1 12 4a26.4 26.4 0 0 1 3.2 3.4 18.2 18.2 0 0 1 2.3 4zm-2 4.5c.4-.7.5-1.4.5-2a7.3 7.3 0 0 0-1-3.2c.2.6.2 1.2.2 1.9a4.5 4.5 0 0 1-1.3 3 5.3 5.3 0 0 1-2.3 1.5 4.9 4.9 0 0 1-2 .1 4.3 4.3 0 0 0 2.4.8 4 4 0 0 0 2-.6 4 4 0 0 0 1.5-1.5z\" fill-rule=\"evenodd\"/></svg>',\n        'color-picker': '<svg width=\"24\" height=\"24\"><path d=\"M12 3a9 9 0 0 0 0 18 1.5 1.5 0 0 0 1.1-2.5c-.2-.3-.4-.6-.4-1 0-.8.7-1.5 1.5-1.5H16a5 5 0 0 0 5-5c0-4.4-4-8-9-8zm-5.5 9a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm3-4a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm3 4a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z\" fill-rule=\"nonzero\"/></svg>',\n        'color-swatch-remove-color': '<svg width=\"24\" height=\"24\"><path stroke=\"#000\" stroke-width=\"2\" d=\"M21 3L3 21\" fill-rule=\"evenodd\"/></svg>',\n        'color-swatch': '<svg width=\"24\" height=\"24\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" fill-rule=\"evenodd\"/></svg>',\n        'comment-add': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M9 19l3-2h7c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1H5a1 1 0 0 0-1 1v10c0 .6.4 1 1 1h4v2zm-2 4v-4H5a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3h14a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3h-6.4L7 23z\"/><path d=\"M13 10h2a1 1 0 0 1 0 2h-2v2a1 1 0 0 1-2 0v-2H9a1 1 0 0 1 0-2h2V8a1 1 0 0 1 2 0v2z\"/></g></svg>',\n        'comment': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M9 19l3-2h7c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1H5a1 1 0 0 0-1 1v10c0 .6.4 1 1 1h4v2zm-2 4v-4H5a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3h14a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3h-6.4L7 23z\"/></svg>',\n        'contrast': '<svg width=\"24\" height=\"24\"><path d=\"M12 4a7.8 7.8 0 0 1 5.7 2.3A8 8 0 1 1 12 4zm-6 8a6 6 0 0 0 6 6V6a6 6 0 0 0-6 6z\" fill-rule=\"evenodd\"/></svg>',\n        'copy': '<svg width=\"24\" height=\"24\"><path d=\"M16 3H6a2 2 0 0 0-2 2v11h2V5h10V3zm1 4a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-7a2 2 0 0 1-2-2V9c0-1.2.9-2 2-2h7zm0 12V9h-7v10h7z\" fill-rule=\"nonzero\"/></svg>',\n        'crop': '<svg width=\"24\" height=\"24\"><path d=\"M17 8v7h2c.6 0 1 .4 1 1s-.4 1-1 1h-2v2c0 .6-.4 1-1 1a1 1 0 0 1-1-1v-2H7V9H5a1 1 0 1 1 0-2h2V5c0-.6.4-1 1-1s1 .4 1 1v2h7l3-3 1 1-3 3zM9 9v5l5-5H9zm1 6h5v-5l-5 5z\" fill-rule=\"evenodd\"/></svg>',\n        'cut': '<svg width=\"24\" height=\"24\"><path d=\"M18 15c.6.7 1 1.4 1 2.3 0 .8-.2 1.5-.7 2l-.8.5-1 .2c-.4 0-.8 0-1.2-.3a3.9 3.9 0 0 1-2.1-2.2c-.2-.5-.3-1-.2-1.5l-1-1-1 1c0 .5 0 1-.2 1.5-.1.5-.4 1-.9 1.4-.3.4-.7.6-1.2.8l-1.2.3c-.4 0-.7 0-1-.2-.3 0-.6-.3-.8-.5-.5-.5-.8-1.2-.7-2 0-.9.4-1.6 1-2.2A3.7 3.7 0 0 1 8.6 14H9l1-1-4-4-.5-1a3.3 3.3 0 0 1 0-2c0-.4.3-.7.5-1l6 6 6-6 .5 1a3.3 3.3 0 0 1 0 2c0 .4-.3.7-.5 1l-4 4 1 1h.5c.4 0 .8 0 1.2.3.5.2.9.4 1.2.8zm-8.5 2.2l.1-.4v-.3-.4a1 1 0 0 0-.2-.5 1 1 0 0 0-.4-.2 1.6 1.6 0 0 0-.8 0 2.6 2.6 0 0 0-.8.3 2.5 2.5 0 0 0-.9 1.1l-.1.4v.7l.2.5.5.2h.7a2.5 2.5 0 0 0 .8-.3 2.8 2.8 0 0 0 1-1zm2.5-2.8c.4 0 .7-.1 1-.4.3-.3.4-.6.4-1s-.1-.7-.4-1c-.3-.3-.6-.4-1-.4s-.7.1-1 .4c-.3.3-.4.6-.4 1s.1.7.4 1c.3.3.6.4 1 .4zm5.4 4l.2-.5v-.4-.3a2.6 2.6 0 0 0-.3-.8 2.4 2.4 0 0 0-.7-.7 2.5 2.5 0 0 0-.8-.3 1.5 1.5 0 0 0-.8 0 1 1 0 0 0-.4.2 1 1 0 0 0-.2.5 1.5 1.5 0 0 0 0 .7v.4l.3.4.3.4a2.8 2.8 0 0 0 .8.5l.4.1h.7l.5-.2z\" fill-rule=\"evenodd\"/></svg>',\n        'document-properties': '<svg width=\"24\" height=\"24\"><path d=\"M14.4 3H7a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h10a2 2 0 0 0 2-2V7.6L14.4 3zM17 19H7V5h6v4h4v10z\" fill-rule=\"nonzero\"/></svg>',\n        'drag': '<svg width=\"24\" height=\"24\"><path d=\"M13 5h2v2h-2V5zm0 4h2v2h-2V9zM9 9h2v2H9V9zm4 4h2v2h-2v-2zm-4 0h2v2H9v-2zm0 4h2v2H9v-2zm4 0h2v2h-2v-2zM9 5h2v2H9V5z\" fill-rule=\"evenodd\"/></svg>',\n        'duplicate': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M16 3v2H6v11H4V5c0-1.1.9-2 2-2h10zm3 8h-2V9h-7v10h9a2 2 0 0 1-2 2h-7a2 2 0 0 1-2-2V9c0-1.2.9-2 2-2h7a2 2 0 0 1 2 2v2z\"/><path d=\"M17 14h1a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0v-1h-1a1 1 0 0 1 0-2h1v-1a1 1 0 0 1 2 0v1z\"/></g></svg>',\n        'edit-block': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19.8 8.8l-9.4 9.4c-.2.2-.5.4-.9.4l-5.4 1.2 1.2-5.4.5-.8 9.4-9.4c.7-.7 1.8-.7 2.5 0l2.1 2.1c.7.7.7 1.8 0 2.5zm-2-.2l1-.9v-.3l-2.2-2.2a.3.3 0 0 0-.3 0l-1 1L18 8.5zm-1 1l-2.5-2.4-6 6 2.5 2.5 6-6zm-7 7.1l-2.6-2.4-.3.3-.1.2-.7 3 3.1-.6h.1l.4-.5z\"/></svg>',\n        'edit-image': '<svg width=\"24\" height=\"24\"><path d=\"M18 16h2V7a2 2 0 0 0-2-2H7v2h11v9zM6 17h15a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0v-1H6a2 2 0 0 1-2-2V7H3a1 1 0 1 1 0-2h1V4a1 1 0 1 1 2 0v13zm3-5.3l1.3 2 3-4.7 3.7 6H7l2-3.3z\" fill-rule=\"nonzero\"/></svg>',\n        'embed-page': '<svg width=\"24\" height=\"24\"><path d=\"M19 6V5H5v14h2A13 13 0 0 1 19 6zm0 1.4c-.8.8-1.6 2.4-2.2 4.6H19V7.4zm0 5.6h-2.4c-.4 1.8-.6 3.8-.6 6h3v-6zm-4 6c0-2.2.2-4.2.6-6H13c-.7 1.8-1.1 3.8-1.1 6h3zm-4 0c0-2.2.4-4.2 1-6H9.6A12 12 0 0 0 8 19h3zM4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V4c0-.6.4-1 1-1zm11.8 9c.4-1.9 1-3.4 1.8-4.5a9.2 9.2 0 0 0-4 4.5h2.2zm-3.4 0a12 12 0 0 1 2.8-4 12 12 0 0 0-5 4h2.2z\" fill-rule=\"nonzero\"/></svg>',\n        'embed': '<svg width=\"24\" height=\"24\"><path d=\"M4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V4c0-.6.4-1 1-1zm1 2v14h14V5H5zm4.8 2.6l5.6 4a.5.5 0 0 1 0 .8l-5.6 4A.5.5 0 0 1 9 16V8a.5.5 0 0 1 .8-.4z\" fill-rule=\"nonzero\"/></svg>',\n        'emoji': '<svg width=\"24\" height=\"24\"><path d=\"M9 11c.6 0 1-.4 1-1s-.4-1-1-1a1 1 0 0 0-1 1c0 .6.4 1 1 1zm6 0c.6 0 1-.4 1-1s-.4-1-1-1a1 1 0 0 0-1 1c0 .6.4 1 1 1zm-3 5.5c2.1 0 4-1.5 4.4-3.5H7.6c.5 2 2.3 3.5 4.4 3.5zM12 4a8 8 0 1 0 0 16 8 8 0 0 0 0-16zm0 14.5a6.5 6.5 0 1 1 0-13 6.5 6.5 0 0 1 0 13z\" fill-rule=\"nonzero\"/></svg>',\n        'fill': '<svg width=\"24\" height=\"26\"><path d=\"M16.6 12l-9-9-1.4 1.4 2.4 2.4-5.2 5.1c-.5.6-.5 1.6 0 2.2L9 19.6a1.5 1.5 0 0 0 2.2 0l5.5-5.5c.5-.6.5-1.6 0-2.2zM5.2 13L10 8.2l4.8 4.8H5.2zM19 14.5s-2 2.2-2 3.5c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.3-2-3.5-2-3.5z\" fill-rule=\"nonzero\"/></svg>',\n        'flip-horizontally': '<svg width=\"24\" height=\"24\"><path d=\"M14 19h2v-2h-2v2zm4-8h2V9h-2v2zM4 7v10c0 1.1.9 2 2 2h3v-2H6V7h3V5H6a2 2 0 0 0-2 2zm14-2v2h2a2 2 0 0 0-2-2zm-7 16h2V3h-2v18zm7-6h2v-2h-2v2zm-4-8h2V5h-2v2zm4 12a2 2 0 0 0 2-2h-2v2z\" fill-rule=\"nonzero\"/></svg>',\n        'flip-vertically': '<svg width=\"24\" height=\"24\"><path d=\"M5 14v2h2v-2H5zm8 4v2h2v-2h-2zm4-14H7a2 2 0 0 0-2 2v3h2V6h10v3h2V6a2 2 0 0 0-2-2zm2 14h-2v2a2 2 0 0 0 2-2zM3 11v2h18v-2H3zm6 7v2h2v-2H9zm8-4v2h2v-2h-2zM5 18c0 1.1.9 2 2 2v-2H5z\" fill-rule=\"nonzero\"/></svg>',\n        'format-painter': '<svg width=\"24\" height=\"24\"><path d=\"M18 5V4c0-.5-.4-1-1-1H5a1 1 0 0 0-1 1v4c0 .6.5 1 1 1h12c.6 0 1-.4 1-1V7h1v4H9v9c0 .6.4 1 1 1h2c.6 0 1-.4 1-1v-7h8V5h-3z\" fill-rule=\"nonzero\"/></svg>',\n        'format': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M17 5a1 1 0 0 1 0 2h-4v11a1 1 0 0 1-2 0V7H7a1 1 0 1 1 0-2h10z\"/></svg>',\n        'fullscreen': '<svg width=\"24\" height=\"24\"><path d=\"M15.3 10l-1.2-1.3 2.9-3h-2.3a.9.9 0 1 1 0-1.7H19c.5 0 .9.4.9.9v4.4a.9.9 0 1 1-1.8 0V7l-2.9 3zm0 4l3 3v-2.3a.9.9 0 1 1 1.7 0V19c0 .5-.4.9-.9.9h-4.4a.9.9 0 1 1 0-1.8H17l-3-2.9 1.3-1.2zM10 15.4l-2.9 3h2.3a.9.9 0 1 1 0 1.7H5a.9.9 0 0 1-.9-.9v-4.4a.9.9 0 1 1 1.8 0V17l2.9-3 1.2 1.3zM8.7 10L5.7 7v2.3a.9.9 0 0 1-1.7 0V5c0-.5.4-.9.9-.9h4.4a.9.9 0 0 1 0 1.8H7l3 2.9-1.3 1.2z\" fill-rule=\"nonzero\"/></svg>',\n        'gallery': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M5 15.7l2.3-2.2c.3-.3.7-.3 1 0L11 16l5.1-5c.3-.4.8-.4 1 0l2 1.9V8H5v7.7zM5 18V19h3l1.8-1.9-2-2L5 17.9zm14-3l-2.5-2.4-6.4 6.5H19v-4zM4 6h16c.6 0 1 .4 1 1v13c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V7c0-.6.4-1 1-1zm6 7a2 2 0 1 1 0-4 2 2 0 0 1 0 4zM4.5 4h15a.5.5 0 1 1 0 1h-15a.5.5 0 0 1 0-1zm2-2h11a.5.5 0 1 1 0 1h-11a.5.5 0 0 1 0-1z\"/></svg>',\n        'gamma': '<svg width=\"24\" height=\"24\"><path d=\"M4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V4c0-.6.4-1 1-1zm1 2v14h14V5H5zm6.5 11.8V14L9.2 8.7a5.1 5.1 0 0 0-.4-.8l-.1-.2H8 8v-1l.3-.1.3-.1h.7a1 1 0 0 1 .6.5l.1.3a8.5 8.5 0 0 1 .3.6l1.9 4.6 2-5.2a1 1 0 0 1 1-.6.5.5 0 0 1 .5.6L13 14v2.8a.7.7 0 0 1-1.4 0z\" fill-rule=\"nonzero\"/></svg>',\n        'help': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M12 5.5a6.5 6.5 0 0 0-6 9 6.3 6.3 0 0 0 1.4 2l1 1a6.3 6.3 0 0 0 3.6 1 6.5 6.5 0 0 0 6-9 6.3 6.3 0 0 0-1.4-2l-1-1a6.3 6.3 0 0 0-3.6-1zM12 4a7.8 7.8 0 0 1 5.7 2.3A8 8 0 1 1 12 4z\"/><path d=\"M9.6 9.7a.7.7 0 0 1-.7-.8c0-1.1 1.5-1.8 3.2-1.8 1.8 0 3.2.8 3.2 2.4 0 1.4-.4 2.1-1.5 2.8-.2 0-.3.1-.3.2a2 2 0 0 0-.8.8.8.8 0 0 1-1.4-.6c.3-.7.8-1 1.3-1.5l.4-.2c.7-.4.8-.6.8-1.5 0-.5-.6-.9-1.7-.9-.5 0-1 .1-1.4.3-.2 0-.3.1-.3.2v-.2c0 .4-.4.8-.8.8z\" fill-rule=\"nonzero\"/><circle cx=\"12\" cy=\"16\" r=\"1\"/></g></svg>',\n        'highlight-bg-color': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path id=\"tox-icon-highlight-bg-color__color\" d=\"M3 18h18v3H3z\"/><path fill-rule=\"nonzero\" d=\"M7.7 16.7H3l3.3-3.3-.7-.8L10.2 8l4 4.1-4 4.2c-.2.2-.6.2-.8 0l-.6-.7-1.1 1.1zm5-7.5L11 7.4l3-2.9a2 2 0 0 1 2.6 0L18 6c.7.7.7 2 0 2.7l-2.9 2.9-1.8-1.8-.5-.6\"/></g></svg>',\n        'home': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\"/></svg>',\n        'horizontal-rule': '<svg width=\"24\" height=\"24\"><path d=\"M4 11h16v2H4z\" fill-rule=\"evenodd\"/></svg>',\n        'image-options': '<svg width=\"24\" height=\"24\"><path d=\"M6 10a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2zm12 0a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2zm-6 0a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2z\" fill-rule=\"nonzero\"/></svg>',\n        'image': '<svg width=\"24\" height=\"24\"><path d=\"M5 15.7l3.3-3.2c.3-.3.7-.3 1 0L12 15l4.1-4c.3-.4.8-.4 1 0l2 1.9V5H5v10.7zM5 18V19h3l2.8-2.9-2-2L5 17.9zm14-3l-2.5-2.4-6.4 6.5H19v-4zM4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 0 1-1-1V4c0-.6.4-1 1-1zm6 8a2 2 0 1 0 0-4 2 2 0 0 0 0 4z\" fill-rule=\"nonzero\"/></svg>',\n        'indent': '<svg width=\"24\" height=\"24\"><path d=\"M7 5h12c.6 0 1 .4 1 1s-.4 1-1 1H7a1 1 0 1 1 0-2zm5 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 0 1 0-2zm0 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 0 1 0-2zm-5 4h12a1 1 0 0 1 0 2H7a1 1 0 0 1 0-2zm-2.6-3.8L6.2 12l-1.8-1.2a1 1 0 0 1 1.2-1.6l3 2a1 1 0 0 1 0 1.6l-3 2a1 1 0 1 1-1.2-1.6z\" fill-rule=\"evenodd\"/></svg>',\n        'info': '<svg width=\"24\" height=\"24\"><path d=\"M12 4a7.8 7.8 0 0 1 5.7 2.3A8 8 0 1 1 12 4zm-1 3v2h2V7h-2zm3 10v-1h-1v-5h-3v1h1v4h-1v1h4z\" fill-rule=\"evenodd\"/></svg>',\n        'insert-character': '<svg width=\"24\" height=\"24\"><path d=\"M15 18h4l1-2v4h-6v-3.3l1.4-1a6 6 0 0 0 1.8-2.9 6.3 6.3 0 0 0-.1-4.1 5.8 5.8 0 0 0-3-3.2c-.6-.3-1.3-.5-2.1-.5a5.1 5.1 0 0 0-3.9 1.8 6.3 6.3 0 0 0-1.3 6 6.2 6.2 0 0 0 1.8 3l1.4.9V20H4v-4l1 2h4v-.5l-2-1L5.4 15A6.5 6.5 0 0 1 4 11c0-1 .2-1.9.6-2.7A7 7 0 0 1 6.3 6C7.1 5.4 8 5 9 4.5c1-.3 2-.5 3.1-.5a8.8 8.8 0 0 1 5.7 2 7 7 0 0 1 1.7 2.3 6 6 0 0 1 .2 4.8c-.2.7-.6 1.3-1 1.9a7.6 7.6 0 0 1-3.6 2.5v.5z\" fill-rule=\"evenodd\"/></svg>',\n        'insert-time': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M12 19a7 7 0 1 0 0-14 7 7 0 0 0 0 14zm0 2a9 9 0 1 1 0-18 9 9 0 0 1 0 18z\"/><path d=\"M16 12h-3V7c0-.6-.4-1-1-1a1 1 0 0 0-1 1v7h5c.6 0 1-.4 1-1s-.4-1-1-1z\"/></g></svg>',\n        'invert': '<svg width=\"24\" height=\"24\"><path d=\"M18 19.3L16.5 18a5.8 5.8 0 0 1-3.1 1.9 6.1 6.1 0 0 1-5.5-1.6A5.8 5.8 0 0 1 6 14v-.3l.1-1.2A13.9 13.9 0 0 1 7.7 9l-3-3 .7-.8 2.8 2.9 9 8.9 1.5 1.6-.7.6zm0-5.5v.3l-.1 1.1-.4 1-1.2-1.2a4.3 4.3 0 0 0 .2-1v-.2c0-.4 0-.8-.2-1.3l-.5-1.4a14.8 14.8 0 0 0-3-4.2L12 6a26.1 26.1 0 0 0-2.2 2.5l-1-1a20.9 20.9 0 0 1 2.9-3.3L12 4l1 .8a22.2 22.2 0 0 1 4 5.4c.6 1.2 1 2.4 1 3.6z\" fill-rule=\"evenodd\"/></svg>',\n        'italic': '<svg width=\"24\" height=\"24\"><path d=\"M16.7 4.7l-.1.9h-.3c-.6 0-1 0-1.4.3-.3.3-.4.6-.5 1.1l-2.1 9.8v.6c0 .5.4.8 1.4.8h.2l-.2.8H8l.2-.8h.2c1.1 0 1.8-.5 2-1.5l2-9.8.1-.5c0-.6-.4-.8-1.4-.8h-.3l.2-.9h5.8z\" fill-rule=\"evenodd\"/></svg>',\n        'line': '<svg width=\"24\" height=\"24\"><path d=\"M15 9l-8 8H4v-3l8-8 3 3zm1-1l-3-3 1-1h1c-.2 0 0 0 0 0l2 2s0 .2 0 0v1l-1 1zM4 18h16v2H4v-2z\" fill-rule=\"evenodd\"/></svg>',\n        'link': '<svg width=\"24\" height=\"24\"><path d=\"M6.2 12.3a1 1 0 0 1 1.4 1.4l-2.1 2a2 2 0 1 0 2.7 2.8l4.8-4.8a1 1 0 0 0 0-1.4 1 1 0 1 1 1.4-1.3 2.9 2.9 0 0 1 0 4L9.6 20a3.9 3.9 0 0 1-5.5-5.5l2-2zm11.6-.6a1 1 0 0 1-1.4-1.4l2-2a2 2 0 1 0-2.6-2.8L11 10.3a1 1 0 0 0 0 1.4A1 1 0 1 1 9.6 13a2.9 2.9 0 0 1 0-4L14.4 4a3.9 3.9 0 0 1 5.5 5.5l-2 2z\" fill-rule=\"nonzero\"/></svg>',\n        'list-bull-circle': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path d=\"M11 16a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm0 1a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM11 26a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm0 1a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM11 36a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm0 1a3 3 0 1 1 0-6 3 3 0 0 1 0 6z\" fill-rule=\"nonzero\"/><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/></g></svg>',\n        'list-bull-default': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><circle cx=\"11\" cy=\"14\" r=\"3\"/><circle cx=\"11\" cy=\"24\" r=\"3\"/><circle cx=\"11\" cy=\"34\" r=\"3\"/><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/></g></svg>',\n        'list-bull-square': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path d=\"M8 11h6v6H8zM8 21h6v6H8zM8 31h6v6H8z\"/><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/></g></svg>',\n        'list-num-default-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M37.4 17v-4.8l-1.6 1v-1.1l1.6-1h1.2V17zM33.3 17.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm1.7 5.7c0-1.2 1-2 2.2-2 1.3 0 2.1.8 2.1 1.8 0 .7-.3 1.2-1.3 2.2l-1.2 1v.2h2.6v1h-4.3v-.9l2-1.9c.8-.8 1-1.1 1-1.5 0-.5-.4-.8-1-.8-.5 0-.9.3-.9.9H35zm-1.7 4.3c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm3.2 7.3v-1h.7c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7s-1 .3-1 .8H35c0-1.1 1-1.8 2.2-1.8 1.2 0 2.1.6 2.1 1.6 0 .7-.4 1.2-1 1.3v.1c.7.1 1.3.7 1.3 1.4 0 1-1 1.9-2.4 1.9-1.3 0-2.2-.8-2.3-2h1.2c0 .6.5 1 1.1 1 .6 0 1-.4 1-1 0-.5-.3-.8-1-.8h-.7zm-3.3 2.7c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7z\"/></g></svg>',\n        'list-num-default': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M10 17v-4.8l-1.5 1v-1.1l1.6-1h1.2V17h-1.2zm3.6.1c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7zm-5 5.7c0-1.2.8-2 2.1-2s2.1.8 2.1 1.8c0 .7-.3 1.2-1.4 2.2l-1.1 1v.2h2.6v1H8.6v-.9l2-1.9c.8-.8 1-1.1 1-1.5 0-.5-.4-.8-1-.8-.5 0-.9.3-.9.9H8.5zm6.3 4.3c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zM10 34.4v-1h.7c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7s-1 .3-1 .8H8.6c0-1.1 1-1.8 2.2-1.8 1.3 0 2.1.6 2.1 1.6 0 .7-.4 1.2-1 1.3v.1c.8.1 1.3.7 1.3 1.4 0 1-1 1.9-2.4 1.9-1.3 0-2.2-.8-2.3-2h1.2c0 .6.5 1 1.1 1 .7 0 1-.4 1-1 0-.5-.3-.8-1-.8h-.7zm4.7 2.7c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7z\"/></g></svg>',\n        'list-num-lower-alpha-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M36.5 16c-.9 0-1.5-.5-1.5-1.3s.6-1.3 1.8-1.4h1v-.4c0-.4-.2-.6-.7-.6-.4 0-.7.1-.8.4h-1.1c0-.8.8-1.4 2-1.4S39 12 39 13V16h-1.2v-.6c-.3.4-.8.7-1.4.7zm.4-.8c.6 0 1-.4 1-.9V14h-1c-.5.1-.7.3-.7.6 0 .4.3.6.7.6zM33.1 16.1c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7zM37.7 26c-.7 0-1.2-.2-1.5-.7v.7H35v-6.3h1.2v2.5c.3-.5.8-.9 1.5-.9 1.1 0 1.8 1 1.8 2.4 0 1.5-.7 2.4-1.8 2.4zm-.5-3.6c-.6 0-1 .5-1 1.3s.4 1.4 1 1.4c.7 0 1-.6 1-1.4 0-.8-.3-1.3-1-1.3zM33.2 26.1c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7zm6 7h-1c-.1-.5-.4-.8-1-.8s-1 .5-1 1.4c0 1 .4 1.4 1 1.4.5 0 .9-.2 1-.7h1c0 1-.8 1.7-2 1.7-1.4 0-2.2-.9-2.2-2.4s.8-2.4 2.2-2.4c1.2 0 2 .7 2 1.7zm-6.1 3c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z\"/></g></svg>',\n        'list-num-lower-alpha': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M10.3 15.2c.5 0 1-.4 1-.9V14h-1c-.5.1-.8.3-.8.6 0 .4.3.6.8.6zm-.4.9c-1 0-1.5-.6-1.5-1.4 0-.8.6-1.3 1.7-1.4h1.1v-.4c0-.4-.2-.6-.7-.6-.5 0-.8.1-.9.4h-1c0-.8.8-1.4 2-1.4 1.1 0 1.8.6 1.8 1.6V16h-1.1v-.6h-.1c-.2.4-.7.7-1.3.7zm4.6 0c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm-3.2 10c-.6 0-1.2-.3-1.4-.8v.7H8.5v-6.3H10v2.5c.3-.5.8-.9 1.4-.9 1.2 0 1.9 1 1.9 2.4 0 1.5-.7 2.4-1.9 2.4zm-.4-3.7c-.7 0-1 .5-1 1.3s.3 1.4 1 1.4c.6 0 1-.6 1-1.4 0-.8-.4-1.3-1-1.3zm4 3.7c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm-2.2 7h-1.2c0-.5-.4-.8-.9-.8-.6 0-1 .5-1 1.4 0 1 .4 1.4 1 1.4.5 0 .8-.2 1-.7h1c0 1-.8 1.7-2 1.7-1.4 0-2.2-.9-2.2-2.4s.8-2.4 2.2-2.4c1.2 0 2 .7 2 1.7zm1.8 3c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z\"/></g></svg>',\n        'list-num-lower-greek-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M37.4 16c-1.2 0-2-.8-2-2.3 0-1.5.8-2.4 2-2.4.6 0 1 .4 1.3 1v-.9H40v3.2c0 .4.1.5.4.5h.2v.9h-.6c-.6 0-1-.2-1-.7h-.2c-.2.4-.7.8-1.3.8zm.3-1c.6 0 1-.5 1-1.3s-.4-1.3-1-1.3-1 .5-1 1.3.4 1.4 1 1.4zM33.3 16.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zM36 21.9c0-1.5.8-2.3 2.1-2.3 1.2 0 2 .6 2 1.6 0 .6-.3 1-.9 1.3.9.3 1.3.8 1.3 1.7 0 1.2-.7 1.9-1.8 1.9-.6 0-1.1-.3-1.4-.8v2.2H36V22zm1.8 1.2v-1h.3c.5 0 .9-.2.9-.7 0-.5-.3-.8-.9-.8-.5 0-.8.3-.8 1v2.2c0 .8.4 1.3 1 1.3s1-.4 1-1-.4-1-1.2-1h-.3zM33.3 26.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zM37.1 34.6L34.8 30h1.4l1.7 3.5 1.7-3.5h1.1l-2.2 4.6v.1c.5.8.7 1.4.7 1.8 0 .4-.2.8-.4 1-.2.2-.6.3-1 .3-.9 0-1.3-.4-1.3-1.2 0-.5.2-1 .5-1.7l.1-.2zm.7 1a2 2 0 0 0-.4.9c0 .3.1.4.4.4.3 0 .4-.1.4-.4 0-.2-.1-.6-.4-1zM33.3 36.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z\"/></g></svg>',\n        'list-num-lower-greek': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M10.5 15c.7 0 1-.5 1-1.3s-.3-1.3-1-1.3c-.5 0-.9.5-.9 1.3s.4 1.4 1 1.4zm-.3 1c-1.1 0-1.8-.8-1.8-2.3 0-1.5.7-2.4 1.8-2.4.7 0 1.1.4 1.3 1h.1v-.9h1.2v3.2c0 .4.1.5.4.5h.2v.9h-.6c-.6 0-1-.2-1.1-.7h-.1c-.2.4-.7.8-1.4.8zm5 .1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7zm-4.9 7v-1h.3c.6 0 1-.2 1-.7 0-.5-.4-.8-1-.8-.5 0-.8.3-.8 1v2.2c0 .8.4 1.3 1.1 1.3.6 0 1-.4 1-1s-.5-1-1.3-1h-.3zM8.6 22c0-1.5.7-2.3 2-2.3 1.2 0 2 .6 2 1.6 0 .6-.3 1-.8 1.3.8.3 1.3.8 1.3 1.7 0 1.2-.8 1.9-1.9 1.9-.6 0-1.1-.3-1.3-.8v2.2H8.5V22zm6.2 4.2c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7zm-4.5 8.5L8 30h1.4l1.7 3.5 1.7-3.5h1.1l-2.2 4.6v.1c.5.8.7 1.4.7 1.8 0 .4-.1.8-.4 1-.2.2-.6.3-1 .3-.9 0-1.3-.4-1.3-1.2 0-.5.2-1 .5-1.7l.1-.2zm.7 1a2 2 0 0 0-.4.9c0 .3.1.4.4.4.3 0 .4-.1.4-.4 0-.2-.1-.6-.4-1zm4.5.5c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z\"/></g></svg>',\n        'list-num-lower-roman-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M32.9 16v-1.2h-1.3V16H33zm0 10v-1.2h-1.3V26H33zm0 10v-1.2h-1.3V36H33z\"/><path fill-rule=\"nonzero\" d=\"M36 21h-1.5v5H36zM36 31h-1.5v5H36zM39 21h-1.5v5H39zM39 31h-1.5v5H39zM42 31h-1.5v5H42zM36 11h-1.5v5H36zM36 19h-1.5v1H36zM36 29h-1.5v1H36zM39 19h-1.5v1H39zM39 29h-1.5v1H39zM42 29h-1.5v1H42zM36 9h-1.5v1H36z\"/></g></svg>',\n        'list-num-lower-roman': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M15.1 16v-1.2h1.3V16H15zm0 10v-1.2h1.3V26H15zm0 10v-1.2h1.3V36H15z\"/><path fill-rule=\"nonzero\" d=\"M12 21h1.5v5H12zM12 31h1.5v5H12zM9 21h1.5v5H9zM9 31h1.5v5H9zM6 31h1.5v5H6zM12 11h1.5v5H12zM12 19h1.5v1H12zM12 29h1.5v1H12zM9 19h1.5v1H9zM9 29h1.5v1H9zM6 29h1.5v1H6zM12 9h1.5v1H12z\"/></g></svg>',\n        'list-num-upper-alpha-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M39.3 17l-.5-1.4h-2l-.5 1.4H35l2-6h1.6l2 6h-1.3zm-1.6-4.7l-.7 2.3h1.6l-.8-2.3zM33.4 17c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7zm4.7 9.9h-2.7v-6H38c1.2 0 1.9.6 1.9 1.5 0 .6-.5 1.2-1 1.3.7.1 1.3.7 1.3 1.5 0 1-.8 1.7-2 1.7zm-1.4-5v1.5h1c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7h-1zm0 4h1.1c.7 0 1.1-.3 1.1-.8 0-.6-.4-.9-1.1-.9h-1.1V26zM33 27.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm4.9 10c-1.8 0-2.8-1.1-2.8-3.1s1-3.1 2.8-3.1c1.4 0 2.5.9 2.6 2.2h-1.3c0-.7-.6-1.1-1.3-1.1-1 0-1.6.7-1.6 2s.6 2 1.6 2c.7 0 1.2-.4 1.4-1h1.2c-.1 1.3-1.2 2.2-2.6 2.2zm-4.5 0c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z\"/></g></svg>',\n        'list-num-upper-alpha': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M12.6 17l-.5-1.4h-2L9.5 17H8.3l2-6H12l2 6h-1.3zM11 12.3l-.7 2.3h1.6l-.8-2.3zm4.7 4.8c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7zM11.4 27H8.7v-6h2.6c1.2 0 1.9.6 1.9 1.5 0 .6-.5 1.2-1 1.3.7.1 1.3.7 1.3 1.5 0 1-.8 1.7-2 1.7zM10 22v1.5h1c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7h-1zm0 4H11c.7 0 1.1-.3 1.1-.8 0-.6-.4-.9-1.1-.9H10V26zm5.4 1.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm-4.1 10c-1.8 0-2.8-1.1-2.8-3.1s1-3.1 2.8-3.1c1.4 0 2.5.9 2.6 2.2h-1.3c0-.7-.6-1.1-1.3-1.1-1 0-1.6.7-1.6 2s.6 2 1.6 2c.7 0 1.2-.4 1.4-1h1.2c-.1 1.3-1.2 2.2-2.6 2.2zm4.5 0c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z\"/></g></svg>',\n        'list-num-upper-roman-rtl': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z\"/><path d=\"M31.6 17v-1.2H33V17h-1.3zm0 10v-1.2H33V27h-1.3zm0 10v-1.2H33V37h-1.3z\"/><path fill-rule=\"nonzero\" d=\"M34.5 20H36v7h-1.5zM34.5 30H36v7h-1.5zM37.5 20H39v7h-1.5zM37.5 30H39v7h-1.5zM40.5 30H42v7h-1.5zM34.5 10H36v7h-1.5z\"/></g></svg>',\n        'list-num-upper-roman': '<svg width=\"48\" height=\"48\"><g fill-rule=\"evenodd\"><path opacity=\".2\" d=\"M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z\"/><path d=\"M15.1 17v-1.2h1.3V17H15zm0 10v-1.2h1.3V27H15zm0 10v-1.2h1.3V37H15z\"/><path fill-rule=\"nonzero\" d=\"M12 20h1.5v7H12zM12 30h1.5v7H12zM9 20h1.5v7H9zM9 30h1.5v7H9zM6 30h1.5v7H6zM12 10h1.5v7H12z\"/></g></svg>',\n        'lock': '<svg width=\"24\" height=\"24\"><path d=\"M16.3 11c.2 0 .3 0 .5.2l.2.6v7.4c0 .3 0 .4-.2.6l-.6.2H7.8c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6v-7.4c0-.3 0-.4.2-.6l.5-.2H8V8c0-.8.3-1.5.9-2.1.6-.6 1.3-.9 2.1-.9h2c.8 0 1.5.3 2.1.9.6.6.9 1.3.9 2.1v3h.3zM10 8v3h4V8a1 1 0 0 0-.3-.7A1 1 0 0 0 13 7h-2a1 1 0 0 0-.7.3 1 1 0 0 0-.3.7z\" fill-rule=\"evenodd\"/></svg>',\n        'ltr': '<svg width=\"24\" height=\"24\"><path d=\"M11 5h7a1 1 0 0 1 0 2h-1v11a1 1 0 0 1-2 0V7h-2v11a1 1 0 0 1-2 0v-6c-.5 0-1 0-1.4-.3A3.4 3.4 0 0 1 7.8 10a3.3 3.3 0 0 1 0-2.8 3.4 3.4 0 0 1 1.8-1.8L11 5zM4.4 16.2L6.2 15l-1.8-1.2a1 1 0 0 1 1.2-1.6l3 2a1 1 0 0 1 0 1.6l-3 2a1 1 0 1 1-1.2-1.6z\" fill-rule=\"evenodd\"/></svg>',\n        'more-drawer': '<svg width=\"24\" height=\"24\"><path d=\"M6 10a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2zm12 0a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2zm-6 0a2 2 0 0 0-2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2 2 2 0 0 0-2-2z\" fill-rule=\"nonzero\"/></svg>',\n        'new-document': '<svg width=\"24\" height=\"24\"><path d=\"M14.4 3H7a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h10a2 2 0 0 0 2-2V7.6L14.4 3zM17 19H7V5h6v4h4v10z\" fill-rule=\"nonzero\"/></svg>',\n        'new-tab': '<svg width=\"24\" height=\"24\"><path d=\"M15 13l2-2v8H5V7h8l-2 2H7v8h8v-4zm4-8v5.5l-2-2-5.6 5.5H10v-1.4L15.5 7l-2-2H19z\" fill-rule=\"evenodd\"/></svg>',\n        'non-breaking': '<svg width=\"24\" height=\"24\"><path d=\"M11 11H8a1 1 0 1 1 0-2h3V6c0-.6.4-1 1-1s1 .4 1 1v3h3c.6 0 1 .4 1 1s-.4 1-1 1h-3v3c0 .6-.4 1-1 1a1 1 0 0 1-1-1v-3zm10 4v5H3v-5c0-.6.4-1 1-1s1 .4 1 1v3h14v-3c0-.6.4-1 1-1s1 .4 1 1z\" fill-rule=\"evenodd\"/></svg>',\n        'notice': '<svg width=\"24\" height=\"24\"><path d=\"M17.8 9.8L15.4 4 20 8.5v7L15.5 20h-7L4 15.5v-7L8.5 4h7l2.3 5.8zm0 0l2.2 5.7-2.3-5.8zM13 17v-2h-2v2h2zm0-4V7h-2v6h2z\" fill-rule=\"evenodd\"/></svg>',\n        'ordered-list-rtl': '<svg width=\"24\" height=\"24\"><path d=\"M6 17h8a1 1 0 0 1 0 2H6a1 1 0 0 1 0-2zm0-6h8a1 1 0 0 1 0 2H6a1 1 0 0 1 0-2zm0-6h8a1 1 0 0 1 0 2H6a1 1 0 1 1 0-2zm13-1v3.5a.5.5 0 1 1-1 0V5h-.5a.5.5 0 1 1 0-1H19zm-1 8.8l.2.2h1.3a.5.5 0 1 1 0 1h-1.6a1 1 0 0 1-.9-1V13c0-.4.3-.8.6-1l1.2-.4.2-.3a.2.2 0 0 0-.2-.2h-1.3a.5.5 0 0 1-.5-.5c0-.3.2-.5.5-.5h1.6c.5 0 .9.4.9 1v.1c0 .4-.3.8-.6 1l-1.2.4-.2.3zm2 4.2v2c0 .6-.4 1-1 1h-1.5a.5.5 0 0 1 0-1h1.2a.3.3 0 1 0 0-.6h-1.3a.4.4 0 1 1 0-.8h1.3a.3.3 0 0 0 0-.6h-1.2a.5.5 0 1 1 0-1H19c.6 0 1 .4 1 1z\" fill-rule=\"evenodd\"/></svg>',\n        'ordered-list': '<svg width=\"24\" height=\"24\"><path d=\"M10 17h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 1 1 0-2zM6 4v3.5c0 .3-.2.5-.5.5a.5.5 0 0 1-.5-.5V5h-.5a.5.5 0 0 1 0-1H6zm-1 8.8l.2.2h1.3c.3 0 .5.2.5.5s-.2.5-.5.5H4.9a1 1 0 0 1-.9-1V13c0-.4.3-.8.6-1l1.2-.4.2-.3a.2.2 0 0 0-.2-.2H4.5a.5.5 0 0 1-.5-.5c0-.3.2-.5.5-.5h1.6c.5 0 .9.4.9 1v.1c0 .4-.3.8-.6 1l-1.2.4-.2.3zM7 17v2c0 .6-.4 1-1 1H4.5a.5.5 0 0 1 0-1h1.2c.2 0 .3-.1.3-.3 0-.2-.1-.3-.3-.3H4.4a.4.4 0 1 1 0-.8h1.3c.2 0 .3-.1.3-.3 0-.2-.1-.3-.3-.3H4.5a.5.5 0 1 1 0-1H6c.6 0 1 .4 1 1z\" fill-rule=\"evenodd\"/></svg>',\n        'orientation': '<svg width=\"24\" height=\"24\"><path d=\"M7.3 6.4L1 13l6.4 6.5 6.5-6.5-6.5-6.5zM3.7 13l3.6-3.7L11 13l-3.7 3.7-3.6-3.7zM12 6l2.8 2.7c.3.3.3.8 0 1-.3.4-.9.4-1.2 0L9.2 5.7a.8.8 0 0 1 0-1.2L13.6.2c.3-.3.9-.3 1.2 0 .3.3.3.8 0 1.1L12 4h1a9 9 0 1 1-4.3 16.9l1.5-1.5A7 7 0 1 0 13 6h-1z\" fill-rule=\"nonzero\"/></svg>',\n        'outdent': '<svg width=\"24\" height=\"24\"><path d=\"M7 5h12c.6 0 1 .4 1 1s-.4 1-1 1H7a1 1 0 1 1 0-2zm5 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 0 1 0-2zm0 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 0 1 0-2zm-5 4h12a1 1 0 0 1 0 2H7a1 1 0 0 1 0-2zm1.6-3.8a1 1 0 0 1-1.2 1.6l-3-2a1 1 0 0 1 0-1.6l3-2a1 1 0 0 1 1.2 1.6L6.8 12l1.8 1.2z\" fill-rule=\"evenodd\"/></svg>',\n        'page-break': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M5 11c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2zm3 0h1c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 0 1 0-2zm4 0c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2zm3 0h1c.6 0 1 .4 1 1s-.4 1-1 1h-1a1 1 0 0 1 0-2zm4 0c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2zM7 3v5h10V3c0-.6.4-1 1-1s1 .4 1 1v7H5V3c0-.6.4-1 1-1s1 .4 1 1zM6 22a1 1 0 0 1-1-1v-7h14v7c0 .6-.4 1-1 1a1 1 0 0 1-1-1v-5H7v5c0 .6-.4 1-1 1z\"/></g></svg>',\n        'paragraph': '<svg width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"M10 5h7a1 1 0 0 1 0 2h-1v11a1 1 0 0 1-2 0V7h-2v11a1 1 0 0 1-2 0v-6c-.5 0-1 0-1.4-.3A3.4 3.4 0 0 1 6.8 10a3.3 3.3 0 0 1 0-2.8 3.4 3.4 0 0 1 1.8-1.8L10 5z\"/></svg>',\n        'paste-text': '<svg width=\"24\" height=\"24\"><path d=\"M18 9V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 0 1-1-1V5H6v13h3V9h9zM9 20H6a2 2 0 0 1-2-2V5c0-1.1.9-2 2-2h3.2A3 3 0 0 1 12 1a3 3 0 0 1 2.8 2H18a2 2 0 0 1 2 2v4h1v12H9v-1zm1.5-9.5v9h9v-9h-9zM12 3a1 1 0 0 0-1 1c0 .5.4 1 1 1s1-.5 1-1-.4-1-1-1zm0 9h6v2h-.5l-.5-1h-1v4h.8v1h-3.6v-1h.8v-4h-1l-.5 1H12v-2z\" fill-rule=\"nonzero\"/></svg>',\n        'paste': '<svg width=\"24\" height=\"24\"><path d=\"M18 9V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 0 1-1-1V5H6v13h3V9h9zM9 20H6a2 2 0 0 1-2-2V5c0-1.1.9-2 2-2h3.2A3 3 0 0 1 12 1a3 3 0 0 1 2.8 2H18a2 2 0 0 1 2 2v4h1v12H9v-1zm1.5-9.5v9h9v-9h-9zM12 3a1 1 0 0 0-1 1c0 .5.4 1 1 1s1-.5 1-1-.4-1-1-1z\" fill-rule=\"nonzero\"/></svg>',\n        'permanent-pen': '<svg width=\"24\" height=\"24\"><path d=\"M10.5 17.5L8 20H3v-3l3.5-3.5a2 2 0 0 1 0-3L14 3l1 1-7.3 7.3a1 1 0 0 0 0 1.4l3.6 3.6c.4.4 1 .4 1.4 0L20 9l1 1-7.6 7.6a2 2 0 0 1-2.8 0l-.1-.1z\" fill-rule=\"nonzero\"/></svg>',\n        'plus': '<svg width=\"24\" height=\"24\"><path d=\"M12 4c.5 0 1 .4 1 .9V11h6a1 1 0 0 1 .1 2H13v6a1 1 0 0 1-2 .1V13H5a1 1 0 0 1-.1-2H11V5c0-.6.4-1 1-1z\"/></svg>',\n        'preferences': '<svg width=\"24\" height=\"24\"><path d=\"M20.1 13.5l-1.9.2a5.8 5.8 0 0 1-.6 1.5l1.2 1.5c.4.4.3 1 0 1.4l-.7.7a1 1 0 0 1-1.4 0l-1.5-1.2a6.2 6.2 0 0 1-1.5.6l-.2 1.9c0 .5-.5.9-1 .9h-1a1 1 0 0 1-1-.9l-.2-1.9a5.8 5.8 0 0 1-1.5-.6l-1.5 1.2a1 1 0 0 1-1.4 0l-.7-.7a1 1 0 0 1 0-1.4l1.2-1.5a6.2 6.2 0 0 1-.6-1.5l-1.9-.2a1 1 0 0 1-.9-1v-1c0-.5.4-1 .9-1l1.9-.2a5.8 5.8 0 0 1 .6-1.5L5.2 7.3a1 1 0 0 1 0-1.4l.7-.7a1 1 0 0 1 1.4 0l1.5 1.2a6.2 6.2 0 0 1 1.5-.6l.2-1.9c0-.5.5-.9 1-.9h1c.5 0 1 .4 1 .9l.2 1.9a5.8 5.8 0 0 1 1.5.6l1.5-1.2a1 1 0 0 1 1.4 0l.7.7c.3.4.4 1 0 1.4l-1.2 1.5a6.2 6.2 0 0 1 .6 1.5l1.9.2c.5 0 .9.5.9 1v1c0 .5-.4 1-.9 1zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z\" fill-rule=\"evenodd\"/></svg>',\n        'preview': '<svg width=\"24\" height=\"24\"><path d=\"M3.5 12.5c.5.8 1.1 1.6 1.8 2.3 2 2 4.2 3.2 6.7 3.2s4.7-1.2 6.7-3.2a16.2 16.2 0 0 0 2.1-2.8 15.7 15.7 0 0 0-2.1-2.8c-2-2-4.2-3.2-6.7-3.2a9.3 9.3 0 0 0-6.7 3.2A16.2 16.2 0 0 0 3.2 12c0 .2.2.3.3.5zm-2.4-1l.7-1.2L4 7.8C6.2 5.4 8.9 4 12 4c3 0 5.8 1.4 8.1 3.8a18.2 18.2 0 0 1 2.8 3.7v1l-.7 1.2-2.1 2.5c-2.3 2.4-5 3.8-8.1 3.8-3 0-5.8-1.4-8.1-3.8a18.2 18.2 0 0 1-2.8-3.7 1 1 0 0 1 0-1zm12-3.3a2 2 0 1 0 2.7 2.6 4 4 0 1 1-2.6-2.6z\" fill-rule=\"nonzero\"/></svg>',\n        'print': '<svg width=\"24\" height=\"24\"><path d=\"M18 8H6a3 3 0 0 0-3 3v6h2v3h14v-3h2v-6a3 3 0 0 0-3-3zm-1 10H7v-4h10v4zm.5-5c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm.5-8H6v2h12V5z\" fill-rule=\"nonzero\"/></svg>',\n        'quote': '<svg width=\"24\" height=\"24\"><path d=\"M7.5 17h.9c.4 0 .7-.2.9-.6L11 13V8c0-.6-.4-1-1-1H6a1 1 0 0 0-1 1v4c0 .6.4 1 1 1h2l-1.3 2.7a1 1 0 0 0 .8 1.3zm8 0h.9c.4 0 .7-.2.9-.6L19 13V8c0-.6-.4-1-1-1h-4a1 1 0 0 0-1 1v4c0 .6.4 1 1 1h2l-1.3 2.7a1 1 0 0 0 .8 1.3z\" fill-rule=\"nonzero\"/></svg>',\n        'redo': '<svg width=\"24\" height=\"24\"><path d=\"M17.6 10H12c-2.8 0-4.4 1.4-4.9 3.5-.4 2 .3 4 1.4 4.6a1 1 0 1 1-1 1.8c-2-1.2-2.9-4.1-2.3-6.8.6-3 3-5.1 6.8-5.1h5.6l-3.3-3.3a1 1 0 1 1 1.4-1.4l5 5a1 1 0 0 1 0 1.4l-5 5a1 1 0 0 1-1.4-1.4l3.3-3.3z\" fill-rule=\"nonzero\"/></svg>',\n        'reload': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M5 22.1l-1.2-4.7v-.2a1 1 0 0 1 1-1l5 .4a1 1 0 1 1-.2 2l-2.2-.2a7.8 7.8 0 0 0 8.4.2 7.5 7.5 0 0 0 3.5-6.4 1 1 0 1 1 2 0 9.5 9.5 0 0 1-4.5 8 9.9 9.9 0 0 1-10.2 0l.4 1.4a1 1 0 1 1-2 .5zM13.6 7.4c0-.5.5-1 1-.9l2.8.2a8 8 0 0 0-9.5-1 7.5 7.5 0 0 0-3.6 7 1 1 0 0 1-2 0 9.5 9.5 0 0 1 4.5-8.6 10 10 0 0 1 10.9.3l-.3-1a1 1 0 0 1 2-.5l1.1 4.8a1 1 0 0 1-1 1.2l-5-.4a1 1 0 0 1-.9-1z\"/></g></svg>',\n        'remove-formatting': '<svg width=\"24\" height=\"24\"><path d=\"M13.2 6a1 1 0 0 1 0 .2l-2.6 10a1 1 0 0 1-1 .8h-.2a.8.8 0 0 1-.8-1l2.6-10H8a1 1 0 1 1 0-2h9a1 1 0 0 1 0 2h-3.8zM5 18h7a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2zm13 1.5L16.5 18 15 19.5a.7.7 0 0 1-1-1l1.5-1.5-1.5-1.5a.7.7 0 0 1 1-1l1.5 1.5 1.5-1.5a.7.7 0 0 1 1 1L17.5 17l1.5 1.5a.7.7 0 0 1-1 1z\" fill-rule=\"evenodd\"/></svg>',\n        'remove': '<svg width=\"24\" height=\"24\"><path d=\"M16 7h3a1 1 0 0 1 0 2h-1v9a3 3 0 0 1-3 3H9a3 3 0 0 1-3-3V9H5a1 1 0 1 1 0-2h3V6a3 3 0 0 1 3-3h2a3 3 0 0 1 3 3v1zm-2 0V6c0-.6-.4-1-1-1h-2a1 1 0 0 0-1 1v1h4zm2 2H8v9c0 .6.4 1 1 1h6c.6 0 1-.4 1-1V9zm-7 3a1 1 0 0 1 2 0v4a1 1 0 0 1-2 0v-4zm4 0a1 1 0 0 1 2 0v4a1 1 0 0 1-2 0v-4z\" fill-rule=\"nonzero\"/></svg>',\n        'resize-handle': '<svg width=\"10\" height=\"10\"><g fill-rule=\"nonzero\"><path d=\"M8.1 1.1A.5.5 0 1 1 9 2l-7 7A.5.5 0 1 1 1 8l7-7zM8.1 5.1A.5.5 0 1 1 9 6l-3 3A.5.5 0 1 1 5 8l3-3z\"/></g></svg>',\n        'resize': '<svg width=\"24\" height=\"24\"><path d=\"M4 5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h6c.3 0 .5.1.7.3.2.2.3.4.3.7 0 .3-.1.5-.3.7a1 1 0 0 1-.7.3H7.4L18 16.6V13c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3.3 0 .5.1.7.3.2.2.3.4.3.7v6c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3h-6a1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h3.6L6 7.4V11c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3 1 1 0 0 1-.7-.3A1 1 0 0 1 4 11V5z\" fill-rule=\"evenodd\"/></svg>',\n        'restore-draft': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M17 13c0 .6-.4 1-1 1h-4V8c0-.6.4-1 1-1s1 .4 1 1v4h2c.6 0 1 .4 1 1z\"/><path d=\"M4.7 10H9a1 1 0 0 1 0 2H3a1 1 0 0 1-1-1V5a1 1 0 1 1 2 0v3l2.5-2.4a9.2 9.2 0 0 1 10.8-1.5A9 9 0 0 1 13.4 21c-2.4.1-4.7-.7-6.5-2.2a1 1 0 1 1 1.3-1.5 7.2 7.2 0 0 0 11.6-3.7 7 7 0 0 0-3.5-7.7A7.2 7.2 0 0 0 8 7L4.7 10z\" fill-rule=\"nonzero\"/></g></svg>',\n        'rotate-left': '<svg width=\"24\" height=\"24\"><path d=\"M4.7 10H9a1 1 0 0 1 0 2H3a1 1 0 0 1-1-1V5a1 1 0 1 1 2 0v3l2.5-2.4a9.2 9.2 0 0 1 10.8-1.5A9 9 0 0 1 13.4 21c-2.4.1-4.7-.7-6.5-2.2a1 1 0 1 1 1.3-1.5 7.2 7.2 0 0 0 11.6-3.7 7 7 0 0 0-3.5-7.7A7.2 7.2 0 0 0 8 7L4.7 10z\" fill-rule=\"nonzero\"/></svg>',\n        'rotate-right': '<svg width=\"24\" height=\"24\"><path d=\"M20 8V5a1 1 0 0 1 2 0v6c0 .6-.4 1-1 1h-6a1 1 0 0 1 0-2h4.3L16 7A7.2 7.2 0 0 0 7.7 6a7 7 0 0 0 3 13.1c1.9.1 3.7-.5 5-1.7a1 1 0 0 1 1.4 1.5A9.2 9.2 0 0 1 2.2 14c-.9-3.9 1-8 4.5-9.9 3.5-1.9 8-1.3 10.8 1.5L20 8z\" fill-rule=\"nonzero\"/></svg>',\n        'rtl': '<svg width=\"24\" height=\"24\"><path d=\"M8 5h8v2h-2v12h-2V7h-2v12H8v-7c-.5 0-1 0-1.4-.3A3.4 3.4 0 0 1 4.8 10a3.3 3.3 0 0 1 0-2.8 3.4 3.4 0 0 1 1.8-1.8L8 5zm12 11.2a1 1 0 1 1-1 1.6l-3-2a1 1 0 0 1 0-1.6l3-2a1 1 0 1 1 1 1.6L18.4 15l1.8 1.2z\" fill-rule=\"evenodd\"/></svg>',\n        'save': '<svg width=\"24\" height=\"24\"><path d=\"M5 16h14a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2c0-1.1.9-2 2-2zm0 2v2h14v-2H5zm10 0h2v2h-2v-2zm-4-6.4L8.7 9.3a1 1 0 1 0-1.4 1.4l4 4c.4.4 1 .4 1.4 0l4-4a1 1 0 1 0-1.4-1.4L13 11.6V4a1 1 0 0 0-2 0v7.6z\" fill-rule=\"nonzero\"/></svg>',\n        'search': '<svg width=\"24\" height=\"24\"><path d=\"M16 17.3a8 8 0 1 1 1.4-1.4l4.3 4.4a1 1 0 0 1-1.4 1.4l-4.4-4.3zm-5-.3a6 6 0 1 0 0-12 6 6 0 0 0 0 12z\" fill-rule=\"nonzero\"/></svg>',\n        'select-all': '<svg width=\"24\" height=\"24\"><path d=\"M3 5h2V3a2 2 0 0 0-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2a2 2 0 0 0-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8a2 2 0 0 0 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2zM7 17h10V7H7v10zm2-8h6v6H9V9z\" fill-rule=\"nonzero\"/></svg>',\n        'selected': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M6 4h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2zm3.6 10.9L7 12.3a.7.7 0 0 0-1 1L9.6 17 18 8.6a.7.7 0 0 0 0-1 .7.7 0 0 0-1 0l-7.4 7.3z\"/></svg>',\n        'settings': '<svg width=\"24\" height=\"24\"><path d=\"M11 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8v.3c0 .2 0 .3-.2.5l-.6.2H7.8c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6V8H5a1 1 0 1 1 0-2h2v-.3c0-.2 0-.3.2-.5l.5-.2h2.5c.3 0 .4 0 .6.2l.2.5V6zM8 8h2V6H8v2zm9 2.8v.2h2c.6 0 1 .4 1 1s-.4 1-1 1h-2v.3c0 .2 0 .3-.2.5l-.6.2h-2.4c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6V13H5a1 1 0 0 1 0-2h8v-.3c0-.2 0-.3.2-.5l.6-.2h2.4c.3 0 .4 0 .6.2l.2.6zM14 13h2v-2h-2v2zm-3 2.8v.2h8c.6 0 1 .4 1 1s-.4 1-1 1h-8v.3c0 .2 0 .3-.2.5l-.6.2H7.8c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6V18H5a1 1 0 0 1 0-2h2v-.3c0-.2 0-.3.2-.5l.5-.2h2.5c.3 0 .4 0 .6.2l.2.6zM8 18h2v-2H8v2z\" fill-rule=\"evenodd\"/></svg>',\n        'sharpen': '<svg width=\"24\" height=\"24\"><path d=\"M16 6l4 4-8 9-8-9 4-4h8zm-4 10.2l5.5-6.2-.1-.1H12v-.3h5.1l-.2-.2H12V9h4.6l-.2-.2H12v-.3h4.1l-.2-.2H12V8h3.6l-.2-.2H8.7L6.5 10l.1.1H12v.3H6.9l.2.2H12v.3H7.3l.2.2H12v.3H7.7l.3.2h4v.3H8.2l.2.2H12v.3H8.6l.3.2H12v.3H9l.3.2H12v.3H9.5l.2.2H12v.3h-2l.2.2H12v.3h-1.6l.2.2H12v.3h-1.1l.2.2h.9v.3h-.7l.2.2h.5v.3h-.3l.3.2z\" fill-rule=\"evenodd\"/></svg>',\n        'sort-asc': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M4 8h5a1 1 0 1 1 0 2H4a1 1 0 1 1 0-2zm0 8h8a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2zm0-4h7a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2z\"/><path fill-rule=\"nonzero\" d=\"M16 8.4l-2.3 2.3a1 1 0 0 1-1.4-1.4l4-4a1 1 0 0 1 1.4 0l4 4a1 1 0 1 1-1.4 1.4L18 8.4V18a1 1 0 0 1-2 0V8.4z\"/></g></svg>',\n        'sort-dsc': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M4 16h5a1 1 0 0 0 0-2H4a1 1 0 0 0 0 2zm0-8h8a1 1 0 0 0 0-2H4a1 1 0 1 0 0 2zm0 4h7a1 1 0 0 0 0-2H4a1 1 0 0 0 0 2z\"/><path fill-rule=\"nonzero\" d=\"M16 15.6l-2.3-2.3a1 1 0 0 0-1.4 1.4l4 4c.4.4 1 .4 1.4 0l4-4a1 1 0 0 0-1.4-1.4L18 15.6V6a1 1 0 0 0-2 0v9.6z\"/></g></svg>',\n        'sourcecode': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M9.8 15.7c.3.3.3.8 0 1-.3.4-.9.4-1.2 0l-4.4-4.1a.8.8 0 0 1 0-1.2l4.4-4.2c.3-.3.9-.3 1.2 0 .3.3.3.8 0 1.1L6 12l3.8 3.7zM14.2 15.7c-.3.3-.3.8 0 1 .4.4.9.4 1.2 0l4.4-4.1c.3-.3.3-.9 0-1.2l-4.4-4.2a.8.8 0 0 0-1.2 0c-.3.3-.3.8 0 1.1L18 12l-3.8 3.7z\"/></g></svg>',\n        'spell-check': '<svg width=\"24\" height=\"24\"><path d=\"M6 8v3H5V5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h2c.3 0 .5.1.7.3.2.2.3.4.3.7v6H8V8H6zm0-3v2h2V5H6zm13 0h-3v5h3v1h-3a1 1 0 0 1-.7-.3 1 1 0 0 1-.3-.7V5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h3v1zm-5 1.5l-.1.7c-.1.2-.3.3-.6.3.3 0 .5.1.6.3l.1.7V10c0 .3-.1.5-.3.7a1 1 0 0 1-.7.3h-3V4h3c.3 0 .5.1.7.3.2.2.3.4.3.7v1.5zM13 10V8h-2v2h2zm0-3V5h-2v2h2zm3 5l1 1-6.5 7L7 15.5l1.3-1 2.2 2.2L16 12z\" fill-rule=\"evenodd\"/></svg>',\n        'strike-through': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M15.6 8.5c-.5-.7-1-1.1-1.3-1.3-.6-.4-1.3-.6-2-.6-2.7 0-2.8 1.7-2.8 2.1 0 1.6 1.8 2 3.2 2.3 4.4.9 4.6 2.8 4.6 3.9 0 1.4-.7 4.1-5 4.1A6.2 6.2 0 0 1 7 16.4l1.5-1.1c.4.6 1.6 2 3.7 2 1.6 0 2.5-.4 3-1.2.4-.8.3-2-.8-2.6-.7-.4-1.6-.7-2.9-1-1-.2-3.9-.8-3.9-3.6C7.6 6 10.3 5 12.4 5c2.9 0 4.2 1.6 4.7 2.4l-1.5 1.1z\"/><path d=\"M5 11h14a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2z\" fill-rule=\"nonzero\"/></g></svg>',\n        'subscript': '<svg width=\"24\" height=\"24\"><path d=\"M10.4 10l4.6 4.6-1.4 1.4L9 11.4 4.4 16 3 14.6 7.6 10 3 5.4 4.4 4 9 8.6 13.6 4 15 5.4 10.4 10zM21 19h-5v-1l1-.8 1.7-1.6c.3-.4.5-.8.5-1.2 0-.3 0-.6-.2-.7-.2-.2-.5-.3-.9-.3a2 2 0 0 0-.8.2l-.7.3-.4-1.1 1-.6 1.2-.2c.8 0 1.4.3 1.8.7.4.4.6.9.6 1.5s-.2 1.1-.5 1.6a8 8 0 0 1-1.3 1.3l-.6.6h2.6V19z\" fill-rule=\"nonzero\"/></svg>',\n        'superscript': '<svg width=\"24\" height=\"24\"><path d=\"M15 9.4L10.4 14l4.6 4.6-1.4 1.4L9 15.4 4.4 20 3 18.6 7.6 14 3 9.4 4.4 8 9 12.6 13.6 8 15 9.4zm5.9 1.6h-5v-1l1-.8 1.7-1.6c.3-.5.5-.9.5-1.3 0-.3 0-.5-.2-.7-.2-.2-.5-.3-.9-.3l-.8.2-.7.4-.4-1.2c.2-.2.5-.4 1-.5.3-.2.8-.2 1.2-.2.8 0 1.4.2 1.8.6.4.4.6 1 .6 1.6 0 .5-.2 1-.5 1.5l-1.3 1.4-.6.5h2.6V11z\" fill-rule=\"nonzero\"/></svg>',\n        'table-cell-properties': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zm-8 9H5v5h6v-5zm8 0h-6v5h6v-5zm-8-7H5v5h6V6z\"/></svg>',\n        'table-cell-select-all': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zm0 2H5v12h14V6z\"/><path d=\"M13 6v5h6v2h-6v5h-2v-5H5v-2h6V6h2z\" opacity=\".2\"/></g></svg>',\n        'table-cell-select-inner': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zm0 2H5v12h14V6z\" opacity=\".2\"/><path d=\"M13 6v5h6v2h-6v5h-2v-5H5v-2h6V6h2z\"/></g></svg>',\n        'table-delete-column': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zm-4 4h-2V6h-2v2H9V6H5v12h4v-2h2v2h2v-2h2v2h4V6h-4v2zm.3.5l1 1.2-3 2.3 3 2.3-1 1.2L12 13l-3.3 2.6-1-1.2 3-2.3-3-2.3 1-1.2L12 11l3.3-2.5z\"/></svg>',\n        'table-delete-row': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zm0 2H5v3h2.5v2H5v2h2.5v2H5v3h14v-3h-2.5v-2H19v-2h-2.5V9H19V6zm-4.7 1.8l1.2 1L13 12l2.6 3.3-1.2 1-2.3-3-2.3 3-1.2-1L11 12 8.5 8.7l1.2-1 2.3 3 2.3-3z\"/></svg>',\n        'table-delete-table': '<svg width=\"24\" height=\"24\"><g fill-rule=\"nonzero\"><path d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zM5 6v12h14V6H5z\"/><path d=\"M14.4 8.6l1 1-2.3 2.4 2.3 2.4-1 1-2.4-2.3-2.4 2.3-1-1 2.3-2.4-2.3-2.4 1-1 2.4 2.3z\"/></g></svg>',\n        'table-insert-column-after': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M20 4c.6 0 1 .4 1 1v2a1 1 0 0 1-2 0V6h-8v12h8v-1a1 1 0 0 1 2 0v2c0 .5-.4 1-.9 1H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h15zM9 13H5v5h4v-5zm7-5c.5 0 1 .4 1 .9V11h2a1 1 0 0 1 .1 2H17v2a1 1 0 0 1-2 .1V13h-2a1 1 0 0 1-.1-2H15V9c0-.6.4-1 1-1zM9 6H5v5h4V6z\"/></svg>',\n        'table-insert-column-before': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a1 1 0 0 1-1-1v-2a1 1 0 0 1 2 0v1h8V6H5v1a1 1 0 1 1-2 0V5c0-.6.4-1 1-1h15zm0 9h-4v5h4v-5zM8 8c.5 0 1 .4 1 .9V11h2a1 1 0 0 1 .1 2H9v2a1 1 0 0 1-2 .1V13H5a1 1 0 0 1-.1-2H7V9c0-.6.4-1 1-1zm11-2h-4v5h4V6z\"/></svg>',\n        'table-insert-row-above': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M6 4a1 1 0 1 1 0 2H5v6h14V6h-1a1 1 0 0 1 0-2h2c.6 0 1 .4 1 1v13a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5c0-.6.4-1 1-1h2zm5 10H5v4h6v-4zm8 0h-6v4h6v-4zM12 3c.5 0 1 .4 1 .9V6h2a1 1 0 0 1 0 2h-2v2a1 1 0 0 1-2 .1V8H9a1 1 0 0 1 0-2h2V4c0-.6.4-1 1-1z\"/></svg>',\n        'table-insert-row-after': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M12 13c.5 0 1 .4 1 .9V16h2a1 1 0 0 1 .1 2H13v2a1 1 0 0 1-2 .1V18H9a1 1 0 0 1-.1-2H11v-2c0-.6.4-1 1-1zm6 7a1 1 0 0 1 0-2h1v-6H5v6h1a1 1 0 0 1 0 2H4a1 1 0 0 1-1-1V6c0-1.1.9-2 2-2h14a2 2 0 0 1 2 2v13c0 .5-.4 1-.9 1H18zM11 6H5v4h6V6zm8 0h-6v4h6V6z\"/></svg>',\n        'table-left-header': '<svg width=\"24\" height=\"24\"><path d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zm0 9h-4v5h4v-5zm-6 0H9v5h4v-5zm0-7H9v5h4V6zm6 0h-4v5h4V6z\"/></svg>',\n        'table-merge-cells': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zM5 15.5V18h3v-2.5H5zm14-5h-9V18h9v-7.5zM19 6h-4v2.5h4V6zM8 6H5v2.5h3V6zm5 0h-3v2.5h3V6zm-8 7.5h3v-3H5v3z\"/></svg>',\n        'table-row-properties': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zM5 15v3h6v-3H5zm14 0h-6v3h6v-3zm0-9h-6v3h6V6zM5 9h6V6H5v3z\"/></svg>',\n        'table-split-cells': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zM8 15.5H5V18h3v-2.5zm11-5h-9V18h9v-7.5zm-2.5 1l1 1-2 2 2 2-1 1-2-2-2 2-1-1 2-2-2-2 1-1 2 2 2-2zm-8.5-1H5v3h3v-3zM19 6h-4v2.5h4V6zM8 6H5v2.5h3V6zm5 0h-3v2.5h3V6z\"/></svg>',\n        'table-top-header': '<svg width=\"24\" height=\"24\"><path d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zm-8 11H5v3h6v-3zm8 0h-6v3h6v-3zm0-5h-6v3h6v-3zM5 13h6v-3H5v3z\"/></svg>',\n        'table': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14zM5 14v4h6v-4H5zm14 0h-6v4h6v-4zm0-6h-6v4h6V8zM5 12h6V8H5v4z\"/></svg>',\n        'template': '<svg width=\"24\" height=\"24\"><path d=\"M19 19v-1H5v1h14zM9 16v-4a5 5 0 1 1 6 0v4h4a2 2 0 0 1 2 2v3H3v-3c0-1.1.9-2 2-2h4zm4 0v-5l.8-.6a3 3 0 1 0-3.6 0l.8.6v5h2z\" fill-rule=\"nonzero\"/></svg>',\n        'temporary-placeholder': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path d=\"M9 7.6V6h2.5V4.5a.5.5 0 1 1 1 0V6H15v1.6a8 8 0 1 1-6 0zm-2.6 5.3a.5.5 0 0 0 .3.6c.3 0 .6 0 .6-.3l.1-.2a5 5 0 0 1 3.3-2.8c.3-.1.4-.4.4-.6-.1-.3-.4-.5-.6-.4a6 6 0 0 0-4.1 3.7z\"/><circle cx=\"14\" cy=\"4\" r=\"1\"/><circle cx=\"12\" cy=\"2\" r=\"1\"/><circle cx=\"10\" cy=\"4\" r=\"1\"/></g></svg>',\n        'text-color': '<svg width=\"24\" height=\"24\"><g fill-rule=\"evenodd\"><path id=\"tox-icon-text-color__color\" d=\"M3 18h18v3H3z\"/><path d=\"M8.7 16h-.8a.5.5 0 0 1-.5-.6l2.7-9c.1-.3.3-.4.5-.4h2.8c.2 0 .4.1.5.4l2.7 9a.5.5 0 0 1-.5.6h-.8a.5.5 0 0 1-.4-.4l-.7-2.2c0-.3-.3-.4-.5-.4h-3.4c-.2 0-.4.1-.5.4l-.7 2.2c0 .3-.2.4-.4.4zm2.6-7.6l-.6 2a.5.5 0 0 0 .5.6h1.6a.5.5 0 0 0 .5-.6l-.6-2c0-.3-.3-.4-.5-.4h-.4c-.2 0-.4.1-.5.4z\"/></g></svg>',\n        'toc': '<svg width=\"24\" height=\"24\"><path d=\"M5 5c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 1 1 0-2zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 1 1 0-2zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 0 1 0-2zm0-4c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 1 1 0-2zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 0 1 0-2zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2z\" fill-rule=\"evenodd\"/></svg>',\n        'translate': '<svg width=\"24\" height=\"24\"><path d=\"M12.7 14.3l-.3.7-.4.7-2.2-2.2-3.1 3c-.3.4-.8.4-1 0a.7.7 0 0 1 0-1l3.1-3A12.4 12.4 0 0 1 6.7 9H8a10.1 10.1 0 0 0 1.7 2.4c.5-.5 1-1.1 1.4-1.8l.9-2H4.7a.7.7 0 1 1 0-1.5h4.4v-.7c0-.4.3-.8.7-.8.4 0 .7.4.7.8v.7H15c.4 0 .8.3.8.7 0 .4-.4.8-.8.8h-1.4a12.3 12.3 0 0 1-1 2.4 13.5 13.5 0 0 1-1.7 2.3l1.9 1.8zm4.3-3l2.7 7.3a.5.5 0 0 1-.4.7 1 1 0 0 1-1-.7l-.6-1.5h-3.4l-.6 1.5a1 1 0 0 1-1 .7.5.5 0 0 1-.4-.7l2.7-7.4a1 1 0 1 1 2 0zm-2.2 4.4h2.4L16 12.5l-1.2 3.2z\" fill-rule=\"evenodd\"/></svg>',\n        'underline': '<svg width=\"24\" height=\"24\"><path d=\"M16 5c.6 0 1 .4 1 1v5.5a4 4 0 0 1-.4 1.8l-1 1.4a5.3 5.3 0 0 1-5.5 1 5 5 0 0 1-1.6-1c-.5-.4-.8-.9-1.1-1.4a4 4 0 0 1-.4-1.8V6c0-.6.4-1 1-1s1 .4 1 1v5.5c0 .3 0 .6.2 1l.6.7a3.3 3.3 0 0 0 2.2.8 3.4 3.4 0 0 0 2.2-.8c.3-.2.4-.5.6-.8l.2-.9V6c0-.6.4-1 1-1zM8 17h8c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 0 1 0-2z\" fill-rule=\"evenodd\"/></svg>',\n        'undo': '<svg width=\"24\" height=\"24\"><path d=\"M6.4 8H12c3.7 0 6.2 2 6.8 5.1.6 2.7-.4 5.6-2.3 6.8a1 1 0 0 1-1-1.8c1.1-.6 1.8-2.7 1.4-4.6-.5-2.1-2.1-3.5-4.9-3.5H6.4l3.3 3.3a1 1 0 1 1-1.4 1.4l-5-5a1 1 0 0 1 0-1.4l5-5a1 1 0 0 1 1.4 1.4L6.4 8z\" fill-rule=\"nonzero\"/></svg>',\n        'unlink': '<svg width=\"24\" height=\"24\"><path d=\"M6.2 12.3a1 1 0 0 1 1.4 1.4l-2 2a2 2 0 1 0 2.6 2.8l4.8-4.8a1 1 0 0 0 0-1.4 1 1 0 1 1 1.4-1.3 2.9 2.9 0 0 1 0 4L9.6 20a3.9 3.9 0 0 1-5.5-5.5l2-2zm11.6-.6a1 1 0 0 1-1.4-1.4l2.1-2a2 2 0 1 0-2.7-2.8L11 10.3a1 1 0 0 0 0 1.4A1 1 0 1 1 9.6 13a2.9 2.9 0 0 1 0-4L14.4 4a3.9 3.9 0 0 1 5.5 5.5l-2 2zM7.6 6.3a.8.8 0 0 1-1 1.1L3.3 4.2a.7.7 0 1 1 1-1l3.2 3.1zM5.1 8.6a.8.8 0 0 1 0 1.5H3a.8.8 0 0 1 0-1.5H5zm5-3.5a.8.8 0 0 1-1.5 0V3a.8.8 0 0 1 1.5 0V5zm6 11.8a.8.8 0 0 1 1-1l3.2 3.2a.8.8 0 0 1-1 1L16 17zm-2.2 2a.8.8 0 0 1 1.5 0V21a.8.8 0 0 1-1.5 0V19zm5-3.5a.7.7 0 1 1 0-1.5H21a.8.8 0 0 1 0 1.5H19z\" fill-rule=\"nonzero\"/></svg>',\n        'unlock': '<svg width=\"24\" height=\"24\"><path d=\"M16 5c.8 0 1.5.3 2.1.9.6.6.9 1.3.9 2.1v3h-2V8a1 1 0 0 0-.3-.7A1 1 0 0 0 16 7h-2a1 1 0 0 0-.7.3 1 1 0 0 0-.3.7v3h.3c.2 0 .3 0 .5.2l.2.6v7.4c0 .3 0 .4-.2.6l-.6.2H4.8c-.3 0-.4 0-.6-.2a.7.7 0 0 1-.2-.6v-7.4c0-.3 0-.4.2-.6l.5-.2H11V8c0-.8.3-1.5.9-2.1.6-.6 1.3-.9 2.1-.9h2z\" fill-rule=\"evenodd\"/></svg>',\n        'unordered-list': '<svg width=\"24\" height=\"24\"><path d=\"M11 5h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zm0 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zm0 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 0 1 0-2zM4.5 6c0-.4.1-.8.4-1 .3-.4.7-.5 1.1-.5.4 0 .8.1 1 .4.4.3.5.7.5 1.1 0 .4-.1.8-.4 1-.3.4-.7.5-1.1.5-.4 0-.8-.1-1-.4-.4-.3-.5-.7-.5-1.1zm0 6c0-.4.1-.8.4-1 .3-.4.7-.5 1.1-.5.4 0 .8.1 1 .4.4.3.5.7.5 1.1 0 .4-.1.8-.4 1-.3.4-.7.5-1.1.5-.4 0-.8-.1-1-.4-.4-.3-.5-.7-.5-1.1zm0 6c0-.4.1-.8.4-1 .3-.4.7-.5 1.1-.5.4 0 .8.1 1 .4.4.3.5.7.5 1.1 0 .4-.1.8-.4 1-.3.4-.7.5-1.1.5-.4 0-.8-.1-1-.4-.4-.3-.5-.7-.5-1.1z\" fill-rule=\"evenodd\"/></svg>',\n        'unselected': '<svg width=\"24\" height=\"24\"><path fill-rule=\"nonzero\" d=\"M6 4h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2zm0 1a1 1 0 0 0-1 1v12c0 .6.4 1 1 1h12c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1H6z\"/></svg>',\n        'upload': '<svg width=\"24\" height=\"24\"><path d=\"M18 19v-2a1 1 0 0 1 2 0v3c0 .6-.4 1-1 1H5a1 1 0 0 1-1-1v-3a1 1 0 0 1 2 0v2h12zM11 6.4L8.7 8.7a1 1 0 0 1-1.4-1.4l4-4a1 1 0 0 1 1.4 0l4 4a1 1 0 1 1-1.4 1.4L13 6.4V16a1 1 0 0 1-2 0V6.4z\" fill-rule=\"nonzero\"/></svg>',\n        'user': '<svg width=\"24\" height=\"24\"><path d=\"M12 24a12 12 0 1 1 0-24 12 12 0 0 1 0 24zm-8.7-5.3a11 11 0 0 0 17.4 0C19.4 16.3 14.6 15 12 15c-2.6 0-7.4 1.3-8.7 3.7zM12 13c2.2 0 4-2 4-4.5S14.2 4 12 4 8 6 8 8.5 9.8 13 12 13z\" fill-rule=\"nonzero\"/></svg>',\n        'visualblocks': '<svg width=\"24\" height=\"24\"><path d=\"M9 19v2H7v-2h2zm-4 0v2a2 2 0 0 1-2-2h2zm8 0v2h-2v-2h2zm8 0a2 2 0 0 1-2 2v-2h2zm-4 0v2h-2v-2h2zM15 7a1 1 0 0 1 0 2v7a1 1 0 0 1-2 0V9h-1v7a1 1 0 0 1-2 0v-4a2.5 2.5 0 0 1-.2-5H15zM5 15v2H3v-2h2zm16 0v2h-2v-2h2zM5 11v2H3v-2h2zm16 0v2h-2v-2h2zM5 7v2H3V7h2zm16 0v2h-2V7h2zM5 3v2H3c0-1.1.9-2 2-2zm8 0v2h-2V3h2zm6 0a2 2 0 0 1 2 2h-2V3zM9 3v2H7V3h2zm8 0v2h-2V3h2z\" fill-rule=\"evenodd\"/></svg>',\n        'visualchars': '<svg width=\"24\" height=\"24\"><path d=\"M10 5h7a1 1 0 0 1 0 2h-1v11a1 1 0 0 1-2 0V7h-2v11a1 1 0 0 1-2 0v-6c-.5 0-1 0-1.4-.3A3.4 3.4 0 0 1 6.8 10a3.3 3.3 0 0 1 0-2.8 3.4 3.4 0 0 1 1.8-1.8L10 5z\" fill-rule=\"evenodd\"/></svg>',\n        'warning': '<svg width=\"24\" height=\"24\"><path d=\"M19.8 18.3c.2.5.3.9 0 1.2-.1.3-.5.5-1 .5H5.2c-.5 0-.9-.2-1-.5-.3-.3-.2-.7 0-1.2L11 4.7l.5-.5.5-.2c.2 0 .3 0 .5.2.2 0 .3.3.5.5l6.8 13.6zM12 18c.3 0 .5-.1.7-.3.2-.2.3-.4.3-.7a1 1 0 0 0-.3-.7 1 1 0 0 0-.7-.3 1 1 0 0 0-.7.3 1 1 0 0 0-.3.7c0 .3.1.5.3.7.2.2.4.3.7.3zm.7-3l.3-4a1 1 0 0 0-.3-.7 1 1 0 0 0-.7-.3 1 1 0 0 0-.7.3 1 1 0 0 0-.3.7l.3 4h1.4z\" fill-rule=\"evenodd\"/></svg>',\n        'zoom-in': '<svg width=\"24\" height=\"24\"><path d=\"M16 17.3a8 8 0 1 1 1.4-1.4l4.3 4.4a1 1 0 0 1-1.4 1.4l-4.4-4.3zm-5-.3a6 6 0 1 0 0-12 6 6 0 0 0 0 12zm-1-9a1 1 0 0 1 2 0v6a1 1 0 0 1-2 0V8zm-2 4a1 1 0 0 1 0-2h6a1 1 0 0 1 0 2H8z\" fill-rule=\"nonzero\"/></svg>',\n        'zoom-out': '<svg width=\"24\" height=\"24\"><path d=\"M16 17.3a8 8 0 1 1 1.4-1.4l4.3 4.4a1 1 0 0 1-1.4 1.4l-4.4-4.3zm-5-.3a6 6 0 1 0 0-12 6 6 0 0 0 0 12zm-3-5a1 1 0 0 1 0-2h6a1 1 0 0 1 0 2H8z\" fill-rule=\"nonzero\"/></svg>'\n      };\n    };\n\n    var isContentCssSkinName = function (url) {\n      return /^[a-z0-9\\-]+$/i.test(url);\n    };\n    var getContentCssUrls = function (editor) {\n      var contentCss = Settings.getContentCss(editor);\n      var skinUrl = editor.editorManager.baseURL + '/skins/content';\n      var suffix = editor.editorManager.suffix;\n      var contentCssFile = 'content' + suffix + '.css';\n      var inline = editor.inline === true;\n      return map(contentCss, function (url) {\n        if (isContentCssSkinName(url) && !inline) {\n          return skinUrl + '/' + url + '/' + contentCssFile;\n        } else {\n          return editor.documentBaseURI.toAbsolute(url);\n        }\n      });\n    };\n    var appendContentCssFromSettings = function (editor) {\n      editor.contentCSS = editor.contentCSS.concat(getContentCssUrls(editor));\n    };\n\n    function BookmarkManager(selection) {\n      return {\n        getBookmark: curry(Bookmarks.getBookmark, selection),\n        moveToBookmark: curry(Bookmarks.moveToBookmark, selection)\n      };\n    }\n    (function (BookmarkManager) {\n      BookmarkManager.isBookmarkNode = Bookmarks.isBookmarkNode;\n    }(BookmarkManager || (BookmarkManager = {})));\n    var BookmarkManager$1 = BookmarkManager;\n\n    var isXYWithinRange = function (clientX, clientY, range) {\n      if (range.collapsed) {\n        return false;\n      }\n      if (Env.browser.isIE() && range.startOffset === range.endOffset - 1 && range.startContainer === range.endContainer) {\n        var elm = range.startContainer.childNodes[range.startOffset];\n        if (NodeType.isElement(elm)) {\n          return exists(elm.getClientRects(), function (rect) {\n            return containsXY(rect, clientX, clientY);\n          });\n        }\n      }\n      return exists(range.getClientRects(), function (rect) {\n        return containsXY(rect, clientX, clientY);\n      });\n    };\n    var RangePoint = { isXYWithinRange: isXYWithinRange };\n\n    var VK = {\n      BACKSPACE: 8,\n      DELETE: 46,\n      DOWN: 40,\n      ENTER: 13,\n      LEFT: 37,\n      RIGHT: 39,\n      SPACEBAR: 32,\n      TAB: 9,\n      UP: 38,\n      END: 35,\n      HOME: 36,\n      modifierPressed: function (e) {\n        return e.shiftKey || e.ctrlKey || e.altKey || this.metaKeyPressed(e);\n      },\n      metaKeyPressed: function (e) {\n        return Env.mac ? e.metaKey : e.ctrlKey && !e.altKey;\n      }\n    };\n\n    var isContentEditableFalse$6 = NodeType.isContentEditableFalse;\n    var isContentEditableTrue$2 = NodeType.isContentEditableTrue;\n    var getContentEditableRoot = function (root, node) {\n      while (node && node !== root) {\n        if (isContentEditableTrue$2(node) || isContentEditableFalse$6(node)) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    };\n    var ControlSelection = function (selection, editor) {\n      var dom = editor.dom, each = Tools.each;\n      var selectedElm, selectedElmGhost, resizeHelper, resizeHandles, selectedHandle;\n      var startX, startY, selectedElmX, selectedElmY, startW, startH, ratio, resizeStarted;\n      var width, height;\n      var editableDoc = editor.getDoc(), rootDocument = domGlobals.document;\n      var abs = Math.abs, round = Math.round, rootElement = editor.getBody();\n      var startScrollWidth, startScrollHeight;\n      resizeHandles = {\n        nw: [\n          0,\n          0,\n          -1,\n          -1\n        ],\n        ne: [\n          1,\n          0,\n          1,\n          -1\n        ],\n        se: [\n          1,\n          1,\n          1,\n          1\n        ],\n        sw: [\n          0,\n          1,\n          -1,\n          1\n        ]\n      };\n      var isImage = function (elm) {\n        return elm && (elm.nodeName === 'IMG' || editor.dom.is(elm, 'figure.image'));\n      };\n      var isEventOnImageOutsideRange = function (evt, range) {\n        if (evt.type === 'longpress' || evt.type.indexOf('touch') === 0) {\n          var touch = evt.touches[0];\n          return isImage(evt.target) && !RangePoint.isXYWithinRange(touch.clientX, touch.clientY, range);\n        } else {\n          return isImage(evt.target) && !RangePoint.isXYWithinRange(evt.clientX, evt.clientY, range);\n        }\n      };\n      var contextMenuSelectImage = function (evt) {\n        var target = evt.target;\n        if (isEventOnImageOutsideRange(evt, editor.selection.getRng()) && !evt.isDefaultPrevented()) {\n          editor.selection.select(target);\n        }\n      };\n      var getResizeTarget = function (elm) {\n        return editor.dom.is(elm, 'figure.image') ? elm.querySelector('img') : elm;\n      };\n      var isResizable = function (elm) {\n        var selector = Settings.getObjectResizing(editor);\n        if (selector === false || Env.iOS) {\n          return false;\n        }\n        if (typeof selector !== 'string') {\n          selector = 'table,img,figure.image,div';\n        }\n        if (elm.getAttribute('data-mce-resize') === 'false') {\n          return false;\n        }\n        if (elm === editor.getBody()) {\n          return false;\n        }\n        return is(Element.fromDom(elm), selector);\n      };\n      var resizeGhostElement = function (e) {\n        var deltaX, deltaY, proportional;\n        var resizeHelperX, resizeHelperY;\n        deltaX = e.screenX - startX;\n        deltaY = e.screenY - startY;\n        width = deltaX * selectedHandle[2] + startW;\n        height = deltaY * selectedHandle[3] + startH;\n        width = width < 5 ? 5 : width;\n        height = height < 5 ? 5 : height;\n        if (isImage(selectedElm) && Settings.getResizeImgProportional(editor) !== false) {\n          proportional = !VK.modifierPressed(e);\n        } else {\n          proportional = VK.modifierPressed(e);\n        }\n        if (proportional) {\n          if (abs(deltaX) > abs(deltaY)) {\n            height = round(width * ratio);\n            width = round(height / ratio);\n          } else {\n            width = round(height / ratio);\n            height = round(width * ratio);\n          }\n        }\n        dom.setStyles(getResizeTarget(selectedElmGhost), {\n          width: width,\n          height: height\n        });\n        resizeHelperX = selectedHandle.startPos.x + deltaX;\n        resizeHelperY = selectedHandle.startPos.y + deltaY;\n        resizeHelperX = resizeHelperX > 0 ? resizeHelperX : 0;\n        resizeHelperY = resizeHelperY > 0 ? resizeHelperY : 0;\n        dom.setStyles(resizeHelper, {\n          left: resizeHelperX,\n          top: resizeHelperY,\n          display: 'block'\n        });\n        resizeHelper.innerHTML = width + ' &times; ' + height;\n        if (selectedHandle[2] < 0 && selectedElmGhost.clientWidth <= width) {\n          dom.setStyle(selectedElmGhost, 'left', selectedElmX + (startW - width));\n        }\n        if (selectedHandle[3] < 0 && selectedElmGhost.clientHeight <= height) {\n          dom.setStyle(selectedElmGhost, 'top', selectedElmY + (startH - height));\n        }\n        deltaX = rootElement.scrollWidth - startScrollWidth;\n        deltaY = rootElement.scrollHeight - startScrollHeight;\n        if (deltaX + deltaY !== 0) {\n          dom.setStyles(resizeHelper, {\n            left: resizeHelperX - deltaX,\n            top: resizeHelperY - deltaY\n          });\n        }\n        if (!resizeStarted) {\n          fireObjectResizeStart(editor, selectedElm, startW, startH);\n          resizeStarted = true;\n        }\n      };\n      var endGhostResize = function () {\n        resizeStarted = false;\n        var setSizeProp = function (name, value) {\n          if (value) {\n            if (selectedElm.style[name] || !editor.schema.isValid(selectedElm.nodeName.toLowerCase(), name)) {\n              dom.setStyle(getResizeTarget(selectedElm), name, value);\n            } else {\n              dom.setAttrib(getResizeTarget(selectedElm), name, value);\n            }\n          }\n        };\n        setSizeProp('width', width);\n        setSizeProp('height', height);\n        dom.unbind(editableDoc, 'mousemove', resizeGhostElement);\n        dom.unbind(editableDoc, 'mouseup', endGhostResize);\n        if (rootDocument !== editableDoc) {\n          dom.unbind(rootDocument, 'mousemove', resizeGhostElement);\n          dom.unbind(rootDocument, 'mouseup', endGhostResize);\n        }\n        dom.remove(selectedElmGhost);\n        dom.remove(resizeHelper);\n        showResizeRect(selectedElm);\n        fireObjectResized(editor, selectedElm, width, height);\n        dom.setAttrib(selectedElm, 'style', dom.getAttrib(selectedElm, 'style'));\n        editor.nodeChanged();\n      };\n      var showResizeRect = function (targetElm) {\n        var position, targetWidth, targetHeight, e, rect;\n        hideResizeRect();\n        unbindResizeHandleEvents();\n        position = dom.getPos(targetElm, rootElement);\n        selectedElmX = position.x;\n        selectedElmY = position.y;\n        rect = targetElm.getBoundingClientRect();\n        targetWidth = rect.width || rect.right - rect.left;\n        targetHeight = rect.height || rect.bottom - rect.top;\n        if (selectedElm !== targetElm) {\n          selectedElm = targetElm;\n          width = height = 0;\n        }\n        e = editor.fire('ObjectSelected', { target: targetElm });\n        if (isResizable(targetElm) && !e.isDefaultPrevented()) {\n          each(resizeHandles, function (handle, name) {\n            var handleElm;\n            var startDrag = function (e) {\n              startX = e.screenX;\n              startY = e.screenY;\n              startW = getResizeTarget(selectedElm).clientWidth;\n              startH = getResizeTarget(selectedElm).clientHeight;\n              ratio = startH / startW;\n              selectedHandle = handle;\n              handle.startPos = {\n                x: targetWidth * handle[0] + selectedElmX,\n                y: targetHeight * handle[1] + selectedElmY\n              };\n              startScrollWidth = rootElement.scrollWidth;\n              startScrollHeight = rootElement.scrollHeight;\n              selectedElmGhost = selectedElm.cloneNode(true);\n              dom.addClass(selectedElmGhost, 'mce-clonedresizable');\n              dom.setAttrib(selectedElmGhost, 'data-mce-bogus', 'all');\n              selectedElmGhost.contentEditable = false;\n              selectedElmGhost.unSelectabe = true;\n              dom.setStyles(selectedElmGhost, {\n                left: selectedElmX,\n                top: selectedElmY,\n                margin: 0\n              });\n              selectedElmGhost.removeAttribute('data-mce-selected');\n              rootElement.appendChild(selectedElmGhost);\n              dom.bind(editableDoc, 'mousemove', resizeGhostElement);\n              dom.bind(editableDoc, 'mouseup', endGhostResize);\n              if (rootDocument !== editableDoc) {\n                dom.bind(rootDocument, 'mousemove', resizeGhostElement);\n                dom.bind(rootDocument, 'mouseup', endGhostResize);\n              }\n              resizeHelper = dom.add(rootElement, 'div', {\n                'class': 'mce-resize-helper',\n                'data-mce-bogus': 'all'\n              }, startW + ' &times; ' + startH);\n            };\n            handleElm = dom.get('mceResizeHandle' + name);\n            if (handleElm) {\n              dom.remove(handleElm);\n            }\n            handleElm = dom.add(rootElement, 'div', {\n              'id': 'mceResizeHandle' + name,\n              'data-mce-bogus': 'all',\n              'class': 'mce-resizehandle',\n              'unselectable': true,\n              'style': 'cursor:' + name + '-resize; margin:0; padding:0'\n            });\n            if (Env.ie === 11) {\n              handleElm.contentEditable = false;\n            }\n            dom.bind(handleElm, 'mousedown', function (e) {\n              e.stopImmediatePropagation();\n              e.preventDefault();\n              startDrag(e);\n            });\n            handle.elm = handleElm;\n            dom.setStyles(handleElm, {\n              left: targetWidth * handle[0] + selectedElmX - handleElm.offsetWidth / 2,\n              top: targetHeight * handle[1] + selectedElmY - handleElm.offsetHeight / 2\n            });\n          });\n        } else {\n          hideResizeRect();\n        }\n        selectedElm.setAttribute('data-mce-selected', '1');\n      };\n      var hideResizeRect = function () {\n        var name, handleElm;\n        unbindResizeHandleEvents();\n        if (selectedElm) {\n          selectedElm.removeAttribute('data-mce-selected');\n        }\n        for (name in resizeHandles) {\n          handleElm = dom.get('mceResizeHandle' + name);\n          if (handleElm) {\n            dom.unbind(handleElm);\n            dom.remove(handleElm);\n          }\n        }\n      };\n      var updateResizeRect = function (e) {\n        var startElm, controlElm;\n        var isChildOrEqual = function (node, parent) {\n          if (node) {\n            do {\n              if (node === parent) {\n                return true;\n              }\n            } while (node = node.parentNode);\n          }\n        };\n        if (resizeStarted || editor.removed) {\n          return;\n        }\n        each(dom.select('img[data-mce-selected],hr[data-mce-selected]'), function (img) {\n          img.removeAttribute('data-mce-selected');\n        });\n        controlElm = e.type === 'mousedown' ? e.target : selection.getNode();\n        controlElm = dom.$(controlElm).closest('table,img,figure.image,hr')[0];\n        if (isChildOrEqual(controlElm, rootElement)) {\n          disableGeckoResize();\n          startElm = selection.getStart(true);\n          if (isChildOrEqual(startElm, controlElm) && isChildOrEqual(selection.getEnd(true), controlElm)) {\n            showResizeRect(controlElm);\n            return;\n          }\n        }\n        hideResizeRect();\n      };\n      var isWithinContentEditableFalse = function (elm) {\n        return isContentEditableFalse$6(getContentEditableRoot(editor.getBody(), elm));\n      };\n      var unbindResizeHandleEvents = function () {\n        for (var name_1 in resizeHandles) {\n          var handle = resizeHandles[name_1];\n          if (handle.elm) {\n            dom.unbind(handle.elm);\n            delete handle.elm;\n          }\n        }\n      };\n      var disableGeckoResize = function () {\n        try {\n          editor.getDoc().execCommand('enableObjectResizing', false, false);\n        } catch (ex) {\n        }\n      };\n      editor.on('init', function () {\n        disableGeckoResize();\n        if (Env.browser.isIE() || Env.browser.isEdge()) {\n          editor.on('mousedown click', function (e) {\n            var target = e.target, nodeName = target.nodeName;\n            if (!resizeStarted && /^(TABLE|IMG|HR)$/.test(nodeName) && !isWithinContentEditableFalse(target)) {\n              if (e.button !== 2) {\n                editor.selection.select(target, nodeName === 'TABLE');\n              }\n              if (e.type === 'mousedown') {\n                editor.nodeChanged();\n              }\n            }\n          });\n          var handleMSControlSelect_1 = function (e) {\n            var delayedSelect = function (node) {\n              Delay.setEditorTimeout(editor, function () {\n                return editor.selection.select(node);\n              });\n            };\n            if (isWithinContentEditableFalse(e.target)) {\n              e.preventDefault();\n              delayedSelect(e.target);\n              return;\n            }\n            if (/^(TABLE|IMG|HR)$/.test(e.target.nodeName)) {\n              e.preventDefault();\n              if (e.target.tagName === 'IMG') {\n                delayedSelect(e.target);\n              }\n            }\n          };\n          dom.bind(rootElement, 'mscontrolselect', handleMSControlSelect_1);\n          editor.on('remove', function () {\n            return dom.unbind(rootElement, 'mscontrolselect', handleMSControlSelect_1);\n          });\n        }\n        var throttledUpdateResizeRect = Delay.throttle(function (e) {\n          if (!editor.composing) {\n            updateResizeRect(e);\n          }\n        });\n        editor.on('nodechange ResizeEditor ResizeWindow drop FullscreenStateChanged', throttledUpdateResizeRect);\n        editor.on('keyup compositionend', function (e) {\n          if (selectedElm && selectedElm.nodeName === 'TABLE') {\n            throttledUpdateResizeRect(e);\n          }\n        });\n        editor.on('hide blur', hideResizeRect);\n        editor.on('contextmenu longpress', contextMenuSelectImage, true);\n      });\n      editor.on('remove', unbindResizeHandleEvents);\n      var destroy = function () {\n        selectedElm = selectedElmGhost = null;\n      };\n      return {\n        isResizable: isResizable,\n        showResizeRect: showResizeRect,\n        hideResizeRect: hideResizeRect,\n        updateResizeRect: updateResizeRect,\n        destroy: destroy\n      };\n    };\n\n    function Dimension (name, getOffset) {\n      var set = function (element, h) {\n        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {\n          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);\n        }\n        var dom = element.dom();\n        if (isSupported(dom)) {\n          dom.style[name] = h + 'px';\n        }\n      };\n      var get = function (element) {\n        var r = getOffset(element);\n        if (r <= 0 || r === null) {\n          var css = get$4(element, name);\n          return parseFloat(css) || 0;\n        }\n        return r;\n      };\n      var getOuter = get;\n      var aggregate = function (element, properties) {\n        return foldl(properties, function (acc, property) {\n          var val = get$4(element, property);\n          var value = val === undefined ? 0 : parseInt(val, 10);\n          return isNaN(value) ? acc : acc + value;\n        }, 0);\n      };\n      var max = function (element, value, properties) {\n        var cumulativeInclusions = aggregate(element, properties);\n        var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;\n        return absoluteMax;\n      };\n      return {\n        set: set,\n        get: get,\n        getOuter: getOuter,\n        aggregate: aggregate,\n        max: max\n      };\n    }\n\n    var api$1 = Dimension('height', function (element) {\n      var dom = element.dom();\n      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;\n    });\n    var get$8 = function (element) {\n      return api$1.get(element);\n    };\n\n    var walkUp = function (navigation, doc) {\n      var frame = navigation.view(doc);\n      return frame.fold(constant([]), function (f) {\n        var parent = navigation.owner(f);\n        var rest = walkUp(navigation, parent);\n        return [f].concat(rest);\n      });\n    };\n    var pathTo = function (element, navigation) {\n      var d = navigation.owner(element);\n      return walkUp(navigation, d);\n    };\n\n    var view = function (doc) {\n      var element = doc.dom() === domGlobals.document ? Option.none() : Option.from(doc.dom().defaultView.frameElement);\n      return element.map(Element.fromDom);\n    };\n    var owner$1 = function (element) {\n      return owner(element);\n    };\n\n    var Navigation = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        view: view,\n        owner: owner$1\n    });\n\n    var find$3 = function (element) {\n      var doc = Element.fromDom(domGlobals.document);\n      var scroll = get$1(doc);\n      var frames = pathTo(element, Navigation);\n      var offset = viewport(element);\n      var r = foldr(frames, function (b, a) {\n        var loc = viewport(a);\n        return {\n          left: b.left + loc.left(),\n          top: b.top + loc.top()\n        };\n      }, {\n        left: 0,\n        top: 0\n      });\n      return Position(r.left + offset.left() + scroll.left(), r.top + offset.top() + scroll.top());\n    };\n\n    var excludeFromDescend = function (element) {\n      return name(element) === 'textarea';\n    };\n    var fireScrollIntoViewEvent = function (editor, data) {\n      var scrollEvent = editor.fire('ScrollIntoView', data);\n      return scrollEvent.isDefaultPrevented();\n    };\n    var fireAfterScrollIntoViewEvent = function (editor, data) {\n      editor.fire('AfterScrollIntoView', data);\n    };\n    var descend = function (element, offset) {\n      var children$1 = children(element);\n      if (children$1.length === 0 || excludeFromDescend(element)) {\n        return {\n          element: element,\n          offset: offset\n        };\n      } else if (offset < children$1.length && !excludeFromDescend(children$1[offset])) {\n        return {\n          element: children$1[offset],\n          offset: 0\n        };\n      } else {\n        var last = children$1[children$1.length - 1];\n        if (excludeFromDescend(last)) {\n          return {\n            element: element,\n            offset: offset\n          };\n        } else {\n          if (name(last) === 'img') {\n            return {\n              element: last,\n              offset: 1\n            };\n          } else if (isText(last)) {\n            return {\n              element: last,\n              offset: get$7(last).length\n            };\n          } else {\n            return {\n              element: last,\n              offset: children(last).length\n            };\n          }\n        }\n      }\n    };\n    var markerInfo = function (element, cleanupFun) {\n      var pos = absolute(element);\n      var height = get$8(element);\n      return {\n        element: element,\n        bottom: pos.top() + height,\n        height: height,\n        pos: pos,\n        cleanup: cleanupFun\n      };\n    };\n    var createMarker = function (element, offset) {\n      var startPoint = descend(element, offset);\n      var span = Element.fromHtml('<span data-mce-bogus=\"all\">' + Zwsp.ZWSP + '</span>');\n      before(startPoint.element, span);\n      return markerInfo(span, function () {\n        return remove(span);\n      });\n    };\n    var elementMarker = function (element) {\n      return markerInfo(Element.fromDom(element), noop);\n    };\n    var withMarker = function (editor, f, rng, alignToTop) {\n      preserveWith(editor, function (_s, _e) {\n        return applyWithMarker(editor, f, rng, alignToTop);\n      }, rng);\n    };\n    var withScrollEvents = function (editor, doc, f, marker, alignToTop) {\n      var data = {\n        elm: marker.element.dom(),\n        alignToTop: alignToTop\n      };\n      if (fireScrollIntoViewEvent(editor, data)) {\n        return;\n      }\n      var scrollTop = get$1(doc).top();\n      f(doc, scrollTop, marker, alignToTop);\n      fireAfterScrollIntoViewEvent(editor, data);\n    };\n    var applyWithMarker = function (editor, f, rng, alignToTop) {\n      var body = Element.fromDom(editor.getBody());\n      var doc = Element.fromDom(editor.getDoc());\n      reflow(body);\n      var marker = createMarker(Element.fromDom(rng.startContainer), rng.startOffset);\n      withScrollEvents(editor, doc, f, marker, alignToTop);\n      marker.cleanup();\n    };\n    var withElement = function (editor, element, f, alignToTop) {\n      var doc = Element.fromDom(editor.getDoc());\n      withScrollEvents(editor, doc, f, elementMarker(element), alignToTop);\n    };\n    var preserveWith = function (editor, f, rng) {\n      var startElement = rng.startContainer;\n      var startOffset = rng.startOffset;\n      var endElement = rng.endContainer;\n      var endOffset = rng.endOffset;\n      f(Element.fromDom(startElement), Element.fromDom(endElement));\n      var newRng = editor.dom.createRng();\n      newRng.setStart(startElement, startOffset);\n      newRng.setEnd(endElement, endOffset);\n      editor.selection.setRng(rng);\n    };\n    var scrollToMarker = function (marker, viewHeight, alignToTop, doc) {\n      var pos = marker.pos;\n      if (alignToTop) {\n        to(pos.left(), pos.top(), doc);\n      } else {\n        var y = pos.top() - viewHeight + marker.height;\n        to(pos.left(), y, doc);\n      }\n    };\n    var intoWindowIfNeeded = function (doc, scrollTop, viewHeight, marker, alignToTop) {\n      var viewportBottom = viewHeight + scrollTop;\n      var markerTop = marker.pos.top();\n      var markerBottom = marker.bottom;\n      var largerThanViewport = markerBottom - markerTop >= viewHeight;\n      if (markerTop < scrollTop) {\n        scrollToMarker(marker, viewHeight, alignToTop !== false, doc);\n      } else if (markerTop > viewportBottom) {\n        var align = largerThanViewport ? alignToTop !== false : alignToTop === true;\n        scrollToMarker(marker, viewHeight, align, doc);\n      } else if (markerBottom > viewportBottom && !largerThanViewport) {\n        scrollToMarker(marker, viewHeight, alignToTop === true, doc);\n      }\n    };\n    var intoWindow = function (doc, scrollTop, marker, alignToTop) {\n      var viewHeight = doc.dom().defaultView.innerHeight;\n      intoWindowIfNeeded(doc, scrollTop, viewHeight, marker, alignToTop);\n    };\n    var intoFrame = function (doc, scrollTop, marker, alignToTop) {\n      var frameViewHeight = doc.dom().defaultView.innerHeight;\n      intoWindowIfNeeded(doc, scrollTop, frameViewHeight, marker, alignToTop);\n      var op = find$3(marker.element);\n      var viewportBounds = getBounds(domGlobals.window);\n      if (op.top() < viewportBounds.y()) {\n        intoView(marker.element, alignToTop !== false);\n      } else if (op.top() > viewportBounds.bottom()) {\n        intoView(marker.element, alignToTop === true);\n      }\n    };\n    var rangeIntoWindow = function (editor, rng, alignToTop) {\n      return withMarker(editor, intoWindow, rng, alignToTop);\n    };\n    var elementIntoWindow = function (editor, element, alignToTop) {\n      return withElement(editor, element, intoWindow, alignToTop);\n    };\n    var rangeIntoFrame = function (editor, rng, alignToTop) {\n      return withMarker(editor, intoFrame, rng, alignToTop);\n    };\n    var elementIntoFrame = function (editor, element, alignToTop) {\n      return withElement(editor, element, intoFrame, alignToTop);\n    };\n    var elementIntoView = function (editor, element, alignToTop) {\n      var scroller = editor.inline ? elementIntoWindow : elementIntoFrame;\n      scroller(editor, element, alignToTop);\n    };\n    var rangeIntoView = function (editor, rng, alignToTop) {\n      var scroller = editor.inline ? rangeIntoWindow : rangeIntoFrame;\n      scroller(editor, rng, alignToTop);\n    };\n    var ScrollIntoView = {\n      scrollElementIntoView: elementIntoView,\n      scrollRangeIntoView: rangeIntoView\n    };\n\n    var hasCeProperty = function (node) {\n      return NodeType.isContentEditableTrue(node) || NodeType.isContentEditableFalse(node);\n    };\n    var findParent = function (node, rootNode, predicate) {\n      while (node && node !== rootNode) {\n        if (predicate(node)) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    };\n    var findClosestIeRange = function (clientX, clientY, doc) {\n      var element, rng, rects;\n      element = doc.elementFromPoint(clientX, clientY);\n      rng = doc.body.createTextRange();\n      if (!element || element.tagName === 'HTML') {\n        element = doc.body;\n      }\n      rng.moveToElementText(element);\n      rects = Tools.toArray(rng.getClientRects());\n      rects = rects.sort(function (a, b) {\n        a = Math.abs(Math.max(a.top - clientY, a.bottom - clientY));\n        b = Math.abs(Math.max(b.top - clientY, b.bottom - clientY));\n        return a - b;\n      });\n      if (rects.length > 0) {\n        clientY = (rects[0].bottom + rects[0].top) / 2;\n        try {\n          rng.moveToPoint(clientX, clientY);\n          rng.collapse(true);\n          return rng;\n        } catch (ex) {\n        }\n      }\n      return null;\n    };\n    var moveOutOfContentEditableFalse = function (rng, rootNode) {\n      var parentElement = rng && rng.parentElement ? rng.parentElement() : null;\n      return NodeType.isContentEditableFalse(findParent(parentElement, rootNode, hasCeProperty)) ? null : rng;\n    };\n    var fromPoint$1 = function (clientX, clientY, doc) {\n      var rng, point;\n      var pointDoc = doc;\n      if (pointDoc.caretPositionFromPoint) {\n        point = pointDoc.caretPositionFromPoint(clientX, clientY);\n        if (point) {\n          rng = doc.createRange();\n          rng.setStart(point.offsetNode, point.offset);\n          rng.collapse(true);\n        }\n      } else if (doc.caretRangeFromPoint) {\n        rng = doc.caretRangeFromPoint(clientX, clientY);\n      } else if (pointDoc.body.createTextRange) {\n        rng = pointDoc.body.createTextRange();\n        try {\n          rng.moveToPoint(clientX, clientY);\n          rng.collapse(true);\n        } catch (ex) {\n          rng = findClosestIeRange(clientX, clientY, doc);\n        }\n        return moveOutOfContentEditableFalse(rng, doc.body);\n      }\n      return rng;\n    };\n    var CaretRangeFromPoint = { fromPoint: fromPoint$1 };\n\n    var processRanges = function (editor, ranges) {\n      return map(ranges, function (range) {\n        var evt = editor.fire('GetSelectionRange', { range: range });\n        return evt.range !== range ? evt.range : range;\n      });\n    };\n    var EventProcessRanges = { processRanges: processRanges };\n\n    var fromElements = function (elements, scope) {\n      var doc = scope || domGlobals.document;\n      var fragment = doc.createDocumentFragment();\n      each(elements, function (element) {\n        fragment.appendChild(element.dom());\n      });\n      return Element.fromDom(fragment);\n    };\n\n    var dropLast = function (xs) {\n      return xs.slice(0, -1);\n    };\n    var parentsUntil$1 = function (start, root, predicate) {\n      if (contains$2(root, start)) {\n        return dropLast(parents(start, function (elm) {\n          return predicate(elm) || eq(elm, root);\n        }));\n      } else {\n        return [];\n      }\n    };\n    var parents$1 = function (start, root) {\n      return parentsUntil$1(start, root, constant(false));\n    };\n    var parentsAndSelf = function (start, root) {\n      return [start].concat(parents$1(start, root));\n    };\n    var Parents = {\n      parentsUntil: parentsUntil$1,\n      parents: parents$1,\n      parentsAndSelf: parentsAndSelf\n    };\n\n    var getStartNode = function (rng) {\n      var sc = rng.startContainer, so = rng.startOffset;\n      if (NodeType.isText(sc)) {\n        return so === 0 ? Option.some(Element.fromDom(sc)) : Option.none();\n      } else {\n        return Option.from(sc.childNodes[so]).map(Element.fromDom);\n      }\n    };\n    var getEndNode = function (rng) {\n      var ec = rng.endContainer, eo = rng.endOffset;\n      if (NodeType.isText(ec)) {\n        return eo === ec.data.length ? Option.some(Element.fromDom(ec)) : Option.none();\n      } else {\n        return Option.from(ec.childNodes[eo - 1]).map(Element.fromDom);\n      }\n    };\n    var getFirstChildren = function (node) {\n      return firstChild(node).fold(constant([node]), function (child) {\n        return [node].concat(getFirstChildren(child));\n      });\n    };\n    var getLastChildren = function (node) {\n      return lastChild(node).fold(constant([node]), function (child) {\n        if (name(child) === 'br') {\n          return prevSibling(child).map(function (sibling) {\n            return [node].concat(getLastChildren(sibling));\n          }).getOr([]);\n        } else {\n          return [node].concat(getLastChildren(child));\n        }\n      });\n    };\n    var hasAllContentsSelected = function (elm, rng) {\n      return lift2(getStartNode(rng), getEndNode(rng), function (startNode, endNode) {\n        var start = find(getFirstChildren(elm), curry(eq, startNode));\n        var end = find(getLastChildren(elm), curry(eq, endNode));\n        return start.isSome() && end.isSome();\n      }).getOr(false);\n    };\n    var moveEndPoint$1 = function (dom, rng, node, start) {\n      var root = node, walker = new TreeWalker(node, root);\n      var nonEmptyElementsMap = dom.schema.getNonEmptyElements();\n      do {\n        if (node.nodeType === 3 && Tools.trim(node.nodeValue).length !== 0) {\n          if (start) {\n            rng.setStart(node, 0);\n          } else {\n            rng.setEnd(node, node.nodeValue.length);\n          }\n          return;\n        }\n        if (nonEmptyElementsMap[node.nodeName] && !/^(TD|TH)$/.test(node.nodeName)) {\n          if (start) {\n            rng.setStartBefore(node);\n          } else {\n            if (node.nodeName === 'BR') {\n              rng.setEndBefore(node);\n            } else {\n              rng.setEndAfter(node);\n            }\n          }\n          return;\n        }\n      } while (node = start ? walker.next() : walker.prev());\n      if (root.nodeName === 'BODY') {\n        if (start) {\n          rng.setStart(root, 0);\n        } else {\n          rng.setEnd(root, root.childNodes.length);\n        }\n      }\n    };\n    var hasAnyRanges = function (editor) {\n      var sel = editor.selection.getSel();\n      return sel && sel.rangeCount > 0;\n    };\n\n    var tableModel = Immutable('element', 'width', 'rows');\n    var tableRow = Immutable('element', 'cells');\n    var cellPosition = Immutable('x', 'y');\n    var getSpan = function (td, key) {\n      var value = parseInt(get$3(td, key), 10);\n      return isNaN(value) ? 1 : value;\n    };\n    var fillout = function (table, x, y, tr, td) {\n      var rowspan = getSpan(td, 'rowspan');\n      var colspan = getSpan(td, 'colspan');\n      var rows = table.rows();\n      for (var y2 = y; y2 < y + rowspan; y2++) {\n        if (!rows[y2]) {\n          rows[y2] = tableRow(deep(tr), []);\n        }\n        for (var x2 = x; x2 < x + colspan; x2++) {\n          var cells = rows[y2].cells();\n          cells[x2] = y2 === y && x2 === x ? td : shallow(td);\n        }\n      }\n    };\n    var cellExists = function (table, x, y) {\n      var rows = table.rows();\n      var cells = rows[y] ? rows[y].cells() : [];\n      return !!cells[x];\n    };\n    var skipCellsX = function (table, x, y) {\n      while (cellExists(table, x, y)) {\n        x++;\n      }\n      return x;\n    };\n    var getWidth = function (rows) {\n      return foldl(rows, function (acc, row) {\n        return row.cells().length > acc ? row.cells().length : acc;\n      }, 0);\n    };\n    var findElementPos = function (table, element) {\n      var rows = table.rows();\n      for (var y = 0; y < rows.length; y++) {\n        var cells = rows[y].cells();\n        for (var x = 0; x < cells.length; x++) {\n          if (eq(cells[x], element)) {\n            return Option.some(cellPosition(x, y));\n          }\n        }\n      }\n      return Option.none();\n    };\n    var extractRows = function (table, sx, sy, ex, ey) {\n      var newRows = [];\n      var rows = table.rows();\n      for (var y = sy; y <= ey; y++) {\n        var cells = rows[y].cells();\n        var slice = sx < ex ? cells.slice(sx, ex + 1) : cells.slice(ex, sx + 1);\n        newRows.push(tableRow(rows[y].element(), slice));\n      }\n      return newRows;\n    };\n    var subTable = function (table, startPos, endPos) {\n      var sx = startPos.x(), sy = startPos.y();\n      var ex = endPos.x(), ey = endPos.y();\n      var newRows = sy < ey ? extractRows(table, sx, sy, ex, ey) : extractRows(table, sx, ey, ex, sy);\n      return tableModel(table.element(), getWidth(newRows), newRows);\n    };\n    var createDomTable = function (table, rows) {\n      var tableElement = shallow(table.element());\n      var tableBody = Element.fromTag('tbody');\n      append$1(tableBody, rows);\n      append(tableElement, tableBody);\n      return tableElement;\n    };\n    var modelRowsToDomRows = function (table) {\n      return map(table.rows(), function (row) {\n        var cells = map(row.cells(), function (cell) {\n          var td = deep(cell);\n          remove$1(td, 'colspan');\n          remove$1(td, 'rowspan');\n          return td;\n        });\n        var tr = shallow(row.element());\n        append$1(tr, cells);\n        return tr;\n      });\n    };\n    var fromDom$1 = function (tableElm) {\n      var table = tableModel(shallow(tableElm), 0, []);\n      each(descendants$1(tableElm, 'tr'), function (tr, y) {\n        each(descendants$1(tr, 'td,th'), function (td, x) {\n          fillout(table, skipCellsX(table, x, y), y, tr, td);\n        });\n      });\n      return tableModel(table.element(), getWidth(table.rows()), table.rows());\n    };\n    var toDom = function (table) {\n      return createDomTable(table, modelRowsToDomRows(table));\n    };\n    var subsection = function (table, startElement, endElement) {\n      return findElementPos(table, startElement).bind(function (startPos) {\n        return findElementPos(table, endElement).map(function (endPos) {\n          return subTable(table, startPos, endPos);\n        });\n      });\n    };\n    var SimpleTableModel = {\n      fromDom: fromDom$1,\n      toDom: toDom,\n      subsection: subsection\n    };\n\n    var getRanges = function (selection) {\n      var ranges = [];\n      if (selection) {\n        for (var i = 0; i < selection.rangeCount; i++) {\n          ranges.push(selection.getRangeAt(i));\n        }\n      }\n      return ranges;\n    };\n    var getSelectedNodes = function (ranges) {\n      return bind(ranges, function (range) {\n        var node = getSelectedNode(range);\n        return node ? [Element.fromDom(node)] : [];\n      });\n    };\n    var hasMultipleRanges = function (selection) {\n      return getRanges(selection).length > 1;\n    };\n    var MultiRange = {\n      getRanges: getRanges,\n      getSelectedNodes: getSelectedNodes,\n      hasMultipleRanges: hasMultipleRanges\n    };\n\n    var getCellsFromRanges = function (ranges) {\n      return filter(MultiRange.getSelectedNodes(ranges), isTableCell);\n    };\n    var getCellsFromElement = function (elm) {\n      return descendants$1(elm, 'td[data-mce-selected],th[data-mce-selected]');\n    };\n    var getCellsFromElementOrRanges = function (ranges, element) {\n      var selectedCells = getCellsFromElement(element);\n      var rangeCells = getCellsFromRanges(ranges);\n      return selectedCells.length > 0 ? selectedCells : rangeCells;\n    };\n    var getCellsFromEditor = function (editor) {\n      return getCellsFromElementOrRanges(MultiRange.getRanges(editor.selection.getSel()), Element.fromDom(editor.getBody()));\n    };\n    var TableCellSelection = {\n      getCellsFromRanges: getCellsFromRanges,\n      getCellsFromElement: getCellsFromElement,\n      getCellsFromElementOrRanges: getCellsFromElementOrRanges,\n      getCellsFromEditor: getCellsFromEditor\n    };\n\n    var findParentListContainer = function (parents) {\n      return find(parents, function (elm) {\n        return name(elm) === 'ul' || name(elm) === 'ol';\n      });\n    };\n    var getFullySelectedListWrappers = function (parents, rng) {\n      return find(parents, function (elm) {\n        return name(elm) === 'li' && hasAllContentsSelected(elm, rng);\n      }).fold(constant([]), function (li) {\n        return findParentListContainer(parents).map(function (listCont) {\n          return [\n            Element.fromTag('li'),\n            Element.fromTag(name(listCont))\n          ];\n        }).getOr([]);\n      });\n    };\n    var wrap$2 = function (innerElm, elms) {\n      var wrapped = foldl(elms, function (acc, elm) {\n        append(elm, acc);\n        return elm;\n      }, innerElm);\n      return elms.length > 0 ? fromElements([wrapped]) : wrapped;\n    };\n    var directListWrappers = function (commonAnchorContainer) {\n      if (isListItem(commonAnchorContainer)) {\n        return parent(commonAnchorContainer).filter(isList).fold(constant([]), function (listElm) {\n          return [\n            commonAnchorContainer,\n            listElm\n          ];\n        });\n      } else {\n        return isList(commonAnchorContainer) ? [commonAnchorContainer] : [];\n      }\n    };\n    var getWrapElements = function (rootNode, rng) {\n      var commonAnchorContainer = Element.fromDom(rng.commonAncestorContainer);\n      var parents = Parents.parentsAndSelf(commonAnchorContainer, rootNode);\n      var wrapElements = filter(parents, function (elm) {\n        return isInline(elm) || isHeading(elm);\n      });\n      var listWrappers = getFullySelectedListWrappers(parents, rng);\n      var allWrappers = wrapElements.concat(listWrappers.length ? listWrappers : directListWrappers(commonAnchorContainer));\n      return map(allWrappers, shallow);\n    };\n    var emptyFragment = function () {\n      return fromElements([]);\n    };\n    var getFragmentFromRange = function (rootNode, rng) {\n      return wrap$2(Element.fromDom(rng.cloneContents()), getWrapElements(rootNode, rng));\n    };\n    var getParentTable = function (rootElm, cell) {\n      return ancestor$1(cell, 'table', curry(eq, rootElm));\n    };\n    var getTableFragment = function (rootNode, selectedTableCells) {\n      return getParentTable(rootNode, selectedTableCells[0]).bind(function (tableElm) {\n        var firstCell = selectedTableCells[0];\n        var lastCell = selectedTableCells[selectedTableCells.length - 1];\n        var fullTableModel = SimpleTableModel.fromDom(tableElm);\n        return SimpleTableModel.subsection(fullTableModel, firstCell, lastCell).map(function (sectionedTableModel) {\n          return fromElements([SimpleTableModel.toDom(sectionedTableModel)]);\n        });\n      }).getOrThunk(emptyFragment);\n    };\n    var getSelectionFragment = function (rootNode, ranges) {\n      return ranges.length > 0 && ranges[0].collapsed ? emptyFragment() : getFragmentFromRange(rootNode, ranges[0]);\n    };\n    var read$1 = function (rootNode, ranges) {\n      var selectedCells = TableCellSelection.getCellsFromElementOrRanges(ranges, rootNode);\n      return selectedCells.length > 0 ? getTableFragment(rootNode, selectedCells) : getSelectionFragment(rootNode, ranges);\n    };\n    var FragmentReader = { read: read$1 };\n\n    var getTextContent = function (editor) {\n      return Option.from(editor.selection.getRng()).map(function (rng) {\n        var bin = editor.dom.add(editor.getBody(), 'div', {\n          'data-mce-bogus': 'all',\n          'style': 'overflow: hidden; opacity: 0;'\n        }, rng.cloneContents());\n        var text = Zwsp.trim(bin.innerText);\n        editor.dom.remove(bin);\n        return text;\n      }).getOr('');\n    };\n    var getHtmlContent = function (editor, args) {\n      var rng = editor.selection.getRng(), tmpElm = editor.dom.create('body');\n      var sel = editor.selection.getSel();\n      var fragment;\n      var ranges = EventProcessRanges.processRanges(editor, MultiRange.getRanges(sel));\n      fragment = args.contextual ? FragmentReader.read(Element.fromDom(editor.getBody()), ranges).dom() : rng.cloneContents();\n      if (fragment) {\n        tmpElm.appendChild(fragment);\n      }\n      return editor.selection.serializer.serialize(tmpElm, args);\n    };\n    var getContent$1 = function (editor, args) {\n      if (args === void 0) {\n        args = {};\n      }\n      args.get = true;\n      args.format = args.format || 'html';\n      args.selection = true;\n      args = editor.fire('BeforeGetContent', args);\n      if (args.isDefaultPrevented()) {\n        editor.fire('GetContent', args);\n        return args.content;\n      }\n      if (args.format === 'text') {\n        return getTextContent(editor);\n      } else {\n        args.getInner = true;\n        var content = getHtmlContent(editor, args);\n        if (args.format === 'tree') {\n          return content;\n        } else {\n          args.content = editor.selection.isCollapsed() ? '' : content;\n          editor.fire('GetContent', args);\n          return args.content;\n        }\n      }\n    };\n    var GetSelectionContent = { getContent: getContent$1 };\n\n    var isEq$1 = function (rng1, rng2) {\n      return rng1 && rng2 && (rng1.startContainer === rng2.startContainer && rng1.startOffset === rng2.startOffset) && (rng1.endContainer === rng2.endContainer && rng1.endOffset === rng2.endOffset);\n    };\n    var RangeCompare = { isEq: isEq$1 };\n\n    var findParent$1 = function (node, rootNode, predicate) {\n      while (node && node !== rootNode) {\n        if (predicate(node)) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    };\n    var hasParent = function (node, rootNode, predicate) {\n      return findParent$1(node, rootNode, predicate) !== null;\n    };\n    var hasParentWithName = function (node, rootNode, name) {\n      return hasParent(node, rootNode, function (node) {\n        return node.nodeName === name;\n      });\n    };\n    var isTable$3 = function (node) {\n      return node && node.nodeName === 'TABLE';\n    };\n    var isTableCell$2 = function (node) {\n      return node && /^(TD|TH|CAPTION)$/.test(node.nodeName);\n    };\n    var isCeFalseCaretContainer = function (node, rootNode) {\n      return isCaretContainer(node) && hasParent(node, rootNode, isCaretNode) === false;\n    };\n    var hasBrBeforeAfter = function (dom, node, left) {\n      var walker = new TreeWalker(node, dom.getParent(node.parentNode, dom.isBlock) || dom.getRoot());\n      while (node = walker[left ? 'prev' : 'next']()) {\n        if (NodeType.isBr(node)) {\n          return true;\n        }\n      }\n    };\n    var isPrevNode = function (node, name) {\n      return node.previousSibling && node.previousSibling.nodeName === name;\n    };\n    var hasContentEditableFalseParent = function (body, node) {\n      while (node && node !== body) {\n        if (NodeType.isContentEditableFalse(node)) {\n          return true;\n        }\n        node = node.parentNode;\n      }\n      return false;\n    };\n    var findTextNodeRelative = function (dom, isAfterNode, collapsed, left, startNode) {\n      var lastInlineElement;\n      var body = dom.getRoot();\n      var node;\n      var nonEmptyElementsMap = dom.schema.getNonEmptyElements();\n      var parentBlockContainer = dom.getParent(startNode.parentNode, dom.isBlock) || body;\n      if (left && NodeType.isBr(startNode) && isAfterNode && dom.isEmpty(parentBlockContainer)) {\n        return Option.some(CaretPosition(startNode.parentNode, dom.nodeIndex(startNode)));\n      }\n      var walker = new TreeWalker(startNode, parentBlockContainer);\n      while (node = walker[left ? 'prev' : 'next']()) {\n        if (dom.getContentEditableParent(node) === 'false' || isCeFalseCaretContainer(node, body)) {\n          return Option.none();\n        }\n        if (NodeType.isText(node) && node.nodeValue.length > 0) {\n          if (hasParentWithName(node, body, 'A') === false) {\n            return Option.some(CaretPosition(node, left ? node.nodeValue.length : 0));\n          }\n          return Option.none();\n        }\n        if (dom.isBlock(node) || nonEmptyElementsMap[node.nodeName.toLowerCase()]) {\n          return Option.none();\n        }\n        lastInlineElement = node;\n      }\n      if (collapsed && lastInlineElement) {\n        return Option.some(CaretPosition(lastInlineElement, 0));\n      }\n      return Option.none();\n    };\n    var normalizeEndPoint = function (dom, collapsed, start, rng) {\n      var container, offset;\n      var body = dom.getRoot();\n      var node, nonEmptyElementsMap;\n      var directionLeft, isAfterNode, normalized = false;\n      container = rng[(start ? 'start' : 'end') + 'Container'];\n      offset = rng[(start ? 'start' : 'end') + 'Offset'];\n      isAfterNode = NodeType.isElement(container) && offset === container.childNodes.length;\n      nonEmptyElementsMap = dom.schema.getNonEmptyElements();\n      directionLeft = start;\n      if (isCaretContainer(container)) {\n        return Option.none();\n      }\n      if (NodeType.isElement(container) && offset > container.childNodes.length - 1) {\n        directionLeft = false;\n      }\n      if (NodeType.isDocument(container)) {\n        container = body;\n        offset = 0;\n      }\n      if (container === body) {\n        if (directionLeft) {\n          node = container.childNodes[offset > 0 ? offset - 1 : 0];\n          if (node) {\n            if (isCaretContainer(node)) {\n              return Option.none();\n            }\n            if (nonEmptyElementsMap[node.nodeName] || isTable$3(node)) {\n              return Option.none();\n            }\n          }\n        }\n        if (container.hasChildNodes()) {\n          offset = Math.min(!directionLeft && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1);\n          container = container.childNodes[offset];\n          offset = NodeType.isText(container) && isAfterNode ? container.data.length : 0;\n          if (!collapsed && container === body.lastChild && isTable$3(container)) {\n            return Option.none();\n          }\n          if (hasContentEditableFalseParent(body, container) || isCaretContainer(container)) {\n            return Option.none();\n          }\n          if (container.hasChildNodes() && isTable$3(container) === false) {\n            node = container;\n            var walker = new TreeWalker(container, body);\n            do {\n              if (NodeType.isContentEditableFalse(node) || isCaretContainer(node)) {\n                normalized = false;\n                break;\n              }\n              if (NodeType.isText(node) && node.nodeValue.length > 0) {\n                offset = directionLeft ? 0 : node.nodeValue.length;\n                container = node;\n                normalized = true;\n                break;\n              }\n              if (nonEmptyElementsMap[node.nodeName.toLowerCase()] && !isTableCell$2(node)) {\n                offset = dom.nodeIndex(node);\n                container = node.parentNode;\n                if (!directionLeft) {\n                  offset++;\n                }\n                normalized = true;\n                break;\n              }\n            } while (node = directionLeft ? walker.next() : walker.prev());\n          }\n        }\n      }\n      if (collapsed) {\n        if (NodeType.isText(container) && offset === 0) {\n          findTextNodeRelative(dom, isAfterNode, collapsed, true, container).each(function (pos) {\n            container = pos.container();\n            offset = pos.offset();\n            normalized = true;\n          });\n        }\n        if (NodeType.isElement(container)) {\n          node = container.childNodes[offset];\n          if (!node) {\n            node = container.childNodes[offset - 1];\n          }\n          if (node && NodeType.isBr(node) && !isPrevNode(node, 'A') && !hasBrBeforeAfter(dom, node, false) && !hasBrBeforeAfter(dom, node, true)) {\n            findTextNodeRelative(dom, isAfterNode, collapsed, true, node).each(function (pos) {\n              container = pos.container();\n              offset = pos.offset();\n              normalized = true;\n            });\n          }\n        }\n      }\n      if (directionLeft && !collapsed && NodeType.isText(container) && offset === container.nodeValue.length) {\n        findTextNodeRelative(dom, isAfterNode, collapsed, false, container).each(function (pos) {\n          container = pos.container();\n          offset = pos.offset();\n          normalized = true;\n        });\n      }\n      return normalized ? Option.some(CaretPosition(container, offset)) : Option.none();\n    };\n    var normalize = function (dom, rng) {\n      var collapsed = rng.collapsed, normRng = rng.cloneRange();\n      var startPos = CaretPosition.fromRangeStart(rng);\n      normalizeEndPoint(dom, collapsed, true, normRng).each(function (pos) {\n        if (!collapsed || !CaretPosition.isAbove(startPos, pos)) {\n          normRng.setStart(pos.container(), pos.offset());\n        }\n      });\n      if (!collapsed) {\n        normalizeEndPoint(dom, collapsed, false, normRng).each(function (pos) {\n          normRng.setEnd(pos.container(), pos.offset());\n        });\n      }\n      if (collapsed) {\n        normRng.collapse(true);\n      }\n      return RangeCompare.isEq(rng, normRng) ? Option.none() : Option.some(normRng);\n    };\n    var NormalizeRange = { normalize: normalize };\n\n    var prependData = function (target, data) {\n      target.insertData(0, data);\n    };\n    var removeEmpty = function (text) {\n      if (text.dom().length === 0) {\n        remove(text);\n        return Option.none();\n      }\n      return Option.some(text);\n    };\n    var rngSetContent = function (rng, fragment) {\n      var firstChild = Option.from(fragment.firstChild).map(Element.fromDom);\n      var lastChild = Option.from(fragment.lastChild).map(Element.fromDom);\n      rng.deleteContents();\n      rng.insertNode(fragment);\n      var prevText = firstChild.bind(prevSibling).filter(isText).bind(removeEmpty);\n      var nextText = lastChild.bind(nextSibling).filter(isText).bind(removeEmpty);\n      lift2(prevText, firstChild.filter(isText), function (prev, start) {\n        prependData(start.dom(), prev.dom().data);\n        remove(prev);\n      });\n      lift2(nextText, lastChild.filter(isText), function (next, end) {\n        var oldLength = end.dom().length;\n        end.dom().appendData(next.dom().data);\n        rng.setEnd(end.dom(), oldLength);\n        remove(next);\n      });\n      rng.collapse(false);\n    };\n    var setupArgs = function (args, content) {\n      args = args || { format: 'html' };\n      args.set = true;\n      args.selection = true;\n      args.content = content;\n      return args;\n    };\n    var setContent$1 = function (editor, content, args) {\n      args = setupArgs(args, content);\n      if (!args.no_events) {\n        args = editor.fire('BeforeSetContent', args);\n        if (args.isDefaultPrevented()) {\n          editor.fire('SetContent', args);\n          return;\n        }\n      }\n      var rng = editor.selection.getRng();\n      rngSetContent(rng, rng.createContextualFragment(args.content));\n      editor.selection.setRng(rng);\n      ScrollIntoView.scrollRangeIntoView(editor, rng);\n      if (!args.no_events) {\n        editor.fire('SetContent', args);\n      }\n    };\n    var SetSelectionContent = { setContent: setContent$1 };\n\n    var getEndpointElement = function (root, rng, start, real, resolve) {\n      var container = start ? rng.startContainer : rng.endContainer;\n      var offset = start ? rng.startOffset : rng.endOffset;\n      return Option.from(container).map(Element.fromDom).map(function (elm) {\n        return !real || !rng.collapsed ? child(elm, resolve(elm, offset)).getOr(elm) : elm;\n      }).bind(function (elm) {\n        return isElement(elm) ? Option.some(elm) : parent(elm);\n      }).map(function (elm) {\n        return elm.dom();\n      }).getOr(root);\n    };\n    var getStart$2 = function (root, rng, real) {\n      return getEndpointElement(root, rng, true, real, function (elm, offset) {\n        return Math.min(childNodesCount(elm), offset);\n      });\n    };\n    var getEnd = function (root, rng, real) {\n      return getEndpointElement(root, rng, false, real, function (elm, offset) {\n        return offset > 0 ? offset - 1 : offset;\n      });\n    };\n    var skipEmptyTextNodes = function (node, forwards) {\n      var orig = node;\n      while (node && NodeType.isText(node) && node.length === 0) {\n        node = forwards ? node.nextSibling : node.previousSibling;\n      }\n      return node || orig;\n    };\n    var getNode$1 = function (root, rng) {\n      var elm, startContainer, endContainer, startOffset, endOffset;\n      if (!rng) {\n        return root;\n      }\n      startContainer = rng.startContainer;\n      endContainer = rng.endContainer;\n      startOffset = rng.startOffset;\n      endOffset = rng.endOffset;\n      elm = rng.commonAncestorContainer;\n      if (!rng.collapsed) {\n        if (startContainer === endContainer) {\n          if (endOffset - startOffset < 2) {\n            if (startContainer.hasChildNodes()) {\n              elm = startContainer.childNodes[startOffset];\n            }\n          }\n        }\n        if (startContainer.nodeType === 3 && endContainer.nodeType === 3) {\n          if (startContainer.length === startOffset) {\n            startContainer = skipEmptyTextNodes(startContainer.nextSibling, true);\n          } else {\n            startContainer = startContainer.parentNode;\n          }\n          if (endOffset === 0) {\n            endContainer = skipEmptyTextNodes(endContainer.previousSibling, false);\n          } else {\n            endContainer = endContainer.parentNode;\n          }\n          if (startContainer && startContainer === endContainer) {\n            return startContainer;\n          }\n        }\n      }\n      if (elm && elm.nodeType === 3) {\n        return elm.parentNode;\n      }\n      return elm;\n    };\n    var getSelectedBlocks = function (dom, rng, startElm, endElm) {\n      var node, root;\n      var selectedBlocks = [];\n      root = dom.getRoot();\n      startElm = dom.getParent(startElm || getStart$2(root, rng, rng.collapsed), dom.isBlock);\n      endElm = dom.getParent(endElm || getEnd(root, rng, rng.collapsed), dom.isBlock);\n      if (startElm && startElm !== root) {\n        selectedBlocks.push(startElm);\n      }\n      if (startElm && endElm && startElm !== endElm) {\n        node = startElm;\n        var walker = new TreeWalker(startElm, root);\n        while ((node = walker.next()) && node !== endElm) {\n          if (dom.isBlock(node)) {\n            selectedBlocks.push(node);\n          }\n        }\n      }\n      if (endElm && startElm !== endElm && endElm !== root) {\n        selectedBlocks.push(endElm);\n      }\n      return selectedBlocks;\n    };\n    var select$1 = function (dom, node, content) {\n      return Option.from(node).map(function (node) {\n        var idx = dom.nodeIndex(node);\n        var rng = dom.createRng();\n        rng.setStart(node.parentNode, idx);\n        rng.setEnd(node.parentNode, idx + 1);\n        if (content) {\n          moveEndPoint$1(dom, rng, node, true);\n          moveEndPoint$1(dom, rng, node, false);\n        }\n        return rng;\n      });\n    };\n\n    var deleteFromCallbackMap = function (callbackMap, selector, callback) {\n      if (callbackMap && callbackMap.hasOwnProperty(selector)) {\n        var newCallbacks = filter(callbackMap[selector], function (cb) {\n          return cb !== callback;\n        });\n        if (newCallbacks.length === 0) {\n          delete callbackMap[selector];\n        } else {\n          callbackMap[selector] = newCallbacks;\n        }\n      }\n    };\n    function SelectorChanged (dom, editor) {\n      var selectorChangedData;\n      var currentSelectors;\n      return {\n        selectorChangedWithUnbind: function (selector, callback) {\n          if (!selectorChangedData) {\n            selectorChangedData = {};\n            currentSelectors = {};\n            editor.on('NodeChange', function (e) {\n              var node = e.element, parents = dom.getParents(node, null, dom.getRoot()), matchedSelectors = {};\n              Tools.each(selectorChangedData, function (callbacks, selector) {\n                Tools.each(parents, function (node) {\n                  if (dom.is(node, selector)) {\n                    if (!currentSelectors[selector]) {\n                      Tools.each(callbacks, function (callback) {\n                        callback(true, {\n                          node: node,\n                          selector: selector,\n                          parents: parents\n                        });\n                      });\n                      currentSelectors[selector] = callbacks;\n                    }\n                    matchedSelectors[selector] = callbacks;\n                    return false;\n                  }\n                });\n              });\n              Tools.each(currentSelectors, function (callbacks, selector) {\n                if (!matchedSelectors[selector]) {\n                  delete currentSelectors[selector];\n                  Tools.each(callbacks, function (callback) {\n                    callback(false, {\n                      node: node,\n                      selector: selector,\n                      parents: parents\n                    });\n                  });\n                }\n              });\n            });\n          }\n          if (!selectorChangedData[selector]) {\n            selectorChangedData[selector] = [];\n          }\n          selectorChangedData[selector].push(callback);\n          return {\n            unbind: function () {\n              deleteFromCallbackMap(selectorChangedData, selector, callback);\n              deleteFromCallbackMap(currentSelectors, selector, callback);\n            }\n          };\n        }\n      };\n    }\n\n    var isNativeIeSelection = function (rng) {\n      return !!rng.select;\n    };\n    var isAttachedToDom = function (node) {\n      return !!(node && node.ownerDocument) && contains$2(Element.fromDom(node.ownerDocument), Element.fromDom(node));\n    };\n    var isValidRange = function (rng) {\n      if (!rng) {\n        return false;\n      } else if (isNativeIeSelection(rng)) {\n        return true;\n      } else {\n        return isAttachedToDom(rng.startContainer) && isAttachedToDom(rng.endContainer);\n      }\n    };\n    var Selection$1 = function (dom, win, serializer, editor) {\n      var bookmarkManager;\n      var controlSelection;\n      var selectedRange;\n      var explicitRange;\n      var selectorChangedWithUnbind = SelectorChanged(dom, editor).selectorChangedWithUnbind;\n      var setCursorLocation = function (node, offset) {\n        var rng = dom.createRng();\n        if (!node) {\n          moveEndPoint$1(dom, rng, editor.getBody(), true);\n          setRng(rng);\n        } else {\n          rng.setStart(node, offset);\n          rng.setEnd(node, offset);\n          setRng(rng);\n          collapse(false);\n        }\n      };\n      var getContent = function (args) {\n        return GetSelectionContent.getContent(editor, args);\n      };\n      var setContent = function (content, args) {\n        return SetSelectionContent.setContent(editor, content, args);\n      };\n      var getStart = function (real) {\n        return getStart$2(editor.getBody(), getRng(), real);\n      };\n      var getEnd$1 = function (real) {\n        return getEnd(editor.getBody(), getRng(), real);\n      };\n      var getBookmark = function (type, normalized) {\n        return bookmarkManager.getBookmark(type, normalized);\n      };\n      var moveToBookmark = function (bookmark) {\n        return bookmarkManager.moveToBookmark(bookmark);\n      };\n      var select = function (node, content) {\n        select$1(dom, node, content).each(setRng);\n        return node;\n      };\n      var isCollapsed = function () {\n        var rng = getRng(), sel = getSel();\n        if (!rng || rng.item) {\n          return false;\n        }\n        if (rng.compareEndPoints) {\n          return rng.compareEndPoints('StartToEnd', rng) === 0;\n        }\n        return !sel || rng.collapsed;\n      };\n      var collapse = function (toStart) {\n        var rng = getRng();\n        rng.collapse(!!toStart);\n        setRng(rng);\n      };\n      var getSel = function () {\n        return win.getSelection ? win.getSelection() : win.document.selection;\n      };\n      var getRng = function () {\n        var selection, rng, elm, doc;\n        var tryCompareBoundaryPoints = function (how, sourceRange, destinationRange) {\n          try {\n            return sourceRange.compareBoundaryPoints(how, destinationRange);\n          } catch (ex) {\n            return -1;\n          }\n        };\n        if (!win) {\n          return null;\n        }\n        doc = win.document;\n        if (typeof doc === 'undefined' || doc === null) {\n          return null;\n        }\n        if (editor.bookmark !== undefined && EditorFocus.hasFocus(editor) === false) {\n          var bookmark = SelectionBookmark.getRng(editor);\n          if (bookmark.isSome()) {\n            return bookmark.map(function (r) {\n              return EventProcessRanges.processRanges(editor, [r])[0];\n            }).getOr(doc.createRange());\n          }\n        }\n        try {\n          if ((selection = getSel()) && !NodeType.isRestrictedNode(selection.anchorNode)) {\n            if (selection.rangeCount > 0) {\n              rng = selection.getRangeAt(0);\n            } else {\n              rng = selection.createRange ? selection.createRange() : doc.createRange();\n            }\n          }\n        } catch (ex) {\n        }\n        rng = EventProcessRanges.processRanges(editor, [rng])[0];\n        if (!rng) {\n          rng = doc.createRange ? doc.createRange() : doc.body.createTextRange();\n        }\n        if (rng.setStart && rng.startContainer.nodeType === 9 && rng.collapsed) {\n          elm = dom.getRoot();\n          rng.setStart(elm, 0);\n          rng.setEnd(elm, 0);\n        }\n        if (selectedRange && explicitRange) {\n          if (tryCompareBoundaryPoints(rng.START_TO_START, rng, selectedRange) === 0 && tryCompareBoundaryPoints(rng.END_TO_END, rng, selectedRange) === 0) {\n            rng = explicitRange;\n          } else {\n            selectedRange = null;\n            explicitRange = null;\n          }\n        }\n        return rng;\n      };\n      var setRng = function (rng, forward) {\n        var sel, node, evt;\n        if (!isValidRange(rng)) {\n          return;\n        }\n        var ieRange = isNativeIeSelection(rng) ? rng : null;\n        if (ieRange) {\n          explicitRange = null;\n          try {\n            ieRange.select();\n          } catch (ex) {\n          }\n          return;\n        }\n        sel = getSel();\n        evt = editor.fire('SetSelectionRange', {\n          range: rng,\n          forward: forward\n        });\n        rng = evt.range;\n        if (sel) {\n          explicitRange = rng;\n          try {\n            sel.removeAllRanges();\n            sel.addRange(rng);\n          } catch (ex) {\n          }\n          if (forward === false && sel.extend) {\n            sel.collapse(rng.endContainer, rng.endOffset);\n            sel.extend(rng.startContainer, rng.startOffset);\n          }\n          selectedRange = sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n        }\n        if (!rng.collapsed && rng.startContainer === rng.endContainer && sel.setBaseAndExtent && !Env.ie) {\n          if (rng.endOffset - rng.startOffset < 2) {\n            if (rng.startContainer.hasChildNodes()) {\n              node = rng.startContainer.childNodes[rng.startOffset];\n              if (node && node.tagName === 'IMG') {\n                sel.setBaseAndExtent(rng.startContainer, rng.startOffset, rng.endContainer, rng.endOffset);\n                if (sel.anchorNode !== rng.startContainer || sel.focusNode !== rng.endContainer) {\n                  sel.setBaseAndExtent(node, 0, node, 1);\n                }\n              }\n            }\n          }\n        }\n        editor.fire('AfterSetSelectionRange', {\n          range: rng,\n          forward: forward\n        });\n      };\n      var setNode = function (elm) {\n        setContent(dom.getOuterHTML(elm));\n        return elm;\n      };\n      var getNode = function () {\n        return getNode$1(editor.getBody(), getRng());\n      };\n      var getSelectedBlocks$1 = function (startElm, endElm) {\n        return getSelectedBlocks(dom, getRng(), startElm, endElm);\n      };\n      var isForward = function () {\n        var sel = getSel();\n        var anchorRange, focusRange;\n        if (!sel || !sel.anchorNode || !sel.focusNode) {\n          return true;\n        }\n        anchorRange = dom.createRng();\n        anchorRange.setStart(sel.anchorNode, sel.anchorOffset);\n        anchorRange.collapse(true);\n        focusRange = dom.createRng();\n        focusRange.setStart(sel.focusNode, sel.focusOffset);\n        focusRange.collapse(true);\n        return anchorRange.compareBoundaryPoints(anchorRange.START_TO_START, focusRange) <= 0;\n      };\n      var normalize = function () {\n        var rng = getRng();\n        var sel = getSel();\n        if (!MultiRange.hasMultipleRanges(sel) && hasAnyRanges(editor)) {\n          var normRng = NormalizeRange.normalize(dom, rng);\n          normRng.each(function (normRng) {\n            setRng(normRng, isForward());\n          });\n          return normRng.getOr(rng);\n        }\n        return rng;\n      };\n      var selectorChanged = function (selector, callback) {\n        selectorChangedWithUnbind(selector, callback);\n        return exports;\n      };\n      var getScrollContainer = function () {\n        var scrollContainer;\n        var node = dom.getRoot();\n        while (node && node.nodeName !== 'BODY') {\n          if (node.scrollHeight > node.clientHeight) {\n            scrollContainer = node;\n            break;\n          }\n          node = node.parentNode;\n        }\n        return scrollContainer;\n      };\n      var scrollIntoView = function (elm, alignToTop) {\n        return ScrollIntoView.scrollElementIntoView(editor, elm, alignToTop);\n      };\n      var placeCaretAt = function (clientX, clientY) {\n        return setRng(CaretRangeFromPoint.fromPoint(clientX, clientY, editor.getDoc()));\n      };\n      var getBoundingClientRect = function () {\n        var rng = getRng();\n        return rng.collapsed ? CaretPosition$1.fromRangeStart(rng).getClientRects()[0] : rng.getBoundingClientRect();\n      };\n      var destroy = function () {\n        win = selectedRange = explicitRange = null;\n        controlSelection.destroy();\n      };\n      var exports = {\n        bookmarkManager: null,\n        controlSelection: null,\n        dom: dom,\n        win: win,\n        serializer: serializer,\n        editor: editor,\n        collapse: collapse,\n        setCursorLocation: setCursorLocation,\n        getContent: getContent,\n        setContent: setContent,\n        getBookmark: getBookmark,\n        moveToBookmark: moveToBookmark,\n        select: select,\n        isCollapsed: isCollapsed,\n        isForward: isForward,\n        setNode: setNode,\n        getNode: getNode,\n        getSel: getSel,\n        setRng: setRng,\n        getRng: getRng,\n        getStart: getStart,\n        getEnd: getEnd$1,\n        getSelectedBlocks: getSelectedBlocks$1,\n        normalize: normalize,\n        selectorChanged: selectorChanged,\n        selectorChangedWithUnbind: selectorChangedWithUnbind,\n        getScrollContainer: getScrollContainer,\n        scrollIntoView: scrollIntoView,\n        placeCaretAt: placeCaretAt,\n        getBoundingClientRect: getBoundingClientRect,\n        destroy: destroy\n      };\n      bookmarkManager = BookmarkManager$1(exports);\n      controlSelection = ControlSelection(exports, editor);\n      exports.bookmarkManager = bookmarkManager;\n      exports.controlSelection = controlSelection;\n      return exports;\n    };\n\n    var removeAttrs = function (node, names) {\n      each(names, function (name) {\n        node.attr(name, null);\n      });\n    };\n    var addFontToSpansFilter = function (domParser, styles, fontSizes) {\n      domParser.addNodeFilter('font', function (nodes) {\n        each(nodes, function (node) {\n          var props = styles.parse(node.attr('style'));\n          var color = node.attr('color');\n          var face = node.attr('face');\n          var size = node.attr('size');\n          if (color) {\n            props.color = color;\n          }\n          if (face) {\n            props['font-family'] = face;\n          }\n          if (size) {\n            props['font-size'] = fontSizes[parseInt(node.attr('size'), 10) - 1];\n          }\n          node.name = 'span';\n          node.attr('style', styles.serialize(props));\n          removeAttrs(node, [\n            'color',\n            'face',\n            'size'\n          ]);\n        });\n      });\n    };\n    var addStrikeToSpanFilter = function (domParser, styles) {\n      domParser.addNodeFilter('strike', function (nodes) {\n        each(nodes, function (node) {\n          var props = styles.parse(node.attr('style'));\n          props['text-decoration'] = 'line-through';\n          node.name = 'span';\n          node.attr('style', styles.serialize(props));\n        });\n      });\n    };\n    var addFilters = function (domParser, settings) {\n      var styles = Styles();\n      if (settings.convert_fonts_to_spans) {\n        addFontToSpansFilter(domParser, styles, Tools.explode(settings.font_size_legacy_values));\n      }\n      addStrikeToSpanFilter(domParser, styles);\n    };\n    var register$1 = function (domParser, settings) {\n      if (settings.inline_styles) {\n        addFilters(domParser, settings);\n      }\n    };\n    var LegacyFilter = { register: register$1 };\n\n    var paddEmptyNode = function (settings, args, blockElements, node) {\n      var brPreferred = settings.padd_empty_with_br || args.insert;\n      if (brPreferred && blockElements[node.name]) {\n        node.empty().append(new Node$1('br', 1)).shortEnded = true;\n      } else {\n        node.empty().append(new Node$1('#text', 3)).value = nbsp;\n      }\n    };\n    var isPaddedWithNbsp = function (node) {\n      return hasOnlyChild(node, '#text') && node.firstChild.value === nbsp;\n    };\n    var hasOnlyChild = function (node, name) {\n      return node && node.firstChild && node.firstChild === node.lastChild && node.firstChild.name === name;\n    };\n    var isPadded = function (schema, node) {\n      var rule = schema.getElementRule(node.name);\n      return rule && rule.paddEmpty;\n    };\n    var isEmpty$1 = function (schema, nonEmptyElements, whitespaceElements, node) {\n      return node.isEmpty(nonEmptyElements, whitespaceElements, function (node) {\n        return isPadded(schema, node);\n      });\n    };\n    var isLineBreakNode = function (node, blockElements) {\n      return node && (blockElements[node.name] || node.name === 'br');\n    };\n\n    var register$2 = function (parser, settings) {\n      var schema = parser.schema;\n      if (settings.remove_trailing_brs) {\n        parser.addNodeFilter('br', function (nodes, _, args) {\n          var i;\n          var l = nodes.length;\n          var node;\n          var blockElements = Tools.extend({}, schema.getBlockElements());\n          var nonEmptyElements = schema.getNonEmptyElements();\n          var parent, lastParent, prev, prevName;\n          var whiteSpaceElements = schema.getNonEmptyElements();\n          var elementRule, textNode;\n          blockElements.body = 1;\n          for (i = 0; i < l; i++) {\n            node = nodes[i];\n            parent = node.parent;\n            if (blockElements[node.parent.name] && node === parent.lastChild) {\n              prev = node.prev;\n              while (prev) {\n                prevName = prev.name;\n                if (prevName !== 'span' || prev.attr('data-mce-type') !== 'bookmark') {\n                  if (prevName !== 'br') {\n                    break;\n                  }\n                  if (prevName === 'br') {\n                    node = null;\n                    break;\n                  }\n                }\n                prev = prev.prev;\n              }\n              if (node) {\n                node.remove();\n                if (isEmpty$1(schema, nonEmptyElements, whiteSpaceElements, parent)) {\n                  elementRule = schema.getElementRule(parent.name);\n                  if (elementRule) {\n                    if (elementRule.removeEmpty) {\n                      parent.remove();\n                    } else if (elementRule.paddEmpty) {\n                      paddEmptyNode(settings, args, blockElements, parent);\n                    }\n                  }\n                }\n              }\n            } else {\n              lastParent = node;\n              while (parent && parent.firstChild === lastParent && parent.lastChild === lastParent) {\n                lastParent = parent;\n                if (blockElements[parent.name]) {\n                  break;\n                }\n                parent = parent.parent;\n              }\n              if (lastParent === parent && settings.padd_empty_with_br !== true) {\n                textNode = new Node$1('#text', 3);\n                textNode.value = nbsp;\n                node.replace(textNode);\n              }\n            }\n          }\n        });\n      }\n      parser.addAttributeFilter('href', function (nodes) {\n        var i = nodes.length, node;\n        var appendRel = function (rel) {\n          var parts = rel.split(' ').filter(function (p) {\n            return p.length > 0;\n          });\n          return parts.concat(['noopener']).sort().join(' ');\n        };\n        var addNoOpener = function (rel) {\n          var newRel = rel ? Tools.trim(rel) : '';\n          if (!/\\b(noopener)\\b/g.test(newRel)) {\n            return appendRel(newRel);\n          } else {\n            return newRel;\n          }\n        };\n        if (!settings.allow_unsafe_link_target) {\n          while (i--) {\n            node = nodes[i];\n            if (node.name === 'a' && node.attr('target') === '_blank') {\n              node.attr('rel', addNoOpener(node.attr('rel')));\n            }\n          }\n        }\n      });\n      if (!settings.allow_html_in_named_anchor) {\n        parser.addAttributeFilter('id,name', function (nodes) {\n          var i = nodes.length, sibling, prevSibling, parent, node;\n          while (i--) {\n            node = nodes[i];\n            if (node.name === 'a' && node.firstChild && !node.attr('href')) {\n              parent = node.parent;\n              sibling = node.lastChild;\n              do {\n                prevSibling = sibling.prev;\n                parent.insert(sibling, node);\n                sibling = prevSibling;\n              } while (sibling);\n            }\n          }\n        });\n      }\n      if (settings.fix_list_elements) {\n        parser.addNodeFilter('ul,ol', function (nodes) {\n          var i = nodes.length, node, parentNode;\n          while (i--) {\n            node = nodes[i];\n            parentNode = node.parent;\n            if (parentNode.name === 'ul' || parentNode.name === 'ol') {\n              if (node.prev && node.prev.name === 'li') {\n                node.prev.append(node);\n              } else {\n                var li = new Node$1('li', 1);\n                li.attr('style', 'list-style-type: none');\n                node.wrap(li);\n              }\n            }\n          }\n        });\n      }\n      if (settings.validate && schema.getValidClasses()) {\n        parser.addAttributeFilter('class', function (nodes) {\n          var i = nodes.length, node, classList, ci, className, classValue;\n          var validClasses = schema.getValidClasses();\n          var validClassesMap, valid;\n          while (i--) {\n            node = nodes[i];\n            classList = node.attr('class').split(' ');\n            classValue = '';\n            for (ci = 0; ci < classList.length; ci++) {\n              className = classList[ci];\n              valid = false;\n              validClassesMap = validClasses['*'];\n              if (validClassesMap && validClassesMap[className]) {\n                valid = true;\n              }\n              validClassesMap = validClasses[node.name];\n              if (!valid && validClassesMap && validClassesMap[className]) {\n                valid = true;\n              }\n              if (valid) {\n                if (classValue) {\n                  classValue += ' ';\n                }\n                classValue += className;\n              }\n            }\n            if (!classValue.length) {\n              classValue = null;\n            }\n            node.attr('class', classValue);\n          }\n        });\n      }\n    };\n\n    var makeMap$4 = Tools.makeMap, each$8 = Tools.each, explode$2 = Tools.explode, extend$2 = Tools.extend;\n    var DomParser = function (settings, schema) {\n      if (schema === void 0) {\n        schema = Schema();\n      }\n      var nodeFilters = {};\n      var attributeFilters = [];\n      var matchedNodes = {};\n      var matchedAttributes = {};\n      settings = settings || {};\n      settings.validate = 'validate' in settings ? settings.validate : true;\n      settings.root_name = settings.root_name || 'body';\n      var fixInvalidChildren = function (nodes) {\n        var ni, node, parent, parents, newParent, currentNode, tempNode, childNode, i;\n        var nonEmptyElements, whitespaceElements, nonSplitableElements, textBlockElements, specialElements, sibling, nextNode;\n        nonSplitableElements = makeMap$4('tr,td,th,tbody,thead,tfoot,table');\n        nonEmptyElements = schema.getNonEmptyElements();\n        whitespaceElements = schema.getWhiteSpaceElements();\n        textBlockElements = schema.getTextBlockElements();\n        specialElements = schema.getSpecialElements();\n        for (ni = 0; ni < nodes.length; ni++) {\n          node = nodes[ni];\n          if (!node.parent || node.fixed) {\n            continue;\n          }\n          if (textBlockElements[node.name] && node.parent.name === 'li') {\n            sibling = node.next;\n            while (sibling) {\n              if (textBlockElements[sibling.name]) {\n                sibling.name = 'li';\n                sibling.fixed = true;\n                node.parent.insert(sibling, node.parent);\n              } else {\n                break;\n              }\n              sibling = sibling.next;\n            }\n            node.unwrap(node);\n            continue;\n          }\n          parents = [node];\n          for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && !nonSplitableElements[parent.name]; parent = parent.parent) {\n            parents.push(parent);\n          }\n          if (parent && parents.length > 1) {\n            parents.reverse();\n            newParent = currentNode = filterNode(parents[0].clone());\n            for (i = 0; i < parents.length - 1; i++) {\n              if (schema.isValidChild(currentNode.name, parents[i].name)) {\n                tempNode = filterNode(parents[i].clone());\n                currentNode.append(tempNode);\n              } else {\n                tempNode = currentNode;\n              }\n              for (childNode = parents[i].firstChild; childNode && childNode !== parents[i + 1];) {\n                nextNode = childNode.next;\n                tempNode.append(childNode);\n                childNode = nextNode;\n              }\n              currentNode = tempNode;\n            }\n            if (!isEmpty$1(schema, nonEmptyElements, whitespaceElements, newParent)) {\n              parent.insert(newParent, parents[0], true);\n              parent.insert(node, newParent);\n            } else {\n              parent.insert(node, parents[0], true);\n            }\n            parent = parents[0];\n            if (isEmpty$1(schema, nonEmptyElements, whitespaceElements, parent) || hasOnlyChild(parent, 'br')) {\n              parent.empty().remove();\n            }\n          } else if (node.parent) {\n            if (node.name === 'li') {\n              sibling = node.prev;\n              if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) {\n                sibling.append(node);\n                continue;\n              }\n              sibling = node.next;\n              if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) {\n                sibling.insert(node, sibling.firstChild, true);\n                continue;\n              }\n              node.wrap(filterNode(new Node$1('ul', 1)));\n              continue;\n            }\n            if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) {\n              node.wrap(filterNode(new Node$1('div', 1)));\n            } else {\n              if (specialElements[node.name]) {\n                node.empty().remove();\n              } else {\n                node.unwrap();\n              }\n            }\n          }\n        }\n      };\n      var filterNode = function (node) {\n        var i, name, list;\n        name = node.name;\n        if (name in nodeFilters) {\n          list = matchedNodes[name];\n          if (list) {\n            list.push(node);\n          } else {\n            matchedNodes[name] = [node];\n          }\n        }\n        i = attributeFilters.length;\n        while (i--) {\n          name = attributeFilters[i].name;\n          if (name in node.attributes.map) {\n            list = matchedAttributes[name];\n            if (list) {\n              list.push(node);\n            } else {\n              matchedAttributes[name] = [node];\n            }\n          }\n        }\n        return node;\n      };\n      var addNodeFilter = function (name, callback) {\n        each$8(explode$2(name), function (name) {\n          var list = nodeFilters[name];\n          if (!list) {\n            nodeFilters[name] = list = [];\n          }\n          list.push(callback);\n        });\n      };\n      var getNodeFilters = function () {\n        var out = [];\n        for (var name_1 in nodeFilters) {\n          if (nodeFilters.hasOwnProperty(name_1)) {\n            out.push({\n              name: name_1,\n              callbacks: nodeFilters[name_1]\n            });\n          }\n        }\n        return out;\n      };\n      var addAttributeFilter = function (name, callback) {\n        each$8(explode$2(name), function (name) {\n          var i;\n          for (i = 0; i < attributeFilters.length; i++) {\n            if (attributeFilters[i].name === name) {\n              attributeFilters[i].callbacks.push(callback);\n              return;\n            }\n          }\n          attributeFilters.push({\n            name: name,\n            callbacks: [callback]\n          });\n        });\n      };\n      var getAttributeFilters = function () {\n        return [].concat(attributeFilters);\n      };\n      var parse = function (html, args) {\n        var parser, nodes, i, l, fi, fl, list, name;\n        var blockElements;\n        var invalidChildren = [];\n        var isInWhiteSpacePreservedElement;\n        var node;\n        var getRootBlockName = function (name) {\n          if (name === false) {\n            return '';\n          } else if (name === true) {\n            return 'p';\n          } else {\n            return name;\n          }\n        };\n        args = args || {};\n        matchedNodes = {};\n        matchedAttributes = {};\n        blockElements = extend$2(makeMap$4('script,style,head,html,body,title,meta,param'), schema.getBlockElements());\n        var nonEmptyElements = schema.getNonEmptyElements();\n        var children = schema.children;\n        var validate = settings.validate;\n        var forcedRootBlockName = 'forced_root_block' in args ? args.forced_root_block : settings.forced_root_block;\n        var rootBlockName = getRootBlockName(forcedRootBlockName);\n        var whiteSpaceElements = schema.getWhiteSpaceElements();\n        var startWhiteSpaceRegExp = /^[ \\t\\r\\n]+/;\n        var endWhiteSpaceRegExp = /[ \\t\\r\\n]+$/;\n        var allWhiteSpaceRegExp = /[ \\t\\r\\n]+/g;\n        var isAllWhiteSpaceRegExp = /^[ \\t\\r\\n]+$/;\n        isInWhiteSpacePreservedElement = whiteSpaceElements.hasOwnProperty(args.context) || whiteSpaceElements.hasOwnProperty(settings.root_name);\n        var addRootBlocks = function () {\n          var node = rootNode.firstChild, next, rootBlockNode;\n          var trim = function (rootBlockNode) {\n            if (rootBlockNode) {\n              node = rootBlockNode.firstChild;\n              if (node && node.type === 3) {\n                node.value = node.value.replace(startWhiteSpaceRegExp, '');\n              }\n              node = rootBlockNode.lastChild;\n              if (node && node.type === 3) {\n                node.value = node.value.replace(endWhiteSpaceRegExp, '');\n              }\n            }\n          };\n          if (!schema.isValidChild(rootNode.name, rootBlockName.toLowerCase())) {\n            return;\n          }\n          while (node) {\n            next = node.next;\n            if (node.type === 3 || node.type === 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr('data-mce-type')) {\n              if (!rootBlockNode) {\n                rootBlockNode = createNode(rootBlockName, 1);\n                rootBlockNode.attr(settings.forced_root_block_attrs);\n                rootNode.insert(rootBlockNode, node);\n                rootBlockNode.append(node);\n              } else {\n                rootBlockNode.append(node);\n              }\n            } else {\n              trim(rootBlockNode);\n              rootBlockNode = null;\n            }\n            node = next;\n          }\n          trim(rootBlockNode);\n        };\n        var createNode = function (name, type) {\n          var node = new Node$1(name, type);\n          var list;\n          if (name in nodeFilters) {\n            list = matchedNodes[name];\n            if (list) {\n              list.push(node);\n            } else {\n              matchedNodes[name] = [node];\n            }\n          }\n          return node;\n        };\n        var removeWhitespaceBefore = function (node) {\n          var textNode, textNodeNext, textVal, sibling;\n          var blockElements = schema.getBlockElements();\n          for (textNode = node.prev; textNode && textNode.type === 3;) {\n            textVal = textNode.value.replace(endWhiteSpaceRegExp, '');\n            if (textVal.length > 0) {\n              textNode.value = textVal;\n              return;\n            }\n            textNodeNext = textNode.next;\n            if (textNodeNext) {\n              if (textNodeNext.type === 3 && textNodeNext.value.length) {\n                textNode = textNode.prev;\n                continue;\n              }\n              if (!blockElements[textNodeNext.name] && textNodeNext.name !== 'script' && textNodeNext.name !== 'style') {\n                textNode = textNode.prev;\n                continue;\n              }\n            }\n            sibling = textNode.prev;\n            textNode.remove();\n            textNode = sibling;\n          }\n        };\n        var cloneAndExcludeBlocks = function (input) {\n          var name;\n          var output = {};\n          for (name in input) {\n            if (name !== 'li' && name !== 'p') {\n              output[name] = input[name];\n            }\n          }\n          return output;\n        };\n        parser = SaxParser$1({\n          validate: validate,\n          allow_script_urls: settings.allow_script_urls,\n          allow_conditional_comments: settings.allow_conditional_comments,\n          preserve_cdata: settings.preserve_cdata,\n          self_closing_elements: cloneAndExcludeBlocks(schema.getSelfClosingElements()),\n          cdata: function (text) {\n            node.append(createNode('#cdata', 4)).value = text;\n          },\n          text: function (text, raw) {\n            var textNode;\n            if (!isInWhiteSpacePreservedElement) {\n              text = text.replace(allWhiteSpaceRegExp, ' ');\n              if (isLineBreakNode(node.lastChild, blockElements)) {\n                text = text.replace(startWhiteSpaceRegExp, '');\n              }\n            }\n            if (text.length !== 0) {\n              textNode = createNode('#text', 3);\n              textNode.raw = !!raw;\n              node.append(textNode).value = text;\n            }\n          },\n          comment: function (text) {\n            node.append(createNode('#comment', 8)).value = text;\n          },\n          pi: function (name, text) {\n            node.append(createNode(name, 7)).value = text;\n            removeWhitespaceBefore(node);\n          },\n          doctype: function (text) {\n            var newNode;\n            newNode = node.append(createNode('#doctype', 10));\n            newNode.value = text;\n            removeWhitespaceBefore(node);\n          },\n          start: function (name, attrs, empty) {\n            var newNode, attrFiltersLen, elementRule, attrName, parent;\n            elementRule = validate ? schema.getElementRule(name) : {};\n            if (elementRule) {\n              newNode = createNode(elementRule.outputName || name, 1);\n              newNode.attributes = attrs;\n              newNode.shortEnded = empty;\n              node.append(newNode);\n              parent = children[node.name];\n              if (parent && children[newNode.name] && !parent[newNode.name]) {\n                invalidChildren.push(newNode);\n              }\n              attrFiltersLen = attributeFilters.length;\n              while (attrFiltersLen--) {\n                attrName = attributeFilters[attrFiltersLen].name;\n                if (attrName in attrs.map) {\n                  list = matchedAttributes[attrName];\n                  if (list) {\n                    list.push(newNode);\n                  } else {\n                    matchedAttributes[attrName] = [newNode];\n                  }\n                }\n              }\n              if (blockElements[name]) {\n                removeWhitespaceBefore(newNode);\n              }\n              if (!empty) {\n                node = newNode;\n              }\n              if (!isInWhiteSpacePreservedElement && whiteSpaceElements[name]) {\n                isInWhiteSpacePreservedElement = true;\n              }\n            }\n          },\n          end: function (name) {\n            var textNode, elementRule, text, sibling, tempNode;\n            elementRule = validate ? schema.getElementRule(name) : {};\n            if (elementRule) {\n              if (blockElements[name]) {\n                if (!isInWhiteSpacePreservedElement) {\n                  textNode = node.firstChild;\n                  if (textNode && textNode.type === 3) {\n                    text = textNode.value.replace(startWhiteSpaceRegExp, '');\n                    if (text.length > 0) {\n                      textNode.value = text;\n                      textNode = textNode.next;\n                    } else {\n                      sibling = textNode.next;\n                      textNode.remove();\n                      textNode = sibling;\n                      while (textNode && textNode.type === 3) {\n                        text = textNode.value;\n                        sibling = textNode.next;\n                        if (text.length === 0 || isAllWhiteSpaceRegExp.test(text)) {\n                          textNode.remove();\n                          textNode = sibling;\n                        }\n                        textNode = sibling;\n                      }\n                    }\n                  }\n                  textNode = node.lastChild;\n                  if (textNode && textNode.type === 3) {\n                    text = textNode.value.replace(endWhiteSpaceRegExp, '');\n                    if (text.length > 0) {\n                      textNode.value = text;\n                      textNode = textNode.prev;\n                    } else {\n                      sibling = textNode.prev;\n                      textNode.remove();\n                      textNode = sibling;\n                      while (textNode && textNode.type === 3) {\n                        text = textNode.value;\n                        sibling = textNode.prev;\n                        if (text.length === 0 || isAllWhiteSpaceRegExp.test(text)) {\n                          textNode.remove();\n                          textNode = sibling;\n                        }\n                        textNode = sibling;\n                      }\n                    }\n                  }\n                }\n              }\n              if (isInWhiteSpacePreservedElement && whiteSpaceElements[name]) {\n                isInWhiteSpacePreservedElement = false;\n              }\n              if (elementRule.removeEmpty && isEmpty$1(schema, nonEmptyElements, whiteSpaceElements, node)) {\n                tempNode = node.parent;\n                if (blockElements[node.name]) {\n                  node.empty().remove();\n                } else {\n                  node.unwrap();\n                }\n                node = tempNode;\n                return;\n              }\n              if (elementRule.paddEmpty && (isPaddedWithNbsp(node) || isEmpty$1(schema, nonEmptyElements, whiteSpaceElements, node))) {\n                paddEmptyNode(settings, args, blockElements, node);\n              }\n              node = node.parent;\n            }\n          }\n        }, schema);\n        var rootNode = node = new Node$1(args.context || settings.root_name, 11);\n        parser.parse(html, args.format);\n        if (validate && invalidChildren.length) {\n          if (!args.context) {\n            fixInvalidChildren(invalidChildren);\n          } else {\n            args.invalid = true;\n          }\n        }\n        if (rootBlockName && (rootNode.name === 'body' || args.isRootContent)) {\n          addRootBlocks();\n        }\n        if (!args.invalid) {\n          for (name in matchedNodes) {\n            if (!matchedNodes.hasOwnProperty(name)) {\n              continue;\n            }\n            list = nodeFilters[name];\n            nodes = matchedNodes[name];\n            fi = nodes.length;\n            while (fi--) {\n              if (!nodes[fi].parent) {\n                nodes.splice(fi, 1);\n              }\n            }\n            for (i = 0, l = list.length; i < l; i++) {\n              list[i](nodes, name, args);\n            }\n          }\n          for (i = 0, l = attributeFilters.length; i < l; i++) {\n            list = attributeFilters[i];\n            if (list.name in matchedAttributes) {\n              nodes = matchedAttributes[list.name];\n              fi = nodes.length;\n              while (fi--) {\n                if (!nodes[fi].parent) {\n                  nodes.splice(fi, 1);\n                }\n              }\n              for (fi = 0, fl = list.callbacks.length; fi < fl; fi++) {\n                list.callbacks[fi](nodes, list.name, args);\n              }\n            }\n          }\n        }\n        return rootNode;\n      };\n      var exports = {\n        schema: schema,\n        addAttributeFilter: addAttributeFilter,\n        getAttributeFilters: getAttributeFilters,\n        addNodeFilter: addNodeFilter,\n        getNodeFilters: getNodeFilters,\n        filterNode: filterNode,\n        parse: parse\n      };\n      register$2(exports, settings);\n      LegacyFilter.register(exports, settings);\n      return exports;\n    };\n\n    var register$3 = function (htmlParser, settings, dom) {\n      htmlParser.addAttributeFilter('data-mce-tabindex', function (nodes, name) {\n        var i = nodes.length, node;\n        while (i--) {\n          node = nodes[i];\n          node.attr('tabindex', node.attr('data-mce-tabindex'));\n          node.attr(name, null);\n        }\n      });\n      htmlParser.addAttributeFilter('src,href,style', function (nodes, name) {\n        var i = nodes.length, node, value;\n        var internalName = 'data-mce-' + name;\n        var urlConverter = settings.url_converter;\n        var urlConverterScope = settings.url_converter_scope;\n        while (i--) {\n          node = nodes[i];\n          value = node.attr(internalName);\n          if (value !== undefined) {\n            node.attr(name, value.length > 0 ? value : null);\n            node.attr(internalName, null);\n          } else {\n            value = node.attr(name);\n            if (name === 'style') {\n              value = dom.serializeStyle(dom.parseStyle(value), node.name);\n            } else if (urlConverter) {\n              value = urlConverter.call(urlConverterScope, value, name, node.name);\n            }\n            node.attr(name, value.length > 0 ? value : null);\n          }\n        }\n      });\n      htmlParser.addAttributeFilter('class', function (nodes) {\n        var i = nodes.length, node, value;\n        while (i--) {\n          node = nodes[i];\n          value = node.attr('class');\n          if (value) {\n            value = node.attr('class').replace(/(?:^|\\s)mce-item-\\w+(?!\\S)/g, '');\n            node.attr('class', value.length > 0 ? value : null);\n          }\n        }\n      });\n      htmlParser.addAttributeFilter('data-mce-type', function (nodes, name, args) {\n        var i = nodes.length, node;\n        while (i--) {\n          node = nodes[i];\n          if (node.attr('data-mce-type') === 'bookmark' && !args.cleanup) {\n            var hasChildren = Option.from(node.firstChild).exists(function (firstChild) {\n              return !Zwsp.isZwsp(firstChild.value);\n            });\n            if (hasChildren) {\n              node.unwrap();\n            } else {\n              node.remove();\n            }\n          }\n        }\n      });\n      htmlParser.addNodeFilter('noscript', function (nodes) {\n        var i = nodes.length, node;\n        while (i--) {\n          node = nodes[i].firstChild;\n          if (node) {\n            node.value = Entities.decode(node.value);\n          }\n        }\n      });\n      htmlParser.addNodeFilter('script,style', function (nodes, name) {\n        var i = nodes.length, node, value, type;\n        var trim = function (value) {\n          return value.replace(/(<!--\\[CDATA\\[|\\]\\]-->)/g, '\\n').replace(/^[\\r\\n]*|[\\r\\n]*$/g, '').replace(/^\\s*((<!--)?(\\s*\\/\\/)?\\s*<!\\[CDATA\\[|(<!--\\s*)?\\/\\*\\s*<!\\[CDATA\\[\\s*\\*\\/|(\\/\\/)?\\s*<!--|\\/\\*\\s*<!--\\s*\\*\\/)\\s*[\\r\\n]*/gi, '').replace(/\\s*(\\/\\*\\s*\\]\\]>\\s*\\*\\/(-->)?|\\s*\\/\\/\\s*\\]\\]>(-->)?|\\/\\/\\s*(-->)?|\\]\\]>|\\/\\*\\s*-->\\s*\\*\\/|\\s*-->\\s*)\\s*$/g, '');\n        };\n        while (i--) {\n          node = nodes[i];\n          value = node.firstChild ? node.firstChild.value : '';\n          if (name === 'script') {\n            type = node.attr('type');\n            if (type) {\n              node.attr('type', type === 'mce-no/type' ? null : type.replace(/^mce\\-/, ''));\n            }\n            if (settings.element_format === 'xhtml' && value.length > 0) {\n              node.firstChild.value = '// <![CDATA[\\n' + trim(value) + '\\n// ]]>';\n            }\n          } else {\n            if (settings.element_format === 'xhtml' && value.length > 0) {\n              node.firstChild.value = '<!--\\n' + trim(value) + '\\n-->';\n            }\n          }\n        }\n      });\n      htmlParser.addNodeFilter('#comment', function (nodes) {\n        var i = nodes.length, node;\n        while (i--) {\n          node = nodes[i];\n          if (settings.preserve_cdata && node.value.indexOf('[CDATA[') === 0) {\n            node.name = '#cdata';\n            node.type = 4;\n            node.value = dom.decode(node.value.replace(/^\\[CDATA\\[|\\]\\]$/g, ''));\n          } else if (node.value.indexOf('mce:protected ') === 0) {\n            node.name = '#text';\n            node.type = 3;\n            node.raw = true;\n            node.value = unescape(node.value).substr(14);\n          }\n        }\n      });\n      htmlParser.addNodeFilter('xml:namespace,input', function (nodes, name) {\n        var i = nodes.length, node;\n        while (i--) {\n          node = nodes[i];\n          if (node.type === 7) {\n            node.remove();\n          } else if (node.type === 1) {\n            if (name === 'input' && !node.attr('type')) {\n              node.attr('type', 'text');\n            }\n          }\n        }\n      });\n      htmlParser.addAttributeFilter('data-mce-type', function (nodes) {\n        each(nodes, function (node) {\n          if (node.attr('data-mce-type') === 'format-caret') {\n            if (node.isEmpty(htmlParser.schema.getNonEmptyElements())) {\n              node.remove();\n            } else {\n              node.unwrap();\n            }\n          }\n        });\n      });\n      htmlParser.addAttributeFilter('data-mce-src,data-mce-href,data-mce-style,' + 'data-mce-selected,data-mce-expando,' + 'data-mce-type,data-mce-resize,data-mce-placeholder', function (nodes, name) {\n        var i = nodes.length;\n        while (i--) {\n          nodes[i].attr(name, null);\n        }\n      });\n    };\n    var trimTrailingBr = function (rootNode) {\n      var brNode1, brNode2;\n      var isBr = function (node) {\n        return node && node.name === 'br';\n      };\n      brNode1 = rootNode.lastChild;\n      if (isBr(brNode1)) {\n        brNode2 = brNode1.prev;\n        if (isBr(brNode2)) {\n          brNode1.remove();\n          brNode2.remove();\n        }\n      }\n    };\n    var DomSerializerFilters = {\n      register: register$3,\n      trimTrailingBr: trimTrailingBr\n    };\n\n    var preProcess = function (editor, node, args) {\n      var impl, doc, oldDoc;\n      var dom = editor.dom;\n      node = node.cloneNode(true);\n      impl = domGlobals.document.implementation;\n      if (impl.createHTMLDocument) {\n        doc = impl.createHTMLDocument('');\n        Tools.each(node.nodeName === 'BODY' ? node.childNodes : [node], function (node) {\n          doc.body.appendChild(doc.importNode(node, true));\n        });\n        if (node.nodeName !== 'BODY') {\n          node = doc.body.firstChild;\n        } else {\n          node = doc.body;\n        }\n        oldDoc = dom.doc;\n        dom.doc = doc;\n      }\n      firePreProcess(editor, __assign(__assign({}, args), { node: node }));\n      if (oldDoc) {\n        dom.doc = oldDoc;\n      }\n      return node;\n    };\n    var shouldFireEvent = function (editor, args) {\n      return editor && editor.hasEventListeners('PreProcess') && !args.no_events;\n    };\n    var process = function (editor, node, args) {\n      return shouldFireEvent(editor, args) ? preProcess(editor, node, args) : node;\n    };\n    var DomSerializerPreProcess = { process: process };\n\n    var addTempAttr = function (htmlParser, tempAttrs, name) {\n      if (Tools.inArray(tempAttrs, name) === -1) {\n        htmlParser.addAttributeFilter(name, function (nodes, name) {\n          var i = nodes.length;\n          while (i--) {\n            nodes[i].attr(name, null);\n          }\n        });\n        tempAttrs.push(name);\n      }\n    };\n    var postProcess = function (editor, args, content) {\n      if (!args.no_events && editor) {\n        var outArgs = firePostProcess(editor, __assign(__assign({}, args), { content: content }));\n        return outArgs.content;\n      } else {\n        return content;\n      }\n    };\n    var getHtmlFromNode = function (dom, node, args) {\n      var html = Zwsp.trim(args.getInner ? node.innerHTML : dom.getOuterHTML(node));\n      return args.selection || isWsPreserveElement(Element.fromDom(node)) ? html : Tools.trim(html);\n    };\n    var parseHtml = function (htmlParser, html, args) {\n      var parserArgs = args.selection ? __assign({ forced_root_block: false }, args) : args;\n      var rootNode = htmlParser.parse(html, parserArgs);\n      DomSerializerFilters.trimTrailingBr(rootNode);\n      return rootNode;\n    };\n    var serializeNode = function (settings, schema, node) {\n      var htmlSerializer = Serializer(settings, schema);\n      return htmlSerializer.serialize(node);\n    };\n    var toHtml = function (editor, settings, schema, rootNode, args) {\n      var content = serializeNode(settings, schema, rootNode);\n      return postProcess(editor, args, content);\n    };\n    var DomSerializer = function (settings, editor) {\n      var tempAttrs = ['data-mce-selected'];\n      var dom = editor && editor.dom ? editor.dom : DOMUtils$1.DOM;\n      var schema = editor && editor.schema ? editor.schema : Schema(settings);\n      settings.entity_encoding = settings.entity_encoding || 'named';\n      settings.remove_trailing_brs = 'remove_trailing_brs' in settings ? settings.remove_trailing_brs : true;\n      var htmlParser = DomParser(settings, schema);\n      DomSerializerFilters.register(htmlParser, settings, dom);\n      var serialize = function (node, parserArgs) {\n        if (parserArgs === void 0) {\n          parserArgs = {};\n        }\n        var args = __assign({ format: 'html' }, parserArgs);\n        var targetNode = DomSerializerPreProcess.process(editor, node, args);\n        var html = getHtmlFromNode(dom, targetNode, args);\n        var rootNode = parseHtml(htmlParser, html, args);\n        return args.format === 'tree' ? rootNode : toHtml(editor, settings, schema, rootNode, args);\n      };\n      return {\n        schema: schema,\n        addNodeFilter: htmlParser.addNodeFilter,\n        addAttributeFilter: htmlParser.addAttributeFilter,\n        serialize: serialize,\n        addRules: function (rules) {\n          schema.addValidElements(rules);\n        },\n        setRules: function (rules) {\n          schema.setValidElements(rules);\n        },\n        addTempAttr: curry(addTempAttr, htmlParser, tempAttrs),\n        getTempAttrs: function () {\n          return tempAttrs;\n        },\n        getNodeFilters: htmlParser.getNodeFilters,\n        getAttributeFilters: htmlParser.getAttributeFilters\n      };\n    };\n\n    var Serializer$1 = function (settings, editor) {\n      var domSerializer = DomSerializer(settings, editor);\n      return {\n        schema: domSerializer.schema,\n        addNodeFilter: domSerializer.addNodeFilter,\n        addAttributeFilter: domSerializer.addAttributeFilter,\n        serialize: domSerializer.serialize,\n        addRules: domSerializer.addRules,\n        setRules: domSerializer.setRules,\n        addTempAttr: domSerializer.addTempAttr,\n        getTempAttrs: domSerializer.getTempAttrs,\n        getNodeFilters: domSerializer.getNodeFilters,\n        getAttributeFilters: domSerializer.getAttributeFilters\n      };\n    };\n\n    var blobUriToBlob = function (url) {\n      return new promiseObj(function (resolve, reject) {\n        var rejectWithError = function () {\n          reject('Cannot convert ' + url + ' to Blob. Resource might not exist or is inaccessible.');\n        };\n        try {\n          var xhr = new domGlobals.XMLHttpRequest();\n          xhr.open('GET', url, true);\n          xhr.responseType = 'blob';\n          xhr.onload = function () {\n            if (this.status === 200) {\n              resolve(this.response);\n            } else {\n              rejectWithError();\n            }\n          };\n          xhr.onerror = rejectWithError;\n          xhr.send();\n        } catch (ex) {\n          rejectWithError();\n        }\n      });\n    };\n    var parseDataUri = function (uri) {\n      var type, matches;\n      var uriParts = decodeURIComponent(uri).split(',');\n      matches = /data:([^;]+)/.exec(uriParts[0]);\n      if (matches) {\n        type = matches[1];\n      }\n      return {\n        type: type,\n        data: uriParts[1]\n      };\n    };\n    var dataUriToBlob = function (uri) {\n      return new promiseObj(function (resolve) {\n        var str, arr, i;\n        var uriParts = parseDataUri(uri);\n        try {\n          str = domGlobals.atob(uriParts.data);\n        } catch (e) {\n          resolve(new domGlobals.Blob([]));\n          return;\n        }\n        arr = new Uint8Array(str.length);\n        for (i = 0; i < arr.length; i++) {\n          arr[i] = str.charCodeAt(i);\n        }\n        resolve(new domGlobals.Blob([arr], { type: uriParts.type }));\n      });\n    };\n    var uriToBlob = function (url) {\n      if (url.indexOf('blob:') === 0) {\n        return blobUriToBlob(url);\n      }\n      if (url.indexOf('data:') === 0) {\n        return dataUriToBlob(url);\n      }\n      return null;\n    };\n    var blobToDataUri = function (blob) {\n      return new promiseObj(function (resolve) {\n        var reader = new domGlobals.FileReader();\n        reader.onloadend = function () {\n          resolve(reader.result);\n        };\n        reader.readAsDataURL(blob);\n      });\n    };\n    var Conversions = {\n      uriToBlob: uriToBlob,\n      blobToDataUri: blobToDataUri,\n      parseDataUri: parseDataUri\n    };\n\n    var count = 0;\n    var uniqueId = function (prefix) {\n      return (prefix || 'blobid') + count++;\n    };\n    var imageToBlobInfo = function (blobCache, img, resolve, reject) {\n      var base64, blobInfo;\n      if (img.src.indexOf('blob:') === 0) {\n        blobInfo = blobCache.getByUri(img.src);\n        if (blobInfo) {\n          resolve({\n            image: img,\n            blobInfo: blobInfo\n          });\n        } else {\n          Conversions.uriToBlob(img.src).then(function (blob) {\n            Conversions.blobToDataUri(blob).then(function (dataUri) {\n              base64 = Conversions.parseDataUri(dataUri).data;\n              blobInfo = blobCache.create(uniqueId(), blob, base64);\n              blobCache.add(blobInfo);\n              resolve({\n                image: img,\n                blobInfo: blobInfo\n              });\n            });\n          }, function (err) {\n            reject(err);\n          });\n        }\n        return;\n      }\n      base64 = Conversions.parseDataUri(img.src).data;\n      blobInfo = blobCache.findFirst(function (cachedBlobInfo) {\n        return cachedBlobInfo.base64() === base64;\n      });\n      if (blobInfo) {\n        resolve({\n          image: img,\n          blobInfo: blobInfo\n        });\n      } else {\n        Conversions.uriToBlob(img.src).then(function (blob) {\n          blobInfo = blobCache.create(uniqueId(), blob, base64);\n          blobCache.add(blobInfo);\n          resolve({\n            image: img,\n            blobInfo: blobInfo\n          });\n        }, function (err) {\n          reject(err);\n        });\n      }\n    };\n    var getAllImages = function (elm) {\n      return elm ? from$1(elm.getElementsByTagName('img')) : [];\n    };\n    function ImageScanner(uploadStatus, blobCache) {\n      var cachedPromises = {};\n      var findAll = function (elm, predicate) {\n        var images;\n        if (!predicate) {\n          predicate = constant(true);\n        }\n        images = filter(getAllImages(elm), function (img) {\n          var src = img.src;\n          if (!Env.fileApi) {\n            return false;\n          }\n          if (img.hasAttribute('data-mce-bogus')) {\n            return false;\n          }\n          if (img.hasAttribute('data-mce-placeholder')) {\n            return false;\n          }\n          if (!src || src === Env.transparentSrc) {\n            return false;\n          }\n          if (src.indexOf('blob:') === 0) {\n            return !uploadStatus.isUploaded(src) && predicate(img);\n          }\n          if (src.indexOf('data:') === 0) {\n            return predicate(img);\n          }\n          return false;\n        });\n        var promises = map(images, function (img) {\n          if (cachedPromises[img.src]) {\n            return new promiseObj(function (resolve) {\n              cachedPromises[img.src].then(function (imageInfo) {\n                if (typeof imageInfo === 'string') {\n                  return imageInfo;\n                }\n                resolve({\n                  image: img,\n                  blobInfo: imageInfo.blobInfo\n                });\n              });\n            });\n          }\n          var newPromise = new promiseObj(function (resolve, reject) {\n            imageToBlobInfo(blobCache, img, resolve, reject);\n          }).then(function (result) {\n            delete cachedPromises[result.image.src];\n            return result;\n          }).catch(function (error) {\n            delete cachedPromises[img.src];\n            return error;\n          });\n          cachedPromises[img.src] = newPromise;\n          return newPromise;\n        });\n        return promiseObj.all(promises);\n      };\n      return { findAll: findAll };\n    }\n\n    function Uploader(uploadStatus, settings) {\n      var pendingPromises = {};\n      var pathJoin = function (path1, path2) {\n        if (path1) {\n          return path1.replace(/\\/$/, '') + '/' + path2.replace(/^\\//, '');\n        }\n        return path2;\n      };\n      var defaultHandler = function (blobInfo, success, failure, progress) {\n        var xhr, formData;\n        xhr = new domGlobals.XMLHttpRequest();\n        xhr.open('POST', settings.url);\n        xhr.withCredentials = settings.credentials;\n        xhr.upload.onprogress = function (e) {\n          progress(e.loaded / e.total * 100);\n        };\n        xhr.onerror = function () {\n          failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);\n        };\n        xhr.onload = function () {\n          var json;\n          if (xhr.status < 200 || xhr.status >= 300) {\n            failure('HTTP Error: ' + xhr.status);\n            return;\n          }\n          json = JSON.parse(xhr.responseText);\n          if (!json || typeof json.location !== 'string') {\n            failure('Invalid JSON: ' + xhr.responseText);\n            return;\n          }\n          success(pathJoin(settings.basePath, json.location));\n        };\n        formData = new domGlobals.FormData();\n        formData.append('file', blobInfo.blob(), blobInfo.filename());\n        xhr.send(formData);\n      };\n      var noUpload = function () {\n        return new promiseObj(function (resolve) {\n          resolve([]);\n        });\n      };\n      var handlerSuccess = function (blobInfo, url) {\n        return {\n          url: url,\n          blobInfo: blobInfo,\n          status: true\n        };\n      };\n      var handlerFailure = function (blobInfo, error) {\n        return {\n          url: '',\n          blobInfo: blobInfo,\n          status: false,\n          error: error\n        };\n      };\n      var resolvePending = function (blobUri, result) {\n        Tools.each(pendingPromises[blobUri], function (resolve) {\n          resolve(result);\n        });\n        delete pendingPromises[blobUri];\n      };\n      var uploadBlobInfo = function (blobInfo, handler, openNotification) {\n        uploadStatus.markPending(blobInfo.blobUri());\n        return new promiseObj(function (resolve) {\n          var notification, progress;\n          var noop = function () {\n          };\n          try {\n            var closeNotification_1 = function () {\n              if (notification) {\n                notification.close();\n                progress = noop;\n              }\n            };\n            var success = function (url) {\n              closeNotification_1();\n              uploadStatus.markUploaded(blobInfo.blobUri(), url);\n              resolvePending(blobInfo.blobUri(), handlerSuccess(blobInfo, url));\n              resolve(handlerSuccess(blobInfo, url));\n            };\n            var failure = function (error) {\n              closeNotification_1();\n              uploadStatus.removeFailed(blobInfo.blobUri());\n              resolvePending(blobInfo.blobUri(), handlerFailure(blobInfo, error));\n              resolve(handlerFailure(blobInfo, error));\n            };\n            progress = function (percent) {\n              if (percent < 0 || percent > 100) {\n                return;\n              }\n              if (!notification) {\n                notification = openNotification();\n              }\n              notification.progressBar.value(percent);\n            };\n            handler(blobInfo, success, failure, progress);\n          } catch (ex) {\n            resolve(handlerFailure(blobInfo, ex.message));\n          }\n        });\n      };\n      var isDefaultHandler = function (handler) {\n        return handler === defaultHandler;\n      };\n      var pendingUploadBlobInfo = function (blobInfo) {\n        var blobUri = blobInfo.blobUri();\n        return new promiseObj(function (resolve) {\n          pendingPromises[blobUri] = pendingPromises[blobUri] || [];\n          pendingPromises[blobUri].push(resolve);\n        });\n      };\n      var uploadBlobs = function (blobInfos, openNotification) {\n        blobInfos = Tools.grep(blobInfos, function (blobInfo) {\n          return !uploadStatus.isUploaded(blobInfo.blobUri());\n        });\n        return promiseObj.all(Tools.map(blobInfos, function (blobInfo) {\n          return uploadStatus.isPending(blobInfo.blobUri()) ? pendingUploadBlobInfo(blobInfo) : uploadBlobInfo(blobInfo, settings.handler, openNotification);\n        }));\n      };\n      var upload = function (blobInfos, openNotification) {\n        return !settings.url && isDefaultHandler(settings.handler) ? noUpload() : uploadBlobs(blobInfos, openNotification);\n      };\n      if (isFunction(settings.handler) === false) {\n        settings.handler = defaultHandler;\n      }\n      return { upload: upload };\n    }\n\n    function UploadStatus () {\n      var PENDING = 1, UPLOADED = 2;\n      var blobUriStatuses = {};\n      var createStatus = function (status, resultUri) {\n        return {\n          status: status,\n          resultUri: resultUri\n        };\n      };\n      var hasBlobUri = function (blobUri) {\n        return blobUri in blobUriStatuses;\n      };\n      var getResultUri = function (blobUri) {\n        var result = blobUriStatuses[blobUri];\n        return result ? result.resultUri : null;\n      };\n      var isPending = function (blobUri) {\n        return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === PENDING : false;\n      };\n      var isUploaded = function (blobUri) {\n        return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === UPLOADED : false;\n      };\n      var markPending = function (blobUri) {\n        blobUriStatuses[blobUri] = createStatus(PENDING, null);\n      };\n      var markUploaded = function (blobUri, resultUri) {\n        blobUriStatuses[blobUri] = createStatus(UPLOADED, resultUri);\n      };\n      var removeFailed = function (blobUri) {\n        delete blobUriStatuses[blobUri];\n      };\n      var destroy = function () {\n        blobUriStatuses = {};\n      };\n      return {\n        hasBlobUri: hasBlobUri,\n        getResultUri: getResultUri,\n        isPending: isPending,\n        isUploaded: isUploaded,\n        markPending: markPending,\n        markUploaded: markUploaded,\n        removeFailed: removeFailed,\n        destroy: destroy\n      };\n    }\n\n    var count$1 = 0;\n    var seed = function () {\n      var rnd = function () {\n        return Math.round(Math.random() * 4294967295).toString(36);\n      };\n      var now = new Date().getTime();\n      return 's' + now.toString(36) + rnd() + rnd() + rnd();\n    };\n    var uuid = function (prefix) {\n      return prefix + count$1++ + seed();\n    };\n    var Uuid = { uuid: uuid };\n\n    var BlobCache = function () {\n      var cache = [];\n      var mimeToExt = function (mime) {\n        var mimes = {\n          'image/jpeg': 'jpg',\n          'image/jpg': 'jpg',\n          'image/gif': 'gif',\n          'image/png': 'png'\n        };\n        return mimes[mime.toLowerCase()] || 'dat';\n      };\n      var create = function (o, blob, base64, filename) {\n        if (isString(o)) {\n          var id = o;\n          return toBlobInfo({\n            id: id,\n            name: filename,\n            blob: blob,\n            base64: base64\n          });\n        } else if (isObject(o)) {\n          return toBlobInfo(o);\n        } else {\n          throw new Error('Unknown input type');\n        }\n      };\n      var toBlobInfo = function (o) {\n        var id, name;\n        if (!o.blob || !o.base64) {\n          throw new Error('blob and base64 representations of the image are required for BlobInfo to be created');\n        }\n        id = o.id || Uuid.uuid('blobid');\n        name = o.name || id;\n        return {\n          id: constant(id),\n          name: constant(name),\n          filename: constant(name + '.' + mimeToExt(o.blob.type)),\n          blob: constant(o.blob),\n          base64: constant(o.base64),\n          blobUri: constant(o.blobUri || domGlobals.URL.createObjectURL(o.blob)),\n          uri: constant(o.uri)\n        };\n      };\n      var add = function (blobInfo) {\n        if (!get(blobInfo.id())) {\n          cache.push(blobInfo);\n        }\n      };\n      var get = function (id) {\n        return findFirst(function (cachedBlobInfo) {\n          return cachedBlobInfo.id() === id;\n        });\n      };\n      var findFirst = function (predicate) {\n        return filter(cache, predicate)[0];\n      };\n      var getByUri = function (blobUri) {\n        return findFirst(function (blobInfo) {\n          return blobInfo.blobUri() === blobUri;\n        });\n      };\n      var removeByUri = function (blobUri) {\n        cache = filter(cache, function (blobInfo) {\n          if (blobInfo.blobUri() === blobUri) {\n            domGlobals.URL.revokeObjectURL(blobInfo.blobUri());\n            return false;\n          }\n          return true;\n        });\n      };\n      var destroy = function () {\n        each(cache, function (cachedBlobInfo) {\n          domGlobals.URL.revokeObjectURL(cachedBlobInfo.blobUri());\n        });\n        cache = [];\n      };\n      return {\n        create: create,\n        add: add,\n        get: get,\n        getByUri: getByUri,\n        findFirst: findFirst,\n        removeByUri: removeByUri,\n        destroy: destroy\n      };\n    };\n\n    var EditorUpload = function (editor) {\n      var blobCache = BlobCache();\n      var uploader, imageScanner;\n      var uploadStatus = UploadStatus();\n      var urlFilters = [];\n      var aliveGuard = function (callback) {\n        return function (result) {\n          if (editor.selection) {\n            return callback(result);\n          }\n          return [];\n        };\n      };\n      var cacheInvalidator = function (url) {\n        return url + (url.indexOf('?') === -1 ? '?' : '&') + new Date().getTime();\n      };\n      var replaceString = function (content, search, replace) {\n        var index = 0;\n        do {\n          index = content.indexOf(search, index);\n          if (index !== -1) {\n            content = content.substring(0, index) + replace + content.substr(index + search.length);\n            index += replace.length - search.length + 1;\n          }\n        } while (index !== -1);\n        return content;\n      };\n      var replaceImageUrl = function (content, targetUrl, replacementUrl) {\n        content = replaceString(content, 'src=\"' + targetUrl + '\"', 'src=\"' + replacementUrl + '\"');\n        content = replaceString(content, 'data-mce-src=\"' + targetUrl + '\"', 'data-mce-src=\"' + replacementUrl + '\"');\n        return content;\n      };\n      var replaceUrlInUndoStack = function (targetUrl, replacementUrl) {\n        each(editor.undoManager.data, function (level) {\n          if (level.type === 'fragmented') {\n            level.fragments = map(level.fragments, function (fragment) {\n              return replaceImageUrl(fragment, targetUrl, replacementUrl);\n            });\n          } else {\n            level.content = replaceImageUrl(level.content, targetUrl, replacementUrl);\n          }\n        });\n      };\n      var openNotification = function () {\n        return editor.notificationManager.open({\n          text: editor.translate('Image uploading...'),\n          type: 'info',\n          timeout: -1,\n          progressBar: true\n        });\n      };\n      var replaceImageUri = function (image, resultUri) {\n        blobCache.removeByUri(image.src);\n        replaceUrlInUndoStack(image.src, resultUri);\n        editor.$(image).attr({\n          'src': Settings.shouldReuseFileName(editor) ? cacheInvalidator(resultUri) : resultUri,\n          'data-mce-src': editor.convertURL(resultUri, 'src')\n        });\n      };\n      var uploadImages = function (callback) {\n        if (!uploader) {\n          uploader = Uploader(uploadStatus, {\n            url: Settings.getImageUploadUrl(editor),\n            basePath: Settings.getImageUploadBasePath(editor),\n            credentials: Settings.getImagesUploadCredentials(editor),\n            handler: Settings.getImagesUploadHandler(editor)\n          });\n        }\n        return scanForImages().then(aliveGuard(function (imageInfos) {\n          var blobInfos = map(imageInfos, function (imageInfo) {\n            return imageInfo.blobInfo;\n          });\n          return uploader.upload(blobInfos, openNotification).then(aliveGuard(function (result) {\n            var filteredResult = map(result, function (uploadInfo, index) {\n              var image = imageInfos[index].image;\n              if (uploadInfo.status && Settings.shouldReplaceBlobUris(editor)) {\n                replaceImageUri(image, uploadInfo.url);\n              } else if (uploadInfo.error) {\n                ErrorReporter.uploadError(editor, uploadInfo.error);\n              }\n              return {\n                element: image,\n                status: uploadInfo.status\n              };\n            });\n            if (callback) {\n              callback(filteredResult);\n            }\n            return filteredResult;\n          }));\n        }));\n      };\n      var uploadImagesAuto = function (callback) {\n        if (Settings.isAutomaticUploadsEnabled(editor)) {\n          return uploadImages(callback);\n        }\n      };\n      var isValidDataUriImage = function (imgElm) {\n        if (forall(urlFilters, function (filter) {\n            return filter(imgElm);\n          }) === false) {\n          return false;\n        }\n        if (imgElm.getAttribute('src').indexOf('data:') === 0) {\n          var dataImgFilter = Settings.getImagesDataImgFilter(editor);\n          return dataImgFilter(imgElm);\n        }\n        return true;\n      };\n      var addFilter = function (filter) {\n        urlFilters.push(filter);\n      };\n      var scanForImages = function () {\n        if (!imageScanner) {\n          imageScanner = ImageScanner(uploadStatus, blobCache);\n        }\n        return imageScanner.findAll(editor.getBody(), isValidDataUriImage).then(aliveGuard(function (result) {\n          result = filter(result, function (resultItem) {\n            if (typeof resultItem === 'string') {\n              ErrorReporter.displayError(editor, resultItem);\n              return false;\n            }\n            return true;\n          });\n          each(result, function (resultItem) {\n            replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());\n            resultItem.image.src = resultItem.blobInfo.blobUri();\n            resultItem.image.removeAttribute('data-mce-src');\n          });\n          return result;\n        }));\n      };\n      var destroy = function () {\n        blobCache.destroy();\n        uploadStatus.destroy();\n        imageScanner = uploader = null;\n      };\n      var replaceBlobUris = function (content) {\n        return content.replace(/src=\"(blob:[^\"]+)\"/g, function (match, blobUri) {\n          var resultUri = uploadStatus.getResultUri(blobUri);\n          if (resultUri) {\n            return 'src=\"' + resultUri + '\"';\n          }\n          var blobInfo = blobCache.getByUri(blobUri);\n          if (!blobInfo) {\n            blobInfo = foldl(editor.editorManager.get(), function (result, editor) {\n              return result || editor.editorUpload && editor.editorUpload.blobCache.getByUri(blobUri);\n            }, null);\n          }\n          if (blobInfo) {\n            var blob = blobInfo.blob();\n            return 'src=\"data:' + blob.type + ';base64,' + blobInfo.base64() + '\"';\n          }\n          return match;\n        });\n      };\n      editor.on('SetContent', function () {\n        if (Settings.isAutomaticUploadsEnabled(editor)) {\n          uploadImagesAuto();\n        } else {\n          scanForImages();\n        }\n      });\n      editor.on('RawSaveContent', function (e) {\n        e.content = replaceBlobUris(e.content);\n      });\n      editor.on('GetContent', function (e) {\n        if (e.source_view || e.format === 'raw') {\n          return;\n        }\n        e.content = replaceBlobUris(e.content);\n      });\n      editor.on('PostRender', function () {\n        editor.parser.addNodeFilter('img', function (images) {\n          each(images, function (img) {\n            var src = img.attr('src');\n            if (blobCache.getByUri(src)) {\n              return;\n            }\n            var resultUri = uploadStatus.getResultUri(src);\n            if (resultUri) {\n              img.attr('src', resultUri);\n            }\n          });\n        });\n      });\n      return {\n        blobCache: blobCache,\n        addFilter: addFilter,\n        uploadImages: uploadImages,\n        uploadImagesAuto: uploadImagesAuto,\n        scanForImages: scanForImages,\n        destroy: destroy\n      };\n    };\n\n    var getLastChildren$1 = function (elm) {\n      var children = [];\n      var rawNode = elm.dom();\n      while (rawNode) {\n        children.push(Element.fromDom(rawNode));\n        rawNode = rawNode.lastChild;\n      }\n      return children;\n    };\n    var removeTrailingBr = function (elm) {\n      var allBrs = descendants$1(elm, 'br');\n      var brs = filter(getLastChildren$1(elm).slice(-1), isBr$1);\n      if (allBrs.length === brs.length) {\n        each(brs, remove);\n      }\n    };\n    var fillWithPaddingBr = function (elm) {\n      empty(elm);\n      append(elm, Element.fromHtml('<br data-mce-bogus=\"1\">'));\n    };\n    var isPaddingContents = function (elm) {\n      return isText(elm) ? get$7(elm) === nbsp : isBr$1(elm);\n    };\n    var isPaddedElement = function (elm) {\n      return filter(children(elm), isPaddingContents).length === 1;\n    };\n    var trimBlockTrailingBr = function (elm) {\n      lastChild(elm).each(function (lastChild) {\n        prevSibling(lastChild).each(function (lastChildPrevSibling) {\n          if (isBlock(elm) && isBr$1(lastChild) && isBlock(lastChildPrevSibling)) {\n            remove(lastChild);\n          }\n        });\n      });\n    };\n    var PaddingBr = {\n      removeTrailingBr: removeTrailingBr,\n      fillWithPaddingBr: fillWithPaddingBr,\n      isPaddedElement: isPaddedElement,\n      trimBlockTrailingBr: trimBlockTrailingBr\n    };\n\n    var isEq$2 = isEq;\n    var matchesUnInheritedFormatSelector = function (ed, node, name) {\n      var formatList = ed.formatter.get(name);\n      if (formatList) {\n        for (var i = 0; i < formatList.length; i++) {\n          if (formatList[i].inherit === false && ed.dom.is(node, formatList[i].selector)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n    var matchParents = function (editor, node, name, vars) {\n      var root = editor.dom.getRoot();\n      if (node === root) {\n        return false;\n      }\n      node = editor.dom.getParent(node, function (node) {\n        if (matchesUnInheritedFormatSelector(editor, node, name)) {\n          return true;\n        }\n        return node.parentNode === root || !!matchNode(editor, node, name, vars, true);\n      });\n      return matchNode(editor, node, name, vars);\n    };\n    var matchName = function (dom, node, format) {\n      if (isEq$2(node, format.inline)) {\n        return true;\n      }\n      if (isEq$2(node, format.block)) {\n        return true;\n      }\n      if (format.selector) {\n        return node.nodeType === 1 && dom.is(node, format.selector);\n      }\n    };\n    var matchItems = function (dom, node, format, itemName, similar, vars) {\n      var key, value;\n      var items = format[itemName];\n      var i;\n      if (format.onmatch) {\n        return format.onmatch(node, format, itemName);\n      }\n      if (items) {\n        if (typeof items.length === 'undefined') {\n          for (key in items) {\n            if (items.hasOwnProperty(key)) {\n              if (itemName === 'attributes') {\n                value = dom.getAttrib(node, key);\n              } else {\n                value = getStyle(dom, node, key);\n              }\n              if (similar && !value && !format.exact) {\n                return;\n              }\n              if ((!similar || format.exact) && !isEq$2(value, normalizeStyleValue(dom, replaceVars(items[key], vars), key))) {\n                return;\n              }\n            }\n          }\n        } else {\n          for (i = 0; i < items.length; i++) {\n            if (itemName === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(dom, node, items[i])) {\n              return format;\n            }\n          }\n        }\n      }\n      return format;\n    };\n    var matchNode = function (ed, node, name, vars, similar) {\n      var formatList = ed.formatter.get(name);\n      var format, i, x, classes;\n      var dom = ed.dom;\n      if (formatList && node) {\n        for (i = 0; i < formatList.length; i++) {\n          format = formatList[i];\n          if (matchName(ed.dom, node, format) && matchItems(dom, node, format, 'attributes', similar, vars) && matchItems(dom, node, format, 'styles', similar, vars)) {\n            if (classes = format.classes) {\n              for (x = 0; x < classes.length; x++) {\n                if (!ed.dom.hasClass(node, classes[x])) {\n                  return;\n                }\n              }\n            }\n            return format;\n          }\n        }\n      }\n    };\n    var match = function (editor, name, vars, node) {\n      var startNode;\n      if (node) {\n        return matchParents(editor, node, name, vars);\n      }\n      node = editor.selection.getNode();\n      if (matchParents(editor, node, name, vars)) {\n        return true;\n      }\n      startNode = editor.selection.getStart();\n      if (startNode !== node) {\n        if (matchParents(editor, startNode, name, vars)) {\n          return true;\n        }\n      }\n      return false;\n    };\n    var matchAll = function (editor, names, vars) {\n      var startElement;\n      var matchedFormatNames = [];\n      var checkedMap = {};\n      startElement = editor.selection.getStart();\n      editor.dom.getParent(startElement, function (node) {\n        var i, name;\n        for (i = 0; i < names.length; i++) {\n          name = names[i];\n          if (!checkedMap[name] && matchNode(editor, node, name, vars)) {\n            checkedMap[name] = true;\n            matchedFormatNames.push(name);\n          }\n        }\n      }, editor.dom.getRoot());\n      return matchedFormatNames;\n    };\n    var canApply = function (editor, name) {\n      var formatList = editor.formatter.get(name);\n      var startNode, parents, i, x, selector;\n      var dom = editor.dom;\n      if (formatList) {\n        startNode = editor.selection.getStart();\n        parents = getParents$1(dom, startNode);\n        for (x = formatList.length - 1; x >= 0; x--) {\n          selector = formatList[x].selector;\n          if (!selector || formatList[x].defaultBlock) {\n            return true;\n          }\n          for (i = parents.length - 1; i >= 0; i--) {\n            if (dom.is(parents[i], selector)) {\n              return true;\n            }\n          }\n        }\n      }\n      return false;\n    };\n\n    var splitText = function (node, offset) {\n      return node.splitText(offset);\n    };\n    var split$1 = function (rng) {\n      var startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset;\n      if (startContainer === endContainer && NodeType.isText(startContainer)) {\n        if (startOffset > 0 && startOffset < startContainer.nodeValue.length) {\n          endContainer = splitText(startContainer, startOffset);\n          startContainer = endContainer.previousSibling;\n          if (endOffset > startOffset) {\n            endOffset = endOffset - startOffset;\n            startContainer = endContainer = splitText(endContainer, endOffset).previousSibling;\n            endOffset = endContainer.nodeValue.length;\n            startOffset = 0;\n          } else {\n            endOffset = 0;\n          }\n        }\n      } else {\n        if (NodeType.isText(startContainer) && startOffset > 0 && startOffset < startContainer.nodeValue.length) {\n          startContainer = splitText(startContainer, startOffset);\n          startOffset = 0;\n        }\n        if (NodeType.isText(endContainer) && endOffset > 0 && endOffset < endContainer.nodeValue.length) {\n          endContainer = splitText(endContainer, endOffset).previousSibling;\n          endOffset = endContainer.nodeValue.length;\n        }\n      }\n      return {\n        startContainer: startContainer,\n        startOffset: startOffset,\n        endContainer: endContainer,\n        endOffset: endOffset\n      };\n    };\n\n    var normalizeContent = function (content, isStartOfContent, isEndOfContent) {\n      var result = foldl(content, function (acc, c) {\n        if (isWhiteSpace$1(c) || isNbsp(c)) {\n          if (acc.previousCharIsSpace || acc.str === '' && isStartOfContent || acc.str.length === content.length - 1 && isEndOfContent) {\n            return {\n              previousCharIsSpace: false,\n              str: acc.str + nbsp\n            };\n          } else {\n            return {\n              previousCharIsSpace: true,\n              str: acc.str + ' '\n            };\n          }\n        } else {\n          return {\n            previousCharIsSpace: false,\n            str: acc.str + c\n          };\n        }\n      }, {\n        previousCharIsSpace: false,\n        str: ''\n      });\n      return result.str;\n    };\n    var normalize$1 = function (node, offset, count) {\n      if (count === 0) {\n        return;\n      }\n      var whitespace = node.data.slice(offset, offset + count);\n      var isEndOfContent = offset + count >= node.data.length;\n      var isStartOfContent = offset === 0;\n      node.replaceData(offset, count, normalizeContent(whitespace, isStartOfContent, isEndOfContent));\n    };\n    var normalizeWhitespaceAfter = function (node, offset) {\n      var content = node.data.slice(offset);\n      var whitespaceCount = content.length - lTrim(content).length;\n      return normalize$1(node, offset, whitespaceCount);\n    };\n    var normalizeWhitespaceBefore = function (node, offset) {\n      var content = node.data.slice(0, offset);\n      var whitespaceCount = content.length - rTrim(content).length;\n      return normalize$1(node, offset - whitespaceCount, whitespaceCount);\n    };\n    var mergeTextNodes = function (prevNode, nextNode, normalizeWhitespace) {\n      var whitespaceOffset = rTrim(prevNode.data).length;\n      prevNode.appendData(nextNode.data);\n      remove(Element.fromDom(nextNode));\n      if (normalizeWhitespace) {\n        normalizeWhitespaceAfter(prevNode, whitespaceOffset);\n      }\n      return prevNode;\n    };\n\n    var ancestor$2 = function (scope, selector, isRoot) {\n      return ancestor$1(scope, selector, isRoot).isSome();\n    };\n\n    var hasWhitespacePreserveParent = function (rootNode, node) {\n      var rootElement = Element.fromDom(rootNode);\n      var startNode = Element.fromDom(node);\n      return ancestor$2(startNode, 'pre,code', curry(eq, rootElement));\n    };\n    var isWhitespace = function (rootNode, node) {\n      return NodeType.isText(node) && /^[ \\t\\r\\n]*$/.test(node.data) && hasWhitespacePreserveParent(rootNode, node) === false;\n    };\n    var isNamedAnchor = function (node) {\n      return NodeType.isElement(node) && node.nodeName === 'A' && node.hasAttribute('name');\n    };\n    var isContent$1 = function (rootNode, node) {\n      return isCaretCandidate(node) && isWhitespace(rootNode, node) === false || isNamedAnchor(node) || isBookmark(node);\n    };\n    var isBookmark = NodeType.hasAttribute('data-mce-bookmark');\n    var isBogus$2 = NodeType.hasAttribute('data-mce-bogus');\n    var isBogusAll$1 = NodeType.hasAttributeValue('data-mce-bogus', 'all');\n    var isEmptyNode = function (targetNode, skipBogus) {\n      var node, brCount = 0;\n      if (isContent$1(targetNode, targetNode)) {\n        return false;\n      } else {\n        node = targetNode.firstChild;\n        if (!node) {\n          return true;\n        }\n        var walker = new TreeWalker(node, targetNode);\n        do {\n          if (skipBogus) {\n            if (isBogusAll$1(node)) {\n              node = walker.next(true);\n              continue;\n            }\n            if (isBogus$2(node)) {\n              node = walker.next();\n              continue;\n            }\n          }\n          if (NodeType.isBr(node)) {\n            brCount++;\n            node = walker.next();\n            continue;\n          }\n          if (isContent$1(targetNode, node)) {\n            return false;\n          }\n          node = walker.next();\n        } while (node);\n        return brCount <= 1;\n      }\n    };\n    var isEmpty$2 = function (elm, skipBogus) {\n      if (skipBogus === void 0) {\n        skipBogus = true;\n      }\n      return isEmptyNode(elm.dom(), skipBogus);\n    };\n    var Empty = { isEmpty: isEmpty$2 };\n\n    var needsReposition = function (pos, elm) {\n      var container = pos.container();\n      var offset = pos.offset();\n      return CaretPosition$1.isTextPosition(pos) === false && container === elm.parentNode && offset > CaretPosition$1.before(elm).offset();\n    };\n    var reposition = function (elm, pos) {\n      return needsReposition(pos, elm) ? CaretPosition$1(pos.container(), pos.offset() - 1) : pos;\n    };\n    var beforeOrStartOf = function (node) {\n      return NodeType.isText(node) ? CaretPosition$1(node, 0) : CaretPosition$1.before(node);\n    };\n    var afterOrEndOf = function (node) {\n      return NodeType.isText(node) ? CaretPosition$1(node, node.data.length) : CaretPosition$1.after(node);\n    };\n    var getPreviousSiblingCaretPosition = function (elm) {\n      if (isCaretCandidate(elm.previousSibling)) {\n        return Option.some(afterOrEndOf(elm.previousSibling));\n      } else {\n        return elm.previousSibling ? CaretFinder.lastPositionIn(elm.previousSibling) : Option.none();\n      }\n    };\n    var getNextSiblingCaretPosition = function (elm) {\n      if (isCaretCandidate(elm.nextSibling)) {\n        return Option.some(beforeOrStartOf(elm.nextSibling));\n      } else {\n        return elm.nextSibling ? CaretFinder.firstPositionIn(elm.nextSibling) : Option.none();\n      }\n    };\n    var findCaretPositionBackwardsFromElm = function (rootElement, elm) {\n      var startPosition = CaretPosition$1.before(elm.previousSibling ? elm.previousSibling : elm.parentNode);\n      return CaretFinder.prevPosition(rootElement, startPosition).fold(function () {\n        return CaretFinder.nextPosition(rootElement, CaretPosition$1.after(elm));\n      }, Option.some);\n    };\n    var findCaretPositionForwardsFromElm = function (rootElement, elm) {\n      return CaretFinder.nextPosition(rootElement, CaretPosition$1.after(elm)).fold(function () {\n        return CaretFinder.prevPosition(rootElement, CaretPosition$1.before(elm));\n      }, Option.some);\n    };\n    var findCaretPositionBackwards = function (rootElement, elm) {\n      return getPreviousSiblingCaretPosition(elm).orThunk(function () {\n        return getNextSiblingCaretPosition(elm);\n      }).orThunk(function () {\n        return findCaretPositionBackwardsFromElm(rootElement, elm);\n      });\n    };\n    var findCaretPositionForward = function (rootElement, elm) {\n      return getNextSiblingCaretPosition(elm).orThunk(function () {\n        return getPreviousSiblingCaretPosition(elm);\n      }).orThunk(function () {\n        return findCaretPositionForwardsFromElm(rootElement, elm);\n      });\n    };\n    var findCaretPosition$1 = function (forward, rootElement, elm) {\n      return forward ? findCaretPositionForward(rootElement, elm) : findCaretPositionBackwards(rootElement, elm);\n    };\n    var findCaretPosOutsideElmAfterDelete = function (forward, rootElement, elm) {\n      return findCaretPosition$1(forward, rootElement, elm).map(curry(reposition, elm));\n    };\n    var setSelection = function (editor, forward, pos) {\n      pos.fold(function () {\n        editor.focus();\n      }, function (pos) {\n        editor.selection.setRng(pos.toRange(), forward);\n      });\n    };\n    var eqRawNode = function (rawNode) {\n      return function (elm) {\n        return elm.dom() === rawNode;\n      };\n    };\n    var isBlock$2 = function (editor, elm) {\n      return elm && editor.schema.getBlockElements().hasOwnProperty(name(elm));\n    };\n    var paddEmptyBlock = function (elm) {\n      if (Empty.isEmpty(elm)) {\n        var br = Element.fromHtml('<br data-mce-bogus=\"1\">');\n        empty(elm);\n        append(elm, br);\n        return Option.some(CaretPosition$1.before(br.dom()));\n      } else {\n        return Option.none();\n      }\n    };\n    var deleteNormalized = function (elm, afterDeletePosOpt, normalizeWhitespace) {\n      var prevTextOpt = prevSibling(elm).filter(isText);\n      var nextTextOpt = nextSibling(elm).filter(isText);\n      remove(elm);\n      return lift3(prevTextOpt, nextTextOpt, afterDeletePosOpt, function (prev, next, pos) {\n        var prevNode = prev.dom(), nextNode = next.dom();\n        var offset = prevNode.data.length;\n        mergeTextNodes(prevNode, nextNode, normalizeWhitespace);\n        return pos.container() === nextNode ? CaretPosition$1(prevNode, offset) : pos;\n      }).orThunk(function () {\n        if (normalizeWhitespace) {\n          prevTextOpt.each(function (elm) {\n            return normalizeWhitespaceBefore(elm.dom(), elm.dom().length);\n          });\n          nextTextOpt.each(function (elm) {\n            return normalizeWhitespaceAfter(elm.dom(), 0);\n          });\n        }\n        return afterDeletePosOpt;\n      });\n    };\n    var isInlineElement = function (editor, element) {\n      return has(editor.schema.getTextInlineElements(), name(element));\n    };\n    var deleteElement = function (editor, forward, elm, moveCaret) {\n      if (moveCaret === void 0) {\n        moveCaret = true;\n      }\n      var afterDeletePos = findCaretPosOutsideElmAfterDelete(forward, editor.getBody(), elm.dom());\n      var parentBlock = ancestor(elm, curry(isBlock$2, editor), eqRawNode(editor.getBody()));\n      var normalizedAfterDeletePos = deleteNormalized(elm, afterDeletePos, isInlineElement(editor, elm));\n      if (editor.dom.isEmpty(editor.getBody())) {\n        editor.setContent('');\n        editor.selection.setCursorLocation();\n      } else {\n        parentBlock.bind(paddEmptyBlock).fold(function () {\n          if (moveCaret) {\n            setSelection(editor, forward, normalizedAfterDeletePos);\n          }\n        }, function (paddPos) {\n          if (moveCaret) {\n            setSelection(editor, forward, Option.some(paddPos));\n          }\n        });\n      }\n    };\n    var DeleteElement = { deleteElement: deleteElement };\n\n    var ZWSP$1 = Zwsp.ZWSP, CARET_ID$1 = '_mce_caret';\n    var importNode = function (ownerDocument, node) {\n      return ownerDocument.importNode(node, true);\n    };\n    var getEmptyCaretContainers = function (node) {\n      var nodes = [];\n      while (node) {\n        if (node.nodeType === 3 && node.nodeValue !== ZWSP$1 || node.childNodes.length > 1) {\n          return [];\n        }\n        if (node.nodeType === 1) {\n          nodes.push(node);\n        }\n        node = node.firstChild;\n      }\n      return nodes;\n    };\n    var isCaretContainerEmpty = function (node) {\n      return getEmptyCaretContainers(node).length > 0;\n    };\n    var findFirstTextNode = function (node) {\n      if (node) {\n        var walker = new TreeWalker(node, node);\n        for (node = walker.current(); node; node = walker.next()) {\n          if (NodeType.isText(node)) {\n            return node;\n          }\n        }\n      }\n      return null;\n    };\n    var createCaretContainer = function (fill) {\n      var caretContainer = Element.fromTag('span');\n      setAll(caretContainer, {\n        'id': CARET_ID$1,\n        'data-mce-bogus': '1',\n        'data-mce-type': 'format-caret'\n      });\n      if (fill) {\n        append(caretContainer, Element.fromText(ZWSP$1));\n      }\n      return caretContainer;\n    };\n    var trimZwspFromCaretContainer = function (caretContainerNode) {\n      var textNode = findFirstTextNode(caretContainerNode);\n      if (textNode && textNode.nodeValue.charAt(0) === ZWSP$1) {\n        textNode.deleteData(0, 1);\n      }\n      return textNode;\n    };\n    var removeCaretContainerNode = function (editor, node, moveCaret) {\n      if (moveCaret === void 0) {\n        moveCaret = true;\n      }\n      var dom = editor.dom, selection = editor.selection;\n      if (isCaretContainerEmpty(node)) {\n        DeleteElement.deleteElement(editor, false, Element.fromDom(node), moveCaret);\n      } else {\n        var rng = selection.getRng();\n        var block = dom.getParent(node, dom.isBlock);\n        var textNode = trimZwspFromCaretContainer(node);\n        if (rng.startContainer === textNode && rng.startOffset > 0) {\n          rng.setStart(textNode, rng.startOffset - 1);\n        }\n        if (rng.endContainer === textNode && rng.endOffset > 0) {\n          rng.setEnd(textNode, rng.endOffset - 1);\n        }\n        dom.remove(node, true);\n        if (block && dom.isEmpty(block)) {\n          PaddingBr.fillWithPaddingBr(Element.fromDom(block));\n        }\n        selection.setRng(rng);\n      }\n    };\n    var removeCaretContainer = function (editor, node, moveCaret) {\n      if (moveCaret === void 0) {\n        moveCaret = true;\n      }\n      var dom = editor.dom, selection = editor.selection;\n      if (!node) {\n        node = getParentCaretContainer(editor.getBody(), selection.getStart());\n        if (!node) {\n          while (node = dom.get(CARET_ID$1)) {\n            removeCaretContainerNode(editor, node, false);\n          }\n        }\n      } else {\n        removeCaretContainerNode(editor, node, moveCaret);\n      }\n    };\n    var insertCaretContainerNode = function (editor, caretContainer, formatNode) {\n      var dom = editor.dom, block = dom.getParent(formatNode, curry(isTextBlock$1, editor));\n      if (block && dom.isEmpty(block)) {\n        formatNode.parentNode.replaceChild(caretContainer, formatNode);\n      } else {\n        PaddingBr.removeTrailingBr(Element.fromDom(formatNode));\n        if (dom.isEmpty(formatNode)) {\n          formatNode.parentNode.replaceChild(caretContainer, formatNode);\n        } else {\n          dom.insertAfter(caretContainer, formatNode);\n        }\n      }\n    };\n    var appendNode = function (parentNode, node) {\n      parentNode.appendChild(node);\n      return node;\n    };\n    var insertFormatNodesIntoCaretContainer = function (formatNodes, caretContainer) {\n      var innerMostFormatNode = foldr(formatNodes, function (parentNode, formatNode) {\n        return appendNode(parentNode, formatNode.cloneNode(false));\n      }, caretContainer);\n      return appendNode(innerMostFormatNode, innerMostFormatNode.ownerDocument.createTextNode(ZWSP$1));\n    };\n    var applyCaretFormat = function (editor, name, vars) {\n      var rng, caretContainer, textNode, offset, bookmark, container, text;\n      var selection = editor.selection;\n      rng = selection.getRng();\n      offset = rng.startOffset;\n      container = rng.startContainer;\n      text = container.nodeValue;\n      caretContainer = getParentCaretContainer(editor.getBody(), selection.getStart());\n      if (caretContainer) {\n        textNode = findFirstTextNode(caretContainer);\n      }\n      var wordcharRegex = /[^\\s\\u00a0\\u00ad\\u200b\\ufeff]/;\n      if (text && offset > 0 && offset < text.length && wordcharRegex.test(text.charAt(offset)) && wordcharRegex.test(text.charAt(offset - 1))) {\n        bookmark = selection.getBookmark();\n        rng.collapse(true);\n        rng = expandRng(editor, rng, editor.formatter.get(name));\n        rng = split$1(rng);\n        editor.formatter.apply(name, vars, rng);\n        selection.moveToBookmark(bookmark);\n      } else {\n        if (!caretContainer || textNode.nodeValue !== ZWSP$1) {\n          caretContainer = importNode(editor.getDoc(), createCaretContainer(true).dom());\n          textNode = caretContainer.firstChild;\n          rng.insertNode(caretContainer);\n          offset = 1;\n          editor.formatter.apply(name, vars, caretContainer);\n        } else {\n          editor.formatter.apply(name, vars, caretContainer);\n        }\n        selection.setCursorLocation(textNode, offset);\n      }\n    };\n    var removeCaretFormat = function (editor, name, vars, similar) {\n      var dom = editor.dom, selection = editor.selection;\n      var container, offset, bookmark;\n      var hasContentAfter, node, formatNode;\n      var parents = [], rng = selection.getRng();\n      var caretContainer;\n      container = rng.startContainer;\n      offset = rng.startOffset;\n      node = container;\n      if (container.nodeType === 3) {\n        if (offset !== container.nodeValue.length) {\n          hasContentAfter = true;\n        }\n        node = node.parentNode;\n      }\n      while (node) {\n        if (matchNode(editor, node, name, vars, similar)) {\n          formatNode = node;\n          break;\n        }\n        if (node.nextSibling) {\n          hasContentAfter = true;\n        }\n        parents.push(node);\n        node = node.parentNode;\n      }\n      if (!formatNode) {\n        return;\n      }\n      if (hasContentAfter) {\n        bookmark = selection.getBookmark();\n        rng.collapse(true);\n        var expandedRng = expandRng(editor, rng, editor.formatter.get(name), true);\n        expandedRng = split$1(expandedRng);\n        editor.formatter.remove(name, vars, expandedRng);\n        selection.moveToBookmark(bookmark);\n      } else {\n        caretContainer = getParentCaretContainer(editor.getBody(), formatNode);\n        var newCaretContainer = createCaretContainer(false).dom();\n        var caretNode = insertFormatNodesIntoCaretContainer(parents, newCaretContainer);\n        if (caretContainer) {\n          insertCaretContainerNode(editor, newCaretContainer, caretContainer);\n        } else {\n          insertCaretContainerNode(editor, newCaretContainer, formatNode);\n        }\n        removeCaretContainerNode(editor, caretContainer, false);\n        selection.setCursorLocation(caretNode, 1);\n        if (dom.isEmpty(formatNode)) {\n          dom.remove(formatNode);\n        }\n      }\n    };\n    var disableCaretContainer = function (editor, keyCode) {\n      var selection = editor.selection, body = editor.getBody();\n      removeCaretContainer(editor, null, false);\n      if ((keyCode === 8 || keyCode === 46) && selection.isCollapsed() && selection.getStart().innerHTML === ZWSP$1) {\n        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));\n      }\n      if (keyCode === 37 || keyCode === 39) {\n        removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));\n      }\n    };\n    var setup$3 = function (editor) {\n      editor.on('mouseup keydown', function (e) {\n        disableCaretContainer(editor, e.keyCode);\n      });\n    };\n    var replaceWithCaretFormat = function (targetNode, formatNodes) {\n      var caretContainer = createCaretContainer(false);\n      var innerMost = insertFormatNodesIntoCaretContainer(formatNodes, caretContainer.dom());\n      before(Element.fromDom(targetNode), caretContainer);\n      remove(Element.fromDom(targetNode));\n      return CaretPosition$1(innerMost, 0);\n    };\n    var isFormatElement = function (editor, element) {\n      var inlineElements = editor.schema.getTextInlineElements();\n      return inlineElements.hasOwnProperty(name(element)) && !isCaretNode(element.dom()) && !NodeType.isBogus(element.dom());\n    };\n    var isEmptyCaretFormatElement = function (element) {\n      return isCaretNode(element.dom()) && isCaretContainerEmpty(element.dom());\n    };\n\n    var postProcessHooks = {}, filter$4 = ArrUtils.filter, each$9 = ArrUtils.each;\n    var addPostProcessHook = function (name, hook) {\n      var hooks = postProcessHooks[name];\n      if (!hooks) {\n        postProcessHooks[name] = hooks = [];\n      }\n      postProcessHooks[name].push(hook);\n    };\n    var postProcess$1 = function (name, editor) {\n      each$9(postProcessHooks[name], function (hook) {\n        hook(editor);\n      });\n    };\n    addPostProcessHook('pre', function (editor) {\n      var rng = editor.selection.getRng();\n      var isPre, blocks;\n      var hasPreSibling = function (pre) {\n        return isPre(pre.previousSibling) && ArrUtils.indexOf(blocks, pre.previousSibling) !== -1;\n      };\n      var joinPre = function (pre1, pre2) {\n        DomQuery(pre2).remove();\n        DomQuery(pre1).append('<br><br>').append(pre2.childNodes);\n      };\n      isPre = NodeType.matchNodeNames(['pre']);\n      if (!rng.collapsed) {\n        blocks = editor.selection.getSelectedBlocks();\n        each$9(filter$4(filter$4(blocks, isPre), hasPreSibling), function (pre) {\n          joinPre(pre.previousSibling, pre);\n        });\n      }\n    });\n\n    var each$a = Tools.each;\n    var ElementUtils = function (dom) {\n      this.compare = function (node1, node2) {\n        if (node1.nodeName !== node2.nodeName) {\n          return false;\n        }\n        var getAttribs = function (node) {\n          var attribs = {};\n          each$a(dom.getAttribs(node), function (attr) {\n            var name = attr.nodeName.toLowerCase();\n            if (name.indexOf('_') !== 0 && name !== 'style' && name.indexOf('data-') !== 0) {\n              attribs[name] = dom.getAttrib(node, name);\n            }\n          });\n          return attribs;\n        };\n        var compareObjects = function (obj1, obj2) {\n          var value, name;\n          for (name in obj1) {\n            if (obj1.hasOwnProperty(name)) {\n              value = obj2[name];\n              if (typeof value === 'undefined') {\n                return false;\n              }\n              if (obj1[name] !== value) {\n                return false;\n              }\n              delete obj2[name];\n            }\n          }\n          for (name in obj2) {\n            if (obj2.hasOwnProperty(name)) {\n              return false;\n            }\n          }\n          return true;\n        };\n        if (!compareObjects(getAttribs(node1), getAttribs(node2))) {\n          return false;\n        }\n        if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) {\n          return false;\n        }\n        return !Bookmarks.isBookmarkNode(node1) && !Bookmarks.isBookmarkNode(node2);\n      };\n    };\n\n    var MCE_ATTR_RE = /^(src|href|style)$/;\n    var each$b = Tools.each;\n    var isEq$3 = isEq;\n    var isTableCell$3 = function (node) {\n      return /^(TH|TD)$/.test(node.nodeName);\n    };\n    var isChildOfInlineParent = function (dom, node, parent) {\n      return dom.isChildOf(node, parent) && node !== parent && !dom.isBlock(parent);\n    };\n    var getContainer = function (ed, rng, start) {\n      var container, offset;\n      container = rng[start ? 'startContainer' : 'endContainer'];\n      offset = rng[start ? 'startOffset' : 'endOffset'];\n      if (NodeType.isElement(container)) {\n        var lastIdx = container.childNodes.length - 1;\n        if (!start && offset) {\n          offset--;\n        }\n        container = container.childNodes[offset > lastIdx ? lastIdx : offset];\n      }\n      if (NodeType.isText(container) && start && offset >= container.nodeValue.length) {\n        container = new TreeWalker(container, ed.getBody()).next() || container;\n      }\n      if (NodeType.isText(container) && !start && offset === 0) {\n        container = new TreeWalker(container, ed.getBody()).prev() || container;\n      }\n      return container;\n    };\n    var wrap$3 = function (dom, node, name, attrs) {\n      var wrapper = dom.create(name, attrs);\n      node.parentNode.insertBefore(wrapper, node);\n      wrapper.appendChild(node);\n      return wrapper;\n    };\n    var wrapWithSiblings = function (dom, node, next, name, attrs) {\n      var start = Element.fromDom(node);\n      var wrapper = Element.fromDom(dom.create(name, attrs));\n      var siblings = next ? nextSiblings(start) : prevSiblings(start);\n      append$1(wrapper, siblings);\n      if (next) {\n        before(start, wrapper);\n        prepend(wrapper, start);\n      } else {\n        after(start, wrapper);\n        append(wrapper, start);\n      }\n      return wrapper.dom();\n    };\n    var matchName$1 = function (dom, node, format) {\n      if (isEq$3(node, format.inline)) {\n        return true;\n      }\n      if (isEq$3(node, format.block)) {\n        return true;\n      }\n      if (format.selector) {\n        return NodeType.isElement(node) && dom.is(node, format.selector);\n      }\n    };\n    var isColorFormatAndAnchor = function (node, format) {\n      return format.links && node.nodeName === 'A';\n    };\n    var find$4 = function (dom, node, next, inc) {\n      node = getNonWhiteSpaceSibling(node, next, inc);\n      return !node || (node.nodeName === 'BR' || dom.isBlock(node));\n    };\n    var removeNode$1 = function (ed, node, format) {\n      var parentNode = node.parentNode;\n      var rootBlockElm;\n      var dom = ed.dom, forcedRootBlock = Settings.getForcedRootBlock(ed);\n      if (format.block) {\n        if (!forcedRootBlock) {\n          if (dom.isBlock(node) && !dom.isBlock(parentNode)) {\n            if (!find$4(dom, node, false) && !find$4(dom, node.firstChild, true, true)) {\n              node.insertBefore(dom.create('br'), node.firstChild);\n            }\n            if (!find$4(dom, node, true) && !find$4(dom, node.lastChild, false, true)) {\n              node.appendChild(dom.create('br'));\n            }\n          }\n        } else {\n          if (parentNode === dom.getRoot()) {\n            if (!format.list_block || !isEq$3(node, format.list_block)) {\n              each$b(Tools.grep(node.childNodes), function (node) {\n                if (isValid(ed, forcedRootBlock, node.nodeName.toLowerCase())) {\n                  if (!rootBlockElm) {\n                    rootBlockElm = wrap$3(dom, node, forcedRootBlock);\n                    dom.setAttribs(rootBlockElm, ed.settings.forced_root_block_attrs);\n                  } else {\n                    rootBlockElm.appendChild(node);\n                  }\n                } else {\n                  rootBlockElm = 0;\n                }\n              });\n            }\n          }\n        }\n      }\n      if (format.selector && format.inline && !isEq$3(format.inline, node)) {\n        return;\n      }\n      dom.remove(node, true);\n    };\n    var removeFormat = function (ed, format, vars, node, compareNode) {\n      var stylesModified;\n      var dom = ed.dom;\n      if (!matchName$1(dom, node, format) && !isColorFormatAndAnchor(node, format)) {\n        return false;\n      }\n      var elm = node;\n      if (format.remove !== 'all') {\n        each$b(format.styles, function (value, name) {\n          value = normalizeStyleValue(dom, replaceVars(value, vars), name);\n          if (typeof name === 'number') {\n            name = value;\n            compareNode = null;\n          }\n          if (format.remove_similar || (!compareNode || isEq$3(getStyle(dom, compareNode, name), value))) {\n            dom.setStyle(elm, name, '');\n          }\n          stylesModified = true;\n        });\n        if (stylesModified && dom.getAttrib(elm, 'style') === '') {\n          elm.removeAttribute('style');\n          elm.removeAttribute('data-mce-style');\n        }\n        each$b(format.attributes, function (value, name) {\n          var valueOut;\n          value = replaceVars(value, vars);\n          if (typeof name === 'number') {\n            name = value;\n            compareNode = null;\n          }\n          if (format.remove_similar || (!compareNode || isEq$3(dom.getAttrib(compareNode, name), value))) {\n            if (name === 'class') {\n              value = dom.getAttrib(elm, name);\n              if (value) {\n                valueOut = '';\n                each$b(value.split(/\\s+/), function (cls) {\n                  if (/mce\\-\\w+/.test(cls)) {\n                    valueOut += (valueOut ? ' ' : '') + cls;\n                  }\n                });\n                if (valueOut) {\n                  dom.setAttrib(elm, name, valueOut);\n                  return;\n                }\n              }\n            }\n            if (name === 'class') {\n              elm.removeAttribute('className');\n            }\n            if (MCE_ATTR_RE.test(name)) {\n              elm.removeAttribute('data-mce-' + name);\n            }\n            elm.removeAttribute(name);\n          }\n        });\n        each$b(format.classes, function (value) {\n          value = replaceVars(value, vars);\n          if (!compareNode || dom.hasClass(compareNode, value)) {\n            dom.removeClass(elm, value);\n          }\n        });\n        var attrs = dom.getAttribs(elm);\n        for (var i = 0; i < attrs.length; i++) {\n          var attrName = attrs[i].nodeName;\n          if (attrName.indexOf('_') !== 0 && attrName.indexOf('data-') !== 0) {\n            return false;\n          }\n        }\n      }\n      if (format.remove !== 'none') {\n        removeNode$1(ed, elm, format);\n        return true;\n      }\n    };\n    var findFormatRoot = function (editor, container, name, vars, similar) {\n      var formatRoot;\n      each$b(getParents$1(editor.dom, container.parentNode).reverse(), function (parent) {\n        var format;\n        if (!formatRoot && parent.id !== '_start' && parent.id !== '_end') {\n          format = matchNode(editor, parent, name, vars, similar);\n          if (format && format.split !== false) {\n            formatRoot = parent;\n          }\n        }\n      });\n      return formatRoot;\n    };\n    var wrapAndSplit = function (editor, formatList, formatRoot, container, target, split, format, vars) {\n      var parent, clone, lastClone, firstClone, i, formatRootParent;\n      var dom = editor.dom;\n      if (formatRoot) {\n        formatRootParent = formatRoot.parentNode;\n        for (parent = container.parentNode; parent && parent !== formatRootParent; parent = parent.parentNode) {\n          clone = dom.clone(parent, false);\n          for (i = 0; i < formatList.length; i++) {\n            if (removeFormat(editor, formatList[i], vars, clone, clone)) {\n              clone = 0;\n              break;\n            }\n          }\n          if (clone) {\n            if (lastClone) {\n              clone.appendChild(lastClone);\n            }\n            if (!firstClone) {\n              firstClone = clone;\n            }\n            lastClone = clone;\n          }\n        }\n        if (split && (!format.mixed || !dom.isBlock(formatRoot))) {\n          container = dom.split(formatRoot, container);\n        }\n        if (lastClone) {\n          target.parentNode.insertBefore(lastClone, target);\n          firstClone.appendChild(target);\n        }\n      }\n      return container;\n    };\n    var remove$7 = function (ed, name, vars, node, similar) {\n      var formatList = ed.formatter.get(name), format = formatList[0];\n      var bookmark, rng, contentEditable = true;\n      var dom = ed.dom;\n      var selection = ed.selection;\n      var splitToFormatRoot = function (container) {\n        var formatRoot = findFormatRoot(ed, container, name, vars, similar);\n        return wrapAndSplit(ed, formatList, formatRoot, container, container, true, format, vars);\n      };\n      var isRemoveBookmarkNode = function (node) {\n        return Bookmarks.isBookmarkNode(node) && NodeType.isElement(node) && (node.id === '_start' || node.id === '_end');\n      };\n      var process = function (node) {\n        var children, i, l, lastContentEditable, hasContentEditableState;\n        if (NodeType.isElement(node) && dom.getContentEditable(node)) {\n          lastContentEditable = contentEditable;\n          contentEditable = dom.getContentEditable(node) === 'true';\n          hasContentEditableState = true;\n        }\n        children = Tools.grep(node.childNodes);\n        if (contentEditable && !hasContentEditableState) {\n          for (i = 0, l = formatList.length; i < l; i++) {\n            if (removeFormat(ed, formatList[i], vars, node, node)) {\n              break;\n            }\n          }\n        }\n        if (format.deep) {\n          if (children.length) {\n            for (i = 0, l = children.length; i < l; i++) {\n              process(children[i]);\n            }\n            if (hasContentEditableState) {\n              contentEditable = lastContentEditable;\n            }\n          }\n        }\n      };\n      var unwrap = function (start) {\n        var node = dom.get(start ? '_start' : '_end');\n        var out = node[start ? 'firstChild' : 'lastChild'];\n        if (isRemoveBookmarkNode(out)) {\n          out = out[start ? 'firstChild' : 'lastChild'];\n        }\n        if (NodeType.isText(out) && out.data.length === 0) {\n          out = start ? node.previousSibling || node.nextSibling : node.nextSibling || node.previousSibling;\n        }\n        dom.remove(node, true);\n        return out;\n      };\n      var removeRngStyle = function (rng) {\n        var startContainer, endContainer;\n        var commonAncestorContainer = rng.commonAncestorContainer;\n        var expandedRng = expandRng(ed, rng, formatList, true);\n        if (format.split) {\n          expandedRng = split$1(expandedRng);\n          startContainer = getContainer(ed, expandedRng, true);\n          endContainer = getContainer(ed, expandedRng);\n          if (startContainer !== endContainer) {\n            if (/^(TR|TH|TD)$/.test(startContainer.nodeName) && startContainer.firstChild) {\n              if (startContainer.nodeName === 'TR') {\n                startContainer = startContainer.firstChild.firstChild || startContainer;\n              } else {\n                startContainer = startContainer.firstChild || startContainer;\n              }\n            }\n            if (commonAncestorContainer && /^T(HEAD|BODY|FOOT|R)$/.test(commonAncestorContainer.nodeName) && isTableCell$3(endContainer) && endContainer.firstChild) {\n              endContainer = endContainer.firstChild || endContainer;\n            }\n            if (isChildOfInlineParent(dom, startContainer, endContainer)) {\n              var marker = Option.from(startContainer.firstChild).getOr(startContainer);\n              splitToFormatRoot(wrapWithSiblings(dom, marker, true, 'span', {\n                'id': '_start',\n                'data-mce-type': 'bookmark'\n              }));\n              unwrap(true);\n              return;\n            }\n            if (isChildOfInlineParent(dom, endContainer, startContainer)) {\n              var marker = Option.from(endContainer.lastChild).getOr(endContainer);\n              splitToFormatRoot(wrapWithSiblings(dom, marker, false, 'span', {\n                'id': '_end',\n                'data-mce-type': 'bookmark'\n              }));\n              unwrap(false);\n              return;\n            }\n            startContainer = wrap$3(dom, startContainer, 'span', {\n              'id': '_start',\n              'data-mce-type': 'bookmark'\n            });\n            endContainer = wrap$3(dom, endContainer, 'span', {\n              'id': '_end',\n              'data-mce-type': 'bookmark'\n            });\n            var newRng = dom.createRng();\n            newRng.setStartAfter(startContainer);\n            newRng.setEndBefore(endContainer);\n            RangeWalk.walk(dom, newRng, function (nodes) {\n              each(nodes, function (n) {\n                if (!Bookmarks.isBookmarkNode(n) && !Bookmarks.isBookmarkNode(n.parentNode)) {\n                  splitToFormatRoot(n);\n                }\n              });\n            });\n            splitToFormatRoot(startContainer);\n            splitToFormatRoot(endContainer);\n            startContainer = unwrap(true);\n            endContainer = unwrap();\n          } else {\n            startContainer = endContainer = splitToFormatRoot(startContainer);\n          }\n          expandedRng.startContainer = startContainer.parentNode ? startContainer.parentNode : startContainer;\n          expandedRng.startOffset = dom.nodeIndex(startContainer);\n          expandedRng.endContainer = endContainer.parentNode ? endContainer.parentNode : endContainer;\n          expandedRng.endOffset = dom.nodeIndex(endContainer) + 1;\n        }\n        RangeWalk.walk(dom, expandedRng, function (nodes) {\n          each$b(nodes, function (node) {\n            process(node);\n            if (NodeType.isElement(node) && ed.dom.getStyle(node, 'text-decoration') === 'underline' && node.parentNode && getTextDecoration(dom, node.parentNode) === 'underline') {\n              removeFormat(ed, {\n                deep: false,\n                exact: true,\n                inline: 'span',\n                styles: { textDecoration: 'underline' }\n              }, null, node);\n            }\n          });\n        });\n      };\n      if (node) {\n        if (isNode(node)) {\n          rng = dom.createRng();\n          rng.setStartBefore(node);\n          rng.setEndAfter(node);\n          removeRngStyle(rng);\n        } else {\n          removeRngStyle(node);\n        }\n        return;\n      }\n      if (dom.getContentEditable(selection.getNode()) === 'false') {\n        node = selection.getNode();\n        for (var i = 0, l = formatList.length; i < l; i++) {\n          if (formatList[i].ceFalseOverride) {\n            if (removeFormat(ed, formatList[i], vars, node, node)) {\n              break;\n            }\n          }\n        }\n        return;\n      }\n      if (!selection.isCollapsed() || !format.inline || dom.select('td[data-mce-selected],th[data-mce-selected]').length) {\n        bookmark = GetBookmark.getPersistentBookmark(ed.selection, true);\n        removeRngStyle(selection.getRng());\n        selection.moveToBookmark(bookmark);\n        if (format.inline && match(ed, name, vars, selection.getStart())) {\n          moveStart(dom, selection, selection.getRng());\n        }\n        ed.nodeChanged();\n      } else {\n        removeCaretFormat(ed, name, vars, similar);\n      }\n    };\n\n    var each$c = Tools.each;\n    var isElementNode = function (node) {\n      return NodeType.isElement(node) && !Bookmarks.isBookmarkNode(node) && !isCaretNode(node) && !NodeType.isBogus(node);\n    };\n    var findElementSibling = function (node, siblingName) {\n      var sibling;\n      for (sibling = node; sibling; sibling = sibling[siblingName]) {\n        if (NodeType.isText(sibling) && sibling.nodeValue.length !== 0) {\n          return node;\n        }\n        if (NodeType.isElement(sibling) && !Bookmarks.isBookmarkNode(sibling)) {\n          return sibling;\n        }\n      }\n      return node;\n    };\n    var mergeSiblingsNodes = function (dom, prev, next) {\n      var sibling, tmpSibling;\n      var elementUtils = new ElementUtils(dom);\n      if (prev && next) {\n        prev = findElementSibling(prev, 'previousSibling');\n        next = findElementSibling(next, 'nextSibling');\n        if (elementUtils.compare(prev, next)) {\n          for (sibling = prev.nextSibling; sibling && sibling !== next;) {\n            tmpSibling = sibling;\n            sibling = sibling.nextSibling;\n            prev.appendChild(tmpSibling);\n          }\n          dom.remove(next);\n          Tools.each(Tools.grep(next.childNodes), function (node) {\n            prev.appendChild(node);\n          });\n          return prev;\n        }\n      }\n      return next;\n    };\n    var processChildElements = function (node, filter, process) {\n      each$c(node.childNodes, function (node) {\n        if (isElementNode(node)) {\n          if (filter(node)) {\n            process(node);\n          }\n          if (node.hasChildNodes()) {\n            processChildElements(node, filter, process);\n          }\n        }\n      });\n    };\n    var hasStyle = function (dom, name) {\n      return curry(function (name, node) {\n        return !!(node && getStyle(dom, node, name));\n      }, name);\n    };\n    var applyStyle = function (dom, name, value) {\n      return curry(function (name, value, node) {\n        dom.setStyle(node, name, value);\n        if (node.getAttribute('style') === '') {\n          node.removeAttribute('style');\n        }\n        unwrapEmptySpan(dom, node);\n      }, name, value);\n    };\n    var unwrapEmptySpan = function (dom, node) {\n      if (node.nodeName === 'SPAN' && dom.getAttribs(node).length === 0) {\n        dom.remove(node, true);\n      }\n    };\n    var processTextDecorationsAndColor = function (dom, node) {\n      if (node.nodeType === 1 && node.parentNode && node.parentNode.nodeType === 1) {\n        var textDecoration = getTextDecoration(dom, node.parentNode);\n        if (dom.getStyle(node, 'color') && textDecoration) {\n          dom.setStyle(node, 'text-decoration', textDecoration);\n        } else if (dom.getStyle(node, 'text-decoration') === textDecoration) {\n          dom.setStyle(node, 'text-decoration', null);\n        }\n      }\n    };\n    var mergeTextDecorationsAndColor = function (dom, format, vars, node) {\n      if (format.styles && (format.styles.color || format.styles.textDecoration)) {\n        Tools.walk(node, curry(processTextDecorationsAndColor, dom), 'childNodes');\n        processTextDecorationsAndColor(dom, node);\n      }\n    };\n    var mergeBackgroundColorAndFontSize = function (dom, format, vars, node) {\n      if (format.styles && format.styles.backgroundColor) {\n        processChildElements(node, hasStyle(dom, 'fontSize'), applyStyle(dom, 'backgroundColor', replaceVars(format.styles.backgroundColor, vars)));\n      }\n    };\n    var mergeSubSup = function (dom, format, vars, node) {\n      if (format.inline === 'sub' || format.inline === 'sup') {\n        processChildElements(node, hasStyle(dom, 'fontSize'), applyStyle(dom, 'fontSize', ''));\n        dom.remove(dom.select(format.inline === 'sup' ? 'sub' : 'sup', node), true);\n      }\n    };\n    var mergeSiblings = function (dom, format, vars, node) {\n      if (node && format.merge_siblings !== false) {\n        node = mergeSiblingsNodes(dom, getNonWhiteSpaceSibling(node), node);\n        node = mergeSiblingsNodes(dom, node, getNonWhiteSpaceSibling(node, true));\n      }\n    };\n    var clearChildStyles = function (dom, format, node) {\n      if (format.clear_child_styles) {\n        var selector = format.links ? '*:not(a)' : '*';\n        each$c(dom.select(selector, node), function (node) {\n          if (isElementNode(node)) {\n            each$c(format.styles, function (value, name) {\n              dom.setStyle(node, name, '');\n            });\n          }\n        });\n      }\n    };\n    var mergeWithChildren = function (editor, formatList, vars, node) {\n      each$c(formatList, function (format) {\n        each$c(editor.dom.select(format.inline, node), function (child) {\n          if (!isElementNode(child)) {\n            return;\n          }\n          removeFormat(editor, format, vars, child, format.exact ? child : null);\n        });\n        clearChildStyles(editor.dom, format, node);\n      });\n    };\n    var mergeWithParents = function (editor, format, name, vars, node) {\n      if (matchNode(editor, node.parentNode, name, vars)) {\n        if (removeFormat(editor, format, vars, node)) {\n          return;\n        }\n      }\n      if (format.merge_with_parents) {\n        editor.dom.getParent(node.parentNode, function (parent) {\n          if (matchNode(editor, parent, name, vars)) {\n            removeFormat(editor, format, vars, node);\n            return true;\n          }\n        });\n      }\n    };\n\n    var createRange$1 = function (sc, so, ec, eo) {\n      var rng = domGlobals.document.createRange();\n      rng.setStart(sc, so);\n      rng.setEnd(ec, eo);\n      return rng;\n    };\n    var normalizeBlockSelectionRange = function (rng) {\n      var startPos = CaretPosition$1.fromRangeStart(rng);\n      var endPos = CaretPosition$1.fromRangeEnd(rng);\n      var rootNode = rng.commonAncestorContainer;\n      return CaretFinder.fromPosition(false, rootNode, endPos).map(function (newEndPos) {\n        if (!isInSameBlock(startPos, endPos, rootNode) && isInSameBlock(startPos, newEndPos, rootNode)) {\n          return createRange$1(startPos.container(), startPos.offset(), newEndPos.container(), newEndPos.offset());\n        } else {\n          return rng;\n        }\n      }).getOr(rng);\n    };\n    var normalize$2 = function (rng) {\n      return rng.collapsed ? rng : normalizeBlockSelectionRange(rng);\n    };\n    var RangeNormalizer = { normalize: normalize$2 };\n\n    var each$d = Tools.each;\n    var isElementNode$1 = function (node) {\n      return node && node.nodeType === 1 && !Bookmarks.isBookmarkNode(node) && !isCaretNode(node) && !NodeType.isBogus(node);\n    };\n    var applyFormat = function (ed, name, vars, node) {\n      var formatList = ed.formatter.get(name);\n      var format = formatList[0];\n      var bookmark, rng;\n      var isCollapsed = !node && ed.selection.isCollapsed();\n      var dom = ed.dom, selection = ed.selection;\n      var setElementFormat = function (elm, fmt) {\n        fmt = fmt || format;\n        if (elm) {\n          if (fmt.onformat) {\n            fmt.onformat(elm, fmt, vars, node);\n          }\n          each$d(fmt.styles, function (value, name) {\n            dom.setStyle(elm, name, replaceVars(value, vars));\n          });\n          if (fmt.styles) {\n            var styleVal = dom.getAttrib(elm, 'style');\n            if (styleVal) {\n              dom.setAttrib(elm, 'data-mce-style', styleVal);\n            }\n          }\n          each$d(fmt.attributes, function (value, name) {\n            dom.setAttrib(elm, name, replaceVars(value, vars));\n          });\n          each$d(fmt.classes, function (value) {\n            value = replaceVars(value, vars);\n            if (!dom.hasClass(elm, value)) {\n              dom.addClass(elm, value);\n            }\n          });\n        }\n      };\n      var applyNodeStyle = function (formatList, node) {\n        var found = false;\n        if (!format.selector) {\n          return false;\n        }\n        each$d(formatList, function (format) {\n          if ('collapsed' in format && format.collapsed !== isCollapsed) {\n            return;\n          }\n          if (dom.is(node, format.selector) && !isCaretNode(node)) {\n            setElementFormat(node, format);\n            found = true;\n            return false;\n          }\n        });\n        return found;\n      };\n      var applyRngStyle = function (dom, rng, bookmark, nodeSpecific) {\n        var newWrappers = [];\n        var wrapName, wrapElm, contentEditable = true;\n        wrapName = format.inline || format.block;\n        wrapElm = dom.create(wrapName);\n        setElementFormat(wrapElm);\n        RangeWalk.walk(dom, rng, function (nodes) {\n          var currentWrapElm;\n          var process = function (node) {\n            var hasContentEditableState = false;\n            var lastContentEditable = contentEditable;\n            var nodeName = node.nodeName.toLowerCase();\n            var parentName = node.parentNode.nodeName.toLowerCase();\n            if (NodeType.isElement(node) && dom.getContentEditable(node)) {\n              lastContentEditable = contentEditable;\n              contentEditable = dom.getContentEditable(node) === 'true';\n              hasContentEditableState = true;\n            }\n            if (isEq(nodeName, 'br')) {\n              currentWrapElm = 0;\n              if (format.block) {\n                dom.remove(node);\n              }\n              return;\n            }\n            if (format.wrapper && matchNode(ed, node, name, vars)) {\n              currentWrapElm = 0;\n              return;\n            }\n            if (contentEditable && !hasContentEditableState && format.block && !format.wrapper && isTextBlock$1(ed, nodeName) && isValid(ed, parentName, wrapName)) {\n              node = dom.rename(node, wrapName);\n              setElementFormat(node);\n              newWrappers.push(node);\n              currentWrapElm = 0;\n              return;\n            }\n            if (format.selector) {\n              var found = applyNodeStyle(formatList, node);\n              if (!format.inline || found) {\n                currentWrapElm = 0;\n                return;\n              }\n            }\n            if (contentEditable && !hasContentEditableState && isValid(ed, wrapName, nodeName) && isValid(ed, parentName, wrapName) && !(!nodeSpecific && node.nodeType === 3 && node.nodeValue.length === 1 && node.nodeValue.charCodeAt(0) === 65279) && !isCaretNode(node) && (!format.inline || !dom.isBlock(node))) {\n              if (!currentWrapElm) {\n                currentWrapElm = dom.clone(wrapElm, false);\n                node.parentNode.insertBefore(currentWrapElm, node);\n                newWrappers.push(currentWrapElm);\n              }\n              currentWrapElm.appendChild(node);\n            } else {\n              currentWrapElm = 0;\n              each$d(Tools.grep(node.childNodes), process);\n              if (hasContentEditableState) {\n                contentEditable = lastContentEditable;\n              }\n              currentWrapElm = 0;\n            }\n          };\n          each$d(nodes, process);\n        });\n        if (format.links === true) {\n          each$d(newWrappers, function (node) {\n            var process = function (node) {\n              if (node.nodeName === 'A') {\n                setElementFormat(node, format);\n              }\n              each$d(Tools.grep(node.childNodes), process);\n            };\n            process(node);\n          });\n        }\n        each$d(newWrappers, function (node) {\n          var childCount;\n          var getChildCount = function (node) {\n            var count = 0;\n            each$d(node.childNodes, function (node) {\n              if (!isEmptyTextNode(node) && !Bookmarks.isBookmarkNode(node)) {\n                count++;\n              }\n            });\n            return count;\n          };\n          var getChildElementNode = function (root) {\n            var child = false;\n            each$d(root.childNodes, function (node) {\n              if (isElementNode$1(node)) {\n                child = node;\n                return false;\n              }\n            });\n            return child;\n          };\n          var mergeStyles = function (node) {\n            var child, clone;\n            child = getChildElementNode(node);\n            if (child && !Bookmarks.isBookmarkNode(child) && matchName(dom, child, format)) {\n              clone = dom.clone(child, false);\n              setElementFormat(clone);\n              dom.replace(clone, node, true);\n              dom.remove(child, true);\n            }\n            return clone || node;\n          };\n          childCount = getChildCount(node);\n          if ((newWrappers.length > 1 || !dom.isBlock(node)) && childCount === 0) {\n            dom.remove(node, true);\n            return;\n          }\n          if (format.inline || format.wrapper) {\n            if (!format.exact && childCount === 1) {\n              node = mergeStyles(node);\n            }\n            mergeWithChildren(ed, formatList, vars, node);\n            mergeWithParents(ed, format, name, vars, node);\n            mergeBackgroundColorAndFontSize(dom, format, vars, node);\n            mergeTextDecorationsAndColor(dom, format, vars, node);\n            mergeSubSup(dom, format, vars, node);\n            mergeSiblings(dom, format, vars, node);\n          }\n        });\n      };\n      if (dom.getContentEditable(selection.getNode()) === 'false') {\n        node = selection.getNode();\n        for (var i = 0, l = formatList.length; i < l; i++) {\n          if (formatList[i].ceFalseOverride && dom.is(node, formatList[i].selector)) {\n            setElementFormat(node, formatList[i]);\n            return;\n          }\n        }\n        return;\n      }\n      if (format) {\n        if (node) {\n          if (isNode(node)) {\n            if (!applyNodeStyle(formatList, node)) {\n              rng = dom.createRng();\n              rng.setStartBefore(node);\n              rng.setEndAfter(node);\n              applyRngStyle(dom, expandRng(ed, rng, formatList), null, true);\n            }\n          } else {\n            applyRngStyle(dom, node, null, true);\n          }\n        } else {\n          if (!isCollapsed || !format.inline || dom.select('td[data-mce-selected],th[data-mce-selected]').length) {\n            var curSelNode = ed.selection.getNode();\n            if (!ed.settings.forced_root_block && formatList[0].defaultBlock && !dom.getParent(curSelNode, dom.isBlock)) {\n              applyFormat(ed, formatList[0].defaultBlock);\n            }\n            ed.selection.setRng(RangeNormalizer.normalize(ed.selection.getRng()));\n            bookmark = GetBookmark.getPersistentBookmark(ed.selection, true);\n            applyRngStyle(dom, expandRng(ed, selection.getRng(), formatList));\n            selection.moveToBookmark(bookmark);\n            moveStart(dom, selection, selection.getRng());\n            ed.nodeChanged();\n          } else {\n            applyCaretFormat(ed, name, vars);\n          }\n        }\n        postProcess$1(name, ed);\n      }\n    };\n\n    var setup$4 = function (registeredFormatListeners, editor) {\n      var currentFormats = Cell({});\n      registeredFormatListeners.set({});\n      editor.on('NodeChange', function (e) {\n        updateAndFireChangeCallbacks(editor, e.element, currentFormats, registeredFormatListeners.get());\n      });\n    };\n    var updateAndFireChangeCallbacks = function (editor, elm, currentFormats, formatChangeData) {\n      var formatsList = keys(currentFormats.get());\n      var newFormats = {};\n      var matchedFormats = {};\n      var parents = filter(getParents$1(editor.dom, elm), function (node) {\n        return node.nodeType === 1 && !node.getAttribute('data-mce-bogus');\n      });\n      each$1(formatChangeData, function (data, format) {\n        Tools.each(parents, function (node) {\n          if (editor.formatter.matchNode(node, format, {}, data.similar)) {\n            if (formatsList.indexOf(format) === -1) {\n              each(data.callbacks, function (callback) {\n                callback(true, {\n                  node: node,\n                  format: format,\n                  parents: parents\n                });\n              });\n              newFormats[format] = data.callbacks;\n            }\n            matchedFormats[format] = data.callbacks;\n            return false;\n          }\n          if (matchesUnInheritedFormatSelector(editor, node, format)) {\n            return false;\n          }\n        });\n      });\n      var remainingFormats = filterRemainingFormats(currentFormats.get(), matchedFormats, elm, parents);\n      currentFormats.set(__assign(__assign({}, newFormats), remainingFormats));\n    };\n    var filterRemainingFormats = function (currentFormats, matchedFormats, elm, parents) {\n      return bifilter(currentFormats, function (callbacks, format) {\n        if (!has(matchedFormats, format)) {\n          each(callbacks, function (callback) {\n            callback(false, {\n              node: elm,\n              format: format,\n              parents: parents\n            });\n          });\n          return false;\n        } else {\n          return true;\n        }\n      }).t;\n    };\n    var addListeners = function (registeredFormatListeners, formats, callback, similar) {\n      var formatChangeItems = registeredFormatListeners.get();\n      each(formats.split(','), function (format) {\n        if (!formatChangeItems[format]) {\n          formatChangeItems[format] = {\n            similar: similar,\n            callbacks: []\n          };\n        }\n        formatChangeItems[format].callbacks.push(callback);\n      });\n      registeredFormatListeners.set(formatChangeItems);\n    };\n    var removeListeners = function (registeredFormatListeners, formats, callback) {\n      var formatChangeItems = registeredFormatListeners.get();\n      each(formats.split(','), function (format) {\n        formatChangeItems[format].callbacks = filter(formatChangeItems[format].callbacks, function (c) {\n          return c !== callback;\n        });\n        if (formatChangeItems[format].callbacks.length === 0) {\n          delete formatChangeItems[format];\n        }\n      });\n      registeredFormatListeners.set(formatChangeItems);\n    };\n    var formatChanged = function (editor, registeredFormatListeners, formats, callback, similar) {\n      if (registeredFormatListeners.get() === null) {\n        setup$4(registeredFormatListeners, editor);\n      }\n      addListeners(registeredFormatListeners, formats, callback, similar);\n      return {\n        unbind: function () {\n          return removeListeners(registeredFormatListeners, formats, callback);\n        }\n      };\n    };\n\n    var get$9 = function (dom) {\n      var formats = {\n        valigntop: [{\n            selector: 'td,th',\n            styles: { verticalAlign: 'top' }\n          }],\n        valignmiddle: [{\n            selector: 'td,th',\n            styles: { verticalAlign: 'middle' }\n          }],\n        valignbottom: [{\n            selector: 'td,th',\n            styles: { verticalAlign: 'bottom' }\n          }],\n        alignleft: [\n          {\n            selector: 'figure.image',\n            collapsed: false,\n            classes: 'align-left',\n            ceFalseOverride: true,\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',\n            styles: { textAlign: 'left' },\n            inherit: false,\n            preview: false,\n            defaultBlock: 'div'\n          },\n          {\n            selector: 'img,table',\n            collapsed: false,\n            styles: { float: 'left' },\n            preview: 'font-family font-size'\n          }\n        ],\n        aligncenter: [\n          {\n            selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',\n            styles: { textAlign: 'center' },\n            inherit: false,\n            preview: 'font-family font-size',\n            defaultBlock: 'div'\n          },\n          {\n            selector: 'figure.image',\n            collapsed: false,\n            classes: 'align-center',\n            ceFalseOverride: true,\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'img',\n            collapsed: false,\n            styles: {\n              display: 'block',\n              marginLeft: 'auto',\n              marginRight: 'auto'\n            },\n            preview: false\n          },\n          {\n            selector: 'table',\n            collapsed: false,\n            styles: {\n              marginLeft: 'auto',\n              marginRight: 'auto'\n            },\n            preview: 'font-family font-size'\n          }\n        ],\n        alignright: [\n          {\n            selector: 'figure.image',\n            collapsed: false,\n            classes: 'align-right',\n            ceFalseOverride: true,\n            preview: 'font-family font-size'\n          },\n          {\n            selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',\n            styles: { textAlign: 'right' },\n            inherit: false,\n            preview: 'font-family font-size',\n            defaultBlock: 'div'\n          },\n          {\n            selector: 'img,table',\n            collapsed: false,\n            styles: { float: 'right' },\n            preview: 'font-family font-size'\n          }\n        ],\n        alignjustify: [{\n            selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',\n            styles: { textAlign: 'justify' },\n            inherit: false,\n            defaultBlock: 'div',\n            preview: 'font-family font-size'\n          }],\n        bold: [\n          {\n            inline: 'strong',\n            remove: 'all'\n          },\n          {\n            inline: 'span',\n            styles: { fontWeight: 'bold' }\n          },\n          {\n            inline: 'b',\n            remove: 'all'\n          }\n        ],\n        italic: [\n          {\n            inline: 'em',\n            remove: 'all'\n          },\n          {\n            inline: 'span',\n            styles: { fontStyle: 'italic' }\n          },\n          {\n            inline: 'i',\n            remove: 'all'\n          }\n        ],\n        underline: [\n          {\n            inline: 'span',\n            styles: { textDecoration: 'underline' },\n            exact: true\n          },\n          {\n            inline: 'u',\n            remove: 'all'\n          }\n        ],\n        strikethrough: [\n          {\n            inline: 'span',\n            styles: { textDecoration: 'line-through' },\n            exact: true\n          },\n          {\n            inline: 'strike',\n            remove: 'all'\n          }\n        ],\n        forecolor: {\n          inline: 'span',\n          styles: { color: '%value' },\n          links: true,\n          remove_similar: true,\n          clear_child_styles: true\n        },\n        hilitecolor: {\n          inline: 'span',\n          styles: { backgroundColor: '%value' },\n          links: true,\n          remove_similar: true,\n          clear_child_styles: true\n        },\n        fontname: {\n          inline: 'span',\n          toggle: false,\n          styles: { fontFamily: '%value' },\n          clear_child_styles: true\n        },\n        fontsize: {\n          inline: 'span',\n          toggle: false,\n          styles: { fontSize: '%value' },\n          clear_child_styles: true\n        },\n        fontsize_class: {\n          inline: 'span',\n          attributes: { class: '%value' }\n        },\n        blockquote: {\n          block: 'blockquote',\n          wrapper: true,\n          remove: 'all'\n        },\n        subscript: { inline: 'sub' },\n        superscript: { inline: 'sup' },\n        code: { inline: 'code' },\n        link: {\n          inline: 'a',\n          selector: 'a',\n          remove: 'all',\n          split: true,\n          deep: true,\n          onmatch: function () {\n            return true;\n          },\n          onformat: function (elm, fmt, vars) {\n            Tools.each(vars, function (value, key) {\n              dom.setAttrib(elm, key, value);\n            });\n          }\n        },\n        removeformat: [\n          {\n            selector: 'b,strong,em,i,font,u,strike,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins',\n            remove: 'all',\n            split: true,\n            expand: false,\n            block_expand: true,\n            deep: true\n          },\n          {\n            selector: 'span',\n            attributes: [\n              'style',\n              'class'\n            ],\n            remove: 'empty',\n            split: true,\n            expand: false,\n            deep: true\n          },\n          {\n            selector: '*',\n            attributes: [\n              'style',\n              'class'\n            ],\n            split: false,\n            expand: false,\n            deep: true\n          }\n        ]\n      };\n      Tools.each('p h1 h2 h3 h4 h5 h6 div address pre div dt dd samp'.split(/\\s/), function (name) {\n        formats[name] = {\n          block: name,\n          remove: 'all'\n        };\n      });\n      return formats;\n    };\n    var DefaultFormats = { get: get$9 };\n\n    function FormatRegistry(editor) {\n      var formats = {};\n      var get = function (name) {\n        return name ? formats[name] : formats;\n      };\n      var has$1 = function (name) {\n        return has(formats, name);\n      };\n      var register = function (name, format) {\n        if (name) {\n          if (typeof name !== 'string') {\n            Tools.each(name, function (format, name) {\n              register(name, format);\n            });\n          } else {\n            if (!isArray(format)) {\n              format = [format];\n            }\n            Tools.each(format, function (format) {\n              if (typeof format.deep === 'undefined') {\n                format.deep = !format.selector;\n              }\n              if (typeof format.split === 'undefined') {\n                format.split = !format.selector || format.inline;\n              }\n              if (typeof format.remove === 'undefined' && format.selector && !format.inline) {\n                format.remove = 'none';\n              }\n              if (format.selector && format.inline) {\n                format.mixed = true;\n                format.block_expand = true;\n              }\n              if (typeof format.classes === 'string') {\n                format.classes = format.classes.split(/\\s+/);\n              }\n            });\n            formats[name] = format;\n          }\n        }\n      };\n      var unregister = function (name) {\n        if (name && formats[name]) {\n          delete formats[name];\n        }\n        return formats;\n      };\n      register(DefaultFormats.get(editor.dom));\n      register(editor.settings.formats);\n      return {\n        get: get,\n        has: has$1,\n        register: register,\n        unregister: unregister\n      };\n    }\n\n    var each$e = Tools.each;\n    var dom = DOMUtils$1.DOM;\n    var parsedSelectorToHtml = function (ancestry, editor) {\n      var elm, item, fragment;\n      var schema = editor && editor.schema || Schema({});\n      var decorate = function (elm, item) {\n        if (item.classes.length) {\n          dom.addClass(elm, item.classes.join(' '));\n        }\n        dom.setAttribs(elm, item.attrs);\n      };\n      var createElement = function (sItem) {\n        var elm;\n        item = typeof sItem === 'string' ? {\n          name: sItem,\n          classes: [],\n          attrs: {}\n        } : sItem;\n        elm = dom.create(item.name);\n        decorate(elm, item);\n        return elm;\n      };\n      var getRequiredParent = function (elm, candidate) {\n        var name = typeof elm !== 'string' ? elm.nodeName.toLowerCase() : elm;\n        var elmRule = schema.getElementRule(name);\n        var parentsRequired = elmRule && elmRule.parentsRequired;\n        if (parentsRequired && parentsRequired.length) {\n          return candidate && Tools.inArray(parentsRequired, candidate) !== -1 ? candidate : parentsRequired[0];\n        } else {\n          return false;\n        }\n      };\n      var wrapInHtml = function (elm, ancestry, siblings) {\n        var parent, parentCandidate, parentRequired;\n        var ancestor = ancestry.length > 0 && ancestry[0];\n        var ancestorName = ancestor && ancestor.name;\n        parentRequired = getRequiredParent(elm, ancestorName);\n        if (parentRequired) {\n          if (ancestorName === parentRequired) {\n            parentCandidate = ancestry[0];\n            ancestry = ancestry.slice(1);\n          } else {\n            parentCandidate = parentRequired;\n          }\n        } else if (ancestor) {\n          parentCandidate = ancestry[0];\n          ancestry = ancestry.slice(1);\n        } else if (!siblings) {\n          return elm;\n        }\n        if (parentCandidate) {\n          parent = createElement(parentCandidate);\n          parent.appendChild(elm);\n        }\n        if (siblings) {\n          if (!parent) {\n            parent = dom.create('div');\n            parent.appendChild(elm);\n          }\n          Tools.each(siblings, function (sibling) {\n            var siblingElm = createElement(sibling);\n            parent.insertBefore(siblingElm, elm);\n          });\n        }\n        return wrapInHtml(parent, ancestry, parentCandidate && parentCandidate.siblings);\n      };\n      if (ancestry && ancestry.length) {\n        item = ancestry[0];\n        elm = createElement(item);\n        fragment = dom.create('div');\n        fragment.appendChild(wrapInHtml(elm, ancestry.slice(1), item.siblings));\n        return fragment;\n      } else {\n        return '';\n      }\n    };\n    var parseSelectorItem = function (item) {\n      var tagName;\n      var obj = {\n        classes: [],\n        attrs: {}\n      };\n      item = obj.selector = Tools.trim(item);\n      if (item !== '*') {\n        tagName = item.replace(/(?:([#\\.]|::?)([\\w\\-]+)|(\\[)([^\\]]+)\\]?)/g, function ($0, $1, $2, $3, $4) {\n          switch ($1) {\n          case '#':\n            obj.attrs.id = $2;\n            break;\n          case '.':\n            obj.classes.push($2);\n            break;\n          case ':':\n            if (Tools.inArray('checked disabled enabled read-only required'.split(' '), $2) !== -1) {\n              obj.attrs[$2] = $2;\n            }\n            break;\n          }\n          if ($3 === '[') {\n            var m = $4.match(/([\\w\\-]+)(?:\\=\\\"([^\\\"]+))?/);\n            if (m) {\n              obj.attrs[m[1]] = m[2];\n            }\n          }\n          return '';\n        });\n      }\n      obj.name = tagName || 'div';\n      return obj;\n    };\n    var parseSelector = function (selector) {\n      if (!selector || typeof selector !== 'string') {\n        return [];\n      }\n      selector = selector.split(/\\s*,\\s*/)[0];\n      selector = selector.replace(/\\s*(~\\+|~|\\+|>)\\s*/g, '$1');\n      return Tools.map(selector.split(/(?:>|\\s+(?![^\\[\\]]+\\]))/), function (item) {\n        var siblings = Tools.map(item.split(/(?:~\\+|~|\\+)/), parseSelectorItem);\n        var obj = siblings.pop();\n        if (siblings.length) {\n          obj.siblings = siblings;\n        }\n        return obj;\n      }).reverse();\n    };\n    var getCssText = function (editor, format) {\n      var name, previewFrag, previewElm, items;\n      var previewCss = '', parentFontSize, previewStyles;\n      previewStyles = editor.settings.preview_styles;\n      if (previewStyles === false) {\n        return '';\n      }\n      if (typeof previewStyles !== 'string') {\n        previewStyles = 'font-family font-size font-weight font-style text-decoration ' + 'text-transform color background-color border border-radius outline text-shadow';\n      }\n      var removeVars = function (val) {\n        return val.replace(/%(\\w+)/g, '');\n      };\n      if (typeof format === 'string') {\n        format = editor.formatter.get(format);\n        if (!format) {\n          return;\n        }\n        format = format[0];\n      }\n      if ('preview' in format) {\n        previewStyles = format.preview;\n        if (previewStyles === false) {\n          return '';\n        }\n      }\n      name = format.block || format.inline || 'span';\n      items = parseSelector(format.selector);\n      if (items.length) {\n        if (!items[0].name) {\n          items[0].name = name;\n        }\n        name = format.selector;\n        previewFrag = parsedSelectorToHtml(items, editor);\n      } else {\n        previewFrag = parsedSelectorToHtml([name], editor);\n      }\n      previewElm = dom.select(name, previewFrag)[0] || previewFrag.firstChild;\n      each$e(format.styles, function (value, name) {\n        value = removeVars(value);\n        if (value) {\n          dom.setStyle(previewElm, name, value);\n        }\n      });\n      each$e(format.attributes, function (value, name) {\n        value = removeVars(value);\n        if (value) {\n          dom.setAttrib(previewElm, name, value);\n        }\n      });\n      each$e(format.classes, function (value) {\n        value = removeVars(value);\n        if (!dom.hasClass(previewElm, value)) {\n          dom.addClass(previewElm, value);\n        }\n      });\n      editor.fire('PreviewFormats');\n      dom.setStyles(previewFrag, {\n        position: 'absolute',\n        left: -65535\n      });\n      editor.getBody().appendChild(previewFrag);\n      parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true);\n      parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;\n      each$e(previewStyles.split(' '), function (name) {\n        var value = dom.getStyle(previewElm, name, true);\n        if (name === 'background-color' && /transparent|rgba\\s*\\([^)]+,\\s*0\\)/.test(value)) {\n          value = dom.getStyle(editor.getBody(), name, true);\n          if (dom.toHex(value).toLowerCase() === '#ffffff') {\n            return;\n          }\n        }\n        if (name === 'color') {\n          if (dom.toHex(value).toLowerCase() === '#000000') {\n            return;\n          }\n        }\n        if (name === 'font-size') {\n          if (/em|%$/.test(value)) {\n            if (parentFontSize === 0) {\n              return;\n            }\n            var numValue = parseFloat(value) / (/%$/.test(value) ? 100 : 1);\n            value = numValue * parentFontSize + 'px';\n          }\n        }\n        if (name === 'border' && value) {\n          previewCss += 'padding:0 2px;';\n        }\n        previewCss += name + ':' + value + ';';\n      });\n      editor.fire('AfterPreviewFormats');\n      dom.remove(previewFrag);\n      return previewCss;\n    };\n\n    var toggle = function (editor, formats, name, vars, node) {\n      var fmt = formats.get(name);\n      if (match(editor, name, vars, node) && (!('toggle' in fmt[0]) || fmt[0].toggle)) {\n        remove$7(editor, name, vars, node);\n      } else {\n        applyFormat(editor, name, vars, node);\n      }\n    };\n\n    var setup$5 = function (editor) {\n      editor.addShortcut('meta+b', '', 'Bold');\n      editor.addShortcut('meta+i', '', 'Italic');\n      editor.addShortcut('meta+u', '', 'Underline');\n      for (var i = 1; i <= 6; i++) {\n        editor.addShortcut('access+' + i, '', [\n          'FormatBlock',\n          false,\n          'h' + i\n        ]);\n      }\n      editor.addShortcut('access+7', '', [\n        'FormatBlock',\n        false,\n        'p'\n      ]);\n      editor.addShortcut('access+8', '', [\n        'FormatBlock',\n        false,\n        'div'\n      ]);\n      editor.addShortcut('access+9', '', [\n        'FormatBlock',\n        false,\n        'address'\n      ]);\n    };\n    var FormatShortcuts = { setup: setup$5 };\n\n    var Formatter = function (editor) {\n      var formats = FormatRegistry(editor);\n      var formatChangeState = Cell(null);\n      FormatShortcuts.setup(editor);\n      setup$3(editor);\n      return {\n        get: formats.get,\n        has: formats.has,\n        register: formats.register,\n        unregister: formats.unregister,\n        apply: curry(applyFormat, editor),\n        remove: curry(remove$7, editor),\n        toggle: curry(toggle, editor, formats),\n        match: curry(match, editor),\n        matchAll: curry(matchAll, editor),\n        matchNode: curry(matchNode, editor),\n        canApply: curry(canApply, editor),\n        formatChanged: curry(formatChanged, editor, formatChangeState),\n        getCssText: curry(getCssText, editor)\n      };\n    };\n\n    var KEEP = 0, INSERT = 1, DELETE = 2;\n    var diff = function (left, right) {\n      var size = left.length + right.length + 2;\n      var vDown = new Array(size);\n      var vUp = new Array(size);\n      var snake = function (start, end, diag) {\n        return {\n          start: start,\n          end: end,\n          diag: diag\n        };\n      };\n      var buildScript = function (start1, end1, start2, end2, script) {\n        var middle = getMiddleSnake(start1, end1, start2, end2);\n        if (middle === null || middle.start === end1 && middle.diag === end1 - end2 || middle.end === start1 && middle.diag === start1 - start2) {\n          var i = start1;\n          var j = start2;\n          while (i < end1 || j < end2) {\n            if (i < end1 && j < end2 && left[i] === right[j]) {\n              script.push([\n                KEEP,\n                left[i]\n              ]);\n              ++i;\n              ++j;\n            } else {\n              if (end1 - start1 > end2 - start2) {\n                script.push([\n                  DELETE,\n                  left[i]\n                ]);\n                ++i;\n              } else {\n                script.push([\n                  INSERT,\n                  right[j]\n                ]);\n                ++j;\n              }\n            }\n          }\n        } else {\n          buildScript(start1, middle.start, start2, middle.start - middle.diag, script);\n          for (var i2 = middle.start; i2 < middle.end; ++i2) {\n            script.push([\n              KEEP,\n              left[i2]\n            ]);\n          }\n          buildScript(middle.end, end1, middle.end - middle.diag, end2, script);\n        }\n      };\n      var buildSnake = function (start, diag, end1, end2) {\n        var end = start;\n        while (end - diag < end2 && end < end1 && left[end] === right[end - diag]) {\n          ++end;\n        }\n        return snake(start, end, diag);\n      };\n      var getMiddleSnake = function (start1, end1, start2, end2) {\n        var m = end1 - start1;\n        var n = end2 - start2;\n        if (m === 0 || n === 0) {\n          return null;\n        }\n        var delta = m - n;\n        var sum = n + m;\n        var offset = (sum % 2 === 0 ? sum : sum + 1) / 2;\n        vDown[1 + offset] = start1;\n        vUp[1 + offset] = end1 + 1;\n        var d, k, i, x, y;\n        for (d = 0; d <= offset; ++d) {\n          for (k = -d; k <= d; k += 2) {\n            i = k + offset;\n            if (k === -d || k !== d && vDown[i - 1] < vDown[i + 1]) {\n              vDown[i] = vDown[i + 1];\n            } else {\n              vDown[i] = vDown[i - 1] + 1;\n            }\n            x = vDown[i];\n            y = x - start1 + start2 - k;\n            while (x < end1 && y < end2 && left[x] === right[y]) {\n              vDown[i] = ++x;\n              ++y;\n            }\n            if (delta % 2 !== 0 && delta - d <= k && k <= delta + d) {\n              if (vUp[i - delta] <= vDown[i]) {\n                return buildSnake(vUp[i - delta], k + start1 - start2, end1, end2);\n              }\n            }\n          }\n          for (k = delta - d; k <= delta + d; k += 2) {\n            i = k + offset - delta;\n            if (k === delta - d || k !== delta + d && vUp[i + 1] <= vUp[i - 1]) {\n              vUp[i] = vUp[i + 1] - 1;\n            } else {\n              vUp[i] = vUp[i - 1];\n            }\n            x = vUp[i] - 1;\n            y = x - start1 + start2 - k;\n            while (x >= start1 && y >= start2 && left[x] === right[y]) {\n              vUp[i] = x--;\n              y--;\n            }\n            if (delta % 2 === 0 && -d <= k && k <= d) {\n              if (vUp[i] <= vDown[i + delta]) {\n                return buildSnake(vUp[i], k + start1 - start2, end1, end2);\n              }\n            }\n          }\n        }\n      };\n      var script = [];\n      buildScript(0, left.length, 0, right.length, script);\n      return script;\n    };\n    var Diff = {\n      KEEP: KEEP,\n      DELETE: DELETE,\n      INSERT: INSERT,\n      diff: diff\n    };\n\n    var getOuterHtml = function (elm) {\n      if (NodeType.isElement(elm)) {\n        return elm.outerHTML;\n      } else if (NodeType.isText(elm)) {\n        return Entities.encodeRaw(elm.data, false);\n      } else if (NodeType.isComment(elm)) {\n        return '<!--' + elm.data + '-->';\n      }\n      return '';\n    };\n    var createFragment$1 = function (html) {\n      var frag, node, container;\n      container = domGlobals.document.createElement('div');\n      frag = domGlobals.document.createDocumentFragment();\n      if (html) {\n        container.innerHTML = html;\n      }\n      while (node = container.firstChild) {\n        frag.appendChild(node);\n      }\n      return frag;\n    };\n    var insertAt = function (elm, html, index) {\n      var fragment = createFragment$1(html);\n      if (elm.hasChildNodes() && index < elm.childNodes.length) {\n        var target = elm.childNodes[index];\n        target.parentNode.insertBefore(fragment, target);\n      } else {\n        elm.appendChild(fragment);\n      }\n    };\n    var removeAt = function (elm, index) {\n      if (elm.hasChildNodes() && index < elm.childNodes.length) {\n        var target = elm.childNodes[index];\n        target.parentNode.removeChild(target);\n      }\n    };\n    var applyDiff = function (diff, elm) {\n      var index = 0;\n      each(diff, function (action) {\n        if (action[0] === Diff.KEEP) {\n          index++;\n        } else if (action[0] === Diff.INSERT) {\n          insertAt(elm, action[1], index);\n          index++;\n        } else if (action[0] === Diff.DELETE) {\n          removeAt(elm, index);\n        }\n      });\n    };\n    var read$2 = function (elm) {\n      return filter(map(from$1(elm.childNodes), getOuterHtml), function (item) {\n        return item.length > 0;\n      });\n    };\n    var write = function (fragments, elm) {\n      var currentFragments = map(from$1(elm.childNodes), getOuterHtml);\n      applyDiff(Diff.diff(currentFragments, fragments), elm);\n      return elm;\n    };\n    var Fragments = {\n      read: read$2,\n      write: write\n    };\n\n    var undoLevelDocument = Cell(Option.none());\n    var lazyTempDocument = function () {\n      return undoLevelDocument.get().getOrThunk(function () {\n        var doc = domGlobals.document.implementation.createHTMLDocument('undo');\n        undoLevelDocument.set(Option.some(doc));\n        return doc;\n      });\n    };\n    var hasIframes = function (html) {\n      return html.indexOf('</iframe>') !== -1;\n    };\n    var createFragmentedLevel = function (fragments) {\n      return {\n        type: 'fragmented',\n        fragments: fragments,\n        content: '',\n        bookmark: null,\n        beforeBookmark: null\n      };\n    };\n    var createCompleteLevel = function (content) {\n      return {\n        type: 'complete',\n        fragments: null,\n        content: content,\n        bookmark: null,\n        beforeBookmark: null\n      };\n    };\n    var createFromEditor = function (editor) {\n      var fragments, content, trimmedFragments;\n      fragments = Fragments.read(editor.getBody());\n      trimmedFragments = bind(fragments, function (html) {\n        var trimmed = TrimHtml.trimInternal(editor.serializer, html);\n        return trimmed.length > 0 ? [trimmed] : [];\n      });\n      content = trimmedFragments.join('');\n      return hasIframes(content) ? createFragmentedLevel(trimmedFragments) : createCompleteLevel(content);\n    };\n    var applyToEditor = function (editor, level, before) {\n      if (level.type === 'fragmented') {\n        Fragments.write(level.fragments, editor.getBody());\n      } else {\n        editor.setContent(level.content, { format: 'raw' });\n      }\n      editor.selection.moveToBookmark(before ? level.beforeBookmark : level.bookmark);\n    };\n    var getLevelContent = function (level) {\n      return level.type === 'fragmented' ? level.fragments.join('') : level.content;\n    };\n    var getCleanLevelContent = function (level) {\n      var elm = Element.fromTag('body', lazyTempDocument());\n      set$1(elm, getLevelContent(level));\n      each(descendants$1(elm, '*[data-mce-bogus]'), unwrap);\n      return get$6(elm);\n    };\n    var hasEqualContent = function (level1, level2) {\n      return getLevelContent(level1) === getLevelContent(level2);\n    };\n    var hasEqualCleanedContent = function (level1, level2) {\n      return getCleanLevelContent(level1) === getCleanLevelContent(level2);\n    };\n    var isEq$4 = function (level1, level2) {\n      if (!level1 || !level2) {\n        return false;\n      } else if (hasEqualContent(level1, level2)) {\n        return true;\n      } else {\n        return hasEqualCleanedContent(level1, level2);\n      }\n    };\n    var Levels = {\n      createFragmentedLevel: createFragmentedLevel,\n      createCompleteLevel: createCompleteLevel,\n      createFromEditor: createFromEditor,\n      applyToEditor: applyToEditor,\n      isEq: isEq$4\n    };\n\n    var isUnlocked = function (locks) {\n      return locks.get() === 0;\n    };\n\n    var setTyping = function (undoManager, typing, locks) {\n      if (isUnlocked(locks)) {\n        undoManager.typing = typing;\n      }\n    };\n    var endTyping = function (undoManager, locks) {\n      if (undoManager.typing) {\n        setTyping(undoManager, false, locks);\n        undoManager.add();\n      }\n    };\n    var endTypingLevelIgnoreLocks = function (undoManager) {\n      if (undoManager.typing) {\n        undoManager.typing = false;\n        undoManager.add();\n      }\n    };\n\n    var beforeChange = function (editor, locks, beforeBookmark) {\n      if (isUnlocked(locks)) {\n        beforeBookmark.set(Option.some(GetBookmark.getUndoBookmark(editor.selection)));\n      }\n    };\n    var addUndoLevel = function (editor, undoManager, index, locks, beforeBookmark, level, event) {\n      var settings = editor.settings;\n      var currentLevel = Levels.createFromEditor(editor);\n      level = level || {};\n      level = Tools.extend(level, currentLevel);\n      if (isUnlocked(locks) === false || editor.removed) {\n        return null;\n      }\n      var lastLevel = undoManager.data[index.get()];\n      if (editor.fire('BeforeAddUndo', {\n          level: level,\n          lastLevel: lastLevel,\n          originalEvent: event\n        }).isDefaultPrevented()) {\n        return null;\n      }\n      if (lastLevel && Levels.isEq(lastLevel, level)) {\n        return null;\n      }\n      if (undoManager.data[index.get()]) {\n        beforeBookmark.get().each(function (bm) {\n          undoManager.data[index.get()].beforeBookmark = bm;\n        });\n      }\n      if (settings.custom_undo_redo_levels) {\n        if (undoManager.data.length > settings.custom_undo_redo_levels) {\n          for (var i = 0; i < undoManager.data.length - 1; i++) {\n            undoManager.data[i] = undoManager.data[i + 1];\n          }\n          undoManager.data.length--;\n          index.set(undoManager.data.length);\n        }\n      }\n      level.bookmark = GetBookmark.getUndoBookmark(editor.selection);\n      if (index.get() < undoManager.data.length - 1) {\n        undoManager.data.length = index.get() + 1;\n      }\n      undoManager.data.push(level);\n      index.set(undoManager.data.length - 1);\n      var args = {\n        level: level,\n        lastLevel: lastLevel,\n        originalEvent: event\n      };\n      editor.fire('AddUndo', args);\n      if (index.get() > 0) {\n        editor.setDirty(true);\n        editor.fire('change', args);\n      }\n      return level;\n    };\n    var clear = function (editor, undoManager, index) {\n      undoManager.data = [];\n      index.set(0);\n      undoManager.typing = false;\n      editor.fire('ClearUndos');\n    };\n    var extra = function (editor, undoManager, index, callback1, callback2) {\n      if (undoManager.transact(callback1)) {\n        var bookmark = undoManager.data[index.get()].bookmark;\n        var lastLevel = undoManager.data[index.get() - 1];\n        Levels.applyToEditor(editor, lastLevel, true);\n        if (undoManager.transact(callback2)) {\n          undoManager.data[index.get() - 1].beforeBookmark = bookmark;\n        }\n      }\n    };\n    var redo = function (editor, index, data) {\n      var level;\n      if (index.get() < data.length - 1) {\n        index.set(index.get() + 1);\n        level = data[index.get()];\n        Levels.applyToEditor(editor, level, false);\n        editor.setDirty(true);\n        editor.fire('Redo', { level: level });\n      }\n      return level;\n    };\n    var undo = function (editor, undoManager, locks, index) {\n      var level;\n      if (undoManager.typing) {\n        undoManager.add();\n        undoManager.typing = false;\n        setTyping(undoManager, false, locks);\n      }\n      if (index.get() > 0) {\n        index.set(index.get() - 1);\n        level = undoManager.data[index.get()];\n        Levels.applyToEditor(editor, level, true);\n        editor.setDirty(true);\n        editor.fire('Undo', { level: level });\n      }\n      return level;\n    };\n    var reset = function (undoManager) {\n      undoManager.clear();\n      undoManager.add();\n    };\n    var hasUndo = function (editor, undoManager, index) {\n      return index.get() > 0 || undoManager.typing && undoManager.data[0] && !Levels.isEq(Levels.createFromEditor(editor), undoManager.data[0]);\n    };\n    var hasRedo = function (undoManager, index) {\n      return index.get() < undoManager.data.length - 1 && !undoManager.typing;\n    };\n    var transact = function (undoManager, locks, callback) {\n      endTyping(undoManager, locks);\n      undoManager.beforeChange();\n      undoManager.ignore(callback);\n      return undoManager.add();\n    };\n    var ignore = function (locks, callback) {\n      try {\n        locks.set(locks.get() + 1);\n        callback();\n      } finally {\n        locks.set(locks.get() - 1);\n      }\n    };\n\n    var registerEvents$1 = function (editor, undoManager, locks) {\n      var isFirstTypedCharacter = Cell(false);\n      var addNonTypingUndoLevel = function (e) {\n        setTyping(undoManager, false, locks);\n        undoManager.add({}, e);\n      };\n      editor.on('init', function () {\n        undoManager.add();\n      });\n      editor.on('BeforeExecCommand', function (e) {\n        var cmd = e.command;\n        if (cmd !== 'Undo' && cmd !== 'Redo' && cmd !== 'mceRepaint') {\n          endTyping(undoManager, locks);\n          undoManager.beforeChange();\n        }\n      });\n      editor.on('ExecCommand', function (e) {\n        var cmd = e.command;\n        if (cmd !== 'Undo' && cmd !== 'Redo' && cmd !== 'mceRepaint') {\n          addNonTypingUndoLevel(e);\n        }\n      });\n      editor.on('ObjectResizeStart cut', function () {\n        undoManager.beforeChange();\n      });\n      editor.on('SaveContent ObjectResized blur', addNonTypingUndoLevel);\n      editor.on('dragend', addNonTypingUndoLevel);\n      editor.on('keyup', function (e) {\n        var keyCode = e.keyCode;\n        if (e.isDefaultPrevented()) {\n          return;\n        }\n        if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45 || e.ctrlKey) {\n          addNonTypingUndoLevel();\n          editor.nodeChanged();\n        }\n        if (keyCode === 46 || keyCode === 8) {\n          editor.nodeChanged();\n        }\n        if (isFirstTypedCharacter.get() && undoManager.typing && Levels.isEq(Levels.createFromEditor(editor), undoManager.data[0]) === false) {\n          if (editor.isDirty() === false) {\n            editor.setDirty(true);\n            editor.fire('change', {\n              level: undoManager.data[0],\n              lastLevel: null\n            });\n          }\n          editor.fire('TypingUndo');\n          isFirstTypedCharacter.set(false);\n          editor.nodeChanged();\n        }\n      });\n      editor.on('keydown', function (e) {\n        var keyCode = e.keyCode;\n        if (e.isDefaultPrevented()) {\n          return;\n        }\n        if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45) {\n          if (undoManager.typing) {\n            addNonTypingUndoLevel(e);\n          }\n          return;\n        }\n        var modKey = e.ctrlKey && !e.altKey || e.metaKey;\n        if ((keyCode < 16 || keyCode > 20) && keyCode !== 224 && keyCode !== 91 && !undoManager.typing && !modKey) {\n          undoManager.beforeChange();\n          setTyping(undoManager, true, locks);\n          undoManager.add({}, e);\n          isFirstTypedCharacter.set(true);\n        }\n      });\n      editor.on('mousedown', function (e) {\n        if (undoManager.typing) {\n          addNonTypingUndoLevel(e);\n        }\n      });\n      var isInsertReplacementText = function (event) {\n        return event.inputType === 'insertReplacementText';\n      };\n      var isInsertTextDataNull = function (event) {\n        return event.inputType === 'insertText' && event.data === null;\n      };\n      editor.on('input', function (e) {\n        if (e.inputType && (isInsertReplacementText(e) || isInsertTextDataNull(e))) {\n          addNonTypingUndoLevel(e);\n        }\n      });\n      editor.on('AddUndo Undo Redo ClearUndos', function (e) {\n        if (!e.isDefaultPrevented()) {\n          editor.nodeChanged();\n        }\n      });\n    };\n    var addKeyboardShortcuts = function (editor) {\n      editor.addShortcut('meta+z', '', 'Undo');\n      editor.addShortcut('meta+y,meta+shift+z', '', 'Redo');\n    };\n\n    var UndoManager = function (editor) {\n      var beforeBookmark = Cell(Option.none());\n      var locks = Cell(0);\n      var index = Cell(0);\n      var undoManager = {\n        data: [],\n        typing: false,\n        beforeChange: function () {\n          beforeChange(editor, locks, beforeBookmark);\n        },\n        add: function (level, event) {\n          return addUndoLevel(editor, undoManager, index, locks, beforeBookmark, level, event);\n        },\n        undo: function () {\n          return undo(editor, undoManager, locks, index);\n        },\n        redo: function () {\n          return redo(editor, index, undoManager.data);\n        },\n        clear: function () {\n          clear(editor, undoManager, index);\n        },\n        reset: function () {\n          reset(undoManager);\n        },\n        hasUndo: function () {\n          return hasUndo(editor, undoManager, index);\n        },\n        hasRedo: function () {\n          return hasRedo(undoManager, index);\n        },\n        transact: function (callback) {\n          return transact(undoManager, locks, callback);\n        },\n        ignore: function (callback) {\n          ignore(locks, callback);\n        },\n        extra: function (callback1, callback2) {\n          extra(editor, undoManager, index, callback1, callback2);\n        }\n      };\n      registerEvents$1(editor, undoManager, locks);\n      addKeyboardShortcuts(editor);\n      return undoManager;\n    };\n\n    var nonTypingKeycodes = [\n      9,\n      27,\n      VK.HOME,\n      VK.END,\n      19,\n      20,\n      44,\n      144,\n      145,\n      33,\n      34,\n      45,\n      16,\n      17,\n      18,\n      91,\n      92,\n      93,\n      VK.DOWN,\n      VK.UP,\n      VK.LEFT,\n      VK.RIGHT\n    ].concat(Env.browser.isFirefox() ? [224] : []);\n    var placeholderAttr = 'data-mce-placeholder';\n    var isKeyboardEvent = function (e) {\n      return e.type === 'keydown' || e.type === 'keyup';\n    };\n    var isDeleteEvent = function (e) {\n      var keyCode = e.keyCode;\n      return keyCode === VK.BACKSPACE || keyCode === VK.DELETE;\n    };\n    var isNonTypingKeyboardEvent = function (e) {\n      if (isKeyboardEvent(e)) {\n        var keyCode = e.keyCode;\n        return !isDeleteEvent(e) && (VK.metaKeyPressed(e) || e.altKey || keyCode >= 112 && keyCode <= 123 || contains(nonTypingKeycodes, keyCode));\n      } else {\n        return false;\n      }\n    };\n    var isTypingKeyboardEvent = function (e) {\n      return isKeyboardEvent(e) && !(isDeleteEvent(e) || e.type === 'keyup' && e.keyCode === 229);\n    };\n    var isVisuallyEmpty = function (dom, rootElm, forcedRootBlock) {\n      if (Empty.isEmpty(Element.fromDom(rootElm), false)) {\n        var isForcedRootBlockFalse = forcedRootBlock === '';\n        var firstElement = rootElm.firstElementChild;\n        if (!firstElement) {\n          return true;\n        } else if (dom.getStyle(rootElm.firstElementChild, 'padding-left') || dom.getStyle(rootElm.firstElementChild, 'padding-right')) {\n          return false;\n        } else {\n          return isForcedRootBlockFalse ? !dom.isBlock(firstElement) : forcedRootBlock === firstElement.nodeName.toLowerCase();\n        }\n      } else {\n        return false;\n      }\n    };\n    var setup$6 = function (editor) {\n      var dom = editor.dom;\n      var rootBlock = Settings.getForcedRootBlock(editor);\n      var placeholder = Settings.getPlaceholder(editor);\n      var updatePlaceholder = function (e, initial) {\n        if (isNonTypingKeyboardEvent(e)) {\n          return;\n        }\n        var body = editor.getBody();\n        var showPlaceholder = isTypingKeyboardEvent(e) ? false : isVisuallyEmpty(dom, body, rootBlock);\n        var isPlaceholderShown = dom.getAttrib(body, placeholderAttr) !== '';\n        if (isPlaceholderShown !== showPlaceholder || initial) {\n          dom.setAttrib(body, placeholderAttr, showPlaceholder ? placeholder : null);\n          dom.setAttrib(body, 'aria-placeholder', showPlaceholder ? placeholder : null);\n          firePlaceholderToggle(editor, showPlaceholder);\n          editor.on(showPlaceholder ? 'keydown' : 'keyup', updatePlaceholder);\n          editor.off(showPlaceholder ? 'keyup' : 'keydown', updatePlaceholder);\n        }\n      };\n      if (placeholder) {\n        editor.on('init', function (e) {\n          updatePlaceholder(e, true);\n          editor.on('change SetContent ExecCommand', updatePlaceholder);\n          editor.on('remove', function () {\n            var body = editor.getBody();\n            dom.setAttrib(body, placeholderAttr, null);\n            dom.setAttrib(body, 'aria-placeholder', null);\n          });\n        });\n      }\n    };\n\n    var SIGNIFICANT_MOVE = 5;\n    var LONGPRESS_DELAY = 400;\n    var getTouch = function (event) {\n      if (event.touches === undefined || event.touches.length !== 1) {\n        return Option.none();\n      }\n      return Option.some(event.touches[0]);\n    };\n    var isFarEnough = function (touch, data) {\n      var distX = Math.abs(touch.clientX - data.x());\n      var distY = Math.abs(touch.clientY - data.y());\n      return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;\n    };\n    var setup$7 = function (editor) {\n      var startData = Cell(Option.none());\n      var longpressFired = Cell(false);\n      var debounceLongpress = last$2(function (e) {\n        editor.fire('longpress', __assign(__assign({}, e), { type: 'longpress' }));\n        longpressFired.set(true);\n      }, LONGPRESS_DELAY);\n      editor.on('touchstart', function (e) {\n        getTouch(e).each(function (touch) {\n          debounceLongpress.cancel();\n          var data = {\n            x: constant(touch.clientX),\n            y: constant(touch.clientY),\n            target: constant(e.target)\n          };\n          debounceLongpress.throttle(e);\n          longpressFired.set(false);\n          startData.set(Option.some(data));\n        });\n      }, true);\n      editor.on('touchmove', function (e) {\n        debounceLongpress.cancel();\n        getTouch(e).each(function (touch) {\n          startData.get().each(function (data) {\n            if (isFarEnough(touch, data)) {\n              startData.set(Option.none());\n              longpressFired.set(false);\n              editor.fire('longpresscancel');\n            }\n          });\n        });\n      }, true);\n      editor.on('touchend touchcancel', function (e) {\n        debounceLongpress.cancel();\n        if (e.type === 'touchcancel') {\n          return;\n        }\n        startData.get().filter(function (data) {\n          return data.target().isEqualNode(e.target);\n        }).each(function () {\n          if (longpressFired.get()) {\n            e.preventDefault();\n          } else {\n            editor.fire('tap', __assign(__assign({}, e), { type: 'tap' }));\n          }\n        });\n      }, true);\n    };\n    var TouchEvents = { setup: setup$7 };\n\n    var isBlockElement = function (blockElements, node) {\n      return blockElements.hasOwnProperty(node.nodeName);\n    };\n    var isValidTarget = function (blockElements, node) {\n      if (NodeType.isText(node)) {\n        return true;\n      } else if (NodeType.isElement(node)) {\n        return !isBlockElement(blockElements, node) && !Bookmarks.isBookmarkNode(node);\n      } else {\n        return false;\n      }\n    };\n    var hasBlockParent = function (blockElements, root, node) {\n      return exists(Parents.parents(Element.fromDom(node), Element.fromDom(root)), function (elm) {\n        return isBlockElement(blockElements, elm.dom());\n      });\n    };\n    var shouldRemoveTextNode = function (blockElements, node) {\n      if (NodeType.isText(node)) {\n        if (node.nodeValue.length === 0) {\n          return true;\n        } else if (/^\\s+$/.test(node.nodeValue) && (!node.nextSibling || isBlockElement(blockElements, node.nextSibling))) {\n          return true;\n        }\n      }\n      return false;\n    };\n    var addRootBlocks = function (editor) {\n      var dom = editor.dom, selection = editor.selection;\n      var schema = editor.schema, blockElements = schema.getBlockElements();\n      var node = selection.getStart();\n      var rootNode = editor.getBody();\n      var rng;\n      var startContainer, startOffset, endContainer, endOffset, rootBlockNode;\n      var tempNode, wrapped, restoreSelection;\n      var rootNodeName;\n      var forcedRootBlock = Settings.getForcedRootBlock(editor);\n      if (!node || !NodeType.isElement(node) || !forcedRootBlock) {\n        return;\n      }\n      rootNodeName = rootNode.nodeName.toLowerCase();\n      if (!schema.isValidChild(rootNodeName, forcedRootBlock.toLowerCase()) || hasBlockParent(blockElements, rootNode, node)) {\n        return;\n      }\n      rng = selection.getRng();\n      startContainer = rng.startContainer;\n      startOffset = rng.startOffset;\n      endContainer = rng.endContainer;\n      endOffset = rng.endOffset;\n      restoreSelection = EditorFocus.hasFocus(editor);\n      node = rootNode.firstChild;\n      while (node) {\n        if (isValidTarget(blockElements, node)) {\n          if (shouldRemoveTextNode(blockElements, node)) {\n            tempNode = node;\n            node = node.nextSibling;\n            dom.remove(tempNode);\n            continue;\n          }\n          if (!rootBlockNode) {\n            rootBlockNode = dom.create(forcedRootBlock, Settings.getForcedRootBlockAttrs(editor));\n            node.parentNode.insertBefore(rootBlockNode, node);\n            wrapped = true;\n          }\n          tempNode = node;\n          node = node.nextSibling;\n          rootBlockNode.appendChild(tempNode);\n        } else {\n          rootBlockNode = null;\n          node = node.nextSibling;\n        }\n      }\n      if (wrapped && restoreSelection) {\n        rng.setStart(startContainer, startOffset);\n        rng.setEnd(endContainer, endOffset);\n        selection.setRng(rng);\n        editor.nodeChanged();\n      }\n    };\n    var setup$8 = function (editor) {\n      if (Settings.getForcedRootBlock(editor)) {\n        editor.on('NodeChange', curry(addRootBlocks, editor));\n      }\n    };\n    var ForceBlocks = { setup: setup$8 };\n\n    var isText$8 = NodeType.isText;\n    var startsWithCaretContainer$1 = function (node) {\n      return isText$8(node) && node.data[0] === Zwsp.ZWSP;\n    };\n    var endsWithCaretContainer$1 = function (node) {\n      return isText$8(node) && node.data[node.data.length - 1] === Zwsp.ZWSP;\n    };\n    var createZwsp = function (node) {\n      return node.ownerDocument.createTextNode(Zwsp.ZWSP);\n    };\n    var insertBefore = function (node) {\n      if (isText$8(node.previousSibling)) {\n        if (endsWithCaretContainer$1(node.previousSibling)) {\n          return node.previousSibling;\n        } else {\n          node.previousSibling.appendData(Zwsp.ZWSP);\n          return node.previousSibling;\n        }\n      } else if (isText$8(node)) {\n        if (startsWithCaretContainer$1(node)) {\n          return node;\n        } else {\n          node.insertData(0, Zwsp.ZWSP);\n          return node;\n        }\n      } else {\n        var newNode = createZwsp(node);\n        node.parentNode.insertBefore(newNode, node);\n        return newNode;\n      }\n    };\n    var insertAfter = function (node) {\n      if (isText$8(node.nextSibling)) {\n        if (startsWithCaretContainer$1(node.nextSibling)) {\n          return node.nextSibling;\n        } else {\n          node.nextSibling.insertData(0, Zwsp.ZWSP);\n          return node.nextSibling;\n        }\n      } else if (isText$8(node)) {\n        if (endsWithCaretContainer$1(node)) {\n          return node;\n        } else {\n          node.appendData(Zwsp.ZWSP);\n          return node;\n        }\n      } else {\n        var newNode = createZwsp(node);\n        if (node.nextSibling) {\n          node.parentNode.insertBefore(newNode, node.nextSibling);\n        } else {\n          node.parentNode.appendChild(newNode);\n        }\n        return newNode;\n      }\n    };\n    var insertInline$1 = function (before, node) {\n      return before ? insertBefore(node) : insertAfter(node);\n    };\n    var insertInlineBefore = curry(insertInline$1, true);\n    var insertInlineAfter = curry(insertInline$1, false);\n\n    var insertInlinePos = function (pos, before) {\n      if (NodeType.isText(pos.container())) {\n        return insertInline$1(before, pos.container());\n      } else {\n        return insertInline$1(before, pos.getNode());\n      }\n    };\n    var isPosCaretContainer = function (pos, caret) {\n      var caretNode = caret.get();\n      return caretNode && pos.container() === caretNode && isCaretContainerInline(caretNode);\n    };\n    var renderCaret = function (caret, location) {\n      return location.fold(function (element) {\n        CaretContainerRemove.remove(caret.get());\n        var text = insertInlineBefore(element);\n        caret.set(text);\n        return Option.some(CaretPosition$1(text, text.length - 1));\n      }, function (element) {\n        return CaretFinder.firstPositionIn(element).map(function (pos) {\n          if (!isPosCaretContainer(pos, caret)) {\n            CaretContainerRemove.remove(caret.get());\n            var text = insertInlinePos(pos, true);\n            caret.set(text);\n            return CaretPosition$1(text, 1);\n          } else {\n            return CaretPosition$1(caret.get(), 1);\n          }\n        });\n      }, function (element) {\n        return CaretFinder.lastPositionIn(element).map(function (pos) {\n          if (!isPosCaretContainer(pos, caret)) {\n            CaretContainerRemove.remove(caret.get());\n            var text = insertInlinePos(pos, false);\n            caret.set(text);\n            return CaretPosition$1(text, text.length - 1);\n          } else {\n            return CaretPosition$1(caret.get(), caret.get().length - 1);\n          }\n        });\n      }, function (element) {\n        CaretContainerRemove.remove(caret.get());\n        var text = insertInlineAfter(element);\n        caret.set(text);\n        return Option.some(CaretPosition$1(text, 1));\n      });\n    };\n    var BoundaryCaret = { renderCaret: renderCaret };\n\n    var strongRtl = /[\\u0591-\\u07FF\\uFB1D-\\uFDFF\\uFE70-\\uFEFC]/;\n    var hasStrongRtl = function (text) {\n      return strongRtl.test(text);\n    };\n\n    var isInlineTarget = function (editor, elm) {\n      return is(Element.fromDom(elm), Settings.getInlineBoundarySelector(editor));\n    };\n    var isRtl$1 = function (element) {\n      return DOMUtils$1.DOM.getStyle(element, 'direction', true) === 'rtl' || hasStrongRtl(element.textContent);\n    };\n    var findInlineParents = function (isInlineTarget, rootNode, pos) {\n      return filter(DOMUtils$1.DOM.getParents(pos.container(), '*', rootNode), isInlineTarget);\n    };\n    var findRootInline = function (isInlineTarget, rootNode, pos) {\n      var parents = findInlineParents(isInlineTarget, rootNode, pos);\n      return Option.from(parents[parents.length - 1]);\n    };\n    var hasSameParentBlock = function (rootNode, node1, node2) {\n      var block1 = getParentBlock(node1, rootNode);\n      var block2 = getParentBlock(node2, rootNode);\n      return block1 && block1 === block2;\n    };\n    var isAtZwsp = function (pos) {\n      return isBeforeInline(pos) || isAfterInline(pos);\n    };\n    var normalizePosition = function (forward, pos) {\n      if (!pos) {\n        return pos;\n      }\n      var container = pos.container(), offset = pos.offset();\n      if (forward) {\n        if (isCaretContainerInline(container)) {\n          if (NodeType.isText(container.nextSibling)) {\n            return CaretPosition$1(container.nextSibling, 0);\n          } else {\n            return CaretPosition$1.after(container);\n          }\n        } else {\n          return isBeforeInline(pos) ? CaretPosition$1(container, offset + 1) : pos;\n        }\n      } else {\n        if (isCaretContainerInline(container)) {\n          if (NodeType.isText(container.previousSibling)) {\n            return CaretPosition$1(container.previousSibling, container.previousSibling.data.length);\n          } else {\n            return CaretPosition$1.before(container);\n          }\n        } else {\n          return isAfterInline(pos) ? CaretPosition$1(container, offset - 1) : pos;\n        }\n      }\n    };\n    var normalizeForwards = curry(normalizePosition, true);\n    var normalizeBackwards = curry(normalizePosition, false);\n    var InlineUtils = {\n      isInlineTarget: isInlineTarget,\n      findRootInline: findRootInline,\n      isRtl: isRtl$1,\n      isAtZwsp: isAtZwsp,\n      normalizePosition: normalizePosition,\n      normalizeForwards: normalizeForwards,\n      normalizeBackwards: normalizeBackwards,\n      hasSameParentBlock: hasSameParentBlock\n    };\n\n    var evaluateUntil = function (fns, args) {\n      for (var i = 0; i < fns.length; i++) {\n        var result = fns[i].apply(null, args);\n        if (result.isSome()) {\n          return result;\n        }\n      }\n      return Option.none();\n    };\n    var LazyEvaluator = { evaluateUntil: evaluateUntil };\n\n    var Location = Adt.generate([\n      { before: ['element'] },\n      { start: ['element'] },\n      { end: ['element'] },\n      { after: ['element'] }\n    ]);\n    var rescope = function (rootNode, node) {\n      var parentBlock = getParentBlock(node, rootNode);\n      return parentBlock ? parentBlock : rootNode;\n    };\n    var before$4 = function (isInlineTarget, rootNode, pos) {\n      var nPos = InlineUtils.normalizeForwards(pos);\n      var scope = rescope(rootNode, nPos.container());\n      return InlineUtils.findRootInline(isInlineTarget, scope, nPos).fold(function () {\n        return CaretFinder.nextPosition(scope, nPos).bind(curry(InlineUtils.findRootInline, isInlineTarget, scope)).map(function (inline) {\n          return Location.before(inline);\n        });\n      }, Option.none);\n    };\n    var isNotInsideFormatCaretContainer = function (rootNode, elm) {\n      return getParentCaretContainer(rootNode, elm) === null;\n    };\n    var findInsideRootInline = function (isInlineTarget, rootNode, pos) {\n      return InlineUtils.findRootInline(isInlineTarget, rootNode, pos).filter(curry(isNotInsideFormatCaretContainer, rootNode));\n    };\n    var start = function (isInlineTarget, rootNode, pos) {\n      var nPos = InlineUtils.normalizeBackwards(pos);\n      return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(function (inline) {\n        var prevPos = CaretFinder.prevPosition(inline, nPos);\n        return prevPos.isNone() ? Option.some(Location.start(inline)) : Option.none();\n      });\n    };\n    var end = function (isInlineTarget, rootNode, pos) {\n      var nPos = InlineUtils.normalizeForwards(pos);\n      return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(function (inline) {\n        var nextPos = CaretFinder.nextPosition(inline, nPos);\n        return nextPos.isNone() ? Option.some(Location.end(inline)) : Option.none();\n      });\n    };\n    var after$3 = function (isInlineTarget, rootNode, pos) {\n      var nPos = InlineUtils.normalizeBackwards(pos);\n      var scope = rescope(rootNode, nPos.container());\n      return InlineUtils.findRootInline(isInlineTarget, scope, nPos).fold(function () {\n        return CaretFinder.prevPosition(scope, nPos).bind(curry(InlineUtils.findRootInline, isInlineTarget, scope)).map(function (inline) {\n          return Location.after(inline);\n        });\n      }, Option.none);\n    };\n    var isValidLocation = function (location) {\n      return InlineUtils.isRtl(getElement(location)) === false;\n    };\n    var readLocation = function (isInlineTarget, rootNode, pos) {\n      var location = LazyEvaluator.evaluateUntil([\n        before$4,\n        start,\n        end,\n        after$3\n      ], [\n        isInlineTarget,\n        rootNode,\n        pos\n      ]);\n      return location.filter(isValidLocation);\n    };\n    var getElement = function (location) {\n      return location.fold(identity, identity, identity, identity);\n    };\n    var getName = function (location) {\n      return location.fold(constant('before'), constant('start'), constant('end'), constant('after'));\n    };\n    var outside = function (location) {\n      return location.fold(Location.before, Location.before, Location.after, Location.after);\n    };\n    var inside = function (location) {\n      return location.fold(Location.start, Location.start, Location.end, Location.end);\n    };\n    var isEq$5 = function (location1, location2) {\n      return getName(location1) === getName(location2) && getElement(location1) === getElement(location2);\n    };\n    var betweenInlines = function (forward, isInlineTarget, rootNode, from, to, location) {\n      return lift2(InlineUtils.findRootInline(isInlineTarget, rootNode, from), InlineUtils.findRootInline(isInlineTarget, rootNode, to), function (fromInline, toInline) {\n        if (fromInline !== toInline && InlineUtils.hasSameParentBlock(rootNode, fromInline, toInline)) {\n          return Location.after(forward ? fromInline : toInline);\n        } else {\n          return location;\n        }\n      }).getOr(location);\n    };\n    var skipNoMovement = function (fromLocation, toLocation) {\n      return fromLocation.fold(constant(true), function (fromLocation) {\n        return !isEq$5(fromLocation, toLocation);\n      });\n    };\n    var findLocationTraverse = function (forward, isInlineTarget, rootNode, fromLocation, pos) {\n      var from = InlineUtils.normalizePosition(forward, pos);\n      var to = CaretFinder.fromPosition(forward, rootNode, from).map(curry(InlineUtils.normalizePosition, forward));\n      var location = to.fold(function () {\n        return fromLocation.map(outside);\n      }, function (to) {\n        return readLocation(isInlineTarget, rootNode, to).map(curry(betweenInlines, forward, isInlineTarget, rootNode, from, to)).filter(curry(skipNoMovement, fromLocation));\n      });\n      return location.filter(isValidLocation);\n    };\n    var findLocationSimple = function (forward, location) {\n      if (forward) {\n        return location.fold(compose(Option.some, Location.start), Option.none, compose(Option.some, Location.after), Option.none);\n      } else {\n        return location.fold(Option.none, compose(Option.some, Location.before), Option.none, compose(Option.some, Location.end));\n      }\n    };\n    var findLocation = function (forward, isInlineTarget, rootNode, pos) {\n      var from = InlineUtils.normalizePosition(forward, pos);\n      var fromLocation = readLocation(isInlineTarget, rootNode, from);\n      return readLocation(isInlineTarget, rootNode, from).bind(curry(findLocationSimple, forward)).orThunk(function () {\n        return findLocationTraverse(forward, isInlineTarget, rootNode, fromLocation, pos);\n      });\n    };\n    var BoundaryLocation = {\n      readLocation: readLocation,\n      findLocation: findLocation,\n      prevLocation: curry(findLocation, false),\n      nextLocation: curry(findLocation, true),\n      getElement: getElement,\n      outside: outside,\n      inside: inside\n    };\n\n    var hasSelectionModifyApi = function (editor) {\n      return isFunction(editor.selection.getSel().modify);\n    };\n    var moveRel = function (forward, selection, pos) {\n      var delta = forward ? 1 : -1;\n      selection.setRng(CaretPosition$1(pos.container(), pos.offset() + delta).toRange());\n      selection.getSel().modify('move', forward ? 'forward' : 'backward', 'word');\n      return true;\n    };\n    var moveByWord = function (forward, editor) {\n      var rng = editor.selection.getRng();\n      var pos = forward ? CaretPosition$1.fromRangeEnd(rng) : CaretPosition$1.fromRangeStart(rng);\n      if (!hasSelectionModifyApi(editor)) {\n        return false;\n      } else if (forward && isBeforeInline(pos)) {\n        return moveRel(true, editor.selection, pos);\n      } else if (!forward && isAfterInline(pos)) {\n        return moveRel(false, editor.selection, pos);\n      } else {\n        return false;\n      }\n    };\n    var WordSelection = {\n      hasSelectionModifyApi: hasSelectionModifyApi,\n      moveByWord: moveByWord\n    };\n\n    var setCaretPosition = function (editor, pos) {\n      var rng = editor.dom.createRng();\n      rng.setStart(pos.container(), pos.offset());\n      rng.setEnd(pos.container(), pos.offset());\n      editor.selection.setRng(rng);\n    };\n    var isFeatureEnabled = function (editor) {\n      return editor.settings.inline_boundaries !== false;\n    };\n    var setSelected = function (state, elm) {\n      if (state) {\n        elm.setAttribute('data-mce-selected', 'inline-boundary');\n      } else {\n        elm.removeAttribute('data-mce-selected');\n      }\n    };\n    var renderCaretLocation = function (editor, caret, location) {\n      return BoundaryCaret.renderCaret(caret, location).map(function (pos) {\n        setCaretPosition(editor, pos);\n        return location;\n      });\n    };\n    var findLocation$1 = function (editor, caret, forward) {\n      var rootNode = editor.getBody();\n      var from = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n      var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);\n      var location = BoundaryLocation.findLocation(forward, isInlineTarget, rootNode, from);\n      return location.bind(function (location) {\n        return renderCaretLocation(editor, caret, location);\n      });\n    };\n    var toggleInlines = function (isInlineTarget, dom, elms) {\n      var selectedInlines = filter(dom.select('*[data-mce-selected=\"inline-boundary\"]'), isInlineTarget);\n      var targetInlines = filter(elms, isInlineTarget);\n      each(difference(selectedInlines, targetInlines), curry(setSelected, false));\n      each(difference(targetInlines, selectedInlines), curry(setSelected, true));\n    };\n    var safeRemoveCaretContainer = function (editor, caret) {\n      if (editor.selection.isCollapsed() && editor.composing !== true && caret.get()) {\n        var pos = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n        if (CaretPosition$1.isTextPosition(pos) && InlineUtils.isAtZwsp(pos) === false) {\n          setCaretPosition(editor, CaretContainerRemove.removeAndReposition(caret.get(), pos));\n          caret.set(null);\n        }\n      }\n    };\n    var renderInsideInlineCaret = function (isInlineTarget, editor, caret, elms) {\n      if (editor.selection.isCollapsed()) {\n        var inlines = filter(elms, isInlineTarget);\n        each(inlines, function (inline) {\n          var pos = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n          BoundaryLocation.readLocation(isInlineTarget, editor.getBody(), pos).bind(function (location) {\n            return renderCaretLocation(editor, caret, location);\n          });\n        });\n      }\n    };\n    var move = function (editor, caret, forward) {\n      return function () {\n        return isFeatureEnabled(editor) ? findLocation$1(editor, caret, forward).isSome() : false;\n      };\n    };\n    var moveWord = function (forward, editor, caret) {\n      return function () {\n        return isFeatureEnabled(editor) ? WordSelection.moveByWord(forward, editor) : false;\n      };\n    };\n    var setupSelectedState = function (editor) {\n      var caret = Cell(null);\n      var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);\n      editor.on('NodeChange', function (e) {\n        if (isFeatureEnabled(editor) && !(Env.browser.isIE() && e.initial)) {\n          toggleInlines(isInlineTarget, editor.dom, e.parents);\n          safeRemoveCaretContainer(editor, caret);\n          renderInsideInlineCaret(isInlineTarget, editor, caret, e.parents);\n        }\n      });\n      return caret;\n    };\n    var moveNextWord = curry(moveWord, true);\n    var movePrevWord = curry(moveWord, false);\n    var BoundarySelection = {\n      move: move,\n      moveNextWord: moveNextWord,\n      movePrevWord: movePrevWord,\n      setupSelectedState: setupSelectedState,\n      setCaretPosition: setCaretPosition\n    };\n\n    var getNodeClientRects = function (node) {\n      var toArrayWithNode = function (clientRects) {\n        return map(clientRects, function (clientRect) {\n          clientRect = clone$1(clientRect);\n          clientRect.node = node;\n          return clientRect;\n        });\n      };\n      if (NodeType.isElement(node)) {\n        return toArrayWithNode(node.getClientRects());\n      }\n      if (NodeType.isText(node)) {\n        var rng = node.ownerDocument.createRange();\n        rng.setStart(node, 0);\n        rng.setEnd(node, node.data.length);\n        return toArrayWithNode(rng.getClientRects());\n      }\n    };\n    var getClientRects = function (node) {\n      return foldl(node, function (result, node) {\n        return result.concat(getNodeClientRects(node));\n      }, []);\n    };\n\n    var VDirection;\n    (function (VDirection) {\n      VDirection[VDirection['Up'] = -1] = 'Up';\n      VDirection[VDirection['Down'] = 1] = 'Down';\n    }(VDirection || (VDirection = {})));\n    var findUntil = function (direction, root, predicateFn, node) {\n      while (node = findNode(node, direction, isEditableCaretCandidate, root)) {\n        if (predicateFn(node)) {\n          return;\n        }\n      }\n    };\n    var walkUntil = function (direction, isAboveFn, isBeflowFn, root, predicateFn, caretPosition) {\n      var line = 0, node;\n      var result = [];\n      var targetClientRect;\n      var add = function (node) {\n        var i, clientRect, clientRects;\n        clientRects = getClientRects([node]);\n        if (direction === -1) {\n          clientRects = clientRects.reverse();\n        }\n        for (i = 0; i < clientRects.length; i++) {\n          clientRect = clientRects[i];\n          if (isBeflowFn(clientRect, targetClientRect)) {\n            continue;\n          }\n          if (result.length > 0 && isAboveFn(clientRect, ArrUtils.last(result))) {\n            line++;\n          }\n          clientRect.line = line;\n          if (predicateFn(clientRect)) {\n            return true;\n          }\n          result.push(clientRect);\n        }\n      };\n      targetClientRect = ArrUtils.last(caretPosition.getClientRects());\n      if (!targetClientRect) {\n        return result;\n      }\n      node = caretPosition.getNode();\n      add(node);\n      findUntil(direction, root, add, node);\n      return result;\n    };\n    var aboveLineNumber = function (lineNumber, clientRect) {\n      return clientRect.line > lineNumber;\n    };\n    var isLineNumber = function (lineNumber, clientRect) {\n      return clientRect.line === lineNumber;\n    };\n    var upUntil = curry(walkUntil, VDirection.Up, isAbove, isBelow);\n    var downUntil = curry(walkUntil, VDirection.Down, isBelow, isAbove);\n    var positionsUntil = function (direction, root, predicateFn, node) {\n      var caretWalker = CaretWalker(root);\n      var walkFn, isBelowFn, isAboveFn, caretPosition;\n      var result = [];\n      var line = 0, clientRect, targetClientRect;\n      var getClientRect = function (caretPosition) {\n        if (direction === 1) {\n          return ArrUtils.last(caretPosition.getClientRects());\n        }\n        return ArrUtils.last(caretPosition.getClientRects());\n      };\n      if (direction === 1) {\n        walkFn = caretWalker.next;\n        isBelowFn = isBelow;\n        isAboveFn = isAbove;\n        caretPosition = CaretPosition$1.after(node);\n      } else {\n        walkFn = caretWalker.prev;\n        isBelowFn = isAbove;\n        isAboveFn = isBelow;\n        caretPosition = CaretPosition$1.before(node);\n      }\n      targetClientRect = getClientRect(caretPosition);\n      do {\n        if (!caretPosition.isVisible()) {\n          continue;\n        }\n        clientRect = getClientRect(caretPosition);\n        if (isAboveFn(clientRect, targetClientRect)) {\n          continue;\n        }\n        if (result.length > 0 && isBelowFn(clientRect, ArrUtils.last(result))) {\n          line++;\n        }\n        clientRect = clone$1(clientRect);\n        clientRect.position = caretPosition;\n        clientRect.line = line;\n        if (predicateFn(clientRect)) {\n          return result;\n        }\n        result.push(clientRect);\n      } while (caretPosition = walkFn(caretPosition));\n      return result;\n    };\n    var isAboveLine = function (lineNumber) {\n      return function (clientRect) {\n        return aboveLineNumber(lineNumber, clientRect);\n      };\n    };\n    var isLine = function (lineNumber) {\n      return function (clientRect) {\n        return isLineNumber(lineNumber, clientRect);\n      };\n    };\n\n    var isContentEditableFalse$7 = NodeType.isContentEditableFalse;\n    var findNode$1 = findNode;\n    var distanceToRectLeft = function (clientRect, clientX) {\n      return Math.abs(clientRect.left - clientX);\n    };\n    var distanceToRectRight = function (clientRect, clientX) {\n      return Math.abs(clientRect.right - clientX);\n    };\n    var isInside = function (clientX, clientRect) {\n      return clientX >= clientRect.left && clientX <= clientRect.right;\n    };\n    var findClosestClientRect = function (clientRects, clientX) {\n      return ArrUtils.reduce(clientRects, function (oldClientRect, clientRect) {\n        var oldDistance, newDistance;\n        oldDistance = Math.min(distanceToRectLeft(oldClientRect, clientX), distanceToRectRight(oldClientRect, clientX));\n        newDistance = Math.min(distanceToRectLeft(clientRect, clientX), distanceToRectRight(clientRect, clientX));\n        if (isInside(clientX, clientRect)) {\n          return clientRect;\n        }\n        if (isInside(clientX, oldClientRect)) {\n          return oldClientRect;\n        }\n        if (newDistance === oldDistance && isContentEditableFalse$7(clientRect.node)) {\n          return clientRect;\n        }\n        if (newDistance < oldDistance) {\n          return clientRect;\n        }\n        return oldClientRect;\n      });\n    };\n    var walkUntil$1 = function (direction, root, predicateFn, node) {\n      while (node = findNode$1(node, direction, isEditableCaretCandidate, root)) {\n        if (predicateFn(node)) {\n          return;\n        }\n      }\n    };\n    var findLineNodeRects = function (root, targetNodeRect) {\n      var clientRects = [];\n      var collect = function (checkPosFn, node) {\n        var lineRects;\n        lineRects = filter(getClientRects([node]), function (clientRect) {\n          return !checkPosFn(clientRect, targetNodeRect);\n        });\n        clientRects = clientRects.concat(lineRects);\n        return lineRects.length === 0;\n      };\n      clientRects.push(targetNodeRect);\n      walkUntil$1(VDirection.Up, root, curry(collect, isAbove), targetNodeRect.node);\n      walkUntil$1(VDirection.Down, root, curry(collect, isBelow), targetNodeRect.node);\n      return clientRects;\n    };\n    var getFakeCaretTargets = function (root) {\n      return filter(from$1(root.getElementsByTagName('*')), isFakeCaretTarget);\n    };\n    var caretInfo = function (clientRect, clientX) {\n      return {\n        node: clientRect.node,\n        before: distanceToRectLeft(clientRect, clientX) < distanceToRectRight(clientRect, clientX)\n      };\n    };\n    var closestCaret = function (root, clientX, clientY) {\n      var closestNodeRect;\n      var contentEditableFalseNodeRects = getClientRects(getFakeCaretTargets(root));\n      var targetNodeRects = filter(contentEditableFalseNodeRects, function (rect) {\n        return clientY >= rect.top && clientY <= rect.bottom;\n      });\n      closestNodeRect = findClosestClientRect(targetNodeRects, clientX);\n      if (closestNodeRect) {\n        closestNodeRect = findClosestClientRect(findLineNodeRects(root, closestNodeRect), clientX);\n        if (closestNodeRect && isFakeCaretTarget(closestNodeRect.node)) {\n          return caretInfo(closestNodeRect, clientX);\n        }\n      }\n      return null;\n    };\n\n    var isContentEditableTrue$3 = NodeType.isContentEditableTrue;\n    var isContentEditableFalse$8 = NodeType.isContentEditableFalse;\n    var showCaret = function (direction, editor, node, before, scrollIntoView) {\n      return editor._selectionOverrides.showCaret(direction, node, before, scrollIntoView);\n    };\n    var getNodeRange = function (node) {\n      var rng = node.ownerDocument.createRange();\n      rng.selectNode(node);\n      return rng;\n    };\n    var selectNode = function (editor, node) {\n      var e = editor.fire('BeforeObjectSelected', { target: node });\n      if (e.isDefaultPrevented()) {\n        return null;\n      }\n      return getNodeRange(node);\n    };\n    var renderCaretAtRange = function (editor, range, scrollIntoView) {\n      var normalizedRange = normalizeRange(1, editor.getBody(), range);\n      var caretPosition = CaretPosition$1.fromRangeStart(normalizedRange);\n      var caretPositionNode = caretPosition.getNode();\n      if (isContentEditableFalse$8(caretPositionNode)) {\n        return showCaret(1, editor, caretPositionNode, !caretPosition.isAtEnd(), false);\n      }\n      var caretPositionBeforeNode = caretPosition.getNode(true);\n      if (isContentEditableFalse$8(caretPositionBeforeNode)) {\n        return showCaret(1, editor, caretPositionBeforeNode, false, false);\n      }\n      var ceRoot = editor.dom.getParent(caretPosition.getNode(), function (node) {\n        return isContentEditableFalse$8(node) || isContentEditableTrue$3(node);\n      });\n      if (isContentEditableFalse$8(ceRoot)) {\n        return showCaret(1, editor, ceRoot, false, scrollIntoView);\n      }\n      return null;\n    };\n    var renderRangeCaret = function (editor, range, scrollIntoView) {\n      if (!range || !range.collapsed) {\n        return range;\n      }\n      var caretRange = renderCaretAtRange(editor, range, scrollIntoView);\n      if (caretRange) {\n        return caretRange;\n      }\n      return range;\n    };\n\n    var isChar = function (forward, predicate, pos) {\n      return Option.from(pos.container()).filter(NodeType.isText).exists(function (text) {\n        var delta = forward ? 0 : -1;\n        return predicate(text.data.charAt(pos.offset() + delta));\n      });\n    };\n    var isBeforeSpace = curry(isChar, true, isWhiteSpace$1);\n    var isAfterSpace = curry(isChar, false, isWhiteSpace$1);\n    var isEmptyText = function (pos) {\n      var container = pos.container();\n      return NodeType.isText(container) && container.data.length === 0;\n    };\n    var matchesElementPosition = function (before, predicate) {\n      return function (pos) {\n        return Option.from(getChildNodeAtRelativeOffset(before ? 0 : -1, pos)).filter(predicate).isSome();\n      };\n    };\n    var isImageBlock = function (node) {\n      return node.nodeName === 'IMG' && get$4(Element.fromDom(node), 'display') === 'block';\n    };\n    var isCefNode = function (node) {\n      return NodeType.isContentEditableFalse(node) && !NodeType.isBogusAll(node);\n    };\n    var isBeforeImageBlock = matchesElementPosition(true, isImageBlock);\n    var isAfterImageBlock = matchesElementPosition(false, isImageBlock);\n    var isBeforeTable = matchesElementPosition(true, NodeType.isTable);\n    var isAfterTable = matchesElementPosition(false, NodeType.isTable);\n    var isBeforeContentEditableFalse = matchesElementPosition(true, isCefNode);\n    var isAfterContentEditableFalse = matchesElementPosition(false, isCefNode);\n\n    var BreakType;\n    (function (BreakType) {\n      BreakType[BreakType['Br'] = 0] = 'Br';\n      BreakType[BreakType['Block'] = 1] = 'Block';\n      BreakType[BreakType['Wrap'] = 2] = 'Wrap';\n      BreakType[BreakType['Eol'] = 3] = 'Eol';\n    }(BreakType || (BreakType = {})));\n    var flip = function (direction, positions) {\n      return direction === HDirection.Backwards ? reverse(positions) : positions;\n    };\n    var walk$3 = function (direction, caretWalker, pos) {\n      return direction === HDirection.Forwards ? caretWalker.next(pos) : caretWalker.prev(pos);\n    };\n    var getBreakType = function (scope, direction, currentPos, nextPos) {\n      if (NodeType.isBr(nextPos.getNode(direction === HDirection.Forwards))) {\n        return BreakType.Br;\n      } else if (isInSameBlock(currentPos, nextPos) === false) {\n        return BreakType.Block;\n      } else {\n        return BreakType.Wrap;\n      }\n    };\n    var getPositionsUntil = function (predicate, direction, scope, start) {\n      var caretWalker = CaretWalker(scope);\n      var currentPos = start, nextPos;\n      var positions = [];\n      while (currentPos) {\n        nextPos = walk$3(direction, caretWalker, currentPos);\n        if (!nextPos) {\n          break;\n        }\n        if (NodeType.isBr(nextPos.getNode(false))) {\n          if (direction === HDirection.Forwards) {\n            return {\n              positions: flip(direction, positions).concat([nextPos]),\n              breakType: BreakType.Br,\n              breakAt: Option.some(nextPos)\n            };\n          } else {\n            return {\n              positions: flip(direction, positions),\n              breakType: BreakType.Br,\n              breakAt: Option.some(nextPos)\n            };\n          }\n        }\n        if (!nextPos.isVisible()) {\n          currentPos = nextPos;\n          continue;\n        }\n        if (predicate(currentPos, nextPos)) {\n          var breakType = getBreakType(scope, direction, currentPos, nextPos);\n          return {\n            positions: flip(direction, positions),\n            breakType: breakType,\n            breakAt: Option.some(nextPos)\n          };\n        }\n        positions.push(nextPos);\n        currentPos = nextPos;\n      }\n      return {\n        positions: flip(direction, positions),\n        breakType: BreakType.Eol,\n        breakAt: Option.none()\n      };\n    };\n    var getAdjacentLinePositions = function (direction, getPositionsUntilBreak, scope, start) {\n      return getPositionsUntilBreak(scope, start).breakAt.map(function (pos) {\n        var positions = getPositionsUntilBreak(scope, pos).positions;\n        return direction === HDirection.Backwards ? positions.concat(pos) : [pos].concat(positions);\n      }).getOr([]);\n    };\n    var findClosestHorizontalPositionFromPoint = function (positions, x) {\n      return foldl(positions, function (acc, newPos) {\n        return acc.fold(function () {\n          return Option.some(newPos);\n        }, function (lastPos) {\n          return lift2(head(lastPos.getClientRects()), head(newPos.getClientRects()), function (lastRect, newRect) {\n            var lastDist = Math.abs(x - lastRect.left);\n            var newDist = Math.abs(x - newRect.left);\n            return newDist <= lastDist ? newPos : lastPos;\n          }).or(acc);\n        });\n      }, Option.none());\n    };\n    var findClosestHorizontalPosition = function (positions, pos) {\n      return head(pos.getClientRects()).bind(function (targetRect) {\n        return findClosestHorizontalPositionFromPoint(positions, targetRect.left);\n      });\n    };\n    var getPositionsUntilPreviousLine = curry(getPositionsUntil, CaretPosition.isAbove, -1);\n    var getPositionsUntilNextLine = curry(getPositionsUntil, CaretPosition.isBelow, 1);\n    var isAtFirstLine = function (scope, pos) {\n      return getPositionsUntilPreviousLine(scope, pos).breakAt.isNone();\n    };\n    var isAtLastLine = function (scope, pos) {\n      return getPositionsUntilNextLine(scope, pos).breakAt.isNone();\n    };\n    var getPositionsAbove = curry(getAdjacentLinePositions, -1, getPositionsUntilPreviousLine);\n    var getPositionsBelow = curry(getAdjacentLinePositions, 1, getPositionsUntilNextLine);\n    var getFirstLinePositions = function (scope) {\n      return CaretFinder.firstPositionIn(scope).map(function (pos) {\n        return [pos].concat(getPositionsUntilNextLine(scope, pos).positions);\n      }).getOr([]);\n    };\n    var getLastLinePositions = function (scope) {\n      return CaretFinder.lastPositionIn(scope).map(function (pos) {\n        return getPositionsUntilPreviousLine(scope, pos).positions.concat(pos);\n      }).getOr([]);\n    };\n\n    var isContentEditableFalse$9 = NodeType.isContentEditableFalse;\n    var getSelectedNode$1 = getSelectedNode;\n    var moveToCeFalseHorizontally = function (direction, editor, getNextPosFn, range) {\n      var forwards = direction === HDirection.Forwards;\n      var isBeforeContentEditableFalseFn = forwards ? isBeforeContentEditableFalse : isAfterContentEditableFalse;\n      if (!range.collapsed) {\n        var node = getSelectedNode$1(range);\n        if (isContentEditableFalse$9(node)) {\n          return showCaret(direction, editor, node, direction === HDirection.Backwards, true);\n        }\n      }\n      var rangeIsInContainerBlock = isRangeInCaretContainerBlock(range);\n      var caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);\n      if (isBeforeContentEditableFalseFn(caretPosition)) {\n        return selectNode(editor, caretPosition.getNode(!forwards));\n      }\n      var nextCaretPosition = InlineUtils.normalizePosition(forwards, getNextPosFn(caretPosition));\n      if (!nextCaretPosition) {\n        if (rangeIsInContainerBlock) {\n          return range;\n        }\n        return null;\n      }\n      if (isBeforeContentEditableFalseFn(nextCaretPosition)) {\n        return showCaret(direction, editor, nextCaretPosition.getNode(!forwards), forwards, true);\n      }\n      var peekCaretPosition = getNextPosFn(nextCaretPosition);\n      if (peekCaretPosition && isBeforeContentEditableFalseFn(peekCaretPosition)) {\n        if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {\n          return showCaret(direction, editor, peekCaretPosition.getNode(!forwards), forwards, true);\n        }\n      }\n      if (rangeIsInContainerBlock) {\n        return renderRangeCaret(editor, nextCaretPosition.toRange(), true);\n      }\n      return null;\n    };\n    var moveToCeFalseVertically = function (direction, editor, walkerFn, range) {\n      var caretPosition, linePositions, nextLinePositions;\n      var closestNextLineRect, caretClientRect, clientX;\n      var dist1, dist2, contentEditableFalseNode;\n      contentEditableFalseNode = getSelectedNode$1(range);\n      caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);\n      linePositions = walkerFn(editor.getBody(), isAboveLine(1), caretPosition);\n      nextLinePositions = filter(linePositions, isLine(1));\n      caretClientRect = ArrUtils.last(caretPosition.getClientRects());\n      if (isBeforeContentEditableFalse(caretPosition) || isBeforeTable(caretPosition)) {\n        contentEditableFalseNode = caretPosition.getNode();\n      }\n      if (isAfterContentEditableFalse(caretPosition) || isAfterTable(caretPosition)) {\n        contentEditableFalseNode = caretPosition.getNode(true);\n      }\n      if (!caretClientRect) {\n        return null;\n      }\n      clientX = caretClientRect.left;\n      closestNextLineRect = findClosestClientRect(nextLinePositions, clientX);\n      if (closestNextLineRect) {\n        if (isContentEditableFalse$9(closestNextLineRect.node)) {\n          dist1 = Math.abs(clientX - closestNextLineRect.left);\n          dist2 = Math.abs(clientX - closestNextLineRect.right);\n          return showCaret(direction, editor, closestNextLineRect.node, dist1 < dist2, true);\n        }\n      }\n      if (contentEditableFalseNode) {\n        var caretPositions = positionsUntil(direction, editor.getBody(), isAboveLine(1), contentEditableFalseNode);\n        closestNextLineRect = findClosestClientRect(filter(caretPositions, isLine(1)), clientX);\n        if (closestNextLineRect) {\n          return renderRangeCaret(editor, closestNextLineRect.position.toRange(), true);\n        }\n        closestNextLineRect = ArrUtils.last(filter(caretPositions, isLine(0)));\n        if (closestNextLineRect) {\n          return renderRangeCaret(editor, closestNextLineRect.position.toRange(), true);\n        }\n      }\n    };\n    var createTextBlock = function (editor) {\n      var textBlock = editor.dom.create(Settings.getForcedRootBlock(editor));\n      if (!Env.ie || Env.ie >= 11) {\n        textBlock.innerHTML = '<br data-mce-bogus=\"1\">';\n      }\n      return textBlock;\n    };\n    var exitPreBlock = function (editor, direction, range) {\n      var pre, caretPos, newBlock;\n      var caretWalker = CaretWalker(editor.getBody());\n      var getNextVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.next);\n      var getPrevVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.prev);\n      if (range.collapsed && editor.settings.forced_root_block) {\n        pre = editor.dom.getParent(range.startContainer, 'PRE');\n        if (!pre) {\n          return;\n        }\n        if (direction === 1) {\n          caretPos = getNextVisualCaretPosition(CaretPosition$1.fromRangeStart(range));\n        } else {\n          caretPos = getPrevVisualCaretPosition(CaretPosition$1.fromRangeStart(range));\n        }\n        if (!caretPos) {\n          newBlock = createTextBlock(editor);\n          if (direction === 1) {\n            editor.$(pre).after(newBlock);\n          } else {\n            editor.$(pre).before(newBlock);\n          }\n          editor.selection.select(newBlock, true);\n          editor.selection.collapse();\n        }\n      }\n    };\n    var getHorizontalRange = function (editor, forward) {\n      var caretWalker = CaretWalker(editor.getBody());\n      var getNextVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.next);\n      var getPrevVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.prev);\n      var newRange;\n      var direction = forward ? HDirection.Forwards : HDirection.Backwards;\n      var getNextPosFn = forward ? getNextVisualCaretPosition : getPrevVisualCaretPosition;\n      var range = editor.selection.getRng();\n      newRange = moveToCeFalseHorizontally(direction, editor, getNextPosFn, range);\n      if (newRange) {\n        return newRange;\n      }\n      newRange = exitPreBlock(editor, direction, range);\n      if (newRange) {\n        return newRange;\n      }\n      return null;\n    };\n    var getVerticalRange = function (editor, down) {\n      var newRange;\n      var direction = down ? 1 : -1;\n      var walkerFn = down ? downUntil : upUntil;\n      var range = editor.selection.getRng();\n      newRange = moveToCeFalseVertically(direction, editor, walkerFn, range);\n      if (newRange) {\n        return newRange;\n      }\n      newRange = exitPreBlock(editor, direction, range);\n      if (newRange) {\n        return newRange;\n      }\n      return null;\n    };\n    var moveH = function (editor, forward) {\n      return function () {\n        var newRng = getHorizontalRange(editor, forward);\n        if (newRng) {\n          editor.selection.setRng(newRng);\n          return true;\n        } else {\n          return false;\n        }\n      };\n    };\n    var moveV = function (editor, down) {\n      return function () {\n        var newRng = getVerticalRange(editor, down);\n        if (newRng) {\n          editor.selection.setRng(newRng);\n          return true;\n        } else {\n          return false;\n        }\n      };\n    };\n    var isCefPosition = function (forward) {\n      return function (pos) {\n        return forward ? isAfterContentEditableFalse(pos) : isBeforeContentEditableFalse(pos);\n      };\n    };\n    var moveToLineEndPoint = function (editor, forward) {\n      return function () {\n        var from = forward ? CaretPosition$1.fromRangeEnd(editor.selection.getRng()) : CaretPosition$1.fromRangeStart(editor.selection.getRng());\n        var result = forward ? getPositionsUntilNextLine(editor.getBody(), from) : getPositionsUntilPreviousLine(editor.getBody(), from);\n        var to = forward ? last(result.positions) : head(result.positions);\n        return to.filter(isCefPosition(forward)).fold(constant(false), function (pos) {\n          editor.selection.setRng(pos.toRange());\n          return true;\n        });\n      };\n    };\n\n    var deflate = function (rect, delta) {\n      return {\n        left: rect.left - delta,\n        top: rect.top - delta,\n        right: rect.right + delta * 2,\n        bottom: rect.bottom + delta * 2,\n        width: rect.width + delta,\n        height: rect.height + delta\n      };\n    };\n    var getCorners = function (getYAxisValue, tds) {\n      return bind(tds, function (td) {\n        var rect = deflate(clone$1(td.getBoundingClientRect()), -1);\n        return [\n          {\n            x: rect.left,\n            y: getYAxisValue(rect),\n            cell: td\n          },\n          {\n            x: rect.right,\n            y: getYAxisValue(rect),\n            cell: td\n          }\n        ];\n      });\n    };\n    var findClosestCorner = function (corners, x, y) {\n      return foldl(corners, function (acc, newCorner) {\n        return acc.fold(function () {\n          return Option.some(newCorner);\n        }, function (oldCorner) {\n          var oldDist = Math.sqrt(Math.abs(oldCorner.x - x) + Math.abs(oldCorner.y - y));\n          var newDist = Math.sqrt(Math.abs(newCorner.x - x) + Math.abs(newCorner.y - y));\n          return Option.some(newDist < oldDist ? newCorner : oldCorner);\n        });\n      }, Option.none());\n    };\n    var getClosestCell = function (getYAxisValue, isTargetCorner, table, x, y) {\n      var cells = descendants$1(Element.fromDom(table), 'td,th,caption').map(function (e) {\n        return e.dom();\n      });\n      var corners = filter(getCorners(getYAxisValue, cells), function (corner) {\n        return isTargetCorner(corner, y);\n      });\n      return findClosestCorner(corners, x, y).map(function (corner) {\n        return corner.cell;\n      });\n    };\n    var getBottomValue = function (rect) {\n      return rect.bottom;\n    };\n    var getTopValue = function (rect) {\n      return rect.top;\n    };\n    var isAbove$1 = function (corner, y) {\n      return corner.y < y;\n    };\n    var isBelow$1 = function (corner, y) {\n      return corner.y > y;\n    };\n    var getClosestCellAbove = curry(getClosestCell, getBottomValue, isAbove$1);\n    var getClosestCellBelow = curry(getClosestCell, getTopValue, isBelow$1);\n    var findClosestPositionInAboveCell = function (table, pos) {\n      return head(pos.getClientRects()).bind(function (rect) {\n        return getClosestCellAbove(table, rect.left, rect.top);\n      }).bind(function (cell) {\n        return findClosestHorizontalPosition(getLastLinePositions(cell), pos);\n      });\n    };\n    var findClosestPositionInBelowCell = function (table, pos) {\n      return last(pos.getClientRects()).bind(function (rect) {\n        return getClosestCellBelow(table, rect.left, rect.top);\n      }).bind(function (cell) {\n        return findClosestHorizontalPosition(getFirstLinePositions(cell), pos);\n      });\n    };\n\n    var moveToRange = function (editor, rng) {\n      editor.selection.setRng(rng);\n      ScrollIntoView.scrollRangeIntoView(editor, rng);\n    };\n    var hasNextBreak = function (getPositionsUntil, scope, lineInfo) {\n      return lineInfo.breakAt.map(function (breakPos) {\n        return getPositionsUntil(scope, breakPos).breakAt.isSome();\n      }).getOr(false);\n    };\n    var startsWithWrapBreak = function (lineInfo) {\n      return lineInfo.breakType === BreakType.Wrap && lineInfo.positions.length === 0;\n    };\n    var startsWithBrBreak = function (lineInfo) {\n      return lineInfo.breakType === BreakType.Br && lineInfo.positions.length === 1;\n    };\n    var isAtTableCellLine = function (getPositionsUntil, scope, pos) {\n      var lineInfo = getPositionsUntil(scope, pos);\n      if (startsWithWrapBreak(lineInfo) || !NodeType.isBr(pos.getNode()) && startsWithBrBreak(lineInfo)) {\n        return !hasNextBreak(getPositionsUntil, scope, lineInfo);\n      } else {\n        return lineInfo.breakAt.isNone();\n      }\n    };\n    var isAtFirstTableCellLine = curry(isAtTableCellLine, getPositionsUntilPreviousLine);\n    var isAtLastTableCellLine = curry(isAtTableCellLine, getPositionsUntilNextLine);\n    var isCaretAtStartOrEndOfTable = function (forward, rng, table) {\n      var caretPos = CaretPosition$1.fromRangeStart(rng);\n      return CaretFinder.positionIn(!forward, table).map(function (pos) {\n        return pos.isEqual(caretPos);\n      }).getOr(false);\n    };\n    var navigateHorizontally = function (editor, forward, table, td) {\n      var rng = editor.selection.getRng();\n      var direction = forward ? 1 : -1;\n      if (isFakeCaretTableBrowser() && isCaretAtStartOrEndOfTable(forward, rng, table)) {\n        var newRng = showCaret(direction, editor, table, !forward, true);\n        moveToRange(editor, newRng);\n        return true;\n      }\n      return false;\n    };\n    var getClosestAbovePosition = function (root, table, start) {\n      return findClosestPositionInAboveCell(table, start).orThunk(function () {\n        return head(start.getClientRects()).bind(function (rect) {\n          return findClosestHorizontalPositionFromPoint(getPositionsAbove(root, CaretPosition$1.before(table)), rect.left);\n        });\n      }).getOr(CaretPosition$1.before(table));\n    };\n    var getClosestBelowPosition = function (root, table, start) {\n      return findClosestPositionInBelowCell(table, start).orThunk(function () {\n        return head(start.getClientRects()).bind(function (rect) {\n          return findClosestHorizontalPositionFromPoint(getPositionsBelow(root, CaretPosition$1.after(table)), rect.left);\n        });\n      }).getOr(CaretPosition$1.after(table));\n    };\n    var getTable = function (previous, pos) {\n      var node = pos.getNode(previous);\n      return NodeType.isElement(node) && node.nodeName === 'TABLE' ? Option.some(node) : Option.none();\n    };\n    var renderBlock = function (down, editor, table, pos) {\n      var forcedRootBlock = Settings.getForcedRootBlock(editor);\n      if (forcedRootBlock) {\n        editor.undoManager.transact(function () {\n          var element = Element.fromTag(forcedRootBlock);\n          setAll(element, Settings.getForcedRootBlockAttrs(editor));\n          append(element, Element.fromTag('br'));\n          if (down) {\n            after(Element.fromDom(table), element);\n          } else {\n            before(Element.fromDom(table), element);\n          }\n          var rng = editor.dom.createRng();\n          rng.setStart(element.dom(), 0);\n          rng.setEnd(element.dom(), 0);\n          moveToRange(editor, rng);\n        });\n      } else {\n        moveToRange(editor, pos.toRange());\n      }\n    };\n    var moveCaret = function (editor, down, pos) {\n      var table = down ? getTable(true, pos) : getTable(false, pos);\n      var last = down === false;\n      table.fold(function () {\n        return moveToRange(editor, pos.toRange());\n      }, function (table) {\n        return CaretFinder.positionIn(last, editor.getBody()).filter(function (lastPos) {\n          return lastPos.isEqual(pos);\n        }).fold(function () {\n          return moveToRange(editor, pos.toRange());\n        }, function (_) {\n          return renderBlock(down, editor, table, pos);\n        });\n      });\n    };\n    var navigateVertically = function (editor, down, table, td) {\n      var rng = editor.selection.getRng();\n      var pos = CaretPosition$1.fromRangeStart(rng);\n      var root = editor.getBody();\n      if (!down && isAtFirstTableCellLine(td, pos)) {\n        var newPos = getClosestAbovePosition(root, table, pos);\n        moveCaret(editor, down, newPos);\n        return true;\n      } else if (down && isAtLastTableCellLine(td, pos)) {\n        var newPos = getClosestBelowPosition(root, table, pos);\n        moveCaret(editor, down, newPos);\n        return true;\n      } else {\n        return false;\n      }\n    };\n    var moveH$1 = function (editor, forward) {\n      return function () {\n        return Option.from(editor.dom.getParent(editor.selection.getNode(), 'td,th')).bind(function (td) {\n          return Option.from(editor.dom.getParent(td, 'table')).map(function (table) {\n            return navigateHorizontally(editor, forward, table);\n          });\n        }).getOr(false);\n      };\n    };\n    var moveV$1 = function (editor, forward) {\n      return function () {\n        return Option.from(editor.dom.getParent(editor.selection.getNode(), 'td,th')).bind(function (td) {\n          return Option.from(editor.dom.getParent(td, 'table')).map(function (table) {\n            return navigateVertically(editor, forward, table, td);\n          });\n        }).getOr(false);\n      };\n    };\n\n    var isTarget = function (node) {\n      return contains(['figcaption'], name(node));\n    };\n    var rangeBefore = function (target) {\n      var rng = domGlobals.document.createRange();\n      rng.setStartBefore(target.dom());\n      rng.setEndBefore(target.dom());\n      return rng;\n    };\n    var insertElement = function (root, elm, forward) {\n      if (forward) {\n        append(root, elm);\n      } else {\n        prepend(root, elm);\n      }\n    };\n    var insertBr = function (root, forward) {\n      var br = Element.fromTag('br');\n      insertElement(root, br, forward);\n      return rangeBefore(br);\n    };\n    var insertBlock$1 = function (root, forward, blockName, attrs) {\n      var block = Element.fromTag(blockName);\n      var br = Element.fromTag('br');\n      setAll(block, attrs);\n      append(block, br);\n      insertElement(root, block, forward);\n      return rangeBefore(br);\n    };\n    var insertEmptyLine = function (root, rootBlockName, attrs, forward) {\n      if (rootBlockName === '') {\n        return insertBr(root, forward);\n      } else {\n        return insertBlock$1(root, forward, rootBlockName, attrs);\n      }\n    };\n    var getClosestTargetBlock = function (pos, root) {\n      var isRoot = curry(eq, root);\n      return closest(Element.fromDom(pos.container()), isBlock, isRoot).filter(isTarget);\n    };\n    var isAtFirstOrLastLine = function (root, forward, pos) {\n      return forward ? isAtLastLine(root.dom(), pos) : isAtFirstLine(root.dom(), pos);\n    };\n    var moveCaretToNewEmptyLine = function (editor, forward) {\n      var root = Element.fromDom(editor.getBody());\n      var pos = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n      var rootBlock = Settings.getForcedRootBlock(editor);\n      var rootBlockAttrs = Settings.getForcedRootBlockAttrs(editor);\n      return getClosestTargetBlock(pos, root).exists(function () {\n        if (isAtFirstOrLastLine(root, forward, pos)) {\n          var rng = insertEmptyLine(root, rootBlock, rootBlockAttrs, forward);\n          editor.selection.setRng(rng);\n          return true;\n        } else {\n          return false;\n        }\n      });\n    };\n    var moveV$2 = function (editor, forward) {\n      return function () {\n        if (editor.selection.isCollapsed()) {\n          return moveCaretToNewEmptyLine(editor, forward);\n        } else {\n          return false;\n        }\n      };\n    };\n\n    var defaultPatterns = function (patterns) {\n      return map(patterns, function (pattern) {\n        return __assign({\n          shiftKey: false,\n          altKey: false,\n          ctrlKey: false,\n          metaKey: false,\n          keyCode: 0,\n          action: noop\n        }, pattern);\n      });\n    };\n    var matchesEvent = function (pattern, evt) {\n      return evt.keyCode === pattern.keyCode && evt.shiftKey === pattern.shiftKey && evt.altKey === pattern.altKey && evt.ctrlKey === pattern.ctrlKey && evt.metaKey === pattern.metaKey;\n    };\n    var match$1 = function (patterns, evt) {\n      return bind(defaultPatterns(patterns), function (pattern) {\n        return matchesEvent(pattern, evt) ? [pattern] : [];\n      });\n    };\n    var action = function (f) {\n      var x = [];\n      for (var _i = 1; _i < arguments.length; _i++) {\n        x[_i - 1] = arguments[_i];\n      }\n      var args = Array.prototype.slice.call(arguments, 1);\n      return function () {\n        return f.apply(null, args);\n      };\n    };\n    var execute = function (patterns, evt) {\n      return find(match$1(patterns, evt), function (pattern) {\n        return pattern.action();\n      });\n    };\n    var MatchKeys = {\n      match: match$1,\n      action: action,\n      execute: execute\n    };\n\n    var executeKeydownOverride = function (editor, caret, evt) {\n      var os = detect$3().os;\n      MatchKeys.execute([\n        {\n          keyCode: VK.RIGHT,\n          action: moveH(editor, true)\n        },\n        {\n          keyCode: VK.LEFT,\n          action: moveH(editor, false)\n        },\n        {\n          keyCode: VK.UP,\n          action: moveV(editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: moveV(editor, true)\n        },\n        {\n          keyCode: VK.RIGHT,\n          action: moveH$1(editor, true)\n        },\n        {\n          keyCode: VK.LEFT,\n          action: moveH$1(editor, false)\n        },\n        {\n          keyCode: VK.UP,\n          action: moveV$1(editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: moveV$1(editor, true)\n        },\n        {\n          keyCode: VK.RIGHT,\n          action: BoundarySelection.move(editor, caret, true)\n        },\n        {\n          keyCode: VK.LEFT,\n          action: BoundarySelection.move(editor, caret, false)\n        },\n        {\n          keyCode: VK.RIGHT,\n          ctrlKey: !os.isOSX(),\n          altKey: os.isOSX(),\n          action: BoundarySelection.moveNextWord(editor, caret)\n        },\n        {\n          keyCode: VK.LEFT,\n          ctrlKey: !os.isOSX(),\n          altKey: os.isOSX(),\n          action: BoundarySelection.movePrevWord(editor, caret)\n        },\n        {\n          keyCode: VK.UP,\n          action: moveV$2(editor, false)\n        },\n        {\n          keyCode: VK.DOWN,\n          action: moveV$2(editor, true)\n        }\n      ], evt).each(function (_) {\n        evt.preventDefault();\n      });\n    };\n    var setup$9 = function (editor, caret) {\n      editor.on('keydown', function (evt) {\n        if (evt.isDefaultPrevented() === false) {\n          executeKeydownOverride(editor, caret, evt);\n        }\n      });\n    };\n    var ArrowKeys = { setup: setup$9 };\n\n    var isBeforeRoot = function (rootNode) {\n      return function (elm) {\n        return eq(rootNode, Element.fromDom(elm.dom().parentNode));\n      };\n    };\n    var getParentBlock$1 = function (rootNode, elm) {\n      return contains$2(rootNode, elm) ? closest(elm, function (element) {\n        return isTextBlock(element) || isListItem(element);\n      }, isBeforeRoot(rootNode)) : Option.none();\n    };\n    var placeCaretInEmptyBody = function (editor) {\n      var body = editor.getBody();\n      var node = body.firstChild && editor.dom.isBlock(body.firstChild) ? body.firstChild : body;\n      editor.selection.setCursorLocation(node, 0);\n    };\n    var paddEmptyBody = function (editor) {\n      if (editor.dom.isEmpty(editor.getBody())) {\n        editor.setContent('');\n        placeCaretInEmptyBody(editor);\n      }\n    };\n    var willDeleteLastPositionInElement = function (forward, fromPos, elm) {\n      return lift2(CaretFinder.firstPositionIn(elm), CaretFinder.lastPositionIn(elm), function (firstPos, lastPos) {\n        var normalizedFirstPos = InlineUtils.normalizePosition(true, firstPos);\n        var normalizedLastPos = InlineUtils.normalizePosition(false, lastPos);\n        var normalizedFromPos = InlineUtils.normalizePosition(false, fromPos);\n        if (forward) {\n          return CaretFinder.nextPosition(elm, normalizedFromPos).map(function (nextPos) {\n            return nextPos.isEqual(normalizedLastPos) && fromPos.isEqual(normalizedFirstPos);\n          }).getOr(false);\n        } else {\n          return CaretFinder.prevPosition(elm, normalizedFromPos).map(function (prevPos) {\n            return prevPos.isEqual(normalizedFirstPos) && fromPos.isEqual(normalizedLastPos);\n          }).getOr(false);\n        }\n      }).getOr(true);\n    };\n    var DeleteUtils = {\n      getParentBlock: getParentBlock$1,\n      paddEmptyBody: paddEmptyBody,\n      willDeleteLastPositionInElement: willDeleteLastPositionInElement\n    };\n\n    var blockPosition = function (block, position) {\n      return {\n        block: constant(block),\n        position: constant(position)\n      };\n    };\n    var blockBoundary = function (from, to) {\n      return {\n        from: constant(from),\n        to: constant(to)\n      };\n    };\n    var getBlockPosition = function (rootNode, pos) {\n      var rootElm = Element.fromDom(rootNode);\n      var containerElm = Element.fromDom(pos.container());\n      return DeleteUtils.getParentBlock(rootElm, containerElm).map(function (block) {\n        return blockPosition(block, pos);\n      });\n    };\n    var isDifferentBlocks = function (blockBoundary) {\n      return eq(blockBoundary.from().block(), blockBoundary.to().block()) === false;\n    };\n    var hasSameParent = function (blockBoundary) {\n      return parent(blockBoundary.from().block()).bind(function (parent1) {\n        return parent(blockBoundary.to().block()).filter(function (parent2) {\n          return eq(parent1, parent2);\n        });\n      }).isSome();\n    };\n    var isEditable = function (blockBoundary) {\n      return NodeType.isContentEditableFalse(blockBoundary.from().block().dom()) === false && NodeType.isContentEditableFalse(blockBoundary.to().block().dom()) === false;\n    };\n    var skipLastBr = function (rootNode, forward, blockPosition) {\n      if (NodeType.isBr(blockPosition.position().getNode()) && Empty.isEmpty(blockPosition.block()) === false) {\n        return CaretFinder.positionIn(false, blockPosition.block().dom()).bind(function (lastPositionInBlock) {\n          if (lastPositionInBlock.isEqual(blockPosition.position())) {\n            return CaretFinder.fromPosition(forward, rootNode, lastPositionInBlock).bind(function (to) {\n              return getBlockPosition(rootNode, to);\n            });\n          } else {\n            return Option.some(blockPosition);\n          }\n        }).getOr(blockPosition);\n      } else {\n        return blockPosition;\n      }\n    };\n    var readFromRange = function (rootNode, forward, rng) {\n      var fromBlockPos = getBlockPosition(rootNode, CaretPosition$1.fromRangeStart(rng));\n      var toBlockPos = fromBlockPos.bind(function (blockPos) {\n        return CaretFinder.fromPosition(forward, rootNode, blockPos.position()).bind(function (to) {\n          return getBlockPosition(rootNode, to).map(function (blockPos) {\n            return skipLastBr(rootNode, forward, blockPos);\n          });\n        });\n      });\n      return lift2(fromBlockPos, toBlockPos, blockBoundary).filter(function (blockBoundary) {\n        return isDifferentBlocks(blockBoundary) && hasSameParent(blockBoundary) && isEditable(blockBoundary);\n      });\n    };\n    var read$3 = function (rootNode, forward, rng) {\n      return rng.collapsed ? readFromRange(rootNode, forward, rng) : Option.none();\n    };\n    var BlockMergeBoundary = { read: read$3 };\n\n    var getChildrenUntilBlockBoundary = function (block) {\n      var children$1 = children(block);\n      return findIndex(children$1, isBlock).fold(function () {\n        return children$1;\n      }, function (index) {\n        return children$1.slice(0, index);\n      });\n    };\n    var extractChildren = function (block) {\n      var children = getChildrenUntilBlockBoundary(block);\n      each(children, remove);\n      return children;\n    };\n    var removeEmptyRoot = function (rootNode, block) {\n      var parents = Parents.parentsAndSelf(block, rootNode);\n      return find(parents.reverse(), function (element) {\n        return Empty.isEmpty(element);\n      }).each(remove);\n    };\n    var isEmptyBefore = function (el) {\n      return filter(prevSiblings(el), function (el) {\n        return !Empty.isEmpty(el);\n      }).length === 0;\n    };\n    var nestedBlockMerge = function (rootNode, fromBlock, toBlock, insertionPoint) {\n      if (Empty.isEmpty(toBlock)) {\n        PaddingBr.fillWithPaddingBr(toBlock);\n        return CaretFinder.firstPositionIn(toBlock.dom());\n      }\n      if (isEmptyBefore(insertionPoint) && Empty.isEmpty(fromBlock)) {\n        before(insertionPoint, Element.fromTag('br'));\n      }\n      var position = CaretFinder.prevPosition(toBlock.dom(), CaretPosition$1.before(insertionPoint.dom()));\n      each(extractChildren(fromBlock), function (child) {\n        before(insertionPoint, child);\n      });\n      removeEmptyRoot(rootNode, fromBlock);\n      return position;\n    };\n    var sidelongBlockMerge = function (rootNode, fromBlock, toBlock) {\n      if (Empty.isEmpty(toBlock)) {\n        remove(toBlock);\n        if (Empty.isEmpty(fromBlock)) {\n          PaddingBr.fillWithPaddingBr(fromBlock);\n        }\n        return CaretFinder.firstPositionIn(fromBlock.dom());\n      }\n      var position = CaretFinder.lastPositionIn(toBlock.dom());\n      each(extractChildren(fromBlock), function (child) {\n        append(toBlock, child);\n      });\n      removeEmptyRoot(rootNode, fromBlock);\n      return position;\n    };\n    var findInsertionPoint = function (toBlock, block) {\n      var parentsAndSelf = Parents.parentsAndSelf(block, toBlock);\n      return Option.from(parentsAndSelf[parentsAndSelf.length - 1]);\n    };\n    var getInsertionPoint = function (fromBlock, toBlock) {\n      return contains$2(toBlock, fromBlock) ? findInsertionPoint(toBlock, fromBlock) : Option.none();\n    };\n    var trimBr = function (first, block) {\n      CaretFinder.positionIn(first, block.dom()).map(function (position) {\n        return position.getNode();\n      }).map(Element.fromDom).filter(isBr$1).each(remove);\n    };\n    var mergeBlockInto = function (rootNode, fromBlock, toBlock) {\n      trimBr(true, fromBlock);\n      trimBr(false, toBlock);\n      return getInsertionPoint(fromBlock, toBlock).fold(curry(sidelongBlockMerge, rootNode, fromBlock, toBlock), curry(nestedBlockMerge, rootNode, fromBlock, toBlock));\n    };\n    var mergeBlocks = function (rootNode, forward, block1, block2) {\n      return forward ? mergeBlockInto(rootNode, block2, block1) : mergeBlockInto(rootNode, block1, block2);\n    };\n    var MergeBlocks = { mergeBlocks: mergeBlocks };\n\n    var backspaceDelete = function (editor, forward) {\n      var rootNode = Element.fromDom(editor.getBody());\n      var position = BlockMergeBoundary.read(rootNode.dom(), forward, editor.selection.getRng()).bind(function (blockBoundary) {\n        return MergeBlocks.mergeBlocks(rootNode, forward, blockBoundary.from().block(), blockBoundary.to().block());\n      });\n      position.each(function (pos) {\n        editor.selection.setRng(pos.toRange());\n      });\n      return position.isSome();\n    };\n    var BlockBoundaryDelete = { backspaceDelete: backspaceDelete };\n\n    var deleteRangeMergeBlocks = function (rootNode, selection) {\n      var rng = selection.getRng();\n      return lift2(DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.startContainer)), DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.endContainer)), function (block1, block2) {\n        if (eq(block1, block2) === false) {\n          rng.deleteContents();\n          MergeBlocks.mergeBlocks(rootNode, true, block1, block2).each(function (pos) {\n            selection.setRng(pos.toRange());\n          });\n          return true;\n        } else {\n          return false;\n        }\n      }).getOr(false);\n    };\n    var isRawNodeInTable = function (root, rawNode) {\n      var node = Element.fromDom(rawNode);\n      var isRoot = curry(eq, root);\n      return ancestor(node, isTableCell, isRoot).isSome();\n    };\n    var isSelectionInTable = function (root, rng) {\n      return isRawNodeInTable(root, rng.startContainer) || isRawNodeInTable(root, rng.endContainer);\n    };\n    var isEverythingSelected = function (root, rng) {\n      var noPrevious = CaretFinder.prevPosition(root.dom(), CaretPosition$1.fromRangeStart(rng)).isNone();\n      var noNext = CaretFinder.nextPosition(root.dom(), CaretPosition$1.fromRangeEnd(rng)).isNone();\n      return !isSelectionInTable(root, rng) && noPrevious && noNext;\n    };\n    var emptyEditor = function (editor) {\n      editor.setContent('');\n      editor.selection.setCursorLocation();\n      return true;\n    };\n    var deleteRange = function (editor) {\n      var rootNode = Element.fromDom(editor.getBody());\n      var rng = editor.selection.getRng();\n      return isEverythingSelected(rootNode, rng) ? emptyEditor(editor) : deleteRangeMergeBlocks(rootNode, editor.selection);\n    };\n    var backspaceDelete$1 = function (editor, forward) {\n      return editor.selection.isCollapsed() ? false : deleteRange(editor);\n    };\n    var BlockRangeDelete = { backspaceDelete: backspaceDelete$1 };\n\n    var isBr$5 = function (pos) {\n      return getElementFromPosition(pos).exists(isBr$1);\n    };\n    var findBr = function (forward, root, pos) {\n      var parentBlocks = filter(Parents.parentsAndSelf(Element.fromDom(pos.container()), root), isBlock);\n      var scope = head(parentBlocks).getOr(root);\n      return CaretFinder.fromPosition(forward, scope.dom(), pos).filter(isBr$5);\n    };\n    var isBeforeBr = function (root, pos) {\n      return getElementFromPosition(pos).exists(isBr$1) || findBr(true, root, pos).isSome();\n    };\n    var isAfterBr = function (root, pos) {\n      return getElementFromPrevPosition(pos).exists(isBr$1) || findBr(false, root, pos).isSome();\n    };\n    var findPreviousBr = curry(findBr, false);\n    var findNextBr = curry(findBr, true);\n\n    var isCompoundElement = function (node) {\n      return isTableCell(Element.fromDom(node)) || isListItem(Element.fromDom(node));\n    };\n    var DeleteAction = Adt.generate([\n      { remove: ['element'] },\n      { moveToElement: ['element'] },\n      { moveToPosition: ['position'] }\n    ]);\n    var isAtContentEditableBlockCaret = function (forward, from) {\n      var elm = from.getNode(forward === false);\n      var caretLocation = forward ? 'after' : 'before';\n      return NodeType.isElement(elm) && elm.getAttribute('data-mce-caret') === caretLocation;\n    };\n    var isDeleteFromCefDifferentBlocks = function (root, forward, from, to) {\n      var inSameBlock = function (elm) {\n        return isInline(Element.fromDom(elm)) && !isInSameBlock(from, to, root);\n      };\n      return getRelativeCefElm(!forward, from).fold(function () {\n        return getRelativeCefElm(forward, to).fold(constant(false), inSameBlock);\n      }, inSameBlock);\n    };\n    var deleteEmptyBlockOrMoveToCef = function (root, forward, from, to) {\n      var toCefElm = to.getNode(forward === false);\n      return DeleteUtils.getParentBlock(Element.fromDom(root), Element.fromDom(from.getNode())).map(function (blockElm) {\n        return Empty.isEmpty(blockElm) ? DeleteAction.remove(blockElm.dom()) : DeleteAction.moveToElement(toCefElm);\n      }).orThunk(function () {\n        return Option.some(DeleteAction.moveToElement(toCefElm));\n      });\n    };\n    var findCefPosition = function (root, forward, from) {\n      return CaretFinder.fromPosition(forward, root, from).bind(function (to) {\n        if (isCompoundElement(to.getNode())) {\n          return Option.none();\n        } else if (isDeleteFromCefDifferentBlocks(root, forward, from, to)) {\n          return Option.none();\n        } else if (forward && NodeType.isContentEditableFalse(to.getNode())) {\n          return deleteEmptyBlockOrMoveToCef(root, forward, from, to);\n        } else if (forward === false && NodeType.isContentEditableFalse(to.getNode(true))) {\n          return deleteEmptyBlockOrMoveToCef(root, forward, from, to);\n        } else if (forward && isAfterContentEditableFalse(from)) {\n          return Option.some(DeleteAction.moveToPosition(to));\n        } else if (forward === false && isBeforeContentEditableFalse(from)) {\n          return Option.some(DeleteAction.moveToPosition(to));\n        } else {\n          return Option.none();\n        }\n      });\n    };\n    var getContentEditableBlockAction = function (forward, elm) {\n      if (forward && NodeType.isContentEditableFalse(elm.nextSibling)) {\n        return Option.some(DeleteAction.moveToElement(elm.nextSibling));\n      } else if (forward === false && NodeType.isContentEditableFalse(elm.previousSibling)) {\n        return Option.some(DeleteAction.moveToElement(elm.previousSibling));\n      } else {\n        return Option.none();\n      }\n    };\n    var skipMoveToActionFromInlineCefToContent = function (root, from, deleteAction) {\n      return deleteAction.fold(function (elm) {\n        return Option.some(DeleteAction.remove(elm));\n      }, function (elm) {\n        return Option.some(DeleteAction.moveToElement(elm));\n      }, function (to) {\n        if (isInSameBlock(from, to, root)) {\n          return Option.none();\n        } else {\n          return Option.some(DeleteAction.moveToPosition(to));\n        }\n      });\n    };\n    var getContentEditableAction = function (root, forward, from) {\n      if (isAtContentEditableBlockCaret(forward, from)) {\n        return getContentEditableBlockAction(forward, from.getNode(forward === false)).fold(function () {\n          return findCefPosition(root, forward, from);\n        }, Option.some);\n      } else {\n        return findCefPosition(root, forward, from).bind(function (deleteAction) {\n          return skipMoveToActionFromInlineCefToContent(root, from, deleteAction);\n        });\n      }\n    };\n    var read$4 = function (root, forward, rng) {\n      var normalizedRange = normalizeRange(forward ? 1 : -1, root, rng);\n      var from = CaretPosition$1.fromRangeStart(normalizedRange);\n      var rootElement = Element.fromDom(root);\n      if (forward === false && isAfterContentEditableFalse(from)) {\n        return Option.some(DeleteAction.remove(from.getNode(true)));\n      } else if (forward && isBeforeContentEditableFalse(from)) {\n        return Option.some(DeleteAction.remove(from.getNode()));\n      } else if (forward === false && isBeforeContentEditableFalse(from) && isAfterBr(rootElement, from)) {\n        return findPreviousBr(rootElement, from).map(function (br) {\n          return DeleteAction.remove(br.getNode());\n        });\n      } else if (forward && isAfterContentEditableFalse(from) && isBeforeBr(rootElement, from)) {\n        return findNextBr(rootElement, from).map(function (br) {\n          return DeleteAction.remove(br.getNode());\n        });\n      } else {\n        return getContentEditableAction(root, forward, from);\n      }\n    };\n\n    var deleteElement$1 = function (editor, forward) {\n      return function (element) {\n        editor._selectionOverrides.hideFakeCaret();\n        DeleteElement.deleteElement(editor, forward, Element.fromDom(element));\n        return true;\n      };\n    };\n    var moveToElement = function (editor, forward) {\n      return function (element) {\n        var pos = forward ? CaretPosition$1.before(element) : CaretPosition$1.after(element);\n        editor.selection.setRng(pos.toRange());\n        return true;\n      };\n    };\n    var moveToPosition = function (editor) {\n      return function (pos) {\n        editor.selection.setRng(pos.toRange());\n        return true;\n      };\n    };\n    var getAncestorCe = function (editor, node) {\n      return Option.from(getContentEditableRoot$1(editor.getBody(), node));\n    };\n    var backspaceDeleteCaret = function (editor, forward) {\n      var selectedNode = editor.selection.getNode();\n      return getAncestorCe(editor, selectedNode).filter(NodeType.isContentEditableFalse).fold(function () {\n        var result = read$4(editor.getBody(), forward, editor.selection.getRng()).map(function (deleteAction) {\n          return deleteAction.fold(deleteElement$1(editor, forward), moveToElement(editor, forward), moveToPosition(editor));\n        });\n        return result.getOr(false);\n      }, function () {\n        return true;\n      });\n    };\n    var deleteOffscreenSelection = function (rootElement) {\n      each(descendants$1(rootElement, '.mce-offscreen-selection'), remove);\n    };\n    var backspaceDeleteRange = function (editor, forward) {\n      var selectedNode = editor.selection.getNode();\n      if (NodeType.isContentEditableFalse(selectedNode)) {\n        var hasCefAncestor = getAncestorCe(editor, selectedNode.parentNode).filter(NodeType.isContentEditableFalse);\n        return hasCefAncestor.fold(function () {\n          deleteOffscreenSelection(Element.fromDom(editor.getBody()));\n          DeleteElement.deleteElement(editor, forward, Element.fromDom(editor.selection.getNode()));\n          DeleteUtils.paddEmptyBody(editor);\n          return true;\n        }, function () {\n          return true;\n        });\n      }\n      return false;\n    };\n    var getContentEditableRoot$1 = function (root, node) {\n      while (node && node !== root) {\n        if (NodeType.isContentEditableTrue(node) || NodeType.isContentEditableFalse(node)) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    };\n    var paddEmptyElement = function (editor) {\n      var br;\n      var ceRoot = getContentEditableRoot$1(editor.getBody(), editor.selection.getNode());\n      if (NodeType.isContentEditableTrue(ceRoot) && editor.dom.isBlock(ceRoot) && editor.dom.isEmpty(ceRoot)) {\n        br = editor.dom.create('br', { 'data-mce-bogus': '1' });\n        editor.dom.setHTML(ceRoot, '');\n        ceRoot.appendChild(br);\n        editor.selection.setRng(CaretPosition$1.before(br).toRange());\n      }\n      return true;\n    };\n    var backspaceDelete$2 = function (editor, forward) {\n      if (editor.selection.isCollapsed()) {\n        return backspaceDeleteCaret(editor, forward);\n      } else {\n        return backspaceDeleteRange(editor, forward);\n      }\n    };\n    var CefDelete = {\n      backspaceDelete: backspaceDelete$2,\n      paddEmptyElement: paddEmptyElement\n    };\n\n    var trimEmptyTextNode$1 = function (dom, node) {\n      if (NodeType.isText(node) && node.data.length === 0) {\n        dom.remove(node);\n      }\n    };\n    var deleteContentAndShowCaret = function (editor, range, node, direction, forward, peekCaretPosition) {\n      var caretRange = showCaret(direction, editor, peekCaretPosition.getNode(!forward), forward, true);\n      if (range.collapsed) {\n        var deleteRange = range.cloneRange();\n        if (forward) {\n          deleteRange.setEnd(caretRange.startContainer, caretRange.startOffset);\n        } else {\n          deleteRange.setStart(caretRange.endContainer, caretRange.endOffset);\n        }\n        deleteRange.deleteContents();\n      } else {\n        range.deleteContents();\n      }\n      editor.selection.setRng(caretRange);\n      trimEmptyTextNode$1(editor.dom, node);\n      return true;\n    };\n    var deleteCefBoundaryText = function (editor, forward) {\n      var range = editor.selection.getRng();\n      if (!NodeType.isText(range.commonAncestorContainer)) {\n        return false;\n      }\n      var direction = forward ? HDirection.Forwards : HDirection.Backwards;\n      var caretWalker = CaretWalker(editor.getBody());\n      var getNextVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.next);\n      var getPrevVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.prev);\n      var getNextPosFn = forward ? getNextVisualCaretPosition : getPrevVisualCaretPosition;\n      var isBeforeContentEditableFalseFn = forward ? isBeforeContentEditableFalse : isAfterContentEditableFalse;\n      var caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);\n      var nextCaretPosition = InlineUtils.normalizePosition(forward, getNextPosFn(caretPosition));\n      if (!nextCaretPosition || !isMoveInsideSameBlock(caretPosition, nextCaretPosition)) {\n        return false;\n      } else if (isBeforeContentEditableFalseFn(nextCaretPosition)) {\n        return deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, nextCaretPosition);\n      }\n      var peekCaretPosition = getNextPosFn(nextCaretPosition);\n      if (peekCaretPosition && isBeforeContentEditableFalseFn(peekCaretPosition)) {\n        if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {\n          return deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, peekCaretPosition);\n        }\n      }\n      return false;\n    };\n    var backspaceDelete$3 = function (editor, forward) {\n      return deleteCefBoundaryText(editor, forward);\n    };\n    var CefBoundaryDelete = { backspaceDelete: backspaceDelete$3 };\n\n    var isFeatureEnabled$1 = function (editor) {\n      return editor.settings.inline_boundaries !== false;\n    };\n    var rangeFromPositions = function (from, to) {\n      var range = domGlobals.document.createRange();\n      range.setStart(from.container(), from.offset());\n      range.setEnd(to.container(), to.offset());\n      return range;\n    };\n    var hasOnlyTwoOrLessPositionsLeft = function (elm) {\n      return lift2(CaretFinder.firstPositionIn(elm), CaretFinder.lastPositionIn(elm), function (firstPos, lastPos) {\n        var normalizedFirstPos = InlineUtils.normalizePosition(true, firstPos);\n        var normalizedLastPos = InlineUtils.normalizePosition(false, lastPos);\n        return CaretFinder.nextPosition(elm, normalizedFirstPos).map(function (pos) {\n          return pos.isEqual(normalizedLastPos);\n        }).getOr(true);\n      }).getOr(true);\n    };\n    var setCaretLocation = function (editor, caret) {\n      return function (location) {\n        return BoundaryCaret.renderCaret(caret, location).map(function (pos) {\n          BoundarySelection.setCaretPosition(editor, pos);\n          return true;\n        }).getOr(false);\n      };\n    };\n    var deleteFromTo = function (editor, caret, from, to) {\n      var rootNode = editor.getBody();\n      var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);\n      editor.undoManager.ignore(function () {\n        editor.selection.setRng(rangeFromPositions(from, to));\n        editor.execCommand('Delete');\n        BoundaryLocation.readLocation(isInlineTarget, rootNode, CaretPosition$1.fromRangeStart(editor.selection.getRng())).map(BoundaryLocation.inside).map(setCaretLocation(editor, caret));\n      });\n      editor.nodeChanged();\n    };\n    var rescope$1 = function (rootNode, node) {\n      var parentBlock = getParentBlock(node, rootNode);\n      return parentBlock ? parentBlock : rootNode;\n    };\n    var backspaceDeleteCollapsed = function (editor, caret, forward, from) {\n      var rootNode = rescope$1(editor.getBody(), from.container());\n      var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);\n      var fromLocation = BoundaryLocation.readLocation(isInlineTarget, rootNode, from);\n      return fromLocation.bind(function (location) {\n        if (forward) {\n          return location.fold(constant(Option.some(BoundaryLocation.inside(location))), Option.none, constant(Option.some(BoundaryLocation.outside(location))), Option.none);\n        } else {\n          return location.fold(Option.none, constant(Option.some(BoundaryLocation.outside(location))), Option.none, constant(Option.some(BoundaryLocation.inside(location))));\n        }\n      }).map(setCaretLocation(editor, caret)).getOrThunk(function () {\n        var toPosition = CaretFinder.navigate(forward, rootNode, from);\n        var toLocation = toPosition.bind(function (pos) {\n          return BoundaryLocation.readLocation(isInlineTarget, rootNode, pos);\n        });\n        if (fromLocation.isSome() && toLocation.isSome()) {\n          return InlineUtils.findRootInline(isInlineTarget, rootNode, from).map(function (elm) {\n            if (hasOnlyTwoOrLessPositionsLeft(elm)) {\n              DeleteElement.deleteElement(editor, forward, Element.fromDom(elm));\n              return true;\n            } else {\n              return false;\n            }\n          }).getOr(false);\n        } else {\n          return toLocation.bind(function (_) {\n            return toPosition.map(function (to) {\n              if (forward) {\n                deleteFromTo(editor, caret, from, to);\n              } else {\n                deleteFromTo(editor, caret, to, from);\n              }\n              return true;\n            });\n          }).getOr(false);\n        }\n      });\n    };\n    var backspaceDelete$4 = function (editor, caret, forward) {\n      if (editor.selection.isCollapsed() && isFeatureEnabled$1(editor)) {\n        var from = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n        return backspaceDeleteCollapsed(editor, caret, forward, from);\n      }\n      return false;\n    };\n    var BoundaryDelete = { backspaceDelete: backspaceDelete$4 };\n\n    var getParentInlines = function (rootElm, startElm) {\n      var parents = Parents.parentsAndSelf(startElm, rootElm);\n      return findIndex(parents, isBlock).fold(constant(parents), function (index) {\n        return parents.slice(0, index);\n      });\n    };\n    var hasOnlyOneChild = function (elm) {\n      return children(elm).length === 1;\n    };\n    var deleteLastPosition = function (forward, editor, target, parentInlines) {\n      var isFormatElement$1 = curry(isFormatElement, editor);\n      var formatNodes = map(filter(parentInlines, isFormatElement$1), function (elm) {\n        return elm.dom();\n      });\n      if (formatNodes.length === 0) {\n        DeleteElement.deleteElement(editor, forward, target);\n      } else {\n        var pos = replaceWithCaretFormat(target.dom(), formatNodes);\n        editor.selection.setRng(pos.toRange());\n      }\n    };\n    var deleteCaret = function (editor, forward) {\n      var rootElm = Element.fromDom(editor.getBody());\n      var startElm = Element.fromDom(editor.selection.getStart());\n      var parentInlines = filter(getParentInlines(rootElm, startElm), hasOnlyOneChild);\n      return last(parentInlines).map(function (target) {\n        var fromPos = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n        if (DeleteUtils.willDeleteLastPositionInElement(forward, fromPos, target.dom()) && !isEmptyCaretFormatElement(target)) {\n          deleteLastPosition(forward, editor, target, parentInlines);\n          return true;\n        } else {\n          return false;\n        }\n      }).getOr(false);\n    };\n    var backspaceDelete$5 = function (editor, forward) {\n      return editor.selection.isCollapsed() ? deleteCaret(editor, forward) : false;\n    };\n    var InlineFormatDelete = { backspaceDelete: backspaceDelete$5 };\n\n    var tableCellRng = function (start, end) {\n      return {\n        start: constant(start),\n        end: constant(end)\n      };\n    };\n    var tableSelection = function (rng, table, cells) {\n      return {\n        rng: constant(rng),\n        table: constant(table),\n        cells: constant(cells)\n      };\n    };\n    var deleteAction = Adt.generate([\n      { removeTable: ['element'] },\n      { emptyCells: ['cells'] }\n    ]);\n    var isRootFromElement = function (root) {\n      return function (cur) {\n        return eq(root, cur);\n      };\n    };\n    var getClosestCell$1 = function (container, isRoot) {\n      return closest$1(Element.fromDom(container), 'td,th', isRoot);\n    };\n    var getClosestTable = function (cell, isRoot) {\n      return ancestor$1(cell, 'table', isRoot);\n    };\n    var isExpandedCellRng = function (cellRng) {\n      return eq(cellRng.start(), cellRng.end()) === false;\n    };\n    var getTableFromCellRng = function (cellRng, isRoot) {\n      return getClosestTable(cellRng.start(), isRoot).bind(function (startParentTable) {\n        return getClosestTable(cellRng.end(), isRoot).bind(function (endParentTable) {\n          return someIf(eq(startParentTable, endParentTable), startParentTable);\n        });\n      });\n    };\n    var getTableCells = function (table) {\n      return descendants$1(table, 'td,th');\n    };\n    var getCellRangeFromStartTable = function (cellRng, isRoot) {\n      return getClosestTable(cellRng.start(), isRoot).bind(function (table) {\n        return last(getTableCells(table)).map(function (endCell) {\n          return tableCellRng(cellRng.start(), endCell);\n        });\n      });\n    };\n    var partialSelection = function (isRoot, rng) {\n      var startCell = getClosestCell$1(rng.startContainer, isRoot);\n      var endCell = getClosestCell$1(rng.endContainer, isRoot);\n      return rng.collapsed ? Option.none() : lift2(startCell, endCell, tableCellRng).fold(function () {\n        return startCell.fold(function () {\n          return endCell.bind(function (endCell) {\n            return getClosestTable(endCell, isRoot).bind(function (table) {\n              return head(getTableCells(table)).map(function (startCell) {\n                return tableCellRng(startCell, endCell);\n              });\n            });\n          });\n        }, function (startCell) {\n          return getClosestTable(startCell, isRoot).bind(function (table) {\n            return last(getTableCells(table)).map(function (endCell) {\n              return tableCellRng(startCell, endCell);\n            });\n          });\n        });\n      }, function (cellRng) {\n        return isWithinSameTable(isRoot, cellRng) ? Option.none() : getCellRangeFromStartTable(cellRng, isRoot);\n      });\n    };\n    var isWithinSameTable = function (isRoot, cellRng) {\n      return getTableFromCellRng(cellRng, isRoot).isSome();\n    };\n    var getCellRng = function (rng, isRoot) {\n      var startCell = getClosestCell$1(rng.startContainer, isRoot);\n      var endCell = getClosestCell$1(rng.endContainer, isRoot);\n      return lift2(startCell, endCell, tableCellRng).filter(isExpandedCellRng).filter(function (cellRng) {\n        return isWithinSameTable(isRoot, cellRng);\n      }).orThunk(function () {\n        return partialSelection(isRoot, rng);\n      });\n    };\n    var getTableSelectionFromCellRng = function (cellRng, isRoot) {\n      return getTableFromCellRng(cellRng, isRoot).map(function (table) {\n        return tableSelection(cellRng, table, getTableCells(table));\n      });\n    };\n    var getTableSelectionFromRng = function (root, rng) {\n      var isRoot = isRootFromElement(root);\n      return getCellRng(rng, isRoot).bind(function (cellRng) {\n        return getTableSelectionFromCellRng(cellRng, isRoot);\n      });\n    };\n    var getCellIndex = function (cells, cell) {\n      return findIndex(cells, function (x) {\n        return eq(x, cell);\n      });\n    };\n    var getSelectedCells = function (tableSelection) {\n      return lift2(getCellIndex(tableSelection.cells(), tableSelection.rng().start()), getCellIndex(tableSelection.cells(), tableSelection.rng().end()), function (startIndex, endIndex) {\n        return tableSelection.cells().slice(startIndex, endIndex + 1);\n      });\n    };\n    var getAction = function (tableSelection) {\n      return getSelectedCells(tableSelection).map(function (selected) {\n        var cells = tableSelection.cells();\n        return selected.length === cells.length ? deleteAction.removeTable(tableSelection.table()) : deleteAction.emptyCells(selected);\n      });\n    };\n    var getActionFromRange = function (root, rng) {\n      return getTableSelectionFromRng(root, rng).bind(getAction);\n    };\n\n    var emptyCells = function (editor, cells) {\n      each(cells, PaddingBr.fillWithPaddingBr);\n      editor.selection.setCursorLocation(cells[0].dom(), 0);\n      return true;\n    };\n    var deleteTableElement = function (editor, table) {\n      DeleteElement.deleteElement(editor, false, table);\n      return true;\n    };\n    var deleteCellRange = function (editor, rootElm, rng) {\n      return getActionFromRange(rootElm, rng).map(function (action) {\n        return action.fold(curry(deleteTableElement, editor), curry(emptyCells, editor));\n      });\n    };\n    var deleteCaptionRange = function (editor, caption) {\n      return emptyElement(editor, caption);\n    };\n    var deleteTableRange = function (editor, rootElm, rng, startElm) {\n      return getParentCaption(rootElm, startElm).fold(function () {\n        return deleteCellRange(editor, rootElm, rng);\n      }, function (caption) {\n        return deleteCaptionRange(editor, caption);\n      }).getOr(false);\n    };\n    var deleteRange$1 = function (editor, startElm) {\n      var rootNode = Element.fromDom(editor.getBody());\n      var rng = editor.selection.getRng();\n      var selectedCells = TableCellSelection.getCellsFromEditor(editor);\n      return selectedCells.length !== 0 ? emptyCells(editor, selectedCells) : deleteTableRange(editor, rootNode, rng, startElm);\n    };\n    var getParentCell = function (rootElm, elm) {\n      return find(Parents.parentsAndSelf(elm, rootElm), isTableCell);\n    };\n    var getParentCaption = function (rootElm, elm) {\n      return find(Parents.parentsAndSelf(elm, rootElm), function (elm) {\n        return name(elm) === 'caption';\n      });\n    };\n    var deleteBetweenCells = function (editor, rootElm, forward, fromCell, from) {\n      return CaretFinder.navigate(forward, editor.getBody(), from).bind(function (to) {\n        return getParentCell(rootElm, Element.fromDom(to.getNode())).map(function (toCell) {\n          return eq(toCell, fromCell) === false;\n        });\n      });\n    };\n    var emptyElement = function (editor, elm) {\n      PaddingBr.fillWithPaddingBr(elm);\n      editor.selection.setCursorLocation(elm.dom(), 0);\n      return Option.some(true);\n    };\n    var isDeleteOfLastCharPos = function (fromCaption, forward, from, to) {\n      return CaretFinder.firstPositionIn(fromCaption.dom()).bind(function (first) {\n        return CaretFinder.lastPositionIn(fromCaption.dom()).map(function (last) {\n          return forward ? from.isEqual(first) && to.isEqual(last) : from.isEqual(last) && to.isEqual(first);\n        });\n      }).getOr(true);\n    };\n    var emptyCaretCaption = function (editor, elm) {\n      return emptyElement(editor, elm);\n    };\n    var validateCaretCaption = function (rootElm, fromCaption, to) {\n      return getParentCaption(rootElm, Element.fromDom(to.getNode())).map(function (toCaption) {\n        return eq(toCaption, fromCaption) === false;\n      });\n    };\n    var deleteCaretInsideCaption = function (editor, rootElm, forward, fromCaption, from) {\n      return CaretFinder.navigate(forward, editor.getBody(), from).bind(function (to) {\n        return isDeleteOfLastCharPos(fromCaption, forward, from, to) ? emptyCaretCaption(editor, fromCaption) : validateCaretCaption(rootElm, fromCaption, to);\n      }).or(Option.some(true));\n    };\n    var deleteCaretCells = function (editor, forward, rootElm, startElm) {\n      var from = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n      return getParentCell(rootElm, startElm).bind(function (fromCell) {\n        return Empty.isEmpty(fromCell) ? emptyElement(editor, fromCell) : deleteBetweenCells(editor, rootElm, forward, fromCell, from);\n      }).getOr(false);\n    };\n    var deleteCaretCaption = function (editor, forward, rootElm, fromCaption) {\n      var from = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n      return Empty.isEmpty(fromCaption) ? emptyElement(editor, fromCaption) : deleteCaretInsideCaption(editor, rootElm, forward, fromCaption, from);\n    };\n    var isNearTable = function (forward, pos) {\n      return forward ? isBeforeTable(pos) : isAfterTable(pos);\n    };\n    var isBeforeOrAfterTable = function (editor, forward) {\n      var fromPos = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n      return isNearTable(forward, fromPos) || CaretFinder.fromPosition(forward, editor.getBody(), fromPos).map(function (pos) {\n        return isNearTable(forward, pos);\n      }).getOr(false);\n    };\n    var deleteCaret$1 = function (editor, forward, startElm) {\n      var rootElm = Element.fromDom(editor.getBody());\n      return getParentCaption(rootElm, startElm).fold(function () {\n        return deleteCaretCells(editor, forward, rootElm, startElm) || isBeforeOrAfterTable(editor, forward);\n      }, function (fromCaption) {\n        return deleteCaretCaption(editor, forward, rootElm, fromCaption).getOr(false);\n      });\n    };\n    var backspaceDelete$6 = function (editor, forward) {\n      var startElm = Element.fromDom(editor.selection.getStart(true));\n      var cells = TableCellSelection.getCellsFromEditor(editor);\n      return editor.selection.isCollapsed() && cells.length === 0 ? deleteCaret$1(editor, forward, startElm) : deleteRange$1(editor, startElm);\n    };\n    var TableDelete = { backspaceDelete: backspaceDelete$6 };\n\n    var deleteCaret$2 = function (editor, forward) {\n      var fromPos = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n      return CaretFinder.fromPosition(forward, editor.getBody(), fromPos).filter(function (pos) {\n        return forward ? isBeforeImageBlock(pos) : isAfterImageBlock(pos);\n      }).bind(function (pos) {\n        return Option.from(getChildNodeAtRelativeOffset(forward ? 0 : -1, pos));\n      }).map(function (elm) {\n        editor.selection.select(elm);\n        return true;\n      }).getOr(false);\n    };\n    var backspaceDelete$7 = function (editor, forward) {\n      return editor.selection.isCollapsed() ? deleteCaret$2(editor, forward) : false;\n    };\n    var PageBreakDelete = { backspaceDelete: backspaceDelete$7 };\n\n    var isEditable$1 = function (target) {\n      return closest(target, function (elm) {\n        return NodeType.isContentEditableTrue(elm.dom()) || NodeType.isContentEditableFalse(elm.dom());\n      }).exists(function (elm) {\n        return NodeType.isContentEditableTrue(elm.dom());\n      });\n    };\n    var parseIndentValue = function (value) {\n      var number = parseInt(value, 10);\n      return isNaN(number) ? 0 : number;\n    };\n    var getIndentStyleName = function (useMargin, element) {\n      var indentStyleName = useMargin || isTable$1(element) ? 'margin' : 'padding';\n      var suffix = get$4(element, 'direction') === 'rtl' ? '-right' : '-left';\n      return indentStyleName + suffix;\n    };\n    var indentElement = function (dom, command, useMargin, value, unit, element) {\n      var indentStyleName = getIndentStyleName(useMargin, Element.fromDom(element));\n      if (command === 'outdent') {\n        var styleValue = Math.max(0, parseIndentValue(element.style[indentStyleName]) - value);\n        dom.setStyle(element, indentStyleName, styleValue ? styleValue + unit : '');\n      } else {\n        var styleValue = parseIndentValue(element.style[indentStyleName]) + value + unit;\n        dom.setStyle(element, indentStyleName, styleValue);\n      }\n    };\n    var validateBlocks = function (editor, blocks) {\n      return forall(blocks, function (block) {\n        var indentStyleName = getIndentStyleName(Settings.shouldIndentUseMargin(editor), block);\n        var intentValue = getRaw(block, indentStyleName).map(parseIndentValue).getOr(0);\n        var contentEditable = editor.dom.getContentEditable(block.dom());\n        return contentEditable !== 'false' && intentValue > 0;\n      });\n    };\n    var canOutdent = function (editor) {\n      var blocks = getBlocksToIndent(editor);\n      return !editor.mode.isReadOnly() && (blocks.length > 1 || validateBlocks(editor, blocks));\n    };\n    var isListComponent = function (el) {\n      return isList(el) || isListItem(el);\n    };\n    var parentIsListComponent = function (el) {\n      return parent(el).map(isListComponent).getOr(false);\n    };\n    var getBlocksToIndent = function (editor) {\n      return filter(map(editor.selection.getSelectedBlocks(), Element.fromDom), function (el) {\n        return !isListComponent(el) && !parentIsListComponent(el) && isEditable$1(el);\n      });\n    };\n    var handle = function (editor, command) {\n      var dom = editor.dom, selection = editor.selection, formatter = editor.formatter;\n      var indentation = Settings.getIndentation(editor);\n      var indentUnit = /[a-z%]+$/i.exec(indentation)[0];\n      var indentValue = parseInt(indentation, 10);\n      var useMargin = Settings.shouldIndentUseMargin(editor);\n      var forcedRootBlock = Settings.getForcedRootBlock(editor);\n      if (!editor.queryCommandState('InsertUnorderedList') && !editor.queryCommandState('InsertOrderedList')) {\n        if (forcedRootBlock === '' && !dom.getParent(selection.getNode(), dom.isBlock)) {\n          formatter.apply('div');\n        }\n      }\n      each(getBlocksToIndent(editor), function (block) {\n        indentElement(dom, command, useMargin, indentValue, indentUnit, block.dom());\n      });\n    };\n\n    var navigateIgnoreEmptyTextNodes = function (forward, root, from) {\n      return CaretFinder.navigateIgnore(forward, root, from, isEmptyText);\n    };\n    var getClosestBlock = function (root, pos) {\n      return find(Parents.parentsAndSelf(Element.fromDom(pos.container()), root), isBlock);\n    };\n    var isAtBeforeAfterBlockBoundary = function (forward, root, pos) {\n      return navigateIgnoreEmptyTextNodes(forward, root.dom(), pos).forall(function (newPos) {\n        return getClosestBlock(root, pos).fold(function () {\n          return isInSameBlock(newPos, pos, root.dom()) === false;\n        }, function (fromBlock) {\n          return isInSameBlock(newPos, pos, root.dom()) === false && contains$2(fromBlock, Element.fromDom(newPos.container()));\n        });\n      });\n    };\n    var isAtBlockBoundary = function (forward, root, pos) {\n      return getClosestBlock(root, pos).fold(function () {\n        return navigateIgnoreEmptyTextNodes(forward, root.dom(), pos).forall(function (newPos) {\n          return isInSameBlock(newPos, pos, root.dom()) === false;\n        });\n      }, function (parent) {\n        return navigateIgnoreEmptyTextNodes(forward, parent.dom(), pos).isNone();\n      });\n    };\n    var isAtStartOfBlock = curry(isAtBlockBoundary, false);\n    var isAtEndOfBlock = curry(isAtBlockBoundary, true);\n    var isBeforeBlock = curry(isAtBeforeAfterBlockBoundary, false);\n    var isAfterBlock = curry(isAtBeforeAfterBlockBoundary, true);\n\n    var backspaceDelete$8 = function (editor, _caret, _forward) {\n      if (editor.selection.isCollapsed() && canOutdent(editor)) {\n        var dom = editor.dom;\n        var rng = editor.selection.getRng();\n        var pos = CaretPosition$1.fromRangeStart(rng);\n        var block = dom.getParent(rng.startContainer, dom.isBlock);\n        if (block !== null && isAtStartOfBlock(Element.fromDom(block), pos)) {\n          handle(editor, 'outdent');\n          return true;\n        }\n      }\n      return false;\n    };\n    var Outdent = { backspaceDelete: backspaceDelete$8 };\n\n    var executeKeydownOverride$1 = function (editor, caret, evt) {\n      MatchKeys.execute([\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(Outdent.backspaceDelete, editor, false)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(CefDelete.backspaceDelete, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: MatchKeys.action(CefDelete.backspaceDelete, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(CefBoundaryDelete.backspaceDelete, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: MatchKeys.action(CefBoundaryDelete.backspaceDelete, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(BoundaryDelete.backspaceDelete, editor, caret, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: MatchKeys.action(BoundaryDelete.backspaceDelete, editor, caret, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(TableDelete.backspaceDelete, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: MatchKeys.action(TableDelete.backspaceDelete, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(PageBreakDelete.backspaceDelete, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: MatchKeys.action(PageBreakDelete.backspaceDelete, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(BlockRangeDelete.backspaceDelete, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: MatchKeys.action(BlockRangeDelete.backspaceDelete, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(BlockBoundaryDelete.backspaceDelete, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: MatchKeys.action(BlockBoundaryDelete.backspaceDelete, editor, true)\n        },\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(InlineFormatDelete.backspaceDelete, editor, false)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: MatchKeys.action(InlineFormatDelete.backspaceDelete, editor, true)\n        }\n      ], evt).each(function (_) {\n        evt.preventDefault();\n      });\n    };\n    var executeKeyupOverride = function (editor, evt) {\n      MatchKeys.execute([\n        {\n          keyCode: VK.BACKSPACE,\n          action: MatchKeys.action(CefDelete.paddEmptyElement, editor)\n        },\n        {\n          keyCode: VK.DELETE,\n          action: MatchKeys.action(CefDelete.paddEmptyElement, editor)\n        }\n      ], evt);\n    };\n    var setup$a = function (editor, caret) {\n      editor.on('keydown', function (evt) {\n        if (evt.isDefaultPrevented() === false) {\n          executeKeydownOverride$1(editor, caret, evt);\n        }\n      });\n      editor.on('keyup', function (evt) {\n        if (evt.isDefaultPrevented() === false) {\n          executeKeyupOverride(editor, evt);\n        }\n      });\n    };\n    var DeleteBackspaceKeys = { setup: setup$a };\n\n    var firstNonWhiteSpaceNodeSibling = function (node) {\n      while (node) {\n        if (node.nodeType === 1 || node.nodeType === 3 && node.data && /[\\r\\n\\s]/.test(node.data)) {\n          return node;\n        }\n        node = node.nextSibling;\n      }\n    };\n    var moveToCaretPosition = function (editor, root) {\n      var node, rng, lastNode = root;\n      var dom = editor.dom;\n      var moveCaretBeforeOnEnterElementsMap = editor.schema.getMoveCaretBeforeOnEnterElements();\n      if (!root) {\n        return;\n      }\n      if (/^(LI|DT|DD)$/.test(root.nodeName)) {\n        var firstChild = firstNonWhiteSpaceNodeSibling(root.firstChild);\n        if (firstChild && /^(UL|OL|DL)$/.test(firstChild.nodeName)) {\n          root.insertBefore(dom.doc.createTextNode(nbsp), root.firstChild);\n        }\n      }\n      rng = dom.createRng();\n      root.normalize();\n      if (root.hasChildNodes()) {\n        var walker = new TreeWalker(root, root);\n        while (node = walker.current()) {\n          if (NodeType.isText(node)) {\n            rng.setStart(node, 0);\n            rng.setEnd(node, 0);\n            break;\n          }\n          if (moveCaretBeforeOnEnterElementsMap[node.nodeName.toLowerCase()]) {\n            rng.setStartBefore(node);\n            rng.setEndBefore(node);\n            break;\n          }\n          lastNode = node;\n          node = walker.next();\n        }\n        if (!node) {\n          rng.setStart(lastNode, 0);\n          rng.setEnd(lastNode, 0);\n        }\n      } else {\n        if (NodeType.isBr(root)) {\n          if (root.nextSibling && dom.isBlock(root.nextSibling)) {\n            rng.setStartBefore(root);\n            rng.setEndBefore(root);\n          } else {\n            rng.setStartAfter(root);\n            rng.setEndAfter(root);\n          }\n        } else {\n          rng.setStart(root, 0);\n          rng.setEnd(root, 0);\n        }\n      }\n      editor.selection.setRng(rng);\n      ScrollIntoView.scrollRangeIntoView(editor, rng);\n    };\n    var getEditableRoot = function (dom, node) {\n      var root = dom.getRoot();\n      var parent, editableRoot;\n      parent = node;\n      while (parent !== root && dom.getContentEditable(parent) !== 'false') {\n        if (dom.getContentEditable(parent) === 'true') {\n          editableRoot = parent;\n        }\n        parent = parent.parentNode;\n      }\n      return parent !== root ? editableRoot : root;\n    };\n    var getParentBlock$2 = function (editor) {\n      return Option.from(editor.dom.getParent(editor.selection.getStart(true), editor.dom.isBlock));\n    };\n    var getParentBlockName = function (editor) {\n      return getParentBlock$2(editor).fold(constant(''), function (parentBlock) {\n        return parentBlock.nodeName.toUpperCase();\n      });\n    };\n    var isListItemParentBlock = function (editor) {\n      return getParentBlock$2(editor).filter(function (elm) {\n        return isListItem(Element.fromDom(elm));\n      }).isSome();\n    };\n    var NewLineUtils = {\n      moveToCaretPosition: moveToCaretPosition,\n      getEditableRoot: getEditableRoot,\n      getParentBlock: getParentBlock$2,\n      getParentBlockName: getParentBlockName,\n      isListItemParentBlock: isListItemParentBlock\n    };\n\n    var hasFirstChild = function (elm, name) {\n      return elm.firstChild && elm.firstChild.nodeName === name;\n    };\n    var hasParent$1 = function (elm, parentName) {\n      return elm && elm.parentNode && elm.parentNode.nodeName === parentName;\n    };\n    var isListBlock = function (elm) {\n      return elm && /^(OL|UL|LI)$/.test(elm.nodeName);\n    };\n    var isNestedList = function (elm) {\n      return isListBlock(elm) && isListBlock(elm.parentNode);\n    };\n    var getContainerBlock = function (containerBlock) {\n      var containerBlockParent = containerBlock.parentNode;\n      if (/^(LI|DT|DD)$/.test(containerBlockParent.nodeName)) {\n        return containerBlockParent;\n      }\n      return containerBlock;\n    };\n    var isFirstOrLastLi = function (containerBlock, parentBlock, first) {\n      var node = containerBlock[first ? 'firstChild' : 'lastChild'];\n      while (node) {\n        if (NodeType.isElement(node)) {\n          break;\n        }\n        node = node[first ? 'nextSibling' : 'previousSibling'];\n      }\n      return node === parentBlock;\n    };\n    var insert = function (editor, createNewBlock, containerBlock, parentBlock, newBlockName) {\n      var dom = editor.dom;\n      var rng = editor.selection.getRng();\n      if (containerBlock === editor.getBody()) {\n        return;\n      }\n      if (isNestedList(containerBlock)) {\n        newBlockName = 'LI';\n      }\n      var newBlock = newBlockName ? createNewBlock(newBlockName) : dom.create('BR');\n      if (isFirstOrLastLi(containerBlock, parentBlock, true) && isFirstOrLastLi(containerBlock, parentBlock, false)) {\n        if (hasParent$1(containerBlock, 'LI')) {\n          dom.insertAfter(newBlock, getContainerBlock(containerBlock));\n        } else {\n          dom.replace(newBlock, containerBlock);\n        }\n      } else if (isFirstOrLastLi(containerBlock, parentBlock, true)) {\n        if (hasParent$1(containerBlock, 'LI')) {\n          dom.insertAfter(newBlock, getContainerBlock(containerBlock));\n          newBlock.appendChild(dom.doc.createTextNode(' '));\n          newBlock.appendChild(containerBlock);\n        } else {\n          containerBlock.parentNode.insertBefore(newBlock, containerBlock);\n        }\n      } else if (isFirstOrLastLi(containerBlock, parentBlock, false)) {\n        dom.insertAfter(newBlock, getContainerBlock(containerBlock));\n      } else {\n        containerBlock = getContainerBlock(containerBlock);\n        var tmpRng = rng.cloneRange();\n        tmpRng.setStartAfter(parentBlock);\n        tmpRng.setEndAfter(containerBlock);\n        var fragment = tmpRng.extractContents();\n        if (newBlockName === 'LI' && hasFirstChild(fragment, 'LI')) {\n          newBlock = fragment.firstChild;\n          dom.insertAfter(fragment, containerBlock);\n        } else {\n          dom.insertAfter(fragment, containerBlock);\n          dom.insertAfter(newBlock, containerBlock);\n        }\n      }\n      dom.remove(parentBlock);\n      NewLineUtils.moveToCaretPosition(editor, newBlock);\n    };\n    var InsertLi = { insert: insert };\n\n    var trimZwsp = function (fragment) {\n      each(descendants(Element.fromDom(fragment), isText), function (text) {\n        var rawNode = text.dom();\n        rawNode.nodeValue = Zwsp.trim(rawNode.nodeValue);\n      });\n    };\n    var isEmptyAnchor = function (dom, elm) {\n      return elm && elm.nodeName === 'A' && dom.isEmpty(elm);\n    };\n    var isTableCell$4 = function (node) {\n      return node && /^(TD|TH|CAPTION)$/.test(node.nodeName);\n    };\n    var emptyBlock = function (elm) {\n      elm.innerHTML = '<br data-mce-bogus=\"1\">';\n    };\n    var containerAndSiblingName = function (container, nodeName) {\n      return container.nodeName === nodeName || container.previousSibling && container.previousSibling.nodeName === nodeName;\n    };\n    var canSplitBlock = function (dom, node) {\n      return node && dom.isBlock(node) && !/^(TD|TH|CAPTION|FORM)$/.test(node.nodeName) && !/^(fixed|absolute)/i.test(node.style.position) && dom.getContentEditable(node) !== 'true';\n    };\n    var trimInlineElementsOnLeftSideOfBlock = function (dom, nonEmptyElementsMap, block) {\n      var node = block;\n      var firstChilds = [];\n      var i;\n      if (!node) {\n        return;\n      }\n      while (node = node.firstChild) {\n        if (dom.isBlock(node)) {\n          return;\n        }\n        if (NodeType.isElement(node) && !nonEmptyElementsMap[node.nodeName.toLowerCase()]) {\n          firstChilds.push(node);\n        }\n      }\n      i = firstChilds.length;\n      while (i--) {\n        node = firstChilds[i];\n        if (!node.hasChildNodes() || node.firstChild === node.lastChild && node.firstChild.nodeValue === '') {\n          dom.remove(node);\n        } else {\n          if (isEmptyAnchor(dom, node)) {\n            dom.remove(node);\n          }\n        }\n      }\n    };\n    var normalizeZwspOffset = function (start, container, offset) {\n      if (NodeType.isText(container) === false) {\n        return offset;\n      } else if (start) {\n        return offset === 1 && container.data.charAt(offset - 1) === Zwsp.ZWSP ? 0 : offset;\n      } else {\n        return offset === container.data.length - 1 && container.data.charAt(offset) === Zwsp.ZWSP ? container.data.length : offset;\n      }\n    };\n    var includeZwspInRange = function (rng) {\n      var newRng = rng.cloneRange();\n      newRng.setStart(rng.startContainer, normalizeZwspOffset(true, rng.startContainer, rng.startOffset));\n      newRng.setEnd(rng.endContainer, normalizeZwspOffset(false, rng.endContainer, rng.endOffset));\n      return newRng;\n    };\n    var trimLeadingLineBreaks = function (node) {\n      do {\n        if (NodeType.isText(node)) {\n          node.nodeValue = node.nodeValue.replace(/^[\\r\\n]+/, '');\n        }\n        node = node.firstChild;\n      } while (node);\n    };\n    var getEditableRoot$1 = function (dom, node) {\n      var root = dom.getRoot();\n      var parent, editableRoot;\n      parent = node;\n      while (parent !== root && dom.getContentEditable(parent) !== 'false') {\n        if (dom.getContentEditable(parent) === 'true') {\n          editableRoot = parent;\n        }\n        parent = parent.parentNode;\n      }\n      return parent !== root ? editableRoot : root;\n    };\n    var applyAttributes = function (editor, node, forcedRootBlockAttrs) {\n      Option.from(forcedRootBlockAttrs.style).map(editor.dom.parseStyle).each(function (attrStyles) {\n        var currentStyles = getAllRaw(Element.fromDom(node));\n        var newStyles = __assign(__assign({}, currentStyles), attrStyles);\n        editor.dom.setStyles(node, newStyles);\n      });\n      var attrClassesOpt = Option.from(forcedRootBlockAttrs.class).map(function (attrClasses) {\n        return attrClasses.split(/\\s+/);\n      });\n      var currentClassesOpt = Option.from(node.className).map(function (currentClasses) {\n        return filter(currentClasses.split(/\\s+/), function (clazz) {\n          return clazz !== '';\n        });\n      });\n      lift2(attrClassesOpt, currentClassesOpt, function (attrClasses, currentClasses) {\n        var filteredClasses = filter(currentClasses, function (clazz) {\n          return !contains(attrClasses, clazz);\n        });\n        var newClasses = __spreadArrays(attrClasses, filteredClasses);\n        editor.dom.setAttrib(node, 'class', newClasses.join(' '));\n      });\n      var appliedAttrs = [\n        'style',\n        'class'\n      ];\n      var remainingAttrs = filter$1(forcedRootBlockAttrs, function (_, attrs) {\n        return !contains(appliedAttrs, attrs);\n      });\n      editor.dom.setAttribs(node, remainingAttrs);\n    };\n    var setForcedBlockAttrs = function (editor, node) {\n      var forcedRootBlockName = Settings.getForcedRootBlock(editor);\n      if (forcedRootBlockName && forcedRootBlockName.toLowerCase() === node.tagName.toLowerCase()) {\n        var forcedRootBlockAttrs = Settings.getForcedRootBlockAttrs(editor);\n        applyAttributes(editor, node, forcedRootBlockAttrs);\n      }\n    };\n    var wrapSelfAndSiblingsInDefaultBlock = function (editor, newBlockName, rng, container, offset) {\n      var newBlock, parentBlock, startNode, node, next, rootBlockName;\n      var blockName = newBlockName || 'P';\n      var dom = editor.dom, editableRoot = getEditableRoot$1(dom, container);\n      parentBlock = dom.getParent(container, dom.isBlock);\n      if (!parentBlock || !canSplitBlock(dom, parentBlock)) {\n        parentBlock = parentBlock || editableRoot;\n        if (parentBlock === editor.getBody() || isTableCell$4(parentBlock)) {\n          rootBlockName = parentBlock.nodeName.toLowerCase();\n        } else {\n          rootBlockName = parentBlock.parentNode.nodeName.toLowerCase();\n        }\n        if (!parentBlock.hasChildNodes()) {\n          newBlock = dom.create(blockName);\n          setForcedBlockAttrs(editor, newBlock);\n          parentBlock.appendChild(newBlock);\n          rng.setStart(newBlock, 0);\n          rng.setEnd(newBlock, 0);\n          return newBlock;\n        }\n        node = container;\n        while (node.parentNode !== parentBlock) {\n          node = node.parentNode;\n        }\n        while (node && !dom.isBlock(node)) {\n          startNode = node;\n          node = node.previousSibling;\n        }\n        if (startNode && editor.schema.isValidChild(rootBlockName, blockName.toLowerCase())) {\n          newBlock = dom.create(blockName);\n          setForcedBlockAttrs(editor, newBlock);\n          startNode.parentNode.insertBefore(newBlock, startNode);\n          node = startNode;\n          while (node && !dom.isBlock(node)) {\n            next = node.nextSibling;\n            newBlock.appendChild(node);\n            node = next;\n          }\n          rng.setStart(container, offset);\n          rng.setEnd(container, offset);\n        }\n      }\n      return container;\n    };\n    var addBrToBlockIfNeeded = function (dom, block) {\n      var lastChild;\n      block.normalize();\n      lastChild = block.lastChild;\n      if (!lastChild || /^(left|right)$/gi.test(dom.getStyle(lastChild, 'float', true))) {\n        dom.add(block, 'br');\n      }\n    };\n    var insert$1 = function (editor, evt) {\n      var tmpRng, editableRoot, container, offset, parentBlock, shiftKey;\n      var newBlock, fragment, containerBlock, parentBlockName, containerBlockName, newBlockName, isAfterLastNodeInContainer;\n      var dom = editor.dom;\n      var schema = editor.schema, nonEmptyElementsMap = schema.getNonEmptyElements();\n      var rng = editor.selection.getRng();\n      var createNewBlock = function (name) {\n        var node = container, block, clonedNode, caretNode;\n        var textInlineElements = schema.getTextInlineElements();\n        if (name || parentBlockName === 'TABLE' || parentBlockName === 'HR') {\n          block = dom.create(name || newBlockName);\n        } else {\n          block = parentBlock.cloneNode(false);\n        }\n        caretNode = block;\n        if (Settings.shouldKeepStyles(editor) === false) {\n          dom.setAttrib(block, 'style', null);\n          dom.setAttrib(block, 'class', null);\n        } else {\n          do {\n            if (textInlineElements[node.nodeName]) {\n              if (isCaretNode(node) || Bookmarks.isBookmarkNode(node)) {\n                continue;\n              }\n              clonedNode = node.cloneNode(false);\n              dom.setAttrib(clonedNode, 'id', '');\n              if (block.hasChildNodes()) {\n                clonedNode.appendChild(block.firstChild);\n                block.appendChild(clonedNode);\n              } else {\n                caretNode = clonedNode;\n                block.appendChild(clonedNode);\n              }\n            }\n          } while ((node = node.parentNode) && node !== editableRoot);\n        }\n        setForcedBlockAttrs(editor, block);\n        emptyBlock(caretNode);\n        return block;\n      };\n      var isCaretAtStartOrEndOfBlock = function (start) {\n        var node, name;\n        var normalizedOffset = normalizeZwspOffset(start, container, offset);\n        if (NodeType.isText(container) && (start ? normalizedOffset > 0 : normalizedOffset < container.nodeValue.length)) {\n          return false;\n        }\n        if (container.parentNode === parentBlock && isAfterLastNodeInContainer && !start) {\n          return true;\n        }\n        if (start && NodeType.isElement(container) && container === parentBlock.firstChild) {\n          return true;\n        }\n        if (containerAndSiblingName(container, 'TABLE') || containerAndSiblingName(container, 'HR')) {\n          return isAfterLastNodeInContainer && !start || !isAfterLastNodeInContainer && start;\n        }\n        var walker = new TreeWalker(container, parentBlock);\n        if (NodeType.isText(container)) {\n          if (start && normalizedOffset === 0) {\n            walker.prev();\n          } else if (!start && normalizedOffset === container.nodeValue.length) {\n            walker.next();\n          }\n        }\n        while (node = walker.current()) {\n          if (NodeType.isElement(node)) {\n            if (!node.getAttribute('data-mce-bogus')) {\n              name = node.nodeName.toLowerCase();\n              if (nonEmptyElementsMap[name] && name !== 'br') {\n                return false;\n              }\n            }\n          } else if (NodeType.isText(node) && !/^[ \\t\\r\\n]*$/.test(node.nodeValue)) {\n            return false;\n          }\n          if (start) {\n            walker.prev();\n          } else {\n            walker.next();\n          }\n        }\n        return true;\n      };\n      var insertNewBlockAfter = function () {\n        if (/^(H[1-6]|PRE|FIGURE)$/.test(parentBlockName) && containerBlockName !== 'HGROUP') {\n          newBlock = createNewBlock(newBlockName);\n        } else {\n          newBlock = createNewBlock();\n        }\n        if (Settings.shouldEndContainerOnEmptyBlock(editor) && canSplitBlock(dom, containerBlock) && dom.isEmpty(parentBlock)) {\n          newBlock = dom.split(containerBlock, parentBlock);\n        } else {\n          dom.insertAfter(newBlock, parentBlock);\n        }\n        NewLineUtils.moveToCaretPosition(editor, newBlock);\n      };\n      NormalizeRange.normalize(dom, rng).each(function (normRng) {\n        rng.setStart(normRng.startContainer, normRng.startOffset);\n        rng.setEnd(normRng.endContainer, normRng.endOffset);\n      });\n      container = rng.startContainer;\n      offset = rng.startOffset;\n      newBlockName = Settings.getForcedRootBlock(editor);\n      shiftKey = !!(evt && evt.shiftKey);\n      var ctrlKey = !!(evt && evt.ctrlKey);\n      if (NodeType.isElement(container) && container.hasChildNodes()) {\n        isAfterLastNodeInContainer = offset > container.childNodes.length - 1;\n        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;\n        if (isAfterLastNodeInContainer && NodeType.isText(container)) {\n          offset = container.nodeValue.length;\n        } else {\n          offset = 0;\n        }\n      }\n      editableRoot = getEditableRoot$1(dom, container);\n      if (!editableRoot) {\n        return;\n      }\n      if (newBlockName && !shiftKey || !newBlockName && shiftKey) {\n        container = wrapSelfAndSiblingsInDefaultBlock(editor, newBlockName, rng, container, offset);\n      }\n      parentBlock = dom.getParent(container, dom.isBlock);\n      containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;\n      parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : '';\n      containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';\n      if (containerBlockName === 'LI' && !ctrlKey) {\n        parentBlock = containerBlock;\n        containerBlock = containerBlock.parentNode;\n        parentBlockName = containerBlockName;\n      }\n      if (/^(LI|DT|DD)$/.test(parentBlockName)) {\n        if (dom.isEmpty(parentBlock)) {\n          InsertLi.insert(editor, createNewBlock, containerBlock, parentBlock, newBlockName);\n          return;\n        }\n      }\n      if (newBlockName && parentBlock === editor.getBody()) {\n        return;\n      }\n      newBlockName = newBlockName || 'P';\n      if (isCaretContainerBlock(parentBlock)) {\n        newBlock = showCaretContainerBlock(parentBlock);\n        if (dom.isEmpty(parentBlock)) {\n          emptyBlock(parentBlock);\n        }\n        setForcedBlockAttrs(editor, newBlock);\n        NewLineUtils.moveToCaretPosition(editor, newBlock);\n      } else if (isCaretAtStartOrEndOfBlock()) {\n        insertNewBlockAfter();\n      } else if (isCaretAtStartOrEndOfBlock(true)) {\n        newBlock = parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock);\n        NewLineUtils.moveToCaretPosition(editor, containerAndSiblingName(parentBlock, 'HR') ? newBlock : parentBlock);\n      } else {\n        tmpRng = includeZwspInRange(rng).cloneRange();\n        tmpRng.setEndAfter(parentBlock);\n        fragment = tmpRng.extractContents();\n        trimZwsp(fragment);\n        trimLeadingLineBreaks(fragment);\n        newBlock = fragment.firstChild;\n        dom.insertAfter(fragment, parentBlock);\n        trimInlineElementsOnLeftSideOfBlock(dom, nonEmptyElementsMap, newBlock);\n        addBrToBlockIfNeeded(dom, parentBlock);\n        if (dom.isEmpty(parentBlock)) {\n          emptyBlock(parentBlock);\n        }\n        newBlock.normalize();\n        if (dom.isEmpty(newBlock)) {\n          dom.remove(newBlock);\n          insertNewBlockAfter();\n        } else {\n          setForcedBlockAttrs(editor, newBlock);\n          NewLineUtils.moveToCaretPosition(editor, newBlock);\n        }\n      }\n      dom.setAttrib(newBlock, 'id', '');\n      editor.fire('NewBlock', { newBlock: newBlock });\n    };\n    var InsertBlock = { insert: insert$1 };\n\n    var hasRightSideContent = function (schema, container, parentBlock) {\n      var walker = new TreeWalker(container, parentBlock);\n      var node;\n      var nonEmptyElementsMap = schema.getNonEmptyElements();\n      while (node = walker.next()) {\n        if (nonEmptyElementsMap[node.nodeName.toLowerCase()] || node.length > 0) {\n          return true;\n        }\n      }\n    };\n    var scrollToBr = function (dom, selection, brElm) {\n      var marker = dom.create('span', {}, '&nbsp;');\n      brElm.parentNode.insertBefore(marker, brElm);\n      selection.scrollIntoView(marker);\n      dom.remove(marker);\n    };\n    var moveSelectionToBr = function (dom, selection, brElm, extraBr) {\n      var rng = dom.createRng();\n      if (!extraBr) {\n        rng.setStartAfter(brElm);\n        rng.setEndAfter(brElm);\n      } else {\n        rng.setStartBefore(brElm);\n        rng.setEndBefore(brElm);\n      }\n      selection.setRng(rng);\n    };\n    var insertBrAtCaret = function (editor, evt) {\n      var selection = editor.selection;\n      var dom = editor.dom;\n      var rng = selection.getRng();\n      var brElm;\n      var extraBr;\n      NormalizeRange.normalize(dom, rng).each(function (normRng) {\n        rng.setStart(normRng.startContainer, normRng.startOffset);\n        rng.setEnd(normRng.endContainer, normRng.endOffset);\n      });\n      var offset = rng.startOffset;\n      var container = rng.startContainer;\n      if (container.nodeType === 1 && container.hasChildNodes()) {\n        var isAfterLastNodeInContainer = offset > container.childNodes.length - 1;\n        container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;\n        if (isAfterLastNodeInContainer && container.nodeType === 3) {\n          offset = container.nodeValue.length;\n        } else {\n          offset = 0;\n        }\n      }\n      var parentBlock = dom.getParent(container, dom.isBlock);\n      var containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;\n      var containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';\n      var isControlKey = !!(evt && evt.ctrlKey);\n      if (containerBlockName === 'LI' && !isControlKey) {\n        parentBlock = containerBlock;\n      }\n      if (container && container.nodeType === 3 && offset >= container.nodeValue.length) {\n        if (!hasRightSideContent(editor.schema, container, parentBlock)) {\n          brElm = dom.create('br');\n          rng.insertNode(brElm);\n          rng.setStartAfter(brElm);\n          rng.setEndAfter(brElm);\n          extraBr = true;\n        }\n      }\n      brElm = dom.create('br');\n      rangeInsertNode(dom, rng, brElm);\n      scrollToBr(dom, selection, brElm);\n      moveSelectionToBr(dom, selection, brElm, extraBr);\n      editor.undoManager.add();\n    };\n    var insertBrBefore = function (editor, inline) {\n      var br = Element.fromTag('br');\n      before(Element.fromDom(inline), br);\n      editor.undoManager.add();\n    };\n    var insertBrAfter = function (editor, inline) {\n      if (!hasBrAfter(editor.getBody(), inline)) {\n        after(Element.fromDom(inline), Element.fromTag('br'));\n      }\n      var br = Element.fromTag('br');\n      after(Element.fromDom(inline), br);\n      scrollToBr(editor.dom, editor.selection, br.dom());\n      moveSelectionToBr(editor.dom, editor.selection, br.dom(), false);\n      editor.undoManager.add();\n    };\n    var isBeforeBr$1 = function (pos) {\n      return NodeType.isBr(pos.getNode());\n    };\n    var hasBrAfter = function (rootNode, startNode) {\n      if (isBeforeBr$1(CaretPosition$1.after(startNode))) {\n        return true;\n      } else {\n        return CaretFinder.nextPosition(rootNode, CaretPosition$1.after(startNode)).map(function (pos) {\n          return NodeType.isBr(pos.getNode());\n        }).getOr(false);\n      }\n    };\n    var isAnchorLink = function (elm) {\n      return elm && elm.nodeName === 'A' && 'href' in elm;\n    };\n    var isInsideAnchor = function (location) {\n      return location.fold(constant(false), isAnchorLink, isAnchorLink, constant(false));\n    };\n    var readInlineAnchorLocation = function (editor) {\n      var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);\n      var position = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n      return BoundaryLocation.readLocation(isInlineTarget, editor.getBody(), position).filter(isInsideAnchor);\n    };\n    var insertBrOutsideAnchor = function (editor, location) {\n      location.fold(noop, curry(insertBrBefore, editor), curry(insertBrAfter, editor), noop);\n    };\n    var insert$2 = function (editor, evt) {\n      var anchorLocation = readInlineAnchorLocation(editor);\n      if (anchorLocation.isSome()) {\n        anchorLocation.each(curry(insertBrOutsideAnchor, editor));\n      } else {\n        insertBrAtCaret(editor, evt);\n      }\n    };\n    var InsertBr = { insert: insert$2 };\n\n    var matchesSelector = function (editor, selector) {\n      return NewLineUtils.getParentBlock(editor).filter(function (parentBlock) {\n        return selector.length > 0 && is(Element.fromDom(parentBlock), selector);\n      }).isSome();\n    };\n    var shouldInsertBr = function (editor) {\n      return matchesSelector(editor, Settings.getBrNewLineSelector(editor));\n    };\n    var shouldBlockNewLine = function (editor) {\n      return matchesSelector(editor, Settings.getNoNewLineSelector(editor));\n    };\n    var ContextSelectors = {\n      shouldInsertBr: shouldInsertBr,\n      shouldBlockNewLine: shouldBlockNewLine\n    };\n\n    var newLineAction = Adt.generate([\n      { br: [] },\n      { block: [] },\n      { none: [] }\n    ]);\n    var shouldBlockNewLine$1 = function (editor, shiftKey) {\n      return ContextSelectors.shouldBlockNewLine(editor);\n    };\n    var isBrMode = function (requiredState) {\n      return function (editor, shiftKey) {\n        var brMode = Settings.getForcedRootBlock(editor) === '';\n        return brMode === requiredState;\n      };\n    };\n    var inListBlock = function (requiredState) {\n      return function (editor, shiftKey) {\n        return NewLineUtils.isListItemParentBlock(editor) === requiredState;\n      };\n    };\n    var inBlock = function (blockName, requiredState) {\n      return function (editor, shiftKey) {\n        var state = NewLineUtils.getParentBlockName(editor) === blockName.toUpperCase();\n        return state === requiredState;\n      };\n    };\n    var inPreBlock = function (requiredState) {\n      return inBlock('pre', requiredState);\n    };\n    var inSummaryBlock = function () {\n      return inBlock('summary', true);\n    };\n    var shouldPutBrInPre$1 = function (requiredState) {\n      return function (editor, shiftKey) {\n        return Settings.shouldPutBrInPre(editor) === requiredState;\n      };\n    };\n    var inBrContext = function (editor, shiftKey) {\n      return ContextSelectors.shouldInsertBr(editor);\n    };\n    var hasShiftKey = function (editor, shiftKey) {\n      return shiftKey;\n    };\n    var canInsertIntoEditableRoot = function (editor) {\n      var forcedRootBlock = Settings.getForcedRootBlock(editor);\n      var rootEditable = NewLineUtils.getEditableRoot(editor.dom, editor.selection.getStart());\n      return rootEditable && editor.schema.isValidChild(rootEditable.nodeName, forcedRootBlock ? forcedRootBlock : 'P');\n    };\n    var match$2 = function (predicates, action) {\n      return function (editor, shiftKey) {\n        var isMatch = foldl(predicates, function (res, p) {\n          return res && p(editor, shiftKey);\n        }, true);\n        return isMatch ? Option.some(action) : Option.none();\n      };\n    };\n    var getAction$1 = function (editor, evt) {\n      return LazyEvaluator.evaluateUntil([\n        match$2([shouldBlockNewLine$1], newLineAction.none()),\n        match$2([inSummaryBlock()], newLineAction.br()),\n        match$2([\n          inPreBlock(true),\n          shouldPutBrInPre$1(false),\n          hasShiftKey\n        ], newLineAction.br()),\n        match$2([\n          inPreBlock(true),\n          shouldPutBrInPre$1(false)\n        ], newLineAction.block()),\n        match$2([\n          inPreBlock(true),\n          shouldPutBrInPre$1(true),\n          hasShiftKey\n        ], newLineAction.block()),\n        match$2([\n          inPreBlock(true),\n          shouldPutBrInPre$1(true)\n        ], newLineAction.br()),\n        match$2([\n          inListBlock(true),\n          hasShiftKey\n        ], newLineAction.br()),\n        match$2([inListBlock(true)], newLineAction.block()),\n        match$2([\n          isBrMode(true),\n          hasShiftKey,\n          canInsertIntoEditableRoot\n        ], newLineAction.block()),\n        match$2([isBrMode(true)], newLineAction.br()),\n        match$2([inBrContext], newLineAction.br()),\n        match$2([\n          isBrMode(false),\n          hasShiftKey\n        ], newLineAction.br()),\n        match$2([canInsertIntoEditableRoot], newLineAction.block())\n      ], [\n        editor,\n        !!(evt && evt.shiftKey)\n      ]).getOr(newLineAction.none());\n    };\n    var NewLineAction = { getAction: getAction$1 };\n\n    var insert$3 = function (editor, evt) {\n      NewLineAction.getAction(editor, evt).fold(function () {\n        InsertBr.insert(editor, evt);\n      }, function () {\n        InsertBlock.insert(editor, evt);\n      }, noop);\n    };\n    var InsertNewLine = { insert: insert$3 };\n\n    var handleEnterKeyEvent = function (editor, event) {\n      if (event.isDefaultPrevented()) {\n        return;\n      }\n      event.preventDefault();\n      endTypingLevelIgnoreLocks(editor.undoManager);\n      editor.undoManager.transact(function () {\n        if (editor.selection.isCollapsed() === false) {\n          editor.execCommand('Delete');\n        }\n        InsertNewLine.insert(editor, event);\n      });\n    };\n    var setup$b = function (editor) {\n      editor.on('keydown', function (event) {\n        if (event.keyCode === VK.ENTER) {\n          handleEnterKeyEvent(editor, event);\n        }\n      });\n    };\n    var EnterKey = { setup: setup$b };\n\n    var insertTextAtPosition = function (text, pos) {\n      var container = pos.container();\n      var offset = pos.offset();\n      if (NodeType.isText(container)) {\n        container.insertData(offset, text);\n        return Option.some(CaretPosition(container, offset + text.length));\n      } else {\n        return getElementFromPosition(pos).map(function (elm) {\n          var textNode = Element.fromText(text);\n          if (pos.isAtEnd()) {\n            after(elm, textNode);\n          } else {\n            before(elm, textNode);\n          }\n          return CaretPosition(textNode.dom(), text.length);\n        });\n      }\n    };\n    var insertNbspAtPosition = curry(insertTextAtPosition, nbsp);\n    var insertSpaceAtPosition = curry(insertTextAtPosition, ' ');\n\n    var isInMiddleOfText = function (pos) {\n      return CaretPosition.isTextPosition(pos) && !pos.isAtStart() && !pos.isAtEnd();\n    };\n    var getClosestBlock$1 = function (root, pos) {\n      var parentBlocks = filter(Parents.parentsAndSelf(Element.fromDom(pos.container()), root), isBlock);\n      return head(parentBlocks).getOr(root);\n    };\n    var hasSpaceBefore = function (root, pos) {\n      if (isInMiddleOfText(pos)) {\n        return isAfterSpace(pos);\n      } else {\n        return isAfterSpace(pos) || CaretFinder.prevPosition(getClosestBlock$1(root, pos).dom(), pos).exists(isAfterSpace);\n      }\n    };\n    var hasSpaceAfter = function (root, pos) {\n      if (isInMiddleOfText(pos)) {\n        return isBeforeSpace(pos);\n      } else {\n        return isBeforeSpace(pos) || CaretFinder.nextPosition(getClosestBlock$1(root, pos).dom(), pos).exists(isBeforeSpace);\n      }\n    };\n    var isPreValue = function (value) {\n      return contains([\n        'pre',\n        'pre-wrap'\n      ], value);\n    };\n    var isInPre = function (pos) {\n      return getElementFromPosition(pos).bind(function (elm) {\n        return closest(elm, isElement);\n      }).exists(function (elm) {\n        return isPreValue(get$4(elm, 'white-space'));\n      });\n    };\n    var isAtBeginningOfBody = function (root, pos) {\n      return CaretFinder.prevPosition(root.dom(), pos).isNone();\n    };\n    var isAtEndOfBody = function (root, pos) {\n      return CaretFinder.nextPosition(root.dom(), pos).isNone();\n    };\n    var isAtLineBoundary = function (root, pos) {\n      return isAtBeginningOfBody(root, pos) || isAtEndOfBody(root, pos) || isAtStartOfBlock(root, pos) || isAtEndOfBlock(root, pos) || isAfterBr(root, pos) || isBeforeBr(root, pos);\n    };\n    var needsToHaveNbsp = function (root, pos) {\n      if (isInPre(pos)) {\n        return false;\n      } else {\n        return isAtLineBoundary(root, pos) || hasSpaceBefore(root, pos) || hasSpaceAfter(root, pos);\n      }\n    };\n    var needsToBeNbspLeft = function (root, pos) {\n      if (isInPre(pos)) {\n        return false;\n      } else {\n        return isAtStartOfBlock(root, pos) || isBeforeBlock(root, pos) || isAfterBr(root, pos) || hasSpaceBefore(root, pos);\n      }\n    };\n    var leanRight = function (pos) {\n      var container = pos.container();\n      var offset = pos.offset();\n      if (NodeType.isText(container) && offset < container.data.length) {\n        return CaretPosition(container, offset + 1);\n      } else {\n        return pos;\n      }\n    };\n    var needsToBeNbspRight = function (root, pos) {\n      var afterPos = leanRight(pos);\n      if (isInPre(afterPos)) {\n        return false;\n      } else {\n        return isAtEndOfBlock(root, afterPos) || isAfterBlock(root, afterPos) || isBeforeBr(root, afterPos) || hasSpaceAfter(root, afterPos);\n      }\n    };\n    var needsToBeNbsp = function (root, pos) {\n      return needsToBeNbspLeft(root, pos) || needsToBeNbspRight(root, pos);\n    };\n    var isNbspAt = function (text, offset) {\n      return isNbsp(text.charAt(offset));\n    };\n    var hasNbsp = function (pos) {\n      var container = pos.container();\n      return NodeType.isText(container) && contains$1(container.data, nbsp);\n    };\n    var normalizeNbspMiddle = function (text) {\n      var chars = text.split('');\n      return map(chars, function (chr, i) {\n        if (isNbsp(chr) && i > 0 && i < chars.length - 1 && isContent(chars[i - 1]) && isContent(chars[i + 1])) {\n          return ' ';\n        } else {\n          return chr;\n        }\n      }).join('');\n    };\n    var normalizeNbspAtStart = function (root, node) {\n      var text = node.data;\n      var firstPos = CaretPosition(node, 0);\n      if (isNbspAt(text, 0) && !needsToBeNbsp(root, firstPos)) {\n        node.data = ' ' + text.slice(1);\n        return true;\n      } else {\n        return false;\n      }\n    };\n    var normalizeNbspInMiddleOfTextNode = function (node) {\n      var text = node.data;\n      var newText = normalizeNbspMiddle(text);\n      if (newText !== text) {\n        node.data = newText;\n        return true;\n      } else {\n        return false;\n      }\n    };\n    var normalizeNbspAtEnd = function (root, node) {\n      var text = node.data;\n      var lastPos = CaretPosition(node, text.length - 1);\n      if (isNbspAt(text, text.length - 1) && !needsToBeNbsp(root, lastPos)) {\n        node.data = text.slice(0, -1) + ' ';\n        return true;\n      } else {\n        return false;\n      }\n    };\n    var normalizeNbsps = function (root, pos) {\n      return Option.some(pos).filter(hasNbsp).bind(function (pos) {\n        var container = pos.container();\n        var normalized = normalizeNbspAtStart(root, container) || normalizeNbspInMiddleOfTextNode(container) || normalizeNbspAtEnd(root, container);\n        return normalized ? Option.some(pos) : Option.none();\n      });\n    };\n    var normalizeNbspsInEditor = function (editor) {\n      var root = Element.fromDom(editor.getBody());\n      if (editor.selection.isCollapsed()) {\n        normalizeNbsps(root, CaretPosition.fromRangeStart(editor.selection.getRng())).each(function (pos) {\n          editor.selection.setRng(pos.toRange());\n        });\n      }\n    };\n\n    var locationToCaretPosition = function (root) {\n      return function (location) {\n        return location.fold(function (element) {\n          return CaretFinder.prevPosition(root.dom(), CaretPosition$1.before(element));\n        }, function (element) {\n          return CaretFinder.firstPositionIn(element);\n        }, function (element) {\n          return CaretFinder.lastPositionIn(element);\n        }, function (element) {\n          return CaretFinder.nextPosition(root.dom(), CaretPosition$1.after(element));\n        });\n      };\n    };\n    var insertInlineBoundarySpaceOrNbsp = function (root, pos) {\n      return function (checkPos) {\n        return needsToHaveNbsp(root, checkPos) ? insertNbspAtPosition(pos) : insertSpaceAtPosition(pos);\n      };\n    };\n    var setSelection$1 = function (editor) {\n      return function (pos) {\n        editor.selection.setRng(pos.toRange());\n        editor.nodeChanged();\n        return true;\n      };\n    };\n    var insertSpaceOrNbspAtSelection = function (editor) {\n      var pos = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n      var root = Element.fromDom(editor.getBody());\n      if (editor.selection.isCollapsed()) {\n        var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);\n        var caretPosition = CaretPosition$1.fromRangeStart(editor.selection.getRng());\n        return BoundaryLocation.readLocation(isInlineTarget, editor.getBody(), caretPosition).bind(locationToCaretPosition(root)).bind(insertInlineBoundarySpaceOrNbsp(root, pos)).exists(setSelection$1(editor));\n      } else {\n        return false;\n      }\n    };\n\n    var executeKeydownOverride$2 = function (editor, evt) {\n      MatchKeys.execute([{\n          keyCode: VK.SPACEBAR,\n          action: MatchKeys.action(insertSpaceOrNbspAtSelection, editor)\n        }], evt).each(function (_) {\n        evt.preventDefault();\n      });\n    };\n    var setup$c = function (editor) {\n      editor.on('keydown', function (evt) {\n        if (evt.isDefaultPrevented() === false) {\n          executeKeydownOverride$2(editor, evt);\n        }\n      });\n    };\n    var SpaceKey = { setup: setup$c };\n\n    var findBlockCaretContainer = function (editor) {\n      return descendant(Element.fromDom(editor.getBody()), '*[data-mce-caret]').fold(constant(null), function (elm) {\n        return elm.dom();\n      });\n    };\n    var removeIeControlRect = function (editor) {\n      editor.selection.setRng(editor.selection.getRng());\n    };\n    var showBlockCaretContainer = function (editor, blockCaretContainer) {\n      if (blockCaretContainer.hasAttribute('data-mce-caret')) {\n        showCaretContainerBlock(blockCaretContainer);\n        removeIeControlRect(editor);\n        editor.selection.scrollIntoView(blockCaretContainer);\n      }\n    };\n    var handleBlockContainer = function (editor, e) {\n      var blockCaretContainer = findBlockCaretContainer(editor);\n      if (!blockCaretContainer) {\n        return;\n      }\n      if (e.type === 'compositionstart') {\n        e.preventDefault();\n        e.stopPropagation();\n        showBlockCaretContainer(editor, blockCaretContainer);\n        return;\n      }\n      if (hasContent(blockCaretContainer)) {\n        showBlockCaretContainer(editor, blockCaretContainer);\n        editor.undoManager.add();\n      }\n    };\n    var setup$d = function (editor) {\n      editor.on('keyup compositionstart', curry(handleBlockContainer, editor));\n    };\n    var CaretContainerInput = { setup: setup$d };\n\n    var browser$5 = detect$3().browser;\n    var setupIeInput = function (editor) {\n      var keypressThrotter = first(function () {\n        if (!editor.composing) {\n          normalizeNbspsInEditor(editor);\n        }\n      }, 0);\n      if (browser$5.isIE()) {\n        editor.on('keypress', function (e) {\n          keypressThrotter.throttle();\n        });\n        editor.on('remove', function (e) {\n          keypressThrotter.cancel();\n        });\n      }\n    };\n    var setup$e = function (editor) {\n      setupIeInput(editor);\n      editor.on('input', function (e) {\n        if (e.isComposing === false) {\n          normalizeNbspsInEditor(editor);\n        }\n      });\n    };\n\n    var executeKeydownOverride$3 = function (editor, evt) {\n      MatchKeys.execute([\n        {\n          keyCode: VK.END,\n          action: moveToLineEndPoint(editor, true)\n        },\n        {\n          keyCode: VK.HOME,\n          action: moveToLineEndPoint(editor, false)\n        }\n      ], evt).each(function (_) {\n        evt.preventDefault();\n      });\n    };\n    var setup$f = function (editor) {\n      editor.on('keydown', function (evt) {\n        if (evt.isDefaultPrevented() === false) {\n          executeKeydownOverride$3(editor, evt);\n        }\n      });\n    };\n    var HomeEndKeys = { setup: setup$f };\n\n    var setup$g = function (editor) {\n      var caret = BoundarySelection.setupSelectedState(editor);\n      CaretContainerInput.setup(editor);\n      ArrowKeys.setup(editor, caret);\n      DeleteBackspaceKeys.setup(editor, caret);\n      EnterKey.setup(editor);\n      SpaceKey.setup(editor);\n      setup$e(editor);\n      HomeEndKeys.setup(editor);\n    };\n    var KeyboardOverrides = { setup: setup$g };\n\n    var NodeChange = function () {\n      function NodeChange(editor) {\n        this.lastPath = [];\n        this.editor = editor;\n        var lastRng;\n        var self = this;\n        if (!('onselectionchange' in editor.getDoc())) {\n          editor.on('NodeChange click mouseup keyup focus', function (e) {\n            var nativeRng, fakeRng;\n            nativeRng = editor.selection.getRng();\n            fakeRng = {\n              startContainer: nativeRng.startContainer,\n              startOffset: nativeRng.startOffset,\n              endContainer: nativeRng.endContainer,\n              endOffset: nativeRng.endOffset\n            };\n            if (e.type === 'nodechange' || !RangeCompare.isEq(fakeRng, lastRng)) {\n              editor.fire('SelectionChange');\n            }\n            lastRng = fakeRng;\n          });\n        }\n        editor.on('contextmenu', function () {\n          editor.fire('SelectionChange');\n        });\n        editor.on('SelectionChange', function () {\n          var startElm = editor.selection.getStart(true);\n          if (!startElm || !Env.range && editor.selection.isCollapsed()) {\n            return;\n          }\n          if (hasAnyRanges(editor) && !self.isSameElementPath(startElm) && editor.dom.isChildOf(startElm, editor.getBody())) {\n            editor.nodeChanged({ selectionChange: true });\n          }\n        });\n        editor.on('mouseup', function (e) {\n          if (!e.isDefaultPrevented() && hasAnyRanges(editor)) {\n            if (editor.selection.getNode().nodeName === 'IMG') {\n              Delay.setEditorTimeout(editor, function () {\n                editor.nodeChanged();\n              });\n            } else {\n              editor.nodeChanged();\n            }\n          }\n        });\n      }\n      NodeChange.prototype.nodeChanged = function (args) {\n        var selection = this.editor.selection;\n        var node, parents, root;\n        if (this.editor.initialized && selection && !this.editor.settings.disable_nodechange && !this.editor.mode.isReadOnly()) {\n          root = this.editor.getBody();\n          node = selection.getStart(true) || root;\n          if (node.ownerDocument !== this.editor.getDoc() || !this.editor.dom.isChildOf(node, root)) {\n            node = root;\n          }\n          parents = [];\n          this.editor.dom.getParent(node, function (node) {\n            if (node === root) {\n              return true;\n            }\n            parents.push(node);\n          });\n          args = args || {};\n          args.element = node;\n          args.parents = parents;\n          this.editor.fire('NodeChange', args);\n        }\n      };\n      NodeChange.prototype.isSameElementPath = function (startElm) {\n        var i, currentPath;\n        currentPath = this.editor.$(startElm).parentsUntil(this.editor.getBody()).add(startElm);\n        if (currentPath.length === this.lastPath.length) {\n          for (i = currentPath.length; i >= 0; i--) {\n            if (currentPath[i] !== this.lastPath[i]) {\n              break;\n            }\n          }\n          if (i === -1) {\n            this.lastPath = currentPath;\n            return true;\n          }\n        }\n        this.lastPath = currentPath;\n        return false;\n      };\n      return NodeChange;\n    }();\n\n    var preventSummaryToggle = function (editor) {\n      editor.on('click', function (e) {\n        if (editor.dom.getParent(e.target, 'details')) {\n          e.preventDefault();\n        }\n      });\n    };\n    var filterDetails = function (editor) {\n      editor.parser.addNodeFilter('details', function (elms) {\n        each(elms, function (details) {\n          details.attr('data-mce-open', details.attr('open'));\n          details.attr('open', 'open');\n        });\n      });\n      editor.serializer.addNodeFilter('details', function (elms) {\n        each(elms, function (details) {\n          var open = details.attr('data-mce-open');\n          details.attr('open', isString(open) ? open : null);\n          details.attr('data-mce-open', null);\n        });\n      });\n    };\n    var setup$h = function (editor) {\n      preventSummaryToggle(editor);\n      filterDetails(editor);\n    };\n\n    var isTextBlockNode = function (node) {\n      return NodeType.isElement(node) && isTextBlock(Element.fromDom(node));\n    };\n    var normalizeSelection$1 = function (editor) {\n      var rng = editor.selection.getRng();\n      var startPos = CaretPosition.fromRangeStart(rng);\n      var endPos = CaretPosition.fromRangeEnd(rng);\n      if (CaretPosition.isElementPosition(startPos)) {\n        var container = startPos.container();\n        if (isTextBlockNode(container)) {\n          CaretFinder.firstPositionIn(container).each(function (pos) {\n            return rng.setStart(pos.container(), pos.offset());\n          });\n        }\n      }\n      if (CaretPosition.isElementPosition(endPos)) {\n        var container = startPos.container();\n        if (isTextBlockNode(container)) {\n          CaretFinder.lastPositionIn(container).each(function (pos) {\n            return rng.setEnd(pos.container(), pos.offset());\n          });\n        }\n      }\n      editor.selection.setRng(RangeNormalizer.normalize(rng));\n    };\n    var setup$i = function (editor) {\n      editor.on('click', function (e) {\n        if (e.detail >= 3) {\n          normalizeSelection$1(editor);\n        }\n      });\n    };\n\n    var getAbsolutePosition = function (elm) {\n      var doc, docElem, win, clientRect;\n      clientRect = elm.getBoundingClientRect();\n      doc = elm.ownerDocument;\n      docElem = doc.documentElement;\n      win = doc.defaultView;\n      return {\n        top: clientRect.top + win.pageYOffset - docElem.clientTop,\n        left: clientRect.left + win.pageXOffset - docElem.clientLeft\n      };\n    };\n    var getBodyPosition = function (editor) {\n      return editor.inline ? getAbsolutePosition(editor.getBody()) : {\n        left: 0,\n        top: 0\n      };\n    };\n    var getScrollPosition = function (editor) {\n      var body = editor.getBody();\n      return editor.inline ? {\n        left: body.scrollLeft,\n        top: body.scrollTop\n      } : {\n        left: 0,\n        top: 0\n      };\n    };\n    var getBodyScroll = function (editor) {\n      var body = editor.getBody(), docElm = editor.getDoc().documentElement;\n      var inlineScroll = {\n        left: body.scrollLeft,\n        top: body.scrollTop\n      };\n      var iframeScroll = {\n        left: body.scrollLeft || docElm.scrollLeft,\n        top: body.scrollTop || docElm.scrollTop\n      };\n      return editor.inline ? inlineScroll : iframeScroll;\n    };\n    var getMousePosition = function (editor, event) {\n      if (event.target.ownerDocument !== editor.getDoc()) {\n        var iframePosition = getAbsolutePosition(editor.getContentAreaContainer());\n        var scrollPosition = getBodyScroll(editor);\n        return {\n          left: event.pageX - iframePosition.left + scrollPosition.left,\n          top: event.pageY - iframePosition.top + scrollPosition.top\n        };\n      }\n      return {\n        left: event.pageX,\n        top: event.pageY\n      };\n    };\n    var calculatePosition = function (bodyPosition, scrollPosition, mousePosition) {\n      return {\n        pageX: mousePosition.left - bodyPosition.left + scrollPosition.left,\n        pageY: mousePosition.top - bodyPosition.top + scrollPosition.top\n      };\n    };\n    var calc = function (editor, event) {\n      return calculatePosition(getBodyPosition(editor), getScrollPosition(editor), getMousePosition(editor, event));\n    };\n    var MousePosition = { calc: calc };\n\n    var isContentEditableFalse$a = NodeType.isContentEditableFalse, isContentEditableTrue$4 = NodeType.isContentEditableTrue;\n    var isDraggable = function (rootElm, elm) {\n      return isContentEditableFalse$a(elm) && elm !== rootElm;\n    };\n    var isValidDropTarget = function (editor, targetElement, dragElement) {\n      if (targetElement === dragElement || editor.dom.isChildOf(targetElement, dragElement)) {\n        return false;\n      }\n      return !isContentEditableFalse$a(targetElement);\n    };\n    var cloneElement = function (elm) {\n      var cloneElm = elm.cloneNode(true);\n      cloneElm.removeAttribute('data-mce-selected');\n      return cloneElm;\n    };\n    var createGhost = function (editor, elm, width, height) {\n      var clonedElm = elm.cloneNode(true);\n      editor.dom.setStyles(clonedElm, {\n        width: width,\n        height: height\n      });\n      editor.dom.setAttrib(clonedElm, 'data-mce-selected', null);\n      var ghostElm = editor.dom.create('div', {\n        'class': 'mce-drag-container',\n        'data-mce-bogus': 'all',\n        'unselectable': 'on',\n        'contenteditable': 'false'\n      });\n      editor.dom.setStyles(ghostElm, {\n        position: 'absolute',\n        opacity: 0.5,\n        overflow: 'hidden',\n        border: 0,\n        padding: 0,\n        margin: 0,\n        width: width,\n        height: height\n      });\n      editor.dom.setStyles(clonedElm, {\n        margin: 0,\n        boxSizing: 'border-box'\n      });\n      ghostElm.appendChild(clonedElm);\n      return ghostElm;\n    };\n    var appendGhostToBody = function (ghostElm, bodyElm) {\n      if (ghostElm.parentNode !== bodyElm) {\n        bodyElm.appendChild(ghostElm);\n      }\n    };\n    var moveGhost = function (ghostElm, position, width, height, maxX, maxY) {\n      var overflowX = 0, overflowY = 0;\n      ghostElm.style.left = position.pageX + 'px';\n      ghostElm.style.top = position.pageY + 'px';\n      if (position.pageX + width > maxX) {\n        overflowX = position.pageX + width - maxX;\n      }\n      if (position.pageY + height > maxY) {\n        overflowY = position.pageY + height - maxY;\n      }\n      ghostElm.style.width = width - overflowX + 'px';\n      ghostElm.style.height = height - overflowY + 'px';\n    };\n    var removeElement = function (elm) {\n      if (elm && elm.parentNode) {\n        elm.parentNode.removeChild(elm);\n      }\n    };\n    var isLeftMouseButtonPressed = function (e) {\n      return e.button === 0;\n    };\n    var hasDraggableElement = function (state) {\n      return state.element;\n    };\n    var applyRelPos = function (state, position) {\n      return {\n        pageX: position.pageX - state.relX,\n        pageY: position.pageY + 5\n      };\n    };\n    var start$1 = function (state, editor) {\n      return function (e) {\n        if (isLeftMouseButtonPressed(e)) {\n          var ceElm = find(editor.dom.getParents(e.target), Predicate.or(isContentEditableFalse$a, isContentEditableTrue$4)).getOr(null);\n          if (isDraggable(editor.getBody(), ceElm)) {\n            var elmPos = editor.dom.getPos(ceElm);\n            var bodyElm = editor.getBody();\n            var docElm = editor.getDoc().documentElement;\n            state.element = ceElm;\n            state.screenX = e.screenX;\n            state.screenY = e.screenY;\n            state.maxX = (editor.inline ? bodyElm.scrollWidth : docElm.offsetWidth) - 2;\n            state.maxY = (editor.inline ? bodyElm.scrollHeight : docElm.offsetHeight) - 2;\n            state.relX = e.pageX - elmPos.x;\n            state.relY = e.pageY - elmPos.y;\n            state.width = ceElm.offsetWidth;\n            state.height = ceElm.offsetHeight;\n            state.ghost = createGhost(editor, ceElm, state.width, state.height);\n          }\n        }\n      };\n    };\n    var move$1 = function (state, editor) {\n      var throttledPlaceCaretAt = Delay.throttle(function (clientX, clientY) {\n        editor._selectionOverrides.hideFakeCaret();\n        editor.selection.placeCaretAt(clientX, clientY);\n      }, 0);\n      return function (e) {\n        var movement = Math.max(Math.abs(e.screenX - state.screenX), Math.abs(e.screenY - state.screenY));\n        if (hasDraggableElement(state) && !state.dragging && movement > 10) {\n          var args = editor.fire('dragstart', { target: state.element });\n          if (args.isDefaultPrevented()) {\n            return;\n          }\n          state.dragging = true;\n          editor.focus();\n        }\n        if (state.dragging) {\n          var targetPos = applyRelPos(state, MousePosition.calc(editor, e));\n          appendGhostToBody(state.ghost, editor.getBody());\n          moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY);\n          throttledPlaceCaretAt(e.clientX, e.clientY);\n        }\n      };\n    };\n    var getRawTarget = function (selection) {\n      var rng = selection.getSel().getRangeAt(0);\n      var startContainer = rng.startContainer;\n      return startContainer.nodeType === 3 ? startContainer.parentNode : startContainer;\n    };\n    var drop = function (state, editor) {\n      return function (e) {\n        if (state.dragging) {\n          if (isValidDropTarget(editor, getRawTarget(editor.selection), state.element)) {\n            var targetClone_1 = cloneElement(state.element);\n            var args = editor.fire('drop', {\n              targetClone: targetClone_1,\n              clientX: e.clientX,\n              clientY: e.clientY\n            });\n            if (!args.isDefaultPrevented()) {\n              targetClone_1 = args.targetClone;\n              editor.undoManager.transact(function () {\n                removeElement(state.element);\n                editor.insertContent(editor.dom.getOuterHTML(targetClone_1));\n                editor._selectionOverrides.hideFakeCaret();\n              });\n            }\n          }\n        }\n        removeDragState(state);\n      };\n    };\n    var stop = function (state, editor) {\n      return function () {\n        if (state.dragging) {\n          editor.fire('dragend');\n        }\n        removeDragState(state);\n      };\n    };\n    var removeDragState = function (state) {\n      state.dragging = false;\n      state.element = null;\n      removeElement(state.ghost);\n    };\n    var bindFakeDragEvents = function (editor) {\n      var state = {};\n      var pageDom, dragStartHandler, dragHandler, dropHandler, dragEndHandler, rootDocument;\n      pageDom = DOMUtils$1.DOM;\n      rootDocument = domGlobals.document;\n      dragStartHandler = start$1(state, editor);\n      dragHandler = move$1(state, editor);\n      dropHandler = drop(state, editor);\n      dragEndHandler = stop(state, editor);\n      editor.on('mousedown', dragStartHandler);\n      editor.on('mousemove', dragHandler);\n      editor.on('mouseup', dropHandler);\n      pageDom.bind(rootDocument, 'mousemove', dragHandler);\n      pageDom.bind(rootDocument, 'mouseup', dragEndHandler);\n      editor.on('remove', function () {\n        pageDom.unbind(rootDocument, 'mousemove', dragHandler);\n        pageDom.unbind(rootDocument, 'mouseup', dragEndHandler);\n      });\n    };\n    var blockIeDrop = function (editor) {\n      editor.on('drop', function (e) {\n        var realTarget = typeof e.clientX !== 'undefined' ? editor.getDoc().elementFromPoint(e.clientX, e.clientY) : null;\n        if (isContentEditableFalse$a(realTarget) || isContentEditableFalse$a(editor.dom.getContentEditableParent(realTarget))) {\n          e.preventDefault();\n        }\n      });\n    };\n    var init = function (editor) {\n      bindFakeDragEvents(editor);\n      blockIeDrop(editor);\n    };\n    var DragDropOverrides = { init: init };\n\n    var setup$j = function (editor) {\n      var renderFocusCaret = first(function () {\n        if (!editor.removed && editor.getBody().contains(domGlobals.document.activeElement)) {\n          var rng = editor.selection.getRng();\n          if (rng.collapsed) {\n            var caretRange = renderRangeCaret(editor, editor.selection.getRng(), false);\n            editor.selection.setRng(caretRange);\n          }\n        }\n      }, 0);\n      editor.on('focus', function () {\n        renderFocusCaret.throttle();\n      });\n      editor.on('blur', function () {\n        renderFocusCaret.cancel();\n      });\n    };\n    var CefFocus = { setup: setup$j };\n\n    var isContentEditableTrue$5 = NodeType.isContentEditableTrue;\n    var isContentEditableFalse$b = NodeType.isContentEditableFalse;\n    var getContentEditableRoot$2 = function (editor, node) {\n      var root = editor.getBody();\n      while (node && node !== root) {\n        if (isContentEditableTrue$5(node) || isContentEditableFalse$b(node)) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    };\n    var SelectionOverrides = function (editor) {\n      var isBlock = function (node) {\n        return editor.dom.isBlock(node);\n      };\n      var rootNode = editor.getBody();\n      var fakeCaret = FakeCaret(editor, rootNode, isBlock, function () {\n        return EditorFocus.hasFocus(editor);\n      });\n      var realSelectionId = 'sel-' + editor.dom.uniqueId();\n      var selectedContentEditableNode;\n      var isFakeSelectionElement = function (elm) {\n        return editor.dom.hasClass(elm, 'mce-offscreen-selection');\n      };\n      var getRealSelectionElement = function () {\n        var container = editor.dom.get(realSelectionId);\n        return container ? container.getElementsByTagName('*')[0] : container;\n      };\n      var setRange = function (range) {\n        if (range) {\n          editor.selection.setRng(range);\n        }\n      };\n      var getRange = function () {\n        return editor.selection.getRng();\n      };\n      var showCaret = function (direction, node, before, scrollIntoView) {\n        if (scrollIntoView === void 0) {\n          scrollIntoView = true;\n        }\n        var e;\n        e = editor.fire('ShowCaret', {\n          target: node,\n          direction: direction,\n          before: before\n        });\n        if (e.isDefaultPrevented()) {\n          return null;\n        }\n        if (scrollIntoView) {\n          editor.selection.scrollIntoView(node, direction === -1);\n        }\n        return fakeCaret.show(before, node);\n      };\n      var showBlockCaretContainer = function (blockCaretContainer) {\n        if (blockCaretContainer.hasAttribute('data-mce-caret')) {\n          showCaretContainerBlock(blockCaretContainer);\n          setRange(getRange());\n          editor.selection.scrollIntoView(blockCaretContainer);\n        }\n      };\n      var registerEvents = function () {\n        editor.on('mouseup', function (e) {\n          var range = getRange();\n          if (range.collapsed && EditorView.isXYInContentArea(editor, e.clientX, e.clientY)) {\n            setRange(renderCaretAtRange(editor, range, false));\n          }\n        });\n        editor.on('click', function (e) {\n          var contentEditableRoot;\n          contentEditableRoot = getContentEditableRoot$2(editor, e.target);\n          if (contentEditableRoot) {\n            if (isContentEditableFalse$b(contentEditableRoot)) {\n              e.preventDefault();\n              editor.focus();\n            }\n            if (isContentEditableTrue$5(contentEditableRoot)) {\n              if (editor.dom.isChildOf(contentEditableRoot, editor.selection.getNode())) {\n                removeContentEditableSelection();\n              }\n            }\n          }\n        });\n        editor.on('blur NewBlock', function () {\n          removeContentEditableSelection();\n        });\n        editor.on('ResizeWindow FullscreenStateChanged', function () {\n          return fakeCaret.reposition();\n        });\n        var handleTouchSelect = function (editor) {\n          editor.on('tap', function (e) {\n            var contentEditableRoot = getContentEditableRoot$2(editor, e.target);\n            if (isContentEditableFalse$b(contentEditableRoot)) {\n              e.preventDefault();\n              setContentEditableSelection(selectNode(editor, contentEditableRoot));\n            }\n          }, true);\n        };\n        var hasNormalCaretPosition = function (elm) {\n          var caretWalker = CaretWalker(elm);\n          if (!elm.firstChild) {\n            return false;\n          }\n          var startPos = CaretPosition$1.before(elm.firstChild);\n          var newPos = caretWalker.next(startPos);\n          return newPos && !isBeforeContentEditableFalse(newPos) && !isAfterContentEditableFalse(newPos);\n        };\n        var isInSameBlock = function (node1, node2) {\n          var block1 = editor.dom.getParent(node1, editor.dom.isBlock);\n          var block2 = editor.dom.getParent(node2, editor.dom.isBlock);\n          return block1 === block2;\n        };\n        var hasBetterMouseTarget = function (targetNode, caretNode) {\n          var targetBlock = editor.dom.getParent(targetNode, editor.dom.isBlock);\n          var caretBlock = editor.dom.getParent(caretNode, editor.dom.isBlock);\n          if (targetBlock && editor.dom.isChildOf(targetBlock, caretBlock) && isContentEditableFalse$b(getContentEditableRoot$2(editor, targetBlock)) === false) {\n            return true;\n          }\n          return targetBlock && !isInSameBlock(targetBlock, caretBlock) && hasNormalCaretPosition(targetBlock);\n        };\n        handleTouchSelect(editor);\n        editor.on('mousedown', function (e) {\n          var contentEditableRoot;\n          var targetElm = e.target;\n          if (targetElm !== rootNode && targetElm.nodeName !== 'HTML' && !editor.dom.isChildOf(targetElm, rootNode)) {\n            return;\n          }\n          if (EditorView.isXYInContentArea(editor, e.clientX, e.clientY) === false) {\n            return;\n          }\n          contentEditableRoot = getContentEditableRoot$2(editor, targetElm);\n          if (contentEditableRoot) {\n            if (isContentEditableFalse$b(contentEditableRoot)) {\n              e.preventDefault();\n              setContentEditableSelection(selectNode(editor, contentEditableRoot));\n            } else {\n              removeContentEditableSelection();\n              if (!(isContentEditableTrue$5(contentEditableRoot) && e.shiftKey) && !RangePoint.isXYWithinRange(e.clientX, e.clientY, editor.selection.getRng())) {\n                hideFakeCaret();\n                editor.selection.placeCaretAt(e.clientX, e.clientY);\n              }\n            }\n          } else if (isFakeCaretTarget(targetElm) === false) {\n            removeContentEditableSelection();\n            hideFakeCaret();\n            var caretInfo = closestCaret(rootNode, e.clientX, e.clientY);\n            if (caretInfo) {\n              if (!hasBetterMouseTarget(e.target, caretInfo.node)) {\n                e.preventDefault();\n                var range = showCaret(1, caretInfo.node, caretInfo.before, false);\n                editor.getBody().focus();\n                setRange(range);\n              }\n            }\n          }\n        });\n        editor.on('keypress', function (e) {\n          if (VK.modifierPressed(e)) {\n            return;\n          }\n          switch (e.keyCode) {\n          default:\n            if (isContentEditableFalse$b(editor.selection.getNode())) {\n              e.preventDefault();\n            }\n            break;\n          }\n        });\n        editor.on('GetSelectionRange', function (e) {\n          var rng = e.range;\n          if (selectedContentEditableNode) {\n            if (!selectedContentEditableNode.parentNode) {\n              selectedContentEditableNode = null;\n              return;\n            }\n            rng = rng.cloneRange();\n            rng.selectNode(selectedContentEditableNode);\n            e.range = rng;\n          }\n        });\n        editor.on('SetSelectionRange', function (e) {\n          e.range = normalizeShortEndedElementSelection(e.range);\n          var rng = setContentEditableSelection(e.range, e.forward);\n          if (rng) {\n            e.range = rng;\n          }\n        });\n        var isPasteBin = function (node) {\n          return node.id === 'mcepastebin';\n        };\n        editor.on('AfterSetSelectionRange', function (e) {\n          var rng = e.range;\n          if (!isRangeInCaretContainer(rng) && !isPasteBin(rng.startContainer.parentNode)) {\n            hideFakeCaret();\n          }\n          if (!isFakeSelectionElement(rng.startContainer.parentNode)) {\n            removeContentEditableSelection();\n          }\n        });\n        editor.on('copy', function (e) {\n          var clipboardData = e.clipboardData;\n          if (!e.isDefaultPrevented() && e.clipboardData && !Env.ie) {\n            var realSelectionElement = getRealSelectionElement();\n            if (realSelectionElement) {\n              e.preventDefault();\n              clipboardData.clearData();\n              clipboardData.setData('text/html', realSelectionElement.outerHTML);\n              clipboardData.setData('text/plain', realSelectionElement.outerText);\n            }\n          }\n        });\n        DragDropOverrides.init(editor);\n        CefFocus.setup(editor);\n      };\n      var isWithinCaretContainer = function (node) {\n        return isCaretContainer(node) || startsWithCaretContainer(node) || endsWithCaretContainer(node);\n      };\n      var isRangeInCaretContainer = function (rng) {\n        return isWithinCaretContainer(rng.startContainer) || isWithinCaretContainer(rng.endContainer);\n      };\n      var normalizeShortEndedElementSelection = function (rng) {\n        var shortEndedElements = editor.schema.getShortEndedElements();\n        var newRng = editor.dom.createRng();\n        var startContainer = rng.startContainer;\n        var startOffset = rng.startOffset;\n        var endContainer = rng.endContainer;\n        var endOffset = rng.endOffset;\n        if (has(shortEndedElements, startContainer.nodeName.toLowerCase())) {\n          if (startOffset === 0) {\n            newRng.setStartBefore(startContainer);\n          } else {\n            newRng.setStartAfter(startContainer);\n          }\n        } else {\n          newRng.setStart(startContainer, startOffset);\n        }\n        if (has(shortEndedElements, endContainer.nodeName.toLowerCase())) {\n          if (endOffset === 0) {\n            newRng.setEndBefore(endContainer);\n          } else {\n            newRng.setEndAfter(endContainer);\n          }\n        } else {\n          newRng.setEnd(endContainer, endOffset);\n        }\n        return newRng;\n      };\n      var setContentEditableSelection = function (range, forward) {\n        var node;\n        var $ = editor.$;\n        var dom = editor.dom;\n        var $realSelectionContainer, sel, startContainer, startOffset, endOffset, e, caretPosition, targetClone, origTargetClone;\n        if (!range) {\n          return null;\n        }\n        if (range.collapsed) {\n          if (!isRangeInCaretContainer(range)) {\n            if (forward === false) {\n              caretPosition = getNormalizedRangeEndPoint(-1, rootNode, range);\n              if (isFakeCaretTarget(caretPosition.getNode(true))) {\n                return showCaret(-1, caretPosition.getNode(true), false, false);\n              }\n              if (isFakeCaretTarget(caretPosition.getNode())) {\n                return showCaret(-1, caretPosition.getNode(), !caretPosition.isAtEnd(), false);\n              }\n            } else {\n              caretPosition = getNormalizedRangeEndPoint(1, rootNode, range);\n              if (isFakeCaretTarget(caretPosition.getNode())) {\n                return showCaret(1, caretPosition.getNode(), !caretPosition.isAtEnd(), false);\n              }\n              if (isFakeCaretTarget(caretPosition.getNode(true))) {\n                return showCaret(1, caretPosition.getNode(true), false, false);\n              }\n            }\n          }\n          return null;\n        }\n        startContainer = range.startContainer;\n        startOffset = range.startOffset;\n        endOffset = range.endOffset;\n        if (startContainer.nodeType === 3 && startOffset === 0 && isContentEditableFalse$b(startContainer.parentNode)) {\n          startContainer = startContainer.parentNode;\n          startOffset = dom.nodeIndex(startContainer);\n          startContainer = startContainer.parentNode;\n        }\n        if (startContainer.nodeType !== 1) {\n          return null;\n        }\n        if (endOffset === startOffset + 1 && startContainer === range.endContainer) {\n          node = startContainer.childNodes[startOffset];\n        }\n        if (!isContentEditableFalse$b(node)) {\n          return null;\n        }\n        targetClone = origTargetClone = node.cloneNode(true);\n        e = editor.fire('ObjectSelected', {\n          target: node,\n          targetClone: targetClone\n        });\n        if (e.isDefaultPrevented()) {\n          return null;\n        }\n        $realSelectionContainer = descendant(Element.fromDom(editor.getBody()), '#' + realSelectionId).fold(function () {\n          return $([]);\n        }, function (elm) {\n          return $([elm.dom()]);\n        });\n        targetClone = e.targetClone;\n        if ($realSelectionContainer.length === 0) {\n          $realSelectionContainer = $('<div data-mce-bogus=\"all\" class=\"mce-offscreen-selection\"></div>').attr('id', realSelectionId);\n          $realSelectionContainer.appendTo(editor.getBody());\n        }\n        range = editor.dom.createRng();\n        if (targetClone === origTargetClone && Env.ie) {\n          $realSelectionContainer.empty().append('<p style=\"font-size: 0\" data-mce-bogus=\"all\">\\xA0</p>').append(targetClone);\n          range.setStartAfter($realSelectionContainer[0].firstChild.firstChild);\n          range.setEndAfter(targetClone);\n        } else {\n          $realSelectionContainer.empty().append(nbsp).append(targetClone).append(nbsp);\n          range.setStart($realSelectionContainer[0].firstChild, 1);\n          range.setEnd($realSelectionContainer[0].lastChild, 0);\n        }\n        $realSelectionContainer.css({ top: dom.getPos(node, editor.getBody()).y });\n        $realSelectionContainer[0].focus();\n        sel = editor.selection.getSel();\n        sel.removeAllRanges();\n        sel.addRange(range);\n        var nodeElm = Element.fromDom(node);\n        each(descendants$1(Element.fromDom(editor.getBody()), '*[data-mce-selected]'), function (elm) {\n          if (!eq(nodeElm, elm)) {\n            remove$1(elm, 'data-mce-selected');\n          }\n        });\n        if (!editor.dom.getAttrib(node, 'data-mce-selected')) {\n          node.setAttribute('data-mce-selected', '1');\n        }\n        selectedContentEditableNode = node;\n        hideFakeCaret();\n        return range;\n      };\n      var removeContentEditableSelection = function () {\n        if (selectedContentEditableNode) {\n          selectedContentEditableNode.removeAttribute('data-mce-selected');\n          descendant(Element.fromDom(editor.getBody()), '#' + realSelectionId).each(remove);\n          selectedContentEditableNode = null;\n        }\n        descendant(Element.fromDom(editor.getBody()), '#' + realSelectionId).each(remove);\n        selectedContentEditableNode = null;\n      };\n      var destroy = function () {\n        fakeCaret.destroy();\n        selectedContentEditableNode = null;\n      };\n      var hideFakeCaret = function () {\n        fakeCaret.hide();\n      };\n      if (Env.ceFalse) {\n        registerEvents();\n      }\n      return {\n        showCaret: showCaret,\n        showBlockCaretContainer: showBlockCaretContainer,\n        hideFakeCaret: hideFakeCaret,\n        destroy: destroy\n      };\n    };\n\n    var Quirks = function (editor) {\n      var each = Tools.each;\n      var BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom = editor.dom, selection = editor.selection, settings = editor.settings, parser = editor.parser;\n      var isGecko = Env.gecko, isIE = Env.ie, isWebKit = Env.webkit;\n      var mceInternalUrlPrefix = 'data:text/mce-internal,';\n      var mceInternalDataType = isIE ? 'Text' : 'URL';\n      var setEditorCommandState = function (cmd, state) {\n        try {\n          editor.getDoc().execCommand(cmd, false, state);\n        } catch (ex) {\n        }\n      };\n      var isDefaultPrevented = function (e) {\n        return e.isDefaultPrevented();\n      };\n      var setMceInternalContent = function (e) {\n        var selectionHtml, internalContent;\n        if (e.dataTransfer) {\n          if (editor.selection.isCollapsed() && e.target.tagName === 'IMG') {\n            selection.select(e.target);\n          }\n          selectionHtml = editor.selection.getContent();\n          if (selectionHtml.length > 0) {\n            internalContent = mceInternalUrlPrefix + escape(editor.id) + ',' + escape(selectionHtml);\n            e.dataTransfer.setData(mceInternalDataType, internalContent);\n          }\n        }\n      };\n      var getMceInternalContent = function (e) {\n        var internalContent;\n        if (e.dataTransfer) {\n          internalContent = e.dataTransfer.getData(mceInternalDataType);\n          if (internalContent && internalContent.indexOf(mceInternalUrlPrefix) >= 0) {\n            internalContent = internalContent.substr(mceInternalUrlPrefix.length).split(',');\n            return {\n              id: unescape(internalContent[0]),\n              html: unescape(internalContent[1])\n            };\n          }\n        }\n        return null;\n      };\n      var insertClipboardContents = function (content, internal) {\n        if (editor.queryCommandSupported('mceInsertClipboardContent')) {\n          editor.execCommand('mceInsertClipboardContent', false, {\n            content: content,\n            internal: internal\n          });\n        } else {\n          editor.execCommand('mceInsertContent', false, content);\n        }\n      };\n      var emptyEditorWhenDeleting = function () {\n        var serializeRng = function (rng) {\n          var body = dom.create('body');\n          var contents = rng.cloneContents();\n          body.appendChild(contents);\n          return selection.serializer.serialize(body, { format: 'html' });\n        };\n        var allContentsSelected = function (rng) {\n          var selection = serializeRng(rng);\n          var allRng = dom.createRng();\n          allRng.selectNode(editor.getBody());\n          var allSelection = serializeRng(allRng);\n          return selection === allSelection;\n        };\n        editor.on('keydown', function (e) {\n          var keyCode = e.keyCode;\n          var isCollapsed, body;\n          if (!isDefaultPrevented(e) && (keyCode === DELETE || keyCode === BACKSPACE)) {\n            isCollapsed = editor.selection.isCollapsed();\n            body = editor.getBody();\n            if (isCollapsed && !dom.isEmpty(body)) {\n              return;\n            }\n            if (!isCollapsed && !allContentsSelected(editor.selection.getRng())) {\n              return;\n            }\n            e.preventDefault();\n            editor.setContent('');\n            if (body.firstChild && dom.isBlock(body.firstChild)) {\n              editor.selection.setCursorLocation(body.firstChild, 0);\n            } else {\n              editor.selection.setCursorLocation(body, 0);\n            }\n            editor.nodeChanged();\n          }\n        });\n      };\n      var selectAll = function () {\n        editor.shortcuts.add('meta+a', null, 'SelectAll');\n      };\n      var inputMethodFocus = function () {\n        if (!editor.inline) {\n          dom.bind(editor.getDoc(), 'mousedown mouseup', function (e) {\n            var rng;\n            if (e.target === editor.getDoc().documentElement) {\n              rng = selection.getRng();\n              editor.getBody().focus();\n              if (e.type === 'mousedown') {\n                if (isCaretContainer(rng.startContainer)) {\n                  return;\n                }\n                selection.placeCaretAt(e.clientX, e.clientY);\n              } else {\n                selection.setRng(rng);\n              }\n            }\n          });\n        }\n      };\n      var removeHrOnBackspace = function () {\n        editor.on('keydown', function (e) {\n          if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {\n            if (!editor.getBody().getElementsByTagName('hr').length) {\n              return;\n            }\n            if (selection.isCollapsed() && selection.getRng().startOffset === 0) {\n              var node = selection.getNode();\n              var previousSibling = node.previousSibling;\n              if (node.nodeName === 'HR') {\n                dom.remove(node);\n                e.preventDefault();\n                return;\n              }\n              if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'hr') {\n                dom.remove(previousSibling);\n                e.preventDefault();\n              }\n            }\n          }\n        });\n      };\n      var focusBody = function () {\n        if (!domGlobals.Range.prototype.getClientRects) {\n          editor.on('mousedown', function (e) {\n            if (!isDefaultPrevented(e) && e.target.nodeName === 'HTML') {\n              var body_1 = editor.getBody();\n              body_1.blur();\n              Delay.setEditorTimeout(editor, function () {\n                body_1.focus();\n              });\n            }\n          });\n        }\n      };\n      var selectControlElements = function () {\n        editor.on('click', function (e) {\n          var target = e.target;\n          if (/^(IMG|HR)$/.test(target.nodeName) && dom.getContentEditableParent(target) !== 'false') {\n            e.preventDefault();\n            editor.selection.select(target);\n            editor.nodeChanged();\n          }\n          if (target.nodeName === 'A' && dom.hasClass(target, 'mce-item-anchor')) {\n            e.preventDefault();\n            selection.select(target);\n          }\n        });\n      };\n      var removeStylesWhenDeletingAcrossBlockElements = function () {\n        var getAttributeApplyFunction = function () {\n          var template = dom.getAttribs(selection.getStart().cloneNode(false));\n          return function () {\n            var target = selection.getStart();\n            if (target !== editor.getBody()) {\n              dom.setAttrib(target, 'style', null);\n              each(template, function (attr) {\n                target.setAttributeNode(attr.cloneNode(true));\n              });\n            }\n          };\n        };\n        var isSelectionAcrossElements = function () {\n          return !selection.isCollapsed() && dom.getParent(selection.getStart(), dom.isBlock) !== dom.getParent(selection.getEnd(), dom.isBlock);\n        };\n        editor.on('keypress', function (e) {\n          var applyAttributes;\n          if (!isDefaultPrevented(e) && (e.keyCode === 8 || e.keyCode === 46) && isSelectionAcrossElements()) {\n            applyAttributes = getAttributeApplyFunction();\n            editor.getDoc().execCommand('delete', false, null);\n            applyAttributes();\n            e.preventDefault();\n            return false;\n          }\n        });\n        dom.bind(editor.getDoc(), 'cut', function (e) {\n          var applyAttributes;\n          if (!isDefaultPrevented(e) && isSelectionAcrossElements()) {\n            applyAttributes = getAttributeApplyFunction();\n            Delay.setEditorTimeout(editor, function () {\n              applyAttributes();\n            });\n          }\n        });\n      };\n      var disableBackspaceIntoATable = function () {\n        editor.on('keydown', function (e) {\n          if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {\n            if (selection.isCollapsed() && selection.getRng().startOffset === 0) {\n              var previousSibling = selection.getNode().previousSibling;\n              if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'table') {\n                e.preventDefault();\n                return false;\n              }\n            }\n          }\n        });\n      };\n      var removeBlockQuoteOnBackSpace = function () {\n        editor.on('keydown', function (e) {\n          var rng, container, offset, root, parent;\n          if (isDefaultPrevented(e) || e.keyCode !== VK.BACKSPACE) {\n            return;\n          }\n          rng = selection.getRng();\n          container = rng.startContainer;\n          offset = rng.startOffset;\n          root = dom.getRoot();\n          parent = container;\n          if (!rng.collapsed || offset !== 0) {\n            return;\n          }\n          while (parent && parent.parentNode && parent.parentNode.firstChild === parent && parent.parentNode !== root) {\n            parent = parent.parentNode;\n          }\n          if (parent.tagName === 'BLOCKQUOTE') {\n            editor.formatter.toggle('blockquote', null, parent);\n            rng = dom.createRng();\n            rng.setStart(container, 0);\n            rng.setEnd(container, 0);\n            selection.setRng(rng);\n          }\n        });\n      };\n      var setGeckoEditingOptions = function () {\n        var setOpts = function () {\n          setEditorCommandState('StyleWithCSS', false);\n          setEditorCommandState('enableInlineTableEditing', false);\n          if (!settings.object_resizing) {\n            setEditorCommandState('enableObjectResizing', false);\n          }\n        };\n        if (!settings.readonly) {\n          editor.on('BeforeExecCommand mousedown', setOpts);\n        }\n      };\n      var addBrAfterLastLinks = function () {\n        var fixLinks = function () {\n          each(dom.select('a'), function (node) {\n            var parentNode = node.parentNode;\n            var root = dom.getRoot();\n            if (parentNode.lastChild === node) {\n              while (parentNode && !dom.isBlock(parentNode)) {\n                if (parentNode.parentNode.lastChild !== parentNode || parentNode === root) {\n                  return;\n                }\n                parentNode = parentNode.parentNode;\n              }\n              dom.add(parentNode, 'br', { 'data-mce-bogus': 1 });\n            }\n          });\n        };\n        editor.on('SetContent ExecCommand', function (e) {\n          if (e.type === 'setcontent' || e.command === 'mceInsertLink') {\n            fixLinks();\n          }\n        });\n      };\n      var setDefaultBlockType = function () {\n        if (settings.forced_root_block) {\n          editor.on('init', function () {\n            setEditorCommandState('DefaultParagraphSeparator', Settings.getForcedRootBlock(editor));\n          });\n        }\n      };\n      var normalizeSelection = function () {\n        editor.on('keyup focusin mouseup', function (e) {\n          if (!VK.modifierPressed(e)) {\n            selection.normalize();\n          }\n        }, true);\n      };\n      var showBrokenImageIcon = function () {\n        editor.contentStyles.push('img:-moz-broken {' + '-moz-force-broken-image-icon:1;' + 'min-width:24px;' + 'min-height:24px' + '}');\n      };\n      var restoreFocusOnKeyDown = function () {\n        if (!editor.inline) {\n          editor.on('keydown', function () {\n            if (domGlobals.document.activeElement === domGlobals.document.body) {\n              editor.getWin().focus();\n            }\n          });\n        }\n      };\n      var bodyHeight = function () {\n        if (!editor.inline) {\n          editor.contentStyles.push('body {min-height: 150px}');\n          editor.on('click', function (e) {\n            var rng;\n            if (e.target.nodeName === 'HTML') {\n              if (Env.ie > 11) {\n                editor.getBody().focus();\n                return;\n              }\n              rng = editor.selection.getRng();\n              editor.getBody().focus();\n              editor.selection.setRng(rng);\n              editor.selection.normalize();\n              editor.nodeChanged();\n            }\n          });\n        }\n      };\n      var blockCmdArrowNavigation = function () {\n        if (Env.mac) {\n          editor.on('keydown', function (e) {\n            if (VK.metaKeyPressed(e) && !e.shiftKey && (e.keyCode === 37 || e.keyCode === 39)) {\n              e.preventDefault();\n              var selection_1 = editor.selection.getSel();\n              selection_1.modify('move', e.keyCode === 37 ? 'backward' : 'forward', 'lineboundary');\n            }\n          });\n        }\n      };\n      var disableAutoUrlDetect = function () {\n        setEditorCommandState('AutoUrlDetect', false);\n      };\n      var tapLinksAndImages = function () {\n        editor.on('click', function (e) {\n          var elm = e.target;\n          do {\n            if (elm.tagName === 'A') {\n              e.preventDefault();\n              return;\n            }\n          } while (elm = elm.parentNode);\n        });\n        editor.contentStyles.push('.mce-content-body {-webkit-touch-callout: none}');\n      };\n      var blockFormSubmitInsideEditor = function () {\n        editor.on('init', function () {\n          editor.dom.bind(editor.getBody(), 'submit', function (e) {\n            e.preventDefault();\n          });\n        });\n      };\n      var removeAppleInterchangeBrs = function () {\n        parser.addNodeFilter('br', function (nodes) {\n          var i = nodes.length;\n          while (i--) {\n            if (nodes[i].attr('class') === 'Apple-interchange-newline') {\n              nodes[i].remove();\n            }\n          }\n        });\n      };\n      var ieInternalDragAndDrop = function () {\n        editor.on('dragstart', function (e) {\n          setMceInternalContent(e);\n        });\n        editor.on('drop', function (e) {\n          if (!isDefaultPrevented(e)) {\n            var internalContent = getMceInternalContent(e);\n            if (internalContent && internalContent.id !== editor.id) {\n              e.preventDefault();\n              var rng = CaretRangeFromPoint.fromPoint(e.x, e.y, editor.getDoc());\n              selection.setRng(rng);\n              insertClipboardContents(internalContent.html, true);\n            }\n          }\n        });\n      };\n      var refreshContentEditable = function () {\n      };\n      var isHidden = function () {\n        var sel;\n        if (!isGecko || editor.removed) {\n          return false;\n        }\n        sel = editor.selection.getSel();\n        return !sel || !sel.rangeCount || sel.rangeCount === 0;\n      };\n      removeBlockQuoteOnBackSpace();\n      emptyEditorWhenDeleting();\n      if (!Env.windowsPhone) {\n        normalizeSelection();\n      }\n      if (isWebKit) {\n        inputMethodFocus();\n        selectControlElements();\n        setDefaultBlockType();\n        blockFormSubmitInsideEditor();\n        disableBackspaceIntoATable();\n        removeAppleInterchangeBrs();\n        if (Env.iOS) {\n          restoreFocusOnKeyDown();\n          bodyHeight();\n          tapLinksAndImages();\n        } else {\n          selectAll();\n        }\n      }\n      if (Env.ie >= 11) {\n        bodyHeight();\n        disableBackspaceIntoATable();\n      }\n      if (Env.ie) {\n        selectAll();\n        disableAutoUrlDetect();\n        ieInternalDragAndDrop();\n      }\n      if (isGecko) {\n        removeHrOnBackspace();\n        focusBody();\n        removeStylesWhenDeletingAcrossBlockElements();\n        setGeckoEditingOptions();\n        addBrAfterLastLinks();\n        showBrokenImageIcon();\n        blockCmdArrowNavigation();\n        disableBackspaceIntoATable();\n      }\n      return {\n        refreshContentEditable: refreshContentEditable,\n        isHidden: isHidden\n      };\n    };\n\n    var DOM$4 = DOMUtils$1.DOM;\n    var appendStyle = function (editor, text) {\n      var head = Element.fromDom(editor.getDoc().head);\n      var tag = Element.fromTag('style');\n      set(tag, 'type', 'text/css');\n      append(tag, Element.fromText(text));\n      append(head, tag);\n    };\n    var createParser = function (editor) {\n      var parser = DomParser(editor.settings, editor.schema);\n      parser.addAttributeFilter('src,href,style,tabindex', function (nodes, name) {\n        var i = nodes.length, node, value;\n        var dom = editor.dom;\n        var internalName = 'data-mce-' + name;\n        while (i--) {\n          node = nodes[i];\n          value = node.attr(name);\n          if (value && !node.attr(internalName)) {\n            if (value.indexOf('data:') === 0 || value.indexOf('blob:') === 0) {\n              continue;\n            }\n            if (name === 'style') {\n              value = dom.serializeStyle(dom.parseStyle(value), node.name);\n              if (!value.length) {\n                value = null;\n              }\n              node.attr(internalName, value);\n              node.attr(name, value);\n            } else if (name === 'tabindex') {\n              node.attr(internalName, value);\n              node.attr(name, null);\n            } else {\n              node.attr(internalName, editor.convertURL(value, name, node.name));\n            }\n          }\n        }\n      });\n      parser.addNodeFilter('script', function (nodes) {\n        var i = nodes.length, node, type;\n        while (i--) {\n          node = nodes[i];\n          type = node.attr('type') || 'no/type';\n          if (type.indexOf('mce-') !== 0) {\n            node.attr('type', 'mce-' + type);\n          }\n        }\n      });\n      if (editor.settings.preserve_cdata) {\n        parser.addNodeFilter('#cdata', function (nodes) {\n          var i = nodes.length, node;\n          while (i--) {\n            node = nodes[i];\n            node.type = 8;\n            node.name = '#comment';\n            node.value = '[CDATA[' + editor.dom.encode(node.value) + ']]';\n          }\n        });\n      }\n      parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', function (nodes) {\n        var i = nodes.length, node;\n        var nonEmptyElements = editor.schema.getNonEmptyElements();\n        while (i--) {\n          node = nodes[i];\n          if (node.isEmpty(nonEmptyElements) && node.getAll('br').length === 0) {\n            node.append(new Node$1('br', 1)).shortEnded = true;\n          }\n        }\n      });\n      return parser;\n    };\n    var autoFocus = function (editor) {\n      if (editor.settings.auto_focus) {\n        Delay.setEditorTimeout(editor, function () {\n          var focusEditor;\n          if (editor.settings.auto_focus === true) {\n            focusEditor = editor;\n          } else {\n            focusEditor = editor.editorManager.get(editor.settings.auto_focus);\n          }\n          if (!focusEditor.destroyed) {\n            focusEditor.focus();\n          }\n        }, 100);\n      }\n    };\n    var moveSelectionToFirstCaretPosition = function (editor) {\n      var root = editor.dom.getRoot();\n      if (!editor.inline && (!hasAnyRanges(editor) || editor.selection.getStart(true) === root)) {\n        CaretFinder.firstPositionIn(root).each(function (pos) {\n          var node = pos.getNode();\n          var caretPos = NodeType.isTable(node) ? CaretFinder.firstPositionIn(node).getOr(pos) : pos;\n          if (Env.browser.isIE()) {\n            SelectionBookmark.storeNative(editor, caretPos.toRange());\n          } else {\n            editor.selection.setRng(caretPos.toRange());\n          }\n        });\n      }\n    };\n    var initEditor = function (editor) {\n      editor.bindPendingEventDelegates();\n      editor.initialized = true;\n      fireInit(editor);\n      editor.focus(true);\n      moveSelectionToFirstCaretPosition(editor);\n      editor.nodeChanged({ initial: true });\n      editor.execCallback('init_instance_callback', editor);\n      autoFocus(editor);\n    };\n    var getStyleSheetLoader = function (editor) {\n      return editor.inline ? DOM$4.styleSheetLoader : editor.dom.styleSheetLoader;\n    };\n    var initContentBody = function (editor, skipWrite) {\n      var settings = editor.settings;\n      var targetElm = editor.getElement();\n      var doc = editor.getDoc(), body, contentCssText;\n      if (!settings.inline) {\n        editor.getElement().style.visibility = editor.orgVisibility;\n      }\n      if (!skipWrite && !editor.inline) {\n        doc.open();\n        doc.write(editor.iframeHTML);\n        doc.close();\n      }\n      if (editor.inline) {\n        editor.on('remove', function () {\n          var bodyEl = this.getBody();\n          DOM$4.removeClass(bodyEl, 'mce-content-body');\n          DOM$4.removeClass(bodyEl, 'mce-edit-focus');\n          DOM$4.setAttrib(bodyEl, 'contentEditable', null);\n        });\n        DOM$4.addClass(targetElm, 'mce-content-body');\n        editor.contentDocument = doc = domGlobals.document;\n        editor.contentWindow = domGlobals.window;\n        editor.bodyElement = targetElm;\n        editor.contentAreaContainer = targetElm;\n        settings.root_name = targetElm.nodeName.toLowerCase();\n      }\n      body = editor.getBody();\n      body.disabled = true;\n      editor.readonly = !!settings.readonly;\n      if (!editor.readonly) {\n        if (editor.inline && DOM$4.getStyle(body, 'position', true) === 'static') {\n          body.style.position = 'relative';\n        }\n        body.contentEditable = editor.getParam('content_editable_state', true);\n      }\n      body.disabled = false;\n      editor.editorUpload = EditorUpload(editor);\n      editor.schema = Schema(settings);\n      editor.dom = DOMUtils$1(doc, {\n        keep_values: true,\n        url_converter: editor.convertURL,\n        url_converter_scope: editor,\n        hex_colors: settings.force_hex_style_colors,\n        update_styles: true,\n        root_element: editor.inline ? editor.getBody() : null,\n        collect: function () {\n          return editor.inline;\n        },\n        schema: editor.schema,\n        contentCssCors: Settings.shouldUseContentCssCors(editor),\n        referrerPolicy: Settings.getReferrerPolicy(editor),\n        onSetAttrib: function (e) {\n          editor.fire('SetAttrib', e);\n        }\n      });\n      editor.parser = createParser(editor);\n      editor.serializer = Serializer$1(settings, editor);\n      editor.selection = Selection$1(editor.dom, editor.getWin(), editor.serializer, editor);\n      editor.annotator = Annotator(editor);\n      editor.formatter = Formatter(editor);\n      editor.undoManager = UndoManager(editor);\n      editor._nodeChangeDispatcher = new NodeChange(editor);\n      editor._selectionOverrides = SelectionOverrides(editor);\n      TouchEvents.setup(editor);\n      setup$h(editor);\n      setup$i(editor);\n      KeyboardOverrides.setup(editor);\n      ForceBlocks.setup(editor);\n      setup$6(editor);\n      firePreInit(editor);\n      if (!settings.browser_spellcheck && !settings.gecko_spellcheck) {\n        doc.body.spellcheck = false;\n        DOM$4.setAttrib(body, 'spellcheck', 'false');\n      }\n      editor.quirks = Quirks(editor);\n      firePostRender(editor);\n      var directionality = Settings.getDirectionality(editor);\n      if (directionality !== undefined) {\n        body.dir = directionality;\n      }\n      if (settings.protect) {\n        editor.on('BeforeSetContent', function (e) {\n          Tools.each(settings.protect, function (pattern) {\n            e.content = e.content.replace(pattern, function (str) {\n              return '<!--mce:protected ' + escape(str) + '-->';\n            });\n          });\n        });\n      }\n      editor.on('SetContent', function () {\n        editor.addVisual(editor.getBody());\n      });\n      editor.load({\n        initial: true,\n        format: 'html'\n      });\n      editor.startContent = editor.getContent({ format: 'raw' });\n      editor.on('compositionstart compositionend', function (e) {\n        editor.composing = e.type === 'compositionstart';\n      });\n      if (editor.contentStyles.length > 0) {\n        contentCssText = '';\n        Tools.each(editor.contentStyles, function (style) {\n          contentCssText += style + '\\r\\n';\n        });\n        editor.dom.addStyle(contentCssText);\n      }\n      getStyleSheetLoader(editor).loadAll(editor.contentCSS, function (_) {\n        initEditor(editor);\n      }, function (urls) {\n        initEditor(editor);\n      });\n      if (settings.content_style) {\n        appendStyle(editor, settings.content_style);\n      }\n    };\n    var InitContentBody = { initContentBody: initContentBody };\n\n    var DOM$5 = DOMUtils$1.DOM;\n    var relaxDomain = function (editor, ifr) {\n      if (domGlobals.document.domain !== domGlobals.window.location.hostname && Env.browser.isIE()) {\n        var bodyUuid = Uuid.uuid('mce');\n        editor[bodyUuid] = function () {\n          InitContentBody.initContentBody(editor);\n        };\n        var domainRelaxUrl = 'javascript:(function(){' + 'document.open();document.domain=\"' + domGlobals.document.domain + '\";' + 'var ed = window.parent.tinymce.get(\"' + editor.id + '\");document.write(ed.iframeHTML);' + 'document.close();ed.' + bodyUuid + '(true);})()';\n        DOM$5.setAttrib(ifr, 'src', domainRelaxUrl);\n        return true;\n      }\n      return false;\n    };\n    var createIframeElement = function (id, title, height, customAttrs) {\n      var iframe = Element.fromTag('iframe');\n      setAll(iframe, customAttrs);\n      setAll(iframe, {\n        id: id + '_ifr',\n        frameBorder: '0',\n        allowTransparency: 'true',\n        title: title\n      });\n      add$3(iframe, 'tox-edit-area__iframe');\n      return iframe;\n    };\n    var getIframeHtml = function (editor) {\n      var bodyId, bodyClass, iframeHTML;\n      iframeHTML = Settings.getDocType(editor) + '<html><head>';\n      if (Settings.getDocumentBaseUrl(editor) !== editor.documentBaseUrl) {\n        iframeHTML += '<base href=\"' + editor.documentBaseURI.getURI() + '\" />';\n      }\n      iframeHTML += '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />';\n      bodyId = Settings.getBodyId(editor);\n      bodyClass = Settings.getBodyClass(editor);\n      if (Settings.getContentSecurityPolicy(editor)) {\n        iframeHTML += '<meta http-equiv=\"Content-Security-Policy\" content=\"' + Settings.getContentSecurityPolicy(editor) + '\" />';\n      }\n      iframeHTML += '</head><body id=\"' + bodyId + '\" class=\"mce-content-body ' + bodyClass + '\" data-id=\"' + editor.id + '\"><br></body></html>';\n      return iframeHTML;\n    };\n    var createIframe = function (editor, o) {\n      var title = editor.editorManager.translate('Rich Text Area. Press ALT-0 for help.');\n      var ifr = createIframeElement(editor.id, title, o.height, Settings.getIframeAttrs(editor)).dom();\n      ifr.onload = function () {\n        ifr.onload = null;\n        editor.fire('load');\n      };\n      var isDomainRelaxed = relaxDomain(editor, ifr);\n      editor.contentAreaContainer = o.iframeContainer;\n      editor.iframeElement = ifr;\n      editor.iframeHTML = getIframeHtml(editor);\n      DOM$5.add(o.iframeContainer, ifr);\n      return isDomainRelaxed;\n    };\n    var init$1 = function (editor, boxInfo) {\n      var isDomainRelaxed = createIframe(editor, boxInfo);\n      if (boxInfo.editorContainer) {\n        DOM$5.get(boxInfo.editorContainer).style.display = editor.orgDisplay;\n        editor.hidden = DOM$5.isHidden(boxInfo.editorContainer);\n      }\n      editor.getElement().style.display = 'none';\n      DOM$5.setAttrib(editor.id, 'aria-hidden', 'true');\n      if (!isDomainRelaxed) {\n        InitContentBody.initContentBody(editor);\n      }\n    };\n    var InitIframe = { init: init$1 };\n\n    var DOM$6 = DOMUtils$1.DOM;\n    var initPlugin = function (editor, initializedPlugins, plugin) {\n      var Plugin = PluginManager.get(plugin);\n      var pluginUrl = PluginManager.urls[plugin] || editor.documentBaseUrl.replace(/\\/$/, '');\n      plugin = Tools.trim(plugin);\n      if (Plugin && Tools.inArray(initializedPlugins, plugin) === -1) {\n        Tools.each(PluginManager.dependencies(plugin), function (dep) {\n          initPlugin(editor, initializedPlugins, dep);\n        });\n        if (editor.plugins[plugin]) {\n          return;\n        }\n        try {\n          var pluginInstance = new Plugin(editor, pluginUrl, editor.$);\n          editor.plugins[plugin] = pluginInstance;\n          if (pluginInstance.init) {\n            pluginInstance.init(editor, pluginUrl);\n            initializedPlugins.push(plugin);\n          }\n        } catch (e) {\n          ErrorReporter.pluginInitError(editor, plugin, e);\n        }\n      }\n    };\n    var trimLegacyPrefix = function (name) {\n      return name.replace(/^\\-/, '');\n    };\n    var initPlugins = function (editor) {\n      var initializedPlugins = [];\n      Tools.each(editor.settings.plugins.split(/[ ,]/), function (name) {\n        initPlugin(editor, initializedPlugins, trimLegacyPrefix(name));\n      });\n    };\n    var initIcons = function (editor) {\n      var iconPackName = Tools.trim(editor.settings.icons);\n      var currentIcons = editor.ui.registry.getAll().icons;\n      var defaultIcons = getAll();\n      var loadIcons = __assign(__assign({}, defaultIcons), IconManager.get(iconPackName).icons);\n      each$1(loadIcons, function (svgData, icon) {\n        if (!has(currentIcons, icon)) {\n          editor.ui.registry.addIcon(icon, svgData);\n        }\n      });\n    };\n    var initTheme = function (editor) {\n      var theme = editor.settings.theme;\n      if (isString(theme)) {\n        editor.settings.theme = trimLegacyPrefix(theme);\n        var Theme = ThemeManager.get(theme);\n        editor.theme = new Theme(editor, ThemeManager.urls[theme]);\n        if (editor.theme.init) {\n          editor.theme.init(editor, ThemeManager.urls[theme] || editor.documentBaseUrl.replace(/\\/$/, ''), editor.$);\n        }\n      } else {\n        editor.theme = {};\n      }\n    };\n    var renderFromLoadedTheme = function (editor) {\n      return editor.theme.renderUI();\n    };\n    var renderFromThemeFunc = function (editor) {\n      var elm = editor.getElement();\n      var theme = editor.settings.theme;\n      var info = theme(editor, elm);\n      if (info.editorContainer.nodeType) {\n        info.editorContainer.id = info.editorContainer.id || editor.id + '_parent';\n      }\n      if (info.iframeContainer && info.iframeContainer.nodeType) {\n        info.iframeContainer.id = info.iframeContainer.id || editor.id + '_iframecontainer';\n      }\n      info.height = info.iframeHeight ? info.iframeHeight : elm.offsetHeight;\n      return info;\n    };\n    var createThemeFalseResult = function (element) {\n      return {\n        editorContainer: element,\n        iframeContainer: element\n      };\n    };\n    var renderThemeFalseIframe = function (targetElement) {\n      var iframeContainer = DOM$6.create('div');\n      DOM$6.insertAfter(iframeContainer, targetElement);\n      return createThemeFalseResult(iframeContainer);\n    };\n    var renderThemeFalse = function (editor) {\n      var targetElement = editor.getElement();\n      return editor.inline ? createThemeFalseResult(null) : renderThemeFalseIframe(targetElement);\n    };\n    var renderThemeUi = function (editor) {\n      var elm = editor.getElement();\n      editor.orgDisplay = elm.style.display;\n      if (isString(editor.settings.theme)) {\n        return renderFromLoadedTheme(editor);\n      } else if (isFunction(editor.settings.theme)) {\n        return renderFromThemeFunc(editor);\n      } else {\n        return renderThemeFalse(editor);\n      }\n    };\n    var init$2 = function (editor) {\n      editor.fire('ScriptsLoaded');\n      initIcons(editor);\n      initTheme(editor);\n      initPlugins(editor);\n      var boxInfo = renderThemeUi(editor);\n      editor.editorContainer = boxInfo.editorContainer ? boxInfo.editorContainer : null;\n      appendContentCssFromSettings(editor);\n      if (editor.inline) {\n        return InitContentBody.initContentBody(editor);\n      } else {\n        return InitIframe.init(editor, boxInfo);\n      }\n    };\n    var Init = { init: init$2 };\n\n    var DOM$7 = DOMUtils$1.DOM;\n    var hasSkipLoadPrefix = function (name) {\n      return name.charAt(0) === '-';\n    };\n    var loadLanguage = function (scriptLoader, editor) {\n      var languageCode = Settings.getLanguageCode(editor);\n      var languageUrl = Settings.getLanguageUrl(editor);\n      if (I18n.hasCode(languageCode) === false && languageCode !== 'en') {\n        var url_1 = languageUrl !== '' ? languageUrl : editor.editorManager.baseURL + '/langs/' + languageCode + '.js';\n        scriptLoader.add(url_1, noop, undefined, function () {\n          ErrorReporter.languageLoadError(editor, url_1, languageCode);\n        });\n      }\n    };\n    var loadTheme = function (scriptLoader, editor, suffix, callback) {\n      var settings = editor.settings, theme = settings.theme;\n      if (isString(theme)) {\n        if (!hasSkipLoadPrefix(theme) && !ThemeManager.urls.hasOwnProperty(theme)) {\n          var themeUrl = settings.theme_url;\n          if (themeUrl) {\n            ThemeManager.load(theme, editor.documentBaseURI.toAbsolute(themeUrl));\n          } else {\n            ThemeManager.load(theme, 'themes/' + theme + '/theme' + suffix + '.js');\n          }\n        }\n        scriptLoader.loadQueue(function () {\n          ThemeManager.waitFor(theme, callback);\n        });\n      } else {\n        callback();\n      }\n    };\n    var getIconsUrlMetaFromUrl = function (editor) {\n      return Option.from(Settings.getIconsUrl(editor)).filter(function (url) {\n        return url.length > 0;\n      }).map(function (url) {\n        return {\n          url: url,\n          name: Option.none()\n        };\n      });\n    };\n    var getIconsUrlMetaFromName = function (editor) {\n      return Option.from(Settings.getIconPackName(editor)).filter(function (name) {\n        return name.length > 0 && !IconManager.has(name);\n      }).map(function (name) {\n        return {\n          url: editor.editorManager.baseURL + '/icons/' + name + '/icons.js',\n          name: Option.some(name)\n        };\n      });\n    };\n    var loadIcons = function (scriptLoader, editor) {\n      getIconsUrlMetaFromUrl(editor).orThunk(function () {\n        return getIconsUrlMetaFromName(editor);\n      }).each(function (urlMeta) {\n        scriptLoader.add(urlMeta.url, noop, undefined, function () {\n          ErrorReporter.iconsLoadError(editor, urlMeta.url, urlMeta.name.getOrUndefined());\n        });\n      });\n    };\n    var loadPlugins = function (editor, settings, suffix) {\n      if (isArray(settings.plugins)) {\n        settings.plugins = settings.plugins.join(' ');\n      }\n      Tools.each(settings.external_plugins, function (url, name) {\n        PluginManager.load(name, url, noop, undefined, function () {\n          ErrorReporter.pluginLoadError(editor, url, name);\n        });\n        settings.plugins += ' ' + name;\n      });\n      Tools.each(settings.plugins.split(/[ ,]/), function (plugin) {\n        plugin = Tools.trim(plugin);\n        if (plugin && !PluginManager.urls[plugin]) {\n          if (hasSkipLoadPrefix(plugin)) {\n            plugin = plugin.substr(1, plugin.length);\n            var dependencies = PluginManager.dependencies(plugin);\n            Tools.each(dependencies, function (depPlugin) {\n              var defaultSettings = {\n                prefix: 'plugins/',\n                resource: depPlugin,\n                suffix: '/plugin' + suffix + '.js'\n              };\n              var dep = PluginManager.createUrl(defaultSettings, depPlugin);\n              PluginManager.load(dep.resource, dep, noop, undefined, function () {\n                ErrorReporter.pluginLoadError(editor, dep.prefix + dep.resource + dep.suffix, dep.resource);\n              });\n            });\n          } else {\n            var url_2 = {\n              prefix: 'plugins/',\n              resource: plugin,\n              suffix: '/plugin' + suffix + '.js'\n            };\n            PluginManager.load(plugin, url_2, noop, undefined, function () {\n              ErrorReporter.pluginLoadError(editor, url_2.prefix + url_2.resource + url_2.suffix, plugin);\n            });\n          }\n        }\n      });\n    };\n    var loadScripts = function (editor, suffix) {\n      var scriptLoader = ScriptLoader.ScriptLoader;\n      loadTheme(scriptLoader, editor, suffix, function () {\n        loadLanguage(scriptLoader, editor);\n        loadIcons(scriptLoader, editor);\n        loadPlugins(editor, editor.settings, suffix);\n        scriptLoader.loadQueue(function () {\n          if (!editor.removed) {\n            Init.init(editor);\n          }\n        }, editor, function () {\n          if (!editor.removed) {\n            Init.init(editor);\n          }\n        });\n      });\n    };\n    var render = function (editor) {\n      var settings = editor.settings, id = editor.id;\n      I18n.setCode(Settings.getLanguageCode(editor));\n      var readyHandler = function () {\n        DOM$7.unbind(domGlobals.window, 'ready', readyHandler);\n        editor.render();\n      };\n      if (!EventUtils.Event.domLoaded) {\n        DOM$7.bind(domGlobals.window, 'ready', readyHandler);\n        return;\n      }\n      if (!editor.getElement()) {\n        return;\n      }\n      if (!Env.contentEditable) {\n        return;\n      }\n      if (!settings.inline) {\n        editor.orgVisibility = editor.getElement().style.visibility;\n        editor.getElement().style.visibility = 'hidden';\n      } else {\n        editor.inline = true;\n      }\n      var form = editor.getElement().form || DOM$7.getParent(id, 'form');\n      if (form) {\n        editor.formElement = form;\n        if (settings.hidden_input && !NodeType.isTextareaOrInput(editor.getElement())) {\n          DOM$7.insertAfter(DOM$7.create('input', {\n            type: 'hidden',\n            name: id\n          }), id);\n          editor.hasHiddenInput = true;\n        }\n        editor.formEventDelegate = function (e) {\n          editor.fire(e.type, e);\n        };\n        DOM$7.bind(form, 'submit reset', editor.formEventDelegate);\n        editor.on('reset', function () {\n          editor.resetContent();\n        });\n        if (settings.submit_patch && !form.submit.nodeType && !form.submit.length && !form._mceOldSubmit) {\n          form._mceOldSubmit = form.submit;\n          form.submit = function () {\n            editor.editorManager.triggerSave();\n            editor.setDirty(false);\n            return form._mceOldSubmit(form);\n          };\n        }\n      }\n      editor.windowManager = WindowManager(editor);\n      editor.notificationManager = NotificationManager(editor);\n      if (settings.encoding === 'xml') {\n        editor.on('GetContent', function (e) {\n          if (e.save) {\n            e.content = DOM$7.encode(e.content);\n          }\n        });\n      }\n      if (settings.add_form_submit_trigger) {\n        editor.on('submit', function () {\n          if (editor.initialized) {\n            editor.save();\n          }\n        });\n      }\n      if (settings.add_unload_trigger) {\n        editor._beforeUnload = function () {\n          if (editor.initialized && !editor.destroyed && !editor.isHidden()) {\n            editor.save({\n              format: 'raw',\n              no_events: true,\n              set_dirty: false\n            });\n          }\n        };\n        editor.editorManager.on('BeforeUnload', editor._beforeUnload);\n      }\n      editor.editorManager.add(editor);\n      loadScripts(editor, editor.suffix);\n    };\n    var Render = { render: render };\n\n    var hasOnlyOneChild$1 = function (node) {\n      return node.firstChild && node.firstChild === node.lastChild;\n    };\n    var isPaddingNode = function (node) {\n      return node.name === 'br' || node.value === nbsp;\n    };\n    var isPaddedEmptyBlock = function (schema, node) {\n      var blockElements = schema.getBlockElements();\n      return blockElements[node.name] && hasOnlyOneChild$1(node) && isPaddingNode(node.firstChild);\n    };\n    var isEmptyFragmentElement = function (schema, node) {\n      var nonEmptyElements = schema.getNonEmptyElements();\n      return node && (node.isEmpty(nonEmptyElements) || isPaddedEmptyBlock(schema, node));\n    };\n    var isListFragment = function (schema, fragment) {\n      var firstChild = fragment.firstChild;\n      var lastChild = fragment.lastChild;\n      if (firstChild && firstChild.name === 'meta') {\n        firstChild = firstChild.next;\n      }\n      if (lastChild && lastChild.attr('id') === 'mce_marker') {\n        lastChild = lastChild.prev;\n      }\n      if (isEmptyFragmentElement(schema, lastChild)) {\n        lastChild = lastChild.prev;\n      }\n      if (!firstChild || firstChild !== lastChild) {\n        return false;\n      }\n      return firstChild.name === 'ul' || firstChild.name === 'ol';\n    };\n    var cleanupDomFragment = function (domFragment) {\n      var firstChild = domFragment.firstChild;\n      var lastChild = domFragment.lastChild;\n      if (firstChild && firstChild.nodeName === 'META') {\n        firstChild.parentNode.removeChild(firstChild);\n      }\n      if (lastChild && lastChild.id === 'mce_marker') {\n        lastChild.parentNode.removeChild(lastChild);\n      }\n      return domFragment;\n    };\n    var toDomFragment = function (dom, serializer, fragment) {\n      var html = serializer.serialize(fragment);\n      var domFragment = dom.createFragment(html);\n      return cleanupDomFragment(domFragment);\n    };\n    var listItems$1 = function (elm) {\n      return Tools.grep(elm.childNodes, function (child) {\n        return child.nodeName === 'LI';\n      });\n    };\n    var isPadding = function (node) {\n      return node.data === nbsp || NodeType.isBr(node);\n    };\n    var isListItemPadded = function (node) {\n      return node && node.firstChild && node.firstChild === node.lastChild && isPadding(node.firstChild);\n    };\n    var isEmptyOrPadded = function (elm) {\n      return !elm.firstChild || isListItemPadded(elm);\n    };\n    var trimListItems = function (elms) {\n      return elms.length > 0 && isEmptyOrPadded(elms[elms.length - 1]) ? elms.slice(0, -1) : elms;\n    };\n    var getParentLi = function (dom, node) {\n      var parentBlock = dom.getParent(node, dom.isBlock);\n      return parentBlock && parentBlock.nodeName === 'LI' ? parentBlock : null;\n    };\n    var isParentBlockLi = function (dom, node) {\n      return !!getParentLi(dom, node);\n    };\n    var getSplit = function (parentNode, rng) {\n      var beforeRng = rng.cloneRange();\n      var afterRng = rng.cloneRange();\n      beforeRng.setStartBefore(parentNode);\n      afterRng.setEndAfter(parentNode);\n      return [\n        beforeRng.cloneContents(),\n        afterRng.cloneContents()\n      ];\n    };\n    var findFirstIn = function (node, rootNode) {\n      var caretPos = CaretPosition$1.before(node);\n      var caretWalker = CaretWalker(rootNode);\n      var newCaretPos = caretWalker.next(caretPos);\n      return newCaretPos ? newCaretPos.toRange() : null;\n    };\n    var findLastOf = function (node, rootNode) {\n      var caretPos = CaretPosition$1.after(node);\n      var caretWalker = CaretWalker(rootNode);\n      var newCaretPos = caretWalker.prev(caretPos);\n      return newCaretPos ? newCaretPos.toRange() : null;\n    };\n    var insertMiddle = function (target, elms, rootNode, rng) {\n      var parts = getSplit(target, rng);\n      var parentElm = target.parentNode;\n      parentElm.insertBefore(parts[0], target);\n      Tools.each(elms, function (li) {\n        parentElm.insertBefore(li, target);\n      });\n      parentElm.insertBefore(parts[1], target);\n      parentElm.removeChild(target);\n      return findLastOf(elms[elms.length - 1], rootNode);\n    };\n    var insertBefore$1 = function (target, elms, rootNode) {\n      var parentElm = target.parentNode;\n      Tools.each(elms, function (elm) {\n        parentElm.insertBefore(elm, target);\n      });\n      return findFirstIn(target, rootNode);\n    };\n    var insertAfter$1 = function (target, elms, rootNode, dom) {\n      dom.insertAfter(elms.reverse(), target);\n      return findLastOf(elms[0], rootNode);\n    };\n    var insertAtCaret = function (serializer, dom, rng, fragment) {\n      var domFragment = toDomFragment(dom, serializer, fragment);\n      var liTarget = getParentLi(dom, rng.startContainer);\n      var liElms = trimListItems(listItems$1(domFragment.firstChild));\n      var BEGINNING = 1, END = 2;\n      var rootNode = dom.getRoot();\n      var isAt = function (location) {\n        var caretPos = CaretPosition$1.fromRangeStart(rng);\n        var caretWalker = CaretWalker(dom.getRoot());\n        var newPos = location === BEGINNING ? caretWalker.prev(caretPos) : caretWalker.next(caretPos);\n        return newPos ? getParentLi(dom, newPos.getNode()) !== liTarget : true;\n      };\n      if (isAt(BEGINNING)) {\n        return insertBefore$1(liTarget, liElms, rootNode);\n      } else if (isAt(END)) {\n        return insertAfter$1(liTarget, liElms, rootNode, dom);\n      }\n      return insertMiddle(liTarget, liElms, rootNode, rng);\n    };\n    var InsertList = {\n      isListFragment: isListFragment,\n      insertAtCaret: insertAtCaret,\n      isParentBlockLi: isParentBlockLi,\n      trimListItems: trimListItems,\n      listItems: listItems$1\n    };\n\n    var isAfterNbsp = function (container, offset) {\n      return NodeType.isText(container) && container.nodeValue[offset - 1] === nbsp;\n    };\n    var trimOrPadLeftRight = function (rng, html) {\n      var container, offset;\n      container = rng.startContainer;\n      offset = rng.startOffset;\n      var hasSiblingText = function (siblingName) {\n        return container[siblingName] && container[siblingName].nodeType === 3;\n      };\n      if (container.nodeType === 3) {\n        if (offset > 0) {\n          html = html.replace(/^&nbsp;/, ' ');\n        } else if (!hasSiblingText('previousSibling')) {\n          html = html.replace(/^ /, '&nbsp;');\n        }\n        if (offset < container.length) {\n          html = html.replace(/&nbsp;(<br>|)$/, ' ');\n        } else if (!hasSiblingText('nextSibling')) {\n          html = html.replace(/(&nbsp;| )(<br>|)$/, '&nbsp;');\n        }\n      }\n      return html;\n    };\n    var trimNbspAfterDeleteAndPadValue = function (rng, value) {\n      var container, offset;\n      container = rng.startContainer;\n      offset = rng.startOffset;\n      if (container.nodeType === 3 && rng.collapsed) {\n        if (container.data[offset] === nbsp) {\n          container.deleteData(offset, 1);\n          if (!/[\\u00a0| ]$/.test(value)) {\n            value += ' ';\n          }\n        } else if (container.data[offset - 1] === nbsp) {\n          container.deleteData(offset - 1, 1);\n          if (!/[\\u00a0| ]$/.test(value)) {\n            value = ' ' + value;\n          }\n        }\n      }\n      return value;\n    };\n\n    var isTableCell$5 = NodeType.matchNodeNames([\n      'td',\n      'th'\n    ]);\n    var selectionSetContent = function (editor, content) {\n      var rng = editor.selection.getRng();\n      var container = rng.startContainer;\n      var offset = rng.startOffset;\n      if (rng.collapsed && isAfterNbsp(container, offset) && NodeType.isText(container)) {\n        container.insertData(offset - 1, ' ');\n        container.deleteData(offset, 1);\n        rng.setStart(container, offset);\n        rng.setEnd(container, offset);\n        editor.selection.setRng(rng);\n      }\n      editor.selection.setContent(content);\n    };\n    var validInsertion = function (editor, value, parentNode) {\n      if (parentNode.getAttribute('data-mce-bogus') === 'all') {\n        parentNode.parentNode.insertBefore(editor.dom.createFragment(value), parentNode);\n      } else {\n        var node = parentNode.firstChild;\n        var node2 = parentNode.lastChild;\n        if (!node || node === node2 && node.nodeName === 'BR') {\n          editor.dom.setHTML(parentNode, value);\n        } else {\n          selectionSetContent(editor, value);\n        }\n      }\n    };\n    var trimBrsFromTableCell = function (dom, elm) {\n      Option.from(dom.getParent(elm, 'td,th')).map(Element.fromDom).each(PaddingBr.trimBlockTrailingBr);\n    };\n    var reduceInlineTextElements = function (editor, merge) {\n      var textInlineElements = editor.schema.getTextInlineElements();\n      var dom = editor.dom;\n      if (merge) {\n        var root_1 = editor.getBody(), elementUtils_1 = new ElementUtils(dom);\n        Tools.each(dom.select('*[data-mce-fragment]'), function (node) {\n          for (var testNode = node.parentNode; testNode && testNode !== root_1; testNode = testNode.parentNode) {\n            if (textInlineElements[node.nodeName.toLowerCase()] && elementUtils_1.compare(testNode, node)) {\n              dom.remove(node, true);\n            }\n          }\n        });\n      }\n    };\n    var markFragmentElements = function (fragment) {\n      var node = fragment;\n      while (node = node.walk()) {\n        if (node.type === 1) {\n          node.attr('data-mce-fragment', '1');\n        }\n      }\n    };\n    var umarkFragmentElements = function (elm) {\n      Tools.each(elm.getElementsByTagName('*'), function (elm) {\n        elm.removeAttribute('data-mce-fragment');\n      });\n    };\n    var isPartOfFragment = function (node) {\n      return !!node.getAttribute('data-mce-fragment');\n    };\n    var canHaveChildren = function (editor, node) {\n      return node && !editor.schema.getShortEndedElements()[node.nodeName];\n    };\n    var moveSelectionToMarker = function (editor, marker) {\n      var parentEditableFalseElm, parentBlock, nextRng;\n      var dom = editor.dom, selection = editor.selection;\n      var node, node2;\n      var getContentEditableFalseParent = function (node) {\n        var root = editor.getBody();\n        for (; node && node !== root; node = node.parentNode) {\n          if (editor.dom.getContentEditable(node) === 'false') {\n            return node;\n          }\n        }\n        return null;\n      };\n      if (!marker) {\n        return;\n      }\n      editor.selection.scrollIntoView(marker);\n      parentEditableFalseElm = getContentEditableFalseParent(marker);\n      if (parentEditableFalseElm) {\n        dom.remove(marker);\n        selection.select(parentEditableFalseElm);\n        return;\n      }\n      var rng = dom.createRng();\n      node = marker.previousSibling;\n      if (node && node.nodeType === 3) {\n        rng.setStart(node, node.nodeValue.length);\n        if (!Env.ie) {\n          node2 = marker.nextSibling;\n          if (node2 && node2.nodeType === 3) {\n            node.appendData(node2.data);\n            node2.parentNode.removeChild(node2);\n          }\n        }\n      } else {\n        rng.setStartBefore(marker);\n        rng.setEndBefore(marker);\n      }\n      var findNextCaretRng = function (rng) {\n        var caretPos = CaretPosition$1.fromRangeStart(rng);\n        var caretWalker = CaretWalker(editor.getBody());\n        caretPos = caretWalker.next(caretPos);\n        if (caretPos) {\n          return caretPos.toRange();\n        }\n      };\n      parentBlock = dom.getParent(marker, dom.isBlock);\n      dom.remove(marker);\n      if (parentBlock && dom.isEmpty(parentBlock)) {\n        editor.$(parentBlock).empty();\n        rng.setStart(parentBlock, 0);\n        rng.setEnd(parentBlock, 0);\n        if (!isTableCell$5(parentBlock) && !isPartOfFragment(parentBlock) && (nextRng = findNextCaretRng(rng))) {\n          rng = nextRng;\n          dom.remove(parentBlock);\n        } else {\n          dom.add(parentBlock, dom.create('br', { 'data-mce-bogus': '1' }));\n        }\n      }\n      selection.setRng(rng);\n    };\n    var insertHtmlAtCaret = function (editor, value, details) {\n      var parser, serializer, parentNode, rootNode, fragment, args;\n      var marker, rng, node, bookmarkHtml, merge;\n      var selection = editor.selection, dom = editor.dom;\n      if (/^ | $/.test(value)) {\n        value = trimOrPadLeftRight(selection.getRng(), value);\n      }\n      parser = editor.parser;\n      merge = details.merge;\n      serializer = Serializer({ validate: editor.settings.validate }, editor.schema);\n      bookmarkHtml = '<span id=\"mce_marker\" data-mce-type=\"bookmark\">&#xFEFF;&#x200B;</span>';\n      args = {\n        content: value,\n        format: 'html',\n        selection: true,\n        paste: details.paste\n      };\n      args = editor.fire('BeforeSetContent', args);\n      if (args.isDefaultPrevented()) {\n        editor.fire('SetContent', {\n          content: args.content,\n          format: 'html',\n          selection: true,\n          paste: details.paste\n        });\n        return;\n      }\n      value = args.content;\n      if (value.indexOf('{$caret}') === -1) {\n        value += '{$caret}';\n      }\n      value = value.replace(/\\{\\$caret\\}/, bookmarkHtml);\n      rng = selection.getRng();\n      var caretElement = rng.startContainer || (rng.parentElement ? rng.parentElement() : null);\n      var body = editor.getBody();\n      if (caretElement === body && selection.isCollapsed()) {\n        if (dom.isBlock(body.firstChild) && canHaveChildren(editor, body.firstChild) && dom.isEmpty(body.firstChild)) {\n          rng = dom.createRng();\n          rng.setStart(body.firstChild, 0);\n          rng.setEnd(body.firstChild, 0);\n          selection.setRng(rng);\n        }\n      }\n      if (!selection.isCollapsed()) {\n        editor.selection.setRng(RangeNormalizer.normalize(editor.selection.getRng()));\n        editor.getDoc().execCommand('Delete', false, null);\n        value = trimNbspAfterDeleteAndPadValue(editor.selection.getRng(), value);\n      }\n      parentNode = selection.getNode();\n      var parserArgs = {\n        context: parentNode.nodeName.toLowerCase(),\n        data: details.data,\n        insert: true\n      };\n      fragment = parser.parse(value, parserArgs);\n      if (details.paste === true && InsertList.isListFragment(editor.schema, fragment) && InsertList.isParentBlockLi(dom, parentNode)) {\n        rng = InsertList.insertAtCaret(serializer, dom, editor.selection.getRng(), fragment);\n        editor.selection.setRng(rng);\n        editor.fire('SetContent', args);\n        return;\n      }\n      markFragmentElements(fragment);\n      node = fragment.lastChild;\n      if (node.attr('id') === 'mce_marker') {\n        marker = node;\n        for (node = node.prev; node; node = node.walk(true)) {\n          if (node.type === 3 || !dom.isBlock(node.name)) {\n            if (editor.schema.isValidChild(node.parent.name, 'span')) {\n              node.parent.insert(marker, node, node.name === 'br');\n            }\n            break;\n          }\n        }\n      }\n      editor._selectionOverrides.showBlockCaretContainer(parentNode);\n      if (!parserArgs.invalid) {\n        value = serializer.serialize(fragment);\n        validInsertion(editor, value, parentNode);\n      } else {\n        selectionSetContent(editor, bookmarkHtml);\n        parentNode = selection.getNode();\n        rootNode = editor.getBody();\n        if (parentNode.nodeType === 9) {\n          parentNode = node = rootNode;\n        } else {\n          node = parentNode;\n        }\n        while (node !== rootNode) {\n          parentNode = node;\n          node = node.parentNode;\n        }\n        value = parentNode === rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode);\n        value = serializer.serialize(parser.parse(value.replace(/<span (id=\"mce_marker\"|id=mce_marker).+?<\\/span>/i, function () {\n          return serializer.serialize(fragment);\n        })));\n        if (parentNode === rootNode) {\n          dom.setHTML(rootNode, value);\n        } else {\n          dom.setOuterHTML(parentNode, value);\n        }\n      }\n      reduceInlineTextElements(editor, merge);\n      moveSelectionToMarker(editor, dom.get('mce_marker'));\n      umarkFragmentElements(editor.getBody());\n      trimBrsFromTableCell(editor.dom, editor.selection.getStart());\n      editor.fire('SetContent', args);\n      editor.addVisual();\n    };\n    var processValue = function (value) {\n      var details;\n      if (typeof value !== 'string') {\n        details = Tools.extend({\n          paste: value.paste,\n          data: { paste: value.paste }\n        }, value);\n        return {\n          content: value.content,\n          details: details\n        };\n      }\n      return {\n        content: value,\n        details: {}\n      };\n    };\n    var insertAtCaret$1 = function (editor, value) {\n      var result = processValue(value);\n      insertHtmlAtCaret(editor, result.content, result.details);\n    };\n    var InsertContent = { insertAtCaret: insertAtCaret$1 };\n\n    var nativeCommand = function (editor, command) {\n      editor.getDoc().execCommand(command, false, null);\n    };\n    var deleteCommand = function (editor) {\n      if (Outdent.backspaceDelete(editor, false)) {\n        return;\n      } else if (CefDelete.backspaceDelete(editor, false)) {\n        return;\n      } else if (CefBoundaryDelete.backspaceDelete(editor, false)) {\n        return;\n      } else if (BoundaryDelete.backspaceDelete(editor, false)) {\n        return;\n      } else if (BlockBoundaryDelete.backspaceDelete(editor, false)) {\n        return;\n      } else if (TableDelete.backspaceDelete(editor)) {\n        return;\n      } else if (BlockRangeDelete.backspaceDelete(editor, false)) {\n        return;\n      } else if (InlineFormatDelete.backspaceDelete(editor, false)) {\n        return;\n      } else {\n        nativeCommand(editor, 'Delete');\n        DeleteUtils.paddEmptyBody(editor);\n      }\n    };\n    var forwardDeleteCommand = function (editor) {\n      if (CefDelete.backspaceDelete(editor, true)) {\n        return;\n      } else if (CefBoundaryDelete.backspaceDelete(editor, true)) {\n        return;\n      } else if (BoundaryDelete.backspaceDelete(editor, true)) {\n        return;\n      } else if (BlockBoundaryDelete.backspaceDelete(editor, true)) {\n        return;\n      } else if (TableDelete.backspaceDelete(editor)) {\n        return;\n      } else if (BlockRangeDelete.backspaceDelete(editor, true)) {\n        return;\n      } else if (InlineFormatDelete.backspaceDelete(editor, true)) {\n        return;\n      } else {\n        nativeCommand(editor, 'ForwardDelete');\n      }\n    };\n    var DeleteCommands = {\n      deleteCommand: deleteCommand,\n      forwardDeleteCommand: forwardDeleteCommand\n    };\n\n    var ancestor$3 = function (scope, transform, isRoot) {\n      var element = scope.dom();\n      var stop = isFunction(isRoot) ? isRoot : constant(false);\n      while (element.parentNode) {\n        element = element.parentNode;\n        var el = Element.fromDom(element);\n        var transformed = transform(el);\n        if (transformed.isSome()) {\n          return transformed;\n        } else if (stop(el)) {\n          break;\n        }\n      }\n      return Option.none();\n    };\n    var closest$2 = function (scope, transform, isRoot) {\n      var current = transform(scope);\n      return current.orThunk(function () {\n        return isRoot(scope) ? Option.none() : ancestor$3(scope, transform, isRoot);\n      });\n    };\n\n    var legacyPropNames = {\n      'font-size': 'size',\n      'font-family': 'face'\n    };\n    var getSpecifiedFontProp = function (propName, rootElm, elm) {\n      var getProperty = function (elm) {\n        return getRaw(elm, propName).orThunk(function () {\n          if (name(elm) === 'font') {\n            return get(legacyPropNames, propName).bind(function (legacyPropName) {\n              return getOpt(elm, legacyPropName);\n            });\n          } else {\n            return Option.none();\n          }\n        });\n      };\n      var isRoot = function (elm) {\n        return eq(Element.fromDom(rootElm), elm);\n      };\n      return closest$2(Element.fromDom(elm), function (elm) {\n        return getProperty(elm);\n      }, isRoot);\n    };\n    var round$1 = function (number, precision) {\n      var factor = Math.pow(10, precision);\n      return Math.round(number * factor) / factor;\n    };\n    var toPt = function (fontSize, precision) {\n      if (/[0-9.]+px$/.test(fontSize)) {\n        return round$1(parseInt(fontSize, 10) * 72 / 96, precision || 0) + 'pt';\n      }\n      return fontSize;\n    };\n    var normalizeFontFamily = function (fontFamily) {\n      return fontFamily.replace(/[\\'\\\"\\\\]/g, '').replace(/,\\s+/g, ',');\n    };\n    var getComputedFontProp = function (propName, elm) {\n      return Option.from(DOMUtils$1.DOM.getStyle(elm, propName, true));\n    };\n    var getFontProp = function (propName) {\n      return function (rootElm, elm) {\n        return Option.from(elm).map(Element.fromDom).filter(isElement).bind(function (element) {\n          return getSpecifiedFontProp(propName, rootElm, element.dom()).or(getComputedFontProp(propName, element.dom()));\n        }).getOr('');\n      };\n    };\n    var FontInfo = {\n      getFontSize: getFontProp('font-size'),\n      getFontFamily: compose(normalizeFontFamily, getFontProp('font-family')),\n      toPt: toPt\n    };\n\n    var findFirstCaretElement = function (editor) {\n      return CaretFinder.firstPositionIn(editor.getBody()).map(function (caret) {\n        var container = caret.container();\n        return NodeType.isText(container) ? container.parentNode : container;\n      });\n    };\n    var isRangeAtStartOfNode = function (rng, root) {\n      return rng.startContainer === root && rng.startOffset === 0;\n    };\n    var getCaretElement = function (editor) {\n      return Option.from(editor.selection.getRng()).bind(function (rng) {\n        var root = editor.getBody();\n        return isRangeAtStartOfNode(rng, root) ? Option.none() : Option.from(editor.selection.getStart(true));\n      });\n    };\n    var fromFontSizeNumber = function (editor, value) {\n      if (/^[0-9\\.]+$/.test(value)) {\n        var fontSizeNumber = parseInt(value, 10);\n        if (fontSizeNumber >= 1 && fontSizeNumber <= 7) {\n          var fontSizes = Settings.getFontStyleValues(editor);\n          var fontClasses = Settings.getFontSizeClasses(editor);\n          if (fontClasses) {\n            return fontClasses[fontSizeNumber - 1] || value;\n          } else {\n            return fontSizes[fontSizeNumber - 1] || value;\n          }\n        } else {\n          return value;\n        }\n      } else {\n        return value;\n      }\n    };\n    var normalizeFontNames = function (font) {\n      var fonts = font.split(/\\s*,\\s*/);\n      return map(fonts, function (font) {\n        if (font.indexOf(' ') !== -1 && !(startsWith(font, '\"') || startsWith(font, '\\''))) {\n          return '\\'' + font + '\\'';\n        } else {\n          return font;\n        }\n      }).join(',');\n    };\n    var fontNameAction = function (editor, value) {\n      var font = fromFontSizeNumber(editor, value);\n      editor.formatter.toggle('fontname', { value: normalizeFontNames(font) });\n      editor.nodeChanged();\n    };\n    var fontNameQuery = function (editor) {\n      return getCaretElement(editor).fold(function () {\n        return findFirstCaretElement(editor).map(function (caretElement) {\n          return FontInfo.getFontFamily(editor.getBody(), caretElement);\n        }).getOr('');\n      }, function (caretElement) {\n        return FontInfo.getFontFamily(editor.getBody(), caretElement);\n      });\n    };\n    var fontSizeAction = function (editor, value) {\n      editor.formatter.toggle('fontsize', { value: fromFontSizeNumber(editor, value) });\n      editor.nodeChanged();\n    };\n    var fontSizeQuery = function (editor) {\n      return getCaretElement(editor).fold(function () {\n        return findFirstCaretElement(editor).map(function (caretElement) {\n          return FontInfo.getFontSize(editor.getBody(), caretElement);\n        }).getOr('');\n      }, function (caretElement) {\n        return FontInfo.getFontSize(editor.getBody(), caretElement);\n      });\n    };\n\n    var each$f = Tools.each;\n    var map$3 = Tools.map, inArray$2 = Tools.inArray;\n    var EditorCommands = function () {\n      function EditorCommands(editor) {\n        this.commands = {\n          state: {},\n          exec: {},\n          value: {}\n        };\n        this.editor = editor;\n        this.setupCommands(editor);\n      }\n      EditorCommands.prototype.execCommand = function (command, ui, value, args) {\n        var func, customCommand, state = false;\n        var self = this;\n        if (self.editor.removed) {\n          return;\n        }\n        if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(command) && (!args || !args.skip_focus)) {\n          self.editor.focus();\n        } else {\n          SelectionBookmark.restore(self.editor);\n        }\n        args = self.editor.fire('BeforeExecCommand', {\n          command: command,\n          ui: ui,\n          value: value\n        });\n        if (args.isDefaultPrevented()) {\n          return false;\n        }\n        customCommand = command.toLowerCase();\n        if (func = self.commands.exec[customCommand]) {\n          func(customCommand, ui, value);\n          self.editor.fire('ExecCommand', {\n            command: command,\n            ui: ui,\n            value: value\n          });\n          return true;\n        }\n        each$f(this.editor.plugins, function (p) {\n          if (p.execCommand && p.execCommand(command, ui, value)) {\n            self.editor.fire('ExecCommand', {\n              command: command,\n              ui: ui,\n              value: value\n            });\n            state = true;\n            return false;\n          }\n        });\n        if (state) {\n          return state;\n        }\n        if (self.editor.theme && self.editor.theme.execCommand && self.editor.theme.execCommand(command, ui, value)) {\n          self.editor.fire('ExecCommand', {\n            command: command,\n            ui: ui,\n            value: value\n          });\n          return true;\n        }\n        try {\n          state = self.editor.getDoc().execCommand(command, ui, value);\n        } catch (ex) {\n        }\n        if (state) {\n          self.editor.fire('ExecCommand', {\n            command: command,\n            ui: ui,\n            value: value\n          });\n          return true;\n        }\n        return false;\n      };\n      EditorCommands.prototype.queryCommandState = function (command) {\n        var func;\n        if (this.editor.quirks.isHidden() || this.editor.removed) {\n          return;\n        }\n        command = command.toLowerCase();\n        if (func = this.commands.state[command]) {\n          return func(command);\n        }\n        try {\n          return this.editor.getDoc().queryCommandState(command);\n        } catch (ex) {\n        }\n        return false;\n      };\n      EditorCommands.prototype.queryCommandValue = function (command) {\n        var func;\n        if (this.editor.quirks.isHidden() || this.editor.removed) {\n          return;\n        }\n        command = command.toLowerCase();\n        if (func = this.commands.value[command]) {\n          return func(command);\n        }\n        try {\n          return this.editor.getDoc().queryCommandValue(command);\n        } catch (ex) {\n        }\n      };\n      EditorCommands.prototype.addCommands = function (commandList, type) {\n        var self = this;\n        type = type || 'exec';\n        each$f(commandList, function (callback, command) {\n          each$f(command.toLowerCase().split(','), function (command) {\n            self.commands[type][command] = callback;\n          });\n        });\n      };\n      EditorCommands.prototype.addCommand = function (command, callback, scope) {\n        var _this = this;\n        command = command.toLowerCase();\n        this.commands.exec[command] = function (command, ui, value, args) {\n          return callback.call(scope || _this.editor, ui, value, args);\n        };\n      };\n      EditorCommands.prototype.queryCommandSupported = function (command) {\n        command = command.toLowerCase();\n        if (this.commands.exec[command]) {\n          return true;\n        }\n        try {\n          return this.editor.getDoc().queryCommandSupported(command);\n        } catch (ex) {\n        }\n        return false;\n      };\n      EditorCommands.prototype.addQueryStateHandler = function (command, callback, scope) {\n        var _this = this;\n        command = command.toLowerCase();\n        this.commands.state[command] = function () {\n          return callback.call(scope || _this.editor);\n        };\n      };\n      EditorCommands.prototype.addQueryValueHandler = function (command, callback, scope) {\n        var _this = this;\n        command = command.toLowerCase();\n        this.commands.value[command] = function () {\n          return callback.call(scope || _this.editor);\n        };\n      };\n      EditorCommands.prototype.hasCustomCommand = function (command) {\n        command = command.toLowerCase();\n        return !!this.commands.exec[command];\n      };\n      EditorCommands.prototype.execNativeCommand = function (command, ui, value) {\n        if (ui === undefined) {\n          ui = false;\n        }\n        if (value === undefined) {\n          value = null;\n        }\n        return this.editor.getDoc().execCommand(command, ui, value);\n      };\n      EditorCommands.prototype.isFormatMatch = function (name) {\n        return this.editor.formatter.match(name);\n      };\n      EditorCommands.prototype.toggleFormat = function (name, value) {\n        this.editor.formatter.toggle(name, value ? { value: value } : undefined);\n        this.editor.nodeChanged();\n      };\n      EditorCommands.prototype.storeSelection = function (type) {\n        this.selectionBookmark = this.editor.selection.getBookmark(type);\n      };\n      EditorCommands.prototype.restoreSelection = function () {\n        this.editor.selection.moveToBookmark(this.selectionBookmark);\n      };\n      EditorCommands.prototype.setupCommands = function (editor) {\n        var self = this;\n        this.addCommands({\n          'mceResetDesignMode,mceBeginUndoLevel': function () {\n          },\n          'mceEndUndoLevel,mceAddUndoLevel': function () {\n            editor.undoManager.add();\n          },\n          'Cut,Copy,Paste': function (command) {\n            var doc = editor.getDoc();\n            var failed;\n            try {\n              self.execNativeCommand(command);\n            } catch (ex) {\n              failed = true;\n            }\n            if (command === 'paste' && !doc.queryCommandEnabled(command)) {\n              failed = true;\n            }\n            if (failed || !doc.queryCommandSupported(command)) {\n              var msg = editor.translate('Your browser doesn\\'t support direct access to the clipboard. ' + 'Please use the Ctrl+X/C/V keyboard shortcuts instead.');\n              if (Env.mac) {\n                msg = msg.replace(/Ctrl\\+/g, '\\u2318+');\n              }\n              editor.notificationManager.open({\n                text: msg,\n                type: 'error'\n              });\n            }\n          },\n          'unlink': function () {\n            if (editor.selection.isCollapsed()) {\n              var elm = editor.dom.getParent(editor.selection.getStart(), 'a');\n              if (elm) {\n                editor.dom.remove(elm, true);\n              }\n              return;\n            }\n            editor.formatter.remove('link');\n          },\n          'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone': function (command) {\n            var align = command.substring(7);\n            if (align === 'full') {\n              align = 'justify';\n            }\n            each$f('left,center,right,justify'.split(','), function (name) {\n              if (align !== name) {\n                editor.formatter.remove('align' + name);\n              }\n            });\n            if (align !== 'none') {\n              self.toggleFormat('align' + align);\n            }\n          },\n          'InsertUnorderedList,InsertOrderedList': function (command) {\n            var listElm, listParent;\n            self.execNativeCommand(command);\n            listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul');\n            if (listElm) {\n              listParent = listElm.parentNode;\n              if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) {\n                self.storeSelection();\n                editor.dom.split(listParent, listElm);\n                self.restoreSelection();\n              }\n            }\n          },\n          'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': function (command) {\n            self.toggleFormat(command);\n          },\n          'ForeColor,HiliteColor': function (command, ui, value) {\n            self.toggleFormat(command, value);\n          },\n          'FontName': function (command, ui, value) {\n            fontNameAction(editor, value);\n          },\n          'FontSize': function (command, ui, value) {\n            fontSizeAction(editor, value);\n          },\n          'RemoveFormat': function (command) {\n            editor.formatter.remove(command);\n          },\n          'mceBlockQuote': function () {\n            self.toggleFormat('blockquote');\n          },\n          'FormatBlock': function (command, ui, value) {\n            return self.toggleFormat(value || 'p');\n          },\n          'mceCleanup': function () {\n            var bookmark = editor.selection.getBookmark();\n            editor.setContent(editor.getContent());\n            editor.selection.moveToBookmark(bookmark);\n          },\n          'mceRemoveNode': function (command, ui, value) {\n            var node = value || editor.selection.getNode();\n            if (node !== editor.getBody()) {\n              self.storeSelection();\n              editor.dom.remove(node, true);\n              self.restoreSelection();\n            }\n          },\n          'mceSelectNodeDepth': function (command, ui, value) {\n            var counter = 0;\n            editor.dom.getParent(editor.selection.getNode(), function (node) {\n              if (node.nodeType === 1 && counter++ === value) {\n                editor.selection.select(node);\n                return false;\n              }\n            }, editor.getBody());\n          },\n          'mceSelectNode': function (command, ui, value) {\n            editor.selection.select(value);\n          },\n          'mceInsertContent': function (command, ui, value) {\n            InsertContent.insertAtCaret(editor, value);\n          },\n          'mceInsertRawHTML': function (command, ui, value) {\n            editor.selection.setContent('tiny_mce_marker');\n            var content = editor.getContent();\n            editor.setContent(content.replace(/tiny_mce_marker/g, function () {\n              return value;\n            }));\n          },\n          'mceInsertNewLine': function (command, ui, value) {\n            InsertNewLine.insert(editor, value);\n          },\n          'mceToggleFormat': function (command, ui, value) {\n            self.toggleFormat(value);\n          },\n          'mceSetContent': function (command, ui, value) {\n            editor.setContent(value);\n          },\n          'Indent,Outdent': function (command) {\n            handle(editor, command);\n          },\n          'mceRepaint': function () {\n          },\n          'InsertHorizontalRule': function () {\n            editor.execCommand('mceInsertContent', false, '<hr />');\n          },\n          'mceToggleVisualAid': function () {\n            editor.hasVisual = !editor.hasVisual;\n            editor.addVisual();\n          },\n          'mceReplaceContent': function (command, ui, value) {\n            editor.execCommand('mceInsertContent', false, value.replace(/\\{\\$selection\\}/g, editor.selection.getContent({ format: 'text' })));\n          },\n          'mceInsertLink': function (command, ui, value) {\n            var anchor;\n            if (typeof value === 'string') {\n              value = { href: value };\n            }\n            anchor = editor.dom.getParent(editor.selection.getNode(), 'a');\n            value.href = value.href.replace(/ /g, '%20');\n            if (!anchor || !value.href) {\n              editor.formatter.remove('link');\n            }\n            if (value.href) {\n              editor.formatter.apply('link', value, anchor);\n            }\n          },\n          'selectAll': function () {\n            var editingHost = editor.dom.getParent(editor.selection.getStart(), NodeType.isContentEditableTrue);\n            if (editingHost) {\n              var rng = editor.dom.createRng();\n              rng.selectNodeContents(editingHost);\n              editor.selection.setRng(rng);\n            }\n          },\n          'delete': function () {\n            DeleteCommands.deleteCommand(editor);\n          },\n          'forwardDelete': function () {\n            DeleteCommands.forwardDeleteCommand(editor);\n          },\n          'mceNewDocument': function () {\n            editor.setContent('');\n          },\n          'InsertLineBreak': function (command, ui, value) {\n            InsertBr.insert(editor, value);\n            return true;\n          }\n        });\n        var alignStates = function (name) {\n          return function () {\n            var nodes = editor.selection.isCollapsed() ? [editor.dom.getParent(editor.selection.getNode(), editor.dom.isBlock)] : editor.selection.getSelectedBlocks();\n            var matches = map$3(nodes, function (node) {\n              return !!editor.formatter.matchNode(node, name);\n            });\n            return inArray$2(matches, true) !== -1;\n          };\n        };\n        self.addCommands({\n          'JustifyLeft': alignStates('alignleft'),\n          'JustifyCenter': alignStates('aligncenter'),\n          'JustifyRight': alignStates('alignright'),\n          'JustifyFull': alignStates('alignjustify'),\n          'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': function (command) {\n            return self.isFormatMatch(command);\n          },\n          'mceBlockQuote': function () {\n            return self.isFormatMatch('blockquote');\n          },\n          'Outdent': function () {\n            return canOutdent(editor);\n          },\n          'InsertUnorderedList,InsertOrderedList': function (command) {\n            var list = editor.dom.getParent(editor.selection.getNode(), 'ul,ol');\n            return list && (command === 'insertunorderedlist' && list.tagName === 'UL' || command === 'insertorderedlist' && list.tagName === 'OL');\n          }\n        }, 'state');\n        self.addCommands({\n          Undo: function () {\n            editor.undoManager.undo();\n          },\n          Redo: function () {\n            editor.undoManager.redo();\n          }\n        });\n        self.addQueryValueHandler('FontName', function () {\n          return fontNameQuery(editor);\n        }, this);\n        self.addQueryValueHandler('FontSize', function () {\n          return fontSizeQuery(editor);\n        }, this);\n      };\n      return EditorCommands;\n    }();\n\n    var nativeEvents = Tools.makeMap('focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange ' + 'mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover ' + 'draggesture dragdrop drop drag submit ' + 'compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel', ' ');\n    var EventDispatcher = function () {\n      function EventDispatcher(settings) {\n        this.bindings = {};\n        this.settings = settings || {};\n        this.scope = this.settings.scope || this;\n        this.toggleEvent = this.settings.toggleEvent || never;\n      }\n      EventDispatcher.isNative = function (name) {\n        return !!nativeEvents[name.toLowerCase()];\n      };\n      EventDispatcher.prototype.fire = function (name, args) {\n        var handlers, i, l, callback;\n        name = name.toLowerCase();\n        args = args || {};\n        args.type = name;\n        if (!args.target) {\n          args.target = this.scope;\n        }\n        if (!args.preventDefault) {\n          args.preventDefault = function () {\n            args.isDefaultPrevented = always;\n          };\n          args.stopPropagation = function () {\n            args.isPropagationStopped = always;\n          };\n          args.stopImmediatePropagation = function () {\n            args.isImmediatePropagationStopped = always;\n          };\n          args.isDefaultPrevented = never;\n          args.isPropagationStopped = never;\n          args.isImmediatePropagationStopped = never;\n        }\n        if (this.settings.beforeFire) {\n          this.settings.beforeFire(args);\n        }\n        handlers = this.bindings[name];\n        if (handlers) {\n          for (i = 0, l = handlers.length; i < l; i++) {\n            callback = handlers[i];\n            if (callback.once) {\n              this.off(name, callback.func);\n            }\n            if (args.isImmediatePropagationStopped()) {\n              args.stopPropagation();\n              return args;\n            }\n            if (callback.func.call(this.scope, args) === false) {\n              args.preventDefault();\n              return args;\n            }\n          }\n        }\n        return args;\n      };\n      EventDispatcher.prototype.on = function (name, callback, prepend, extra) {\n        var handlers, names, i;\n        if (callback === false) {\n          callback = never;\n        }\n        if (callback) {\n          var wrappedCallback = { func: callback };\n          if (extra) {\n            Tools.extend(wrappedCallback, extra);\n          }\n          names = name.toLowerCase().split(' ');\n          i = names.length;\n          while (i--) {\n            name = names[i];\n            handlers = this.bindings[name];\n            if (!handlers) {\n              handlers = this.bindings[name] = [];\n              this.toggleEvent(name, true);\n            }\n            if (prepend) {\n              handlers.unshift(wrappedCallback);\n            } else {\n              handlers.push(wrappedCallback);\n            }\n          }\n        }\n        return this;\n      };\n      EventDispatcher.prototype.off = function (name, callback) {\n        var i, handlers, bindingName, names, hi;\n        if (name) {\n          names = name.toLowerCase().split(' ');\n          i = names.length;\n          while (i--) {\n            name = names[i];\n            handlers = this.bindings[name];\n            if (!name) {\n              for (bindingName in this.bindings) {\n                this.toggleEvent(bindingName, false);\n                delete this.bindings[bindingName];\n              }\n              return this;\n            }\n            if (handlers) {\n              if (!callback) {\n                handlers.length = 0;\n              } else {\n                hi = handlers.length;\n                while (hi--) {\n                  if (handlers[hi].func === callback) {\n                    handlers = handlers.slice(0, hi).concat(handlers.slice(hi + 1));\n                    this.bindings[name] = handlers;\n                  }\n                }\n              }\n              if (!handlers.length) {\n                this.toggleEvent(name, false);\n                delete this.bindings[name];\n              }\n            }\n          }\n        } else {\n          for (name in this.bindings) {\n            this.toggleEvent(name, false);\n          }\n          this.bindings = {};\n        }\n        return this;\n      };\n      EventDispatcher.prototype.once = function (name, callback, prepend) {\n        return this.on(name, callback, prepend, { once: true });\n      };\n      EventDispatcher.prototype.has = function (name) {\n        name = name.toLowerCase();\n        return !(!this.bindings[name] || this.bindings[name].length === 0);\n      };\n      return EventDispatcher;\n    }();\n\n    var getEventDispatcher = function (obj) {\n      if (!obj._eventDispatcher) {\n        obj._eventDispatcher = new EventDispatcher({\n          scope: obj,\n          toggleEvent: function (name, state) {\n            if (EventDispatcher.isNative(name) && obj.toggleNativeEvent) {\n              obj.toggleNativeEvent(name, state);\n            }\n          }\n        });\n      }\n      return obj._eventDispatcher;\n    };\n    var Observable = {\n      fire: function (name, args, bubble) {\n        var self = this;\n        if (self.removed && name !== 'remove' && name !== 'detach') {\n          return args;\n        }\n        var dispatcherArgs = getEventDispatcher(self).fire(name, args);\n        if (bubble !== false && self.parent) {\n          var parent_1 = self.parent();\n          while (parent_1 && !dispatcherArgs.isPropagationStopped()) {\n            parent_1.fire(name, dispatcherArgs, false);\n            parent_1 = parent_1.parent();\n          }\n        }\n        return dispatcherArgs;\n      },\n      on: function (name, callback, prepend) {\n        return getEventDispatcher(this).on(name, callback, prepend);\n      },\n      off: function (name, callback) {\n        return getEventDispatcher(this).off(name, callback);\n      },\n      once: function (name, callback) {\n        return getEventDispatcher(this).once(name, callback);\n      },\n      hasEventListeners: function (name) {\n        return getEventDispatcher(this).has(name);\n      }\n    };\n\n    var internalContentEditableAttr = 'data-mce-contenteditable';\n    var toggleClass = function (elm, cls, state) {\n      if (has$2(elm, cls) && state === false) {\n        remove$4(elm, cls);\n      } else if (state) {\n        add$3(elm, cls);\n      }\n    };\n    var setEditorCommandState = function (editor, cmd, state) {\n      try {\n        editor.getDoc().execCommand(cmd, false, state);\n      } catch (ex) {\n      }\n    };\n    var setContentEditable = function (elm, state) {\n      elm.dom().contentEditable = state ? 'true' : 'false';\n    };\n    var switchOffContentEditableTrue = function (elm) {\n      each(descendants$1(elm, '*[contenteditable=\"true\"]'), function (elm) {\n        set(elm, internalContentEditableAttr, 'true');\n        setContentEditable(elm, false);\n      });\n    };\n    var switchOnContentEditableTrue = function (elm) {\n      each(descendants$1(elm, '*[' + internalContentEditableAttr + '=\"true\"]'), function (elm) {\n        remove$1(elm, internalContentEditableAttr);\n        setContentEditable(elm, true);\n      });\n    };\n    var removeFakeSelection = function (editor) {\n      Option.from(editor.selection.getNode()).each(function (elm) {\n        elm.removeAttribute('data-mce-selected');\n      });\n    };\n    var restoreFakeSelection = function (editor) {\n      editor.selection.setRng(editor.selection.getRng());\n    };\n    var toggleReadOnly = function (editor, state) {\n      var body = Element.fromDom(editor.getBody());\n      toggleClass(body, 'mce-content-readonly', state);\n      if (state) {\n        editor.selection.controlSelection.hideResizeRect();\n        editor._selectionOverrides.hideFakeCaret();\n        removeFakeSelection(editor);\n        editor.readonly = true;\n        setContentEditable(body, false);\n        switchOffContentEditableTrue(body);\n      } else {\n        editor.readonly = false;\n        setContentEditable(body, true);\n        switchOnContentEditableTrue(body);\n        setEditorCommandState(editor, 'StyleWithCSS', false);\n        setEditorCommandState(editor, 'enableInlineTableEditing', false);\n        setEditorCommandState(editor, 'enableObjectResizing', false);\n        if (EditorFocus.hasEditorOrUiFocus(editor)) {\n          editor.focus();\n        }\n        restoreFakeSelection(editor);\n        editor.nodeChanged();\n      }\n    };\n    var isReadOnly = function (editor) {\n      return editor.readonly;\n    };\n    var registerFilters = function (editor) {\n      editor.parser.addAttributeFilter('contenteditable', function (nodes) {\n        if (isReadOnly(editor)) {\n          each(nodes, function (node) {\n            node.attr(internalContentEditableAttr, node.attr('contenteditable'));\n            node.attr('contenteditable', 'false');\n          });\n        }\n      });\n      editor.serializer.addAttributeFilter(internalContentEditableAttr, function (nodes) {\n        if (isReadOnly(editor)) {\n          each(nodes, function (node) {\n            node.attr('contenteditable', node.attr(internalContentEditableAttr));\n          });\n        }\n      });\n      editor.serializer.addTempAttr(internalContentEditableAttr);\n    };\n    var registerReadOnlyContentFilters = function (editor) {\n      if (editor.serializer) {\n        registerFilters(editor);\n      } else {\n        editor.on('PreInit', function () {\n          registerFilters(editor);\n        });\n      }\n    };\n    var isClickEvent = function (e) {\n      return e.type === 'click';\n    };\n    var isInAnchor = function (editor, target) {\n      return editor.dom.getParent(target, 'a') !== null;\n    };\n    var preventReadOnlyEvents = function (editor, e) {\n      var target = e.target;\n      if (isClickEvent(e) && !VK.metaKeyPressed(e) && isInAnchor(editor, target)) {\n        e.preventDefault();\n      }\n    };\n    var registerReadOnlySelectionBlockers = function (editor) {\n      editor.on('ShowCaret', function (e) {\n        if (isReadOnly(editor)) {\n          e.preventDefault();\n        }\n      });\n      editor.on('ObjectSelected', function (e) {\n        if (isReadOnly(editor)) {\n          e.preventDefault();\n        }\n      });\n    };\n\n    var DOM$8 = DOMUtils$1.DOM;\n    var customEventRootDelegates;\n    var getEventTarget = function (editor, eventName) {\n      if (eventName === 'selectionchange') {\n        return editor.getDoc();\n      }\n      if (!editor.inline && /^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(eventName)) {\n        return editor.getDoc().documentElement;\n      }\n      if (editor.settings.event_root) {\n        if (!editor.eventRoot) {\n          editor.eventRoot = DOM$8.select(editor.settings.event_root)[0];\n        }\n        return editor.eventRoot;\n      }\n      return editor.getBody();\n    };\n    var isListening = function (editor) {\n      return !editor.hidden && !isReadOnly(editor);\n    };\n    var fireEvent = function (editor, eventName, e) {\n      if (isListening(editor)) {\n        editor.fire(eventName, e);\n      } else if (isReadOnly(editor)) {\n        preventReadOnlyEvents(editor, e);\n      }\n    };\n    var bindEventDelegate = function (editor, eventName) {\n      var eventRootElm, delegate;\n      if (!editor.delegates) {\n        editor.delegates = {};\n      }\n      if (editor.delegates[eventName] || editor.removed) {\n        return;\n      }\n      eventRootElm = getEventTarget(editor, eventName);\n      if (editor.settings.event_root) {\n        if (!customEventRootDelegates) {\n          customEventRootDelegates = {};\n          editor.editorManager.on('removeEditor', function () {\n            var name;\n            if (!editor.editorManager.activeEditor) {\n              if (customEventRootDelegates) {\n                for (name in customEventRootDelegates) {\n                  editor.dom.unbind(getEventTarget(editor, name));\n                }\n                customEventRootDelegates = null;\n              }\n            }\n          });\n        }\n        if (customEventRootDelegates[eventName]) {\n          return;\n        }\n        delegate = function (e) {\n          var target = e.target;\n          var editors = editor.editorManager.get();\n          var i = editors.length;\n          while (i--) {\n            var body = editors[i].getBody();\n            if (body === target || DOM$8.isChildOf(target, body)) {\n              fireEvent(editors[i], eventName, e);\n            }\n          }\n        };\n        customEventRootDelegates[eventName] = delegate;\n        DOM$8.bind(eventRootElm, eventName, delegate);\n      } else {\n        delegate = function (e) {\n          fireEvent(editor, eventName, e);\n        };\n        DOM$8.bind(eventRootElm, eventName, delegate);\n        editor.delegates[eventName] = delegate;\n      }\n    };\n    var EditorObservable = __assign(__assign({}, Observable), {\n      bindPendingEventDelegates: function () {\n        var self = this;\n        Tools.each(self._pendingNativeEvents, function (name) {\n          bindEventDelegate(self, name);\n        });\n      },\n      toggleNativeEvent: function (name, state) {\n        var self = this;\n        if (name === 'focus' || name === 'blur') {\n          return;\n        }\n        if (state) {\n          if (self.initialized) {\n            bindEventDelegate(self, name);\n          } else {\n            if (!self._pendingNativeEvents) {\n              self._pendingNativeEvents = [name];\n            } else {\n              self._pendingNativeEvents.push(name);\n            }\n          }\n        } else if (self.initialized) {\n          self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);\n          delete self.delegates[name];\n        }\n      },\n      unbindAllNativeEvents: function () {\n        var self = this;\n        var body = self.getBody();\n        var dom = self.dom;\n        var name;\n        if (self.delegates) {\n          for (name in self.delegates) {\n            self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);\n          }\n          delete self.delegates;\n        }\n        if (!self.inline && body && dom) {\n          body.onload = null;\n          dom.unbind(self.getWin());\n          dom.unbind(self.getDoc());\n        }\n        if (dom) {\n          dom.unbind(body);\n          dom.unbind(self.getContainer());\n        }\n      }\n    });\n\n    var defaultModes = [\n      'design',\n      'readonly'\n    ];\n    var switchToMode = function (editor, activeMode, availableModes, mode) {\n      var oldMode = availableModes[activeMode.get()];\n      var newMode = availableModes[mode];\n      try {\n        newMode.activate();\n      } catch (e) {\n        domGlobals.console.error('problem while activating editor mode ' + mode + ':', e);\n        return;\n      }\n      oldMode.deactivate();\n      if (oldMode.editorReadOnly !== newMode.editorReadOnly) {\n        toggleReadOnly(editor, newMode.editorReadOnly);\n      }\n      activeMode.set(mode);\n      fireSwitchMode(editor, mode);\n    };\n    var setMode = function (editor, availableModes, activeMode, mode) {\n      if (mode === activeMode.get()) {\n        return;\n      } else if (!has(availableModes, mode)) {\n        throw new Error('Editor mode \\'' + mode + '\\' is invalid');\n      }\n      if (editor.initialized) {\n        switchToMode(editor, activeMode, availableModes, mode);\n      } else {\n        editor.on('init', function () {\n          return switchToMode(editor, activeMode, availableModes, mode);\n        });\n      }\n    };\n    var registerMode = function (availableModes, mode, api) {\n      var _a;\n      if (contains(defaultModes, mode)) {\n        throw new Error('Cannot override default mode ' + mode);\n      }\n      return __assign(__assign({}, availableModes), (_a = {}, _a[mode] = __assign(__assign({}, api), {\n        deactivate: function () {\n          try {\n            api.deactivate();\n          } catch (e) {\n            domGlobals.console.error('problem while deactivating editor mode ' + mode + ':', e);\n          }\n        }\n      }), _a));\n    };\n\n    var create$4 = function (editor) {\n      var activeMode = Cell('design');\n      var availableModes = Cell({\n        design: {\n          activate: noop,\n          deactivate: noop,\n          editorReadOnly: false\n        },\n        readonly: {\n          activate: noop,\n          deactivate: noop,\n          editorReadOnly: true\n        }\n      });\n      registerReadOnlyContentFilters(editor);\n      registerReadOnlySelectionBlockers(editor);\n      return {\n        isReadOnly: function () {\n          return isReadOnly(editor);\n        },\n        set: function (mode) {\n          return setMode(editor, availableModes.get(), activeMode, mode);\n        },\n        get: function () {\n          return activeMode.get();\n        },\n        register: function (mode, api) {\n          availableModes.set(registerMode(availableModes.get(), mode, api));\n        }\n      };\n    };\n\n    var each$g = Tools.each, explode$3 = Tools.explode;\n    var keyCodeLookup = {\n      f1: 112,\n      f2: 113,\n      f3: 114,\n      f4: 115,\n      f5: 116,\n      f6: 117,\n      f7: 118,\n      f8: 119,\n      f9: 120,\n      f10: 121,\n      f11: 122,\n      f12: 123\n    };\n    var modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');\n    var Shortcuts = function () {\n      function Shortcuts(editor) {\n        this.shortcuts = {};\n        this.pendingPatterns = [];\n        this.editor = editor;\n        var self = this;\n        editor.on('keyup keypress keydown', function (e) {\n          if ((self.hasModifier(e) || self.isFunctionKey(e)) && !e.isDefaultPrevented()) {\n            each$g(self.shortcuts, function (shortcut) {\n              if (self.matchShortcut(e, shortcut)) {\n                self.pendingPatterns = shortcut.subpatterns.slice(0);\n                if (e.type === 'keydown') {\n                  self.executeShortcutAction(shortcut);\n                }\n                return true;\n              }\n            });\n            if (self.matchShortcut(e, self.pendingPatterns[0])) {\n              if (self.pendingPatterns.length === 1) {\n                if (e.type === 'keydown') {\n                  self.executeShortcutAction(self.pendingPatterns[0]);\n                }\n              }\n              self.pendingPatterns.shift();\n            }\n          }\n        });\n      }\n      Shortcuts.prototype.add = function (pattern, desc, cmdFunc, scope) {\n        var self = this;\n        var cmd;\n        cmd = cmdFunc;\n        if (typeof cmdFunc === 'string') {\n          cmdFunc = function () {\n            self.editor.execCommand(cmd, false, null);\n          };\n        } else if (Tools.isArray(cmd)) {\n          cmdFunc = function () {\n            self.editor.execCommand(cmd[0], cmd[1], cmd[2]);\n          };\n        }\n        each$g(explode$3(Tools.trim(pattern)), function (pattern) {\n          var shortcut = self.createShortcut(pattern, desc, cmdFunc, scope);\n          self.shortcuts[shortcut.id] = shortcut;\n        });\n        return true;\n      };\n      Shortcuts.prototype.remove = function (pattern) {\n        var shortcut = this.createShortcut(pattern);\n        if (this.shortcuts[shortcut.id]) {\n          delete this.shortcuts[shortcut.id];\n          return true;\n        }\n        return false;\n      };\n      Shortcuts.prototype.parseShortcut = function (pattern) {\n        var id, key;\n        var shortcut = {};\n        each$g(explode$3(pattern.toLowerCase(), '+'), function (value) {\n          if (value in modifierNames) {\n            shortcut[value] = true;\n          } else {\n            if (/^[0-9]{2,}$/.test(value)) {\n              shortcut.keyCode = parseInt(value, 10);\n            } else {\n              shortcut.charCode = value.charCodeAt(0);\n              shortcut.keyCode = keyCodeLookup[value] || value.toUpperCase().charCodeAt(0);\n            }\n          }\n        });\n        id = [shortcut.keyCode];\n        for (key in modifierNames) {\n          if (shortcut[key]) {\n            id.push(key);\n          } else {\n            shortcut[key] = false;\n          }\n        }\n        shortcut.id = id.join(',');\n        if (shortcut.access) {\n          shortcut.alt = true;\n          if (Env.mac) {\n            shortcut.ctrl = true;\n          } else {\n            shortcut.shift = true;\n          }\n        }\n        if (shortcut.meta) {\n          if (Env.mac) {\n            shortcut.meta = true;\n          } else {\n            shortcut.ctrl = true;\n            shortcut.meta = false;\n          }\n        }\n        return shortcut;\n      };\n      Shortcuts.prototype.createShortcut = function (pattern, desc, cmdFunc, scope) {\n        var shortcuts;\n        shortcuts = Tools.map(explode$3(pattern, '>'), this.parseShortcut);\n        shortcuts[shortcuts.length - 1] = Tools.extend(shortcuts[shortcuts.length - 1], {\n          func: cmdFunc,\n          scope: scope || this.editor\n        });\n        return Tools.extend(shortcuts[0], {\n          desc: this.editor.translate(desc),\n          subpatterns: shortcuts.slice(1)\n        });\n      };\n      Shortcuts.prototype.hasModifier = function (e) {\n        return e.altKey || e.ctrlKey || e.metaKey;\n      };\n      Shortcuts.prototype.isFunctionKey = function (e) {\n        return e.type === 'keydown' && e.keyCode >= 112 && e.keyCode <= 123;\n      };\n      Shortcuts.prototype.matchShortcut = function (e, shortcut) {\n        if (!shortcut) {\n          return false;\n        }\n        if (shortcut.ctrl !== e.ctrlKey || shortcut.meta !== e.metaKey) {\n          return false;\n        }\n        if (shortcut.alt !== e.altKey || shortcut.shift !== e.shiftKey) {\n          return false;\n        }\n        if (e.keyCode === shortcut.keyCode || e.charCode && e.charCode === shortcut.charCode) {\n          e.preventDefault();\n          return true;\n        }\n        return false;\n      };\n      Shortcuts.prototype.executeShortcutAction = function (shortcut) {\n        return shortcut.func ? shortcut.func.call(shortcut.scope) : null;\n      };\n      return Shortcuts;\n    }();\n\n    var create$5 = function () {\n      var buttons = {};\n      var menuItems = {};\n      var popups = {};\n      var icons = {};\n      var contextMenus = {};\n      var contextToolbars = {};\n      var sidebars = {};\n      var add = function (collection, type) {\n        return function (name, spec) {\n          return collection[name.toLowerCase()] = __assign(__assign({}, spec), { type: type });\n        };\n      };\n      var addIcon = function (name, svgData) {\n        return icons[name.toLowerCase()] = svgData;\n      };\n      return {\n        addButton: add(buttons, 'button'),\n        addGroupToolbarButton: add(buttons, 'grouptoolbarbutton'),\n        addToggleButton: add(buttons, 'togglebutton'),\n        addMenuButton: add(buttons, 'menubutton'),\n        addSplitButton: add(buttons, 'splitbutton'),\n        addMenuItem: add(menuItems, 'menuitem'),\n        addNestedMenuItem: add(menuItems, 'nestedmenuitem'),\n        addToggleMenuItem: add(menuItems, 'togglemenuitem'),\n        addAutocompleter: add(popups, 'autocompleter'),\n        addContextMenu: add(contextMenus, 'contextmenu'),\n        addContextToolbar: add(contextToolbars, 'contexttoolbar'),\n        addContextForm: add(contextToolbars, 'contextform'),\n        addSidebar: add(sidebars, 'sidebar'),\n        addIcon: addIcon,\n        getAll: function () {\n          return {\n            buttons: buttons,\n            menuItems: menuItems,\n            icons: icons,\n            popups: popups,\n            contextMenus: contextMenus,\n            contextToolbars: contextToolbars,\n            sidebars: sidebars\n          };\n        }\n      };\n    };\n\n    var registry = function () {\n      var bridge = create$5();\n      return {\n        addAutocompleter: bridge.addAutocompleter,\n        addButton: bridge.addButton,\n        addContextForm: bridge.addContextForm,\n        addContextMenu: bridge.addContextMenu,\n        addContextToolbar: bridge.addContextToolbar,\n        addIcon: bridge.addIcon,\n        addMenuButton: bridge.addMenuButton,\n        addMenuItem: bridge.addMenuItem,\n        addNestedMenuItem: bridge.addNestedMenuItem,\n        addSidebar: bridge.addSidebar,\n        addSplitButton: bridge.addSplitButton,\n        addToggleButton: bridge.addToggleButton,\n        addGroupToolbarButton: bridge.addGroupToolbarButton,\n        addToggleMenuItem: bridge.addToggleMenuItem,\n        getAll: bridge.getAll\n      };\n    };\n\n    var each$h = Tools.each, trim$4 = Tools.trim;\n    var queryParts = 'source protocol authority userInfo user password host port relative path directory file query anchor'.split(' ');\n    var DEFAULT_PORTS = {\n      ftp: 21,\n      http: 80,\n      https: 443,\n      mailto: 25\n    };\n    var URI = function () {\n      function URI(url, settings) {\n        url = trim$4(url);\n        this.settings = settings || {};\n        var baseUri = this.settings.base_uri;\n        var self = this;\n        if (/^([\\w\\-]+):([^\\/]{2})/i.test(url) || /^\\s*#/.test(url)) {\n          self.source = url;\n          return;\n        }\n        var isProtocolRelative = url.indexOf('//') === 0;\n        if (url.indexOf('/') === 0 && !isProtocolRelative) {\n          url = (baseUri ? baseUri.protocol || 'http' : 'http') + '://mce_host' + url;\n        }\n        if (!/^[\\w\\-]*:?\\/\\//.test(url)) {\n          var baseUrl = this.settings.base_uri ? this.settings.base_uri.path : new URI(domGlobals.document.location.href).directory;\n          if (this.settings.base_uri && this.settings.base_uri.protocol == '') {\n            url = '//mce_host' + self.toAbsPath(baseUrl, url);\n          } else {\n            var match = /([^#?]*)([#?]?.*)/.exec(url);\n            url = (baseUri && baseUri.protocol || 'http') + '://mce_host' + self.toAbsPath(baseUrl, match[1]) + match[2];\n          }\n        }\n        url = url.replace(/@@/g, '(mce_at)');\n        var urlMatch = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@\\/]*):?([^:@\\/]*))?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/.exec(url);\n        each$h(queryParts, function (v, i) {\n          var part = urlMatch[i];\n          if (part) {\n            part = part.replace(/\\(mce_at\\)/g, '@@');\n          }\n          self[v] = part;\n        });\n        if (baseUri) {\n          if (!self.protocol) {\n            self.protocol = baseUri.protocol;\n          }\n          if (!self.userInfo) {\n            self.userInfo = baseUri.userInfo;\n          }\n          if (!self.port && self.host === 'mce_host') {\n            self.port = baseUri.port;\n          }\n          if (!self.host || self.host === 'mce_host') {\n            self.host = baseUri.host;\n          }\n          self.source = '';\n        }\n        if (isProtocolRelative) {\n          self.protocol = '';\n        }\n      }\n      URI.parseDataUri = function (uri) {\n        var type;\n        var uriComponents = decodeURIComponent(uri).split(',');\n        var matches = /data:([^;]+)/.exec(uriComponents[0]);\n        if (matches) {\n          type = matches[1];\n        }\n        return {\n          type: type,\n          data: uriComponents[1]\n        };\n      };\n      URI.getDocumentBaseUrl = function (loc) {\n        var baseUrl;\n        if (loc.protocol.indexOf('http') !== 0 && loc.protocol !== 'file:') {\n          baseUrl = loc.href;\n        } else {\n          baseUrl = loc.protocol + '//' + loc.host + loc.pathname;\n        }\n        if (/^[^:]+:\\/\\/\\/?[^\\/]+\\//.test(baseUrl)) {\n          baseUrl = baseUrl.replace(/[\\?#].*$/, '').replace(/[\\/\\\\][^\\/]+$/, '');\n          if (!/[\\/\\\\]$/.test(baseUrl)) {\n            baseUrl += '/';\n          }\n        }\n        return baseUrl;\n      };\n      URI.prototype.setPath = function (path) {\n        var pathMatch = /^(.*?)\\/?(\\w+)?$/.exec(path);\n        this.path = pathMatch[0];\n        this.directory = pathMatch[1];\n        this.file = pathMatch[2];\n        this.source = '';\n        this.getURI();\n      };\n      URI.prototype.toRelative = function (uri) {\n        var output;\n        if (uri === './') {\n          return uri;\n        }\n        var relativeUri = new URI(uri, { base_uri: this });\n        if (relativeUri.host !== 'mce_host' && this.host !== relativeUri.host && relativeUri.host || this.port !== relativeUri.port || this.protocol !== relativeUri.protocol && relativeUri.protocol !== '') {\n          return relativeUri.getURI();\n        }\n        var tu = this.getURI(), uu = relativeUri.getURI();\n        if (tu === uu || tu.charAt(tu.length - 1) === '/' && tu.substr(0, tu.length - 1) === uu) {\n          return tu;\n        }\n        output = this.toRelPath(this.path, relativeUri.path);\n        if (relativeUri.query) {\n          output += '?' + relativeUri.query;\n        }\n        if (relativeUri.anchor) {\n          output += '#' + relativeUri.anchor;\n        }\n        return output;\n      };\n      URI.prototype.toAbsolute = function (uri, noHost) {\n        var absoluteUri = new URI(uri, { base_uri: this });\n        return absoluteUri.getURI(noHost && this.isSameOrigin(absoluteUri));\n      };\n      URI.prototype.isSameOrigin = function (uri) {\n        if (this.host == uri.host && this.protocol == uri.protocol) {\n          if (this.port == uri.port) {\n            return true;\n          }\n          var defaultPort = DEFAULT_PORTS[this.protocol];\n          if (defaultPort && (this.port || defaultPort) == (uri.port || defaultPort)) {\n            return true;\n          }\n        }\n        return false;\n      };\n      URI.prototype.toRelPath = function (base, path) {\n        var items, breakPoint = 0, out = '', i, l;\n        var normalizedBase = base.substring(0, base.lastIndexOf('/')).split('/');\n        items = path.split('/');\n        if (normalizedBase.length >= items.length) {\n          for (i = 0, l = normalizedBase.length; i < l; i++) {\n            if (i >= items.length || normalizedBase[i] !== items[i]) {\n              breakPoint = i + 1;\n              break;\n            }\n          }\n        }\n        if (normalizedBase.length < items.length) {\n          for (i = 0, l = items.length; i < l; i++) {\n            if (i >= normalizedBase.length || normalizedBase[i] !== items[i]) {\n              breakPoint = i + 1;\n              break;\n            }\n          }\n        }\n        if (breakPoint === 1) {\n          return path;\n        }\n        for (i = 0, l = normalizedBase.length - (breakPoint - 1); i < l; i++) {\n          out += '../';\n        }\n        for (i = breakPoint - 1, l = items.length; i < l; i++) {\n          if (i !== breakPoint - 1) {\n            out += '/' + items[i];\n          } else {\n            out += items[i];\n          }\n        }\n        return out;\n      };\n      URI.prototype.toAbsPath = function (base, path) {\n        var i, nb = 0, o = [], tr, outPath;\n        tr = /\\/$/.test(path) ? '/' : '';\n        var normalizedBase = base.split('/');\n        var normalizedPath = path.split('/');\n        each$h(normalizedBase, function (k) {\n          if (k) {\n            o.push(k);\n          }\n        });\n        normalizedBase = o;\n        for (i = normalizedPath.length - 1, o = []; i >= 0; i--) {\n          if (normalizedPath[i].length === 0 || normalizedPath[i] === '.') {\n            continue;\n          }\n          if (normalizedPath[i] === '..') {\n            nb++;\n            continue;\n          }\n          if (nb > 0) {\n            nb--;\n            continue;\n          }\n          o.push(normalizedPath[i]);\n        }\n        i = normalizedBase.length - nb;\n        if (i <= 0) {\n          outPath = reverse(o).join('/');\n        } else {\n          outPath = normalizedBase.slice(0, i).join('/') + '/' + reverse(o).join('/');\n        }\n        if (outPath.indexOf('/') !== 0) {\n          outPath = '/' + outPath;\n        }\n        if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) {\n          outPath += tr;\n        }\n        return outPath;\n      };\n      URI.prototype.getURI = function (noProtoHost) {\n        if (noProtoHost === void 0) {\n          noProtoHost = false;\n        }\n        var s;\n        if (!this.source || noProtoHost) {\n          s = '';\n          if (!noProtoHost) {\n            if (this.protocol) {\n              s += this.protocol + '://';\n            } else {\n              s += '//';\n            }\n            if (this.userInfo) {\n              s += this.userInfo + '@';\n            }\n            if (this.host) {\n              s += this.host;\n            }\n            if (this.port) {\n              s += ':' + this.port;\n            }\n          }\n          if (this.path) {\n            s += this.path;\n          }\n          if (this.query) {\n            s += '?' + this.query;\n          }\n          if (this.anchor) {\n            s += '#' + this.anchor;\n          }\n          this.source = s;\n        }\n        return this.source;\n      };\n      return URI;\n    }();\n\n    var DOM$9 = DOMUtils$1.DOM;\n    var extend$3 = Tools.extend, each$i = Tools.each;\n    var resolve$3 = Tools.resolve;\n    var ie$1 = Env.ie;\n    var Editor = function () {\n      function Editor(id, settings, editorManager) {\n        var _this = this;\n        this.plugins = {};\n        this.contentCSS = [];\n        this.contentStyles = [];\n        this.loadedCSS = {};\n        this.isNotDirty = false;\n        this.editorManager = editorManager;\n        this.documentBaseUrl = editorManager.documentBaseURL;\n        extend$3(this, EditorObservable);\n        this.settings = getEditorSettings(this, id, this.documentBaseUrl, editorManager.defaultSettings, settings);\n        if (this.settings.suffix) {\n          editorManager.suffix = this.settings.suffix;\n        }\n        this.suffix = editorManager.suffix;\n        if (this.settings.base_url) {\n          editorManager._setBaseUrl(this.settings.base_url);\n        }\n        this.baseUri = editorManager.baseURI;\n        if (this.settings.referrer_policy) {\n          ScriptLoader.ScriptLoader._setReferrerPolicy(this.settings.referrer_policy);\n          DOMUtils$1.DOM.styleSheetLoader._setReferrerPolicy(this.settings.referrer_policy);\n        }\n        AddOnManager$1.languageLoad = this.settings.language_load;\n        AddOnManager$1.baseURL = editorManager.baseURL;\n        this.id = id;\n        this.setDirty(false);\n        this.documentBaseURI = new URI(this.settings.document_base_url, { base_uri: this.baseUri });\n        this.baseURI = this.baseUri;\n        this.inline = !!this.settings.inline;\n        this.shortcuts = new Shortcuts(this);\n        this.editorCommands = new EditorCommands(this);\n        if (this.settings.cache_suffix) {\n          Env.cacheSuffix = this.settings.cache_suffix.replace(/^[\\?\\&]+/, '');\n        }\n        this.ui = { registry: registry() };\n        var self = this;\n        var modeInstance = create$4(self);\n        this.mode = modeInstance;\n        this.setMode = modeInstance.set;\n        editorManager.fire('SetupEditor', { editor: this });\n        this.execCallback('setup', this);\n        this.$ = DomQuery.overrideDefaults(function () {\n          return {\n            context: _this.inline ? _this.getBody() : _this.getDoc(),\n            element: _this.getBody()\n          };\n        });\n      }\n      Editor.prototype.render = function () {\n        Render.render(this);\n      };\n      Editor.prototype.focus = function (skipFocus) {\n        EditorFocus.focus(this, skipFocus);\n      };\n      Editor.prototype.hasFocus = function () {\n        return EditorFocus.hasFocus(this);\n      };\n      Editor.prototype.execCallback = function (name) {\n        var x = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n          x[_i - 1] = arguments[_i];\n        }\n        var self = this;\n        var callback = self.settings[name], scope;\n        if (!callback) {\n          return;\n        }\n        if (self.callbackLookup && (scope = self.callbackLookup[name])) {\n          callback = scope.func;\n          scope = scope.scope;\n        }\n        if (typeof callback === 'string') {\n          scope = callback.replace(/\\.\\w+$/, '');\n          scope = scope ? resolve$3(scope) : 0;\n          callback = resolve$3(callback);\n          self.callbackLookup = self.callbackLookup || {};\n          self.callbackLookup[name] = {\n            func: callback,\n            scope: scope\n          };\n        }\n        return callback.apply(scope || self, Array.prototype.slice.call(arguments, 1));\n      };\n      Editor.prototype.translate = function (text) {\n        return I18n.translate(text);\n      };\n      Editor.prototype.getParam = function (name, defaultVal, type) {\n        return getParam(this, name, defaultVal, type);\n      };\n      Editor.prototype.nodeChanged = function (args) {\n        this._nodeChangeDispatcher.nodeChanged(args);\n      };\n      Editor.prototype.addCommand = function (name, callback, scope) {\n        this.editorCommands.addCommand(name, callback, scope);\n      };\n      Editor.prototype.addQueryStateHandler = function (name, callback, scope) {\n        this.editorCommands.addQueryStateHandler(name, callback, scope);\n      };\n      Editor.prototype.addQueryValueHandler = function (name, callback, scope) {\n        this.editorCommands.addQueryValueHandler(name, callback, scope);\n      };\n      Editor.prototype.addShortcut = function (pattern, desc, cmdFunc, scope) {\n        this.shortcuts.add(pattern, desc, cmdFunc, scope);\n      };\n      Editor.prototype.execCommand = function (cmd, ui, value, args) {\n        return this.editorCommands.execCommand(cmd, ui, value, args);\n      };\n      Editor.prototype.queryCommandState = function (cmd) {\n        return this.editorCommands.queryCommandState(cmd);\n      };\n      Editor.prototype.queryCommandValue = function (cmd) {\n        return this.editorCommands.queryCommandValue(cmd);\n      };\n      Editor.prototype.queryCommandSupported = function (cmd) {\n        return this.editorCommands.queryCommandSupported(cmd);\n      };\n      Editor.prototype.show = function () {\n        var self = this;\n        if (self.hidden) {\n          self.hidden = false;\n          if (self.inline) {\n            self.getBody().contentEditable = 'true';\n          } else {\n            DOM$9.show(self.getContainer());\n            DOM$9.hide(self.id);\n          }\n          self.load();\n          self.fire('show');\n        }\n      };\n      Editor.prototype.hide = function () {\n        var self = this, doc = self.getDoc();\n        if (!self.hidden) {\n          if (ie$1 && doc && !self.inline) {\n            doc.execCommand('SelectAll');\n          }\n          self.save();\n          if (self.inline) {\n            self.getBody().contentEditable = 'false';\n            if (self === self.editorManager.focusedEditor) {\n              self.editorManager.focusedEditor = null;\n            }\n          } else {\n            DOM$9.hide(self.getContainer());\n            DOM$9.setStyle(self.id, 'display', self.orgDisplay);\n          }\n          self.hidden = true;\n          self.fire('hide');\n        }\n      };\n      Editor.prototype.isHidden = function () {\n        return !!this.hidden;\n      };\n      Editor.prototype.setProgressState = function (state, time) {\n        this.fire('ProgressState', {\n          state: state,\n          time: time\n        });\n      };\n      Editor.prototype.load = function (args) {\n        var self = this;\n        var elm = self.getElement(), html;\n        if (self.removed) {\n          return '';\n        }\n        if (elm) {\n          args = args || {};\n          args.load = true;\n          var value = NodeType.isTextareaOrInput(elm) ? elm.value : elm.innerHTML;\n          html = self.setContent(value, args);\n          args.element = elm;\n          if (!args.no_events) {\n            self.fire('LoadContent', args);\n          }\n          args.element = elm = null;\n          return html;\n        }\n      };\n      Editor.prototype.save = function (args) {\n        var self = this;\n        var elm = self.getElement(), html, form;\n        if (!elm || !self.initialized || self.removed) {\n          return;\n        }\n        args = args || {};\n        args.save = true;\n        args.element = elm;\n        html = args.content = self.getContent(args);\n        if (!args.no_events) {\n          self.fire('SaveContent', args);\n        }\n        if (args.format === 'raw') {\n          self.fire('RawSaveContent', args);\n        }\n        html = args.content;\n        if (!NodeType.isTextareaOrInput(elm)) {\n          if (args.is_removing || !self.inline) {\n            elm.innerHTML = html;\n          }\n          if (form = DOM$9.getParent(self.id, 'form')) {\n            each$i(form.elements, function (elm) {\n              if (elm.name === self.id) {\n                elm.value = html;\n                return false;\n              }\n            });\n          }\n        } else {\n          elm.value = html;\n        }\n        args.element = elm = null;\n        if (args.set_dirty !== false) {\n          self.setDirty(false);\n        }\n        return html;\n      };\n      Editor.prototype.setContent = function (content, args) {\n        return setContent(this, content, args);\n      };\n      Editor.prototype.getContent = function (args) {\n        return getContent(this, args);\n      };\n      Editor.prototype.insertContent = function (content, args) {\n        if (args) {\n          content = extend$3({ content: content }, args);\n        }\n        this.execCommand('mceInsertContent', false, content);\n      };\n      Editor.prototype.resetContent = function (initialContent) {\n        if (initialContent === undefined) {\n          setContent(this, this.startContent, { format: 'raw' });\n        } else {\n          setContent(this, initialContent);\n        }\n        this.undoManager.reset();\n        this.setDirty(false);\n        this.nodeChanged();\n      };\n      Editor.prototype.isDirty = function () {\n        return !this.isNotDirty;\n      };\n      Editor.prototype.setDirty = function (state) {\n        var oldState = !this.isNotDirty;\n        this.isNotDirty = !state;\n        if (state && state !== oldState) {\n          this.fire('dirty');\n        }\n      };\n      Editor.prototype.getContainer = function () {\n        var self = this;\n        if (!self.container) {\n          self.container = DOM$9.get(self.editorContainer || self.id + '_parent');\n        }\n        return self.container;\n      };\n      Editor.prototype.getContentAreaContainer = function () {\n        return this.contentAreaContainer;\n      };\n      Editor.prototype.getElement = function () {\n        if (!this.targetElm) {\n          this.targetElm = DOM$9.get(this.id);\n        }\n        return this.targetElm;\n      };\n      Editor.prototype.getWin = function () {\n        var self = this;\n        var elm;\n        if (!self.contentWindow) {\n          elm = self.iframeElement;\n          if (elm) {\n            self.contentWindow = elm.contentWindow;\n          }\n        }\n        return self.contentWindow;\n      };\n      Editor.prototype.getDoc = function () {\n        var self = this;\n        var win;\n        if (!self.contentDocument) {\n          win = self.getWin();\n          if (win) {\n            self.contentDocument = win.document;\n          }\n        }\n        return self.contentDocument;\n      };\n      Editor.prototype.getBody = function () {\n        var doc = this.getDoc();\n        return this.bodyElement || (doc ? doc.body : null);\n      };\n      Editor.prototype.convertURL = function (url, name, elm) {\n        var self = this, settings = self.settings;\n        if (settings.urlconverter_callback) {\n          return self.execCallback('urlconverter_callback', url, elm, true, name);\n        }\n        if (!settings.convert_urls || elm && elm.nodeName === 'LINK' || url.indexOf('file:') === 0 || url.length === 0) {\n          return url;\n        }\n        if (settings.relative_urls) {\n          return self.documentBaseURI.toRelative(url);\n        }\n        url = self.documentBaseURI.toAbsolute(url, settings.remove_script_host);\n        return url;\n      };\n      Editor.prototype.addVisual = function (elm) {\n        var self = this;\n        var settings = self.settings;\n        var dom = self.dom;\n        var cls;\n        elm = elm || self.getBody();\n        if (self.hasVisual === undefined) {\n          self.hasVisual = settings.visual;\n        }\n        each$i(dom.select('table,a', elm), function (elm) {\n          var value;\n          switch (elm.nodeName) {\n          case 'TABLE':\n            cls = settings.visual_table_class || 'mce-item-table';\n            value = dom.getAttrib(elm, 'border');\n            if ((!value || value === '0') && self.hasVisual) {\n              dom.addClass(elm, cls);\n            } else {\n              dom.removeClass(elm, cls);\n            }\n            return;\n          case 'A':\n            if (!dom.getAttrib(elm, 'href')) {\n              value = dom.getAttrib(elm, 'name') || elm.id;\n              cls = settings.visual_anchor_class || 'mce-item-anchor';\n              if (value && self.hasVisual) {\n                dom.addClass(elm, cls);\n              } else {\n                dom.removeClass(elm, cls);\n              }\n            }\n            return;\n          }\n        });\n        self.fire('VisualAid', {\n          element: elm,\n          hasVisual: self.hasVisual\n        });\n      };\n      Editor.prototype.remove = function () {\n        remove$6(this);\n      };\n      Editor.prototype.destroy = function (automatic) {\n        destroy(this, automatic);\n      };\n      Editor.prototype.uploadImages = function (callback) {\n        return this.editorUpload.uploadImages(callback);\n      };\n      Editor.prototype._scanForImages = function () {\n        return this.editorUpload.scanForImages();\n      };\n      Editor.prototype.addButton = function () {\n        throw new Error('editor.addButton has been removed in tinymce 5x, use editor.ui.registry.addButton or editor.ui.registry.addToggleButton or editor.ui.registry.addSplitButton instead');\n      };\n      Editor.prototype.addSidebar = function () {\n        throw new Error('editor.addSidebar has been removed in tinymce 5x, use editor.ui.registry.addSidebar instead');\n      };\n      Editor.prototype.addMenuItem = function () {\n        throw new Error('editor.addMenuItem has been removed in tinymce 5x, use editor.ui.registry.addMenuItem instead');\n      };\n      Editor.prototype.addContextToolbar = function () {\n        throw new Error('editor.addContextToolbar has been removed in tinymce 5x, use editor.ui.registry.addContextToolbar instead');\n      };\n      return Editor;\n    }();\n\n    var DOM$a = DOMUtils$1.DOM;\n    var explode$4 = Tools.explode, each$j = Tools.each, extend$4 = Tools.extend;\n    var instanceCounter = 0, boundGlobalEvents = false;\n    var beforeUnloadDelegate;\n    var legacyEditors = [];\n    var editors = [];\n    var isValidLegacyKey = function (id) {\n      return id !== 'length';\n    };\n    var globalEventDelegate = function (e) {\n      var type = e.type;\n      each$j(EditorManager.get(), function (editor) {\n        switch (type) {\n        case 'scroll':\n          editor.fire('ScrollWindow', e);\n          break;\n        case 'resize':\n          editor.fire('ResizeWindow', e);\n          break;\n        }\n      });\n    };\n    var toggleGlobalEvents = function (state) {\n      if (state !== boundGlobalEvents) {\n        if (state) {\n          DomQuery(window).on('resize scroll', globalEventDelegate);\n        } else {\n          DomQuery(window).off('resize scroll', globalEventDelegate);\n        }\n        boundGlobalEvents = state;\n      }\n    };\n    var removeEditorFromList = function (targetEditor) {\n      var oldEditors = editors;\n      delete legacyEditors[targetEditor.id];\n      for (var i = 0; i < legacyEditors.length; i++) {\n        if (legacyEditors[i] === targetEditor) {\n          legacyEditors.splice(i, 1);\n          break;\n        }\n      }\n      editors = filter(editors, function (editor) {\n        return targetEditor !== editor;\n      });\n      if (EditorManager.activeEditor === targetEditor) {\n        EditorManager.activeEditor = editors.length > 0 ? editors[0] : null;\n      }\n      if (EditorManager.focusedEditor === targetEditor) {\n        EditorManager.focusedEditor = null;\n      }\n      return oldEditors.length !== editors.length;\n    };\n    var purgeDestroyedEditor = function (editor) {\n      if (editor && editor.initialized && !(editor.getContainer() || editor.getBody()).parentNode) {\n        removeEditorFromList(editor);\n        editor.unbindAllNativeEvents();\n        editor.destroy(true);\n        editor.removed = true;\n        editor = null;\n      }\n      return editor;\n    };\n    var isQuirksMode = domGlobals.document.compatMode !== 'CSS1Compat';\n    var EditorManager = __assign(__assign({}, Observable), {\n      baseURI: null,\n      baseURL: null,\n      defaultSettings: {},\n      documentBaseURL: null,\n      suffix: null,\n      $: DomQuery,\n      majorVersion: '5',\n      minorVersion: '2.2',\n      releaseDate: '2020-04-23',\n      editors: legacyEditors,\n      i18n: I18n,\n      activeEditor: null,\n      focusedEditor: null,\n      settings: {},\n      setup: function () {\n        var self = this;\n        var baseURL, documentBaseURL, suffix = '';\n        documentBaseURL = URI.getDocumentBaseUrl(domGlobals.document.location);\n        if (/^[^:]+:\\/\\/\\/?[^\\/]+\\//.test(documentBaseURL)) {\n          documentBaseURL = documentBaseURL.replace(/[\\?#].*$/, '').replace(/[\\/\\\\][^\\/]+$/, '');\n          if (!/[\\/\\\\]$/.test(documentBaseURL)) {\n            documentBaseURL += '/';\n          }\n        }\n        var preInit = window.tinymce || window.tinyMCEPreInit;\n        if (preInit) {\n          baseURL = preInit.base || preInit.baseURL;\n          suffix = preInit.suffix;\n        } else {\n          var scripts = domGlobals.document.getElementsByTagName('script');\n          for (var i = 0; i < scripts.length; i++) {\n            var src = scripts[i].src || '';\n            if (src === '') {\n              continue;\n            }\n            var srcScript = src.substring(src.lastIndexOf('/'));\n            if (/tinymce(\\.full|\\.jquery|)(\\.min|\\.dev|)\\.js/.test(src)) {\n              if (srcScript.indexOf('.min') !== -1) {\n                suffix = '.min';\n              }\n              baseURL = src.substring(0, src.lastIndexOf('/'));\n              break;\n            }\n          }\n          if (!baseURL && domGlobals.document.currentScript) {\n            var src = domGlobals.document.currentScript.src;\n            if (src.indexOf('.min') !== -1) {\n              suffix = '.min';\n            }\n            baseURL = src.substring(0, src.lastIndexOf('/'));\n          }\n        }\n        self.baseURL = new URI(documentBaseURL).toAbsolute(baseURL);\n        self.documentBaseURL = documentBaseURL;\n        self.baseURI = new URI(self.baseURL);\n        self.suffix = suffix;\n        FocusController.setup(self);\n      },\n      overrideDefaults: function (defaultSettings) {\n        var baseUrl, suffix;\n        baseUrl = defaultSettings.base_url;\n        if (baseUrl) {\n          this._setBaseUrl(baseUrl);\n        }\n        suffix = defaultSettings.suffix;\n        if (defaultSettings.suffix) {\n          this.suffix = suffix;\n        }\n        this.defaultSettings = defaultSettings;\n        var pluginBaseUrls = defaultSettings.plugin_base_urls;\n        for (var name_1 in pluginBaseUrls) {\n          AddOnManager$1.PluginManager.urls[name_1] = pluginBaseUrls[name_1];\n        }\n      },\n      init: function (settings) {\n        var self = this;\n        var result, invalidInlineTargets;\n        invalidInlineTargets = Tools.makeMap('area base basefont br col frame hr img input isindex link meta param embed source wbr track ' + 'colgroup option table tbody tfoot thead tr th td script noscript style textarea video audio iframe object menu', ' ');\n        var isInvalidInlineTarget = function (settings, elm) {\n          return settings.inline && elm.tagName.toLowerCase() in invalidInlineTargets;\n        };\n        var createId = function (elm) {\n          var id = elm.id;\n          if (!id) {\n            id = elm.name;\n            if (id && !DOM$a.get(id)) {\n              id = elm.name;\n            } else {\n              id = DOM$a.uniqueId();\n            }\n            elm.setAttribute('id', id);\n          }\n          return id;\n        };\n        var execCallback = function (name) {\n          var callback = settings[name];\n          if (!callback) {\n            return;\n          }\n          return callback.apply(self, Array.prototype.slice.call(arguments, 2));\n        };\n        var hasClass = function (elm, className) {\n          return className.constructor === RegExp ? className.test(elm.className) : DOM$a.hasClass(elm, className);\n        };\n        var findTargets = function (settings) {\n          var l, targets = [];\n          if (Env.browser.isIE() && Env.browser.version.major < 11) {\n            ErrorReporter.initError('TinyMCE does not support the browser you are using. For a list of supported' + ' browsers please see: https://www.tinymce.com/docs/get-started/system-requirements/');\n            return [];\n          } else if (isQuirksMode) {\n            ErrorReporter.initError('Failed to initialize the editor as the document is not in standards mode. ' + 'TinyMCE requires standards mode.');\n            return [];\n          }\n          if (settings.types) {\n            each$j(settings.types, function (type) {\n              targets = targets.concat(DOM$a.select(type.selector));\n            });\n            return targets;\n          } else if (settings.selector) {\n            return DOM$a.select(settings.selector);\n          } else if (settings.target) {\n            return [settings.target];\n          }\n          switch (settings.mode) {\n          case 'exact':\n            l = settings.elements || '';\n            if (l.length > 0) {\n              each$j(explode$4(l), function (id) {\n                var elm;\n                if (elm = DOM$a.get(id)) {\n                  targets.push(elm);\n                } else {\n                  each$j(domGlobals.document.forms, function (f) {\n                    each$j(f.elements, function (e) {\n                      if (e.name === id) {\n                        id = 'mce_editor_' + instanceCounter++;\n                        DOM$a.setAttrib(e, 'id', id);\n                        targets.push(e);\n                      }\n                    });\n                  });\n                }\n              });\n            }\n            break;\n          case 'textareas':\n          case 'specific_textareas':\n            each$j(DOM$a.select('textarea'), function (elm) {\n              if (settings.editor_deselector && hasClass(elm, settings.editor_deselector)) {\n                return;\n              }\n              if (!settings.editor_selector || hasClass(elm, settings.editor_selector)) {\n                targets.push(elm);\n              }\n            });\n            break;\n          }\n          return targets;\n        };\n        var provideResults = function (editors) {\n          result = editors;\n        };\n        var initEditors = function () {\n          var initCount = 0;\n          var editors = [];\n          var targets;\n          var createEditor = function (id, settings, targetElm) {\n            var editor = new Editor(id, settings, self);\n            editors.push(editor);\n            editor.on('init', function () {\n              if (++initCount === targets.length) {\n                provideResults(editors);\n              }\n            });\n            editor.targetElm = editor.targetElm || targetElm;\n            editor.render();\n          };\n          DOM$a.unbind(window, 'ready', initEditors);\n          execCallback('onpageload');\n          targets = DomQuery.unique(findTargets(settings));\n          if (settings.types) {\n            each$j(settings.types, function (type) {\n              Tools.each(targets, function (elm) {\n                if (DOM$a.is(elm, type.selector)) {\n                  createEditor(createId(elm), extend$4({}, settings, type), elm);\n                  return false;\n                }\n                return true;\n              });\n            });\n            return;\n          }\n          Tools.each(targets, function (elm) {\n            purgeDestroyedEditor(self.get(elm.id));\n          });\n          targets = Tools.grep(targets, function (elm) {\n            return !self.get(elm.id);\n          });\n          if (targets.length === 0) {\n            provideResults([]);\n          } else {\n            each$j(targets, function (elm) {\n              if (isInvalidInlineTarget(settings, elm)) {\n                ErrorReporter.initError('Could not initialize inline editor on invalid inline target element', elm);\n              } else {\n                createEditor(createId(elm), settings, elm);\n              }\n            });\n          }\n        };\n        self.settings = settings;\n        DOM$a.bind(window, 'ready', initEditors);\n        return new promiseObj(function (resolve) {\n          if (result) {\n            resolve(result);\n          } else {\n            provideResults = function (editors) {\n              resolve(editors);\n            };\n          }\n        });\n      },\n      get: function (id) {\n        if (arguments.length === 0) {\n          return editors.slice(0);\n        } else if (isString(id)) {\n          return find(editors, function (editor) {\n            return editor.id === id;\n          }).getOr(null);\n        } else if (isNumber(id)) {\n          return editors[id] ? editors[id] : null;\n        } else {\n          return null;\n        }\n      },\n      add: function (editor) {\n        var self = this;\n        var existingEditor;\n        existingEditor = legacyEditors[editor.id];\n        if (existingEditor === editor) {\n          return editor;\n        }\n        if (self.get(editor.id) === null) {\n          if (isValidLegacyKey(editor.id)) {\n            legacyEditors[editor.id] = editor;\n          }\n          legacyEditors.push(editor);\n          editors.push(editor);\n        }\n        toggleGlobalEvents(true);\n        self.activeEditor = editor;\n        self.fire('AddEditor', { editor: editor });\n        if (!beforeUnloadDelegate) {\n          beforeUnloadDelegate = function (e) {\n            var event = self.fire('BeforeUnload');\n            if (event.returnValue) {\n              e.preventDefault();\n              e.returnValue = event.returnValue;\n              return event.returnValue;\n            }\n          };\n          window.addEventListener('beforeunload', beforeUnloadDelegate);\n        }\n        return editor;\n      },\n      createEditor: function (id, settings) {\n        return this.add(new Editor(id, settings, this));\n      },\n      remove: function (selector) {\n        var self = this;\n        var i, editor;\n        if (!selector) {\n          for (i = editors.length - 1; i >= 0; i--) {\n            self.remove(editors[i]);\n          }\n          return;\n        }\n        if (isString(selector)) {\n          each$j(DOM$a.select(selector), function (elm) {\n            editor = self.get(elm.id);\n            if (editor) {\n              self.remove(editor);\n            }\n          });\n          return;\n        }\n        editor = selector;\n        if (isNull(self.get(editor.id))) {\n          return null;\n        }\n        if (removeEditorFromList(editor)) {\n          self.fire('RemoveEditor', { editor: editor });\n        }\n        if (editors.length === 0) {\n          window.removeEventListener('beforeunload', beforeUnloadDelegate);\n        }\n        editor.remove();\n        toggleGlobalEvents(editors.length > 0);\n        return editor;\n      },\n      execCommand: function (cmd, ui, value) {\n        var self = this, editor = self.get(value);\n        switch (cmd) {\n        case 'mceAddEditor':\n          if (!self.get(value)) {\n            new Editor(value, self.settings, self).render();\n          }\n          return true;\n        case 'mceRemoveEditor':\n          if (editor) {\n            editor.remove();\n          }\n          return true;\n        case 'mceToggleEditor':\n          if (!editor) {\n            self.execCommand('mceAddEditor', 0, value);\n            return true;\n          }\n          if (editor.isHidden()) {\n            editor.show();\n          } else {\n            editor.hide();\n          }\n          return true;\n        }\n        if (self.activeEditor) {\n          return self.activeEditor.execCommand(cmd, ui, value);\n        }\n        return false;\n      },\n      triggerSave: function () {\n        each$j(editors, function (editor) {\n          editor.save();\n        });\n      },\n      addI18n: function (code, items) {\n        I18n.add(code, items);\n      },\n      translate: function (text) {\n        return I18n.translate(text);\n      },\n      setActive: function (editor) {\n        var activeEditor = this.activeEditor;\n        if (this.activeEditor !== editor) {\n          if (activeEditor) {\n            activeEditor.fire('deactivate', { relatedTarget: editor });\n          }\n          editor.fire('activate', { relatedTarget: activeEditor });\n        }\n        this.activeEditor = editor;\n      },\n      _setBaseUrl: function (baseUrl) {\n        this.baseURL = new URI(this.documentBaseURL).toAbsolute(baseUrl.replace(/\\/+$/, ''));\n        this.baseURI = new URI(this.baseURL);\n      }\n    });\n    EditorManager.setup();\n\n    function RangeUtils(dom) {\n      var walk = function (rng, callback) {\n        return RangeWalk.walk(dom, rng, callback);\n      };\n      var split = split$1;\n      var normalize = function (rng) {\n        return NormalizeRange.normalize(dom, rng).fold(constant(false), function (normalizedRng) {\n          rng.setStart(normalizedRng.startContainer, normalizedRng.startOffset);\n          rng.setEnd(normalizedRng.endContainer, normalizedRng.endOffset);\n          return true;\n        });\n      };\n      return {\n        walk: walk,\n        split: split,\n        normalize: normalize\n      };\n    }\n    (function (RangeUtils) {\n      RangeUtils.compareRanges = RangeCompare.isEq;\n      RangeUtils.getCaretRangeFromPoint = CaretRangeFromPoint.fromPoint;\n      RangeUtils.getSelectedNode = getSelectedNode;\n      RangeUtils.getNode = getNode;\n    }(RangeUtils || (RangeUtils = {})));\n    var RangeUtils$1 = RangeUtils;\n\n    var awaiter = function (resolveCb, rejectCb, timeout) {\n      if (timeout === void 0) {\n        timeout = 1000;\n      }\n      var done = false;\n      var timer = null;\n      var complete = function (completer) {\n        return function () {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          if (!done) {\n            done = true;\n            if (timer !== null) {\n              domGlobals.clearTimeout(timer);\n              timer = null;\n            }\n            completer.apply(null, args);\n          }\n        };\n      };\n      var resolve = complete(resolveCb);\n      var reject = complete(rejectCb);\n      var start = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        if (!done && timer === null) {\n          timer = domGlobals.setTimeout(function () {\n            return reject.apply(null, args);\n          }, timeout);\n        }\n      };\n      return {\n        start: start,\n        resolve: resolve,\n        reject: reject\n      };\n    };\n    var create$6 = function () {\n      var tasks = {};\n      var resultFns = {};\n      var load = function (id, url) {\n        var loadErrMsg = 'Script at URL \"' + url + '\" failed to load';\n        var runErrMsg = 'Script at URL \"' + url + '\" did not call `tinymce.Resource.add(\\'' + id + '\\', data)` within 1 second';\n        if (tasks[id] !== undefined) {\n          return tasks[id];\n        } else {\n          var task = new promiseObj(function (resolve, reject) {\n            var waiter = awaiter(resolve, reject);\n            resultFns[id] = waiter.resolve;\n            ScriptLoader.ScriptLoader.loadScript(url, function () {\n              return waiter.start(runErrMsg);\n            }, function () {\n              return waiter.reject(loadErrMsg);\n            });\n          });\n          tasks[id] = task;\n          return task;\n        }\n      };\n      var add = function (id, data) {\n        if (resultFns[id] !== undefined) {\n          resultFns[id](data);\n          delete resultFns[id];\n        }\n        tasks[id] = promiseObj.resolve(data);\n      };\n      return {\n        load: load,\n        add: add\n      };\n    };\n    var Resource = create$6();\n\n    var min = Math.min, max = Math.max, round$2 = Math.round;\n    var relativePosition = function (rect, targetRect, rel) {\n      var x, y, w, h, targetW, targetH;\n      x = targetRect.x;\n      y = targetRect.y;\n      w = rect.w;\n      h = rect.h;\n      targetW = targetRect.w;\n      targetH = targetRect.h;\n      rel = (rel || '').split('');\n      if (rel[0] === 'b') {\n        y += targetH;\n      }\n      if (rel[1] === 'r') {\n        x += targetW;\n      }\n      if (rel[0] === 'c') {\n        y += round$2(targetH / 2);\n      }\n      if (rel[1] === 'c') {\n        x += round$2(targetW / 2);\n      }\n      if (rel[3] === 'b') {\n        y -= h;\n      }\n      if (rel[4] === 'r') {\n        x -= w;\n      }\n      if (rel[3] === 'c') {\n        y -= round$2(h / 2);\n      }\n      if (rel[4] === 'c') {\n        x -= round$2(w / 2);\n      }\n      return create$7(x, y, w, h);\n    };\n    var findBestRelativePosition = function (rect, targetRect, constrainRect, rels) {\n      var pos, i;\n      for (i = 0; i < rels.length; i++) {\n        pos = relativePosition(rect, targetRect, rels[i]);\n        if (pos.x >= constrainRect.x && pos.x + pos.w <= constrainRect.w + constrainRect.x && pos.y >= constrainRect.y && pos.y + pos.h <= constrainRect.h + constrainRect.y) {\n          return rels[i];\n        }\n      }\n      return null;\n    };\n    var inflate = function (rect, w, h) {\n      return create$7(rect.x - w, rect.y - h, rect.w + w * 2, rect.h + h * 2);\n    };\n    var intersect = function (rect, cropRect) {\n      var x1, y1, x2, y2;\n      x1 = max(rect.x, cropRect.x);\n      y1 = max(rect.y, cropRect.y);\n      x2 = min(rect.x + rect.w, cropRect.x + cropRect.w);\n      y2 = min(rect.y + rect.h, cropRect.y + cropRect.h);\n      if (x2 - x1 < 0 || y2 - y1 < 0) {\n        return null;\n      }\n      return create$7(x1, y1, x2 - x1, y2 - y1);\n    };\n    var clamp$1 = function (rect, clampRect, fixedSize) {\n      var underflowX1, underflowY1, overflowX2, overflowY2, x1, y1, x2, y2, cx2, cy2;\n      x1 = rect.x;\n      y1 = rect.y;\n      x2 = rect.x + rect.w;\n      y2 = rect.y + rect.h;\n      cx2 = clampRect.x + clampRect.w;\n      cy2 = clampRect.y + clampRect.h;\n      underflowX1 = max(0, clampRect.x - x1);\n      underflowY1 = max(0, clampRect.y - y1);\n      overflowX2 = max(0, x2 - cx2);\n      overflowY2 = max(0, y2 - cy2);\n      x1 += underflowX1;\n      y1 += underflowY1;\n      if (fixedSize) {\n        x2 += underflowX1;\n        y2 += underflowY1;\n        x1 -= overflowX2;\n        y1 -= overflowY2;\n      }\n      x2 -= overflowX2;\n      y2 -= overflowY2;\n      return create$7(x1, y1, x2 - x1, y2 - y1);\n    };\n    var create$7 = function (x, y, w, h) {\n      return {\n        x: x,\n        y: y,\n        w: w,\n        h: h\n      };\n    };\n    var fromClientRect = function (clientRect) {\n      return create$7(clientRect.left, clientRect.top, clientRect.width, clientRect.height);\n    };\n    var Rect = {\n      inflate: inflate,\n      relativePosition: relativePosition,\n      findBestRelativePosition: findBestRelativePosition,\n      intersect: intersect,\n      clamp: clamp$1,\n      create: create$7,\n      fromClientRect: fromClientRect\n    };\n\n    var each$k = Tools.each, extend$5 = Tools.extend;\n    var extendClass, initializing;\n    var Class = function () {\n    };\n    Class.extend = extendClass = function (prop) {\n      var self = this;\n      var _super = self.prototype;\n      var prototype, name, member;\n      var Class = function () {\n        var i, mixins, mixin;\n        var self = this;\n        if (!initializing) {\n          if (self.init) {\n            self.init.apply(self, arguments);\n          }\n          mixins = self.Mixins;\n          if (mixins) {\n            i = mixins.length;\n            while (i--) {\n              mixin = mixins[i];\n              if (mixin.init) {\n                mixin.init.apply(self, arguments);\n              }\n            }\n          }\n        }\n      };\n      var dummy = function () {\n        return this;\n      };\n      var createMethod = function (name, fn) {\n        return function () {\n          var self = this;\n          var tmp = self._super;\n          var ret;\n          self._super = _super[name];\n          ret = fn.apply(self, arguments);\n          self._super = tmp;\n          return ret;\n        };\n      };\n      initializing = true;\n      prototype = new self();\n      initializing = false;\n      if (prop.Mixins) {\n        each$k(prop.Mixins, function (mixin) {\n          for (var name_1 in mixin) {\n            if (name_1 !== 'init') {\n              prop[name_1] = mixin[name_1];\n            }\n          }\n        });\n        if (_super.Mixins) {\n          prop.Mixins = _super.Mixins.concat(prop.Mixins);\n        }\n      }\n      if (prop.Methods) {\n        each$k(prop.Methods.split(','), function (name) {\n          prop[name] = dummy;\n        });\n      }\n      if (prop.Properties) {\n        each$k(prop.Properties.split(','), function (name) {\n          var fieldName = '_' + name;\n          prop[name] = function (value) {\n            var self = this;\n            if (value !== undefined) {\n              self[fieldName] = value;\n              return self;\n            }\n            return self[fieldName];\n          };\n        });\n      }\n      if (prop.Statics) {\n        each$k(prop.Statics, function (func, name) {\n          Class[name] = func;\n        });\n      }\n      if (prop.Defaults && _super.Defaults) {\n        prop.Defaults = extend$5({}, _super.Defaults, prop.Defaults);\n      }\n      for (name in prop) {\n        member = prop[name];\n        if (typeof member === 'function' && _super[name]) {\n          prototype[name] = createMethod(name, member);\n        } else {\n          prototype[name] = member;\n        }\n      }\n      Class.prototype = prototype;\n      Class.constructor = Class;\n      Class.extend = extendClass;\n      return Class;\n    };\n\n    var min$1 = Math.min, max$1 = Math.max, round$3 = Math.round;\n    var Color = function (value) {\n      var self = {};\n      var r = 0, g = 0, b = 0;\n      var rgb2hsv = function (r, g, b) {\n        var h, s, v, d, minRGB, maxRGB;\n        h = 0;\n        s = 0;\n        v = 0;\n        r = r / 255;\n        g = g / 255;\n        b = b / 255;\n        minRGB = min$1(r, min$1(g, b));\n        maxRGB = max$1(r, max$1(g, b));\n        if (minRGB === maxRGB) {\n          v = minRGB;\n          return {\n            h: 0,\n            s: 0,\n            v: v * 100\n          };\n        }\n        d = r === minRGB ? g - b : b === minRGB ? r - g : b - r;\n        h = r === minRGB ? 3 : b === minRGB ? 1 : 5;\n        h = 60 * (h - d / (maxRGB - minRGB));\n        s = (maxRGB - minRGB) / maxRGB;\n        v = maxRGB;\n        return {\n          h: round$3(h),\n          s: round$3(s * 100),\n          v: round$3(v * 100)\n        };\n      };\n      var hsvToRgb = function (hue, saturation, brightness) {\n        var side, chroma, x, match;\n        hue = (parseInt(hue, 10) || 0) % 360;\n        saturation = parseInt(saturation, 10) / 100;\n        brightness = parseInt(brightness, 10) / 100;\n        saturation = max$1(0, min$1(saturation, 1));\n        brightness = max$1(0, min$1(brightness, 1));\n        if (saturation === 0) {\n          r = g = b = round$3(255 * brightness);\n          return;\n        }\n        side = hue / 60;\n        chroma = brightness * saturation;\n        x = chroma * (1 - Math.abs(side % 2 - 1));\n        match = brightness - chroma;\n        switch (Math.floor(side)) {\n        case 0:\n          r = chroma;\n          g = x;\n          b = 0;\n          break;\n        case 1:\n          r = x;\n          g = chroma;\n          b = 0;\n          break;\n        case 2:\n          r = 0;\n          g = chroma;\n          b = x;\n          break;\n        case 3:\n          r = 0;\n          g = x;\n          b = chroma;\n          break;\n        case 4:\n          r = x;\n          g = 0;\n          b = chroma;\n          break;\n        case 5:\n          r = chroma;\n          g = 0;\n          b = x;\n          break;\n        default:\n          r = g = b = 0;\n        }\n        r = round$3(255 * (r + match));\n        g = round$3(255 * (g + match));\n        b = round$3(255 * (b + match));\n      };\n      var toHex = function () {\n        var hex = function (val) {\n          val = parseInt(val, 10).toString(16);\n          return val.length > 1 ? val : '0' + val;\n        };\n        return '#' + hex(r) + hex(g) + hex(b);\n      };\n      var toRgb = function () {\n        return {\n          r: r,\n          g: g,\n          b: b\n        };\n      };\n      var toHsv = function () {\n        return rgb2hsv(r, g, b);\n      };\n      var parse = function (value) {\n        var matches;\n        if (typeof value === 'object') {\n          if ('r' in value) {\n            r = value.r;\n            g = value.g;\n            b = value.b;\n          } else if ('v' in value) {\n            hsvToRgb(value.h, value.s, value.v);\n          }\n        } else {\n          if (matches = /rgb\\s*\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)[^\\)]*\\)/gi.exec(value)) {\n            r = parseInt(matches[1], 10);\n            g = parseInt(matches[2], 10);\n            b = parseInt(matches[3], 10);\n          } else if (matches = /#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(value)) {\n            r = parseInt(matches[1], 16);\n            g = parseInt(matches[2], 16);\n            b = parseInt(matches[3], 16);\n          } else if (matches = /#([0-F])([0-F])([0-F])/gi.exec(value)) {\n            r = parseInt(matches[1] + matches[1], 16);\n            g = parseInt(matches[2] + matches[2], 16);\n            b = parseInt(matches[3] + matches[3], 16);\n          }\n        }\n        r = r < 0 ? 0 : r > 255 ? 255 : r;\n        g = g < 0 ? 0 : g > 255 ? 255 : g;\n        b = b < 0 ? 0 : b > 255 ? 255 : b;\n        return self;\n      };\n      if (value) {\n        parse(value);\n      }\n      self.toRgb = toRgb;\n      self.toHsv = toHsv;\n      self.toHex = toHex;\n      self.parse = parse;\n      return self;\n    };\n\n    var serialize = function (obj) {\n      var data = JSON.stringify(obj);\n      if (!isString(data)) {\n        return data;\n      }\n      return data.replace(/[\\u0080-\\uFFFF]/g, function (match) {\n        var hexCode = match.charCodeAt(0).toString(16);\n        return '\\\\u' + '0000'.substring(hexCode.length) + hexCode;\n      });\n    };\n    var JSONUtils = {\n      serialize: serialize,\n      parse: function (text) {\n        try {\n          return JSON.parse(text);\n        } catch (ex) {\n        }\n      }\n    };\n\n    var JSONP = {\n      callbacks: {},\n      count: 0,\n      send: function (settings) {\n        var self = this, dom = DOMUtils$1.DOM, count = settings.count !== undefined ? settings.count : self.count;\n        var id = 'tinymce_jsonp_' + count;\n        self.callbacks[count] = function (json) {\n          dom.remove(id);\n          delete self.callbacks[count];\n          settings.callback(json);\n        };\n        dom.add(dom.doc.body, 'script', {\n          id: id,\n          src: settings.url,\n          type: 'text/javascript'\n        });\n        self.count++;\n      }\n    };\n\n    var XHR = __assign(__assign({}, Observable), {\n      send: function (settings) {\n        var xhr, count = 0;\n        var ready = function () {\n          if (!settings.async || xhr.readyState === 4 || count++ > 10000) {\n            if (settings.success && count < 10000 && xhr.status === 200) {\n              settings.success.call(settings.success_scope, '' + xhr.responseText, xhr, settings);\n            } else if (settings.error) {\n              settings.error.call(settings.error_scope, count > 10000 ? 'TIMED_OUT' : 'GENERAL', xhr, settings);\n            }\n            xhr = null;\n          } else {\n            Delay.setTimeout(ready, 10);\n          }\n        };\n        settings.scope = settings.scope || this;\n        settings.success_scope = settings.success_scope || settings.scope;\n        settings.error_scope = settings.error_scope || settings.scope;\n        settings.async = settings.async !== false;\n        settings.data = settings.data || '';\n        XHR.fire('beforeInitialize', { settings: settings });\n        xhr = new domGlobals.XMLHttpRequest();\n        if (xhr) {\n          if (xhr.overrideMimeType) {\n            xhr.overrideMimeType(settings.content_type);\n          }\n          xhr.open(settings.type || (settings.data ? 'POST' : 'GET'), settings.url, settings.async);\n          if (settings.crossDomain) {\n            xhr.withCredentials = true;\n          }\n          if (settings.content_type) {\n            xhr.setRequestHeader('Content-Type', settings.content_type);\n          }\n          if (settings.requestheaders) {\n            Tools.each(settings.requestheaders, function (header) {\n              xhr.setRequestHeader(header.key, header.value);\n            });\n          }\n          xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n          xhr = XHR.fire('beforeSend', {\n            xhr: xhr,\n            settings: settings\n          }).xhr;\n          xhr.send(settings.data);\n          if (!settings.async) {\n            return ready();\n          }\n          Delay.setTimeout(ready, 10);\n        }\n      }\n    });\n\n    var extend$6 = Tools.extend;\n    var JSONRequest = function () {\n      function JSONRequest(settings) {\n        this.settings = extend$6({}, settings);\n        this.count = 0;\n      }\n      JSONRequest.sendRPC = function (o) {\n        return new JSONRequest().send(o);\n      };\n      JSONRequest.prototype.send = function (args) {\n        var ecb = args.error, scb = args.success;\n        var xhrArgs = extend$6(this.settings, args);\n        xhrArgs.success = function (c, x) {\n          c = JSONUtils.parse(c);\n          if (typeof c === 'undefined') {\n            c = { error: 'JSON Parse error.' };\n          }\n          if (c.error) {\n            ecb.call(xhrArgs.error_scope || xhrArgs.scope, c.error, x);\n          } else {\n            scb.call(xhrArgs.success_scope || xhrArgs.scope, c.result);\n          }\n        };\n        xhrArgs.error = function (ty, x) {\n          if (ecb) {\n            ecb.call(xhrArgs.error_scope || xhrArgs.scope, ty, x);\n          }\n        };\n        xhrArgs.data = JSONUtils.serialize({\n          id: args.id || 'c' + this.count++,\n          method: args.method,\n          params: args.params\n        });\n        xhrArgs.content_type = 'application/json';\n        XHR.send(xhrArgs);\n      };\n      return JSONRequest;\n    }();\n\n    var create$8 = function () {\n      return function () {\n        var data = {};\n        var keys = [];\n        var storage = {\n          getItem: function (key) {\n            var item = data[key];\n            return item ? item : null;\n          },\n          setItem: function (key, value) {\n            keys.push(key);\n            data[key] = String(value);\n          },\n          key: function (index) {\n            return keys[index];\n          },\n          removeItem: function (key) {\n            keys = keys.filter(function (k) {\n              return k === key;\n            });\n            delete data[key];\n          },\n          clear: function () {\n            keys = [];\n            data = {};\n          },\n          length: 0\n        };\n        Object.defineProperty(storage, 'length', {\n          get: function () {\n            return keys.length;\n          },\n          configurable: false,\n          enumerable: false\n        });\n        return storage;\n      }();\n    };\n\n    var localStorage;\n    try {\n      localStorage = domGlobals.window.localStorage;\n    } catch (e) {\n      localStorage = create$8();\n    }\n    var LocalStorage = localStorage;\n\n    var publicApi = {\n      geom: { Rect: Rect },\n      util: {\n        Promise: promiseObj,\n        Delay: Delay,\n        Tools: Tools,\n        VK: VK,\n        URI: URI,\n        Class: Class,\n        EventDispatcher: EventDispatcher,\n        Observable: Observable,\n        I18n: I18n,\n        XHR: XHR,\n        JSON: JSONUtils,\n        JSONRequest: JSONRequest,\n        JSONP: JSONP,\n        LocalStorage: LocalStorage,\n        Color: Color\n      },\n      dom: {\n        EventUtils: EventUtils,\n        Sizzle: Sizzle,\n        DomQuery: DomQuery,\n        TreeWalker: TreeWalker,\n        TextSeeker: TextSeeker,\n        DOMUtils: DOMUtils$1,\n        ScriptLoader: ScriptLoader,\n        RangeUtils: RangeUtils$1,\n        Serializer: Serializer$1,\n        ControlSelection: ControlSelection,\n        BookmarkManager: BookmarkManager$1,\n        Selection: Selection$1,\n        Event: EventUtils.Event\n      },\n      html: {\n        Styles: Styles,\n        Entities: Entities,\n        Node: Node$1,\n        Schema: Schema,\n        SaxParser: SaxParser$1,\n        DomParser: DomParser,\n        Writer: Writer,\n        Serializer: Serializer\n      },\n      Env: Env,\n      AddOnManager: AddOnManager$1,\n      Annotator: Annotator,\n      Formatter: Formatter,\n      UndoManager: UndoManager,\n      EditorCommands: EditorCommands,\n      WindowManager: WindowManager,\n      NotificationManager: NotificationManager,\n      EditorObservable: EditorObservable,\n      Shortcuts: Shortcuts,\n      Editor: Editor,\n      FocusManager: FocusManager,\n      EditorManager: EditorManager,\n      DOM: DOMUtils$1.DOM,\n      ScriptLoader: ScriptLoader.ScriptLoader,\n      PluginManager: AddOnManager$1.PluginManager,\n      ThemeManager: AddOnManager$1.ThemeManager,\n      IconManager: IconManager,\n      Resource: Resource,\n      trim: Tools.trim,\n      isArray: Tools.isArray,\n      is: Tools.is,\n      toArray: Tools.toArray,\n      makeMap: Tools.makeMap,\n      each: Tools.each,\n      map: Tools.map,\n      grep: Tools.grep,\n      inArray: Tools.inArray,\n      extend: Tools.extend,\n      create: Tools.create,\n      walk: Tools.walk,\n      createNS: Tools.createNS,\n      resolve: Tools.resolve,\n      explode: Tools.explode,\n      _addCacheSuffix: Tools._addCacheSuffix,\n      isOpera: Env.opera,\n      isWebKit: Env.webkit,\n      isIE: Env.ie,\n      isGecko: Env.gecko,\n      isMac: Env.mac\n    };\n    var tinymce = Tools.extend(EditorManager, publicApi);\n\n    var exportToModuleLoaders = function (tinymce) {\n      if (typeof module === 'object') {\n        try {\n          module.exports = tinymce;\n        } catch (_) {\n        }\n      }\n    };\n    var exportToWindowGlobal = function (tinymce) {\n      window.tinymce = tinymce;\n      window.tinyMCE = tinymce;\n    };\n    exportToWindowGlobal(tinymce);\n    exportToModuleLoaders(tinymce);\n\n}(window));\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function () {\n    'use strict';\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var setContent = function (editor, html) {\n      editor.focus();\n      editor.undoManager.transact(function () {\n        editor.setContent(html);\n      });\n      editor.selection.setCursorLocation();\n      editor.nodeChanged();\n    };\n    var getContent = function (editor) {\n      return editor.getContent({ source_view: true });\n    };\n    var Content = {\n      setContent: setContent,\n      getContent: getContent\n    };\n\n    var open = function (editor) {\n      var editorContent = Content.getContent(editor);\n      editor.windowManager.open({\n        title: 'Source Code',\n        size: 'large',\n        body: {\n          type: 'panel',\n          items: [{\n              type: 'textarea',\n              name: 'code'\n            }]\n        },\n        buttons: [\n          {\n            type: 'cancel',\n            name: 'cancel',\n            text: 'Cancel'\n          },\n          {\n            type: 'submit',\n            name: 'save',\n            text: 'Save',\n            primary: true\n          }\n        ],\n        initialData: { code: editorContent },\n        onSubmit: function (api) {\n          Content.setContent(editor, api.getData().code);\n          api.close();\n        }\n      });\n    };\n    var Dialog = { open: open };\n\n    var register = function (editor) {\n      editor.addCommand('mceCodeEditor', function () {\n        Dialog.open(editor);\n      });\n    };\n    var Commands = { register: register };\n\n    var register$1 = function (editor) {\n      editor.ui.registry.addButton('code', {\n        icon: 'sourcecode',\n        tooltip: 'Source code',\n        onAction: function () {\n          return Dialog.open(editor);\n        }\n      });\n      editor.ui.registry.addMenuItem('code', {\n        icon: 'sourcecode',\n        text: 'Source code',\n        onAction: function () {\n          return Dialog.open(editor);\n        }\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global.add('code', function (editor) {\n        Commands.register(editor);\n        Buttons.register(editor);\n        return {};\n      });\n    }\n\n    Plugin();\n\n}());\n","/**\n * Copyright (c) Tiny Technologies, Inc. All rights reserved.\n * Licensed under the LGPL or a commercial license.\n * For LGPL see License.txt in the project root for license information.\n * For commercial licenses see https://www.tiny.cloud/\n *\n * Version: 5.2.2 (2020-04-23)\n */\n(function (domGlobals) {\n    'use strict';\n\n    var Cell = function (initial) {\n      var value = initial;\n      var get = function () {\n        return value;\n      };\n      var set = function (v) {\n        value = v;\n      };\n      var clone = function () {\n        return Cell(get());\n      };\n      return {\n        get: get,\n        set: set,\n        clone: clone\n      };\n    };\n\n    var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n    var get = function (fullscreenState) {\n      return {\n        isFullscreen: function () {\n          return fullscreenState.get() !== null;\n        }\n      };\n    };\n    var Api = { get: get };\n\n    var noop = function () {\n    };\n    var compose = function (fa, fb) {\n      return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return fa(fb.apply(null, args));\n      };\n    };\n    var constant = function (value) {\n      return function () {\n        return value;\n      };\n    };\n    var never = constant(false);\n    var always = constant(true);\n\n    var none = function () {\n      return NONE;\n    };\n    var NONE = function () {\n      var eq = function (o) {\n        return o.isNone();\n      };\n      var call = function (thunk) {\n        return thunk();\n      };\n      var id = function (n) {\n        return n;\n      };\n      var me = {\n        fold: function (n, s) {\n          return n();\n        },\n        is: never,\n        isSome: never,\n        isNone: always,\n        getOr: id,\n        getOrThunk: call,\n        getOrDie: function (msg) {\n          throw new Error(msg || 'error: getOrDie called on none.');\n        },\n        getOrNull: constant(null),\n        getOrUndefined: constant(undefined),\n        or: id,\n        orThunk: call,\n        map: none,\n        each: noop,\n        bind: none,\n        exists: never,\n        forall: always,\n        filter: none,\n        equals: eq,\n        equals_: eq,\n        toArray: function () {\n          return [];\n        },\n        toString: constant('none()')\n      };\n      if (Object.freeze) {\n        Object.freeze(me);\n      }\n      return me;\n    }();\n    var some = function (a) {\n      var constant_a = constant(a);\n      var self = function () {\n        return me;\n      };\n      var bind = function (f) {\n        return f(a);\n      };\n      var me = {\n        fold: function (n, s) {\n          return s(a);\n        },\n        is: function (v) {\n          return a === v;\n        },\n        isSome: always,\n        isNone: never,\n        getOr: constant_a,\n        getOrThunk: constant_a,\n        getOrDie: constant_a,\n        getOrNull: constant_a,\n        getOrUndefined: constant_a,\n        or: self,\n        orThunk: self,\n        map: function (f) {\n          return some(f(a));\n        },\n        each: function (f) {\n          f(a);\n        },\n        bind: bind,\n        exists: bind,\n        forall: bind,\n        filter: function (f) {\n          return f(a) ? me : NONE;\n        },\n        toArray: function () {\n          return [a];\n        },\n        toString: function () {\n          return 'some(' + a + ')';\n        },\n        equals: function (o) {\n          return o.is(a);\n        },\n        equals_: function (o, elementEq) {\n          return o.fold(never, function (b) {\n            return elementEq(a, b);\n          });\n        }\n      };\n      return me;\n    };\n    var from = function (value) {\n      return value === null || value === undefined ? NONE : some(value);\n    };\n    var Option = {\n      some: some,\n      none: none,\n      from: from\n    };\n\n    var revocable = function (doRevoke) {\n      var subject = Cell(Option.none());\n      var revoke = function () {\n        subject.get().each(doRevoke);\n      };\n      var clear = function () {\n        revoke();\n        subject.set(Option.none());\n      };\n      var set = function (s) {\n        revoke();\n        subject.set(Option.some(s));\n      };\n      var isSet = function () {\n        return subject.get().isSome();\n      };\n      return {\n        clear: clear,\n        isSet: isSet,\n        set: set\n      };\n    };\n    var unbindable = function () {\n      return revocable(function (s) {\n        s.unbind();\n      });\n    };\n    var value = function () {\n      var subject = Cell(Option.none());\n      var clear = function () {\n        subject.set(Option.none());\n      };\n      var set = function (s) {\n        subject.set(Option.some(s));\n      };\n      var on = function (f) {\n        subject.get().each(f);\n      };\n      var isSet = function () {\n        return subject.get().isSome();\n      };\n      return {\n        clear: clear,\n        set: set,\n        isSet: isSet,\n        on: on\n      };\n    };\n\n    var typeOf = function (x) {\n      if (x === null) {\n        return 'null';\n      }\n      var t = typeof x;\n      if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n        return 'array';\n      }\n      if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n        return 'string';\n      }\n      return t;\n    };\n    var isType = function (type) {\n      return function (value) {\n        return typeOf(value) === type;\n      };\n    };\n    var isString = isType('string');\n    var isArray = isType('array');\n    var isBoolean = isType('boolean');\n    var isFunction = isType('function');\n    var isNumber = isType('number');\n\n    var nativeSlice = Array.prototype.slice;\n    var nativePush = Array.prototype.push;\n    var map = function (xs, f) {\n      var len = xs.length;\n      var r = new Array(len);\n      for (var i = 0; i < len; i++) {\n        var x = xs[i];\n        r[i] = f(x, i);\n      }\n      return r;\n    };\n    var each = function (xs, f) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        f(x, i);\n      }\n    };\n    var filter = function (xs, pred) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          r.push(x);\n        }\n      }\n      return r;\n    };\n    var find = function (xs, pred) {\n      for (var i = 0, len = xs.length; i < len; i++) {\n        var x = xs[i];\n        if (pred(x, i)) {\n          return Option.some(x);\n        }\n      }\n      return Option.none();\n    };\n    var flatten = function (xs) {\n      var r = [];\n      for (var i = 0, len = xs.length; i < len; ++i) {\n        if (!isArray(xs[i])) {\n          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);\n        }\n        nativePush.apply(r, xs[i]);\n      }\n      return r;\n    };\n    var bind = function (xs, f) {\n      return flatten(map(xs, f));\n    };\n    var from$1 = isFunction(Array.from) ? Array.from : function (x) {\n      return nativeSlice.call(x);\n    };\n\n    var keys = Object.keys;\n    var each$1 = function (obj, f) {\n      var props = keys(obj);\n      for (var k = 0, len = props.length; k < len; k++) {\n        var i = props[k];\n        var x = obj[i];\n        f(x, i);\n      }\n    };\n\n    var contains = function (str, substr) {\n      return str.indexOf(substr) !== -1;\n    };\n\n    var isSupported = function (dom) {\n      return dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n    };\n\n    var fromHtml = function (html, scope) {\n      var doc = scope || domGlobals.document;\n      var div = doc.createElement('div');\n      div.innerHTML = html;\n      if (!div.hasChildNodes() || div.childNodes.length > 1) {\n        domGlobals.console.error('HTML does not have a single root node', html);\n        throw new Error('HTML must have a single root node');\n      }\n      return fromDom(div.childNodes[0]);\n    };\n    var fromTag = function (tag, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createElement(tag);\n      return fromDom(node);\n    };\n    var fromText = function (text, scope) {\n      var doc = scope || domGlobals.document;\n      var node = doc.createTextNode(text);\n      return fromDom(node);\n    };\n    var fromDom = function (node) {\n      if (node === null || node === undefined) {\n        throw new Error('Node cannot be null or undefined');\n      }\n      return { dom: constant(node) };\n    };\n    var fromPoint = function (docElm, x, y) {\n      var doc = docElm.dom();\n      return Option.from(doc.elementFromPoint(x, y)).map(fromDom);\n    };\n    var Element = {\n      fromHtml: fromHtml,\n      fromTag: fromTag,\n      fromText: fromText,\n      fromDom: fromDom,\n      fromPoint: fromPoint\n    };\n\n    var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;\n    var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;\n    var COMMENT = domGlobals.Node.COMMENT_NODE;\n    var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;\n    var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;\n    var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;\n    var ELEMENT = domGlobals.Node.ELEMENT_NODE;\n    var TEXT = domGlobals.Node.TEXT_NODE;\n    var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;\n    var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;\n    var ENTITY = domGlobals.Node.ENTITY_NODE;\n    var NOTATION = domGlobals.Node.NOTATION_NODE;\n\n    var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();\n\n    var type = function (element) {\n      return element.dom().nodeType;\n    };\n    var isType$1 = function (t) {\n      return function (element) {\n        return type(element) === t;\n      };\n    };\n    var isText = isType$1(TEXT);\n\n    var inBody = function (element) {\n      var dom = isText(element) ? element.dom().parentNode : element.dom();\n      return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom);\n    };\n\n    var rawSet = function (dom, key, value) {\n      if (isString(value) || isBoolean(value) || isNumber(value)) {\n        dom.setAttribute(key, value + '');\n      } else {\n        domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n        throw new Error('Attribute value was not simple');\n      }\n    };\n    var set = function (element, key, value) {\n      rawSet(element.dom(), key, value);\n    };\n    var get$1 = function (element, key) {\n      var v = element.dom().getAttribute(key);\n      return v === null ? undefined : v;\n    };\n    var remove = function (element, key) {\n      element.dom().removeAttribute(key);\n    };\n\n    var internalSet = function (dom, property, value) {\n      if (!isString(value)) {\n        domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);\n        throw new Error('CSS value must be a string: ' + value);\n      }\n      if (isSupported(dom)) {\n        dom.style.setProperty(property, value);\n      }\n    };\n    var setAll = function (element, css) {\n      var dom = element.dom();\n      each$1(css, function (v, k) {\n        internalSet(dom, k, v);\n      });\n    };\n    var get$2 = function (element, property) {\n      var dom = element.dom();\n      var styles = domGlobals.window.getComputedStyle(dom);\n      var r = styles.getPropertyValue(property);\n      var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n      return v === null ? undefined : v;\n    };\n    var getUnsafeProperty = function (dom, property) {\n      return isSupported(dom) ? dom.style.getPropertyValue(property) : '';\n    };\n\n    var mkEvent = function (target, x, y, stop, prevent, kill, raw) {\n      return {\n        target: constant(target),\n        x: constant(x),\n        y: constant(y),\n        stop: stop,\n        prevent: prevent,\n        kill: kill,\n        raw: constant(raw)\n      };\n    };\n    var fromRawEvent = function (rawEvent) {\n      var target = Element.fromDom(rawEvent.target);\n      var stop = function () {\n        rawEvent.stopPropagation();\n      };\n      var prevent = function () {\n        rawEvent.preventDefault();\n      };\n      var kill = compose(prevent, stop);\n      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);\n    };\n\n    var firstMatch = function (regexes, s) {\n      for (var i = 0; i < regexes.length; i++) {\n        var x = regexes[i];\n        if (x.test(s)) {\n          return x;\n        }\n      }\n      return undefined;\n    };\n    var find$1 = function (regexes, agent) {\n      var r = firstMatch(regexes, agent);\n      if (!r) {\n        return {\n          major: 0,\n          minor: 0\n        };\n      }\n      var group = function (i) {\n        return Number(agent.replace(r, '$' + i));\n      };\n      return nu(group(1), group(2));\n    };\n    var detect = function (versionRegexes, agent) {\n      var cleanedAgent = String(agent).toLowerCase();\n      if (versionRegexes.length === 0) {\n        return unknown();\n      }\n      return find$1(versionRegexes, cleanedAgent);\n    };\n    var unknown = function () {\n      return nu(0, 0);\n    };\n    var nu = function (major, minor) {\n      return {\n        major: major,\n        minor: minor\n      };\n    };\n    var Version = {\n      nu: nu,\n      detect: detect,\n      unknown: unknown\n    };\n\n    var edge = 'Edge';\n    var chrome = 'Chrome';\n    var ie = 'IE';\n    var opera = 'Opera';\n    var firefox = 'Firefox';\n    var safari = 'Safari';\n    var isBrowser = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$1 = function () {\n      return nu$1({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$1 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isEdge: isBrowser(edge, current),\n        isChrome: isBrowser(chrome, current),\n        isIE: isBrowser(ie, current),\n        isOpera: isBrowser(opera, current),\n        isFirefox: isBrowser(firefox, current),\n        isSafari: isBrowser(safari, current)\n      };\n    };\n    var Browser = {\n      unknown: unknown$1,\n      nu: nu$1,\n      edge: constant(edge),\n      chrome: constant(chrome),\n      ie: constant(ie),\n      opera: constant(opera),\n      firefox: constant(firefox),\n      safari: constant(safari)\n    };\n\n    var windows = 'Windows';\n    var ios = 'iOS';\n    var android = 'Android';\n    var linux = 'Linux';\n    var osx = 'OSX';\n    var solaris = 'Solaris';\n    var freebsd = 'FreeBSD';\n    var chromeos = 'ChromeOS';\n    var isOS = function (name, current) {\n      return function () {\n        return current === name;\n      };\n    };\n    var unknown$2 = function () {\n      return nu$2({\n        current: undefined,\n        version: Version.unknown()\n      });\n    };\n    var nu$2 = function (info) {\n      var current = info.current;\n      var version = info.version;\n      return {\n        current: current,\n        version: version,\n        isWindows: isOS(windows, current),\n        isiOS: isOS(ios, current),\n        isAndroid: isOS(android, current),\n        isOSX: isOS(osx, current),\n        isLinux: isOS(linux, current),\n        isSolaris: isOS(solaris, current),\n        isFreeBSD: isOS(freebsd, current),\n        isChromeOS: isOS(chromeos, current)\n      };\n    };\n    var OperatingSystem = {\n      unknown: unknown$2,\n      nu: nu$2,\n      windows: constant(windows),\n      ios: constant(ios),\n      android: constant(android),\n      linux: constant(linux),\n      osx: constant(osx),\n      solaris: constant(solaris),\n      freebsd: constant(freebsd),\n      chromeos: constant(chromeos)\n    };\n\n    var DeviceType = function (os, browser, userAgent, mediaMatch) {\n      var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;\n      var isiPhone = os.isiOS() && !isiPad;\n      var isMobile = os.isiOS() || os.isAndroid();\n      var isTouch = isMobile || mediaMatch('(pointer:coarse)');\n      var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');\n      var isPhone = isiPhone || isMobile && !isTablet;\n      var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;\n      var isDesktop = !isPhone && !isTablet && !iOSwebview;\n      return {\n        isiPad: constant(isiPad),\n        isiPhone: constant(isiPhone),\n        isTablet: constant(isTablet),\n        isPhone: constant(isPhone),\n        isTouch: constant(isTouch),\n        isAndroid: os.isAndroid,\n        isiOS: os.isiOS,\n        isWebView: constant(iOSwebview),\n        isDesktop: constant(isDesktop)\n      };\n    };\n\n    var detect$1 = function (candidates, userAgent) {\n      var agent = String(userAgent).toLowerCase();\n      return find(candidates, function (candidate) {\n        return candidate.search(agent);\n      });\n    };\n    var detectBrowser = function (browsers, userAgent) {\n      return detect$1(browsers, userAgent).map(function (browser) {\n        var version = Version.detect(browser.versionRegexes, userAgent);\n        return {\n          current: browser.name,\n          version: version\n        };\n      });\n    };\n    var detectOs = function (oses, userAgent) {\n      return detect$1(oses, userAgent).map(function (os) {\n        var version = Version.detect(os.versionRegexes, userAgent);\n        return {\n          current: os.name,\n          version: version\n        };\n      });\n    };\n    var UaString = {\n      detectBrowser: detectBrowser,\n      detectOs: detectOs\n    };\n\n    var normalVersionRegex = /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/;\n    var checkContains = function (target) {\n      return function (uastring) {\n        return contains(uastring, target);\n      };\n    };\n    var browsers = [\n      {\n        name: 'Edge',\n        versionRegexes: [/.*?edge\\/ ?([0-9]+)\\.([0-9]+)$/],\n        search: function (uastring) {\n          return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');\n        }\n      },\n      {\n        name: 'Chrome',\n        versionRegexes: [\n          /.*?chrome\\/([0-9]+)\\.([0-9]+).*/,\n          normalVersionRegex\n        ],\n        search: function (uastring) {\n          return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');\n        }\n      },\n      {\n        name: 'IE',\n        versionRegexes: [\n          /.*?msie\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*?rv:([0-9]+)\\.([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return contains(uastring, 'msie') || contains(uastring, 'trident');\n        }\n      },\n      {\n        name: 'Opera',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?opera\\/([0-9]+)\\.([0-9]+).*/\n        ],\n        search: checkContains('opera')\n      },\n      {\n        name: 'Firefox',\n        versionRegexes: [/.*?firefox\\/\\ ?([0-9]+)\\.([0-9]+).*/],\n        search: checkContains('firefox')\n      },\n      {\n        name: 'Safari',\n        versionRegexes: [\n          normalVersionRegex,\n          /.*?cpu os ([0-9]+)_([0-9]+).*/\n        ],\n        search: function (uastring) {\n          return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');\n        }\n      }\n    ];\n    var oses = [\n      {\n        name: 'Windows',\n        search: checkContains('win'),\n        versionRegexes: [/.*?windows\\ nt\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'iOS',\n        search: function (uastring) {\n          return contains(uastring, 'iphone') || contains(uastring, 'ipad');\n        },\n        versionRegexes: [\n          /.*?version\\/\\ ?([0-9]+)\\.([0-9]+).*/,\n          /.*cpu os ([0-9]+)_([0-9]+).*/,\n          /.*cpu iphone os ([0-9]+)_([0-9]+).*/\n        ]\n      },\n      {\n        name: 'Android',\n        search: checkContains('android'),\n        versionRegexes: [/.*?android\\ ?([0-9]+)\\.([0-9]+).*/]\n      },\n      {\n        name: 'OSX',\n        search: checkContains('mac os x'),\n        versionRegexes: [/.*?mac\\ os\\ x\\ ?([0-9]+)_([0-9]+).*/]\n      },\n      {\n        name: 'Linux',\n        search: checkContains('linux'),\n        versionRegexes: []\n      },\n      {\n        name: 'Solaris',\n        search: checkContains('sunos'),\n        versionRegexes: []\n      },\n      {\n        name: 'FreeBSD',\n        search: checkContains('freebsd'),\n        versionRegexes: []\n      },\n      {\n        name: 'ChromeOS',\n        search: checkContains('cros'),\n        versionRegexes: [/.*?chrome\\/([0-9]+)\\.([0-9]+).*/]\n      }\n    ];\n    var PlatformInfo = {\n      browsers: constant(browsers),\n      oses: constant(oses)\n    };\n\n    var detect$2 = function (userAgent, mediaMatch) {\n      var browsers = PlatformInfo.browsers();\n      var oses = PlatformInfo.oses();\n      var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);\n      var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);\n      var deviceType = DeviceType(os, browser, userAgent, mediaMatch);\n      return {\n        browser: browser,\n        os: os,\n        deviceType: deviceType\n      };\n    };\n    var PlatformDetection = { detect: detect$2 };\n\n    var mediaMatch = function (query) {\n      return domGlobals.window.matchMedia(query).matches;\n    };\n    var platform = Cell(PlatformDetection.detect(domGlobals.navigator.userAgent, mediaMatch));\n    var detect$3 = function () {\n      return platform.get();\n    };\n\n    var Immutable = function () {\n      var fields = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        fields[_i] = arguments[_i];\n      }\n      return function () {\n        var values = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          values[_i] = arguments[_i];\n        }\n        if (fields.length !== values.length) {\n          throw new Error('Wrong number of arguments to struct. Expected \"[' + fields.length + ']\", got ' + values.length + ' arguments');\n        }\n        var struct = {};\n        each(fields, function (name, i) {\n          struct[name] = constant(values[i]);\n        });\n        return struct;\n      };\n    };\n\n    var compareDocumentPosition = function (a, b, match) {\n      return (a.compareDocumentPosition(b) & match) !== 0;\n    };\n    var documentPositionPreceding = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_PRECEDING);\n    };\n    var documentPositionContainedBy = function (a, b) {\n      return compareDocumentPosition(a, b, domGlobals.Node.DOCUMENT_POSITION_CONTAINED_BY);\n    };\n    var Node = {\n      documentPositionPreceding: documentPositionPreceding,\n      documentPositionContainedBy: documentPositionContainedBy\n    };\n\n    var ELEMENT$1 = ELEMENT;\n    var DOCUMENT$1 = DOCUMENT;\n    var is = function (element, selector) {\n      var dom = element.dom();\n      if (dom.nodeType !== ELEMENT$1) {\n        return false;\n      } else {\n        var elem = dom;\n        if (elem.matches !== undefined) {\n          return elem.matches(selector);\n        } else if (elem.msMatchesSelector !== undefined) {\n          return elem.msMatchesSelector(selector);\n        } else if (elem.webkitMatchesSelector !== undefined) {\n          return elem.webkitMatchesSelector(selector);\n        } else if (elem.mozMatchesSelector !== undefined) {\n          return elem.mozMatchesSelector(selector);\n        } else {\n          throw new Error('Browser lacks native selectors');\n        }\n      }\n    };\n    var bypassSelector = function (dom) {\n      return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0;\n    };\n    var all = function (selector, scope) {\n      var base = scope === undefined ? domGlobals.document : scope.dom();\n      return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom);\n    };\n\n    var eq = function (e1, e2) {\n      return e1.dom() === e2.dom();\n    };\n    var regularContains = function (e1, e2) {\n      var d1 = e1.dom();\n      var d2 = e2.dom();\n      return d1 === d2 ? false : d1.contains(d2);\n    };\n    var ieContains = function (e1, e2) {\n      return Node.documentPositionContainedBy(e1.dom(), e2.dom());\n    };\n    var browser = detect$3().browser;\n    var contains$1 = browser.isIE() ? ieContains : regularContains;\n\n    var parent = function (element) {\n      return Option.from(element.dom().parentNode).map(Element.fromDom);\n    };\n    var parents = function (element, isRoot) {\n      var stop = isFunction(isRoot) ? isRoot : never;\n      var dom = element.dom();\n      var ret = [];\n      while (dom.parentNode !== null && dom.parentNode !== undefined) {\n        var rawParent = dom.parentNode;\n        var p = Element.fromDom(rawParent);\n        ret.push(p);\n        if (stop(p) === true) {\n          break;\n        } else {\n          dom = rawParent;\n        }\n      }\n      return ret;\n    };\n    var siblings = function (element) {\n      var filterSelf = function (elements) {\n        return filter(elements, function (x) {\n          return !eq(element, x);\n        });\n      };\n      return parent(element).map(children).map(filterSelf).getOr([]);\n    };\n    var children = function (element) {\n      return map(element.dom().childNodes, Element.fromDom);\n    };\n    var spot = Immutable('element', 'offset');\n\n    var r = function (left, top) {\n      var translate = function (x, y) {\n        return r(left + x, top + y);\n      };\n      return {\n        left: constant(left),\n        top: constant(top),\n        translate: translate\n      };\n    };\n    var Position = r;\n\n    var isSafari = detect$3().browser.isSafari();\n    var get$3 = function (_DOC) {\n      var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document;\n      var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n      var y = doc.body.scrollTop || doc.documentElement.scrollTop;\n      return Position(x, y);\n    };\n\n    var get$4 = function (_win) {\n      var win = _win === undefined ? domGlobals.window : _win;\n      return Option.from(win['visualViewport']);\n    };\n    var bounds = function (x, y, width, height) {\n      return {\n        x: constant(x),\n        y: constant(y),\n        width: constant(width),\n        height: constant(height),\n        right: constant(x + width),\n        bottom: constant(y + height)\n      };\n    };\n    var getBounds = function (_win) {\n      var win = _win === undefined ? domGlobals.window : _win;\n      var doc = win.document;\n      var scroll = get$3(Element.fromDom(doc));\n      return get$4(win).fold(function () {\n        var html = win.document.documentElement;\n        var width = html.clientWidth;\n        var height = html.clientHeight;\n        return bounds(scroll.left(), scroll.top(), width, height);\n      }, function (visualViewport) {\n        return bounds(Math.max(visualViewport.pageLeft, scroll.left()), Math.max(visualViewport.pageTop, scroll.top()), visualViewport.width, visualViewport.height);\n      });\n    };\n    var bind$1 = function (name, callback, _win) {\n      return get$4(_win).map(function (visualViewport) {\n        var handler = function (e) {\n          return fromRawEvent(e);\n        };\n        visualViewport.addEventListener(name, handler);\n        return {\n          unbind: function () {\n            return visualViewport.removeEventListener(name, handler);\n          }\n        };\n      }).getOrThunk(function () {\n        return { unbind: noop };\n      });\n    };\n\n    var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n    var global$2 = tinymce.util.Tools.resolve('tinymce.Env');\n\n    var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n    var fireFullscreenStateChanged = function (editor, state) {\n      editor.fire('FullscreenStateChanged', { state: state });\n    };\n    var Events = { fireFullscreenStateChanged: fireFullscreenStateChanged };\n\n    var ancestors = function (scope, predicate, isRoot) {\n      return filter(parents(scope, isRoot), predicate);\n    };\n    var siblings$1 = function (scope, predicate) {\n      return filter(siblings(scope), predicate);\n    };\n\n    var all$1 = function (selector) {\n      return all(selector);\n    };\n    var ancestors$1 = function (scope, selector, isRoot) {\n      return ancestors(scope, function (e) {\n        return is(e, selector);\n      }, isRoot);\n    };\n    var siblings$2 = function (scope, selector) {\n      return siblings$1(scope, function (e) {\n        return is(e, selector);\n      });\n    };\n\n    var attr = 'data-ephox-mobile-fullscreen-style';\n    var siblingStyles = 'display:none!important;';\n    var ancestorPosition = 'position:absolute!important;';\n    var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;';\n    var bgFallback = 'background-color:rgb(255,255,255)!important;';\n    var isAndroid = global$2.os.isAndroid();\n    var matchColor = function (editorBody) {\n      var color = get$2(editorBody, 'background-color');\n      return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback;\n    };\n    var clobberStyles = function (dom, container, editorBody) {\n      var gatherSibilings = function (element) {\n        return siblings$2(element, '*:not(.tox-silver-sink)');\n      };\n      var clobber = function (clobberStyle) {\n        return function (element) {\n          var styles = get$1(element, 'style');\n          var backup = styles === undefined ? 'no-styles' : styles.trim();\n          if (backup === clobberStyle) {\n            return;\n          } else {\n            set(element, attr, backup);\n            setAll(element, dom.parseStyle(clobberStyle));\n          }\n        };\n      };\n      var ancestors = ancestors$1(container, '*');\n      var siblings = bind(ancestors, gatherSibilings);\n      var bgColor = matchColor(editorBody);\n      each(siblings, clobber(siblingStyles));\n      each(ancestors, clobber(ancestorPosition + ancestorStyles + bgColor));\n      var containerStyles = isAndroid === true ? '' : ancestorPosition;\n      clobber(containerStyles + ancestorStyles + bgColor)(container);\n    };\n    var restoreStyles = function (dom) {\n      var clobberedEls = all$1('[' + attr + ']');\n      each(clobberedEls, function (element) {\n        var restore = get$1(element, attr);\n        if (restore !== 'no-styles') {\n          setAll(element, dom.parseStyle(restore));\n        } else {\n          remove(element, 'style');\n        }\n        remove(element, attr);\n      });\n    };\n    var Thor = {\n      clobberStyles: clobberStyles,\n      restoreStyles: restoreStyles\n    };\n\n    var DOM = global$1.DOM;\n    var getScrollPos = function () {\n      var vp = getBounds(domGlobals.window);\n      return {\n        x: vp.x(),\n        y: vp.y()\n      };\n    };\n    var setScrollPos = function (pos) {\n      domGlobals.window.scrollTo(pos.x, pos.y);\n    };\n    var viewportUpdate = get$4().fold(function () {\n      return {\n        bind: noop,\n        unbind: noop\n      };\n    }, function (visualViewport) {\n      var editorContainer = value();\n      var resizeBinder = unbindable();\n      var scrollBinder = unbindable();\n      var refreshScroll = function () {\n        domGlobals.document.body.scrollTop = 0;\n        domGlobals.document.documentElement.scrollTop = 0;\n      };\n      var refreshVisualViewport = function () {\n        domGlobals.window.requestAnimationFrame(function () {\n          editorContainer.on(function (container) {\n            return setAll(container, {\n              top: visualViewport.offsetTop + 'px',\n              left: visualViewport.offsetLeft + 'px',\n              height: visualViewport.height + 'px',\n              width: visualViewport.width + 'px'\n            });\n          });\n        });\n      };\n      var update = global$3.throttle(function () {\n        refreshScroll();\n        refreshVisualViewport();\n      }, 50);\n      var bind = function (element) {\n        editorContainer.set(element);\n        update();\n        resizeBinder.set(bind$1('resize'));\n        scrollBinder.set(bind$1('scroll'));\n      };\n      var unbind = function () {\n        editorContainer.on(function () {\n          resizeBinder.clear();\n          scrollBinder.clear();\n        });\n        editorContainer.clear();\n      };\n      return {\n        bind: bind,\n        unbind: unbind\n      };\n    });\n    var toggleFullscreen = function (editor, fullscreenState) {\n      var body = domGlobals.document.body;\n      var documentElement = domGlobals.document.documentElement;\n      var editorContainerStyle;\n      var editorContainer, iframe, iframeStyle;\n      editorContainer = editor.getContainer();\n      var editorContainerS = Element.fromDom(editorContainer);\n      var fullscreenInfo = fullscreenState.get();\n      var editorBody = Element.fromDom(editor.getBody());\n      var isTouch = global$2.deviceType.isTouch();\n      editorContainerStyle = editorContainer.style;\n      iframe = editor.getContentAreaContainer().firstChild;\n      iframeStyle = iframe.style;\n      if (!fullscreenInfo) {\n        var newFullScreenInfo = {\n          scrollPos: getScrollPos(),\n          containerWidth: editorContainerStyle.width,\n          containerHeight: editorContainerStyle.height,\n          containerTop: editorContainerStyle.top,\n          containerLeft: editorContainerStyle.left,\n          iframeWidth: iframeStyle.width,\n          iframeHeight: iframeStyle.height\n        };\n        if (isTouch) {\n          Thor.clobberStyles(editor.dom, editorContainerS, editorBody);\n        }\n        iframeStyle.width = iframeStyle.height = '100%';\n        editorContainerStyle.width = editorContainerStyle.height = '';\n        DOM.addClass(body, 'tox-fullscreen');\n        DOM.addClass(documentElement, 'tox-fullscreen');\n        DOM.addClass(editorContainer, 'tox-fullscreen');\n        viewportUpdate.bind(editorContainerS);\n        editor.on('remove', viewportUpdate.unbind);\n        fullscreenState.set(newFullScreenInfo);\n        Events.fireFullscreenStateChanged(editor, true);\n      } else {\n        iframeStyle.width = fullscreenInfo.iframeWidth;\n        iframeStyle.height = fullscreenInfo.iframeHeight;\n        editorContainerStyle.width = fullscreenInfo.containerWidth;\n        editorContainerStyle.height = fullscreenInfo.containerHeight;\n        editorContainerStyle.top = fullscreenInfo.containerTop;\n        editorContainerStyle.left = fullscreenInfo.containerLeft;\n        if (isTouch) {\n          Thor.restoreStyles(editor.dom);\n        }\n        DOM.removeClass(body, 'tox-fullscreen');\n        DOM.removeClass(documentElement, 'tox-fullscreen');\n        DOM.removeClass(editorContainer, 'tox-fullscreen');\n        setScrollPos(fullscreenInfo.scrollPos);\n        fullscreenState.set(null);\n        Events.fireFullscreenStateChanged(editor, false);\n        viewportUpdate.unbind();\n        editor.off('remove', viewportUpdate.unbind);\n      }\n    };\n    var Actions = { toggleFullscreen: toggleFullscreen };\n\n    var register = function (editor, fullscreenState) {\n      editor.addCommand('mceFullScreen', function () {\n        Actions.toggleFullscreen(editor, fullscreenState);\n      });\n    };\n    var Commands = { register: register };\n\n    var makeSetupHandler = function (editor, fullscreenState) {\n      return function (api) {\n        api.setActive(fullscreenState.get() !== null);\n        var editorEventCallback = function (e) {\n          return api.setActive(e.state);\n        };\n        editor.on('FullscreenStateChanged', editorEventCallback);\n        return function () {\n          return editor.off('FullscreenStateChanged', editorEventCallback);\n        };\n      };\n    };\n    var register$1 = function (editor, fullscreenState) {\n      editor.ui.registry.addToggleMenuItem('fullscreen', {\n        text: 'Fullscreen',\n        shortcut: 'Meta+Shift+F',\n        onAction: function () {\n          return editor.execCommand('mceFullScreen');\n        },\n        onSetup: makeSetupHandler(editor, fullscreenState)\n      });\n      editor.ui.registry.addToggleButton('fullscreen', {\n        tooltip: 'Fullscreen',\n        icon: 'fullscreen',\n        onAction: function () {\n          return editor.execCommand('mceFullScreen');\n        },\n        onSetup: makeSetupHandler(editor, fullscreenState)\n      });\n    };\n    var Buttons = { register: register$1 };\n\n    function Plugin () {\n      global.add('fullscreen', function (editor) {\n        var fullscreenState = Cell(null);\n        if (editor.settings.inline) {\n          return Api.get(fullscreenState);\n        }\n        Commands.register(editor, fullscreenState);\n        Buttons.register(editor, fullscreenState);\n        editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen');\n        return Api.get(fullscreenState);\n      });\n    }\n\n    Plugin();\n\n}(window));\n"],"sourceRoot":""}