(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[0],{ /***/ "./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/ScriptLoader.js": /*!**********************************************************************************************************!*\ !*** ./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/ScriptLoader.js ***! \**********************************************************************************************************/ /*! exports provided: ScriptLoader */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ScriptLoader\", function() { return ScriptLoader; });\n/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils */ \"./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js\");\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 */\n\nvar createState = function () {\n return {\n listeners: [],\n scriptId: Object(_Utils__WEBPACK_IMPORTED_MODULE_0__[\"uuid\"])('tiny-script'),\n scriptLoaded: false\n };\n};\nvar CreateScriptLoader = function () {\n var state = createState();\n var 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.src = url;\n var handler = function () {\n scriptTag.removeEventListener('load', handler);\n callback();\n };\n scriptTag.addEventListener('load', handler);\n if (doc.head) {\n doc.head.appendChild(scriptTag);\n }\n };\n var load = function (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 // Only to be used by tests.\n var reinitialize = function () {\n state = createState();\n };\n return {\n load: load,\n reinitialize: reinitialize\n };\n};\nvar ScriptLoader = CreateScriptLoader();\n\n\n\n//# sourceURL=webpack:///./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/ScriptLoader.js?"); /***/ }), /***/ "./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/TinyMCE.js": /*!*****************************************************************************************************!*\ !*** ./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/TinyMCE.js ***! \*****************************************************************************************************/ /*! exports provided: getTinymce */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getTinymce\", function() { return getTinymce; });\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};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../../_webpack@4.47.0@webpack/buildin/global.js */ \"./node_modules/_webpack@4.47.0@webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/TinyMCE.js?"); /***/ }), /***/ "./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js": /*!***************************************************************************************************!*\ !*** ./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js ***! \***************************************************************************************************/ /*! exports provided: bindHandlers, bindModelHandlers, initEditor, isValidKey, uuid, isTextarea, mergePlugins, isNullOrUndefined */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bindHandlers\", function() { return bindHandlers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bindModelHandlers\", function() { return bindModelHandlers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"initEditor\", function() { return initEditor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isValidKey\", function() { return isValidKey; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"uuid\", function() { return uuid; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isTextarea\", function() { return isTextarea; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mergePlugins\", function() { return mergePlugins; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNullOrUndefined\", function() { return isNullOrUndefined; });\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 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.map(function (event) { return event.toLowerCase(); }).indexOf(key.toLowerCase()) !== -1; };\nvar 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};\nvar bindModelHandlers = function (ctx, editor) {\n var modelEvents = ctx.$props.modelEvents ? ctx.$props.modelEvents : null;\n var normalizedEvents = Array.isArray(modelEvents) ? modelEvents.join(' ') : modelEvents;\n editor.on(normalizedEvents ? normalizedEvents : 'change input undo redo', function () {\n ctx.$emit('input', editor.getContent({ format: ctx.$props.outputFormat }));\n });\n};\nvar 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 || (ctx.initialized ? ctx.cache : initialValue));\n // Always bind the value listener in case users use :value instead of v-model\n ctx.$watch('value', function (val, prevVal) {\n if (editor && typeof val === 'string' && val !== prevVal && val !== editor.getContent({ format: ctx.$props.outputFormat })) {\n editor.setContent(val);\n }\n });\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 ctx.initialized = true;\n};\nvar unique = 0;\nvar 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};\nvar 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};\nvar mergePlugins = function (initPlugins, inputPlugins) {\n return normalizePluginArray(initPlugins).concat(normalizePluginArray(inputPlugins));\n};\nvar isNullOrUndefined = function (value) { return value === null || value === undefined; };\n\n\n\n//# sourceURL=webpack:///./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js?"); /***/ }), /***/ "./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js": /*!***************************************************************************************************************!*\ !*** ./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js ***! \***************************************************************************************************************/ /*! exports provided: Editor */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Editor\", function() { return Editor; });\n/* harmony import */ var _ScriptLoader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ScriptLoader */ \"./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/ScriptLoader.js\");\n/* harmony import */ var _TinyMCE__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../TinyMCE */ \"./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/TinyMCE.js\");\n/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Utils */ \"./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js\");\n/* harmony import */ var _EditorPropTypes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EditorPropTypes */ \"./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/components/EditorPropTypes.js\");\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 = (undefined && undefined.__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};\n\n\n\n\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(__assign({}, ctx.$props.init), { readonly: ctx.$props.disabled, selector: \"#\" + ctx.elementId, plugins: Object(_Utils__WEBPACK_IMPORTED_MODULE_2__[\"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 Object(_Utils__WEBPACK_IMPORTED_MODULE_2__[\"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 (Object(_Utils__WEBPACK_IMPORTED_MODULE_2__[\"isTextarea\"])(ctx.element)) {\n ctx.element.style.visibility = '';\n ctx.element.style.display = '';\n }\n Object(_TinyMCE__WEBPACK_IMPORTED_MODULE_1__[\"getTinymce\"])().init(finalInit);\n}; };\nvar Editor = {\n props: _EditorPropTypes__WEBPACK_IMPORTED_MODULE_3__[\"editorProps\"],\n created: function () {\n this.elementId = this.$props.id || Object(_Utils__WEBPACK_IMPORTED_MODULE_2__[\"uuid\"])('tiny-vue');\n this.inlineEditor = (this.$props.init && this.$props.init.inline) || this.$props.inline;\n this.initialized = false;\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 (Object(_TinyMCE__WEBPACK_IMPORTED_MODULE_1__[\"getTinymce\"])() !== null) {\n initialise(this)();\n }\n else if (this.element && 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 var scriptSrc = Object(_Utils__WEBPACK_IMPORTED_MODULE_2__[\"isNullOrUndefined\"])(this.$props.tinymceScriptSrc) ?\n \"https://cdn.tiny.cloud/1/\" + apiKey + \"/tinymce/\" + channel + \"/tinymce.min.js\" :\n this.$props.tinymceScriptSrc;\n _ScriptLoader__WEBPACK_IMPORTED_MODULE_0__[\"ScriptLoader\"].load(this.element.ownerDocument, scriptSrc, initialise(this));\n }\n },\n beforeDestroy: function () {\n if (Object(_TinyMCE__WEBPACK_IMPORTED_MODULE_1__[\"getTinymce\"])() !== null) {\n Object(_TinyMCE__WEBPACK_IMPORTED_MODULE_1__[\"getTinymce\"])().remove(this.editor);\n }\n },\n deactivated: function () {\n var _a;\n if (!this.inlineEditor) {\n this.cache = this.editor.getContent();\n (_a = Object(_TinyMCE__WEBPACK_IMPORTED_MODULE_1__[\"getTinymce\"])()) === null || _a === void 0 ? void 0 : _a.remove(this.editor);\n }\n },\n activated: function () {\n if (!this.inlineEditor && this.initialized) {\n initialise(this)();\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\n//# sourceURL=webpack:///./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js?"); /***/ }), /***/ "./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/components/EditorPropTypes.js": /*!************************************************************************************************************************!*\ !*** ./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/components/EditorPropTypes.js ***! \************************************************************************************************************************/ /*! exports provided: editorProps */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"editorProps\", function() { return editorProps; });\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 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 tinymceScriptSrc: String,\n outputFormat: {\n type: String,\n validator: function (prop) { return prop === 'html' || prop === 'text'; }\n },\n};\n\n\n//# sourceURL=webpack:///./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/components/EditorPropTypes.js?"); /***/ }), /***/ "./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/index.js": /*!***************************************************************************************************!*\ !*** ./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/index.js ***! \***************************************************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _components_Editor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/Editor */ \"./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js\");\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 */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_components_Editor__WEBPACK_IMPORTED_MODULE_0__[\"Editor\"]);\n\n\n//# sourceURL=webpack:///./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/index.js?"); /***/ }), /***/ "./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.4.1@babel-loader/lib/index.js!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.11.1@vue-loader/lib/index.js?!./src/components/TinymceEditor/index.vue?vue&type=script&lang=js": /*!***********************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/TinymceEditor/index.vue?vue&type=script&lang=js ***! \***********************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var tinymce_tinymce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tinymce/tinymce */ \"./node_modules/_tinymce@5.10.9@tinymce/tinymce.js\");\n/* harmony import */ var tinymce_tinymce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(tinymce_tinymce__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _tinymce_tinymce_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tinymce/tinymce-vue */ \"./node_modules/_@tinymce_tinymce-vue@3.2.8@@tinymce/tinymce-vue/lib/es2015/main/ts/index.js\");\n/* harmony import */ var tinymce_icons_default__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinymce/icons/default */ \"./node_modules/_tinymce@5.10.9@tinymce/icons/default/index.js\");\n/* harmony import */ var tinymce_icons_default__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinymce_icons_default__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var tinymce_themes_silver__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tinymce/themes/silver */ \"./node_modules/_tinymce@5.10.9@tinymce/themes/silver/index.js\");\n/* harmony import */ var tinymce_themes_silver__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(tinymce_themes_silver__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var tinymce_plugins_code__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tinymce/plugins/code */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/code/index.js\");\n/* harmony import */ var tinymce_plugins_code__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_code__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var tinymce_plugins_print__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! tinymce/plugins/print */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/print/index.js\");\n/* harmony import */ var tinymce_plugins_print__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_print__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var tinymce_plugins_preview__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! tinymce/plugins/preview */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/preview/index.js\");\n/* harmony import */ var tinymce_plugins_preview__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_preview__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var tinymce_plugins_fullscreen__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! tinymce/plugins/fullscreen */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/fullscreen/index.js\");\n/* harmony import */ var tinymce_plugins_fullscreen__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_fullscreen__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var tinymce_plugins_paste__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! tinymce/plugins/paste */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/paste/index.js\");\n/* harmony import */ var tinymce_plugins_paste__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_paste__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var tinymce_plugins_searchreplace__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! tinymce/plugins/searchreplace */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/searchreplace/index.js\");\n/* harmony import */ var tinymce_plugins_searchreplace__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_searchreplace__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var tinymce_plugins_save__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! tinymce/plugins/save */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/save/index.js\");\n/* harmony import */ var tinymce_plugins_save__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_save__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var tinymce_plugins_autosave__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! tinymce/plugins/autosave */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/autosave/index.js\");\n/* harmony import */ var tinymce_plugins_autosave__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_autosave__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var tinymce_plugins_link__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! tinymce/plugins/link */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/link/index.js\");\n/* harmony import */ var tinymce_plugins_link__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_link__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var tinymce_plugins_autolink__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! tinymce/plugins/autolink */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/autolink/index.js\");\n/* harmony import */ var tinymce_plugins_autolink__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_autolink__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var tinymce_plugins_image__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! tinymce/plugins/image */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/image/index.js\");\n/* harmony import */ var tinymce_plugins_image__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_image__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var tinymce_plugins_imagetools__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! tinymce/plugins/imagetools */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/imagetools/index.js\");\n/* harmony import */ var tinymce_plugins_imagetools__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_imagetools__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var tinymce_plugins_media__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! tinymce/plugins/media */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/media/index.js\");\n/* harmony import */ var tinymce_plugins_media__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_media__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var tinymce_plugins_table__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! tinymce/plugins/table */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/table/index.js\");\n/* harmony import */ var tinymce_plugins_table__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_table__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var tinymce_plugins_codesample__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! tinymce/plugins/codesample */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/codesample/index.js\");\n/* harmony import */ var tinymce_plugins_codesample__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_codesample__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var tinymce_plugins_lists__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! tinymce/plugins/lists */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/lists/index.js\");\n/* harmony import */ var tinymce_plugins_lists__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_lists__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var tinymce_plugins_advlist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! tinymce/plugins/advlist */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/advlist/index.js\");\n/* harmony import */ var tinymce_plugins_advlist__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_advlist__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var tinymce_plugins_hr__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! tinymce/plugins/hr */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/hr/index.js\");\n/* harmony import */ var tinymce_plugins_hr__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_hr__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var tinymce_plugins_charmap__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! tinymce/plugins/charmap */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/charmap/index.js\");\n/* harmony import */ var tinymce_plugins_charmap__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_charmap__WEBPACK_IMPORTED_MODULE_22__);\n/* harmony import */ var tinymce_plugins_emoticons__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! tinymce/plugins/emoticons */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/index.js\");\n/* harmony import */ var tinymce_plugins_emoticons__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_emoticons__WEBPACK_IMPORTED_MODULE_23__);\n/* harmony import */ var tinymce_plugins_anchor__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! tinymce/plugins/anchor */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/anchor/index.js\");\n/* harmony import */ var tinymce_plugins_anchor__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_anchor__WEBPACK_IMPORTED_MODULE_24__);\n/* harmony import */ var tinymce_plugins_directionality__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! tinymce/plugins/directionality */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/directionality/index.js\");\n/* harmony import */ var tinymce_plugins_directionality__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_directionality__WEBPACK_IMPORTED_MODULE_25__);\n/* harmony import */ var tinymce_plugins_pagebreak__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! tinymce/plugins/pagebreak */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/pagebreak/index.js\");\n/* harmony import */ var tinymce_plugins_pagebreak__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_pagebreak__WEBPACK_IMPORTED_MODULE_26__);\n/* harmony import */ var tinymce_plugins_quickbars__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! tinymce/plugins/quickbars */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/quickbars/index.js\");\n/* harmony import */ var tinymce_plugins_quickbars__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_quickbars__WEBPACK_IMPORTED_MODULE_27__);\n/* harmony import */ var tinymce_plugins_nonbreaking__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! tinymce/plugins/nonbreaking */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/nonbreaking/index.js\");\n/* harmony import */ var tinymce_plugins_nonbreaking__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_nonbreaking__WEBPACK_IMPORTED_MODULE_28__);\n/* harmony import */ var tinymce_plugins_visualblocks__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! tinymce/plugins/visualblocks */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/visualblocks/index.js\");\n/* harmony import */ var tinymce_plugins_visualblocks__WEBPACK_IMPORTED_MODULE_29___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_visualblocks__WEBPACK_IMPORTED_MODULE_29__);\n/* harmony import */ var tinymce_plugins_visualchars__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! tinymce/plugins/visualchars */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/visualchars/index.js\");\n/* harmony import */ var tinymce_plugins_visualchars__WEBPACK_IMPORTED_MODULE_30___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_visualchars__WEBPACK_IMPORTED_MODULE_30__);\n/* harmony import */ var tinymce_plugins_wordcount__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! tinymce/plugins/wordcount */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/wordcount/index.js\");\n/* harmony import */ var tinymce_plugins_wordcount__WEBPACK_IMPORTED_MODULE_31___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_wordcount__WEBPACK_IMPORTED_MODULE_31__);\n/* harmony import */ var tinymce_plugins_emoticons_js_emojis__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! tinymce/plugins/emoticons/js/emojis */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/js/emojis.js\");\n/* harmony import */ var tinymce_plugins_emoticons_js_emojis__WEBPACK_IMPORTED_MODULE_32___default = /*#__PURE__*/__webpack_require__.n(tinymce_plugins_emoticons_js_emojis__WEBPACK_IMPORTED_MODULE_32__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! axios */ \"./node_modules/_axios@0.19.2@axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_33___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_33__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"TinymceEditor\",\n components: {\n Editor: _tinymce_tinymce_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n },\n model: {\n prop: 'value',\n event: 'change'\n },\n props: {\n value: String,\n init: Object,\n disabled: Boolean\n },\n data() {\n return {\n content: '',\n config: Object.assign({\n height: 300,\n branding: false,\n skin_url: '/tinymce/skins/ui/oxide',\n content_css: '/tinymce/skins/content/default/content.css',\n language_url: '/tinymce/langs/zh_CN.js',\n language: 'zh_CN',\n plugins: 'code print preview fullscreen paste searchreplace save autosave link autolink image imagetools media table codesample lists advlist hr charmap emoticons anchor directionality pagebreak quickbars nonbreaking visualblocks visualchars wordcount',\n toolbar: 'styleselect fullscreen preview code | undo redo | forecolor backcolor | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | formatselect fontselect fontsizeselect | link image media emoticons charmap anchor pagebreak codesample | ltr rtl',\n toolbar_drawer: 'sliding',\n // 配置样式格式,包括行高\n style_formats: [{\n title: '行高',\n items: [{\n title: '0.75',\n block: 'p',\n styles: {\n 'line-height': '0.75'\n }\n }, {\n title: '1.0',\n block: 'p',\n styles: {\n 'line-height': '1'\n }\n }, {\n title: '1.5',\n block: 'p',\n styles: {\n 'line-height': '1.5'\n }\n }, {\n title: '2.0',\n block: 'p',\n styles: {\n 'line-height': '2'\n }\n }, {\n title: '2.5',\n block: 'p',\n styles: {\n 'line-height': '2.5'\n }\n }, {\n title: '3.0',\n block: 'p',\n styles: {\n 'line-height': '3'\n }\n }]\n }],\n images_upload_handler: (blobInfo, success) => {\n axios__WEBPACK_IMPORTED_MODULE_33___default()({\n method: \"POST\",\n url: '/upload/uploadBase64',\n data: {\n base64: blobInfo.base64()\n },\n timeout: 1000000\n }).then(res => {\n let result = res.data;\n console.log(result);\n if (result.success == true) {\n success(result.data.url);\n } else {\n this.$message.error(result.message);\n }\n }).catch(e => {\n this.$message.error(e.message);\n console.log(e.message);\n // this.$message.error(e.message);\n });\n console.log(blobInfo);\n // success('data:image/jpeg;base64,' + blobInfo.base64());\n },\n file_picker_types: 'media',\n file_picker_callback: () => {}\n }, this.init)\n };\n },\n mounted() {\n let _this = this;\n tinymce_tinymce__WEBPACK_IMPORTED_MODULE_0___default.a.init({});\n setTimeout(function () {\n _this.content = _this.value;\n }, 500);\n },\n watch: {\n content() {\n this.$emit('change', this.content);\n },\n value() {\n this.content = this.value;\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/TinymceEditor/index.vue?./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options"); /***/ }), /***/ "./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"a00eae3e-vue-loader-template\"}!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.4.1@babel-loader/lib/index.js!./node_modules/_vue-loader@15.11.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.11.1@vue-loader/lib/index.js?!./src/components/TinymceEditor/index.vue?vue&type=template&id=0a6c405f": /*!**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"a00eae3e-vue-loader-template"}!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_vue-loader@15.11.1@vue-loader/lib/loaders/templateLoader.js??ref--6!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/TinymceEditor/index.vue?vue&type=template&id=0a6c405f ***! \**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /*! exports provided: render, staticRenderFns */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"editor\", {\n attrs: {\n init: _vm.config,\n disabled: _vm.disabled\n },\n model: {\n value: _vm.content,\n callback: function ($$v) {\n _vm.content = $$v;\n },\n expression: \"content\"\n }\n });\n};\nvar staticRenderFns = [];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack:///./src/components/TinymceEditor/index.vue?./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22a00eae3e-vue-loader-template%22%7D!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.4.1@babel-loader/lib!./node_modules/_vue-loader@15.11.1@vue-loader/lib/loaders/templateLoader.js??ref--6!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options"); /***/ }), /***/ "./node_modules/_css-loader@3.6.0@css-loader/dist/cjs.js?!./node_modules/_vue-loader@15.11.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.11.1@vue-loader/lib/index.js?!./src/components/TinymceEditor/index.vue?vue&type=style&index=0&id=0a6c405f&lang=css": /*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/_css-loader@3.6.0@css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/_vue-loader@15.11.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-1-2!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options!./src/components/TinymceEditor/index.vue?vue&type=style&index=0&id=0a6c405f&lang=css ***! \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/_css-loader@3.6.0@css-loader/dist/runtime/api.js */ \"./node_modules/_css-loader@3.6.0@css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\nbody .tox-tinymce-aux {\\r\\n z-index: 19892000;\\n}\\r\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/TinymceEditor/index.vue?./node_modules/_css-loader@3.6.0@css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/_vue-loader@15.11.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-1-2!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.11.1@vue-loader/lib??vue-loader-options"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/icons/default/icons.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/icons/default/icons.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("tinymce.IconManager.add('default', {\n icons: {\n 'accessibility-check': '',\n 'action-next': '',\n 'action-prev': '',\n 'align-center': '',\n 'align-justify': '',\n 'align-left': '',\n 'align-none': '',\n 'align-right': '',\n 'arrow-left': '',\n 'arrow-right': '',\n 'bold': '',\n 'bookmark': '',\n 'border-style': '',\n 'border-width': '',\n 'brightness': '',\n 'browse': '',\n 'cancel': '',\n 'cell-background-color': '',\n 'cell-border-color': '',\n 'change-case': '',\n 'character-count': '',\n 'checklist-rtl': '',\n 'checklist': '',\n 'checkmark': '',\n 'chevron-down': '',\n 'chevron-left': '',\n 'chevron-right': '',\n 'chevron-up': '',\n 'close': '',\n 'code-sample': '',\n 'color-levels': '',\n 'color-picker': '',\n 'color-swatch-remove-color': '',\n 'color-swatch': '',\n 'comment-add': '',\n 'comment': '',\n 'contrast': '',\n 'copy': '',\n 'crop': '',\n 'cut-column': '',\n 'cut-row': '',\n 'cut': '',\n 'document-properties': '',\n 'drag': '',\n 'duplicate-column': '',\n 'duplicate-row': '',\n 'duplicate': '',\n 'edit-block': '',\n 'edit-image': '',\n 'embed-page': '',\n 'embed': '',\n 'emoji': '',\n 'export': '',\n 'fill': '',\n 'flip-horizontally': '',\n 'flip-vertically': '',\n 'format-painter': '',\n 'format': '',\n 'fullscreen': '',\n 'gallery': '',\n 'gamma': '',\n 'help': '',\n 'highlight-bg-color': '',\n 'home': '',\n 'horizontal-rule': '',\n 'image-options': '',\n 'image': '',\n 'indent': '',\n 'info': '',\n 'insert-character': '',\n 'insert-time': '',\n 'invert': '',\n 'italic': '',\n 'language': '',\n 'line-height': '',\n 'line': '',\n 'link': '',\n 'list-bull-circle': '',\n 'list-bull-default': '',\n 'list-bull-square': '',\n 'list-num-default-rtl': '',\n 'list-num-default': '',\n 'list-num-lower-alpha-rtl': '',\n 'list-num-lower-alpha': '',\n 'list-num-lower-greek-rtl': '',\n 'list-num-lower-greek': '',\n 'list-num-lower-roman-rtl': '',\n 'list-num-lower-roman': '',\n 'list-num-upper-alpha-rtl': '',\n 'list-num-upper-alpha': '',\n 'list-num-upper-roman-rtl': '',\n 'list-num-upper-roman': '',\n 'lock': '',\n 'ltr': '',\n 'more-drawer': '',\n 'new-document': '',\n 'new-tab': '',\n 'non-breaking': '',\n 'notice': '',\n 'ordered-list-rtl': '',\n 'ordered-list': '',\n 'orientation': '',\n 'outdent': '',\n 'page-break': '',\n 'paragraph': '',\n 'paste-column-after': '',\n 'paste-column-before': '',\n 'paste-row-after': '',\n 'paste-row-before': '',\n 'paste-text': '',\n 'paste': '',\n 'permanent-pen': '',\n 'plus': '',\n 'preferences': '',\n 'preview': '',\n 'print': '',\n 'quote': '',\n 'redo': '',\n 'reload': '',\n 'remove-formatting': '',\n 'remove': '',\n 'resize-handle': '',\n 'resize': '',\n 'restore-draft': '',\n 'rotate-left': '',\n 'rotate-right': '',\n 'rtl': '',\n 'save': '',\n 'search': '',\n 'select-all': '',\n 'selected': '',\n 'settings': '',\n 'sharpen': '',\n 'sourcecode': '',\n 'spell-check': '',\n 'strike-through': '',\n 'subscript': '',\n 'superscript': '',\n 'table-caption': '',\n 'table-cell-classes': '',\n 'table-cell-properties': '',\n 'table-cell-select-all': '',\n 'table-cell-select-inner': '',\n 'table-classes': '',\n 'table-delete-column': '',\n 'table-delete-row': '',\n 'table-delete-table': '',\n 'table-insert-column-after': '',\n 'table-insert-column-before': '',\n 'table-insert-row-above': '',\n 'table-insert-row-after': '',\n 'table-left-header': '',\n 'table-merge-cells': '',\n 'table-row-numbering-rtl': '',\n 'table-row-numbering': '',\n 'table-row-properties': '',\n 'table-split-cells': '',\n 'table-top-header': '',\n 'table': '',\n 'template': '',\n 'temporary-placeholder': '',\n 'text-color': '',\n 'toc': '',\n 'translate': '',\n 'underline': '',\n 'undo': '',\n 'unlink': '',\n 'unlock': '',\n 'unordered-list': '',\n 'unselected': '',\n 'upload': '',\n 'user': '',\n 'vertical-align': '',\n 'visualblocks': '',\n 'visualchars': '',\n 'warning': '',\n 'zoom-in': '',\n 'zoom-out': '',\n }\n});\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/icons/default/icons.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/icons/default/index.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/icons/default/index.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"default\" icons for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/icons/default')\n// ES2015:\n// import 'tinymce/icons/default'\n__webpack_require__(/*! ./icons.js */ \"./node_modules/_tinymce@5.10.9@tinymce/icons/default/icons.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/icons/default/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/advlist/index.js": /*!***********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/advlist/index.js ***! \***********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"advlist\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/advlist')\n// ES2015:\n// import 'tinymce/plugins/advlist'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/advlist/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/advlist/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/advlist/plugin.js": /*!************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/advlist/plugin.js ***! \************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var applyListFormat = function (editor, listName, styleValue) {\n var cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList';\n editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue });\n };\n\n var register$1 = function (editor) {\n editor.addCommand('ApplyUnorderedListStyle', function (ui, value) {\n applyListFormat(editor, 'UL', value['list-style-type']);\n });\n editor.addCommand('ApplyOrderedListStyle', function (ui, value) {\n applyListFormat(editor, 'OL', value['list-style-type']);\n });\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var getNumberStyles = function (editor) {\n var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman');\n return styles ? styles.split(/[ ,]/) : [];\n };\n var getBulletStyles = function (editor) {\n var styles = editor.getParam('advlist_bullet_styles', 'default,circle,square');\n return styles ? styles.split(/[ ,]/) : [];\n };\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\n\n var isChildOfBody = function (editor, elm) {\n return editor.$.contains(editor.getBody(), elm);\n };\n var isTableCellNode = function (node) {\n return node && /^(TH|TD)$/.test(node.nodeName);\n };\n var isListNode = function (editor) {\n return function (node) {\n return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node);\n };\n };\n var getSelectedStyleType = function (editor) {\n var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul');\n var style = editor.dom.getStyle(listElm, 'listStyleType');\n return Optional.from(style);\n };\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 styleValueToText = function (styleValue) {\n return styleValue.replace(/\\-/g, ' ').replace(/\\b\\w/g, function (chr) {\n return chr.toUpperCase();\n });\n };\n var isWithinList = function (editor, e, nodeName) {\n var tableCellIndex = findIndex(e.parents, isTableCellNode);\n var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents;\n var lists = global.grep(parents, isListNode(editor));\n return lists.length > 0 && lists[0].nodeName === nodeName;\n };\n var makeSetupHandler = function (editor, nodeName) {\n return function (api) {\n var nodeChangeHandler = function (e) {\n api.setActive(isWithinList(editor, e, nodeName));\n };\n editor.on('NodeChange', nodeChangeHandler);\n return function () {\n return editor.off('NodeChange', nodeChangeHandler);\n };\n };\n };\n var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) {\n editor.ui.registry.addSplitButton(id, {\n tooltip: tooltip,\n icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list',\n presets: 'listpreview',\n columns: 3,\n fetch: function (callback) {\n var items = global.map(styles, function (styleValue) {\n var iconStyle = nodeName === 'OL' ? 'num' : 'bull';\n var iconName = styleValue === 'disc' || styleValue === 'decimal' ? 'default' : styleValue;\n var itemValue = styleValue === 'default' ? '' : styleValue;\n var displayText = styleValueToText(styleValue);\n return {\n type: 'choiceitem',\n value: itemValue,\n icon: 'list-' + iconStyle + '-' + iconName,\n text: displayText\n };\n });\n callback(items);\n },\n onAction: function () {\n return editor.execCommand(cmd);\n },\n onItemAction: function (_splitButtonApi, value) {\n applyListFormat(editor, nodeName, value);\n },\n select: function (value) {\n var listStyleType = getSelectedStyleType(editor);\n return listStyleType.map(function (listStyle) {\n return value === listStyle;\n }).getOr(false);\n },\n onSetup: makeSetupHandler(editor, nodeName)\n });\n };\n var addButton = function (editor, id, tooltip, cmd, nodeName, _styles) {\n editor.ui.registry.addToggleButton(id, {\n active: false,\n tooltip: tooltip,\n icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list',\n onSetup: makeSetupHandler(editor, nodeName),\n onAction: function () {\n return editor.execCommand(cmd);\n }\n });\n };\n var addControl = function (editor, id, tooltip, cmd, nodeName, styles) {\n if (styles.length > 1) {\n addSplitButton(editor, id, tooltip, cmd, nodeName, styles);\n } else {\n addButton(editor, id, tooltip, cmd, nodeName);\n }\n };\n var register = function (editor) {\n addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', getNumberStyles(editor));\n addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', getBulletStyles(editor));\n };\n\n function Plugin () {\n global$1.add('advlist', function (editor) {\n if (editor.hasPlugin('lists')) {\n register(editor);\n register$1(editor);\n } else {\n console.error('Please use the Lists plugin together with the Advanced List plugin.');\n }\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/advlist/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/anchor/index.js": /*!**********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/anchor/index.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"anchor\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/anchor')\n// ES2015:\n// import 'tinymce/plugins/anchor'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/anchor/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/anchor/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/anchor/plugin.js": /*!***********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/anchor/plugin.js ***! \***********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils');\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var allowHtmlInNamedAnchor = function (editor) {\n return editor.getParam('allow_html_in_named_anchor', false, 'boolean');\n };\n\n var namedAnchorSelector = 'a:not([href])';\n var isEmptyString = function (str) {\n return !str;\n };\n var getIdFromAnchor = function (elm) {\n var id = elm.getAttribute('id') || elm.getAttribute('name');\n return id || '';\n };\n var isAnchor = function (elm) {\n return elm && elm.nodeName.toLowerCase() === 'a';\n };\n var isNamedAnchor = function (elm) {\n return isAnchor(elm) && !elm.getAttribute('href') && getIdFromAnchor(elm) !== '';\n };\n var isEmptyNamedAnchor = function (elm) {\n return isNamedAnchor(elm) && !elm.firstChild;\n };\n\n var removeEmptyNamedAnchorsInSelection = function (editor) {\n var dom = editor.dom;\n global$1(dom).walk(editor.selection.getRng(), function (nodes) {\n global.each(nodes, function (node) {\n if (isEmptyNamedAnchor(node)) {\n dom.remove(node, false);\n }\n });\n });\n };\n var isValidId = function (id) {\n return /^[A-Za-z][A-Za-z0-9\\-:._]*$/.test(id);\n };\n var getNamedAnchor = function (editor) {\n return editor.dom.getParent(editor.selection.getStart(), namedAnchorSelector);\n };\n var getId = function (editor) {\n var anchor = getNamedAnchor(editor);\n if (anchor) {\n return getIdFromAnchor(anchor);\n } else {\n return '';\n }\n };\n var createAnchor = function (editor, id) {\n editor.undoManager.transact(function () {\n if (!allowHtmlInNamedAnchor(editor)) {\n editor.selection.collapse(true);\n }\n if (editor.selection.isCollapsed()) {\n editor.insertContent(editor.dom.createHTML('a', { id: id }));\n } else {\n removeEmptyNamedAnchorsInSelection(editor);\n editor.formatter.remove('namedAnchor', null, null, true);\n editor.formatter.apply('namedAnchor', { value: id });\n editor.addVisual();\n }\n });\n };\n var updateAnchor = function (editor, id, anchorElement) {\n anchorElement.removeAttribute('name');\n anchorElement.id = id;\n editor.addVisual();\n editor.undoManager.add();\n };\n var insert = function (editor, id) {\n var anchor = getNamedAnchor(editor);\n if (anchor) {\n updateAnchor(editor, id, anchor);\n } else {\n createAnchor(editor, id);\n }\n editor.focus();\n };\n\n var insertAnchor = function (editor, newId) {\n if (!isValidId(newId)) {\n editor.windowManager.alert('Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.');\n return false;\n } else {\n insert(editor, newId);\n return true;\n }\n };\n var open = function (editor) {\n var currentId = getId(editor);\n editor.windowManager.open({\n title: 'Anchor',\n size: 'normal',\n body: {\n type: 'panel',\n items: [{\n name: 'id',\n type: 'input',\n label: 'ID',\n placeholder: 'example'\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: { id: currentId },\n onSubmit: function (api) {\n if (insertAnchor(editor, api.getData().id)) {\n api.close();\n }\n }\n });\n };\n\n var register$1 = function (editor) {\n editor.addCommand('mceAnchor', function () {\n open(editor);\n });\n };\n\n var isNamedAnchorNode = function (node) {\n return node && isEmptyString(node.attr('href')) && !isEmptyString(node.attr('id') || node.attr('name'));\n };\n var isEmptyNamedAnchorNode = function (node) {\n return isNamedAnchorNode(node) && !node.firstChild;\n };\n var setContentEditable = function (state) {\n return function (nodes) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n if (isEmptyNamedAnchorNode(node)) {\n node.attr('contenteditable', state);\n }\n }\n };\n };\n var setup = function (editor) {\n editor.on('PreInit', function () {\n editor.parser.addNodeFilter('a', setContentEditable('false'));\n editor.serializer.addNodeFilter('a', setContentEditable(null));\n });\n };\n\n var registerFormats = function (editor) {\n editor.formatter.register('namedAnchor', {\n inline: 'a',\n selector: namedAnchorSelector,\n remove: 'all',\n split: true,\n deep: true,\n attributes: { id: '%value' },\n onmatch: function (node, _fmt, _itemName) {\n return isNamedAnchor(node);\n }\n });\n };\n\n var register = function (editor) {\n editor.ui.registry.addToggleButton('anchor', {\n icon: 'bookmark',\n tooltip: 'Anchor',\n onAction: function () {\n return editor.execCommand('mceAnchor');\n },\n onSetup: function (buttonApi) {\n return editor.selection.selectorChangedWithUnbind('a:not([href])', buttonApi.setActive).unbind;\n }\n });\n editor.ui.registry.addMenuItem('anchor', {\n icon: 'bookmark',\n text: 'Anchor...',\n onAction: function () {\n return editor.execCommand('mceAnchor');\n }\n });\n };\n\n function Plugin () {\n global$2.add('anchor', function (editor) {\n setup(editor);\n register$1(editor);\n register(editor);\n editor.on('PreInit', function () {\n registerFormats(editor);\n });\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/anchor/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/autolink/index.js": /*!************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/autolink/index.js ***! \************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"autolink\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/autolink')\n// ES2015:\n// import 'tinymce/plugins/autolink'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/autolink/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/autolink/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/autolink/plugin.js": /*!*************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/autolink/plugin.js ***! \*************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var checkRange = function (str, substr, start) {\n return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;\n };\n var contains = function (str, substr) {\n return str.indexOf(substr) !== -1;\n };\n var startsWith = function (str, prefix) {\n return checkRange(str, prefix, 0);\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.Env');\n\n var link = function () {\n return /(?:[A-Za-z][A-Za-z\\d.+-]{0,14}:\\/\\/(?:[-.~*+=!&;:'%@?^${}(),\\w]+@)?|www\\.|[-;:&=+$,.\\w]+@)[A-Za-z\\d-]+(?:\\.[A-Za-z\\d-]+)*(?::\\d+)?(?:\\/(?:[-.~*+=!;:'%@$(),\\/\\w]*[-~*+=%@$()\\/\\w])?)?(?:\\?(?:[-.~*+=!&;:'%@?^${}(),\\/\\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\\/\\w]+))?/g;\n };\n\n var defaultLinkPattern = new RegExp('^' + link().source + '$', 'i');\n var getAutoLinkPattern = function (editor) {\n return editor.getParam('autolink_pattern', defaultLinkPattern);\n };\n var getDefaultLinkTarget = function (editor) {\n return editor.getParam('default_link_target', false);\n };\n var getDefaultLinkProtocol = function (editor) {\n return editor.getParam('link_default_protocol', 'http', 'string');\n };\n\n var rangeEqualsBracketOrSpace = function (rangeString) {\n return /^[(\\[{ \\u00a0]$/.test(rangeString);\n };\n var isTextNode = function (node) {\n return node.nodeType === 3;\n };\n var isElement = function (node) {\n return node.nodeType === 1;\n };\n var handleBracket = function (editor) {\n return parseCurrentLine(editor, -1);\n };\n var handleSpacebar = function (editor) {\n return parseCurrentLine(editor, 0);\n };\n var handleEnter = function (editor) {\n return parseCurrentLine(editor, -1);\n };\n var scopeIndex = function (container, index) {\n if (index < 0) {\n index = 0;\n }\n if (isTextNode(container)) {\n var len = container.data.length;\n if (index > len) {\n index = len;\n }\n }\n return index;\n };\n var setStart = function (rng, container, offset) {\n if (!isElement(container) || container.hasChildNodes()) {\n rng.setStart(container, scopeIndex(container, offset));\n } else {\n rng.setStartBefore(container);\n }\n };\n var setEnd = function (rng, container, offset) {\n if (!isElement(container) || container.hasChildNodes()) {\n rng.setEnd(container, scopeIndex(container, offset));\n } else {\n rng.setEndAfter(container);\n }\n };\n var hasProtocol = function (url) {\n return /^([A-Za-z][A-Za-z\\d.+-]*:\\/\\/)|mailto:/.test(url);\n };\n var isPunctuation = function (char) {\n return /[?!,.;:]/.test(char);\n };\n var parseCurrentLine = function (editor, endOffset) {\n var end, endContainer, bookmark, text, prev, len, rngText;\n var autoLinkPattern = getAutoLinkPattern(editor);\n var defaultLinkTarget = getDefaultLinkTarget(editor);\n if (editor.dom.getParent(editor.selection.getNode(), 'a[href]') !== null) {\n return;\n }\n var rng = editor.selection.getRng().cloneRange();\n if (rng.startOffset < 5) {\n prev = rng.endContainer.previousSibling;\n if (!prev) {\n if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) {\n return;\n }\n prev = rng.endContainer.firstChild.nextSibling;\n }\n len = prev.length;\n setStart(rng, prev, len);\n setEnd(rng, prev, len);\n if (rng.endOffset < 5) {\n return;\n }\n end = rng.endOffset;\n endContainer = prev;\n } else {\n endContainer = rng.endContainer;\n if (!isTextNode(endContainer) && endContainer.firstChild) {\n while (!isTextNode(endContainer) && endContainer.firstChild) {\n endContainer = endContainer.firstChild;\n }\n if (isTextNode(endContainer)) {\n setStart(rng, endContainer, 0);\n setEnd(rng, endContainer, endContainer.nodeValue.length);\n }\n }\n if (rng.endOffset === 1) {\n end = 2;\n } else {\n end = rng.endOffset - 1 - endOffset;\n }\n }\n var start = end;\n do {\n setStart(rng, endContainer, end >= 2 ? end - 2 : 0);\n setEnd(rng, endContainer, end >= 1 ? end - 1 : 0);\n end -= 1;\n rngText = rng.toString();\n } while (!rangeEqualsBracketOrSpace(rngText) && end - 2 >= 0);\n if (rangeEqualsBracketOrSpace(rng.toString())) {\n setStart(rng, endContainer, end);\n setEnd(rng, endContainer, start);\n end += 1;\n } else if (rng.startOffset === 0) {\n setStart(rng, endContainer, 0);\n setEnd(rng, endContainer, start);\n } else {\n setStart(rng, endContainer, end);\n setEnd(rng, endContainer, start);\n }\n text = rng.toString();\n if (isPunctuation(text.charAt(text.length - 1))) {\n setEnd(rng, endContainer, start - 1);\n }\n text = rng.toString().trim();\n var matches = text.match(autoLinkPattern);\n var protocol = getDefaultLinkProtocol(editor);\n if (matches) {\n var url = matches[0];\n if (startsWith(url, 'www.')) {\n url = protocol + '://' + url;\n } else if (contains(url, '@') && !hasProtocol(url)) {\n url = 'mailto:' + url;\n }\n bookmark = editor.selection.getBookmark();\n editor.selection.setRng(rng);\n editor.execCommand('createlink', false, url);\n if (defaultLinkTarget !== false) {\n editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget);\n }\n editor.selection.moveToBookmark(bookmark);\n editor.nodeChanged();\n }\n };\n var setup = function (editor) {\n var autoUrlDetectState;\n editor.on('keydown', function (e) {\n if (e.keyCode === 13) {\n return handleEnter(editor);\n }\n });\n if (global.browser.isIE()) {\n editor.on('focus', function () {\n if (!autoUrlDetectState) {\n autoUrlDetectState = true;\n try {\n editor.execCommand('AutoUrlDetect', false, true);\n } catch (ex) {\n }\n }\n });\n return;\n }\n editor.on('keypress', function (e) {\n if (e.keyCode === 41 || e.keyCode === 93 || e.keyCode === 125) {\n return handleBracket(editor);\n }\n });\n editor.on('keyup', function (e) {\n if (e.keyCode === 32) {\n return handleSpacebar(editor);\n }\n });\n };\n\n function Plugin () {\n global$1.add('autolink', function (editor) {\n setup(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/autolink/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/autosave/index.js": /*!************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/autosave/index.js ***! \************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"autosave\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/autosave')\n// ES2015:\n// import 'tinymce/plugins/autosave'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/autosave/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/autosave/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/autosave/plugin.js": /*!*************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/autosave/plugin.js ***! \*************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$4 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var eq = function (t) {\n return function (a) {\n return t === a;\n };\n };\n var isUndefined = eq(undefined);\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.util.LocalStorage');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var fireRestoreDraft = function (editor) {\n return editor.fire('RestoreDraft');\n };\n var fireStoreDraft = function (editor) {\n return editor.fire('StoreDraft');\n };\n var fireRemoveDraft = function (editor) {\n return editor.fire('RemoveDraft');\n };\n\n var parse = function (timeString, defaultTime) {\n var multiples = {\n s: 1000,\n m: 60000\n };\n var toParse = timeString || defaultTime;\n var parsedTime = /^(\\d+)([ms]?)$/.exec('' + toParse);\n return (parsedTime[2] ? multiples[parsedTime[2]] : 1) * parseInt(toParse, 10);\n };\n\n var shouldAskBeforeUnload = function (editor) {\n return editor.getParam('autosave_ask_before_unload', true);\n };\n var getAutoSavePrefix = function (editor) {\n var location = document.location;\n return editor.getParam('autosave_prefix', 'tinymce-autosave-{path}{query}{hash}-{id}-').replace(/{path}/g, location.pathname).replace(/{query}/g, location.search).replace(/{hash}/g, location.hash).replace(/{id}/g, editor.id);\n };\n var shouldRestoreWhenEmpty = function (editor) {\n return editor.getParam('autosave_restore_when_empty', false);\n };\n var getAutoSaveInterval = function (editor) {\n return parse(editor.getParam('autosave_interval'), '30s');\n };\n var getAutoSaveRetention = function (editor) {\n return parse(editor.getParam('autosave_retention'), '20m');\n };\n\n var isEmpty = function (editor, html) {\n if (isUndefined(html)) {\n return editor.dom.isEmpty(editor.getBody());\n } else {\n var trimmedHtml = global$1.trim(html);\n if (trimmedHtml === '') {\n return true;\n } else {\n var fragment = new DOMParser().parseFromString(trimmedHtml, 'text/html');\n return editor.dom.isEmpty(fragment);\n }\n }\n };\n var hasDraft = function (editor) {\n var time = parseInt(global$2.getItem(getAutoSavePrefix(editor) + 'time'), 10) || 0;\n if (new Date().getTime() - time > getAutoSaveRetention(editor)) {\n removeDraft(editor, false);\n return false;\n }\n return true;\n };\n var removeDraft = function (editor, fire) {\n var prefix = getAutoSavePrefix(editor);\n global$2.removeItem(prefix + 'draft');\n global$2.removeItem(prefix + 'time');\n if (fire !== false) {\n fireRemoveDraft(editor);\n }\n };\n var storeDraft = function (editor) {\n var prefix = getAutoSavePrefix(editor);\n if (!isEmpty(editor) && editor.isDirty()) {\n global$2.setItem(prefix + 'draft', editor.getContent({\n format: 'raw',\n no_events: true\n }));\n global$2.setItem(prefix + 'time', new Date().getTime().toString());\n fireStoreDraft(editor);\n }\n };\n var restoreDraft = function (editor) {\n var prefix = getAutoSavePrefix(editor);\n if (hasDraft(editor)) {\n editor.setContent(global$2.getItem(prefix + 'draft'), { format: 'raw' });\n fireRestoreDraft(editor);\n }\n };\n var startStoreDraft = function (editor) {\n var interval = getAutoSaveInterval(editor);\n global$3.setEditorInterval(editor, function () {\n storeDraft(editor);\n }, interval);\n };\n var restoreLastDraft = function (editor) {\n editor.undoManager.transact(function () {\n restoreDraft(editor);\n removeDraft(editor);\n });\n editor.focus();\n };\n\n var get = function (editor) {\n return {\n hasDraft: function () {\n return hasDraft(editor);\n },\n storeDraft: function () {\n return storeDraft(editor);\n },\n restoreDraft: function () {\n return restoreDraft(editor);\n },\n removeDraft: function (fire) {\n return removeDraft(editor, fire);\n },\n isEmpty: function (html) {\n return isEmpty(editor, html);\n }\n };\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.EditorManager');\n\n var setup = function (editor) {\n editor.editorManager.on('BeforeUnload', function (e) {\n var msg;\n global$1.each(global.get(), function (editor) {\n if (editor.plugins.autosave) {\n editor.plugins.autosave.storeDraft();\n }\n if (!msg && editor.isDirty() && shouldAskBeforeUnload(editor)) {\n msg = editor.translate('You have unsaved changes are you sure you want to navigate away?');\n }\n });\n if (msg) {\n e.preventDefault();\n e.returnValue = msg;\n }\n });\n };\n\n var makeSetupHandler = function (editor) {\n return function (api) {\n api.setDisabled(!hasDraft(editor));\n var editorEventCallback = function () {\n return api.setDisabled(!hasDraft(editor));\n };\n editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback);\n return function () {\n return editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback);\n };\n };\n };\n var register = function (editor) {\n startStoreDraft(editor);\n editor.ui.registry.addButton('restoredraft', {\n tooltip: 'Restore last draft',\n icon: 'restore-draft',\n onAction: function () {\n restoreLastDraft(editor);\n },\n onSetup: makeSetupHandler(editor)\n });\n editor.ui.registry.addMenuItem('restoredraft', {\n text: 'Restore last draft',\n icon: 'restore-draft',\n onAction: function () {\n restoreLastDraft(editor);\n },\n onSetup: makeSetupHandler(editor)\n });\n };\n\n function Plugin () {\n global$4.add('autosave', function (editor) {\n setup(editor);\n register(editor);\n editor.on('init', function () {\n if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) {\n restoreDraft(editor);\n }\n });\n return get(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/autosave/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/charmap/index.js": /*!***********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/charmap/index.js ***! \***********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"charmap\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/charmap')\n// ES2015:\n// import 'tinymce/plugins/charmap'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/charmap/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/charmap/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/charmap/plugin.js": /*!************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/charmap/plugin.js ***! \************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var fireInsertCustomChar = function (editor, chr) {\n return editor.fire('insertCustomChar', { chr: chr });\n };\n\n var insertChar = function (editor, chr) {\n var evtChr = fireInsertCustomChar(editor, chr).chr;\n editor.execCommand('mceInsertContent', false, evtChr);\n };\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var eq = function (t) {\n return function (a) {\n return t === a;\n };\n };\n var isArray$1 = isType('array');\n var isNull = eq(null);\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\n\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 findUntil = function (xs, pred, until) {\n for (var i = 0, len = xs.length; i < len; i++) {\n var x = xs[i];\n if (pred(x, i)) {\n return Optional.some(x);\n } else if (until(x, i)) {\n break;\n }\n }\n return Optional.none();\n };\n var find = function (xs, pred) {\n return findUntil(xs, pred, never);\n };\n var flatten = function (xs) {\n var r = [];\n for (var i = 0, len = xs.length; i < len; ++i) {\n if (!isArray$1(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\n var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var getCharMap$1 = function (editor) {\n return editor.getParam('charmap');\n };\n var getCharMapAppend = function (editor) {\n return editor.getParam('charmap_append');\n };\n\n var isArray = global$1.isArray;\n var UserDefined = 'User Defined';\n var getDefaultCharMap = function () {\n return [\n {\n name: 'Currency',\n characters: [\n [\n 36,\n 'dollar sign'\n ],\n [\n 162,\n 'cent sign'\n ],\n [\n 8364,\n 'euro sign'\n ],\n [\n 163,\n 'pound sign'\n ],\n [\n 165,\n 'yen sign'\n ],\n [\n 164,\n 'currency sign'\n ],\n [\n 8352,\n 'euro-currency sign'\n ],\n [\n 8353,\n 'colon sign'\n ],\n [\n 8354,\n 'cruzeiro sign'\n ],\n [\n 8355,\n 'french franc sign'\n ],\n [\n 8356,\n 'lira sign'\n ],\n [\n 8357,\n 'mill sign'\n ],\n [\n 8358,\n 'naira sign'\n ],\n [\n 8359,\n 'peseta sign'\n ],\n [\n 8360,\n 'rupee sign'\n ],\n [\n 8361,\n 'won sign'\n ],\n [\n 8362,\n 'new sheqel sign'\n ],\n [\n 8363,\n 'dong sign'\n ],\n [\n 8365,\n 'kip sign'\n ],\n [\n 8366,\n 'tugrik sign'\n ],\n [\n 8367,\n 'drachma sign'\n ],\n [\n 8368,\n 'german penny symbol'\n ],\n [\n 8369,\n 'peso sign'\n ],\n [\n 8370,\n 'guarani sign'\n ],\n [\n 8371,\n 'austral sign'\n ],\n [\n 8372,\n 'hryvnia sign'\n ],\n [\n 8373,\n 'cedi sign'\n ],\n [\n 8374,\n 'livre tournois sign'\n ],\n [\n 8375,\n 'spesmilo sign'\n ],\n [\n 8376,\n 'tenge sign'\n ],\n [\n 8377,\n 'indian rupee sign'\n ],\n [\n 8378,\n 'turkish lira sign'\n ],\n [\n 8379,\n 'nordic mark sign'\n ],\n [\n 8380,\n 'manat sign'\n ],\n [\n 8381,\n 'ruble sign'\n ],\n [\n 20870,\n 'yen character'\n ],\n [\n 20803,\n 'yuan character'\n ],\n [\n 22291,\n 'yuan character, in hong kong and taiwan'\n ],\n [\n 22278,\n 'yen/yuan character variant one'\n ]\n ]\n },\n {\n name: 'Text',\n characters: [\n [\n 169,\n 'copyright sign'\n ],\n [\n 174,\n 'registered sign'\n ],\n [\n 8482,\n 'trade mark sign'\n ],\n [\n 8240,\n 'per mille sign'\n ],\n [\n 181,\n 'micro sign'\n ],\n [\n 183,\n 'middle dot'\n ],\n [\n 8226,\n 'bullet'\n ],\n [\n 8230,\n 'three dot leader'\n ],\n [\n 8242,\n 'minutes / feet'\n ],\n [\n 8243,\n 'seconds / inches'\n ],\n [\n 167,\n 'section sign'\n ],\n [\n 182,\n 'paragraph sign'\n ],\n [\n 223,\n 'sharp s / ess-zed'\n ]\n ]\n },\n {\n name: 'Quotations',\n characters: [\n [\n 8249,\n 'single left-pointing angle quotation mark'\n ],\n [\n 8250,\n 'single right-pointing angle quotation mark'\n ],\n [\n 171,\n 'left pointing guillemet'\n ],\n [\n 187,\n 'right pointing guillemet'\n ],\n [\n 8216,\n 'left single quotation mark'\n ],\n [\n 8217,\n 'right single quotation mark'\n ],\n [\n 8220,\n 'left double quotation mark'\n ],\n [\n 8221,\n 'right double quotation mark'\n ],\n [\n 8218,\n 'single low-9 quotation mark'\n ],\n [\n 8222,\n 'double low-9 quotation mark'\n ],\n [\n 60,\n 'less-than sign'\n ],\n [\n 62,\n 'greater-than sign'\n ],\n [\n 8804,\n 'less-than or equal to'\n ],\n [\n 8805,\n 'greater-than or equal to'\n ],\n [\n 8211,\n 'en dash'\n ],\n [\n 8212,\n 'em dash'\n ],\n [\n 175,\n 'macron'\n ],\n [\n 8254,\n 'overline'\n ],\n [\n 164,\n 'currency sign'\n ],\n [\n 166,\n 'broken bar'\n ],\n [\n 168,\n 'diaeresis'\n ],\n [\n 161,\n 'inverted exclamation mark'\n ],\n [\n 191,\n 'turned question mark'\n ],\n [\n 710,\n 'circumflex accent'\n ],\n [\n 732,\n 'small tilde'\n ],\n [\n 176,\n 'degree sign'\n ],\n [\n 8722,\n 'minus sign'\n ],\n [\n 177,\n 'plus-minus sign'\n ],\n [\n 247,\n 'division sign'\n ],\n [\n 8260,\n 'fraction slash'\n ],\n [\n 215,\n 'multiplication sign'\n ],\n [\n 185,\n 'superscript one'\n ],\n [\n 178,\n 'superscript two'\n ],\n [\n 179,\n 'superscript three'\n ],\n [\n 188,\n 'fraction one quarter'\n ],\n [\n 189,\n 'fraction one half'\n ],\n [\n 190,\n 'fraction three quarters'\n ]\n ]\n },\n {\n name: 'Mathematical',\n characters: [\n [\n 402,\n 'function / florin'\n ],\n [\n 8747,\n 'integral'\n ],\n [\n 8721,\n 'n-ary sumation'\n ],\n [\n 8734,\n 'infinity'\n ],\n [\n 8730,\n 'square root'\n ],\n [\n 8764,\n 'similar to'\n ],\n [\n 8773,\n 'approximately equal to'\n ],\n [\n 8776,\n 'almost equal to'\n ],\n [\n 8800,\n 'not equal to'\n ],\n [\n 8801,\n 'identical to'\n ],\n [\n 8712,\n 'element of'\n ],\n [\n 8713,\n 'not an element of'\n ],\n [\n 8715,\n 'contains as member'\n ],\n [\n 8719,\n 'n-ary product'\n ],\n [\n 8743,\n 'logical and'\n ],\n [\n 8744,\n 'logical or'\n ],\n [\n 172,\n 'not sign'\n ],\n [\n 8745,\n 'intersection'\n ],\n [\n 8746,\n 'union'\n ],\n [\n 8706,\n 'partial differential'\n ],\n [\n 8704,\n 'for all'\n ],\n [\n 8707,\n 'there exists'\n ],\n [\n 8709,\n 'diameter'\n ],\n [\n 8711,\n 'backward difference'\n ],\n [\n 8727,\n 'asterisk operator'\n ],\n [\n 8733,\n 'proportional to'\n ],\n [\n 8736,\n 'angle'\n ]\n ]\n },\n {\n name: 'Extended Latin',\n characters: [\n [\n 192,\n 'A - grave'\n ],\n [\n 193,\n 'A - acute'\n ],\n [\n 194,\n 'A - circumflex'\n ],\n [\n 195,\n 'A - tilde'\n ],\n [\n 196,\n 'A - diaeresis'\n ],\n [\n 197,\n 'A - ring above'\n ],\n [\n 256,\n 'A - macron'\n ],\n [\n 198,\n 'ligature AE'\n ],\n [\n 199,\n 'C - cedilla'\n ],\n [\n 200,\n 'E - grave'\n ],\n [\n 201,\n 'E - acute'\n ],\n [\n 202,\n 'E - circumflex'\n ],\n [\n 203,\n 'E - diaeresis'\n ],\n [\n 274,\n 'E - macron'\n ],\n [\n 204,\n 'I - grave'\n ],\n [\n 205,\n 'I - acute'\n ],\n [\n 206,\n 'I - circumflex'\n ],\n [\n 207,\n 'I - diaeresis'\n ],\n [\n 298,\n 'I - macron'\n ],\n [\n 208,\n 'ETH'\n ],\n [\n 209,\n 'N - tilde'\n ],\n [\n 210,\n 'O - grave'\n ],\n [\n 211,\n 'O - acute'\n ],\n [\n 212,\n 'O - circumflex'\n ],\n [\n 213,\n 'O - tilde'\n ],\n [\n 214,\n 'O - diaeresis'\n ],\n [\n 216,\n 'O - slash'\n ],\n [\n 332,\n 'O - macron'\n ],\n [\n 338,\n 'ligature OE'\n ],\n [\n 352,\n 'S - caron'\n ],\n [\n 217,\n 'U - grave'\n ],\n [\n 218,\n 'U - acute'\n ],\n [\n 219,\n 'U - circumflex'\n ],\n [\n 220,\n 'U - diaeresis'\n ],\n [\n 362,\n 'U - macron'\n ],\n [\n 221,\n 'Y - acute'\n ],\n [\n 376,\n 'Y - diaeresis'\n ],\n [\n 562,\n 'Y - macron'\n ],\n [\n 222,\n 'THORN'\n ],\n [\n 224,\n 'a - grave'\n ],\n [\n 225,\n 'a - acute'\n ],\n [\n 226,\n 'a - circumflex'\n ],\n [\n 227,\n 'a - tilde'\n ],\n [\n 228,\n 'a - diaeresis'\n ],\n [\n 229,\n 'a - ring above'\n ],\n [\n 257,\n 'a - macron'\n ],\n [\n 230,\n 'ligature ae'\n ],\n [\n 231,\n 'c - cedilla'\n ],\n [\n 232,\n 'e - grave'\n ],\n [\n 233,\n 'e - acute'\n ],\n [\n 234,\n 'e - circumflex'\n ],\n [\n 235,\n 'e - diaeresis'\n ],\n [\n 275,\n 'e - macron'\n ],\n [\n 236,\n 'i - grave'\n ],\n [\n 237,\n 'i - acute'\n ],\n [\n 238,\n 'i - circumflex'\n ],\n [\n 239,\n 'i - diaeresis'\n ],\n [\n 299,\n 'i - macron'\n ],\n [\n 240,\n 'eth'\n ],\n [\n 241,\n 'n - tilde'\n ],\n [\n 242,\n 'o - grave'\n ],\n [\n 243,\n 'o - acute'\n ],\n [\n 244,\n 'o - circumflex'\n ],\n [\n 245,\n 'o - tilde'\n ],\n [\n 246,\n 'o - diaeresis'\n ],\n [\n 248,\n 'o slash'\n ],\n [\n 333,\n 'o macron'\n ],\n [\n 339,\n 'ligature oe'\n ],\n [\n 353,\n 's - caron'\n ],\n [\n 249,\n 'u - grave'\n ],\n [\n 250,\n 'u - acute'\n ],\n [\n 251,\n 'u - circumflex'\n ],\n [\n 252,\n 'u - diaeresis'\n ],\n [\n 363,\n 'u - macron'\n ],\n [\n 253,\n 'y - acute'\n ],\n [\n 254,\n 'thorn'\n ],\n [\n 255,\n 'y - diaeresis'\n ],\n [\n 563,\n 'y - macron'\n ],\n [\n 913,\n 'Alpha'\n ],\n [\n 914,\n 'Beta'\n ],\n [\n 915,\n 'Gamma'\n ],\n [\n 916,\n 'Delta'\n ],\n [\n 917,\n 'Epsilon'\n ],\n [\n 918,\n 'Zeta'\n ],\n [\n 919,\n 'Eta'\n ],\n [\n 920,\n 'Theta'\n ],\n [\n 921,\n 'Iota'\n ],\n [\n 922,\n 'Kappa'\n ],\n [\n 923,\n 'Lambda'\n ],\n [\n 924,\n 'Mu'\n ],\n [\n 925,\n 'Nu'\n ],\n [\n 926,\n 'Xi'\n ],\n [\n 927,\n 'Omicron'\n ],\n [\n 928,\n 'Pi'\n ],\n [\n 929,\n 'Rho'\n ],\n [\n 931,\n 'Sigma'\n ],\n [\n 932,\n 'Tau'\n ],\n [\n 933,\n 'Upsilon'\n ],\n [\n 934,\n 'Phi'\n ],\n [\n 935,\n 'Chi'\n ],\n [\n 936,\n 'Psi'\n ],\n [\n 937,\n 'Omega'\n ],\n [\n 945,\n 'alpha'\n ],\n [\n 946,\n 'beta'\n ],\n [\n 947,\n 'gamma'\n ],\n [\n 948,\n 'delta'\n ],\n [\n 949,\n 'epsilon'\n ],\n [\n 950,\n 'zeta'\n ],\n [\n 951,\n 'eta'\n ],\n [\n 952,\n 'theta'\n ],\n [\n 953,\n 'iota'\n ],\n [\n 954,\n 'kappa'\n ],\n [\n 955,\n 'lambda'\n ],\n [\n 956,\n 'mu'\n ],\n [\n 957,\n 'nu'\n ],\n [\n 958,\n 'xi'\n ],\n [\n 959,\n 'omicron'\n ],\n [\n 960,\n 'pi'\n ],\n [\n 961,\n 'rho'\n ],\n [\n 962,\n 'final sigma'\n ],\n [\n 963,\n 'sigma'\n ],\n [\n 964,\n 'tau'\n ],\n [\n 965,\n 'upsilon'\n ],\n [\n 966,\n 'phi'\n ],\n [\n 967,\n 'chi'\n ],\n [\n 968,\n 'psi'\n ],\n [\n 969,\n 'omega'\n ]\n ]\n },\n {\n name: 'Symbols',\n characters: [\n [\n 8501,\n 'alef symbol'\n ],\n [\n 982,\n 'pi symbol'\n ],\n [\n 8476,\n 'real part symbol'\n ],\n [\n 978,\n 'upsilon - hook symbol'\n ],\n [\n 8472,\n 'Weierstrass p'\n ],\n [\n 8465,\n 'imaginary part'\n ]\n ]\n },\n {\n name: 'Arrows',\n characters: [\n [\n 8592,\n 'leftwards arrow'\n ],\n [\n 8593,\n 'upwards arrow'\n ],\n [\n 8594,\n 'rightwards arrow'\n ],\n [\n 8595,\n 'downwards arrow'\n ],\n [\n 8596,\n 'left right arrow'\n ],\n [\n 8629,\n 'carriage return'\n ],\n [\n 8656,\n 'leftwards double arrow'\n ],\n [\n 8657,\n 'upwards double arrow'\n ],\n [\n 8658,\n 'rightwards double arrow'\n ],\n [\n 8659,\n 'downwards double arrow'\n ],\n [\n 8660,\n 'left right double arrow'\n ],\n [\n 8756,\n 'therefore'\n ],\n [\n 8834,\n 'subset of'\n ],\n [\n 8835,\n 'superset of'\n ],\n [\n 8836,\n 'not a subset of'\n ],\n [\n 8838,\n 'subset of or equal to'\n ],\n [\n 8839,\n 'superset of or equal to'\n ],\n [\n 8853,\n 'circled plus'\n ],\n [\n 8855,\n 'circled times'\n ],\n [\n 8869,\n 'perpendicular'\n ],\n [\n 8901,\n 'dot operator'\n ],\n [\n 8968,\n 'left ceiling'\n ],\n [\n 8969,\n 'right ceiling'\n ],\n [\n 8970,\n 'left floor'\n ],\n [\n 8971,\n 'right floor'\n ],\n [\n 9001,\n 'left-pointing angle bracket'\n ],\n [\n 9002,\n 'right-pointing angle bracket'\n ],\n [\n 9674,\n 'lozenge'\n ],\n [\n 9824,\n 'black spade suit'\n ],\n [\n 9827,\n 'black club suit'\n ],\n [\n 9829,\n 'black heart suit'\n ],\n [\n 9830,\n 'black diamond suit'\n ],\n [\n 8194,\n 'en space'\n ],\n [\n 8195,\n 'em space'\n ],\n [\n 8201,\n 'thin space'\n ],\n [\n 8204,\n 'zero width non-joiner'\n ],\n [\n 8205,\n 'zero width joiner'\n ],\n [\n 8206,\n 'left-to-right mark'\n ],\n [\n 8207,\n 'right-to-left mark'\n ]\n ]\n }\n ];\n };\n var charmapFilter = function (charmap) {\n return global$1.grep(charmap, function (item) {\n return isArray(item) && item.length === 2;\n });\n };\n var getCharsFromSetting = function (settingValue) {\n if (isArray(settingValue)) {\n return charmapFilter(settingValue);\n }\n if (typeof settingValue === 'function') {\n return settingValue();\n }\n return [];\n };\n var extendCharMap = function (editor, charmap) {\n var userCharMap = getCharMap$1(editor);\n if (userCharMap) {\n charmap = [{\n name: UserDefined,\n characters: getCharsFromSetting(userCharMap)\n }];\n }\n var userCharMapAppend = getCharMapAppend(editor);\n if (userCharMapAppend) {\n var userDefinedGroup = global$1.grep(charmap, function (cg) {\n return cg.name === UserDefined;\n });\n if (userDefinedGroup.length) {\n userDefinedGroup[0].characters = [].concat(userDefinedGroup[0].characters).concat(getCharsFromSetting(userCharMapAppend));\n return charmap;\n }\n return charmap.concat({\n name: UserDefined,\n characters: getCharsFromSetting(userCharMapAppend)\n });\n }\n return charmap;\n };\n var getCharMap = function (editor) {\n var groups = extendCharMap(editor, getDefaultCharMap());\n return groups.length > 1 ? [{\n name: 'All',\n characters: bind(groups, function (g) {\n return g.characters;\n })\n }].concat(groups) : groups;\n };\n\n var get = function (editor) {\n var getCharMap$1 = function () {\n return getCharMap(editor);\n };\n var insertChar$1 = function (chr) {\n insertChar(editor, chr);\n };\n return {\n getCharMap: getCharMap$1,\n insertChar: insertChar$1\n };\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 return {\n get: get,\n set: set\n };\n };\n\n var last = function (fn, rate) {\n var timer = null;\n var cancel = function () {\n if (!isNull(timer)) {\n 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 cancel();\n timer = setTimeout(function () {\n timer = null;\n fn.apply(null, args);\n }, rate);\n };\n return {\n cancel: cancel,\n throttle: throttle\n };\n };\n\n var nativeFromCodePoint = String.fromCodePoint;\n var contains = function (str, substr) {\n return str.indexOf(substr) !== -1;\n };\n var fromCodePoint = function () {\n var codePoints = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n codePoints[_i] = arguments[_i];\n }\n if (nativeFromCodePoint) {\n return nativeFromCodePoint.apply(void 0, codePoints);\n } else {\n var codeUnits = [];\n var codeLen = 0;\n var result = '';\n for (var index = 0, len = codePoints.length; index !== len; ++index) {\n var codePoint = +codePoints[index];\n if (!(codePoint < 1114111 && codePoint >>> 0 === codePoint)) {\n throw RangeError('Invalid code point: ' + codePoint);\n }\n if (codePoint <= 65535) {\n codeLen = codeUnits.push(codePoint);\n } else {\n codePoint -= 65536;\n codeLen = codeUnits.push((codePoint >> 10) + 55296, codePoint % 1024 + 56320);\n }\n if (codeLen >= 16383) {\n result += String.fromCharCode.apply(null, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result + String.fromCharCode.apply(null, codeUnits);\n }\n };\n\n var charMatches = function (charCode, name, lowerCasePattern) {\n if (contains(fromCodePoint(charCode).toLowerCase(), lowerCasePattern)) {\n return true;\n } else {\n return contains(name.toLowerCase(), lowerCasePattern) || contains(name.toLowerCase().replace(/\\s+/g, ''), lowerCasePattern);\n }\n };\n var scan = function (group, pattern) {\n var matches = [];\n var lowerCasePattern = pattern.toLowerCase();\n each(group.characters, function (g) {\n if (charMatches(g[0], g[1], lowerCasePattern)) {\n matches.push(g);\n }\n });\n return map(matches, function (m) {\n return {\n text: m[1],\n value: fromCodePoint(m[0]),\n icon: fromCodePoint(m[0])\n };\n });\n };\n\n var patternName = 'pattern';\n var open = function (editor, charMap) {\n var makeGroupItems = function () {\n return [\n {\n label: 'Search',\n type: 'input',\n name: patternName\n },\n {\n type: 'collection',\n name: 'results'\n }\n ];\n };\n var makeTabs = function () {\n return map(charMap, function (charGroup) {\n return {\n title: charGroup.name,\n name: charGroup.name,\n items: makeGroupItems()\n };\n });\n };\n var makePanel = function () {\n return {\n type: 'panel',\n items: makeGroupItems()\n };\n };\n var makeTabPanel = function () {\n return {\n type: 'tabpanel',\n tabs: makeTabs()\n };\n };\n var currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All');\n var scanAndSet = function (dialogApi, pattern) {\n find(charMap, function (group) {\n return group.name === currentTab.get();\n }).each(function (f) {\n var items = scan(f, pattern);\n dialogApi.setData({ results: items });\n });\n };\n var SEARCH_DELAY = 40;\n var updateFilter = last(function (dialogApi) {\n var pattern = dialogApi.getData().pattern;\n scanAndSet(dialogApi, pattern);\n }, SEARCH_DELAY);\n var body = charMap.length === 1 ? makePanel() : makeTabPanel();\n var initialData = {\n pattern: '',\n results: scan(charMap[0], '')\n };\n var bridgeSpec = {\n title: 'Special Character',\n size: 'normal',\n body: body,\n buttons: [{\n type: 'cancel',\n name: 'close',\n text: 'Close',\n primary: true\n }],\n initialData: initialData,\n onAction: function (api, details) {\n if (details.name === 'results') {\n insertChar(editor, details.value);\n api.close();\n }\n },\n onTabChange: function (dialogApi, details) {\n currentTab.set(details.newTabName);\n updateFilter.throttle(dialogApi);\n },\n onChange: function (dialogApi, changeData) {\n if (changeData.name === patternName) {\n updateFilter.throttle(dialogApi);\n }\n }\n };\n var dialogApi = editor.windowManager.open(bridgeSpec);\n dialogApi.focus(patternName);\n };\n\n var register$1 = function (editor, charMap) {\n editor.addCommand('mceShowCharmap', function () {\n open(editor, charMap);\n });\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n var init = function (editor, all) {\n editor.ui.registry.addAutocompleter('charmap', {\n ch: ':',\n columns: 'auto',\n minChars: 2,\n fetch: function (pattern, _maxResults) {\n return new global(function (resolve, _reject) {\n resolve(scan(all, pattern));\n });\n },\n onAction: function (autocompleteApi, rng, value) {\n editor.selection.setRng(rng);\n editor.insertContent(value);\n autocompleteApi.hide();\n }\n });\n };\n\n var register = function (editor) {\n editor.ui.registry.addButton('charmap', {\n icon: 'insert-character',\n tooltip: 'Special character',\n onAction: function () {\n return editor.execCommand('mceShowCharmap');\n }\n });\n editor.ui.registry.addMenuItem('charmap', {\n icon: 'insert-character',\n text: 'Special character...',\n onAction: function () {\n return editor.execCommand('mceShowCharmap');\n }\n });\n };\n\n function Plugin () {\n global$2.add('charmap', function (editor) {\n var charMap = getCharMap(editor);\n register$1(editor, charMap);\n register(editor);\n init(editor, charMap[0]);\n return get(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/charmap/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/code/index.js": /*!********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/code/index.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"code\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/code')\n// ES2015:\n// import 'tinymce/plugins/code'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/code/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/code/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/code/plugin.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/code/plugin.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\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\n var open = function (editor) {\n var editorContent = 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 setContent(editor, api.getData().code);\n api.close();\n }\n });\n };\n\n var register$1 = function (editor) {\n editor.addCommand('mceCodeEditor', function () {\n open(editor);\n });\n };\n\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('mceCodeEditor');\n };\n editor.ui.registry.addButton('code', {\n icon: 'sourcecode',\n tooltip: 'Source code',\n onAction: onAction\n });\n editor.ui.registry.addMenuItem('code', {\n icon: 'sourcecode',\n text: 'Source code',\n onAction: onAction\n });\n };\n\n function Plugin () {\n global.add('code', function (editor) {\n register$1(editor);\n register(editor);\n return {};\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/code/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/codesample/index.js": /*!**************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/codesample/index.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"codesample\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/codesample')\n// ES2015:\n// import 'tinymce/plugins/codesample'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/codesample/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/codesample/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/codesample/plugin.js": /*!***************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/codesample/plugin.js ***! \***************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$2 = 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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\n\n var get$1 = function (xs, i) {\n return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();\n };\n var head = function (xs) {\n return get$1(xs, 0);\n };\n\n var someIf = function (b, a) {\n return b ? Optional.some(a) : Optional.none();\n };\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n var isCodeSample = function (elm) {\n return elm && elm.nodeName === 'PRE' && elm.className.indexOf('language-') !== -1;\n };\n var trimArg = function (predicateFn) {\n return function (arg1, arg2) {\n return predicateFn(arg2);\n };\n };\n\n var Global = typeof window !== 'undefined' ? window : Function('return this;')();\n\n var exports$1 = {}, module = { exports: exports$1 }, global = {};\n (function (define, exports, module, require) {\n var oldprism = window.Prism;\n window.Prism = { manual: true };\n (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EphoxContactWrapper = factory());\n }(this, function () {\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n var prismCore = { exports: {} };\n (function (module) {\n var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ? self : {};\n var Prism = function (_self) {\n var lang = /(?:^|\\s)lang(?:uage)?-([\\w-]+)(?=\\s|$)/i;\n var uniqueId = 0;\n var plainTextGrammar = {};\n var _ = {\n manual: _self.Prism && _self.Prism.manual,\n disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,\n util: {\n encode: function encode(tokens) {\n if (tokens instanceof Token) {\n return new Token(tokens.type, encode(tokens.content), tokens.alias);\n } else if (Array.isArray(tokens)) {\n return tokens.map(encode);\n } else {\n return tokens.replace(/&/g, '&').replace(/' + env.content + '';\n };\n function matchPattern(pattern, pos, text, lookbehind) {\n pattern.lastIndex = pos;\n var match = pattern.exec(text);\n if (match && lookbehind && match[1]) {\n var lookbehindLength = match[1].length;\n match.index += lookbehindLength;\n match[0] = match[0].slice(lookbehindLength);\n }\n return match;\n }\n function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {\n for (var token in grammar) {\n if (!grammar.hasOwnProperty(token) || !grammar[token]) {\n continue;\n }\n var patterns = grammar[token];\n patterns = Array.isArray(patterns) ? patterns : [patterns];\n for (var j = 0; j < patterns.length; ++j) {\n if (rematch && rematch.cause == token + ',' + j) {\n return;\n }\n var patternObj = patterns[j];\n var inside = patternObj.inside;\n var lookbehind = !!patternObj.lookbehind;\n var greedy = !!patternObj.greedy;\n var alias = patternObj.alias;\n if (greedy && !patternObj.pattern.global) {\n var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];\n patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g');\n }\n var pattern = patternObj.pattern || patternObj;\n for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, currentNode = currentNode.next) {\n if (rematch && pos >= rematch.reach) {\n break;\n }\n var str = currentNode.value;\n if (tokenList.length > text.length) {\n return;\n }\n if (str instanceof Token) {\n continue;\n }\n var removeCount = 1;\n var match;\n if (greedy) {\n match = matchPattern(pattern, pos, text, lookbehind);\n if (!match || match.index >= text.length) {\n break;\n }\n var from = match.index;\n var to = match.index + match[0].length;\n var p = pos;\n p += currentNode.value.length;\n while (from >= p) {\n currentNode = currentNode.next;\n p += currentNode.value.length;\n }\n p -= currentNode.value.length;\n pos = p;\n if (currentNode.value instanceof Token) {\n continue;\n }\n for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === 'string'); k = k.next) {\n removeCount++;\n p += k.value.length;\n }\n removeCount--;\n str = text.slice(pos, p);\n match.index -= pos;\n } else {\n match = matchPattern(pattern, 0, str, lookbehind);\n if (!match) {\n continue;\n }\n }\n var from = match.index;\n var matchStr = match[0];\n var before = str.slice(0, from);\n var after = str.slice(from + matchStr.length);\n var reach = pos + str.length;\n if (rematch && reach > rematch.reach) {\n rematch.reach = reach;\n }\n var removeFrom = currentNode.prev;\n if (before) {\n removeFrom = addAfter(tokenList, removeFrom, before);\n pos += before.length;\n }\n removeRange(tokenList, removeFrom, removeCount);\n var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);\n currentNode = addAfter(tokenList, removeFrom, wrapped);\n if (after) {\n addAfter(tokenList, currentNode, after);\n }\n if (removeCount > 1) {\n var nestedRematch = {\n cause: token + ',' + j,\n reach: reach\n };\n matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);\n if (rematch && nestedRematch.reach > rematch.reach) {\n rematch.reach = nestedRematch.reach;\n }\n }\n }\n }\n }\n }\n function LinkedList() {\n var head = {\n value: null,\n prev: null,\n next: null\n };\n var tail = {\n value: null,\n prev: head,\n next: null\n };\n head.next = tail;\n this.head = head;\n this.tail = tail;\n this.length = 0;\n }\n function addAfter(list, node, value) {\n var next = node.next;\n var newNode = {\n value: value,\n prev: node,\n next: next\n };\n node.next = newNode;\n next.prev = newNode;\n list.length++;\n return newNode;\n }\n function removeRange(list, node, count) {\n var next = node.next;\n for (var i = 0; i < count && next !== list.tail; i++) {\n next = next.next;\n }\n node.next = next;\n next.prev = node;\n list.length -= i;\n }\n function toArray(list) {\n var array = [];\n var node = list.head.next;\n while (node !== list.tail) {\n array.push(node.value);\n node = node.next;\n }\n return array;\n }\n if (!_self.document) {\n if (!_self.addEventListener) {\n return _;\n }\n if (!_.disableWorkerMessageHandler) {\n _self.addEventListener('message', function (evt) {\n var message = JSON.parse(evt.data);\n var lang = message.language;\n var code = message.code;\n var immediateClose = message.immediateClose;\n _self.postMessage(_.highlight(code, _.languages[lang], lang));\n if (immediateClose) {\n _self.close();\n }\n }, false);\n }\n return _;\n }\n var script = _.util.currentScript();\n if (script) {\n _.filename = script.src;\n if (script.hasAttribute('data-manual')) {\n _.manual = true;\n }\n }\n function highlightAutomaticallyCallback() {\n if (!_.manual) {\n _.highlightAll();\n }\n }\n if (!_.manual) {\n var readyState = document.readyState;\n if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {\n document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);\n } else {\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(highlightAutomaticallyCallback);\n } else {\n window.setTimeout(highlightAutomaticallyCallback, 16);\n }\n }\n }\n return _;\n }(_self);\n if (module.exports) {\n module.exports = Prism;\n }\n if (typeof commonjsGlobal !== 'undefined') {\n commonjsGlobal.Prism = Prism;\n }\n }(prismCore));\n Prism.languages.clike = {\n 'comment': [\n {\n pattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n lookbehind: true,\n greedy: true\n },\n {\n pattern: /(^|[^\\\\:])\\/\\/.*/,\n lookbehind: true,\n greedy: true\n }\n ],\n 'string': {\n pattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n greedy: true\n },\n 'class-name': {\n pattern: /(\\b(?:class|extends|implements|instanceof|interface|new|trait)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,\n lookbehind: true,\n inside: { 'punctuation': /[.\\\\]/ }\n },\n 'keyword': /\\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\\b/,\n 'boolean': /\\b(?:false|true)\\b/,\n 'function': /\\b\\w+(?=\\()/,\n 'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n 'operator': /[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,\n 'punctuation': /[{}[\\];(),.:]/\n };\n (function (Prism) {\n function getPlaceholder(language, index) {\n return '___' + language.toUpperCase() + index + '___';\n }\n Object.defineProperties(Prism.languages['markup-templating'] = {}, {\n buildPlaceholders: {\n value: function (env, language, placeholderPattern, replaceFilter) {\n if (env.language !== language) {\n return;\n }\n var tokenStack = env.tokenStack = [];\n env.code = env.code.replace(placeholderPattern, function (match) {\n if (typeof replaceFilter === 'function' && !replaceFilter(match)) {\n return match;\n }\n var i = tokenStack.length;\n var placeholder;\n while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) {\n ++i;\n }\n tokenStack[i] = match;\n return placeholder;\n });\n env.grammar = Prism.languages.markup;\n }\n },\n tokenizePlaceholders: {\n value: function (env, language) {\n if (env.language !== language || !env.tokenStack) {\n return;\n }\n env.grammar = Prism.languages[language];\n var j = 0;\n var keys = Object.keys(env.tokenStack);\n function walkTokens(tokens) {\n for (var i = 0; i < tokens.length; i++) {\n if (j >= keys.length) {\n break;\n }\n var token = tokens[i];\n if (typeof token === 'string' || token.content && typeof token.content === 'string') {\n var k = keys[j];\n var t = env.tokenStack[k];\n var s = typeof token === 'string' ? token : token.content;\n var placeholder = getPlaceholder(language, k);\n var index = s.indexOf(placeholder);\n if (index > -1) {\n ++j;\n var before = s.substring(0, index);\n var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t);\n var after = s.substring(index + placeholder.length);\n var replacement = [];\n if (before) {\n replacement.push.apply(replacement, walkTokens([before]));\n }\n replacement.push(middle);\n if (after) {\n replacement.push.apply(replacement, walkTokens([after]));\n }\n if (typeof token === 'string') {\n tokens.splice.apply(tokens, [\n i,\n 1\n ].concat(replacement));\n } else {\n token.content = replacement;\n }\n }\n } else if (token.content) {\n walkTokens(token.content);\n }\n }\n return tokens;\n }\n walkTokens(env.tokens);\n }\n }\n });\n }(Prism));\n Prism.languages.c = Prism.languages.extend('clike', {\n 'comment': {\n pattern: /\\/\\/(?:[^\\r\\n\\\\]|\\\\(?:\\r\\n?|\\n|(?![\\r\\n])))*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n greedy: true\n },\n 'string': {\n pattern: /\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"/,\n greedy: true\n },\n 'class-name': {\n pattern: /(\\b(?:enum|struct)\\s+(?:__attribute__\\s*\\(\\([\\s\\S]*?\\)\\)\\s*)?)\\w+|\\b[a-z]\\w*_t\\b/,\n lookbehind: true\n },\n 'keyword': /\\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\\b/,\n 'function': /\\b[a-z_]\\w*(?=\\s*\\()/i,\n 'number': /(?:\\b0x(?:[\\da-f]+(?:\\.[\\da-f]*)?|\\.[\\da-f]+)(?:p[+-]?\\d+)?|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)[ful]{0,4}/i,\n 'operator': />>=?|<<=?|->|([-+&|:])\\1|[?:~]|[-+*/%&|^!=<>]=?/\n });\n Prism.languages.insertBefore('c', 'string', {\n 'char': {\n pattern: /'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n]){0,32}'/,\n greedy: true\n }\n });\n Prism.languages.insertBefore('c', 'string', {\n 'macro': {\n pattern: /(^[\\t ]*)#\\s*[a-z](?:[^\\r\\n\\\\/]|\\/(?!\\*)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|\\\\(?:\\r\\n|[\\s\\S]))*/im,\n lookbehind: true,\n greedy: true,\n alias: 'property',\n inside: {\n 'string': [\n {\n pattern: /^(#\\s*include\\s*)<[^>]+>/,\n lookbehind: true\n },\n Prism.languages.c['string']\n ],\n 'char': Prism.languages.c['char'],\n 'comment': Prism.languages.c['comment'],\n 'macro-name': [\n {\n pattern: /(^#\\s*define\\s+)\\w+\\b(?!\\()/i,\n lookbehind: true\n },\n {\n pattern: /(^#\\s*define\\s+)\\w+\\b(?=\\()/i,\n lookbehind: true,\n alias: 'function'\n }\n ],\n 'directive': {\n pattern: /^(#\\s*)[a-z]+/,\n lookbehind: true,\n alias: 'keyword'\n },\n 'directive-hash': /^#/,\n 'punctuation': /##|\\\\(?=[\\r\\n])/,\n 'expression': {\n pattern: /\\S[\\s\\S]*/,\n inside: Prism.languages.c\n }\n }\n }\n });\n Prism.languages.insertBefore('c', 'function', { 'constant': /\\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\\b/ });\n delete Prism.languages.c['boolean'];\n (function (Prism) {\n var keyword = /\\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\\b/;\n var modName = /\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b/.source.replace(//g, function () {\n return keyword.source;\n });\n Prism.languages.cpp = Prism.languages.extend('c', {\n 'class-name': [\n {\n pattern: RegExp(/(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+/.source.replace(//g, function () {\n return keyword.source;\n })),\n lookbehind: true\n },\n /\\b[A-Z]\\w*(?=\\s*::\\s*\\w+\\s*\\()/,\n /\\b[A-Z_]\\w*(?=\\s*::\\s*~\\w+\\s*\\()/i,\n /\\b\\w+(?=\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\\s*::\\s*\\w+\\s*\\()/\n ],\n 'keyword': keyword,\n 'number': {\n pattern: /(?:\\b0b[01']+|\\b0x(?:[\\da-f']+(?:\\.[\\da-f']*)?|\\.[\\da-f']+)(?:p[+-]?[\\d']+)?|(?:\\b[\\d']+(?:\\.[\\d']*)?|\\B\\.[\\d']+)(?:e[+-]?[\\d']+)?)[ful]{0,4}/i,\n greedy: true\n },\n 'operator': />>=?|<<=?|->|--|\\+\\+|&&|\\|\\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\\b/,\n 'boolean': /\\b(?:false|true)\\b/\n });\n Prism.languages.insertBefore('cpp', 'string', {\n 'module': {\n pattern: RegExp(/(\\b(?:import|module)\\s+)/.source + '(?:' + /\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|<[^<>\\r\\n]*>/.source + '|' + /(?:\\s*:\\s*)?|:\\s*/.source.replace(//g, function () {\n return modName;\n }) + ')'),\n lookbehind: true,\n greedy: true,\n inside: {\n 'string': /^[<\"][\\s\\S]+/,\n 'operator': /:/,\n 'punctuation': /\\./\n }\n },\n 'raw-string': {\n pattern: /R\"([^()\\\\ ]{0,16})\\([\\s\\S]*?\\)\\1\"/,\n alias: 'string',\n greedy: true\n }\n });\n Prism.languages.insertBefore('cpp', 'keyword', {\n 'generic-function': {\n pattern: /\\b(?!operator\\b)[a-z_]\\w*\\s*<(?:[^<>]|<[^<>]*>)*>(?=\\s*\\()/i,\n inside: {\n 'function': /^\\w+/,\n 'generic': {\n pattern: /<[\\s\\S]+/,\n alias: 'class-name',\n inside: Prism.languages.cpp\n }\n }\n }\n });\n Prism.languages.insertBefore('cpp', 'operator', {\n 'double-colon': {\n pattern: /::/,\n alias: 'punctuation'\n }\n });\n Prism.languages.insertBefore('cpp', 'class-name', {\n 'base-clause': {\n pattern: /(\\b(?:class|struct)\\s+\\w+\\s*:\\s*)[^;{}\"'\\s]+(?:\\s+[^;{}\"'\\s]+)*(?=\\s*[;{])/,\n lookbehind: true,\n greedy: true,\n inside: Prism.languages.extend('cpp', {})\n }\n });\n Prism.languages.insertBefore('inside', 'double-colon', { 'class-name': /\\b[a-z_]\\w*\\b(?!\\s*::)/i }, Prism.languages.cpp['base-clause']);\n }(Prism));\n (function (Prism) {\n function replace(pattern, replacements) {\n return pattern.replace(/<<(\\d+)>>/g, function (m, index) {\n return '(?:' + replacements[+index] + ')';\n });\n }\n function re(pattern, replacements, flags) {\n return RegExp(replace(pattern, replacements), flags || '');\n }\n function nested(pattern, depthLog2) {\n for (var i = 0; i < depthLog2; i++) {\n pattern = pattern.replace(/<>/g, function () {\n return '(?:' + pattern + ')';\n });\n }\n return pattern.replace(/<>/g, '[^\\\\s\\\\S]');\n }\n var keywordKinds = {\n type: 'bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void',\n typeDeclaration: 'class enum interface record struct',\n contextual: 'add alias and ascending async await by descending from(?=\\\\s*(?:\\\\w|$)) get global group into init(?=\\\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\\\s*{)',\n other: 'abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield'\n };\n function keywordsToPattern(words) {\n return '\\\\b(?:' + words.trim().replace(/ /g, '|') + ')\\\\b';\n }\n var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration);\n var keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other));\n var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other);\n var nonContextualKeywords = keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.other);\n var generic = nested(/<(?:[^<>;=+\\-*/%&|^]|<>)*>/.source, 2);\n var nestedRound = nested(/\\((?:[^()]|<>)*\\)/.source, 2);\n var name = /@?\\b[A-Za-z_]\\w*\\b/.source;\n var genericName = replace(/<<0>>(?:\\s*<<1>>)?/.source, [\n name,\n generic\n ]);\n var identifier = replace(/(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*/.source, [\n nonTypeKeywords,\n genericName\n ]);\n var array = /\\[\\s*(?:,\\s*)*\\]/.source;\n var typeExpressionWithoutTuple = replace(/<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?/.source, [\n identifier,\n array\n ]);\n var tupleElement = replace(/[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [\n generic,\n nestedRound,\n array\n ]);\n var tuple = replace(/\\(<<0>>+(?:,<<0>>+)+\\)/.source, [tupleElement]);\n var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?/.source, [\n tuple,\n identifier,\n array\n ]);\n var typeInside = {\n 'keyword': keywords,\n 'punctuation': /[<>()?,.:[\\]]/\n };\n var character = /'(?:[^\\r\\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'/.source;\n var regularString = /\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/.source;\n var verbatimString = /@\"(?:\"\"|\\\\[\\s\\S]|[^\\\\\"])*\"(?!\")/.source;\n Prism.languages.csharp = Prism.languages.extend('clike', {\n 'string': [\n {\n pattern: re(/(^|[^$\\\\])<<0>>/.source, [verbatimString]),\n lookbehind: true,\n greedy: true\n },\n {\n pattern: re(/(^|[^@$\\\\])<<0>>/.source, [regularString]),\n lookbehind: true,\n greedy: true\n }\n ],\n 'class-name': [\n {\n pattern: re(/(\\busing\\s+static\\s+)<<0>>(?=\\s*;)/.source, [identifier]),\n lookbehind: true,\n inside: typeInside\n },\n {\n pattern: re(/(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)/.source, [\n name,\n typeExpression\n ]),\n lookbehind: true,\n inside: typeInside\n },\n {\n pattern: re(/(\\busing\\s+)<<0>>(?=\\s*=)/.source, [name]),\n lookbehind: true\n },\n {\n pattern: re(/(\\b<<0>>\\s+)<<1>>/.source, [\n typeDeclarationKeywords,\n genericName\n ]),\n lookbehind: true,\n inside: typeInside\n },\n {\n pattern: re(/(\\bcatch\\s*\\(\\s*)<<0>>/.source, [identifier]),\n lookbehind: true,\n inside: typeInside\n },\n {\n pattern: re(/(\\bwhere\\s+)<<0>>/.source, [name]),\n lookbehind: true\n },\n {\n pattern: re(/(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>/.source, [typeExpressionWithoutTuple]),\n lookbehind: true,\n inside: typeInside\n },\n {\n pattern: re(/\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))/.source, [\n typeExpression,\n nonContextualKeywords,\n name\n ]),\n inside: typeInside\n }\n ],\n 'keyword': keywords,\n 'number': /(?:\\b0(?:x[\\da-f_]*[\\da-f]|b[01_]*[01])|(?:\\B\\.\\d+(?:_+\\d+)*|\\b\\d+(?:_+\\d+)*(?:\\.\\d+(?:_+\\d+)*)?)(?:e[-+]?\\d+(?:_+\\d+)*)?)(?:[dflmu]|lu|ul)?\\b/i,\n 'operator': />>=?|<<=?|[-=]>|([-+&|])\\1|~|\\?\\?=?|[-+*/%&|^!=<>]=?/,\n 'punctuation': /\\?\\.?|::|[{}[\\];(),.:]/\n });\n Prism.languages.insertBefore('csharp', 'number', {\n 'range': {\n pattern: /\\.\\./,\n alias: 'operator'\n }\n });\n Prism.languages.insertBefore('csharp', 'punctuation', {\n 'named-parameter': {\n pattern: re(/([(,]\\s*)<<0>>(?=\\s*:)/.source, [name]),\n lookbehind: true,\n alias: 'punctuation'\n }\n });\n Prism.languages.insertBefore('csharp', 'class-name', {\n 'namespace': {\n pattern: re(/(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])/.source, [name]),\n lookbehind: true,\n inside: { 'punctuation': /\\./ }\n },\n 'type-expression': {\n pattern: re(/(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))/.source, [nestedRound]),\n lookbehind: true,\n alias: 'class-name',\n inside: typeInside\n },\n 'return-type': {\n pattern: re(/<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))/.source, [\n typeExpression,\n identifier\n ]),\n inside: typeInside,\n alias: 'class-name'\n },\n 'constructor-invocation': {\n pattern: re(/(\\bnew\\s+)<<0>>(?=\\s*[[({])/.source, [typeExpression]),\n lookbehind: true,\n inside: typeInside,\n alias: 'class-name'\n },\n 'generic-method': {\n pattern: re(/<<0>>\\s*<<1>>(?=\\s*\\()/.source, [\n name,\n generic\n ]),\n inside: {\n 'function': re(/^<<0>>/.source, [name]),\n 'generic': {\n pattern: RegExp(generic),\n alias: 'class-name',\n inside: typeInside\n }\n }\n },\n 'type-list': {\n pattern: re(/\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))/.source, [\n typeDeclarationKeywords,\n genericName,\n name,\n typeExpression,\n keywords.source,\n nestedRound,\n /\\bnew\\s*\\(\\s*\\)/.source\n ]),\n lookbehind: true,\n inside: {\n 'record-arguments': {\n pattern: re(/(^(?!new\\s*\\()<<0>>\\s*)<<1>>/.source, [\n genericName,\n nestedRound\n ]),\n lookbehind: true,\n greedy: true,\n inside: Prism.languages.csharp\n },\n 'keyword': keywords,\n 'class-name': {\n pattern: RegExp(typeExpression),\n greedy: true,\n inside: typeInside\n },\n 'punctuation': /[,()]/\n }\n },\n 'preprocessor': {\n pattern: /(^[\\t ]*)#.*/m,\n lookbehind: true,\n alias: 'property',\n inside: {\n 'directive': {\n pattern: /(#)\\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\\b/,\n lookbehind: true,\n alias: 'keyword'\n }\n }\n }\n });\n var regularStringOrCharacter = regularString + '|' + character;\n var regularStringCharacterOrComment = replace(/\\/(?![*/])|\\/\\/[^\\r\\n]*[\\r\\n]|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|<<0>>/.source, [regularStringOrCharacter]);\n var roundExpression = nested(replace(/[^\"'/()]|<<0>>|\\(<>*\\)/.source, [regularStringCharacterOrComment]), 2);\n var attrTarget = /\\b(?:assembly|event|field|method|module|param|property|return|type)\\b/.source;\n var attr = replace(/<<0>>(?:\\s*\\(<<1>>*\\))?/.source, [\n identifier,\n roundExpression\n ]);\n Prism.languages.insertBefore('csharp', 'class-name', {\n 'attribute': {\n pattern: re(/((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])/.source, [\n attrTarget,\n attr\n ]),\n lookbehind: true,\n greedy: true,\n inside: {\n 'target': {\n pattern: re(/^<<0>>(?=\\s*:)/.source, [attrTarget]),\n alias: 'keyword'\n },\n 'attribute-arguments': {\n pattern: re(/\\(<<0>>*\\)/.source, [roundExpression]),\n inside: Prism.languages.csharp\n },\n 'class-name': {\n pattern: RegExp(identifier),\n inside: { 'punctuation': /\\./ }\n },\n 'punctuation': /[:,]/\n }\n }\n });\n var formatString = /:[^}\\r\\n]+/.source;\n var mInterpolationRound = nested(replace(/[^\"'/()]|<<0>>|\\(<>*\\)/.source, [regularStringCharacterOrComment]), 2);\n var mInterpolation = replace(/\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}/.source, [\n mInterpolationRound,\n formatString\n ]);\n var sInterpolationRound = nested(replace(/[^\"'/()]|\\/(?!\\*)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|<<0>>|\\(<>*\\)/.source, [regularStringOrCharacter]), 2);\n var sInterpolation = replace(/\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}/.source, [\n sInterpolationRound,\n formatString\n ]);\n function createInterpolationInside(interpolation, interpolationRound) {\n return {\n 'interpolation': {\n pattern: re(/((?:^|[^{])(?:\\{\\{)*)<<0>>/.source, [interpolation]),\n lookbehind: true,\n inside: {\n 'format-string': {\n pattern: re(/(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)/.source, [\n interpolationRound,\n formatString\n ]),\n lookbehind: true,\n inside: { 'punctuation': /^:/ }\n },\n 'punctuation': /^\\{|\\}$/,\n 'expression': {\n pattern: /[\\s\\S]+/,\n alias: 'language-csharp',\n inside: Prism.languages.csharp\n }\n }\n },\n 'string': /[\\s\\S]+/\n };\n }\n Prism.languages.insertBefore('csharp', 'string', {\n 'interpolation-string': [\n {\n pattern: re(/(^|[^\\\\])(?:\\$@|@\\$)\"(?:\"\"|\\\\[\\s\\S]|\\{\\{|<<0>>|[^\\\\{\"])*\"/.source, [mInterpolation]),\n lookbehind: true,\n greedy: true,\n inside: createInterpolationInside(mInterpolation, mInterpolationRound)\n },\n {\n pattern: re(/(^|[^@\\\\])\\$\"(?:\\\\.|\\{\\{|<<0>>|[^\\\\\"{])*\"/.source, [sInterpolation]),\n lookbehind: true,\n greedy: true,\n inside: createInterpolationInside(sInterpolation, sInterpolationRound)\n }\n ],\n 'char': {\n pattern: RegExp(character),\n greedy: true\n }\n });\n Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp;\n }(Prism));\n (function (Prism) {\n var string = /(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n Prism.languages.css = {\n 'comment': /\\/\\*[\\s\\S]*?\\*\\//,\n 'atrule': {\n pattern: RegExp('@[\\\\w-](?:' + /[^;{\\s\"']|\\s+(?!\\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\\s*\\{))/.source),\n inside: {\n 'rule': /^@[\\w-]+/,\n 'selector-function-argument': {\n pattern: /(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n lookbehind: true,\n alias: 'selector'\n },\n 'keyword': {\n pattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n lookbehind: true\n }\n }\n },\n 'url': {\n pattern: RegExp('\\\\burl\\\\((?:' + string.source + '|' + /(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source + ')\\\\)', 'i'),\n greedy: true,\n inside: {\n 'function': /^url/i,\n 'punctuation': /^\\(|\\)$/,\n 'string': {\n pattern: RegExp('^' + string.source + '$'),\n alias: 'url'\n }\n }\n },\n 'selector': {\n pattern: RegExp('(^|[{}\\\\s])[^{}\\\\s](?:[^{};\"\\'\\\\s]|\\\\s+(?![\\\\s{])|' + string.source + ')*(?=\\\\s*\\\\{)'),\n lookbehind: true\n },\n 'string': {\n pattern: string,\n greedy: true\n },\n 'property': {\n pattern: /(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n lookbehind: true\n },\n 'important': /!important\\b/i,\n 'function': {\n pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n lookbehind: true\n },\n 'punctuation': /[(){};:,]/\n };\n Prism.languages.css['atrule'].inside.rest = Prism.languages.css;\n var markup = Prism.languages.markup;\n if (markup) {\n markup.tag.addInlined('style', 'css');\n markup.tag.addAttribute('style', 'css');\n }\n }(Prism));\n (function (Prism) {\n var keywords = /\\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\\s*[(){}[\\]<>=%~.:,;?+\\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\\b/;\n var classNamePrefix = /(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*/.source;\n var className = {\n pattern: RegExp(/(^|[^\\w.])/.source + classNamePrefix + /[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b/.source),\n lookbehind: true,\n inside: {\n 'namespace': {\n pattern: /^[a-z]\\w*(?:\\s*\\.\\s*[a-z]\\w*)*(?:\\s*\\.)?/,\n inside: { 'punctuation': /\\./ }\n },\n 'punctuation': /\\./\n }\n };\n Prism.languages.java = Prism.languages.extend('clike', {\n 'string': {\n pattern: /(^|[^\\\\])\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,\n lookbehind: true,\n greedy: true\n },\n 'class-name': [\n className,\n {\n pattern: RegExp(/(^|[^\\w.])/.source + classNamePrefix + /[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)/.source),\n lookbehind: true,\n inside: className.inside\n },\n {\n pattern: RegExp(/(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)/.source + classNamePrefix + /[A-Z]\\w*\\b/.source),\n lookbehind: true,\n inside: className.inside\n }\n ],\n 'keyword': keywords,\n 'function': [\n Prism.languages.clike.function,\n {\n pattern: /(::\\s*)[a-z_]\\w*/,\n lookbehind: true\n }\n ],\n 'number': /\\b0b[01][01_]*L?\\b|\\b0x(?:\\.[\\da-f_p+-]+|[\\da-f_]+(?:\\.[\\da-f_p+-]+)?)\\b|(?:\\b\\d[\\d_]*(?:\\.[\\d_]*)?|\\B\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[dfl]?/i,\n 'operator': {\n pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\\+\\+|&&|\\|\\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,\n lookbehind: true\n },\n 'constant': /\\b[A-Z][A-Z_\\d]+\\b/\n });\n Prism.languages.insertBefore('java', 'string', {\n 'triple-quoted-string': {\n pattern: /\"\"\"[ \\t]*[\\r\\n](?:(?:\"|\"\")?(?:\\\\.|[^\"\\\\]))*\"\"\"/,\n greedy: true,\n alias: 'string'\n },\n 'char': {\n pattern: /'(?:\\\\.|[^'\\\\\\r\\n]){1,6}'/,\n greedy: true\n }\n });\n Prism.languages.insertBefore('java', 'class-name', {\n 'annotation': {\n pattern: /(^|[^.])@\\w+(?:\\s*\\.\\s*\\w+)*/,\n lookbehind: true,\n alias: 'punctuation'\n },\n 'generics': {\n pattern: /<(?:[\\w\\s,.?]|&(?!&)|<(?:[\\w\\s,.?]|&(?!&)|<(?:[\\w\\s,.?]|&(?!&)|<(?:[\\w\\s,.?]|&(?!&))*>)*>)*>)*>/,\n inside: {\n 'class-name': className,\n 'keyword': keywords,\n 'punctuation': /[<>(),.:]/,\n 'operator': /[?&|]/\n }\n },\n 'import': [\n {\n pattern: RegExp(/(\\bimport\\s+)/.source + classNamePrefix + /(?:[A-Z]\\w*|\\*)(?=\\s*;)/.source),\n lookbehind: true,\n inside: {\n 'namespace': className.inside.namespace,\n 'punctuation': /\\./,\n 'operator': /\\*/,\n 'class-name': /\\w+/\n }\n },\n {\n pattern: RegExp(/(\\bimport\\s+static\\s+)/.source + classNamePrefix + /(?:\\w+|\\*)(?=\\s*;)/.source),\n lookbehind: true,\n alias: 'static',\n inside: {\n 'namespace': className.inside.namespace,\n 'static': /\\b\\w+$/,\n 'punctuation': /\\./,\n 'operator': /\\*/,\n 'class-name': /\\w+/\n }\n }\n ],\n 'namespace': {\n pattern: RegExp(/(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?/.source.replace(//g, function () {\n return keywords.source;\n })),\n lookbehind: true,\n inside: { 'punctuation': /\\./ }\n }\n });\n }(Prism));\n Prism.languages.javascript = Prism.languages.extend('clike', {\n 'class-name': [\n Prism.languages.clike['class-name'],\n {\n pattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n lookbehind: true\n }\n ],\n 'keyword': [\n {\n pattern: /((?:^|\\})\\s*)catch\\b/,\n lookbehind: true\n },\n {\n pattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:['\"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n lookbehind: true\n }\n ],\n 'function': /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n 'number': {\n pattern: RegExp(/(^|[^\\w$])/.source + '(?:' + (/NaN|Infinity/.source + '|' + /0[bB][01]+(?:_[01]+)*n?/.source + '|' + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + '|' + /0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?/.source + '|' + /\\d+(?:_\\d+)*n/.source + '|' + /(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?/.source) + ')' + /(?![\\w$])/.source),\n lookbehind: true\n },\n 'operator': /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n });\n Prism.languages.javascript['class-name'][0].pattern = /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/;\n Prism.languages.insertBefore('javascript', 'keyword', {\n 'regex': {\n pattern: RegExp(/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source + /\\//.source + '(?:' + /(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/.source + '|' + /(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + ')' + /(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/.source),\n lookbehind: true,\n greedy: true,\n inside: {\n 'regex-source': {\n pattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n lookbehind: true,\n alias: 'language-regex',\n inside: Prism.languages.regex\n },\n 'regex-delimiter': /^\\/|\\/$/,\n 'regex-flags': /^[a-z]+$/\n }\n },\n 'function-variable': {\n pattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n alias: 'function'\n },\n 'parameter': [\n {\n pattern: /(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n lookbehind: true,\n inside: Prism.languages.javascript\n },\n {\n pattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n lookbehind: true,\n inside: Prism.languages.javascript\n },\n {\n pattern: /(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n lookbehind: true,\n inside: Prism.languages.javascript\n },\n {\n pattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n lookbehind: true,\n inside: Prism.languages.javascript\n }\n ],\n 'constant': /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n });\n Prism.languages.insertBefore('javascript', 'string', {\n 'hashbang': {\n pattern: /^#!.*/,\n greedy: true,\n alias: 'comment'\n },\n 'template-string': {\n pattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n greedy: true,\n inside: {\n 'template-punctuation': {\n pattern: /^`|`$/,\n alias: 'string'\n },\n 'interpolation': {\n pattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n lookbehind: true,\n inside: {\n 'interpolation-punctuation': {\n pattern: /^\\$\\{|\\}$/,\n alias: 'punctuation'\n },\n rest: Prism.languages.javascript\n }\n },\n 'string': /[\\s\\S]+/\n }\n },\n 'string-property': {\n pattern: /((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n lookbehind: true,\n greedy: true,\n alias: 'property'\n }\n });\n Prism.languages.insertBefore('javascript', 'operator', {\n 'literal-property': {\n pattern: /((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n lookbehind: true,\n alias: 'property'\n }\n });\n if (Prism.languages.markup) {\n Prism.languages.markup.tag.addInlined('script', 'javascript');\n Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source, 'javascript');\n }\n Prism.languages.js = Prism.languages.javascript;\n Prism.languages.markup = {\n 'comment': {\n pattern: //,\n greedy: true\n },\n 'prolog': {\n pattern: /<\\?[\\s\\S]+?\\?>/,\n greedy: true\n },\n 'doctype': {\n pattern: /\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|)*\\]\\s*)?>/i,\n greedy: true,\n inside: {\n 'internal-subset': {\n pattern: /(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,\n lookbehind: true,\n greedy: true,\n inside: null\n },\n 'string': {\n pattern: /\"[^\"]*\"|'[^']*'/,\n greedy: true\n },\n 'punctuation': /^$|[[\\]]/,\n 'doctype-tag': /^DOCTYPE/i,\n 'name': /[^\\s<>'\"]+/\n }\n },\n 'cdata': {\n pattern: //i,\n greedy: true\n },\n 'tag': {\n pattern: /<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,\n greedy: true,\n inside: {\n 'tag': {\n pattern: /^<\\/?[^\\s>\\/]+/,\n inside: {\n 'punctuation': /^<\\/?/,\n 'namespace': /^[^\\s>\\/:]+:/\n }\n },\n 'special-attr': [],\n 'attr-value': {\n pattern: /=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,\n inside: {\n 'punctuation': [\n {\n pattern: /^=/,\n alias: 'attr-equals'\n },\n {\n pattern: /^(\\s*)[\"']|[\"']$/,\n lookbehind: true\n }\n ]\n }\n },\n 'punctuation': /\\/?>/,\n 'attr-name': {\n pattern: /[^\\s>\\/]+/,\n inside: { 'namespace': /^[^\\s>\\/:]+:/ }\n }\n }\n },\n 'entity': [\n {\n pattern: /&[\\da-z]{1,8};/i,\n alias: 'named-entity'\n },\n /&#x?[\\da-f]{1,8};/i\n ]\n };\n Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity'];\n Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;\n Prism.hooks.add('wrap', function (env) {\n if (env.type === 'entity') {\n env.attributes['title'] = env.content.replace(/&/, '&');\n }\n });\n Object.defineProperty(Prism.languages.markup.tag, 'addInlined', {\n value: function addInlined(tagName, lang) {\n var includedCdataInside = {};\n includedCdataInside['language-' + lang] = {\n pattern: /(^$)/i,\n lookbehind: true,\n inside: Prism.languages[lang]\n };\n includedCdataInside['cdata'] = /^$/i;\n var inside = {\n 'included-cdata': {\n pattern: //i,\n inside: includedCdataInside\n }\n };\n inside['language-' + lang] = {\n pattern: /[\\s\\S]+/,\n inside: Prism.languages[lang]\n };\n var def = {};\n def[tagName] = {\n pattern: RegExp(/(<__[^>]*>)(?:))*\\]\\]>|(?!)/.source.replace(/__/g, function () {\n return tagName;\n }), 'i'),\n lookbehind: true,\n greedy: true,\n inside: inside\n };\n Prism.languages.insertBefore('markup', 'cdata', def);\n }\n });\n Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', {\n value: function (attrName, lang) {\n Prism.languages.markup.tag.inside['special-attr'].push({\n pattern: RegExp(/(^|[\"'\\s])/.source + '(?:' + attrName + ')' + /\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source, 'i'),\n lookbehind: true,\n inside: {\n 'attr-name': /^[^\\s=]+/,\n 'attr-value': {\n pattern: /=[\\s\\S]+/,\n inside: {\n 'value': {\n pattern: /(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,\n lookbehind: true,\n alias: [\n lang,\n 'language-' + lang\n ],\n inside: Prism.languages[lang]\n },\n 'punctuation': [\n {\n pattern: /^=/,\n alias: 'attr-equals'\n },\n /\"|'/\n ]\n }\n }\n }\n });\n }\n });\n Prism.languages.html = Prism.languages.markup;\n Prism.languages.mathml = Prism.languages.markup;\n Prism.languages.svg = Prism.languages.markup;\n Prism.languages.xml = Prism.languages.extend('markup', {});\n Prism.languages.ssml = Prism.languages.xml;\n Prism.languages.atom = Prism.languages.xml;\n Prism.languages.rss = Prism.languages.xml;\n (function (Prism) {\n var comment = /\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*|#(?!\\[).*/;\n var constant = [\n {\n pattern: /\\b(?:false|true)\\b/i,\n alias: 'boolean'\n },\n {\n pattern: /(::\\s*)\\b[a-z_]\\w*\\b(?!\\s*\\()/i,\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /(\\b(?:case|const)\\s+)\\b[a-z_]\\w*(?=\\s*[;=])/i,\n greedy: true,\n lookbehind: true\n },\n /\\b(?:null)\\b/i,\n /\\b[A-Z_][A-Z0-9_]*\\b(?!\\s*\\()/\n ];\n var number = /\\b0b[01]+(?:_[01]+)*\\b|\\b0o[0-7]+(?:_[0-7]+)*\\b|\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b|(?:\\b\\d+(?:_\\d+)*\\.?(?:\\d+(?:_\\d+)*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i;\n var operator = /|\\?\\?=?|\\.{3}|\\??->|[!=]=?=?|::|\\*\\*=?|--|\\+\\+|&&|\\|\\||<<|>>|[?~]|[/^|%*&<>.+-]=?/;\n var punctuation = /[{}\\[\\](),:;]/;\n Prism.languages.php = {\n 'delimiter': {\n pattern: /\\?>$|^<\\?(?:php(?=\\s)|=)?/i,\n alias: 'important'\n },\n 'comment': comment,\n 'variable': /\\$+(?:\\w+\\b|(?=\\{))/,\n 'package': {\n pattern: /(namespace\\s+|use\\s+(?:function\\s+)?)(?:\\\\?\\b[a-z_]\\w*)+\\b(?!\\\\)/i,\n lookbehind: true,\n inside: { 'punctuation': /\\\\/ }\n },\n 'class-name-definition': {\n pattern: /(\\b(?:class|enum|interface|trait)\\s+)\\b[a-z_]\\w*(?!\\\\)\\b/i,\n lookbehind: true,\n alias: 'class-name'\n },\n 'function-definition': {\n pattern: /(\\bfunction\\s+)[a-z_]\\w*(?=\\s*\\()/i,\n lookbehind: true,\n alias: 'function'\n },\n 'keyword': [\n {\n pattern: /(\\(\\s*)\\b(?:array|bool|boolean|float|int|integer|object|string)\\b(?=\\s*\\))/i,\n alias: 'type-casting',\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /([(,?]\\s*)\\b(?:array(?!\\s*\\()|bool|callable|(?:false|null)(?=\\s*\\|)|float|int|iterable|mixed|object|self|static|string)\\b(?=\\s*\\$)/i,\n alias: 'type-hint',\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /(\\)\\s*:\\s*(?:\\?\\s*)?)\\b(?:array(?!\\s*\\()|bool|callable|(?:false|null)(?=\\s*\\|)|float|int|iterable|mixed|never|object|self|static|string|void)\\b/i,\n alias: 'return-type',\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /\\b(?:array(?!\\s*\\()|bool|float|int|iterable|mixed|object|string|void)\\b/i,\n alias: 'type-declaration',\n greedy: true\n },\n {\n pattern: /(\\|\\s*)(?:false|null)\\b|\\b(?:false|null)(?=\\s*\\|)/i,\n alias: 'type-declaration',\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /\\b(?:parent|self|static)(?=\\s*::)/i,\n alias: 'static-context',\n greedy: true\n },\n {\n pattern: /(\\byield\\s+)from\\b/i,\n lookbehind: true\n },\n /\\bclass\\b/i,\n {\n pattern: /((?:^|[^\\s>:]|(?:^|[^-])>|(?:^|[^:]):)\\s*)\\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\\b/i,\n lookbehind: true\n }\n ],\n 'argument-name': {\n pattern: /([(,]\\s*)\\b[a-z_]\\w*(?=\\s*:(?!:))/i,\n lookbehind: true\n },\n 'class-name': [\n {\n pattern: /(\\b(?:extends|implements|instanceof|new(?!\\s+self|\\s+static))\\s+|\\bcatch\\s*\\()\\b[a-z_]\\w*(?!\\\\)\\b/i,\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /(\\|\\s*)\\b[a-z_]\\w*(?!\\\\)\\b/i,\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /\\b[a-z_]\\w*(?!\\\\)\\b(?=\\s*\\|)/i,\n greedy: true\n },\n {\n pattern: /(\\|\\s*)(?:\\\\?\\b[a-z_]\\w*)+\\b/i,\n alias: 'class-name-fully-qualified',\n greedy: true,\n lookbehind: true,\n inside: { 'punctuation': /\\\\/ }\n },\n {\n pattern: /(?:\\\\?\\b[a-z_]\\w*)+\\b(?=\\s*\\|)/i,\n alias: 'class-name-fully-qualified',\n greedy: true,\n inside: { 'punctuation': /\\\\/ }\n },\n {\n pattern: /(\\b(?:extends|implements|instanceof|new(?!\\s+self\\b|\\s+static\\b))\\s+|\\bcatch\\s*\\()(?:\\\\?\\b[a-z_]\\w*)+\\b(?!\\\\)/i,\n alias: 'class-name-fully-qualified',\n greedy: true,\n lookbehind: true,\n inside: { 'punctuation': /\\\\/ }\n },\n {\n pattern: /\\b[a-z_]\\w*(?=\\s*\\$)/i,\n alias: 'type-declaration',\n greedy: true\n },\n {\n pattern: /(?:\\\\?\\b[a-z_]\\w*)+(?=\\s*\\$)/i,\n alias: [\n 'class-name-fully-qualified',\n 'type-declaration'\n ],\n greedy: true,\n inside: { 'punctuation': /\\\\/ }\n },\n {\n pattern: /\\b[a-z_]\\w*(?=\\s*::)/i,\n alias: 'static-context',\n greedy: true\n },\n {\n pattern: /(?:\\\\?\\b[a-z_]\\w*)+(?=\\s*::)/i,\n alias: [\n 'class-name-fully-qualified',\n 'static-context'\n ],\n greedy: true,\n inside: { 'punctuation': /\\\\/ }\n },\n {\n pattern: /([(,?]\\s*)[a-z_]\\w*(?=\\s*\\$)/i,\n alias: 'type-hint',\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /([(,?]\\s*)(?:\\\\?\\b[a-z_]\\w*)+(?=\\s*\\$)/i,\n alias: [\n 'class-name-fully-qualified',\n 'type-hint'\n ],\n greedy: true,\n lookbehind: true,\n inside: { 'punctuation': /\\\\/ }\n },\n {\n pattern: /(\\)\\s*:\\s*(?:\\?\\s*)?)\\b[a-z_]\\w*(?!\\\\)\\b/i,\n alias: 'return-type',\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /(\\)\\s*:\\s*(?:\\?\\s*)?)(?:\\\\?\\b[a-z_]\\w*)+\\b(?!\\\\)/i,\n alias: [\n 'class-name-fully-qualified',\n 'return-type'\n ],\n greedy: true,\n lookbehind: true,\n inside: { 'punctuation': /\\\\/ }\n }\n ],\n 'constant': constant,\n 'function': {\n pattern: /(^|[^\\\\\\w])\\\\?[a-z_](?:[\\w\\\\]*\\w)?(?=\\s*\\()/i,\n lookbehind: true,\n inside: { 'punctuation': /\\\\/ }\n },\n 'property': {\n pattern: /(->\\s*)\\w+/,\n lookbehind: true\n },\n 'number': number,\n 'operator': operator,\n 'punctuation': punctuation\n };\n var string_interpolation = {\n pattern: /\\{\\$(?:\\{(?:\\{[^{}]+\\}|[^{}]+)\\}|[^{}])+\\}|(^|[^\\\\{])\\$+(?:\\w+(?:\\[[^\\r\\n\\[\\]]+\\]|->\\w+)?)/,\n lookbehind: true,\n inside: Prism.languages.php\n };\n var string = [\n {\n pattern: /<<<'([^']+)'[\\r\\n](?:.*[\\r\\n])*?\\1;/,\n alias: 'nowdoc-string',\n greedy: true,\n inside: {\n 'delimiter': {\n pattern: /^<<<'[^']+'|[a-z_]\\w*;$/i,\n alias: 'symbol',\n inside: { 'punctuation': /^<<<'?|[';]$/ }\n }\n }\n },\n {\n pattern: /<<<(?:\"([^\"]+)\"[\\r\\n](?:.*[\\r\\n])*?\\1;|([a-z_]\\w*)[\\r\\n](?:.*[\\r\\n])*?\\2;)/i,\n alias: 'heredoc-string',\n greedy: true,\n inside: {\n 'delimiter': {\n pattern: /^<<<(?:\"[^\"]+\"|[a-z_]\\w*)|[a-z_]\\w*;$/i,\n alias: 'symbol',\n inside: { 'punctuation': /^<<<\"?|[\";]$/ }\n },\n 'interpolation': string_interpolation\n }\n },\n {\n pattern: /`(?:\\\\[\\s\\S]|[^\\\\`])*`/,\n alias: 'backtick-quoted-string',\n greedy: true\n },\n {\n pattern: /'(?:\\\\[\\s\\S]|[^\\\\'])*'/,\n alias: 'single-quoted-string',\n greedy: true\n },\n {\n pattern: /\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"/,\n alias: 'double-quoted-string',\n greedy: true,\n inside: { 'interpolation': string_interpolation }\n }\n ];\n Prism.languages.insertBefore('php', 'variable', {\n 'string': string,\n 'attribute': {\n pattern: /#\\[(?:[^\"'\\/#]|\\/(?![*/])|\\/\\/.*$|#(?!\\[).*$|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"|'(?:\\\\[\\s\\S]|[^\\\\'])*')+\\](?=\\s*[a-z$#])/im,\n greedy: true,\n inside: {\n 'attribute-content': {\n pattern: /^(#\\[)[\\s\\S]+(?=\\]$)/,\n lookbehind: true,\n inside: {\n 'comment': comment,\n 'string': string,\n 'attribute-class-name': [\n {\n pattern: /([^:]|^)\\b[a-z_]\\w*(?!\\\\)\\b/i,\n alias: 'class-name',\n greedy: true,\n lookbehind: true\n },\n {\n pattern: /([^:]|^)(?:\\\\?\\b[a-z_]\\w*)+/i,\n alias: [\n 'class-name',\n 'class-name-fully-qualified'\n ],\n greedy: true,\n lookbehind: true,\n inside: { 'punctuation': /\\\\/ }\n }\n ],\n 'constant': constant,\n 'number': number,\n 'operator': operator,\n 'punctuation': punctuation\n }\n },\n 'delimiter': {\n pattern: /^#\\[|\\]$/,\n alias: 'punctuation'\n }\n }\n }\n });\n Prism.hooks.add('before-tokenize', function (env) {\n if (!/<\\?/.test(env.code)) {\n return;\n }\n var phpPattern = /<\\?(?:[^\"'/#]|\\/(?![*/])|(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|(?:\\/\\/|#(?!\\[))(?:[^?\\n\\r]|\\?(?!>))*(?=$|\\?>|[\\r\\n])|#\\[|\\/\\*(?:[^*]|\\*(?!\\/))*(?:\\*\\/|$))*?(?:\\?>|$)/g;\n Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern);\n });\n Prism.hooks.add('after-tokenize', function (env) {\n Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php');\n });\n }(Prism));\n Prism.languages.python = {\n 'comment': {\n pattern: /(^|[^\\\\])#.*/,\n lookbehind: true,\n greedy: true\n },\n 'string-interpolation': {\n pattern: /(?:f|fr|rf)(?:(\"\"\"|''')[\\s\\S]*?\\1|(\"|')(?:\\\\.|(?!\\2)[^\\\\\\r\\n])*\\2)/i,\n greedy: true,\n inside: {\n 'interpolation': {\n pattern: /((?:^|[^{])(?:\\{\\{)*)\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}])+\\})+\\})+\\}/,\n lookbehind: true,\n inside: {\n 'format-spec': {\n pattern: /(:)[^:(){}]+(?=\\}$)/,\n lookbehind: true\n },\n 'conversion-option': {\n pattern: /![sra](?=[:}]$)/,\n alias: 'punctuation'\n },\n rest: null\n }\n },\n 'string': /[\\s\\S]+/\n }\n },\n 'triple-quoted-string': {\n pattern: /(?:[rub]|br|rb)?(\"\"\"|''')[\\s\\S]*?\\1/i,\n greedy: true,\n alias: 'string'\n },\n 'string': {\n pattern: /(?:[rub]|br|rb)?(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/i,\n greedy: true\n },\n 'function': {\n pattern: /((?:^|\\s)def[ \\t]+)[a-zA-Z_]\\w*(?=\\s*\\()/g,\n lookbehind: true\n },\n 'class-name': {\n pattern: /(\\bclass\\s+)\\w+/i,\n lookbehind: true\n },\n 'decorator': {\n pattern: /(^[\\t ]*)@\\w+(?:\\.\\w+)*/m,\n lookbehind: true,\n alias: [\n 'annotation',\n 'punctuation'\n ],\n inside: { 'punctuation': /\\./ }\n },\n 'keyword': /\\b(?:_(?=\\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\\b/,\n 'builtin': /\\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\\b/,\n 'boolean': /\\b(?:False|None|True)\\b/,\n 'number': /\\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\\b|(?:\\b\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\B\\.\\d+(?:_\\d+)*)(?:e[+-]?\\d+(?:_\\d+)*)?j?(?!\\w)/i,\n 'operator': /[-+%=]=?|!=|:=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]/,\n 'punctuation': /[{}[\\];(),.:]/\n };\n Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python;\n Prism.languages.py = Prism.languages.python;\n (function (Prism) {\n Prism.languages.ruby = Prism.languages.extend('clike', {\n 'comment': {\n pattern: /#.*|^=begin\\s[\\s\\S]*?^=end/m,\n greedy: true\n },\n 'class-name': {\n pattern: /(\\b(?:class|module)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+|\\b[A-Z_]\\w*(?=\\s*\\.\\s*new\\b)/,\n lookbehind: true,\n inside: { 'punctuation': /[.\\\\]/ }\n },\n 'keyword': /\\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\\b/,\n 'operator': /\\.{2,3}|&\\.|===||[!=]?~|(?:&&|\\|\\||<<|>>|\\*\\*|[+\\-*/%<>!^&|=])=?|[?:]/,\n 'punctuation': /[(){}[\\].,;]/\n });\n Prism.languages.insertBefore('ruby', 'operator', {\n 'double-colon': {\n pattern: /::/,\n alias: 'punctuation'\n }\n });\n var interpolation = {\n pattern: /((?:^|[^\\\\])(?:\\\\{2})*)#\\{(?:[^{}]|\\{[^{}]*\\})*\\}/,\n lookbehind: true,\n inside: {\n 'content': {\n pattern: /^(#\\{)[\\s\\S]+(?=\\}$)/,\n lookbehind: true,\n inside: Prism.languages.ruby\n },\n 'delimiter': {\n pattern: /^#\\{|\\}$/,\n alias: 'punctuation'\n }\n }\n };\n delete Prism.languages.ruby.function;\n var percentExpression = '(?:' + [\n /([^a-zA-Z0-9\\s{(\\[<=])(?:(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/.source,\n /\\((?:[^()\\\\]|\\\\[\\s\\S]|\\((?:[^()\\\\]|\\\\[\\s\\S])*\\))*\\)/.source,\n /\\{(?:[^{}\\\\]|\\\\[\\s\\S]|\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\})*\\}/.source,\n /\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S]|\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S])*\\])*\\]/.source,\n /<(?:[^<>\\\\]|\\\\[\\s\\S]|<(?:[^<>\\\\]|\\\\[\\s\\S])*>)*>/.source\n ].join('|') + ')';\n var symbolName = /(?:\"(?:\\\\.|[^\"\\\\\\r\\n])*\"|(?:\\b[a-zA-Z_]\\w*|[^\\s\\0-\\x7F]+)[?!]?|\\$.)/.source;\n Prism.languages.insertBefore('ruby', 'keyword', {\n 'regex-literal': [\n {\n pattern: RegExp(/%r/.source + percentExpression + /[egimnosux]{0,6}/.source),\n greedy: true,\n inside: {\n 'interpolation': interpolation,\n 'regex': /[\\s\\S]+/\n }\n },\n {\n pattern: /(^|[^/])\\/(?!\\/)(?:\\[[^\\r\\n\\]]+\\]|\\\\.|[^[/\\\\\\r\\n])+\\/[egimnosux]{0,6}(?=\\s*(?:$|[\\r\\n,.;})#]))/,\n lookbehind: true,\n greedy: true,\n inside: {\n 'interpolation': interpolation,\n 'regex': /[\\s\\S]+/\n }\n }\n ],\n 'variable': /[@$]+[a-zA-Z_]\\w*(?:[?!]|\\b)/,\n 'symbol': [\n {\n pattern: RegExp(/(^|[^:]):/.source + symbolName),\n lookbehind: true,\n greedy: true\n },\n {\n pattern: RegExp(/([\\r\\n{(,][ \\t]*)/.source + symbolName + /(?=:(?!:))/.source),\n lookbehind: true,\n greedy: true\n }\n ],\n 'method-definition': {\n pattern: /(\\bdef\\s+)\\w+(?:\\s*\\.\\s*\\w+)?/,\n lookbehind: true,\n inside: {\n 'function': /\\b\\w+$/,\n 'keyword': /^self\\b/,\n 'class-name': /^\\w+/,\n 'punctuation': /\\./\n }\n }\n });\n Prism.languages.insertBefore('ruby', 'string', {\n 'string-literal': [\n {\n pattern: RegExp(/%[qQiIwWs]?/.source + percentExpression),\n greedy: true,\n inside: {\n 'interpolation': interpolation,\n 'string': /[\\s\\S]+/\n }\n },\n {\n pattern: /(\"|')(?:#\\{[^}]+\\}|#(?!\\{)|\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\#\\r\\n])*\\1/,\n greedy: true,\n inside: {\n 'interpolation': interpolation,\n 'string': /[\\s\\S]+/\n }\n },\n {\n pattern: /<<[-~]?([a-z_]\\w*)[\\r\\n](?:.*[\\r\\n])*?[\\t ]*\\1/i,\n alias: 'heredoc-string',\n greedy: true,\n inside: {\n 'delimiter': {\n pattern: /^<<[-~]?[a-z_]\\w*|\\b[a-z_]\\w*$/i,\n inside: {\n 'symbol': /\\b\\w+/,\n 'punctuation': /^<<[-~]?/\n }\n },\n 'interpolation': interpolation,\n 'string': /[\\s\\S]+/\n }\n },\n {\n pattern: /<<[-~]?'([a-z_]\\w*)'[\\r\\n](?:.*[\\r\\n])*?[\\t ]*\\1/i,\n alias: 'heredoc-string',\n greedy: true,\n inside: {\n 'delimiter': {\n pattern: /^<<[-~]?'[a-z_]\\w*'|\\b[a-z_]\\w*$/i,\n inside: {\n 'symbol': /\\b\\w+/,\n 'punctuation': /^<<[-~]?'|'$/\n }\n },\n 'string': /[\\s\\S]+/\n }\n }\n ],\n 'command-literal': [\n {\n pattern: RegExp(/%x/.source + percentExpression),\n greedy: true,\n inside: {\n 'interpolation': interpolation,\n 'command': {\n pattern: /[\\s\\S]+/,\n alias: 'string'\n }\n }\n },\n {\n pattern: /`(?:#\\{[^}]+\\}|#(?!\\{)|\\\\(?:\\r\\n|[\\s\\S])|[^\\\\`#\\r\\n])*`/,\n greedy: true,\n inside: {\n 'interpolation': interpolation,\n 'command': {\n pattern: /[\\s\\S]+/,\n alias: 'string'\n }\n }\n }\n ]\n });\n delete Prism.languages.ruby.string;\n Prism.languages.insertBefore('ruby', 'number', {\n 'builtin': /\\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\\b/,\n 'constant': /\\b[A-Z][A-Z0-9_]*(?:[?!]|\\b)/\n });\n Prism.languages.rb = Prism.languages.ruby;\n }(Prism));\n var Prism$1 = prismCore.exports;\n var prismjs = { boltExport: Prism$1 };\n return prismjs;\n }));\n var prism = window.Prism;\n window.Prism = oldprism;\n return prism;\n }(undefined, exports$1, module));\n var Prism$1 = module.exports.boltExport;\n\n var getLanguages$1 = function (editor) {\n return editor.getParam('codesample_languages');\n };\n var useGlobalPrismJS = function (editor) {\n return editor.getParam('codesample_global_prismjs', false, 'boolean');\n };\n\n var get = function (editor) {\n return Global.Prism && useGlobalPrismJS(editor) ? Global.Prism : Prism$1;\n };\n\n var getSelectedCodeSample = function (editor) {\n var node = editor.selection ? editor.selection.getNode() : null;\n return someIf(isCodeSample(node), node);\n };\n var insertCodeSample = function (editor, language, code) {\n editor.undoManager.transact(function () {\n var node = getSelectedCodeSample(editor);\n code = global$1.DOM.encode(code);\n return node.fold(function () {\n editor.insertContent('
' + code + '
');\n editor.selection.select(editor.$('#__new').removeAttr('id')[0]);\n }, function (n) {\n editor.dom.setAttrib(n, 'class', 'language-' + language);\n n.innerHTML = code;\n get(editor).highlightElement(n);\n editor.selection.select(n);\n });\n });\n };\n var getCurrentCode = function (editor) {\n var node = getSelectedCodeSample(editor);\n return node.fold(constant(''), function (n) {\n return n.textContent;\n });\n };\n\n var getLanguages = function (editor) {\n var defaultLanguages = [\n {\n text: 'HTML/XML',\n value: 'markup'\n },\n {\n text: 'JavaScript',\n value: 'javascript'\n },\n {\n text: 'CSS',\n value: 'css'\n },\n {\n text: 'PHP',\n value: 'php'\n },\n {\n text: 'Ruby',\n value: 'ruby'\n },\n {\n text: 'Python',\n value: 'python'\n },\n {\n text: 'Java',\n value: 'java'\n },\n {\n text: 'C',\n value: 'c'\n },\n {\n text: 'C#',\n value: 'csharp'\n },\n {\n text: 'C++',\n value: 'cpp'\n }\n ];\n var customLanguages = getLanguages$1(editor);\n return customLanguages ? customLanguages : defaultLanguages;\n };\n var getCurrentLanguage = function (editor, fallback) {\n var node = getSelectedCodeSample(editor);\n return node.fold(function () {\n return fallback;\n }, function (n) {\n var matches = n.className.match(/language-(\\w+)/);\n return matches ? matches[1] : fallback;\n });\n };\n\n var open = function (editor) {\n var languages = getLanguages(editor);\n var defaultLanguage = head(languages).fold(constant(''), function (l) {\n return l.value;\n });\n var currentLanguage = getCurrentLanguage(editor, defaultLanguage);\n var currentCode = getCurrentCode(editor);\n editor.windowManager.open({\n title: 'Insert/Edit Code Sample',\n size: 'large',\n body: {\n type: 'panel',\n items: [\n {\n type: 'selectbox',\n name: 'language',\n label: 'Language',\n items: languages\n },\n {\n type: 'textarea',\n name: 'code',\n label: 'Code view'\n }\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: {\n language: currentLanguage,\n code: currentCode\n },\n onSubmit: function (api) {\n var data = api.getData();\n insertCodeSample(editor, data.language, data.code);\n api.close();\n }\n });\n };\n\n var register$1 = function (editor) {\n editor.addCommand('codesample', function () {\n var node = editor.selection.getNode();\n if (editor.selection.isCollapsed() || isCodeSample(node)) {\n open(editor);\n } else {\n editor.formatter.toggle('code');\n }\n });\n };\n\n var setup = function (editor) {\n var $ = editor.$;\n editor.on('PreProcess', function (e) {\n $('pre[contenteditable=false]', e.node).filter(trimArg(isCodeSample)).each(function (idx, elm) {\n var $elm = $(elm), code = elm.textContent;\n $elm.attr('class', $.trim($elm.attr('class')));\n $elm.removeAttr('contentEditable');\n $elm.empty().append($('').each(function () {\n this.textContent = code;\n }));\n });\n });\n editor.on('SetContent', function () {\n var unprocessedCodeSamples = $('pre').filter(trimArg(isCodeSample)).filter(function (idx, elm) {\n return elm.contentEditable !== 'false';\n });\n if (unprocessedCodeSamples.length) {\n editor.undoManager.transact(function () {\n unprocessedCodeSamples.each(function (idx, elm) {\n $(elm).find('br').each(function (idx, elm) {\n elm.parentNode.replaceChild(editor.getDoc().createTextNode('\\n'), elm);\n });\n elm.contentEditable = 'false';\n elm.innerHTML = editor.dom.encode(elm.textContent);\n get(editor).highlightElement(elm);\n elm.className = $.trim(elm.className);\n });\n });\n }\n });\n };\n\n var isCodeSampleSelection = function (editor) {\n var node = editor.selection.getStart();\n return editor.dom.is(node, 'pre[class*=\"language-\"]');\n };\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('codesample');\n };\n editor.ui.registry.addToggleButton('codesample', {\n icon: 'code-sample',\n tooltip: 'Insert/edit code sample',\n onAction: onAction,\n onSetup: function (api) {\n var nodeChangeHandler = function () {\n api.setActive(isCodeSampleSelection(editor));\n };\n editor.on('NodeChange', nodeChangeHandler);\n return function () {\n return editor.off('NodeChange', nodeChangeHandler);\n };\n }\n });\n editor.ui.registry.addMenuItem('codesample', {\n text: 'Code sample...',\n icon: 'code-sample',\n onAction: onAction\n });\n };\n\n function Plugin () {\n global$2.add('codesample', function (editor) {\n setup(editor);\n register(editor);\n register$1(editor);\n editor.on('dblclick', function (ev) {\n if (isCodeSample(ev.target)) {\n open(editor);\n }\n });\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/codesample/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/directionality/index.js": /*!******************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/directionality/index.js ***! \******************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"directionality\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/directionality')\n// ES2015:\n// import 'tinymce/plugins/directionality'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/directionality/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/directionality/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/directionality/plugin.js": /*!*******************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/directionality/plugin.js ***! \*******************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType$1 = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var isString = isType$1('string');\n var isBoolean = isSimpleType('boolean');\n var isNullable = function (a) {\n return a === null || a === undefined;\n };\n var isNonNullable = function (a) {\n return !isNullable(a);\n };\n var isFunction = isSimpleType('function');\n var isNumber = isSimpleType('number');\n\n var noop = function () {\n };\n var compose1 = function (fbc, fab) {\n return function (a) {\n return fbc(fab(a));\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 var never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\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 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\n var DOCUMENT = 9;\n var DOCUMENT_FRAGMENT = 11;\n var ELEMENT = 1;\n var TEXT = 3;\n\n var fromHtml = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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 || document;\n var node = doc.createElement(tag);\n return fromDom(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || 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: node };\n };\n var fromPoint = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n };\n var SugarElement = {\n fromHtml: fromHtml,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom,\n fromPoint: fromPoint\n };\n\n var is = function (element, selector) {\n var dom = element.dom;\n if (dom.nodeType !== ELEMENT) {\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 typeof window !== 'undefined' ? 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 = function (t) {\n return function (element) {\n return type(element) === t;\n };\n };\n var isElement = isType(ELEMENT);\n var isText = isType(TEXT);\n var isDocument = isType(DOCUMENT);\n var isDocumentFragment = isType(DOCUMENT_FRAGMENT);\n var isTag = function (tag) {\n return function (e) {\n return isElement(e) && name(e) === tag;\n };\n };\n\n var owner = function (element) {\n return SugarElement.fromDom(element.dom.ownerDocument);\n };\n var documentOrOwner = function (dos) {\n return isDocument(dos) ? dos : owner(dos);\n };\n var parent = function (element) {\n return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);\n };\n var children$2 = function (element) {\n return map(element.dom.childNodes, SugarElement.fromDom);\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 console.error('Invalid call to Attribute.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 remove = function (element, key) {\n element.dom.removeAttribute(key);\n };\n\n var isShadowRoot = function (dos) {\n return isDocumentFragment(dos) && isNonNullable(dos.dom.host);\n };\n var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);\n var getRootNode = supported ? function (e) {\n return SugarElement.fromDom(e.dom.getRootNode());\n } : documentOrOwner;\n var getShadowRoot = function (e) {\n var r = getRootNode(e);\n return isShadowRoot(r) ? Optional.some(r) : Optional.none();\n };\n var getShadowHost = function (e) {\n return SugarElement.fromDom(e.dom.host);\n };\n\n var inBody = function (element) {\n var dom = isText(element) ? element.dom.parentNode : element.dom;\n if (dom === undefined || dom === null || dom.ownerDocument === null) {\n return false;\n }\n var doc = dom.ownerDocument;\n return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {\n return doc.body.contains(dom);\n }, compose1(inBody, getShadowHost));\n };\n\n var ancestor$1 = function (scope, predicate, isRoot) {\n var element = scope.dom;\n var stop = isFunction(isRoot) ? isRoot : never;\n while (element.parentNode) {\n element = element.parentNode;\n var el = SugarElement.fromDom(element);\n if (predicate(el)) {\n return Optional.some(el);\n } else if (stop(el)) {\n break;\n }\n }\n return Optional.none();\n };\n\n var ancestor = function (scope, selector, isRoot) {\n return ancestor$1(scope, function (e) {\n return is(e, selector);\n }, isRoot);\n };\n\n var isSupported = function (dom) {\n return dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n };\n\n var get = function (element, property) {\n var dom = element.dom;\n var styles = window.getComputedStyle(dom);\n var r = styles.getPropertyValue(property);\n return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\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 children$1 = function (scope, predicate) {\n return filter(children$2(scope), predicate);\n };\n\n var children = function (scope, selector) {\n return children$1(scope, function (e) {\n return is(e, selector);\n });\n };\n\n var getParentElement = function (element) {\n return parent(element).filter(isElement);\n };\n var getNormalizedBlock = function (element, isListItem) {\n var normalizedElement = isListItem ? ancestor(element, 'ol,ul') : Optional.some(element);\n return normalizedElement.getOr(element);\n };\n var isListItem = isTag('li');\n var setDir = function (editor, dir) {\n var selectedBlocks = editor.selection.getSelectedBlocks();\n if (selectedBlocks.length > 0) {\n each(selectedBlocks, function (block) {\n var blockElement = SugarElement.fromDom(block);\n var isBlockElementListItem = isListItem(blockElement);\n var normalizedBlock = getNormalizedBlock(blockElement, isBlockElementListItem);\n var normalizedBlockParent = getParentElement(normalizedBlock);\n normalizedBlockParent.each(function (parent) {\n var parentDirection = getDirection(parent);\n if (parentDirection !== dir) {\n set(normalizedBlock, 'dir', dir);\n } else if (getDirection(normalizedBlock) !== dir) {\n remove(normalizedBlock, 'dir');\n }\n if (isBlockElementListItem) {\n var listItems = children(normalizedBlock, 'li[dir]');\n each(listItems, function (listItem) {\n return remove(listItem, 'dir');\n });\n }\n });\n });\n editor.nodeChanged();\n }\n };\n\n var register$1 = function (editor) {\n editor.addCommand('mceDirectionLTR', function () {\n setDir(editor, 'ltr');\n });\n editor.addCommand('mceDirectionRTL', function () {\n setDir(editor, 'rtl');\n });\n };\n\n var getNodeChangeHandler = function (editor, dir) {\n return function (api) {\n var nodeChangeHandler = function (e) {\n var element = SugarElement.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 = 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\n function Plugin () {\n global.add('directionality', function (editor) {\n register$1(editor);\n register(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/directionality/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/index.js": /*!*************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/index.js ***! \*************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"emoticons\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/emoticons')\n// ES2015:\n// import 'tinymce/plugins/emoticons'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/js/emojis.js": /*!*****************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/js/emojis.js ***! \*****************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("// Source: npm package: emojilib, file:emojis.json\nwindow.tinymce.Resource.add(\"tinymce.plugins.emoticons\", {\n grinning: {\n keywords: [ \"face\", \"smile\", \"happy\", \"joy\", \":D\", \"grin\" ],\n char: \"\\ud83d\\ude00\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n grimacing: {\n keywords: [ \"face\", \"grimace\", \"teeth\" ],\n char: \"\\ud83d\\ude2c\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n grin: {\n keywords: [ \"face\", \"happy\", \"smile\", \"joy\", \"kawaii\" ],\n char: \"\\ud83d\\ude01\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n joy: {\n keywords: [ \"face\", \"cry\", \"tears\", \"weep\", \"happy\", \"happytears\", \"haha\" ],\n char: \"\\ud83d\\ude02\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n rofl: {\n keywords: [ \"face\", \"rolling\", \"floor\", \"laughing\", \"lol\", \"haha\" ],\n char: \"\\ud83e\\udd23\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n partying: {\n keywords: [ \"face\", \"celebration\", \"woohoo\" ],\n char: \"\\ud83e\\udd73\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n smiley: {\n keywords: [ \"face\", \"happy\", \"joy\", \"haha\", \":D\", \":)\", \"smile\", \"funny\" ],\n char: \"\\ud83d\\ude03\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n smile: {\n keywords: [ \"face\", \"happy\", \"joy\", \"funny\", \"haha\", \"laugh\", \"like\", \":D\", \":)\" ],\n char: \"\\ud83d\\ude04\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n sweat_smile: {\n keywords: [ \"face\", \"hot\", \"happy\", \"laugh\", \"sweat\", \"smile\", \"relief\" ],\n char: \"\\ud83d\\ude05\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n laughing: {\n keywords: [ \"happy\", \"joy\", \"lol\", \"satisfied\", \"haha\", \"face\", \"glad\", \"XD\", \"laugh\" ],\n char: \"\\ud83d\\ude06\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n innocent: {\n keywords: [ \"face\", \"angel\", \"heaven\", \"halo\" ],\n char: \"\\ud83d\\ude07\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n wink: {\n keywords: [ \"face\", \"happy\", \"mischievous\", \"secret\", \";)\", \"smile\", \"eye\" ],\n char: \"\\ud83d\\ude09\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n blush: {\n keywords: [ \"face\", \"smile\", \"happy\", \"flushed\", \"crush\", \"embarrassed\", \"shy\", \"joy\" ],\n char: \"\\ud83d\\ude0a\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n slightly_smiling_face: {\n keywords: [ \"face\", \"smile\" ],\n char: \"\\ud83d\\ude42\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n upside_down_face: {\n keywords: [ \"face\", \"flipped\", \"silly\", \"smile\" ],\n char: \"\\ud83d\\ude43\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n relaxed: {\n keywords: [ \"face\", \"blush\", \"massage\", \"happiness\" ],\n char: \"\\u263a\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n yum: {\n keywords: [ \"happy\", \"joy\", \"tongue\", \"smile\", \"face\", \"silly\", \"yummy\", \"nom\", \"delicious\", \"savouring\" ],\n char: \"\\ud83d\\ude0b\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n relieved: {\n keywords: [ \"face\", \"relaxed\", \"phew\", \"massage\", \"happiness\" ],\n char: \"\\ud83d\\ude0c\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n heart_eyes: {\n keywords: [ \"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"crush\", \"heart\" ],\n char: \"\\ud83d\\ude0d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n smiling_face_with_three_hearts: {\n keywords: [ \"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"crush\", \"hearts\", \"adore\" ],\n char: \"\\ud83e\\udd70\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n kissing_heart: {\n keywords: [ \"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"kiss\" ],\n char: \"\\ud83d\\ude18\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n kissing: {\n keywords: [ \"love\", \"like\", \"face\", \"3\", \"valentines\", \"infatuation\", \"kiss\" ],\n char: \"\\ud83d\\ude17\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n kissing_smiling_eyes: {\n keywords: [ \"face\", \"affection\", \"valentines\", \"infatuation\", \"kiss\" ],\n char: \"\\ud83d\\ude19\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n kissing_closed_eyes: {\n keywords: [ \"face\", \"love\", \"like\", \"affection\", \"valentines\", \"infatuation\", \"kiss\" ],\n char: \"\\ud83d\\ude1a\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n stuck_out_tongue_winking_eye: {\n keywords: [ \"face\", \"prank\", \"childish\", \"playful\", \"mischievous\", \"smile\", \"wink\", \"tongue\" ],\n char: \"\\ud83d\\ude1c\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n zany: {\n keywords: [ \"face\", \"goofy\", \"crazy\" ],\n char: \"\\ud83e\\udd2a\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n raised_eyebrow: {\n keywords: [ \"face\", \"distrust\", \"scepticism\", \"disapproval\", \"disbelief\", \"surprise\" ],\n char: \"\\ud83e\\udd28\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n monocle: {\n keywords: [ \"face\", \"stuffy\", \"wealthy\" ],\n char: \"\\ud83e\\uddd0\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n stuck_out_tongue_closed_eyes: {\n keywords: [ \"face\", \"prank\", \"playful\", \"mischievous\", \"smile\", \"tongue\" ],\n char: \"\\ud83d\\ude1d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n stuck_out_tongue: {\n keywords: [ \"face\", \"prank\", \"childish\", \"playful\", \"mischievous\", \"smile\", \"tongue\" ],\n char: \"\\ud83d\\ude1b\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n money_mouth_face: {\n keywords: [ \"face\", \"rich\", \"dollar\", \"money\" ],\n char: \"\\ud83e\\udd11\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n nerd_face: {\n keywords: [ \"face\", \"nerdy\", \"geek\", \"dork\" ],\n char: \"\\ud83e\\udd13\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n sunglasses: {\n keywords: [ \"face\", \"cool\", \"smile\", \"summer\", \"beach\", \"sunglass\" ],\n char: \"\\ud83d\\ude0e\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n star_struck: {\n keywords: [ \"face\", \"smile\", \"starry\", \"eyes\", \"grinning\" ],\n char: \"\\ud83e\\udd29\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n clown_face: {\n keywords: [ \"face\" ],\n char: \"\\ud83e\\udd21\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n cowboy_hat_face: {\n keywords: [ \"face\", \"cowgirl\", \"hat\" ],\n char: \"\\ud83e\\udd20\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n hugs: {\n keywords: [ \"face\", \"smile\", \"hug\" ],\n char: \"\\ud83e\\udd17\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n smirk: {\n keywords: [ \"face\", \"smile\", \"mean\", \"prank\", \"smug\", \"sarcasm\" ],\n char: \"\\ud83d\\ude0f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n no_mouth: {\n keywords: [ \"face\", \"hellokitty\" ],\n char: \"\\ud83d\\ude36\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n neutral_face: {\n keywords: [ \"indifference\", \"meh\", \":|\", \"neutral\" ],\n char: \"\\ud83d\\ude10\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n expressionless: {\n keywords: [ \"face\", \"indifferent\", \"-_-\", \"meh\", \"deadpan\" ],\n char: \"\\ud83d\\ude11\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n unamused: {\n keywords: [ \"indifference\", \"bored\", \"straight face\", \"serious\", \"sarcasm\", \"unimpressed\", \"skeptical\", \"dubious\", \"side_eye\" ],\n char: \"\\ud83d\\ude12\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n roll_eyes: {\n keywords: [ \"face\", \"eyeroll\", \"frustrated\" ],\n char: \"\\ud83d\\ude44\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n thinking: {\n keywords: [ \"face\", \"hmmm\", \"think\", \"consider\" ],\n char: \"\\ud83e\\udd14\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n lying_face: {\n keywords: [ \"face\", \"lie\", \"pinocchio\" ],\n char: \"\\ud83e\\udd25\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n hand_over_mouth: {\n keywords: [ \"face\", \"whoops\", \"shock\", \"surprise\" ],\n char: \"\\ud83e\\udd2d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n shushing: {\n keywords: [ \"face\", \"quiet\", \"shhh\" ],\n char: \"\\ud83e\\udd2b\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n symbols_over_mouth: {\n keywords: [ \"face\", \"swearing\", \"cursing\", \"cussing\", \"profanity\", \"expletive\" ],\n char: \"\\ud83e\\udd2c\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n exploding_head: {\n keywords: [ \"face\", \"shocked\", \"mind\", \"blown\" ],\n char: \"\\ud83e\\udd2f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n flushed: {\n keywords: [ \"face\", \"blush\", \"shy\", \"flattered\" ],\n char: \"\\ud83d\\ude33\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n disappointed: {\n keywords: [ \"face\", \"sad\", \"upset\", \"depressed\", \":(\" ],\n char: \"\\ud83d\\ude1e\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n worried: {\n keywords: [ \"face\", \"concern\", \"nervous\", \":(\" ],\n char: \"\\ud83d\\ude1f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n angry: {\n keywords: [ \"mad\", \"face\", \"annoyed\", \"frustrated\" ],\n char: \"\\ud83d\\ude20\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n rage: {\n keywords: [ \"angry\", \"mad\", \"hate\", \"despise\" ],\n char: \"\\ud83d\\ude21\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n pensive: {\n keywords: [ \"face\", \"sad\", \"depressed\", \"upset\" ],\n char: \"\\ud83d\\ude14\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n confused: {\n keywords: [ \"face\", \"indifference\", \"huh\", \"weird\", \"hmmm\", \":/\" ],\n char: \"\\ud83d\\ude15\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n slightly_frowning_face: {\n keywords: [ \"face\", \"frowning\", \"disappointed\", \"sad\", \"upset\" ],\n char: \"\\ud83d\\ude41\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n frowning_face: {\n keywords: [ \"face\", \"sad\", \"upset\", \"frown\" ],\n char: \"\\u2639\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n persevere: {\n keywords: [ \"face\", \"sick\", \"no\", \"upset\", \"oops\" ],\n char: \"\\ud83d\\ude23\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n confounded: {\n keywords: [ \"face\", \"confused\", \"sick\", \"unwell\", \"oops\", \":S\" ],\n char: \"\\ud83d\\ude16\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n tired_face: {\n keywords: [ \"sick\", \"whine\", \"upset\", \"frustrated\" ],\n char: \"\\ud83d\\ude2b\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n weary: {\n keywords: [ \"face\", \"tired\", \"sleepy\", \"sad\", \"frustrated\", \"upset\" ],\n char: \"\\ud83d\\ude29\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n pleading: {\n keywords: [ \"face\", \"begging\", \"mercy\" ],\n char: \"\\ud83e\\udd7a\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n triumph: {\n keywords: [ \"face\", \"gas\", \"phew\", \"proud\", \"pride\" ],\n char: \"\\ud83d\\ude24\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n open_mouth: {\n keywords: [ \"face\", \"surprise\", \"impressed\", \"wow\", \"whoa\", \":O\" ],\n char: \"\\ud83d\\ude2e\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n scream: {\n keywords: [ \"face\", \"munch\", \"scared\", \"omg\" ],\n char: \"\\ud83d\\ude31\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n fearful: {\n keywords: [ \"face\", \"scared\", \"terrified\", \"nervous\", \"oops\", \"huh\" ],\n char: \"\\ud83d\\ude28\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n cold_sweat: {\n keywords: [ \"face\", \"nervous\", \"sweat\" ],\n char: \"\\ud83d\\ude30\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n hushed: {\n keywords: [ \"face\", \"woo\", \"shh\" ],\n char: \"\\ud83d\\ude2f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n frowning: {\n keywords: [ \"face\", \"aw\", \"what\" ],\n char: \"\\ud83d\\ude26\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n anguished: {\n keywords: [ \"face\", \"stunned\", \"nervous\" ],\n char: \"\\ud83d\\ude27\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n cry: {\n keywords: [ \"face\", \"tears\", \"sad\", \"depressed\", \"upset\", \":'(\" ],\n char: \"\\ud83d\\ude22\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n disappointed_relieved: {\n keywords: [ \"face\", \"phew\", \"sweat\", \"nervous\" ],\n char: \"\\ud83d\\ude25\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n drooling_face: {\n keywords: [ \"face\" ],\n char: \"\\ud83e\\udd24\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n sleepy: {\n keywords: [ \"face\", \"tired\", \"rest\", \"nap\" ],\n char: \"\\ud83d\\ude2a\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n sweat: {\n keywords: [ \"face\", \"hot\", \"sad\", \"tired\", \"exercise\" ],\n char: \"\\ud83d\\ude13\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n hot: {\n keywords: [ \"face\", \"feverish\", \"heat\", \"red\", \"sweating\" ],\n char: \"\\ud83e\\udd75\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n cold: {\n keywords: [ \"face\", \"blue\", \"freezing\", \"frozen\", \"frostbite\", \"icicles\" ],\n char: \"\\ud83e\\udd76\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n sob: {\n keywords: [ \"face\", \"cry\", \"tears\", \"sad\", \"upset\", \"depressed\" ],\n char: \"\\ud83d\\ude2d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n dizzy_face: {\n keywords: [ \"spent\", \"unconscious\", \"xox\", \"dizzy\" ],\n char: \"\\ud83d\\ude35\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n astonished: {\n keywords: [ \"face\", \"xox\", \"surprised\", \"poisoned\" ],\n char: \"\\ud83d\\ude32\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n zipper_mouth_face: {\n keywords: [ \"face\", \"sealed\", \"zipper\", \"secret\" ],\n char: \"\\ud83e\\udd10\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n nauseated_face: {\n keywords: [ \"face\", \"vomit\", \"gross\", \"green\", \"sick\", \"throw up\", \"ill\" ],\n char: \"\\ud83e\\udd22\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n sneezing_face: {\n keywords: [ \"face\", \"gesundheit\", \"sneeze\", \"sick\", \"allergy\" ],\n char: \"\\ud83e\\udd27\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n vomiting: {\n keywords: [ \"face\", \"sick\" ],\n char: \"\\ud83e\\udd2e\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n mask: {\n keywords: [ \"face\", \"sick\", \"ill\", \"disease\" ],\n char: \"\\ud83d\\ude37\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n face_with_thermometer: {\n keywords: [ \"sick\", \"temperature\", \"thermometer\", \"cold\", \"fever\" ],\n char: \"\\ud83e\\udd12\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n face_with_head_bandage: {\n keywords: [ \"injured\", \"clumsy\", \"bandage\", \"hurt\" ],\n char: \"\\ud83e\\udd15\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n woozy: {\n keywords: [ \"face\", \"dizzy\", \"intoxicated\", \"tipsy\", \"wavy\" ],\n char: \"\\ud83e\\udd74\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n sleeping: {\n keywords: [ \"face\", \"tired\", \"sleepy\", \"night\", \"zzz\" ],\n char: \"\\ud83d\\ude34\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n zzz: {\n keywords: [ \"sleepy\", \"tired\", \"dream\" ],\n char: \"\\ud83d\\udca4\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n poop: {\n keywords: [ \"hankey\", \"shitface\", \"fail\", \"turd\", \"shit\" ],\n char: \"\\ud83d\\udca9\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n smiling_imp: {\n keywords: [ \"devil\", \"horns\" ],\n char: \"\\ud83d\\ude08\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n imp: {\n keywords: [ \"devil\", \"angry\", \"horns\" ],\n char: \"\\ud83d\\udc7f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n japanese_ogre: {\n keywords: [ \"monster\", \"red\", \"mask\", \"halloween\", \"scary\", \"creepy\", \"devil\", \"demon\", \"japanese\", \"ogre\" ],\n char: \"\\ud83d\\udc79\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n japanese_goblin: {\n keywords: [ \"red\", \"evil\", \"mask\", \"monster\", \"scary\", \"creepy\", \"japanese\", \"goblin\" ],\n char: \"\\ud83d\\udc7a\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n skull: {\n keywords: [ \"dead\", \"skeleton\", \"creepy\", \"death\" ],\n char: \"\\ud83d\\udc80\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n ghost: {\n keywords: [ \"halloween\", \"spooky\", \"scary\" ],\n char: \"\\ud83d\\udc7b\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n alien: {\n keywords: [ \"UFO\", \"paul\", \"weird\", \"outer_space\" ],\n char: \"\\ud83d\\udc7d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n robot: {\n keywords: [ \"computer\", \"machine\", \"bot\" ],\n char: \"\\ud83e\\udd16\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n smiley_cat: {\n keywords: [ \"animal\", \"cats\", \"happy\", \"smile\" ],\n char: \"\\ud83d\\ude3a\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n smile_cat: {\n keywords: [ \"animal\", \"cats\", \"smile\" ],\n char: \"\\ud83d\\ude38\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n joy_cat: {\n keywords: [ \"animal\", \"cats\", \"haha\", \"happy\", \"tears\" ],\n char: \"\\ud83d\\ude39\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n heart_eyes_cat: {\n keywords: [ \"animal\", \"love\", \"like\", \"affection\", \"cats\", \"valentines\", \"heart\" ],\n char: \"\\ud83d\\ude3b\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n smirk_cat: {\n keywords: [ \"animal\", \"cats\", \"smirk\" ],\n char: \"\\ud83d\\ude3c\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n kissing_cat: {\n keywords: [ \"animal\", \"cats\", \"kiss\" ],\n char: \"\\ud83d\\ude3d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n scream_cat: {\n keywords: [ \"animal\", \"cats\", \"munch\", \"scared\", \"scream\" ],\n char: \"\\ud83d\\ude40\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n crying_cat_face: {\n keywords: [ \"animal\", \"tears\", \"weep\", \"sad\", \"cats\", \"upset\", \"cry\" ],\n char: \"\\ud83d\\ude3f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n pouting_cat: {\n keywords: [ \"animal\", \"cats\" ],\n char: \"\\ud83d\\ude3e\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n palms_up: {\n keywords: [ \"hands\", \"gesture\", \"cupped\", \"prayer\" ],\n char: \"\\ud83e\\udd32\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n raised_hands: {\n keywords: [ \"gesture\", \"hooray\", \"yea\", \"celebration\", \"hands\" ],\n char: \"\\ud83d\\ude4c\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n clap: {\n keywords: [ \"hands\", \"praise\", \"applause\", \"congrats\", \"yay\" ],\n char: \"\\ud83d\\udc4f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n wave: {\n keywords: [ \"hands\", \"gesture\", \"goodbye\", \"solong\", \"farewell\", \"hello\", \"hi\", \"palm\" ],\n char: \"\\ud83d\\udc4b\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n call_me_hand: {\n keywords: [ \"hands\", \"gesture\" ],\n char: \"\\ud83e\\udd19\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n \"+1\": {\n keywords: [ \"thumbsup\", \"yes\", \"awesome\", \"good\", \"agree\", \"accept\", \"cool\", \"hand\", \"like\" ],\n char: \"\\ud83d\\udc4d\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n \"-1\": {\n keywords: [ \"thumbsdown\", \"no\", \"dislike\", \"hand\" ],\n char: \"\\ud83d\\udc4e\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n facepunch: {\n keywords: [ \"angry\", \"violence\", \"fist\", \"hit\", \"attack\", \"hand\" ],\n char: \"\\ud83d\\udc4a\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n fist: {\n keywords: [ \"fingers\", \"hand\", \"grasp\" ],\n char: \"\\u270a\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n fist_left: {\n keywords: [ \"hand\", \"fistbump\" ],\n char: \"\\ud83e\\udd1b\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n fist_right: {\n keywords: [ \"hand\", \"fistbump\" ],\n char: \"\\ud83e\\udd1c\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n v: {\n keywords: [ \"fingers\", \"ohyeah\", \"hand\", \"peace\", \"victory\", \"two\" ],\n char: \"\\u270c\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n ok_hand: {\n keywords: [ \"fingers\", \"limbs\", \"perfect\", \"ok\", \"okay\" ],\n char: \"\\ud83d\\udc4c\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n raised_hand: {\n keywords: [ \"fingers\", \"stop\", \"highfive\", \"palm\", \"ban\" ],\n char: \"\\u270b\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n raised_back_of_hand: {\n keywords: [ \"fingers\", \"raised\", \"backhand\" ],\n char: \"\\ud83e\\udd1a\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n open_hands: {\n keywords: [ \"fingers\", \"butterfly\", \"hands\", \"open\" ],\n char: \"\\ud83d\\udc50\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n muscle: {\n keywords: [ \"arm\", \"flex\", \"hand\", \"summer\", \"strong\", \"biceps\" ],\n char: \"\\ud83d\\udcaa\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n pray: {\n keywords: [ \"please\", \"hope\", \"wish\", \"namaste\", \"highfive\" ],\n char: \"\\ud83d\\ude4f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n foot: {\n keywords: [ \"kick\", \"stomp\" ],\n char: \"\\ud83e\\uddb6\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n leg: {\n keywords: [ \"kick\", \"limb\" ],\n char: \"\\ud83e\\uddb5\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n handshake: {\n keywords: [ \"agreement\", \"shake\" ],\n char: \"\\ud83e\\udd1d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n point_up: {\n keywords: [ \"hand\", \"fingers\", \"direction\", \"up\" ],\n char: \"\\u261d\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n point_up_2: {\n keywords: [ \"fingers\", \"hand\", \"direction\", \"up\" ],\n char: \"\\ud83d\\udc46\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n point_down: {\n keywords: [ \"fingers\", \"hand\", \"direction\", \"down\" ],\n char: \"\\ud83d\\udc47\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n point_left: {\n keywords: [ \"direction\", \"fingers\", \"hand\", \"left\" ],\n char: \"\\ud83d\\udc48\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n point_right: {\n keywords: [ \"fingers\", \"hand\", \"direction\", \"right\" ],\n char: \"\\ud83d\\udc49\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n fu: {\n keywords: [ \"hand\", \"fingers\", \"rude\", \"middle\", \"flipping\" ],\n char: \"\\ud83d\\udd95\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n raised_hand_with_fingers_splayed: {\n keywords: [ \"hand\", \"fingers\", \"palm\" ],\n char: \"\\ud83d\\udd90\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n love_you: {\n keywords: [ \"hand\", \"fingers\", \"gesture\" ],\n char: \"\\ud83e\\udd1f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n metal: {\n keywords: [ \"hand\", \"fingers\", \"evil_eye\", \"sign_of_horns\", \"rock_on\" ],\n char: \"\\ud83e\\udd18\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n crossed_fingers: {\n keywords: [ \"good\", \"lucky\" ],\n char: \"\\ud83e\\udd1e\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n vulcan_salute: {\n keywords: [ \"hand\", \"fingers\", \"spock\", \"star trek\" ],\n char: \"\\ud83d\\udd96\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n writing_hand: {\n keywords: [ \"lower_left_ballpoint_pen\", \"stationery\", \"write\", \"compose\" ],\n char: \"\\u270d\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n selfie: {\n keywords: [ \"camera\", \"phone\" ],\n char: \"\\ud83e\\udd33\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n nail_care: {\n keywords: [ \"beauty\", \"manicure\", \"finger\", \"fashion\", \"nail\" ],\n char: \"\\ud83d\\udc85\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n lips: {\n keywords: [ \"mouth\", \"kiss\" ],\n char: \"\\ud83d\\udc44\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n tooth: {\n keywords: [ \"teeth\", \"dentist\" ],\n char: \"\\ud83e\\uddb7\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n tongue: {\n keywords: [ \"mouth\", \"playful\" ],\n char: \"\\ud83d\\udc45\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n ear: {\n keywords: [ \"face\", \"hear\", \"sound\", \"listen\" ],\n char: \"\\ud83d\\udc42\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n nose: {\n keywords: [ \"smell\", \"sniff\" ],\n char: \"\\ud83d\\udc43\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n eye: {\n keywords: [ \"face\", \"look\", \"see\", \"watch\", \"stare\" ],\n char: \"\\ud83d\\udc41\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n eyes: {\n keywords: [ \"look\", \"watch\", \"stalk\", \"peek\", \"see\" ],\n char: \"\\ud83d\\udc40\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n brain: {\n keywords: [ \"smart\", \"intelligent\" ],\n char: \"\\ud83e\\udde0\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n bust_in_silhouette: {\n keywords: [ \"user\", \"person\", \"human\" ],\n char: \"\\ud83d\\udc64\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n busts_in_silhouette: {\n keywords: [ \"user\", \"person\", \"human\", \"group\", \"team\" ],\n char: \"\\ud83d\\udc65\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n speaking_head: {\n keywords: [ \"user\", \"person\", \"human\", \"sing\", \"say\", \"talk\" ],\n char: \"\\ud83d\\udde3\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n baby: {\n keywords: [ \"child\", \"boy\", \"girl\", \"toddler\" ],\n char: \"\\ud83d\\udc76\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n child: {\n keywords: [ \"gender-neutral\", \"young\" ],\n char: \"\\ud83e\\uddd2\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n boy: {\n keywords: [ \"man\", \"male\", \"guy\", \"teenager\" ],\n char: \"\\ud83d\\udc66\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n girl: {\n keywords: [ \"female\", \"woman\", \"teenager\" ],\n char: \"\\ud83d\\udc67\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n adult: {\n keywords: [ \"gender-neutral\", \"person\" ],\n char: \"\\ud83e\\uddd1\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man: {\n keywords: [ \"mustache\", \"father\", \"dad\", \"guy\", \"classy\", \"sir\", \"moustache\" ],\n char: \"\\ud83d\\udc68\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman: {\n keywords: [ \"female\", \"girls\", \"lady\" ],\n char: \"\\ud83d\\udc69\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n blonde_woman: {\n keywords: [ \"woman\", \"female\", \"girl\", \"blonde\", \"person\" ],\n char: \"\\ud83d\\udc71\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n blonde_man: {\n keywords: [ \"man\", \"male\", \"boy\", \"blonde\", \"guy\", \"person\" ],\n char: \"\\ud83d\\udc71\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n bearded_person: {\n keywords: [ \"person\", \"bewhiskered\" ],\n char: \"\\ud83e\\uddd4\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n older_adult: {\n keywords: [ \"human\", \"elder\", \"senior\", \"gender-neutral\" ],\n char: \"\\ud83e\\uddd3\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n older_man: {\n keywords: [ \"human\", \"male\", \"men\", \"old\", \"elder\", \"senior\" ],\n char: \"\\ud83d\\udc74\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n older_woman: {\n keywords: [ \"human\", \"female\", \"women\", \"lady\", \"old\", \"elder\", \"senior\" ],\n char: \"\\ud83d\\udc75\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_with_gua_pi_mao: {\n keywords: [ \"male\", \"boy\", \"chinese\" ],\n char: \"\\ud83d\\udc72\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_with_headscarf: {\n keywords: [ \"female\", \"hijab\", \"mantilla\", \"tichel\" ],\n char: \"\\ud83e\\uddd5\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_with_turban: {\n keywords: [ \"female\", \"indian\", \"hinduism\", \"arabs\", \"woman\" ],\n char: \"\\ud83d\\udc73\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_with_turban: {\n keywords: [ \"male\", \"indian\", \"hinduism\", \"arabs\" ],\n char: \"\\ud83d\\udc73\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n policewoman: {\n keywords: [ \"woman\", \"police\", \"law\", \"legal\", \"enforcement\", \"arrest\", \"911\", \"female\" ],\n char: \"\\ud83d\\udc6e\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n policeman: {\n keywords: [ \"man\", \"police\", \"law\", \"legal\", \"enforcement\", \"arrest\", \"911\" ],\n char: \"\\ud83d\\udc6e\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n construction_worker_woman: {\n keywords: [ \"female\", \"human\", \"wip\", \"build\", \"construction\", \"worker\", \"labor\", \"woman\" ],\n char: \"\\ud83d\\udc77\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n construction_worker_man: {\n keywords: [ \"male\", \"human\", \"wip\", \"guy\", \"build\", \"construction\", \"worker\", \"labor\" ],\n char: \"\\ud83d\\udc77\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n guardswoman: {\n keywords: [ \"uk\", \"gb\", \"british\", \"female\", \"royal\", \"woman\" ],\n char: \"\\ud83d\\udc82\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n guardsman: {\n keywords: [ \"uk\", \"gb\", \"british\", \"male\", \"guy\", \"royal\" ],\n char: \"\\ud83d\\udc82\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n female_detective: {\n keywords: [ \"human\", \"spy\", \"detective\", \"female\", \"woman\" ],\n char: \"\\ud83d\\udd75\\ufe0f\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n male_detective: {\n keywords: [ \"human\", \"spy\", \"detective\" ],\n char: \"\\ud83d\\udd75\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_health_worker: {\n keywords: [ \"doctor\", \"nurse\", \"therapist\", \"healthcare\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\u2695\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_health_worker: {\n keywords: [ \"doctor\", \"nurse\", \"therapist\", \"healthcare\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\u2695\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_farmer: {\n keywords: [ \"rancher\", \"gardener\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83c\\udf3e\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_farmer: {\n keywords: [ \"rancher\", \"gardener\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83c\\udf3e\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_cook: {\n keywords: [ \"chef\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83c\\udf73\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_cook: {\n keywords: [ \"chef\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83c\\udf73\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_student: {\n keywords: [ \"graduate\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83c\\udf93\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_student: {\n keywords: [ \"graduate\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83c\\udf93\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_singer: {\n keywords: [ \"rockstar\", \"entertainer\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83c\\udfa4\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_singer: {\n keywords: [ \"rockstar\", \"entertainer\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83c\\udfa4\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_teacher: {\n keywords: [ \"instructor\", \"professor\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83c\\udfeb\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_teacher: {\n keywords: [ \"instructor\", \"professor\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83c\\udfeb\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_factory_worker: {\n keywords: [ \"assembly\", \"industrial\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83c\\udfed\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_factory_worker: {\n keywords: [ \"assembly\", \"industrial\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83c\\udfed\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_technologist: {\n keywords: [ \"coder\", \"developer\", \"engineer\", \"programmer\", \"software\", \"woman\", \"human\", \"laptop\", \"computer\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udcbb\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_technologist: {\n keywords: [ \"coder\", \"developer\", \"engineer\", \"programmer\", \"software\", \"man\", \"human\", \"laptop\", \"computer\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udcbb\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_office_worker: {\n keywords: [ \"business\", \"manager\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udcbc\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_office_worker: {\n keywords: [ \"business\", \"manager\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udcbc\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_mechanic: {\n keywords: [ \"plumber\", \"woman\", \"human\", \"wrench\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udd27\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_mechanic: {\n keywords: [ \"plumber\", \"man\", \"human\", \"wrench\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udd27\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_scientist: {\n keywords: [ \"biologist\", \"chemist\", \"engineer\", \"physicist\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udd2c\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_scientist: {\n keywords: [ \"biologist\", \"chemist\", \"engineer\", \"physicist\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udd2c\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_artist: {\n keywords: [ \"painter\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83c\\udfa8\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_artist: {\n keywords: [ \"painter\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83c\\udfa8\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_firefighter: {\n keywords: [ \"fireman\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\ude92\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_firefighter: {\n keywords: [ \"fireman\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\ude92\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_pilot: {\n keywords: [ \"aviator\", \"plane\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\u2708\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_pilot: {\n keywords: [ \"aviator\", \"plane\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\u2708\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_astronaut: {\n keywords: [ \"space\", \"rocket\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\ude80\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_astronaut: {\n keywords: [ \"space\", \"rocket\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\ude80\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_judge: {\n keywords: [ \"justice\", \"court\", \"woman\", \"human\" ],\n char: \"\\ud83d\\udc69\\u200d\\u2696\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_judge: {\n keywords: [ \"justice\", \"court\", \"man\", \"human\" ],\n char: \"\\ud83d\\udc68\\u200d\\u2696\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_superhero: {\n keywords: [ \"woman\", \"female\", \"good\", \"heroine\", \"superpowers\" ],\n char: \"\\ud83e\\uddb8\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_superhero: {\n keywords: [ \"man\", \"male\", \"good\", \"hero\", \"superpowers\" ],\n char: \"\\ud83e\\uddb8\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_supervillain: {\n keywords: [ \"woman\", \"female\", \"evil\", \"bad\", \"criminal\", \"heroine\", \"superpowers\" ],\n char: \"\\ud83e\\uddb9\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_supervillain: {\n keywords: [ \"man\", \"male\", \"evil\", \"bad\", \"criminal\", \"hero\", \"superpowers\" ],\n char: \"\\ud83e\\uddb9\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n mrs_claus: {\n keywords: [ \"woman\", \"female\", \"xmas\", \"mother christmas\" ],\n char: \"\\ud83e\\udd36\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n santa: {\n keywords: [ \"festival\", \"man\", \"male\", \"xmas\", \"father christmas\" ],\n char: \"\\ud83c\\udf85\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n sorceress: {\n keywords: [ \"woman\", \"female\", \"mage\", \"witch\" ],\n char: \"\\ud83e\\uddd9\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n wizard: {\n keywords: [ \"man\", \"male\", \"mage\", \"sorcerer\" ],\n char: \"\\ud83e\\uddd9\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_elf: {\n keywords: [ \"woman\", \"female\" ],\n char: \"\\ud83e\\udddd\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_elf: {\n keywords: [ \"man\", \"male\" ],\n char: \"\\ud83e\\udddd\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_vampire: {\n keywords: [ \"woman\", \"female\" ],\n char: \"\\ud83e\\udddb\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_vampire: {\n keywords: [ \"man\", \"male\", \"dracula\" ],\n char: \"\\ud83e\\udddb\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_zombie: {\n keywords: [ \"woman\", \"female\", \"undead\", \"walking dead\" ],\n char: \"\\ud83e\\udddf\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n man_zombie: {\n keywords: [ \"man\", \"male\", \"dracula\", \"undead\", \"walking dead\" ],\n char: \"\\ud83e\\udddf\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n woman_genie: {\n keywords: [ \"woman\", \"female\" ],\n char: \"\\ud83e\\uddde\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n man_genie: {\n keywords: [ \"man\", \"male\" ],\n char: \"\\ud83e\\uddde\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n mermaid: {\n keywords: [ \"woman\", \"female\", \"merwoman\", \"ariel\" ],\n char: \"\\ud83e\\udddc\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n merman: {\n keywords: [ \"man\", \"male\", \"triton\" ],\n char: \"\\ud83e\\udddc\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_fairy: {\n keywords: [ \"woman\", \"female\" ],\n char: \"\\ud83e\\uddda\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_fairy: {\n keywords: [ \"man\", \"male\" ],\n char: \"\\ud83e\\uddda\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n angel: {\n keywords: [ \"heaven\", \"wings\", \"halo\" ],\n char: \"\\ud83d\\udc7c\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n pregnant_woman: {\n keywords: [ \"baby\" ],\n char: \"\\ud83e\\udd30\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n breastfeeding: {\n keywords: [ \"nursing\", \"baby\" ],\n char: \"\\ud83e\\udd31\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n princess: {\n keywords: [ \"girl\", \"woman\", \"female\", \"blond\", \"crown\", \"royal\", \"queen\" ],\n char: \"\\ud83d\\udc78\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n prince: {\n keywords: [ \"boy\", \"man\", \"male\", \"crown\", \"royal\", \"king\" ],\n char: \"\\ud83e\\udd34\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n bride_with_veil: {\n keywords: [ \"couple\", \"marriage\", \"wedding\", \"woman\", \"bride\" ],\n char: \"\\ud83d\\udc70\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_in_tuxedo: {\n keywords: [ \"couple\", \"marriage\", \"wedding\", \"groom\" ],\n char: \"\\ud83e\\udd35\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n running_woman: {\n keywords: [ \"woman\", \"walking\", \"exercise\", \"race\", \"running\", \"female\" ],\n char: \"\\ud83c\\udfc3\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n running_man: {\n keywords: [ \"man\", \"walking\", \"exercise\", \"race\", \"running\" ],\n char: \"\\ud83c\\udfc3\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n walking_woman: {\n keywords: [ \"human\", \"feet\", \"steps\", \"woman\", \"female\" ],\n char: \"\\ud83d\\udeb6\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n walking_man: {\n keywords: [ \"human\", \"feet\", \"steps\" ],\n char: \"\\ud83d\\udeb6\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n dancer: {\n keywords: [ \"female\", \"girl\", \"woman\", \"fun\" ],\n char: \"\\ud83d\\udc83\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_dancing: {\n keywords: [ \"male\", \"boy\", \"fun\", \"dancer\" ],\n char: \"\\ud83d\\udd7a\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n dancing_women: {\n keywords: [ \"female\", \"bunny\", \"women\", \"girls\" ],\n char: \"\\ud83d\\udc6f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n dancing_men: {\n keywords: [ \"male\", \"bunny\", \"men\", \"boys\" ],\n char: \"\\ud83d\\udc6f\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n couple: {\n keywords: [ \"pair\", \"people\", \"human\", \"love\", \"date\", \"dating\", \"like\", \"affection\", \"valentines\", \"marriage\" ],\n char: \"\\ud83d\\udc6b\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n two_men_holding_hands: {\n keywords: [ \"pair\", \"couple\", \"love\", \"like\", \"bromance\", \"friendship\", \"people\", \"human\" ],\n char: \"\\ud83d\\udc6c\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n two_women_holding_hands: {\n keywords: [ \"pair\", \"friendship\", \"couple\", \"love\", \"like\", \"female\", \"people\", \"human\" ],\n char: \"\\ud83d\\udc6d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n bowing_woman: {\n keywords: [ \"woman\", \"female\", \"girl\" ],\n char: \"\\ud83d\\ude47\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n bowing_man: {\n keywords: [ \"man\", \"male\", \"boy\" ],\n char: \"\\ud83d\\ude47\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_facepalming: {\n keywords: [ \"man\", \"male\", \"boy\", \"disbelief\" ],\n char: \"\\ud83e\\udd26\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_facepalming: {\n keywords: [ \"woman\", \"female\", \"girl\", \"disbelief\" ],\n char: \"\\ud83e\\udd26\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_shrugging: {\n keywords: [ \"woman\", \"female\", \"girl\", \"confused\", \"indifferent\", \"doubt\" ],\n char: \"\\ud83e\\udd37\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_shrugging: {\n keywords: [ \"man\", \"male\", \"boy\", \"confused\", \"indifferent\", \"doubt\" ],\n char: \"\\ud83e\\udd37\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n tipping_hand_woman: {\n keywords: [ \"female\", \"girl\", \"woman\", \"human\", \"information\" ],\n char: \"\\ud83d\\udc81\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n tipping_hand_man: {\n keywords: [ \"male\", \"boy\", \"man\", \"human\", \"information\" ],\n char: \"\\ud83d\\udc81\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n no_good_woman: {\n keywords: [ \"female\", \"girl\", \"woman\", \"nope\" ],\n char: \"\\ud83d\\ude45\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n no_good_man: {\n keywords: [ \"male\", \"boy\", \"man\", \"nope\" ],\n char: \"\\ud83d\\ude45\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n ok_woman: {\n keywords: [ \"women\", \"girl\", \"female\", \"pink\", \"human\", \"woman\" ],\n char: \"\\ud83d\\ude46\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n ok_man: {\n keywords: [ \"men\", \"boy\", \"male\", \"blue\", \"human\", \"man\" ],\n char: \"\\ud83d\\ude46\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n raising_hand_woman: {\n keywords: [ \"female\", \"girl\", \"woman\" ],\n char: \"\\ud83d\\ude4b\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n raising_hand_man: {\n keywords: [ \"male\", \"boy\", \"man\" ],\n char: \"\\ud83d\\ude4b\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n pouting_woman: {\n keywords: [ \"female\", \"girl\", \"woman\" ],\n char: \"\\ud83d\\ude4e\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n pouting_man: {\n keywords: [ \"male\", \"boy\", \"man\" ],\n char: \"\\ud83d\\ude4e\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n frowning_woman: {\n keywords: [ \"female\", \"girl\", \"woman\", \"sad\", \"depressed\", \"discouraged\", \"unhappy\" ],\n char: \"\\ud83d\\ude4d\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n frowning_man: {\n keywords: [ \"male\", \"boy\", \"man\", \"sad\", \"depressed\", \"discouraged\", \"unhappy\" ],\n char: \"\\ud83d\\ude4d\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n haircut_woman: {\n keywords: [ \"female\", \"girl\", \"woman\" ],\n char: \"\\ud83d\\udc87\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n haircut_man: {\n keywords: [ \"male\", \"boy\", \"man\" ],\n char: \"\\ud83d\\udc87\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n massage_woman: {\n keywords: [ \"female\", \"girl\", \"woman\", \"head\" ],\n char: \"\\ud83d\\udc86\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n massage_man: {\n keywords: [ \"male\", \"boy\", \"man\", \"head\" ],\n char: \"\\ud83d\\udc86\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n woman_in_steamy_room: {\n keywords: [ \"female\", \"woman\", \"spa\", \"steamroom\", \"sauna\" ],\n char: \"\\ud83e\\uddd6\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n man_in_steamy_room: {\n keywords: [ \"male\", \"man\", \"spa\", \"steamroom\", \"sauna\" ],\n char: \"\\ud83e\\uddd6\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"people\"\n },\n couple_with_heart_woman_man: {\n keywords: [ \"pair\", \"love\", \"like\", \"affection\", \"human\", \"dating\", \"valentines\", \"marriage\" ],\n char: \"\\ud83d\\udc91\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n couple_with_heart_woman_woman: {\n keywords: [ \"pair\", \"love\", \"like\", \"affection\", \"human\", \"dating\", \"valentines\", \"marriage\" ],\n char: \"\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n couple_with_heart_man_man: {\n keywords: [ \"pair\", \"love\", \"like\", \"affection\", \"human\", \"dating\", \"valentines\", \"marriage\" ],\n char: \"\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n couplekiss_man_woman: {\n keywords: [ \"pair\", \"valentines\", \"love\", \"like\", \"dating\", \"marriage\" ],\n char: \"\\ud83d\\udc8f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n couplekiss_woman_woman: {\n keywords: [ \"pair\", \"valentines\", \"love\", \"like\", \"dating\", \"marriage\" ],\n char: \"\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n couplekiss_man_man: {\n keywords: [ \"pair\", \"valentines\", \"love\", \"like\", \"dating\", \"marriage\" ],\n char: \"\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_woman_boy: {\n keywords: [ \"home\", \"parents\", \"child\", \"mom\", \"dad\", \"father\", \"mother\", \"people\", \"human\" ],\n char: \"\\ud83d\\udc6a\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_woman_girl: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"child\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_woman_girl_boy: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_woman_boy_boy: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_woman_girl_girl: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_woman_boy: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_woman_girl: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_woman_girl_boy: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_woman_boy_boy: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_woman_girl_girl: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_man_boy: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_man_girl: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_man_girl_boy: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_man_boy_boy: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_man_girl_girl: {\n keywords: [ \"home\", \"parents\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_boy: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"child\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_girl: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"child\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_girl_boy: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_boy_boy: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_woman_girl_girl: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_boy: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"child\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_girl: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"child\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_girl_boy: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_boy_boy: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n family_man_girl_girl: {\n keywords: [ \"home\", \"parent\", \"people\", \"human\", \"children\" ],\n char: \"\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n yarn: {\n keywords: [ \"ball\", \"crochet\", \"knit\" ],\n char: \"\\ud83e\\uddf6\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n thread: {\n keywords: [ \"needle\", \"sewing\", \"spool\", \"string\" ],\n char: \"\\ud83e\\uddf5\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n coat: {\n keywords: [ \"jacket\" ],\n char: \"\\ud83e\\udde5\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n labcoat: {\n keywords: [ \"doctor\", \"experiment\", \"scientist\", \"chemist\" ],\n char: \"\\ud83e\\udd7c\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n womans_clothes: {\n keywords: [ \"fashion\", \"shopping_bags\", \"female\" ],\n char: \"\\ud83d\\udc5a\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n tshirt: {\n keywords: [ \"fashion\", \"cloth\", \"casual\", \"shirt\", \"tee\" ],\n char: \"\\ud83d\\udc55\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n jeans: {\n keywords: [ \"fashion\", \"shopping\" ],\n char: \"\\ud83d\\udc56\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n necktie: {\n keywords: [ \"shirt\", \"suitup\", \"formal\", \"fashion\", \"cloth\", \"business\" ],\n char: \"\\ud83d\\udc54\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n dress: {\n keywords: [ \"clothes\", \"fashion\", \"shopping\" ],\n char: \"\\ud83d\\udc57\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n bikini: {\n keywords: [ \"swimming\", \"female\", \"woman\", \"girl\", \"fashion\", \"beach\", \"summer\" ],\n char: \"\\ud83d\\udc59\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n kimono: {\n keywords: [ \"dress\", \"fashion\", \"women\", \"female\", \"japanese\" ],\n char: \"\\ud83d\\udc58\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n lipstick: {\n keywords: [ \"female\", \"girl\", \"fashion\", \"woman\" ],\n char: \"\\ud83d\\udc84\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n kiss: {\n keywords: [ \"face\", \"lips\", \"love\", \"like\", \"affection\", \"valentines\" ],\n char: \"\\ud83d\\udc8b\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n footprints: {\n keywords: [ \"feet\", \"tracking\", \"walking\", \"beach\" ],\n char: \"\\ud83d\\udc63\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n flat_shoe: {\n keywords: [ \"ballet\", \"slip-on\", \"slipper\" ],\n char: \"\\ud83e\\udd7f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n high_heel: {\n keywords: [ \"fashion\", \"shoes\", \"female\", \"pumps\", \"stiletto\" ],\n char: \"\\ud83d\\udc60\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n sandal: {\n keywords: [ \"shoes\", \"fashion\", \"flip flops\" ],\n char: \"\\ud83d\\udc61\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n boot: {\n keywords: [ \"shoes\", \"fashion\" ],\n char: \"\\ud83d\\udc62\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n mans_shoe: {\n keywords: [ \"fashion\", \"male\" ],\n char: \"\\ud83d\\udc5e\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n athletic_shoe: {\n keywords: [ \"shoes\", \"sports\", \"sneakers\" ],\n char: \"\\ud83d\\udc5f\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n hiking_boot: {\n keywords: [ \"backpacking\", \"camping\", \"hiking\" ],\n char: \"\\ud83e\\udd7e\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n socks: {\n keywords: [ \"stockings\", \"clothes\" ],\n char: \"\\ud83e\\udde6\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n gloves: {\n keywords: [ \"hands\", \"winter\", \"clothes\" ],\n char: \"\\ud83e\\udde4\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n scarf: {\n keywords: [ \"neck\", \"winter\", \"clothes\" ],\n char: \"\\ud83e\\udde3\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n womans_hat: {\n keywords: [ \"fashion\", \"accessories\", \"female\", \"lady\", \"spring\" ],\n char: \"\\ud83d\\udc52\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n tophat: {\n keywords: [ \"magic\", \"gentleman\", \"classy\", \"circus\" ],\n char: \"\\ud83c\\udfa9\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n billed_hat: {\n keywords: [ \"cap\", \"baseball\" ],\n char: \"\\ud83e\\udde2\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n rescue_worker_helmet: {\n keywords: [ \"construction\", \"build\" ],\n char: \"\\u26d1\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n mortar_board: {\n keywords: [ \"school\", \"college\", \"degree\", \"university\", \"graduation\", \"cap\", \"hat\", \"legal\", \"learn\", \"education\" ],\n char: \"\\ud83c\\udf93\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n crown: {\n keywords: [ \"king\", \"kod\", \"leader\", \"royalty\", \"lord\" ],\n char: \"\\ud83d\\udc51\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n school_satchel: {\n keywords: [ \"student\", \"education\", \"bag\", \"backpack\" ],\n char: \"\\ud83c\\udf92\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n luggage: {\n keywords: [ \"packing\", \"travel\" ],\n char: \"\\ud83e\\uddf3\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n pouch: {\n keywords: [ \"bag\", \"accessories\", \"shopping\" ],\n char: \"\\ud83d\\udc5d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n purse: {\n keywords: [ \"fashion\", \"accessories\", \"money\", \"sales\", \"shopping\" ],\n char: \"\\ud83d\\udc5b\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n handbag: {\n keywords: [ \"fashion\", \"accessory\", \"accessories\", \"shopping\" ],\n char: \"\\ud83d\\udc5c\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n briefcase: {\n keywords: [ \"business\", \"documents\", \"work\", \"law\", \"legal\", \"job\", \"career\" ],\n char: \"\\ud83d\\udcbc\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n eyeglasses: {\n keywords: [ \"fashion\", \"accessories\", \"eyesight\", \"nerdy\", \"dork\", \"geek\" ],\n char: \"\\ud83d\\udc53\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n dark_sunglasses: {\n keywords: [ \"face\", \"cool\", \"accessories\" ],\n char: \"\\ud83d\\udd76\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n goggles: {\n keywords: [ \"eyes\", \"protection\", \"safety\" ],\n char: \"\\ud83e\\udd7d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n ring: {\n keywords: [ \"wedding\", \"propose\", \"marriage\", \"valentines\", \"diamond\", \"fashion\", \"jewelry\", \"gem\", \"engagement\" ],\n char: \"\\ud83d\\udc8d\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n closed_umbrella: {\n keywords: [ \"weather\", \"rain\", \"drizzle\" ],\n char: \"\\ud83c\\udf02\",\n fitzpatrick_scale: false,\n category: \"people\"\n },\n dog: {\n keywords: [ \"animal\", \"friend\", \"nature\", \"woof\", \"puppy\", \"pet\", \"faithful\" ],\n char: \"\\ud83d\\udc36\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cat: {\n keywords: [ \"animal\", \"meow\", \"nature\", \"pet\", \"kitten\" ],\n char: \"\\ud83d\\udc31\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n mouse: {\n keywords: [ \"animal\", \"nature\", \"cheese_wedge\", \"rodent\" ],\n char: \"\\ud83d\\udc2d\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n hamster: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83d\\udc39\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n rabbit: {\n keywords: [ \"animal\", \"nature\", \"pet\", \"spring\", \"magic\", \"bunny\" ],\n char: \"\\ud83d\\udc30\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n fox_face: {\n keywords: [ \"animal\", \"nature\", \"face\" ],\n char: \"\\ud83e\\udd8a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n bear: {\n keywords: [ \"animal\", \"nature\", \"wild\" ],\n char: \"\\ud83d\\udc3b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n panda_face: {\n keywords: [ \"animal\", \"nature\", \"panda\" ],\n char: \"\\ud83d\\udc3c\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n koala: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83d\\udc28\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n tiger: {\n keywords: [ \"animal\", \"cat\", \"danger\", \"wild\", \"nature\", \"roar\" ],\n char: \"\\ud83d\\udc2f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n lion: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83e\\udd81\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cow: {\n keywords: [ \"beef\", \"ox\", \"animal\", \"nature\", \"moo\", \"milk\" ],\n char: \"\\ud83d\\udc2e\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n pig: {\n keywords: [ \"animal\", \"oink\", \"nature\" ],\n char: \"\\ud83d\\udc37\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n pig_nose: {\n keywords: [ \"animal\", \"oink\" ],\n char: \"\\ud83d\\udc3d\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n frog: {\n keywords: [ \"animal\", \"nature\", \"croak\", \"toad\" ],\n char: \"\\ud83d\\udc38\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n squid: {\n keywords: [ \"animal\", \"nature\", \"ocean\", \"sea\" ],\n char: \"\\ud83e\\udd91\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n octopus: {\n keywords: [ \"animal\", \"creature\", \"ocean\", \"sea\", \"nature\", \"beach\" ],\n char: \"\\ud83d\\udc19\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n shrimp: {\n keywords: [ \"animal\", \"ocean\", \"nature\", \"seafood\" ],\n char: \"\\ud83e\\udd90\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n monkey_face: {\n keywords: [ \"animal\", \"nature\", \"circus\" ],\n char: \"\\ud83d\\udc35\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n gorilla: {\n keywords: [ \"animal\", \"nature\", \"circus\" ],\n char: \"\\ud83e\\udd8d\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n see_no_evil: {\n keywords: [ \"monkey\", \"animal\", \"nature\", \"haha\" ],\n char: \"\\ud83d\\ude48\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n hear_no_evil: {\n keywords: [ \"animal\", \"monkey\", \"nature\" ],\n char: \"\\ud83d\\ude49\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n speak_no_evil: {\n keywords: [ \"monkey\", \"animal\", \"nature\", \"omg\" ],\n char: \"\\ud83d\\ude4a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n monkey: {\n keywords: [ \"animal\", \"nature\", \"banana\", \"circus\" ],\n char: \"\\ud83d\\udc12\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n chicken: {\n keywords: [ \"animal\", \"cluck\", \"nature\", \"bird\" ],\n char: \"\\ud83d\\udc14\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n penguin: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83d\\udc27\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n bird: {\n keywords: [ \"animal\", \"nature\", \"fly\", \"tweet\", \"spring\" ],\n char: \"\\ud83d\\udc26\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n baby_chick: {\n keywords: [ \"animal\", \"chicken\", \"bird\" ],\n char: \"\\ud83d\\udc24\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n hatching_chick: {\n keywords: [ \"animal\", \"chicken\", \"egg\", \"born\", \"baby\", \"bird\" ],\n char: \"\\ud83d\\udc23\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n hatched_chick: {\n keywords: [ \"animal\", \"chicken\", \"baby\", \"bird\" ],\n char: \"\\ud83d\\udc25\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n duck: {\n keywords: [ \"animal\", \"nature\", \"bird\", \"mallard\" ],\n char: \"\\ud83e\\udd86\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n eagle: {\n keywords: [ \"animal\", \"nature\", \"bird\" ],\n char: \"\\ud83e\\udd85\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n owl: {\n keywords: [ \"animal\", \"nature\", \"bird\", \"hoot\" ],\n char: \"\\ud83e\\udd89\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n bat: {\n keywords: [ \"animal\", \"nature\", \"blind\", \"vampire\" ],\n char: \"\\ud83e\\udd87\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n wolf: {\n keywords: [ \"animal\", \"nature\", \"wild\" ],\n char: \"\\ud83d\\udc3a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n boar: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83d\\udc17\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n horse: {\n keywords: [ \"animal\", \"brown\", \"nature\" ],\n char: \"\\ud83d\\udc34\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n unicorn: {\n keywords: [ \"animal\", \"nature\", \"mystical\" ],\n char: \"\\ud83e\\udd84\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n honeybee: {\n keywords: [ \"animal\", \"insect\", \"nature\", \"bug\", \"spring\", \"honey\" ],\n char: \"\\ud83d\\udc1d\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n bug: {\n keywords: [ \"animal\", \"insect\", \"nature\", \"worm\" ],\n char: \"\\ud83d\\udc1b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n butterfly: {\n keywords: [ \"animal\", \"insect\", \"nature\", \"caterpillar\" ],\n char: \"\\ud83e\\udd8b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n snail: {\n keywords: [ \"slow\", \"animal\", \"shell\" ],\n char: \"\\ud83d\\udc0c\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n beetle: {\n keywords: [ \"animal\", \"insect\", \"nature\", \"ladybug\" ],\n char: \"\\ud83d\\udc1e\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n ant: {\n keywords: [ \"animal\", \"insect\", \"nature\", \"bug\" ],\n char: \"\\ud83d\\udc1c\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n grasshopper: {\n keywords: [ \"animal\", \"cricket\", \"chirp\" ],\n char: \"\\ud83e\\udd97\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n spider: {\n keywords: [ \"animal\", \"arachnid\" ],\n char: \"\\ud83d\\udd77\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n scorpion: {\n keywords: [ \"animal\", \"arachnid\" ],\n char: \"\\ud83e\\udd82\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n crab: {\n keywords: [ \"animal\", \"crustacean\" ],\n char: \"\\ud83e\\udd80\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n snake: {\n keywords: [ \"animal\", \"evil\", \"nature\", \"hiss\", \"python\" ],\n char: \"\\ud83d\\udc0d\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n lizard: {\n keywords: [ \"animal\", \"nature\", \"reptile\" ],\n char: \"\\ud83e\\udd8e\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n \"t-rex\": {\n keywords: [ \"animal\", \"nature\", \"dinosaur\", \"tyrannosaurus\", \"extinct\" ],\n char: \"\\ud83e\\udd96\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sauropod: {\n keywords: [ \"animal\", \"nature\", \"dinosaur\", \"brachiosaurus\", \"brontosaurus\", \"diplodocus\", \"extinct\" ],\n char: \"\\ud83e\\udd95\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n turtle: {\n keywords: [ \"animal\", \"slow\", \"nature\", \"tortoise\" ],\n char: \"\\ud83d\\udc22\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n tropical_fish: {\n keywords: [ \"animal\", \"swim\", \"ocean\", \"beach\", \"nemo\" ],\n char: \"\\ud83d\\udc20\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n fish: {\n keywords: [ \"animal\", \"food\", \"nature\" ],\n char: \"\\ud83d\\udc1f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n blowfish: {\n keywords: [ \"animal\", \"nature\", \"food\", \"sea\", \"ocean\" ],\n char: \"\\ud83d\\udc21\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n dolphin: {\n keywords: [ \"animal\", \"nature\", \"fish\", \"sea\", \"ocean\", \"flipper\", \"fins\", \"beach\" ],\n char: \"\\ud83d\\udc2c\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n shark: {\n keywords: [ \"animal\", \"nature\", \"fish\", \"sea\", \"ocean\", \"jaws\", \"fins\", \"beach\" ],\n char: \"\\ud83e\\udd88\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n whale: {\n keywords: [ \"animal\", \"nature\", \"sea\", \"ocean\" ],\n char: \"\\ud83d\\udc33\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n whale2: {\n keywords: [ \"animal\", \"nature\", \"sea\", \"ocean\" ],\n char: \"\\ud83d\\udc0b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n crocodile: {\n keywords: [ \"animal\", \"nature\", \"reptile\", \"lizard\", \"alligator\" ],\n char: \"\\ud83d\\udc0a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n leopard: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83d\\udc06\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n zebra: {\n keywords: [ \"animal\", \"nature\", \"stripes\", \"safari\" ],\n char: \"\\ud83e\\udd93\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n tiger2: {\n keywords: [ \"animal\", \"nature\", \"roar\" ],\n char: \"\\ud83d\\udc05\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n water_buffalo: {\n keywords: [ \"animal\", \"nature\", \"ox\", \"cow\" ],\n char: \"\\ud83d\\udc03\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n ox: {\n keywords: [ \"animal\", \"cow\", \"beef\" ],\n char: \"\\ud83d\\udc02\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cow2: {\n keywords: [ \"beef\", \"ox\", \"animal\", \"nature\", \"moo\", \"milk\" ],\n char: \"\\ud83d\\udc04\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n deer: {\n keywords: [ \"animal\", \"nature\", \"horns\", \"venison\" ],\n char: \"\\ud83e\\udd8c\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n dromedary_camel: {\n keywords: [ \"animal\", \"hot\", \"desert\", \"hump\" ],\n char: \"\\ud83d\\udc2a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n camel: {\n keywords: [ \"animal\", \"nature\", \"hot\", \"desert\", \"hump\" ],\n char: \"\\ud83d\\udc2b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n giraffe: {\n keywords: [ \"animal\", \"nature\", \"spots\", \"safari\" ],\n char: \"\\ud83e\\udd92\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n elephant: {\n keywords: [ \"animal\", \"nature\", \"nose\", \"th\", \"circus\" ],\n char: \"\\ud83d\\udc18\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n rhinoceros: {\n keywords: [ \"animal\", \"nature\", \"horn\" ],\n char: \"\\ud83e\\udd8f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n goat: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83d\\udc10\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n ram: {\n keywords: [ \"animal\", \"sheep\", \"nature\" ],\n char: \"\\ud83d\\udc0f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sheep: {\n keywords: [ \"animal\", \"nature\", \"wool\", \"shipit\" ],\n char: \"\\ud83d\\udc11\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n racehorse: {\n keywords: [ \"animal\", \"gamble\", \"luck\" ],\n char: \"\\ud83d\\udc0e\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n pig2: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83d\\udc16\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n rat: {\n keywords: [ \"animal\", \"mouse\", \"rodent\" ],\n char: \"\\ud83d\\udc00\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n mouse2: {\n keywords: [ \"animal\", \"nature\", \"rodent\" ],\n char: \"\\ud83d\\udc01\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n rooster: {\n keywords: [ \"animal\", \"nature\", \"chicken\" ],\n char: \"\\ud83d\\udc13\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n turkey: {\n keywords: [ \"animal\", \"bird\" ],\n char: \"\\ud83e\\udd83\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n dove: {\n keywords: [ \"animal\", \"bird\" ],\n char: \"\\ud83d\\udd4a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n dog2: {\n keywords: [ \"animal\", \"nature\", \"friend\", \"doge\", \"pet\", \"faithful\" ],\n char: \"\\ud83d\\udc15\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n poodle: {\n keywords: [ \"dog\", \"animal\", \"101\", \"nature\", \"pet\" ],\n char: \"\\ud83d\\udc29\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cat2: {\n keywords: [ \"animal\", \"meow\", \"pet\", \"cats\" ],\n char: \"\\ud83d\\udc08\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n rabbit2: {\n keywords: [ \"animal\", \"nature\", \"pet\", \"magic\", \"spring\" ],\n char: \"\\ud83d\\udc07\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n chipmunk: {\n keywords: [ \"animal\", \"nature\", \"rodent\", \"squirrel\" ],\n char: \"\\ud83d\\udc3f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n hedgehog: {\n keywords: [ \"animal\", \"nature\", \"spiny\" ],\n char: \"\\ud83e\\udd94\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n raccoon: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83e\\udd9d\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n llama: {\n keywords: [ \"animal\", \"nature\", \"alpaca\" ],\n char: \"\\ud83e\\udd99\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n hippopotamus: {\n keywords: [ \"animal\", \"nature\" ],\n char: \"\\ud83e\\udd9b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n kangaroo: {\n keywords: [ \"animal\", \"nature\", \"australia\", \"joey\", \"hop\", \"marsupial\" ],\n char: \"\\ud83e\\udd98\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n badger: {\n keywords: [ \"animal\", \"nature\", \"honey\" ],\n char: \"\\ud83e\\udda1\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n swan: {\n keywords: [ \"animal\", \"nature\", \"bird\" ],\n char: \"\\ud83e\\udda2\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n peacock: {\n keywords: [ \"animal\", \"nature\", \"peahen\", \"bird\" ],\n char: \"\\ud83e\\udd9a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n parrot: {\n keywords: [ \"animal\", \"nature\", \"bird\", \"pirate\", \"talk\" ],\n char: \"\\ud83e\\udd9c\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n lobster: {\n keywords: [ \"animal\", \"nature\", \"bisque\", \"claws\", \"seafood\" ],\n char: \"\\ud83e\\udd9e\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n mosquito: {\n keywords: [ \"animal\", \"nature\", \"insect\", \"malaria\" ],\n char: \"\\ud83e\\udd9f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n paw_prints: {\n keywords: [ \"animal\", \"tracking\", \"footprints\", \"dog\", \"cat\", \"pet\", \"feet\" ],\n char: \"\\ud83d\\udc3e\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n dragon: {\n keywords: [ \"animal\", \"myth\", \"nature\", \"chinese\", \"green\" ],\n char: \"\\ud83d\\udc09\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n dragon_face: {\n keywords: [ \"animal\", \"myth\", \"nature\", \"chinese\", \"green\" ],\n char: \"\\ud83d\\udc32\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cactus: {\n keywords: [ \"vegetable\", \"plant\", \"nature\" ],\n char: \"\\ud83c\\udf35\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n christmas_tree: {\n keywords: [ \"festival\", \"vacation\", \"december\", \"xmas\", \"celebration\" ],\n char: \"\\ud83c\\udf84\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n evergreen_tree: {\n keywords: [ \"plant\", \"nature\" ],\n char: \"\\ud83c\\udf32\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n deciduous_tree: {\n keywords: [ \"plant\", \"nature\" ],\n char: \"\\ud83c\\udf33\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n palm_tree: {\n keywords: [ \"plant\", \"vegetable\", \"nature\", \"summer\", \"beach\", \"mojito\", \"tropical\" ],\n char: \"\\ud83c\\udf34\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n seedling: {\n keywords: [ \"plant\", \"nature\", \"grass\", \"lawn\", \"spring\" ],\n char: \"\\ud83c\\udf31\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n herb: {\n keywords: [ \"vegetable\", \"plant\", \"medicine\", \"weed\", \"grass\", \"lawn\" ],\n char: \"\\ud83c\\udf3f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n shamrock: {\n keywords: [ \"vegetable\", \"plant\", \"nature\", \"irish\", \"clover\" ],\n char: \"\\u2618\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n four_leaf_clover: {\n keywords: [ \"vegetable\", \"plant\", \"nature\", \"lucky\", \"irish\" ],\n char: \"\\ud83c\\udf40\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n bamboo: {\n keywords: [ \"plant\", \"nature\", \"vegetable\", \"panda\", \"pine_decoration\" ],\n char: \"\\ud83c\\udf8d\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n tanabata_tree: {\n keywords: [ \"plant\", \"nature\", \"branch\", \"summer\" ],\n char: \"\\ud83c\\udf8b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n leaves: {\n keywords: [ \"nature\", \"plant\", \"tree\", \"vegetable\", \"grass\", \"lawn\", \"spring\" ],\n char: \"\\ud83c\\udf43\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n fallen_leaf: {\n keywords: [ \"nature\", \"plant\", \"vegetable\", \"leaves\" ],\n char: \"\\ud83c\\udf42\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n maple_leaf: {\n keywords: [ \"nature\", \"plant\", \"vegetable\", \"ca\", \"fall\" ],\n char: \"\\ud83c\\udf41\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n ear_of_rice: {\n keywords: [ \"nature\", \"plant\" ],\n char: \"\\ud83c\\udf3e\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n hibiscus: {\n keywords: [ \"plant\", \"vegetable\", \"flowers\", \"beach\" ],\n char: \"\\ud83c\\udf3a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sunflower: {\n keywords: [ \"nature\", \"plant\", \"fall\" ],\n char: \"\\ud83c\\udf3b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n rose: {\n keywords: [ \"flowers\", \"valentines\", \"love\", \"spring\" ],\n char: \"\\ud83c\\udf39\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n wilted_flower: {\n keywords: [ \"plant\", \"nature\", \"flower\" ],\n char: \"\\ud83e\\udd40\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n tulip: {\n keywords: [ \"flowers\", \"plant\", \"nature\", \"summer\", \"spring\" ],\n char: \"\\ud83c\\udf37\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n blossom: {\n keywords: [ \"nature\", \"flowers\", \"yellow\" ],\n char: \"\\ud83c\\udf3c\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cherry_blossom: {\n keywords: [ \"nature\", \"plant\", \"spring\", \"flower\" ],\n char: \"\\ud83c\\udf38\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n bouquet: {\n keywords: [ \"flowers\", \"nature\", \"spring\" ],\n char: \"\\ud83d\\udc90\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n mushroom: {\n keywords: [ \"plant\", \"vegetable\" ],\n char: \"\\ud83c\\udf44\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n chestnut: {\n keywords: [ \"food\", \"squirrel\" ],\n char: \"\\ud83c\\udf30\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n jack_o_lantern: {\n keywords: [ \"halloween\", \"light\", \"pumpkin\", \"creepy\", \"fall\" ],\n char: \"\\ud83c\\udf83\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n shell: {\n keywords: [ \"nature\", \"sea\", \"beach\" ],\n char: \"\\ud83d\\udc1a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n spider_web: {\n keywords: [ \"animal\", \"insect\", \"arachnid\", \"silk\" ],\n char: \"\\ud83d\\udd78\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n earth_americas: {\n keywords: [ \"globe\", \"world\", \"USA\", \"international\" ],\n char: \"\\ud83c\\udf0e\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n earth_africa: {\n keywords: [ \"globe\", \"world\", \"international\" ],\n char: \"\\ud83c\\udf0d\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n earth_asia: {\n keywords: [ \"globe\", \"world\", \"east\", \"international\" ],\n char: \"\\ud83c\\udf0f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n full_moon: {\n keywords: [ \"nature\", \"yellow\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf15\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n waning_gibbous_moon: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\", \"waxing_gibbous_moon\" ],\n char: \"\\ud83c\\udf16\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n last_quarter_moon: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf17\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n waning_crescent_moon: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf18\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n new_moon: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf11\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n waxing_crescent_moon: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf12\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n first_quarter_moon: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf13\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n waxing_gibbous_moon: {\n keywords: [ \"nature\", \"night\", \"sky\", \"gray\", \"twilight\", \"planet\", \"space\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf14\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n new_moon_with_face: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf1a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n full_moon_with_face: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf1d\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n first_quarter_moon_with_face: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf1b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n last_quarter_moon_with_face: {\n keywords: [ \"nature\", \"twilight\", \"planet\", \"space\", \"night\", \"evening\", \"sleep\" ],\n char: \"\\ud83c\\udf1c\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sun_with_face: {\n keywords: [ \"nature\", \"morning\", \"sky\" ],\n char: \"\\ud83c\\udf1e\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n crescent_moon: {\n keywords: [ \"night\", \"sleep\", \"sky\", \"evening\", \"magic\" ],\n char: \"\\ud83c\\udf19\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n star: {\n keywords: [ \"night\", \"yellow\" ],\n char: \"\\u2b50\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n star2: {\n keywords: [ \"night\", \"sparkle\", \"awesome\", \"good\", \"magic\" ],\n char: \"\\ud83c\\udf1f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n dizzy: {\n keywords: [ \"star\", \"sparkle\", \"shoot\", \"magic\" ],\n char: \"\\ud83d\\udcab\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sparkles: {\n keywords: [ \"stars\", \"shine\", \"shiny\", \"cool\", \"awesome\", \"good\", \"magic\" ],\n char: \"\\u2728\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n comet: {\n keywords: [ \"space\" ],\n char: \"\\u2604\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sunny: {\n keywords: [ \"weather\", \"nature\", \"brightness\", \"summer\", \"beach\", \"spring\" ],\n char: \"\\u2600\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sun_behind_small_cloud: {\n keywords: [ \"weather\" ],\n char: \"\\ud83c\\udf24\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n partly_sunny: {\n keywords: [ \"weather\", \"nature\", \"cloudy\", \"morning\", \"fall\", \"spring\" ],\n char: \"\\u26c5\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sun_behind_large_cloud: {\n keywords: [ \"weather\" ],\n char: \"\\ud83c\\udf25\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sun_behind_rain_cloud: {\n keywords: [ \"weather\" ],\n char: \"\\ud83c\\udf26\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cloud: {\n keywords: [ \"weather\", \"sky\" ],\n char: \"\\u2601\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cloud_with_rain: {\n keywords: [ \"weather\" ],\n char: \"\\ud83c\\udf27\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cloud_with_lightning_and_rain: {\n keywords: [ \"weather\", \"lightning\" ],\n char: \"\\u26c8\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cloud_with_lightning: {\n keywords: [ \"weather\", \"thunder\" ],\n char: \"\\ud83c\\udf29\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n zap: {\n keywords: [ \"thunder\", \"weather\", \"lightning bolt\", \"fast\" ],\n char: \"\\u26a1\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n fire: {\n keywords: [ \"hot\", \"cook\", \"flame\" ],\n char: \"\\ud83d\\udd25\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n boom: {\n keywords: [ \"bomb\", \"explode\", \"explosion\", \"collision\", \"blown\" ],\n char: \"\\ud83d\\udca5\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n snowflake: {\n keywords: [ \"winter\", \"season\", \"cold\", \"weather\", \"christmas\", \"xmas\" ],\n char: \"\\u2744\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n cloud_with_snow: {\n keywords: [ \"weather\" ],\n char: \"\\ud83c\\udf28\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n snowman: {\n keywords: [ \"winter\", \"season\", \"cold\", \"weather\", \"christmas\", \"xmas\", \"frozen\", \"without_snow\" ],\n char: \"\\u26c4\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n snowman_with_snow: {\n keywords: [ \"winter\", \"season\", \"cold\", \"weather\", \"christmas\", \"xmas\", \"frozen\" ],\n char: \"\\u2603\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n wind_face: {\n keywords: [ \"gust\", \"air\" ],\n char: \"\\ud83c\\udf2c\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n dash: {\n keywords: [ \"wind\", \"air\", \"fast\", \"shoo\", \"fart\", \"smoke\", \"puff\" ],\n char: \"\\ud83d\\udca8\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n tornado: {\n keywords: [ \"weather\", \"cyclone\", \"twister\" ],\n char: \"\\ud83c\\udf2a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n fog: {\n keywords: [ \"weather\" ],\n char: \"\\ud83c\\udf2b\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n open_umbrella: {\n keywords: [ \"weather\", \"spring\" ],\n char: \"\\u2602\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n umbrella: {\n keywords: [ \"rainy\", \"weather\", \"spring\" ],\n char: \"\\u2614\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n droplet: {\n keywords: [ \"water\", \"drip\", \"faucet\", \"spring\" ],\n char: \"\\ud83d\\udca7\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n sweat_drops: {\n keywords: [ \"water\", \"drip\", \"oops\" ],\n char: \"\\ud83d\\udca6\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n ocean: {\n keywords: [ \"sea\", \"water\", \"wave\", \"nature\", \"tsunami\", \"disaster\" ],\n char: \"\\ud83c\\udf0a\",\n fitzpatrick_scale: false,\n category: \"animals_and_nature\"\n },\n green_apple: {\n keywords: [ \"fruit\", \"nature\" ],\n char: \"\\ud83c\\udf4f\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n apple: {\n keywords: [ \"fruit\", \"mac\", \"school\" ],\n char: \"\\ud83c\\udf4e\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n pear: {\n keywords: [ \"fruit\", \"nature\", \"food\" ],\n char: \"\\ud83c\\udf50\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n tangerine: {\n keywords: [ \"food\", \"fruit\", \"nature\", \"orange\" ],\n char: \"\\ud83c\\udf4a\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n lemon: {\n keywords: [ \"fruit\", \"nature\" ],\n char: \"\\ud83c\\udf4b\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n banana: {\n keywords: [ \"fruit\", \"food\", \"monkey\" ],\n char: \"\\ud83c\\udf4c\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n watermelon: {\n keywords: [ \"fruit\", \"food\", \"picnic\", \"summer\" ],\n char: \"\\ud83c\\udf49\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n grapes: {\n keywords: [ \"fruit\", \"food\", \"wine\" ],\n char: \"\\ud83c\\udf47\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n strawberry: {\n keywords: [ \"fruit\", \"food\", \"nature\" ],\n char: \"\\ud83c\\udf53\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n melon: {\n keywords: [ \"fruit\", \"nature\", \"food\" ],\n char: \"\\ud83c\\udf48\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n cherries: {\n keywords: [ \"food\", \"fruit\" ],\n char: \"\\ud83c\\udf52\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n peach: {\n keywords: [ \"fruit\", \"nature\", \"food\" ],\n char: \"\\ud83c\\udf51\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n pineapple: {\n keywords: [ \"fruit\", \"nature\", \"food\" ],\n char: \"\\ud83c\\udf4d\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n coconut: {\n keywords: [ \"fruit\", \"nature\", \"food\", \"palm\" ],\n char: \"\\ud83e\\udd65\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n kiwi_fruit: {\n keywords: [ \"fruit\", \"food\" ],\n char: \"\\ud83e\\udd5d\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n mango: {\n keywords: [ \"fruit\", \"food\", \"tropical\" ],\n char: \"\\ud83e\\udd6d\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n avocado: {\n keywords: [ \"fruit\", \"food\" ],\n char: \"\\ud83e\\udd51\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n broccoli: {\n keywords: [ \"fruit\", \"food\", \"vegetable\" ],\n char: \"\\ud83e\\udd66\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n tomato: {\n keywords: [ \"fruit\", \"vegetable\", \"nature\", \"food\" ],\n char: \"\\ud83c\\udf45\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n eggplant: {\n keywords: [ \"vegetable\", \"nature\", \"food\", \"aubergine\" ],\n char: \"\\ud83c\\udf46\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n cucumber: {\n keywords: [ \"fruit\", \"food\", \"pickle\" ],\n char: \"\\ud83e\\udd52\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n carrot: {\n keywords: [ \"vegetable\", \"food\", \"orange\" ],\n char: \"\\ud83e\\udd55\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n hot_pepper: {\n keywords: [ \"food\", \"spicy\", \"chilli\", \"chili\" ],\n char: \"\\ud83c\\udf36\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n potato: {\n keywords: [ \"food\", \"tuber\", \"vegatable\", \"starch\" ],\n char: \"\\ud83e\\udd54\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n corn: {\n keywords: [ \"food\", \"vegetable\", \"plant\" ],\n char: \"\\ud83c\\udf3d\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n leafy_greens: {\n keywords: [ \"food\", \"vegetable\", \"plant\", \"bok choy\", \"cabbage\", \"kale\", \"lettuce\" ],\n char: \"\\ud83e\\udd6c\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n sweet_potato: {\n keywords: [ \"food\", \"nature\" ],\n char: \"\\ud83c\\udf60\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n peanuts: {\n keywords: [ \"food\", \"nut\" ],\n char: \"\\ud83e\\udd5c\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n honey_pot: {\n keywords: [ \"bees\", \"sweet\", \"kitchen\" ],\n char: \"\\ud83c\\udf6f\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n croissant: {\n keywords: [ \"food\", \"bread\", \"french\" ],\n char: \"\\ud83e\\udd50\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n bread: {\n keywords: [ \"food\", \"wheat\", \"breakfast\", \"toast\" ],\n char: \"\\ud83c\\udf5e\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n baguette_bread: {\n keywords: [ \"food\", \"bread\", \"french\" ],\n char: \"\\ud83e\\udd56\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n bagel: {\n keywords: [ \"food\", \"bread\", \"bakery\", \"schmear\" ],\n char: \"\\ud83e\\udd6f\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n pretzel: {\n keywords: [ \"food\", \"bread\", \"twisted\" ],\n char: \"\\ud83e\\udd68\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n cheese: {\n keywords: [ \"food\", \"chadder\" ],\n char: \"\\ud83e\\uddc0\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n egg: {\n keywords: [ \"food\", \"chicken\", \"breakfast\" ],\n char: \"\\ud83e\\udd5a\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n bacon: {\n keywords: [ \"food\", \"breakfast\", \"pork\", \"pig\", \"meat\" ],\n char: \"\\ud83e\\udd53\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n steak: {\n keywords: [ \"food\", \"cow\", \"meat\", \"cut\", \"chop\", \"lambchop\", \"porkchop\" ],\n char: \"\\ud83e\\udd69\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n pancakes: {\n keywords: [ \"food\", \"breakfast\", \"flapjacks\", \"hotcakes\" ],\n char: \"\\ud83e\\udd5e\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n poultry_leg: {\n keywords: [ \"food\", \"meat\", \"drumstick\", \"bird\", \"chicken\", \"turkey\" ],\n char: \"\\ud83c\\udf57\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n meat_on_bone: {\n keywords: [ \"good\", \"food\", \"drumstick\" ],\n char: \"\\ud83c\\udf56\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n bone: {\n keywords: [ \"skeleton\" ],\n char: \"\\ud83e\\uddb4\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n fried_shrimp: {\n keywords: [ \"food\", \"animal\", \"appetizer\", \"summer\" ],\n char: \"\\ud83c\\udf64\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n fried_egg: {\n keywords: [ \"food\", \"breakfast\", \"kitchen\", \"egg\" ],\n char: \"\\ud83c\\udf73\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n hamburger: {\n keywords: [ \"meat\", \"fast food\", \"beef\", \"cheeseburger\", \"mcdonalds\", \"burger king\" ],\n char: \"\\ud83c\\udf54\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n fries: {\n keywords: [ \"chips\", \"snack\", \"fast food\" ],\n char: \"\\ud83c\\udf5f\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n stuffed_flatbread: {\n keywords: [ \"food\", \"flatbread\", \"stuffed\", \"gyro\" ],\n char: \"\\ud83e\\udd59\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n hotdog: {\n keywords: [ \"food\", \"frankfurter\" ],\n char: \"\\ud83c\\udf2d\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n pizza: {\n keywords: [ \"food\", \"party\" ],\n char: \"\\ud83c\\udf55\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n sandwich: {\n keywords: [ \"food\", \"lunch\", \"bread\" ],\n char: \"\\ud83e\\udd6a\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n canned_food: {\n keywords: [ \"food\", \"soup\" ],\n char: \"\\ud83e\\udd6b\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n spaghetti: {\n keywords: [ \"food\", \"italian\", \"noodle\" ],\n char: \"\\ud83c\\udf5d\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n taco: {\n keywords: [ \"food\", \"mexican\" ],\n char: \"\\ud83c\\udf2e\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n burrito: {\n keywords: [ \"food\", \"mexican\" ],\n char: \"\\ud83c\\udf2f\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n green_salad: {\n keywords: [ \"food\", \"healthy\", \"lettuce\" ],\n char: \"\\ud83e\\udd57\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n shallow_pan_of_food: {\n keywords: [ \"food\", \"cooking\", \"casserole\", \"paella\" ],\n char: \"\\ud83e\\udd58\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n ramen: {\n keywords: [ \"food\", \"japanese\", \"noodle\", \"chopsticks\" ],\n char: \"\\ud83c\\udf5c\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n stew: {\n keywords: [ \"food\", \"meat\", \"soup\" ],\n char: \"\\ud83c\\udf72\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n fish_cake: {\n keywords: [ \"food\", \"japan\", \"sea\", \"beach\", \"narutomaki\", \"pink\", \"swirl\", \"kamaboko\", \"surimi\", \"ramen\" ],\n char: \"\\ud83c\\udf65\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n fortune_cookie: {\n keywords: [ \"food\", \"prophecy\" ],\n char: \"\\ud83e\\udd60\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n sushi: {\n keywords: [ \"food\", \"fish\", \"japanese\", \"rice\" ],\n char: \"\\ud83c\\udf63\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n bento: {\n keywords: [ \"food\", \"japanese\", \"box\" ],\n char: \"\\ud83c\\udf71\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n curry: {\n keywords: [ \"food\", \"spicy\", \"hot\", \"indian\" ],\n char: \"\\ud83c\\udf5b\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n rice_ball: {\n keywords: [ \"food\", \"japanese\" ],\n char: \"\\ud83c\\udf59\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n rice: {\n keywords: [ \"food\", \"china\", \"asian\" ],\n char: \"\\ud83c\\udf5a\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n rice_cracker: {\n keywords: [ \"food\", \"japanese\" ],\n char: \"\\ud83c\\udf58\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n oden: {\n keywords: [ \"food\", \"japanese\" ],\n char: \"\\ud83c\\udf62\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n dango: {\n keywords: [ \"food\", \"dessert\", \"sweet\", \"japanese\", \"barbecue\", \"meat\" ],\n char: \"\\ud83c\\udf61\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n shaved_ice: {\n keywords: [ \"hot\", \"dessert\", \"summer\" ],\n char: \"\\ud83c\\udf67\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n ice_cream: {\n keywords: [ \"food\", \"hot\", \"dessert\" ],\n char: \"\\ud83c\\udf68\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n icecream: {\n keywords: [ \"food\", \"hot\", \"dessert\", \"summer\" ],\n char: \"\\ud83c\\udf66\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n pie: {\n keywords: [ \"food\", \"dessert\", \"pastry\" ],\n char: \"\\ud83e\\udd67\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n cake: {\n keywords: [ \"food\", \"dessert\" ],\n char: \"\\ud83c\\udf70\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n cupcake: {\n keywords: [ \"food\", \"dessert\", \"bakery\", \"sweet\" ],\n char: \"\\ud83e\\uddc1\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n moon_cake: {\n keywords: [ \"food\", \"autumn\" ],\n char: \"\\ud83e\\udd6e\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n birthday: {\n keywords: [ \"food\", \"dessert\", \"cake\" ],\n char: \"\\ud83c\\udf82\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n custard: {\n keywords: [ \"dessert\", \"food\" ],\n char: \"\\ud83c\\udf6e\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n candy: {\n keywords: [ \"snack\", \"dessert\", \"sweet\", \"lolly\" ],\n char: \"\\ud83c\\udf6c\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n lollipop: {\n keywords: [ \"food\", \"snack\", \"candy\", \"sweet\" ],\n char: \"\\ud83c\\udf6d\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n chocolate_bar: {\n keywords: [ \"food\", \"snack\", \"dessert\", \"sweet\" ],\n char: \"\\ud83c\\udf6b\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n popcorn: {\n keywords: [ \"food\", \"movie theater\", \"films\", \"snack\" ],\n char: \"\\ud83c\\udf7f\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n dumpling: {\n keywords: [ \"food\", \"empanada\", \"pierogi\", \"potsticker\" ],\n char: \"\\ud83e\\udd5f\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n doughnut: {\n keywords: [ \"food\", \"dessert\", \"snack\", \"sweet\", \"donut\" ],\n char: \"\\ud83c\\udf69\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n cookie: {\n keywords: [ \"food\", \"snack\", \"oreo\", \"chocolate\", \"sweet\", \"dessert\" ],\n char: \"\\ud83c\\udf6a\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n milk_glass: {\n keywords: [ \"beverage\", \"drink\", \"cow\" ],\n char: \"\\ud83e\\udd5b\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n beer: {\n keywords: [ \"relax\", \"beverage\", \"drink\", \"drunk\", \"party\", \"pub\", \"summer\", \"alcohol\", \"booze\" ],\n char: \"\\ud83c\\udf7a\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n beers: {\n keywords: [ \"relax\", \"beverage\", \"drink\", \"drunk\", \"party\", \"pub\", \"summer\", \"alcohol\", \"booze\" ],\n char: \"\\ud83c\\udf7b\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n clinking_glasses: {\n keywords: [ \"beverage\", \"drink\", \"party\", \"alcohol\", \"celebrate\", \"cheers\", \"wine\", \"champagne\", \"toast\" ],\n char: \"\\ud83e\\udd42\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n wine_glass: {\n keywords: [ \"drink\", \"beverage\", \"drunk\", \"alcohol\", \"booze\" ],\n char: \"\\ud83c\\udf77\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n tumbler_glass: {\n keywords: [ \"drink\", \"beverage\", \"drunk\", \"alcohol\", \"liquor\", \"booze\", \"bourbon\", \"scotch\", \"whisky\", \"glass\", \"shot\" ],\n char: \"\\ud83e\\udd43\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n cocktail: {\n keywords: [ \"drink\", \"drunk\", \"alcohol\", \"beverage\", \"booze\", \"mojito\" ],\n char: \"\\ud83c\\udf78\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n tropical_drink: {\n keywords: [ \"beverage\", \"cocktail\", \"summer\", \"beach\", \"alcohol\", \"booze\", \"mojito\" ],\n char: \"\\ud83c\\udf79\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n champagne: {\n keywords: [ \"drink\", \"wine\", \"bottle\", \"celebration\" ],\n char: \"\\ud83c\\udf7e\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n sake: {\n keywords: [ \"wine\", \"drink\", \"drunk\", \"beverage\", \"japanese\", \"alcohol\", \"booze\" ],\n char: \"\\ud83c\\udf76\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n tea: {\n keywords: [ \"drink\", \"bowl\", \"breakfast\", \"green\", \"british\" ],\n char: \"\\ud83c\\udf75\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n cup_with_straw: {\n keywords: [ \"drink\", \"soda\" ],\n char: \"\\ud83e\\udd64\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n coffee: {\n keywords: [ \"beverage\", \"caffeine\", \"latte\", \"espresso\" ],\n char: \"\\u2615\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n baby_bottle: {\n keywords: [ \"food\", \"container\", \"milk\" ],\n char: \"\\ud83c\\udf7c\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n salt: {\n keywords: [ \"condiment\", \"shaker\" ],\n char: \"\\ud83e\\uddc2\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n spoon: {\n keywords: [ \"cutlery\", \"kitchen\", \"tableware\" ],\n char: \"\\ud83e\\udd44\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n fork_and_knife: {\n keywords: [ \"cutlery\", \"kitchen\" ],\n char: \"\\ud83c\\udf74\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n plate_with_cutlery: {\n keywords: [ \"food\", \"eat\", \"meal\", \"lunch\", \"dinner\", \"restaurant\" ],\n char: \"\\ud83c\\udf7d\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n bowl_with_spoon: {\n keywords: [ \"food\", \"breakfast\", \"cereal\", \"oatmeal\", \"porridge\" ],\n char: \"\\ud83e\\udd63\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n takeout_box: {\n keywords: [ \"food\", \"leftovers\" ],\n char: \"\\ud83e\\udd61\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n chopsticks: {\n keywords: [ \"food\" ],\n char: \"\\ud83e\\udd62\",\n fitzpatrick_scale: false,\n category: \"food_and_drink\"\n },\n soccer: {\n keywords: [ \"sports\", \"football\" ],\n char: \"\\u26bd\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n basketball: {\n keywords: [ \"sports\", \"balls\", \"NBA\" ],\n char: \"\\ud83c\\udfc0\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n football: {\n keywords: [ \"sports\", \"balls\", \"NFL\" ],\n char: \"\\ud83c\\udfc8\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n baseball: {\n keywords: [ \"sports\", \"balls\" ],\n char: \"\\u26be\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n softball: {\n keywords: [ \"sports\", \"balls\" ],\n char: \"\\ud83e\\udd4e\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n tennis: {\n keywords: [ \"sports\", \"balls\", \"green\" ],\n char: \"\\ud83c\\udfbe\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n volleyball: {\n keywords: [ \"sports\", \"balls\" ],\n char: \"\\ud83c\\udfd0\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n rugby_football: {\n keywords: [ \"sports\", \"team\" ],\n char: \"\\ud83c\\udfc9\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n flying_disc: {\n keywords: [ \"sports\", \"frisbee\", \"ultimate\" ],\n char: \"\\ud83e\\udd4f\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n \"8ball\": {\n keywords: [ \"pool\", \"hobby\", \"game\", \"luck\", \"magic\" ],\n char: \"\\ud83c\\udfb1\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n golf: {\n keywords: [ \"sports\", \"business\", \"flag\", \"hole\", \"summer\" ],\n char: \"\\u26f3\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n golfing_woman: {\n keywords: [ \"sports\", \"business\", \"woman\", \"female\" ],\n char: \"\\ud83c\\udfcc\\ufe0f\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n golfing_man: {\n keywords: [ \"sports\", \"business\" ],\n char: \"\\ud83c\\udfcc\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n ping_pong: {\n keywords: [ \"sports\", \"pingpong\" ],\n char: \"\\ud83c\\udfd3\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n badminton: {\n keywords: [ \"sports\" ],\n char: \"\\ud83c\\udff8\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n goal_net: {\n keywords: [ \"sports\" ],\n char: \"\\ud83e\\udd45\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n ice_hockey: {\n keywords: [ \"sports\" ],\n char: \"\\ud83c\\udfd2\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n field_hockey: {\n keywords: [ \"sports\" ],\n char: \"\\ud83c\\udfd1\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n lacrosse: {\n keywords: [ \"sports\", \"ball\", \"stick\" ],\n char: \"\\ud83e\\udd4d\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n cricket: {\n keywords: [ \"sports\" ],\n char: \"\\ud83c\\udfcf\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n ski: {\n keywords: [ \"sports\", \"winter\", \"cold\", \"snow\" ],\n char: \"\\ud83c\\udfbf\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n skier: {\n keywords: [ \"sports\", \"winter\", \"snow\" ],\n char: \"\\u26f7\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n snowboarder: {\n keywords: [ \"sports\", \"winter\" ],\n char: \"\\ud83c\\udfc2\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n person_fencing: {\n keywords: [ \"sports\", \"fencing\", \"sword\" ],\n char: \"\\ud83e\\udd3a\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n women_wrestling: {\n keywords: [ \"sports\", \"wrestlers\" ],\n char: \"\\ud83e\\udd3c\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n men_wrestling: {\n keywords: [ \"sports\", \"wrestlers\" ],\n char: \"\\ud83e\\udd3c\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n woman_cartwheeling: {\n keywords: [ \"gymnastics\" ],\n char: \"\\ud83e\\udd38\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n man_cartwheeling: {\n keywords: [ \"gymnastics\" ],\n char: \"\\ud83e\\udd38\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n woman_playing_handball: {\n keywords: [ \"sports\" ],\n char: \"\\ud83e\\udd3e\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n man_playing_handball: {\n keywords: [ \"sports\" ],\n char: \"\\ud83e\\udd3e\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n ice_skate: {\n keywords: [ \"sports\" ],\n char: \"\\u26f8\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n curling_stone: {\n keywords: [ \"sports\" ],\n char: \"\\ud83e\\udd4c\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n skateboard: {\n keywords: [ \"board\" ],\n char: \"\\ud83d\\udef9\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n sled: {\n keywords: [ \"sleigh\", \"luge\", \"toboggan\" ],\n char: \"\\ud83d\\udef7\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n bow_and_arrow: {\n keywords: [ \"sports\" ],\n char: \"\\ud83c\\udff9\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n fishing_pole_and_fish: {\n keywords: [ \"food\", \"hobby\", \"summer\" ],\n char: \"\\ud83c\\udfa3\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n boxing_glove: {\n keywords: [ \"sports\", \"fighting\" ],\n char: \"\\ud83e\\udd4a\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n martial_arts_uniform: {\n keywords: [ \"judo\", \"karate\", \"taekwondo\" ],\n char: \"\\ud83e\\udd4b\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n rowing_woman: {\n keywords: [ \"sports\", \"hobby\", \"water\", \"ship\", \"woman\", \"female\" ],\n char: \"\\ud83d\\udea3\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n rowing_man: {\n keywords: [ \"sports\", \"hobby\", \"water\", \"ship\" ],\n char: \"\\ud83d\\udea3\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n climbing_woman: {\n keywords: [ \"sports\", \"hobby\", \"woman\", \"female\", \"rock\" ],\n char: \"\\ud83e\\uddd7\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n climbing_man: {\n keywords: [ \"sports\", \"hobby\", \"man\", \"male\", \"rock\" ],\n char: \"\\ud83e\\uddd7\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n swimming_woman: {\n keywords: [ \"sports\", \"exercise\", \"human\", \"athlete\", \"water\", \"summer\", \"woman\", \"female\" ],\n char: \"\\ud83c\\udfca\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n swimming_man: {\n keywords: [ \"sports\", \"exercise\", \"human\", \"athlete\", \"water\", \"summer\" ],\n char: \"\\ud83c\\udfca\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n woman_playing_water_polo: {\n keywords: [ \"sports\", \"pool\" ],\n char: \"\\ud83e\\udd3d\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n man_playing_water_polo: {\n keywords: [ \"sports\", \"pool\" ],\n char: \"\\ud83e\\udd3d\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n woman_in_lotus_position: {\n keywords: [ \"woman\", \"female\", \"meditation\", \"yoga\", \"serenity\", \"zen\", \"mindfulness\" ],\n char: \"\\ud83e\\uddd8\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n man_in_lotus_position: {\n keywords: [ \"man\", \"male\", \"meditation\", \"yoga\", \"serenity\", \"zen\", \"mindfulness\" ],\n char: \"\\ud83e\\uddd8\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n surfing_woman: {\n keywords: [ \"sports\", \"ocean\", \"sea\", \"summer\", \"beach\", \"woman\", \"female\" ],\n char: \"\\ud83c\\udfc4\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n surfing_man: {\n keywords: [ \"sports\", \"ocean\", \"sea\", \"summer\", \"beach\" ],\n char: \"\\ud83c\\udfc4\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n bath: {\n keywords: [ \"clean\", \"shower\", \"bathroom\" ],\n char: \"\\ud83d\\udec0\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n basketball_woman: {\n keywords: [ \"sports\", \"human\", \"woman\", \"female\" ],\n char: \"\\u26f9\\ufe0f\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n basketball_man: {\n keywords: [ \"sports\", \"human\" ],\n char: \"\\u26f9\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n weight_lifting_woman: {\n keywords: [ \"sports\", \"training\", \"exercise\", \"woman\", \"female\" ],\n char: \"\\ud83c\\udfcb\\ufe0f\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n weight_lifting_man: {\n keywords: [ \"sports\", \"training\", \"exercise\" ],\n char: \"\\ud83c\\udfcb\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n biking_woman: {\n keywords: [ \"sports\", \"bike\", \"exercise\", \"hipster\", \"woman\", \"female\" ],\n char: \"\\ud83d\\udeb4\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n biking_man: {\n keywords: [ \"sports\", \"bike\", \"exercise\", \"hipster\" ],\n char: \"\\ud83d\\udeb4\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n mountain_biking_woman: {\n keywords: [ \"transportation\", \"sports\", \"human\", \"race\", \"bike\", \"woman\", \"female\" ],\n char: \"\\ud83d\\udeb5\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n mountain_biking_man: {\n keywords: [ \"transportation\", \"sports\", \"human\", \"race\", \"bike\" ],\n char: \"\\ud83d\\udeb5\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n horse_racing: {\n keywords: [ \"animal\", \"betting\", \"competition\", \"gambling\", \"luck\" ],\n char: \"\\ud83c\\udfc7\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n business_suit_levitating: {\n keywords: [ \"suit\", \"business\", \"levitate\", \"hover\", \"jump\" ],\n char: \"\\ud83d\\udd74\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n trophy: {\n keywords: [ \"win\", \"award\", \"contest\", \"place\", \"ftw\", \"ceremony\" ],\n char: \"\\ud83c\\udfc6\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n running_shirt_with_sash: {\n keywords: [ \"play\", \"pageant\" ],\n char: \"\\ud83c\\udfbd\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n medal_sports: {\n keywords: [ \"award\", \"winning\" ],\n char: \"\\ud83c\\udfc5\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n medal_military: {\n keywords: [ \"award\", \"winning\", \"army\" ],\n char: \"\\ud83c\\udf96\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n \"1st_place_medal\": {\n keywords: [ \"award\", \"winning\", \"first\" ],\n char: \"\\ud83e\\udd47\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n \"2nd_place_medal\": {\n keywords: [ \"award\", \"second\" ],\n char: \"\\ud83e\\udd48\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n \"3rd_place_medal\": {\n keywords: [ \"award\", \"third\" ],\n char: \"\\ud83e\\udd49\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n reminder_ribbon: {\n keywords: [ \"sports\", \"cause\", \"support\", \"awareness\" ],\n char: \"\\ud83c\\udf97\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n rosette: {\n keywords: [ \"flower\", \"decoration\", \"military\" ],\n char: \"\\ud83c\\udff5\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n ticket: {\n keywords: [ \"event\", \"concert\", \"pass\" ],\n char: \"\\ud83c\\udfab\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n tickets: {\n keywords: [ \"sports\", \"concert\", \"entrance\" ],\n char: \"\\ud83c\\udf9f\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n performing_arts: {\n keywords: [ \"acting\", \"theater\", \"drama\" ],\n char: \"\\ud83c\\udfad\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n art: {\n keywords: [ \"design\", \"paint\", \"draw\", \"colors\" ],\n char: \"\\ud83c\\udfa8\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n circus_tent: {\n keywords: [ \"festival\", \"carnival\", \"party\" ],\n char: \"\\ud83c\\udfaa\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n woman_juggling: {\n keywords: [ \"juggle\", \"balance\", \"skill\", \"multitask\" ],\n char: \"\\ud83e\\udd39\\u200d\\u2640\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n man_juggling: {\n keywords: [ \"juggle\", \"balance\", \"skill\", \"multitask\" ],\n char: \"\\ud83e\\udd39\\u200d\\u2642\\ufe0f\",\n fitzpatrick_scale: true,\n category: \"activity\"\n },\n microphone: {\n keywords: [ \"sound\", \"music\", \"PA\", \"sing\", \"talkshow\" ],\n char: \"\\ud83c\\udfa4\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n headphones: {\n keywords: [ \"music\", \"score\", \"gadgets\" ],\n char: \"\\ud83c\\udfa7\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n musical_score: {\n keywords: [ \"treble\", \"clef\", \"compose\" ],\n char: \"\\ud83c\\udfbc\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n musical_keyboard: {\n keywords: [ \"piano\", \"instrument\", \"compose\" ],\n char: \"\\ud83c\\udfb9\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n drum: {\n keywords: [ \"music\", \"instrument\", \"drumsticks\", \"snare\" ],\n char: \"\\ud83e\\udd41\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n saxophone: {\n keywords: [ \"music\", \"instrument\", \"jazz\", \"blues\" ],\n char: \"\\ud83c\\udfb7\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n trumpet: {\n keywords: [ \"music\", \"brass\" ],\n char: \"\\ud83c\\udfba\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n guitar: {\n keywords: [ \"music\", \"instrument\" ],\n char: \"\\ud83c\\udfb8\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n violin: {\n keywords: [ \"music\", \"instrument\", \"orchestra\", \"symphony\" ],\n char: \"\\ud83c\\udfbb\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n clapper: {\n keywords: [ \"movie\", \"film\", \"record\" ],\n char: \"\\ud83c\\udfac\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n video_game: {\n keywords: [ \"play\", \"console\", \"PS4\", \"controller\" ],\n char: \"\\ud83c\\udfae\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n space_invader: {\n keywords: [ \"game\", \"arcade\", \"play\" ],\n char: \"\\ud83d\\udc7e\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n dart: {\n keywords: [ \"game\", \"play\", \"bar\", \"target\", \"bullseye\" ],\n char: \"\\ud83c\\udfaf\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n game_die: {\n keywords: [ \"dice\", \"random\", \"tabletop\", \"play\", \"luck\" ],\n char: \"\\ud83c\\udfb2\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n chess_pawn: {\n keywords: [ \"expendable\" ],\n char: \"\\u265f\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n slot_machine: {\n keywords: [ \"bet\", \"gamble\", \"vegas\", \"fruit machine\", \"luck\", \"casino\" ],\n char: \"\\ud83c\\udfb0\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n jigsaw: {\n keywords: [ \"interlocking\", \"puzzle\", \"piece\" ],\n char: \"\\ud83e\\udde9\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n bowling: {\n keywords: [ \"sports\", \"fun\", \"play\" ],\n char: \"\\ud83c\\udfb3\",\n fitzpatrick_scale: false,\n category: \"activity\"\n },\n red_car: {\n keywords: [ \"red\", \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude97\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n taxi: {\n keywords: [ \"uber\", \"vehicle\", \"cars\", \"transportation\" ],\n char: \"\\ud83d\\ude95\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n blue_car: {\n keywords: [ \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude99\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n bus: {\n keywords: [ \"car\", \"vehicle\", \"transportation\" ],\n char: \"\\ud83d\\ude8c\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n trolleybus: {\n keywords: [ \"bart\", \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude8e\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n racing_car: {\n keywords: [ \"sports\", \"race\", \"fast\", \"formula\", \"f1\" ],\n char: \"\\ud83c\\udfce\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n police_car: {\n keywords: [ \"vehicle\", \"cars\", \"transportation\", \"law\", \"legal\", \"enforcement\" ],\n char: \"\\ud83d\\ude93\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n ambulance: {\n keywords: [ \"health\", \"911\", \"hospital\" ],\n char: \"\\ud83d\\ude91\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n fire_engine: {\n keywords: [ \"transportation\", \"cars\", \"vehicle\" ],\n char: \"\\ud83d\\ude92\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n minibus: {\n keywords: [ \"vehicle\", \"car\", \"transportation\" ],\n char: \"\\ud83d\\ude90\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n truck: {\n keywords: [ \"cars\", \"transportation\" ],\n char: \"\\ud83d\\ude9a\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n articulated_lorry: {\n keywords: [ \"vehicle\", \"cars\", \"transportation\", \"express\" ],\n char: \"\\ud83d\\ude9b\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n tractor: {\n keywords: [ \"vehicle\", \"car\", \"farming\", \"agriculture\" ],\n char: \"\\ud83d\\ude9c\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n kick_scooter: {\n keywords: [ \"vehicle\", \"kick\", \"razor\" ],\n char: \"\\ud83d\\udef4\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n motorcycle: {\n keywords: [ \"race\", \"sports\", \"fast\" ],\n char: \"\\ud83c\\udfcd\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n bike: {\n keywords: [ \"sports\", \"bicycle\", \"exercise\", \"hipster\" ],\n char: \"\\ud83d\\udeb2\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n motor_scooter: {\n keywords: [ \"vehicle\", \"vespa\", \"sasha\" ],\n char: \"\\ud83d\\udef5\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n rotating_light: {\n keywords: [ \"police\", \"ambulance\", \"911\", \"emergency\", \"alert\", \"error\", \"pinged\", \"law\", \"legal\" ],\n char: \"\\ud83d\\udea8\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n oncoming_police_car: {\n keywords: [ \"vehicle\", \"law\", \"legal\", \"enforcement\", \"911\" ],\n char: \"\\ud83d\\ude94\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n oncoming_bus: {\n keywords: [ \"vehicle\", \"transportation\" ],\n char: \"\\ud83d\\ude8d\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n oncoming_automobile: {\n keywords: [ \"car\", \"vehicle\", \"transportation\" ],\n char: \"\\ud83d\\ude98\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n oncoming_taxi: {\n keywords: [ \"vehicle\", \"cars\", \"uber\" ],\n char: \"\\ud83d\\ude96\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n aerial_tramway: {\n keywords: [ \"transportation\", \"vehicle\", \"ski\" ],\n char: \"\\ud83d\\udea1\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n mountain_cableway: {\n keywords: [ \"transportation\", \"vehicle\", \"ski\" ],\n char: \"\\ud83d\\udea0\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n suspension_railway: {\n keywords: [ \"vehicle\", \"transportation\" ],\n char: \"\\ud83d\\ude9f\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n railway_car: {\n keywords: [ \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude83\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n train: {\n keywords: [ \"transportation\", \"vehicle\", \"carriage\", \"public\", \"travel\" ],\n char: \"\\ud83d\\ude8b\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n monorail: {\n keywords: [ \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude9d\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n bullettrain_side: {\n keywords: [ \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude84\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n bullettrain_front: {\n keywords: [ \"transportation\", \"vehicle\", \"speed\", \"fast\", \"public\", \"travel\" ],\n char: \"\\ud83d\\ude85\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n light_rail: {\n keywords: [ \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude88\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n mountain_railway: {\n keywords: [ \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude9e\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n steam_locomotive: {\n keywords: [ \"transportation\", \"vehicle\", \"train\" ],\n char: \"\\ud83d\\ude82\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n train2: {\n keywords: [ \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude86\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n metro: {\n keywords: [ \"transportation\", \"blue-square\", \"mrt\", \"underground\", \"tube\" ],\n char: \"\\ud83d\\ude87\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n tram: {\n keywords: [ \"transportation\", \"vehicle\" ],\n char: \"\\ud83d\\ude8a\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n station: {\n keywords: [ \"transportation\", \"vehicle\", \"public\" ],\n char: \"\\ud83d\\ude89\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n flying_saucer: {\n keywords: [ \"transportation\", \"vehicle\", \"ufo\" ],\n char: \"\\ud83d\\udef8\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n helicopter: {\n keywords: [ \"transportation\", \"vehicle\", \"fly\" ],\n char: \"\\ud83d\\ude81\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n small_airplane: {\n keywords: [ \"flight\", \"transportation\", \"fly\", \"vehicle\" ],\n char: \"\\ud83d\\udee9\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n airplane: {\n keywords: [ \"vehicle\", \"transportation\", \"flight\", \"fly\" ],\n char: \"\\u2708\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n flight_departure: {\n keywords: [ \"airport\", \"flight\", \"landing\" ],\n char: \"\\ud83d\\udeeb\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n flight_arrival: {\n keywords: [ \"airport\", \"flight\", \"boarding\" ],\n char: \"\\ud83d\\udeec\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n sailboat: {\n keywords: [ \"ship\", \"summer\", \"transportation\", \"water\", \"sailing\" ],\n char: \"\\u26f5\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n motor_boat: {\n keywords: [ \"ship\" ],\n char: \"\\ud83d\\udee5\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n speedboat: {\n keywords: [ \"ship\", \"transportation\", \"vehicle\", \"summer\" ],\n char: \"\\ud83d\\udea4\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n ferry: {\n keywords: [ \"boat\", \"ship\", \"yacht\" ],\n char: \"\\u26f4\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n passenger_ship: {\n keywords: [ \"yacht\", \"cruise\", \"ferry\" ],\n char: \"\\ud83d\\udef3\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n rocket: {\n keywords: [ \"launch\", \"ship\", \"staffmode\", \"NASA\", \"outer space\", \"outer_space\", \"fly\" ],\n char: \"\\ud83d\\ude80\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n artificial_satellite: {\n keywords: [ \"communication\", \"gps\", \"orbit\", \"spaceflight\", \"NASA\", \"ISS\" ],\n char: \"\\ud83d\\udef0\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n seat: {\n keywords: [ \"sit\", \"airplane\", \"transport\", \"bus\", \"flight\", \"fly\" ],\n char: \"\\ud83d\\udcba\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n canoe: {\n keywords: [ \"boat\", \"paddle\", \"water\", \"ship\" ],\n char: \"\\ud83d\\udef6\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n anchor: {\n keywords: [ \"ship\", \"ferry\", \"sea\", \"boat\" ],\n char: \"\\u2693\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n construction: {\n keywords: [ \"wip\", \"progress\", \"caution\", \"warning\" ],\n char: \"\\ud83d\\udea7\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n fuelpump: {\n keywords: [ \"gas station\", \"petroleum\" ],\n char: \"\\u26fd\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n busstop: {\n keywords: [ \"transportation\", \"wait\" ],\n char: \"\\ud83d\\ude8f\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n vertical_traffic_light: {\n keywords: [ \"transportation\", \"driving\" ],\n char: \"\\ud83d\\udea6\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n traffic_light: {\n keywords: [ \"transportation\", \"signal\" ],\n char: \"\\ud83d\\udea5\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n checkered_flag: {\n keywords: [ \"contest\", \"finishline\", \"race\", \"gokart\" ],\n char: \"\\ud83c\\udfc1\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n ship: {\n keywords: [ \"transportation\", \"titanic\", \"deploy\" ],\n char: \"\\ud83d\\udea2\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n ferris_wheel: {\n keywords: [ \"photo\", \"carnival\", \"londoneye\" ],\n char: \"\\ud83c\\udfa1\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n roller_coaster: {\n keywords: [ \"carnival\", \"playground\", \"photo\", \"fun\" ],\n char: \"\\ud83c\\udfa2\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n carousel_horse: {\n keywords: [ \"photo\", \"carnival\" ],\n char: \"\\ud83c\\udfa0\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n building_construction: {\n keywords: [ \"wip\", \"working\", \"progress\" ],\n char: \"\\ud83c\\udfd7\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n foggy: {\n keywords: [ \"photo\", \"mountain\" ],\n char: \"\\ud83c\\udf01\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n tokyo_tower: {\n keywords: [ \"photo\", \"japanese\" ],\n char: \"\\ud83d\\uddfc\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n factory: {\n keywords: [ \"building\", \"industry\", \"pollution\", \"smoke\" ],\n char: \"\\ud83c\\udfed\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n fountain: {\n keywords: [ \"photo\", \"summer\", \"water\", \"fresh\" ],\n char: \"\\u26f2\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n rice_scene: {\n keywords: [ \"photo\", \"japan\", \"asia\", \"tsukimi\" ],\n char: \"\\ud83c\\udf91\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n mountain: {\n keywords: [ \"photo\", \"nature\", \"environment\" ],\n char: \"\\u26f0\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n mountain_snow: {\n keywords: [ \"photo\", \"nature\", \"environment\", \"winter\", \"cold\" ],\n char: \"\\ud83c\\udfd4\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n mount_fuji: {\n keywords: [ \"photo\", \"mountain\", \"nature\", \"japanese\" ],\n char: \"\\ud83d\\uddfb\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n volcano: {\n keywords: [ \"photo\", \"nature\", \"disaster\" ],\n char: \"\\ud83c\\udf0b\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n japan: {\n keywords: [ \"nation\", \"country\", \"japanese\", \"asia\" ],\n char: \"\\ud83d\\uddfe\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n camping: {\n keywords: [ \"photo\", \"outdoors\", \"tent\" ],\n char: \"\\ud83c\\udfd5\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n tent: {\n keywords: [ \"photo\", \"camping\", \"outdoors\" ],\n char: \"\\u26fa\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n national_park: {\n keywords: [ \"photo\", \"environment\", \"nature\" ],\n char: \"\\ud83c\\udfde\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n motorway: {\n keywords: [ \"road\", \"cupertino\", \"interstate\", \"highway\" ],\n char: \"\\ud83d\\udee3\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n railway_track: {\n keywords: [ \"train\", \"transportation\" ],\n char: \"\\ud83d\\udee4\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n sunrise: {\n keywords: [ \"morning\", \"view\", \"vacation\", \"photo\" ],\n char: \"\\ud83c\\udf05\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n sunrise_over_mountains: {\n keywords: [ \"view\", \"vacation\", \"photo\" ],\n char: \"\\ud83c\\udf04\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n desert: {\n keywords: [ \"photo\", \"warm\", \"saharah\" ],\n char: \"\\ud83c\\udfdc\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n beach_umbrella: {\n keywords: [ \"weather\", \"summer\", \"sunny\", \"sand\", \"mojito\" ],\n char: \"\\ud83c\\udfd6\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n desert_island: {\n keywords: [ \"photo\", \"tropical\", \"mojito\" ],\n char: \"\\ud83c\\udfdd\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n city_sunrise: {\n keywords: [ \"photo\", \"good morning\", \"dawn\" ],\n char: \"\\ud83c\\udf07\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n city_sunset: {\n keywords: [ \"photo\", \"evening\", \"sky\", \"buildings\" ],\n char: \"\\ud83c\\udf06\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n cityscape: {\n keywords: [ \"photo\", \"night life\", \"urban\" ],\n char: \"\\ud83c\\udfd9\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n night_with_stars: {\n keywords: [ \"evening\", \"city\", \"downtown\" ],\n char: \"\\ud83c\\udf03\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n bridge_at_night: {\n keywords: [ \"photo\", \"sanfrancisco\" ],\n char: \"\\ud83c\\udf09\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n milky_way: {\n keywords: [ \"photo\", \"space\", \"stars\" ],\n char: \"\\ud83c\\udf0c\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n stars: {\n keywords: [ \"night\", \"photo\" ],\n char: \"\\ud83c\\udf20\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n sparkler: {\n keywords: [ \"stars\", \"night\", \"shine\" ],\n char: \"\\ud83c\\udf87\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n fireworks: {\n keywords: [ \"photo\", \"festival\", \"carnival\", \"congratulations\" ],\n char: \"\\ud83c\\udf86\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n rainbow: {\n keywords: [ \"nature\", \"happy\", \"unicorn_face\", \"photo\", \"sky\", \"spring\" ],\n char: \"\\ud83c\\udf08\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n houses: {\n keywords: [ \"buildings\", \"photo\" ],\n char: \"\\ud83c\\udfd8\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n european_castle: {\n keywords: [ \"building\", \"royalty\", \"history\" ],\n char: \"\\ud83c\\udff0\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n japanese_castle: {\n keywords: [ \"photo\", \"building\" ],\n char: \"\\ud83c\\udfef\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n stadium: {\n keywords: [ \"photo\", \"place\", \"sports\", \"concert\", \"venue\" ],\n char: \"\\ud83c\\udfdf\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n statue_of_liberty: {\n keywords: [ \"american\", \"newyork\" ],\n char: \"\\ud83d\\uddfd\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n house: {\n keywords: [ \"building\", \"home\" ],\n char: \"\\ud83c\\udfe0\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n house_with_garden: {\n keywords: [ \"home\", \"plant\", \"nature\" ],\n char: \"\\ud83c\\udfe1\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n derelict_house: {\n keywords: [ \"abandon\", \"evict\", \"broken\", \"building\" ],\n char: \"\\ud83c\\udfda\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n office: {\n keywords: [ \"building\", \"bureau\", \"work\" ],\n char: \"\\ud83c\\udfe2\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n department_store: {\n keywords: [ \"building\", \"shopping\", \"mall\" ],\n char: \"\\ud83c\\udfec\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n post_office: {\n keywords: [ \"building\", \"envelope\", \"communication\" ],\n char: \"\\ud83c\\udfe3\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n european_post_office: {\n keywords: [ \"building\", \"email\" ],\n char: \"\\ud83c\\udfe4\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n hospital: {\n keywords: [ \"building\", \"health\", \"surgery\", \"doctor\" ],\n char: \"\\ud83c\\udfe5\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n bank: {\n keywords: [ \"building\", \"money\", \"sales\", \"cash\", \"business\", \"enterprise\" ],\n char: \"\\ud83c\\udfe6\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n hotel: {\n keywords: [ \"building\", \"accomodation\", \"checkin\" ],\n char: \"\\ud83c\\udfe8\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n convenience_store: {\n keywords: [ \"building\", \"shopping\", \"groceries\" ],\n char: \"\\ud83c\\udfea\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n school: {\n keywords: [ \"building\", \"student\", \"education\", \"learn\", \"teach\" ],\n char: \"\\ud83c\\udfeb\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n love_hotel: {\n keywords: [ \"like\", \"affection\", \"dating\" ],\n char: \"\\ud83c\\udfe9\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n wedding: {\n keywords: [ \"love\", \"like\", \"affection\", \"couple\", \"marriage\", \"bride\", \"groom\" ],\n char: \"\\ud83d\\udc92\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n classical_building: {\n keywords: [ \"art\", \"culture\", \"history\" ],\n char: \"\\ud83c\\udfdb\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n church: {\n keywords: [ \"building\", \"religion\", \"christ\" ],\n char: \"\\u26ea\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n mosque: {\n keywords: [ \"islam\", \"worship\", \"minaret\" ],\n char: \"\\ud83d\\udd4c\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n synagogue: {\n keywords: [ \"judaism\", \"worship\", \"temple\", \"jewish\" ],\n char: \"\\ud83d\\udd4d\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n kaaba: {\n keywords: [ \"mecca\", \"mosque\", \"islam\" ],\n char: \"\\ud83d\\udd4b\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n shinto_shrine: {\n keywords: [ \"temple\", \"japan\", \"kyoto\" ],\n char: \"\\u26e9\",\n fitzpatrick_scale: false,\n category: \"travel_and_places\"\n },\n watch: {\n keywords: [ \"time\", \"accessories\" ],\n char: \"\\u231a\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n iphone: {\n keywords: [ \"technology\", \"apple\", \"gadgets\", \"dial\" ],\n char: \"\\ud83d\\udcf1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n calling: {\n keywords: [ \"iphone\", \"incoming\" ],\n char: \"\\ud83d\\udcf2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n computer: {\n keywords: [ \"technology\", \"laptop\", \"screen\", \"display\", \"monitor\" ],\n char: \"\\ud83d\\udcbb\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n keyboard: {\n keywords: [ \"technology\", \"computer\", \"type\", \"input\", \"text\" ],\n char: \"\\u2328\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n desktop_computer: {\n keywords: [ \"technology\", \"computing\", \"screen\" ],\n char: \"\\ud83d\\udda5\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n printer: {\n keywords: [ \"paper\", \"ink\" ],\n char: \"\\ud83d\\udda8\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n computer_mouse: {\n keywords: [ \"click\" ],\n char: \"\\ud83d\\uddb1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n trackball: {\n keywords: [ \"technology\", \"trackpad\" ],\n char: \"\\ud83d\\uddb2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n joystick: {\n keywords: [ \"game\", \"play\" ],\n char: \"\\ud83d\\udd79\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n clamp: {\n keywords: [ \"tool\" ],\n char: \"\\ud83d\\udddc\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n minidisc: {\n keywords: [ \"technology\", \"record\", \"data\", \"disk\", \"90s\" ],\n char: \"\\ud83d\\udcbd\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n floppy_disk: {\n keywords: [ \"oldschool\", \"technology\", \"save\", \"90s\", \"80s\" ],\n char: \"\\ud83d\\udcbe\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n cd: {\n keywords: [ \"technology\", \"dvd\", \"disk\", \"disc\", \"90s\" ],\n char: \"\\ud83d\\udcbf\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n dvd: {\n keywords: [ \"cd\", \"disk\", \"disc\" ],\n char: \"\\ud83d\\udcc0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n vhs: {\n keywords: [ \"record\", \"video\", \"oldschool\", \"90s\", \"80s\" ],\n char: \"\\ud83d\\udcfc\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n camera: {\n keywords: [ \"gadgets\", \"photography\" ],\n char: \"\\ud83d\\udcf7\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n camera_flash: {\n keywords: [ \"photography\", \"gadgets\" ],\n char: \"\\ud83d\\udcf8\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n video_camera: {\n keywords: [ \"film\", \"record\" ],\n char: \"\\ud83d\\udcf9\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n movie_camera: {\n keywords: [ \"film\", \"record\" ],\n char: \"\\ud83c\\udfa5\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n film_projector: {\n keywords: [ \"video\", \"tape\", \"record\", \"movie\" ],\n char: \"\\ud83d\\udcfd\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n film_strip: {\n keywords: [ \"movie\" ],\n char: \"\\ud83c\\udf9e\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n telephone_receiver: {\n keywords: [ \"technology\", \"communication\", \"dial\" ],\n char: \"\\ud83d\\udcde\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n phone: {\n keywords: [ \"technology\", \"communication\", \"dial\", \"telephone\" ],\n char: \"\\u260e\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n pager: {\n keywords: [ \"bbcall\", \"oldschool\", \"90s\" ],\n char: \"\\ud83d\\udcdf\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n fax: {\n keywords: [ \"communication\", \"technology\" ],\n char: \"\\ud83d\\udce0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n tv: {\n keywords: [ \"technology\", \"program\", \"oldschool\", \"show\", \"television\" ],\n char: \"\\ud83d\\udcfa\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n radio: {\n keywords: [ \"communication\", \"music\", \"podcast\", \"program\" ],\n char: \"\\ud83d\\udcfb\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n studio_microphone: {\n keywords: [ \"sing\", \"recording\", \"artist\", \"talkshow\" ],\n char: \"\\ud83c\\udf99\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n level_slider: {\n keywords: [ \"scale\" ],\n char: \"\\ud83c\\udf9a\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n control_knobs: {\n keywords: [ \"dial\" ],\n char: \"\\ud83c\\udf9b\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n compass: {\n keywords: [ \"magnetic\", \"navigation\", \"orienteering\" ],\n char: \"\\ud83e\\udded\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n stopwatch: {\n keywords: [ \"time\", \"deadline\" ],\n char: \"\\u23f1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n timer_clock: {\n keywords: [ \"alarm\" ],\n char: \"\\u23f2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n alarm_clock: {\n keywords: [ \"time\", \"wake\" ],\n char: \"\\u23f0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n mantelpiece_clock: {\n keywords: [ \"time\" ],\n char: \"\\ud83d\\udd70\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n hourglass_flowing_sand: {\n keywords: [ \"oldschool\", \"time\", \"countdown\" ],\n char: \"\\u23f3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n hourglass: {\n keywords: [ \"time\", \"clock\", \"oldschool\", \"limit\", \"exam\", \"quiz\", \"test\" ],\n char: \"\\u231b\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n satellite: {\n keywords: [ \"communication\", \"future\", \"radio\", \"space\" ],\n char: \"\\ud83d\\udce1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n battery: {\n keywords: [ \"power\", \"energy\", \"sustain\" ],\n char: \"\\ud83d\\udd0b\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n electric_plug: {\n keywords: [ \"charger\", \"power\" ],\n char: \"\\ud83d\\udd0c\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n bulb: {\n keywords: [ \"light\", \"electricity\", \"idea\" ],\n char: \"\\ud83d\\udca1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n flashlight: {\n keywords: [ \"dark\", \"camping\", \"sight\", \"night\" ],\n char: \"\\ud83d\\udd26\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n candle: {\n keywords: [ \"fire\", \"wax\" ],\n char: \"\\ud83d\\udd6f\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n fire_extinguisher: {\n keywords: [ \"quench\" ],\n char: \"\\ud83e\\uddef\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n wastebasket: {\n keywords: [ \"bin\", \"trash\", \"rubbish\", \"garbage\", \"toss\" ],\n char: \"\\ud83d\\uddd1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n oil_drum: {\n keywords: [ \"barrell\" ],\n char: \"\\ud83d\\udee2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n money_with_wings: {\n keywords: [ \"dollar\", \"bills\", \"payment\", \"sale\" ],\n char: \"\\ud83d\\udcb8\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n dollar: {\n keywords: [ \"money\", \"sales\", \"bill\", \"currency\" ],\n char: \"\\ud83d\\udcb5\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n yen: {\n keywords: [ \"money\", \"sales\", \"japanese\", \"dollar\", \"currency\" ],\n char: \"\\ud83d\\udcb4\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n euro: {\n keywords: [ \"money\", \"sales\", \"dollar\", \"currency\" ],\n char: \"\\ud83d\\udcb6\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n pound: {\n keywords: [ \"british\", \"sterling\", \"money\", \"sales\", \"bills\", \"uk\", \"england\", \"currency\" ],\n char: \"\\ud83d\\udcb7\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n moneybag: {\n keywords: [ \"dollar\", \"payment\", \"coins\", \"sale\" ],\n char: \"\\ud83d\\udcb0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n credit_card: {\n keywords: [ \"money\", \"sales\", \"dollar\", \"bill\", \"payment\", \"shopping\" ],\n char: \"\\ud83d\\udcb3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n gem: {\n keywords: [ \"blue\", \"ruby\", \"diamond\", \"jewelry\" ],\n char: \"\\ud83d\\udc8e\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n balance_scale: {\n keywords: [ \"law\", \"fairness\", \"weight\" ],\n char: \"\\u2696\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n toolbox: {\n keywords: [ \"tools\", \"diy\", \"fix\", \"maintainer\", \"mechanic\" ],\n char: \"\\ud83e\\uddf0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n wrench: {\n keywords: [ \"tools\", \"diy\", \"ikea\", \"fix\", \"maintainer\" ],\n char: \"\\ud83d\\udd27\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n hammer: {\n keywords: [ \"tools\", \"build\", \"create\" ],\n char: \"\\ud83d\\udd28\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n hammer_and_pick: {\n keywords: [ \"tools\", \"build\", \"create\" ],\n char: \"\\u2692\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n hammer_and_wrench: {\n keywords: [ \"tools\", \"build\", \"create\" ],\n char: \"\\ud83d\\udee0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n pick: {\n keywords: [ \"tools\", \"dig\" ],\n char: \"\\u26cf\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n nut_and_bolt: {\n keywords: [ \"handy\", \"tools\", \"fix\" ],\n char: \"\\ud83d\\udd29\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n gear: {\n keywords: [ \"cog\" ],\n char: \"\\u2699\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n brick: {\n keywords: [ \"bricks\" ],\n char: \"\\ud83e\\uddf1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n chains: {\n keywords: [ \"lock\", \"arrest\" ],\n char: \"\\u26d3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n magnet: {\n keywords: [ \"attraction\", \"magnetic\" ],\n char: \"\\ud83e\\uddf2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n gun: {\n keywords: [ \"violence\", \"weapon\", \"pistol\", \"revolver\" ],\n char: \"\\ud83d\\udd2b\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n bomb: {\n keywords: [ \"boom\", \"explode\", \"explosion\", \"terrorism\" ],\n char: \"\\ud83d\\udca3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n firecracker: {\n keywords: [ \"dynamite\", \"boom\", \"explode\", \"explosion\", \"explosive\" ],\n char: \"\\ud83e\\udde8\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n hocho: {\n keywords: [ \"knife\", \"blade\", \"cutlery\", \"kitchen\", \"weapon\" ],\n char: \"\\ud83d\\udd2a\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n dagger: {\n keywords: [ \"weapon\" ],\n char: \"\\ud83d\\udde1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n crossed_swords: {\n keywords: [ \"weapon\" ],\n char: \"\\u2694\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n shield: {\n keywords: [ \"protection\", \"security\" ],\n char: \"\\ud83d\\udee1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n smoking: {\n keywords: [ \"kills\", \"tobacco\", \"cigarette\", \"joint\", \"smoke\" ],\n char: \"\\ud83d\\udeac\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n skull_and_crossbones: {\n keywords: [ \"poison\", \"danger\", \"deadly\", \"scary\", \"death\", \"pirate\", \"evil\" ],\n char: \"\\u2620\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n coffin: {\n keywords: [ \"vampire\", \"dead\", \"die\", \"death\", \"rip\", \"graveyard\", \"cemetery\", \"casket\", \"funeral\", \"box\" ],\n char: \"\\u26b0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n funeral_urn: {\n keywords: [ \"dead\", \"die\", \"death\", \"rip\", \"ashes\" ],\n char: \"\\u26b1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n amphora: {\n keywords: [ \"vase\", \"jar\" ],\n char: \"\\ud83c\\udffa\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n crystal_ball: {\n keywords: [ \"disco\", \"party\", \"magic\", \"circus\", \"fortune_teller\" ],\n char: \"\\ud83d\\udd2e\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n prayer_beads: {\n keywords: [ \"dhikr\", \"religious\" ],\n char: \"\\ud83d\\udcff\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n nazar_amulet: {\n keywords: [ \"bead\", \"charm\" ],\n char: \"\\ud83e\\uddff\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n barber: {\n keywords: [ \"hair\", \"salon\", \"style\" ],\n char: \"\\ud83d\\udc88\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n alembic: {\n keywords: [ \"distilling\", \"science\", \"experiment\", \"chemistry\" ],\n char: \"\\u2697\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n telescope: {\n keywords: [ \"stars\", \"space\", \"zoom\", \"science\", \"astronomy\" ],\n char: \"\\ud83d\\udd2d\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n microscope: {\n keywords: [ \"laboratory\", \"experiment\", \"zoomin\", \"science\", \"study\" ],\n char: \"\\ud83d\\udd2c\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n hole: {\n keywords: [ \"embarrassing\" ],\n char: \"\\ud83d\\udd73\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n pill: {\n keywords: [ \"health\", \"medicine\", \"doctor\", \"pharmacy\", \"drug\" ],\n char: \"\\ud83d\\udc8a\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n syringe: {\n keywords: [ \"health\", \"hospital\", \"drugs\", \"blood\", \"medicine\", \"needle\", \"doctor\", \"nurse\" ],\n char: \"\\ud83d\\udc89\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n dna: {\n keywords: [ \"biologist\", \"genetics\", \"life\" ],\n char: \"\\ud83e\\uddec\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n microbe: {\n keywords: [ \"amoeba\", \"bacteria\", \"germs\" ],\n char: \"\\ud83e\\udda0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n petri_dish: {\n keywords: [ \"bacteria\", \"biology\", \"culture\", \"lab\" ],\n char: \"\\ud83e\\uddeb\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n test_tube: {\n keywords: [ \"chemistry\", \"experiment\", \"lab\", \"science\" ],\n char: \"\\ud83e\\uddea\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n thermometer: {\n keywords: [ \"weather\", \"temperature\", \"hot\", \"cold\" ],\n char: \"\\ud83c\\udf21\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n broom: {\n keywords: [ \"cleaning\", \"sweeping\", \"witch\" ],\n char: \"\\ud83e\\uddf9\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n basket: {\n keywords: [ \"laundry\" ],\n char: \"\\ud83e\\uddfa\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n toilet_paper: {\n keywords: [ \"roll\" ],\n char: \"\\ud83e\\uddfb\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n label: {\n keywords: [ \"sale\", \"tag\" ],\n char: \"\\ud83c\\udff7\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n bookmark: {\n keywords: [ \"favorite\", \"label\", \"save\" ],\n char: \"\\ud83d\\udd16\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n toilet: {\n keywords: [ \"restroom\", \"wc\", \"washroom\", \"bathroom\", \"potty\" ],\n char: \"\\ud83d\\udebd\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n shower: {\n keywords: [ \"clean\", \"water\", \"bathroom\" ],\n char: \"\\ud83d\\udebf\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n bathtub: {\n keywords: [ \"clean\", \"shower\", \"bathroom\" ],\n char: \"\\ud83d\\udec1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n soap: {\n keywords: [ \"bar\", \"bathing\", \"cleaning\", \"lather\" ],\n char: \"\\ud83e\\uddfc\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n sponge: {\n keywords: [ \"absorbing\", \"cleaning\", \"porous\" ],\n char: \"\\ud83e\\uddfd\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n lotion_bottle: {\n keywords: [ \"moisturizer\", \"sunscreen\" ],\n char: \"\\ud83e\\uddf4\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n key: {\n keywords: [ \"lock\", \"door\", \"password\" ],\n char: \"\\ud83d\\udd11\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n old_key: {\n keywords: [ \"lock\", \"door\", \"password\" ],\n char: \"\\ud83d\\udddd\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n couch_and_lamp: {\n keywords: [ \"read\", \"chill\" ],\n char: \"\\ud83d\\udecb\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n sleeping_bed: {\n keywords: [ \"bed\", \"rest\" ],\n char: \"\\ud83d\\udecc\",\n fitzpatrick_scale: true,\n category: \"objects\"\n },\n bed: {\n keywords: [ \"sleep\", \"rest\" ],\n char: \"\\ud83d\\udecf\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n door: {\n keywords: [ \"house\", \"entry\", \"exit\" ],\n char: \"\\ud83d\\udeaa\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n bellhop_bell: {\n keywords: [ \"service\" ],\n char: \"\\ud83d\\udece\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n teddy_bear: {\n keywords: [ \"plush\", \"stuffed\" ],\n char: \"\\ud83e\\uddf8\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n framed_picture: {\n keywords: [ \"photography\" ],\n char: \"\\ud83d\\uddbc\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n world_map: {\n keywords: [ \"location\", \"direction\" ],\n char: \"\\ud83d\\uddfa\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n parasol_on_ground: {\n keywords: [ \"weather\", \"summer\" ],\n char: \"\\u26f1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n moyai: {\n keywords: [ \"rock\", \"easter island\", \"moai\" ],\n char: \"\\ud83d\\uddff\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n shopping: {\n keywords: [ \"mall\", \"buy\", \"purchase\" ],\n char: \"\\ud83d\\udecd\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n shopping_cart: {\n keywords: [ \"trolley\" ],\n char: \"\\ud83d\\uded2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n balloon: {\n keywords: [ \"party\", \"celebration\", \"birthday\", \"circus\" ],\n char: \"\\ud83c\\udf88\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n flags: {\n keywords: [ \"fish\", \"japanese\", \"koinobori\", \"carp\", \"banner\" ],\n char: \"\\ud83c\\udf8f\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n ribbon: {\n keywords: [ \"decoration\", \"pink\", \"girl\", \"bowtie\" ],\n char: \"\\ud83c\\udf80\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n gift: {\n keywords: [ \"present\", \"birthday\", \"christmas\", \"xmas\" ],\n char: \"\\ud83c\\udf81\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n confetti_ball: {\n keywords: [ \"festival\", \"party\", \"birthday\", \"circus\" ],\n char: \"\\ud83c\\udf8a\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n tada: {\n keywords: [ \"party\", \"congratulations\", \"birthday\", \"magic\", \"circus\", \"celebration\" ],\n char: \"\\ud83c\\udf89\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n dolls: {\n keywords: [ \"japanese\", \"toy\", \"kimono\" ],\n char: \"\\ud83c\\udf8e\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n wind_chime: {\n keywords: [ \"nature\", \"ding\", \"spring\", \"bell\" ],\n char: \"\\ud83c\\udf90\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n crossed_flags: {\n keywords: [ \"japanese\", \"nation\", \"country\", \"border\" ],\n char: \"\\ud83c\\udf8c\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n izakaya_lantern: {\n keywords: [ \"light\", \"paper\", \"halloween\", \"spooky\" ],\n char: \"\\ud83c\\udfee\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n red_envelope: {\n keywords: [ \"gift\" ],\n char: \"\\ud83e\\udde7\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n email: {\n keywords: [ \"letter\", \"postal\", \"inbox\", \"communication\" ],\n char: \"\\u2709\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n envelope_with_arrow: {\n keywords: [ \"email\", \"communication\" ],\n char: \"\\ud83d\\udce9\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n incoming_envelope: {\n keywords: [ \"email\", \"inbox\" ],\n char: \"\\ud83d\\udce8\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n \"e-mail\": {\n keywords: [ \"communication\", \"inbox\" ],\n char: \"\\ud83d\\udce7\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n love_letter: {\n keywords: [ \"email\", \"like\", \"affection\", \"envelope\", \"valentines\" ],\n char: \"\\ud83d\\udc8c\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n postbox: {\n keywords: [ \"email\", \"letter\", \"envelope\" ],\n char: \"\\ud83d\\udcee\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n mailbox_closed: {\n keywords: [ \"email\", \"communication\", \"inbox\" ],\n char: \"\\ud83d\\udcea\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n mailbox: {\n keywords: [ \"email\", \"inbox\", \"communication\" ],\n char: \"\\ud83d\\udceb\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n mailbox_with_mail: {\n keywords: [ \"email\", \"inbox\", \"communication\" ],\n char: \"\\ud83d\\udcec\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n mailbox_with_no_mail: {\n keywords: [ \"email\", \"inbox\" ],\n char: \"\\ud83d\\udced\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n package: {\n keywords: [ \"mail\", \"gift\", \"cardboard\", \"box\", \"moving\" ],\n char: \"\\ud83d\\udce6\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n postal_horn: {\n keywords: [ \"instrument\", \"music\" ],\n char: \"\\ud83d\\udcef\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n inbox_tray: {\n keywords: [ \"email\", \"documents\" ],\n char: \"\\ud83d\\udce5\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n outbox_tray: {\n keywords: [ \"inbox\", \"email\" ],\n char: \"\\ud83d\\udce4\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n scroll: {\n keywords: [ \"documents\", \"ancient\", \"history\", \"paper\" ],\n char: \"\\ud83d\\udcdc\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n page_with_curl: {\n keywords: [ \"documents\", \"office\", \"paper\" ],\n char: \"\\ud83d\\udcc3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n bookmark_tabs: {\n keywords: [ \"favorite\", \"save\", \"order\", \"tidy\" ],\n char: \"\\ud83d\\udcd1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n receipt: {\n keywords: [ \"accounting\", \"expenses\" ],\n char: \"\\ud83e\\uddfe\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n bar_chart: {\n keywords: [ \"graph\", \"presentation\", \"stats\" ],\n char: \"\\ud83d\\udcca\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n chart_with_upwards_trend: {\n keywords: [ \"graph\", \"presentation\", \"stats\", \"recovery\", \"business\", \"economics\", \"money\", \"sales\", \"good\", \"success\" ],\n char: \"\\ud83d\\udcc8\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n chart_with_downwards_trend: {\n keywords: [ \"graph\", \"presentation\", \"stats\", \"recession\", \"business\", \"economics\", \"money\", \"sales\", \"bad\", \"failure\" ],\n char: \"\\ud83d\\udcc9\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n page_facing_up: {\n keywords: [ \"documents\", \"office\", \"paper\", \"information\" ],\n char: \"\\ud83d\\udcc4\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n date: {\n keywords: [ \"calendar\", \"schedule\" ],\n char: \"\\ud83d\\udcc5\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n calendar: {\n keywords: [ \"schedule\", \"date\", \"planning\" ],\n char: \"\\ud83d\\udcc6\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n spiral_calendar: {\n keywords: [ \"date\", \"schedule\", \"planning\" ],\n char: \"\\ud83d\\uddd3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n card_index: {\n keywords: [ \"business\", \"stationery\" ],\n char: \"\\ud83d\\udcc7\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n card_file_box: {\n keywords: [ \"business\", \"stationery\" ],\n char: \"\\ud83d\\uddc3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n ballot_box: {\n keywords: [ \"election\", \"vote\" ],\n char: \"\\ud83d\\uddf3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n file_cabinet: {\n keywords: [ \"filing\", \"organizing\" ],\n char: \"\\ud83d\\uddc4\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n clipboard: {\n keywords: [ \"stationery\", \"documents\" ],\n char: \"\\ud83d\\udccb\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n spiral_notepad: {\n keywords: [ \"memo\", \"stationery\" ],\n char: \"\\ud83d\\uddd2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n file_folder: {\n keywords: [ \"documents\", \"business\", \"office\" ],\n char: \"\\ud83d\\udcc1\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n open_file_folder: {\n keywords: [ \"documents\", \"load\" ],\n char: \"\\ud83d\\udcc2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n card_index_dividers: {\n keywords: [ \"organizing\", \"business\", \"stationery\" ],\n char: \"\\ud83d\\uddc2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n newspaper_roll: {\n keywords: [ \"press\", \"headline\" ],\n char: \"\\ud83d\\uddde\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n newspaper: {\n keywords: [ \"press\", \"headline\" ],\n char: \"\\ud83d\\udcf0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n notebook: {\n keywords: [ \"stationery\", \"record\", \"notes\", \"paper\", \"study\" ],\n char: \"\\ud83d\\udcd3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n closed_book: {\n keywords: [ \"read\", \"library\", \"knowledge\", \"textbook\", \"learn\" ],\n char: \"\\ud83d\\udcd5\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n green_book: {\n keywords: [ \"read\", \"library\", \"knowledge\", \"study\" ],\n char: \"\\ud83d\\udcd7\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n blue_book: {\n keywords: [ \"read\", \"library\", \"knowledge\", \"learn\", \"study\" ],\n char: \"\\ud83d\\udcd8\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n orange_book: {\n keywords: [ \"read\", \"library\", \"knowledge\", \"textbook\", \"study\" ],\n char: \"\\ud83d\\udcd9\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n notebook_with_decorative_cover: {\n keywords: [ \"classroom\", \"notes\", \"record\", \"paper\", \"study\" ],\n char: \"\\ud83d\\udcd4\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n ledger: {\n keywords: [ \"notes\", \"paper\" ],\n char: \"\\ud83d\\udcd2\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n books: {\n keywords: [ \"literature\", \"library\", \"study\" ],\n char: \"\\ud83d\\udcda\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n open_book: {\n keywords: [ \"book\", \"read\", \"library\", \"knowledge\", \"literature\", \"learn\", \"study\" ],\n char: \"\\ud83d\\udcd6\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n safety_pin: {\n keywords: [ \"diaper\" ],\n char: \"\\ud83e\\uddf7\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n link: {\n keywords: [ \"rings\", \"url\" ],\n char: \"\\ud83d\\udd17\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n paperclip: {\n keywords: [ \"documents\", \"stationery\" ],\n char: \"\\ud83d\\udcce\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n paperclips: {\n keywords: [ \"documents\", \"stationery\" ],\n char: \"\\ud83d\\udd87\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n scissors: {\n keywords: [ \"stationery\", \"cut\" ],\n char: \"\\u2702\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n triangular_ruler: {\n keywords: [ \"stationery\", \"math\", \"architect\", \"sketch\" ],\n char: \"\\ud83d\\udcd0\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n straight_ruler: {\n keywords: [ \"stationery\", \"calculate\", \"length\", \"math\", \"school\", \"drawing\", \"architect\", \"sketch\" ],\n char: \"\\ud83d\\udccf\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n abacus: {\n keywords: [ \"calculation\" ],\n char: \"\\ud83e\\uddee\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n pushpin: {\n keywords: [ \"stationery\", \"mark\", \"here\" ],\n char: \"\\ud83d\\udccc\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n round_pushpin: {\n keywords: [ \"stationery\", \"location\", \"map\", \"here\" ],\n char: \"\\ud83d\\udccd\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n triangular_flag_on_post: {\n keywords: [ \"mark\", \"milestone\", \"place\" ],\n char: \"\\ud83d\\udea9\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n white_flag: {\n keywords: [ \"losing\", \"loser\", \"lost\", \"surrender\", \"give up\", \"fail\" ],\n char: \"\\ud83c\\udff3\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n black_flag: {\n keywords: [ \"pirate\" ],\n char: \"\\ud83c\\udff4\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n rainbow_flag: {\n keywords: [ \"flag\", \"rainbow\", \"pride\", \"gay\", \"lgbt\", \"glbt\", \"queer\", \"homosexual\", \"lesbian\", \"bisexual\", \"transgender\" ],\n char: \"\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n closed_lock_with_key: {\n keywords: [ \"security\", \"privacy\" ],\n char: \"\\ud83d\\udd10\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n lock: {\n keywords: [ \"security\", \"password\", \"padlock\" ],\n char: \"\\ud83d\\udd12\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n unlock: {\n keywords: [ \"privacy\", \"security\" ],\n char: \"\\ud83d\\udd13\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n lock_with_ink_pen: {\n keywords: [ \"security\", \"secret\" ],\n char: \"\\ud83d\\udd0f\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n pen: {\n keywords: [ \"stationery\", \"writing\", \"write\" ],\n char: \"\\ud83d\\udd8a\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n fountain_pen: {\n keywords: [ \"stationery\", \"writing\", \"write\" ],\n char: \"\\ud83d\\udd8b\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n black_nib: {\n keywords: [ \"pen\", \"stationery\", \"writing\", \"write\" ],\n char: \"\\u2712\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n memo: {\n keywords: [ \"write\", \"documents\", \"stationery\", \"pencil\", \"paper\", \"writing\", \"legal\", \"exam\", \"quiz\", \"test\", \"study\", \"compose\" ],\n char: \"\\ud83d\\udcdd\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n pencil2: {\n keywords: [ \"stationery\", \"write\", \"paper\", \"writing\", \"school\", \"study\" ],\n char: \"\\u270f\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n crayon: {\n keywords: [ \"drawing\", \"creativity\" ],\n char: \"\\ud83d\\udd8d\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n paintbrush: {\n keywords: [ \"drawing\", \"creativity\", \"art\" ],\n char: \"\\ud83d\\udd8c\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n mag: {\n keywords: [ \"search\", \"zoom\", \"find\", \"detective\" ],\n char: \"\\ud83d\\udd0d\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n mag_right: {\n keywords: [ \"search\", \"zoom\", \"find\", \"detective\" ],\n char: \"\\ud83d\\udd0e\",\n fitzpatrick_scale: false,\n category: \"objects\"\n },\n heart: {\n keywords: [ \"love\", \"like\", \"valentines\" ],\n char: \"\\u2764\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n orange_heart: {\n keywords: [ \"love\", \"like\", \"affection\", \"valentines\" ],\n char: \"\\ud83e\\udde1\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n yellow_heart: {\n keywords: [ \"love\", \"like\", \"affection\", \"valentines\" ],\n char: \"\\ud83d\\udc9b\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n green_heart: {\n keywords: [ \"love\", \"like\", \"affection\", \"valentines\" ],\n char: \"\\ud83d\\udc9a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n blue_heart: {\n keywords: [ \"love\", \"like\", \"affection\", \"valentines\" ],\n char: \"\\ud83d\\udc99\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n purple_heart: {\n keywords: [ \"love\", \"like\", \"affection\", \"valentines\" ],\n char: \"\\ud83d\\udc9c\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n black_heart: {\n keywords: [ \"evil\" ],\n char: \"\\ud83d\\udda4\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n broken_heart: {\n keywords: [ \"sad\", \"sorry\", \"break\", \"heart\", \"heartbreak\" ],\n char: \"\\ud83d\\udc94\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heavy_heart_exclamation: {\n keywords: [ \"decoration\", \"love\" ],\n char: \"\\u2763\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n two_hearts: {\n keywords: [ \"love\", \"like\", \"affection\", \"valentines\", \"heart\" ],\n char: \"\\ud83d\\udc95\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n revolving_hearts: {\n keywords: [ \"love\", \"like\", \"affection\", \"valentines\" ],\n char: \"\\ud83d\\udc9e\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heartbeat: {\n keywords: [ \"love\", \"like\", \"affection\", \"valentines\", \"pink\", \"heart\" ],\n char: \"\\ud83d\\udc93\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heartpulse: {\n keywords: [ \"like\", \"love\", \"affection\", \"valentines\", \"pink\" ],\n char: \"\\ud83d\\udc97\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n sparkling_heart: {\n keywords: [ \"love\", \"like\", \"affection\", \"valentines\" ],\n char: \"\\ud83d\\udc96\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n cupid: {\n keywords: [ \"love\", \"like\", \"heart\", \"affection\", \"valentines\" ],\n char: \"\\ud83d\\udc98\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n gift_heart: {\n keywords: [ \"love\", \"valentines\" ],\n char: \"\\ud83d\\udc9d\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heart_decoration: {\n keywords: [ \"purple-square\", \"love\", \"like\" ],\n char: \"\\ud83d\\udc9f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n peace_symbol: {\n keywords: [ \"hippie\" ],\n char: \"\\u262e\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n latin_cross: {\n keywords: [ \"christianity\" ],\n char: \"\\u271d\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n star_and_crescent: {\n keywords: [ \"islam\" ],\n char: \"\\u262a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n om: {\n keywords: [ \"hinduism\", \"buddhism\", \"sikhism\", \"jainism\" ],\n char: \"\\ud83d\\udd49\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n wheel_of_dharma: {\n keywords: [ \"hinduism\", \"buddhism\", \"sikhism\", \"jainism\" ],\n char: \"\\u2638\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n star_of_david: {\n keywords: [ \"judaism\" ],\n char: \"\\u2721\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n six_pointed_star: {\n keywords: [ \"purple-square\", \"religion\", \"jewish\", \"hexagram\" ],\n char: \"\\ud83d\\udd2f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n menorah: {\n keywords: [ \"hanukkah\", \"candles\", \"jewish\" ],\n char: \"\\ud83d\\udd4e\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n yin_yang: {\n keywords: [ \"balance\" ],\n char: \"\\u262f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n orthodox_cross: {\n keywords: [ \"suppedaneum\", \"religion\" ],\n char: \"\\u2626\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n place_of_worship: {\n keywords: [ \"religion\", \"church\", \"temple\", \"prayer\" ],\n char: \"\\ud83d\\uded0\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n ophiuchus: {\n keywords: [ \"sign\", \"purple-square\", \"constellation\", \"astrology\" ],\n char: \"\\u26ce\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n aries: {\n keywords: [ \"sign\", \"purple-square\", \"zodiac\", \"astrology\" ],\n char: \"\\u2648\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n taurus: {\n keywords: [ \"purple-square\", \"sign\", \"zodiac\", \"astrology\" ],\n char: \"\\u2649\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n gemini: {\n keywords: [ \"sign\", \"zodiac\", \"purple-square\", \"astrology\" ],\n char: \"\\u264a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n cancer: {\n keywords: [ \"sign\", \"zodiac\", \"purple-square\", \"astrology\" ],\n char: \"\\u264b\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n leo: {\n keywords: [ \"sign\", \"purple-square\", \"zodiac\", \"astrology\" ],\n char: \"\\u264c\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n virgo: {\n keywords: [ \"sign\", \"zodiac\", \"purple-square\", \"astrology\" ],\n char: \"\\u264d\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n libra: {\n keywords: [ \"sign\", \"purple-square\", \"zodiac\", \"astrology\" ],\n char: \"\\u264e\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n scorpius: {\n keywords: [ \"sign\", \"zodiac\", \"purple-square\", \"astrology\", \"scorpio\" ],\n char: \"\\u264f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n sagittarius: {\n keywords: [ \"sign\", \"zodiac\", \"purple-square\", \"astrology\" ],\n char: \"\\u2650\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n capricorn: {\n keywords: [ \"sign\", \"zodiac\", \"purple-square\", \"astrology\" ],\n char: \"\\u2651\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n aquarius: {\n keywords: [ \"sign\", \"purple-square\", \"zodiac\", \"astrology\" ],\n char: \"\\u2652\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n pisces: {\n keywords: [ \"purple-square\", \"sign\", \"zodiac\", \"astrology\" ],\n char: \"\\u2653\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n id: {\n keywords: [ \"purple-square\", \"words\" ],\n char: \"\\ud83c\\udd94\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n atom_symbol: {\n keywords: [ \"science\", \"physics\", \"chemistry\" ],\n char: \"\\u269b\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u7a7a: {\n keywords: [ \"kanji\", \"japanese\", \"chinese\", \"empty\", \"sky\", \"blue-square\" ],\n char: \"\\ud83c\\ude33\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u5272: {\n keywords: [ \"cut\", \"divide\", \"chinese\", \"kanji\", \"pink-square\" ],\n char: \"\\ud83c\\ude39\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n radioactive: {\n keywords: [ \"nuclear\", \"danger\" ],\n char: \"\\u2622\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n biohazard: {\n keywords: [ \"danger\" ],\n char: \"\\u2623\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n mobile_phone_off: {\n keywords: [ \"mute\", \"orange-square\", \"silence\", \"quiet\" ],\n char: \"\\ud83d\\udcf4\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n vibration_mode: {\n keywords: [ \"orange-square\", \"phone\" ],\n char: \"\\ud83d\\udcf3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u6709: {\n keywords: [ \"orange-square\", \"chinese\", \"have\", \"kanji\" ],\n char: \"\\ud83c\\ude36\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u7121: {\n keywords: [ \"nothing\", \"chinese\", \"kanji\", \"japanese\", \"orange-square\" ],\n char: \"\\ud83c\\ude1a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u7533: {\n keywords: [ \"chinese\", \"japanese\", \"kanji\", \"orange-square\" ],\n char: \"\\ud83c\\ude38\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u55b6: {\n keywords: [ \"japanese\", \"opening hours\", \"orange-square\" ],\n char: \"\\ud83c\\ude3a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u6708: {\n keywords: [ \"chinese\", \"month\", \"moon\", \"japanese\", \"orange-square\", \"kanji\" ],\n char: \"\\ud83c\\ude37\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n eight_pointed_black_star: {\n keywords: [ \"orange-square\", \"shape\", \"polygon\" ],\n char: \"\\u2734\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n vs: {\n keywords: [ \"words\", \"orange-square\" ],\n char: \"\\ud83c\\udd9a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n accept: {\n keywords: [ \"ok\", \"good\", \"chinese\", \"kanji\", \"agree\", \"yes\", \"orange-circle\" ],\n char: \"\\ud83c\\ude51\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n white_flower: {\n keywords: [ \"japanese\", \"spring\" ],\n char: \"\\ud83d\\udcae\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n ideograph_advantage: {\n keywords: [ \"chinese\", \"kanji\", \"obtain\", \"get\", \"circle\" ],\n char: \"\\ud83c\\ude50\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n secret: {\n keywords: [ \"privacy\", \"chinese\", \"sshh\", \"kanji\", \"red-circle\" ],\n char: \"\\u3299\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n congratulations: {\n keywords: [ \"chinese\", \"kanji\", \"japanese\", \"red-circle\" ],\n char: \"\\u3297\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u5408: {\n keywords: [ \"japanese\", \"chinese\", \"join\", \"kanji\", \"red-square\" ],\n char: \"\\ud83c\\ude34\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u6e80: {\n keywords: [ \"full\", \"chinese\", \"japanese\", \"red-square\", \"kanji\" ],\n char: \"\\ud83c\\ude35\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u7981: {\n keywords: [ \"kanji\", \"japanese\", \"chinese\", \"forbidden\", \"limit\", \"restricted\", \"red-square\" ],\n char: \"\\ud83c\\ude32\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n a: {\n keywords: [ \"red-square\", \"alphabet\", \"letter\" ],\n char: \"\\ud83c\\udd70\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n b: {\n keywords: [ \"red-square\", \"alphabet\", \"letter\" ],\n char: \"\\ud83c\\udd71\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n ab: {\n keywords: [ \"red-square\", \"alphabet\" ],\n char: \"\\ud83c\\udd8e\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n cl: {\n keywords: [ \"alphabet\", \"words\", \"red-square\" ],\n char: \"\\ud83c\\udd91\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n o2: {\n keywords: [ \"alphabet\", \"red-square\", \"letter\" ],\n char: \"\\ud83c\\udd7e\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n sos: {\n keywords: [ \"help\", \"red-square\", \"words\", \"emergency\", \"911\" ],\n char: \"\\ud83c\\udd98\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n no_entry: {\n keywords: [ \"limit\", \"security\", \"privacy\", \"bad\", \"denied\", \"stop\", \"circle\" ],\n char: \"\\u26d4\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n name_badge: {\n keywords: [ \"fire\", \"forbid\" ],\n char: \"\\ud83d\\udcdb\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n no_entry_sign: {\n keywords: [ \"forbid\", \"stop\", \"limit\", \"denied\", \"disallow\", \"circle\" ],\n char: \"\\ud83d\\udeab\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n x: {\n keywords: [ \"no\", \"delete\", \"remove\", \"cancel\", \"red\" ],\n char: \"\\u274c\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n o: {\n keywords: [ \"circle\", \"round\" ],\n char: \"\\u2b55\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n stop_sign: {\n keywords: [ \"stop\" ],\n char: \"\\ud83d\\uded1\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n anger: {\n keywords: [ \"angry\", \"mad\" ],\n char: \"\\ud83d\\udca2\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n hotsprings: {\n keywords: [ \"bath\", \"warm\", \"relax\" ],\n char: \"\\u2668\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n no_pedestrians: {\n keywords: [ \"rules\", \"crossing\", \"walking\", \"circle\" ],\n char: \"\\ud83d\\udeb7\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n do_not_litter: {\n keywords: [ \"trash\", \"bin\", \"garbage\", \"circle\" ],\n char: \"\\ud83d\\udeaf\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n no_bicycles: {\n keywords: [ \"cyclist\", \"prohibited\", \"circle\" ],\n char: \"\\ud83d\\udeb3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n \"non-potable_water\": {\n keywords: [ \"drink\", \"faucet\", \"tap\", \"circle\" ],\n char: \"\\ud83d\\udeb1\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n underage: {\n keywords: [ \"18\", \"drink\", \"pub\", \"night\", \"minor\", \"circle\" ],\n char: \"\\ud83d\\udd1e\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n no_mobile_phones: {\n keywords: [ \"iphone\", \"mute\", \"circle\" ],\n char: \"\\ud83d\\udcf5\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n exclamation: {\n keywords: [ \"heavy_exclamation_mark\", \"danger\", \"surprise\", \"punctuation\", \"wow\", \"warning\" ],\n char: \"\\u2757\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n grey_exclamation: {\n keywords: [ \"surprise\", \"punctuation\", \"gray\", \"wow\", \"warning\" ],\n char: \"\\u2755\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n question: {\n keywords: [ \"doubt\", \"confused\" ],\n char: \"\\u2753\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n grey_question: {\n keywords: [ \"doubts\", \"gray\", \"huh\", \"confused\" ],\n char: \"\\u2754\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n bangbang: {\n keywords: [ \"exclamation\", \"surprise\" ],\n char: \"\\u203c\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n interrobang: {\n keywords: [ \"wat\", \"punctuation\", \"surprise\" ],\n char: \"\\u2049\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n 100: {\n keywords: [ \"score\", \"perfect\", \"numbers\", \"century\", \"exam\", \"quiz\", \"test\", \"pass\", \"hundred\" ],\n char: \"\\ud83d\\udcaf\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n low_brightness: {\n keywords: [ \"sun\", \"afternoon\", \"warm\", \"summer\" ],\n char: \"\\ud83d\\udd05\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n high_brightness: {\n keywords: [ \"sun\", \"light\" ],\n char: \"\\ud83d\\udd06\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n trident: {\n keywords: [ \"weapon\", \"spear\" ],\n char: \"\\ud83d\\udd31\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n fleur_de_lis: {\n keywords: [ \"decorative\", \"scout\" ],\n char: \"\\u269c\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n part_alternation_mark: {\n keywords: [ \"graph\", \"presentation\", \"stats\", \"business\", \"economics\", \"bad\" ],\n char: \"\\u303d\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n warning: {\n keywords: [ \"exclamation\", \"wip\", \"alert\", \"error\", \"problem\", \"issue\" ],\n char: \"\\u26a0\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n children_crossing: {\n keywords: [ \"school\", \"warning\", \"danger\", \"sign\", \"driving\", \"yellow-diamond\" ],\n char: \"\\ud83d\\udeb8\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n beginner: {\n keywords: [ \"badge\", \"shield\" ],\n char: \"\\ud83d\\udd30\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n recycle: {\n keywords: [ \"arrow\", \"environment\", \"garbage\", \"trash\" ],\n char: \"\\u267b\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n u6307: {\n keywords: [ \"chinese\", \"point\", \"green-square\", \"kanji\" ],\n char: \"\\ud83c\\ude2f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n chart: {\n keywords: [ \"green-square\", \"graph\", \"presentation\", \"stats\" ],\n char: \"\\ud83d\\udcb9\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n sparkle: {\n keywords: [ \"stars\", \"green-square\", \"awesome\", \"good\", \"fireworks\" ],\n char: \"\\u2747\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n eight_spoked_asterisk: {\n keywords: [ \"star\", \"sparkle\", \"green-square\" ],\n char: \"\\u2733\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n negative_squared_cross_mark: {\n keywords: [ \"x\", \"green-square\", \"no\", \"deny\" ],\n char: \"\\u274e\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n white_check_mark: {\n keywords: [ \"green-square\", \"ok\", \"agree\", \"vote\", \"election\", \"answer\", \"tick\" ],\n char: \"\\u2705\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n diamond_shape_with_a_dot_inside: {\n keywords: [ \"jewel\", \"blue\", \"gem\", \"crystal\", \"fancy\" ],\n char: \"\\ud83d\\udca0\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n cyclone: {\n keywords: [ \"weather\", \"swirl\", \"blue\", \"cloud\", \"vortex\", \"spiral\", \"whirlpool\", \"spin\", \"tornado\", \"hurricane\", \"typhoon\" ],\n char: \"\\ud83c\\udf00\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n loop: {\n keywords: [ \"tape\", \"cassette\" ],\n char: \"\\u27bf\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n globe_with_meridians: {\n keywords: [ \"earth\", \"international\", \"world\", \"internet\", \"interweb\", \"i18n\" ],\n char: \"\\ud83c\\udf10\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n m: {\n keywords: [ \"alphabet\", \"blue-circle\", \"letter\" ],\n char: \"\\u24c2\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n atm: {\n keywords: [ \"money\", \"sales\", \"cash\", \"blue-square\", \"payment\", \"bank\" ],\n char: \"\\ud83c\\udfe7\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n sa: {\n keywords: [ \"japanese\", \"blue-square\", \"katakana\" ],\n char: \"\\ud83c\\ude02\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n passport_control: {\n keywords: [ \"custom\", \"blue-square\" ],\n char: \"\\ud83d\\udec2\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n customs: {\n keywords: [ \"passport\", \"border\", \"blue-square\" ],\n char: \"\\ud83d\\udec3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n baggage_claim: {\n keywords: [ \"blue-square\", \"airport\", \"transport\" ],\n char: \"\\ud83d\\udec4\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n left_luggage: {\n keywords: [ \"blue-square\", \"travel\" ],\n char: \"\\ud83d\\udec5\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n wheelchair: {\n keywords: [ \"blue-square\", \"disabled\", \"a11y\", \"accessibility\" ],\n char: \"\\u267f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n no_smoking: {\n keywords: [ \"cigarette\", \"blue-square\", \"smell\", \"smoke\" ],\n char: \"\\ud83d\\udead\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n wc: {\n keywords: [ \"toilet\", \"restroom\", \"blue-square\" ],\n char: \"\\ud83d\\udebe\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n parking: {\n keywords: [ \"cars\", \"blue-square\", \"alphabet\", \"letter\" ],\n char: \"\\ud83c\\udd7f\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n potable_water: {\n keywords: [ \"blue-square\", \"liquid\", \"restroom\", \"cleaning\", \"faucet\" ],\n char: \"\\ud83d\\udeb0\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n mens: {\n keywords: [ \"toilet\", \"restroom\", \"wc\", \"blue-square\", \"gender\", \"male\" ],\n char: \"\\ud83d\\udeb9\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n womens: {\n keywords: [ \"purple-square\", \"woman\", \"female\", \"toilet\", \"loo\", \"restroom\", \"gender\" ],\n char: \"\\ud83d\\udeba\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n baby_symbol: {\n keywords: [ \"orange-square\", \"child\" ],\n char: \"\\ud83d\\udebc\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n restroom: {\n keywords: [ \"blue-square\", \"toilet\", \"refresh\", \"wc\", \"gender\" ],\n char: \"\\ud83d\\udebb\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n put_litter_in_its_place: {\n keywords: [ \"blue-square\", \"sign\", \"human\", \"info\" ],\n char: \"\\ud83d\\udeae\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n cinema: {\n keywords: [ \"blue-square\", \"record\", \"film\", \"movie\", \"curtain\", \"stage\", \"theater\" ],\n char: \"\\ud83c\\udfa6\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n signal_strength: {\n keywords: [ \"blue-square\", \"reception\", \"phone\", \"internet\", \"connection\", \"wifi\", \"bluetooth\", \"bars\" ],\n char: \"\\ud83d\\udcf6\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n koko: {\n keywords: [ \"blue-square\", \"here\", \"katakana\", \"japanese\", \"destination\" ],\n char: \"\\ud83c\\ude01\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n ng: {\n keywords: [ \"blue-square\", \"words\", \"shape\", \"icon\" ],\n char: \"\\ud83c\\udd96\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n ok: {\n keywords: [ \"good\", \"agree\", \"yes\", \"blue-square\" ],\n char: \"\\ud83c\\udd97\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n up: {\n keywords: [ \"blue-square\", \"above\", \"high\" ],\n char: \"\\ud83c\\udd99\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n cool: {\n keywords: [ \"words\", \"blue-square\" ],\n char: \"\\ud83c\\udd92\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n new: {\n keywords: [ \"blue-square\", \"words\", \"start\" ],\n char: \"\\ud83c\\udd95\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n free: {\n keywords: [ \"blue-square\", \"words\" ],\n char: \"\\ud83c\\udd93\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n zero: {\n keywords: [ \"0\", \"numbers\", \"blue-square\", \"null\" ],\n char: \"0\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n one: {\n keywords: [ \"blue-square\", \"numbers\", \"1\" ],\n char: \"1\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n two: {\n keywords: [ \"numbers\", \"2\", \"prime\", \"blue-square\" ],\n char: \"2\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n three: {\n keywords: [ \"3\", \"numbers\", \"prime\", \"blue-square\" ],\n char: \"3\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n four: {\n keywords: [ \"4\", \"numbers\", \"blue-square\" ],\n char: \"4\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n five: {\n keywords: [ \"5\", \"numbers\", \"blue-square\", \"prime\" ],\n char: \"5\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n six: {\n keywords: [ \"6\", \"numbers\", \"blue-square\" ],\n char: \"6\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n seven: {\n keywords: [ \"7\", \"numbers\", \"blue-square\", \"prime\" ],\n char: \"7\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n eight: {\n keywords: [ \"8\", \"blue-square\", \"numbers\" ],\n char: \"8\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n nine: {\n keywords: [ \"blue-square\", \"numbers\", \"9\" ],\n char: \"9\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n keycap_ten: {\n keywords: [ \"numbers\", \"10\", \"blue-square\" ],\n char: \"\\ud83d\\udd1f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n asterisk: {\n keywords: [ \"star\", \"keycap\" ],\n char: \"*\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n 1234: {\n keywords: [ \"numbers\", \"blue-square\" ],\n char: \"\\ud83d\\udd22\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n eject_button: {\n keywords: [ \"blue-square\" ],\n char: \"\\u23cf\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_forward: {\n keywords: [ \"blue-square\", \"right\", \"direction\", \"play\" ],\n char: \"\\u25b6\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n pause_button: {\n keywords: [ \"pause\", \"blue-square\" ],\n char: \"\\u23f8\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n next_track_button: {\n keywords: [ \"forward\", \"next\", \"blue-square\" ],\n char: \"\\u23ed\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n stop_button: {\n keywords: [ \"blue-square\" ],\n char: \"\\u23f9\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n record_button: {\n keywords: [ \"blue-square\" ],\n char: \"\\u23fa\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n play_or_pause_button: {\n keywords: [ \"blue-square\", \"play\", \"pause\" ],\n char: \"\\u23ef\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n previous_track_button: {\n keywords: [ \"backward\" ],\n char: \"\\u23ee\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n fast_forward: {\n keywords: [ \"blue-square\", \"play\", \"speed\", \"continue\" ],\n char: \"\\u23e9\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n rewind: {\n keywords: [ \"play\", \"blue-square\" ],\n char: \"\\u23ea\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n twisted_rightwards_arrows: {\n keywords: [ \"blue-square\", \"shuffle\", \"music\", \"random\" ],\n char: \"\\ud83d\\udd00\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n repeat: {\n keywords: [ \"loop\", \"record\" ],\n char: \"\\ud83d\\udd01\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n repeat_one: {\n keywords: [ \"blue-square\", \"loop\" ],\n char: \"\\ud83d\\udd02\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_backward: {\n keywords: [ \"blue-square\", \"left\", \"direction\" ],\n char: \"\\u25c0\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_up_small: {\n keywords: [ \"blue-square\", \"triangle\", \"direction\", \"point\", \"forward\", \"top\" ],\n char: \"\\ud83d\\udd3c\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_down_small: {\n keywords: [ \"blue-square\", \"direction\", \"bottom\" ],\n char: \"\\ud83d\\udd3d\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_double_up: {\n keywords: [ \"blue-square\", \"direction\", \"top\" ],\n char: \"\\u23eb\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_double_down: {\n keywords: [ \"blue-square\", \"direction\", \"bottom\" ],\n char: \"\\u23ec\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_right: {\n keywords: [ \"blue-square\", \"next\" ],\n char: \"\\u27a1\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_left: {\n keywords: [ \"blue-square\", \"previous\", \"back\" ],\n char: \"\\u2b05\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_up: {\n keywords: [ \"blue-square\", \"continue\", \"top\", \"direction\" ],\n char: \"\\u2b06\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_down: {\n keywords: [ \"blue-square\", \"direction\", \"bottom\" ],\n char: \"\\u2b07\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_upper_right: {\n keywords: [ \"blue-square\", \"point\", \"direction\", \"diagonal\", \"northeast\" ],\n char: \"\\u2197\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_lower_right: {\n keywords: [ \"blue-square\", \"direction\", \"diagonal\", \"southeast\" ],\n char: \"\\u2198\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_lower_left: {\n keywords: [ \"blue-square\", \"direction\", \"diagonal\", \"southwest\" ],\n char: \"\\u2199\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_upper_left: {\n keywords: [ \"blue-square\", \"point\", \"direction\", \"diagonal\", \"northwest\" ],\n char: \"\\u2196\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_up_down: {\n keywords: [ \"blue-square\", \"direction\", \"way\", \"vertical\" ],\n char: \"\\u2195\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n left_right_arrow: {\n keywords: [ \"shape\", \"direction\", \"horizontal\", \"sideways\" ],\n char: \"\\u2194\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrows_counterclockwise: {\n keywords: [ \"blue-square\", \"sync\", \"cycle\" ],\n char: \"\\ud83d\\udd04\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_right_hook: {\n keywords: [ \"blue-square\", \"return\", \"rotate\", \"direction\" ],\n char: \"\\u21aa\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n leftwards_arrow_with_hook: {\n keywords: [ \"back\", \"return\", \"blue-square\", \"undo\", \"enter\" ],\n char: \"\\u21a9\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_heading_up: {\n keywords: [ \"blue-square\", \"direction\", \"top\" ],\n char: \"\\u2934\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrow_heading_down: {\n keywords: [ \"blue-square\", \"direction\", \"bottom\" ],\n char: \"\\u2935\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n hash: {\n keywords: [ \"symbol\", \"blue-square\", \"twitter\" ],\n char: \"#\\ufe0f\\u20e3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n information_source: {\n keywords: [ \"blue-square\", \"alphabet\", \"letter\" ],\n char: \"\\u2139\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n abc: {\n keywords: [ \"blue-square\", \"alphabet\" ],\n char: \"\\ud83d\\udd24\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n abcd: {\n keywords: [ \"blue-square\", \"alphabet\" ],\n char: \"\\ud83d\\udd21\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n capital_abcd: {\n keywords: [ \"alphabet\", \"words\", \"blue-square\" ],\n char: \"\\ud83d\\udd20\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n symbols: {\n keywords: [ \"blue-square\", \"music\", \"note\", \"ampersand\", \"percent\", \"glyphs\", \"characters\" ],\n char: \"\\ud83d\\udd23\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n musical_note: {\n keywords: [ \"score\", \"tone\", \"sound\" ],\n char: \"\\ud83c\\udfb5\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n notes: {\n keywords: [ \"music\", \"score\" ],\n char: \"\\ud83c\\udfb6\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n wavy_dash: {\n keywords: [ \"draw\", \"line\", \"moustache\", \"mustache\", \"squiggle\", \"scribble\" ],\n char: \"\\u3030\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n curly_loop: {\n keywords: [ \"scribble\", \"draw\", \"shape\", \"squiggle\" ],\n char: \"\\u27b0\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heavy_check_mark: {\n keywords: [ \"ok\", \"nike\", \"answer\", \"yes\", \"tick\" ],\n char: \"\\u2714\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n arrows_clockwise: {\n keywords: [ \"sync\", \"cycle\", \"round\", \"repeat\" ],\n char: \"\\ud83d\\udd03\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heavy_plus_sign: {\n keywords: [ \"math\", \"calculation\", \"addition\", \"more\", \"increase\" ],\n char: \"\\u2795\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heavy_minus_sign: {\n keywords: [ \"math\", \"calculation\", \"subtract\", \"less\" ],\n char: \"\\u2796\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heavy_division_sign: {\n keywords: [ \"divide\", \"math\", \"calculation\" ],\n char: \"\\u2797\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heavy_multiplication_x: {\n keywords: [ \"math\", \"calculation\" ],\n char: \"\\u2716\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n infinity: {\n keywords: [ \"forever\" ],\n char: \"\\u267e\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n heavy_dollar_sign: {\n keywords: [ \"money\", \"sales\", \"payment\", \"currency\", \"buck\" ],\n char: \"\\ud83d\\udcb2\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n currency_exchange: {\n keywords: [ \"money\", \"sales\", \"dollar\", \"travel\" ],\n char: \"\\ud83d\\udcb1\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n copyright: {\n keywords: [ \"ip\", \"license\", \"circle\", \"law\", \"legal\" ],\n char: \"\\xa9\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n registered: {\n keywords: [ \"alphabet\", \"circle\" ],\n char: \"\\xae\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n tm: {\n keywords: [ \"trademark\", \"brand\", \"law\", \"legal\" ],\n char: \"\\u2122\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n end: {\n keywords: [ \"words\", \"arrow\" ],\n char: \"\\ud83d\\udd1a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n back: {\n keywords: [ \"arrow\", \"words\", \"return\" ],\n char: \"\\ud83d\\udd19\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n on: {\n keywords: [ \"arrow\", \"words\" ],\n char: \"\\ud83d\\udd1b\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n top: {\n keywords: [ \"words\", \"blue-square\" ],\n char: \"\\ud83d\\udd1d\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n soon: {\n keywords: [ \"arrow\", \"words\" ],\n char: \"\\ud83d\\udd1c\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n ballot_box_with_check: {\n keywords: [ \"ok\", \"agree\", \"confirm\", \"black-square\", \"vote\", \"election\", \"yes\", \"tick\" ],\n char: \"\\u2611\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n radio_button: {\n keywords: [ \"input\", \"old\", \"music\", \"circle\" ],\n char: \"\\ud83d\\udd18\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n white_circle: {\n keywords: [ \"shape\", \"round\" ],\n char: \"\\u26aa\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n black_circle: {\n keywords: [ \"shape\", \"button\", \"round\" ],\n char: \"\\u26ab\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n red_circle: {\n keywords: [ \"shape\", \"error\", \"danger\" ],\n char: \"\\ud83d\\udd34\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n large_blue_circle: {\n keywords: [ \"shape\", \"icon\", \"button\" ],\n char: \"\\ud83d\\udd35\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n small_orange_diamond: {\n keywords: [ \"shape\", \"jewel\", \"gem\" ],\n char: \"\\ud83d\\udd38\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n small_blue_diamond: {\n keywords: [ \"shape\", \"jewel\", \"gem\" ],\n char: \"\\ud83d\\udd39\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n large_orange_diamond: {\n keywords: [ \"shape\", \"jewel\", \"gem\" ],\n char: \"\\ud83d\\udd36\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n large_blue_diamond: {\n keywords: [ \"shape\", \"jewel\", \"gem\" ],\n char: \"\\ud83d\\udd37\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n small_red_triangle: {\n keywords: [ \"shape\", \"direction\", \"up\", \"top\" ],\n char: \"\\ud83d\\udd3a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n black_small_square: {\n keywords: [ \"shape\", \"icon\" ],\n char: \"\\u25aa\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n white_small_square: {\n keywords: [ \"shape\", \"icon\" ],\n char: \"\\u25ab\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n black_large_square: {\n keywords: [ \"shape\", \"icon\", \"button\" ],\n char: \"\\u2b1b\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n white_large_square: {\n keywords: [ \"shape\", \"icon\", \"stone\", \"button\" ],\n char: \"\\u2b1c\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n small_red_triangle_down: {\n keywords: [ \"shape\", \"direction\", \"bottom\" ],\n char: \"\\ud83d\\udd3b\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n black_medium_square: {\n keywords: [ \"shape\", \"button\", \"icon\" ],\n char: \"\\u25fc\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n white_medium_square: {\n keywords: [ \"shape\", \"stone\", \"icon\" ],\n char: \"\\u25fb\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n black_medium_small_square: {\n keywords: [ \"icon\", \"shape\", \"button\" ],\n char: \"\\u25fe\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n white_medium_small_square: {\n keywords: [ \"shape\", \"stone\", \"icon\", \"button\" ],\n char: \"\\u25fd\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n black_square_button: {\n keywords: [ \"shape\", \"input\", \"frame\" ],\n char: \"\\ud83d\\udd32\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n white_square_button: {\n keywords: [ \"shape\", \"input\" ],\n char: \"\\ud83d\\udd33\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n speaker: {\n keywords: [ \"sound\", \"volume\", \"silence\", \"broadcast\" ],\n char: \"\\ud83d\\udd08\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n sound: {\n keywords: [ \"volume\", \"speaker\", \"broadcast\" ],\n char: \"\\ud83d\\udd09\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n loud_sound: {\n keywords: [ \"volume\", \"noise\", \"noisy\", \"speaker\", \"broadcast\" ],\n char: \"\\ud83d\\udd0a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n mute: {\n keywords: [ \"sound\", \"volume\", \"silence\", \"quiet\" ],\n char: \"\\ud83d\\udd07\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n mega: {\n keywords: [ \"sound\", \"speaker\", \"volume\" ],\n char: \"\\ud83d\\udce3\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n loudspeaker: {\n keywords: [ \"volume\", \"sound\" ],\n char: \"\\ud83d\\udce2\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n bell: {\n keywords: [ \"sound\", \"notification\", \"christmas\", \"xmas\", \"chime\" ],\n char: \"\\ud83d\\udd14\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n no_bell: {\n keywords: [ \"sound\", \"volume\", \"mute\", \"quiet\", \"silent\" ],\n char: \"\\ud83d\\udd15\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n black_joker: {\n keywords: [ \"poker\", \"cards\", \"game\", \"play\", \"magic\" ],\n char: \"\\ud83c\\udccf\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n mahjong: {\n keywords: [ \"game\", \"play\", \"chinese\", \"kanji\" ],\n char: \"\\ud83c\\udc04\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n spades: {\n keywords: [ \"poker\", \"cards\", \"suits\", \"magic\" ],\n char: \"\\u2660\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clubs: {\n keywords: [ \"poker\", \"cards\", \"magic\", \"suits\" ],\n char: \"\\u2663\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n hearts: {\n keywords: [ \"poker\", \"cards\", \"magic\", \"suits\" ],\n char: \"\\u2665\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n diamonds: {\n keywords: [ \"poker\", \"cards\", \"magic\", \"suits\" ],\n char: \"\\u2666\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n flower_playing_cards: {\n keywords: [ \"game\", \"sunset\", \"red\" ],\n char: \"\\ud83c\\udfb4\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n thought_balloon: {\n keywords: [ \"bubble\", \"cloud\", \"speech\", \"thinking\", \"dream\" ],\n char: \"\\ud83d\\udcad\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n right_anger_bubble: {\n keywords: [ \"caption\", \"speech\", \"thinking\", \"mad\" ],\n char: \"\\ud83d\\uddef\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n speech_balloon: {\n keywords: [ \"bubble\", \"words\", \"message\", \"talk\", \"chatting\" ],\n char: \"\\ud83d\\udcac\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n left_speech_bubble: {\n keywords: [ \"words\", \"message\", \"talk\", \"chatting\" ],\n char: \"\\ud83d\\udde8\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock1: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd50\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock2: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd51\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock3: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd52\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock4: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd53\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock5: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd54\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock6: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\", \"dawn\", \"dusk\" ],\n char: \"\\ud83d\\udd55\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock7: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd56\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock8: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd57\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock9: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd58\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock10: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd59\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock11: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd5a\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock12: {\n keywords: [ \"time\", \"noon\", \"midnight\", \"midday\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd5b\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock130: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd5c\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock230: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd5d\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock330: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd5e\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock430: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd5f\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock530: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd60\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock630: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd61\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock730: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd62\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock830: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd63\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock930: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd64\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock1030: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd65\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock1130: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd66\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n clock1230: {\n keywords: [ \"time\", \"late\", \"early\", \"schedule\" ],\n char: \"\\ud83d\\udd67\",\n fitzpatrick_scale: false,\n category: \"symbols\"\n },\n afghanistan: {\n keywords: [ \"af\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddeb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n aland_islands: {\n keywords: [ \"\\xc5land\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddfd\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n albania: {\n keywords: [ \"al\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n algeria: {\n keywords: [ \"dz\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde9\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n american_samoa: {\n keywords: [ \"american\", \"ws\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n andorra: {\n keywords: [ \"ad\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\udde9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n angola: {\n keywords: [ \"ao\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n anguilla: {\n keywords: [ \"ai\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n antarctica: {\n keywords: [ \"aq\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddf6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n antigua_barbuda: {\n keywords: [ \"antigua\", \"barbuda\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n argentina: {\n keywords: [ \"ar\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n armenia: {\n keywords: [ \"am\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n aruba: {\n keywords: [ \"aw\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n australia: {\n keywords: [ \"au\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n austria: {\n keywords: [ \"at\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n azerbaijan: {\n keywords: [ \"az\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n bahamas: {\n keywords: [ \"bs\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n bahrain: {\n keywords: [ \"bh\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\udded\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n bangladesh: {\n keywords: [ \"bd\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\udde9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n barbados: {\n keywords: [ \"bb\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\udde7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n belarus: {\n keywords: [ \"by\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddfe\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n belgium: {\n keywords: [ \"be\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n belize: {\n keywords: [ \"bz\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n benin: {\n keywords: [ \"bj\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddef\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n bermuda: {\n keywords: [ \"bm\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n bhutan: {\n keywords: [ \"bt\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n bolivia: {\n keywords: [ \"bo\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n caribbean_netherlands: {\n keywords: [ \"bonaire\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddf6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n bosnia_herzegovina: {\n keywords: [ \"bosnia\", \"herzegovina\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n botswana: {\n keywords: [ \"bw\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n brazil: {\n keywords: [ \"br\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n british_indian_ocean_territory: {\n keywords: [ \"british\", \"indian\", \"ocean\", \"territory\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n british_virgin_islands: {\n keywords: [ \"british\", \"virgin\", \"islands\", \"bvi\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfb\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n brunei: {\n keywords: [ \"bn\", \"darussalam\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n bulgaria: {\n keywords: [ \"bg\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n burkina_faso: {\n keywords: [ \"burkina\", \"faso\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddeb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n burundi: {\n keywords: [ \"bi\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cape_verde: {\n keywords: [ \"cabo\", \"verde\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddfb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cambodia: {\n keywords: [ \"kh\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\udded\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cameroon: {\n keywords: [ \"cm\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n canada: {\n keywords: [ \"ca\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n canary_islands: {\n keywords: [ \"canary\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\udde8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cayman_islands: {\n keywords: [ \"cayman\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddfe\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n central_african_republic: {\n keywords: [ \"central\", \"african\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddeb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n chad: {\n keywords: [ \"td\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\udde9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n chile: {\n keywords: [ \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cn: {\n keywords: [ \"china\", \"chinese\", \"prc\", \"flag\", \"country\", \"nation\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n christmas_island: {\n keywords: [ \"christmas\", \"island\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddfd\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cocos_islands: {\n keywords: [ \"cocos\", \"keeling\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\udde8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n colombia: {\n keywords: [ \"co\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n comoros: {\n keywords: [ \"km\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n congo_brazzaville: {\n keywords: [ \"congo\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n congo_kinshasa: {\n keywords: [ \"congo\", \"democratic\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\udde9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cook_islands: {\n keywords: [ \"cook\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n costa_rica: {\n keywords: [ \"costa\", \"rica\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n croatia: {\n keywords: [ \"hr\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udded\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cuba: {\n keywords: [ \"cu\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n curacao: {\n keywords: [ \"cura\\xe7ao\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cyprus: {\n keywords: [ \"cy\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddfe\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n czech_republic: {\n keywords: [ \"cz\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n denmark: {\n keywords: [ \"dk\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde9\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n djibouti: {\n keywords: [ \"dj\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde9\\ud83c\\uddef\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n dominica: {\n keywords: [ \"dm\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde9\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n dominican_republic: {\n keywords: [ \"dominican\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde9\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n ecuador: {\n keywords: [ \"ec\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddea\\ud83c\\udde8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n egypt: {\n keywords: [ \"eg\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddea\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n el_salvador: {\n keywords: [ \"el\", \"salvador\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddfb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n equatorial_guinea: {\n keywords: [ \"equatorial\", \"gn\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddf6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n eritrea: {\n keywords: [ \"er\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddea\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n estonia: {\n keywords: [ \"ee\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddea\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n ethiopia: {\n keywords: [ \"et\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddea\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n eu: {\n keywords: [ \"european\", \"union\", \"flag\", \"banner\" ],\n char: \"\\ud83c\\uddea\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n falkland_islands: {\n keywords: [ \"falkland\", \"islands\", \"malvinas\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddeb\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n faroe_islands: {\n keywords: [ \"faroe\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddeb\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n fiji: {\n keywords: [ \"fj\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddeb\\ud83c\\uddef\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n finland: {\n keywords: [ \"fi\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddeb\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n fr: {\n keywords: [ \"banner\", \"flag\", \"nation\", \"france\", \"french\", \"country\" ],\n char: \"\\ud83c\\uddeb\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n french_guiana: {\n keywords: [ \"french\", \"guiana\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddeb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n french_polynesia: {\n keywords: [ \"french\", \"polynesia\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddeb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n french_southern_territories: {\n keywords: [ \"french\", \"southern\", \"territories\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddeb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n gabon: {\n keywords: [ \"ga\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n gambia: {\n keywords: [ \"gm\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n georgia: {\n keywords: [ \"ge\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n de: {\n keywords: [ \"german\", \"nation\", \"flag\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde9\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n ghana: {\n keywords: [ \"gh\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\udded\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n gibraltar: {\n keywords: [ \"gi\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n greece: {\n keywords: [ \"gr\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n greenland: {\n keywords: [ \"gl\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n grenada: {\n keywords: [ \"gd\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\udde9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n guadeloupe: {\n keywords: [ \"gp\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddf5\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n guam: {\n keywords: [ \"gu\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n guatemala: {\n keywords: [ \"gt\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n guernsey: {\n keywords: [ \"gg\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n guinea: {\n keywords: [ \"gn\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n guinea_bissau: {\n keywords: [ \"gw\", \"bissau\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n guyana: {\n keywords: [ \"gy\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddfe\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n haiti: {\n keywords: [ \"ht\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udded\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n honduras: {\n keywords: [ \"hn\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udded\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n hong_kong: {\n keywords: [ \"hong\", \"kong\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udded\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n hungary: {\n keywords: [ \"hu\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udded\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n iceland: {\n keywords: [ \"is\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n india: {\n keywords: [ \"in\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n indonesia: {\n keywords: [ \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\udde9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n iran: {\n keywords: [ \"iran,\", \"islamic\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n iraq: {\n keywords: [ \"iq\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\uddf6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n ireland: {\n keywords: [ \"ie\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n isle_of_man: {\n keywords: [ \"isle\", \"man\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n israel: {\n keywords: [ \"il\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n it: {\n keywords: [ \"italy\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddee\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n cote_divoire: {\n keywords: [ \"ivory\", \"coast\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n jamaica: {\n keywords: [ \"jm\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddef\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n jp: {\n keywords: [ \"japanese\", \"nation\", \"flag\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddef\\ud83c\\uddf5\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n jersey: {\n keywords: [ \"je\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddef\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n jordan: {\n keywords: [ \"jo\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddef\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n kazakhstan: {\n keywords: [ \"kz\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n kenya: {\n keywords: [ \"ke\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n kiribati: {\n keywords: [ \"ki\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n kosovo: {\n keywords: [ \"xk\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfd\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n kuwait: {\n keywords: [ \"kw\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n kyrgyzstan: {\n keywords: [ \"kg\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n laos: {\n keywords: [ \"lao\", \"democratic\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n latvia: {\n keywords: [ \"lv\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\uddfb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n lebanon: {\n keywords: [ \"lb\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\udde7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n lesotho: {\n keywords: [ \"ls\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n liberia: {\n keywords: [ \"lr\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n libya: {\n keywords: [ \"ly\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\uddfe\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n liechtenstein: {\n keywords: [ \"li\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n lithuania: {\n keywords: [ \"lt\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n luxembourg: {\n keywords: [ \"lu\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n macau: {\n keywords: [ \"macao\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n macedonia: {\n keywords: [ \"macedonia,\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n madagascar: {\n keywords: [ \"mg\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n malawi: {\n keywords: [ \"mw\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n malaysia: {\n keywords: [ \"my\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddfe\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n maldives: {\n keywords: [ \"mv\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddfb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n mali: {\n keywords: [ \"ml\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n malta: {\n keywords: [ \"mt\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n marshall_islands: {\n keywords: [ \"marshall\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\udded\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n martinique: {\n keywords: [ \"mq\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n mauritania: {\n keywords: [ \"mr\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n mauritius: {\n keywords: [ \"mu\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n mayotte: {\n keywords: [ \"yt\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfe\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n mexico: {\n keywords: [ \"mx\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddfd\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n micronesia: {\n keywords: [ \"micronesia,\", \"federated\", \"states\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddeb\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n moldova: {\n keywords: [ \"moldova,\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\udde9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n monaco: {\n keywords: [ \"mc\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\udde8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n mongolia: {\n keywords: [ \"mn\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n montenegro: {\n keywords: [ \"me\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n montserrat: {\n keywords: [ \"ms\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n morocco: {\n keywords: [ \"ma\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n mozambique: {\n keywords: [ \"mz\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n myanmar: {\n keywords: [ \"mm\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n namibia: {\n keywords: [ \"na\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n nauru: {\n keywords: [ \"nr\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n nepal: {\n keywords: [ \"np\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddf5\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n netherlands: {\n keywords: [ \"nl\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n new_caledonia: {\n keywords: [ \"new\", \"caledonia\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\udde8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n new_zealand: {\n keywords: [ \"new\", \"zealand\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n nicaragua: {\n keywords: [ \"ni\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n niger: {\n keywords: [ \"ne\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n nigeria: {\n keywords: [ \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n niue: {\n keywords: [ \"nu\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n norfolk_island: {\n keywords: [ \"norfolk\", \"island\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddeb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n northern_mariana_islands: {\n keywords: [ \"northern\", \"mariana\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf2\\ud83c\\uddf5\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n north_korea: {\n keywords: [ \"north\", \"korea\", \"nation\", \"flag\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddf5\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n norway: {\n keywords: [ \"no\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf3\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n oman: {\n keywords: [ \"om_symbol\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf4\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n pakistan: {\n keywords: [ \"pk\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n palau: {\n keywords: [ \"pw\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n palestinian_territories: {\n keywords: [ \"palestine\", \"palestinian\", \"territories\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n panama: {\n keywords: [ \"pa\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n papua_new_guinea: {\n keywords: [ \"papua\", \"new\", \"guinea\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n paraguay: {\n keywords: [ \"py\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddfe\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n peru: {\n keywords: [ \"pe\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n philippines: {\n keywords: [ \"ph\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\udded\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n pitcairn_islands: {\n keywords: [ \"pitcairn\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n poland: {\n keywords: [ \"pl\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n portugal: {\n keywords: [ \"pt\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n puerto_rico: {\n keywords: [ \"puerto\", \"rico\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n qatar: {\n keywords: [ \"qa\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf6\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n reunion: {\n keywords: [ \"r\\xe9union\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf7\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n romania: {\n keywords: [ \"ro\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf7\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n ru: {\n keywords: [ \"russian\", \"federation\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf7\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n rwanda: {\n keywords: [ \"rw\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf7\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n st_barthelemy: {\n keywords: [ \"saint\", \"barth\\xe9lemy\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde7\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n st_helena: {\n keywords: [ \"saint\", \"helena\", \"ascension\", \"tristan\", \"cunha\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\udded\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n st_kitts_nevis: {\n keywords: [ \"saint\", \"kitts\", \"nevis\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n st_lucia: {\n keywords: [ \"saint\", \"lucia\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\udde8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n st_pierre_miquelon: {\n keywords: [ \"saint\", \"pierre\", \"miquelon\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf5\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n st_vincent_grenadines: {\n keywords: [ \"saint\", \"vincent\", \"grenadines\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfb\\ud83c\\udde8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n samoa: {\n keywords: [ \"ws\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfc\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n san_marino: {\n keywords: [ \"san\", \"marino\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n sao_tome_principe: {\n keywords: [ \"sao\", \"tome\", \"principe\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n saudi_arabia: {\n keywords: [ \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n senegal: {\n keywords: [ \"sn\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n serbia: {\n keywords: [ \"rs\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf7\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n seychelles: {\n keywords: [ \"sc\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\udde8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n sierra_leone: {\n keywords: [ \"sierra\", \"leone\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n singapore: {\n keywords: [ \"sg\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n sint_maarten: {\n keywords: [ \"sint\", \"maarten\", \"dutch\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddfd\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n slovakia: {\n keywords: [ \"sk\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n slovenia: {\n keywords: [ \"si\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n solomon_islands: {\n keywords: [ \"solomon\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\udde7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n somalia: {\n keywords: [ \"so\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n south_africa: {\n keywords: [ \"south\", \"africa\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddff\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n south_georgia_south_sandwich_islands: {\n keywords: [ \"south\", \"georgia\", \"sandwich\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddec\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n kr: {\n keywords: [ \"south\", \"korea\", \"nation\", \"flag\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf0\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n south_sudan: {\n keywords: [ \"south\", \"sd\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n es: {\n keywords: [ \"spain\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddea\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n sri_lanka: {\n keywords: [ \"sri\", \"lanka\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf1\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n sudan: {\n keywords: [ \"sd\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\udde9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n suriname: {\n keywords: [ \"sr\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n swaziland: {\n keywords: [ \"sz\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n sweden: {\n keywords: [ \"se\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n switzerland: {\n keywords: [ \"ch\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde8\\ud83c\\udded\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n syria: {\n keywords: [ \"syrian\", \"arab\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf8\\ud83c\\uddfe\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n taiwan: {\n keywords: [ \"tw\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n tajikistan: {\n keywords: [ \"tj\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddef\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n tanzania: {\n keywords: [ \"tanzania,\", \"united\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n thailand: {\n keywords: [ \"th\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\udded\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n timor_leste: {\n keywords: [ \"timor\", \"leste\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddf1\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n togo: {\n keywords: [ \"tg\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n tokelau: {\n keywords: [ \"tk\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddf0\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n tonga: {\n keywords: [ \"to\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddf4\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n trinidad_tobago: {\n keywords: [ \"trinidad\", \"tobago\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddf9\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n tunisia: {\n keywords: [ \"tn\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n tr: {\n keywords: [ \"turkey\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddf7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n turkmenistan: {\n keywords: [ \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n turks_caicos_islands: {\n keywords: [ \"turks\", \"caicos\", \"islands\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\udde8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n tuvalu: {\n keywords: [ \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddf9\\ud83c\\uddfb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n uganda: {\n keywords: [ \"ug\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfa\\ud83c\\uddec\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n ukraine: {\n keywords: [ \"ua\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfa\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n united_arab_emirates: {\n keywords: [ \"united\", \"arab\", \"emirates\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\udde6\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n uk: {\n keywords: [ \"united\", \"kingdom\", \"great\", \"britain\", \"northern\", \"ireland\", \"flag\", \"nation\", \"country\", \"banner\", \"british\", \"UK\", \"english\", \"england\", \"union jack\" ],\n char: \"\\ud83c\\uddec\\ud83c\\udde7\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n england: {\n keywords: [ \"flag\", \"english\" ],\n char: \"\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n scotland: {\n keywords: [ \"flag\", \"scottish\" ],\n char: \"\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n wales: {\n keywords: [ \"flag\", \"welsh\" ],\n char: \"\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n us: {\n keywords: [ \"united\", \"states\", \"america\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfa\\ud83c\\uddf8\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n us_virgin_islands: {\n keywords: [ \"virgin\", \"islands\", \"us\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfb\\ud83c\\uddee\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n uruguay: {\n keywords: [ \"uy\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfa\\ud83c\\uddfe\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n uzbekistan: {\n keywords: [ \"uz\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfa\\ud83c\\uddff\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n vanuatu: {\n keywords: [ \"vu\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfb\\ud83c\\uddfa\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n vatican_city: {\n keywords: [ \"vatican\", \"city\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfb\\ud83c\\udde6\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n venezuela: {\n keywords: [ \"ve\", \"bolivarian\", \"republic\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfb\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n vietnam: {\n keywords: [ \"viet\", \"nam\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfb\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n wallis_futuna: {\n keywords: [ \"wallis\", \"futuna\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfc\\ud83c\\uddeb\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n western_sahara: {\n keywords: [ \"western\", \"sahara\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddea\\ud83c\\udded\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n yemen: {\n keywords: [ \"ye\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddfe\\ud83c\\uddea\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n zambia: {\n keywords: [ \"zm\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddff\\ud83c\\uddf2\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n zimbabwe: {\n keywords: [ \"zw\", \"flag\", \"nation\", \"country\", \"banner\" ],\n char: \"\\ud83c\\uddff\\ud83c\\uddfc\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n united_nations: {\n keywords: [ \"un\", \"flag\", \"banner\" ],\n char: \"\\ud83c\\uddfa\\ud83c\\uddf3\",\n fitzpatrick_scale: false,\n category: \"flags\"\n },\n pirate_flag: {\n keywords: [ \"skull\", \"crossbones\", \"flag\", \"banner\" ],\n char: \"\\ud83c\\udff4\\u200d\\u2620\\ufe0f\",\n fitzpatrick_scale: false,\n category: \"flags\"\n }\n});\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/js/emojis.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/plugin.js": /*!**************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/plugin.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var eq = function (t) {\n return function (a) {\n return t === a;\n };\n };\n var isNull = eq(null);\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\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$1 = 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$1 = 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\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 return {\n get: get,\n set: set\n };\n };\n\n var last = function (fn, rate) {\n var timer = null;\n var cancel = function () {\n if (!isNull(timer)) {\n 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 cancel();\n timer = setTimeout(function () {\n timer = null;\n fn.apply(null, args);\n }, rate);\n };\n return {\n cancel: cancel,\n throttle: throttle\n };\n };\n\n var insertEmoticon = function (editor, ch) {\n editor.insertContent(ch);\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 keys = Object.keys;\n var hasOwnProperty = Object.hasOwnProperty;\n var each = 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 = 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(obj, function (x, i) {\n var tuple = f(x, i);\n r[tuple.k] = tuple.v;\n });\n return r;\n };\n var has = function (obj, key) {\n return hasOwnProperty.call(obj, key);\n };\n\n var shallow = function (old, nu) {\n return nu;\n };\n var baseMerge = function (merger) {\n return function () {\n var objects = [];\n for (var _i = 0; _i < arguments.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 (has(curObject, key)) {\n ret[key] = merger(ret[key], curObject[key]);\n }\n }\n }\n return ret;\n };\n };\n var merge = baseMerge(shallow);\n\n var singleton = function (doRevoke) {\n var subject = Cell(Optional.none());\n var revoke = function () {\n return subject.get().each(doRevoke);\n };\n var clear = function () {\n revoke();\n subject.set(Optional.none());\n };\n var isSet = function () {\n return subject.get().isSome();\n };\n var get = function () {\n return subject.get();\n };\n var set = function (s) {\n revoke();\n subject.set(Optional.some(s));\n };\n return {\n clear: clear,\n isSet: isSet,\n get: get,\n set: set\n };\n };\n var value = function () {\n var subject = singleton(noop);\n var on = function (f) {\n return subject.get().each(f);\n };\n return __assign(__assign({}, subject), { on: on });\n };\n\n var checkRange = function (str, substr, start) {\n return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;\n };\n var contains = function (str, substr) {\n return str.indexOf(substr) !== -1;\n };\n var startsWith = function (str, prefix) {\n return checkRange(str, prefix, 0);\n };\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.Resource');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n var DEFAULT_ID = 'tinymce.plugins.emoticons';\n var getEmoticonDatabase = function (editor) {\n return editor.getParam('emoticons_database', 'emojis', 'string');\n };\n var getEmoticonDatabaseUrl = function (editor, pluginUrl) {\n var database = getEmoticonDatabase(editor);\n return editor.getParam('emoticons_database_url', pluginUrl + '/js/' + database + editor.suffix + '.js', 'string');\n };\n var getEmoticonDatabaseId = function (editor) {\n return editor.getParam('emoticons_database_id', DEFAULT_ID, 'string');\n };\n var getAppendedEmoticons = function (editor) {\n return editor.getParam('emoticons_append', {}, 'object');\n };\n var getEmotionsImageUrl = function (editor) {\n return editor.getParam('emoticons_images_url', 'https://twemoji.maxcdn.com/v/13.0.1/72x72/', 'string');\n };\n\n var ALL_CATEGORY = 'All';\n var categoryNameMap = {\n symbols: 'Symbols',\n people: 'People',\n animals_and_nature: 'Animals and Nature',\n food_and_drink: 'Food and Drink',\n activity: 'Activity',\n travel_and_places: 'Travel and Places',\n objects: 'Objects',\n flags: 'Flags',\n user: 'User Defined'\n };\n var translateCategory = function (categories, name) {\n return has(categories, name) ? categories[name] : name;\n };\n var getUserDefinedEmoticons = function (editor) {\n var userDefinedEmoticons = getAppendedEmoticons(editor);\n return map(userDefinedEmoticons, function (value) {\n return __assign({\n keywords: [],\n category: 'user'\n }, value);\n });\n };\n var initDatabase = function (editor, databaseUrl, databaseId) {\n var categories = value();\n var all = value();\n var emojiImagesUrl = getEmotionsImageUrl(editor);\n var getEmoji = function (lib) {\n if (startsWith(lib.char, '= max;\n };\n });\n for (var i = 0; i < list.length; i++) {\n if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) {\n matches.push({\n value: list[i].char,\n text: list[i].title,\n icon: list[i].char\n });\n if (reachedLimit(matches.length)) {\n break;\n }\n }\n }\n return matches;\n };\n\n var patternName = 'pattern';\n var open = function (editor, database) {\n var initialState = {\n pattern: '',\n results: emojisFrom(database.listAll(), '', Optional.some(300))\n };\n var currentTab = Cell(ALL_CATEGORY);\n var scan = function (dialogApi) {\n var dialogData = dialogApi.getData();\n var category = currentTab.get();\n var candidates = database.listCategory(category);\n var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Optional.some(300) : Optional.none());\n dialogApi.setData({ results: results });\n };\n var updateFilter = last(function (dialogApi) {\n scan(dialogApi);\n }, 200);\n var searchField = {\n label: 'Search',\n type: 'input',\n name: patternName\n };\n var resultsField = {\n type: 'collection',\n name: 'results'\n };\n var getInitialState = function () {\n var body = {\n type: 'tabpanel',\n tabs: map$1(database.listCategories(), function (cat) {\n return {\n title: cat,\n name: cat,\n items: [\n searchField,\n resultsField\n ]\n };\n })\n };\n return {\n title: 'Emoticons',\n size: 'normal',\n body: body,\n initialData: initialState,\n onTabChange: function (dialogApi, details) {\n currentTab.set(details.newTabName);\n updateFilter.throttle(dialogApi);\n },\n onChange: updateFilter.throttle,\n onAction: function (dialogApi, actionData) {\n if (actionData.name === 'results') {\n insertEmoticon(editor, actionData.value);\n dialogApi.close();\n }\n },\n buttons: [{\n type: 'cancel',\n text: 'Close',\n primary: true\n }]\n };\n };\n var dialogApi = editor.windowManager.open(getInitialState());\n dialogApi.focus(patternName);\n if (!database.hasLoaded()) {\n dialogApi.block('Loading emoticons...');\n database.waitForLoad().then(function () {\n dialogApi.redial(getInitialState());\n updateFilter.throttle(dialogApi);\n dialogApi.focus(patternName);\n dialogApi.unblock();\n }).catch(function (_err) {\n dialogApi.redial({\n title: 'Emoticons',\n body: {\n type: 'panel',\n items: [{\n type: 'alertbanner',\n level: 'error',\n icon: 'warning',\n text: '

Could not load emoticons

'\n }]\n },\n buttons: [{\n type: 'cancel',\n text: 'Close',\n primary: true\n }],\n initialData: {\n pattern: '',\n results: []\n }\n });\n dialogApi.focus(patternName);\n dialogApi.unblock();\n });\n }\n };\n\n var register$1 = function (editor, database) {\n editor.addCommand('mceEmoticons', function () {\n return open(editor, database);\n });\n };\n\n var setup = function (editor) {\n editor.on('PreInit', function () {\n editor.parser.addAttributeFilter('data-emoticon', function (nodes) {\n each$1(nodes, function (node) {\n node.attr('data-mce-resize', 'false');\n node.attr('data-mce-placeholder', '1');\n });\n });\n });\n };\n\n var init = function (editor, database) {\n editor.ui.registry.addAutocompleter('emoticons', {\n ch: ':',\n columns: 'auto',\n minChars: 2,\n fetch: function (pattern, maxResults) {\n return database.waitForLoad().then(function () {\n var candidates = database.listAll();\n return emojisFrom(candidates, pattern, Optional.some(maxResults));\n });\n },\n onAction: function (autocompleteApi, rng, value) {\n editor.selection.setRng(rng);\n editor.insertContent(value);\n autocompleteApi.hide();\n }\n });\n };\n\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('mceEmoticons');\n };\n editor.ui.registry.addButton('emoticons', {\n tooltip: 'Emoticons',\n icon: 'emoji',\n onAction: onAction\n });\n editor.ui.registry.addMenuItem('emoticons', {\n text: 'Emoticons...',\n icon: 'emoji',\n onAction: onAction\n });\n };\n\n function Plugin () {\n global$3.add('emoticons', function (editor, pluginUrl) {\n var databaseUrl = getEmoticonDatabaseUrl(editor, pluginUrl);\n var databaseId = getEmoticonDatabaseId(editor);\n var database = initDatabase(editor, databaseUrl, databaseId);\n register$1(editor, database);\n register(editor);\n init(editor, database);\n setup(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/emoticons/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/fullscreen/index.js": /*!**************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/fullscreen/index.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"fullscreen\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/fullscreen')\n// ES2015:\n// import 'tinymce/plugins/fullscreen'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/fullscreen/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/fullscreen/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/fullscreen/plugin.js": /*!***************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/fullscreen/plugin.js ***! \***************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\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 return {\n get: get,\n set: set\n };\n };\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var get$5 = function (fullscreenState) {\n return {\n isFullscreen: function () {\n return fullscreenState.get() !== null;\n }\n };\n };\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType$1 = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var isString = isType$1('string');\n var isArray = isType$1('array');\n var isBoolean = isSimpleType('boolean');\n var isNullable = function (a) {\n return a === null || a === undefined;\n };\n var isNonNullable = function (a) {\n return !isNullable(a);\n };\n var isFunction = isSimpleType('function');\n var isNumber = isSimpleType('number');\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 compose1 = function (fbc, fab) {\n return function (a) {\n return fbc(fab(a));\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\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 singleton = function (doRevoke) {\n var subject = Cell(Optional.none());\n var revoke = function () {\n return subject.get().each(doRevoke);\n };\n var clear = function () {\n revoke();\n subject.set(Optional.none());\n };\n var isSet = function () {\n return subject.get().isSome();\n };\n var get = function () {\n return subject.get();\n };\n var set = function (s) {\n revoke();\n subject.set(Optional.some(s));\n };\n return {\n clear: clear,\n isSet: isSet,\n get: get,\n set: set\n };\n };\n var unbindable = function () {\n return singleton(function (s) {\n return s.unbind();\n });\n };\n var value = function () {\n var subject = singleton(noop);\n var on = function (f) {\n return subject.get().each(f);\n };\n return __assign(__assign({}, subject), { on: on });\n };\n\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$1 = 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$1 = 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 findUntil = function (xs, pred, until) {\n for (var i = 0, len = xs.length; i < len; i++) {\n var x = xs[i];\n if (pred(x, i)) {\n return Optional.some(x);\n } else if (until(x, i)) {\n break;\n }\n }\n return Optional.none();\n };\n var find$1 = function (xs, pred) {\n return findUntil(xs, pred, never);\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$3 = function (xs, f) {\n return flatten(map(xs, f));\n };\n var get$4 = function (xs, i) {\n return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();\n };\n var head = function (xs) {\n return get$4(xs, 0);\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 Optional.none();\n };\n\n var keys = Object.keys;\n var each = 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$1 = function (dom) {\n return dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n };\n\n var fromHtml = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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 || document;\n var node = doc.createElement(tag);\n return fromDom(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || 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: node };\n };\n var fromPoint = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n };\n var SugarElement = {\n fromHtml: fromHtml,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom,\n fromPoint: fromPoint\n };\n\n typeof window !== 'undefined' ? window : Function('return this;')();\n\n var DOCUMENT = 9;\n var DOCUMENT_FRAGMENT = 11;\n var ELEMENT = 1;\n var TEXT = 3;\n\n var type = function (element) {\n return element.dom.nodeType;\n };\n var isType = function (t) {\n return function (element) {\n return type(element) === t;\n };\n };\n var isElement = isType(ELEMENT);\n var isText = isType(TEXT);\n var isDocument = isType(DOCUMENT);\n var isDocumentFragment = isType(DOCUMENT_FRAGMENT);\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 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 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 = 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$2(group(1), group(2));\n };\n var detect$3 = function (versionRegexes, agent) {\n var cleanedAgent = String(agent).toLowerCase();\n if (versionRegexes.length === 0) {\n return unknown$2();\n }\n return find(versionRegexes, cleanedAgent);\n };\n var unknown$2 = function () {\n return nu$2(0, 0);\n };\n var nu$2 = function (major, minor) {\n return {\n major: major,\n minor: minor\n };\n };\n var Version = {\n nu: nu$2,\n detect: detect$3,\n unknown: unknown$2\n };\n\n var detectBrowser$1 = function (browsers, userAgentData) {\n return findMap(userAgentData.brands, function (uaBrand) {\n var lcBrand = uaBrand.brand.toLowerCase();\n return find$1(browsers, function (browser) {\n var _a;\n return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());\n }).map(function (info) {\n return {\n current: info.name,\n version: Version.nu(parseInt(uaBrand.version, 10), 0)\n };\n });\n });\n };\n\n var detect$2 = function (candidates, userAgent) {\n var agent = String(userAgent).toLowerCase();\n return find$1(candidates, function (candidate) {\n return candidate.search(agent);\n });\n };\n var detectBrowser = function (browsers, userAgent) {\n return detect$2(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$2(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\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 brand: 'Chromium',\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 edge = 'Edge';\n var chrome = 'Chrome';\n var ie = 'IE';\n var opera = 'Opera';\n var firefox = 'Firefox';\n var safari = 'Safari';\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 var isBrowser = function (name) {\n return function () {\n return current === name;\n };\n };\n return {\n current: current,\n version: version,\n isEdge: isBrowser(edge),\n isChrome: isBrowser(chrome),\n isIE: isBrowser(ie),\n isOpera: isBrowser(opera),\n isFirefox: isBrowser(firefox),\n isSafari: isBrowser(safari)\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 unknown = function () {\n return nu({\n current: undefined,\n version: Version.unknown()\n });\n };\n var nu = function (info) {\n var current = info.current;\n var version = info.version;\n var isOS = function (name) {\n return function () {\n return current === name;\n };\n };\n return {\n current: current,\n version: version,\n isWindows: isOS(windows),\n isiOS: isOS(ios),\n isAndroid: isOS(android),\n isOSX: isOS(osx),\n isLinux: isOS(linux),\n isSolaris: isOS(solaris),\n isFreeBSD: isOS(freebsd),\n isChromeOS: isOS(chromeos)\n };\n };\n var OperatingSystem = {\n unknown: unknown,\n nu: nu,\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 detect$1 = function (userAgent, userAgentDataOpt, mediaMatch) {\n var browsers = PlatformInfo.browsers();\n var oses = PlatformInfo.oses();\n var browser = userAgentDataOpt.bind(function (userAgentData) {\n return detectBrowser$1(browsers, userAgentData);\n }).orThunk(function () {\n return detectBrowser(browsers, userAgent);\n }).fold(Browser.unknown, Browser.nu);\n var os = 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$1 };\n\n var mediaMatch = function (query) {\n return window.matchMedia(query).matches;\n };\n var platform = cached(function () {\n return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch);\n });\n var detect = function () {\n return platform();\n };\n\n var is = function (element, selector) {\n var dom = element.dom;\n if (dom.nodeType !== ELEMENT) {\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 && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;\n };\n var all$1 = function (selector, scope) {\n var base = scope === undefined ? document : scope.dom;\n return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom);\n };\n\n var eq = function (e1, e2) {\n return e1.dom === e2.dom;\n };\n\n var owner = function (element) {\n return SugarElement.fromDom(element.dom.ownerDocument);\n };\n var documentOrOwner = function (dos) {\n return isDocument(dos) ? dos : owner(dos);\n };\n var parent = function (element) {\n return Optional.from(element.dom.parentNode).map(SugarElement.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 = SugarElement.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$2 = function (element) {\n var filterSelf = function (elements) {\n return filter$1(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, SugarElement.fromDom);\n };\n\n var isShadowRoot = function (dos) {\n return isDocumentFragment(dos) && isNonNullable(dos.dom.host);\n };\n var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);\n var isSupported = constant(supported);\n var getRootNode = supported ? function (e) {\n return SugarElement.fromDom(e.dom.getRootNode());\n } : documentOrOwner;\n var getShadowRoot = function (e) {\n var r = getRootNode(e);\n return isShadowRoot(r) ? Optional.some(r) : Optional.none();\n };\n var getShadowHost = function (e) {\n return SugarElement.fromDom(e.dom.host);\n };\n var getOriginalEventTarget = function (event) {\n if (isSupported() && isNonNullable(event.target)) {\n var el = SugarElement.fromDom(event.target);\n if (isElement(el) && isOpenShadowHost(el)) {\n if (event.composed && event.composedPath) {\n var composedPath = event.composedPath();\n if (composedPath) {\n return head(composedPath);\n }\n }\n }\n }\n return Optional.from(event.target);\n };\n var isOpenShadowHost = function (element) {\n return isNonNullable(element.dom.shadowRoot);\n };\n\n var inBody = function (element) {\n var dom = isText(element) ? element.dom.parentNode : element.dom;\n if (dom === undefined || dom === null || dom.ownerDocument === null) {\n return false;\n }\n var doc = dom.ownerDocument;\n return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {\n return doc.body.contains(dom);\n }, compose1(inBody, getShadowHost));\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 SugarElement.fromDom(b);\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 console.error('Invalid call to Attribute.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$3 = 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 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$1(dom)) {\n dom.style.setProperty(property, value);\n }\n };\n var setAll = function (element, css) {\n var dom = element.dom;\n each(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 = window.getComputedStyle(dom);\n var r = styles.getPropertyValue(property);\n return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n };\n var getUnsafeProperty = function (dom, property) {\n return isSupported$1(dom) ? dom.style.getPropertyValue(property) : '';\n };\n\n var mkEvent = function (target, x, y, stop, prevent, kill, raw) {\n return {\n target: target,\n x: x,\n y: y,\n stop: stop,\n prevent: prevent,\n kill: kill,\n raw: raw\n };\n };\n var fromRawEvent = function (rawEvent) {\n var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));\n var stop = function () {\n return rawEvent.stopPropagation();\n };\n var prevent = function () {\n return 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 handler(fromRawEvent(rawEvent));\n }\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 unbind = function (element, event, handler, useCapture) {\n element.dom.removeEventListener(event, handler, useCapture);\n };\n\n var filter = always;\n var bind$1 = function (element, event, handler) {\n return bind$2(element, event, filter, handler);\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: left,\n top: top,\n translate: translate\n };\n };\n var SugarPosition = r;\n\n var get$1 = function (_DOC) {\n var doc = _DOC !== undefined ? _DOC.dom : document;\n var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n var y = doc.body.scrollTop || doc.documentElement.scrollTop;\n return SugarPosition(x, y);\n };\n\n var get = function (_win) {\n var win = _win === undefined ? window : _win;\n if (detect().browser.isFirefox()) {\n return Optional.none();\n } else {\n return Optional.from(win['visualViewport']);\n }\n };\n var bounds = function (x, y, width, height) {\n return {\n x: x,\n y: y,\n width: width,\n height: height,\n right: x + width,\n bottom: y + height\n };\n };\n var getBounds = function (_win) {\n var win = _win === undefined ? window : _win;\n var doc = win.document;\n var scroll = get$1(SugarElement.fromDom(doc));\n return get(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 = function (name, callback, _win) {\n return get(_win).map(function (visualViewport) {\n var handler = function (e) {\n return callback(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$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.Env');\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var fireFullscreenStateChanged = function (editor, state) {\n editor.fire('FullscreenStateChanged', { state: state });\n editor.fire('ResizeEditor');\n };\n\n var getFullscreenNative = function (editor) {\n return editor.getParam('fullscreen_native', false, 'boolean');\n };\n\n var getFullscreenRoot = function (editor) {\n var elem = SugarElement.fromDom(editor.getElement());\n return getShadowRoot(elem).map(getShadowHost).getOrThunk(function () {\n return getBody(owner(elem));\n });\n };\n var getFullscreenElement = function (root) {\n if (root.fullscreenElement !== undefined) {\n return root.fullscreenElement;\n } else if (root.msFullscreenElement !== undefined) {\n return root.msFullscreenElement;\n } else if (root.webkitFullscreenElement !== undefined) {\n return root.webkitFullscreenElement;\n } else {\n return null;\n }\n };\n var getFullscreenchangeEventName = function () {\n if (document.fullscreenElement !== undefined) {\n return 'fullscreenchange';\n } else if (document.msFullscreenElement !== undefined) {\n return 'MSFullscreenChange';\n } else if (document.webkitFullscreenElement !== undefined) {\n return 'webkitfullscreenchange';\n } else {\n return 'fullscreenchange';\n }\n };\n var requestFullscreen = function (sugarElem) {\n var elem = sugarElem.dom;\n if (elem.requestFullscreen) {\n elem.requestFullscreen();\n } else if (elem.msRequestFullscreen) {\n elem.msRequestFullscreen();\n } else if (elem.webkitRequestFullScreen) {\n elem.webkitRequestFullScreen();\n }\n };\n var exitFullscreen = function (sugarDoc) {\n var doc = sugarDoc.dom;\n if (doc.exitFullscreen) {\n doc.exitFullscreen();\n } else if (doc.msExitFullscreen) {\n doc.msExitFullscreen();\n } else if (doc.webkitCancelFullScreen) {\n doc.webkitCancelFullScreen();\n }\n };\n var isFullscreenElement = function (elem) {\n return elem.dom === getFullscreenElement(owner(elem).dom);\n };\n\n var ancestors$1 = function (scope, predicate, isRoot) {\n return filter$1(parents(scope, isRoot), predicate);\n };\n var siblings$1 = function (scope, predicate) {\n return filter$1(siblings$2(scope), predicate);\n };\n\n var all = function (selector) {\n return all$1(selector);\n };\n var ancestors = function (scope, selector, isRoot) {\n return ancestors$1(scope, function (e) {\n return is(e, selector);\n }, isRoot);\n };\n var siblings = 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$1.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 gatherSiblings = function (element) {\n return siblings(element, '*:not(.tox-silver-sink)');\n };\n var clobber = function (clobberStyle) {\n return function (element) {\n var styles = get$3(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$1 = ancestors(container, '*');\n var siblings$1 = bind$3(ancestors$1, gatherSiblings);\n var bgColor = matchColor(editorBody);\n each$1(siblings$1, clobber(siblingStyles));\n each$1(ancestors$1, 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('[' + attr + ']');\n each$1(clobberedEls, function (element) {\n var restore = get$3(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\n var DOM = global$2.DOM;\n var getScrollPos = function () {\n return getBounds(window);\n };\n var setScrollPos = function (pos) {\n return window.scrollTo(pos.x, pos.y);\n };\n var viewportUpdate = get().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 document.body.scrollTop = 0;\n document.documentElement.scrollTop = 0;\n };\n var refreshVisualViewport = function () {\n 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.throttle(function () {\n refreshScroll();\n refreshVisualViewport();\n }, 50);\n var bind$1 = function (element) {\n editorContainer.set(element);\n update();\n resizeBinder.set(bind('resize', update));\n scrollBinder.set(bind('scroll', update));\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$1,\n unbind: unbind\n };\n });\n var toggleFullscreen = function (editor, fullscreenState) {\n var body = document.body;\n var documentElement = document.documentElement;\n var editorContainer = editor.getContainer();\n var editorContainerS = SugarElement.fromDom(editorContainer);\n var fullscreenRoot = getFullscreenRoot(editor);\n var fullscreenInfo = fullscreenState.get();\n var editorBody = SugarElement.fromDom(editor.getBody());\n var isTouch = global$1.deviceType.isTouch();\n var editorContainerStyle = editorContainer.style;\n var iframe = editor.iframeElement;\n var iframeStyle = iframe.style;\n var handleClasses = function (handler) {\n handler(body, 'tox-fullscreen');\n handler(documentElement, 'tox-fullscreen');\n handler(editorContainer, 'tox-fullscreen');\n getShadowRoot(editorContainerS).map(function (root) {\n return getShadowHost(root).dom;\n }).each(function (host) {\n handler(host, 'tox-fullscreen');\n handler(host, 'tox-shadowhost');\n });\n };\n var cleanup = function () {\n if (isTouch) {\n restoreStyles(editor.dom);\n }\n handleClasses(DOM.removeClass);\n viewportUpdate.unbind();\n Optional.from(fullscreenState.get()).each(function (info) {\n return info.fullscreenChangeHandler.unbind();\n });\n };\n if (!fullscreenInfo) {\n var fullscreenChangeHandler = bind$1(owner(fullscreenRoot), getFullscreenchangeEventName(), function (_evt) {\n if (getFullscreenNative(editor)) {\n if (!isFullscreenElement(fullscreenRoot) && fullscreenState.get() !== null) {\n toggleFullscreen(editor, fullscreenState);\n }\n }\n });\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 fullscreenChangeHandler: fullscreenChangeHandler\n };\n if (isTouch) {\n clobberStyles(editor.dom, editorContainerS, editorBody);\n }\n iframeStyle.width = iframeStyle.height = '100%';\n editorContainerStyle.width = editorContainerStyle.height = '';\n handleClasses(DOM.addClass);\n viewportUpdate.bind(editorContainerS);\n editor.on('remove', cleanup);\n fullscreenState.set(newFullScreenInfo);\n if (getFullscreenNative(editor)) {\n requestFullscreen(fullscreenRoot);\n }\n fireFullscreenStateChanged(editor, true);\n } else {\n fullscreenInfo.fullscreenChangeHandler.unbind();\n if (getFullscreenNative(editor) && isFullscreenElement(fullscreenRoot)) {\n exitFullscreen(owner(fullscreenRoot));\n }\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 cleanup();\n setScrollPos(fullscreenInfo.scrollPos);\n fullscreenState.set(null);\n fireFullscreenStateChanged(editor, false);\n editor.off('remove', cleanup);\n }\n };\n\n var register$1 = function (editor, fullscreenState) {\n editor.addCommand('mceFullScreen', function () {\n toggleFullscreen(editor, fullscreenState);\n });\n };\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 = function (editor, fullscreenState) {\n var onAction = function () {\n return editor.execCommand('mceFullScreen');\n };\n editor.ui.registry.addToggleMenuItem('fullscreen', {\n text: 'Fullscreen',\n icon: 'fullscreen',\n shortcut: 'Meta+Shift+F',\n onAction: onAction,\n onSetup: makeSetupHandler(editor, fullscreenState)\n });\n editor.ui.registry.addToggleButton('fullscreen', {\n tooltip: 'Fullscreen',\n icon: 'fullscreen',\n onAction: onAction,\n onSetup: makeSetupHandler(editor, fullscreenState)\n });\n };\n\n function Plugin () {\n global$3.add('fullscreen', function (editor) {\n var fullscreenState = Cell(null);\n if (editor.inline) {\n return get$5(fullscreenState);\n }\n register$1(editor, fullscreenState);\n register(editor, fullscreenState);\n editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen');\n return get$5(fullscreenState);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/fullscreen/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/hr/index.js": /*!******************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/hr/index.js ***! \******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"hr\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/hr')\n// ES2015:\n// import 'tinymce/plugins/hr'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/hr/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/hr/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/hr/plugin.js": /*!*******************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/hr/plugin.js ***! \*******************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var register$1 = function (editor) {\n editor.addCommand('InsertHorizontalRule', function () {\n editor.execCommand('mceInsertContent', false, '
');\n });\n };\n\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('InsertHorizontalRule');\n };\n editor.ui.registry.addButton('hr', {\n icon: 'horizontal-rule',\n tooltip: 'Horizontal line',\n onAction: onAction\n });\n editor.ui.registry.addMenuItem('hr', {\n icon: 'horizontal-rule',\n text: 'Horizontal line',\n onAction: onAction\n });\n };\n\n function Plugin () {\n global.add('hr', function (editor) {\n register$1(editor);\n register(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/hr/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/image/index.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/image/index.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"image\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/image')\n// ES2015:\n// import 'tinymce/plugins/image'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/image/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/image/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/image/plugin.js": /*!**********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/image/plugin.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$6 = 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 typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var eq = function (t) {\n return function (a) {\n return t === a;\n };\n };\n var isString = isType('string');\n var isObject = isType('object');\n var isArray = isType('array');\n var isNull = eq(null);\n var isBoolean = isSimpleType('boolean');\n var isNullable = function (a) {\n return a === null || a === undefined;\n };\n var isNonNullable = function (a) {\n return !isNullable(a);\n };\n var isFunction = isSimpleType('function');\n var isNumber = isSimpleType('number');\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\n\n var keys = Object.keys;\n var hasOwnProperty = Object.hasOwnProperty;\n var each = 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 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(obj, function (x, i) {\n (pred(x, i) ? onTrue : onFalse)(x, i);\n });\n return r;\n };\n var filter = function (obj, pred) {\n var t = {};\n internalFilter(obj, pred, objAcc(t), noop);\n return t;\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 nativePush = Array.prototype.push;\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 get = function (xs, i) {\n return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();\n };\n var head = function (xs) {\n return get(xs, 0);\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 Optional.none();\n };\n\n typeof window !== 'undefined' ? 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 console.error('Invalid call to Attribute.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 remove = function (element, key) {\n element.dom.removeAttribute(key);\n };\n\n var fromHtml = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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 || document;\n var node = doc.createElement(tag);\n return fromDom(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || 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: node };\n };\n var fromPoint = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n };\n var SugarElement = {\n fromHtml: fromHtml,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom,\n fromPoint: fromPoint\n };\n\n var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n var global$4 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.util.URI');\n\n var global$2 = 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 isNonNullable(editor.getParam('images_upload_url'));\n };\n var hasUploadHandler = function (editor) {\n return isNonNullable(editor.getParam('images_upload_handler'));\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\n var parseIntAndGetMax = function (val1, val2) {\n return Math.max(parseInt(val1, 10), parseInt(val2, 10));\n };\n var getImageSize = function (url) {\n return new global$4(function (callback) {\n var img = document.createElement('img');\n var done = function (dimensions) {\n img.onload = img.onerror = null;\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(global$4.resolve(dimensions));\n };\n img.onerror = function () {\n done(global$4.reject('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 document.body.appendChild(img);\n img.src = url;\n });\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 = getImageList(editor);\n if (isString(imageList)) {\n global$2.send({\n url: imageList,\n success: function (text) {\n callback(JSON.parse(text));\n }\n });\n } else if (isFunction(imageList)) {\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 && 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$4(function (resolve, reject) {\n var reader = new 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 isSafeImageUrl = function (editor, src) {\n return global$3.isDomSafe(src, 'img', editor.settings);\n };\n\n var DOM = global$5.DOM;\n var getHspace = function (image) {\n if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) {\n return 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 removePixelSuffix(image.style.marginTop);\n } else {\n return '';\n }\n };\n var getBorder = function (image) {\n if (image.style.borderWidth) {\n return 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 updateAttrib = function (image, name, value) {\n if (value === '') {\n image.removeAttribute(name);\n } else {\n image.setAttribute(name, value);\n }\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] = addPixelSuffix(value);\n normalizeStyle(image, normalizeCss);\n } else {\n updateAttrib(image, name, value);\n }\n };\n };\n var getSize = function (image, name) {\n if (image.style[name]) {\n return removePixelSuffix(image.style[name]);\n } else {\n return getAttrib(image, name);\n }\n };\n var setHspace = function (image, value) {\n var pxValue = addPixelSuffix(value);\n image.style.marginLeft = pxValue;\n image.style.marginRight = pxValue;\n };\n var setVspace = function (image, value) {\n var pxValue = addPixelSuffix(value);\n image.style.marginTop = pxValue;\n image.style.marginBottom = pxValue;\n };\n var setBorder = function (image, value) {\n var pxValue = 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 = document.createElement('img');\n updateAttrib(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) {\n var image = document.createElement('img');\n write(normalizeCss, __assign(__assign({}, data), { caption: false }), image);\n setAlt(image, data.alt, data.isDecorative);\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) {\n if (isDecorative) {\n DOM.setAttrib(image, 'role', 'presentation');\n var sugarImage = SugarElement.fromDom(image);\n set(sugarImage, 'alt', '');\n } else {\n if (isNull(alt)) {\n var sugarImage = SugarElement.fromDom(image);\n remove(sugarImage, 'alt');\n } else {\n var sugarImage = SugarElement.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) {\n if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) {\n setAlt(image, newData.alt, newData.isDecorative);\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) {\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', updateAttrib);\n updateProp(image, oldData, newData, 'title', updateAttrib);\n updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss));\n updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss));\n updateProp(image, oldData, newData, 'class', updateAttrib);\n updateProp(image, oldData, newData, 'style', normalized(function (image, value) {\n return updateAttrib(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);\n };\n\n var normalizeCss$1 = function (editor, cssText) {\n var css = editor.dom.styles.parse(cssText);\n var mergedCss = 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' || isPlaceholderImage(imgElm))) {\n return null;\n }\n return imgElm;\n };\n var splitTextBlock = function (editor, figure) {\n var dom = editor.dom;\n var textBlockElements = filter(editor.schema.getTextBlockElements(), function (_, parentElm) {\n return !editor.schema.isValidChild(parentElm, 'figure');\n });\n var textBlock = dom.getParent(figure.parentNode, function (node) {\n return hasNonNullableKey(textBlockElements, 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$1(editor, css);\n }, image) : defaultData();\n };\n var insertImageAtCaret = function (editor, data) {\n var elm = create(function (css) {\n return normalizeCss$1(editor, css);\n }, data);\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) {\n var image = getSelectedImage(editor);\n write(function (css) {\n return normalizeCss$1(editor, css);\n }, data, image);\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 waitLoadImage(editor, data, image);\n }\n };\n var sanitizeImageData = function (editor, data) {\n var src = data.src;\n return __assign(__assign({}, data), { src: isSafeImageUrl(editor, src) ? src : '' });\n };\n var insertOrUpdateImage = function (editor, partialData) {\n var image = getSelectedImage(editor);\n if (image) {\n var selectedImageData = read(function (css) {\n return normalizeCss$1(editor, css);\n }, image);\n var data = __assign(__assign({}, selectedImageData), partialData);\n var sanitizedData = sanitizeImageData(editor, data);\n if (data.src) {\n writeImageDataToSelection(editor, sanitizedData);\n } else {\n deleteImage(editor, image);\n }\n } else if (partialData.src) {\n insertImageAtCaret(editor, __assign(__assign({}, defaultData()), partialData));\n }\n };\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 = [];\n for (var _i = 0; _i < arguments.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 (has(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 isNotEmpty = function (s) {\n return s.length > 0;\n };\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.util.ImageUploader');\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var getValue = function (item) {\n return isString(item.value) ? item.value : '';\n };\n var getText = function (item) {\n if (isString(item.text)) {\n return item.text;\n } else if (isString(item.title)) {\n return item.title;\n } else {\n return '';\n }\n };\n var sanitizeList = function (list, extractValue) {\n var out = [];\n global.each(list, function (item) {\n var text = getText(item);\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 (extractor) {\n if (extractor === void 0) {\n extractor = getValue;\n }\n return function (list) {\n if (list) {\n return Optional.from(list).map(function (list) {\n return sanitizeList(list, extractor);\n });\n } else {\n return Optional.none();\n }\n };\n };\n var sanitize = function (list) {\n return sanitizer(getValue)(list);\n };\n var isGroup = function (item) {\n return has(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 Optional.some(item);\n } else {\n return Optional.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 makeTab$2 = 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: 'listbox',\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$2 };\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 = new global$4(function (completer) {\n 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(getClassList(editor));\n var hasAdvTab$1 = hasAdvTab(editor);\n var hasUploadTab$1 = hasUploadTab(editor);\n var hasUploadUrl$1 = hasUploadUrl(editor);\n var hasUploadHandler$1 = hasUploadHandler(editor);\n var image = readImageDataFromSelection(editor);\n var hasDescription$1 = hasDescription(editor);\n var hasImageTitle$1 = hasImageTitle(editor);\n var hasDimensions$1 = hasDimensions(editor);\n var hasImageCaption$1 = hasImageCaption(editor);\n var hasAccessibilityOptions = showAccessibilityOptions(editor);\n var automaticUploads = isAutomaticUploadsEnabled(editor);\n var prependURL = Optional.some(getPrependUrl(editor)).filter(function (preUrl) {\n return isString(preUrl) && preUrl.length > 0;\n });\n return futureImageList.then(function (imageList) {\n return {\n image: image,\n imageList: imageList,\n classList: classList,\n hasAdvTab: hasAdvTab$1,\n hasUploadTab: hasUploadTab$1,\n hasUploadUrl: hasUploadUrl$1,\n hasUploadHandler: hasUploadHandler$1,\n hasDescription: hasDescription$1,\n hasImageTitle: hasImageTitle$1,\n hasDimensions: hasDimensions$1,\n hasImageCaption: hasImageCaption$1,\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: 'listbox',\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: 'listbox',\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 var getDialogContainerType = function (useColumns) {\n return useColumns ? {\n type: 'grid',\n columns: 2\n } : { type: 'panel' };\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 [__assign(__assign({}, getDialogContainerType(info.classList.isSome() && info.hasImageCaption)), {\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 = 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 };\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, removeEmptyAlt) {\n return {\n src: data.src.value,\n alt: data.alt.length === 0 && removeEmptyAlt ? null : 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 Optional.some(prependUrl + srcURL);\n }\n return Optional.none();\n });\n }\n return Optional.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 if (isNotEmpty(url)) {\n helpers.imageSize(url).then(function (size) {\n if (state.open) {\n api.setData({ dimensions: size });\n }\n }).catch(function (e) {\n return console.error(e);\n });\n } else {\n api.setData({\n dimensions: {\n width: '',\n height: ''\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 ? 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 ? removePixelSuffix(String(css['margin-right'])) : '';\n };\n var calcBorderWidth = function (css) {\n return css['border-width'] ? 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 = 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, false));\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 = URL.createObjectURL(file);\n var finalize = function () {\n api.unblock();\n 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 blobToDataUri(file).then(function (dataUrl) {\n var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl);\n if (info.automaticUploads) {\n helpers.uploadImage(blobInfo).then(function (result) {\n updateSrcAndSwitchTab(result.url);\n finalize();\n }).catch(function (err) {\n finalize();\n helpers.alertErr(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.execCommand('mceUpdateImage', false, toImageData(data, info.hasAccessibilityOptions));\n editor.editorUpload.uploadImagesAuto();\n api.close();\n };\n };\n };\n var imageSize = function (editor) {\n return function (url) {\n if (!isSafeImageUrl(editor, url)) {\n return global$4.resolve({\n width: '',\n height: ''\n });\n } else {\n return getImageSize(editor.documentBaseURI.toAbsolute(url)).then(function (dimensions) {\n return {\n width: String(dimensions.width),\n height: String(dimensions.height)\n };\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 filename: file.name,\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 (message) {\n editor.windowManager.alert(message);\n };\n };\n var normalizeCss = function (editor) {\n return function (cssText) {\n return normalizeCss$1(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 uploadImage = function (editor) {\n return function (blobInfo) {\n return global$1(editor).upload([blobInfo], false).then(function (results) {\n if (results.length === 0) {\n return global$4.reject('Failed to upload image');\n } else if (results[0].status === false) {\n return global$4.reject(results[0].error.message);\n } else {\n return results[0];\n }\n });\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(editor),\n parseStyle: parseStyle(editor),\n serializeStyle: serializeStyle(editor),\n uploadImage: uploadImage(editor)\n };\n var open = function () {\n collect(editor).then(makeDialog(helpers)).then(editor.windowManager.open);\n };\n return { open: open };\n };\n\n var register$1 = function (editor) {\n editor.addCommand('mceImage', Dialog(editor).open);\n editor.addCommand('mceUpdateImage', function (_ui, data) {\n editor.undoManager.transact(function () {\n return insertOrUpdateImage(editor, data);\n });\n });\n };\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.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\n var register = 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 buttonApi.setActive(isNonNullable(getSelectedImage(editor)));\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) && !isPlaceholderImage(element) ? ['image'] : [];\n }\n });\n };\n\n function Plugin () {\n global$6.add('image', function (editor) {\n setup(editor);\n register(editor);\n register$1(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/image/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/imagetools/index.js": /*!**************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/imagetools/index.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"imagetools\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/imagetools')\n// ES2015:\n// import 'tinymce/plugins/imagetools'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/imagetools/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/imagetools/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/imagetools/plugin.js": /*!***************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/imagetools/plugin.js ***! \***************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("/* WEBPACK VAR INJECTION */(function(global) {/**\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.10.9 (2023-11-15)\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 return {\n get: get,\n set: set\n };\n };\n\n var global$5 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var isArray = isType('array');\n var isNullable = function (a) {\n return a === null || a === undefined;\n };\n var isNonNullable = function (a) {\n return !isNullable(a);\n };\n var isFunction = isSimpleType('function');\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\n\n var exports$1 = {}, module = { exports: exports$1 };\n (function (define, exports, module, require) {\n (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EphoxContactWrapper = factory());\n }(this, function () {\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n var promise = { exports: {} };\n (function (module) {\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 (module.exports) {\n module.exports = Promise;\n } else if (!root.Promise) {\n root.Promise = Promise;\n }\n }(commonjsGlobal));\n }(promise));\n var promisePolyfill = promise.exports;\n var Global = function () {\n if (typeof window !== 'undefined') {\n return window;\n } else {\n return Function('return this;')();\n }\n }();\n var promisePolyfill_1 = { boltExport: Global.Promise || promisePolyfill };\n return promisePolyfill_1;\n }));\n }(undefined, exports$1, module));\n var Promise$1 = module.exports.boltExport;\n\n var create$1 = function (width, height) {\n return resize(document.createElement('canvas'), width, height);\n };\n var clone = function (canvas) {\n var tCanvas = create$1(canvas.width, canvas.height);\n var ctx = get2dContext(tCanvas);\n ctx.drawImage(canvas, 0, 0);\n return tCanvas;\n };\n var get2dContext = function (canvas) {\n return canvas.getContext('2d');\n };\n var resize = function (canvas, width, height) {\n canvas.width = width;\n canvas.height = height;\n return canvas;\n };\n\n var getWidth = function (image) {\n return image.naturalWidth || image.width;\n };\n var getHeight = function (image) {\n return image.naturalHeight || image.height;\n };\n\n var imageToBlob$2 = function (image) {\n var src = image.src;\n if (src.indexOf('data:') === 0) {\n return dataUriToBlob(src);\n }\n return anyUriToBlob(src);\n };\n var blobToImage$1 = function (blob) {\n return new Promise$1(function (resolve, reject) {\n var blobUrl = URL.createObjectURL(blob);\n var image = new Image();\n var removeListeners = function () {\n image.removeEventListener('load', loaded);\n image.removeEventListener('error', error);\n };\n var loaded = function () {\n removeListeners();\n resolve(image);\n };\n var error = function () {\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 setTimeout(loaded, 0);\n }\n });\n };\n var anyUriToBlob = function (url) {\n return new Promise$1(function (resolve, reject) {\n var xhr = new 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 var dataUriToBlobSync = function (uri) {\n var data = uri.split(',');\n var matches = /data:([^;]+)/.exec(data[0]);\n if (!matches) {\n return Optional.none();\n }\n var mimetype = matches[1];\n var base64 = data[1];\n var sliceSize = 1024;\n var byteCharacters = 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 Optional.some(new Blob(byteArrays, { type: mimetype }));\n };\n var dataUriToBlob = function (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 var canvasToBlob = function (canvas, type, quality) {\n type = type || 'image/png';\n if (isFunction(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 var canvasToDataURL = function (canvas, type, quality) {\n type = type || 'image/png';\n return canvas.toDataURL(type, quality);\n };\n var blobToCanvas = function (blob) {\n return blobToImage$1(blob).then(function (image) {\n revokeImageUrl(image);\n var canvas = create$1(getWidth(image), getHeight(image));\n var context = get2dContext(canvas);\n context.drawImage(image, 0, 0);\n return canvas;\n });\n };\n var blobToDataUri = function (blob) {\n return new Promise$1(function (resolve) {\n var reader = new FileReader();\n reader.onloadend = function () {\n resolve(reader.result);\n };\n reader.readAsDataURL(blob);\n });\n };\n var revokeImageUrl = function (image) {\n URL.revokeObjectURL(image.src);\n };\n\n var blobToImage = function (blob) {\n return blobToImage$1(blob);\n };\n var imageToBlob$1 = function (image) {\n return imageToBlob$2(image);\n };\n\n var nativeIndexOf = Array.prototype.indexOf;\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 each$1 = 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$1(xs, function (x, i) {\n acc = f(acc, x, i);\n });\n return acc;\n };\n var findUntil = function (xs, pred, until) {\n for (var i = 0, len = xs.length; i < len; i++) {\n var x = xs[i];\n if (pred(x, i)) {\n return Optional.some(x);\n } else if (until(x, i)) {\n break;\n }\n }\n return Optional.none();\n };\n var find = function (xs, pred) {\n return findUntil(xs, pred, never);\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\n var keys = Object.keys;\n var each = 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 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$1(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 args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var argLength = args.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 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 var foldArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n foldArgs[_i] = arguments[_i];\n }\n if (foldArgs.length !== cases.length) {\n throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);\n }\n var target = foldArgs[count];\n return target.apply(null, args);\n },\n match: match,\n log: function (label) {\n 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 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\n var create = function (getCanvas, blob, uri) {\n var initialType = blob.type;\n var getType = constant(initialType);\n var toBlob = function () {\n return Promise$1.resolve(blob);\n };\n var toDataURL = constant(uri);\n var toBase64 = function () {\n return uri.split(',')[1];\n };\n var toAdjustedBlob = function (type, quality) {\n return getCanvas.then(function (canvas) {\n return canvasToBlob(canvas, type, quality);\n });\n };\n var toAdjustedDataURL = function (type, quality) {\n return getCanvas.then(function (canvas) {\n return canvasToDataURL(canvas, type, quality);\n });\n };\n var toAdjustedBase64 = function (type, quality) {\n return toAdjustedDataURL(type, quality).then(function (dataurl) {\n return dataurl.split(',')[1];\n });\n };\n var toCanvas = function () {\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 var fromBlob = function (blob) {\n return blobToDataUri(blob).then(function (uri) {\n return create(blobToCanvas(blob), blob, uri);\n });\n };\n var fromCanvas = function (canvas, type) {\n return canvasToBlob(canvas, type).then(function (blob) {\n return create(Promise$1.resolve(canvas), blob, canvas.toDataURL());\n });\n };\n\n var ceilWithPrecision = function (num, precision) {\n if (precision === void 0) {\n precision = 2;\n }\n var mul = Math.pow(10, precision);\n var upper = Math.round(num * mul);\n return Math.ceil(upper / mul);\n };\n var rotate$2 = function (ir, angle) {\n return ir.toCanvas().then(function (canvas) {\n return applyRotate(canvas, ir.getType(), angle);\n });\n };\n var applyRotate = function (image, type, angle) {\n var degrees = angle < 0 ? 360 + angle : angle;\n var rad = degrees * Math.PI / 180;\n var width = image.width;\n var height = image.height;\n var sin = Math.sin(rad);\n var cos = Math.cos(rad);\n var newWidth = ceilWithPrecision(Math.abs(width * cos) + Math.abs(height * sin));\n var newHeight = ceilWithPrecision(Math.abs(width * sin) + Math.abs(height * cos));\n var canvas = create$1(newWidth, newHeight);\n var context = get2dContext(canvas);\n context.translate(newWidth / 2, newHeight / 2);\n context.rotate(rad);\n context.drawImage(image, -width / 2, -height / 2);\n return fromCanvas(canvas, type);\n };\n var flip$2 = function (ir, axis) {\n return ir.toCanvas().then(function (canvas) {\n return applyFlip(canvas, ir.getType(), axis);\n });\n };\n var applyFlip = function (image, type, axis) {\n var canvas = create$1(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$2(ir, axis);\n };\n var rotate$1 = function (ir, angle) {\n return rotate$2(ir, angle);\n };\n\n var sendRequest = function (url, headers, withCredentials) {\n if (withCredentials === void 0) {\n withCredentials = false;\n }\n return new Promise$1(function (resolve) {\n var xhr = new XMLHttpRequest();\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n resolve({\n status: xhr.status,\n blob: xhr.response\n });\n }\n };\n xhr.open('GET', url, true);\n xhr.withCredentials = withCredentials;\n each(headers, function (value, key) {\n xhr.setRequestHeader(key, value);\n });\n xhr.responseType = 'blob';\n xhr.send();\n });\n };\n var readBlobText = function (blob) {\n return new Promise$1(function (resolve, reject) {\n var reader = new FileReader();\n reader.onload = function () {\n resolve(reader.result);\n };\n reader.onerror = function (e) {\n reject(e);\n };\n reader.readAsText(blob);\n });\n };\n var parseJson = function (text) {\n try {\n return Optional.some(JSON.parse(text));\n } catch (ex) {\n return Optional.none();\n }\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: 'not_found',\n message: 'Failed to load image.'\n },\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 traverseJson = function (json, path) {\n var value = foldl(path, function (result, key) {\n return isNonNullable(result) ? result[key] : undefined;\n }, json);\n return Optional.from(value);\n };\n var isServiceErrorCode = function (code, blob) {\n return (blob === null || blob === void 0 ? void 0 : blob.type) === 'application/json' && (code === 400 || code === 403 || code === 404 || 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 Promise$1.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 = parseJson(text);\n var errorMsg = serviceError.bind(function (err) {\n return traverseJson(err, [\n 'error',\n 'type'\n ]).map(getServiceErrorMsg);\n }).getOr('Invalid JSON in service error message');\n return 'ImageProxy Service error: ' + errorMsg;\n };\n var handleServiceError = function (blob) {\n return readBlobText(blob).then(function (text) {\n var serviceError = getServiceError(text);\n return Promise$1.reject(serviceError);\n });\n };\n var handleServiceErrorResponse = function (status, blob) {\n return isServiceErrorCode(status, blob) ? handleServiceError(blob) : handleHttpError(status);\n };\n\n var appendApiKey = function (url, apiKey) {\n var separator = url.indexOf('?') === -1 ? '?' : '&';\n if (/[?&]apiKey=/.test(url)) {\n return url;\n } else {\n return url + separator + 'apiKey=' + encodeURIComponent(apiKey);\n }\n };\n var isError = function (status) {\n return status < 200 || status >= 300;\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 sendRequest(appendApiKey(url, apiKey), headers).then(function (result) {\n return isError(result.status) ? handleServiceErrorResponse(result.status, result.blob) : Promise$1.resolve(result.blob);\n });\n };\n var requestBlob = function (url, withCredentials) {\n return sendRequest(url, {}, withCredentials).then(function (result) {\n return isError(result.status) ? handleHttpError(result.status) : Promise$1.resolve(result.blob);\n });\n };\n var getUrl = function (url, apiKey, withCredentials) {\n if (withCredentials === void 0) {\n withCredentials = false;\n }\n return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url, withCredentials);\n };\n\n var blobToImageResult = function (blob) {\n return fromBlob(blob);\n };\n\n var ELEMENT = 1;\n\n var fromHtml = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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 || document;\n var node = doc.createElement(tag);\n return fromDom(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || 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: node };\n };\n var fromPoint = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n };\n var SugarElement = {\n fromHtml: fromHtml,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom,\n fromPoint: fromPoint\n };\n\n var is = function (element, selector) {\n var dom = element.dom;\n if (dom.nodeType !== ELEMENT) {\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 typeof window !== 'undefined' ? window : Function('return this;')();\n\n var child$1 = function (scope, predicate) {\n var pred = function (node) {\n return predicate(SugarElement.fromDom(node));\n };\n var result = find(scope.dom.childNodes, pred);\n return result.map(SugarElement.fromDom);\n };\n\n var child = function (scope, selector) {\n return child$1(scope, function (e) {\n return is(e, selector);\n });\n };\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n var global$1 = 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 Optional.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 var getImageSize = function (img) {\n var width, height;\n var isPxValue = function (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 var setImageSize = function (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', String(size.w));\n img.setAttribute('height', String(size.h));\n }\n }\n };\n var getNaturalImageSize = function (img) {\n return {\n w: img.naturalWidth,\n h: img.naturalHeight\n };\n };\n\n var count = 0;\n var getFigureImg = function (elem) {\n return child(SugarElement.fromDom(elem), 'img');\n };\n var isFigure = function (editor, elem) {\n return editor.dom.is(elem, 'figure');\n };\n var isImage = function (editor, imgNode) {\n return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])');\n };\n var getEditableImage = function (editor, node) {\n var isEditable = function (imgNode) {\n return isImage(editor, imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || isNonNullable(getProxyUrl(editor)));\n };\n if (isFigure(editor, node)) {\n return getFigureImg(node).bind(function (img) {\n return isEditable(img.dom) ? Optional.some(img.dom) : Optional.none();\n });\n } else {\n return isEditable(node) ? Optional.some(node) : Optional.none();\n }\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 var figureElm = editor.dom.getParent(elem, 'figure.image');\n if (figureElm !== null && isFigure(editor, figureElm)) {\n return getFigureImg(figureElm);\n } else if (isImage(editor, elem)) {\n return Optional.some(SugarElement.fromDom(elem));\n } else {\n return Optional.none();\n }\n };\n var extractFilename = function (editor, url, group) {\n var m = url.match(/(?:\\/|^)(([^\\/\\?]+)\\.(?:[a-z0-9.]+))(?:\\?|$)/i);\n return isNonNullable(m) ? editor.dom.encode(m[group]) : 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$1(url).host === editor.documentBaseURI.host;\n };\n var isCorsImage = function (editor, img) {\n return global$4.inArray(getCorsHosts(editor), new global$1(img.src).host) !== -1;\n };\n var isCorsWithCredentialsImage = function (editor, img) {\n return global$4.inArray(getCredentialsHosts(editor), new global$1(img.src).host) !== -1;\n };\n var defaultFetchImage = function (editor, img) {\n if (isCorsImage(editor, img)) {\n return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img));\n }\n if (!isLocalImage(editor, img)) {\n var proxyUrl = getProxyUrl(editor);\n var src = proxyUrl + (proxyUrl.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src);\n var apiKey = getApiKey(editor);\n return getUrl(src, apiKey, false);\n }\n return imageToBlob$1(img);\n };\n var imageToBlob = 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 = editor.editorUpload.blobCache.getByUri(img.src);\n if (blobInfo) {\n return global$2.resolve(blobInfo.blob());\n }\n return imageToBlob(editor, img);\n };\n var startTimedUpload = function (editor, imageUploadTimerState) {\n var imageUploadTimer = global$3.setEditorTimeout(editor, function () {\n editor.editorUpload.uploadImagesAuto();\n }, getUploadTimeout(editor));\n imageUploadTimerState.set(imageUploadTimer);\n };\n var cancelTimedUpload = function (imageUploadTimerState) {\n global$3.clearTimeout(imageUploadTimerState.get());\n };\n var updateSelectedImage = function (editor, origBlob, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) {\n return ir.toBlob().then(function (blob) {\n var uri, name, filename, blobInfo;\n var blobCache = editor.editorUpload.blobCache;\n uri = selectedImage.src;\n var useFilename = origBlob.type === blob.type;\n if (shouldReuseFilename(editor)) {\n blobInfo = blobCache.getByUri(uri);\n if (isNonNullable(blobInfo)) {\n uri = blobInfo.uri();\n name = blobInfo.name();\n filename = blobInfo.filename();\n } else {\n name = extractFilename(editor, uri, 2);\n filename = extractFilename(editor, uri, 1);\n }\n }\n blobInfo = blobCache.create({\n id: createId(),\n blob: blob,\n base64: ir.toBase64(),\n uri: uri,\n name: name,\n filename: useFilename ? filename : undefined\n });\n blobCache.add(blobInfo);\n editor.undoManager.transact(function () {\n var imageLoadedHandler = function () {\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(function (blob) {\n return blobToImageResult(blob).then(fn).then(function (imageResult) {\n return updateSelectedImage(editor, blob, imageResult, false, imageUploadTimerState, img.dom, size);\n });\n }).catch(function (error) {\n displayError(editor, error);\n });\n });\n };\n };\n var rotate = function (editor, imageUploadTimerState, angle) {\n return function () {\n var imgOpt = getSelectedImage(editor);\n var flippedSize = imgOpt.map(function (img) {\n var size = getImageSize(img.dom);\n return size ? {\n w: size.h,\n h: size.w\n } : null;\n }).getOrNull();\n return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) {\n return rotate$1(imageResult, angle);\n }, flippedSize)();\n };\n };\n var flip = 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 blobToImage(blob).then(function (newImage) {\n var newSize = getNaturalImageSize(newImage);\n if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) {\n if (getImageSize(img)) {\n setImageSize(img, newSize);\n }\n }\n URL.revokeObjectURL(newImage.src);\n return blob;\n }).then(blobToImageResult).then(function (imageResult) {\n return updateSelectedImage(editor, blob, imageResult, true, imageUploadTimerState, img);\n });\n };\n\n var saveState = 'save-state';\n var disable = 'disable';\n var enable = 'enable';\n\n var createState = function (blob) {\n return {\n blob: blob,\n url: 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 handleDialogBlob(editor, imageUploadTimerState, originalImg.dom, originalSize, blob);\n });\n });\n api.close();\n },\n onCancel: noop,\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 = getSelectedImage(editor);\n var originalSizeOpt = originalImgOpt.map(function (origImg) {\n return getNaturalImageSize(origImg.dom);\n });\n originalImgOpt.each(function (img) {\n getEditableImage(editor, img.dom).each(function (_) {\n findBlob(editor, img.dom).then(function (blob) {\n var state = createState(blob);\n editor.windowManager.open(getLoadedSpec(state));\n });\n });\n });\n };\n };\n\n var register$2 = function (editor, imageUploadTimerState) {\n global$4.each({\n mceImageRotateLeft: rotate(editor, imageUploadTimerState, -90),\n mceImageRotateRight: rotate(editor, imageUploadTimerState, 90),\n mceImageFlipVertical: flip(editor, imageUploadTimerState, 'v'),\n mceImageFlipHorizontal: flip(editor, imageUploadTimerState, 'h'),\n mceEditImage: makeOpen(editor, imageUploadTimerState)\n }, function (fn, cmd) {\n editor.addCommand(cmd, fn);\n });\n };\n\n var setup = function (editor, imageUploadTimerState, lastSelectedImageState) {\n editor.on('NodeChange', function (e) {\n var lastSelectedImage = lastSelectedImageState.get();\n var selectedImage = getEditableImage(editor, e.element);\n if (lastSelectedImage && !selectedImage.exists(function (img) {\n return lastSelectedImage.src === img.src;\n })) {\n cancelTimedUpload(imageUploadTimerState);\n editor.editorUpload.uploadImagesAuto();\n lastSelectedImageState.set(null);\n }\n selectedImage.each(lastSelectedImageState.set);\n });\n };\n\n var register$1 = function (editor) {\n var changeHandlers = [];\n var cmd = function (command) {\n return function () {\n return editor.execCommand(command);\n };\n };\n var isEditableImage = function () {\n return getSelectedImage(editor).exists(function (element) {\n return getEditableImage(editor, element.dom).isSome();\n });\n };\n var onSetup = function (api) {\n var handler = function (isEditableImage) {\n return api.setDisabled(!isEditableImage);\n };\n handler(isEditableImage());\n changeHandlers = changeHandlers.concat([handler]);\n return function () {\n changeHandlers = filter(changeHandlers, function (h) {\n return h !== handler;\n });\n };\n };\n editor.on('NodeChange', function () {\n var isEditable = isEditableImage();\n each$1(changeHandlers, function (handler) {\n return handler(isEditable);\n });\n });\n editor.ui.registry.addButton('rotateleft', {\n tooltip: 'Rotate counterclockwise',\n icon: 'rotate-left',\n onAction: cmd('mceImageRotateLeft'),\n onSetup: onSetup\n });\n editor.ui.registry.addButton('rotateright', {\n tooltip: 'Rotate clockwise',\n icon: 'rotate-right',\n onAction: cmd('mceImageRotateRight'),\n onSetup: onSetup\n });\n editor.ui.registry.addButton('flipv', {\n tooltip: 'Flip vertically',\n icon: 'flip-vertically',\n onAction: cmd('mceImageFlipVertical'),\n onSetup: onSetup\n });\n editor.ui.registry.addButton('fliph', {\n tooltip: 'Flip horizontally',\n icon: 'flip-horizontally',\n onAction: cmd('mceImageFlipHorizontal'),\n onSetup: onSetup\n });\n editor.ui.registry.addButton('editimage', {\n tooltip: 'Edit image',\n icon: 'edit-image',\n onAction: cmd('mceEditImage'),\n onSetup: onSetup\n });\n editor.ui.registry.addButton('imageoptions', {\n tooltip: 'Image options',\n icon: 'image',\n onAction: cmd('mceImage')\n });\n editor.ui.registry.addContextMenu('imagetools', {\n update: function (element) {\n return getEditableImage(editor, element).map(function (_) {\n return {\n text: 'Edit image',\n icon: 'edit-image',\n onAction: cmd('mceEditImage')\n };\n }).toArray();\n }\n });\n };\n\n var register = function (editor) {\n editor.ui.registry.addContextToolbar('imagetools', {\n items: getToolbarItems(editor),\n predicate: function (elem) {\n return getEditableImage(editor, elem).isSome();\n },\n position: 'node',\n scope: 'node'\n });\n };\n\n function Plugin () {\n global$5.add('imagetools', function (editor) {\n var imageUploadTimerState = Cell(0);\n var lastSelectedImageState = Cell(null);\n register$2(editor, imageUploadTimerState);\n register$1(editor);\n register(editor);\n setup(editor, imageUploadTimerState, lastSelectedImageState);\n });\n }\n\n Plugin();\n\n}());\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../_webpack@4.47.0@webpack/buildin/global.js */ \"./node_modules/_webpack@4.47.0@webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/imagetools/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/link/index.js": /*!********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/link/index.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"link\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/link')\n// ES2015:\n// import 'tinymce/plugins/link'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/link/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/link/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/link/plugin.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/link/plugin.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$7 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var global$6 = tinymce.util.Tools.resolve('tinymce.util.VK');\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var eq = function (t) {\n return function (a) {\n return t === a;\n };\n };\n var isString = isType('string');\n var isArray = isType('array');\n var isNull = eq(null);\n var isBoolean = isSimpleType('boolean');\n var isFunction = isSimpleType('function');\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 tripleEquals = function (a, b) {\n return a === b;\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 call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\n\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$1 = 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$1(xs, function (x, i) {\n acc = f(acc, x, i);\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 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 Optional.none();\n };\n\n var is = function (lhs, rhs, comparator) {\n if (comparator === void 0) {\n comparator = tripleEquals;\n }\n return lhs.exists(function (left) {\n return comparator(left, rhs);\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 someIf = function (b, a) {\n return b ? Optional.some(a) : Optional.none();\n };\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\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 getText = function (item) {\n if (isString(item.text)) {\n return item.text;\n } else if (isString(item.title)) {\n return item.title;\n } else {\n return '';\n }\n };\n var sanitizeList = function (list, extractValue) {\n var out = [];\n global$5.each(list, function (item) {\n var text = getText(item);\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 sanitizeWith = function (extracter) {\n if (extracter === void 0) {\n extracter = getValue;\n }\n return function (list) {\n return Optional.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: 'listbox',\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 __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 keys = Object.keys;\n var hasOwnProperty = Object.hasOwnProperty;\n var each = 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 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(obj, function (x, i) {\n (pred(x, i) ? onTrue : onFalse)(x, i);\n });\n return r;\n };\n var filter = function (obj, pred) {\n var t = {};\n internalFilter(obj, pred, objAcc(t), noop);\n return t;\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 global$4 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.util.URI');\n\n var isAnchor = function (elm) {\n return elm && elm.nodeName.toLowerCase() === 'a';\n };\n var isLink = function (elm) {\n return isAnchor(elm) && !!getHref(elm);\n };\n var collectNodesInRange = function (rng, predicate) {\n if (rng.collapsed) {\n return [];\n } else {\n var contents = rng.cloneContents();\n var walker = new global$4(contents.firstChild, contents);\n var elements = [];\n var current = contents.firstChild;\n do {\n if (predicate(current)) {\n elements.push(current);\n }\n } while (current = walker.next());\n return elements;\n }\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$5.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$5.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 hasLinks = function (elements) {\n return global$5.grep(elements, isLink).length > 0;\n };\n var hasLinksInSelection = function (rng) {\n return collectNodesInRange(rng, isLink).length > 0;\n };\n var isOnlyTextSelected = function (editor) {\n var inlineTextElements = editor.schema.getTextInlineElements();\n var isElement = function (elm) {\n return elm.nodeType === 1 && !isAnchor(elm) && !has(inlineTextElements, elm.nodeName.toLowerCase());\n };\n var elements = collectNodesInRange(editor.selection.getRng(), isElement);\n return elements.length === 0;\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 var attrs = [\n 'title',\n 'rel',\n 'class',\n 'target'\n ];\n return foldl(attrs, 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 (!(getRelList(editor).length > 0) && allowUnsafeLinkTarget(editor) === false) {\n var newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank');\n newLinkAttrs.rel = newRel ? newRel : null;\n }\n if (Optional.from(newLinkAttrs.target).isNone() && getTargetList(editor) === false) {\n newLinkAttrs.target = getDefaultLinkTarget(editor);\n }\n newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, assumeExternalTargets(editor));\n return newLinkAttrs;\n };\n var updateLink = function (editor, anchorElm, text, linkAttrs) {\n text.each(function (text) {\n if (has(anchorElm, '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 linkDomMutation = 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 unlinkSelection = function (editor) {\n var dom = editor.dom, selection = editor.selection;\n var bookmark = selection.getBookmark();\n var rng = selection.getRng().cloneRange();\n var startAnchorElm = dom.getParent(rng.startContainer, 'a[href]', editor.getBody());\n var endAnchorElm = dom.getParent(rng.endContainer, 'a[href]', editor.getBody());\n if (startAnchorElm) {\n rng.setStartBefore(startAnchorElm);\n }\n if (endAnchorElm) {\n rng.setEndAfter(endAnchorElm);\n }\n selection.setRng(rng);\n editor.execCommand('unlink');\n selection.moveToBookmark(bookmark);\n };\n var unlinkDomMutation = function (editor) {\n editor.undoManager.transact(function () {\n var node = editor.selection.getNode();\n if (isImageFigure(node)) {\n unlinkImageFigure(editor, node);\n } else {\n unlinkSelection(editor);\n }\n editor.focus();\n });\n };\n var unwrapOptions = function (data) {\n var cls = data.class, href = data.href, rel = data.rel, target = data.target, text = data.text, title = data.title;\n return filter({\n class: cls.getOrNull(),\n href: href,\n rel: rel.getOrNull(),\n target: target.getOrNull(),\n text: text.getOrNull(),\n title: title.getOrNull()\n }, function (v, _k) {\n return isNull(v) === false;\n });\n };\n var sanitizeData = function (editor, data) {\n var href = data.href;\n return __assign(__assign({}, data), { href: global$3.isDomSafe(href, 'a', editor.settings) ? href : '' });\n };\n var link = function (editor, attachState, data) {\n var sanitizedData = sanitizeData(editor, data);\n editor.hasPlugin('rtc', true) ? editor.execCommand('createlink', false, unwrapOptions(sanitizedData)) : linkDomMutation(editor, attachState, sanitizedData);\n };\n var unlink = function (editor) {\n editor.hasPlugin('rtc', true) ? editor.execCommand('unlink') : unlinkDomMutation(editor);\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\n var isListGroup = function (item) {\n return hasNonNullableKey(item, 'items');\n };\n var findTextByValue = function (value, catalog) {\n return findMap(catalog, function (item) {\n if (isListGroup(item)) {\n return findTextByValue(value, item.items);\n } else {\n return someIf(item.value === value, item);\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 }) : Optional.none();\n };\n var findCatalog = function (catalogs, fieldName) {\n if (fieldName === 'link') {\n return catalogs.link;\n } else if (fieldName === 'anchor') {\n return catalogs.anchor;\n } else {\n return Optional.none();\n }\n };\n var init = function (initialData, linkCatalog) {\n var persistentData = {\n text: initialData.text,\n title: initialData.title\n };\n var getTitleFromUrlChange = function (url) {\n return someIf(persistentData.title.length <= 0, Optional.from(url.meta.title).getOr(''));\n };\n var getTextFromUrlChange = function (url) {\n return someIf(persistentData.text.length <= 0, Optional.from(url.meta.text).getOr(url.value));\n };\n var onUrlChange = function (data) {\n var text = getTextFromUrlChange(data.url);\n var title = getTitleFromUrlChange(data.url);\n if (text.isSome() || title.isSome()) {\n return Optional.some(__assign(__assign({}, text.map(function (text) {\n return { text: text };\n }).getOr({})), title.map(function (title) {\n return { title: title };\n }).getOr({})));\n } else {\n return Optional.none();\n }\n };\n var onCatalogChange = function (data, change) {\n var catalog = findCatalog(linkCatalog, change.name).getOr([]);\n return getDelta(persistentData.text, change.name, catalog, data);\n };\n var onChange = function (getData, change) {\n var name = change.name;\n if (name === 'url') {\n return onUrlChange(getData());\n } else if (contains([\n 'anchor',\n 'link'\n ], name)) {\n return onCatalogChange(getData(), change);\n } else if (name === 'text' || name === 'title') {\n persistentData[name] = getData()[name];\n return Optional.none();\n } else {\n return Optional.none();\n }\n };\n return { onChange: onChange };\n };\n var DialogChanges = {\n init: init,\n getDelta: getDelta\n };\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n var delayedConfirm = function (editor, message, callback) {\n var rng = editor.selection.getRng();\n global$2.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 ? Optional.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 }) : Optional.none();\n };\n var tryProtocolTransform = function (assumeExternalTargets, defaultLinkProtocol) {\n return function (data) {\n var url = data.href;\n var suggestProtocol = assumeExternalTargets === 1 && !hasProtocol(url) || assumeExternalTargets === 0 && /^\\s*www(\\.|\\d\\.)/i.test(url);\n return suggestProtocol ? Optional.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 }) : Optional.none();\n };\n };\n var preprocess = function (editor, data) {\n return findMap([\n tryEmailTransform,\n tryProtocolTransform(assumeExternalTargets(editor), getDefaultLinkProtocol(editor))\n ], function (f) {\n return f(data);\n }).fold(function () {\n return global$1.resolve(data);\n }, function (transform) {\n return new global$1(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 ? Optional.some([{\n text: 'None',\n value: ''\n }].concat(anchors)) : Optional.none();\n };\n var AnchorListOptions = { getAnchors: getAnchors };\n\n var getClasses = function (editor) {\n var list = getLinkClassList(editor);\n if (list.length > 0) {\n return ListOptions.sanitize(list);\n }\n return Optional.none();\n };\n var ClassListOptions = { getClasses: getClasses };\n\n var global = tinymce.util.Tools.resolve('tinymce.util.XHR');\n\n var parseJson = function (text) {\n try {\n return Optional.some(JSON.parse(text));\n } catch (err) {\n return Optional.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 = getLinkList(editor);\n return new global$1(function (callback) {\n if (isString(linkList)) {\n global.send({\n url: linkList,\n success: function (text) {\n return callback(parseJson(text));\n },\n error: function (_) {\n return callback(Optional.none());\n }\n });\n } else if (isFunction(linkList)) {\n linkList(function (output) {\n return callback(Optional.some(output));\n });\n } else {\n callback(Optional.from(linkList));\n }\n }).then(function (optItems) {\n return optItems.bind(ListOptions.sanitizeWith(extractor)).map(function (items) {\n if (items.length > 0) {\n var noneItem = [{\n text: 'None',\n value: ''\n }];\n return noneItem.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 = getRelList(editor);\n if (list.length > 0) {\n var isTargetBlank_1 = is(initialTarget, '_blank');\n var enforceSafe = allowUnsafeLinkTarget(editor) === false;\n var safeRelExtractor = function (item) {\n return applyRelTargetRules(ListOptions.getValue(item), isTargetBlank_1);\n };\n var sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize;\n return sanitizer(list);\n }\n return Optional.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 = getTargetList(editor);\n if (isArray(list)) {\n return ListOptions.sanitize(list).orThunk(function () {\n return Optional.some(fallbacks);\n });\n } else if (list === false) {\n return Optional.none();\n }\n return Optional.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 ? Optional.some(val) : Optional.none();\n };\n var extractFromAnchor = function (editor, anchor) {\n var dom = editor.dom;\n var onlyText = isOnlyTextSelected(editor);\n var text = onlyText ? Optional.some(getAnchorText(editor.selection, anchor)) : Optional.none();\n var url = anchor ? Optional.some(dom.getAttrib(anchor, 'href')) : Optional.none();\n var target = anchor ? Optional.from(dom.getAttrib(anchor, 'target')) : Optional.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).then(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: Optional.from(linkNode),\n flags: { titleEnabled: 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 unlink(editor);\n api.close();\n return;\n }\n var getChangedValue = function (key) {\n return Optional.from(data[key]).filter(function (value) {\n return !is(info.anchor[key], 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 : noop\n };\n DialogConfirms.preprocess(editor, changedData).then(function (pData) {\n link(editor, attachState, pData);\n });\n api.close();\n };\n };\n var collectData = function (editor) {\n var anchorNode = getAnchorElement(editor);\n return DialogInfo.collect(editor, anchorNode);\n };\n var getInitialData = function (info, defaultTarget) {\n var anchor = info.anchor;\n var url = anchor.url.getOr('');\n return {\n url: {\n value: url,\n meta: { original: { value: url } }\n },\n text: anchor.text.getOr(''),\n title: anchor.title.getOr(''),\n anchor: url,\n link: url,\n rel: anchor.rel.getOr(''),\n target: anchor.target.or(defaultTarget).getOr(''),\n linkClass: 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 = Optional.from(getDefaultLinkTarget(editor));\n var initialData = getInitialData(settings, defaultTarget);\n var catalogs = settings.catalogs;\n var dialogDelta = DialogChanges.init(initialData, 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.then(function (info) {\n var onSubmit = handleSubmit(editor, info);\n return makeDialog(info, onSubmit, editor);\n }).then(function (spec) {\n editor.windowManager.open(spec);\n });\n };\n\n var appendClickRemove = function (link, evt) {\n document.body.appendChild(link);\n link.dispatchEvent(evt);\n document.body.removeChild(link);\n };\n var open = function (url) {\n var link = document.createElement('a');\n link.target = '_blank';\n link.href = url;\n link.rel = 'noreferrer noopener';\n var evt = document.createEvent('MouseEvents');\n evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n appendClickRemove(link, evt);\n };\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 = 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 open(a.href);\n }\n }\n };\n var openDialog = function (editor) {\n return function () {\n open$1(editor);\n };\n };\n var gotoSelectedLink = function (editor) {\n return function () {\n gotoLink(editor, getSelectedLink(editor));\n };\n };\n var setupGotoLinks = function (editor) {\n editor.on('click', function (e) {\n var link = getLink(editor, e.target);\n if (link && global$6.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 toggleState = function (editor, toggler) {\n editor.on('NodeChange', toggler);\n return function () {\n return editor.off('NodeChange', toggler);\n };\n };\n var toggleActiveState = function (editor) {\n return function (api) {\n var updateState = function () {\n return api.setActive(!editor.mode.isReadOnly() && getAnchorElement(editor, editor.selection.getNode()) !== null);\n };\n updateState();\n return toggleState(editor, updateState);\n };\n };\n var toggleEnabledState = function (editor) {\n return function (api) {\n var updateState = function () {\n return api.setDisabled(getAnchorElement(editor, editor.selection.getNode()) === null);\n };\n updateState();\n return toggleState(editor, updateState);\n };\n };\n var toggleUnlinkState = function (editor) {\n return function (api) {\n var hasLinks$1 = function (parents) {\n return hasLinks(parents) || hasLinksInSelection(editor.selection.getRng());\n };\n var parents = editor.dom.getParents(editor.selection.getStart());\n api.setDisabled(!hasLinks$1(parents));\n return toggleState(editor, function (e) {\n return api.setDisabled(!hasLinks$1(e.parents));\n });\n };\n };\n\n var register = function (editor) {\n editor.addCommand('mceLink', function () {\n if (useQuickLink(editor)) {\n editor.fire('contexttoolbar-show', { toolbarKey: 'quicklink' });\n } else {\n openDialog(editor)();\n }\n });\n };\n\n var setup = function (editor) {\n editor.addShortcut('Meta+K', '', function () {\n editor.execCommand('mceLink');\n });\n };\n\n var setupButtons = function (editor) {\n editor.ui.registry.addToggleButton('link', {\n icon: 'link',\n tooltip: 'Insert/edit link',\n onAction: openDialog(editor),\n onSetup: toggleActiveState(editor)\n });\n editor.ui.registry.addButton('openlink', {\n icon: 'new-tab',\n tooltip: 'Open link',\n onAction: gotoSelectedLink(editor),\n onSetup: toggleEnabledState(editor)\n });\n editor.ui.registry.addButton('unlink', {\n icon: 'unlink',\n tooltip: 'Remove link',\n onAction: function () {\n return unlink(editor);\n },\n onSetup: toggleUnlinkState(editor)\n });\n };\n var setupMenuItems = function (editor) {\n editor.ui.registry.addMenuItem('openlink', {\n text: 'Open link',\n icon: 'new-tab',\n onAction: gotoSelectedLink(editor),\n onSetup: toggleEnabledState(editor)\n });\n editor.ui.registry.addMenuItem('link', {\n icon: 'link',\n text: 'Link...',\n shortcut: 'Meta+K',\n onAction: openDialog(editor)\n });\n editor.ui.registry.addMenuItem('unlink', {\n icon: 'unlink',\n text: 'Remove link',\n onAction: function () {\n return unlink(editor);\n },\n onSetup: toggleUnlinkState(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 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(!getAnchorElement(editor, node));\n return noop;\n };\n var getLinkText = function (value) {\n var anchor = getAnchorElement(editor);\n var onlyText = isOnlyTextSelected(editor);\n if (!anchor && onlyText) {\n var text = getAnchorText(editor.selection, anchor);\n return Optional.some(text.length > 0 ? text : value);\n } else {\n return Optional.none();\n }\n };\n editor.ui.registry.addContextForm('quicklink', {\n launch: {\n type: 'contextformtogglebutton',\n icon: 'link',\n tooltip: 'Link',\n onSetup: toggleActiveState(editor)\n },\n label: 'Link',\n predicate: function (node) {\n return !!getAnchorElement(editor, node) && hasContextToolbar(editor);\n },\n initValue: function () {\n var elm = getAnchorElement(editor);\n return !!elm ? 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(!!getAnchorElement(editor, node));\n return toggleActiveState(editor)(buttonApi);\n },\n onAction: function (formApi) {\n var value = formApi.getValue();\n var text = getLinkText(value);\n var attachState = {\n href: value,\n attach: noop\n };\n link(editor, attachState, {\n href: value,\n text: text,\n title: Optional.none(),\n rel: Optional.none(),\n target: Optional.none(),\n class: Optional.none()\n });\n collapseSelectionToEnd(editor);\n formApi.hide();\n }\n },\n {\n type: 'contextformbutton',\n icon: 'unlink',\n tooltip: 'Remove link',\n onSetup: onSetupLink,\n onAction: function (formApi) {\n 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 gotoSelectedLink(editor)();\n formApi.hide();\n }\n }\n ]\n });\n };\n\n function Plugin () {\n global$7.add('link', function (editor) {\n setupButtons(editor);\n setupMenuItems(editor);\n setupContextMenu(editor);\n setupContextToolbars(editor);\n setupGotoLinks(editor);\n register(editor);\n setup(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/link/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/lists/index.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/lists/index.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"lists\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/lists')\n// ES2015:\n// import 'tinymce/plugins/lists'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/lists/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/lists/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/lists/plugin.js": /*!**********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/lists/plugin.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$7 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType$1 = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var isString = isType$1('string');\n var isObject = isType$1('object');\n var isArray = isType$1('array');\n var isBoolean = isSimpleType('boolean');\n var isFunction = isSimpleType('function');\n var isNumber = isSimpleType('number');\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 tripleEquals = function (a, b) {\n return a === b;\n };\n var not = function (f) {\n return function (t) {\n return !f(t);\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 call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\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$1 = 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$1 = 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$1(xs, function (x, i) {\n acc = f(acc, x, i);\n });\n return acc;\n };\n var findUntil = function (xs, pred, until) {\n for (var i = 0, len = xs.length; i < len; i++) {\n var x = xs[i];\n if (pred(x, i)) {\n return Optional.some(x);\n } else if (until(x, i)) {\n break;\n }\n }\n return Optional.none();\n };\n var find$1 = function (xs, pred) {\n return findUntil(xs, pred, never);\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 get$1 = function (xs, i) {\n return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();\n };\n var head = function (xs) {\n return get$1(xs, 0);\n };\n var last = function (xs) {\n return get$1(xs, xs.length - 1);\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 Optional.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 function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2)\n for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar)\n ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\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 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 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 = 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$2(group(1), group(2));\n };\n var detect$3 = function (versionRegexes, agent) {\n var cleanedAgent = String(agent).toLowerCase();\n if (versionRegexes.length === 0) {\n return unknown$2();\n }\n return find(versionRegexes, cleanedAgent);\n };\n var unknown$2 = function () {\n return nu$2(0, 0);\n };\n var nu$2 = function (major, minor) {\n return {\n major: major,\n minor: minor\n };\n };\n var Version = {\n nu: nu$2,\n detect: detect$3,\n unknown: unknown$2\n };\n\n var detectBrowser$1 = function (browsers, userAgentData) {\n return findMap(userAgentData.brands, function (uaBrand) {\n var lcBrand = uaBrand.brand.toLowerCase();\n return find$1(browsers, function (browser) {\n var _a;\n return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());\n }).map(function (info) {\n return {\n current: info.name,\n version: Version.nu(parseInt(uaBrand.version, 10), 0)\n };\n });\n });\n };\n\n var detect$2 = function (candidates, userAgent) {\n var agent = String(userAgent).toLowerCase();\n return find$1(candidates, function (candidate) {\n return candidate.search(agent);\n });\n };\n var detectBrowser = function (browsers, userAgent) {\n return detect$2(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$2(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\n var contains$1 = function (str, substr) {\n return str.indexOf(substr) !== -1;\n };\n var blank = function (r) {\n return function (s) {\n return s.replace(r, '');\n };\n };\n var trim = blank(/^\\s+|\\s+$/g);\n var isNotEmpty = function (s) {\n return s.length > 0;\n };\n var isEmpty$1 = function (s) {\n return !isNotEmpty(s);\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 brand: 'Chromium',\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 edge = 'Edge';\n var chrome = 'Chrome';\n var ie = 'IE';\n var opera = 'Opera';\n var firefox = 'Firefox';\n var safari = 'Safari';\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 var isBrowser = function (name) {\n return function () {\n return current === name;\n };\n };\n return {\n current: current,\n version: version,\n isEdge: isBrowser(edge),\n isChrome: isBrowser(chrome),\n isIE: isBrowser(ie),\n isOpera: isBrowser(opera),\n isFirefox: isBrowser(firefox),\n isSafari: isBrowser(safari)\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 unknown = function () {\n return nu({\n current: undefined,\n version: Version.unknown()\n });\n };\n var nu = function (info) {\n var current = info.current;\n var version = info.version;\n var isOS = function (name) {\n return function () {\n return current === name;\n };\n };\n return {\n current: current,\n version: version,\n isWindows: isOS(windows),\n isiOS: isOS(ios),\n isAndroid: isOS(android),\n isOSX: isOS(osx),\n isLinux: isOS(linux),\n isSolaris: isOS(solaris),\n isFreeBSD: isOS(freebsd),\n isChromeOS: isOS(chromeos)\n };\n };\n var OperatingSystem = {\n unknown: unknown,\n nu: nu,\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 detect$1 = function (userAgent, userAgentDataOpt, mediaMatch) {\n var browsers = PlatformInfo.browsers();\n var oses = PlatformInfo.oses();\n var browser = userAgentDataOpt.bind(function (userAgentData) {\n return detectBrowser$1(browsers, userAgentData);\n }).orThunk(function () {\n return detectBrowser(browsers, userAgent);\n }).fold(Browser.unknown, Browser.nu);\n var os = 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$1 };\n\n var mediaMatch = function (query) {\n return window.matchMedia(query).matches;\n };\n var platform = cached(function () {\n return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch);\n });\n var detect = function () {\n return platform();\n };\n\n var compareDocumentPosition = function (a, b, match) {\n return (a.compareDocumentPosition(b) & match) !== 0;\n };\n var documentPositionContainedBy = function (a, b) {\n return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY);\n };\n\n var ELEMENT = 1;\n\n var fromHtml = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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 || document;\n var node = doc.createElement(tag);\n return fromDom(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || 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: node };\n };\n var fromPoint = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n };\n var SugarElement = {\n fromHtml: fromHtml,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom,\n fromPoint: fromPoint\n };\n\n var is$2 = function (element, selector) {\n var dom = element.dom;\n if (dom.nodeType !== ELEMENT) {\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 documentPositionContainedBy(e1.dom, e2.dom);\n };\n var contains = function (e1, e2) {\n return detect().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2);\n };\n var is$1 = is$2;\n\n var global$6 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils');\n\n var global$5 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');\n\n var global$4 = tinymce.util.Tools.resolve('tinymce.util.VK');\n\n var keys = Object.keys;\n var each = 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 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(obj, function (x, i) {\n (pred(x, i) ? onTrue : onFalse)(x, i);\n });\n return r;\n };\n var filter = function (obj, pred) {\n var t = {};\n internalFilter(obj, pred, objAcc(t), noop);\n return t;\n };\n\n typeof window !== 'undefined' ? 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 = function (t) {\n return function (element) {\n return type(element) === t;\n };\n };\n var isElement = isType(ELEMENT);\n var isTag = function (tag) {\n return function (e) {\n return isElement(e) && name(e) === tag;\n };\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 console.error('Invalid call to Attribute.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(attrs, function (v, k) {\n rawSet(dom, k, v);\n });\n };\n var clone$1 = 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 parent = function (element) {\n return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);\n };\n var children = function (element) {\n return map(element.dom.childNodes, SugarElement.fromDom);\n };\n var child = function (element, index) {\n var cs = element.dom.childNodes;\n return Optional.from(cs[index]).map(SugarElement.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\n var before$1 = 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$1 = function (parent, element) {\n parent.dom.appendChild(element.dom);\n };\n\n var before = function (marker, elements) {\n each$1(elements, function (x) {\n before$1(marker, x);\n });\n };\n var append = function (parent, elements) {\n each$1(elements, function (x) {\n append$1(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 clone = function (original, isDeep) {\n return SugarElement.fromDom(original.dom.cloneNode(isDeep));\n };\n var deep = function (original) {\n return clone(original, true);\n };\n var shallowAs = function (original, tag) {\n var nu = SugarElement.fromTag(tag);\n var attributes = clone$1(original);\n setAll(nu, attributes);\n return nu;\n };\n var mutate = function (original, tag) {\n var nu = shallowAs(original, tag);\n before$1(original, nu);\n var children$1 = children(original);\n append(nu, children$1);\n remove(original);\n return nu;\n };\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var matchNodeName = function (name) {\n return function (node) {\n return node && node.nodeName.toLowerCase() === name;\n };\n };\n var matchNodeNames = function (regex) {\n return function (node) {\n return node && regex.test(node.nodeName);\n };\n };\n var isTextNode = function (node) {\n return node && node.nodeType === 3;\n };\n var isListNode = matchNodeNames(/^(OL|UL|DL)$/);\n var isOlUlNode = matchNodeNames(/^(OL|UL)$/);\n var isOlNode = matchNodeName('ol');\n var isListItemNode = matchNodeNames(/^(LI|DT|DD)$/);\n var isDlItemNode = matchNodeNames(/^(DT|DD)$/);\n var isTableCellNode = matchNodeNames(/^(TH|TD)$/);\n var isBr = matchNodeName('br');\n var isFirstChild = function (node) {\n return node.parentNode.firstChild === 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 return dom.isBlock(node.nextSibling) && !isBr(node.previousSibling);\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\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\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 = 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, getForcedRootBlockAttrs(editor));\n }\n if (!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 (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 DOM$2 = global$3.DOM;\n var splitList = function (editor, list, li) {\n var removeAndKeepBookmarks = function (targetNode) {\n global$2.each(bookmarks, function (node) {\n targetNode.parentNode.insertBefore(node, li.parentNode);\n });\n DOM$2.remove(targetNode);\n };\n var bookmarks = DOM$2.select('span[data-mce-type=\"bookmark\"]', list);\n var newBlock = createTextBlock(editor, li);\n var tmpRng = DOM$2.createRng();\n tmpRng.setStartAfter(li);\n tmpRng.setEndAfter(list);\n var fragment = tmpRng.extractContents();\n for (var node = fragment.firstChild; node; node = node.firstChild) {\n if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) {\n DOM$2.remove(node);\n break;\n }\n }\n if (!editor.dom.isEmpty(fragment)) {\n DOM$2.insertAfter(fragment, list);\n }\n DOM$2.insertAfter(newBlock, list);\n if (isEmpty(editor.dom, li.parentNode)) {\n removeAndKeepBookmarks(li.parentNode);\n }\n DOM$2.remove(li);\n if (isEmpty(editor.dom, list)) {\n DOM$2.remove(list);\n }\n };\n\n var isDescriptionDetail = isTag('dd');\n var isDescriptionTerm = isTag('dt');\n var outdentDlItem = function (editor, item) {\n if (isDescriptionDetail(item)) {\n mutate(item, 'dt');\n } else if (isDescriptionTerm(item)) {\n parent(item).each(function (dl) {\n return splitList(editor, dl.dom, item.dom);\n });\n }\n };\n var indentDlItem = function (item) {\n if (isDescriptionTerm(item)) {\n mutate(item, 'dd');\n }\n };\n var dlIndentation = function (editor, indentation, dlItems) {\n if (indentation === 'Indent') {\n each$1(dlItems, indentDlItem);\n } else {\n each$1(dlItems, function (item) {\n return outdentDlItem(editor, item);\n });\n }\n };\n\n var getNormalizedPoint = function (container, offset) {\n if (isTextNode(container)) {\n return {\n container: container,\n offset: offset\n };\n }\n var node = global$6.getNode(container, offset);\n if (isTextNode(node)) {\n return {\n container: node,\n offset: offset >= container.childNodes.length ? node.data.length : 0\n };\n } else if (node.previousSibling && isTextNode(node.previousSibling)) {\n return {\n container: node.previousSibling,\n offset: node.previousSibling.data.length\n };\n } else if (node.nextSibling && 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\n var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery');\n\n var getParentList = function (editor, node) {\n var selectionStart = node || 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 filter$1(parentList.querySelectorAll('ol,ul,dl'), isListNode);\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 filter$1(selectedBlocks, function (elm) {\n return isListNode(elm) && parentList !== elm;\n });\n }\n };\n var findParentListItemsNodes = function (editor, elms) {\n var listItemsElms = global$2.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$1.unique(listItemsElms);\n };\n var getSelectedListItems = function (editor) {\n var selectedBlocks = editor.selection.getSelectedBlocks();\n return filter$1(findParentListItemsNodes(editor, selectedBlocks), isListItemNode);\n };\n var getSelectedDlItems = function (editor) {\n return filter$1(getSelectedListItems(editor), isDlItemNode);\n };\n var getClosestListRootElm = function (editor, elm) {\n var parentTableCell = editor.dom.getParents(elm, 'TD,TH');\n return parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody();\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$1(editor.selection.getSelectedBlocks(), 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$1.unique(listRoots);\n };\n\n var is = function (lhs, rhs, comparator) {\n if (comparator === void 0) {\n comparator = tripleEquals;\n }\n return lhs.exists(function (left) {\n return comparator(left, rhs);\n });\n };\n var lift2 = function (oa, ob, f) {\n return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();\n };\n\n var fromElements = function (elements, scope) {\n var doc = scope || document;\n var fragment = doc.createDocumentFragment();\n each$1(elements, function (element) {\n fragment.appendChild(element.dom);\n });\n return SugarElement.fromDom(fragment);\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 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 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 joinSegment = function (parent, child) {\n append$1(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: SugarElement.fromTag(listType, scope),\n item: SugarElement.fromTag('li', scope)\n };\n append$1(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(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 = SugarElement.fromTag('li', scope);\n setAll(item, attr);\n append(item, content);\n return item;\n };\n var appendItem = function (segment, item) {\n append$1(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 = function (el) {\n return is$1(el, 'OL,UL');\n };\n var hasFirstChildList = function (el) {\n return firstChild(el).exists(isList);\n };\n var hasLastChildList = function (el) {\n return lastChild(el).exists(isList);\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 dirty: false,\n isSelected: isSelected,\n content: cloneItemContent(li),\n itemAttributes: clone$1(li),\n listAttributes: clone$1(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 entry.dirty = true;\n };\n\n var cloneListProperties = function (target, source) {\n target.listType = source.listType;\n target.listAttributes = __assign({}, source.listAttributes);\n };\n var cleanListProperties = function (entry) {\n entry.listAttributes = filter(entry.listAttributes, function (_value, key) {\n return key !== 'start';\n });\n };\n var closestSiblingEntry = function (entries, start) {\n var depth = entries[start].depth;\n var matches = function (entry) {\n return entry.depth === depth && !entry.dirty;\n };\n var until = function (entry) {\n return entry.depth < depth;\n };\n return findUntil(reverse(entries.slice(0, start)), matches, until).orThunk(function () {\n return findUntil(entries.slice(start + 1), matches, until);\n });\n };\n var normalizeEntries = function (entries) {\n each$1(entries, function (entry, i) {\n closestSiblingEntry(entries, i).fold(function () {\n if (entry.dirty) {\n cleanListProperties(entry);\n }\n }, function (matchingEntry) {\n return cloneListProperties(entry, matchingEntry);\n });\n });\n return entries;\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 return {\n get: get,\n set: set\n };\n };\n\n var parseItem = function (depth, itemSelection, selectionState, item) {\n return firstChild(item).filter(isList).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).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(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 var normalizedEntries = normalizeEntries(entries);\n return map(normalizedEntries, function (entry) {\n var content = fromElements(entry.content);\n return SugarElement.fromDom(createTextBlock(editor, content.dom));\n });\n };\n var indentedComposer = function (editor, entries) {\n var normalizedEntries = normalizeEntries(entries);\n return composeList(editor.contentDocument, normalizedEntries).toArray();\n };\n var composeEntries = function (editor, entries) {\n return bind(groupBy(entries, isIndented), function (entries) {\n var groupIsIndented = head(entries).exists(isIndented);\n return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries);\n });\n };\n var indentSelectedEntries = function (entries, indentation) {\n each$1(filter$1(entries, isSelected), function (entry) {\n return indentEntry(indentation, entry);\n });\n };\n var getItemSelection = function (editor) {\n var selectedListItems = map(getSelectedListItems(editor), SugarElement.fromDom);\n return lift2(find$1(selectedListItems, not(hasFirstChildList)), find$1(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$1(entrySets, function (entrySet) {\n indentSelectedEntries(entrySet.entries, indentation);\n var composedLists = composeEntries(editor, entrySet.entries);\n each$1(composedLists, function (composedList) {\n fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom);\n });\n before(entrySet.sourceList, composedLists);\n remove(entrySet.sourceList);\n });\n };\n\n var selectionIndentation = function (editor, indentation) {\n var lists = map(getSelectedListRoots(editor), SugarElement.fromDom);\n var dlItems = map(getSelectedDlItems(editor), SugarElement.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(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 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager');\n\n var DOM$1 = global$3.DOM;\n var createBookmark = function (rng) {\n var bookmark = {};\n var setupEndPoint = function (start) {\n var container = rng[start ? 'startContainer' : 'endContainer'];\n var offset = rng[start ? 'startOffset' : 'endOffset'];\n if (container.nodeType === 1) {\n var 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 var restoreEndPoint = function (start) {\n var 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 var container = node = bookmark[start ? 'startContainer' : 'endContainer'];\n var 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 normalizeRange(rng);\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 isCustomList = function (list) {\n return /\\btox\\-/.test(list.className);\n };\n var listState = function (editor, listName, activate) {\n var nodeChangeHandler = function (e) {\n var inList = findUntil(e.parents, isListNode, isTableCellNode).filter(function (list) {\n return list.nodeName === listName && !isCustomList(list);\n }).isSome();\n activate(inList);\n };\n var parents = editor.dom.getParents(editor.selection.getNode());\n nodeChangeHandler({ parents: parents });\n editor.on('NodeChange', nodeChangeHandler);\n return function () {\n return editor.off('NodeChange', nodeChangeHandler);\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$2.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$2.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$2.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 = rng[start ? 'startContainer' : 'endContainer'];\n var 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 && isBr(container.nextSibling)) {\n container = container.nextSibling;\n }\n while (container.parentNode !== root) {\n if (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 = [];\n var 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$2.each(siblings, function (node) {\n if (isTextBlock(editor, node)) {\n textBlocks.push(node);\n block = null;\n return;\n }\n if (dom.isBlock(node) || isBr(node)) {\n if (isBr(node)) {\n dom.remove(node);\n }\n block = null;\n return;\n }\n var nextSibling = node.nextSibling;\n if (global.isBookmarkNode(node)) {\n if (isListNode(nextSibling) || 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 var rng = editor.selection.getRng();\n var listItemName = 'LI';\n var root = 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 var bookmark = createBookmark(rng);\n var selectedTextBlocks = getSelectedTextBlocks(editor, rng, root);\n global$2.each(selectedTextBlocks, function (block) {\n var listBlock;\n var sibling = block.previousSibling;\n var parent = block.parentNode;\n if (!isListItemNode(parent)) {\n if (sibling && 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 });\n editor.selection.setRng(resolveBookmark(bookmark));\n };\n var isValidLists = function (list1, list2) {\n return list1 && list2 && 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$1 = 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 var parentIsList = isListNode(parentList);\n if (parentIsList && parentList.nodeName === listName && !hasListStyleDetail(detail)) {\n flattenListSelection(editor);\n } else {\n applyList(editor, listName, detail);\n var bookmark = createBookmark(editor.selection.getRng());\n var allLists = parentIsList ? __spreadArray([parentList], lists, true) : lists;\n global$2.each(allLists, function (elm) {\n updateList$1(editor, elm, listName, detail);\n });\n editor.selection.setRng(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 = createBookmark(editor.selection.getRng());\n updateListWithDetails(editor.dom, parentList, detail);\n var newList = editor.dom.rename(parentList, listName);\n mergeWithAdjacentLists(editor.dom, newList);\n editor.selection.setRng(resolveBookmark(bookmark));\n applyList(editor, listName, detail);\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 = getParentList(editor);\n var selectedSubLists = getSelectedSubLists(editor);\n var detail = isObject(_detail) ? _detail : {};\n if (selectedSubLists.length > 0) {\n toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail);\n } else {\n toggleSingleList(editor, parentList, listName, detail);\n }\n };\n\n var DOM = global$3.DOM;\n var normalizeList = function (dom, list) {\n var parentNode = list.parentNode;\n if (parentNode.nodeName === 'LI' && parentNode.firstChild === list) {\n var sibling = parentNode.previousSibling;\n if (sibling && sibling.nodeName === 'LI') {\n sibling.appendChild(list);\n if (isEmpty(dom, parentNode)) {\n DOM.remove(parentNode);\n }\n } else {\n DOM.setStyle(parentNode, 'listStyleType', 'none');\n }\n }\n if (isListNode(parentNode)) {\n var sibling = parentNode.previousSibling;\n if (sibling && sibling.nodeName === 'LI') {\n sibling.appendChild(list);\n }\n }\n };\n var normalizeLists = function (dom, element) {\n var lists = global$2.grep(dom.select('ol,ul', element));\n global$2.each(lists, function (list) {\n normalizeList(dom, list);\n });\n };\n\n var findNextCaretContainer = function (editor, rng, isForward, root) {\n var node = rng.startContainer;\n var offset = rng.startOffset;\n if (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$6.getNode(node, offset);\n }\n var walker = new global$5(node, root);\n if (isForward) {\n if (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 (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 && !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;\n var targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm;\n unwrapSingleBlockChild(dom, fromElm);\n if (!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 listNode;\n var ul = fromElm.parentNode;\n if (!isChildOfBody(dom, fromElm) || !isChildOfBody(dom, toElm)) {\n return;\n }\n if (isListNode(toElm.lastChild)) {\n listNode = toElm.lastChild;\n }\n if (ul === toElm.lastChild) {\n if (isBr(ul.previousSibling)) {\n dom.remove(ul.previousSibling);\n }\n }\n var node = toElm.lastChild;\n if (node && isBr(node) && fromElm.hasChildNodes()) {\n dom.remove(node);\n }\n if (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$1 = contains(SugarElement.fromDom(toElm), SugarElement.fromDom(fromElm));\n var nestedLists = contains$1 ? dom.getParents(fromElm, isListNode, toElm) : [];\n dom.remove(fromElm);\n each$1(nestedLists, function (list) {\n if (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, 0);\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 = createBookmark(rng);\n mergeLiElements(dom, fromLi, toLi);\n editor.selection.setRng(resolveBookmark(bookmark));\n }\n };\n var mergeBackward = function (editor, rng, fromLi, toLi) {\n var bookmark = createBookmark(rng);\n mergeLiElements(editor.dom, fromLi, toLi);\n var resolvedBookmark = 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 = 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() && isEmpty(dom, ul)) {\n return true;\n }\n var rng_1 = 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 (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 = getClosestListRootElm(editor, selectionStartElm);\n var block = dom.getParent(selectionStartElm, dom.isBlock, root);\n if (block && dom.isEmpty(block)) {\n var rng = 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 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 = getClosestListRootElm(editor, selectionStartElm);\n var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root);\n if (startListParent || getSelectedListItems(editor).length > 0) {\n editor.undoManager.transact(function () {\n editor.execCommand('Delete');\n 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$1 = function (editor) {\n editor.on('keydown', function (e) {\n if (e.keyCode === global$4.BACKSPACE) {\n if (backspaceDelete(editor, false)) {\n e.preventDefault();\n }\n } else if (e.keyCode === global$4.DELETE) {\n if (backspaceDelete(editor, true)) {\n e.preventDefault();\n }\n }\n });\n };\n\n var get = function (editor) {\n return {\n backspaceDelete: function (isForward) {\n backspaceDelete(editor, isForward);\n }\n };\n };\n\n var updateList = function (editor, update) {\n var parentList = getParentList(editor);\n editor.undoManager.transact(function () {\n if (isObject(update.styles)) {\n editor.dom.setStyles(parentList, update.styles);\n }\n if (isObject(update.attrs)) {\n each(update.attrs, function (v, k) {\n return editor.dom.setAttrib(parentList, k, v);\n });\n }\n });\n };\n\n var parseAlphabeticBase26 = function (str) {\n var chars = reverse(trim(str).split(''));\n var values = map(chars, function (char, i) {\n var charValue = char.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1;\n return Math.pow(26, i) * charValue;\n });\n return foldl(values, function (sum, v) {\n return sum + v;\n }, 0);\n };\n var composeAlphabeticBase26 = function (value) {\n value--;\n if (value < 0) {\n return '';\n } else {\n var remainder = value % 26;\n var quotient = Math.floor(value / 26);\n var rest = composeAlphabeticBase26(quotient);\n var char = String.fromCharCode('A'.charCodeAt(0) + remainder);\n return rest + char;\n }\n };\n var isUppercase = function (str) {\n return /^[A-Z]+$/.test(str);\n };\n var isLowercase = function (str) {\n return /^[a-z]+$/.test(str);\n };\n var isNumeric = function (str) {\n return /^[0-9]+$/.test(str);\n };\n var deduceListType = function (start) {\n if (isNumeric(start)) {\n return 2;\n } else if (isUppercase(start)) {\n return 0;\n } else if (isLowercase(start)) {\n return 1;\n } else if (isEmpty$1(start)) {\n return 3;\n } else {\n return 4;\n }\n };\n var parseStartValue = function (start) {\n switch (deduceListType(start)) {\n case 2:\n return Optional.some({\n listStyleType: Optional.none(),\n start: start\n });\n case 0:\n return Optional.some({\n listStyleType: Optional.some('upper-alpha'),\n start: parseAlphabeticBase26(start).toString()\n });\n case 1:\n return Optional.some({\n listStyleType: Optional.some('lower-alpha'),\n start: parseAlphabeticBase26(start).toString()\n });\n case 3:\n return Optional.some({\n listStyleType: Optional.none(),\n start: ''\n });\n case 4:\n return Optional.none();\n }\n };\n var parseDetail = function (detail) {\n var start = parseInt(detail.start, 10);\n if (is(detail.listStyleType, 'upper-alpha')) {\n return composeAlphabeticBase26(start);\n } else if (is(detail.listStyleType, 'lower-alpha')) {\n return composeAlphabeticBase26(start).toLowerCase();\n } else {\n return detail.start;\n }\n };\n\n var open = function (editor) {\n var currentList = getParentList(editor);\n if (!isOlNode(currentList)) {\n return;\n }\n editor.windowManager.open({\n title: 'List Properties',\n body: {\n type: 'panel',\n items: [{\n type: 'input',\n name: 'start',\n label: 'Start list at number',\n inputMode: 'numeric'\n }]\n },\n initialData: {\n start: parseDetail({\n start: editor.dom.getAttrib(currentList, 'start', '1'),\n listStyleType: Optional.some(editor.dom.getStyle(currentList, 'list-style-type'))\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 onSubmit: function (api) {\n var data = api.getData();\n parseStartValue(data.start).each(function (detail) {\n editor.execCommand('mceListUpdate', false, {\n attrs: { start: detail.start === '1' ? '' : detail.start },\n styles: { 'list-style-type': detail.listStyleType.getOr('') }\n });\n });\n api.close();\n }\n });\n };\n\n var queryListCommandState = function (editor, listName) {\n return function () {\n var parentList = getParentList(editor);\n return parentList && parentList.nodeName === listName;\n };\n };\n var registerDialog = function (editor) {\n editor.addCommand('mceListProps', function () {\n open(editor);\n });\n };\n var register$2 = 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(editor, 'UL', detail);\n });\n editor.addCommand('InsertOrderedList', function (ui, detail) {\n toggleList(editor, 'OL', detail);\n });\n editor.addCommand('InsertDefinitionList', function (ui, detail) {\n toggleList(editor, 'DL', detail);\n });\n editor.addCommand('RemoveList', function () {\n flattenListSelection(editor);\n });\n registerDialog(editor);\n editor.addCommand('mceListUpdate', function (ui, detail) {\n if (isObject(detail)) {\n updateList(editor, detail);\n }\n });\n editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL'));\n editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL'));\n editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL'));\n };\n\n var setupTabKey = function (editor) {\n editor.on('keydown', function (e) {\n if (e.keyCode !== global$4.TAB || global$4.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 = function (editor) {\n if (shouldIndentOnTab(editor)) {\n setupTabKey(editor);\n }\n setup$1(editor);\n };\n\n var register$1 = function (editor) {\n var exec = function (command) {\n return function () {\n return editor.execCommand(command);\n };\n };\n if (!editor.hasPlugin('advlist')) {\n editor.ui.registry.addToggleButton('numlist', {\n icon: 'ordered-list',\n active: false,\n tooltip: 'Numbered list',\n onAction: exec('InsertOrderedList'),\n onSetup: function (api) {\n return listState(editor, 'OL', api.setActive);\n }\n });\n editor.ui.registry.addToggleButton('bullist', {\n icon: 'unordered-list',\n active: false,\n tooltip: 'Bullet list',\n onAction: exec('InsertUnorderedList'),\n onSetup: function (api) {\n return listState(editor, 'UL', api.setActive);\n }\n });\n }\n };\n\n var register = function (editor) {\n var listProperties = {\n text: 'List properties...',\n icon: 'ordered-list',\n onAction: function () {\n return editor.execCommand('mceListProps');\n },\n onSetup: function (api) {\n return listState(editor, 'OL', function (active) {\n return api.setDisabled(!active);\n });\n }\n };\n editor.ui.registry.addMenuItem('listprops', listProperties);\n editor.ui.registry.addContextMenu('lists', {\n update: function (node) {\n var parentList = getParentList(editor, node);\n return isOlNode(parentList) ? ['listprops'] : [];\n }\n });\n };\n\n function Plugin () {\n global$7.add('lists', function (editor) {\n if (editor.hasPlugin('rtc', true) === false) {\n setup(editor);\n register$2(editor);\n } else {\n registerDialog(editor);\n }\n register$1(editor);\n register(editor);\n return get(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/lists/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/media/index.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/media/index.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"media\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/media')\n// ES2015:\n// import 'tinymce/plugins/media'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/media/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/media/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/media/plugin.js": /*!**********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/media/plugin.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$9 = 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 typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\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 isNullable = function (a) {\n return a === null || a === undefined;\n };\n var isNonNullable = function (a) {\n return !isNullable(a);\n };\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\n\n var nativePush = Array.prototype.push;\n var each$1 = 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\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 return {\n get: get,\n set: set\n };\n };\n\n var keys = Object.keys;\n var hasOwnProperty = Object.hasOwnProperty;\n var each = 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 get$1 = function (obj, key) {\n return has(obj, key) ? Optional.from(obj[key]) : Optional.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\n var global$8 = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var global$7 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n var global$6 = 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$1 = global$7.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$1.parseStyle(style) : {};\n return {\n type: 'ephox-embed-iri',\n source: attrs.map['data-ephox-embed-iri'],\n altsource: '',\n poster: '',\n width: get$1(styles, 'max-width').map(trimPx).getOr(''),\n height: get$1(styles, 'max-height').map(trimPx).getOr('')\n };\n };\n var htmlToData = function (prefixes, html) {\n var isEphoxEmbed = Cell(false);\n var data = {};\n global$6({\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$8.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\n var global$5 = tinymce.util.Tools.resolve('tinymce.html.Schema');\n\n var global$4 = tinymce.util.Tools.resolve('tinymce.html.Writer');\n\n var DOM = global$7.DOM;\n var addPx = function (value) {\n return /^[0-9.]+$/.test(value) ? value + 'px' : value;\n };\n var setAttributes = function (attrs, updatedAttrs) {\n each(updatedAttrs, function (val, name) {\n var value = '' + val;\n if (attrs.map[name]) {\n var i = attrs.length;\n while (i--) {\n var attr = attrs[i];\n if (attr.name === name) {\n if (value) {\n attrs.map[name] = value;\n attr.value = value;\n } else {\n delete attrs.map[name];\n attrs.splice(i, 1);\n }\n }\n }\n } else if (value) {\n attrs.push({\n name: name,\n value: value\n });\n attrs.map[name] = value;\n }\n });\n };\n var updateEphoxEmbed = function (data, attrs) {\n var style = attrs.map.style;\n var styleMap = style ? DOM.parseStyle(style) : {};\n styleMap['max-width'] = addPx(data.width);\n styleMap['max-height'] = addPx(data.height);\n setAttributes(attrs, { style: DOM.serializeStyle(styleMap) });\n };\n var sources = [\n 'source',\n 'altsource'\n ];\n var updateHtml = function (html, data, updateAll) {\n var writer = global$4();\n var isEphoxEmbed = Cell(false);\n var sourceCount = 0;\n var hasImage;\n global$6({\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$5({})).parse(html);\n return writer.getContent();\n };\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&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$8.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 '';\n };\n var getFlashHtml = function (data) {\n var html = '';\n if (data.poster) {\n html += '';\n }\n html += '';\n return html;\n };\n var getAudioHtml = function (data, audioTemplateCallback) {\n if (audioTemplateCallback) {\n return audioTemplateCallback(data);\n } else {\n return '';\n }\n };\n var getVideoHtml = function (data, videoTemplateCallback) {\n if (videoTemplateCallback) {\n return videoTemplateCallback(data);\n } else {\n return '';\n }\n };\n var getScriptHtml = function (data) {\n return '';\n };\n var dataToHtml = function (editor, dataIn) {\n var data = global$8.extend({}, dataIn);\n if (!data.source) {\n global$8.extend(data, htmlToData(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 = guess(data.source);\n data.altsourcemime = 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(data.embed, data, true);\n } else {\n var videoScript = getVideoScriptMatch(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 = getAudioTemplateCallback(editor);\n var videoTemplateCallback = getVideoTemplateCallback(editor);\n data.width = data.width || '300';\n data.height = data.height || '150';\n global$8.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 isMediaElement = function (element) {\n return element.hasAttribute('data-mce-object') || element.hasAttribute('data-ephox-embed-iri');\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 === 'script') {\n e.preventDefault();\n }\n });\n editor.on('ObjectResized', function (e) {\n var target = e.target;\n if (target.getAttribute('data-mce-object')) {\n var html = target.getAttribute('data-mce-html');\n if (html) {\n html = unescape(html);\n target.setAttribute('data-mce-html', escape(updateHtml(html, {\n width: String(e.width),\n height: String(e.height)\n })));\n }\n }\n });\n };\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n var cache = {};\n var embedPromise = function (data, dataToHtml, handler) {\n return new global$3(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 global$3.resolve({\n html: dataToHtml(data),\n url: data.source\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 = getUrlResolver(editor);\n return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor));\n };\n var isCached = function (url) {\n return has(cache, url);\n };\n\n var extractMeta = function (sourceInput, data) {\n return get$1(data, sourceInput).bind(function (mainData) {\n return get$1(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$1(data, prop);\n };\n var getFromMetaData = function () {\n return get$1(metaData, prop);\n };\n var getNonEmptyValue = function (c) {\n return get$1(c, 'value').bind(function (v) {\n return v.length > 0 ? Optional.some(v) : Optional.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 Optional.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) : Optional.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$1(data, 'dimensions').each(function (dims) {\n each$1([\n 'width',\n 'height'\n ], function (prop) {\n get$1(metaData, prop).orThunk(function () {\n return get$1(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$1(data, 'source').getOr('') },\n altsource: { value: get$1(data, 'altsource').getOr('') },\n poster: { value: get$1(data, 'poster').getOr('') }\n });\n each$1([\n 'width',\n 'height'\n ], function (prop) {\n get$1(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(getScripts(editor), embedSnippet);\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(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('*[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('*[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(newData.embed, newData);\n if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) {\n handleInsert(editor, newData.embed);\n } else {\n 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 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 = !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 (hasAltSource(editor)) {\n advancedFormItems.push({\n name: 'altsource',\n type: 'urlinput',\n filetype: 'media',\n label: 'Alternative source URL'\n });\n }\n if (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\n var get = function (editor) {\n var showDialog$1 = function () {\n showDialog(editor);\n };\n return { showDialog: showDialog$1 };\n };\n\n var register$1 = function (editor) {\n var showDialog$1 = function () {\n showDialog(editor);\n };\n editor.addCommand('mceMedia', showDialog$1);\n };\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.Env');\n\n var global = tinymce.util.Tools.resolve('tinymce.html.DomParser');\n\n var sanitize = function (editor, html) {\n if (shouldFilterHtml(editor) === false) {\n return html;\n }\n var writer = global$4();\n var blocked;\n global$6({\n validate: false,\n allow_conditional_comments: false,\n comment: function (text) {\n if (!blocked) {\n writer.comment(text);\n }\n },\n cdata: function (text) {\n if (!blocked) {\n writer.cdata(text);\n }\n },\n text: function (text, raw) {\n if (!blocked) {\n writer.text(text, raw);\n }\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$5({})).parse(html);\n return writer.getContent();\n };\n\n var isLiveEmbedNode = function (node) {\n var name = node.name;\n return name === 'iframe' || name === 'video' || name === 'audio';\n };\n var getDimension = function (node, styles, dimension, defaultValue) {\n if (defaultValue === void 0) {\n defaultValue = null;\n }\n var value = node.attr(dimension);\n if (isNonNullable(value)) {\n return value;\n } else if (!has(styles, dimension)) {\n return defaultValue;\n } else {\n return null;\n }\n };\n var setDimensions = function (node, previewNode, styles) {\n var useDefaults = previewNode.name === 'img' || node.name === 'video';\n var defaultWidth = useDefaults ? '300' : null;\n var fallbackHeight = node.name === 'audio' ? '30' : '150';\n var defaultHeight = useDefaults ? fallbackHeight : null;\n previewNode.attr({\n width: getDimension(node, styles, 'width', defaultWidth),\n height: getDimension(node, styles, 'height', defaultHeight)\n });\n };\n var appendNodeContent = function (editor, nodeName, previewNode, html) {\n var newNode = global({\n forced_root_block: false,\n validate: false\n }, editor.schema).parse(html, { context: nodeName });\n while (newNode.firstChild) {\n previewNode.append(newNode.firstChild);\n }\n };\n var createPlaceholderNode = function (editor, node) {\n var name = node.name;\n var placeHolder = new global$2('img', 1);\n placeHolder.shortEnded = true;\n retainAttributesAndInnerHtml(editor, node, placeHolder);\n setDimensions(node, placeHolder, {});\n placeHolder.attr({\n 'style': node.attr('style'),\n 'src': global$1.transparentSrc,\n 'data-mce-object': name,\n 'class': 'mce-object mce-object-' + name\n });\n return placeHolder;\n };\n var createPreviewNode = function (editor, node) {\n var name = node.name;\n var previewWrapper = new global$2('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 var styles = editor.dom.parseStyle(node.attr('style'));\n var previewNode = new global$2(name, 1);\n setDimensions(node, previewNode, styles);\n previewNode.attr({\n src: node.attr('src'),\n style: node.attr('style'),\n class: node.attr('class')\n });\n if (name === 'iframe') {\n previewNode.attr({\n allowfullscreen: node.attr('allowfullscreen'),\n frameborder: '0'\n });\n } else {\n var attrs = [\n 'controls',\n 'crossorigin',\n 'currentTime',\n 'loop',\n 'muted',\n 'poster',\n 'preload'\n ];\n each$1(attrs, function (attrName) {\n previewNode.attr(attrName, node.attr(attrName));\n });\n var sanitizedHtml = previewWrapper.attr('data-mce-html');\n if (isNonNullable(sanitizedHtml)) {\n appendNodeContent(editor, name, previewNode, unescape(sanitizedHtml));\n }\n }\n var shimNode = new global$2('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 attribs = sourceNode.attributes;\n var ai = attribs.length;\n while (ai--) {\n var attrName = attribs[ai].name;\n var 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 var innerHtml = sourceNode.firstChild && sourceNode.firstChild.value;\n if (innerHtml) {\n targetNode.attr('data-mce-html', escape(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(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 (isLiveEmbedNode(node) && hasLiveEmbeds(editor) && global$1.ceFalse) {\n if (!isWithinEmbedWrapper(node)) {\n node.replace(createPreviewNode(editor, node));\n }\n } else {\n if (!isWithinEmbedWrapper(node)) {\n node.replace(createPlaceholderNode(editor, node));\n }\n }\n }\n };\n };\n\n var setup$1 = function (editor) {\n editor.on('preInit', function () {\n var specialElements = editor.schema.getSpecialElements();\n global$8.each('video audio iframe object'.split(' '), function (name) {\n specialElements[name] = new RegExp(']*>', 'gi');\n });\n var boolAttrs = editor.schema.getBoolAttrs();\n global$8.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) {\n boolAttrs[name] = {};\n });\n editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', 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$2(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$2('#text', 3);\n innerNode.raw = true;\n innerNode.value = 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('');\n }\n });\n });\n };\n\n var setup = 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\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('mceMedia');\n };\n editor.ui.registry.addToggleButton('media', {\n tooltip: 'Insert/edit media',\n icon: 'embed',\n onAction: onAction,\n onSetup: function (buttonApi) {\n var selection = editor.selection;\n buttonApi.setActive(isMediaElement(selection.getNode()));\n return selection.selectorChangedWithUnbind('img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]', buttonApi.setActive).unbind;\n }\n });\n editor.ui.registry.addMenuItem('media', {\n icon: 'embed',\n text: 'Media...',\n onAction: onAction\n });\n };\n\n function Plugin () {\n global$9.add('media', function (editor) {\n register$1(editor);\n register(editor);\n setup(editor);\n setup$1(editor);\n setup$2(editor);\n return get(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/media/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/nonbreaking/index.js": /*!***************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/nonbreaking/index.js ***! \***************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"nonbreaking\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/nonbreaking')\n// ES2015:\n// import 'tinymce/plugins/nonbreaking'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/nonbreaking/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/nonbreaking/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/nonbreaking/plugin.js": /*!****************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/nonbreaking/plugin.js ***! \****************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var getKeyboardSpaces = function (editor) {\n var spaces = editor.getParam('nonbreaking_force_tab', 0);\n if (typeof spaces === 'boolean') {\n return spaces === true ? 3 : 0;\n } else {\n return spaces;\n }\n };\n var wrapNbsps = function (editor) {\n return editor.getParam('nonbreaking_wrap', true, 'boolean');\n };\n\n var stringRepeat = function (string, repeats) {\n var str = '';\n for (var index = 0; index < repeats; index++) {\n str += string;\n }\n return str;\n };\n var isVisualCharsEnabled = function (editor) {\n return editor.plugins.visualchars ? editor.plugins.visualchars.isEnabled() : false;\n };\n var insertNbsp = function (editor, times) {\n var classes = function () {\n return isVisualCharsEnabled(editor) ? 'mce-nbsp-wrap mce-nbsp' : 'mce-nbsp-wrap';\n };\n var nbspSpan = function () {\n return '' + stringRepeat(' ', times) + '';\n };\n var shouldWrap = wrapNbsps(editor);\n var html = shouldWrap || editor.plugins.visualchars ? nbspSpan() : stringRepeat(' ', times);\n editor.undoManager.transact(function () {\n return editor.insertContent(html);\n });\n };\n\n var register$1 = function (editor) {\n editor.addCommand('mceNonBreaking', function () {\n insertNbsp(editor, 1);\n });\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.util.VK');\n\n var setup = function (editor) {\n var spaces = getKeyboardSpaces(editor);\n if (spaces > 0) {\n editor.on('keydown', function (e) {\n if (e.keyCode === global.TAB && !e.isDefaultPrevented()) {\n if (e.shiftKey) {\n return;\n }\n e.preventDefault();\n e.stopImmediatePropagation();\n insertNbsp(editor, spaces);\n }\n });\n }\n };\n\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('mceNonBreaking');\n };\n editor.ui.registry.addButton('nonbreaking', {\n icon: 'non-breaking',\n tooltip: 'Nonbreaking space',\n onAction: onAction\n });\n editor.ui.registry.addMenuItem('nonbreaking', {\n icon: 'non-breaking',\n text: 'Nonbreaking space',\n onAction: onAction\n });\n };\n\n function Plugin () {\n global$1.add('nonbreaking', function (editor) {\n register$1(editor);\n register(editor);\n setup(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/nonbreaking/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/pagebreak/index.js": /*!*************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/pagebreak/index.js ***! \*************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"pagebreak\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/pagebreak')\n// ES2015:\n// import 'tinymce/plugins/pagebreak'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/pagebreak/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/pagebreak/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/pagebreak/plugin.js": /*!**************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/pagebreak/plugin.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var global = tinymce.util.Tools.resolve('tinymce.Env');\n\n var getSeparatorHtml = function (editor) {\n return editor.getParam('pagebreak_separator', '');\n };\n var shouldSplitBlock = function (editor) {\n return editor.getParam('pagebreak_split_block', false);\n };\n\n var pageBreakClass = 'mce-pagebreak';\n var getPlaceholderHtml = function (shouldSplitBlock) {\n var html = '';\n return shouldSplitBlock ? '

' + html + '

' : html;\n };\n var setup$1 = function (editor) {\n var separatorHtml = getSeparatorHtml(editor);\n var shouldSplitBlock$1 = function () {\n return shouldSplitBlock(editor);\n };\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(shouldSplitBlock$1()));\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(pageBreakClass) !== -1) {\n var parentNode = node.parent;\n if (editor.schema.getBlockElements()[parentNode.name] && shouldSplitBlock$1()) {\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\n var register$1 = function (editor) {\n editor.addCommand('mcePageBreak', function () {\n editor.insertContent(getPlaceholderHtml(shouldSplitBlock(editor)));\n });\n };\n\n var setup = function (editor) {\n editor.on('ResolveName', function (e) {\n if (e.target.nodeName === 'IMG' && editor.dom.hasClass(e.target, pageBreakClass)) {\n e.name = 'pagebreak';\n }\n });\n };\n\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('mcePageBreak');\n };\n editor.ui.registry.addButton('pagebreak', {\n icon: 'page-break',\n tooltip: 'Page break',\n onAction: onAction\n });\n editor.ui.registry.addMenuItem('pagebreak', {\n text: 'Page break',\n icon: 'page-break',\n onAction: onAction\n });\n };\n\n function Plugin () {\n global$1.add('pagebreak', function (editor) {\n register$1(editor);\n register(editor);\n setup$1(editor);\n setup(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/pagebreak/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/paste/index.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/paste/index.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"paste\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/paste')\n// ES2015:\n// import 'tinymce/plugins/paste'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/paste/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/paste/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/paste/plugin.js": /*!**********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/paste/plugin.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\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 return {\n get: get,\n set: set\n };\n };\n\n var global$b = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var hasProPlugin = function (editor) {\n if (editor.hasPlugin('powerpaste', true)) {\n if (typeof window.console !== 'undefined' && window.console.log) {\n 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\n var get = function (clipboard) {\n return { clipboard: clipboard };\n };\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var isArray = isType('array');\n var isNullable = function (a) {\n return a === null || a === undefined;\n };\n var isNonNullable = function (a) {\n return !isNullable(a);\n };\n var isFunction = isSimpleType('function');\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from$1 = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from$1\n };\n\n var nativeSlice = Array.prototype.slice;\n var nativePush = Array.prototype.push;\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 filter$1 = 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, i) {\n acc = f(acc, x, i);\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 = isFunction(Array.from) ? Array.from : function (x) {\n return nativeSlice.call(x);\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 singleton = function (doRevoke) {\n var subject = Cell(Optional.none());\n var revoke = function () {\n return subject.get().each(doRevoke);\n };\n var clear = function () {\n revoke();\n subject.set(Optional.none());\n };\n var isSet = function () {\n return subject.get().isSome();\n };\n var get = function () {\n return subject.get();\n };\n var set = function (s) {\n revoke();\n subject.set(Optional.some(s));\n };\n return {\n clear: clear,\n isSet: isSet,\n get: get,\n set: set\n };\n };\n var value = function () {\n var subject = singleton(noop);\n var on = function (f) {\n return subject.get().each(f);\n };\n return __assign(__assign({}, subject), { on: on });\n };\n\n var checkRange = function (str, substr, start) {\n return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;\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 repeat = function (s, count) {\n return count <= 0 ? '' : new Array(count + 1).join(s);\n };\n\n var global$a = tinymce.util.Tools.resolve('tinymce.Env');\n\n var global$9 = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var global$8 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n var global$7 = tinymce.util.Tools.resolve('tinymce.util.VK');\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\n var global$6 = tinymce.util.Tools.resolve('tinymce.util.Tools');\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 getValidate = function (editor) {\n return editor.getParam('validate');\n };\n var getAllowHtmlDataUrls = function (editor) {\n return editor.getParam('allow_html_data_urls', false, 'boolean');\n };\n var getPasteDataImages = function (editor) {\n return editor.getParam('paste_data_images', false, 'boolean');\n };\n var getImagesDataImgFilter = function (editor) {\n return editor.getParam('images_dataimg_filter');\n };\n var getImagesReuseFilename = function (editor) {\n return editor.getParam('images_reuse_filename');\n };\n var getForcedRootBlock = function (editor) {\n return editor.getParam('forced_root_block');\n };\n var getForcedRootBlockAttrs = function (editor) {\n return editor.getParam('forced_root_block_attrs');\n };\n var getTabSpaces = function (editor) {\n return editor.getParam('paste_tab_spaces', 4, 'number');\n };\n var getAllowedImageFileTypes = function (editor) {\n var defaultImageFileTypes = 'jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp';\n return global$6.explode(editor.getParam('images_file_types', defaultImageFileTypes, 'string'));\n };\n\n var internalMimeType = 'x-tinymce/html';\n var internalMark = '';\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 internalHtmlMime = constant(internalMimeType);\n\n var hasOwnProperty = Object.hasOwnProperty;\n var has = function (obj, key) {\n return hasOwnProperty.call(obj, key);\n };\n\n var global$5 = 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, '
');\n };\n var openContainer = function (rootTag, rootAttrs) {\n var attrs = [];\n var tag = '<' + rootTag;\n if (typeof rootAttrs === 'object') {\n for (var key in rootAttrs) {\n if (has(rootAttrs, key)) {\n attrs.push(key + '=\"' + global$5.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 = '';\n var paragraphs = global$6.map(blocks, function (p) {\n return p.split(/\\n/).join('
');\n });\n var stitch = function (p) {\n return tagOpen + p + tagClose;\n };\n return paragraphs.length === 1 ? paragraphs[0] : global$6.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\n var global$4 = tinymce.util.Tools.resolve('tinymce.html.DomParser');\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.html.Serializer');\n\n var nbsp = '\\xA0';\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.html.Schema');\n\n var isRegExp = function (val) {\n return val.constructor === RegExp;\n };\n var filter = function (content, items) {\n global$6.each(items, function (v) {\n if (isRegExp(v)) {\n content = content.replace(v, '');\n } else {\n content = content.replace(v[0], v[1]);\n }\n });\n return content;\n };\n var innerText = function (html) {\n var schema = global$1();\n var domParser = global$4({}, schema);\n var text = '';\n var shortEndedElements = schema.getShortEndedElements();\n var ignoreElements = global$6.makeMap('script noscript style textarea video audio iframe object', ' ');\n var blockElements = schema.getBlockElements();\n var walk = function (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(html, [//g]);\n walk(domParser.parse(html));\n return text;\n };\n var trimHtml = function (html) {\n var trimSpaces = function (all, s1, s2) {\n if (!s1 && !s2) {\n return ' ';\n }\n return nbsp;\n };\n html = filter(html, [\n /^[\\s\\S]*]*>\\s*|\\s*<\\/body[^>]*>[\\s\\S]*$/ig,\n /|/g,\n [\n /( ?)\\u00a0<\\/span>( ?)/g,\n trimSpaces\n ],\n /
/g,\n /
$/i\n ]);\n return html;\n };\n var createIdGenerator = function (prefix) {\n var count = 0;\n return function () {\n return prefix + count++;\n };\n };\n var getImageMimeType = function (ext) {\n var lowerExt = ext.toLowerCase();\n var mimeOverrides = {\n jpg: 'jpeg',\n jpe: 'jpeg',\n jfi: 'jpeg',\n jif: 'jpeg',\n jfif: 'jpeg',\n pjpeg: 'jpeg',\n pjp: 'jpeg',\n svg: 'svg+xml'\n };\n return global$6.hasOwn(mimeOverrides, lowerExt) ? 'image/' + mimeOverrides[lowerExt] : 'image/' + lowerExt;\n };\n\n var isWordContent = function (content) {\n return / 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 var filterStyles = function (editor, validStyles, node, styleValue) {\n var outputStyles = {};\n var styles = editor.dom.parseStyle(styleValue);\n global$6.each(styles, function (value, name) {\n switch (name) {\n case 'mso-list':\n var 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 (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$2('b', 1));\n }\n if (/(italic)/i.test(outputStyles['font-style'])) {\n delete outputStyles['font-style'];\n node.wrap(new global$2('i', 1));\n }\n var outputStyle = editor.dom.serializeStyle(outputStyles, node.name);\n if (outputStyle) {\n return outputStyle;\n }\n return null;\n };\n var filterWordContent = function (editor, content) {\n var validStyles;\n var retainStyleProperties = getRetainStyleProps(editor);\n if (retainStyleProperties) {\n validStyles = global$6.makeMap(retainStyleProperties.split(/[, ]/));\n }\n content = filter(content, [\n /
/gi,\n /]+id=\"?docs-internal-[^>]*>/gi,\n //gi,\n /<(!|script[^>]*>.*?<\\/script(?=[>\\s])|\\/?(\\?xml(:\\w+)?|img|meta|link|style|\\w:\\w+)(?=[\\s\\/>]))[^>]*>/gi,\n [\n /<(\\/?)s>/gi,\n '<$1strike>'\n ],\n [\n / /gi,\n nbsp\n ],\n [\n /([\\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 = getWordValidElements(editor);\n var schema = global$1({\n valid_elements: validElements,\n valid_children: '-li[p]'\n });\n global$6.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$4({}, 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 (shouldConvertWordFakeLists(editor)) {\n convertFakeListsToProperLists(rootNode);\n }\n content = global$3({ validate: getValidate(editor) }, schema).serialize(rootNode);\n return content;\n };\n var preProcess$1 = function (editor, content) {\n return shouldUseDefaultFilters(editor) ? filterWordContent(editor, content) : content;\n };\n\n var preProcess = function (editor, html) {\n var parser = global$4({}, editor.schema);\n parser.addNodeFilter('meta', function (nodes) {\n global$6.each(nodes, function (node) {\n node.remove();\n });\n });\n var fragment = parser.parse(html, {\n forced_root_block: false,\n isRootContent: true\n });\n return global$3({ validate: getValidate(editor) }, 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 = 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 = firePastePreProcess(editor, content, internal, isWordHtml);\n var filteredContent = preProcess(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 = isWordContent(html);\n var content = isWordHtml ? preProcess$1(editor, html) : html;\n return filterContent(editor, content, internal, isWordHtml);\n };\n\n var pasteHtml$1 = function (editor, html) {\n editor.insertContent(html, {\n merge: 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 (editor, url) {\n return isAbsoluteUrl(url) && exists(getAllowedImageFileTypes(editor), function (type) {\n return endsWith(url.toLowerCase(), '.' + type.toLowerCase());\n });\n };\n var createImage = function (editor, url, pasteHtmlFn) {\n editor.undoManager.extra(function () {\n pasteHtmlFn(editor, url);\n }, function () {\n editor.insertContent('');\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(editor, html) ? createImage(editor, html, pasteHtmlFn) : false;\n };\n var smartInsertContent = function (editor, html) {\n global$6.each([\n linkSelection,\n insertImage,\n pasteHtml$1\n ], function (action) {\n return action(editor, html, pasteHtml$1) !== true;\n });\n };\n var insertContent = function (editor, html, pasteAsText) {\n if (pasteAsText || isSmartPasteEnabled(editor) === false) {\n pasteHtml$1(editor, html);\n } else {\n smartInsertContent(editor, html);\n }\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 (editor, text) {\n var tabSpace = repeat(' ', getTabSpaces(editor));\n var normalizedText = text.replace(/\\t/g, tabSpace);\n var result = foldl(normalizedText, function (acc, c) {\n if (isCollapsibleWhitespace(c) || c === nbsp) {\n if (acc.pcIsSpace || acc.str === '' || acc.str.length === normalizedText.length - 1 || isNewline(normalizedText, 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 = process(editor, content, internal);\n if (args.cancelled === false) {\n insertContent(editor, args.content, pasteAsText);\n }\n };\n var pasteHtml = function (editor, html, internalFlag) {\n var internal = internalFlag ? internalFlag : isMarked(html);\n doPaste(editor, 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(editor, encodedText);\n var html = convert(normalizedText, getForcedRootBlock(editor), getForcedRootBlockAttrs(editor));\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 return getDataTransferItems(clipboardEvent.clipboardData || editor.getDoc().dataTransfer);\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 parseDataUri = function (uri) {\n var matches = /data:([^;]+);base64,([a-z0-9\\+\\/=]+)/i.exec(uri);\n if (matches) {\n return {\n type: matches[1],\n data: decodeURIComponent(matches[2])\n };\n } else {\n return {\n type: null,\n data: null\n };\n }\n };\n var isValidDataUriImage = function (editor, imgElm) {\n var filter = getImagesDataImgFilter(editor);\n return filter ? filter(imgElm) : true;\n };\n var extractFilename = function (editor, str) {\n var m = str.match(/([\\s\\S]+?)(?:\\.[a-z0-9.]+)$/i);\n return isNonNullable(m) ? editor.dom.encode(m[1]) : null;\n };\n var uniqueId = createIdGenerator('mceclip');\n var pasteImage = function (editor, imageItem) {\n var _a = parseDataUri(imageItem.uri), base64 = _a.data, type = _a.type;\n var id = uniqueId();\n var file = imageItem.blob;\n var img = new Image();\n img.src = imageItem.uri;\n if (isValidDataUriImage(editor, img)) {\n var blobCache = editor.editorUpload.blobCache;\n var blobInfo = void 0;\n var existingBlobInfo = blobCache.getByData(base64, type);\n if (!existingBlobInfo) {\n var useFileName = getImagesReuseFilename(editor) && isNonNullable(file.name);\n var name_1 = useFileName ? extractFilename(editor, file.name) : id;\n var filename = useFileName ? file.name : undefined;\n blobInfo = blobCache.create(id, file, base64, name_1, filename);\n blobCache.add(blobInfo);\n } else {\n blobInfo = existingBlobInfo;\n }\n pasteHtml(editor, '', false);\n } else {\n pasteHtml(editor, '', false);\n }\n };\n var isClipboardEvent = function (event) {\n return event.type === 'paste';\n };\n var isDataTransferItem = function (item) {\n return isNonNullable(item.getAsFile);\n };\n var readFilesAsDataUris = function (items) {\n return global$8.all(map(items, function (item) {\n return new global$8(function (resolve) {\n var blob = isDataTransferItem(item) ? 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 isImage = function (editor) {\n var allowedExtensions = getAllowedImageFileTypes(editor);\n return function (file) {\n return startsWith(file.type, 'image/') && exists(allowedExtensions, function (extension) {\n return getImageMimeType(extension) === file.type;\n });\n };\n };\n var getImagesFromDataTransfer = function (editor, dataTransfer) {\n var items = dataTransfer.items ? bind(from(dataTransfer.items), function (item) {\n return item.kind === 'file' ? [item.getAsFile()] : [];\n }) : [];\n var files = dataTransfer.files ? from(dataTransfer.files) : [];\n return filter$1(items.length > 0 ? items : files, isImage(editor));\n };\n var pasteImageData = function (editor, e, rng) {\n var dataTransfer = isClipboardEvent(e) ? e.clipboardData : e.dataTransfer;\n if (getPasteDataImages(editor) && dataTransfer) {\n var images = getImagesFromDataTransfer(editor, dataTransfer);\n if (images.length > 0) {\n e.preventDefault();\n readFilesAsDataUris(images).then(function (fileResults) {\n if (rng) {\n editor.selection.setRng(rng);\n }\n each(fileResults, 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 navigator.userAgent.indexOf('Android') !== -1 && clipboardData && clipboardData.items && clipboardData.items.length === 0;\n };\n var isKeyboardPasteEvent = function (e) {\n return global$7.metaKeyPressed(e) && e.keyCode === 86 || e.shiftKey && e.keyCode === 45;\n };\n var registerEventHandlers = function (editor, pasteBin, pasteFormat) {\n var keyboardPasteEvent = value();\n var keyboardPastePressed = value();\n var keyboardPastePlainTextState;\n editor.on('keyup', keyboardPastePressed.clear);\n editor.on('keydown', function (e) {\n var removePasteBinOnKeyUp = function (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$a.webkit && navigator.userAgent.indexOf('Version/') !== -1) {\n return;\n }\n e.stopImmediatePropagation();\n keyboardPasteEvent.set(e);\n keyboardPastePressed.set(true);\n if (global$a.ie && keyboardPastePlainTextState) {\n e.preventDefault();\n 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 var insertClipboardContent = function (editor, clipboardContent, isKeyBoardPaste, plainTextMode, internal) {\n var content;\n if (hasContentType(clipboardContent, 'text/html')) {\n content = clipboardContent['text/html'];\n } else {\n content = pasteBin.getHtml();\n internal = internal ? internal : isMarked(content);\n if (pasteBin.isDefaultContent(content)) {\n plainTextMode = true;\n }\n }\n content = trimHtml(content);\n pasteBin.remove();\n var isPlainTextHtml = internal === false && isPlainText(content);\n var isAbsoluteUrl$1 = isAbsoluteUrl(content);\n if (!content.length || isPlainTextHtml && !isAbsoluteUrl$1) {\n plainTextMode = true;\n }\n if (plainTextMode || isAbsoluteUrl$1) {\n if (hasContentType(clipboardContent, 'text/plain') && isPlainTextHtml) {\n content = clipboardContent['text/plain'];\n } else {\n content = 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(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() || keyboardPastePressed.isSet();\n if (isKeyboardPaste) {\n keyboardPasteEvent.clear();\n }\n var clipboardContent = getClipboardContent(editor, e);\n var plainTextMode = pasteFormat.get() === 'text' || keyboardPastePlainTextState;\n var internal = hasContentType(clipboardContent, 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$a.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 = isMarked(clipboardContent['text/html']);\n }\n insertClipboardContent(editor, clipboardContent, isKeyboardPaste, plainTextMode, internal);\n } else {\n global$9.setEditorTimeout(editor, function () {\n insertClipboardContent(editor, 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$a.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 (!getPasteDataImages(editor) && 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 (!getAllowHtmlDataUrls(editor) && isDataUri(src)) {\n remove(nodes[i]);\n }\n }\n }\n });\n };\n\n var getPasteBinParent = function (editor) {\n return global$a.ie && editor.inline ? 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 lastRngCell.set(editor.selection.getRng());\n var 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$a.ie || global$a.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 copyAndRemove = function (toElm, fromElm) {\n toElm.appendChild(fromElm);\n editor.dom.remove(fromElm, true);\n };\n var pasteBinClones = global$6.grep(getPasteBinParent(editor).childNodes, function (elm) {\n return elm.id === 'mcepastebin';\n });\n var pasteBinElm = pasteBinClones.shift();\n global$6.each(pasteBinClones, function (pasteBinClone) {\n copyAndRemove(pasteBinElm, pasteBinClone);\n });\n var dirtyWrappers = editor.dom.select('div[id=mcepastebin]', pasteBinElm);\n for (var i = dirtyWrappers.length - 1; i >= 0; i--) {\n var 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 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: lastRng.get,\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(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 togglePlainTextPaste = function (editor, clipboard) {\n if (clipboard.pasteFormat.get() === 'text') {\n clipboard.pasteFormat.set('html');\n firePastePlainTextToggle(editor, false);\n } else {\n clipboard.pasteFormat.set('text');\n firePastePlainTextToggle(editor, true);\n }\n editor.focus();\n };\n\n var register$2 = function (editor, clipboard) {\n editor.addCommand('mceTogglePlainTextPaste', function () {\n 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\n var hasWorkingClipboardApi = function (clipboardData) {\n return global$a.iOS === false && typeof (clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.setData) === 'function';\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(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 = 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$9.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$a.browser.isChrome() || global$a.browser.isFirefox()) {\n var rng_1 = editor.selection.getRng();\n global$9.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), noop);\n }\n };\n };\n var register$1 = function (editor) {\n editor.on('cut', cut(editor));\n editor.on('copy', copy(editor));\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils');\n\n var getCaretRangeFromEvent = function (editor, e) {\n return global.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$2 = function (editor, clipboard, draggingInternallyState) {\n if (shouldBlockDrop(editor)) {\n editor.on('dragend dragover draggesture dragdrop drop drag', function (e) {\n e.preventDefault();\n e.stopPropagation();\n });\n }\n if (!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 rng = getCaretRangeFromEvent(editor, e);\n if (e.isDefaultPrevented() || draggingInternallyState.get()) {\n return;\n }\n var dropContent = clipboard.getDataTransferItems(e.dataTransfer);\n var internal = clipboard.hasContentType(dropContent, internalHtmlMime());\n if ((!clipboard.hasHtmlOrText(dropContent) || isPlainTextFileUrl(dropContent)) && clipboard.pasteImageData(e, rng)) {\n return;\n }\n if (rng && shouldFilterDrop(editor)) {\n var content_1 = dropContent['mce-internal'] || dropContent['text/html'] || dropContent['text/plain'];\n if (content_1) {\n e.preventDefault();\n global$9.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 = 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 (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\n var setup$1 = function (editor) {\n var plugin = editor.plugins.paste;\n var preProcess = getPreProcess(editor);\n if (preProcess) {\n editor.on('PastePreProcess', function (e) {\n preProcess.call(plugin, plugin, e);\n });\n }\n var postProcess = getPostProcess(editor);\n if (postProcess) {\n editor.on('PastePostProcess', function (e) {\n postProcess.call(plugin, plugin, e);\n });\n }\n };\n\n var addPreProcessFilter = function (editor, filterFunc) {\n editor.on('PastePreProcess', function (e) {\n e.content = filterFunc(editor, e.content, e.internal, e.wordContent);\n });\n };\n var addPostProcessFilter = function (editor, filterFunc) {\n editor.on('PastePostProcess', function (e) {\n filterFunc(editor, e.node);\n });\n };\n var removeExplorerBrElementsAfterBlocks = function (editor, html) {\n if (!isWordContent(html)) {\n return html;\n }\n var blockElements = [];\n global$6.each(editor.schema.getBlockElements(), function (block, blockName) {\n blockElements.push(blockName);\n });\n var explorerBlocksRegExp = new RegExp('(?:
 [\\\\s\\\\r\\\\n]+|
)*(<\\\\/?(' + blockElements.join('|') + ')[^>]*>)(?:
 [\\\\s\\\\r\\\\n]+|
)*', 'g');\n html = filter(html, [[\n explorerBlocksRegExp,\n '$1'\n ]]);\n html = filter(html, [\n [\n /

/g,\n '

'\n ],\n [\n /
/g,\n ' '\n ],\n [\n /

/g,\n '
'\n ]\n ]);\n return html;\n };\n var removeWebKitStyles = function (editor, content, internal, isWordHtml) {\n if (isWordHtml || internal) {\n return content;\n }\n var webKitStylesSetting = getWebkitStyles(editor);\n var webKitStyles;\n if (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 var outputStyle = dom_1.serializeStyle(outputStyles, 'span');\n if (outputStyle) {\n return before + ' style=\"' + outputStyle + '\"' + 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 var removeUnderlineAndFontInAnchor = function (editor, root) {\n editor.$('a', root).find('font,u').each(function (i, node) {\n editor.dom.remove(node, true);\n });\n };\n var setup = function (editor) {\n if (global$a.webkit) {\n addPreProcessFilter(editor, removeWebKitStyles);\n }\n if (global$a.ie) {\n addPreProcessFilter(editor, removeExplorerBrElementsAfterBlocks);\n addPostProcessFilter(editor, removeUnderlineAndFontInAnchor);\n }\n };\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 = function (editor, clipboard) {\n var onAction = function () {\n return editor.execCommand('mceTogglePlainTextPaste');\n };\n editor.ui.registry.addToggleButton('pastetext', {\n active: false,\n icon: 'paste-text',\n tooltip: 'Paste as text',\n onAction: onAction,\n onSetup: makeSetupHandler(editor, clipboard)\n });\n editor.ui.registry.addToggleMenuItem('pastetext', {\n text: 'Paste as text',\n icon: 'paste-text',\n onAction: onAction,\n onSetup: makeSetupHandler(editor, clipboard)\n });\n };\n\n function Plugin () {\n global$b.add('paste', function (editor) {\n if (hasProPlugin(editor) === false) {\n var draggingInternallyState = Cell(false);\n var pasteFormat = Cell(isPasteAsTextEnabled(editor) ? 'text' : 'html');\n var clipboard = Clipboard(editor, pasteFormat);\n setup(editor);\n register(editor, clipboard);\n register$2(editor, clipboard);\n setup$1(editor);\n register$1(editor);\n setup$2(editor, clipboard, draggingInternallyState);\n return get(clipboard);\n }\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/paste/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/preview/index.js": /*!***********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/preview/index.js ***! \***********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"preview\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/preview')\n// ES2015:\n// import 'tinymce/plugins/preview'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/preview/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/preview/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/preview/plugin.js": /*!************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/preview/plugin.js ***! \************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.Env');\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var getContentStyle = function (editor) {\n return editor.getParam('content_style', '', 'string');\n };\n var shouldUseContentCssCors = function (editor) {\n return editor.getParam('content_css_cors', false, 'boolean');\n };\n var getBodyClassByHash = function (editor) {\n var bodyClass = editor.getParam('body_class', '', 'hash');\n return bodyClass[editor.id] || '';\n };\n var getBodyClass = function (editor) {\n var bodyClass = editor.getParam('body_class', '', 'string');\n if (bodyClass.indexOf('=') === -1) {\n return bodyClass;\n } else {\n return getBodyClassByHash(editor);\n }\n };\n var getBodyIdByHash = function (editor) {\n var bodyId = editor.getParam('body_id', '', 'hash');\n return bodyId[editor.id] || bodyId;\n };\n var getBodyId = function (editor) {\n var bodyId = editor.getParam('body_id', 'tinymce', 'string');\n if (bodyId.indexOf('=') === -1) {\n return bodyId;\n } else {\n return getBodyIdByHash(editor);\n }\n };\n\n var getPreviewHtml = function (editor) {\n var headHtml = '';\n var encode = editor.dom.encode;\n var contentStyle = getContentStyle(editor);\n headHtml += '';\n var cors = shouldUseContentCssCors(editor) ? ' crossorigin=\"anonymous\"' : '';\n global.each(editor.contentCSS, function (url) {\n headHtml += '';\n });\n if (contentStyle) {\n headHtml += '';\n }\n var bodyId = getBodyId(editor);\n var bodyClass = getBodyClass(editor);\n var isMetaKeyPressed = global$1.mac ? 'e.metaKey' : 'e.ctrlKey && !e.altKey';\n var preventClicksOnLinksScript = ' ';\n var directionality = editor.getBody().dir;\n var dirAttr = directionality ? ' dir=\"' + encode(directionality) + '\"' : '';\n var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + '';\n return previewHtml;\n };\n\n var open = function (editor) {\n var content = 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$1 = function (editor) {\n editor.addCommand('mcePreview', function () {\n open(editor);\n });\n };\n\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('mcePreview');\n };\n editor.ui.registry.addButton('preview', {\n icon: 'preview',\n tooltip: 'Preview',\n onAction: onAction\n });\n editor.ui.registry.addMenuItem('preview', {\n icon: 'preview',\n text: 'Preview',\n onAction: onAction\n });\n };\n\n function Plugin () {\n global$2.add('preview', function (editor) {\n register$1(editor);\n register(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/preview/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/print/index.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/print/index.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"print\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/print')\n// ES2015:\n// import 'tinymce/plugins/print'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/print/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/print/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/print/plugin.js": /*!**********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/print/plugin.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var global = tinymce.util.Tools.resolve('tinymce.Env');\n\n var register$1 = function (editor) {\n editor.addCommand('mcePrint', function () {\n if (global.browser.isIE()) {\n editor.getDoc().execCommand('print', false, null);\n } else {\n editor.getWin().print();\n }\n });\n };\n\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('mcePrint');\n };\n editor.ui.registry.addButton('print', {\n icon: 'print',\n tooltip: 'Print',\n onAction: onAction\n });\n editor.ui.registry.addMenuItem('print', {\n text: 'Print...',\n icon: 'print',\n onAction: onAction\n });\n };\n\n function Plugin () {\n global$1.add('print', function (editor) {\n register$1(editor);\n register(editor);\n editor.addShortcut('Meta+P', '', 'mcePrint');\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/print/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/quickbars/index.js": /*!*************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/quickbars/index.js ***! \*************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"quickbars\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/quickbars')\n// ES2015:\n// import 'tinymce/plugins/quickbars'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/quickbars/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/quickbars/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/quickbars/plugin.js": /*!**************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/quickbars/plugin.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager');\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 createTableHtml = function (cols, rows) {\n var html = '';\n html += '';\n for (var y = 0; y < rows; y++) {\n html += '';\n for (var x = 0; x < cols; x++) {\n html += '';\n }\n html += '';\n }\n html += '';\n html += '

';\n return html;\n };\n var getInsertedElement = function (editor) {\n var elms = editor.dom.select('*[data-mce-id]');\n return elms[0];\n };\n var insertTableHtml = function (editor, cols, rows) {\n editor.undoManager.transact(function () {\n editor.insertContent(createTableHtml(cols, rows));\n var tableElm = getInsertedElement(editor);\n tableElm.removeAttribute('data-mce-id');\n var cellElm = editor.dom.select('td,th', tableElm);\n editor.selection.setCursorLocation(cellElm[0], 0);\n });\n };\n var insertTable = function (editor, cols, rows) {\n editor.plugins.table ? editor.plugins.table.insertTable(cols, rows) : insertTableHtml(editor, cols, rows);\n };\n var insertBlob = function (editor, base64, blob) {\n var blobCache = editor.editorUpload.blobCache;\n var blobInfo = blobCache.create(generate('mceu'), blob, base64);\n blobCache.add(blobInfo);\n editor.insertContent(editor.dom.createHTML('img', { src: blobInfo.blobUri() }));\n };\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise');\n\n var blobToBase64 = function (blob) {\n return new global$2(function (resolve) {\n var reader = new FileReader();\n reader.onloadend = function () {\n resolve(reader.result.split(',')[1]);\n };\n reader.readAsDataURL(blob);\n });\n };\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.Env');\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var pickFile = function (editor) {\n return new global$2(function (resolve) {\n var fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.accept = 'image/*';\n fileInput.style.position = 'fixed';\n fileInput.style.left = '0';\n fileInput.style.top = '0';\n fileInput.style.opacity = '0.001';\n document.body.appendChild(fileInput);\n var changeHandler = function (e) {\n resolve(Array.prototype.slice.call(e.target.files));\n };\n fileInput.addEventListener('change', changeHandler);\n var cancelHandler = function (e) {\n var cleanup = function () {\n resolve([]);\n fileInput.parentNode.removeChild(fileInput);\n };\n if (global$1.os.isAndroid() && e.type !== 'remove') {\n global.setEditorTimeout(editor, cleanup, 0);\n } else {\n cleanup();\n }\n editor.off('focusin remove', cancelHandler);\n };\n editor.on('focusin remove', cancelHandler);\n fileInput.click();\n });\n };\n\n var setupButtons = function (editor) {\n editor.ui.registry.addButton('quickimage', {\n icon: 'image',\n tooltip: 'Insert image',\n onAction: function () {\n pickFile(editor).then(function (files) {\n if (files.length > 0) {\n var blob_1 = files[0];\n blobToBase64(blob_1).then(function (base64) {\n insertBlob(editor, base64, blob_1);\n });\n }\n });\n }\n });\n editor.ui.registry.addButton('quicktable', {\n icon: 'table',\n tooltip: 'Insert table',\n onAction: function () {\n insertTable(editor, 2, 2);\n }\n });\n };\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var eq = function (t) {\n return function (a) {\n return t === a;\n };\n };\n var isString = isType('string');\n var isObject = isType('object');\n var isArray = isType('array');\n var isBoolean = isSimpleType('boolean');\n var isUndefined = eq(undefined);\n var isFunction = isSimpleType('function');\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\n\n function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {\n if (is(scope, a)) {\n return Optional.some(scope);\n } else if (isFunction(isRoot) && isRoot(scope)) {\n return Optional.none();\n } else {\n return ancestor(scope, a, isRoot);\n }\n }\n\n var ELEMENT = 1;\n\n var fromHtml = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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 || document;\n var node = doc.createElement(tag);\n return fromDom(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || 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: node };\n };\n var fromPoint = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n };\n var SugarElement = {\n fromHtml: fromHtml,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom,\n fromPoint: fromPoint\n };\n\n var is = function (element, selector) {\n var dom = element.dom;\n if (dom.nodeType !== ELEMENT) {\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 typeof window !== 'undefined' ? window : Function('return this;')();\n\n var name = function (element) {\n var r = element.dom.nodeName;\n return r.toLowerCase();\n };\n\n var ancestor$1 = function (scope, predicate, isRoot) {\n var element = scope.dom;\n var stop = isFunction(isRoot) ? isRoot : never;\n while (element.parentNode) {\n element = element.parentNode;\n var el = SugarElement.fromDom(element);\n if (predicate(el)) {\n return Optional.some(el);\n } else if (stop(el)) {\n break;\n }\n }\n return Optional.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\n var ancestor = function (scope, selector, isRoot) {\n return ancestor$1(scope, function (e) {\n return is(e, selector);\n }, isRoot);\n };\n var closest = function (scope, selector, isRoot) {\n var is$1 = function (element, selector) {\n return is(element, selector);\n };\n return ClosestOrAncestor(is$1, ancestor, scope, selector, isRoot);\n };\n\n var validDefaultOrDie = function (value, predicate) {\n if (predicate(value)) {\n return true;\n }\n throw new Error('Default value doesn\\'t match requested type.');\n };\n var items = function (value, defaultValue) {\n if (isArray(value) || isObject(value)) {\n throw new Error('expected a string but found: ' + value);\n }\n if (isUndefined(value)) {\n return defaultValue;\n }\n if (isBoolean(value)) {\n return value === false ? '' : defaultValue;\n }\n return value;\n };\n var getToolbarItemsOr_ = function (predicate) {\n return function (editor, name, defaultValue) {\n validDefaultOrDie(defaultValue, predicate);\n var value = editor.getParam(name, defaultValue);\n return items(value, defaultValue);\n };\n };\n var getToolbarItemsOr = getToolbarItemsOr_(isString);\n\n var getTextSelectionToolbarItems = function (editor) {\n return getToolbarItemsOr(editor, 'quickbars_selection_toolbar', 'bold italic | quicklink h2 h3 blockquote');\n };\n var getInsertToolbarItems = function (editor) {\n return getToolbarItemsOr(editor, 'quickbars_insert_toolbar', 'quickimage quicktable');\n };\n var getImageToolbarItems = function (editor) {\n return getToolbarItemsOr(editor, 'quickbars_image_toolbar', 'alignleft aligncenter alignright');\n };\n\n var addToEditor$1 = function (editor) {\n var insertToolbarItems = getInsertToolbarItems(editor);\n if (insertToolbarItems.trim().length > 0) {\n editor.ui.registry.addContextToolbar('quickblock', {\n predicate: function (node) {\n var sugarNode = SugarElement.fromDom(node);\n var textBlockElementsMap = editor.schema.getTextBlockElements();\n var isRoot = function (elem) {\n return elem.dom === editor.getBody();\n };\n return closest(sugarNode, 'table', isRoot).fold(function () {\n return closest$1(sugarNode, function (elem) {\n return name(elem) in textBlockElementsMap && editor.dom.isEmpty(elem.dom);\n }, isRoot).isSome();\n }, never);\n },\n items: insertToolbarItems,\n position: 'line',\n scope: 'editor'\n });\n }\n };\n\n var addToEditor = function (editor) {\n var isEditable = function (node) {\n return editor.dom.getContentEditableParent(node) !== 'false';\n };\n var isImage = function (node) {\n return node.nodeName === 'IMG' || node.nodeName === 'FIGURE' && /image/i.test(node.className);\n };\n var imageToolbarItems = getImageToolbarItems(editor);\n if (imageToolbarItems.trim().length > 0) {\n editor.ui.registry.addContextToolbar('imageselection', {\n predicate: isImage,\n items: imageToolbarItems,\n position: 'node'\n });\n }\n var textToolbarItems = getTextSelectionToolbarItems(editor);\n if (textToolbarItems.trim().length > 0) {\n editor.ui.registry.addContextToolbar('textselection', {\n predicate: function (node) {\n return !isImage(node) && !editor.selection.isCollapsed() && isEditable(node);\n },\n items: textToolbarItems,\n position: 'selection',\n scope: 'editor'\n });\n }\n };\n\n function Plugin () {\n global$3.add('quickbars', function (editor) {\n setupButtons(editor);\n addToEditor$1(editor);\n addToEditor(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/quickbars/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/save/index.js": /*!********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/save/index.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"save\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/save')\n// ES2015:\n// import 'tinymce/plugins/save'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/save/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/save/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/save/plugin.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/save/plugin.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Tools');\n\n var enableWhenDirty = function (editor) {\n return editor.getParam('save_enablewhendirty', true);\n };\n var hasOnSaveCallback = function (editor) {\n return !!editor.getParam('save_onsavecallback');\n };\n var hasOnCancelCallback = function (editor) {\n return !!editor.getParam('save_oncancelcallback');\n };\n\n var displayErrorMessage = function (editor, message) {\n editor.notificationManager.open({\n text: message,\n type: 'error'\n });\n };\n var save = function (editor) {\n var formObj = global$1.DOM.getParent(editor.id, 'form');\n if (enableWhenDirty(editor) && !editor.isDirty()) {\n return;\n }\n editor.save();\n if (hasOnSaveCallback(editor)) {\n editor.execCallback('save_onsavecallback', editor);\n editor.nodeChanged();\n return;\n }\n if (formObj) {\n editor.setDirty(false);\n if (!formObj.onsubmit || formObj.onsubmit()) {\n if (typeof formObj.submit === 'function') {\n formObj.submit();\n } else {\n displayErrorMessage(editor, 'Error: Form submit field collision.');\n }\n }\n editor.nodeChanged();\n } else {\n displayErrorMessage(editor, 'Error: No form element found.');\n }\n };\n var cancel = function (editor) {\n var h = global.trim(editor.startContent);\n if (hasOnCancelCallback(editor)) {\n editor.execCallback('save_oncancelcallback', editor);\n return;\n }\n editor.resetContent(h);\n };\n\n var register$1 = function (editor) {\n editor.addCommand('mceSave', function () {\n save(editor);\n });\n editor.addCommand('mceCancel', function () {\n cancel(editor);\n });\n };\n\n var stateToggle = function (editor) {\n return function (api) {\n var handler = function () {\n api.setDisabled(enableWhenDirty(editor) && !editor.isDirty());\n };\n handler();\n editor.on('NodeChange dirty', handler);\n return function () {\n return editor.off('NodeChange dirty', handler);\n };\n };\n };\n var register = function (editor) {\n editor.ui.registry.addButton('save', {\n icon: 'save',\n tooltip: 'Save',\n disabled: true,\n onAction: function () {\n return editor.execCommand('mceSave');\n },\n onSetup: stateToggle(editor)\n });\n editor.ui.registry.addButton('cancel', {\n icon: 'cancel',\n tooltip: 'Cancel',\n disabled: true,\n onAction: function () {\n return editor.execCommand('mceCancel');\n },\n onSetup: stateToggle(editor)\n });\n editor.addShortcut('Meta+S', '', 'mceSave');\n };\n\n function Plugin () {\n global$2.add('save', function (editor) {\n register(editor);\n register$1(editor);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/save/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/searchreplace/index.js": /*!*****************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/searchreplace/index.js ***! \*****************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"searchreplace\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/searchreplace')\n// ES2015:\n// import 'tinymce/plugins/searchreplace'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/searchreplace/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/searchreplace/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/searchreplace/plugin.js": /*!******************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/searchreplace/plugin.js ***! \******************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\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 return {\n get: get,\n set: set\n };\n };\n\n var global$3 = 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 typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType$1 = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var isString = isType$1('string');\n var isArray = isType$1('array');\n var isBoolean = isSimpleType('boolean');\n var isNumber = isSimpleType('number');\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 never = constant(false);\n var always = constant(true);\n\n var punctuationStr = '[!-#%-*,-\\\\/:;?@\\\\[-\\\\]_{}\\xA1\\xAB\\xB7\\xBB\\xBF;\\xB7\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1361-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u3008\\u3009\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30\\u2E31\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uff3f\\uFF5B\\uFF5D\\uFF5F-\\uFF65]';\n\n var punctuation$1 = constant(punctuationStr);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\n\n var punctuation = punctuation$1;\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.Env');\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');\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 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 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, i) {\n acc = f(acc, x, i);\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 sort = function (xs, comparator) {\n var copy = nativeSlice.call(xs, 0);\n copy.sort(comparator);\n return copy;\n };\n\n var hasOwnProperty = Object.hasOwnProperty;\n var has = function (obj, key) {\n return hasOwnProperty.call(obj, key);\n };\n\n typeof window !== 'undefined' ? window : Function('return this;')();\n\n var DOCUMENT = 9;\n var DOCUMENT_FRAGMENT = 11;\n var ELEMENT = 1;\n var TEXT = 3;\n\n var type = function (element) {\n return element.dom.nodeType;\n };\n var isType = function (t) {\n return function (element) {\n return type(element) === t;\n };\n };\n var isText$1 = isType(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 console.error('Invalid call to Attribute.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 compareDocumentPosition = function (a, b, match) {\n return (a.compareDocumentPosition(b) & match) !== 0;\n };\n var documentPositionPreceding = function (a, b) {\n return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_PRECEDING);\n };\n\n var fromHtml = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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 || document;\n var node = doc.createElement(tag);\n return fromDom(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || 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: node };\n };\n var fromPoint = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n };\n var SugarElement = {\n fromHtml: fromHtml,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom,\n fromPoint: fromPoint\n };\n\n var bypassSelector = function (dom) {\n return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;\n };\n var all = function (selector, scope) {\n var base = scope === undefined ? document : scope.dom;\n return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom);\n };\n\n var parent = function (element) {\n return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);\n };\n var children = function (element) {\n return map(element.dom.childNodes, SugarElement.fromDom);\n };\n var spot = function (element, offset) {\n return {\n element: element,\n offset: offset\n };\n };\n var leaf = function (element, offset) {\n var cs = children(element);\n return cs.length > 0 && offset < cs.length ? spot(cs[offset], 0) : spot(element, offset);\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 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 NodeValue = function (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) ? Optional.from(element.dom.nodeValue) : Optional.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$1, 'text');\n var get$1 = function (element) {\n return api.get(element);\n };\n\n var descendants = function (scope, selector) {\n return all(selector, scope);\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');\n\n var isSimpleBoundary = function (dom, node) {\n return dom.isBlock(node) || has(dom.schema.getShortEndedElements(), node.nodeName);\n };\n var isContentEditableFalse = function (dom, node) {\n return dom.getContentEditable(node) === 'false';\n };\n var isContentEditableTrueInCef = function (dom, node) {\n return dom.getContentEditable(node) === 'true' && dom.getContentEditableParent(node.parentNode) === 'false';\n };\n var isHidden = function (dom, node) {\n return !dom.isBlock(node) && has(dom.schema.getWhiteSpaceElements(), node.nodeName);\n };\n var isBoundary = function (dom, node) {\n return isSimpleBoundary(dom, node) || isContentEditableFalse(dom, node) || isHidden(dom, node) || isContentEditableTrueInCef(dom, node);\n };\n var isText = function (node) {\n return node.nodeType === 3;\n };\n var nuSection = function () {\n return {\n sOffset: 0,\n fOffset: 0,\n elements: []\n };\n };\n var toLeaf = function (node, offset) {\n return leaf(SugarElement.fromDom(node), offset);\n };\n var walk = function (dom, walkerFn, startNode, callbacks, endNode, skipStart) {\n if (skipStart === void 0) {\n skipStart = true;\n }\n var next = skipStart ? walkerFn(false) : startNode;\n while (next) {\n var isCefNode = isContentEditableFalse(dom, next);\n if (isCefNode || isHidden(dom, next)) {\n var stopWalking = isCefNode ? callbacks.cef(next) : callbacks.boundary(next);\n if (stopWalking) {\n break;\n } else {\n next = walkerFn(true);\n continue;\n }\n } else if (isSimpleBoundary(dom, next)) {\n if (callbacks.boundary(next)) {\n break;\n }\n } else if (isText(next)) {\n callbacks.text(next);\n }\n if (next === endNode) {\n break;\n } else {\n next = walkerFn(false);\n }\n }\n };\n var collectTextToBoundary = function (dom, section, node, rootNode, forwards) {\n if (isBoundary(dom, node)) {\n return;\n }\n var rootBlock = dom.getParent(rootNode, dom.isBlock);\n var walker = new global(node, rootBlock);\n var walkerFn = forwards ? walker.next.bind(walker) : walker.prev.bind(walker);\n walk(dom, walkerFn, node, {\n boundary: always,\n cef: always,\n text: function (next) {\n if (forwards) {\n section.fOffset += next.length;\n } else {\n section.sOffset += next.length;\n }\n section.elements.push(SugarElement.fromDom(next));\n }\n });\n };\n var collect = function (dom, rootNode, startNode, endNode, callbacks, skipStart) {\n if (skipStart === void 0) {\n skipStart = true;\n }\n var walker = new global(startNode, rootNode);\n var sections = [];\n var current = nuSection();\n collectTextToBoundary(dom, current, startNode, rootNode, false);\n var finishSection = function () {\n if (current.elements.length > 0) {\n sections.push(current);\n current = nuSection();\n }\n return false;\n };\n walk(dom, walker.next.bind(walker), startNode, {\n boundary: finishSection,\n cef: function (node) {\n finishSection();\n if (callbacks) {\n sections.push.apply(sections, callbacks.cef(node));\n }\n return false;\n },\n text: function (next) {\n current.elements.push(SugarElement.fromDom(next));\n if (callbacks) {\n callbacks.text(next, current);\n }\n }\n }, endNode, skipStart);\n if (endNode) {\n collectTextToBoundary(dom, current, endNode, rootNode, true);\n }\n finishSection();\n return sections;\n };\n var collectRangeSections = function (dom, rng) {\n var start = toLeaf(rng.startContainer, rng.startOffset);\n var startNode = start.element.dom;\n var end = toLeaf(rng.endContainer, rng.endOffset);\n var endNode = end.element.dom;\n return collect(dom, rng.commonAncestorContainer, startNode, endNode, {\n text: function (node, section) {\n if (node === endNode) {\n section.fOffset += node.length - end.offset;\n } else if (node === startNode) {\n section.sOffset += start.offset;\n }\n },\n cef: function (node) {\n var sections = bind(descendants(SugarElement.fromDom(node), '*[contenteditable=true]'), function (e) {\n var ceTrueNode = e.dom;\n return collect(dom, ceTrueNode, ceTrueNode);\n });\n return sort(sections, function (a, b) {\n return documentPositionPreceding(a.elements[0].dom, b.elements[0].dom) ? 1 : -1;\n });\n }\n }, false);\n };\n var fromRng = function (dom, rng) {\n return rng.collapsed ? [] : collectRangeSections(dom, rng);\n };\n var fromNode = function (dom, node) {\n var rng = dom.createRng();\n rng.selectNode(node);\n return fromRng(dom, rng);\n };\n var fromNodes = function (dom, nodes) {\n return bind(nodes, function (node) {\n return fromNode(dom, node);\n });\n };\n\n var find$2 = function (text, pattern, start, finish) {\n if (start === void 0) {\n start = 0;\n }\n if (finish === void 0) {\n finish = text.length;\n }\n var regex = pattern.regex;\n regex.lastIndex = start;\n var results = [];\n var match;\n while (match = regex.exec(text)) {\n var matchedText = match[pattern.matchIndex];\n var matchStart = match.index + match[0].indexOf(matchedText);\n var matchFinish = matchStart + matchedText.length;\n if (matchFinish > finish) {\n break;\n }\n results.push({\n start: matchStart,\n finish: matchFinish\n });\n regex.lastIndex = matchFinish;\n }\n return results;\n };\n var extract = function (elements, matches) {\n var nodePositions = foldl(elements, function (acc, element) {\n var content = get$1(element);\n var start = acc.last;\n var finish = start + content.length;\n var positions = bind(matches, function (match, matchIdx) {\n if (match.start < finish && match.finish > start) {\n return [{\n element: element,\n start: Math.max(start, match.start) - start,\n finish: Math.min(finish, match.finish) - start,\n matchId: matchIdx\n }];\n } else {\n return [];\n }\n });\n return {\n results: acc.results.concat(positions),\n last: finish\n };\n }, {\n results: [],\n last: 0\n }).results;\n return groupBy(nodePositions, function (position) {\n return position.matchId;\n });\n };\n\n var find$1 = function (pattern, sections) {\n return bind(sections, function (section) {\n var elements = section.elements;\n var content = map(elements, get$1).join('');\n var positions = find$2(content, pattern, section.sOffset, content.length - section.fOffset);\n return extract(elements, positions);\n });\n };\n var mark = function (matches, replacementNode) {\n eachr(matches, function (match, idx) {\n eachr(match, function (pos) {\n var wrapper = SugarElement.fromDom(replacementNode.cloneNode(false));\n set(wrapper, 'data-mce-index', idx);\n var textNode = pos.element.dom;\n if (textNode.length === pos.finish && pos.start === 0) {\n wrap(pos.element, wrapper);\n } else {\n if (textNode.length !== pos.finish) {\n textNode.splitText(pos.finish);\n }\n var matchNode = textNode.splitText(pos.start);\n wrap(SugarElement.fromDom(matchNode), wrapper);\n }\n });\n });\n };\n var findAndMark = function (dom, pattern, node, replacementNode) {\n var textSections = fromNode(dom, node);\n var matches = find$1(pattern, textSections);\n mark(matches, replacementNode);\n return matches.length;\n };\n var findAndMarkInSelection = function (dom, pattern, selection, replacementNode) {\n var bookmark = selection.getBookmark();\n var nodes = dom.select('td[data-mce-selected],th[data-mce-selected]');\n var textSections = nodes.length > 0 ? fromNodes(dom, nodes) : fromRng(dom, selection.getRng());\n var matches = find$1(pattern, textSections);\n mark(matches, replacementNode);\n selection.moveToBookmark(bookmark);\n return matches.length;\n };\n\n var getElmIndex = function (elm) {\n var value = elm.getAttribute('data-mce-index');\n if (typeof value === 'number') {\n return '' + value;\n }\n return value;\n };\n var markAllMatches = function (editor, currentSearchState, pattern, inSelection) {\n var marker = editor.dom.create('span', { 'data-mce-bogus': 1 });\n marker.className = 'mce-match-marker';\n var node = editor.getBody();\n done(editor, currentSearchState, false);\n if (inSelection) {\n return findAndMarkInSelection(editor.dom, pattern, editor.selection, marker);\n } else {\n return findAndMark(editor.dom, pattern, node, marker);\n }\n };\n var unwrap = function (node) {\n var parentNode = node.parentNode;\n if (node.firstChild) {\n parentNode.insertBefore(node.firstChild, node);\n }\n node.parentNode.removeChild(node);\n };\n var findSpansByIndex = function (editor, index) {\n var spans = [];\n var nodes = global$1.toArray(editor.getBody().getElementsByTagName('span'));\n if (nodes.length) {\n for (var i = 0; i < nodes.length; i++) {\n var nodeIndex = getElmIndex(nodes[i]);\n if (nodeIndex === null || !nodeIndex.length) {\n continue;\n }\n if (nodeIndex === index.toString()) {\n spans.push(nodes[i]);\n }\n }\n }\n return spans;\n };\n var moveSelection = function (editor, currentSearchState, forward) {\n var searchState = currentSearchState.get();\n var testIndex = searchState.index;\n var dom = editor.dom;\n forward = forward !== false;\n if (forward) {\n if (testIndex + 1 === searchState.count) {\n testIndex = 0;\n } else {\n testIndex++;\n }\n } else {\n if (testIndex - 1 === -1) {\n testIndex = searchState.count - 1;\n } else {\n testIndex--;\n }\n }\n dom.removeClass(findSpansByIndex(editor, searchState.index), 'mce-match-marker-selected');\n var spans = findSpansByIndex(editor, testIndex);\n if (spans.length) {\n dom.addClass(findSpansByIndex(editor, testIndex), 'mce-match-marker-selected');\n editor.selection.scrollIntoView(spans[0]);\n return testIndex;\n }\n return -1;\n };\n var removeNode = function (dom, node) {\n var parent = node.parentNode;\n dom.remove(node);\n if (dom.isEmpty(parent)) {\n dom.remove(parent);\n }\n };\n var escapeSearchText = function (text, wholeWord) {\n var escapedText = text.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&').replace(/\\s/g, '[^\\\\S\\\\r\\\\n\\\\uFEFF]');\n var wordRegex = '(' + escapedText + ')';\n return wholeWord ? '(?:^|\\\\s|' + punctuation() + ')' + wordRegex + ('(?=$|\\\\s|' + punctuation() + ')') : wordRegex;\n };\n var find = function (editor, currentSearchState, text, matchCase, wholeWord, inSelection) {\n var selection = editor.selection;\n var escapedText = escapeSearchText(text, wholeWord);\n var isForwardSelection = selection.isForward();\n var pattern = {\n regex: new RegExp(escapedText, matchCase ? 'g' : 'gi'),\n matchIndex: 1\n };\n var count = markAllMatches(editor, currentSearchState, pattern, inSelection);\n if (global$2.browser.isSafari()) {\n selection.setRng(selection.getRng(), isForwardSelection);\n }\n if (count) {\n var newIndex = moveSelection(editor, currentSearchState, true);\n currentSearchState.set({\n index: newIndex,\n count: count,\n text: text,\n matchCase: matchCase,\n wholeWord: wholeWord,\n inSelection: inSelection\n });\n }\n return count;\n };\n var next = function (editor, currentSearchState) {\n var index = moveSelection(editor, currentSearchState, true);\n currentSearchState.set(__assign(__assign({}, currentSearchState.get()), { index: index }));\n };\n var prev = function (editor, currentSearchState) {\n var index = moveSelection(editor, currentSearchState, false);\n currentSearchState.set(__assign(__assign({}, currentSearchState.get()), { index: index }));\n };\n var isMatchSpan = function (node) {\n var matchIndex = getElmIndex(node);\n return matchIndex !== null && matchIndex.length > 0;\n };\n var replace = function (editor, currentSearchState, text, forward, all) {\n var searchState = currentSearchState.get();\n var currentIndex = searchState.index;\n var currentMatchIndex, nextIndex = currentIndex;\n forward = forward !== false;\n var node = editor.getBody();\n var nodes = global$1.grep(global$1.toArray(node.getElementsByTagName('span')), isMatchSpan);\n for (var i = 0; i < nodes.length; i++) {\n var nodeIndex = getElmIndex(nodes[i]);\n var matchIndex = currentMatchIndex = parseInt(nodeIndex, 10);\n if (all || matchIndex === searchState.index) {\n if (text.length) {\n nodes[i].firstChild.nodeValue = text;\n unwrap(nodes[i]);\n } else {\n removeNode(editor.dom, nodes[i]);\n }\n while (nodes[++i]) {\n matchIndex = parseInt(getElmIndex(nodes[i]), 10);\n if (matchIndex === currentMatchIndex) {\n removeNode(editor.dom, nodes[i]);\n } else {\n i--;\n break;\n }\n }\n if (forward) {\n nextIndex--;\n }\n } else if (currentMatchIndex > currentIndex) {\n nodes[i].setAttribute('data-mce-index', String(currentMatchIndex - 1));\n }\n }\n currentSearchState.set(__assign(__assign({}, searchState), {\n count: all ? 0 : searchState.count - 1,\n index: nextIndex\n }));\n if (forward) {\n next(editor, currentSearchState);\n } else {\n prev(editor, currentSearchState);\n }\n return !all && currentSearchState.get().count > 0;\n };\n var done = function (editor, currentSearchState, keepEditorSelection) {\n var startContainer, endContainer;\n var searchState = currentSearchState.get();\n var nodes = global$1.toArray(editor.getBody().getElementsByTagName('span'));\n for (var i = 0; i < nodes.length; i++) {\n var nodeIndex = getElmIndex(nodes[i]);\n if (nodeIndex !== null && nodeIndex.length) {\n if (nodeIndex === searchState.index.toString()) {\n if (!startContainer) {\n startContainer = nodes[i].firstChild;\n }\n endContainer = nodes[i].firstChild;\n }\n unwrap(nodes[i]);\n }\n }\n currentSearchState.set(__assign(__assign({}, searchState), {\n index: -1,\n count: 0,\n text: ''\n }));\n if (startContainer && endContainer) {\n var rng = editor.dom.createRng();\n rng.setStart(startContainer, 0);\n rng.setEnd(endContainer, endContainer.data.length);\n if (keepEditorSelection !== false) {\n editor.selection.setRng(rng);\n }\n return rng;\n }\n };\n var hasNext = function (editor, currentSearchState) {\n return currentSearchState.get().count > 1;\n };\n var hasPrev = function (editor, currentSearchState) {\n return currentSearchState.get().count > 1;\n };\n\n var get = function (editor, currentState) {\n var done$1 = function (keepEditorSelection) {\n return done(editor, currentState, keepEditorSelection);\n };\n var find$1 = function (text, matchCase, wholeWord, inSelection) {\n if (inSelection === void 0) {\n inSelection = false;\n }\n return find(editor, currentState, text, matchCase, wholeWord, inSelection);\n };\n var next$1 = function () {\n return next(editor, currentState);\n };\n var prev$1 = function () {\n return prev(editor, currentState);\n };\n var replace$1 = function (text, forward, all) {\n return replace(editor, currentState, text, forward, all);\n };\n return {\n done: done$1,\n find: find$1,\n next: next$1,\n prev: prev$1,\n replace: replace$1\n };\n };\n\n var singleton = function (doRevoke) {\n var subject = Cell(Optional.none());\n var revoke = function () {\n return subject.get().each(doRevoke);\n };\n var clear = function () {\n revoke();\n subject.set(Optional.none());\n };\n var isSet = function () {\n return subject.get().isSome();\n };\n var get = function () {\n return subject.get();\n };\n var set = function (s) {\n revoke();\n subject.set(Optional.some(s));\n };\n return {\n clear: clear,\n isSet: isSet,\n get: get,\n set: set\n };\n };\n var value = function () {\n var subject = singleton(noop);\n var on = function (f) {\n return subject.get().each(f);\n };\n return __assign(__assign({}, subject), { on: on });\n };\n\n var open = function (editor, currentSearchState) {\n var dialogApi = value();\n editor.undoManager.add();\n var selectedText = global$1.trim(editor.selection.getContent({ format: 'text' }));\n var updateButtonStates = function (api) {\n var updateNext = hasNext(editor, currentSearchState) ? api.enable : api.disable;\n updateNext('next');\n var updatePrev = hasPrev(editor, currentSearchState) ? api.enable : api.disable;\n updatePrev('prev');\n };\n var updateSearchState = function (api) {\n var data = api.getData();\n var current = currentSearchState.get();\n currentSearchState.set(__assign(__assign({}, current), {\n matchCase: data.matchcase,\n wholeWord: data.wholewords,\n inSelection: data.inselection\n }));\n };\n var disableAll = function (api, disable) {\n var buttons = [\n 'replace',\n 'replaceall',\n 'prev',\n 'next'\n ];\n var toggle = disable ? api.disable : api.enable;\n each(buttons, toggle);\n };\n var notFoundAlert = function (api) {\n editor.windowManager.alert('Could not find the specified string.', function () {\n api.focus('findtext');\n });\n };\n var focusButtonIfRequired = function (api, name) {\n if (global$2.browser.isSafari() && global$2.deviceType.isTouch() && (name === 'find' || name === 'replace' || name === 'replaceall')) {\n api.focus(name);\n }\n };\n var reset = function (api) {\n done(editor, currentSearchState, false);\n disableAll(api, true);\n updateButtonStates(api);\n };\n var doFind = function (api) {\n var data = api.getData();\n var last = currentSearchState.get();\n if (!data.findtext.length) {\n reset(api);\n return;\n }\n if (last.text === data.findtext && last.matchCase === data.matchcase && last.wholeWord === data.wholewords) {\n next(editor, currentSearchState);\n } else {\n var count = find(editor, currentSearchState, data.findtext, data.matchcase, data.wholewords, data.inselection);\n if (count <= 0) {\n notFoundAlert(api);\n }\n disableAll(api, count === 0);\n }\n updateButtonStates(api);\n };\n var initialState = currentSearchState.get();\n var initialData = {\n findtext: selectedText,\n replacetext: '',\n wholewords: initialState.wholeWord,\n matchcase: initialState.matchCase,\n inselection: initialState.inSelection\n };\n var spec = {\n title: 'Find and Replace',\n size: 'normal',\n body: {\n type: 'panel',\n items: [\n {\n type: 'bar',\n items: [\n {\n type: 'input',\n name: 'findtext',\n placeholder: 'Find',\n maximized: true,\n inputMode: 'search'\n },\n {\n type: 'button',\n name: 'prev',\n text: 'Previous',\n icon: 'action-prev',\n disabled: true,\n borderless: true\n },\n {\n type: 'button',\n name: 'next',\n text: 'Next',\n icon: 'action-next',\n disabled: true,\n borderless: true\n }\n ]\n },\n {\n type: 'input',\n name: 'replacetext',\n placeholder: 'Replace with',\n inputMode: 'search'\n }\n ]\n },\n buttons: [\n {\n type: 'menu',\n name: 'options',\n icon: 'preferences',\n tooltip: 'Preferences',\n align: 'start',\n items: [\n {\n type: 'togglemenuitem',\n name: 'matchcase',\n text: 'Match case'\n },\n {\n type: 'togglemenuitem',\n name: 'wholewords',\n text: 'Find whole words only'\n },\n {\n type: 'togglemenuitem',\n name: 'inselection',\n text: 'Find in selection'\n }\n ]\n },\n {\n type: 'custom',\n name: 'find',\n text: 'Find',\n primary: true\n },\n {\n type: 'custom',\n name: 'replace',\n text: 'Replace',\n disabled: true\n },\n {\n type: 'custom',\n name: 'replaceall',\n text: 'Replace all',\n disabled: true\n }\n ],\n initialData: initialData,\n onChange: function (api, details) {\n if (details.name === 'findtext' && currentSearchState.get().count > 0) {\n reset(api);\n }\n },\n onAction: function (api, details) {\n var data = api.getData();\n switch (details.name) {\n case 'find':\n doFind(api);\n break;\n case 'replace':\n if (!replace(editor, currentSearchState, data.replacetext)) {\n reset(api);\n } else {\n updateButtonStates(api);\n }\n break;\n case 'replaceall':\n replace(editor, currentSearchState, data.replacetext, true, true);\n reset(api);\n break;\n case 'prev':\n prev(editor, currentSearchState);\n updateButtonStates(api);\n break;\n case 'next':\n next(editor, currentSearchState);\n updateButtonStates(api);\n break;\n case 'matchcase':\n case 'wholewords':\n case 'inselection':\n updateSearchState(api);\n reset(api);\n break;\n }\n focusButtonIfRequired(api, details.name);\n },\n onSubmit: function (api) {\n doFind(api);\n focusButtonIfRequired(api, 'find');\n },\n onClose: function () {\n editor.focus();\n done(editor, currentSearchState);\n editor.undoManager.add();\n }\n };\n dialogApi.set(editor.windowManager.open(spec, { inline: 'toolbar' }));\n };\n\n var register$1 = function (editor, currentSearchState) {\n editor.addCommand('SearchReplace', function () {\n open(editor, currentSearchState);\n });\n };\n\n var showDialog = function (editor, currentSearchState) {\n return function () {\n open(editor, currentSearchState);\n };\n };\n var register = function (editor, currentSearchState) {\n editor.ui.registry.addMenuItem('searchreplace', {\n text: 'Find and replace...',\n shortcut: 'Meta+F',\n onAction: showDialog(editor, currentSearchState),\n icon: 'search'\n });\n editor.ui.registry.addButton('searchreplace', {\n tooltip: 'Find and replace',\n onAction: showDialog(editor, currentSearchState),\n icon: 'search'\n });\n editor.shortcuts.add('Meta+F', '', showDialog(editor, currentSearchState));\n };\n\n function Plugin () {\n global$3.add('searchreplace', function (editor) {\n var currentSearchState = Cell({\n index: -1,\n count: 0,\n text: '',\n matchCase: false,\n wholeWord: false,\n inSelection: false\n });\n register$1(editor, currentSearchState);\n register(editor, currentSearchState);\n return get(editor, currentSearchState);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/searchreplace/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/table/index.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/table/index.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"table\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/table')\n// ES2015:\n// import 'tinymce/plugins/table'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/table/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/table/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/table/plugin.js": /*!**********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/table/plugin.js ***! \**********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType$1 = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var eq$2 = function (t) {\n return function (a) {\n return t === a;\n };\n };\n var isString = isType$1('string');\n var isObject = isType$1('object');\n var isArray = isType$1('array');\n var isNull = eq$2(null);\n var isBoolean = isSimpleType('boolean');\n var isUndefined = eq$2(undefined);\n var isNullable = function (a) {\n return a === null || a === undefined;\n };\n var isNonNullable = function (a) {\n return !isNullable(a);\n };\n var isFunction = isSimpleType('function');\n var isNumber = isSimpleType('number');\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 compose1 = function (fbc, fab) {\n return function (a) {\n return fbc(fab(a));\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 var tripleEquals = function (a, b) {\n return a === b;\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 (t) {\n return !f(t);\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$2 = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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$2,\n each: noop,\n bind: none$2,\n exists: never,\n forall: always,\n filter: function () {\n return none$2();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from$1 = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none$2,\n from: from$1\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$2 = 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$1 = 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 map$1 = 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$2 = 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$2 = 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, i) {\n acc = f(acc, x, i);\n });\n return acc;\n };\n var foldl = function (xs, f, acc) {\n each$2(xs, function (x, i) {\n acc = f(acc, x, i);\n });\n return acc;\n };\n var findUntil = function (xs, pred, until) {\n for (var i = 0, len = xs.length; i < len; i++) {\n var x = xs[i];\n if (pred(x, i)) {\n return Optional.some(x);\n } else if (until(x, i)) {\n break;\n }\n }\n return Optional.none();\n };\n var find$1 = function (xs, pred) {\n return findUntil(xs, pred, never);\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 Optional.some(i);\n }\n }\n return Optional.none();\n };\n var flatten$1 = 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$2 = function (xs, f) {\n return flatten$1(map$1(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 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$1 = function (xs, comparator) {\n var copy = nativeSlice.call(xs, 0);\n copy.sort(comparator);\n return copy;\n };\n var get$d = function (xs, i) {\n return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();\n };\n var head = function (xs) {\n return get$d(xs, 0);\n };\n var last$2 = function (xs) {\n return get$d(xs, xs.length - 1);\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 Optional.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 function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2)\n for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar)\n ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\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 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 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 = 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$2(group(1), group(2));\n };\n var detect$6 = function (versionRegexes, agent) {\n var cleanedAgent = String(agent).toLowerCase();\n if (versionRegexes.length === 0) {\n return unknown$2();\n }\n return find(versionRegexes, cleanedAgent);\n };\n var unknown$2 = function () {\n return nu$2(0, 0);\n };\n var nu$2 = function (major, minor) {\n return {\n major: major,\n minor: minor\n };\n };\n var Version = {\n nu: nu$2,\n detect: detect$6,\n unknown: unknown$2\n };\n\n var detectBrowser$1 = function (browsers, userAgentData) {\n return findMap(userAgentData.brands, function (uaBrand) {\n var lcBrand = uaBrand.brand.toLowerCase();\n return find$1(browsers, function (browser) {\n var _a;\n return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());\n }).map(function (info) {\n return {\n current: info.name,\n version: Version.nu(parseInt(uaBrand.version, 10), 0)\n };\n });\n });\n };\n\n var detect$5 = function (candidates, userAgent) {\n var agent = String(userAgent).toLowerCase();\n return find$1(candidates, function (candidate) {\n return candidate.search(agent);\n });\n };\n var detectBrowser = function (browsers, userAgent) {\n return detect$5(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$5(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\n var removeFromStart = function (str, numChars) {\n return str.substring(numChars);\n };\n\n var checkRange = function (str, substr, start) {\n return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;\n };\n var removeLeading = function (str, prefix) {\n return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str;\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 blank = function (r) {\n return function (s) {\n return s.replace(r, '');\n };\n };\n var trim = blank(/^\\s+|\\s+$/g);\n var isNotEmpty = function (s) {\n return s.length > 0;\n };\n var isEmpty$1 = function (s) {\n return !isNotEmpty(s);\n };\n var toFloat = function (value) {\n var num = parseFloat(value);\n return isNaN(num) ? Optional.none() : Optional.some(num);\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 brand: 'Chromium',\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 edge = 'Edge';\n var chrome = 'Chrome';\n var ie = 'IE';\n var opera = 'Opera';\n var firefox = 'Firefox';\n var safari = 'Safari';\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 var isBrowser = function (name) {\n return function () {\n return current === name;\n };\n };\n return {\n current: current,\n version: version,\n isEdge: isBrowser(edge),\n isChrome: isBrowser(chrome),\n isIE: isBrowser(ie),\n isOpera: isBrowser(opera),\n isFirefox: isBrowser(firefox),\n isSafari: isBrowser(safari)\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 unknown = function () {\n return nu({\n current: undefined,\n version: Version.unknown()\n });\n };\n var nu = function (info) {\n var current = info.current;\n var version = info.version;\n var isOS = function (name) {\n return function () {\n return current === name;\n };\n };\n return {\n current: current,\n version: version,\n isWindows: isOS(windows),\n isiOS: isOS(ios),\n isAndroid: isOS(android),\n isOSX: isOS(osx),\n isLinux: isOS(linux),\n isSolaris: isOS(solaris),\n isFreeBSD: isOS(freebsd),\n isChromeOS: isOS(chromeos)\n };\n };\n var OperatingSystem = {\n unknown: unknown,\n nu: nu,\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 detect$4 = function (userAgent, userAgentDataOpt, mediaMatch) {\n var browsers = PlatformInfo.browsers();\n var oses = PlatformInfo.oses();\n var browser = userAgentDataOpt.bind(function (userAgentData) {\n return detectBrowser$1(browsers, userAgentData);\n }).orThunk(function () {\n return detectBrowser(browsers, userAgent);\n }).fold(Browser.unknown, Browser.nu);\n var os = 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$4 };\n\n var mediaMatch = function (query) {\n return window.matchMedia(query).matches;\n };\n var platform = cached(function () {\n return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch);\n });\n var detect$3 = function () {\n return platform();\n };\n\n var compareDocumentPosition = function (a, b, match) {\n return (a.compareDocumentPosition(b) & match) !== 0;\n };\n var documentPositionContainedBy = function (a, b) {\n return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY);\n };\n\n var COMMENT = 8;\n var DOCUMENT = 9;\n var DOCUMENT_FRAGMENT = 11;\n var ELEMENT = 1;\n var TEXT = 3;\n\n var fromHtml$1 = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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$1(div.childNodes[0]);\n };\n var fromTag = function (tag, scope) {\n var doc = scope || document;\n var node = doc.createElement(tag);\n return fromDom$1(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || document;\n var node = doc.createTextNode(text);\n return fromDom$1(node);\n };\n var fromDom$1 = function (node) {\n if (node === null || node === undefined) {\n throw new Error('Node cannot be null or undefined');\n }\n return { dom: node };\n };\n var fromPoint$1 = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$1);\n };\n var SugarElement = {\n fromHtml: fromHtml$1,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom$1,\n fromPoint: fromPoint$1\n };\n\n var is$2 = function (element, selector) {\n var dom = element.dom;\n if (dom.nodeType !== ELEMENT) {\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 && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;\n };\n var all$1 = function (selector, scope) {\n var base = scope === undefined ? document : scope.dom;\n return bypassSelector(base) ? [] : map$1(base.querySelectorAll(selector), SugarElement.fromDom);\n };\n var one = function (selector, scope) {\n var base = scope === undefined ? document : scope.dom;\n return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);\n };\n\n var eq$1 = 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 documentPositionContainedBy(e1.dom, e2.dom);\n };\n var contains = function (e1, e2) {\n return detect$3().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2);\n };\n var is$1 = is$2;\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 = 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 filter$1 = function (obj, pred) {\n var t = {};\n internalFilter(obj, pred, objAcc(t), noop);\n return t;\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 values = function (obj) {\n return mapToArray(obj, identity);\n };\n var size = function (obj) {\n return keys(obj).length;\n };\n var get$c = function (obj, key) {\n return has$1(obj, key) ? Optional.from(obj[key]) : Optional.none();\n };\n var has$1 = function (obj, key) {\n return hasOwnProperty.call(obj, key);\n };\n var hasNonNullableKey = function (obj, key) {\n return has$1(obj, key) && obj[key] !== undefined && obj[key] !== null;\n };\n var isEmpty = function (r) {\n for (var x in r) {\n if (hasOwnProperty.call(r, x)) {\n return false;\n }\n }\n return true;\n };\n\n var validSectionList = [\n 'tfoot',\n 'thead',\n 'tbody',\n 'colgroup'\n ];\n var isValidSection = function (parentName) {\n return contains$2(validSectionList, parentName);\n };\n var grid = function (rows, columns) {\n return {\n rows: rows,\n columns: columns\n };\n };\n var address = function (row, column) {\n return {\n row: row,\n column: column\n };\n };\n var detail = function (element, rowspan, colspan) {\n return {\n element: element,\n rowspan: rowspan,\n colspan: colspan\n };\n };\n var detailnew = function (element, rowspan, colspan, isNew) {\n return {\n element: element,\n rowspan: rowspan,\n colspan: colspan,\n isNew: isNew\n };\n };\n var extended = function (element, rowspan, colspan, row, column, isLocked) {\n return {\n element: element,\n rowspan: rowspan,\n colspan: colspan,\n row: row,\n column: column,\n isLocked: isLocked\n };\n };\n var rowdetail = function (element, cells, section) {\n return {\n element: element,\n cells: cells,\n section: section\n };\n };\n var rowdetailnew = function (element, cells, section, isNew) {\n return {\n element: element,\n cells: cells,\n section: section,\n isNew: isNew\n };\n };\n var elementnew = function (element, isNew, isLocked) {\n return {\n element: element,\n isNew: isNew,\n isLocked: isLocked\n };\n };\n var rowcells = function (element, cells, section, isNew) {\n return {\n element: element,\n cells: cells,\n section: section,\n isNew: isNew\n };\n };\n var bounds = function (startRow, startCol, finishRow, finishCol) {\n return {\n startRow: startRow,\n startCol: startCol,\n finishRow: finishRow,\n finishCol: finishCol\n };\n };\n var columnext = function (element, colspan, column) {\n return {\n element: element,\n colspan: colspan,\n column: column\n };\n };\n var colgroup = function (element, columns) {\n return {\n element: element,\n columns: columns\n };\n };\n\n typeof window !== 'undefined' ? window : Function('return this;')();\n\n var name = function (element) {\n var r = element.dom.nodeName;\n return r.toLowerCase();\n };\n var type$1 = function (element) {\n return element.dom.nodeType;\n };\n var isType = function (t) {\n return function (element) {\n return type$1(element) === t;\n };\n };\n var isComment = function (element) {\n return type$1(element) === COMMENT || name(element) === '#comment';\n };\n var isElement = isType(ELEMENT);\n var isText = isType(TEXT);\n var isDocument = isType(DOCUMENT);\n var isDocumentFragment = isType(DOCUMENT_FRAGMENT);\n var isTag = function (tag) {\n return function (e) {\n return isElement(e) && name(e) === tag;\n };\n };\n\n var owner = function (element) {\n return SugarElement.fromDom(element.dom.ownerDocument);\n };\n var documentOrOwner = function (dos) {\n return isDocument(dos) ? dos : owner(dos);\n };\n var defaultView = function (element) {\n return SugarElement.fromDom(documentOrOwner(element).dom.defaultView);\n };\n var parent = function (element) {\n return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);\n };\n var parentElement = function (element) {\n return Optional.from(element.dom.parentElement).map(SugarElement.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 = SugarElement.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 Optional.from(element.dom.previousSibling).map(SugarElement.fromDom);\n };\n var nextSibling = function (element) {\n return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);\n };\n var children$3 = function (element) {\n return map$1(element.dom.childNodes, SugarElement.fromDom);\n };\n var child$3 = function (element, index) {\n var cs = element.dom.childNodes;\n return Optional.from(cs[index]).map(SugarElement.fromDom);\n };\n var firstChild = function (element) {\n return child$3(element, 0);\n };\n\n var isShadowRoot = function (dos) {\n return isDocumentFragment(dos) && isNonNullable(dos.dom.host);\n };\n var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);\n var isSupported$1 = constant(supported);\n var getRootNode = supported ? function (e) {\n return SugarElement.fromDom(e.dom.getRootNode());\n } : documentOrOwner;\n var getShadowRoot = function (e) {\n var r = getRootNode(e);\n return isShadowRoot(r) ? Optional.some(r) : Optional.none();\n };\n var getShadowHost = function (e) {\n return SugarElement.fromDom(e.dom.host);\n };\n var getOriginalEventTarget = function (event) {\n if (isSupported$1() && isNonNullable(event.target)) {\n var el = SugarElement.fromDom(event.target);\n if (isElement(el) && isOpenShadowHost(el)) {\n if (event.composed && event.composedPath) {\n var composedPath = event.composedPath();\n if (composedPath) {\n return head(composedPath);\n }\n }\n }\n }\n return Optional.from(event.target);\n };\n var isOpenShadowHost = function (element) {\n return isNonNullable(element.dom.shadowRoot);\n };\n\n var inBody = function (element) {\n var dom = isText(element) ? element.dom.parentNode : element.dom;\n if (dom === undefined || dom === null || dom.ownerDocument === null) {\n return false;\n }\n var doc = dom.ownerDocument;\n return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {\n return doc.body.contains(dom);\n }, compose1(inBody, getShadowHost));\n };\n var body$1 = function () {\n return getBody$1(SugarElement.fromDom(document));\n };\n var getBody$1 = 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 SugarElement.fromDom(b);\n };\n\n var ancestors$4 = function (scope, predicate, isRoot) {\n return filter$2(parents(scope, isRoot), predicate);\n };\n var children$2 = function (scope, predicate) {\n return filter$2(children$3(scope), predicate);\n };\n var descendants$1 = function (scope, predicate) {\n var result = [];\n each$2(children$3(scope), function (x) {\n if (predicate(x)) {\n result = result.concat([x]);\n }\n result = result.concat(descendants$1(x, predicate));\n });\n return result;\n };\n\n var ancestors$3 = function (scope, selector, isRoot) {\n return ancestors$4(scope, function (e) {\n return is$2(e, selector);\n }, isRoot);\n };\n var children$1 = function (scope, selector) {\n return children$2(scope, function (e) {\n return is$2(e, selector);\n });\n };\n var descendants = function (scope, selector) {\n return all$1(selector, scope);\n };\n\n function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {\n if (is(scope, a)) {\n return Optional.some(scope);\n } else if (isFunction(isRoot) && isRoot(scope)) {\n return Optional.none();\n } else {\n return ancestor(scope, a, isRoot);\n }\n }\n\n var ancestor$2 = function (scope, predicate, isRoot) {\n var element = scope.dom;\n var stop = isFunction(isRoot) ? isRoot : never;\n while (element.parentNode) {\n element = element.parentNode;\n var el = SugarElement.fromDom(element);\n if (predicate(el)) {\n return Optional.some(el);\n } else if (stop(el)) {\n break;\n }\n }\n return Optional.none();\n };\n var closest$2 = function (scope, predicate, isRoot) {\n var is = function (s, test) {\n return test(s);\n };\n return ClosestOrAncestor(is, ancestor$2, scope, predicate, isRoot);\n };\n var child$2 = function (scope, predicate) {\n var pred = function (node) {\n return predicate(SugarElement.fromDom(node));\n };\n var result = find$1(scope.dom.childNodes, pred);\n return result.map(SugarElement.fromDom);\n };\n var descendant$1 = function (scope, predicate) {\n var descend = function (node) {\n for (var i = 0; i < node.childNodes.length; i++) {\n var child_1 = SugarElement.fromDom(node.childNodes[i]);\n if (predicate(child_1)) {\n return Optional.some(child_1);\n }\n var res = descend(node.childNodes[i]);\n if (res.isSome()) {\n return res;\n }\n }\n return Optional.none();\n };\n return descend(scope.dom);\n };\n\n var ancestor$1 = function (scope, selector, isRoot) {\n return ancestor$2(scope, function (e) {\n return is$2(e, selector);\n }, isRoot);\n };\n var child$1 = function (scope, selector) {\n return child$2(scope, function (e) {\n return is$2(e, selector);\n });\n };\n var descendant = function (scope, selector) {\n return one(selector, scope);\n };\n var closest$1 = function (scope, selector, isRoot) {\n var is = function (element, selector) {\n return is$2(element, selector);\n };\n return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot);\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 console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n throw new Error('Attribute value was not simple');\n }\n };\n var set$2 = function (element, key, value) {\n rawSet(element.dom, key, value);\n };\n var setAll$1 = function (element, attrs) {\n var dom = element.dom;\n each$1(attrs, function (v, k) {\n rawSet(dom, k, v);\n });\n };\n var setOptions = function (element, attrs) {\n each$1(attrs, function (v, k) {\n v.fold(function () {\n remove$7(element, k);\n }, function (value) {\n rawSet(element.dom, k, value);\n });\n });\n };\n var get$b = 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 Optional.from(get$b(element, key));\n };\n var remove$7 = function (element, key) {\n element.dom.removeAttribute(key);\n };\n var clone$2 = 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 is = function (lhs, rhs, comparator) {\n if (comparator === void 0) {\n comparator = tripleEquals;\n }\n return lhs.exists(function (left) {\n return comparator(left, rhs);\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 lift2 = function (oa, ob, f) {\n return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();\n };\n var bindFrom = function (a, f) {\n return a !== undefined && a !== null ? f(a) : Optional.none();\n };\n var flatten = function (oot) {\n return oot.bind(identity);\n };\n var someIf = function (b, a) {\n return b ? Optional.some(a) : Optional.none();\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 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 = 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$a = function (element, property) {\n var dom = element.dom;\n var styles = window.getComputedStyle(dom);\n var r = styles.getPropertyValue(property);\n return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n };\n var getUnsafeProperty = function (dom, property) {\n return isSupported(dom) ? dom.style.getPropertyValue(property) : '';\n };\n var getRaw$2 = function (element, property) {\n var dom = element.dom;\n var raw = getUnsafeProperty(dom, property);\n return Optional.from(raw).filter(function (r) {\n return r.length > 0;\n });\n };\n var remove$6 = function (element, property) {\n var dom = element.dom;\n internalRemove(dom, property);\n if (is(getOpt(element, 'style').map(trim), '')) {\n remove$7(element, 'style');\n }\n };\n var copy$2 = 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 getAttrValue = function (cell, name, fallback) {\n if (fallback === void 0) {\n fallback = 0;\n }\n return getOpt(cell, name).map(function (value) {\n return parseInt(value, 10);\n }).getOr(fallback);\n };\n var getSpan = function (cell, type) {\n return getAttrValue(cell, type, 1);\n };\n var hasColspan = function (cellOrCol) {\n if (isTag('col')(cellOrCol)) {\n return getAttrValue(cellOrCol, 'span', 1) > 1;\n } else {\n return getSpan(cellOrCol, 'colspan') > 1;\n }\n };\n var hasRowspan = function (cell) {\n return getSpan(cell, 'rowspan') > 1;\n };\n var getCssValue = function (element, property) {\n return parseInt(get$a(element, property), 10);\n };\n var minWidth = constant(10);\n var minHeight = constant(10);\n\n var firstLayer = function (scope, selector) {\n return filterFirstLayer(scope, selector, always);\n };\n var filterFirstLayer = function (scope, selector, predicate) {\n return bind$2(children$3(scope), function (x) {\n if (is$2(x, selector)) {\n return predicate(x) ? [x] : [];\n } else {\n return filterFirstLayer(x, selector, predicate);\n }\n });\n };\n\n var lookup = function (tags, element, isRoot) {\n if (isRoot === void 0) {\n isRoot = never;\n }\n if (isRoot(element)) {\n return Optional.none();\n }\n if (contains$2(tags, name(element))) {\n return Optional.some(element);\n }\n var isRootOrUpperTable = function (elm) {\n return is$2(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$1 = function (ancestor) {\n return firstLayer(ancestor, 'th,td');\n };\n var columns$1 = function (ancestor) {\n if (is$2(ancestor, 'colgroup')) {\n return children$1(ancestor, 'col');\n } else {\n return bind$2(columnGroups(ancestor), function (columnGroup) {\n return children$1(columnGroup, 'col');\n });\n }\n };\n var table = function (element, isRoot) {\n return closest$1(element, 'table', isRoot);\n };\n var rows$1 = function (ancestor) {\n return firstLayer(ancestor, 'tr');\n };\n var columnGroups = function (ancestor) {\n return table(ancestor).fold(constant([]), function (table) {\n return children$1(table, 'colgroup');\n });\n };\n\n var fromRowsOrColGroups = function (elems, getSection) {\n return map$1(elems, function (row) {\n if (name(row) === 'colgroup') {\n var cells = map$1(columns$1(row), function (column) {\n var colspan = getAttrValue(column, 'span', 1);\n return detail(column, 1, colspan);\n });\n return rowdetail(row, cells, 'colgroup');\n } else {\n var cells = map$1(cells$1(row), function (cell) {\n var rowspan = getAttrValue(cell, 'rowspan', 1);\n var colspan = getAttrValue(cell, 'colspan', 1);\n return detail(cell, rowspan, colspan);\n });\n return rowdetail(row, cells, getSection(row));\n }\n });\n };\n var getParentSection = function (group) {\n return parent(group).map(function (parent) {\n var parentName = name(parent);\n return isValidSection(parentName) ? parentName : 'tbody';\n }).getOr('tbody');\n };\n var fromTable$1 = function (table) {\n var rows = rows$1(table);\n var columnGroups$1 = columnGroups(table);\n var elems = __spreadArray(__spreadArray([], columnGroups$1, true), rows, true);\n return fromRowsOrColGroups(elems, getParentSection);\n };\n var fromPastedRows = function (elems, section) {\n return fromRowsOrColGroups(elems, function () {\n return section;\n });\n };\n\n var addCells = function (gridRow, index, cells) {\n var existingCells = gridRow.cells;\n var before = existingCells.slice(0, index);\n var after = existingCells.slice(index);\n var newCells = before.concat(cells).concat(after);\n return setCells(gridRow, newCells);\n };\n var addCell = function (gridRow, index, cell) {\n return addCells(gridRow, index, [cell]);\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(gridRow.element, cells, gridRow.section, gridRow.isNew);\n };\n var mapCells = function (gridRow, f) {\n var cells = gridRow.cells;\n var r = map$1(cells, f);\n return rowcells(gridRow.element, r, gridRow.section, gridRow.isNew);\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 extractGridDetails = function (grid) {\n var result = partition(grid, function (row) {\n return row.section === 'colgroup';\n });\n return {\n rows: result.fail,\n cols: result.pass\n };\n };\n var clone$1 = function (gridRow, cloneRow, cloneCell) {\n var newCells = map$1(gridRow.cells, cloneCell);\n return rowcells(cloneRow(gridRow.element), newCells, gridRow.section, true);\n };\n\n var LOCKED_COL_ATTR = 'data-snooker-locked-cols';\n var getLockedColumnsFromTable = function (table) {\n return getOpt(table, LOCKED_COL_ATTR).bind(function (lockedColStr) {\n return Optional.from(lockedColStr.match(/\\d+/g));\n }).map(function (lockedCols) {\n return mapToObject(lockedCols, always);\n });\n };\n var getLockedColumnsFromGrid = function (grid) {\n var locked = foldl(extractGridDetails(grid).rows, function (acc, row) {\n each$2(row.cells, function (cell, idx) {\n if (cell.isLocked) {\n acc[idx] = true;\n }\n });\n return acc;\n }, {});\n var lockedArr = mapToArray(locked, function (_val, key) {\n return parseInt(key, 10);\n });\n return sort$1(lockedArr);\n };\n\n var key = function (row, column) {\n return row + ',' + column;\n };\n var getAt = function (warehouse, row, column) {\n return Optional.from(warehouse.access[key(row, column)]);\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 ? Optional.some(filtered[0]) : Optional.none();\n };\n var filterItems = function (warehouse, predicate) {\n var all = bind$2(warehouse.all, function (r) {\n return r.cells;\n });\n return filter$2(all, predicate);\n };\n var generateColumns = function (rowData) {\n var columnsGroup = {};\n var index = 0;\n each$2(rowData.cells, function (column) {\n var colspan = column.colspan;\n range$1(colspan, function (columnIndex) {\n var colIndex = index + columnIndex;\n columnsGroup[colIndex] = columnext(column.element, colspan, colIndex);\n });\n index += colspan;\n });\n return columnsGroup;\n };\n var generate$1 = function (list) {\n var access = {};\n var cells = [];\n var tableOpt = head(list).map(function (rowData) {\n return rowData.element;\n }).bind(table);\n var lockedColumns = tableOpt.bind(getLockedColumnsFromTable).getOr({});\n var maxRows = 0;\n var maxColumns = 0;\n var rowCount = 0;\n var _a = partition(list, function (rowData) {\n return rowData.section === 'colgroup';\n }), colgroupRows = _a.pass, rows = _a.fail;\n each$2(rows, function (rowData) {\n var currentRow = [];\n each$2(rowData.cells, function (rowCell) {\n var start = 0;\n while (access[key(rowCount, start)] !== undefined) {\n start++;\n }\n var isLocked = hasNonNullableKey(lockedColumns, start.toString());\n var current = extended(rowCell.element, rowCell.rowspan, rowCell.colspan, rowCount, start, isLocked);\n for (var occupiedColumnPosition = 0; occupiedColumnPosition < rowCell.colspan; occupiedColumnPosition++) {\n for (var occupiedRowPosition = 0; occupiedRowPosition < rowCell.rowspan; occupiedRowPosition++) {\n var rowPosition = rowCount + occupiedRowPosition;\n var columnPosition = start + occupiedColumnPosition;\n var newpos = key(rowPosition, columnPosition);\n access[newpos] = current;\n maxColumns = Math.max(maxColumns, columnPosition + 1);\n }\n }\n currentRow.push(current);\n });\n maxRows++;\n cells.push(rowdetail(rowData.element, currentRow, rowData.section));\n rowCount++;\n });\n var _b = last$2(colgroupRows).map(function (rowData) {\n var columns = generateColumns(rowData);\n var colgroup$1 = colgroup(rowData.element, values(columns));\n return {\n colgroups: [colgroup$1],\n columns: columns\n };\n }).getOrThunk(function () {\n return {\n colgroups: [],\n columns: {}\n };\n }), columns = _b.columns, colgroups = _b.colgroups;\n var grid$1 = grid(maxRows, maxColumns);\n return {\n grid: grid$1,\n access: access,\n all: cells,\n columns: columns,\n colgroups: colgroups\n };\n };\n var fromTable = function (table) {\n var list = fromTable$1(table);\n return generate$1(list);\n };\n var justCells = function (warehouse) {\n return bind$2(warehouse.all, function (w) {\n return w.cells;\n });\n };\n var justColumns = function (warehouse) {\n return values(warehouse.columns);\n };\n var hasColumns = function (warehouse) {\n return keys(warehouse.columns).length > 0;\n };\n var getColumnAt = function (warehouse, columnIndex) {\n return Optional.from(warehouse.columns[columnIndex]);\n };\n var Warehouse = {\n fromTable: fromTable,\n generate: generate$1,\n getAt: getAt,\n findItem: findItem,\n filterItems: filterItems,\n justCells: justCells,\n justColumns: justColumns,\n hasColumns: hasColumns,\n getColumnAt: getColumnAt\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 ? Optional.some(bounds) : Optional.none();\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$1);\n var finishCoords = Warehouse.findItem(warehouse, finishCell, eq$1);\n return startCoords.bind(function (sc) {\n return finishCoords.map(function (fc) {\n return getBounds(sc, fc);\n });\n });\n };\n var getBox$1 = function (warehouse, startCell, finishCell) {\n return getAnyBox(warehouse, startCell, finishCell).bind(function (bounds) {\n return isRectangular(warehouse, bounds);\n });\n };\n\n var moveBy$1 = function (warehouse, cell, row, column) {\n return Warehouse.findItem(warehouse, cell, eq$1).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$1 = function (warehouse, start, finish) {\n return getAnyBox(warehouse, start, finish).map(function (bounds) {\n var inside = Warehouse.filterItems(warehouse, curry(inSelection, bounds));\n return map$1(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(c2, c1);\n };\n return Warehouse.findItem(warehouse, innerCell, isContainedBy).map(function (detail) {\n return detail.element;\n });\n };\n\n var moveBy = function (cell, deltaRow, deltaColumn) {\n return table(cell).bind(function (table) {\n var warehouse = getWarehouse(table);\n return moveBy$1(warehouse, cell, deltaRow, deltaColumn);\n });\n };\n var intercepts = function (table, first, last) {\n var warehouse = getWarehouse(table);\n return intercepts$1(warehouse, first, last);\n };\n var nestedIntercepts = function (table, first, firstTable, last, lastTable) {\n var warehouse = getWarehouse(table);\n var optStartCell = eq$1(table, firstTable) ? Optional.some(first) : parentCell(warehouse, first);\n var optLastCell = eq$1(table, lastTable) ? Optional.some(last) : parentCell(warehouse, last);\n return optStartCell.bind(function (startCell) {\n return optLastCell.bind(function (lastCell) {\n return intercepts$1(warehouse, startCell, lastCell);\n });\n });\n };\n var getBox = function (table, first, last) {\n var warehouse = getWarehouse(table);\n return getBox$1(warehouse, first, last);\n };\n var getWarehouse = Warehouse.fromTable;\n\n var before$4 = 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$5 = 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$1(v, element);\n });\n }, function (v) {\n before$4(v, element);\n });\n };\n var prepend = function (parent, element) {\n var firstChild$1 = firstChild(parent);\n firstChild$1.fold(function () {\n append$1(parent, element);\n }, function (v) {\n parent.dom.insertBefore(element.dom, v.dom);\n });\n };\n var append$1 = function (parent, element) {\n parent.dom.appendChild(element.dom);\n };\n var appendAt = function (parent, element, index) {\n child$3(parent, index).fold(function () {\n append$1(parent, element);\n }, function (v) {\n before$4(v, element);\n });\n };\n var wrap = function (element, wrapper) {\n before$4(element, wrapper);\n append$1(wrapper, element);\n };\n\n var before$3 = function (marker, elements) {\n each$2(elements, function (x) {\n before$4(marker, x);\n });\n };\n var after$4 = function (marker, elements) {\n each$2(elements, function (x, i) {\n var e = i === 0 ? marker : elements[i - 1];\n after$5(e, x);\n });\n };\n var append = function (parent, elements) {\n each$2(elements, function (x) {\n append$1(parent, x);\n });\n };\n\n var empty = function (element) {\n element.dom.textContent = '';\n each$2(children$3(element), function (rogue) {\n remove$5(rogue);\n });\n };\n var remove$5 = 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 = children$3(wrapper);\n if (children.length > 0) {\n before$3(wrapper, children);\n }\n remove$5(wrapper);\n };\n\n var NodeValue = function (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) ? Optional.from(element.dom.nodeValue) : Optional.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$9 = function (element) {\n return api$2.get(element);\n };\n var getOption = function (element) {\n return api$2.getOption(element);\n };\n var set = function (element, value) {\n return api$2.set(element, value);\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 = function (element) {\n return SugarElement.fromDom(element.dom.cloneNode(false));\n };\n var document = function (element) {\n return documentOrOwner(element).dom;\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$2(TagBoundaries, name(element));\n };\n var isEmptyTag = function (element) {\n if (!isElement(element)) {\n return false;\n }\n return contains$2([\n 'br',\n 'img',\n 'hr',\n 'input'\n ], name(element));\n };\n var isNonEditable = function (element) {\n return isElement(element) && get$b(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$2(source);\n setAll$1(destination, as);\n };\n var isSpecial = function (element) {\n var tag = name(element);\n return contains$2([\n 'script',\n 'noscript',\n 'iframe',\n 'noframes',\n 'noembed',\n 'title',\n 'style',\n 'textarea',\n 'xmp'\n ], tag);\n };\n var getLanguage = function (element) {\n return isElement(element) ? getOpt(element, 'lang') : Optional.none();\n };\n return {\n up: constant({\n selector: ancestor$1,\n closest: closest$1,\n predicate: ancestor$2,\n all: parents\n }),\n down: constant({\n selector: descendants,\n predicate: descendants$1\n }),\n styles: constant({\n get: get$a,\n getRaw: getRaw$2,\n set: set$1,\n remove: remove$6\n }),\n attrs: constant({\n get: get$b,\n set: set$2,\n remove: remove$7,\n copyTo: copyAttributesTo\n }),\n insert: constant({\n before: before$4,\n after: after$5,\n afterAll: after$4,\n append: append$1,\n appendAll: append,\n prepend: prepend,\n wrap: wrap\n }),\n remove: constant({\n unwrap: unwrap,\n remove: remove$5\n }),\n create: constant({\n nu: SugarElement.fromTag,\n clone: clone,\n text: SugarElement.fromText\n }),\n query: constant({\n comparePosition: comparePosition,\n prevSibling: prevSibling,\n nextSibling: nextSibling\n }),\n property: constant({\n children: children$3,\n name: name,\n parent: parent,\n document: document,\n isText: isText,\n isComment: isComment,\n isElement: isElement,\n isSpecial: isSpecial,\n getLanguage: getLanguage,\n getText: get$9,\n setText: set,\n isBoundary: isBoundary,\n isEmptyTag: isEmptyTag,\n isNonEditable: isNonEditable\n }),\n eq: eq$1,\n is: is$1\n };\n }\n\n var all = 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(universe, look, elements, unsafeOne) : Optional.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 = function (universe, item) {\n return curry(universe.eq, item);\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$1(pruned1, function (x) {\n return exists(pruned2, eq(universe, x));\n });\n return {\n firstpath: pruned1,\n secondpath: pruned2,\n shared: shared\n };\n };\n\n var sharedOne$1 = oneAll;\n var ancestors$1 = ancestors$2;\n\n var universe$3 = DomUniverse();\n var sharedOne = function (look, elements) {\n return sharedOne$1(universe$3, function (_universe, element) {\n return look(element);\n }, elements);\n };\n var ancestors = function (start, finish, isRoot) {\n return ancestors$1(universe$3, start, finish, isRoot);\n };\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$1(element, rootTable);\n };\n };\n if (eq$1(start, finish)) {\n return Optional.some({\n boxes: Optional.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$1(startTable, finishTable)) {\n return Optional.some({\n boxes: intercepts(startTable, start, finish),\n start: start,\n finish: finish\n });\n } else if (contains(startTable, finishTable)) {\n var ancestorCells = ancestors$3(finish, 'td,th', getIsRoot(startTable));\n var finishCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : finish;\n return Optional.some({\n boxes: nestedIntercepts(startTable, start, startTable, finish, finishTable),\n start: start,\n finish: finishCell\n });\n } else if (contains(finishTable, startTable)) {\n var ancestorCells = ancestors$3(start, 'td,th', getIsRoot(finishTable));\n var startCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : start;\n return Optional.some({\n boxes: nestedIntercepts(finishTable, start, startTable, finish, finishTable),\n start: start,\n finish: startCell\n });\n } else {\n return ancestors(start, finish).shared.bind(function (lca) {\n return closest$1(lca, 'table', isRoot).bind(function (lcaTable) {\n var finishAncestorCells = ancestors$3(finish, 'td,th', getIsRoot(lcaTable));\n var finishCell = finishAncestorCells.length > 0 ? finishAncestorCells[finishAncestorCells.length - 1] : finish;\n var startAncestorCells = ancestors$3(start, 'td,th', getIsRoot(lcaTable));\n var startCell = startAncestorCells.length > 0 ? startAncestorCells[startAncestorCells.length - 1] : start;\n return Optional.some({\n boxes: nestedIntercepts(lcaTable, start, startTable, finish, finishTable),\n start: startCell,\n finish: finishCell\n });\n });\n });\n }\n });\n });\n }\n };\n var retrieve$1 = function (container, selector) {\n var sels = descendants(container, selector);\n return sels.length > 0 ? Optional.some(sels) : Optional.none();\n };\n var getLast = function (boxes, lastSelectedSelector) {\n return find$1(boxes, function (box) {\n return is$2(box, lastSelectedSelector);\n });\n };\n var getEdges = function (container, firstSelectedSelector, lastSelectedSelector) {\n return descendant(container, firstSelectedSelector).bind(function (first) {\n return descendant(container, lastSelectedSelector).bind(function (last) {\n return sharedOne(lookupTable, [\n first,\n last\n ]).map(function (table) {\n return {\n first: first,\n last: last,\n table: table\n };\n });\n });\n });\n };\n var expandTo = function (finish, firstSelectedSelector) {\n return ancestor$1(finish, 'table').bind(function (table) {\n return descendant(table, firstSelectedSelector).bind(function (start) {\n return identify(start, finish).bind(function (identified) {\n return identified.boxes.map(function (boxes) {\n return {\n boxes: boxes,\n start: identified.start,\n finish: 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 moveBy(last, deltaRow, deltaColumn).bind(function (finish) {\n return expandTo(finish, firstSelectedSelector);\n });\n });\n };\n\n var retrieve = function (container, selector) {\n return retrieve$1(container, selector);\n };\n var retrieveBox = function (container, firstSelectedSelector, lastSelectedSelector) {\n return getEdges(container, firstSelectedSelector, lastSelectedSelector).bind(function (edges) {\n var isRoot = function (ancestor) {\n return eq$1(container, ancestor);\n };\n var sectionSelector = 'thead,tfoot,tbody,table';\n var firstAncestor = ancestor$1(edges.first, sectionSelector, isRoot);\n var lastAncestor = ancestor$1(edges.last, sectionSelector, isRoot);\n return firstAncestor.bind(function (fA) {\n return lastAncestor.bind(function (lA) {\n return eq$1(fA, lA) ? getBox(edges.table, edges.first, edges.last) : Optional.none();\n });\n });\n });\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$2(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 args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var argLength = args.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 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$2(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 var foldArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n foldArgs[_i] = arguments[_i];\n }\n if (foldArgs.length !== cases.length) {\n throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);\n }\n var target = foldArgs[count];\n return target.apply(null, args);\n },\n match: match,\n log: function (label) {\n 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 type = Adt.generate([\n { none: [] },\n { multiple: ['elements'] },\n { single: ['element'] }\n ]);\n var cata$2 = function (subject, onNone, onMultiple, onSingle) {\n return subject.fold(onNone, onMultiple, onSingle);\n };\n var none$1 = type.none;\n var multiple = type.multiple;\n var single = type.single;\n\n var Selections = function (lazyRoot, getStart, selectedSelector) {\n var get = function () {\n return retrieve(lazyRoot(), selectedSelector).fold(function () {\n return getStart().fold(none$1, single);\n }, function (cells) {\n return multiple(cells);\n });\n };\n return { get: get };\n };\n\n var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var clone = function (original, isDeep) {\n return SugarElement.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 var shallowAs = function (original, tag) {\n var nu = SugarElement.fromTag(tag);\n var attributes = clone$2(original);\n setAll$1(nu, attributes);\n return nu;\n };\n var copy$1 = function (original, tag) {\n var nu = shallowAs(original, tag);\n var cloneChildren = children$3(deep(original));\n append(nu, cloneChildren);\n return nu;\n };\n var mutate$1 = function (original, tag) {\n var nu = shallowAs(original, tag);\n before$4(original, nu);\n var children = children$3(original);\n append(nu, children);\n remove$5(original);\n return nu;\n };\n\n var Dimension = function (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$a(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$a(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 needManualCalc = function () {\n var browser = detect$3().browser;\n return browser.isIE() || browser.isEdge();\n };\n var toNumber = function (px, fallback) {\n return toFloat(px).getOr(fallback);\n };\n var getProp = function (element, name, fallback) {\n return toNumber(get$a(element, name), fallback);\n };\n var getBoxSizing = function (element) {\n return get$a(element, 'box-sizing');\n };\n var calcContentBoxSize = function (element, size, upper, lower) {\n var paddingUpper = getProp(element, 'padding-' + upper, 0);\n var paddingLower = getProp(element, 'padding-' + lower, 0);\n var borderUpper = getProp(element, 'border-' + upper + '-width', 0);\n var borderLower = getProp(element, 'border-' + lower + '-width', 0);\n return size - paddingUpper - paddingLower - borderUpper - borderLower;\n };\n var getCalculatedHeight = function (element, boxSizing) {\n var dom = element.dom;\n var height = dom.getBoundingClientRect().height || dom.offsetHeight;\n return boxSizing === 'border-box' ? height : calcContentBoxSize(element, height, 'top', 'bottom');\n };\n var getCalculatedWidth = function (element, boxSizing) {\n var dom = element.dom;\n var width = dom.getBoundingClientRect().width || dom.offsetWidth;\n return boxSizing === 'border-box' ? width : calcContentBoxSize(element, width, 'left', 'right');\n };\n var getHeight$1 = function (element) {\n return needManualCalc() ? getCalculatedHeight(element, getBoxSizing(element)) : getProp(element, 'height', element.dom.offsetHeight);\n };\n var getWidth = function (element) {\n return needManualCalc() ? getCalculatedWidth(element, getBoxSizing(element)) : getProp(element, 'width', element.dom.offsetWidth);\n };\n var getInnerWidth = function (element) {\n return getCalculatedWidth(element, 'content-box');\n };\n\n var api$1 = Dimension('width', function (element) {\n return element.dom.offsetWidth;\n });\n var get$8 = function (element) {\n return api$1.get(element);\n };\n var getOuter$2 = function (element) {\n return api$1.getOuter(element);\n };\n var getInner = getInnerWidth;\n var getRuntime$1 = getWidth;\n\n var columns = function (warehouse, isValidCell) {\n if (isValidCell === void 0) {\n isValidCell = always;\n }\n var grid = warehouse.grid;\n var cols = range$1(grid.columns, identity);\n var rowsArr = range$1(grid.rows, identity);\n return map$1(cols, function (col) {\n var getBlock = function () {\n return bind$2(rowsArr, function (r) {\n return Warehouse.getAt(warehouse, r, col).filter(function (detail) {\n return detail.column === col;\n }).toArray();\n });\n };\n var isValid = function (detail) {\n return detail.colspan === 1 && isValidCell(detail.element);\n };\n var getFallback = function () {\n return Warehouse.getAt(warehouse, 0, col);\n };\n return decide(getBlock, isValid, getFallback);\n });\n };\n var decide = function (getBlock, isValid, getFallback) {\n var inBlock = getBlock();\n var validInBlock = find$1(inBlock, isValid);\n var detailOption = validInBlock.orThunk(function () {\n return Optional.from(inBlock[0]).orThunk(getFallback);\n });\n return detailOption.map(function (detail) {\n return detail.element;\n });\n };\n var rows = function (warehouse) {\n var grid = warehouse.grid;\n var rowsArr = range$1(grid.rows, identity);\n var cols = range$1(grid.columns, identity);\n return map$1(rowsArr, function (row) {\n var getBlock = function () {\n return bind$2(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\n var deduce = function (xs, index) {\n if (index < 0 || index >= xs.length - 1) {\n return Optional.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 Optional.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 Optional.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 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$a(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';\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$7 = function (element) {\n return api.get(element);\n };\n var getOuter$1 = function (element) {\n return api.getOuter(element);\n };\n var getRuntime = getHeight$1;\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: left,\n top: top,\n translate: translate\n };\n };\n var SugarPosition = r;\n\n var boxPosition = function (dom) {\n var box = dom.getBoundingClientRect();\n return SugarPosition(box.left, box.top);\n };\n var firstDefinedOrZero = function (a, b) {\n if (a !== undefined) {\n return a;\n } else {\n return b !== undefined ? b : 0;\n }\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 SugarPosition(body.offsetLeft, body.offsetTop);\n }\n var scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop);\n var scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : 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 SugarPosition(body.offsetLeft, body.offsetTop);\n }\n if (!inBody(element)) {\n return SugarPosition(0, 0);\n }\n return boxPosition(dom);\n };\n\n var rowInfo = function (row, y) {\n return {\n row: row,\n y: y\n };\n };\n var colInfo = function (col, x) {\n return {\n col: col,\n x: x\n };\n };\n var rtlEdge = function (cell) {\n var pos = absolute(cell);\n return pos.left + getOuter$2(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$1 = function (cell) {\n return absolute(cell).top;\n };\n var getTopEdge = function (index, cell) {\n return rowInfo(index, getTop$1(cell));\n };\n var getBottomEdge = function (index, cell) {\n return rowInfo(index, getTop$1(cell) + getOuter$1(cell));\n };\n var findPositions = function (getInnerEdge, getOuterEdge, array) {\n if (array.length === 0) {\n return [];\n }\n var lines = map$1(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$1\n };\n var ltr$1 = {\n delta: identity,\n edge: ltrEdge,\n positions: function (optElements) {\n return findPositions(getLeftEdge, getRightEdge, optElements);\n }\n };\n var rtl$1 = {\n delta: negate,\n edge: rtlEdge,\n positions: function (optElements) {\n return findPositions(getRightEdge, getLeftEdge, optElements);\n }\n };\n var detect$2 = onDirection(ltr$1, rtl$1);\n var width = {\n delta: function (amount, table) {\n return detect$2(table).delta(amount, table);\n },\n positions: function (cols, table) {\n return detect$2(table).positions(cols, table);\n },\n edge: function (cell) {\n return detect$2(cell).edge(cell);\n }\n };\n\n var units = {\n unsupportedLength: [\n 'em',\n 'ex',\n 'cap',\n 'ch',\n 'ic',\n 'rem',\n 'lh',\n 'rlh',\n 'vw',\n 'vh',\n 'vi',\n 'vb',\n 'vmin',\n 'vmax',\n 'cm',\n 'mm',\n 'Q',\n 'in',\n 'pc',\n 'pt',\n 'px'\n ],\n fixed: [\n 'px',\n 'pt'\n ],\n relative: ['%'],\n empty: ['']\n };\n var pattern = function () {\n var decimalDigits = '[0-9]+';\n var signedInteger = '[+-]?' + decimalDigits;\n var exponentPart = '[eE]' + signedInteger;\n var dot = '\\\\.';\n var opt = function (input) {\n return '(?:' + input + ')?';\n };\n var unsignedDecimalLiteral = [\n 'Infinity',\n decimalDigits + dot + opt(decimalDigits) + opt(exponentPart),\n dot + decimalDigits + opt(exponentPart),\n decimalDigits + opt(exponentPart)\n ].join('|');\n var float = '[+-]?(?:' + unsignedDecimalLiteral + ')';\n return new RegExp('^(' + float + ')(.*)$');\n }();\n var isUnit = function (unit, accepted) {\n return exists(accepted, function (acc) {\n return exists(units[acc], function (check) {\n return unit === check;\n });\n });\n };\n var parse = function (input, accepted) {\n var match = Optional.from(pattern.exec(input));\n return match.bind(function (array) {\n var value = Number(array[1]);\n var unitRaw = array[2];\n if (isUnit(unitRaw, accepted)) {\n return Optional.some({\n value: value,\n unit: unitRaw\n });\n } else {\n return Optional.none();\n }\n });\n };\n\n var rPercentageBasedSizeRegex = /(\\d+(\\.\\d+)?)%/;\n var rPixelBasedSizeRegex = /(\\d+(\\.\\d+)?)px|em/;\n var isCol$2 = isTag('col');\n var getPercentSize = function (elm, outerGetter, innerGetter) {\n var relativeParent = parentElement(elm).getOrThunk(function () {\n return getBody$1(owner(elm));\n });\n return outerGetter(elm) / innerGetter(relativeParent) * 100;\n };\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 getRuntime(cell) + 'px';\n };\n var convert = function (cell, number, getter, setter) {\n var newSize = 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 = parseFloat(value);\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$7(cell);\n }\n return normalizePixelSize(value, cell, get$7, 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 getRaw$1 = function (element, prop) {\n return getRaw$2(element, prop).orThunk(function () {\n return getOpt(element, prop).map(function (val) {\n return val + 'px';\n });\n });\n };\n var getRawWidth$1 = function (element) {\n return getRaw$1(element, 'width');\n };\n var getRawHeight = function (element) {\n return getRaw$1(element, 'height');\n };\n var getPercentageWidth = function (cell) {\n return getPercentSize(cell, get$8, getInner);\n };\n var getPixelWidth$1 = function (cell) {\n return isCol$2(cell) ? get$8(cell) : getRuntime$1(cell);\n };\n var getHeight = function (cell) {\n return get$6(cell, 'rowspan', getTotalHeight);\n };\n var getGenericWidth = function (cell) {\n var width = getRawWidth$1(cell);\n return width.bind(function (w) {\n return parse(w, [\n 'fixed',\n 'relative',\n 'empty'\n ]);\n });\n };\n var setGenericWidth = function (cell, amount, unit) {\n set$1(cell, 'width', amount + unit);\n };\n var getPixelTableWidth = function (table) {\n return get$8(table) + 'px';\n };\n var getPercentTableWidth = function (table) {\n return getPercentSize(table, get$8, getInner) + '%';\n };\n var isPercentSizing$1 = function (table) {\n return getRawWidth$1(table).exists(function (size) {\n return rPercentageBasedSizeRegex.test(size);\n });\n };\n var isPixelSizing$1 = function (table) {\n return getRawWidth$1(table).exists(function (size) {\n return rPixelBasedSizeRegex.test(size);\n });\n };\n var isNoneSizing$1 = function (table) {\n return getRawWidth$1(table).isNone();\n };\n var percentageBasedSizeRegex = constant(rPercentageBasedSizeRegex);\n\n var isCol$1 = isTag('col');\n var getRawW = function (cell) {\n return getRawWidth$1(cell).getOrThunk(function () {\n return getPixelWidth$1(cell) + 'px';\n });\n };\n var getRawH = function (cell) {\n return getRawHeight(cell).getOrThunk(function () {\n return getHeight(cell) + 'px';\n });\n };\n var justCols = function (warehouse) {\n return map$1(Warehouse.justColumns(warehouse), function (column) {\n return Optional.from(column.element);\n });\n };\n var isValidColumn = function (cell) {\n var browser = detect$3().browser;\n var supportsColWidths = browser.isChrome() || browser.isFirefox();\n return isCol$1(cell) ? supportsColWidths : true;\n };\n var getDimension = function (cellOpt, index, backups, filter, getter, fallback) {\n return cellOpt.filter(filter).fold(function () {\n return fallback(deduce(backups, index));\n }, function (cell) {\n return getter(cell);\n });\n };\n var getWidthFrom = function (warehouse, table, getWidth, fallback) {\n var columnCells = columns(warehouse);\n var columns$1 = Warehouse.hasColumns(warehouse) ? justCols(warehouse) : columnCells;\n var backups = [Optional.some(width.edge(table))].concat(map$1(width.positions(columnCells, table), function (pos) {\n return pos.map(function (p) {\n return p.x;\n });\n }));\n var colFilter = not(hasColspan);\n return map$1(columns$1, function (cellOption, c) {\n return getDimension(cellOption, c, backups, colFilter, function (column) {\n if (isValidColumn(column)) {\n return getWidth(column);\n } else {\n var cell = bindFrom(columnCells[c], identity);\n return getDimension(cell, c, backups, colFilter, function (cell) {\n return fallback(Optional.some(get$8(cell)));\n }, fallback);\n }\n }, fallback);\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, table) {\n return getWidthFrom(warehouse, table, getRawW, getDeduced);\n };\n var getPercentageWidths = function (warehouse, table, tableSize) {\n return getWidthFrom(warehouse, table, getPercentageWidth, function (deduced) {\n return deduced.fold(function () {\n return tableSize.minCellWidth();\n }, function (cellWidth) {\n return cellWidth / tableSize.pixelWidth() * 100;\n });\n });\n };\n var getPixelWidths = function (warehouse, table, tableSize) {\n return getWidthFrom(warehouse, table, getPixelWidth$1, function (deduced) {\n return deduced.getOrThunk(tableSize.minCellWidth);\n });\n };\n var getHeightFrom = function (warehouse, table, direction, getHeight, fallback) {\n var rows$1 = rows(warehouse);\n var backups = [Optional.some(direction.edge(table))].concat(map$1(direction.positions(rows$1, table), function (pos) {\n return pos.map(function (p) {\n return p.y;\n });\n }));\n return map$1(rows$1, function (cellOption, c) {\n return getDimension(cellOption, c, backups, not(hasRowspan), getHeight, fallback);\n });\n };\n var getPixelHeights = function (warehouse, table, direction) {\n return getHeightFrom(warehouse, table, direction, getHeight, function (deduced) {\n return deduced.getOrThunk(minHeight);\n });\n };\n var getRawHeights = function (warehouse, table, direction) {\n return getHeightFrom(warehouse, table, direction, getRawH, getDeduced);\n };\n\n var widthLookup = function (table, getter) {\n return function () {\n if (inBody(table)) {\n return getter(table);\n } else {\n return parseFloat(getRaw$2(table, 'width').getOr('0'));\n }\n };\n };\n var noneSize = function (table) {\n var getWidth = widthLookup(table, get$8);\n var zero = constant(0);\n var getWidths = function (warehouse, tableSize) {\n return getPixelWidths(warehouse, table, tableSize);\n };\n return {\n width: getWidth,\n pixelWidth: getWidth,\n getWidths: getWidths,\n getCellDelta: zero,\n singleColumnWidth: constant([0]),\n minCellWidth: zero,\n setElementWidth: noop,\n adjustTableWidth: noop,\n isRelative: true,\n label: 'none'\n };\n };\n var percentageSize = function (table) {\n var getFloatWidth = widthLookup(table, function (elem) {\n return parseFloat(getPercentTableWidth(elem));\n });\n var getWidth = widthLookup(table, get$8);\n var getCellDelta = function (delta) {\n return delta / getWidth() * 100;\n };\n var singleColumnWidth = function (w, _delta) {\n return [100 - w];\n };\n var minCellWidth = function () {\n return minWidth() / getWidth() * 100;\n };\n var adjustTableWidth = function (delta) {\n var currentWidth = getFloatWidth();\n var change = delta / 100 * currentWidth;\n var newWidth = currentWidth + change;\n setPercentageWidth(table, newWidth);\n };\n var getWidths = function (warehouse, tableSize) {\n return getPercentageWidths(warehouse, table, tableSize);\n };\n return {\n width: getFloatWidth,\n pixelWidth: getWidth,\n getWidths: getWidths,\n getCellDelta: getCellDelta,\n singleColumnWidth: singleColumnWidth,\n minCellWidth: minCellWidth,\n setElementWidth: setPercentageWidth,\n adjustTableWidth: adjustTableWidth,\n isRelative: true,\n label: 'percent'\n };\n };\n var pixelSize = function (table) {\n var getWidth = widthLookup(table, get$8);\n var getCellDelta = identity;\n var singleColumnWidth = function (w, delta) {\n var newNext = Math.max(minWidth(), w + delta);\n return [newNext - w];\n };\n var adjustTableWidth = function (delta) {\n var newWidth = getWidth() + delta;\n setPixelWidth(table, newWidth);\n };\n var getWidths = function (warehouse, tableSize) {\n return getPixelWidths(warehouse, table, tableSize);\n };\n return {\n width: getWidth,\n pixelWidth: getWidth,\n getWidths: getWidths,\n getCellDelta: getCellDelta,\n singleColumnWidth: singleColumnWidth,\n minCellWidth: minWidth,\n setElementWidth: setPixelWidth,\n adjustTableWidth: adjustTableWidth,\n isRelative: false,\n label: 'pixel'\n };\n };\n var chooseSize = function (element, width) {\n var percentMatch = percentageBasedSizeRegex().exec(width);\n if (percentMatch !== null) {\n return percentageSize(element);\n } else {\n return pixelSize(element);\n }\n };\n var getTableSize = function (table) {\n var width = getRawWidth$1(table);\n return width.fold(function () {\n return noneSize(table);\n }, function (w) {\n return chooseSize(table, w);\n });\n };\n var TableSize = {\n getTableSize: getTableSize,\n pixelSize: pixelSize,\n percentageSize: percentageSize,\n noneSize: noneSize\n };\n\n var statsStruct = function (minRow, minCol, maxRow, maxCol, allCells, selectedCells) {\n return {\n minRow: minRow,\n minCol: minCol,\n maxRow: maxRow,\n maxCol: maxCol,\n allCells: allCells,\n selectedCells: selectedCells\n };\n };\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 var allCells = [];\n var selectedCells = [];\n each$1(house.access, function (detail) {\n allCells.push(detail);\n if (isSelected(detail)) {\n selectedCells.push(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, allCells, selectedCells);\n };\n var makeCell = function (list, seenSelected, rowIndex) {\n var row = list[rowIndex].element;\n var td = SugarElement.fromTag('td');\n append$1(td, SugarElement.fromTag('br'));\n var f = seenSelected ? append$1 : 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 (replica, stats, house, widthDelta) {\n each$1(house.columns, function (col) {\n if (col.column < stats.minCol || col.column > stats.maxCol) {\n remove$5(col.element);\n }\n });\n var emptyRows = filter$2(firstLayer(replica, 'tr'), function (row) {\n return row.dom.childElementCount === 0;\n });\n each$2(emptyRows, remove$5);\n if (stats.minCol === stats.maxCol || stats.minRow === stats.maxRow) {\n each$2(firstLayer(replica, 'th,td'), function (cell) {\n remove$7(cell, 'rowspan');\n remove$7(cell, 'colspan');\n });\n }\n remove$7(replica, LOCKED_COL_ATTR);\n remove$7(replica, 'data-snooker-col-series');\n var tableSize = TableSize.getTableSize(replica);\n tableSize.adjustTableWidth(widthDelta);\n };\n var getTableWidthDelta = function (table, warehouse, tableSize, stats) {\n if (stats.minCol === 0 && warehouse.grid.columns === stats.maxCol + 1) {\n return 0;\n }\n var colWidths = getPixelWidths(warehouse, table, tableSize);\n var allColsWidth = foldl(colWidths, function (acc, width) {\n return acc + width;\n }, 0);\n var selectedColsWidth = foldl(colWidths.slice(stats.minCol, stats.maxCol + 1), function (acc, width) {\n return acc + width;\n }, 0);\n var newWidth = selectedColsWidth / allColsWidth * tableSize.pixelWidth();\n var delta = newWidth - tableSize.pixelWidth();\n return tableSize.getCellDelta(delta);\n };\n var extract$1 = function (table, selectedSelector) {\n var isSelected = function (detail) {\n return is$2(detail.element, selectedSelector);\n };\n var replica = deep(table);\n var list = fromTable$1(replica);\n var tableSize = TableSize.getTableSize(table);\n var replicaHouse = Warehouse.generate(list);\n var replicaStats = findSelectedStats(replicaHouse, isSelected);\n var selector = 'th:not(' + selectedSelector + ')' + ',td:not(' + selectedSelector + ')';\n var unselectedCells = filterFirstLayer(replica, 'th,td', function (cell) {\n return is$2(cell, selector);\n });\n each$2(unselectedCells, remove$5);\n fillInGaps(list, replicaHouse, replicaStats, isSelected);\n var house = Warehouse.fromTable(table);\n var widthDelta = getTableWidthDelta(table, house, tableSize, replicaStats);\n clean(replica, replicaStats, replicaHouse, widthDelta);\n return replica;\n };\n\n var nbsp = '\\xA0';\n\n var getEnd = function (element) {\n return name(element) === 'img' ? 1 : getOption(element).fold(function () {\n return children$3(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$2(elementsWithCursorPosition, name(elem));\n };\n\n var first = function (element) {\n return descendant$1(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 = children$3(element);\n for (var i = children.length - 1; i >= 0; i--) {\n var child = children[i];\n if (predicate(child)) {\n return Optional.some(child);\n }\n var res = descend(child);\n if (res.isSome()) {\n return res;\n }\n }\n return Optional.none();\n };\n return descend(scope);\n };\n\n var transferableAttributes = {\n scope: [\n 'row',\n 'col'\n ]\n };\n var createCell = function (doc) {\n return function () {\n var td = SugarElement.fromTag('td', doc.dom);\n append$1(td, SugarElement.fromTag('br', doc.dom));\n return td;\n };\n };\n var createCol = function (doc) {\n return function () {\n return SugarElement.fromTag('col', doc.dom);\n };\n };\n var createColgroup = function (doc) {\n return function () {\n return SugarElement.fromTag('colgroup', doc.dom);\n };\n };\n var createRow$1 = function (doc) {\n return function () {\n return SugarElement.fromTag('tr', doc.dom);\n };\n };\n var replace$1 = function (cell, tag, attrs) {\n var replica = copy$1(cell, tag);\n each$1(attrs, function (v, k) {\n if (v === null) {\n remove$7(replica, k);\n } else {\n set$2(replica, k, v);\n }\n });\n return replica;\n };\n var pasteReplace = function (cell) {\n return cell;\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$3(firstText, formatSelector, function (element) {\n return eq$1(element, oldCell);\n });\n return foldr(parents, function (last, parent) {\n var clonedFormat = shallow(parent);\n remove$7(clonedFormat, 'contenteditable');\n append$1(last, clonedFormat);\n return clonedFormat;\n }, newCell);\n }).getOr(newCell);\n };\n var cloneAppropriateAttributes = function (original, clone) {\n each$1(transferableAttributes, function (validAttributes, attributeName) {\n return getOpt(original, attributeName).filter(function (attribute) {\n return contains$2(validAttributes, attribute);\n }).each(function (attribute) {\n return set$2(clone, attributeName, attribute);\n });\n });\n };\n var cellOperations = function (mutate, doc, formatsToClone) {\n var cloneCss = function (prev, clone) {\n copy$2(prev.element, clone);\n remove$6(clone, 'height');\n if (prev.colspan !== 1) {\n remove$6(clone, 'width');\n }\n };\n var newCell = function (prev) {\n var td = SugarElement.fromTag(name(prev.element), doc.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$1(lastNode, SugarElement.fromTag('br'));\n cloneCss(prev, td);\n cloneAppropriateAttributes(prev.element, td);\n mutate(prev.element, td);\n return td;\n };\n var newCol = function (prev) {\n var col = SugarElement.fromTag(name(prev.element), doc.dom);\n cloneCss(prev, col);\n mutate(prev.element, col);\n return col;\n };\n return {\n col: newCol,\n colgroup: createColgroup(doc),\n row: createRow$1(doc),\n cell: newCell,\n replace: replace$1,\n colGap: createCol(doc),\n gap: createCell(doc)\n };\n };\n var paste$1 = function (doc) {\n return {\n col: createCol(doc),\n colgroup: createColgroup(doc),\n row: createRow$1(doc),\n cell: createCell(doc),\n replace: pasteReplace,\n colGap: createCol(doc),\n gap: createCell(doc)\n };\n };\n\n var fromHtml = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n return children$3(SugarElement.fromDom(div));\n };\n var fromDom = function (nodes) {\n return map$1(nodes, SugarElement.fromDom);\n };\n\n var getNodeName = function (elm) {\n return elm.nodeName.toLowerCase();\n };\n var getBody = function (editor) {\n return SugarElement.fromDom(editor.getBody());\n };\n var getPixelWidth = 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$1(element, getBody(editor));\n };\n };\n var removePxSuffix = function (size) {\n return size ? size.replace(/px$/, '') : '';\n };\n var addPxSuffix = function (size) {\n return /^\\d+(\\.\\d+)?$/.test(size) ? size + 'px' : size;\n };\n var removeDataStyle = function (table) {\n remove$7(table, 'data-mce-style');\n var removeStyleAttribute = function (element) {\n return remove$7(element, 'data-mce-style');\n };\n each$2(cells$1(table), removeStyleAttribute);\n each$2(columns$1(table), removeStyleAttribute);\n each$2(rows$1(table), removeStyleAttribute);\n };\n var getRawWidth = function (editor, elm) {\n var raw = editor.dom.getStyle(elm, 'width') || editor.dom.getAttrib(elm, 'width');\n return Optional.from(raw).filter(isNotEmpty);\n };\n var isPercentage$1 = function (value) {\n return /^(\\d+(\\.\\d+)?)%$/.test(value);\n };\n var isPixel = function (value) {\n return /^(\\d+(\\.\\d+)?)px$/.test(value);\n };\n var getSelectionStart = function (editor) {\n return SugarElement.fromDom(editor.selection.getStart());\n };\n var getSelectionEnd = function (editor) {\n return SugarElement.fromDom(editor.selection.getEnd());\n };\n\n var selection = function (selections) {\n return cata$2(selections.get(), constant([]), identity, pure);\n };\n var unmergable = function (selections) {\n var hasSpan = function (elem, type) {\n return getOpt(elem, type).exists(function (span) {\n return parseInt(span, 10) > 1;\n });\n };\n var hasRowOrColSpan = function (elem) {\n return hasSpan(elem, 'rowspan') || hasSpan(elem, 'colspan');\n };\n var candidates = selection(selections);\n return candidates.length > 0 && forall(candidates, hasRowOrColSpan) ? Optional.some(candidates) : Optional.none();\n };\n var mergable = function (table, selections, ephemera) {\n return cata$2(selections.get(), Optional.none, function (cells) {\n if (cells.length <= 1) {\n return Optional.none();\n } else {\n return retrieveBox(table, ephemera.firstSelectedSelector, ephemera.lastSelectedSelector).map(function (bounds) {\n return {\n bounds: bounds,\n cells: cells\n };\n });\n }\n }, Optional.none);\n };\n\n var strSelected = 'data-mce-selected';\n var strSelectedSelector = 'td[' + strSelected + '],th[' + strSelected + ']';\n var strAttributeSelector = '[' + strSelected + ']';\n var strFirstSelected = 'data-mce-first-selected';\n var strFirstSelectedSelector = 'td[' + strFirstSelected + '],th[' + strFirstSelected + ']';\n var strLastSelected = 'data-mce-last-selected';\n var strLastSelectedSelector = 'td[' + strLastSelected + '],th[' + strLastSelected + ']';\n var attributeSelector = strAttributeSelector;\n var ephemera = {\n selected: strSelected,\n selectedSelector: strSelectedSelector,\n firstSelected: strFirstSelected,\n firstSelectedSelector: strFirstSelectedSelector,\n lastSelected: strLastSelected,\n lastSelectedSelector: strLastSelectedSelector\n };\n\n var noMenu = function (cell) {\n return {\n element: cell,\n mergable: Optional.none(),\n unmergable: Optional.none(),\n selection: [cell]\n };\n };\n var forMenu = function (selections, table, cell) {\n return {\n element: cell,\n mergable: mergable(table, selections, ephemera),\n unmergable: unmergable(selections),\n selection: selection(selections)\n };\n };\n var paste = function (element, clipboard, generators) {\n return {\n element: element,\n clipboard: clipboard,\n generators: generators\n };\n };\n var pasteRows = function (selections, cell, clipboard, generators) {\n return {\n selection: selection(selections),\n clipboard: clipboard,\n generators: generators\n };\n };\n\n var getSelectionCellFallback = function (element) {\n return table(element).bind(function (table) {\n return retrieve(table, ephemera.firstSelectedSelector);\n }).fold(constant(element), function (cells) {\n return cells[0];\n });\n };\n var getSelectionFromSelector = function (selector) {\n return function (initCell, isRoot) {\n var cellName = name(initCell);\n var cell = cellName === 'col' || cellName === 'colgroup' ? getSelectionCellFallback(initCell) : initCell;\n return closest$1(cell, selector, isRoot);\n };\n };\n var getSelectionCellOrCaption = getSelectionFromSelector('th,td,caption');\n var getSelectionCell = getSelectionFromSelector('th,td');\n var getCellsFromSelection = function (selections) {\n return selection(selections);\n };\n var getRowsFromSelection = function (selected, selector) {\n var cellOpt = getSelectionCell(selected);\n var rowsOpt = cellOpt.bind(function (cell) {\n return table(cell);\n }).map(function (table) {\n return rows$1(table);\n });\n return lift2(cellOpt, rowsOpt, function (cell, rows) {\n return filter$2(rows, function (row) {\n return exists(fromDom(row.dom.cells), function (rowCell) {\n return get$b(rowCell, selector) === '1' || eq$1(rowCell, cell);\n });\n });\n }).getOr([]);\n };\n\n var extractSelected = function (cells) {\n return table(cells[0]).map(function (table) {\n var replica = extract$1(table, attributeSelector);\n removeDataStyle(replica);\n return [replica];\n });\n };\n var serializeElements = function (editor, elements) {\n return map$1(elements, function (elm) {\n return editor.selection.serializer.serialize(elm.dom, {});\n }).join('');\n };\n var getTextContent = function (elements) {\n return map$1(elements, function (element) {\n return element.dom.innerText;\n }).join('');\n };\n var registerEvents = function (editor, selections, actions) {\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 cata$2(selections.get(), noop, multiCellContext, noop);\n }\n });\n editor.on('BeforeSetContent', function (e) {\n if (e.selection === true && e.paste === true) {\n var selectedCells = getCellsFromSelection(selections);\n head(selectedCells).each(function (cell) {\n table(cell).each(function (table) {\n var elements = filter$2(fromHtml(e.content), function (content) {\n return name(content) !== 'meta';\n });\n var isTable = isTag('table');\n if (elements.length === 1 && isTable(elements[0])) {\n e.preventDefault();\n var doc = SugarElement.fromDom(editor.getDoc());\n var generators = paste$1(doc);\n var targets = paste(cell, elements[0], generators);\n actions.pasteCells(table, targets).each(function () {\n editor.focus();\n });\n }\n });\n });\n }\n });\n };\n\n var adt$7 = 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$7);\n\n var neighbours = 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, resize) {\n var result = input.slice(0);\n var context = neighbours(input, column);\n var onNone = constant(map$1(result, constant(0)));\n var onOnly = function (index) {\n return tableSize.singleColumnWidth(result[index], step);\n };\n var onLeft = function (index, next) {\n return resize.calcLeftEdgeDeltas(result, index, next, step, tableSize.minCellWidth(), tableSize.isRelative);\n };\n var onMiddle = function (prev, index, next) {\n return resize.calcMiddleDeltas(result, prev, index, next, step, tableSize.minCellWidth(), tableSize.isRelative);\n };\n var onRight = function (prev, index) {\n return resize.calcRightEdgeDeltas(result, prev, index, step, tableSize.minCellWidth(), tableSize.isRelative);\n };\n return context.fold(onNone, onOnly, onLeft, onMiddle, onRight);\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 recalculateWidthForCells = function (warehouse, widths) {\n var all = Warehouse.justCells(warehouse);\n return map$1(all, function (cell) {\n var width = total(cell.column, cell.column + cell.colspan, widths);\n return {\n element: cell.element,\n width: width,\n colspan: cell.colspan\n };\n });\n };\n var recalculateWidthForColumns = function (warehouse, widths) {\n var groups = Warehouse.justColumns(warehouse);\n return map$1(groups, function (column, index) {\n return {\n element: column.element,\n width: widths[index],\n colspan: column.colspan\n };\n });\n };\n var recalculateHeightForCells = function (warehouse, heights) {\n var all = Warehouse.justCells(warehouse);\n return map$1(all, function (cell) {\n var height = total(cell.row, cell.row + cell.rowspan, heights);\n return {\n element: cell.element,\n height: height,\n rowspan: cell.rowspan\n };\n });\n };\n var matchRowHeight = function (warehouse, heights) {\n return map$1(warehouse.all, function (row, i) {\n return {\n element: row.element,\n height: heights[i]\n };\n });\n };\n\n var sumUp = function (newSize) {\n return foldr(newSize, function (b, a) {\n return b + a;\n }, 0);\n };\n var recalculate = function (warehouse, widths) {\n if (Warehouse.hasColumns(warehouse)) {\n return recalculateWidthForColumns(warehouse, widths);\n } else {\n return recalculateWidthForCells(warehouse, widths);\n }\n };\n var recalculateAndApply = function (warehouse, widths, tableSize) {\n var newSizes = recalculate(warehouse, widths);\n each$2(newSizes, function (cell) {\n tableSize.setElementWidth(cell.element, cell.width);\n });\n };\n var adjustWidth = function (table, delta, index, resizing, tableSize) {\n var warehouse = Warehouse.fromTable(table);\n var step = tableSize.getCellDelta(delta);\n var widths = tableSize.getWidths(warehouse, tableSize);\n var isLastColumn = index === warehouse.grid.columns - 1;\n var clampedStep = resizing.clampTableDelta(widths, index, step, tableSize.minCellWidth(), isLastColumn);\n var deltas = determine(widths, index, clampedStep, tableSize, resizing);\n var newWidths = map$1(deltas, function (dx, i) {\n return dx + widths[i];\n });\n recalculateAndApply(warehouse, newWidths, tableSize);\n resizing.resizeTable(tableSize.adjustTableWidth, clampedStep, isLastColumn);\n };\n var adjustHeight = function (table, delta, index, direction) {\n var warehouse = Warehouse.fromTable(table);\n var heights = getPixelHeights(warehouse, table, direction);\n var newHeights = map$1(heights, function (dy, i) {\n return index === i ? Math.max(delta + dy, minHeight()) : dy;\n });\n var newCellSizes = recalculateHeightForCells(warehouse, newHeights);\n var newRowSizes = matchRowHeight(warehouse, newHeights);\n each$2(newRowSizes, function (row) {\n setHeight(row.element, row.height);\n });\n each$2(newCellSizes, function (cell) {\n setHeight(cell.element, cell.height);\n });\n var total = sumUp(newHeights);\n setHeight(table, total);\n };\n var adjustAndRedistributeWidths$1 = function (_table, list, details, tableSize, resizeBehaviour) {\n var warehouse = Warehouse.generate(list);\n var sizes = tableSize.getWidths(warehouse, tableSize);\n var tablePixelWidth = tableSize.pixelWidth();\n var _a = resizeBehaviour.calcRedestributedWidths(sizes, tablePixelWidth, details.pixelDelta, tableSize.isRelative), newSizes = _a.newSizes, delta = _a.delta;\n recalculateAndApply(warehouse, newSizes, tableSize);\n tableSize.adjustTableWidth(delta);\n };\n var adjustWidthTo = function (_table, list, _info, tableSize) {\n var warehouse = Warehouse.generate(list);\n var widths = tableSize.getWidths(warehouse, tableSize);\n recalculateAndApply(warehouse, widths, tableSize);\n };\n\n var zero = function (array) {\n return map$1(array, constant(0));\n };\n var surround = function (sizes, startIndex, endIndex, results, f) {\n return f(sizes.slice(0, startIndex)).concat(results).concat(f(sizes.slice(endIndex)));\n };\n var clampDeltaHelper = function (predicate) {\n return function (sizes, index, delta, minCellSize) {\n if (!predicate(delta)) {\n return delta;\n } else {\n var newSize = Math.max(minCellSize, sizes[index] - Math.abs(delta));\n var diff = Math.abs(newSize - sizes[index]);\n return delta >= 0 ? diff : -diff;\n }\n };\n };\n var clampNegativeDelta = clampDeltaHelper(function (delta) {\n return delta < 0;\n });\n var clampDelta = clampDeltaHelper(always);\n var resizeTable = function () {\n var calcFixedDeltas = function (sizes, index, next, delta, minCellSize) {\n var clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize);\n return surround(sizes, index, next + 1, [\n clampedDelta,\n 0\n ], zero);\n };\n var calcRelativeDeltas = function (sizes, index, delta, minCellSize) {\n var ratio = (100 + delta) / 100;\n var newThis = Math.max(minCellSize, (sizes[index] + delta) / ratio);\n return map$1(sizes, function (size, idx) {\n var newSize = idx === index ? newThis : size / ratio;\n return newSize - size;\n });\n };\n var calcLeftEdgeDeltas = function (sizes, index, next, delta, minCellSize, isRelative) {\n if (isRelative) {\n return calcRelativeDeltas(sizes, index, delta, minCellSize);\n } else {\n return calcFixedDeltas(sizes, index, next, delta, minCellSize);\n }\n };\n var calcMiddleDeltas = function (sizes, _prev, index, next, delta, minCellSize, isRelative) {\n return calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize, isRelative);\n };\n var resizeTable = function (resizer, delta) {\n return resizer(delta);\n };\n var calcRightEdgeDeltas = function (sizes, _prev, index, delta, minCellSize, isRelative) {\n if (isRelative) {\n return calcRelativeDeltas(sizes, index, delta, minCellSize);\n } else {\n var clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize);\n return zero(sizes.slice(0, index)).concat([clampedDelta]);\n }\n };\n var calcRedestributedWidths = function (sizes, totalWidth, pixelDelta, isRelative) {\n if (isRelative) {\n var tableWidth = totalWidth + pixelDelta;\n var ratio_1 = tableWidth / totalWidth;\n var newSizes = map$1(sizes, function (size) {\n return size / ratio_1;\n });\n return {\n delta: ratio_1 * 100 - 100,\n newSizes: newSizes\n };\n } else {\n return {\n delta: pixelDelta,\n newSizes: sizes\n };\n }\n };\n return {\n resizeTable: resizeTable,\n clampTableDelta: clampNegativeDelta,\n calcLeftEdgeDeltas: calcLeftEdgeDeltas,\n calcMiddleDeltas: calcMiddleDeltas,\n calcRightEdgeDeltas: calcRightEdgeDeltas,\n calcRedestributedWidths: calcRedestributedWidths\n };\n };\n var preserveTable = function () {\n var calcLeftEdgeDeltas = function (sizes, index, next, delta, minCellSize) {\n var idx = delta >= 0 ? next : index;\n var clampedDelta = clampDelta(sizes, idx, delta, minCellSize);\n return surround(sizes, index, next + 1, [\n clampedDelta,\n -clampedDelta\n ], zero);\n };\n var calcMiddleDeltas = function (sizes, _prev, index, next, delta, minCellSize) {\n return calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize);\n };\n var resizeTable = function (resizer, delta, isLastColumn) {\n if (isLastColumn) {\n resizer(delta);\n }\n };\n var calcRightEdgeDeltas = function (sizes, _prev, _index, delta, _minCellSize, isRelative) {\n if (isRelative) {\n return zero(sizes);\n } else {\n var diff = delta / sizes.length;\n return map$1(sizes, constant(diff));\n }\n };\n var clampTableDelta = function (sizes, index, delta, minCellSize, isLastColumn) {\n if (isLastColumn) {\n if (delta >= 0) {\n return delta;\n } else {\n var maxDelta = foldl(sizes, function (a, b) {\n return a + b - minCellSize;\n }, 0);\n return Math.max(-maxDelta, delta);\n }\n } else {\n return clampNegativeDelta(sizes, index, delta, minCellSize);\n }\n };\n var calcRedestributedWidths = function (sizes, _totalWidth, _pixelDelta, _isRelative) {\n return {\n delta: 0,\n newSizes: sizes\n };\n };\n return {\n resizeTable: resizeTable,\n clampTableDelta: clampTableDelta,\n calcLeftEdgeDeltas: calcLeftEdgeDeltas,\n calcMiddleDeltas: calcMiddleDeltas,\n calcRightEdgeDeltas: calcRightEdgeDeltas,\n calcRedestributedWidths: calcRedestributedWidths\n };\n };\n\n var only = function (element, isResizable) {\n var parent = Optional.from(element.dom.documentElement).map(SugarElement.fromDom).getOr(element);\n return {\n parent: constant(parent),\n view: constant(element),\n origin: constant(SugarPosition(0, 0)),\n isResizable: isResizable\n };\n };\n var detached = function (editable, chrome, isResizable) {\n var origin = function () {\n return absolute(chrome);\n };\n return {\n parent: constant(chrome),\n view: constant(editable),\n origin: origin,\n isResizable: isResizable\n };\n };\n var body = function (editable, chrome, isResizable) {\n return {\n parent: constant(chrome),\n view: constant(editable),\n origin: constant(SugarPosition(0, 0)),\n isResizable: isResizable\n };\n };\n var ResizeWire = {\n only: only,\n detached: detached,\n body: body\n };\n\n var adt$6 = Adt.generate([\n { invalid: ['raw'] },\n { pixels: ['value'] },\n { percent: ['value'] }\n ]);\n var validateFor = function (suffix, type, value) {\n var rawAmount = value.substring(0, value.length - suffix.length);\n var amount = parseFloat(rawAmount);\n return rawAmount === amount.toString() ? type(amount) : adt$6.invalid(value);\n };\n var from = function (value) {\n if (endsWith(value, '%')) {\n return validateFor('%', adt$6.percent, value);\n }\n if (endsWith(value, 'px')) {\n return validateFor('px', adt$6.pixels, value);\n }\n return adt$6.invalid(value);\n };\n var Size = __assign(__assign({}, adt$6), { from: from });\n\n var redistributeToPercent = function (widths, totalWidth) {\n return map$1(widths, function (w) {\n var colType = Size.from(w);\n return colType.fold(function () {\n return w;\n }, function (px) {\n var ratio = px / totalWidth * 100;\n return ratio + '%';\n }, function (pc) {\n return pc + '%';\n });\n });\n };\n var redistributeToPx = function (widths, totalWidth, newTotalWidth) {\n var scale = newTotalWidth / totalWidth;\n return map$1(widths, function (w) {\n var colType = Size.from(w);\n return colType.fold(function () {\n return w;\n }, function (px) {\n return px * scale + 'px';\n }, function (pc) {\n return pc / 100 * newTotalWidth + 'px';\n });\n });\n };\n var redistributeEmpty = function (newWidthType, columns) {\n var f = newWidthType.fold(function () {\n return constant('');\n }, function (pixels) {\n var num = pixels / columns;\n return constant(num + 'px');\n }, function () {\n var num = 100 / columns;\n return constant(num + '%');\n });\n return range$1(columns, f);\n };\n var redistributeValues = function (newWidthType, widths, totalWidth) {\n return newWidthType.fold(function () {\n return widths;\n }, function (px) {\n return redistributeToPx(widths, totalWidth, px);\n }, function (_pc) {\n return redistributeToPercent(widths, totalWidth);\n });\n };\n var redistribute$1 = function (widths, totalWidth, newWidth) {\n var newType = Size.from(newWidth);\n var floats = forall(widths, function (s) {\n return s === '0px';\n }) ? redistributeEmpty(newType, widths.length) : redistributeValues(newType, widths, totalWidth);\n return normalize(floats);\n };\n var sum = function (values, fallback) {\n if (values.length === 0) {\n return fallback;\n }\n return foldr(values, function (rest, v) {\n return Size.from(v).fold(constant(0), identity, identity) + rest;\n }, 0);\n };\n var roundDown = function (num, unit) {\n var floored = Math.floor(num);\n return {\n value: floored + unit,\n remainder: num - floored\n };\n };\n var add$3 = function (value, amount) {\n return Size.from(value).fold(constant(value), function (px) {\n return px + amount + 'px';\n }, function (pc) {\n return pc + amount + '%';\n });\n };\n var normalize = function (values) {\n if (values.length === 0) {\n return values;\n }\n var scan = foldr(values, function (rest, value) {\n var info = Size.from(value).fold(function () {\n return {\n value: value,\n remainder: 0\n };\n }, function (num) {\n return roundDown(num, 'px');\n }, function (num) {\n return {\n value: num + '%',\n remainder: 0\n };\n });\n return {\n output: [info.value].concat(rest.output),\n remainder: rest.remainder + info.remainder\n };\n }, {\n output: [],\n remainder: 0\n });\n var r = scan.output;\n return r.slice(0, r.length - 1).concat([add$3(r[r.length - 1], Math.round(scan.remainder))]);\n };\n var validate = Size.from;\n\n var redistributeToW = function (newWidths, cells, unit) {\n each$2(cells, function (cell) {\n var widths = newWidths.slice(cell.column, cell.colspan + cell.column);\n var w = sum(widths, minWidth());\n set$1(cell.element, 'width', w + unit);\n });\n };\n var redistributeToColumns = function (newWidths, columns, unit) {\n each$2(columns, function (column, index) {\n var width = sum([newWidths[index]], minWidth());\n set$1(column.element, 'width', width + unit);\n });\n };\n var redistributeToH = function (newHeights, rows, cells, unit) {\n each$2(cells, function (cell) {\n var heights = newHeights.slice(cell.row, cell.rowspan + cell.row);\n var h = sum(heights, minHeight());\n set$1(cell.element, 'height', h + unit);\n });\n each$2(rows, function (row, i) {\n set$1(row.element, 'height', newHeights[i]);\n });\n };\n var getUnit = function (newSize) {\n return validate(newSize).fold(constant('px'), constant('px'), constant('%'));\n };\n var redistribute = function (table, optWidth, optHeight) {\n var warehouse = Warehouse.fromTable(table);\n var rows = warehouse.all;\n var cells = Warehouse.justCells(warehouse);\n var columns = Warehouse.justColumns(warehouse);\n optWidth.each(function (newWidth) {\n var widthUnit = getUnit(newWidth);\n var totalWidth = get$8(table);\n var oldWidths = getRawWidths(warehouse, table);\n var nuWidths = redistribute$1(oldWidths, totalWidth, newWidth);\n if (Warehouse.hasColumns(warehouse)) {\n redistributeToColumns(nuWidths, columns, widthUnit);\n } else {\n redistributeToW(nuWidths, cells, widthUnit);\n }\n set$1(table, 'width', newWidth);\n });\n optHeight.each(function (newHeight) {\n var hUnit = getUnit(newHeight);\n var totalHeight = get$7(table);\n var oldHeights = getRawHeights(warehouse, table, height);\n var nuHeights = redistribute$1(oldHeights, totalHeight, newHeight);\n redistributeToH(nuHeights, rows, cells, hUnit);\n set$1(table, 'height', newHeight);\n });\n };\n var isPercentSizing = isPercentSizing$1;\n var isPixelSizing = isPixelSizing$1;\n var isNoneSizing = isNoneSizing$1;\n\n var getGridSize = function (table) {\n var warehouse = Warehouse.fromTable(table);\n return warehouse.grid;\n };\n\n var Event = function (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$2(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 = {};\n each$2(fields, function (name, i) {\n event[name] = args[i];\n });\n each$2(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$4 = function (typeDefs) {\n var registry = map(typeDefs, function (event) {\n return {\n bind: event.bind,\n unbind: event.unbind\n };\n });\n var trigger = map(typeDefs, function (event) {\n return event.trigger;\n });\n return {\n registry: registry,\n trigger: trigger\n };\n };\n\n var last = function (fn, rate) {\n var timer = null;\n var cancel = function () {\n if (!isNull(timer)) {\n 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 cancel();\n timer = setTimeout(function () {\n timer = null;\n fn.apply(null, args);\n }, rate);\n };\n return {\n cancel: cancel,\n throttle: throttle\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$2(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$1(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 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$2(keys$1, req);\n });\n if (!allReqd) {\n reqMessage(required, keys$1);\n }\n handleUnsupported(required, keys$1);\n var invalidKeys = filter$2(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$2(keys, function (key) {\n return !contains$2(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 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 InDrag = function () {\n var previous = Optional.none();\n var reset = function () {\n previous = Optional.none();\n };\n var update = function (mode, nu) {\n var result = previous.map(function (old) {\n return mode.compare(old, nu);\n });\n previous = Optional.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 = create$4({ move: Event(['info']) });\n return {\n onEvent: onEvent,\n reset: reset,\n events: events.registry\n };\n };\n\n var NoDrag = function () {\n var events = create$4({ move: Event(['info']) });\n return {\n onEvent: noop,\n reset: noop,\n events: events.registry\n };\n };\n\n var Movement = function () {\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 = create$4({\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(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\n var mkEvent = function (target, x, y, stop, prevent, kill, raw) {\n return {\n target: target,\n x: x,\n y: y,\n stop: stop,\n prevent: prevent,\n kill: kill,\n raw: raw\n };\n };\n var fromRawEvent$1 = function (rawEvent) {\n var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));\n var stop = function () {\n return rawEvent.stopPropagation();\n };\n var prevent = function () {\n return 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$2 = function (filter, handler) {\n return function (rawEvent) {\n if (filter(rawEvent)) {\n handler(fromRawEvent$1(rawEvent));\n }\n };\n };\n var binder = function (element, event, filter, handler, useCapture) {\n var wrapped = handle$2(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 = always;\n var bind = function (element, event, handler) {\n return bind$1(element, event, filter, handler);\n };\n var fromRawEvent = fromRawEvent$1;\n\n var read = function (element, attr) {\n var value = get$b(element, attr);\n return value === undefined || value === '' ? [] : value.split(' ');\n };\n var add$2 = function (element, attr, id) {\n var old = read(element, attr);\n var nu = old.concat([id]);\n set$2(element, attr, nu.join(' '));\n return true;\n };\n var remove$4 = function (element, attr, id) {\n var nu = filter$2(read(element, attr), function (v) {\n return v !== id;\n });\n if (nu.length > 0) {\n set$2(element, attr, nu.join(' '));\n } else {\n remove$7(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$1 = function (element, clazz) {\n return add$2(element, 'class', clazz);\n };\n var remove$3 = function (element, clazz) {\n return remove$4(element, 'class', clazz);\n };\n\n var add = 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$5(element);\n if (classList.length === 0) {\n remove$7(element, 'class');\n }\n };\n var remove$2 = 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 = function (element, clazz) {\n return supports(element) && element.dom.classList.contains(clazz);\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$1 = css('ephox-dragster');\n var resolve$1 = styles$1.resolve;\n\n var Blocker = function (options) {\n var settings = __assign({ layerClass: resolve$1('blocker') }, options);\n var div = SugarElement.fromTag('div');\n set$2(div, 'role', 'presentation');\n setAll(div, {\n position: 'fixed',\n left: '0px',\n top: '0px',\n width: '100%',\n height: '100%'\n });\n add(div, resolve$1('blocker'));\n add(div, settings.layerClass);\n var element = constant(div);\n var destroy = function () {\n remove$5(div);\n };\n return {\n element: element,\n destroy: destroy\n };\n };\n\n var compare = function (old, nu) {\n return SugarPosition(nu.left - old.left, nu.top - old.top);\n };\n var extract = function (event) {\n return Optional.some(SugarPosition(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(blocker.element(), 'mousedown', dragApi.forceDrop);\n var mup = bind(blocker.element(), 'mouseup', dragApi.drop);\n var mmove = bind(blocker.element(), 'mousemove', dragApi.move);\n var mout = bind(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$1(parent, blocker.element());\n };\n var stop = function () {\n remove$5(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,\n sink: sink,\n mutate: mutate\n });\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 setup(mutation, mode, settings);\n };\n\n var closest = function (target) {\n return closest$1(target, '[contenteditable]');\n };\n var isEditable$1 = function (element, assumeEditable) {\n if (assumeEditable === void 0) {\n assumeEditable = false;\n }\n if (!detect$3().browser.isIE() && inBody(element)) {\n return element.dom.isContentEditable;\n } else {\n return closest(element).fold(constant(assumeEditable), function (editable) {\n return getRaw(editable) === 'true';\n });\n }\n };\n var getRaw = function (element) {\n return element.dom.contentEditable;\n };\n\n var styles = css('ephox-snooker');\n var resolve = styles.resolve;\n\n var Mutation = function () {\n var events = create$4({\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 = create$4({\n drag: Event([\n 'xDelta',\n 'yDelta',\n 'target'\n ])\n });\n var target = Optional.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 = Optional.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 col = function (column, x, y, w, h) {\n var bar = SugarElement.fromTag('div');\n setAll(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$1(bar, {\n 'data-column': column,\n 'role': 'presentation'\n });\n return bar;\n };\n var row = function (r, x, y, w, h) {\n var bar = SugarElement.fromTag('div');\n setAll(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$1(bar, {\n 'data-row': r,\n 'role': 'presentation'\n });\n return bar;\n };\n\n var resizeBar = resolve('resizer-bar');\n var resizeRowBar = resolve('resizer-rows');\n var resizeColBar = resolve('resizer-cols');\n var BAR_THICKNESS = 7;\n var resizableRows = function (warehouse, isResizable) {\n return bind$2(warehouse.all, function (row, i) {\n return isResizable(row.element) ? [i] : [];\n });\n };\n var resizableColumns = function (warehouse, isResizable) {\n var resizableCols = [];\n range$1(warehouse.grid.columns, function (index) {\n var colElmOpt = Warehouse.getColumnAt(warehouse, index).map(function (col) {\n return col.element;\n });\n if (colElmOpt.forall(isResizable)) {\n resizableCols.push(index);\n }\n });\n return filter$2(resizableCols, function (colIndex) {\n var columnCells = Warehouse.filterItems(warehouse, function (cell) {\n return cell.column === colIndex;\n });\n return forall(columnCells, function (cell) {\n return isResizable(cell.element);\n });\n });\n };\n var destroy = function (wire) {\n var previous = descendants(wire.parent(), '.' + resizeBar);\n each$2(previous, remove$5);\n };\n var drawBar = function (wire, positions, create) {\n var origin = wire.origin();\n each$2(positions, function (cpOption) {\n cpOption.each(function (cp) {\n var bar = create(origin, cp);\n add(bar, resizeBar);\n append$1(wire.parent(), bar);\n });\n });\n };\n var refreshCol = function (wire, colPositions, position, tableHeight) {\n drawBar(wire, colPositions, function (origin, cp) {\n var colBar = col(cp.col, cp.x - origin.left, position.top - origin.top, BAR_THICKNESS, tableHeight);\n add(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 = row(cp.row, position.left - origin.left, cp.y - origin.top, tableWidth, BAR_THICKNESS);\n add(rowBar, resizeRowBar);\n return rowBar;\n });\n };\n var refreshGrid = function (warhouse, wire, table, rows, cols) {\n var position = absolute(table);\n var isResizable = wire.isResizable;\n var rowPositions = rows.length > 0 ? height.positions(rows, table) : [];\n var resizableRowBars = rowPositions.length > 0 ? resizableRows(warhouse, isResizable) : [];\n var resizableRowPositions = filter$2(rowPositions, function (_pos, i) {\n return exists(resizableRowBars, function (barIndex) {\n return i === barIndex;\n });\n });\n refreshRow(wire, resizableRowPositions, position, getOuter$2(table));\n var colPositions = cols.length > 0 ? width.positions(cols, table) : [];\n var resizableColBars = colPositions.length > 0 ? resizableColumns(warhouse, isResizable) : [];\n var resizableColPositions = filter$2(colPositions, function (_pos, i) {\n return exists(resizableColBars, function (barIndex) {\n return i === barIndex;\n });\n });\n refreshCol(wire, resizableColPositions, position, getOuter$1(table));\n };\n var refresh = function (wire, table) {\n destroy(wire);\n if (wire.isResizable(table)) {\n var warehouse = Warehouse.fromTable(table);\n var rows$1 = rows(warehouse);\n var cols = columns(warehouse);\n refreshGrid(warehouse, wire, table, rows$1, cols);\n }\n };\n var each = function (wire, f) {\n var bars = descendants(wire.parent(), '.' + resizeBar);\n each$2(bars, f);\n };\n var hide = function (wire) {\n each(wire, function (bar) {\n set$1(bar, 'display', 'none');\n });\n };\n var show = function (wire) {\n each(wire, function (bar) {\n set$1(bar, 'display', 'block');\n });\n };\n var isRowBar = function (element) {\n return has(element, resizeRowBar);\n };\n var isColBar = function (element) {\n return has(element, resizeColBar);\n };\n\n var resizeBarDragging = resolve('resizer-bar-dragging');\n var BarManager = function (wire) {\n var mutation = BarMutation();\n var resizing = transform$1(mutation, {});\n var hoverTable = Optional.none();\n var getResizer = function (element, type) {\n return Optional.from(get$b(element, type));\n };\n mutation.events.drag.bind(function (event) {\n getResizer(event.target, 'data-row').each(function (_dataRow) {\n var currentRow = getCssValue(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 = getCssValue(event.target, 'left');\n set$1(event.target, 'left', currentCol + event.xDelta + 'px');\n });\n });\n var getDelta = function (target, dir) {\n var newX = getCssValue(target, dir);\n var oldX = getAttrValue(target, 'data-initial-' + dir, 0);\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$7(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$7(target, 'data-initial-left');\n events.trigger.adjustWidth(table, delta, parseInt(column, 10));\n });\n refresh(wire, table);\n });\n });\n });\n var handler = function (target, dir) {\n events.trigger.startAdjust();\n mutation.assign(target);\n set$2(target, 'data-initial-' + dir, getCssValue(target, dir));\n add(target, resizeBarDragging);\n set$1(target, 'opacity', '0.2');\n resizing.go(wire.parent());\n };\n var mousedown = bind(wire.parent(), 'mousedown', function (event) {\n if (isRowBar(event.target)) {\n handler(event.target, 'top');\n }\n if (isColBar(event.target)) {\n handler(event.target, 'left');\n }\n });\n var isRoot = function (e) {\n return eq$1(e, wire.view());\n };\n var findClosestEditableTable = function (target) {\n return closest$1(target, 'table', isRoot).filter(isEditable$1);\n };\n var mouseover = bind(wire.view(), 'mouseover', function (event) {\n findClosestEditableTable(event.target).fold(function () {\n if (inBody(event.target)) {\n destroy(wire);\n }\n }, function (table) {\n hoverTable = Optional.some(table);\n refresh(wire, table);\n });\n });\n var destroy$1 = function () {\n mousedown.unbind();\n mouseover.unbind();\n resizing.destroy();\n destroy(wire);\n };\n var refresh$1 = function (tbl) {\n refresh(wire, tbl);\n };\n var events = create$4({\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$1,\n refresh: refresh$1,\n on: resizing.on,\n off: resizing.off,\n hideBars: curry(hide, wire),\n showBars: curry(show, wire),\n events: events.registry\n };\n };\n\n var create$3 = function (wire, resizing, lazySizing) {\n var hdirection = height;\n var vdirection = width;\n var manager = BarManager(wire);\n var events = create$4({\n beforeResize: Event([\n 'table',\n 'type'\n ]),\n afterResize: Event([\n 'table',\n 'type'\n ]),\n startDrag: Event([])\n });\n manager.events.adjustHeight.bind(function (event) {\n var table = event.table;\n events.trigger.beforeResize(table, 'row');\n var delta = hdirection.delta(event.delta, table);\n adjustHeight(table, delta, event.row, hdirection);\n events.trigger.afterResize(table, 'row');\n });\n manager.events.startAdjust.bind(function (_event) {\n events.trigger.startDrag();\n });\n manager.events.adjustWidth.bind(function (event) {\n var table = event.table;\n events.trigger.beforeResize(table, 'col');\n var delta = vdirection.delta(event.delta, table);\n var tableSize = lazySizing(table);\n adjustWidth(table, delta, event.column, resizing, tableSize);\n events.trigger.afterResize(table, 'col');\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$3 };\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, origin) {\n editor.fire('ObjectResizeStart', {\n target: target,\n width: width,\n height: height,\n origin: origin\n });\n };\n var fireObjectResized = function (editor, target, width, height, origin) {\n editor.fire('ObjectResized', {\n target: target,\n width: width,\n height: height,\n origin: origin\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 var fireTableModified = function (editor, table, data) {\n editor.fire('TableModified', __assign(__assign({}, data), { table: table }));\n };\n var styleModified = {\n structure: false,\n style: true\n };\n var structureModified = {\n structure: true,\n style: false\n };\n var styleAndStructureModified = {\n structure: true,\n style: true\n };\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 defaultCellBorderWidths = range$1(5, function (i) {\n var size = i + 1 + 'px';\n return {\n title: size,\n value: size\n };\n });\n var defaultCellBorderStyles = map$1([\n 'Solid',\n 'Dotted',\n 'Dashed',\n 'Double',\n 'Groove',\n 'Ridge',\n 'Inset',\n 'Outset',\n 'None',\n 'Hidden'\n ], function (type) {\n return {\n title: type,\n value: type.toLowerCase()\n };\n });\n var determineDefaultStyles = function (editor) {\n var _a;\n if (isPixelsForced(editor)) {\n var dom = editor.dom;\n var parentBlock = (_a = dom.getParent(editor.selection.getStart(), dom.isBlock)) !== null && _a !== void 0 ? _a : editor.getBody();\n var contentWidth = getInner(SugarElement.fromDom(parentBlock));\n return __assign(__assign({}, defaultStyles), { width: contentWidth + 'px' });\n } else if (isResponsiveForced(editor)) {\n return filter$1(defaultStyles, function (_value, key) {\n return key !== 'width';\n });\n } else {\n return defaultStyles;\n }\n };\n var defaultAttributes = { border: '1' };\n var defaultColumnResizingBehaviour = 'preservetable';\n var getTableSizingMode = function (editor) {\n return editor.getParam('table_sizing_mode', 'auto');\n };\n var getTableResponseWidth = function (editor) {\n return editor.getParam('table_responsive_width');\n };\n var getTableBorderWidths = function (editor) {\n return editor.getParam('table_border_widths', defaultCellBorderWidths, 'array');\n };\n var getTableBorderStyles = function (editor) {\n return editor.getParam('table_border_styles', defaultCellBorderStyles, 'array');\n };\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', determineDefaultStyles(editor), '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 getTableSizingMode(editor) === 'relative' || getTableResponseWidth(editor) === true;\n };\n var isPixelsForced = function (editor) {\n return getTableSizingMode(editor) === 'fixed' || getTableResponseWidth(editor) === false;\n };\n var isResponsiveForced = function (editor) {\n return getTableSizingMode(editor) === 'responsive';\n };\n var getToolbar = function (editor) {\n return editor.getParam('table_toolbar', defaultTableToolbar);\n };\n var useColumnGroup = function (editor) {\n return editor.getParam('table_use_colgroups', false, 'boolean');\n };\n var getTableHeaderType = function (editor) {\n var defaultValue = 'section';\n var value = editor.getParam('table_header_type', defaultValue, 'string');\n var validValues = [\n 'section',\n 'cells',\n 'sectionCells',\n 'auto'\n ];\n if (!contains$2(validValues, value)) {\n return defaultValue;\n } else {\n return value;\n }\n };\n var getColumnResizingBehaviour = function (editor) {\n var validModes = [\n 'preservetable',\n 'resizetable'\n ];\n var givenMode = editor.getParam('table_column_resizing', defaultColumnResizingBehaviour, 'string');\n return find$1(validModes, function (mode) {\n return mode === givenMode;\n }).getOr(defaultColumnResizingBehaviour);\n };\n var isPreserveTableColumnResizing = function (editor) {\n return getColumnResizingBehaviour(editor) === 'preservetable';\n };\n var isResizeTableColumnResizing = function (editor) {\n return getColumnResizingBehaviour(editor) === 'resizetable';\n };\n var getCloneElements = function (editor) {\n var cloneElements = editor.getParam('table_clone_elements');\n if (isString(cloneElements)) {\n return Optional.some(cloneElements.split(/[ ,]/));\n } else if (Array.isArray(cloneElements)) {\n return Optional.some(cloneElements);\n } else {\n return Optional.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 var getTableBackgroundColorMap = function (editor) {\n return editor.getParam('table_background_color_map', [], 'array');\n };\n var getTableBorderColorMap = function (editor) {\n return editor.getParam('table_border_color_map', [], 'array');\n };\n\n var get$4 = function (editor, table) {\n if (isPercentagesForced(editor)) {\n return TableSize.percentageSize(table);\n } else if (isPixelsForced(editor)) {\n return TableSize.pixelSize(table);\n } else {\n return TableSize.getTableSize(table);\n }\n };\n\n var cleanupLegacyAttributes = function (element) {\n remove$7(element, 'width');\n };\n var convertToPercentSize = function (table) {\n var newWidth = getPercentTableWidth(table);\n redistribute(table, Optional.some(newWidth), Optional.none());\n cleanupLegacyAttributes(table);\n };\n var convertToPixelSize = function (table) {\n var newWidth = getPixelTableWidth(table);\n redistribute(table, Optional.some(newWidth), Optional.none());\n cleanupLegacyAttributes(table);\n };\n var convertToNoneSize = function (table) {\n remove$6(table, 'width');\n var columns = columns$1(table);\n var rowElements = columns.length > 0 ? columns : cells$1(table);\n each$2(rowElements, function (cell) {\n remove$6(cell, 'width');\n cleanupLegacyAttributes(cell);\n });\n cleanupLegacyAttributes(table);\n };\n\n var enforcePercentage = convertToPercentSize;\n var enforcePixels = convertToPixelSize;\n var enforceNone = convertToNoneSize;\n var syncPixels = function (table) {\n var warehouse = Warehouse.fromTable(table);\n if (!Warehouse.hasColumns(warehouse)) {\n each$2(cells$1(table), function (cell) {\n var computedWidth = get$a(cell, 'width');\n set$1(cell, 'width', computedWidth);\n remove$7(cell, 'width');\n });\n }\n };\n\n var createContainer = function () {\n var container = SugarElement.fromTag('div');\n setAll(container, {\n position: 'static',\n height: '0',\n width: '0',\n padding: '0',\n margin: '0',\n border: '0'\n });\n append$1(body$1(), container);\n return container;\n };\n var get$3 = function (editor, isResizable) {\n return editor.inline ? ResizeWire.body(getBody(editor), createContainer(), isResizable) : ResizeWire.only(SugarElement.fromDom(editor.getDoc()), isResizable);\n };\n var remove$1 = function (editor, wire) {\n if (editor.inline) {\n remove$5(wire.parent());\n }\n };\n\n var barResizerPrefix = 'bar-';\n var isResizable = function (elm) {\n return get$b(elm, 'data-mce-resize') !== 'false';\n };\n var getResizeHandler = function (editor) {\n var selectionRng = Optional.none();\n var resize = Optional.none();\n var wire = Optional.none();\n var startW;\n var startRawW;\n var isTable = function (elm) {\n return elm.nodeName === 'TABLE';\n };\n var lazyResize = function () {\n return resize;\n };\n var lazyWire = function () {\n return wire.getOr(ResizeWire.only(SugarElement.fromDom(editor.getBody()), isResizable));\n };\n var lazySizing = function (table) {\n return get$4(editor, table);\n };\n var lazyResizingBehaviour = function () {\n return isPreserveTableColumnResizing(editor) ? preserveTable() : resizeTable();\n };\n var getNumColumns = function (table) {\n return getGridSize(table).columns;\n };\n var afterCornerResize = function (table, origin, width) {\n var isRightEdgeResize = endsWith(origin, 'e');\n if (startRawW === '') {\n enforcePercentage(table);\n }\n if (width !== startW && startRawW !== '') {\n set$1(table, 'width', startRawW);\n var resizing = lazyResizingBehaviour();\n var tableSize = lazySizing(table);\n var col = isPreserveTableColumnResizing(editor) || isRightEdgeResize ? getNumColumns(table) - 1 : 0;\n adjustWidth(table, width - startW, col, resizing, tableSize);\n } else if (isPercentage$1(startRawW)) {\n var percentW = parseFloat(startRawW.replace('%', ''));\n var targetPercentW = width * percentW / startW;\n set$1(table, 'width', targetPercentW + '%');\n }\n if (isPixel(startRawW)) {\n syncPixels(table);\n }\n };\n var destroy = function () {\n resize.each(function (sz) {\n sz.destroy();\n });\n wire.each(function (w) {\n remove$1(editor, w);\n });\n };\n editor.on('init', function () {\n var rawWire = get$3(editor, isResizable);\n wire = Optional.some(rawWire);\n if (hasObjectResizing(editor) && hasTableResizeBars(editor)) {\n var resizing = lazyResizingBehaviour();\n var sz = TableResize.create(rawWire, resizing, lazySizing);\n sz.on();\n sz.events.startDrag.bind(function (_event) {\n selectionRng = Optional.some(editor.selection.getRng());\n });\n sz.events.beforeResize.bind(function (event) {\n var rawTable = event.table.dom;\n fireObjectResizeStart(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type);\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(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type);\n editor.undoManager.add();\n });\n resize = Optional.some(sz);\n }\n });\n editor.on('ObjectResizeStart', function (e) {\n var targetElm = e.target;\n if (isTable(targetElm)) {\n var table = SugarElement.fromDom(targetElm);\n each$2(editor.dom.select('.mce-clonedresizable'), function (clone) {\n editor.dom.addClass(clone, 'mce-' + getColumnResizingBehaviour(editor) + '-columns');\n });\n if (!isPixelSizing(table) && isPixelsForced(editor)) {\n enforcePixels(table);\n } else if (!isPercentSizing(table) && isPercentagesForced(editor)) {\n enforcePercentage(table);\n }\n if (isNoneSizing(table) && startsWith(e.origin, barResizerPrefix)) {\n enforcePercentage(table);\n }\n startW = e.width;\n startRawW = isResponsiveForced(editor) ? '' : getRawWidth(editor, targetElm).getOr('');\n }\n });\n editor.on('ObjectResized', function (e) {\n var targetElm = e.target;\n if (isTable(targetElm)) {\n var table = SugarElement.fromDom(targetElm);\n var origin_1 = e.origin;\n if (startsWith(origin_1, 'corner-')) {\n afterCornerResize(table, origin_1, e.width);\n }\n removeDataStyle(table);\n fireTableModified(editor, table.dom, styleModified);\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 point = function (element, offset) {\n return {\n element: element,\n offset: offset\n };\n };\n\n var scan$1 = 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$1(universe, elem, direction).orThunk(function () {\n return Optional.some(elem);\n });\n });\n } else {\n return Optional.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$2 = function (universe, element) {\n var candidate = scan$1(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$2(universe, children[children.length - 1]) : point(candidate, toEnd(universe, candidate));\n };\n\n var freefallRtl$1 = freefallRtl$2;\n\n var universe$2 = DomUniverse();\n var freefallRtl = function (element) {\n return freefallRtl$1(universe$2, element);\n };\n\n var halve = function (main, other) {\n var colspan = getSpan(main, 'colspan');\n if (colspan === 1) {\n var width = getGenericWidth(main);\n width.each(function (w) {\n var newWidth = w.value / 2;\n setGenericWidth(main, newWidth, w.unit);\n setGenericWidth(other, newWidth, w.unit);\n });\n }\n };\n\n var isHeaderCell = isTag('th');\n var isHeaderCells = function (cells) {\n return forall(cells, function (cell) {\n return isHeaderCell(cell.element);\n });\n };\n var getRowHeaderType = function (isHeaderRow, isHeaderCells) {\n if (isHeaderRow && isHeaderCells) {\n return 'sectionCells';\n } else if (isHeaderRow) {\n return 'section';\n } else {\n return 'cells';\n }\n };\n var getRowType$1 = function (row) {\n var isHeaderRow = row.section === 'thead';\n var isHeaderCells = is(findCommonCellType(row.cells), 'th');\n if (isHeaderRow || isHeaderCells) {\n return {\n type: 'header',\n subType: getRowHeaderType(isHeaderRow, isHeaderCells)\n };\n } else if (row.section === 'tfoot') {\n return { type: 'footer' };\n } else {\n return { type: 'body' };\n }\n };\n var findCommonCellType = function (cells) {\n var headerCells = filter$2(cells, function (cell) {\n return isHeaderCell(cell.element);\n });\n if (headerCells.length === 0) {\n return Optional.some('td');\n } else if (headerCells.length === cells.length) {\n return Optional.some('th');\n } else {\n return Optional.none();\n }\n };\n var findCommonRowType = function (rows) {\n var rowTypes = map$1(rows, function (row) {\n return getRowType$1(row).type;\n });\n var hasHeader = contains$2(rowTypes, 'header');\n var hasFooter = contains$2(rowTypes, 'footer');\n if (!hasHeader && !hasFooter) {\n return Optional.some('body');\n } else {\n var hasBody = contains$2(rowTypes, 'body');\n if (hasHeader && !hasBody && !hasFooter) {\n return Optional.some('header');\n } else if (!hasHeader && !hasBody && hasFooter) {\n return Optional.some('footer');\n } else {\n return Optional.none();\n }\n }\n };\n var findTableRowHeaderType = function (warehouse) {\n return findMap(warehouse.all, function (row) {\n var rowType = getRowType$1(row);\n return rowType.type === 'header' ? Optional.from(rowType.subType) : Optional.none();\n });\n };\n\n var transformCell = function (cell, comparator, substitution) {\n return elementnew(substitution(cell.element, comparator), true, cell.isLocked);\n };\n var transformRow = function (row, section) {\n return row.section !== section ? rowcells(row.element, row.cells, section, row.isNew) : row;\n };\n var section = function () {\n return {\n transformRow: transformRow,\n transformCell: function (cell, comparator, substitution) {\n var newCell = substitution(cell.element, comparator);\n var fixedCell = name(newCell) !== 'td' ? mutate$1(newCell, 'td') : newCell;\n return elementnew(fixedCell, cell.isNew, cell.isLocked);\n }\n };\n };\n var sectionCells = function () {\n return {\n transformRow: transformRow,\n transformCell: transformCell\n };\n };\n var cells = function () {\n return {\n transformRow: function (row, section) {\n var newSection = section === 'thead' ? 'tbody' : section;\n return transformRow(row, newSection);\n },\n transformCell: transformCell\n };\n };\n var fallback = function () {\n return {\n transformRow: identity,\n transformCell: transformCell\n };\n };\n var getTableSectionType = function (table, fallback) {\n var warehouse = Warehouse.fromTable(table);\n var type = findTableRowHeaderType(warehouse).getOr(fallback);\n switch (type) {\n case 'section':\n return section();\n case 'sectionCells':\n return sectionCells();\n case 'cells':\n return cells();\n }\n };\n var TableSection = {\n getTableSectionType: getTableSectionType,\n section: section,\n sectionCells: sectionCells,\n cells: cells,\n fallback: fallback\n };\n\n var setIfNot = function (element, property, value, ignore) {\n if (value === ignore) {\n remove$7(element, property);\n } else {\n set$2(element, property, value);\n }\n };\n var insert$1 = function (table, selector, element) {\n last$2(children$1(table, selector)).fold(function () {\n return prepend(table, element);\n }, function (child) {\n return after$5(child, element);\n });\n };\n var generateSection = function (table, sectionName) {\n var section = child$1(table, sectionName).getOrThunk(function () {\n var newSection = SugarElement.fromTag(sectionName, owner(table).dom);\n if (sectionName === 'thead') {\n insert$1(table, 'caption,colgroup', newSection);\n } else if (sectionName === 'colgroup') {\n insert$1(table, 'caption', newSection);\n } else {\n append$1(table, newSection);\n }\n return newSection;\n });\n empty(section);\n return section;\n };\n var render$1 = function (table, grid) {\n var newRows = [];\n var newCells = [];\n var syncRows = function (gridSection) {\n return map$1(gridSection, function (row) {\n if (row.isNew) {\n newRows.push(row.element);\n }\n var tr = row.element;\n empty(tr);\n each$2(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$1(tr, cell.element);\n });\n return tr;\n });\n };\n var syncColGroup = function (gridSection) {\n return bind$2(gridSection, function (colGroup) {\n return map$1(colGroup.cells, function (col) {\n setIfNot(col.element, 'span', col.colspan, 1);\n return col.element;\n });\n });\n };\n var renderSection = function (gridSection, sectionName) {\n var section = generateSection(table, sectionName);\n var sync = sectionName === 'colgroup' ? syncColGroup : syncRows;\n var sectionElems = sync(gridSection);\n append(section, sectionElems);\n };\n var removeSection = function (sectionName) {\n child$1(table, sectionName).each(remove$5);\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 var columnGroupsSection = [];\n each$2(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 case 'colgroup':\n columnGroupsSection.push(row);\n break;\n }\n });\n renderOrRemoveSection(columnGroupsSection, 'colgroup');\n renderOrRemoveSection(headSection, 'thead');\n renderOrRemoveSection(bodySection, 'tbody');\n renderOrRemoveSection(footSection, 'tfoot');\n return {\n newRows: newRows,\n newCells: newCells\n };\n };\n var copy = function (grid) {\n return map$1(grid, function (row) {\n var tr = shallow(row.element);\n each$2(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$1(tr, clonedCell);\n });\n return tr;\n });\n };\n\n var getColumn = function (grid, index) {\n return map$1(grid, function (row) {\n return 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.getOr(xs.length);\n };\n var subgrid = function (grid, row, column, comparator) {\n var gridRow = getRow(grid, row);\n var isColRow = gridRow.section === 'colgroup';\n var colspan = findDiff(gridRow.cells.slice(column), comparator);\n var rowspan = isColRow ? 1 : findDiff(getColumn(grid.slice(row), column), comparator);\n return {\n colspan: colspan,\n rowspan: rowspan\n };\n };\n\n var toDetails = function (grid, comparator) {\n var seen = map$1(grid, function (row) {\n return map$1(row.cells, never);\n });\n var updateSeen = function (rowIndex, columnIndex, rowspan, colspan) {\n for (var row = rowIndex; row < rowIndex + rowspan; row++) {\n for (var column = columnIndex; column < columnIndex + colspan; column++) {\n seen[row][column] = true;\n }\n }\n };\n return map$1(grid, function (row, rowIndex) {\n var details = bind$2(row.cells, function (cell, columnIndex) {\n if (seen[rowIndex][columnIndex] === false) {\n var result = subgrid(grid, rowIndex, columnIndex, comparator);\n updateSeen(rowIndex, columnIndex, result.rowspan, result.colspan);\n return [detailnew(cell.element, result.rowspan, result.colspan, cell.isNew)];\n } else {\n return [];\n }\n });\n return rowdetailnew(row.element, details, row.section, row.isNew);\n });\n };\n var toGrid = function (warehouse, generators, isNew) {\n var grid = [];\n each$2(warehouse.colgroups, function (colgroup) {\n var colgroupCols = [];\n for (var columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) {\n var element = Warehouse.getColumnAt(warehouse, columnIndex).map(function (column) {\n return elementnew(column.element, isNew, false);\n }).getOrThunk(function () {\n return elementnew(generators.colGap(), true, false);\n });\n colgroupCols.push(element);\n }\n grid.push(rowcells(colgroup.element, colgroupCols, 'colgroup', isNew));\n });\n for (var rowIndex = 0; rowIndex < warehouse.grid.rows; rowIndex++) {\n var rowCells = [];\n for (var columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) {\n var element = Warehouse.getAt(warehouse, rowIndex, columnIndex).map(function (item) {\n return elementnew(item.element, isNew, item.isLocked);\n }).getOrThunk(function () {\n return elementnew(generators.gap(), true, false);\n });\n rowCells.push(element);\n }\n var rowDetail = warehouse.all[rowIndex];\n var row = rowcells(rowDetail.element, rowCells, rowDetail.section, isNew);\n grid.push(row);\n }\n return grid;\n };\n\n var fromWarehouse = function (warehouse, generators) {\n return toGrid(warehouse, generators, false);\n };\n var toDetailList = function (grid) {\n return toDetails(grid, eq$1);\n };\n var findInWarehouse = function (warehouse, element) {\n return findMap(warehouse.all, function (r) {\n return find$1(r.cells, function (e) {\n return eq$1(element, e.element);\n });\n });\n };\n var extractCells = function (warehouse, target, predicate) {\n var details = map$1(target.selection, function (cell$1) {\n return cell(cell$1).bind(function (lc) {\n return findInWarehouse(warehouse, lc);\n }).filter(predicate);\n });\n var cells = cat(details);\n return someIf(cells.length > 0, cells);\n };\n var run = function (operation, extract, adjustment, postAction, genWrappers) {\n return function (wire, table, target, generators, behaviours) {\n var warehouse = Warehouse.fromTable(table);\n var tableSection = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.section).getOrThunk(TableSection.fallback);\n var output = extract(warehouse, target).map(function (info) {\n var model = fromWarehouse(warehouse, generators);\n var result = operation(model, info, eq$1, genWrappers(generators), tableSection);\n var lockedColumns = getLockedColumnsFromGrid(result.grid);\n var grid = toDetailList(result.grid);\n return {\n info: info,\n grid: grid,\n cursor: result.cursor,\n lockedColumns: lockedColumns\n };\n });\n return output.bind(function (out) {\n var newElements = render$1(table, out.grid);\n var tableSizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.sizing).getOrThunk(function () {\n return TableSize.getTableSize(table);\n });\n var resizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.resize).getOrThunk(preserveTable);\n adjustment(table, out.grid, out.info, {\n sizing: tableSizing,\n resize: resizing,\n section: tableSection\n });\n postAction(table);\n refresh(wire, table);\n remove$7(table, LOCKED_COL_ATTR);\n if (out.lockedColumns.length > 0) {\n set$2(table, LOCKED_COL_ATTR, out.lockedColumns.join(','));\n }\n return Optional.some({\n cursor: out.cursor,\n newRows: newElements.newRows,\n newCells: newElements.newCells\n });\n });\n };\n };\n var onPaste = function (warehouse, target) {\n return 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 onPasteByEditor = function (warehouse, target) {\n return extractCells(warehouse, target, always).map(function (cells) {\n return {\n cells: cells,\n generators: target.generators,\n clipboard: target.clipboard\n };\n });\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 return extractCells(warehouse, target, always);\n };\n var onUnlockedCells = function (warehouse, target) {\n return extractCells(warehouse, target, function (detail) {\n return !detail.isLocked;\n });\n };\n var isUnlockedTableCell = function (warehouse, cell) {\n return findInWarehouse(warehouse, cell).exists(function (detail) {\n return !detail.isLocked;\n });\n };\n var allUnlocked = function (warehouse, cells) {\n return forall(cells, function (cell) {\n return isUnlockedTableCell(warehouse, cell);\n });\n };\n var onUnlockedMergable = function (warehouse, target) {\n return onMergable(warehouse, target).filter(function (mergeable) {\n return allUnlocked(warehouse, mergeable.cells);\n });\n };\n var onUnlockedUnmergable = function (warehouse, target) {\n return onUnmergable(warehouse, target).filter(function (cells) {\n return allUnlocked(warehouse, cells);\n });\n };\n\n var merge$2 = function (grid, bounds, comparator, substitution) {\n var rows = extractGridDetails(grid).rows;\n if (rows.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 var row = rows[i];\n var isLocked = getCell(row, j).isLocked;\n mutateCell(row, j, elementnew(substitution(), false, isLocked));\n }\n }\n return grid;\n };\n var unmerge = function (grid, target, comparator, substitution) {\n var rows = extractGridDetails(grid).rows;\n var first = true;\n for (var i = 0; i < rows.length; i++) {\n for (var j = 0; j < cellLength(rows[0]); j++) {\n var row = rows[i];\n var currentCell = getCell(row, j);\n var currentCellElm = currentCell.element;\n var isToReplace = comparator(currentCellElm, target);\n if (isToReplace === true && first === false) {\n mutateCell(row, j, elementnew(substitution(), true, currentCell.isLocked));\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 splitCols = function (grid, index, comparator, substitution) {\n if (index > 0 && index < grid[0].cells.length) {\n each$2(grid, function (row) {\n var prevCell = row.cells[index - 1];\n var current = row.cells[index];\n var isToReplace = comparator(current.element, prevCell.element);\n if (isToReplace) {\n mutateCell(row, index, elementnew(substitution(), true, current.isLocked));\n }\n });\n }\n return grid;\n };\n var splitRows = function (grid, index, comparator, substitution) {\n var rows = extractGridDetails(grid).rows;\n if (index > 0 && index < rows.length) {\n var rowPrevCells = rows[index - 1].cells;\n var cells = uniqueCells(rowPrevCells, comparator);\n each$2(cells, function (cell) {\n var replacement = Optional.none();\n for (var i = index; i < rows.length; i++) {\n var _loop_1 = function (j) {\n var row = rows[i];\n var current = getCell(row, j);\n var isToReplace = comparator(current.element, cell.element);\n if (isToReplace) {\n if (replacement.isNone()) {\n replacement = Optional.some(substitution());\n }\n replacement.each(function (sub) {\n mutateCell(row, j, elementnew(sub, true, current.isLocked));\n });\n }\n };\n for (var j = 0; j < cellLength(rows[0]); j++) {\n _loop_1(j);\n }\n }\n });\n }\n return grid;\n };\n\n var value$1 = function (o) {\n var or = function (_opt) {\n return value$1(o);\n };\n var orThunk = function (_f) {\n return value$1(o);\n };\n var map = function (f) {\n return value$1(f(o));\n };\n var mapError = function (_f) {\n return value$1(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 toOptional = function () {\n return Optional.some(o);\n };\n return {\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 toOptional: toOptional\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 = identity;\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 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 toOptional: Optional.none\n };\n };\n var fromOption = function (opt, err) {\n return opt.fold(function () {\n return error(err);\n }, value$1);\n };\n var Result = {\n value: value$1,\n error: error,\n fromOption: fromOption\n };\n\n var measure = function (startAddress, gridA, gridB) {\n if (startAddress.row >= gridA.length || startAddress.column > 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 = cellLength(gridB[0]);\n var rowRequired = gridB.length;\n return Result.value({\n rowDelta: rowRemainder.length - rowRequired,\n colDelta: colRemainder.length - colRequired\n });\n };\n var measureWidth = function (gridA, gridB) {\n var colLengthA = cellLength(gridA[0]);\n var colLengthB = cellLength(gridB[0]);\n return {\n rowDelta: 0,\n colDelta: colLengthA - colLengthB\n };\n };\n var measureHeight = function (gridA, gridB) {\n var rowLengthA = gridA.length;\n var rowLengthB = gridB.length;\n return {\n rowDelta: rowLengthA - rowLengthB,\n colDelta: 0\n };\n };\n var generateElements = function (amount, row, generators, isLocked) {\n var generator = row.section === 'colgroup' ? generators.col : generators.cell;\n return range$1(amount, function (idx) {\n return elementnew(generator(), true, isLocked(idx));\n });\n };\n var rowFill = function (grid, amount, generators, lockedColumns) {\n var exampleRow = grid[grid.length - 1];\n return grid.concat(range$1(amount, function () {\n var generator = exampleRow.section === 'colgroup' ? generators.colgroup : generators.row;\n var row = clone$1(exampleRow, generator, identity);\n var elements = generateElements(row.cells.length, row, generators, function (idx) {\n return has$1(lockedColumns, idx.toString());\n });\n return setCells(row, elements);\n }));\n };\n var colFill = function (grid, amount, generators, startIndex) {\n return map$1(grid, function (row) {\n var newChildren = generateElements(amount, row, generators, never);\n return addCells(row, startIndex, newChildren);\n });\n };\n var lockedColFill = function (grid, generators, lockedColumns) {\n return map$1(grid, function (row) {\n return foldl(lockedColumns, function (acc, colNum) {\n var newChild = generateElements(1, row, generators, always)[0];\n return addCell(acc, colNum, newChild);\n }, row);\n });\n };\n var tailor = function (gridA, delta, generators) {\n var fillCols = delta.colDelta < 0 ? colFill : identity;\n var fillRows = delta.rowDelta < 0 ? rowFill : identity;\n var lockedColumns = getLockedColumnsFromGrid(gridA);\n var gridWidth = cellLength(gridA[0]);\n var isLastColLocked = exists(lockedColumns, function (locked) {\n return locked === gridWidth - 1;\n });\n var modifiedCols = fillCols(gridA, Math.abs(delta.colDelta), generators, isLastColLocked ? gridWidth - 1 : gridWidth);\n var newLockedColumns = getLockedColumnsFromGrid(modifiedCols);\n return fillRows(modifiedCols, Math.abs(delta.rowDelta), generators, mapToObject(newLockedColumns, always));\n };\n\n var isSpanning = function (grid, row, col, comparator) {\n var candidate = getCell(grid[row], col);\n var matching = curry(comparator, candidate.element);\n var currentRow = grid[row];\n return grid.length > 1 && cellLength(currentRow) > 1 && (col > 0 && matching(getCellElement(currentRow, col - 1)) || col < currentRow.cells.length - 1 && matching(getCellElement(currentRow, col + 1)) || row > 0 && matching(getCellElement(grid[row - 1], col)) || row < grid.length - 1 && matching(getCellElement(grid[row + 1], col)));\n };\n var mergeTables = function (startAddress, gridA, gridB, generator, comparator, lockedColumns) {\n var startRow = startAddress.row;\n var startCol = startAddress.column;\n var mergeHeight = gridB.length;\n var mergeWidth = cellLength(gridB[0]);\n var endRow = startRow + mergeHeight;\n var endCol = startCol + mergeWidth + lockedColumns.length;\n var lockedColumnObj = mapToObject(lockedColumns, always);\n for (var r = startRow; r < endRow; r++) {\n var skippedCol = 0;\n for (var c = startCol; c < endCol; c++) {\n if (lockedColumnObj[c]) {\n skippedCol++;\n continue;\n }\n if (isSpanning(gridA, r, c, comparator)) {\n unmerge(gridA, getCellElement(gridA[r], c), comparator, generator.cell);\n }\n var gridBColIndex = c - startCol - skippedCol;\n var newCell = getCell(gridB[r - startRow], gridBColIndex);\n var newCellElm = newCell.element;\n var replacement = generator.replace(newCellElm);\n mutateCell(gridA[r], c, elementnew(replacement, true, newCell.isLocked));\n }\n }\n return gridA;\n };\n var getValidStartAddress = function (currentStartAddress, grid, lockedColumns) {\n var gridColLength = cellLength(grid[0]);\n var adjustedRowAddress = extractGridDetails(grid).cols.length + currentStartAddress.row;\n var possibleColAddresses = range$1(gridColLength - currentStartAddress.column, function (num) {\n return num + currentStartAddress.column;\n });\n var validColAddress = find$1(possibleColAddresses, function (num) {\n return forall(lockedColumns, function (col) {\n return col !== num;\n });\n }).getOr(gridColLength - 1);\n return {\n row: adjustedRowAddress,\n column: validColAddress\n };\n };\n var getLockedColumnsWithinBounds = function (startAddress, grid, lockedColumns) {\n return filter$2(lockedColumns, function (colNum) {\n return colNum >= startAddress.column && colNum <= cellLength(grid[0]) + startAddress.column;\n });\n };\n var merge$1 = function (startAddress, gridA, gridB, generator, comparator) {\n var lockedColumns = getLockedColumnsFromGrid(gridA);\n var validStartAddress = getValidStartAddress(startAddress, gridA, lockedColumns);\n var gridBRows = extractGridDetails(gridB).rows;\n var lockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, lockedColumns);\n var result = measure(validStartAddress, gridA, gridBRows);\n return result.map(function (diff) {\n var delta = __assign(__assign({}, diff), { colDelta: diff.colDelta - lockedColumnsWithinBounds.length });\n var fittedGrid = tailor(gridA, delta, generator);\n var newLockedColumns = getLockedColumnsFromGrid(fittedGrid);\n var newLockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, newLockedColumns);\n return mergeTables(validStartAddress, fittedGrid, gridBRows, generator, comparator, newLockedColumnsWithinBounds);\n });\n };\n var insertCols = function (index, gridA, gridB, generator, comparator) {\n splitCols(gridA, index, comparator, generator.cell);\n var delta = measureHeight(gridB, gridA);\n var fittedNewGrid = tailor(gridB, delta, generator);\n var secondDelta = measureHeight(gridA, fittedNewGrid);\n var fittedOldGrid = tailor(gridA, secondDelta, generator);\n return map$1(fittedOldGrid, function (gridRow, i) {\n return addCells(gridRow, index, fittedNewGrid[i].cells);\n });\n };\n var insertRows = function (index, gridA, gridB, generator, comparator) {\n splitRows(gridA, index, comparator, generator.cell);\n var locked = getLockedColumnsFromGrid(gridA);\n var diff = measureWidth(gridA, gridB);\n var delta = __assign(__assign({}, diff), { colDelta: diff.colDelta - locked.length });\n var fittedOldGrid = tailor(gridA, delta, generator);\n var _a = extractGridDetails(fittedOldGrid), oldCols = _a.cols, oldRows = _a.rows;\n var newLocked = getLockedColumnsFromGrid(fittedOldGrid);\n var secondDiff = measureWidth(gridB, gridA);\n var secondDelta = __assign(__assign({}, secondDiff), { colDelta: secondDiff.colDelta + newLocked.length });\n var fittedGridB = lockedColFill(gridB, generator, newLocked);\n var fittedNewGrid = tailor(fittedGridB, secondDelta, generator);\n return oldCols.concat(oldRows.slice(0, index)).concat(fittedNewGrid).concat(oldRows.slice(index, oldRows.length));\n };\n\n var cloneRow = function (row, cloneCell, comparator, substitution) {\n return clone$1(row, function (elem) {\n return substitution(elem, comparator);\n }, cloneCell);\n };\n var insertRowAt = function (grid, index, example, comparator, substitution) {\n var _a = extractGridDetails(grid), rows = _a.rows, cols = _a.cols;\n var before = rows.slice(0, index);\n var after = rows.slice(index);\n var newRow = cloneRow(rows[example], function (ex, c) {\n var withinSpan = index > 0 && index < rows.length && comparator(getCellElement(rows[index - 1], c), getCellElement(rows[index], c));\n var ret = withinSpan ? getCell(rows[index], c) : elementnew(substitution(ex.element, comparator), true, ex.isLocked);\n return ret;\n }, comparator, substitution);\n return cols.concat(before).concat([newRow]).concat(after);\n };\n var getElementFor = function (row, column, section, withinSpan, example, comparator, substitution) {\n if (section === 'colgroup' || !withinSpan) {\n var cell = getCell(row, example);\n return elementnew(substitution(cell.element, comparator), true, false);\n } else {\n return getCell(row, column);\n }\n };\n var insertColumnAt = function (grid, index, example, comparator, substitution) {\n return map$1(grid, function (row) {\n var withinSpan = index > 0 && index < cellLength(row) && comparator(getCellElement(row, index - 1), getCellElement(row, index));\n var sub = getElementFor(row, index, row.section, withinSpan, example, comparator, substitution);\n return addCell(row, index, sub);\n });\n };\n var deleteColumnsAt = function (grid, columns) {\n return bind$2(grid, function (row) {\n var existingCells = row.cells;\n var cells = foldr(columns, function (acc, column) {\n return column >= 0 && column < acc.length ? acc.slice(0, column).concat(acc.slice(column + 1)) : acc;\n }, existingCells);\n return cells.length > 0 ? [rowcells(row.element, cells, row.section, row.isNew)] : [];\n });\n };\n var deleteRowsAt = function (grid, start, finish) {\n var _a = extractGridDetails(grid), rows = _a.rows, cols = _a.cols;\n return cols.concat(rows.slice(0, start)).concat(rows.slice(finish + 1));\n };\n\n var notInStartRow = function (grid, rowIndex, colIndex, comparator) {\n return getCellElement(grid[rowIndex], colIndex) !== undefined && (rowIndex > 0 && comparator(getCellElement(grid[rowIndex - 1], colIndex), getCellElement(grid[rowIndex], colIndex)));\n };\n var notInStartColumn = function (row, index, comparator) {\n return index > 0 && comparator(getCellElement(row, index - 1), getCellElement(row, index));\n };\n var isDuplicatedCell = function (grid, rowIndex, colIndex, comparator) {\n return notInStartRow(grid, rowIndex, colIndex, comparator) || notInStartColumn(grid[rowIndex], colIndex, comparator);\n };\n var rowReplacerPredicate = function (targetRow, columnHeaders) {\n var entireTableIsHeader = forall(columnHeaders, identity) && isHeaderCells(targetRow.cells);\n return entireTableIsHeader ? always : function (cell, _rowIndex, colIndex) {\n var type = name(cell.element);\n return !(type === 'th' && columnHeaders[colIndex]);\n };\n };\n var columnReplacePredicate = function (targetColumn, rowHeaders) {\n var entireTableIsHeader = forall(rowHeaders, identity) && isHeaderCells(targetColumn);\n return entireTableIsHeader ? always : function (cell, rowIndex, _colIndex) {\n var type = name(cell.element);\n return !(type === 'th' && rowHeaders[rowIndex]);\n };\n };\n var determineScope = function (applyScope, element, newScope, isInHeader) {\n var hasSpan = function (scope) {\n return scope === 'row' ? hasRowspan(element) : hasColspan(element);\n };\n var getScope = function (scope) {\n return hasSpan(scope) ? scope + 'group' : scope;\n };\n if (applyScope) {\n return isHeaderCell(element) ? getScope(newScope) : null;\n } else if (isInHeader && isHeaderCell(element)) {\n var oppositeScope = newScope === 'row' ? 'col' : 'row';\n return getScope(oppositeScope);\n } else {\n return null;\n }\n };\n var rowScopeGenerator = function (applyScope, columnHeaders) {\n return function (cell, rowIndex, columnIndex) {\n return Optional.some(determineScope(applyScope, cell.element, 'col', columnHeaders[columnIndex]));\n };\n };\n var columnScopeGenerator = function (applyScope, rowHeaders) {\n return function (cell, rowIndex) {\n return Optional.some(determineScope(applyScope, cell.element, 'row', rowHeaders[rowIndex]));\n };\n };\n var replace = function (cell, comparator, substitute) {\n return elementnew(substitute(cell.element, comparator), true, cell.isLocked);\n };\n var replaceIn = function (grid, targets, comparator, substitute, replacer, genScope, shouldReplace) {\n var isTarget = function (cell) {\n return exists(targets, function (target) {\n return comparator(cell.element, target.element);\n });\n };\n return map$1(grid, function (row, rowIndex) {\n return mapCells(row, function (cell, colIndex) {\n if (isTarget(cell)) {\n var newCell_1 = shouldReplace(cell, rowIndex, colIndex) ? replacer(cell, comparator, substitute) : cell;\n genScope(newCell_1, rowIndex, colIndex).each(function (scope) {\n setOptions(newCell_1.element, { scope: Optional.from(scope) });\n });\n return newCell_1;\n } else {\n return cell;\n }\n });\n });\n };\n var getColumnCells = function (rows, columnIndex, comparator) {\n return bind$2(rows, function (row, i) {\n return isDuplicatedCell(rows, i, columnIndex, comparator) ? [] : [getCell(row, columnIndex)];\n });\n };\n var getRowCells = function (rows, rowIndex, comparator) {\n var targetRow = rows[rowIndex];\n return bind$2(targetRow.cells, function (item, i) {\n return isDuplicatedCell(rows, rowIndex, i, comparator) ? [] : [item];\n });\n };\n var replaceColumns = function (grid, indexes, applyScope, comparator, substitution) {\n var rows = extractGridDetails(grid).rows;\n var targets = bind$2(indexes, function (index) {\n return getColumnCells(rows, index, comparator);\n });\n var rowHeaders = map$1(grid, function (row) {\n return isHeaderCells(row.cells);\n });\n var shouldReplaceCell = columnReplacePredicate(targets, rowHeaders);\n var scopeGenerator = columnScopeGenerator(applyScope, rowHeaders);\n return replaceIn(grid, targets, comparator, substitution, replace, scopeGenerator, shouldReplaceCell);\n };\n var replaceRows = function (grid, indexes, section, applyScope, comparator, substitution, tableSection) {\n var _a = extractGridDetails(grid), cols = _a.cols, rows = _a.rows;\n var targetRow = rows[indexes[0]];\n var targets = bind$2(indexes, function (index) {\n return getRowCells(rows, index, comparator);\n });\n var columnHeaders = map$1(targetRow.cells, function (_cell, index) {\n return isHeaderCells(getColumnCells(rows, index, comparator));\n });\n var newRows = __spreadArray([], rows, true);\n each$2(indexes, function (index) {\n newRows[index] = tableSection.transformRow(rows[index], section);\n });\n var newGrid = cols.concat(newRows);\n var shouldReplaceCell = rowReplacerPredicate(targetRow, columnHeaders);\n var scopeGenerator = rowScopeGenerator(applyScope, columnHeaders);\n return replaceIn(newGrid, targets, comparator, substitution, tableSection.transformCell, scopeGenerator, shouldReplaceCell);\n };\n var replaceCells = function (grid, details, comparator, substitution) {\n var rows = extractGridDetails(grid).rows;\n var targetCells = map$1(details, function (detail) {\n return getCell(rows[detail.row], detail.column);\n });\n return replaceIn(grid, targetCells, comparator, substitution, replace, Optional.none, always);\n };\n\n var uniqueColumns = function (details) {\n var uniqueCheck = function (rest, detail) {\n var columnExists = exists(rest, function (currentDetail) {\n return currentDetail.column === detail.column;\n });\n return columnExists ? rest : rest.concat([detail]);\n };\n return foldl(details, uniqueCheck, []).sort(function (detailA, detailB) {\n return detailA.column - detailB.column;\n });\n };\n\n var isCol = isTag('col');\n var isColgroup = isTag('colgroup');\n var isRow$1 = function (element) {\n return name(element) === 'tr' || isColgroup(element);\n };\n var elementToData = function (element) {\n var colspan = getAttrValue(element, 'colspan', 1);\n var rowspan = getAttrValue(element, 'rowspan', 1);\n return {\n element: element,\n colspan: colspan,\n rowspan: rowspan\n };\n };\n var modification = function (generators, toData) {\n if (toData === void 0) {\n toData = elementToData;\n }\n var nuCell = function (data) {\n return isCol(data.element) ? generators.col(data) : generators.cell(data);\n };\n var nuRow = function (data) {\n return isColgroup(data.element) ? generators.colgroup(data) : generators.row(data);\n };\n var add = function (element) {\n if (isRow$1(element)) {\n return nuRow({ element: element });\n } else {\n var replacement = nuCell(toData(element));\n recent = Optional.some({\n item: element,\n replacement: replacement\n });\n return replacement;\n }\n };\n var recent = Optional.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 { getOrInit: getOrInit };\n };\n var transform = function (tag) {\n return function (generators) {\n var list = [];\n var find = function (element, comparator) {\n return find$1(list, function (x) {\n return comparator(x.item, element);\n });\n };\n var makeNew = function (element) {\n var attrs = tag === 'td' ? { scope: null } : {};\n var cell = generators.replace(element, tag, attrs);\n list.push({\n item: element,\n sub: cell\n });\n return cell;\n };\n var replaceOrInit = function (element, comparator) {\n if (isRow$1(element) || isCol(element)) {\n return element;\n } else {\n return find(element, comparator).fold(function () {\n return makeNew(element);\n }, function (p) {\n return comparator(element, p.item) ? p.sub : makeNew(element);\n });\n }\n };\n return { replaceOrInit: replaceOrInit };\n };\n };\n var getScopeAttribute = function (cell) {\n return getOpt(cell, 'scope').map(function (attribute) {\n return attribute.substr(0, 3);\n });\n };\n var merging = function (generators) {\n var unmerge = function (cell) {\n var scope = getScopeAttribute(cell);\n scope.each(function (attribute) {\n return set$2(cell, 'scope', attribute);\n });\n return function () {\n var raw = generators.cell({\n element: cell,\n colspan: 1,\n rowspan: 1\n });\n remove$6(raw, 'width');\n remove$6(cell, 'width');\n scope.each(function (attribute) {\n return set$2(raw, 'scope', attribute);\n });\n return raw;\n };\n };\n var merge = function (cells) {\n var getScopeProperty = function () {\n var stringAttributes = cat(map$1(cells, getScopeAttribute));\n if (stringAttributes.length === 0) {\n return Optional.none();\n } else {\n var baseScope_1 = stringAttributes[0];\n var scopes_1 = [\n 'row',\n 'col'\n ];\n var isMixed = exists(stringAttributes, function (attribute) {\n return attribute !== baseScope_1 && contains$2(scopes_1, attribute);\n });\n return isMixed ? Optional.none() : Optional.from(baseScope_1);\n }\n };\n remove$6(cells[0], 'width');\n getScopeProperty().fold(function () {\n return remove$7(cells[0], 'scope');\n }, function (attribute) {\n return set$2(cells[0], 'scope', attribute + 'group');\n });\n return constant(cells[0]);\n };\n return {\n unmerge: unmerge,\n merge: merge\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$1 = function (universe, item) {\n var tagName = universe.property().name(item);\n return contains$2([\n 'ol',\n 'ul'\n ], tagName);\n };\n var isBlock$1 = function (universe, item) {\n var tagName = universe.property().name(item);\n return contains$2(blockList, tagName);\n };\n var isEmptyTag$1 = function (universe, item) {\n return contains$2([\n 'br',\n 'img',\n 'hr',\n 'input'\n ], universe.property().name(item));\n };\n\n var universe$1 = DomUniverse();\n var isBlock = function (element) {\n return isBlock$1(universe$1, element);\n };\n var isList = function (element) {\n return isList$1(universe$1, element);\n };\n var isEmptyTag = function (element) {\n return isEmptyTag$1(universe$1, element);\n };\n\n var merge = 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$9(c).trim().length === 0;\n });\n };\n var isListItem = function (el) {\n return name(el) === 'li' || ancestor$2(el, isList).isSome();\n };\n var siblingIsBlock = function (el) {\n return nextSibling(el).map(function (rightSibling) {\n if (isBlock(rightSibling)) {\n return true;\n }\n if (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) || isBlock(parent) && !eq$1(cell, parent) ? [] : [SugarElement.fromTag('br')];\n });\n }).getOr([]);\n };\n var markContent = function () {\n var content = bind$2(cells, function (cell) {\n var children = children$3(cell);\n return advancedBr(children) ? [] : children.concat(markCell(cell));\n });\n return content.length === 0 ? [SugarElement.fromTag('br')] : content;\n };\n var contents = markContent();\n empty(cells[0]);\n append(cells[0], contents);\n };\n\n var isEditable = function (elem) {\n return isEditable$1(elem, true);\n };\n var prune = function (table) {\n var cells = cells$1(table);\n if (cells.length === 0) {\n remove$5(table);\n }\n };\n var outcome = function (grid, cursor) {\n return {\n grid: grid,\n cursor: cursor\n };\n };\n var findEditableCursorPosition = function (rows) {\n return findMap(rows, function (row) {\n return findMap(row.cells, function (cell) {\n var elem = cell.element;\n return someIf(isEditable(elem), elem);\n });\n });\n };\n var elementFromGrid = function (grid, row, column) {\n var _a, _b;\n var rows = extractGridDetails(grid).rows;\n return Optional.from((_b = (_a = rows[row]) === null || _a === void 0 ? void 0 : _a.cells[column]) === null || _b === void 0 ? void 0 : _b.element).filter(isEditable).orThunk(function () {\n return findEditableCursorPosition(rows);\n });\n };\n var bundle = function (grid, row, column) {\n var cursorElement = elementFromGrid(grid, row, column);\n return outcome(grid, cursorElement);\n };\n var uniqueRows = function (details) {\n var rowCompilation = function (rest, detail) {\n var rowExists = exists(rest, function (currentDetail) {\n return currentDetail.row === detail.row;\n });\n return rowExists ? rest : rest.concat([detail]);\n };\n return foldl(details, rowCompilation, []).sort(function (detailA, detailB) {\n return detailA.row - detailB.row;\n });\n };\n var opInsertRowsBefore = function (grid, details, comparator, genWrappers) {\n var targetIndex = details[0].row;\n var rows = uniqueRows(details);\n var newGrid = foldr(rows, function (acc, row) {\n var newG = insertRowAt(acc.grid, targetIndex, row.row + acc.delta, comparator, genWrappers.getOrInit);\n return {\n grid: newG,\n delta: acc.delta + 1\n };\n }, {\n grid: grid,\n delta: 0\n }).grid;\n return bundle(newGrid, targetIndex, details[0].column);\n };\n var opInsertRowsAfter = function (grid, details, comparator, genWrappers) {\n var rows = uniqueRows(details);\n var target = rows[rows.length - 1];\n var targetIndex = target.row + target.rowspan;\n var newGrid = foldr(rows, function (newG, row) {\n return insertRowAt(newG, targetIndex, row.row, comparator, genWrappers.getOrInit);\n }, grid);\n return bundle(newGrid, targetIndex, details[0].column);\n };\n var opInsertColumnsBefore = function (grid, extractDetail, comparator, genWrappers) {\n var details = extractDetail.details;\n var columns = uniqueColumns(details);\n var targetIndex = columns[0].column;\n var newGrid = foldr(columns, function (acc, col) {\n var newG = insertColumnAt(acc.grid, targetIndex, col.column + acc.delta, comparator, genWrappers.getOrInit);\n return {\n grid: newG,\n delta: acc.delta + 1\n };\n }, {\n grid: grid,\n delta: 0\n }).grid;\n return bundle(newGrid, details[0].row, targetIndex);\n };\n var opInsertColumnsAfter = function (grid, extractDetail, comparator, genWrappers) {\n var details = extractDetail.details;\n var target = details[details.length - 1];\n var targetIndex = target.column + target.colspan;\n var columns = uniqueColumns(details);\n var newGrid = foldr(columns, function (newG, col) {\n return insertColumnAt(newG, targetIndex, col.column, comparator, genWrappers.getOrInit);\n }, grid);\n return bundle(newGrid, details[0].row, targetIndex);\n };\n var opMakeColumnsHeader = function (initialGrid, details, comparator, genWrappers) {\n var columns = uniqueColumns(details);\n var columnIndexes = map$1(columns, function (detail) {\n return detail.column;\n });\n var newGrid = replaceColumns(initialGrid, columnIndexes, true, comparator, genWrappers.replaceOrInit);\n return bundle(newGrid, details[0].row, details[0].column);\n };\n var opMakeCellsHeader = function (initialGrid, details, comparator, genWrappers) {\n var newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit);\n return bundle(newGrid, details[0].row, details[0].column);\n };\n var opUnmakeColumnsHeader = function (initialGrid, details, comparator, genWrappers) {\n var columns = uniqueColumns(details);\n var columnIndexes = map$1(columns, function (detail) {\n return detail.column;\n });\n var newGrid = replaceColumns(initialGrid, columnIndexes, false, comparator, genWrappers.replaceOrInit);\n return bundle(newGrid, details[0].row, details[0].column);\n };\n var opUnmakeCellsHeader = function (initialGrid, details, comparator, genWrappers) {\n var newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit);\n return bundle(newGrid, details[0].row, details[0].column);\n };\n var makeRowsSection = function (section, applyScope) {\n return function (initialGrid, details, comparator, genWrappers, tableSection) {\n var rows = uniqueRows(details);\n var rowIndexes = map$1(rows, function (detail) {\n return detail.row;\n });\n var newGrid = replaceRows(initialGrid, rowIndexes, section, applyScope, comparator, genWrappers.replaceOrInit, tableSection);\n return bundle(newGrid, details[0].row, details[0].column);\n };\n };\n var opMakeRowsHeader = makeRowsSection('thead', true);\n var opMakeRowsBody = makeRowsSection('tbody', false);\n var opMakeRowsFooter = makeRowsSection('tfoot', false);\n var opEraseColumns = function (grid, extractDetail, _comparator, _genWrappers) {\n var columns = uniqueColumns(extractDetail.details);\n var newGrid = deleteColumnsAt(grid, map$1(columns, function (column) {\n return column.column;\n }));\n var maxColIndex = newGrid.length > 0 ? newGrid[0].cells.length - 1 : 0;\n return bundle(newGrid, columns[0].row, Math.min(columns[0].column, maxColIndex));\n };\n var opEraseRows = function (grid, details, _comparator, _genWrappers) {\n var rows = uniqueRows(details);\n var newGrid = deleteRowsAt(grid, rows[0].row, rows[rows.length - 1].row);\n var maxRowIndex = newGrid.length > 0 ? newGrid.length - 1 : 0;\n return bundle(newGrid, Math.min(details[0].row, maxRowIndex), details[0].column);\n };\n var opMergeCells = function (grid, mergable, comparator, genWrappers) {\n var cells = mergable.cells;\n merge(cells);\n var newGrid = merge$2(grid, mergable.bounds, comparator, genWrappers.merge(cells));\n return outcome(newGrid, Optional.from(cells[0]));\n };\n var opUnmergeCells = function (grid, unmergable, comparator, genWrappers) {\n var unmerge$1 = function (b, cell) {\n return unmerge(b, cell, comparator, genWrappers.unmerge(cell));\n };\n var newGrid = foldr(unmergable, unmerge$1, grid);\n return outcome(newGrid, Optional.from(unmergable[0]));\n };\n var opPasteCells = function (grid, pasteDetails, comparator, _genWrappers) {\n var gridify = function (table, generators) {\n var wh = Warehouse.fromTable(table);\n return toGrid(wh, generators, true);\n };\n var gridB = gridify(pasteDetails.clipboard, pasteDetails.generators);\n var startAddress = address(pasteDetails.row, pasteDetails.column);\n var mergedGrid = merge$1(startAddress, grid, gridB, pasteDetails.generators, comparator);\n return mergedGrid.fold(function () {\n return outcome(grid, Optional.some(pasteDetails.element));\n }, function (newGrid) {\n return bundle(newGrid, pasteDetails.row, pasteDetails.column);\n });\n };\n var gridifyRows = function (rows, generators, context) {\n var pasteDetails = fromPastedRows(rows, context.section);\n var wh = Warehouse.generate(pasteDetails);\n return toGrid(wh, generators, true);\n };\n var opPasteColsBefore = function (grid, pasteDetails, comparator, _genWrappers) {\n var rows = extractGridDetails(grid).rows;\n var index = pasteDetails.cells[0].column;\n var context = rows[pasteDetails.cells[0].row];\n var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);\n var mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator);\n return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);\n };\n var opPasteColsAfter = function (grid, pasteDetails, comparator, _genWrappers) {\n var rows = extractGridDetails(grid).rows;\n var index = pasteDetails.cells[pasteDetails.cells.length - 1].column + pasteDetails.cells[pasteDetails.cells.length - 1].colspan;\n var context = rows[pasteDetails.cells[0].row];\n var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);\n var mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator);\n return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);\n };\n var opPasteRowsBefore = function (grid, pasteDetails, comparator, _genWrappers) {\n var rows = extractGridDetails(grid).rows;\n var index = pasteDetails.cells[0].row;\n var context = rows[index];\n var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);\n var mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator);\n return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);\n };\n var opPasteRowsAfter = function (grid, pasteDetails, comparator, _genWrappers) {\n var rows = extractGridDetails(grid).rows;\n var index = pasteDetails.cells[pasteDetails.cells.length - 1].row + pasteDetails.cells[pasteDetails.cells.length - 1].rowspan;\n var context = rows[pasteDetails.cells[0].row];\n var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);\n var mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator);\n return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);\n };\n var opGetColumnsType = function (table, target) {\n var house = Warehouse.fromTable(table);\n var details = onCells(house, target);\n return details.bind(function (selectedCells) {\n var lastSelectedCell = selectedCells[selectedCells.length - 1];\n var minColRange = selectedCells[0].column;\n var maxColRange = lastSelectedCell.column + lastSelectedCell.colspan;\n var selectedColumnCells = flatten$1(map$1(house.all, function (row) {\n return filter$2(row.cells, function (cell) {\n return cell.column >= minColRange && cell.column < maxColRange;\n });\n }));\n return findCommonCellType(selectedColumnCells);\n }).getOr('');\n };\n var opGetCellsType = function (table, target) {\n var house = Warehouse.fromTable(table);\n var details = onCells(house, target);\n return details.bind(findCommonCellType).getOr('');\n };\n var opGetRowsType = function (table, target) {\n var house = Warehouse.fromTable(table);\n var details = onCells(house, target);\n return details.bind(function (selectedCells) {\n var lastSelectedCell = selectedCells[selectedCells.length - 1];\n var minRowRange = selectedCells[0].row;\n var maxRowRange = lastSelectedCell.row + lastSelectedCell.rowspan;\n var selectedRows = house.all.slice(minRowRange, maxRowRange);\n return findCommonRowType(selectedRows);\n }).getOr('');\n };\n var resize = function (table, list, details, behaviours) {\n return adjustWidthTo(table, list, details, behaviours.sizing);\n };\n var adjustAndRedistributeWidths = function (table, list, details, behaviours) {\n return adjustAndRedistributeWidths$1(table, list, details, behaviours.sizing, behaviours.resize);\n };\n var firstColumnIsLocked = function (_warehouse, details) {\n return exists(details, function (detail) {\n return detail.column === 0 && detail.isLocked;\n });\n };\n var lastColumnIsLocked = function (warehouse, details) {\n return exists(details, function (detail) {\n return detail.column + detail.colspan >= warehouse.grid.columns && detail.isLocked;\n });\n };\n var getColumnsWidth = function (warehouse, details) {\n var columns$1 = columns(warehouse);\n var uniqueCols = uniqueColumns(details);\n return foldl(uniqueCols, function (acc, detail) {\n var column = columns$1[detail.column];\n var colWidth = column.map(getOuter$2).getOr(0);\n return acc + colWidth;\n }, 0);\n };\n var insertColumnsExtractor = function (before) {\n return function (warehouse, target) {\n return onCells(warehouse, target).filter(function (details) {\n var checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked;\n return !checkLocked(warehouse, details);\n }).map(function (details) {\n return {\n details: details,\n pixelDelta: getColumnsWidth(warehouse, details)\n };\n });\n };\n };\n var eraseColumnsExtractor = function (warehouse, target) {\n return onUnlockedCells(warehouse, target).map(function (details) {\n return {\n details: details,\n pixelDelta: -getColumnsWidth(warehouse, details)\n };\n });\n };\n var pasteColumnsExtractor = function (before) {\n return function (warehouse, target) {\n return onPasteByEditor(warehouse, target).filter(function (details) {\n var checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked;\n return !checkLocked(warehouse, details.cells);\n });\n };\n };\n var headerCellGenerator = Generators.transform('th');\n var bodyCellGenerator = Generators.transform('td');\n var insertRowsBefore = run(opInsertRowsBefore, onCells, noop, noop, Generators.modification);\n var insertRowsAfter = run(opInsertRowsAfter, onCells, noop, noop, Generators.modification);\n var insertColumnsBefore = run(opInsertColumnsBefore, insertColumnsExtractor(true), adjustAndRedistributeWidths, noop, Generators.modification);\n var insertColumnsAfter = run(opInsertColumnsAfter, insertColumnsExtractor(false), adjustAndRedistributeWidths, noop, Generators.modification);\n var eraseColumns = run(opEraseColumns, eraseColumnsExtractor, adjustAndRedistributeWidths, prune, Generators.modification);\n var eraseRows = run(opEraseRows, onCells, noop, prune, Generators.modification);\n var makeColumnsHeader = run(opMakeColumnsHeader, onUnlockedCells, noop, noop, headerCellGenerator);\n var unmakeColumnsHeader = run(opUnmakeColumnsHeader, onUnlockedCells, noop, noop, bodyCellGenerator);\n var makeRowsHeader = run(opMakeRowsHeader, onUnlockedCells, noop, noop, headerCellGenerator);\n var makeRowsBody = run(opMakeRowsBody, onUnlockedCells, noop, noop, bodyCellGenerator);\n var makeRowsFooter = run(opMakeRowsFooter, onUnlockedCells, noop, noop, bodyCellGenerator);\n var makeCellsHeader = run(opMakeCellsHeader, onUnlockedCells, noop, noop, headerCellGenerator);\n var unmakeCellsHeader = run(opUnmakeCellsHeader, onUnlockedCells, noop, noop, bodyCellGenerator);\n var mergeCells = run(opMergeCells, onUnlockedMergable, resize, noop, Generators.merging);\n var unmergeCells = run(opUnmergeCells, onUnlockedUnmergable, resize, noop, Generators.merging);\n var pasteCells = run(opPasteCells, onPaste, resize, noop, Generators.modification);\n var pasteColsBefore = run(opPasteColsBefore, pasteColumnsExtractor(true), noop, noop, Generators.modification);\n var pasteColsAfter = run(opPasteColsAfter, pasteColumnsExtractor(false), noop, noop, Generators.modification);\n var pasteRowsBefore = run(opPasteRowsBefore, onPasteByEditor, noop, noop, Generators.modification);\n var pasteRowsAfter = run(opPasteRowsAfter, onPasteByEditor, noop, noop, Generators.modification);\n var getColumnsType = opGetColumnsType;\n var getCellsType = opGetCellsType;\n var getRowsType = opGetRowsType;\n\n var TableActions = function (editor, cellSelection, lazyWire) {\n var isTableBody = function (editor) {\n return name(getBody(editor)) === 'table';\n };\n var lastRowGuard = function (table) {\n return isTableBody(editor) === false || getGridSize(table).rows > 1;\n };\n var lastColumnGuard = function (table) {\n return isTableBody(editor) === false || getGridSize(table).columns > 1;\n };\n var cloneFormats = getCloneElements(editor);\n var colMutationOp = isResizeTableColumnResizing(editor) ? noop : halve;\n var getTableSectionType = function (table) {\n switch (getTableHeaderType(editor)) {\n case 'section':\n return TableSection.section();\n case 'sectionCells':\n return TableSection.sectionCells();\n case 'cells':\n return TableSection.cells();\n default:\n return TableSection.getTableSectionType(table, 'section');\n }\n };\n var setSelectionFromAction = function (table, result) {\n return result.cursor.fold(function () {\n var cells = cells$1(table);\n return head(cells).filter(inBody).map(function (firstCell) {\n cellSelection.clear(table);\n var rng = editor.dom.createRng();\n rng.selectNode(firstCell.dom);\n editor.selection.setRng(rng);\n set$2(firstCell, 'data-mce-selected', '1');\n return rng;\n });\n }, function (cell) {\n var des = freefallRtl(cell);\n var rng = editor.dom.createRng();\n rng.setStart(des.element.dom, des.offset);\n rng.setEnd(des.element.dom, des.offset);\n editor.selection.setRng(rng);\n cellSelection.clear(table);\n return Optional.some(rng);\n });\n };\n var execute = function (operation, guard, mutate, lazyWire, effect) {\n return function (table, target, noEvents) {\n if (noEvents === void 0) {\n noEvents = false;\n }\n removeDataStyle(table);\n var wire = lazyWire();\n var doc = SugarElement.fromDom(editor.getDoc());\n var generators = cellOperations(mutate, doc, cloneFormats);\n var behaviours = {\n sizing: get$4(editor, table),\n resize: isResizeTableColumnResizing(editor) ? resizeTable() : preserveTable(),\n section: getTableSectionType(table)\n };\n return guard(table) ? operation(wire, table, target, generators, behaviours).bind(function (result) {\n each$2(result.newRows, function (row) {\n fireNewRow(editor, row.dom);\n });\n each$2(result.newCells, function (cell) {\n fireNewCell(editor, cell.dom);\n });\n var range = setSelectionFromAction(table, result);\n if (inBody(table)) {\n removeDataStyle(table);\n if (!noEvents) {\n fireTableModified(editor, table.dom, effect);\n }\n }\n return range.map(function (rng) {\n return {\n rng: rng,\n effect: effect\n };\n });\n }) : Optional.none();\n };\n };\n var deleteRow = execute(eraseRows, lastRowGuard, noop, lazyWire, structureModified);\n var deleteColumn = execute(eraseColumns, lastColumnGuard, noop, lazyWire, structureModified);\n var insertRowsBefore$1 = execute(insertRowsBefore, always, noop, lazyWire, structureModified);\n var insertRowsAfter$1 = execute(insertRowsAfter, always, noop, lazyWire, structureModified);\n var insertColumnsBefore$1 = execute(insertColumnsBefore, always, colMutationOp, lazyWire, structureModified);\n var insertColumnsAfter$1 = execute(insertColumnsAfter, always, colMutationOp, lazyWire, structureModified);\n var mergeCells$1 = execute(mergeCells, always, noop, lazyWire, structureModified);\n var unmergeCells$1 = execute(unmergeCells, always, noop, lazyWire, structureModified);\n var pasteColsBefore$1 = execute(pasteColsBefore, always, noop, lazyWire, structureModified);\n var pasteColsAfter$1 = execute(pasteColsAfter, always, noop, lazyWire, structureModified);\n var pasteRowsBefore$1 = execute(pasteRowsBefore, always, noop, lazyWire, structureModified);\n var pasteRowsAfter$1 = execute(pasteRowsAfter, always, noop, lazyWire, structureModified);\n var pasteCells$1 = execute(pasteCells, always, noop, lazyWire, styleAndStructureModified);\n var makeCellsHeader$1 = execute(makeCellsHeader, always, noop, lazyWire, structureModified);\n var unmakeCellsHeader$1 = execute(unmakeCellsHeader, always, noop, lazyWire, structureModified);\n var makeColumnsHeader$1 = execute(makeColumnsHeader, always, noop, lazyWire, structureModified);\n var unmakeColumnsHeader$1 = execute(unmakeColumnsHeader, always, noop, lazyWire, structureModified);\n var makeRowsHeader$1 = execute(makeRowsHeader, always, noop, lazyWire, structureModified);\n var makeRowsBody$1 = execute(makeRowsBody, always, noop, lazyWire, structureModified);\n var makeRowsFooter$1 = execute(makeRowsFooter, always, noop, lazyWire, structureModified);\n var getTableCellType = getCellsType;\n var getTableColType = getColumnsType;\n var getTableRowType = getRowsType;\n return {\n deleteRow: deleteRow,\n deleteColumn: deleteColumn,\n insertRowsBefore: insertRowsBefore$1,\n insertRowsAfter: insertRowsAfter$1,\n insertColumnsBefore: insertColumnsBefore$1,\n insertColumnsAfter: insertColumnsAfter$1,\n mergeCells: mergeCells$1,\n unmergeCells: unmergeCells$1,\n pasteColsBefore: pasteColsBefore$1,\n pasteColsAfter: pasteColsAfter$1,\n pasteRowsBefore: pasteRowsBefore$1,\n pasteRowsAfter: pasteRowsAfter$1,\n pasteCells: pasteCells$1,\n makeCellsHeader: makeCellsHeader$1,\n unmakeCellsHeader: unmakeCellsHeader$1,\n makeColumnsHeader: makeColumnsHeader$1,\n unmakeColumnsHeader: unmakeColumnsHeader$1,\n makeRowsHeader: makeRowsHeader$1,\n makeRowsBody: makeRowsBody$1,\n makeRowsFooter: makeRowsFooter$1,\n getTableRowType: getTableRowType,\n getTableCellType: getTableCellType,\n getTableColType: getTableColType\n };\n };\n\n var DefaultRenderOptions = {\n styles: {\n 'border-collapse': 'collapse',\n 'width': '100%'\n },\n attributes: { border: '1' },\n colGroups: false\n };\n var tableHeaderCell = function () {\n return SugarElement.fromTag('th');\n };\n var tableCell = function () {\n return SugarElement.fromTag('td');\n };\n var tableColumn = function () {\n return SugarElement.fromTag('col');\n };\n var createRow = function (columns, rowHeaders, columnHeaders, rowIndex) {\n var tr = SugarElement.fromTag('tr');\n for (var j = 0; j < columns; j++) {\n var td = rowIndex < rowHeaders || j < columnHeaders ? tableHeaderCell() : tableCell();\n if (j < columnHeaders) {\n set$2(td, 'scope', 'row');\n }\n if (rowIndex < rowHeaders) {\n set$2(td, 'scope', 'col');\n }\n append$1(td, SugarElement.fromTag('br'));\n append$1(tr, td);\n }\n return tr;\n };\n var createGroupRow = function (columns) {\n var columnGroup = SugarElement.fromTag('colgroup');\n range$1(columns, function () {\n return append$1(columnGroup, tableColumn());\n });\n return columnGroup;\n };\n var createRows = function (rows, columns, rowHeaders, columnHeaders) {\n return range$1(rows, function (r) {\n return createRow(columns, rowHeaders, columnHeaders, r);\n });\n };\n var render = function (rows, columns, rowHeaders, columnHeaders, headerType, renderOpts) {\n if (renderOpts === void 0) {\n renderOpts = DefaultRenderOptions;\n }\n var table = SugarElement.fromTag('table');\n var rowHeadersGoInThead = headerType !== 'cells';\n setAll(table, renderOpts.styles);\n setAll$1(table, renderOpts.attributes);\n if (renderOpts.colGroups) {\n append$1(table, createGroupRow(columns));\n }\n var actualRowHeaders = Math.min(rows, rowHeaders);\n if (rowHeadersGoInThead && rowHeaders > 0) {\n var thead = SugarElement.fromTag('thead');\n append$1(table, thead);\n var theadRowHeaders = headerType === 'sectionCells' ? actualRowHeaders : 0;\n var theadRows = createRows(rowHeaders, columns, theadRowHeaders, columnHeaders);\n append(thead, theadRows);\n }\n var tbody = SugarElement.fromTag('tbody');\n append$1(table, tbody);\n var numRows = rowHeadersGoInThead ? rows - actualRowHeaders : rows;\n var numRowHeaders = rowHeadersGoInThead ? 0 : rowHeaders;\n var tbodyRows = createRows(numRows, columns, numRowHeaders, columnHeaders);\n append(tbody, tbodyRows);\n return table;\n };\n\n var get$2 = function (element) {\n return element.dom.innerHTML;\n };\n var getOuter = function (element) {\n var container = SugarElement.fromTag('div');\n var clone = SugarElement.fromDom(element.dom.cloneNode(true));\n append$1(container, clone);\n return get$2(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(tableElm, 'td,th').each(curry(placeCaretInCell, editor));\n };\n var fireEvents = function (editor, table) {\n each$2(descendants(table, 'tr'), function (row) {\n fireNewRow(editor, row.dom);\n each$2(descendants(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 = function (editor, columns, rows, colHeaders, rowHeaders) {\n var defaultStyles = getDefaultStyles(editor);\n var options = {\n styles: defaultStyles,\n attributes: getDefaultAttributes(editor),\n colGroups: useColumnGroup(editor)\n };\n editor.undoManager.ignore(function () {\n var table = render(rows, columns, rowHeaders, colHeaders, getTableHeaderType(editor), options);\n set$2(table, 'data-mce-id', '__mce');\n var html = getOuter(table);\n editor.insertContent(html);\n editor.addVisual();\n });\n return descendant(getBody(editor), 'table[data-mce-id=\"__mce\"]').map(function (table) {\n if (isPixelsForced(editor)) {\n enforcePixels(table);\n } else if (isResponsiveForced(editor)) {\n enforceNone(table);\n } else if (isPercentagesForced(editor) || isPercentage(defaultStyles.width)) {\n enforcePercentage(table);\n }\n removeDataStyle(table);\n remove$7(table, 'data-mce-id');\n fireEvents(editor, table);\n selectFirstCellInTable(editor, table);\n return table.dom;\n }).getOr(null);\n };\n var insertTableWithDataValidation = function (editor, rows, columns, options, errorMsg) {\n if (options === void 0) {\n options = {};\n }\n var checkInput = function (val) {\n return isNumber(val) && val > 0;\n };\n if (checkInput(rows) && checkInput(columns)) {\n var headerRows = options.headerRows || 0;\n var headerColumns = options.headerColumns || 0;\n return insert(editor, columns, rows, headerColumns, headerRows);\n } else {\n console.error(errorMsg);\n return null;\n }\n };\n\n var getClipboardElements = function (getClipboard) {\n return function () {\n return getClipboard().fold(function () {\n return [];\n }, function (elems) {\n return map$1(elems, function (e) {\n return e.dom;\n });\n });\n };\n };\n var setClipboardElements = function (setClipboard) {\n return function (elems) {\n var elmsOpt = elems.length > 0 ? Optional.some(fromDom(elems)) : Optional.none();\n setClipboard(elmsOpt);\n };\n };\n var insertTable = function (editor) {\n return function (columns, rows, options) {\n if (options === void 0) {\n options = {};\n }\n var table = insertTableWithDataValidation(editor, rows, columns, options, 'Invalid values for insertTable - rows and columns values are required to insert a table.');\n editor.undoManager.add();\n return table;\n };\n };\n var getApi = function (editor, clipboard, resizeHandler, selectionTargets) {\n return {\n insertTable: insertTable(editor),\n setClipboardRows: setClipboardElements(clipboard.setRows),\n getClipboardRows: getClipboardElements(clipboard.getRows),\n setClipboardCols: setClipboardElements(clipboard.setColumns),\n getClipboardCols: getClipboardElements(clipboard.getColumns),\n resizeHandler: resizeHandler,\n selectionTargets: selectionTargets\n };\n };\n\n var constrainSpan = function (element, property, value) {\n var currentColspan = getAttrValue(element, property, 1);\n if (value === 1 || currentColspan <= 1) {\n remove$7(element, property);\n } else {\n set$2(element, property, Math.min(value, currentColspan));\n }\n };\n var generateColGroup = function (house, minColRange, maxColRange) {\n if (Warehouse.hasColumns(house)) {\n var colsToCopy = filter$2(Warehouse.justColumns(house), function (col) {\n return col.column >= minColRange && col.column < maxColRange;\n });\n var copiedCols = map$1(colsToCopy, function (c) {\n var clonedCol = deep(c.element);\n constrainSpan(clonedCol, 'span', maxColRange - minColRange);\n return clonedCol;\n });\n var fakeColgroup = SugarElement.fromTag('colgroup');\n append(fakeColgroup, copiedCols);\n return [fakeColgroup];\n } else {\n return [];\n }\n };\n var generateRows = function (house, minColRange, maxColRange) {\n return map$1(house.all, function (row) {\n var cellsToCopy = filter$2(row.cells, function (cell) {\n return cell.column >= minColRange && cell.column < maxColRange;\n });\n var copiedCells = map$1(cellsToCopy, function (cell) {\n var clonedCell = deep(cell.element);\n constrainSpan(clonedCell, 'colspan', maxColRange - minColRange);\n return clonedCell;\n });\n var fakeTR = SugarElement.fromTag('tr');\n append(fakeTR, copiedCells);\n return fakeTR;\n });\n };\n var copyCols = function (table, target) {\n var house = Warehouse.fromTable(table);\n var details = onUnlockedCells(house, target);\n return details.map(function (selectedCells) {\n var lastSelectedCell = selectedCells[selectedCells.length - 1];\n var minColRange = selectedCells[0].column;\n var maxColRange = lastSelectedCell.column + lastSelectedCell.colspan;\n var fakeColGroups = generateColGroup(house, minColRange, maxColRange);\n var fakeRows = generateRows(house, minColRange, maxColRange);\n return __spreadArray(__spreadArray([], fakeColGroups, true), fakeRows, true);\n });\n };\n\n var copyRows = function (table, target, generators) {\n var warehouse = Warehouse.fromTable(table);\n var details = onCells(warehouse, target);\n return details.bind(function (selectedCells) {\n var grid = toGrid(warehouse, generators, false);\n var rows = extractGridDetails(grid).rows;\n var slicedGrid = rows.slice(selectedCells[0].row, selectedCells[selectedCells.length - 1].row + selectedCells[selectedCells.length - 1].rowspan);\n var filteredGrid = bind$2(slicedGrid, function (row) {\n var newCells = filter$2(row.cells, function (cell) {\n return !cell.isLocked;\n });\n return newCells.length > 0 ? [__assign(__assign({}, row), { cells: newCells })] : [];\n });\n var slicedDetails = toDetailList(filteredGrid);\n return someIf(slicedDetails.length > 0, slicedDetails);\n }).map(function (slicedDetails) {\n return copy(slicedDetails);\n });\n };\n\n var global$2 = 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 return checkChildren(firstChildStyle, cells);\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$2.each('left center right'.split(' '), function (name) {\n editor.formatter.remove('align' + name, {}, elm);\n });\n };\n var unApplyVAlign = function (editor, elm) {\n global$2.each('top middle bottom'.split(' '), function (name) {\n editor.formatter.remove('valign' + name, {}, elm);\n });\n };\n\n var verticalAlignValues = [\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 var hexColour = function (value) {\n return { value: value };\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 normalizeHex = function (hex) {\n return removeLeading(hex, '#').toUpperCase();\n };\n var fromString$1 = function (hex) {\n return isHexString(hex) ? Optional.some({ value: normalizeHex(hex) }) : Optional.none();\n };\n var toHex = function (component) {\n var hex = component.toString(16);\n return (hex.length === 1 ? '0' + hex : hex).toUpperCase();\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 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: red,\n green: green,\n blue: blue,\n alpha: alpha\n };\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 Optional.some(rgbaColour(0, 0, 0, 0));\n }\n var rgbMatch = rgbRegex.exec(rgbaString);\n if (rgbMatch !== null) {\n return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1'));\n }\n var rgbaMatch = rgbaRegex.exec(rgbaString);\n if (rgbaMatch !== null) {\n return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4]));\n }\n return Optional.none();\n };\n\n var anyToHex = function (color) {\n return fromString$1(color).orThunk(function () {\n return fromString(color).map(fromRgba);\n }).getOrThunk(function () {\n var canvas = document.createElement('canvas');\n canvas.height = 1;\n canvas.width = 1;\n var canvasContext = canvas.getContext('2d');\n canvasContext.clearRect(0, 0, canvas.width, canvas.height);\n canvasContext.fillStyle = '#FFFFFF';\n canvasContext.fillStyle = color;\n canvasContext.fillRect(0, 0, 1, 1);\n var rgba = canvasContext.getImageData(0, 0, 1, 1).data;\n var r = rgba[0];\n var g = rgba[1];\n var b = rgba[2];\n var a = rgba[3];\n return fromRgba(rgbaColour(r, g, b, a));\n });\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 return {\n get: get,\n set: set\n };\n };\n\n var singleton = function (doRevoke) {\n var subject = Cell(Optional.none());\n var revoke = function () {\n return subject.get().each(doRevoke);\n };\n var clear = function () {\n revoke();\n subject.set(Optional.none());\n };\n var isSet = function () {\n return subject.get().isSome();\n };\n var get = function () {\n return subject.get();\n };\n var set = function (s) {\n revoke();\n subject.set(Optional.some(s));\n };\n return {\n clear: clear,\n isSet: isSet,\n get: get,\n set: set\n };\n };\n var unbindable = function () {\n return singleton(function (s) {\n return s.unbind();\n });\n };\n var value = function () {\n var subject = singleton(noop);\n var on = function (f) {\n return subject.get().each(f);\n };\n return __assign(__assign({}, subject), { on: on });\n };\n\n var onSetupToggle = function (editor, selections, formatName, formatValue) {\n return function (api) {\n var boundCallback = unbindable();\n var isNone = isEmpty$1(formatValue);\n var init = function () {\n var selectedCells = getCellsFromSelection(selections);\n var checkNode = function (cell) {\n return editor.formatter.match(formatName, { value: formatValue }, cell.dom, isNone);\n };\n if (isNone) {\n api.setActive(!exists(selectedCells, checkNode));\n boundCallback.set(editor.formatter.formatChanged(formatName, function (match) {\n return api.setActive(!match);\n }, true));\n } else {\n api.setActive(forall(selectedCells, checkNode));\n boundCallback.set(editor.formatter.formatChanged(formatName, api.setActive, false, { value: formatValue }));\n }\n };\n editor.initialized ? init() : editor.on('init', init);\n return boundCallback.clear;\n };\n };\n var isListGroup = function (item) {\n return hasNonNullableKey(item, 'menu');\n };\n var buildListItems = function (items) {\n return map$1(items, function (item) {\n var text = item.text || item.title;\n if (isListGroup(item)) {\n return {\n text: text,\n items: buildListItems(item.menu)\n };\n } else {\n return {\n text: text,\n value: item.value\n };\n }\n });\n };\n var buildMenuItems = function (editor, selections, items, format, onAction) {\n return map$1(items, function (item) {\n var text = item.text || item.title;\n if (isListGroup(item)) {\n return {\n type: 'nestedmenuitem',\n text: text,\n getSubmenuItems: function () {\n return buildMenuItems(editor, selections, item.menu, format, onAction);\n }\n };\n } else {\n return {\n text: text,\n type: 'togglemenuitem',\n onAction: function () {\n return onAction(item.value);\n },\n onSetup: onSetupToggle(editor, selections, format, item.value)\n };\n }\n });\n };\n var applyTableCellStyle = function (editor, style) {\n return function (value) {\n var _a;\n editor.execCommand('mceTableApplyCellStyle', false, (_a = {}, _a[style] = value, _a));\n };\n };\n var filterNoneItem = function (list) {\n return bind$2(list, function (item) {\n if (isListGroup(item)) {\n return [__assign(__assign({}, item), { menu: filterNoneItem(item.menu) })];\n } else {\n return isNotEmpty(item.value) ? [item] : [];\n }\n });\n };\n var generateMenuItemsCallback = function (editor, selections, items, format, onAction) {\n return function (callback) {\n return callback(buildMenuItems(editor, selections, items, format, onAction));\n };\n };\n var buildColorMenu = function (editor, colorList, style) {\n var colorMap = map$1(colorList, function (entry) {\n return {\n text: entry.title,\n value: '#' + anyToHex(entry.value).value,\n type: 'choiceitem'\n };\n });\n return [{\n type: 'fancymenuitem',\n fancytype: 'colorswatch',\n initData: {\n colors: colorMap.length > 0 ? colorMap : undefined,\n allowCustomColors: false\n },\n onAction: function (data) {\n var _a;\n var value = data.value === 'remove' ? '' : data.value;\n editor.execCommand('mceTableApplyCellStyle', false, (_a = {}, _a[style] = value, _a));\n }\n }];\n };\n var changeRowHeader = function (editor) {\n return function () {\n var currentType = editor.queryCommandValue('mceTableRowType');\n var newType = currentType === 'header' ? 'body' : 'header';\n editor.execCommand('mceTableRowType', false, { type: newType });\n };\n };\n var changeColumnHeader = function (editor) {\n return function () {\n var currentType = editor.queryCommandValue('mceTableColType');\n var newType = currentType === 'th' ? 'td' : 'th';\n editor.execCommand('mceTableColType', false, { type: newType });\n };\n };\n\n var getClassList$1 = function (editor) {\n var classes = buildListItems(getCellClassList(editor));\n if (classes.length > 0) {\n return Optional.some({\n name: 'class',\n type: 'listbox',\n label: 'Class',\n items: classes\n });\n }\n return Optional.none();\n };\n var children = [\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: 'listbox',\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: 'listbox',\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: 'listbox',\n label: 'Horizontal 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: 'listbox',\n label: 'Vertical align',\n items: verticalAlignValues\n }\n ];\n var getItems$2 = function (editor) {\n return children.concat(getClassList$1(editor).toArray());\n };\n\n var getAdvancedTab = function (editor, dialogName) {\n var emptyBorderStyle = [{\n text: 'Select...',\n value: ''\n }];\n var advTabItems = [\n {\n name: 'borderstyle',\n type: 'listbox',\n label: 'Border style',\n items: emptyBorderStyle.concat(buildListItems(getTableBorderStyles(editor)))\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\n var modifiers = function (testTruthy) {\n return function (editor, node) {\n var dom = editor.dom;\n var setAttrib = function (attr, value) {\n if (!testTruthy || value) {\n dom.setAttrib(node, attr, value);\n }\n };\n var setStyle = function (prop, value) {\n if (!testTruthy || value) {\n dom.setStyle(node, prop, value);\n }\n };\n var setFormat = function (formatName, value) {\n if (!testTruthy || value) {\n if (value === '') {\n editor.formatter.remove(formatName, { value: null }, node, true);\n } else {\n editor.formatter.apply(formatName, { value: value }, node);\n }\n }\n };\n return {\n setAttrib: setAttrib,\n setStyle: setStyle,\n setFormat: setFormat\n };\n };\n };\n var DomModifier = {\n normal: modifiers(false),\n ifTruthy: modifiers(true)\n };\n\n var rgbToHex = function (dom) {\n return function (value) {\n return startsWith(value, 'rgb') ? dom.toHex(value) : value;\n };\n };\n var extractAdvancedStyles = function (dom, elm) {\n var element = SugarElement.fromDom(elm);\n return {\n borderwidth: getRaw$2(element, 'border-width').getOr(''),\n borderstyle: getRaw$2(element, 'border-style').getOr(''),\n bordercolor: getRaw$2(element, 'border-color').map(rgbToHex(dom)).getOr(''),\n backgroundcolor: getRaw$2(element, 'background-color').map(rgbToHex(dom)).getOr('')\n };\n };\n var getSharedValues = function (data) {\n var baseData = data[0];\n var comparisonData = data.slice(1);\n each$2(comparisonData, function (items) {\n each$2(keys(baseData), 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 getAlignment = function (formats, formatName, editor, elm) {\n return find$1(formats, function (name) {\n return !isUndefined(editor.formatter.matchNode(elm, formatName + name));\n }).getOr('');\n };\n var getHAlignment = curry(getAlignment, [\n 'left',\n 'center',\n 'right'\n ], 'align');\n var getVAlignment = curry(getAlignment, [\n 'top',\n 'middle',\n 'bottom'\n ], 'valign');\n var extractDataFromSettings = function (editor, hasAdvTableTab) {\n var style = getDefaultStyles(editor);\n var attrs = getDefaultAttributes(editor);\n var extractAdvancedStyleData = function (dom) {\n return {\n borderstyle: get$c(style, 'border-style').getOr(''),\n bordercolor: rgbToHex(dom)(get$c(style, 'border-color').getOr('')),\n backgroundcolor: rgbToHex(dom)(get$c(style, 'background-color').getOr(''))\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$c(attrs, 'border').fold(function () {\n return {};\n }, function (border) {\n return { border: border };\n });\n };\n var advStyle = hasAdvTableTab ? extractAdvancedStyleData(editor.dom) : {};\n var getCellPaddingCellSpacing = function () {\n var spacing = get$c(style, 'border-spacing').or(get$c(attrs, 'cellspacing')).fold(function () {\n return {};\n }, function (cellspacing) {\n return { cellspacing: cellspacing };\n });\n var padding = get$c(style, 'border-padding').or(get$c(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 getRowType = function (elm) {\n return table(SugarElement.fromDom(elm)).map(function (table) {\n var target = { selection: fromDom(elm.cells) };\n return getRowsType(table, target);\n }).getOr('');\n };\n var extractDataFromTableElement = function (editor, elm, hasAdvTableTab) {\n var getBorder = function (dom, elm) {\n var optBorderWidth = getRaw$2(SugarElement.fromDom(elm), 'border-width');\n if (shouldStyleWithCss(editor) && optBorderWidth.isSome()) {\n return optBorderWidth.getOr('');\n }\n return dom.getAttrib(elm, 'border') || getTDTHOverallStyle(editor.dom, elm, 'border-width') || getTDTHOverallStyle(editor.dom, elm, 'border');\n };\n var dom = editor.dom;\n var cellspacing = shouldStyleWithCss(editor) ? dom.getStyle(elm, 'border-spacing') || dom.getAttrib(elm, 'cellspacing') : dom.getAttrib(elm, 'cellspacing') || dom.getStyle(elm, 'border-spacing');\n var cellpadding = shouldStyleWithCss(editor) ? getTDTHOverallStyle(dom, elm, 'padding') || dom.getAttrib(elm, 'cellpadding') : dom.getAttrib(elm, 'cellpadding') || getTDTHOverallStyle(dom, elm, 'padding');\n return __assign({\n width: dom.getStyle(elm, 'width') || dom.getAttrib(elm, 'width'),\n height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'),\n cellspacing: cellspacing,\n cellpadding: cellpadding,\n border: getBorder(dom, elm),\n caption: !!dom.select('caption', elm)[0],\n class: dom.getAttrib(elm, 'class', ''),\n align: getHAlignment(editor, elm)\n }, hasAdvTableTab ? extractAdvancedStyles(dom, elm) : {});\n };\n var extractDataFromRowElement = function (editor, elm, hasAdvancedRowTab) {\n var dom = editor.dom;\n return __assign({\n height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'),\n class: dom.getAttrib(elm, 'class', ''),\n type: getRowType(elm),\n align: getHAlignment(editor, elm)\n }, hasAdvancedRowTab ? extractAdvancedStyles(dom, elm) : {});\n };\n var extractDataFromCellElement = function (editor, cell, hasAdvancedCellTab, column) {\n var dom = editor.dom;\n var colElm = column.getOr(cell);\n var getStyle = function (element, style) {\n return dom.getStyle(element, style) || dom.getAttrib(element, style);\n };\n return __assign({\n width: getStyle(colElm, 'width'),\n height: getStyle(cell, 'height'),\n scope: dom.getAttrib(cell, 'scope'),\n celltype: getNodeName(cell),\n class: dom.getAttrib(cell, 'class', ''),\n halign: getHAlignment(editor, cell),\n valign: getVAlignment(editor, cell)\n }, hasAdvancedCellTab ? extractAdvancedStyles(dom, cell) : {});\n };\n\n var getSelectedCells = function (table, cells) {\n var warehouse = Warehouse.fromTable(table);\n var allCells = Warehouse.justCells(warehouse);\n var filtered = filter$2(allCells, function (cellA) {\n return exists(cells, function (cellB) {\n return eq$1(cellA.element, cellB);\n });\n });\n return map$1(filtered, function (cell) {\n return {\n element: cell.element.dom,\n column: Warehouse.getColumnAt(warehouse, cell.column).map(function (col) {\n return col.element.dom;\n })\n };\n });\n };\n var updateSimpleProps$1 = function (modifier, colModifier, data) {\n modifier.setAttrib('scope', data.scope);\n modifier.setAttrib('class', data.class);\n modifier.setStyle('height', addPxSuffix(data.height));\n colModifier.setStyle('width', addPxSuffix(data.width));\n };\n var updateAdvancedProps$1 = function (modifier, data) {\n modifier.setFormat('tablecellbackgroundcolor', data.backgroundcolor);\n modifier.setFormat('tablecellbordercolor', data.bordercolor);\n modifier.setFormat('tablecellborderstyle', data.borderstyle);\n modifier.setFormat('tablecellborderwidth', addPxSuffix(data.borderwidth));\n };\n var applyStyleData$1 = function (editor, cells, data) {\n var isSingleCell = cells.length === 1;\n each$2(cells, function (item) {\n var cellElm = item.element;\n var modifier = isSingleCell ? DomModifier.normal(editor, cellElm) : DomModifier.ifTruthy(editor, cellElm);\n var colModifier = item.column.map(function (col) {\n return isSingleCell ? DomModifier.normal(editor, col) : DomModifier.ifTruthy(editor, col);\n }).getOr(modifier);\n updateSimpleProps$1(modifier, colModifier, data);\n if (hasAdvancedCellTab(editor)) {\n updateAdvancedProps$1(modifier, data);\n }\n if (isSingleCell) {\n unApplyAlign(editor, cellElm);\n unApplyVAlign(editor, cellElm);\n }\n if (data.halign) {\n applyAlign(editor, cellElm, data.halign);\n }\n if (data.valign) {\n applyVAlign(editor, cellElm, data.valign);\n }\n });\n };\n var applyStructureData$1 = function (editor, data) {\n editor.execCommand('mceTableCellType', false, {\n type: data.celltype,\n no_events: true\n });\n };\n var applyCellData = function (editor, cells, oldData, data) {\n var modifiedData = filter$1(data, function (value, key) {\n return oldData[key] !== value;\n });\n if (size(modifiedData) > 0 && cells.length >= 1) {\n table(cells[0]).each(function (table) {\n var selectedCells = getSelectedCells(table, cells);\n var styleModified = size(filter$1(modifiedData, function (_value, key) {\n return key !== 'scope' && key !== 'celltype';\n })) > 0;\n var structureModified = has$1(modifiedData, 'celltype');\n if (styleModified || has$1(modifiedData, 'scope')) {\n applyStyleData$1(editor, selectedCells, data);\n }\n if (structureModified) {\n applyStructureData$1(editor, data);\n }\n fireTableModified(editor, table.dom, {\n structure: structureModified,\n style: styleModified\n });\n });\n }\n };\n var onSubmitCellForm = function (editor, cells, oldData, api) {\n var data = api.getData();\n api.close();\n editor.undoManager.transact(function () {\n applyCellData(editor, cells, oldData, data);\n editor.focus();\n });\n };\n var getData = function (editor, cells) {\n var cellsData = table(cells[0]).map(function (table) {\n return map$1(getSelectedCells(table, cells), function (item) {\n return extractDataFromCellElement(editor, item.element, hasAdvancedCellTab(editor), item.column);\n });\n });\n return getSharedValues(cellsData.getOrDie());\n };\n var open$2 = function (editor, selections) {\n var cells = getCellsFromSelection(selections);\n if (cells.length === 0) {\n return;\n }\n var data = getData(editor, cells);\n var dialogTabPanel = {\n type: 'tabpanel',\n tabs: [\n {\n title: 'General',\n name: 'general',\n items: getItems$2(editor)\n },\n getAdvancedTab(editor, 'cell')\n ]\n };\n var dialogPanel = {\n type: 'panel',\n items: [{\n type: 'grid',\n columns: 2,\n items: getItems$2(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, data)\n });\n };\n\n var getClassList = function (editor) {\n var classes = buildListItems(getRowClassList(editor));\n if (classes.length > 0) {\n return Optional.some({\n name: 'class',\n type: 'listbox',\n label: 'Class',\n items: classes\n });\n }\n return Optional.none();\n };\n var formChildren = [\n {\n type: 'listbox',\n name: 'type',\n label: 'Row type',\n items: [\n {\n text: 'Header',\n value: 'header'\n },\n {\n text: 'Body',\n value: 'body'\n },\n {\n text: 'Footer',\n value: 'footer'\n }\n ]\n },\n {\n type: 'listbox',\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 formChildren.concat(getClassList(editor).toArray());\n };\n\n var updateSimpleProps = function (modifier, data) {\n modifier.setAttrib('class', data.class);\n modifier.setStyle('height', addPxSuffix(data.height));\n };\n var updateAdvancedProps = 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 applyStyleData = function (editor, rows, data, oldData) {\n var isSingleRow = rows.length === 1;\n each$2(rows, function (rowElm) {\n var modifier = isSingleRow ? DomModifier.normal(editor, rowElm) : DomModifier.ifTruthy(editor, rowElm);\n updateSimpleProps(modifier, data);\n if (hasAdvancedRowTab(editor)) {\n updateAdvancedProps(modifier, data);\n }\n if (data.align !== oldData.align) {\n unApplyAlign(editor, rowElm);\n applyAlign(editor, rowElm, data.align);\n }\n });\n };\n var applyStructureData = function (editor, data) {\n editor.execCommand('mceTableRowType', false, {\n type: data.type,\n no_events: true\n });\n };\n var applyRowData = function (editor, rows, oldData, data) {\n var modifiedData = filter$1(data, function (value, key) {\n return oldData[key] !== value;\n });\n if (size(modifiedData) > 0) {\n var typeModified_1 = has$1(modifiedData, 'type');\n var styleModified_1 = typeModified_1 ? size(modifiedData) > 1 : true;\n if (styleModified_1) {\n applyStyleData(editor, rows, data, oldData);\n }\n if (typeModified_1) {\n applyStructureData(editor, data);\n }\n table(SugarElement.fromDom(rows[0])).each(function (table) {\n return fireTableModified(editor, table.dom, {\n structure: typeModified_1,\n style: styleModified_1\n });\n });\n }\n };\n var onSubmitRowForm = function (editor, rows, oldData, api) {\n var data = api.getData();\n api.close();\n editor.undoManager.transact(function () {\n applyRowData(editor, rows, oldData, data);\n editor.focus();\n });\n };\n var open$1 = function (editor) {\n var rows = getRowsFromSelection(getSelectionStart(editor), ephemera.selected);\n if (rows.length === 0) {\n return;\n }\n var rowsData = map$1(rows, function (rowElm) {\n return extractDataFromRowElement(editor, rowElm.dom, hasAdvancedRowTab(editor));\n });\n var data = getSharedValues(rowsData);\n var dialogTabPanel = {\n type: 'tabpanel',\n tabs: [\n {\n title: 'General',\n name: 'general',\n items: getItems$1(editor)\n },\n getAdvancedTab(editor, 'row')\n ]\n };\n var dialogPanel = {\n type: 'panel',\n items: [{\n type: 'grid',\n columns: 2,\n items: getItems$1(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, map$1(rows, function (r) {\n return r.dom;\n }), data)\n });\n };\n\n var getItems = function (editor, classes, 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: 'listbox',\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 = classes.length > 0 ? [{\n type: 'listbox',\n name: 'class',\n label: 'Class',\n items: classes\n }] : [];\n return rowColCountItems.concat(alwaysItems).concat(appearanceItems).concat(alignmentItem).concat(classListItem);\n };\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 = addPxSuffix(data.height);\n if (dom.getAttrib(tableElm, 'width') && !shouldStyleWithCss(editor)) {\n attrs.width = removePxSuffix(data.width);\n } else {\n styles.width = addPxSuffix(data.width);\n }\n if (shouldStyleWithCss(editor)) {\n styles['border-width'] = addPxSuffix(data.border);\n styles['border-spacing'] = addPxSuffix(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': addPxSuffix(data.border),\n 'padding': addPxSuffix(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, oldData, api) {\n var dom = editor.dom;\n var data = api.getData();\n var modifiedData = filter$1(data, function (value, key) {\n return oldData[key] !== value;\n });\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 = insert(editor, cols, rows, 0, 0);\n }\n if (size(modifiedData) > 0) {\n applyDataToElement(editor, tableElm, data);\n var captionElm = dom.select('caption', tableElm)[0];\n if (captionElm && !data.caption || !captionElm && data.caption) {\n editor.execCommand('mceTableToggleCaption');\n }\n if (data.align === '') {\n unApplyAlign(editor, tableElm);\n } else {\n applyAlign(editor, tableElm, data.align);\n }\n }\n editor.focus();\n editor.addVisual();\n if (size(modifiedData) > 0) {\n var captionModified = has$1(modifiedData, 'caption');\n var styleModified = captionModified ? size(modifiedData) > 1 : true;\n fireTableModified(editor, tableElm, {\n structure: captionModified,\n style: styleModified\n });\n }\n });\n };\n var open = function (editor, insertNewTable) {\n var dom = editor.dom;\n var tableElm;\n var data = extractDataFromSettings(editor, hasAdvancedTableTab(editor));\n if (insertNewTable === false) {\n tableElm = dom.getParent(editor.selection.getStart(), 'table', editor.getBody());\n if (tableElm) {\n data = 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 classes = buildListItems(getTableClassList(editor));\n if (classes.length > 0) {\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: getItems(editor, classes, 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 getAdvancedTab(editor, '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, data),\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\n var getSelectionStartCellOrCaption = function (editor) {\n return getSelectionCellOrCaption(getSelectionStart(editor), getIsRoot(editor));\n };\n var getSelectionStartCell = function (editor) {\n return getSelectionCell(getSelectionStart(editor), getIsRoot(editor));\n };\n var registerCommands = function (editor, actions, cellSelection, selections, clipboard) {\n var isRoot = getIsRoot(editor);\n var eraseTable = function () {\n return getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) {\n table(cellOrCaption, isRoot).filter(not(isRoot)).each(function (table) {\n var cursor = SugarElement.fromText('');\n after$5(table, cursor);\n remove$5(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 setSizingMode = function (sizing) {\n return getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) {\n var isForcedSizing = isResponsiveForced(editor) || isPixelsForced(editor) || isPercentagesForced(editor);\n if (!isForcedSizing) {\n table(cellOrCaption, isRoot).each(function (table) {\n if (sizing === 'relative' && !isPercentSizing(table)) {\n enforcePercentage(table);\n } else if (sizing === 'fixed' && !isPixelSizing(table)) {\n enforcePixels(table);\n } else if (sizing === 'responsive' && !isNoneSizing(table)) {\n enforceNone(table);\n }\n removeDataStyle(table);\n fireTableModified(editor, table.dom, structureModified);\n });\n }\n });\n };\n var getTableFromCell = function (cell) {\n return table(cell, isRoot);\n };\n var performActionOnSelection = function (action) {\n return getSelectionStartCell(editor).bind(function (cell) {\n return getTableFromCell(cell).map(function (table) {\n return action(table, cell);\n });\n });\n };\n var toggleTableClass = function (_ui, clazz) {\n performActionOnSelection(function (table) {\n editor.formatter.toggle('tableclass', { value: clazz }, table.dom);\n fireTableModified(editor, table.dom, styleModified);\n });\n };\n var toggleTableCellClass = function (_ui, clazz) {\n performActionOnSelection(function (table) {\n var selectedCells = getCellsFromSelection(selections);\n var allHaveClass = forall(selectedCells, function (cell) {\n return editor.formatter.match('tablecellclass', { value: clazz }, cell.dom);\n });\n var formatterAction = allHaveClass ? editor.formatter.remove : editor.formatter.apply;\n each$2(selectedCells, function (cell) {\n return formatterAction('tablecellclass', { value: clazz }, cell.dom);\n });\n fireTableModified(editor, table.dom, styleModified);\n });\n };\n var toggleCaption = function () {\n getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) {\n table(cellOrCaption, isRoot).each(function (table) {\n child$1(table, 'caption').fold(function () {\n var caption = SugarElement.fromTag('caption');\n append$1(caption, SugarElement.fromText('Caption'));\n appendAt(table, caption, 0);\n editor.selection.setCursorLocation(caption.dom, 0);\n }, function (caption) {\n if (isTag('caption')(cellOrCaption)) {\n one('td', table).each(function (td) {\n return editor.selection.setCursorLocation(td.dom, 0);\n });\n }\n remove$5(caption);\n });\n fireTableModified(editor, table.dom, structureModified);\n });\n });\n };\n var postExecute = function (_data) {\n editor.focus();\n };\n var actOnSelection = function (execute, noEvents) {\n if (noEvents === void 0) {\n noEvents = false;\n }\n return performActionOnSelection(function (table, startCell) {\n var targets = forMenu(selections, table, startCell);\n execute(table, targets, noEvents).each(postExecute);\n });\n };\n var copyRowSelection = function () {\n return performActionOnSelection(function (table, startCell) {\n var targets = forMenu(selections, table, startCell);\n var generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), Optional.none());\n return copyRows(table, targets, generators);\n });\n };\n var copyColSelection = function () {\n return performActionOnSelection(function (table, startCell) {\n var targets = forMenu(selections, table, startCell);\n return copyCols(table, targets);\n });\n };\n var pasteOnSelection = function (execute, getRows) {\n return getRows().each(function (rows) {\n var clonedRows = map$1(rows, function (row) {\n return deep(row);\n });\n performActionOnSelection(function (table, startCell) {\n var generators = paste$1(SugarElement.fromDom(editor.getDoc()));\n var targets = pasteRows(selections, startCell, clonedRows, generators);\n execute(table, targets).each(postExecute);\n });\n });\n };\n var actOnType = function (getAction) {\n return function (_ui, args) {\n return get$c(args, 'type').each(function (type) {\n actOnSelection(getAction(type), args.no_events);\n });\n };\n };\n each$1({\n mceTableSplitCells: function () {\n return actOnSelection(actions.unmergeCells);\n },\n mceTableMergeCells: function () {\n return actOnSelection(actions.mergeCells);\n },\n mceTableInsertRowBefore: function () {\n return actOnSelection(actions.insertRowsBefore);\n },\n mceTableInsertRowAfter: function () {\n return actOnSelection(actions.insertRowsAfter);\n },\n mceTableInsertColBefore: function () {\n return actOnSelection(actions.insertColumnsBefore);\n },\n mceTableInsertColAfter: function () {\n return actOnSelection(actions.insertColumnsAfter);\n },\n mceTableDeleteCol: function () {\n return actOnSelection(actions.deleteColumn);\n },\n mceTableDeleteRow: function () {\n return actOnSelection(actions.deleteRow);\n },\n mceTableCutCol: function () {\n return copyColSelection().each(function (selection) {\n clipboard.setColumns(selection);\n actOnSelection(actions.deleteColumn);\n });\n },\n mceTableCutRow: function () {\n return copyRowSelection().each(function (selection) {\n clipboard.setRows(selection);\n actOnSelection(actions.deleteRow);\n });\n },\n mceTableCopyCol: function () {\n return copyColSelection().each(function (selection) {\n return clipboard.setColumns(selection);\n });\n },\n mceTableCopyRow: function () {\n return copyRowSelection().each(function (selection) {\n return clipboard.setRows(selection);\n });\n },\n mceTablePasteColBefore: function () {\n return pasteOnSelection(actions.pasteColsBefore, clipboard.getColumns);\n },\n mceTablePasteColAfter: function () {\n return pasteOnSelection(actions.pasteColsAfter, clipboard.getColumns);\n },\n mceTablePasteRowBefore: function () {\n return pasteOnSelection(actions.pasteRowsBefore, clipboard.getRows);\n },\n mceTablePasteRowAfter: function () {\n return pasteOnSelection(actions.pasteRowsAfter, clipboard.getRows);\n },\n mceTableDelete: eraseTable,\n mceTableCellToggleClass: toggleTableCellClass,\n mceTableToggleClass: toggleTableClass,\n mceTableToggleCaption: toggleCaption,\n mceTableSizingMode: function (_ui, sizing) {\n return setSizingMode(sizing);\n },\n mceTableCellType: actOnType(function (type) {\n return type === 'th' ? actions.makeCellsHeader : actions.unmakeCellsHeader;\n }),\n mceTableColType: actOnType(function (type) {\n return type === 'th' ? actions.makeColumnsHeader : actions.unmakeColumnsHeader;\n }),\n mceTableRowType: actOnType(function (type) {\n switch (type) {\n case 'header':\n return actions.makeRowsHeader;\n case 'footer':\n return actions.makeRowsFooter;\n default:\n return actions.makeRowsBody;\n }\n })\n }, function (func, name) {\n return editor.addCommand(name, func);\n });\n each$1({\n mceTableProps: curry(open, editor, false),\n mceTableRowProps: curry(open$1, editor),\n mceTableCellProps: curry(open$2, editor, selections)\n }, function (func, name) {\n return editor.addCommand(name, function () {\n return func();\n });\n });\n editor.addCommand('mceInsertTable', function (_ui, args) {\n if (isObject(args) && keys(args).length > 0) {\n insertTableWithDataValidation(editor, args.rows, args.columns, args.options, 'Invalid values for mceInsertTable - rows and columns values are required to insert a table.');\n } else {\n open(editor, true);\n }\n });\n editor.addCommand('mceTableApplyCellStyle', function (_ui, args) {\n var getFormatName = function (style) {\n return 'tablecell' + style.toLowerCase().replace('-', '');\n };\n if (!isObject(args)) {\n return;\n }\n var cells = getCellsFromSelection(selections);\n if (cells.length === 0) {\n return;\n }\n var validArgs = filter$1(args, function (value, style) {\n return editor.formatter.has(getFormatName(style)) && isString(value);\n });\n if (isEmpty(validArgs)) {\n return;\n }\n each$1(validArgs, function (value, style) {\n each$2(cells, function (cell) {\n DomModifier.normal(editor, cell.dom).setFormat(getFormatName(style), value);\n });\n });\n getTableFromCell(cells[0]).each(function (table) {\n return fireTableModified(editor, table.dom, styleModified);\n });\n });\n };\n\n var registerQueryCommands = function (editor, actions, selections) {\n var isRoot = getIsRoot(editor);\n var lookupOnSelection = function (action) {\n return getSelectionCell(getSelectionStart(editor)).bind(function (cell) {\n return table(cell, isRoot).map(function (table) {\n var targets = forMenu(selections, table, cell);\n return action(table, targets);\n });\n }).getOr('');\n };\n each$1({\n mceTableRowType: function () {\n return lookupOnSelection(actions.getTableRowType);\n },\n mceTableCellType: function () {\n return lookupOnSelection(actions.getTableCellType);\n },\n mceTableColType: function () {\n return lookupOnSelection(actions.getTableColType);\n }\n }, function (func, name) {\n return editor.addQueryValueHandler(name, func);\n });\n };\n\n var Clipboard = function () {\n var rows = value();\n var cols = value();\n return {\n getRows: rows.get,\n setRows: function (r) {\n r.fold(rows.clear, rows.set);\n cols.clear();\n },\n clearRows: rows.clear,\n getColumns: cols.get,\n setColumns: function (c) {\n c.fold(cols.clear, cols.set);\n rows.clear();\n },\n clearColumns: cols.clear\n };\n };\n\n var genericBase = {\n remove_similar: true,\n inherit: false\n };\n var cellBase = __assign({ selector: 'td,th' }, genericBase);\n var cellFormats = {\n tablecellbackgroundcolor: __assign({ styles: { backgroundColor: '%value' } }, cellBase),\n tablecellverticalalign: __assign({ styles: { 'vertical-align': '%value' } }, cellBase),\n tablecellbordercolor: __assign({ styles: { borderColor: '%value' } }, cellBase),\n tablecellclass: __assign({ classes: ['%value'] }, cellBase),\n tableclass: __assign({\n selector: 'table',\n classes: ['%value']\n }, genericBase),\n tablecellborderstyle: __assign({ styles: { borderStyle: '%value' } }, cellBase),\n tablecellborderwidth: __assign({ styles: { borderWidth: '%value' } }, cellBase)\n };\n var registerFormats = function (editor) {\n editor.formatter.register(cellFormats);\n };\n\n var adt$5 = Adt.generate([\n { none: ['current'] },\n { first: ['current'] },\n {\n middle: [\n 'current',\n 'target'\n ]\n },\n { last: ['current'] }\n ]);\n var none = function (current) {\n if (current === void 0) {\n current = undefined;\n }\n return adt$5.none(current);\n };\n var CellLocation = __assign(__assign({}, adt$5), { none: none });\n\n var walk = function (all, current, index, direction, isEligible) {\n if (isEligible === void 0) {\n isEligible = always;\n }\n var forwards = direction === 1;\n if (!forwards && index <= 0) {\n return CellLocation.first(all[0]);\n } else if (forwards && index >= all.length - 1) {\n return CellLocation.last(all[all.length - 1]);\n } else {\n var newIndex = index + direction;\n var elem = all[newIndex];\n return isEligible(elem) ? CellLocation.middle(current, elem) : walk(all, current, newIndex, direction, isEligible);\n }\n };\n var detect$1 = function (current, isRoot) {\n return table(current, isRoot).bind(function (table) {\n var all = cells$1(table);\n var index = findIndex(all, function (x) {\n return eq$1(current, x);\n });\n return index.map(function (index) {\n return {\n index: index,\n all: all\n };\n });\n });\n };\n var next = function (current, isEligible, isRoot) {\n var detection = detect$1(current, isRoot);\n return detection.fold(function () {\n return CellLocation.none(current);\n }, function (info) {\n return walk(info.all, current, info.index, 1, isEligible);\n });\n };\n var prev = function (current, isEligible, isRoot) {\n var detection = detect$1(current, isRoot);\n return detection.fold(function () {\n return CellLocation.none();\n }, function (info) {\n return walk(info.all, current, info.index, -1, isEligible);\n });\n };\n\n var create$2 = function (start, soffset, finish, foffset) {\n return {\n start: start,\n soffset: soffset,\n finish: finish,\n foffset: foffset\n };\n };\n var SimRange = { create: create$2 };\n\n var adt$4 = 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$1 = function (situ) {\n return situ.fold(identity, identity, identity);\n };\n var before$2 = adt$4.before;\n var on = adt$4.on;\n var after$3 = adt$4.after;\n var Situ = {\n before: before$2,\n on: on,\n after: after$3,\n cata: cata$1,\n getStart: getStart$1\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 = function (selection) {\n return selection.match({\n domRange: function (rng) {\n return SugarElement.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(selection);\n return defaultView(start);\n };\n var range = SimRange.create;\n var SimSelection = {\n domRange: domRange,\n relative: relative,\n exact: exact,\n exactFromRange: exactFromRange,\n getWin: getWin,\n range: range\n };\n\n var selectNode = function (win, element) {\n var rng = win.document.createRange();\n rng.selectNode(element.dom);\n return rng;\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 return 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: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height\n };\n };\n var getFirstRect$1 = 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 ? Optional.some(rect).map(toRect) : Optional.none();\n };\n\n var adt$2 = 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(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.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: Optional.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 Optional.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 Optional.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$2.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset);\n }).getOrThunk(function () {\n return fromRange(win, adt$2.ltr, rng);\n });\n } else {\n return fromRange(win, adt$2.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 adt$2.ltr;\n adt$2.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$9(textnode).length;\n var offset = searchForPoint(rectForOffset, x, y, rect.right, length);\n return rangeForOffset(offset);\n };\n var locate$1 = 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) ? Optional.some(rect) : Optional.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$3(node);\n return findMap(nodes, function (n) {\n r.selectNode(n.dom);\n return inRect(r.getBoundingClientRect(), x, y) ? locateNode(doc, n, x, y) : Optional.none();\n });\n };\n var locateNode = function (doc, node, x, y) {\n return isText(node) ? locate$1(doc, node, x, y) : searchInChildren(doc, node, x, y);\n };\n var locate = 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 Optional.some(createCollapsedNode(doc, node, collapseDirection));\n };\n var search = function (doc, node, x) {\n var f = children$3(node).length === 0 ? locateInEmpty : locateInElement;\n return f(doc, node, x);\n };\n\n var caretPositionFromPoint = function (doc, x, y) {\n var _a, _b;\n return Optional.from((_b = (_a = doc.dom).caretPositionFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)).bind(function (pos) {\n if (pos.offsetNode === null) {\n return Optional.none();\n }\n var r = doc.dom.createRange();\n r.setStart(pos.offsetNode, pos.offset);\n r.collapse();\n return Optional.some(r);\n });\n };\n var caretRangeFromPoint = function (doc, x, y) {\n var _a, _b;\n return Optional.from((_b = (_a = doc.dom).caretRangeFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, 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(doc, node, boundedX, boundedY);\n };\n var searchFromPoint = function (doc, x, y) {\n return SugarElement.fromPoint(doc, x, y).bind(function (elem) {\n var fallback = function () {\n return search(doc, elem, x);\n };\n return children$3(elem).length === 0 ? fallback() : searchTextNodes(doc, elem, x, y).orThunk(fallback);\n });\n };\n var availableSearch = function () {\n if (document.caretPositionFromPoint) {\n return caretPositionFromPoint;\n } else if (document.caretRangeFromPoint) {\n return caretRangeFromPoint;\n } else {\n return searchFromPoint;\n }\n }();\n var fromPoint = function (win, x, y) {\n var doc = SugarElement.fromDom(win.document);\n return availableSearch(doc, x, y).map(function (rng) {\n return SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.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$2([\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 SimSelection.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 SimSelection.relative(startSitu, finishSitu);\n };\n var preprocess = function (selection) {\n return selection.match({\n domRange: function (rng) {\n var start = SugarElement.fromDom(rng.startContainer);\n var finish = SugarElement.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$2 = function (start, soffset, finish, foffset) {\n var r = makeRange(start, soffset, finish, foffset);\n var same = eq$1(start, finish) && soffset === foffset;\n return r.collapsed && !same;\n };\n\n var getNativeSelection = function (win) {\n return Optional.from(win.getSelection());\n };\n var doSetNativeRange = function (win, rng) {\n getNativeSelection(win).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 getNativeSelection(win).each(function (selection) {\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 };\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 = SimSelection.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 Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset));\n } else {\n return Optional.none();\n }\n };\n var doGetExact = function (selection) {\n if (selection.anchorNode === null || selection.focusNode === null) {\n return readRange(selection);\n } else {\n var anchor = SugarElement.fromDom(selection.anchorNode);\n var focus_1 = SugarElement.fromDom(selection.focusNode);\n return after$2(anchor, selection.anchorOffset, focus_1, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus_1, selection.focusOffset)) : readRange(selection);\n }\n };\n var setToElement = function (win, element, selectNodeContents$1) {\n if (selectNodeContents$1 === void 0) {\n selectNodeContents$1 = true;\n }\n var rngGetter = selectNodeContents$1 ? selectNodeContents : selectNode;\n var rng = rngGetter(win, element);\n doSetNativeRange(win, rng);\n };\n var getExact = function (win) {\n return getNativeSelection(win).filter(function (sel) {\n return sel.rangeCount > 0;\n }).bind(doGetExact);\n };\n var get$1 = function (win) {\n return getExact(win).map(function (range) {\n return SimSelection.exact(range.start, range.soffset, range.finish, range.foffset);\n });\n };\n var getFirstRect = function (win, selection) {\n var rng = asLtrRange(win, selection);\n return getFirstRect$1(rng);\n };\n var getAtPoint = function (win, x, y) {\n return fromPoint(win, x, y);\n };\n var clear = function (win) {\n getNativeSelection(win).each(function (selection) {\n return selection.removeAllRanges();\n });\n };\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.util.VK');\n\n var forward = function (editor, isRoot, cell) {\n return go$1(editor, isRoot, next(cell, isEditable$1));\n };\n var backward = function (editor, isRoot, cell) {\n return go$1(editor, isRoot, prev(cell, isEditable$1));\n };\n var getCellFirstCursorPosition = function (editor, cell) {\n var selection = SimSelection.exact(cell, 0, cell, 0);\n return toNative(selection);\n };\n var go$1 = function (editor, isRoot, cell) {\n return cell.fold(Optional.none, Optional.none, function (current, next) {\n return first(next).map(function (cell) {\n return getCellFirstCursorPosition(editor, cell);\n });\n }, function (current) {\n editor.execCommand('mceTableInsertRowAfter');\n return forward(editor, isRoot, current);\n });\n };\n var rootElements = [\n 'table',\n 'li',\n 'dl'\n ];\n var handle$1 = function (event, editor, cellSelection) {\n if (event.keyCode === global$1.TAB) {\n var body_1 = getBody(editor);\n var isRoot_1 = function (element) {\n var name$1 = name(element);\n return eq$1(element, body_1) || contains$2(rootElements, name$1);\n };\n var rng = editor.selection.getRng();\n var container = SugarElement.fromDom(event.shiftKey ? rng.startContainer : rng.endContainer);\n cell(container, isRoot_1).each(function (cell) {\n event.preventDefault();\n table(cell, isRoot_1).each(cellSelection.clear);\n editor.selection.collapse(event.shiftKey);\n var navigation = event.shiftKey ? backward : forward;\n var rng = navigation(editor, isRoot_1, cell);\n rng.each(function (range) {\n editor.selection.setRng(range);\n });\n });\n }\n };\n\n var create$1 = function (selection, kill) {\n return {\n selection: selection,\n kill: kill\n };\n };\n var Response = { create: create$1 };\n\n var create = function (start, soffset, finish, foffset) {\n return {\n start: Situ.on(start, soffset),\n finish: Situ.on(finish, foffset)\n };\n };\n var Situs = { create: create };\n\n var convertToRange = function (win, selection) {\n var rng = asLtrRange(win, selection);\n return SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset);\n };\n var makeSitus = Situs.create;\n\n var sync = function (container, isRoot, start, soffset, finish, foffset, selectRange) {\n if (!(eq$1(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(container, isRoot, s, f, selectRange);\n });\n });\n } else {\n return Optional.none();\n }\n };\n var detect = function (container, isRoot, start, finish, selectRange) {\n if (!eq$1(start, finish)) {\n return identify(start, finish, isRoot).bind(function (cellSel) {\n var boxes = cellSel.boxes.getOr([]);\n if (boxes.length > 1) {\n selectRange(container, boxes, cellSel.start, cellSel.finish);\n return Optional.some(Response.create(Optional.some(makeSitus(start, 0, start, getEnd(start))), true));\n } else {\n return Optional.none();\n }\n });\n } else {\n return Optional.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 shiftSelection(selected, rows, columns, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(updateSelection);\n };\n\n var traverse = function (item, mode) {\n return {\n item: item,\n mode: mode\n };\n };\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: Optional.none()\n },\n {\n current: sidestep,\n next: advance,\n fallback: Optional.some(backtrack)\n },\n {\n current: advance,\n next: advance,\n fallback: Optional.some(sidestep)\n }\n ];\n var go = function (universe, item, mode, direction, rules) {\n if (rules === void 0) {\n rules = successors;\n }\n var ruleOpt = find$1(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(universe, item, fb, direction);\n });\n });\n });\n };\n\n var left$1 = function () {\n var sibling = function (universe, item) {\n return universe.query().prevSibling(item);\n };\n var first = function (children) {\n return children.length > 0 ? Optional.some(children[children.length - 1]) : Optional.none();\n };\n return {\n sibling: sibling,\n first: first\n };\n };\n var right$1 = function () {\n var sibling = function (universe, item) {\n return universe.query().nextSibling(item);\n };\n var first = function (children) {\n return children.length > 0 ? Optional.some(children[0]) : Optional.none();\n };\n return {\n sibling: sibling,\n first: first\n };\n };\n var Walkers = {\n left: left$1,\n right: right$1\n };\n\n var hone = function (universe, item, predicate, mode, direction, isRoot) {\n var next = go(universe, item, mode, direction);\n return next.bind(function (n) {\n if (isRoot(n.item)) {\n return Optional.none();\n } else {\n return predicate(n.item) ? Optional.some(n.item) : hone(universe, n.item, predicate, n.mode, direction, isRoot);\n }\n });\n };\n var left = function (universe, item, predicate, isRoot) {\n return hone(universe, item, predicate, sidestep, Walkers.left(), isRoot);\n };\n var right = 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$1 = function (universe, item, isRoot) {\n return seekLeft$1(universe, item, isLeaf(universe), isRoot);\n };\n var after$1 = function (universe, item, isRoot) {\n return seekRight$1(universe, item, isLeaf(universe), isRoot);\n };\n var seekLeft$1 = left;\n var seekRight$1 = right;\n\n var universe = DomUniverse();\n var before = function (element, isRoot) {\n return before$1(universe, element, isRoot);\n };\n var after = function (element, isRoot) {\n return after$1(universe, element, isRoot);\n };\n var seekLeft = function (element, predicate, isRoot) {\n return seekLeft$1(universe, element, predicate, isRoot);\n };\n var seekRight = function (element, predicate, isRoot) {\n return seekRight$1(universe, element, predicate, isRoot);\n };\n\n var ancestor = function (scope, predicate, isRoot) {\n return ancestor$2(scope, predicate, isRoot).isSome();\n };\n\n var adt$1 = 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$1(afterCell, beforeCell)) {\n return sharedOne(isRow, [\n afterCell,\n beforeCell\n ]).fold(function () {\n return isOverlapping(bridge, beforeCell, afterCell) ? adt$1.success() : failure(beforeCell);\n }, function (_sharedRow) {\n return failure(beforeCell);\n });\n } else {\n return eq$1(after, afterCell) && getEnd(afterCell) === afterOffset ? failure(beforeCell) : adt$1.none('in same cell');\n }\n });\n }).getOr(adt$1.none('default'));\n };\n var cata = function (subject, onNone, onSuccess, onFailedUp, onFailedDown) {\n return subject.fold(onNone, onSuccess, onFailedUp, onFailedDown);\n };\n var BeforeAfter = __assign(__assign({}, adt$1), {\n verify: verify,\n cata: cata\n });\n\n var inParent = function (parent, children, element, index) {\n return {\n parent: parent,\n children: children,\n element: element,\n index: index\n };\n };\n var indexInParent = function (element) {\n return parent(element).bind(function (parent) {\n var children = children$3(parent);\n return indexOf(children, element).map(function (index) {\n return inParent(parent, children, element, index);\n });\n });\n };\n var indexOf = function (elements, element) {\n return findIndex(elements, curry(eq$1, 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$9(target).trim().length === 0 ? gatherer(target, gather, isRoot) : Optional.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$3(element, offset).filter(isBr).orThunk(function () {\n return child$3(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: tgt,\n finish: tgt\n };\n });\n };\n var process = function (analysis) {\n return BeforeAfter.cata(analysis, function (_message) {\n return Optional.none();\n }, function () {\n return Optional.none();\n }, function (cell) {\n return Optional.some(point(cell, 0));\n }, function (cell) {\n return Optional.some(point(cell, getEnd(cell)));\n });\n };\n\n var moveDown = function (caret, amount) {\n return {\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 {\n left: caret.left,\n top: caret.top - amount,\n right: caret.right,\n bottom: caret.bottom - amount\n };\n };\n var translate = function (caret, xDelta, yDelta) {\n return {\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 = function (caret) {\n return caret.top;\n };\n var getBottom = function (caret) {\n return caret.bottom;\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 Optional.none();\n };\n var toCaret = function (rect) {\n return {\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 Optional.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 Optional.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 Optional.none();\n }\n };\n\n var JUMP_SIZE = 5;\n var NUM_RETRIES = 100;\n var adt = 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$2(element, isBlock).fold(never, function (cell) {\n return 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 = moveDown(caret, JUMP_SIZE);\n if (Math.abs(guessBox.bottom - original.bottom) < 1) {\n return adt.retry(lowerCaret);\n } else if (guessBox.top > caret.bottom) {\n return adt.retry(lowerCaret);\n } else if (guessBox.top === caret.bottom) {\n return adt.retry(moveDown(caret, 1));\n } else {\n return inOutsideBlock(bridge, element, caret) ? adt.retry(translate(lowerCaret, JUMP_SIZE, 0)) : adt.none();\n }\n };\n var adjustUp = function (bridge, element, guessBox, original, caret) {\n var higherCaret = moveUp(caret, JUMP_SIZE);\n if (Math.abs(guessBox.top - original.top) < 1) {\n return adt.retry(higherCaret);\n } else if (guessBox.bottom < caret.top) {\n return adt.retry(higherCaret);\n } else if (guessBox.bottom === caret.top) {\n return adt.retry(moveUp(caret, 1));\n } else {\n return inOutsideBlock(bridge, element, caret) ? adt.retry(translate(higherCaret, JUMP_SIZE, 0)) : adt.none();\n }\n };\n var upMovement = {\n point: getTop,\n adjuster: adjustUp,\n move: moveUp,\n gather: before\n };\n var downMovement = {\n point: getBottom,\n adjuster: adjustDown,\n move: moveDown,\n gather: after\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 Optional.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(Optional.none, function (element) {\n return getEntireBox(bridge, element).bind(function (guessBox) {\n return movement.adjuster(bridge, element, guessBox, original, caret).fold(Optional.none, function (newCaret) {\n return adjustTil(bridge, movement, original, newCaret, numRetries - 1);\n });\n }).orThunk(function () {\n return Optional.some(caret);\n });\n }, Optional.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 Optional.some(movement.point(adjusted) - bridge.getInnerHeight());\n } else if (movement.point(adjusted) < 0) {\n return Optional.some(-movement.point(adjusted));\n } else {\n return Optional.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 findSpot = function (bridge, isRoot, direction) {\n return bridge.getSelection().bind(function (sel) {\n return tryBr(isRoot, sel.finish, sel.foffset, direction).fold(function () {\n return Optional.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 process(analysis);\n });\n });\n };\n var scan = function (bridge, isRoot, element, offset, direction, numRetries) {\n if (numRetries === 0) {\n return Optional.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 Optional.none();\n }, function () {\n return Optional.some(situs);\n }, function (cell) {\n if (eq$1(element, cell) && offset === 0) {\n return tryAgain(bridge, element, offset, moveUp, direction);\n } else {\n return scan(bridge, isRoot, cell, 0, direction, numRetries - 1);\n }\n }, function (cell) {\n if (eq$1(element, cell) && offset === getEnd(cell)) {\n return tryAgain(bridge, element, offset, moveDown, direction);\n } else {\n return scan(bridge, isRoot, cell, getEnd(cell), direction, numRetries - 1);\n }\n });\n });\n };\n var tryAgain = function (bridge, element, offset, move, direction) {\n return 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 var browser = detect$3().browser;\n if (browser.isChrome() || browser.isSafari() || browser.isFirefox() || browser.isEdge()) {\n return direction.otherRetry(bridge, box);\n } else if (browser.isIE()) {\n return direction.ieRetry(bridge, box);\n } else {\n return Optional.none();\n }\n };\n var tryCursor = function (bridge, isRoot, element, offset, direction) {\n return getBoxAt(bridge, element, offset).bind(function (box) {\n return tryAt(bridge, direction, box);\n });\n };\n var handle = function (bridge, isRoot, direction) {\n return findSpot(bridge, isRoot, direction).bind(function (spot) {\n return scan(bridge, isRoot, spot.element, spot.offset, direction, MAX_RETRIES).map(bridge.fromSitus);\n });\n };\n\n var inSameTable = function (elem, table) {\n return ancestor(elem, function (e) {\n return parent(e).exists(function (p) {\n return eq$1(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 Optional.none();\n }\n return handle(bridge, isRoot, direction).bind(function (range) {\n return closest$1(range.finish, 'td,th', isRoot).map(function (finish) {\n return {\n start: start,\n finish: finish,\n range: range\n };\n });\n });\n });\n });\n };\n var navigate = function (bridge, isRoot, direction, initial, anchor, precheck) {\n if (detect$3().browser.isIE()) {\n return Optional.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(Optional.some(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(table, 'tr');\n if (eq$1(startRow, rows[0])) {\n return seekLeft(table, function (element) {\n return last$1(element).isSome();\n }, isRoot).map(function (last) {\n var lastOffset = getEnd(last);\n return Response.create(Optional.some(makeSitus(last, lastOffset, last, lastOffset)), true);\n });\n } else {\n return Optional.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(table, 'tr');\n if (eq$1(startRow, rows[rows.length - 1])) {\n return seekRight(table, function (element) {\n return first(element).isSome();\n }, isRoot).map(function (first) {\n return Response.create(Optional.some(makeSitus(first, 0, first, 0)), true);\n });\n } else {\n return Optional.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 detect(container, isRoot, info.start, info.finish, selectRange);\n });\n };\n\n var findCell = function (target, isRoot) {\n return closest$1(target, 'td,th', isRoot);\n };\n var MouseSelection = function (bridge, container, isRoot, annotations) {\n var cursor = value();\n var clearstate = cursor.clear;\n var applySelection = function (event) {\n cursor.on(function (start) {\n annotations.clearBeforeUpdate(container);\n findCell(event.target, isRoot).each(function (finish) {\n identify(start, finish, isRoot).each(function (cellSel) {\n var boxes = cellSel.boxes.getOr([]);\n if (boxes.length === 1) {\n var singleCell = boxes[0];\n var isNonEditableCell = getRaw(singleCell) === 'false';\n var isCellClosestContentEditable = is(closest(event.target), singleCell, eq$1);\n if (isNonEditableCell && isCellClosestContentEditable) {\n annotations.selectRange(container, boxes, singleCell, singleCell);\n bridge.selectContents(singleCell);\n }\n } else if (boxes.length > 1) {\n annotations.selectRange(container, boxes, cellSel.start, cellSel.finish);\n bridge.selectContents(finish);\n }\n });\n });\n });\n };\n var mousedown = function (event) {\n annotations.clear(container);\n findCell(event.target, isRoot).each(cursor.set);\n };\n var mouseover = function (event) {\n applySelection(event);\n };\n var mouseup = function (event) {\n applySelection(event);\n clearstate();\n };\n return {\n clearstate: clearstate,\n mousedown: mousedown,\n mouseover: mouseover,\n mouseup: mouseup\n };\n };\n\n var down = {\n traverse: nextSibling,\n gather: after,\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,\n relative: Situ.before,\n otherRetry: Retries.tryUp,\n ieRetry: Retries.ieTryUp,\n failure: BeforeAfter.failedUp\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 ltr = {\n isBackward: isKey(37),\n isForward: isKey(39)\n };\n var rtl = {\n isBackward: isKey(39),\n isForward: isKey(37)\n };\n\n var get = function (_DOC) {\n var doc = _DOC !== undefined ? _DOC.dom : document;\n var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n var y = doc.body.scrollTop || doc.documentElement.scrollTop;\n return SugarPosition(x, y);\n };\n var by = function (x, y, _DOC) {\n var doc = _DOC !== undefined ? _DOC.dom : document;\n var win = doc.defaultView;\n if (win) {\n win.scrollBy(x, y);\n }\n };\n\n var WindowBridge = function (win) {\n var elementFromPoint = function (x, y) {\n return SugarElement.fromPoint(SugarElement.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 = SimSelection.exact(start, soffset, finish, foffset);\n return getFirstRect(win, sel);\n };\n var getSelection = function () {\n return get$1(win).map(function (exactAdt) {\n return convertToRange(win, exactAdt);\n });\n };\n var fromSitus = function (situs) {\n var relative = SimSelection.relative(situs.start, situs.finish);\n return 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$1(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 selectNode = function (element) {\n setToElement(win, element, false);\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(SugarElement.fromDom(win.document));\n return pos.top;\n };\n var scrollBy = function (x, y) {\n by(x, y, SugarElement.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 selectNode: selectNode,\n selectContents: selectContents,\n getInnerHeight: getInnerHeight,\n getScrollY: getScrollY,\n scrollBy: scrollBy\n };\n };\n\n var rc = function (rows, cols) {\n return {\n rows: rows,\n cols: cols\n };\n };\n var mouse = function (win, container, isRoot, annotations) {\n var bridge = WindowBridge(win);\n var handlers = MouseSelection(bridge, container, isRoot, annotations);\n return {\n clearstate: handlers.clearstate,\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 Optional.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 = retrieve$1(container, annotations.selectedSelector).fold(function () {\n if (isNavigation(keycode) && !shiftKey) {\n annotations.clearBeforeUpdate(container);\n }\n if (isDown(keycode) && shiftKey) {\n return curry(select, bridge, container, isRoot, down, finish, start, annotations.selectRange);\n } else if (isUp(keycode) && shiftKey) {\n return curry(select, bridge, container, isRoot, up, finish, start, annotations.selectRange);\n } else if (isDown(keycode)) {\n return curry(navigate, bridge, isRoot, down, finish, start, lastDownCheck);\n } else if (isUp(keycode)) {\n return curry(navigate, bridge, isRoot, up, finish, start, firstUpCheck);\n } else {\n return Optional.none;\n }\n }, function (selected) {\n var update$1 = function (attempts) {\n return function () {\n var navigation = findMap(attempts, function (delta) {\n return update(delta.rows, delta.cols, container, selected, annotations);\n });\n return navigation.fold(function () {\n return getEdges(container, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(function (edges) {\n var relative = 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(Optional.none(), true);\n });\n }, function (_) {\n return Optional.some(Response.create(Optional.none(), true));\n });\n };\n };\n if (isDown(keycode) && shiftKey) {\n return update$1([rc(+1, 0)]);\n } else if (isUp(keycode) && shiftKey) {\n return update$1([rc(-1, 0)]);\n } else if (direction.isBackward(keycode) && shiftKey) {\n return update$1([\n rc(0, -1),\n rc(-1, 0)\n ]);\n } else if (direction.isForward(keycode) && shiftKey) {\n return update$1([\n rc(0, +1),\n rc(+1, 0)\n ]);\n } else if (isNavigation(keycode) && !shiftKey) {\n return clearToNavigate;\n } else {\n return Optional.none;\n }\n });\n return handler();\n };\n var keyup = function (event, start, soffset, finish, foffset) {\n return retrieve$1(container, annotations.selectedSelector).fold(function () {\n var realEvent = event.raw;\n var keycode = realEvent.which;\n var shiftKey = realEvent.shiftKey === true;\n if (!shiftKey) {\n return Optional.none();\n }\n if (isNavigation(keycode)) {\n return sync(container, isRoot, start, soffset, finish, foffset, annotations.selectRange);\n } else {\n return Optional.none();\n }\n }, Optional.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 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\n var remove = function (element, classes) {\n each$2(classes, function (x) {\n remove$2(element, x);\n });\n };\n\n var addClass = function (clazz) {\n return function (element) {\n add(element, clazz);\n };\n };\n var removeClasses = function (classes) {\n return function (element) {\n remove(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(container, ephemera.selectedSelector);\n each$2(sels, removeSelectionClasses);\n };\n var selectRange = function (container, cells, start, finish) {\n clear(container);\n each$2(cells, addSelectionClass);\n add(start, ephemera.firstSelected);\n add(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$7(element, ephemera.selected);\n remove$7(element, ephemera.firstSelected);\n remove$7(element, ephemera.lastSelected);\n };\n var addSelectionAttribute = function (element) {\n set$2(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(container, ephemera.selectedSelector + ',' + ephemera.firstSelectedSelector + ',' + ephemera.lastSelectedSelector);\n each$2(sels, removeSelectionAttributes);\n };\n var selectRange = function (container, cells, start, finish) {\n clear(container);\n each$2(cells, addSelectionAttribute);\n set$2(start, ephemera.firstSelected, '1');\n set$2(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) {\n var upGrid = grid.slice(0, selectedCells[selectedCells.length - 1].row + 1);\n var upDetails = toDetailList(upGrid);\n return bind$2(upDetails, function (detail) {\n var slicedCells = detail.cells.slice(0, selectedCells[selectedCells.length - 1].column + 1);\n return map$1(slicedCells, function (cell) {\n return cell.element;\n });\n });\n };\n var getDownOrRightCells = function (grid, selectedCells) {\n var downGrid = grid.slice(selectedCells[0].row + selectedCells[0].rowspan - 1, grid.length);\n var downDetails = toDetailList(downGrid);\n return bind$2(downDetails, function (detail) {\n var slicedCells = detail.cells.slice(selectedCells[0].column + selectedCells[0].colspan - 1, detail.cells.length);\n return map$1(slicedCells, function (cell) {\n return cell.element;\n });\n });\n };\n var getOtherCells = function (table, target, generators) {\n var warehouse = Warehouse.fromTable(table);\n var details = onCells(warehouse, target);\n return details.map(function (selectedCells) {\n var grid = toGrid(warehouse, generators, false);\n var upOrLeftCells = getUpOrLeftCells(grid, selectedCells);\n var downOrRightCells = getDownOrRightCells(grid, selectedCells);\n return {\n upOrLeftCells: upOrLeftCells,\n downOrRightCells: downOrRightCells\n };\n });\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.Env');\n\n var hasInternalTarget = function (e) {\n return has(SugarElement.fromDom(e.target), 'ephox-snooker-resizer-bar') === false;\n };\n function CellSelection (editor, lazyResize, selectionTargets) {\n var onSelection = function (cells, start, finish) {\n selectionTargets.targets().each(function (targets) {\n var tableOpt = table(start);\n tableOpt.each(function (table) {\n var cloneFormats = getCloneElements(editor);\n var generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), cloneFormats);\n var otherCells = getOtherCells(table, targets, generators);\n fireTableSelectionChange(editor, cells, start, finish, otherCells);\n });\n });\n };\n var onClear = function () {\n return 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(editor);\n var isRoot = getIsRoot(editor);\n var syncSelection = function () {\n var sel = editor.selection;\n var start = SugarElement.fromDom(sel.getStart());\n var end = SugarElement.fromDom(sel.getEnd());\n var shared = sharedOne(table, [\n start,\n end\n ]);\n shared.fold(function () {\n return annotations.clear(body);\n }, noop);\n };\n var mouseHandlers = mouse(win, body, isRoot, annotations);\n var keyHandlers = keyboard(win, body, isRoot, annotations);\n var external$1 = external(win, body, isRoot, annotations);\n var hasShiftKey = function (event) {\n return event.raw.shiftKey === true;\n };\n editor.on('TableSelectorChange', function (e) {\n return external$1(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 = SimSelection.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(event);\n if (wrappedEvent.raw.shiftKey && isNavigation(wrappedEvent.raw.which)) {\n var rng = editor.selection.getRng();\n var start = SugarElement.fromDom(rng.startContainer);\n var end = SugarElement.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(event);\n lazyResize().each(function (resize) {\n return resize.hideBars();\n });\n var rng = editor.selection.getRng();\n var start = SugarElement.fromDom(rng.startContainer);\n var end = SugarElement.fromDom(rng.endContainer);\n var direction = onDirection(ltr, rtl)(SugarElement.fromDom(editor.selection.getStart()));\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 return 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.browser.isEdge() && raw.buttons === 0) {\n return true;\n }\n return (raw.buttons & 1) !== 0;\n };\n var dragStart = function (_e) {\n mouseHandlers.clearstate();\n };\n var mouseDown = function (e) {\n if (isLeftMouse(e) && hasInternalTarget(e)) {\n mouseHandlers.mousedown(fromRawEvent(e));\n }\n };\n var mouseOver = function (e) {\n if (isLeftButtonPressed(e) && hasInternalTarget(e)) {\n mouseHandlers.mouseover(fromRawEvent(e));\n }\n };\n var mouseUp = function (e) {\n if (isLeftMouse(e) && hasInternalTarget(e)) {\n mouseHandlers.mouseup(fromRawEvent(e));\n }\n };\n var getDoubleTap = function () {\n var lastTarget = Cell(SugarElement.fromDom(body));\n var lastTimeStamp = Cell(0);\n var touchEnd = function (t) {\n var target = SugarElement.fromDom(t.target);\n if (name(target) === 'td' || name(target) === 'th') {\n var lT = lastTarget.get();\n var lTS = lastTimeStamp.get();\n if (eq$1(lT, target) && t.timeStamp - lTS < 300) {\n t.preventDefault();\n external$1(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('dragstart', dragStart);\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 });\n return { clear: annotations.clear };\n }\n\n var child = function (scope, selector) {\n return child$1(scope, selector).isSome();\n };\n\n var getSelectionTargets = function (editor, selections) {\n var targets = Cell(Optional.none());\n var changeHandlers = Cell([]);\n var selectionDetails = Optional.none();\n var isCaption = isTag('caption');\n var isDisabledForSelection = function (key) {\n return selectionDetails.forall(function (details) {\n return !details[key];\n });\n };\n var getStart = function () {\n return getSelectionCellOrCaption(getSelectionStart(editor), getIsRoot(editor));\n };\n var getEnd = function () {\n return getSelectionCellOrCaption(getSelectionEnd(editor), getIsRoot(editor));\n };\n var findTargets = function () {\n return getStart().bind(function (startCellOrCaption) {\n return flatten(lift2(table(startCellOrCaption), getEnd().bind(table), function (startTable, endTable) {\n if (eq$1(startTable, endTable)) {\n if (isCaption(startCellOrCaption)) {\n return Optional.some(noMenu(startCellOrCaption));\n } else {\n return Optional.some(forMenu(selections, startTable, startCellOrCaption));\n }\n }\n return Optional.none();\n }));\n });\n };\n var getExtractedDetails = function (targets) {\n var tableOpt = table(targets.element);\n return tableOpt.map(function (table) {\n var warehouse = Warehouse.fromTable(table);\n var selectedCells = onCells(warehouse, targets).getOr([]);\n var locked = foldl(selectedCells, function (acc, cell) {\n if (cell.isLocked) {\n acc.onAny = true;\n if (cell.column === 0) {\n acc.onFirst = true;\n } else if (cell.column + cell.colspan >= warehouse.grid.columns) {\n acc.onLast = true;\n }\n }\n return acc;\n }, {\n onAny: false,\n onFirst: false,\n onLast: false\n });\n return {\n mergeable: onUnlockedMergable(warehouse, targets).isSome(),\n unmergeable: onUnlockedUnmergable(warehouse, targets).isSome(),\n locked: locked\n };\n });\n };\n var resetTargets = function () {\n targets.set(cached(findTargets)());\n selectionDetails = targets.get().bind(getExtractedDetails);\n each$2(changeHandlers.get(), function (handler) {\n return handler();\n });\n };\n var setupHandler = function (handler) {\n handler();\n changeHandlers.set(changeHandlers.get().concat([handler]));\n return function () {\n changeHandlers.set(filter$2(changeHandlers.get(), function (h) {\n return h !== handler;\n }));\n };\n };\n var onSetup = function (api, isDisabled) {\n return setupHandler(function () {\n return targets.get().fold(function () {\n api.setDisabled(true);\n }, function (targets) {\n api.setDisabled(isDisabled(targets));\n });\n });\n };\n var onSetupWithToggle = function (api, isDisabled, isActive) {\n return setupHandler(function () {\n return targets.get().fold(function () {\n api.setDisabled(true);\n api.setActive(false);\n }, function (targets) {\n api.setDisabled(isDisabled(targets));\n api.setActive(isActive(targets));\n });\n });\n };\n var isDisabledFromLocked = function (lockedDisable) {\n return selectionDetails.exists(function (details) {\n return details.locked[lockedDisable];\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 isCaption(targets.element);\n });\n };\n var onSetupColumn = function (lockedDisable) {\n return function (api) {\n return onSetup(api, function (targets) {\n return isCaption(targets.element) || isDisabledFromLocked(lockedDisable);\n });\n };\n };\n var onSetupPasteable = function (getClipboardData) {\n return function (api) {\n return onSetup(api, function (targets) {\n return isCaption(targets.element) || getClipboardData().isNone();\n });\n };\n };\n var onSetupPasteableColumn = function (getClipboardData, lockedDisable) {\n return function (api) {\n return onSetup(api, function (targets) {\n return isCaption(targets.element) || getClipboardData().isNone() || isDisabledFromLocked(lockedDisable);\n });\n };\n };\n var onSetupMergeable = function (api) {\n return onSetup(api, function (_targets) {\n return isDisabledForSelection('mergeable');\n });\n };\n var onSetupUnmergeable = function (api) {\n return onSetup(api, function (_targets) {\n return isDisabledForSelection('unmergeable');\n });\n };\n var onSetupTableWithCaption = function (api) {\n return onSetupWithToggle(api, never, function (targets) {\n var tableOpt = table(targets.element, getIsRoot(editor));\n return tableOpt.exists(function (table) {\n return child(table, 'caption');\n });\n });\n };\n var onSetupTableHeaders = function (command, headerType) {\n return function (api) {\n return onSetupWithToggle(api, function (targets) {\n return isCaption(targets.element);\n }, function () {\n return editor.queryCommandValue(command) === headerType;\n });\n };\n };\n var onSetupTableRowHeaders = onSetupTableHeaders('mceTableRowType', 'header');\n var onSetupTableColumnHeaders = onSetupTableHeaders('mceTableColType', 'th');\n editor.on('NodeChange ExecCommand TableSelectorChange', resetTargets);\n return {\n onSetupTable: onSetupTable,\n onSetupCellOrRow: onSetupCellOrRow,\n onSetupColumn: onSetupColumn,\n onSetupPasteable: onSetupPasteable,\n onSetupPasteableColumn: onSetupPasteableColumn,\n onSetupMergeable: onSetupMergeable,\n onSetupUnmergeable: onSetupUnmergeable,\n resetTargets: resetTargets,\n onSetupTableWithCaption: onSetupTableWithCaption,\n onSetupTableRowHeaders: onSetupTableRowHeaders,\n onSetupTableColumnHeaders: onSetupTableColumnHeaders,\n targets: targets.get\n };\n };\n\n var addButtons = function (editor, selections, selectionTargets, clipboard) {\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.onSetupColumn('onFirst')\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.onSetupColumn('onLast')\n });\n editor.ui.registry.addButton('tabledeletecol', {\n tooltip: 'Delete column',\n onAction: cmd('mceTableDeleteCol'),\n icon: 'table-delete-column',\n onSetup: selectionTargets.onSetupColumn('onAny')\n });\n editor.ui.registry.addButton('tablecutrow', {\n tooltip: 'Cut row',\n icon: 'cut-row',\n onAction: cmd('mceTableCutRow'),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addButton('tablecopyrow', {\n tooltip: 'Copy row',\n icon: 'duplicate-row',\n onAction: cmd('mceTableCopyRow'),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addButton('tablepasterowbefore', {\n tooltip: 'Paste row before',\n icon: 'paste-row-before',\n onAction: cmd('mceTablePasteRowBefore'),\n onSetup: selectionTargets.onSetupPasteable(clipboard.getRows)\n });\n editor.ui.registry.addButton('tablepasterowafter', {\n tooltip: 'Paste row after',\n icon: 'paste-row-after',\n onAction: cmd('mceTablePasteRowAfter'),\n onSetup: selectionTargets.onSetupPasteable(clipboard.getRows)\n });\n editor.ui.registry.addButton('tablecutcol', {\n tooltip: 'Cut column',\n icon: 'cut-column',\n onAction: cmd('mceTableCutCol'),\n onSetup: selectionTargets.onSetupColumn('onAny')\n });\n editor.ui.registry.addButton('tablecopycol', {\n tooltip: 'Copy column',\n icon: 'duplicate-column',\n onAction: cmd('mceTableCopyCol'),\n onSetup: selectionTargets.onSetupColumn('onAny')\n });\n editor.ui.registry.addButton('tablepastecolbefore', {\n tooltip: 'Paste column before',\n icon: 'paste-column-before',\n onAction: cmd('mceTablePasteColBefore'),\n onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onFirst')\n });\n editor.ui.registry.addButton('tablepastecolafter', {\n tooltip: 'Paste column after',\n icon: 'paste-column-after',\n onAction: cmd('mceTablePasteColAfter'),\n onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onLast')\n });\n editor.ui.registry.addButton('tableinsertdialog', {\n tooltip: 'Insert table',\n onAction: cmd('mceInsertTable'),\n icon: 'table'\n });\n var tableClassList = filterNoneItem(getTableClassList(editor));\n if (tableClassList.length !== 0) {\n editor.ui.registry.addMenuButton('tableclass', {\n icon: 'table-classes',\n tooltip: 'Table styles',\n fetch: generateMenuItemsCallback(editor, selections, tableClassList, 'tableclass', function (value) {\n return editor.execCommand('mceTableToggleClass', false, value);\n }),\n onSetup: selectionTargets.onSetupTable\n });\n }\n var tableCellClassList = filterNoneItem(getCellClassList(editor));\n if (tableCellClassList.length !== 0) {\n editor.ui.registry.addMenuButton('tablecellclass', {\n icon: 'table-cell-classes',\n tooltip: 'Cell styles',\n fetch: generateMenuItemsCallback(editor, selections, tableCellClassList, 'tablecellclass', function (value) {\n return editor.execCommand('mceTableCellToggleClass', false, value);\n }),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n }\n editor.ui.registry.addMenuButton('tablecellvalign', {\n icon: 'vertical-align',\n tooltip: 'Vertical align',\n fetch: generateMenuItemsCallback(editor, selections, verticalAlignValues, 'tablecellverticalalign', applyTableCellStyle(editor, 'vertical-align')),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuButton('tablecellborderwidth', {\n icon: 'border-width',\n tooltip: 'Border width',\n fetch: generateMenuItemsCallback(editor, selections, getTableBorderWidths(editor), 'tablecellborderwidth', applyTableCellStyle(editor, 'border-width')),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuButton('tablecellborderstyle', {\n icon: 'border-style',\n tooltip: 'Border style',\n fetch: generateMenuItemsCallback(editor, selections, getTableBorderStyles(editor), 'tablecellborderstyle', applyTableCellStyle(editor, 'border-style')),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addToggleButton('tablecaption', {\n tooltip: 'Table caption',\n onAction: cmd('mceTableToggleCaption'),\n icon: 'table-caption',\n onSetup: selectionTargets.onSetupTableWithCaption\n });\n editor.ui.registry.addMenuButton('tablecellbackgroundcolor', {\n icon: 'cell-background-color',\n tooltip: 'Background color',\n fetch: function (callback) {\n return callback(buildColorMenu(editor, getTableBackgroundColorMap(editor), 'background-color'));\n },\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuButton('tablecellbordercolor', {\n icon: 'cell-border-color',\n tooltip: 'Border color',\n fetch: function (callback) {\n return callback(buildColorMenu(editor, getTableBorderColorMap(editor), 'border-color'));\n },\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addToggleButton('tablerowheader', {\n tooltip: 'Row header',\n icon: 'table-top-header',\n onAction: changeRowHeader(editor),\n onSetup: selectionTargets.onSetupTableRowHeaders\n });\n editor.ui.registry.addToggleButton('tablecolheader', {\n tooltip: 'Column header',\n icon: 'table-left-header',\n onAction: changeColumnHeader(editor),\n onSetup: selectionTargets.onSetupTableColumnHeaders\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\n var addMenuItems = function (editor, selections, selectionTargets, clipboard) {\n var cmd = function (command) {\n return function () {\n return editor.execCommand(command);\n };\n };\n var insertTableAction = function (data) {\n editor.execCommand('mceInsertTable', false, {\n rows: data.numRows,\n columns: data.numColumns\n });\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 editor.ui.registry.addMenuItem('tableinsertrowbefore', {\n text: 'Insert row before',\n icon: 'table-insert-row-above',\n onAction: cmd('mceTableInsertRowBefore'),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuItem('tableinsertrowafter', {\n text: 'Insert row after',\n icon: 'table-insert-row-after',\n onAction: cmd('mceTableInsertRowAfter'),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuItem('tabledeleterow', {\n text: 'Delete row',\n icon: 'table-delete-row',\n onAction: cmd('mceTableDeleteRow'),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuItem('tablerowprops', {\n text: 'Row properties',\n icon: 'table-row-properties',\n onAction: cmd('mceTableRowProps'),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuItem('tablecutrow', {\n text: 'Cut row',\n icon: 'cut-row',\n onAction: cmd('mceTableCutRow'),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuItem('tablecopyrow', {\n text: 'Copy row',\n icon: 'duplicate-row',\n onAction: cmd('mceTableCopyRow'),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuItem('tablepasterowbefore', {\n text: 'Paste row before',\n icon: 'paste-row-before',\n onAction: cmd('mceTablePasteRowBefore'),\n onSetup: selectionTargets.onSetupPasteable(clipboard.getRows)\n });\n editor.ui.registry.addMenuItem('tablepasterowafter', {\n text: 'Paste row after',\n icon: 'paste-row-after',\n onAction: cmd('mceTablePasteRowAfter'),\n onSetup: selectionTargets.onSetupPasteable(clipboard.getRows)\n });\n var row = {\n type: 'nestedmenuitem',\n text: 'Row',\n getSubmenuItems: constant('tableinsertrowbefore tableinsertrowafter tabledeleterow tablerowprops | tablecutrow tablecopyrow tablepasterowbefore tablepasterowafter')\n };\n editor.ui.registry.addMenuItem('tableinsertcolumnbefore', {\n text: 'Insert column before',\n icon: 'table-insert-column-before',\n onAction: cmd('mceTableInsertColBefore'),\n onSetup: selectionTargets.onSetupColumn('onFirst')\n });\n editor.ui.registry.addMenuItem('tableinsertcolumnafter', {\n text: 'Insert column after',\n icon: 'table-insert-column-after',\n onAction: cmd('mceTableInsertColAfter'),\n onSetup: selectionTargets.onSetupColumn('onLast')\n });\n editor.ui.registry.addMenuItem('tabledeletecolumn', {\n text: 'Delete column',\n icon: 'table-delete-column',\n onAction: cmd('mceTableDeleteCol'),\n onSetup: selectionTargets.onSetupColumn('onAny')\n });\n editor.ui.registry.addMenuItem('tablecutcolumn', {\n text: 'Cut column',\n icon: 'cut-column',\n onAction: cmd('mceTableCutCol'),\n onSetup: selectionTargets.onSetupColumn('onAny')\n });\n editor.ui.registry.addMenuItem('tablecopycolumn', {\n text: 'Copy column',\n icon: 'duplicate-column',\n onAction: cmd('mceTableCopyCol'),\n onSetup: selectionTargets.onSetupColumn('onAny')\n });\n editor.ui.registry.addMenuItem('tablepastecolumnbefore', {\n text: 'Paste column before',\n icon: 'paste-column-before',\n onAction: cmd('mceTablePasteColBefore'),\n onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onFirst')\n });\n editor.ui.registry.addMenuItem('tablepastecolumnafter', {\n text: 'Paste column after',\n icon: 'paste-column-after',\n onAction: cmd('mceTablePasteColAfter'),\n onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onLast')\n });\n var column = {\n type: 'nestedmenuitem',\n text: 'Column',\n getSubmenuItems: constant('tableinsertcolumnbefore tableinsertcolumnafter tabledeletecolumn | tablecutcolumn tablecopycolumn tablepastecolumnbefore tablepastecolumnafter')\n };\n editor.ui.registry.addMenuItem('tablecellprops', {\n text: 'Cell properties',\n icon: 'table-cell-properties',\n onAction: cmd('mceTableCellProps'),\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addMenuItem('tablemergecells', {\n text: 'Merge cells',\n icon: 'table-merge-cells',\n onAction: cmd('mceTableMergeCells'),\n onSetup: selectionTargets.onSetupMergeable\n });\n editor.ui.registry.addMenuItem('tablesplitcells', {\n text: 'Split cell',\n icon: 'table-split-cells',\n onAction: cmd('mceTableSplitCells'),\n onSetup: selectionTargets.onSetupUnmergeable\n });\n var cell = {\n type: 'nestedmenuitem',\n text: 'Cell',\n getSubmenuItems: constant('tablecellprops tablemergecells tablesplitcells')\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(constant(''), 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 var tableClassList = filterNoneItem(getTableClassList(editor));\n if (tableClassList.length !== 0) {\n editor.ui.registry.addNestedMenuItem('tableclass', {\n icon: 'table-classes',\n text: 'Table styles',\n getSubmenuItems: function () {\n return buildMenuItems(editor, selections, tableClassList, 'tableclass', function (value) {\n return editor.execCommand('mceTableToggleClass', false, value);\n });\n },\n onSetup: selectionTargets.onSetupTable\n });\n }\n var tableCellClassList = filterNoneItem(getCellClassList(editor));\n if (tableCellClassList.length !== 0) {\n editor.ui.registry.addNestedMenuItem('tablecellclass', {\n icon: 'table-cell-classes',\n text: 'Cell styles',\n getSubmenuItems: function () {\n return buildMenuItems(editor, selections, tableCellClassList, 'tablecellclass', function (value) {\n return editor.execCommand('mceTableCellToggleClass', false, value);\n });\n },\n onSetup: selectionTargets.onSetupCellOrRow\n });\n }\n editor.ui.registry.addNestedMenuItem('tablecellvalign', {\n icon: 'vertical-align',\n text: 'Vertical align',\n getSubmenuItems: function () {\n return buildMenuItems(editor, selections, verticalAlignValues, 'tablecellverticalalign', applyTableCellStyle(editor, 'vertical-align'));\n },\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addNestedMenuItem('tablecellborderwidth', {\n icon: 'border-width',\n text: 'Border width',\n getSubmenuItems: function () {\n return buildMenuItems(editor, selections, getTableBorderWidths(editor), 'tablecellborderwidth', applyTableCellStyle(editor, 'border-width'));\n },\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addNestedMenuItem('tablecellborderstyle', {\n icon: 'border-style',\n text: 'Border style',\n getSubmenuItems: function () {\n return buildMenuItems(editor, selections, getTableBorderStyles(editor), 'tablecellborderstyle', applyTableCellStyle(editor, 'border-style'));\n },\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addToggleMenuItem('tablecaption', {\n icon: 'table-caption',\n text: 'Table caption',\n onAction: cmd('mceTableToggleCaption'),\n onSetup: selectionTargets.onSetupTableWithCaption\n });\n editor.ui.registry.addNestedMenuItem('tablecellbackgroundcolor', {\n icon: 'cell-background-color',\n text: 'Background color',\n getSubmenuItems: function () {\n return buildColorMenu(editor, getTableBackgroundColorMap(editor), 'background-color');\n },\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addNestedMenuItem('tablecellbordercolor', {\n icon: 'cell-border-color',\n text: 'Border color',\n getSubmenuItems: function () {\n return buildColorMenu(editor, getTableBorderColorMap(editor), 'border-color');\n },\n onSetup: selectionTargets.onSetupCellOrRow\n });\n editor.ui.registry.addToggleMenuItem('tablerowheader', {\n text: 'Row header',\n icon: 'table-top-header',\n onAction: changeRowHeader(editor),\n onSetup: selectionTargets.onSetupTableRowHeaders\n });\n editor.ui.registry.addToggleMenuItem('tablecolheader', {\n text: 'Column header',\n icon: 'table-left-header',\n onAction: changeColumnHeader(editor),\n onSetup: selectionTargets.onSetupTableColumnHeaders\n });\n };\n\n var Plugin = function (editor) {\n var selections = Selections(function () {\n return getBody(editor);\n }, function () {\n return getSelectionCell(getSelectionStart(editor), getIsRoot(editor));\n }, ephemera.selectedSelector);\n var selectionTargets = getSelectionTargets(editor, selections);\n var resizeHandler = getResizeHandler(editor);\n var cellSelection = CellSelection(editor, resizeHandler.lazyResize, selectionTargets);\n var actions = TableActions(editor, cellSelection, resizeHandler.lazyWire);\n var clipboard = Clipboard();\n registerCommands(editor, actions, cellSelection, selections, clipboard);\n registerQueryCommands(editor, actions, selections);\n registerEvents(editor, selections, actions);\n addMenuItems(editor, selections, selectionTargets, clipboard);\n addButtons(editor, selections, selectionTargets, clipboard);\n addToolbars(editor);\n editor.on('PreInit', function () {\n editor.serializer.addTempAttr(ephemera.firstSelected);\n editor.serializer.addTempAttr(ephemera.lastSelected);\n registerFormats(editor);\n });\n if (hasTabNavigation(editor)) {\n editor.on('keydown', function (e) {\n handle$1(e, editor, cellSelection);\n });\n }\n editor.on('remove', function () {\n resizeHandler.destroy();\n });\n return getApi(editor, clipboard, resizeHandler, selectionTargets);\n };\n function Plugin$1 () {\n global$3.add('table', Plugin);\n }\n\n Plugin$1();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/table/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/visualblocks/index.js": /*!****************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/visualblocks/index.js ***! \****************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"visualblocks\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/visualblocks')\n// ES2015:\n// import 'tinymce/plugins/visualblocks'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/visualblocks/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/visualblocks/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/visualblocks/plugin.js": /*!*****************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/visualblocks/plugin.js ***! \*****************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\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 return {\n get: get,\n set: set\n };\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var fireVisualBlocks = function (editor, state) {\n editor.fire('VisualBlocks', { state: state });\n };\n\n var toggleVisualBlocks = function (editor, pluginUrl, enabledState) {\n var dom = editor.dom;\n dom.toggleClass(editor.getBody(), 'mce-visualblocks');\n enabledState.set(!enabledState.get());\n fireVisualBlocks(editor, enabledState.get());\n };\n\n var register$1 = function (editor, pluginUrl, enabledState) {\n editor.addCommand('mceVisualBlocks', function () {\n toggleVisualBlocks(editor, pluginUrl, enabledState);\n });\n };\n\n var isEnabledByDefault = function (editor) {\n return editor.getParam('visualblocks_default_state', false, 'boolean');\n };\n\n var setup = function (editor, pluginUrl, enabledState) {\n editor.on('PreviewFormats AfterPreviewFormats', function (e) {\n if (enabledState.get()) {\n editor.dom.toggleClass(editor.getBody(), 'mce-visualblocks', e.type === 'afterpreviewformats');\n }\n });\n editor.on('init', function () {\n if (isEnabledByDefault(editor)) {\n toggleVisualBlocks(editor, pluginUrl, enabledState);\n }\n });\n };\n\n var toggleActiveState = function (editor, enabledState) {\n return function (api) {\n api.setActive(enabledState.get());\n var editorEventCallback = function (e) {\n return api.setActive(e.state);\n };\n editor.on('VisualBlocks', editorEventCallback);\n return function () {\n return editor.off('VisualBlocks', editorEventCallback);\n };\n };\n };\n var register = function (editor, enabledState) {\n var onAction = function () {\n return editor.execCommand('mceVisualBlocks');\n };\n editor.ui.registry.addToggleButton('visualblocks', {\n icon: 'visualblocks',\n tooltip: 'Show blocks',\n onAction: onAction,\n onSetup: toggleActiveState(editor, enabledState)\n });\n editor.ui.registry.addToggleMenuItem('visualblocks', {\n text: 'Show blocks',\n icon: 'visualblocks',\n onAction: onAction,\n onSetup: toggleActiveState(editor, enabledState)\n });\n };\n\n function Plugin () {\n global.add('visualblocks', function (editor, pluginUrl) {\n var enabledState = Cell(false);\n register$1(editor, pluginUrl, enabledState);\n register(editor, enabledState);\n setup(editor, pluginUrl, enabledState);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/visualblocks/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/visualchars/index.js": /*!***************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/visualchars/index.js ***! \***************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"visualchars\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/visualchars')\n// ES2015:\n// import 'tinymce/plugins/visualchars'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/visualchars/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/visualchars/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/visualchars/plugin.js": /*!****************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/visualchars/plugin.js ***! \****************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\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 return {\n get: get,\n set: set\n };\n };\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var get$2 = function (toggleState) {\n var isEnabled = function () {\n return toggleState.get();\n };\n return { isEnabled: isEnabled };\n };\n\n var fireVisualChars = function (editor, state) {\n return editor.fire('VisualChars', { state: state });\n };\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType$1 = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var isString = isType$1('string');\n var isBoolean = isSimpleType('boolean');\n var isNumber = isSimpleType('number');\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 never = constant(false);\n var always = constant(true);\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant('none()')\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 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 };\n return me;\n };\n var from = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from\n };\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$1 = 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\n var keys = Object.keys;\n var each = 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 typeof window !== 'undefined' ? window : Function('return this;')();\n\n var TEXT = 3;\n\n var type = function (element) {\n return element.dom.nodeType;\n };\n var value = function (element) {\n return element.dom.nodeValue;\n };\n var isType = function (t) {\n return function (element) {\n return type(element) === t;\n };\n };\n var isText = isType(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 console.error('Invalid call to Attribute.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$3 = function (element, key) {\n element.dom.removeAttribute(key);\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$2 = 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$3(element, attr);\n }\n return false;\n };\n\n var supports = function (element) {\n return element.dom.classList !== undefined;\n };\n var get = function (element) {\n return read(element, 'class');\n };\n var add$1 = function (element, clazz) {\n return add$2(element, 'class', clazz);\n };\n var remove$1 = function (element, clazz) {\n return remove$2(element, 'class', clazz);\n };\n\n var add = 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(element);\n if (classList.length === 0) {\n remove$3(element, 'class');\n }\n };\n var remove = function (element, clazz) {\n if (supports(element)) {\n var classList = element.dom.classList;\n classList.remove(clazz);\n } else {\n remove$1(element, clazz);\n }\n cleanClass(element);\n };\n\n var fromHtml = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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 || document;\n var node = doc.createElement(tag);\n return fromDom(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || 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: node };\n };\n var fromPoint = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n };\n var SugarElement = {\n fromHtml: fromHtml,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom,\n fromPoint: fromPoint\n };\n\n var charMap = {\n '\\xA0': 'nbsp',\n '\\xAD': 'shy'\n };\n var charMapToRegExp = function (charMap, global) {\n var regExp = '';\n each(charMap, function (_value, key) {\n regExp += key;\n });\n return new RegExp('[' + regExp + ']', global ? 'g' : '');\n };\n var charMapToSelector = function (charMap) {\n var selector = '';\n each(charMap, function (value) {\n if (selector) {\n selector += ',';\n }\n selector += 'span.mce-' + value;\n });\n return selector;\n };\n var regExp = charMapToRegExp(charMap);\n var regExpGlobal = charMapToRegExp(charMap, true);\n var selector = charMapToSelector(charMap);\n var nbspClass = 'mce-nbsp';\n\n var wrapCharWithSpan = function (value) {\n return '' + value + '';\n };\n\n var isMatch = function (n) {\n var value$1 = value(n);\n return isText(n) && value$1 !== undefined && regExp.test(value$1);\n };\n var filterDescendants = function (scope, predicate) {\n var result = [];\n var dom = scope.dom;\n var children = map(dom.childNodes, SugarElement.fromDom);\n each$1(children, function (x) {\n if (predicate(x)) {\n result = result.concat([x]);\n }\n result = result.concat(filterDescendants(x, predicate));\n });\n return result;\n };\n var findParentElm = function (elm, rootElm) {\n while (elm.parentNode) {\n if (elm.parentNode === rootElm) {\n return elm;\n }\n elm = elm.parentNode;\n }\n };\n var replaceWithSpans = function (text) {\n return text.replace(regExpGlobal, wrapCharWithSpan);\n };\n\n var isWrappedNbsp = function (node) {\n return node.nodeName.toLowerCase() === 'span' && node.classList.contains('mce-nbsp-wrap');\n };\n var show = function (editor, rootElm) {\n var nodeList = filterDescendants(SugarElement.fromDom(rootElm), isMatch);\n each$1(nodeList, function (n) {\n var parent = n.dom.parentNode;\n if (isWrappedNbsp(parent)) {\n add(SugarElement.fromDom(parent), nbspClass);\n } else {\n var withSpans = replaceWithSpans(editor.dom.encode(value(n)));\n var div = editor.dom.create('div', null, withSpans);\n var node = void 0;\n while (node = div.lastChild) {\n editor.dom.insertAfter(node, n.dom);\n }\n editor.dom.remove(n.dom);\n }\n });\n };\n var hide = function (editor, rootElm) {\n var nodeList = editor.dom.select(selector, rootElm);\n each$1(nodeList, function (node) {\n if (isWrappedNbsp(node)) {\n remove(SugarElement.fromDom(node), nbspClass);\n } else {\n editor.dom.remove(node, true);\n }\n });\n };\n var toggle = function (editor) {\n var body = editor.getBody();\n var bookmark = editor.selection.getBookmark();\n var parentNode = findParentElm(editor.selection.getNode(), body);\n parentNode = parentNode !== undefined ? parentNode : body;\n hide(editor, parentNode);\n show(editor, parentNode);\n editor.selection.moveToBookmark(bookmark);\n };\n\n var applyVisualChars = function (editor, toggleState) {\n fireVisualChars(editor, toggleState.get());\n var body = editor.getBody();\n if (toggleState.get() === true) {\n show(editor, body);\n } else {\n hide(editor, body);\n }\n };\n var toggleVisualChars = function (editor, toggleState) {\n toggleState.set(!toggleState.get());\n var bookmark = editor.selection.getBookmark();\n applyVisualChars(editor, toggleState);\n editor.selection.moveToBookmark(bookmark);\n };\n\n var register$1 = function (editor, toggleState) {\n editor.addCommand('mceVisualChars', function () {\n toggleVisualChars(editor, toggleState);\n });\n };\n\n var isEnabledByDefault = function (editor) {\n return editor.getParam('visualchars_default_state', false);\n };\n var hasForcedRootBlock = function (editor) {\n return editor.getParam('forced_root_block') !== false;\n };\n\n var setup$1 = function (editor, toggleState) {\n editor.on('init', function () {\n applyVisualChars(editor, toggleState);\n });\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var setup = function (editor, toggleState) {\n var debouncedToggle = global.debounce(function () {\n toggle(editor);\n }, 300);\n if (hasForcedRootBlock(editor)) {\n editor.on('keydown', function (e) {\n if (toggleState.get() === true) {\n e.keyCode === 13 ? toggle(editor) : debouncedToggle();\n }\n });\n }\n editor.on('remove', debouncedToggle.stop);\n };\n\n var toggleActiveState = function (editor, enabledStated) {\n return function (api) {\n api.setActive(enabledStated.get());\n var editorEventCallback = function (e) {\n return api.setActive(e.state);\n };\n editor.on('VisualChars', editorEventCallback);\n return function () {\n return editor.off('VisualChars', editorEventCallback);\n };\n };\n };\n var register = function (editor, toggleState) {\n var onAction = function () {\n return editor.execCommand('mceVisualChars');\n };\n editor.ui.registry.addToggleButton('visualchars', {\n tooltip: 'Show invisible characters',\n icon: 'visualchars',\n onAction: onAction,\n onSetup: toggleActiveState(editor, toggleState)\n });\n editor.ui.registry.addToggleMenuItem('visualchars', {\n text: 'Show invisible characters',\n icon: 'visualchars',\n onAction: onAction,\n onSetup: toggleActiveState(editor, toggleState)\n });\n };\n\n function Plugin () {\n global$1.add('visualchars', function (editor) {\n var toggleState = Cell(isEnabledByDefault(editor));\n register$1(editor, toggleState);\n register(editor, toggleState);\n setup(editor, toggleState);\n setup$1(editor, toggleState);\n return get$2(toggleState);\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/visualchars/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/wordcount/index.js": /*!*************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/wordcount/index.js ***! \*************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// Exports the \"wordcount\" plugin for usage with module loaders\n// Usage:\n// CommonJS:\n// require('tinymce/plugins/wordcount')\n// ES2015:\n// import 'tinymce/plugins/wordcount'\n__webpack_require__(/*! ./plugin.js */ \"./node_modules/_tinymce@5.10.9@tinymce/plugins/wordcount/plugin.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/wordcount/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/plugins/wordcount/plugin.js": /*!**************************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/plugins/wordcount/plugin.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager');\n\n var identity = function (x) {\n return x;\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 zeroWidth = '\\uFEFF';\n var removeZwsp$1 = function (s) {\n return s.replace(/\\uFEFF/g, '');\n };\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\n var punctuationStr = '[!-#%-*,-\\\\/:;?@\\\\[-\\\\]_{}\\xA1\\xAB\\xB7\\xBB\\xBF;\\xB7\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1361-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u3008\\u3009\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30\\u2E31\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uff3f\\uFF5B\\uFF5D\\uFF5F-\\uFF65]';\n var regExps = {\n aletter: '[A-Za-z\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05d0-\\u05ea\\u05f0-\\u05F3\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097f\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c3d\\u0c58\\u0c59\\u0c60\\u0c61\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d60\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u10a0-\\u10c5\\u10d0-\\u10fa\\u10fc\\u1100-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f0\\u1700-\\u170c\\u170e-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1820-\\u1877\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191c\\u1a00-\\u1a16\\u1b05-\\u1b33\\u1b45-\\u1b4b\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bc0-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1ce9-\\u1cec\\u1cee-\\u1cf1\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u24B6-\\u24E9\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cee\\u2d00-\\u2d25\\u2d30-\\u2d65\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2e2f\\u3005\\u303b\\u303c\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua697\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790\\ua791\\ua7a0-\\ua7a9\\ua7fa-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uabc0-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uffa0-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc]',\n midnumlet: '[-\\'\\\\.\\u2018\\u2019\\u2024\\uFE52\\uFF07\\uFF0E]',\n midletter: '[:\\xB7\\xB7\\u05F4\\u2027\\uFE13\\uFE55\\uFF1A]',\n midnum: '[\\xB1+*/,;;\\u0589\\u060C\\u060D\\u066C\\u07F8\\u2044\\uFE10\\uFE14\\uFE50\\uFE54\\uFF0C\\uFF1B]',\n numeric: '[0-9\\u0660-\\u0669\\u066B\\u06f0-\\u06f9\\u07c0-\\u07c9\\u0966-\\u096f\\u09e6-\\u09ef\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\\u1040-\\u1049\\u1090-\\u1099\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\\u1a80-\\u1a89\\u1a90-\\u1a99\\u1b50-\\u1b59\\u1bb0-\\u1bb9\\u1c40-\\u1c49\\u1c50-\\u1c59\\ua620-\\ua629\\ua8d0-\\ua8d9\\ua900-\\ua909\\ua9d0-\\ua9d9\\uaa50-\\uaa59\\uabf0-\\uabf9]',\n cr: '\\\\r',\n lf: '\\\\n',\n newline: '[\\x0B\\f\\x85\\u2028\\u2029]',\n extend: '[\\u0300-\\u036f\\u0483-\\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\\u0900-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0c01-\\u0c03\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c82\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d02\\u0d03\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d82\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f\\u109a-\\u109d\\u135d-\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b6-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u19b0-\\u19c0\\u19c8\\u19c9\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1baa\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf2\\u1dc0-\\u1de6\\u1dfc-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\uA672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua880\\ua881\\ua8b4-\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa7b\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe3-\\uabea\\uabec\\uabed\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]',\n format: '[\\xAD\\u0600-\\u0603\\u06DD\\u070F\\u17b4\\u17b5\\u200E\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u206A-\\u206F\\uFEFF\\uFFF9-\\uFFFB]',\n katakana: '[\\u3031-\\u3035\\u309B\\u309C\\u30A0-\\u30fa\\u30fc-\\u30ff\\u31f0-\\u31ff\\u32D0-\\u32FE\\u3300-\\u3357\\uff66-\\uff9d]',\n extendnumlet: '[=_\\u203f\\u2040\\u2054\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff3f\\u2200-\\u22FF<>]',\n punctuation: punctuationStr\n };\n var characterIndices = {\n ALETTER: 0,\n MIDNUMLET: 1,\n MIDLETTER: 2,\n MIDNUM: 3,\n NUMERIC: 4,\n CR: 5,\n LF: 6,\n NEWLINE: 7,\n EXTEND: 8,\n FORMAT: 9,\n KATAKANA: 10,\n EXTENDNUMLET: 11,\n AT: 12,\n OTHER: 13\n };\n var SETS$1 = [\n new RegExp(regExps.aletter),\n new RegExp(regExps.midnumlet),\n new RegExp(regExps.midletter),\n new RegExp(regExps.midnum),\n new RegExp(regExps.numeric),\n new RegExp(regExps.cr),\n new RegExp(regExps.lf),\n new RegExp(regExps.newline),\n new RegExp(regExps.extend),\n new RegExp(regExps.format),\n new RegExp(regExps.katakana),\n new RegExp(regExps.extendnumlet),\n new RegExp('@')\n ];\n var EMPTY_STRING$1 = '';\n var PUNCTUATION$1 = new RegExp('^' + regExps.punctuation + '$');\n var WHITESPACE$1 = /^\\s+$/;\n\n var SETS = SETS$1;\n var OTHER = characterIndices.OTHER;\n var getType = function (char) {\n var type = OTHER;\n var setsLength = SETS.length;\n for (var j = 0; j < setsLength; ++j) {\n var set = SETS[j];\n if (set && set.test(char)) {\n type = j;\n break;\n }\n }\n return type;\n };\n var memoize = function (func) {\n var cache = {};\n return function (char) {\n if (cache[char]) {\n return cache[char];\n } else {\n var result = func(char);\n cache[char] = result;\n return result;\n }\n };\n };\n var classify = function (characters) {\n var memoized = memoize(getType);\n return map(characters, memoized);\n };\n\n var isWordBoundary = function (map, index) {\n var type = map[index];\n var nextType = map[index + 1];\n if (index < 0 || index > map.length - 1 && index !== 0) {\n return false;\n }\n if (type === characterIndices.ALETTER && nextType === characterIndices.ALETTER) {\n return false;\n }\n var nextNextType = map[index + 2];\n if (type === characterIndices.ALETTER && (nextType === characterIndices.MIDLETTER || nextType === characterIndices.MIDNUMLET || nextType === characterIndices.AT) && nextNextType === characterIndices.ALETTER) {\n return false;\n }\n var prevType = map[index - 1];\n if ((type === characterIndices.MIDLETTER || type === characterIndices.MIDNUMLET || nextType === characterIndices.AT) && nextType === characterIndices.ALETTER && prevType === characterIndices.ALETTER) {\n return false;\n }\n if ((type === characterIndices.NUMERIC || type === characterIndices.ALETTER) && (nextType === characterIndices.NUMERIC || nextType === characterIndices.ALETTER)) {\n return false;\n }\n if ((type === characterIndices.MIDNUM || type === characterIndices.MIDNUMLET) && nextType === characterIndices.NUMERIC && prevType === characterIndices.NUMERIC) {\n return false;\n }\n if (type === characterIndices.NUMERIC && (nextType === characterIndices.MIDNUM || nextType === characterIndices.MIDNUMLET) && nextNextType === characterIndices.NUMERIC) {\n return false;\n }\n if (type === characterIndices.EXTEND || type === characterIndices.FORMAT || prevType === characterIndices.EXTEND || prevType === characterIndices.FORMAT || nextType === characterIndices.EXTEND || nextType === characterIndices.FORMAT) {\n return false;\n }\n if (type === characterIndices.CR && nextType === characterIndices.LF) {\n return false;\n }\n if (type === characterIndices.NEWLINE || type === characterIndices.CR || type === characterIndices.LF) {\n return true;\n }\n if (nextType === characterIndices.NEWLINE || nextType === characterIndices.CR || nextType === characterIndices.LF) {\n return true;\n }\n if (type === characterIndices.KATAKANA && nextType === characterIndices.KATAKANA) {\n return false;\n }\n if (nextType === characterIndices.EXTENDNUMLET && (type === characterIndices.ALETTER || type === characterIndices.NUMERIC || type === characterIndices.KATAKANA || type === characterIndices.EXTENDNUMLET)) {\n return false;\n }\n if (type === characterIndices.EXTENDNUMLET && (nextType === characterIndices.ALETTER || nextType === characterIndices.NUMERIC || nextType === characterIndices.KATAKANA)) {\n return false;\n }\n if (type === characterIndices.AT) {\n return false;\n }\n return true;\n };\n\n var EMPTY_STRING = EMPTY_STRING$1;\n var WHITESPACE = WHITESPACE$1;\n var PUNCTUATION = PUNCTUATION$1;\n var isProtocol = function (str) {\n return str === 'http' || str === 'https';\n };\n var findWordEnd = function (characters, startIndex) {\n var i;\n for (i = startIndex; i < characters.length; i++) {\n if (WHITESPACE.test(characters[i])) {\n break;\n }\n }\n return i;\n };\n var findUrlEnd = function (characters, startIndex) {\n var endIndex = findWordEnd(characters, startIndex + 1);\n var peakedWord = characters.slice(startIndex + 1, endIndex).join(EMPTY_STRING);\n return peakedWord.substr(0, 3) === '://' ? endIndex : startIndex;\n };\n var findWords = function (chars, sChars, characterMap, options) {\n var words = [];\n var word = [];\n for (var i = 0; i < characterMap.length; ++i) {\n word.push(chars[i]);\n if (isWordBoundary(characterMap, i)) {\n var ch = sChars[i];\n if ((options.includeWhitespace || !WHITESPACE.test(ch)) && (options.includePunctuation || !PUNCTUATION.test(ch))) {\n var startOfWord = i - word.length + 1;\n var endOfWord = i + 1;\n var str = sChars.slice(startOfWord, endOfWord).join(EMPTY_STRING);\n if (isProtocol(str)) {\n var endOfUrl = findUrlEnd(sChars, i);\n var url = chars.slice(endOfWord, endOfUrl);\n Array.prototype.push.apply(word, url);\n i = endOfUrl;\n }\n words.push(word);\n }\n word = [];\n }\n }\n return words;\n };\n var getDefaultOptions = function () {\n return {\n includeWhitespace: false,\n includePunctuation: false\n };\n };\n var getWords$1 = function (chars, extract, options) {\n options = __assign(__assign({}, getDefaultOptions()), options);\n var filteredChars = [];\n var extractedChars = [];\n for (var i = 0; i < chars.length; i++) {\n var ch = extract(chars[i]);\n if (ch !== zeroWidth) {\n filteredChars.push(chars[i]);\n extractedChars.push(ch);\n }\n }\n var characterMap = classify(extractedChars);\n return findWords(filteredChars, extractedChars, characterMap, options);\n };\n\n var getWords = getWords$1;\n\n var global$1 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');\n\n var getText = function (node, schema) {\n var blockElements = schema.getBlockElements();\n var shortEndedElements = schema.getShortEndedElements();\n var isNewline = function (node) {\n return blockElements[node.nodeName] || shortEndedElements[node.nodeName];\n };\n var textBlocks = [];\n var txt = '';\n var treeWalker = new global$1(node, node);\n while (node = treeWalker.next()) {\n if (node.nodeType === 3) {\n txt += removeZwsp$1(node.data);\n } else if (isNewline(node) && txt.length) {\n textBlocks.push(txt);\n txt = '';\n }\n }\n if (txt.length) {\n textBlocks.push(txt);\n }\n return textBlocks;\n };\n\n var removeZwsp = function (text) {\n return text.replace(/\\u200B/g, '');\n };\n var strLen = function (str) {\n return str.replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, '_').length;\n };\n var countWords = function (node, schema) {\n var text = removeZwsp(getText(node, schema).join('\\n'));\n return getWords(text.split(''), identity).length;\n };\n var countCharacters = function (node, schema) {\n var text = getText(node, schema).join('');\n return strLen(text);\n };\n var countCharactersWithoutSpaces = function (node, schema) {\n var text = getText(node, schema).join('').replace(/\\s/g, '');\n return strLen(text);\n };\n\n var createBodyCounter = function (editor, count) {\n return function () {\n return count(editor.getBody(), editor.schema);\n };\n };\n var createSelectionCounter = function (editor, count) {\n return function () {\n return count(editor.selection.getRng().cloneContents(), editor.schema);\n };\n };\n var createBodyWordCounter = function (editor) {\n return createBodyCounter(editor, countWords);\n };\n var get = function (editor) {\n return {\n body: {\n getWordCount: createBodyWordCounter(editor),\n getCharacterCount: createBodyCounter(editor, countCharacters),\n getCharacterCountWithoutSpaces: createBodyCounter(editor, countCharactersWithoutSpaces)\n },\n selection: {\n getWordCount: createSelectionCounter(editor, countWords),\n getCharacterCount: createSelectionCounter(editor, countCharacters),\n getCharacterCountWithoutSpaces: createSelectionCounter(editor, countCharactersWithoutSpaces)\n },\n getCount: createBodyWordCounter(editor)\n };\n };\n\n var open = function (editor, api) {\n editor.windowManager.open({\n title: 'Word Count',\n body: {\n type: 'panel',\n items: [{\n type: 'table',\n header: [\n 'Count',\n 'Document',\n 'Selection'\n ],\n cells: [\n [\n 'Words',\n String(api.body.getWordCount()),\n String(api.selection.getWordCount())\n ],\n [\n 'Characters (no spaces)',\n String(api.body.getCharacterCountWithoutSpaces()),\n String(api.selection.getCharacterCountWithoutSpaces())\n ],\n [\n 'Characters',\n String(api.body.getCharacterCount()),\n String(api.selection.getCharacterCount())\n ]\n ]\n }]\n },\n buttons: [{\n type: 'cancel',\n name: 'close',\n text: 'Close',\n primary: true\n }]\n });\n };\n\n var register$1 = function (editor, api) {\n editor.addCommand('mceWordCount', function () {\n return open(editor, api);\n });\n };\n\n var global = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var fireWordCountUpdate = function (editor, api) {\n editor.fire('wordCountUpdate', {\n wordCount: {\n words: api.body.getWordCount(),\n characters: api.body.getCharacterCount(),\n charactersWithoutSpaces: api.body.getCharacterCountWithoutSpaces()\n }\n });\n };\n\n var updateCount = function (editor, api) {\n fireWordCountUpdate(editor, api);\n };\n var setup = function (editor, api, delay) {\n var debouncedUpdate = global.debounce(function () {\n return updateCount(editor, api);\n }, delay);\n editor.on('init', function () {\n updateCount(editor, api);\n global.setEditorTimeout(editor, function () {\n editor.on('SetContent BeforeAddUndo Undo Redo ViewUpdate keyup', debouncedUpdate);\n }, 0);\n });\n };\n\n var register = function (editor) {\n var onAction = function () {\n return editor.execCommand('mceWordCount');\n };\n editor.ui.registry.addButton('wordcount', {\n tooltip: 'Word count',\n icon: 'character-count',\n onAction: onAction\n });\n editor.ui.registry.addMenuItem('wordcount', {\n text: 'Word count',\n icon: 'character-count',\n onAction: onAction\n });\n };\n\n function Plugin (delay) {\n if (delay === void 0) {\n delay = 300;\n }\n global$2.add('wordcount', function (editor) {\n var api = get(editor);\n register$1(editor, api);\n register(editor);\n setup(editor, api, delay);\n return api;\n });\n }\n\n Plugin();\n\n}());\n\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/plugins/wordcount/plugin.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/themes/silver/index.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/themes/silver/index.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("// 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'\n__webpack_require__(/*! ./theme.js */ \"./node_modules/_tinymce@5.10.9@tinymce/themes/silver/theme.js\");\n\n//# sourceURL=webpack:///./node_modules/_tinymce@5.10.9@tinymce/themes/silver/index.js?"); /***/ }), /***/ "./node_modules/_tinymce@5.10.9@tinymce/themes/silver/theme.js": /*!*********************************************************************!*\ !*** ./node_modules/_tinymce@5.10.9@tinymce/themes/silver/theme.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("/* WEBPACK VAR INJECTION */(function(global) {/**\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.10.9 (2023-11-15)\n */\n(function () {\n 'use strict';\n\n var typeOf = function (x) {\n var t = typeof x;\n if (x === null) {\n return 'null';\n } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {\n return 'array';\n } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {\n return 'string';\n } else {\n return t;\n }\n };\n var isType$1 = function (type) {\n return function (value) {\n return typeOf(value) === type;\n };\n };\n var isSimpleType = function (type) {\n return function (value) {\n return typeof value === type;\n };\n };\n var eq$1 = function (t) {\n return function (a) {\n return t === a;\n };\n };\n var isString = isType$1('string');\n var isObject = isType$1('object');\n var isArray = isType$1('array');\n var isNull = eq$1(null);\n var isBoolean = isSimpleType('boolean');\n var isUndefined = eq$1(undefined);\n var isNullable = function (a) {\n return a === null || a === undefined;\n };\n var isNonNullable = function (a) {\n return !isNullable(a);\n };\n var isFunction = isSimpleType('function');\n var isNumber = isSimpleType('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])) {\n return false;\n }\n }\n return true;\n }\n return false;\n };\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 compose1 = function (fbc, fab) {\n return function (a) {\n return fbc(fab(a));\n };\n };\n var constant$1 = function (value) {\n return function () {\n return value;\n };\n };\n var identity$1 = function (x) {\n return x;\n };\n var tripleEquals = function (a, b) {\n return a === b;\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 (t) {\n return !f(t);\n };\n };\n var die = function (msg) {\n return function () {\n throw new Error(msg);\n };\n };\n var never = constant$1(false);\n var always = constant$1(true);\n\n var global$g = 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 __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2)\n for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar)\n ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n }\n\n var none = function () {\n return NONE;\n };\n var NONE = function () {\n var call = function (thunk) {\n return thunk();\n };\n var id = identity$1;\n var me = {\n fold: function (n, _s) {\n return n();\n },\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$1(null),\n getOrUndefined: constant$1(undefined),\n or: id,\n orThunk: call,\n map: none,\n each: noop,\n bind: none,\n exists: never,\n forall: always,\n filter: function () {\n return none();\n },\n toArray: function () {\n return [];\n },\n toString: constant$1('none()')\n };\n return me;\n }();\n var some = function (a) {\n var constant_a = constant$1(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 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 };\n return me;\n };\n var from$1 = function (value) {\n return value === null || value === undefined ? NONE : some(value);\n };\n var Optional = {\n some: some,\n none: none,\n from: from$1\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 ? Optional.none() : Optional.some(r);\n };\n var contains$2 = 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$2 = 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$1 = 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$2 = 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$1 = 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$3 = 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$2 = 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, i) {\n acc = f(acc, x, i);\n });\n return acc;\n };\n var foldl = function (xs, f, acc) {\n each$1(xs, function (x, i) {\n acc = f(acc, x, i);\n });\n return acc;\n };\n var findUntil = function (xs, pred, until) {\n for (var i = 0, len = xs.length; i < len; i++) {\n var x = xs[i];\n if (pred(x, i)) {\n return Optional.some(x);\n } else if (until(x, i)) {\n break;\n }\n }\n return Optional.none();\n };\n var find$5 = function (xs, pred) {\n return findUntil(xs, pred, never);\n };\n var findIndex$1 = 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 Optional.some(i);\n }\n }\n return Optional.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$3 = function (xs, f) {\n return flatten(map$2(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$2(a1, function (x) {\n return !contains$2(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$2 = 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 get$f = function (xs, i) {\n return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();\n };\n var head = function (xs) {\n return get$f(xs, 0);\n };\n var last$2 = function (xs) {\n return get$f(xs, xs.length - 1);\n };\n var from = 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 Optional.none();\n };\n\n var keys = Object.keys;\n var hasOwnProperty$1 = Object.hasOwnProperty;\n var each = 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(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(obj, function (x, i) {\n (pred(x, i) ? onTrue : onFalse)(x, i);\n });\n return r;\n };\n var filter$1 = function (obj, pred) {\n var t = {};\n internalFilter(obj, pred, objAcc(t), noop);\n return t;\n };\n var mapToArray = function (obj, f) {\n var r = [];\n each(obj, function (value, name) {\n r.push(f(value, name));\n });\n return r;\n };\n var find$4 = 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 Optional.some(x);\n }\n }\n return Optional.none();\n };\n var values = function (obj) {\n return mapToArray(obj, identity$1);\n };\n var get$e = function (obj, key) {\n return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none();\n };\n var has$2 = function (obj, key) {\n return hasOwnProperty$1.call(obj, key);\n };\n var hasNonNullableKey = function (obj, key) {\n return has$2(obj, key) && obj[key] !== undefined && obj[key] !== null;\n };\n\n var is$1 = function (lhs, rhs, comparator) {\n if (comparator === void 0) {\n comparator = tripleEquals;\n }\n return lhs.exists(function (left) {\n return comparator(left, rhs);\n });\n };\n var equals = function (lhs, rhs, comparator) {\n if (comparator === void 0) {\n comparator = tripleEquals;\n }\n return lift2(lhs, rhs, comparator).getOr(lhs.isNone() && rhs.isNone());\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 Optional.none();\n }\n }\n return Optional.some(r);\n };\n var lift2 = function (oa, ob, f) {\n return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();\n };\n var lift3 = function (oa, ob, oc, f) {\n return oa.isSome() && ob.isSome() && oc.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Optional.none();\n };\n var mapFrom = function (a, f) {\n return a !== undefined && a !== null ? Optional.some(f(a)) : Optional.none();\n };\n var someIf = function (b, a) {\n return b ? Optional.some(a) : Optional.none();\n };\n\n var addToEnd = function (str, suffix) {\n return str + suffix;\n };\n var removeFromStart = function (str, numChars) {\n return str.substring(numChars);\n };\n\n var checkRange = function (str, substr, start) {\n return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;\n };\n var removeLeading = function (str, prefix) {\n return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str;\n };\n var ensureTrailing = function (str, suffix) {\n return endsWith(str, suffix) ? str : addToEnd(str, suffix);\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 blank = function (r) {\n return function (s) {\n return s.replace(r, '');\n };\n };\n var trim$1 = blank(/^\\s+|\\s+$/g);\n var isNotEmpty = function (s) {\n return s.length > 0;\n };\n var isEmpty = function (s) {\n return !isNotEmpty(s);\n };\n\n var isSupported$1 = function (dom) {\n return dom.style !== undefined && isFunction(dom.style.getPropertyValue);\n };\n\n var fromHtml$2 = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n if (!div.hasChildNodes() || div.childNodes.length > 1) {\n 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 || document;\n var node = doc.createElement(tag);\n return fromDom(node);\n };\n var fromText = function (text, scope) {\n var doc = scope || 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: node };\n };\n var fromPoint = function (docElm, x, y) {\n return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);\n };\n var SugarElement = {\n fromHtml: fromHtml$2,\n fromTag: fromTag,\n fromText: fromText,\n fromDom: fromDom,\n fromPoint: fromPoint\n };\n\n typeof window !== 'undefined' ? window : Function('return this;')();\n\n var DOCUMENT = 9;\n var DOCUMENT_FRAGMENT = 11;\n var ELEMENT = 1;\n var TEXT = 3;\n\n var name$2 = 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 = function (t) {\n return function (element) {\n return type(element) === t;\n };\n };\n var isElement$2 = isType(ELEMENT);\n var isText$1 = isType(TEXT);\n var isDocument = isType(DOCUMENT);\n var isDocumentFragment = isType(DOCUMENT_FRAGMENT);\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 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$1(isiPad),\n isiPhone: constant$1(isiPhone),\n isTablet: constant$1(isTablet),\n isPhone: constant$1(isPhone),\n isTouch: constant$1(isTouch),\n isAndroid: os.isAndroid,\n isiOS: os.isiOS,\n isWebView: constant$1(iOSwebview),\n isDesktop: constant$1(isDesktop)\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$3 = 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$d(group(1), group(2));\n };\n var detect$4 = function (versionRegexes, agent) {\n var cleanedAgent = String(agent).toLowerCase();\n if (versionRegexes.length === 0) {\n return unknown$3();\n }\n return find$3(versionRegexes, cleanedAgent);\n };\n var unknown$3 = function () {\n return nu$d(0, 0);\n };\n var nu$d = function (major, minor) {\n return {\n major: major,\n minor: minor\n };\n };\n var Version = {\n nu: nu$d,\n detect: detect$4,\n unknown: unknown$3\n };\n\n var detectBrowser$1 = function (browsers, userAgentData) {\n return findMap(userAgentData.brands, function (uaBrand) {\n var lcBrand = uaBrand.brand.toLowerCase();\n return find$5(browsers, function (browser) {\n var _a;\n return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());\n }).map(function (info) {\n return {\n current: info.name,\n version: Version.nu(parseInt(uaBrand.version, 10), 0)\n };\n });\n });\n };\n\n var detect$3 = function (candidates, userAgent) {\n var agent = String(userAgent).toLowerCase();\n return find$5(candidates, function (candidate) {\n return candidate.search(agent);\n });\n };\n var detectBrowser = function (browsers, userAgent) {\n return detect$3(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$3(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\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 brand: 'Chromium',\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$1(browsers),\n oses: constant$1(oses)\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 unknown$2 = function () {\n return nu$c({\n current: undefined,\n version: Version.unknown()\n });\n };\n var nu$c = function (info) {\n var current = info.current;\n var version = info.version;\n var isBrowser = function (name) {\n return function () {\n return current === name;\n };\n };\n return {\n current: current,\n version: version,\n isEdge: isBrowser(edge),\n isChrome: isBrowser(chrome),\n isIE: isBrowser(ie),\n isOpera: isBrowser(opera),\n isFirefox: isBrowser(firefox),\n isSafari: isBrowser(safari)\n };\n };\n var Browser = {\n unknown: unknown$2,\n nu: nu$c,\n edge: constant$1(edge),\n chrome: constant$1(chrome),\n ie: constant$1(ie),\n opera: constant$1(opera),\n firefox: constant$1(firefox),\n safari: constant$1(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 unknown$1 = function () {\n return nu$b({\n current: undefined,\n version: Version.unknown()\n });\n };\n var nu$b = function (info) {\n var current = info.current;\n var version = info.version;\n var isOS = function (name) {\n return function () {\n return current === name;\n };\n };\n return {\n current: current,\n version: version,\n isWindows: isOS(windows),\n isiOS: isOS(ios),\n isAndroid: isOS(android),\n isOSX: isOS(osx),\n isLinux: isOS(linux),\n isSolaris: isOS(solaris),\n isFreeBSD: isOS(freebsd),\n isChromeOS: isOS(chromeos)\n };\n };\n var OperatingSystem = {\n unknown: unknown$1,\n nu: nu$b,\n windows: constant$1(windows),\n ios: constant$1(ios),\n android: constant$1(android),\n linux: constant$1(linux),\n osx: constant$1(osx),\n solaris: constant$1(solaris),\n freebsd: constant$1(freebsd),\n chromeos: constant$1(chromeos)\n };\n\n var detect$2 = function (userAgent, userAgentDataOpt, mediaMatch) {\n var browsers = PlatformInfo.browsers();\n var oses = PlatformInfo.oses();\n var browser = userAgentDataOpt.bind(function (userAgentData) {\n return detectBrowser$1(browsers, userAgentData);\n }).orThunk(function () {\n return detectBrowser(browsers, userAgent);\n }).fold(Browser.unknown, Browser.nu);\n var os = 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 window.matchMedia(query).matches;\n };\n var platform = cached(function () {\n return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch);\n });\n var detect$1 = function () {\n return platform();\n };\n\n var compareDocumentPosition = function (a, b, match) {\n return (a.compareDocumentPosition(b) & match) !== 0;\n };\n var documentPositionContainedBy = function (a, b) {\n return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY);\n };\n\n var is = function (element, selector) {\n var dom = element.dom;\n if (dom.nodeType !== ELEMENT) {\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 && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;\n };\n var all$3 = function (selector, scope) {\n var base = scope === undefined ? document : scope.dom;\n return bypassSelector(base) ? [] : map$2(base.querySelectorAll(selector), SugarElement.fromDom);\n };\n var one = function (selector, scope) {\n var base = scope === undefined ? document : scope.dom;\n return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.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 documentPositionContainedBy(e1.dom, e2.dom);\n };\n var contains = function (e1, e2) {\n return detect$1().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2);\n };\n\n var owner$4 = function (element) {\n return SugarElement.fromDom(element.dom.ownerDocument);\n };\n var documentOrOwner = function (dos) {\n return isDocument(dos) ? dos : owner$4(dos);\n };\n var documentElement = function (element) {\n return SugarElement.fromDom(documentOrOwner(element).dom.documentElement);\n };\n var defaultView = function (element) {\n return SugarElement.fromDom(documentOrOwner(element).dom.defaultView);\n };\n var parent = function (element) {\n return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);\n };\n var parentNode = function (element) {\n return parent(element);\n };\n var offsetParent = function (element) {\n return Optional.from(element.dom.offsetParent).map(SugarElement.fromDom);\n };\n var nextSibling = function (element) {\n return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);\n };\n var children = function (element) {\n return map$2(element.dom.childNodes, SugarElement.fromDom);\n };\n var child$2 = function (element, index) {\n var cs = element.dom.childNodes;\n return Optional.from(cs[index]).map(SugarElement.fromDom);\n };\n var firstChild = function (element) {\n return child$2(element, 0);\n };\n var spot = function (element, offset) {\n return {\n element: element,\n offset: offset\n };\n };\n var leaf = function (element, offset) {\n var cs = children(element);\n return cs.length > 0 && offset < cs.length ? spot(cs[offset], 0) : spot(element, offset);\n };\n\n var isShadowRoot = function (dos) {\n return isDocumentFragment(dos) && isNonNullable(dos.dom.host);\n };\n var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);\n var isSupported = constant$1(supported);\n var getRootNode = supported ? function (e) {\n return SugarElement.fromDom(e.dom.getRootNode());\n } : documentOrOwner;\n var getContentContainer = function (dos) {\n return isShadowRoot(dos) ? dos : SugarElement.fromDom(documentOrOwner(dos).dom.body);\n };\n var isInShadowRoot = function (e) {\n return getShadowRoot(e).isSome();\n };\n var getShadowRoot = function (e) {\n var r = getRootNode(e);\n return isShadowRoot(r) ? Optional.some(r) : Optional.none();\n };\n var getShadowHost = function (e) {\n return SugarElement.fromDom(e.dom.host);\n };\n var getOriginalEventTarget = function (event) {\n if (isSupported() && isNonNullable(event.target)) {\n var el = SugarElement.fromDom(event.target);\n if (isElement$2(el) && isOpenShadowHost(el)) {\n if (event.composed && event.composedPath) {\n var composedPath = event.composedPath();\n if (composedPath) {\n return head(composedPath);\n }\n }\n }\n }\n return Optional.from(event.target);\n };\n var isOpenShadowHost = function (element) {\n return isNonNullable(element.dom.shadowRoot);\n };\n\n var inBody = function (element) {\n var dom = isText$1(element) ? element.dom.parentNode : element.dom;\n if (dom === undefined || dom === null || dom.ownerDocument === null) {\n return false;\n }\n var doc = dom.ownerDocument;\n return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {\n return doc.body.contains(dom);\n }, compose1(inBody, getShadowHost));\n };\n var body = function () {\n return getBody(SugarElement.fromDom(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 SugarElement.fromDom(b);\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 console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);\n throw new Error('Attribute value was not simple');\n }\n };\n var set$8 = function (element, key, value) {\n rawSet(element.dom, key, value);\n };\n var setAll$1 = function (element, attrs) {\n var dom = element.dom;\n each(attrs, function (v, k) {\n rawSet(dom, k, v);\n });\n };\n var get$d = 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 Optional.from(get$d(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$7 = function (element, key) {\n element.dom.removeAttribute(key);\n };\n\n var internalSet = function (dom, property, value) {\n if (!isString(value)) {\n 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$1(dom)) {\n dom.style.setProperty(property, value);\n }\n };\n var internalRemove = function (dom, property) {\n if (isSupported$1(dom)) {\n dom.style.removeProperty(property);\n }\n };\n var set$7 = function (element, property, value) {\n var dom = element.dom;\n internalSet(dom, property, value);\n };\n var setAll = function (element, css) {\n var dom = element.dom;\n each(css, function (v, k) {\n internalSet(dom, k, v);\n });\n };\n var setOptions = function (element, css) {\n var dom = element.dom;\n each(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$c = function (element, property) {\n var dom = element.dom;\n var styles = window.getComputedStyle(dom);\n var r = styles.getPropertyValue(property);\n return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;\n };\n var getUnsafeProperty = function (dom, property) {\n return isSupported$1(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 Optional.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$1(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 = SugarElement.fromTag(tag);\n set$7(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 (is$1(getOpt(element, 'style').map(trim$1), '')) {\n remove$7(element, 'style');\n }\n };\n var reflow = function (e) {\n return e.dom.offsetWidth;\n };\n\n var Dimension = function (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$1(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$c(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$c(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$3 = Dimension('height', function (element) {\n var dom = element.dom;\n return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;\n });\n var get$b = function (element) {\n return api$3.get(element);\n };\n var getOuter$2 = function (element) {\n return api$3.getOuter(element);\n };\n var setMax$1 = 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$3.max(element, value, inclusions);\n set$7(element, 'max-height', absMax + 'px');\n };\n\n var r$1 = function (left, top) {\n var translate = function (x, y) {\n return r$1(left + x, top + y);\n };\n return {\n left: left,\n top: top,\n translate: translate\n };\n };\n var SugarPosition = r$1;\n\n var boxPosition = function (dom) {\n var box = dom.getBoundingClientRect();\n return SugarPosition(box.left, box.top);\n };\n var firstDefinedOrZero = function (a, b) {\n if (a !== undefined) {\n return a;\n } else {\n return b !== undefined ? b : 0;\n }\n };\n var absolute$3 = 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 SugarPosition(body.offsetLeft, body.offsetTop);\n }\n var scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop);\n var scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft);\n var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);\n var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);\n return viewport$1(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);\n };\n var viewport$1 = function (element) {\n var dom = element.dom;\n var doc = dom.ownerDocument;\n var body = doc.body;\n if (body === dom) {\n return SugarPosition(body.offsetLeft, body.offsetTop);\n }\n if (!inBody(element)) {\n return SugarPosition(0, 0);\n }\n return boxPosition(dom);\n };\n\n var api$2 = Dimension('width', function (element) {\n return element.dom.offsetWidth;\n });\n var set$6 = function (element, h) {\n return api$2.set(element, h);\n };\n var get$a = function (element) {\n return api$2.get(element);\n };\n var getOuter$1 = function (element) {\n return api$2.getOuter(element);\n };\n var setMax = 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$2.max(element, value, inclusions);\n set$7(element, 'max-width', absMax + 'px');\n };\n\n var mkEvent = function (target, x, y, stop, prevent, kill, raw) {\n return {\n target: target,\n x: x,\n y: y,\n stop: stop,\n prevent: prevent,\n kill: kill,\n raw: raw\n };\n };\n var fromRawEvent$1 = function (rawEvent) {\n var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));\n var stop = function () {\n return rawEvent.stopPropagation();\n };\n var prevent = function () {\n return 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 handler(fromRawEvent$1(rawEvent));\n }\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$1 = 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 before$2 = 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$2 = 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$2(v, element);\n });\n }, function (v) {\n before$2(v, element);\n });\n };\n var prepend$1 = function (parent, element) {\n var firstChild$1 = firstChild(parent);\n firstChild$1.fold(function () {\n append$2(parent, element);\n }, function (v) {\n parent.dom.insertBefore(element.dom, v.dom);\n });\n };\n var append$2 = function (parent, element) {\n parent.dom.appendChild(element.dom);\n };\n var appendAt = function (parent, element, index) {\n child$2(parent, index).fold(function () {\n append$2(parent, element);\n }, function (v) {\n before$2(v, element);\n });\n };\n\n var before$1 = function (marker, elements) {\n each$1(elements, function (x) {\n before$2(marker, x);\n });\n };\n var append$1 = function (parent, elements) {\n each$1(elements, function (x) {\n append$2(parent, x);\n });\n };\n\n var empty = function (element) {\n element.dom.textContent = '';\n each$1(children(element), function (rogue) {\n remove$5(rogue);\n });\n };\n var remove$5 = 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$5(wrapper);\n };\n\n var get$9 = function (_DOC) {\n var doc = _DOC !== undefined ? _DOC.dom : document;\n var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;\n var y = doc.body.scrollTop || doc.documentElement.scrollTop;\n return SugarPosition(x, y);\n };\n var to = function (x, y, _DOC) {\n var doc = _DOC !== undefined ? _DOC.dom : document;\n var win = doc.defaultView;\n if (win) {\n win.scrollTo(x, y);\n }\n };\n\n var get$8 = function (_win) {\n var win = _win === undefined ? window : _win;\n if (detect$1().browser.isFirefox()) {\n return Optional.none();\n } else {\n return Optional.from(win['visualViewport']);\n }\n };\n var bounds$1 = function (x, y, width, height) {\n return {\n x: x,\n y: y,\n width: width,\n height: height,\n right: x + width,\n bottom: y + height\n };\n };\n var getBounds$3 = function (_win) {\n var win = _win === undefined ? window : _win;\n var doc = win.document;\n var scroll = get$9(SugarElement.fromDom(doc));\n return get$8(win).fold(function () {\n var html = win.document.documentElement;\n var width = html.clientWidth;\n var height = html.clientHeight;\n return bounds$1(scroll.left, scroll.top, width, height);\n }, function (visualViewport) {\n return bounds$1(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$1([]), 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 Optional.some(paths);\n };\n\n var view = function (doc) {\n var _a;\n var element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement);\n return element.map(SugarElement.fromDom);\n };\n var owner$3 = function (element) {\n return owner$4(element);\n };\n\n var Navigation = /*#__PURE__*/Object.freeze({\n __proto__: null,\n view: view,\n owner: owner$3\n });\n\n var find$2 = function (element) {\n var doc = SugarElement.fromDom(document);\n var scroll = get$9(doc);\n var path = pathTo(element, Navigation);\n return path.fold(curry(absolute$3, element), function (frames) {\n var offset = viewport$1(element);\n var r = foldr(frames, function (b, a) {\n var loc = viewport$1(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 SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top);\n });\n };\n\n var pointed = function (point, width, height) {\n return {\n point: point,\n width: width,\n height: height\n };\n };\n var rect = function (x, y, width, height) {\n return {\n x: x,\n y: y,\n width: width,\n height: height\n };\n };\n var bounds = function (x, y, width, height) {\n return {\n x: x,\n y: y,\n width: width,\n height: height,\n right: x + width,\n bottom: y + height\n };\n };\n var box$1 = function (element) {\n var xy = absolute$3(element);\n var w = getOuter$1(element);\n var h = getOuter$2(element);\n return bounds(xy.left, xy.top, w, h);\n };\n var absolute$2 = function (element) {\n var position = find$2(element);\n var width = getOuter$1(element);\n var height = getOuter$2(element);\n return bounds(position.left, position.top, width, height);\n };\n var win = function () {\n return getBounds$3(window);\n };\n\n var value$3 = function (o) {\n var or = function (_opt) {\n return value$3(o);\n };\n var orThunk = function (_f) {\n return value$3(o);\n };\n var map = function (f) {\n return value$3(f(o));\n };\n var mapError = function (_f) {\n return value$3(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 toOptional = function () {\n return Optional.some(o);\n };\n return {\n isValue: always,\n isError: never,\n getOr: constant$1(o),\n getOrThunk: constant$1(o),\n getOrDie: constant$1(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 toOptional: toOptional\n };\n };\n var error$1 = function (message) {\n var getOrThunk = function (f) {\n return f();\n };\n var getOrDie = function () {\n return die(String(message))();\n };\n var or = identity$1;\n var orThunk = function (f) {\n return f();\n };\n var map = function (_f) {\n return error$1(message);\n };\n var mapError = function (f) {\n return error$1(f(message));\n };\n var bind = function (_f) {\n return error$1(message);\n };\n var fold = function (onError, _) {\n return onError(message);\n };\n return {\n isValue: never,\n isError: always,\n getOr: identity$1,\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 toOptional: Optional.none\n };\n };\n var fromOption = function (opt, err) {\n return opt.fold(function () {\n return error$1(err);\n }, value$3);\n };\n var Result = {\n value: value$3,\n error: error$1,\n fromOption: fromOption\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$1 = function (res, onError, onValue) {\n return res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue);\n };\n var partition$2 = function (results) {\n var values = [];\n var errors = [];\n each$1(results, function (obj) {\n fold$1(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 = 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$1 = function (res) {\n return fold$1(res, Result.error, Result.value);\n };\n var fromResult$1 = function (res) {\n return res.fold(serror, svalue);\n };\n var SimpleResult = {\n fromResult: fromResult$1,\n toResult: toResult$1,\n svalue: svalue,\n partition: partition$2,\n serror: serror,\n bind: bind$1,\n bindError: bindError,\n map: map,\n mapError: mapError,\n fold: fold$1\n };\n\n var field$2 = function (key, newKey, presence, prop) {\n return {\n tag: 'field',\n key: key,\n newKey: newKey,\n presence: presence,\n prop: prop\n };\n };\n var customField$1 = function (newKey, instantiator) {\n return {\n tag: 'custom',\n newKey: newKey,\n instantiator: instantiator\n };\n };\n var fold = function (value, ifField, ifCustom) {\n switch (value.tag) {\n case 'field':\n return ifField(value.key, value.newKey, value.presence, value.prop);\n case 'custom':\n return ifCustom(value.newKey, value.instantiator);\n }\n };\n\n var shallow$1 = 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 = [];\n for (var _i = 0; _i < arguments.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 (has$2(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$1 = baseMerge(shallow$1);\n\n var required$2 = function () {\n return {\n tag: 'required',\n process: {}\n };\n };\n var defaultedThunk = function (fallbackThunk) {\n return {\n tag: 'defaultedThunk',\n process: fallbackThunk\n };\n };\n var defaulted$1 = function (fallback) {\n return defaultedThunk(constant$1(fallback));\n };\n var asOption = function () {\n return {\n tag: 'option',\n process: {}\n };\n };\n var mergeWithThunk = function (baseThunk) {\n return {\n tag: 'mergeWithThunk',\n process: baseThunk\n };\n };\n var mergeWith = function (base) {\n return mergeWithThunk(constant$1(base));\n };\n\n var mergeValues$1 = function (values, base) {\n return values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge$1.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: constant$1('... (only showing first ten failures)')\n }]) : errors;\n return map$2(es, function (e) {\n return 'Failed path: (' + e.path.join(' > ') + ')\\n' + e.getErrorInfo();\n });\n };\n\n var nu$a = function (path, getErrorInfo) {\n return SimpleResult.serror([{\n path: path,\n getErrorInfo: getErrorInfo\n }]);\n };\n var missingRequired = function (path, key, obj) {\n return nu$a(path, function () {\n return 'Could not find valid *required* value for \"' + key + '\" in ' + formatObj(obj);\n });\n };\n var missingKey = function (path, key) {\n return nu$a(path, function () {\n return 'Choice schema did not contain choice key: \"' + key + '\"';\n });\n };\n var missingBranch = function (path, branches, branch) {\n return nu$a(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$a(path, function () {\n return 'There are unsupported fields: [' + unsupported.join(', ') + '] specified';\n });\n };\n var custom = function (path, err) {\n return nu$a(path, constant$1(err));\n };\n\n var value$2 = function (validator) {\n var extract = function (path, val) {\n return SimpleResult.bindError(validator(val), function (err) {\n return custom(path, err);\n });\n };\n var toString = constant$1('val');\n return {\n extract: extract,\n toString: toString\n };\n };\n var anyValue$1 = value$2(SimpleResult.svalue);\n\n var requiredAccess = function (path, obj, key, bundle) {\n return get$e(obj, key).fold(function () {\n return missingRequired(path, key, obj);\n }, bundle);\n };\n var fallbackAccess = function (obj, key, fallback, bundle) {\n var v = get$e(obj, key).getOrThunk(function () {\n return fallback(obj);\n });\n return bundle(v);\n };\n var optionAccess = function (obj, key, bundle) {\n return bundle(get$e(obj, key));\n };\n var optionDefaultedAccess = function (obj, key, fallback, bundle) {\n var opt = get$e(obj, key).map(function (val) {\n return val === true ? fallback(obj) : val;\n });\n return bundle(opt);\n };\n var extractField = function (field, path, obj, key, prop) {\n var bundle = function (av) {\n return prop.extract(path.concat([key]), av);\n };\n var bundleAsOption = function (optValue) {\n return optValue.fold(function () {\n return SimpleResult.svalue(Optional.none());\n }, function (ov) {\n var result = prop.extract(path.concat([key]), ov);\n return SimpleResult.map(result, Optional.some);\n });\n };\n switch (field.tag) {\n case 'required':\n return requiredAccess(path, obj, key, bundle);\n case 'defaultedThunk':\n return fallbackAccess(obj, key, field.process, bundle);\n case 'option':\n return optionAccess(obj, key, bundleAsOption);\n case 'defaultedOptionThunk':\n return optionDefaultedAccess(obj, key, field.process, bundleAsOption);\n case 'mergeWithThunk': {\n return fallbackAccess(obj, key, constant$1({}), function (v) {\n var result = deepMerge(field.process(obj), v);\n return bundle(result);\n });\n }\n }\n };\n var extractFields = function (path, obj, fields) {\n var success = {};\n var errors = [];\n for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {\n var field = fields_1[_i];\n fold(field, function (key, newKey, presence, prop) {\n var result = extractField(presence, path, obj, key, prop);\n SimpleResult.fold(result, function (err) {\n errors.push.apply(errors, err);\n }, function (res) {\n success[newKey] = res;\n });\n }, function (newKey, instantiator) {\n success[newKey] = instantiator(obj);\n });\n }\n return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success);\n };\n var valueThunk = function (getDelegate) {\n var extract = function (path, val) {\n return getDelegate().extract(path, val);\n };\n var toString = function () {\n return getDelegate().toString();\n };\n return {\n extract: extract,\n toString: toString\n };\n };\n var getSetKeys = function (obj) {\n return keys(filter$1(obj, isNonNullable));\n };\n var objOfOnly = function (fields) {\n var delegate = objOf(fields);\n var fieldNames = foldr(fields, function (acc, value) {\n return fold(value, function (key) {\n var _a;\n return deepMerge(acc, (_a = {}, _a[key] = true, _a));\n }, constant$1(acc));\n }, {});\n var extract = function (path, o) {\n var keys = isBoolean(o) ? [] : getSetKeys(o);\n var extra = filter$2(keys, function (k) {\n return !hasNonNullableKey(fieldNames, k);\n });\n return extra.length === 0 ? delegate.extract(path, o) : unsupportedFields(path, extra);\n };\n return {\n extract: extract,\n toString: delegate.toString\n };\n };\n var objOf = function (values) {\n var extract = function (path, o) {\n return extractFields(path, o, values);\n };\n var toString = function () {\n var fieldStrings = map$2(values, function (value) {\n return fold(value, function (key, _okey, _presence, prop) {\n return key + ' -> ' + prop.toString();\n }, function (newKey, _instantiator) {\n return 'state(' + newKey + ')';\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, array) {\n var results = map$2(array, function (a, i) {\n return prop.extract(path.concat(['[' + i + ']']), 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, 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, 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$2(props, function (prop) {\n return prop.toString();\n }).join(', ') + ')';\n };\n return {\n extract: extract,\n toString: toString\n };\n };\n var setOf$1 = function (validator, prop) {\n var validateKeys = function (path, keys) {\n return arrOf(value$2(validator)).extract(path, keys);\n };\n var extract = function (path, 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$2(validKeys, function (vk) {\n return field$2(vk, vk, required$2(), prop);\n });\n return objOf(schema).extract(path, 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 thunk = function (_desc, processor) {\n var getP = cached(processor);\n var extract = function (path, val) {\n return getP().extract(path, val);\n };\n var toString = function () {\n return getP().toString();\n };\n return {\n extract: extract,\n toString: toString\n };\n };\n var arrOfObj = compose(arrOf, objOf);\n\n var anyValue = constant$1(anyValue$1);\n var typedValue = function (validator, expectedType) {\n return value$2(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 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 default:\n return false;\n }\n };\n var postMessageable = value$2(function (a) {\n if (isPostMessageable(a)) {\n return SimpleResult.svalue(a);\n } else {\n return SimpleResult.serror('Expected value to be acceptable for sending via postMessage');\n }\n });\n\n var chooseFrom = function (path, input, branches, ch) {\n var fields = get$e(branches, ch);\n return fields.fold(function () {\n return missingBranch(path, branches, ch);\n }, function (vp) {\n return vp.extract(path.concat(['branch: ' + ch]), input);\n });\n };\n var choose$2 = function (key, branches) {\n var extract = function (path, input) {\n var choice = get$e(input, key);\n return choice.fold(function () {\n return missingKey(path, key);\n }, function (chosen) {\n return chooseFrom(path, 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 arrOfVal = function () {\n return arrOf(anyValue$1);\n };\n var valueOf = function (validator) {\n return value$2(function (v) {\n return validator(v).fold(SimpleResult.serror, SimpleResult.svalue);\n });\n };\n var setOf = function (validator, prop) {\n return setOf$1(function (v) {\n return SimpleResult.fromResult(validator(v));\n }, prop);\n };\n var extractValue = function (label, prop, obj) {\n var res = prop.extract([label], 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(extractValue(label, prop, obj));\n };\n var getOrDie = function (extraction) {\n return extraction.fold(function (errInfo) {\n throw new Error(formatError(errInfo));\n }, identity$1);\n };\n var asRawOrDie$1 = 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 choose$1 = function (key, branches) {\n return choose$2(key, map$1(branches, objOf));\n };\n var thunkOf = function (desc, schema) {\n return thunk(desc, schema);\n };\n\n var field$1 = field$2;\n var customField = customField$1;\n var validateEnum = function (values) {\n return valueOf(function (value) {\n return contains$2(values, value) ? Result.value(value) : Result.error('Unsupported value: \"' + value + '\", choose one of \"' + values.join(', ') + '\".');\n });\n };\n var required$1 = function (key) {\n return field$1(key, key, required$2(), anyValue());\n };\n var requiredOf = function (key, schema) {\n return field$1(key, key, required$2(), schema);\n };\n var requiredNumber = function (key) {\n return requiredOf(key, number);\n };\n var requiredString = function (key) {\n return requiredOf(key, string);\n };\n var requiredStringEnum = function (key, values) {\n return field$1(key, key, required$2(), validateEnum(values));\n };\n var requiredBoolean = function (key) {\n return requiredOf(key, boolean);\n };\n var requiredFunction = function (key) {\n return requiredOf(key, functionProcessor);\n };\n var forbid = function (key, message) {\n return field$1(key, key, asOption(), value$2(function (_v) {\n return SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message);\n }));\n };\n var requiredObjOf = function (key, objSchema) {\n return field$1(key, key, required$2(), objOf(objSchema));\n };\n var requiredArrayOfObj = function (key, objFields) {\n return field$1(key, key, required$2(), arrOfObj(objFields));\n };\n var requiredArrayOf = function (key, schema) {\n return field$1(key, key, required$2(), arrOf(schema));\n };\n var option = function (key) {\n return field$1(key, key, asOption(), anyValue());\n };\n var optionOf = function (key, schema) {\n return field$1(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 = function (key, fallback) {\n return field$1(key, key, defaulted$1(fallback), anyValue());\n };\n var defaultedOf = function (key, fallback, schema) {\n return field$1(key, key, defaulted$1(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\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 return {\n get: get,\n set: set\n };\n };\n\n var generate$7 = 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$1(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 args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var argLength = args.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 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$2(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 var foldArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n foldArgs[_i] = arguments[_i];\n }\n if (foldArgs.length !== cases.length) {\n throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);\n }\n var target = foldArgs[count];\n return target.apply(null, args);\n },\n match: match,\n log: function (label) {\n 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$7 };\n\n 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$1 = function (results) {\n var errors = [];\n var values = [];\n each$1(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 var r = {};\n each(obj, function (v, k) {\n if (!contains$2(fields, k)) {\n r[k] = v;\n }\n });\n return r;\n };\n\n var wrap$2 = function (key, value) {\n var _a;\n return _a = {}, _a[key] = value, _a;\n };\n var wrapAll$1 = function (keyvalues) {\n var r = {};\n each$1(keyvalues, function (kv) {\n r[kv.key] = kv.value;\n });\n return r;\n };\n\n var exclude = function (obj, fields) {\n return exclude$1(obj, fields);\n };\n var wrap$1 = function (key, value) {\n return wrap$2(key, value);\n };\n var wrapAll = function (keyvalues) {\n return wrapAll$1(keyvalues);\n };\n var mergeValues = function (values, base) {\n return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge$1.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$1(objs);\n return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : mergeValues(partitions.values, base);\n };\n\n var ensureIsRoot = function (isRoot) {\n return isFunction(isRoot) ? isRoot : never;\n };\n var ancestor$2 = function (scope, transform, isRoot) {\n var element = scope.dom;\n var stop = ensureIsRoot(isRoot);\n while (element.parentNode) {\n element = element.parentNode;\n var el = SugarElement.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 Optional.none();\n };\n var closest$4 = function (scope, transform, isRoot) {\n var current = transform(scope);\n var stop = ensureIsRoot(isRoot);\n return current.orThunk(function () {\n return stop(scope) ? Optional.none() : ancestor$2(scope, transform, stop);\n });\n };\n\n var isSource = function (component, simulatedEvent) {\n return eq(component.element, simulatedEvent.event.target);\n };\n\n var defaultEventHandler = {\n can: always,\n abort: never,\n run: noop\n };\n var nu$9 = 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 __assign(__assign({}, defaultEventHandler), parts);\n };\n var all$2 = 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$2 = function (handler) {\n return isFunction(handler) ? {\n can: always,\n abort: never,\n run: handler\n } : handler;\n };\n var fuse$1 = function (handlers) {\n var can = all$2(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$1(handlers, function (handler) {\n handler.run.apply(undefined, args);\n });\n };\n return {\n can: can,\n abort: abort,\n run: run\n };\n };\n\n var constant = constant$1;\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 transitioncancel = constant('transitioncancel');\n var transitionend = constant('transitionend');\n var transitionstart = constant('transitionstart');\n var selectstart = constant('selectstart');\n\n var prefixName = function (name) {\n return constant$1('alloy.' + name);\n };\n var alloy = { tap: prefixName('tap') };\n var focus$4 = prefixName('focus');\n var postBlur = prefixName('blur.post');\n var postPaste = prefixName('paste.post');\n var receive = prefixName('receive');\n var execute$5 = prefixName('execute');\n var focusItem = prefixName('focus.item');\n var tap = alloy.tap;\n var longpress = prefixName('longpress');\n var sandboxClose = prefixName('sandbox.close');\n var typeaheadCancel = prefixName('typeahead.cancel');\n var systemInit = prefixName('system.init');\n var documentTouchmove = prefixName('system.touchmove');\n var documentTouchend = prefixName('system.touchend');\n var windowScroll = prefixName('system.scroll');\n var windowResize = prefixName('system.resize');\n var attachedToDom = prefixName('system.attached');\n var detachedFromDom = prefixName('system.detached');\n var dismissRequested = prefixName('system.dismissRequested');\n var repositionRequested = prefixName('system.repositionRequested');\n var focusShifted = prefixName('focusmanager.shifted');\n var slotVisibility = prefixName('slotcontainer.visibility');\n var changeTab = prefixName('change.tab');\n var dismissTab = prefixName('dismiss.tab');\n var highlight$1 = prefixName('highlight');\n var dehighlight$1 = prefixName('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$5());\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, data);\n };\n var dispatchEvent = function (component, target, event, simulatedEvent) {\n component.getSystem().triggerEvent(event, target, simulatedEvent.event);\n };\n\n var derive$2 = function (configs) {\n return wrapAll(configs);\n };\n var abort = function (name, predicate) {\n return {\n key: name,\n value: nu$9({ abort: predicate })\n };\n };\n var can = function (name, predicate) {\n return {\n key: name,\n value: nu$9({ can: predicate })\n };\n };\n var preventDefault = function (name) {\n return {\n key: name,\n value: nu$9({\n run: function (component, simulatedEvent) {\n simulatedEvent.event.prevent();\n }\n })\n };\n };\n var run$1 = function (name, handler) {\n return {\n key: name,\n value: nu$9({ run: handler })\n };\n };\n var runActionExtra = function (name, action, extra) {\n return {\n key: name,\n value: nu$9({\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$1(name, handler);\n };\n };\n var runOnSourceName = function (name) {\n return function (handler) {\n return {\n key: name,\n value: nu$9({\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$1(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$1(name, function (component, simulatedEvent) {\n var ev = simulatedEvent.event;\n var target = component.getSystem().getByDom(ev.target).getOrThunk(function () {\n var closest = closest$4(ev.target, function (el) {\n return component.getSystem().getByDom(el).toOptional();\n }, never);\n return closest.getOr(component);\n });\n f(component, target, simulatedEvent);\n });\n };\n var cutter = function (name) {\n return run$1(name, function (component, simulatedEvent) {\n simulatedEvent.cut();\n });\n };\n var stopper = function (name) {\n return run$1(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$1 = runOnName(execute$5());\n\n var fromHtml$1 = function (html, scope) {\n var doc = scope || document;\n var div = doc.createElement('div');\n div.innerHTML = html;\n return children(SugarElement.fromDom(div));\n };\n\n var get$7 = function (element) {\n return element.dom.innerHTML;\n };\n var set$5 = function (element, content) {\n var owner = owner$4(element);\n var docDom = owner.dom;\n var fragment = SugarElement.fromDom(docDom.createDocumentFragment());\n var contentElements = fromHtml$1(content, docDom);\n append$1(fragment, contentElements);\n empty(element);\n append$2(element, fragment);\n };\n var getOuter = function (element) {\n var container = SugarElement.fromTag('div');\n var clone = SugarElement.fromDom(element.dom.cloneNode(true));\n append$2(container, clone);\n return get$7(container);\n };\n\n var clone$2 = function (original, isDeep) {\n return SugarElement.fromDom(original.dom.cloneNode(isDeep));\n };\n var shallow = function (original) {\n return clone$2(original, false);\n };\n\n var getHtml = function (element) {\n if (isShadowRoot(element)) {\n return '#shadow-root';\n } else {\n var clone = shallow(element);\n return getOuter(clone);\n }\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$i = derive$2([can(focus$4(), function (component, simulatedEvent) {\n var event = simulatedEvent.event;\n var originator = event.originator;\n var target = event.target;\n if (isRecursive(component, originator, target)) {\n console.warn(focus$4() + ' did not get interpreted by the desired target. ' + '\\nOriginator: ' + element(originator) + '\\nTarget: ' + element(target) + '\\nCheck the ' + focus$4() + ' 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$i\n });\n\n var unique = 0;\n var generate$6 = 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$1 = constant$1('alloy-id-');\n var idAttr$1 = constant$1('data-alloy-id');\n\n var prefix = prefix$1();\n var idAttr = idAttr$1();\n var write = function (label, elem) {\n var id = generate$6(prefix + label);\n writeOnly(elem, id);\n return id;\n };\n var writeOnly = function (elem, uid) {\n Object.defineProperty(elem.dom, idAttr, {\n value: uid,\n writable: true\n });\n };\n var read$1 = function (elem) {\n var id = isElement$2(elem) ? elem.dom[idAttr] : null;\n return Optional.from(id);\n };\n var generate$5 = function (prefix) {\n return generate$6(prefix);\n };\n\n var make$8 = identity$1;\n\n var NoContextApi = function (getComp) {\n var getMessage = function (event) {\n return 'The component must be in a context to execute: ' + event + (getComp ? '\\n' + element(getComp().element) + ' is not in context.' : '');\n };\n var fail = function (event) {\n return function () {\n throw new Error(getMessage(event));\n };\n };\n var warn = function (event) {\n return function () {\n console.warn(getMessage(event));\n };\n };\n return {\n debugInfo: constant$1('fake'),\n triggerEvent: warn('triggerEvent'),\n triggerFocus: warn('triggerFocus'),\n triggerEscape: warn('triggerEscape'),\n broadcast: warn('broadcast'),\n broadcastOn: warn('broadcastOn'),\n broadcastEvent: warn('broadcastEvent'),\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 isConnected: never\n };\n };\n var singleton$1 = 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$2(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$6('alloy-premade');\n var premade$1 = function (comp) {\n return wrap$1(premadeTag, comp);\n };\n var getPremade = function (spec) {\n return get$e(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(void 0, __spreadArray([\n component.getApis(),\n component\n ], rest, false));\n }, f);\n };\n\n var NoState = {\n init: function () {\n return nu$8({ readState: constant$1('No State required') });\n }\n };\n var nu$8 = function (spec) {\n return spec;\n };\n\n var generateFrom$1 = function (spec, all) {\n var schema = map$2(all, function (a) {\n return optionObjOf(a.name(), [\n required$1('config'),\n defaulted('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 }, identity$1);\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 constant$1(output);\n })\n };\n };\n var getBehaviours$3 = function (bData) {\n return bData.list;\n };\n var getData$2 = function (bData) {\n return bData.data;\n };\n\n var byInnerKey = function (data, tuple) {\n var r = {};\n each(data, function (detail, key) {\n each(detail, function (value, indexKey) {\n var chain = get$e(r, indexKey).getOr([]);\n r[indexKey] = chain.concat([tuple(key, value)]);\n });\n });\n return r;\n };\n\n var nu$7 = function (s) {\n return {\n classes: isUndefined(s.classes) ? [] : s.classes,\n attributes: isUndefined(s.attributes) ? {} : s.attributes,\n styles: isUndefined(s.styles) ? {} : s.styles\n };\n };\n var merge = 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$2 = function (info, baseMod, behaviours, base) {\n var modsByBehaviour = __assign({}, baseMod);\n each$1(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$7({\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: purpose\n };\n };\n var curried = function (handler, purpose) {\n return {\n cHandler: handler,\n purpose: 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: name,\n handler: handler\n };\n };\n var nameToHandlers = function (behaviours, info) {\n var r = {};\n each$1(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$2(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$2(tuples, function (c) {\n return c.name;\n }), null, 2)]);\n };\n var fuse = 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$2(sortedTuples, function (tuple) {\n return tuple.handler;\n });\n return fuse$1(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(tuples, eventOrder, eventName);\n return combined.map(function (handler) {\n var assembled = assemble(handler);\n var purpose = tuples.length > 1 ? filter$2(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 _a$2;\n var baseBehaviour = 'alloy.base.behaviour';\n var schema$z = objOf([\n field$1('dom', 'dom', required$2(), objOf([\n required$1('tag'),\n defaulted('styles', {}),\n defaulted('classes', []),\n defaulted('attributes', {}),\n option('value'),\n option('innerHtml')\n ])),\n required$1('components'),\n required$1('uid'),\n defaulted('events', {}),\n defaulted('apis', {}),\n field$1('eventOrder', 'eventOrder', mergeWith((_a$2 = {}, _a$2[execute$5()] = [\n 'disabling',\n baseBehaviour,\n 'toggling',\n 'typeaheadevents'\n ], _a$2[focus$4()] = [\n baseBehaviour,\n 'focusing',\n 'keying'\n ], _a$2[systemInit()] = [\n baseBehaviour,\n 'disabling',\n 'toggling',\n 'representing'\n ], _a$2[input()] = [\n baseBehaviour,\n 'representing',\n 'streaming',\n 'invalidating'\n ], _a$2[detachedFromDom()] = [\n baseBehaviour,\n 'representing',\n 'item-events',\n 'tooltipping'\n ], _a$2[mousedown()] = [\n 'focusing',\n baseBehaviour,\n 'item-type-events'\n ], _a$2[touchstart()] = [\n 'focusing',\n baseBehaviour,\n 'item-type-events'\n ], _a$2[mouseover()] = [\n 'item-type-events',\n 'tooltipping'\n ], _a$2[receive()] = [\n 'receiving',\n 'reflecting',\n 'tooltipping'\n ], _a$2)), anyValue()),\n option('domModification')\n ]);\n var toInfo = function (spec) {\n return asRaw('custom.definition', schema$z, spec);\n };\n var toDefinition = function (detail) {\n return __assign(__assign({}, detail.dom), {\n uid: detail.uid,\n domChildren: map$2(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$7({});\n }, nu$7);\n };\n var toEvents = function (info) {\n return info.events;\n };\n\n var read = function (element, attr) {\n var value = get$d(element, attr);\n return value === undefined || value === '' ? [] : value.split(' ');\n };\n var add$4 = function (element, attr, id) {\n var old = read(element, attr);\n var nu = old.concat([id]);\n set$8(element, attr, nu.join(' '));\n return true;\n };\n var remove$4 = function (element, attr, id) {\n var nu = filter$2(read(element, attr), function (v) {\n return v !== id;\n });\n if (nu.length > 0) {\n set$8(element, attr, nu.join(' '));\n } else {\n remove$7(element, attr);\n }\n return false;\n };\n\n var supports = function (element) {\n return element.dom.classList !== undefined;\n };\n var get$6 = function (element) {\n return read(element, 'class');\n };\n var add$3 = function (element, clazz) {\n return add$4(element, 'class', clazz);\n };\n var remove$3 = function (element, clazz) {\n return remove$4(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$3(element, clazz);\n }\n };\n var cleanClass = function (element) {\n var classList = supports(element) ? element.dom.classList : get$6(element);\n if (classList.length === 0) {\n remove$7(element, 'class');\n }\n };\n var remove$2 = 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 = function (element, clazz) {\n return supports(element) && element.dom.classList.contains(clazz);\n };\n\n var add$1 = function (element, classes) {\n each$1(classes, function (x) {\n add$2(element, x);\n });\n };\n var remove$1 = function (element, classes) {\n each$1(classes, function (x) {\n remove$2(element, x);\n });\n };\n var hasAll = function (element, classes) {\n return forall(classes, function (clazz) {\n return has(element, clazz);\n });\n };\n\n var get$5 = function (element) {\n return element.dom.value;\n };\n var set$4 = 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 = SugarElement.fromTag(definition.tag);\n setAll$1(subject, definition.attributes);\n add$1(subject, definition.classes);\n setAll(subject, definition.styles);\n definition.innerHtml.each(function (html) {\n return set$5(subject, html);\n });\n var children = definition.domChildren;\n append$1(subject, children);\n definition.value.each(function (value) {\n set$4(subject, value);\n });\n if (!definition.uid) {\n debugger;\n }\n writeOnly(subject, definition.uid);\n return subject;\n };\n\n var getBehaviours$2 = function (spec) {\n var behaviours = get$e(spec, 'behaviours').getOr({});\n return bind$3(keys(behaviours), function (name) {\n var behaviour = behaviours[name];\n return isNonNullable(behaviour) ? [behaviour.me] : [];\n });\n };\n var generateFrom = function (spec, all) {\n return generateFrom$1(spec, all);\n };\n var generate$4 = function (spec) {\n var all = getBehaviours$2(spec);\n return generateFrom(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$2(bData, baseModification, bList, definition) : infoModification;\n return merge(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$2 = function (spec) {\n var getMe = function () {\n return me;\n };\n var systemApi = Cell(singleton$1);\n var info = getOrDie(toInfo(spec));\n var bBlob = generate$4(spec);\n var bList = getBehaviours$3(bBlob);\n var bData = getData$2(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$3(children$1, function (child) {\n return systemApi.get().getByDom(child).fold(function () {\n return [];\n }, pure$2);\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 uid: spec.uid,\n getSystem: systemApi.get,\n config: config,\n hasConfigured: hasConfigured,\n spec: spec,\n readState: readState,\n getApis: getApis,\n connect: connect,\n disconnect: disconnect,\n element: item,\n syncComponents: syncComponents,\n components: subcomponents.get,\n events: events\n };\n return me;\n };\n\n var buildSubcomponents = function (spec) {\n var components = get$e(spec, 'components').getOr([]);\n return map$2(components, build$1);\n };\n var buildFromSpec = function (userSpec) {\n var _a = make$8(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$2(completeSpec));\n };\n var text$1 = function (textContent) {\n var element = SugarElement.fromText(textContent);\n return external$2({ element: element });\n };\n var external$2 = function (spec) {\n var extSpec = asRawOrDie$1('external.component', objOfOnly([\n required$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 var uid = extSpec.uid.getOrThunk(function () {\n return generate$5('external');\n });\n writeOnly(extSpec.element, uid);\n var me = {\n uid: uid,\n getSystem: systemApi.get,\n config: Optional.none,\n hasConfigured: never,\n connect: connect,\n disconnect: disconnect,\n getApis: function () {\n return {};\n },\n element: extSpec.element,\n spec: spec,\n readState: constant$1('No state'),\n syncComponents: noop,\n components: constant$1([]),\n events: {}\n };\n return premade$1(me);\n };\n var uids = generate$5;\n var isSketchSpec$1 = function (spec) {\n return has$2(spec, 'uid');\n };\n var build$1 = function (spec) {\n return getPremade(spec).getOrThunk(function () {\n var userSpecWithUid = isSketchSpec$1(spec) ? spec : __assign({ uid: uids('') }, spec);\n return buildFromSpec(userSpecWithUid).getOrDie();\n });\n };\n var premade = premade$1;\n\n function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {\n if (is(scope, a)) {\n return Optional.some(scope);\n } else if (isFunction(isRoot) && isRoot(scope)) {\n return Optional.none();\n } else {\n return ancestor(scope, a, isRoot);\n }\n }\n\n var ancestor$1 = function (scope, predicate, isRoot) {\n var element = scope.dom;\n var stop = isFunction(isRoot) ? isRoot : never;\n while (element.parentNode) {\n element = element.parentNode;\n var el = SugarElement.fromDom(element);\n if (predicate(el)) {\n return Optional.some(el);\n } else if (stop(el)) {\n break;\n }\n }\n return Optional.none();\n };\n var closest$3 = 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 child$1 = function (scope, predicate) {\n var pred = function (node) {\n return predicate(SugarElement.fromDom(node));\n };\n var result = find$5(scope.dom.childNodes, pred);\n return result.map(SugarElement.fromDom);\n };\n var descendant$1 = function (scope, predicate) {\n var descend = function (node) {\n for (var i = 0; i < node.childNodes.length; i++) {\n var child_1 = SugarElement.fromDom(node.childNodes[i]);\n if (predicate(child_1)) {\n return Optional.some(child_1);\n }\n var res = descend(node.childNodes[i]);\n if (res.isSome()) {\n return res;\n }\n }\n return Optional.none();\n };\n return descend(scope.dom);\n };\n\n var closest$2 = function (scope, predicate, isRoot) {\n return closest$3(scope, predicate, isRoot).isSome();\n };\n\n var ancestor = function (scope, selector, isRoot) {\n return ancestor$1(scope, function (e) {\n return is(e, selector);\n }, isRoot);\n };\n var child = function (scope, selector) {\n return child$1(scope, function (e) {\n return is(e, selector);\n });\n };\n var descendant = function (scope, selector) {\n return one(selector, scope);\n };\n var closest$1 = function (scope, selector, isRoot) {\n var is$1 = function (element, selector) {\n return is(element, selector);\n };\n return ClosestOrAncestor(is$1, ancestor, scope, selector, isRoot);\n };\n\n var find$1 = function (queryElem) {\n var dependent = closest$3(queryElem, function (elem) {\n if (!isElement$2(elem)) {\n return false;\n }\n var id = get$d(elem, 'id');\n return id !== undefined && id.indexOf('aria-owns') > -1;\n });\n return dependent.bind(function (dep) {\n var id = get$d(dep, 'id');\n var dos = getRootNode(dep);\n return descendant(dos, '[aria-owns=\"' + id + '\"]');\n });\n };\n var manager = function () {\n var ariaId = generate$6('aria-owns');\n var link = function (elem) {\n set$8(elem, 'aria-owns', ariaId);\n };\n var unlink = function (elem) {\n remove$7(elem, 'aria-owns');\n };\n return {\n id: ariaId,\n link: link,\n unlink: unlink\n };\n };\n\n var isAriaPartOf = function (component, queryElem) {\n return find$1(queryElem).exists(function (owner) {\n return isPartOf$1(component, owner);\n });\n };\n var isPartOf$1 = function (component, queryElem) {\n return closest$2(queryElem, function (el) {\n return eq(el, component.element);\n }, never) || isAriaPartOf(component, queryElem);\n };\n\n var unknown = '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$2([\n 'mousemove',\n 'mouseover',\n 'mouseout',\n systemInit()\n ], eventName)) {\n return;\n }\n console.log(eventName, {\n event: eventName,\n time: finishTime - startTime,\n target: initialTarget.dom,\n sequence: map$2(sequence, function (s) {\n if (!contains$2([\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$e(eventConfig.get(), eventName).orThunk(function () {\n var patterns = keys(eventConfig.get());\n return findMap(patterns, function (p) {\n return eventName.indexOf(p) > -1 ? Optional.some(eventConfig.get()[p]) : Optional.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$5(lines, function (line) {\n return line.indexOf('alloy') > 0 && !exists(path, function (p) {\n return line.indexOf(p) > -1;\n });\n }).getOr(unknown);\n } else {\n return unknown;\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$1(ignoreEvent);\n\n var menuFields = constant$1([\n required$1('menu'),\n required$1('selectedMenu')\n ]);\n var itemFields = constant$1([\n required$1('item'),\n required$1('selectedItem')\n ]);\n constant$1(objOf(itemFields().concat(menuFields())));\n var itemSchema$3 = constant$1(objOf(itemFields()));\n\n var _initSize = requiredObjOf('initSize', [\n required$1('numColumns'),\n required$1('numRows')\n ]);\n var itemMarkers = function () {\n return requiredOf('markers', itemSchema$3());\n };\n var tieredMenuMarkers = function () {\n return requiredObjOf('markers', [required$1('backgroundMenu')].concat(menuFields()).concat(itemFields()));\n };\n var markers$1 = function (required) {\n return requiredObjOf('markers', map$2(required, required$1));\n };\n var onPresenceHandler = function (label, fieldName, presence) {\n getTrace();\n return field$1(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$1(noop));\n };\n var onKeyboardHandler = function (fieldName) {\n return onPresenceHandler('onKeyboardHandler', fieldName, defaulted$1(Optional.none));\n };\n var onStrictHandler = function (fieldName) {\n return onPresenceHandler('onHandler', fieldName, required$2());\n };\n var onStrictKeyboardHandler = function (fieldName) {\n return onPresenceHandler('onKeyboardHandler', fieldName, required$2());\n };\n var output$1 = function (name, value) {\n return customField(name, constant$1(value));\n };\n var snapshot = function (name) {\n return customField(name, identity$1);\n };\n var initSize = constant$1(_initSize);\n\n var nu$6 = function (x, y, bubble, direction, placement, boundsRestriction, labelPrefix, alwaysFit) {\n if (alwaysFit === void 0) {\n alwaysFit = false;\n }\n return {\n x: x,\n y: y,\n bubble: bubble,\n direction: direction,\n placement: placement,\n restriction: boundsRestriction,\n label: labelPrefix + '-' + placement,\n alwaysFit: alwaysFit\n };\n };\n\n var adt$a = Adt.generate([\n { southeast: [] },\n { southwest: [] },\n { northeast: [] },\n { northwest: [] },\n { south: [] },\n { north: [] },\n { east: [] },\n { west: [] }\n ]);\n var cata$2 = 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$3 = adt$a.southeast;\n var southwest$3 = adt$a.southwest;\n var northeast$3 = adt$a.northeast;\n var northwest$3 = adt$a.northwest;\n var south$3 = adt$a.south;\n var north$3 = adt$a.north;\n var east$3 = adt$a.east;\n var west$3 = adt$a.west;\n\n var cycleBy = function (value, delta, min, max) {\n var r = value + delta;\n if (r > max) {\n return min;\n } else if (r < min) {\n return max;\n } else {\n return r;\n }\n };\n var clamp$1 = function (value, min, max) {\n return Math.min(Math.max(value, min), max);\n };\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$e(restrictions, dir).map(function (restriction) {\n return getRestriction(anchor, restriction);\n });\n });\n };\n var adjustBounds = function (bounds$1, restriction, bubbleOffset) {\n var applyRestriction = function (dir, current) {\n return restriction[dir].map(function (pos) {\n var isVerticalAxis = dir === 'top' || dir === 'bottom';\n var offset = isVerticalAxis ? bubbleOffset.top : bubbleOffset.left;\n var comparator = dir === 'left' || dir === 'top' ? Math.max : Math.min;\n var newPos = comparator(pos, current) + offset;\n return isVerticalAxis ? clamp$1(newPos, bounds$1.y, bounds$1.bottom) : clamp$1(newPos, bounds$1.x, bounds$1.right);\n }).getOr(current);\n };\n var adjustedLeft = applyRestriction('left', bounds$1.x);\n var adjustedTop = applyRestriction('top', bounds$1.y);\n var adjustedRight = applyRestriction('right', bounds$1.right);\n var adjustedBottom = applyRestriction('bottom', bounds$1.bottom);\n return bounds(adjustedLeft, adjustedTop, adjustedRight - adjustedLeft, adjustedBottom - adjustedTop);\n };\n\n var labelPrefix$2 = 'layout';\n var eastX$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 westX$1 = function (anchor, element) {\n return anchor.x + anchor.width - element.width;\n };\n var northY$2 = function (anchor, element) {\n return anchor.y - element.height;\n };\n var southY$2 = function (anchor) {\n return anchor.y + anchor.height;\n };\n var centreY$1 = function (anchor, element) {\n return anchor.y + anchor.height / 2 - element.height / 2;\n };\n var eastEdgeX$1 = function (anchor) {\n return anchor.x + anchor.width;\n };\n var westEdgeX$1 = function (anchor, element) {\n return anchor.x - element.width;\n };\n var southeast$2 = function (anchor, element, bubbles) {\n return nu$6(eastX$1(anchor), southY$2(anchor), bubbles.southeast(), southeast$3(), 'southeast', boundsRestriction(anchor, {\n left: 1,\n top: 3\n }), labelPrefix$2);\n };\n var southwest$2 = function (anchor, element, bubbles) {\n return nu$6(westX$1(anchor, element), southY$2(anchor), bubbles.southwest(), southwest$3(), 'southwest', boundsRestriction(anchor, {\n right: 0,\n top: 3\n }), labelPrefix$2);\n };\n var northeast$2 = function (anchor, element, bubbles) {\n return nu$6(eastX$1(anchor), northY$2(anchor, element), bubbles.northeast(), northeast$3(), 'northeast', boundsRestriction(anchor, {\n left: 1,\n bottom: 2\n }), labelPrefix$2);\n };\n var northwest$2 = function (anchor, element, bubbles) {\n return nu$6(westX$1(anchor, element), northY$2(anchor, element), bubbles.northwest(), northwest$3(), 'northwest', boundsRestriction(anchor, {\n right: 0,\n bottom: 2\n }), labelPrefix$2);\n };\n var north$2 = function (anchor, element, bubbles) {\n return nu$6(middleX$1(anchor, element), northY$2(anchor, element), bubbles.north(), north$3(), 'north', boundsRestriction(anchor, { bottom: 2 }), labelPrefix$2);\n };\n var south$2 = function (anchor, element, bubbles) {\n return nu$6(middleX$1(anchor, element), southY$2(anchor), bubbles.south(), south$3(), 'south', boundsRestriction(anchor, { top: 3 }), labelPrefix$2);\n };\n var east$2 = function (anchor, element, bubbles) {\n return nu$6(eastEdgeX$1(anchor), centreY$1(anchor, element), bubbles.east(), east$3(), 'east', boundsRestriction(anchor, { left: 0 }), labelPrefix$2);\n };\n var west$2 = function (anchor, element, bubbles) {\n return nu$6(westEdgeX$1(anchor, element), centreY$1(anchor, element), bubbles.west(), west$3(), 'west', boundsRestriction(anchor, { right: 1 }), labelPrefix$2);\n };\n var all$1 = function () {\n return [\n southeast$2,\n southwest$2,\n northeast$2,\n northwest$2,\n south$2,\n north$2,\n east$2,\n west$2\n ];\n };\n var allRtl$1 = function () {\n return [\n southwest$2,\n southeast$2,\n northwest$2,\n northeast$2,\n south$2,\n north$2,\n east$2,\n west$2\n ];\n };\n var aboveOrBelow = function () {\n return [\n northeast$2,\n northwest$2,\n southeast$2,\n southwest$2,\n north$2,\n south$2\n ];\n };\n var aboveOrBelowRtl = function () {\n return [\n northwest$2,\n northeast$2,\n southwest$2,\n southeast$2,\n north$2,\n south$2\n ];\n };\n var belowOrAbove = function () {\n return [\n southeast$2,\n southwest$2,\n northeast$2,\n northwest$2,\n south$2,\n north$2\n ];\n };\n var belowOrAboveRtl = function () {\n return [\n southwest$2,\n southeast$2,\n northwest$2,\n northeast$2,\n south$2,\n north$2\n ];\n };\n\n var chooseChannels = function (channels, message) {\n return message.universal ? channels : filter$2(channels, function (ch) {\n return contains$2(message.channels, ch);\n });\n };\n var events$h = function (receiveConfig) {\n return derive$2([run$1(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$1(targetChannels, function (ch) {\n var channelInfo = channelMap[ch];\n var channelSchema = channelInfo.schema;\n var data = asRawOrDie$1('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$h\n });\n\n var ReceivingSchema = [requiredOf('channels', setOf(Result.value, objOfOnly([\n onStrictHandler('onReceive'),\n defaulted('schema', anyValue())\n ])))];\n\n var executeEvent = function (bConfig, bState, executor) {\n return runOnExecute$1(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$9 = 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$1 = 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$1(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]() : Optional.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$1(name + '-config', configSchema, spec);\n return {\n key: name,\n value: {\n config: prepared,\n me: me,\n configAsRaw: cached(function () {\n return asRawOrDie$1(name + '-config', configSchema, spec);\n }),\n initialConfig: spec,\n state: state\n }\n };\n },\n schema: constant$1(schemaSchema),\n exhibit: function (info, base) {\n return lift2(getConfig(info), get$e(active, 'exhibit'), function (behaviourInfo, exhibitor) {\n return exhibitor(base, behaviourInfo.config, behaviourInfo.state);\n }).getOrThunk(function () {\n return nu$7({});\n });\n },\n name: constant$1(name),\n handlers: function (info) {\n return getConfig(info).map(function (behaviourInfo) {\n var getEvents = get$e(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(capabilities);\n };\n var simpleSchema = objOfOnly([\n required$1('fields'),\n required$1('name'),\n defaulted('active', {}),\n defaulted('apis', {}),\n defaulted('state', NoState),\n defaulted('extra', {})\n ]);\n var create$8 = function (data) {\n var value = asRawOrDie$1('Creating behaviour: ' + data.name, simpleSchema, data);\n return create$9(value.fields, value.name, value.active, value.apis, value.extra, value.state);\n };\n var modeSchema = objOfOnly([\n required$1('branchKey'),\n required$1('branches'),\n required$1('name'),\n defaulted('active', {}),\n defaulted('apis', {}),\n defaulted('state', NoState),\n defaulted('extra', {})\n ]);\n var createModes = function (data) {\n var value = asRawOrDie$1('Creating behaviour: ' + data.name, modeSchema, data);\n return createModes$1(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state);\n };\n var revoke = constant$1(undefined);\n\n var Receiving = create$8({\n fields: ReceivingSchema,\n name: 'receiving',\n active: ActiveReceiving\n });\n\n var exhibit$6 = function (base, posConfig) {\n return nu$7({\n classes: [],\n styles: posConfig.useFixed() ? {} : { position: 'relative' }\n });\n };\n\n var ActivePosition = /*#__PURE__*/Object.freeze({\n __proto__: null,\n exhibit: exhibit$6\n });\n\n var getDocument = function () {\n return SugarElement.fromDom(document);\n };\n\n var focus$3 = function (element) {\n return element.dom.focus();\n };\n var blur$1 = function (element) {\n return element.dom.blur();\n };\n var hasFocus = function (element) {\n var root = getRootNode(element).dom;\n return element.dom === root.activeElement;\n };\n var active = function (root) {\n if (root === void 0) {\n root = getDocument();\n }\n return Optional.from(root.dom.activeElement).map(SugarElement.fromDom);\n };\n var search = function (element) {\n return active(getRootNode(element)).filter(function (e) {\n return element.dom.contains(e.dom);\n });\n };\n\n var preserve$1 = function (f, container) {\n var dos = getRootNode(container);\n var refocus = active(dos).bind(function (focused) {\n var hasFocus = function (elem) {\n return eq(focused, elem);\n };\n return hasFocus(container) ? Optional.some(container) : descendant$1(container, hasFocus);\n });\n var result = f(container);\n refocus.each(function (oldFocus) {\n active(dos).filter(function (newFocus) {\n return eq(newFocus, oldFocus);\n }).fold(function () {\n focus$3(oldFocus);\n }, noop);\n });\n return result;\n };\n\n var NuPositionCss = function (position, left, top, right, bottom) {\n var toPx = function (num) {\n return num + 'px';\n };\n return {\n position: position,\n left: left.map(toPx),\n top: top.map(toPx),\n right: right.map(toPx),\n bottom: bottom.map(toPx)\n };\n };\n var toOptions = function (position) {\n return __assign(__assign({}, position), { position: Optional.some(position.position) });\n };\n var applyPositionCss = function (element, position) {\n setOptions(element, toOptions(position));\n };\n\n var adt$9 = 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 decisionRect = decision.rect;\n var decisionX = decisionRect.x - x;\n var decisionY = decisionRect.y - y;\n var decisionWidth = decisionRect.width;\n var decisionHeight = decisionRect.height;\n var decisionRight = width - (decisionX + decisionWidth);\n var decisionBottom = height - (decisionY + decisionHeight);\n var left = Optional.some(decisionX);\n var top = Optional.some(decisionY);\n var right = Optional.some(decisionRight);\n var bottom = Optional.some(decisionBottom);\n var none = Optional.none();\n return cata$2(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 var decisionRect = decision.rect;\n return NuPositionCss('absolute', Optional.some(decisionRect.x), Optional.some(decisionRect.y), Optional.none(), Optional.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$2, element);\n var position = origin.fold(rel, rel, function () {\n var scroll = get$9();\n return find$2(element).translate(-scroll.left, -scroll.top);\n });\n var width = getOuter$1(element);\n var height = getOuter$2(element);\n return bounds(position.left, position.top, width, height);\n };\n var viewport = function (origin, getBounds) {\n return getBounds.fold(function () {\n return origin.fold(win, win, bounds);\n }, function (b) {\n return origin.fold(b, b, function () {\n var bounds$1 = b();\n var pos = translate$2(origin, bounds$1.x, bounds$1.y);\n return bounds(pos.left, pos.top, bounds$1.width, bounds$1.height);\n });\n });\n };\n var translate$2 = function (origin, x, y) {\n var pos = SugarPosition(x, y);\n var removeScroll = function () {\n var outerScroll = get$9();\n return pos.translate(-outerScroll.left, -outerScroll.top);\n };\n return origin.fold(constant$1(pos), constant$1(pos), removeScroll);\n };\n var cata$1 = function (subject, onNone, onRelative, onFixed) {\n return subject.fold(onNone, onRelative, onFixed);\n };\n adt$9.none;\n var relative$1 = adt$9.relative;\n var fixed$1 = adt$9.fixed;\n\n var anchor = function (anchorBox, origin) {\n return {\n anchorBox: anchorBox,\n origin: origin\n };\n };\n var box = function (anchorBox, origin) {\n return anchor(anchorBox, origin);\n };\n\n var placementAttribute = 'data-alloy-placement';\n var setPlacement$1 = function (element, placement) {\n set$8(element, placementAttribute, placement);\n };\n var getPlacement = function (element) {\n return getOpt(element, placementAttribute);\n };\n var reset$2 = function (element) {\n return remove$7(element, placementAttribute);\n };\n\n var adt$8 = Adt.generate([\n { fit: ['reposition'] },\n {\n nofit: [\n 'reposition',\n 'visibleW',\n 'visibleH',\n 'isVisible'\n ]\n }\n ]);\n var determinePosition = function (box, bounds) {\n var boundsX = bounds.x, boundsY = bounds.y, boundsRight = bounds.right, boundsBottom = bounds.bottom;\n var x = box.x, y = box.y, right = box.right, bottom = box.bottom, width = box.width, height = box.height;\n var xInBounds = x >= boundsX && x <= boundsRight;\n var yInBounds = y >= boundsY && y <= boundsBottom;\n var originInBounds = xInBounds && yInBounds;\n var rightInBounds = right <= boundsRight && right >= boundsX;\n var bottomInBounds = bottom <= boundsBottom && bottom >= boundsY;\n var sizeInBounds = rightInBounds && bottomInBounds;\n var visibleW = Math.min(width, x >= boundsX ? boundsRight - x : right - boundsX);\n var visibleH = Math.min(height, y >= boundsY ? boundsBottom - y : bottom - boundsY);\n return {\n originInBounds: originInBounds,\n sizeInBounds: sizeInBounds,\n visibleW: visibleW,\n visibleH: visibleH\n };\n };\n var calcReposition = function (box, bounds$1) {\n var boundsX = bounds$1.x, boundsY = bounds$1.y, boundsRight = bounds$1.right, boundsBottom = bounds$1.bottom;\n var x = box.x, y = box.y, width = box.width, height = box.height;\n var maxX = Math.max(boundsX, boundsRight - width);\n var maxY = Math.max(boundsY, boundsBottom - height);\n var restrictedX = clamp$1(x, boundsX, maxX);\n var restrictedY = clamp$1(y, boundsY, maxY);\n var restrictedWidth = Math.min(restrictedX + width, boundsRight) - restrictedX;\n var restrictedHeight = Math.min(restrictedY + height, boundsBottom) - restrictedY;\n return bounds(restrictedX, restrictedY, restrictedWidth, restrictedHeight);\n };\n var calcMaxSizes = function (direction, box, bounds) {\n var upAvailable = constant$1(box.bottom - bounds.y);\n var downAvailable = constant$1(bounds.bottom - box.y);\n var maxHeight = cataVertical(direction, downAvailable, downAvailable, upAvailable);\n var westAvailable = constant$1(box.right - bounds.x);\n var eastAvailable = constant$1(bounds.right - box.x);\n var maxWidth = cataHorizontal(direction, eastAvailable, eastAvailable, westAvailable);\n return {\n maxWidth: maxWidth,\n maxHeight: maxHeight\n };\n };\n var attempt = function (candidate, width, height, bounds$1) {\n var bubble = candidate.bubble;\n var bubbleOffset = bubble.offset;\n var adjustedBounds = adjustBounds(bounds$1, candidate.restriction, bubbleOffset);\n var newX = candidate.x + bubbleOffset.left;\n var newY = candidate.y + bubbleOffset.top;\n var box = bounds(newX, newY, width, height);\n var _a = determinePosition(box, adjustedBounds), originInBounds = _a.originInBounds, sizeInBounds = _a.sizeInBounds, visibleW = _a.visibleW, visibleH = _a.visibleH;\n var fits = originInBounds && sizeInBounds;\n var fittedBox = fits ? box : calcReposition(box, adjustedBounds);\n var isPartlyVisible = fittedBox.width > 0 && fittedBox.height > 0;\n var _b = calcMaxSizes(candidate.direction, fittedBox, bounds$1), maxWidth = _b.maxWidth, maxHeight = _b.maxHeight;\n var reposition = {\n rect: fittedBox,\n maxHeight: maxHeight,\n maxWidth: maxWidth,\n direction: candidate.direction,\n placement: candidate.placement,\n classes: {\n on: bubble.classesOn,\n off: bubble.classesOff\n },\n layout: candidate.label,\n testY: newY\n };\n return fits || candidate.alwaysFit ? adt$8.fit(reposition) : adt$8.nofit(reposition, visibleW, visibleH, isPartlyVisible);\n };\n var attempts = function (element, candidates, anchorBox, elementBox, bubbles, bounds) {\n var panelWidth = elementBox.width;\n var panelHeight = elementBox.height;\n var attemptBestFit = function (layout, reposition, visibleW, visibleH, isVisible) {\n var next = layout(anchorBox, elementBox, bubbles, element, bounds);\n var attemptLayout = attempt(next, panelWidth, panelHeight, bounds);\n return attemptLayout.fold(constant$1(attemptLayout), function (newReposition, newVisibleW, newVisibleH, newIsVisible) {\n var improved = isVisible === newIsVisible ? newVisibleH > visibleH || newVisibleW > visibleW : !isVisible && newIsVisible;\n return improved ? attemptLayout : adt$8.nofit(reposition, visibleW, visibleH, isVisible);\n });\n };\n var abc = foldl(candidates, function (b, a) {\n var bestNext = curry(attemptBestFit, a);\n return b.fold(constant$1(b), bestNext);\n }, adt$8.nofit({\n rect: anchorBox,\n maxHeight: elementBox.height,\n maxWidth: elementBox.width,\n direction: southeast$3(),\n placement: 'southeast',\n classes: {\n on: [],\n off: []\n },\n layout: 'none',\n testY: anchorBox.y\n }, -1, -1, false));\n return abc.fold(identity$1, identity$1);\n };\n\n var singleton = function (doRevoke) {\n var subject = Cell(Optional.none());\n var revoke = function () {\n return subject.get().each(doRevoke);\n };\n var clear = function () {\n revoke();\n subject.set(Optional.none());\n };\n var isSet = function () {\n return subject.get().isSome();\n };\n var get = function () {\n return subject.get();\n };\n var set = function (s) {\n revoke();\n subject.set(Optional.some(s));\n };\n return {\n clear: clear,\n isSet: isSet,\n get: get,\n set: set\n };\n };\n var destroyable = function () {\n return singleton(function (s) {\n return s.destroy();\n });\n };\n var unbindable = function () {\n return singleton(function (s) {\n return s.unbind();\n });\n };\n var api$1 = function () {\n var subject = destroyable();\n var run = function (f) {\n return subject.get().each(f);\n };\n return __assign(__assign({}, subject), { run: run });\n };\n var value$1 = function () {\n var subject = singleton(noop);\n var on = function (f) {\n return subject.get().each(f);\n };\n return __assign(__assign({}, subject), { on: on });\n };\n\n var filter = always;\n var bind = function (element, event, handler) {\n return bind$2(element, event, filter, handler);\n };\n var capture = function (element, event, handler) {\n return capture$1(element, event, filter, handler);\n };\n var fromRawEvent = fromRawEvent$1;\n\n var properties = [\n 'top',\n 'bottom',\n 'right',\n 'left'\n ];\n var timerAttr = 'data-alloy-transition-timer';\n var isTransitioning$1 = function (element, transition) {\n return hasAll(element, transition.classes);\n };\n var shouldApplyTransitionCss = function (transition, decision, lastPlacement) {\n return lastPlacement.exists(function (placer) {\n var mode = transition.mode;\n return mode === 'all' ? true : placer[mode] !== decision[mode];\n });\n };\n var hasChanges = function (position, intermediate) {\n var round = function (value) {\n return parseFloat(value).toFixed(3);\n };\n return find$4(intermediate, function (value, key) {\n var newValue = position[key].map(round);\n var val = value.map(round);\n return !equals(newValue, val);\n }).isSome();\n };\n var getTransitionDuration = function (element) {\n var get = function (name) {\n var style = get$c(element, name);\n var times = isString(style) ? style.split(/\\s*,\\s*/) : [];\n return filter$2(times, isNotEmpty);\n };\n var parse = function (value) {\n if (isString(value) && /^[\\d.]+/.test(value)) {\n var num = parseFloat(value);\n return endsWith(value, 'ms') ? num : num * 1000;\n } else {\n return 0;\n }\n };\n var delay = get('transition-delay');\n var duration = get('transition-duration');\n return foldl(duration, function (acc, dur, i) {\n var time = parse(delay[i]) + parse(dur);\n return Math.max(acc, time);\n }, 0);\n };\n var setupTransitionListeners = function (element, transition) {\n var transitionEnd = unbindable();\n var transitionCancel = unbindable();\n var timer;\n var isSourceTransition = function (e) {\n var _a;\n var pseudoElement = (_a = e.raw.pseudoElement) !== null && _a !== void 0 ? _a : '';\n return eq(e.target, element) && isEmpty(pseudoElement) && contains$2(properties, e.raw.propertyName);\n };\n var transitionDone = function (e) {\n if (isNullable(e) || isSourceTransition(e)) {\n transitionEnd.clear();\n transitionCancel.clear();\n var type = e === null || e === void 0 ? void 0 : e.raw.type;\n if (isNullable(type) || type === transitionend()) {\n clearTimeout(timer);\n remove$7(element, timerAttr);\n remove$1(element, transition.classes);\n }\n }\n };\n var transitionStarted = function () {\n transitionEnd.set(bind(element, transitionend(), transitionDone));\n transitionCancel.set(bind(element, transitioncancel(), transitionDone));\n };\n if ('ontransitionstart' in element.dom) {\n var transitionStart_1 = bind(element, transitionstart(), function (e) {\n if (isSourceTransition(e)) {\n transitionStart_1.unbind();\n transitionStarted();\n }\n });\n } else {\n transitionStarted();\n }\n var duration = getTransitionDuration(element);\n requestAnimationFrame(function () {\n timer = setTimeout(transitionDone, duration + 17);\n set$8(element, timerAttr, timer);\n });\n };\n var startTransitioning = function (element, transition) {\n add$1(element, transition.classes);\n getOpt(element, timerAttr).each(function (timerId) {\n clearTimeout(parseInt(timerId, 10));\n remove$7(element, timerAttr);\n });\n setupTransitionListeners(element, transition);\n };\n var applyTransitionCss = function (element, origin, position, transition, decision, lastPlacement) {\n var shouldTransition = shouldApplyTransitionCss(transition, decision, lastPlacement);\n if (shouldTransition || isTransitioning$1(element, transition)) {\n set$7(element, 'position', position.position);\n var rect = toBox(origin, element);\n var intermediatePosition_1 = reposition(origin, __assign(__assign({}, decision), { rect: rect }));\n var intermediateCssOptions = mapToObject(properties, function (prop) {\n return intermediatePosition_1[prop];\n });\n if (hasChanges(position, intermediateCssOptions)) {\n setOptions(element, intermediateCssOptions);\n if (shouldTransition) {\n startTransitioning(element, transition);\n }\n reflow(element);\n }\n } else {\n remove$1(element, transition.classes);\n }\n };\n\n var elementSize = function (p) {\n return {\n width: getOuter$1(p),\n height: getOuter$2(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(element, options.preference, anchorBox, elementBox, bubbles, options.bounds);\n };\n var setClasses = function (element, decision) {\n var classInfo = decision.classes;\n remove$1(element, classInfo.off);\n add$1(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$2 = function (element, decision, options) {\n var positionCss = reposition(options.origin, decision);\n options.transition.each(function (transition) {\n applyTransitionCss(element, options.origin, positionCss, transition, decision, options.lastPlacement);\n });\n applyPositionCss(element, positionCss);\n };\n var setPlacement = function (element, decision) {\n setPlacement$1(element, decision.placement);\n };\n\n var setMaxHeight = function (element, maxHeight) {\n setMax$1(element, Math.floor(maxHeight));\n };\n var anchored = constant$1(function (element, available) {\n setMaxHeight(element, available);\n setAll(element, {\n 'overflow-x': 'hidden',\n 'overflow-y': 'auto'\n });\n });\n var expandable$1 = constant$1(function (element, available) {\n setMaxHeight(element, available);\n });\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, lastPlacement, getBounds, overrideOptions, transition) {\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 = {\n bounds: viewport(origin, getBounds),\n origin: origin,\n preference: layouts,\n maxHeightFunction: maxHeightFunction,\n maxWidthFunction: maxWidthFunction,\n lastPlacement: lastPlacement,\n transition: transition\n };\n return go(anchorBox, element, bubble, options);\n };\n var go = function (anchorBox, element, bubble, options) {\n var decision = layout(anchorBox, element, bubble, options);\n position$2(element, decision, options);\n setPlacement(element, decision);\n setClasses(element, decision);\n setHeight(element, decision, options);\n setWidth(element, decision, options);\n return {\n layout: decision.layout,\n placement: decision.placement\n };\n };\n\n var allAlignments = [\n 'valignCentre',\n 'alignLeft',\n 'alignRight',\n 'alignCentre',\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'inset'\n ];\n var nu$5 = function (xOffset, yOffset, classes, insetModifier) {\n if (insetModifier === void 0) {\n insetModifier = 1;\n }\n var insetXOffset = xOffset * insetModifier;\n var insetYOffset = yOffset * insetModifier;\n var getClasses = function (prop) {\n return get$e(classes, prop).getOr([]);\n };\n var make = function (xDelta, yDelta, alignmentsOn) {\n var alignmentsOff = difference(allAlignments, alignmentsOn);\n return {\n offset: SugarPosition(xDelta, yDelta),\n classesOn: bind$3(alignmentsOn, getClasses),\n classesOff: bind$3(alignmentsOff, getClasses)\n };\n };\n return {\n southeast: function () {\n return make(-xOffset, yOffset, [\n 'top',\n 'alignLeft'\n ]);\n },\n southwest: function () {\n return make(xOffset, yOffset, [\n 'top',\n 'alignRight'\n ]);\n },\n south: function () {\n return make(-xOffset / 2, yOffset, [\n 'top',\n 'alignCentre'\n ]);\n },\n northeast: function () {\n return make(-xOffset, -yOffset, [\n 'bottom',\n 'alignLeft'\n ]);\n },\n northwest: function () {\n return make(xOffset, -yOffset, [\n 'bottom',\n 'alignRight'\n ]);\n },\n north: function () {\n return make(-xOffset / 2, -yOffset, [\n 'bottom',\n 'alignCentre'\n ]);\n },\n east: function () {\n return make(xOffset, -yOffset / 2, [\n 'valignCentre',\n 'left'\n ]);\n },\n west: function () {\n return make(-xOffset, -yOffset / 2, [\n 'valignCentre',\n 'right'\n ]);\n },\n insetNortheast: function () {\n return make(insetXOffset, insetYOffset, [\n 'top',\n 'alignLeft',\n 'inset'\n ]);\n },\n insetNorthwest: function () {\n return make(-insetXOffset, insetYOffset, [\n 'top',\n 'alignRight',\n 'inset'\n ]);\n },\n insetNorth: function () {\n return make(-insetXOffset / 2, insetYOffset, [\n 'top',\n 'alignCentre',\n 'inset'\n ]);\n },\n insetSoutheast: function () {\n return make(insetXOffset, -insetYOffset, [\n 'bottom',\n 'alignLeft',\n 'inset'\n ]);\n },\n insetSouthwest: function () {\n return make(-insetXOffset, -insetYOffset, [\n 'bottom',\n 'alignRight',\n 'inset'\n ]);\n },\n insetSouth: function () {\n return make(-insetXOffset / 2, -insetYOffset, [\n 'bottom',\n 'alignCentre',\n 'inset'\n ]);\n },\n insetEast: function () {\n return make(-insetXOffset, -insetYOffset / 2, [\n 'valignCentre',\n 'right',\n 'inset'\n ]);\n },\n insetWest: function () {\n return make(insetXOffset, -insetYOffset / 2, [\n 'valignCentre',\n 'left',\n 'inset'\n ]);\n }\n };\n };\n var fallback = function () {\n return nu$5(0, 0, {});\n };\n\n var nu$4 = identity$1;\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$c(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$2(current) && get$d(current, 'data-alloy-vertical-dir') === AttributeValue.BottomToTop;\n });\n };\n\n var schema$y = function () {\n return optionObjOf('layouts', [\n required$1('onLtr'),\n required$1('onRtl'),\n option('onBottomLtr'),\n option('onBottomRtl')\n ]);\n };\n var get$4 = 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$4 = function (component, anchorInfo, origin) {\n var hotspot = anchorInfo.hotspot;\n var anchorBox = toBox(origin, hotspot.element);\n var layouts = get$4(component.element, anchorInfo, belowOrAbove(), belowOrAboveRtl(), aboveOrBelow(), aboveOrBelowRtl(), Optional.some(anchorInfo.hotspot.element));\n return Optional.some(nu$4({\n anchorBox: anchorBox,\n bubble: anchorInfo.bubble.getOr(fallback()),\n overrides: anchorInfo.overrides,\n layouts: layouts,\n placer: Optional.none()\n }));\n };\n var HotspotAnchor = [\n required$1('hotspot'),\n option('bubble'),\n defaulted('overrides', {}),\n schema$y(),\n output$1('placement', placement$4)\n ];\n\n var placement$3 = function (component, anchorInfo, origin) {\n var pos = translate$2(origin, anchorInfo.x, anchorInfo.y);\n var anchorBox = bounds(pos.left, pos.top, anchorInfo.width, anchorInfo.height);\n var layouts = get$4(component.element, anchorInfo, all$1(), allRtl$1(), all$1(), allRtl$1(), Optional.none());\n return Optional.some(nu$4({\n anchorBox: anchorBox,\n bubble: anchorInfo.bubble,\n overrides: anchorInfo.overrides,\n layouts: layouts,\n placer: Optional.none()\n }));\n };\n var MakeshiftAnchor = [\n required$1('x'),\n required$1('y'),\n defaulted('height', 0),\n defaulted('width', 0),\n defaulted('bubble', fallback()),\n defaulted('overrides', {}),\n schema$y(),\n output$1('placement', placement$3)\n ];\n\n var adt$7 = 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$1, function (point, scrollLeft, scrollTop) {\n return point.translate(-scrollLeft, -scrollTop);\n });\n };\n var toAbsolute = function (pos) {\n return pos.fold(identity$1, identity$1);\n };\n var sum = function (points) {\n return foldl(points, function (b, a) {\n return b.translate(a.left, a.top);\n }, SugarPosition(0, 0));\n };\n var sumAsFixed = function (positions) {\n var points = map$2(positions, toFixed);\n return sum(points);\n };\n var sumAsAbsolute = function (positions) {\n var points = map$2(positions, toAbsolute);\n return sum(points);\n };\n var screen = adt$7.screen;\n var absolute$1 = adt$7.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$4(frame);\n var compOwner = owner$4(component.element);\n return eq(frameOwner, compOwner);\n };\n return Optional.from(win.frameElement).map(SugarElement.fromDom).filter(hasSameOwner).map(absolute$3);\n };\n var getRootPoint = function (component, origin, anchorInfo) {\n var doc = owner$4(component.element);\n var outerScroll = get$9(doc);\n var offset = getOffset(component, origin, anchorInfo).getOr(outerScroll);\n return absolute$1(offset, outerScroll.left, outerScroll.top);\n };\n\n var getBox = function (left, top, width, height) {\n var point = screen(SugarPosition(left, top));\n return Optional.some(pointed(point, width, height));\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 ? aboveOrBelowRtl() : belowOrAboveRtl();\n var layouts = get$4(elem, anchorInfo, layoutsLtr, layoutsRtl, layoutsLtr, layoutsRtl, Optional.none());\n return nu$4({\n anchorBox: anchorBox,\n bubble: anchorInfo.bubble.getOr(fallback()),\n overrides: anchorInfo.overrides,\n layouts: layouts,\n placer: Optional.none()\n });\n });\n };\n\n var placement$2 = function (component, anchorInfo, origin) {\n var rootPoint = getRootPoint(component, origin, anchorInfo);\n return anchorInfo.node.filter(inBody).bind(function (target) {\n var rect = target.dom.getBoundingClientRect();\n var nodeBox = getBox(rect.left, rect.top, rect.width, rect.height);\n var elem = anchorInfo.node.getOr(component.element);\n return calcNewAnchor(nodeBox, rootPoint, anchorInfo, origin, elem);\n });\n };\n var NodeAnchor = [\n required$1('node'),\n required$1('root'),\n option('bubble'),\n schema$y(),\n defaulted('overrides', {}),\n defaulted('showAbove', false),\n output$1('placement', placement$2)\n ];\n\n var zeroWidth = '\\uFEFF';\n var nbsp = '\\xA0';\n\n var create$7 = function (start, soffset, finish, foffset) {\n return {\n start: start,\n soffset: soffset,\n finish: finish,\n foffset: foffset\n };\n };\n var SimRange = { create: create$7 };\n\n var adt$6 = 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$1 = function (situ) {\n return situ.fold(identity$1, identity$1, identity$1);\n };\n var before = adt$6.before;\n var on$1 = adt$6.on;\n var after$1 = adt$6.after;\n var Situ = {\n before: before,\n on: on$1,\n after: after$1,\n cata: cata,\n getStart: getStart$1\n };\n\n var adt$5 = 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$5.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);\n };\n var getStart = function (selection) {\n return selection.match({\n domRange: function (rng) {\n return SugarElement.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$5.domRange;\n var relative = adt$5.relative;\n var exact = adt$5.exact;\n var getWin = function (selection) {\n var start = getStart(selection);\n return defaultView(start);\n };\n var range$1 = SimRange.create;\n var SimSelection = {\n domRange: domRange,\n relative: relative,\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: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height\n };\n };\n var getFirstRect$1 = 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 ? Optional.some(rect).map(toRect) : Optional.none();\n };\n var getBounds$2 = function (rng) {\n var rect = rng.getBoundingClientRect();\n return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.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(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.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$1(rng),\n rtl: Optional.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 Optional.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 Optional.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(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.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 adt$4.ltr;\n adt$4.rtl;\n\n var NodeValue = function (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) ? Optional.from(element.dom.nodeValue) : Optional.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$1, '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\n var getEnd = function (element) {\n return name$2(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$2(elementsWithCursorPosition, name$2(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 Optional.some(child);\n }\n var res = descend(child);\n if (res.isSome()) {\n return res;\n }\n }\n return Optional.none();\n };\n return descend(scope);\n };\n\n var descendants = function (scope, selector) {\n return all$3(selector, scope);\n };\n\n var makeRange = function (start, soffset, finish, foffset) {\n var doc = owner$4(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 = 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 getNativeSelection = function (win) {\n return Optional.from(win.getSelection());\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 Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset));\n } else {\n return Optional.none();\n }\n };\n var doGetExact = function (selection) {\n if (selection.anchorNode === null || selection.focusNode === null) {\n return readRange(selection);\n } else {\n var anchor = SugarElement.fromDom(selection.anchorNode);\n var focus_1 = SugarElement.fromDom(selection.focusNode);\n return after(anchor, selection.anchorOffset, focus_1, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus_1, selection.focusOffset)) : readRange(selection);\n }\n };\n var getExact = function (win) {\n return getNativeSelection(win).filter(function (sel) {\n return sel.rangeCount > 0;\n }).bind(doGetExact);\n };\n var getFirstRect = function (win, selection) {\n var rng = asLtrRange(win, selection);\n return getFirstRect$1(rng);\n };\n var getBounds$1 = function (win, selection) {\n var rng = asLtrRange(win, selection);\n return getBounds$2(rng);\n };\n\n var point$1 = function (element, offset) {\n return {\n element: element,\n offset: offset\n };\n };\n var descendOnce$1 = function (element, offset) {\n var children$1 = children(element);\n if (children$1.length === 0) {\n return point$1(element, offset);\n } else if (offset < children$1.length) {\n return point$1(children$1[offset], 0);\n } else {\n var last = children$1[children$1.length - 1];\n var len = isText$1(last) ? get$3(last).length : children(last).length;\n return point$1(last, len);\n }\n };\n\n var descendOnce = function (element, offset) {\n return isText$1(element) ? point$1(element, offset) : descendOnce$1(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(sel.start, sel.soffset);\n var modFinish = descendOnce(sel.finish, sel.foffset);\n return SimSelection.range(modStart.element, modStart.offset, modFinish.element, modFinish.offset);\n });\n };\n var placement$1 = 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 = getBounds$1(win, SimSelection.exactFromRange(sel)).orThunk(function () {\n var x = SugarElement.fromText(zeroWidth);\n before$2(sel.start, x);\n var rect = getFirstRect(win, SimSelection.exact(x, 0, x, 1));\n remove$5(x);\n return rect;\n });\n return optRect.bind(function (rawRect) {\n return getBox(rawRect.left, rawRect.top, rawRect.width, rawRect.height);\n });\n });\n var targetElement = getAnchorSelection(win, anchorInfo).bind(function (sel) {\n return isElement$2(sel.start) ? Optional.some(sel.start) : parentNode(sel.start);\n });\n var elem = targetElement.getOr(component.element);\n return calcNewAnchor(selectionBox, rootPoint, anchorInfo, origin, elem);\n };\n var SelectionAnchor = [\n option('getSelection'),\n required$1('root'),\n option('bubble'),\n schema$y(),\n defaulted('overrides', {}),\n defaulted('showAbove', false),\n output$1('placement', placement$1)\n ];\n\n var labelPrefix$1 = 'link-layout';\n var eastX = function (anchor) {\n return anchor.x + anchor.width;\n };\n var westX = 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$1 = function (anchor, element, bubbles) {\n return nu$6(eastX(anchor), southY$1(anchor), bubbles.southeast(), southeast$3(), 'southeast', boundsRestriction(anchor, {\n left: 0,\n top: 2\n }), labelPrefix$1);\n };\n var southwest$1 = function (anchor, element, bubbles) {\n return nu$6(westX(anchor, element), southY$1(anchor), bubbles.southwest(), southwest$3(), 'southwest', boundsRestriction(anchor, {\n right: 1,\n top: 2\n }), labelPrefix$1);\n };\n var northeast$1 = function (anchor, element, bubbles) {\n return nu$6(eastX(anchor), northY$1(anchor, element), bubbles.northeast(), northeast$3(), 'northeast', boundsRestriction(anchor, {\n left: 0,\n bottom: 3\n }), labelPrefix$1);\n };\n var northwest$1 = function (anchor, element, bubbles) {\n return nu$6(westX(anchor, element), northY$1(anchor, element), bubbles.northwest(), northwest$3(), 'northwest', boundsRestriction(anchor, {\n right: 1,\n bottom: 3\n }), labelPrefix$1);\n };\n var all = function () {\n return [\n southeast$1,\n southwest$1,\n northeast$1,\n northwest$1\n ];\n };\n var allRtl = function () {\n return [\n southwest$1,\n southeast$1,\n northwest$1,\n northeast$1\n ];\n };\n\n var placement = function (component, submenuInfo, origin) {\n var anchorBox = toBox(origin, submenuInfo.item.element);\n var layouts = get$4(component.element, submenuInfo, all(), allRtl(), all(), allRtl(), Optional.none());\n return Optional.some(nu$4({\n anchorBox: anchorBox,\n bubble: fallback(),\n overrides: submenuInfo.overrides,\n layouts: layouts,\n placer: Optional.none()\n }));\n };\n var SubmenuAnchor = [\n required$1('item'),\n schema$y(),\n defaulted('overrides', {}),\n output$1('placement', placement)\n ];\n\n var AnchorSchema = choose$1('type', {\n selection: SelectionAnchor,\n node: NodeAnchor,\n hotspot: HotspotAnchor,\n submenu: SubmenuAnchor,\n makeshift: MakeshiftAnchor\n });\n\n var TransitionSchema = [\n requiredArrayOf('classes', string),\n defaultedStringEnum('mode', 'all', [\n 'all',\n 'layout',\n 'placement'\n ])\n ];\n var PositionSchema = [\n defaulted('useFixed', never),\n option('getBounds')\n ];\n var PlacementSchema = [\n requiredOf('anchor', AnchorSchema),\n optionObjOf('transition', TransitionSchema)\n ];\n\n var getFixedOrigin = function () {\n var html = document.documentElement;\n return fixed$1(0, 0, html.clientWidth, html.clientHeight);\n };\n var getRelativeOrigin = function (component) {\n var position = absolute$3(component.element);\n var bounds = component.element.dom.getBoundingClientRect();\n return relative$1(position.left, position.top, bounds.width, bounds.height);\n };\n var place = function (component, origin, anchoring, getBounds, placee, lastPlace, transition) {\n var anchor = box(anchoring.anchorBox, origin);\n return simple(anchor, placee.element, anchoring.bubble, anchoring.layouts, lastPlace, getBounds, anchoring.overrides, transition);\n };\n var position$1 = function (component, posConfig, posState, placee, placementSpec) {\n positionWithin(component, posConfig, posState, placee, placementSpec, Optional.none());\n };\n var positionWithin = function (component, posConfig, posState, placee, placementSpec, boxElement) {\n var boundsBox = boxElement.map(box$1);\n return positionWithinBounds(component, posConfig, posState, placee, placementSpec, boundsBox);\n };\n var positionWithinBounds = function (component, posConfig, posState, placee, placementSpec, bounds) {\n var placeeDetail = asRawOrDie$1('placement.info', objOf(PlacementSchema), placementSpec);\n var anchorage = placeeDetail.anchor;\n var element = placee.element;\n var placeeState = posState.get(placee.uid);\n preserve$1(function () {\n set$7(element, 'position', 'fixed');\n var oldVisibility = getRaw(element, 'visibility');\n set$7(element, 'visibility', 'hidden');\n var origin = posConfig.useFixed() ? getFixedOrigin() : getRelativeOrigin(component);\n var placer = anchorage.placement;\n var getBounds = bounds.map(constant$1).or(posConfig.getBounds);\n placer(component, anchorage, origin).each(function (anchoring) {\n var doPlace = anchoring.placer.getOr(place);\n var newState = doPlace(component, origin, anchoring, getBounds, placee, placeeState, placeeDetail.transition);\n posState.set(placee.uid, newState);\n });\n oldVisibility.fold(function () {\n remove$6(element, 'visibility');\n }, function (vis) {\n set$7(element, 'visibility', vis);\n });\n if (getRaw(element, 'left').isNone() && getRaw(element, 'top').isNone() && getRaw(element, 'right').isNone() && getRaw(element, 'bottom').isNone() && is$1(getRaw(element, 'position'), 'fixed')) {\n remove$6(element, 'position');\n }\n }, element);\n };\n var getMode = function (component, pConfig, _pState) {\n return pConfig.useFixed() ? 'fixed' : 'absolute';\n };\n var reset$1 = function (component, pConfig, posState, placee) {\n var element = placee.element;\n each$1([\n 'position',\n 'left',\n 'right',\n 'top',\n 'bottom'\n ], function (prop) {\n return remove$6(element, prop);\n });\n reset$2(element);\n posState.clear(placee.uid);\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 reset: reset$1\n });\n\n var init$g = function () {\n var state = {};\n var set = function (id, data) {\n state[id] = data;\n };\n var get = function (id) {\n return get$e(state, id);\n };\n var clear = function (id) {\n if (isNonNullable(id)) {\n delete state[id];\n } else {\n state = {};\n }\n };\n return nu$8({\n readState: function () {\n return state;\n },\n clear: clear,\n set: set,\n get: get\n });\n };\n\n var PositioningState = /*#__PURE__*/Object.freeze({\n __proto__: null,\n init: init$g\n });\n\n var Positioning = create$8({\n fields: PositionSchema,\n name: 'positioning',\n active: ActivePosition,\n apis: PositionApis,\n state: PositioningState\n });\n\n var fireDetaching = function (component) {\n emit(component, detachedFromDom());\n var children = component.components();\n each$1(children, fireDetaching);\n };\n var fireAttaching = function (component) {\n var children = component.components();\n each$1(children, fireAttaching);\n emit(component, attachedToDom());\n };\n var attach$1 = function (parent, child) {\n append$2(parent.element, child.element);\n };\n var detachChildren$1 = function (component) {\n each$1(component.components(), function (childComp) {\n return remove$5(childComp.element);\n });\n empty(component.element);\n component.syncComponents();\n };\n var replaceChildren = function (component, newChildren) {\n var subs = component.components();\n detachChildren$1(component);\n var deleted = difference(subs, newChildren);\n each$1(deleted, function (comp) {\n fireDetaching(comp);\n component.getSystem().removeFromWorld(comp);\n });\n each$1(newChildren, function (childComp) {\n if (!childComp.getSystem().isConnected()) {\n component.getSystem().addToWorld(childComp);\n attach$1(component, childComp);\n if (inBody(component.element)) {\n fireAttaching(childComp);\n }\n } else {\n attach$1(component, childComp);\n }\n component.syncComponents();\n });\n };\n\n var attach = function (parent, child) {\n attachWith(parent, child, append$2);\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$5(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).toOptional();\n });\n doDetach(component);\n parent$1.each(function (p) {\n p.syncComponents();\n });\n };\n var detachChildren = function (component) {\n var subs = component.components();\n each$1(subs, doDetach);\n empty(component.element);\n component.syncComponents();\n };\n var attachSystem = function (element, guiSystem) {\n attachSystemWith(element, guiSystem, append$2);\n };\n var attachSystemAfter = function (element, guiSystem) {\n attachSystemWith(element, guiSystem, after$2);\n };\n var attachSystemWith = function (element, guiSystem, inserter) {\n inserter(element, guiSystem.element);\n var children$1 = children(guiSystem.element);\n each$1(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$1(children$1, function (child) {\n guiSystem.getByDom(child).each(fireDetaching);\n });\n remove$5(guiSystem.element);\n };\n\n var rebuild = function (sandbox, sConfig, sState, data) {\n sState.get().each(function (_data) {\n detachChildren(sandbox);\n });\n var point = sConfig.getAttachPoint(sandbox);\n attach(point, sandbox);\n var built = sandbox.getSystem().build(data);\n attach(sandbox, built);\n sState.set(built);\n return built;\n };\n var open$1 = 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$1(sandbox, sConfig, sState, data);\n transaction();\n decloak(sandbox, sConfig);\n };\n var close$1 = function (sandbox, sConfig, sState) {\n sState.get().each(function (data) {\n detachChildren(sandbox);\n detach(sandbox);\n sConfig.onClose(sandbox, data);\n sState.clear();\n });\n };\n var isOpen$1 = function (_sandbox, _sConfig, sState) {\n return sState.isOpen();\n };\n var isPartOf = function (sandbox, sConfig, sState, queryElem) {\n return isOpen$1(sandbox, sConfig, sState) && sState.get().exists(function (data) {\n return sConfig.isPartOf(sandbox, data, queryElem);\n });\n };\n var getState$2 = 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$7(sandbox.element, attr);\n }, function (v) {\n set$8(sandbox.element, attr, v);\n });\n set$7(sandbox.element, cssKey, newValue);\n };\n var restore = function (sandbox, cssKey, attr) {\n getOpt(sandbox.element, attr).fold(function () {\n return remove$6(sandbox.element, cssKey);\n }, function (oldValue) {\n return set$7(sandbox.element, cssKey, oldValue);\n });\n };\n var cloak = function (sandbox, sConfig, _sState) {\n var sink = sConfig.getAttachPoint(sandbox);\n set$7(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$1,\n openWhileCloaked: openWhileCloaked,\n close: close$1,\n isOpen: isOpen$1,\n isPartOf: isPartOf,\n getState: getState$2,\n setContent: setContent\n });\n\n var events$g = function (sandboxConfig, sandboxState) {\n return derive$2([run$1(sandboxClose(), function (sandbox, _simulatedEvent) {\n close$1(sandbox, sandboxConfig, sandboxState);\n })]);\n };\n\n var ActiveSandbox = /*#__PURE__*/Object.freeze({\n __proto__: null,\n events: events$g\n });\n\n var SandboxSchema = [\n onHandler('onOpen'),\n onHandler('onClose'),\n required$1('isPartOf'),\n required$1('getAttachPoint'),\n defaulted('cloakVisibilityAttr', 'data-precloak-visibility')\n ];\n\n var init$f = function () {\n var contents = value$1();\n var readState = constant$1('not-implemented');\n return nu$8({\n readState: readState,\n isOpen: contents.isSet,\n clear: contents.clear,\n set: contents.set,\n get: contents.get\n });\n };\n\n var SandboxState = /*#__PURE__*/Object.freeze({\n __proto__: null,\n init: init$f\n });\n\n var Sandboxing = create$8({\n fields: SandboxSchema,\n name: 'sandboxing',\n active: ActiveSandbox,\n apis: SandboxApis,\n state: SandboxState\n });\n\n var dismissPopups = constant$1('dismiss.popups');\n var repositionPopups = constant$1('reposition.popups');\n var mouseReleased = constant$1('mouse.released');\n\n var schema$x = objOfOnly([\n defaulted('isExtraPart', never),\n optionObjOf('fireEventInstead', [defaulted('event', dismissRequested())])\n ]);\n var receivingChannel$1 = function (rawSpec) {\n var _a;\n var detail = asRawOrDie$1('Dismissal', schema$x, rawSpec);\n return _a = {}, _a[dismissPopups()] = {\n schema: objOfOnly([required$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$w = objOfOnly([\n optionObjOf('fireEventInstead', [defaulted('event', repositionRequested())]),\n requiredFunction('doReposition')\n ]);\n var receivingChannel = function (rawSpec) {\n var _a;\n var detail = asRawOrDie$1('Reposition', schema$w, 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$5 = function (component, repConfig, repState) {\n repConfig.store.manager.onLoad(component, repConfig, repState);\n };\n var onUnload$2 = function (component, repConfig, repState) {\n repConfig.store.manager.onUnload(component, repConfig, repState);\n };\n var setValue$3 = function (component, repConfig, repState, data) {\n repConfig.store.manager.setValue(component, repConfig, repState, data);\n };\n var getValue$3 = 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$5,\n onUnload: onUnload$2,\n setValue: setValue$3,\n getValue: getValue$3,\n getState: getState$1\n });\n\n var events$f = function (repConfig, repState) {\n var es = repConfig.resetOnDom ? [\n runOnAttached(function (comp, _se) {\n onLoad$5(comp, repConfig, repState);\n }),\n runOnDetached(function (comp, _se) {\n onUnload$2(comp, repConfig, repState);\n })\n ] : [loadEvent(repConfig, repState, onLoad$5)];\n return derive$2(es);\n };\n\n var ActiveRepresenting = /*#__PURE__*/Object.freeze({\n __proto__: null,\n events: events$f\n });\n\n var memory$1 = 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$8({\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 = noop;\n return nu$8({ 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$e(dataByValue.get(), itemString).orThunk(function () {\n return get$e(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$1(items, function (item) {\n newDataByValue[item.value] = item;\n get$e(item, 'meta').each(function (meta) {\n get$e(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$8({\n readState: readState,\n lookup: lookup,\n update: update,\n clear: clear\n });\n };\n var init$e = function (spec) {\n return spec.store.manager.state(spec);\n };\n\n var RepresentState = /*#__PURE__*/Object.freeze({\n __proto__: null,\n memory: memory$1,\n dataset: dataset,\n manual: manual,\n init: init$e\n });\n\n var setValue$2 = 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$2 = function (component, repConfig, repState) {\n var store = repConfig.store;\n var key = store.getDataKey(component);\n return repState.lookup(key).getOrThunk(function () {\n return store.getFallbackEntry(key);\n });\n };\n var onLoad$4 = function (component, repConfig, repState) {\n var store = repConfig.store;\n store.initialValue.each(function (data) {\n setValue$2(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 required$1('getFallbackEntry'),\n required$1('getDataKey'),\n required$1('setValue'),\n output$1('manager', {\n setValue: setValue$2,\n getValue: getValue$2,\n onLoad: onLoad$4,\n onUnload: onUnload$1,\n state: dataset\n })\n ];\n\n var getValue$1 = function (component, repConfig, _repState) {\n return repConfig.store.getValue(component);\n };\n var setValue$1 = function (component, repConfig, _repState, data) {\n repConfig.store.setValue(component, data);\n repConfig.onSetValue(component, data);\n };\n var onLoad$3 = function (component, repConfig, _repState) {\n repConfig.store.initialValue.each(function (data) {\n repConfig.store.setValue(component, data);\n });\n };\n var ManualStore = [\n required$1('getValue'),\n defaulted('setValue', noop),\n option('initialValue'),\n output$1('manager', {\n setValue: setValue$1,\n getValue: getValue$1,\n onLoad: onLoad$3,\n onUnload: noop,\n state: NoState.init\n })\n ];\n\n var setValue = function (component, repConfig, repState, data) {\n repState.set(data);\n repConfig.onSetValue(component, data);\n };\n var getValue = function (component, repConfig, repState) {\n return repState.get();\n };\n var onLoad$2 = 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 = function (component, repConfig, repState) {\n repState.clear();\n };\n var MemoryStore = [\n option('initialValue'),\n output$1('manager', {\n setValue: setValue,\n getValue: getValue,\n onLoad: onLoad$2,\n onUnload: onUnload,\n state: memory$1\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('resetOnDom', false)\n ];\n\n var Representing = create$8({\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 = function (name, forbidden) {\n return defaultedObjOf(name, {}, map$2(forbidden, function (f) {\n return forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name);\n }).concat([customField('dump', identity$1)]));\n };\n var get$2 = function (data) {\n return data.dump;\n };\n var augment = function (data, original) {\n return __assign(__assign({}, derive$1(original)), data.dump);\n };\n var SketchBehaviours = {\n field: field,\n augment: augment,\n get: get$2\n };\n\n var _placeholder = 'placeholder';\n var adt$3 = 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$2(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$3.single(true, constant$1(compSpec));\n }\n return get$e(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$3.single(false, constant$1(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$e(value, 'components').getOr([]);\n var substituted = bind$3(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$1);\n return preprocessor(values);\n } else {\n return valuesThunk(detail);\n }\n });\n };\n var substituteAll = function (owner, detail, components, placeholders) {\n return bind$3(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$1(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(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$2 = adt$3.single;\n var multiple = adt$3.multiple;\n var placeholder = constant$1(_placeholder);\n\n var adt$2 = Adt.generate([\n { required: ['data'] },\n { external: ['data'] },\n { optional: ['data'] },\n { group: ['data'] }\n ]);\n var fFactory = defaulted('factory', { sketch: identity$1 });\n var fSchema = defaulted('schema', []);\n var fName = required$1('name');\n var fPname = field$1('pname', 'pname', defaultedThunk(function (typeSpec) {\n return '';\n }), anyValue());\n var fGroupSchema = customField('schema', function () {\n return [option('preprocess')];\n });\n var fDefaults = defaulted('defaults', constant$1({}));\n var fOverrides = defaulted('overrides', constant$1({}));\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 required$1('unit'),\n fPname,\n fDefaults,\n fOverrides\n ]);\n var asNamedPart = function (part) {\n return part.fold(Optional.some, Optional.none, Optional.some, Optional.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$1, identity$1, identity$1, identity$1);\n };\n var convert = function (adtConstructor, partSchema) {\n return function (spec) {\n var data = asRawOrDie$1('Converting part type', partSchema, spec);\n return adtConstructor(data);\n };\n };\n var required = convert(adt$2.required, requiredSpec);\n var external$1 = convert(adt$2.external, externalSpec);\n var optional = convert(adt$2.optional, optionalSpec);\n var group = convert(adt$2.group, groupSpec);\n var original = constant$1('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 = 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$1(parts, function (part) {\n part.fold(function (data) {\n internals[data.pname] = single$2(true, function (detail, partSpec, partValidated) {\n return data.factory.sketch(combine(detail, data, partSpec, partValidated));\n });\n }, function (data) {\n var partSpec = detail.parts[data.name];\n externals[data.name] = constant$1(data.factory.sketch(combine(detail, data, partSpec[original()]), partSpec));\n }, function (data) {\n internals[data.pname] = single$2(false, function (detail, partSpec, partValidated) {\n return data.factory.sketch(combine(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$2(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$1(internals),\n externals: constant$1(externals)\n };\n };\n\n var generate$3 = function (owner, parts) {\n var r = {};\n each$1(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$1('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$1 = 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$3(parts, function (part) {\n return part.fold(Optional.none, Optional.some, Optional.none, Optional.none).map(function (data) {\n return requiredObjOf(data.name, data.schema.concat([snapshot(original())]));\n }).toArray();\n });\n };\n var names = function (parts) {\n return map$2(parts, name$1);\n };\n var substitutes = function (owner, detail, parts) {\n return subs(owner, detail, parts);\n };\n var components$1 = function (owner, detail, internals) {\n return substitutePlaces(Optional.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).toOptional();\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$1(partKeys, function (pk) {\n r[pk] = constant$1(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$1(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$1(partKeys, function (pk) {\n r[pk] = constant$1(system.getByUid(uids[pk]).getOrDie());\n });\n return r;\n };\n var defaultUids = function (baseUid, partTypes) {\n var partNames = names(partTypes);\n return wrapAll(map$2(partNames, function (pn) {\n return {\n key: pn,\n value: baseUid + '-' + pn\n };\n }));\n };\n var defaultUidsSchema = function (partTypes) {\n return field$1('partUids', 'partUids', mergeWithThunk(function (spec) {\n return defaultUids(spec.uid, partTypes);\n }), anyValue());\n };\n\n var AlloyParts = /*#__PURE__*/Object.freeze({\n __proto__: null,\n generate: generate$3,\n generateOne: generateOne$1,\n schemas: schemas,\n names: names,\n substitutes: substitutes,\n components: components$1,\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 ? [requiredObjOf('parts', partSchemas)] : [];\n return ps.concat([\n required$1('uid'),\n defaulted('dom', {}),\n defaulted('components', []),\n snapshot('originalSpec'),\n defaulted('debug.sketcher', {})\n ]).concat(partUidsSchemas);\n };\n var asRawOrDie = function (label, schema, spec, partSchemas, partUidsSchemas) {\n var baseS = base(partSchemas, partUidsSchemas);\n return asRawOrDie$1(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(owner, schema, specWithUid, [], []);\n return factory(detail, specWithUid);\n };\n var composite$1 = 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(owner, schema, specWithUid, partSchemas, [partUidsSchema]);\n var subs = substitutes(owner, detail, partTypes);\n var components = components$1(owner, detail, subs.internals());\n return factory(detail, components, specWithUid, subs.externals());\n };\n var hasUid = function (spec) {\n return has$2(spec, 'uid');\n };\n var supplyUid = function (spec) {\n return hasUid(spec) ? spec : __assign(__assign({}, spec), { uid: generate$5('uid') });\n };\n\n var isSketchSpec = function (spec) {\n return spec.uid !== undefined;\n };\n var singleSchema = objOfOnly([\n required$1('name'),\n required$1('factory'),\n required$1('configFields'),\n defaulted('apis', {}),\n defaulted('extraApis', {})\n ]);\n var compositeSchema = objOfOnly([\n required$1('name'),\n required$1('factory'),\n required$1('configFields'),\n required$1('partFields'),\n defaulted('apis', {}),\n defaulted('extraApis', {})\n ]);\n var single = function (rawConfig) {\n var config = asRawOrDie$1('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: config.name,\n configFields: config.configFields,\n sketch: sketch\n }, apis), extraApis);\n };\n var composite = function (rawConfig) {\n var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig);\n var sketch = function (spec) {\n return composite$1(config.name, config.configFields, config.partFields, config.factory, spec);\n };\n var parts = generate$3(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: config.name,\n partFields: config.partFields,\n configFields: config.configFields,\n sketch: sketch,\n parts: parts\n }, apis), extraApis);\n };\n\n var inside = function (target) {\n return name$2(target) === 'input' && get$d(target, 'type') !== 'radio' || name$2(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 = [required$1('find')];\n\n var Composing = create$8({\n fields: ComposeSchema,\n name: 'composing',\n apis: ComposeApis\n });\n\n var nativeDisabled = [\n 'input',\n 'button',\n 'textarea',\n 'select'\n ];\n var onLoad$1 = function (component, disableConfig, disableState) {\n var f = disableConfig.disabled() ? disable$1 : enable$1;\n f(component, disableConfig);\n };\n var hasNative = function (component, config) {\n return config.useNative === true && contains$2(nativeDisabled, name$2(component.element));\n };\n var nativeIsDisabled = function (component) {\n return has$1(component.element, 'disabled');\n };\n var nativeDisable = function (component) {\n set$8(component.element, 'disabled', 'disabled');\n };\n var nativeEnable = function (component) {\n remove$7(component.element, 'disabled');\n };\n var ariaIsDisabled = function (component) {\n return get$d(component.element, 'aria-disabled') === 'true';\n };\n var ariaDisable = function (component) {\n set$8(component.element, 'aria-disabled', 'true');\n };\n var ariaEnable = function (component) {\n set$8(component.element, 'aria-disabled', 'false');\n };\n var disable$1 = 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$1 = function (component, disableConfig, _disableState) {\n disableConfig.disableClass.each(function (disableClass) {\n remove$2(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$3 = function (component, disableConfig, disableState, disabled) {\n var f = disabled ? disable$1 : enable$1;\n f(component, disableConfig);\n };\n\n var DisableApis = /*#__PURE__*/Object.freeze({\n __proto__: null,\n enable: enable$1,\n disable: disable$1,\n isDisabled: isDisabled,\n onLoad: onLoad$1,\n set: set$3\n });\n\n var exhibit$5 = function (base, disableConfig) {\n return nu$7({ classes: disableConfig.disabled() ? disableConfig.disableClass.toArray() : [] });\n };\n var events$e = function (disableConfig, disableState) {\n return derive$2([\n abort(execute$5(), function (component, _simulatedEvent) {\n return isDisabled(component, disableConfig);\n }),\n loadEvent(disableConfig, disableState, onLoad$1)\n ]);\n };\n\n var ActiveDisable = /*#__PURE__*/Object.freeze({\n __proto__: null,\n exhibit: exhibit$5,\n events: events$e\n });\n\n var DisableSchema = [\n defaultedFunction('disabled', never),\n defaulted('useNative', true),\n option('disableClass'),\n onHandler('onDisabled'),\n onHandler('onEnabled')\n ];\n\n var Disabling = create$8({\n fields: DisableSchema,\n name: 'disabling',\n active: ActiveDisable,\n apis: DisableApis\n });\n\n var dehighlightAllExcept = function (component, hConfig, hState, skip) {\n var highlighted = descendants(component.element, '.' + hConfig.highlightClass);\n each$1(highlighted, function (h) {\n if (!exists(skip, function (skipComp) {\n return skipComp.element === h;\n })) {\n remove$2(h, hConfig.highlightClass);\n component.getSystem().getByDom(h).each(function (target) {\n hConfig.onDehighlight(component, target);\n emit(target, dehighlight$1());\n });\n }\n });\n };\n var dehighlightAll = function (component, hConfig, hState) {\n return dehighlightAllExcept(component, hConfig, hState, []);\n };\n var dehighlight = function (component, hConfig, hState, target) {\n if (isHighlighted(component, hConfig, hState, target)) {\n remove$2(target.element, hConfig.highlightClass);\n hConfig.onDehighlight(component, target);\n emit(target, dehighlight$1());\n }\n };\n var highlight = 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$1());\n }\n };\n var highlightFirst = function (component, hConfig, hState) {\n getFirst(component, hConfig).each(function (firstComp) {\n highlight(component, hConfig, hState, firstComp);\n });\n };\n var highlightLast = function (component, hConfig, hState) {\n getLast(component, hConfig).each(function (lastComp) {\n highlight(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 err;\n }, function (firstComp) {\n highlight(component, hConfig, hState, firstComp);\n });\n };\n var highlightBy = function (component, hConfig, hState, predicate) {\n var candidates = getCandidates(component, hConfig);\n var targetComp = find$5(candidates, predicate);\n targetComp.each(function (c) {\n highlight(component, hConfig, hState, c);\n });\n };\n var isHighlighted = function (component, hConfig, hState, queryTarget) {\n return has(queryTarget.element, hConfig.highlightClass);\n };\n var getHighlighted = function (component, hConfig, _hState) {\n return descendant(component.element, '.' + hConfig.highlightClass).bind(function (e) {\n return component.getSystem().getByDom(e).toOptional();\n });\n };\n var getByIndex = function (component, hConfig, hState, index) {\n var items = descendants(component.element, '.' + hConfig.itemClass);\n return Optional.from(items[index]).fold(function () {\n return Result.error(new Error('No element found with index ' + index));\n }, component.getSystem().getByDom);\n };\n var getFirst = function (component, hConfig, _hState) {\n return descendant(component.element, '.' + hConfig.itemClass).bind(function (e) {\n return component.getSystem().getByDom(e).toOptional();\n });\n };\n var getLast = function (component, hConfig, _hState) {\n var items = descendants(component.element, '.' + hConfig.itemClass);\n var last = items.length > 0 ? Optional.some(items[items.length - 1]) : Optional.none();\n return last.bind(function (c) {\n return component.getSystem().getByDom(c).toOptional();\n });\n };\n var getDelta$2 = function (component, hConfig, hState, delta) {\n var items = descendants(component.element, '.' + hConfig.itemClass);\n var current = findIndex$1(items, function (item) {\n return has(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]).toOptional();\n });\n };\n var getPrevious = function (component, hConfig, hState) {\n return getDelta$2(component, hConfig, hState, -1);\n };\n var getNext = function (component, hConfig, hState) {\n return getDelta$2(component, hConfig, hState, +1);\n };\n var getCandidates = function (component, hConfig, _hState) {\n var items = descendants(component.element, '.' + hConfig.itemClass);\n return cat(map$2(items, function (i) {\n return component.getSystem().getByDom(i).toOptional();\n }));\n };\n\n var HighlightApis = /*#__PURE__*/Object.freeze({\n __proto__: null,\n dehighlightAll: dehighlightAll,\n dehighlight: dehighlight,\n highlight: highlight,\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 required$1('highlightClass'),\n required$1('itemClass'),\n onHandler('onHighlight'),\n onHandler('onDehighlight')\n ];\n\n var Highlighting = create$8({\n fields: HighlightSchema,\n name: 'highlighting',\n apis: HighlightApis\n });\n\n var BACKSPACE = [8];\n var TAB = [9];\n var ENTER = [13];\n var ESCAPE = [27];\n var SPACE = [32];\n var LEFT = [37];\n var UP = [38];\n var RIGHT = [39];\n var DOWN = [40];\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$5(before.concat(after), predicate);\n };\n var tryPrev = function (values, index, predicate) {\n var before = reverse(values.slice(0, index));\n return find$5(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$5(after.concat(before), predicate);\n };\n var tryNext = function (values, index, predicate) {\n var after = values.slice(index + 1);\n return find$5(after, predicate);\n };\n\n var inSet = function (keys) {\n return function (event) {\n var raw = event.raw;\n return contains$2(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 = function (transitions, event) {\n var transition = find$5(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$2 = 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('focusManager', dom$2()),\n defaultedOf('focusInside', 'onFocus', valueOf(function (val) {\n return contains$2([\n 'onFocus',\n 'onEnterOrSpace',\n 'onApi'\n ], val) ? Result.value(val) : Result.error('Invalid value for focusInside');\n })),\n output$1('handler', me),\n output$1('state', stateInit),\n output$1('sendFocusIn', optFocusIn)\n ]);\n };\n var processKey = function (component, simulatedEvent, getRules, keyingConfig, keyingState) {\n var rules = getRules(component, simulatedEvent, keyingConfig, keyingState);\n return choose(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 ? Optional.none() : optFocusIn(keyingConfig).map(function (focusIn) {\n return run$1(focus$4(), 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 var keyboardEvents = [\n run$1(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$1(keyup(), function (component, simulatedEvent) {\n processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(function (_) {\n simulatedEvent.stop();\n });\n })\n ];\n return derive$2(onFocusHandler.toArray().concat(keyboardEvents));\n };\n var me = {\n schema: schema,\n processKey: processKey,\n toEvents: toEvents\n };\n return me;\n };\n\n var create$6 = function (cyclicField) {\n var schema = [\n option('onEscape'),\n option('onEnter'),\n defaulted('selector', '[data-alloy-tabstop=\"true\"]:not(:disabled)'),\n defaulted('firstTabstop', 0),\n defaulted('useTabstopAt', always),\n option('visibilitySelector')\n ].concat([cyclicField]);\n var isVisible = function (tabbingConfig, element) {\n var target = tabbingConfig.visibilitySelector.bind(function (sel) {\n return closest$1(element, sel);\n }).getOr(element);\n return get$b(target) > 0;\n };\n var findInitial = function (component, tabbingConfig) {\n var tabstops = descendants(component.element, tabbingConfig.selector);\n var visibles = filter$2(tabstops, function (elem) {\n return isVisible(tabbingConfig, elem);\n });\n return Optional.from(visibles[tabbingConfig.firstTabstop]);\n };\n var findCurrent = function (component, tabbingConfig) {\n return tabbingConfig.focusManager.get(component).bind(function (elem) {\n return closest$1(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 ? Optional.some(true) : Optional.none();\n }, function (target) {\n tabbingConfig.focusManager.set(component, target);\n return Optional.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$1(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$1([\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$1([]);\n return typical(schema, NoState.init, getKeydownRules, getKeyupRules, function () {\n return Optional.some(focusIn);\n });\n };\n\n var AcyclicType = create$6(customField('cyclic', never));\n\n var CyclicType = create$6(customField('cyclic', always));\n\n var doDefaultExecute = function (component, _simulatedEvent, focused) {\n dispatch(component, focused, execute$5());\n return Optional.some(true);\n };\n var defaultExecute = function (component, simulatedEvent, focused) {\n var isComplex = inside(focused) && inSet(SPACE)(simulatedEvent.event);\n return isComplex ? Optional.none() : doDefaultExecute(component, simulatedEvent, focused);\n };\n var stopEventForFirefox = function (_component, _simulatedEvent) {\n return Optional.some(true);\n };\n\n var schema$v = [\n defaulted('execute', defaultExecute),\n defaulted('useSpace', false),\n defaulted('useEnter', true),\n defaulted('useControlEnter', false),\n defaulted('useDown', false)\n ];\n var execute$4 = function (component, simulatedEvent, executeConfig) {\n return executeConfig.execute(component, simulatedEvent, component.element);\n };\n var getKeydownRules$5 = 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$4)].concat(executeConfig.useControlEnter ? [rule(and([\n isControl,\n inSet(ENTER)\n ]), execute$4)] : []);\n };\n var getKeyupRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) {\n return executeConfig.useSpace && !inside(component.element) ? [rule(inSet(SPACE), stopEventForFirefox)] : [];\n };\n var ExecutionType = typical(schema$v, NoState.init, getKeydownRules$5, getKeyupRules$5, function () {\n return Optional.none();\n });\n\n var flatgrid$1 = function () {\n var dimensions = value$1();\n var setGridSize = function (numRows, numColumns) {\n dimensions.set({\n numRows: numRows,\n numColumns: 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$8({\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$d = function (spec) {\n return spec.state(spec);\n };\n\n var KeyingState = /*#__PURE__*/Object.freeze({\n __proto__: null,\n flatgrid: flatgrid$1,\n init: init$d\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$1 = function (moveLeft, moveRight) {\n var movement = onDirection(moveLeft, moveRight);\n return useH(movement);\n };\n var east$1 = 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$1 = useV;\n var south$1 = useV;\n var move$1 = useV;\n\n var isHidden$1 = function (dom) {\n return dom.offsetWidth <= 0 && dom.offsetHeight <= 0;\n };\n var isVisible = function (element) {\n return !isHidden$1(element.dom);\n };\n\n var locate = function (candidates, predicate) {\n return findIndex$1(candidates, predicate).map(function (index) {\n return {\n index: index,\n candidates: 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$2(candidates, isVisible);\n return locate(visible, predicate);\n };\n var findIndex = function (elements, target) {\n return findIndex$1(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 ? Optional.some(values[newIndex]) : Optional.none();\n });\n };\n var cycleHorizontal$1 = 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 Optional.some({\n row: oldRow,\n column: newColumn\n });\n });\n };\n var cycleVertical$1 = 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$1(oldColumn, 0, colsInRow - 1);\n return Optional.some({\n row: newRow,\n column: newCol\n });\n });\n };\n var cycleRight$1 = function (values, index, numRows, numCols) {\n return cycleHorizontal$1(values, index, numRows, numCols, +1);\n };\n var cycleLeft$1 = function (values, index, numRows, numCols) {\n return cycleHorizontal$1(values, index, numRows, numCols, -1);\n };\n var cycleUp$1 = function (values, index, numRows, numCols) {\n return cycleVertical$1(values, index, numRows, numCols, -1);\n };\n var cycleDown$1 = function (values, index, numRows, numCols) {\n return cycleVertical$1(values, index, numRows, numCols, +1);\n };\n\n var schema$u = [\n required$1('selector'),\n defaulted('execute', defaultExecute),\n onKeyboardHandler('onEscape'),\n defaulted('captureTab', false),\n initSize()\n ];\n var focusIn$3 = function (component, gridConfig, _gridState) {\n descendant(component.element, gridConfig.selector).each(function (first) {\n gridConfig.focusManager.set(component, first);\n });\n };\n var findCurrent$1 = function (component, gridConfig) {\n return gridConfig.focusManager.get(component).bind(function (elem) {\n return closest$1(elem, gridConfig.selector);\n });\n };\n var execute$3 = function (component, simulatedEvent, gridConfig, _gridState) {\n return findCurrent$1(component, gridConfig).bind(function (focused) {\n return gridConfig.execute(component, simulatedEvent, focused);\n });\n };\n var doMove$2 = 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 ? Optional.some(true) : Optional.none();\n };\n var doEscape$1 = function (component, simulatedEvent, gridConfig) {\n return gridConfig.onEscape(component, simulatedEvent);\n };\n var moveLeft$3 = doMove$2(cycleLeft$1);\n var moveRight$3 = doMove$2(cycleRight$1);\n var moveNorth$1 = doMove$2(cycleUp$1);\n var moveSouth$1 = doMove$2(cycleDown$1);\n var getKeydownRules$4 = constant$1([\n rule(inSet(LEFT), west$1(moveLeft$3, moveRight$3)),\n rule(inSet(RIGHT), east$1(moveLeft$3, moveRight$3)),\n rule(inSet(UP), north$1(moveNorth$1)),\n rule(inSet(DOWN), south$1(moveSouth$1)),\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$1),\n rule(inSet(SPACE.concat(ENTER)), execute$3)\n ]);\n var getKeyupRules$4 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);\n var FlatgridType = typical(schema$u, flatgrid$1, getKeydownRules$4, getKeyupRules$4, function () {\n return Optional.some(focusIn$3);\n });\n\n var horizontal = function (container, selector, current, delta) {\n var isDisabledButton = function (candidate) {\n return name$2(candidate) === 'button' && get$d(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 Optional.none();\n } else {\n return isDisabledButton(candidates[newIndex]) ? tryCycle(initial, newIndex, candidates) : Optional.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$t = [\n required$1('selector'),\n defaulted('getInitial', Optional.none),\n defaulted('execute', defaultExecute),\n onKeyboardHandler('onEscape'),\n defaulted('executeOnMove', false),\n defaulted('allowVertical', true)\n ];\n var findCurrent = function (component, flowConfig) {\n return flowConfig.focusManager.get(component).bind(function (elem) {\n return closest$1(elem, flowConfig.selector);\n });\n };\n var execute$2 = function (component, simulatedEvent, flowConfig) {\n return findCurrent(component, flowConfig).bind(function (focused) {\n return flowConfig.execute(component, simulatedEvent, focused);\n });\n };\n var focusIn$2 = function (component, flowConfig, _state) {\n flowConfig.getInitial(component).orThunk(function () {\n return descendant(component.element, flowConfig.selector);\n }).each(function (first) {\n flowConfig.focusManager.set(component, first);\n });\n };\n var moveLeft$2 = function (element, focused, info) {\n return horizontal(element, info.selector, focused, -1);\n };\n var moveRight$2 = 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$2(component, simulatedEvent, flowConfig) : Optional.some(true);\n });\n };\n };\n var doEscape = function (component, simulatedEvent, flowConfig) {\n return flowConfig.onEscape(component, simulatedEvent);\n };\n var getKeydownRules$3 = 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$1(moveLeft$2, moveRight$2))),\n rule(inSet(eastMovers), doMove$1(east$1(moveLeft$2, moveRight$2))),\n rule(inSet(ENTER), execute$2),\n rule(inSet(SPACE), execute$2),\n rule(inSet(ESCAPE), doEscape)\n ];\n };\n var getKeyupRules$3 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);\n var FlowType = typical(schema$t, NoState.init, getKeydownRules$3, getKeyupRules$3, function () {\n return Optional.some(focusIn$2);\n });\n\n var toCell = function (matrix, rowIndex, columnIndex) {\n return Optional.from(matrix[rowIndex]).bind(function (row) {\n return Optional.from(row[columnIndex]).map(function (cell) {\n return {\n rowIndex: rowIndex,\n columnIndex: columnIndex,\n cell: cell\n };\n });\n });\n };\n var cycleHorizontal = 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 = 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$1(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$1(startCol + deltaCol, 0, colsInRow - 1);\n return toCell(matrix, rowIndex, newColIndex);\n };\n var moveVertical = function (matrix, colIndex, startRow, deltaRow) {\n var nextRowIndex = clamp$1(startRow + deltaRow, 0, matrix.length - 1);\n var colsInNextRow = matrix[nextRowIndex].length;\n var nextColIndex = clamp$1(colIndex, 0, colsInNextRow - 1);\n return toCell(matrix, nextRowIndex, nextColIndex);\n };\n var cycleRight = function (matrix, startRow, startCol) {\n return cycleHorizontal(matrix, startRow, startCol, +1);\n };\n var cycleLeft = function (matrix, startRow, startCol) {\n return cycleHorizontal(matrix, startRow, startCol, -1);\n };\n var cycleUp = function (matrix, startRow, startCol) {\n return cycleVertical(matrix, startCol, startRow, -1);\n };\n var cycleDown = function (matrix, startRow, startCol) {\n return cycleVertical(matrix, startCol, startRow, +1);\n };\n var moveLeft$1 = function (matrix, startRow, startCol) {\n return moveHorizontal(matrix, startRow, startCol, -1);\n };\n var moveRight$1 = function (matrix, startRow, startCol) {\n return moveHorizontal(matrix, startRow, startCol, +1);\n };\n var moveUp$1 = function (matrix, startRow, startCol) {\n return moveVertical(matrix, startCol, startRow, -1);\n };\n var moveDown$1 = function (matrix, startRow, startCol) {\n return moveVertical(matrix, startCol, startRow, +1);\n };\n\n var schema$s = [\n requiredObjOf('selectors', [\n required$1('row'),\n required$1('cell')\n ]),\n defaulted('cycles', true),\n defaulted('previousSelector', Optional.none),\n defaulted('execute', defaultExecute)\n ];\n var focusIn$1 = function (component, matrixConfig, _state) {\n var focused = matrixConfig.previousSelector(component).orThunk(function () {\n var selectors = matrixConfig.selectors;\n return descendant(component.element, selectors.cell);\n });\n focused.each(function (cell) {\n matrixConfig.focusManager.set(component, cell);\n });\n };\n var execute$1 = 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$2(rows, function (row) {\n return descendants(row, matrixConfig.selectors.cell);\n });\n };\n var doMove = function (ifCycle, ifMove) {\n return function (element, focused, matrixConfig) {\n var move = matrixConfig.cycles ? ifCycle : ifMove;\n return closest$1(focused, matrixConfig.selectors.row).bind(function (inRow) {\n var cellsInRow = descendants(inRow, matrixConfig.selectors.cell);\n return findIndex(cellsInRow, focused).bind(function (colIndex) {\n var allRows = descendants(element, matrixConfig.selectors.row);\n return findIndex(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 = doMove(cycleLeft, moveLeft$1);\n var moveRight = doMove(cycleRight, moveRight$1);\n var moveNorth = doMove(cycleUp, moveUp$1);\n var moveSouth = doMove(cycleDown, moveDown$1);\n var getKeydownRules$2 = constant$1([\n rule(inSet(LEFT), west$1(moveLeft, moveRight)),\n rule(inSet(RIGHT), east$1(moveLeft, moveRight)),\n rule(inSet(UP), north$1(moveNorth)),\n rule(inSet(DOWN), south$1(moveSouth)),\n rule(inSet(SPACE.concat(ENTER)), execute$1)\n ]);\n var getKeyupRules$2 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);\n var MatrixType = typical(schema$s, NoState.init, getKeydownRules$2, getKeyupRules$2, function () {\n return Optional.some(focusIn$1);\n });\n\n var schema$r = [\n required$1('selector'),\n defaulted('execute', defaultExecute),\n defaulted('moveOnTab', false)\n ];\n var execute = 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 = function (component, menuConfig, _state) {\n descendant(component.element, menuConfig.selector).each(function (first) {\n menuConfig.focusManager.set(component, first);\n });\n };\n var moveUp = function (element, focused, info) {\n return horizontal(element, info.selector, focused, -1);\n };\n var moveDown = 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$1(moveUp)(component, simulatedEvent, menuConfig, menuState) : Optional.none();\n };\n var fireTab = function (component, simulatedEvent, menuConfig, menuState) {\n return menuConfig.moveOnTab ? move$1(moveDown)(component, simulatedEvent, menuConfig, menuState) : Optional.none();\n };\n var getKeydownRules$1 = constant$1([\n rule(inSet(UP), move$1(moveUp)),\n rule(inSet(DOWN), move$1(moveDown)),\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),\n rule(inSet(SPACE), execute)\n ]);\n var getKeyupRules$1 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);\n var MenuType = typical(schema$r, NoState.init, getKeydownRules$1, getKeyupRules$1, function () {\n return Optional.some(focusIn);\n });\n\n var schema$q = [\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('stopSpaceKeyup', false),\n option('focusIn')\n ];\n var getKeydownRules = 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 = function (component, simulatedEvent, specialInfo) {\n return specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE), stopEventForFirefox)] : [];\n };\n var SpecialType = typical(schema$q, NoState.init, getKeydownRules, getKeyupRules, 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 = 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,\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({\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 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$2 = function (component, replaceConfig, replaceState, data) {\n preserve$1(function () {\n var newChildren = map$2(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 = function (component, replaceConfig, replaceState, appendee) {\n insert(component, replaceConfig, append$2, appendee);\n };\n var prepend = function (component, replaceConfig, replaceState, prependee) {\n insert(component, replaceConfig, prepend$1, prependee);\n };\n var remove = function (component, replaceConfig, replaceState, removee) {\n var children = contents(component);\n var foundChild = find$5(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 Optional.from(children[replaceeIndex]).map(function (replacee) {\n remove(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$1(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,\n prepend: prepend,\n remove: remove,\n replaceAt: replaceAt,\n replaceBy: replaceBy,\n set: set$2,\n contents: contents\n });\n\n var Replacing = create$8({\n fields: [],\n name: 'replacing',\n apis: ReplaceApis\n });\n\n var events$d = function (name, eventHandlers) {\n var events = derive$2(eventHandlers);\n return create$8({\n fields: [required$1('enabled')],\n name: name,\n active: { events: constant$1(events) }\n });\n };\n var config = function (name, eventHandlers) {\n var me = events$d(name, eventHandlers);\n return {\n key: name,\n value: {\n config: {},\n me: me,\n configAsRaw: constant$1({}),\n initialConfig: {},\n state: NoState\n }\n };\n };\n\n var focus$2 = function (component, focusConfig) {\n if (!focusConfig.ignore) {\n focus$3(component.element);\n focusConfig.onFocus(component);\n }\n };\n var blur = function (component, focusConfig) {\n if (!focusConfig.ignore) {\n blur$1(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,\n isFocused: isFocused\n });\n\n var exhibit$4 = function (base, focusConfig) {\n var mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } };\n return nu$7(mod);\n };\n var events$c = function (focusConfig) {\n return derive$2([run$1(focus$4(), function (component, simulatedEvent) {\n focus$2(component, focusConfig);\n simulatedEvent.stop();\n })].concat(focusConfig.stopMousedown ? [run$1(mousedown(), function (_, simulatedEvent) {\n simulatedEvent.event.prevent();\n })] : []));\n };\n\n var ActiveFocus = /*#__PURE__*/Object.freeze({\n __proto__: null,\n exhibit: exhibit$4,\n events: events$c\n });\n\n var FocusSchema = [\n onHandler('onFocus'),\n defaulted('stopMousedown', false),\n defaulted('ignore', false)\n ];\n\n var Focusing = create$8({\n fields: FocusSchema,\n name: 'focusing',\n active: ActiveFocus,\n apis: FocusApis\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 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$2(component.element, toggleClass);\n }\n });\n };\n var toggle$2 = function (component, toggleConfig, toggleState) {\n set$1(component, toggleConfig, toggleState, !toggleState.get());\n };\n var on = 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$1 = function (component, toggleConfig, toggleState, state) {\n var action = state ? on : off;\n action(component, toggleConfig, toggleState);\n };\n var isOn = function (component, toggleConfig, toggleState) {\n return toggleState.get();\n };\n var onLoad = function (component, toggleConfig, toggleState) {\n set$1(component, toggleConfig, toggleState, toggleConfig.selected);\n };\n\n var ToggleApis = /*#__PURE__*/Object.freeze({\n __proto__: null,\n onLoad: onLoad,\n toggle: toggle$2,\n isOn: isOn,\n on: on,\n off: off,\n set: set$1\n });\n\n var exhibit$3 = function () {\n return nu$7({});\n };\n var events$b = function (toggleConfig, toggleState) {\n var execute = executeEvent(toggleConfig, toggleState, toggle$2);\n var load = loadEvent(toggleConfig, toggleState, onLoad);\n return derive$2(flatten([\n toggleConfig.toggleOnExecute ? [execute] : [],\n [load]\n ]));\n };\n\n var ActiveToggle = /*#__PURE__*/Object.freeze({\n __proto__: null,\n exhibit: exhibit$3,\n events: events$b\n });\n\n var updatePressed = function (component, ariaInfo, status) {\n set$8(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$8(component.element, 'aria-selected', status);\n };\n var updateChecked = function (component, ariaInfo, status) {\n set$8(component.element, 'aria-checked', status);\n };\n var updateExpanded = function (component, ariaInfo, status) {\n set$8(component.element, 'aria-expanded', status);\n };\n\n var ToggleSchema = [\n defaulted('selected', false),\n option('toggleClass'),\n defaulted('toggleOnExecute', true),\n defaultedOf('aria', { mode: 'none' }, choose$1('mode', {\n pressed: [\n defaulted('syncWithExpanded', false),\n output$1('update', updatePressed)\n ],\n checked: [output$1('update', updateChecked)],\n expanded: [output$1('update', updateExpanded)],\n selected: [output$1('update', updateSelected)],\n none: [output$1('update', noop)]\n }))\n ];\n\n var Toggling = create$8({\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$1(click(), onClick),\n run$1(tap(), onClick),\n cutter(touchstart()),\n cutter(mousedown())\n ];\n };\n var events$a = function (optAction) {\n var executeHandler = function (action) {\n return runOnExecute$1(function (component, simulatedEvent) {\n action(component);\n simulatedEvent.stop();\n });\n };\n return derive$2(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$1 = function (item) {\n emitWith(item, focusEvent, { item: item });\n };\n var hover = constant$1(hoverEvent);\n var focus$1 = constant$1(focusEvent);\n\n var builder$2 = 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$1(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', __spreadArray(__spreadArray([], pointerEvents(), true), [\n run$1(mouseover(), onHover),\n run$1(focusItem(), Focusing.focus)\n ], false))\n ]),\n components: detail.components,\n eventOrder: detail.eventOrder\n };\n };\n var schema$p = [\n required$1('data'),\n required$1('components'),\n required$1('dom'),\n defaulted('hasSubmenu', false),\n option('toggling'),\n SketchBehaviours.field('itemBehaviours', [\n Toggling,\n Focusing,\n Keying,\n Representing\n ]),\n defaulted('ignoreFocus', false),\n defaulted('domModification', {}),\n output$1('builder', builder$2),\n defaulted('eventOrder', {})\n ];\n\n var builder$1 = function (detail) {\n return {\n dom: detail.dom,\n components: detail.components,\n events: derive$2([stopper(focusItem())])\n };\n };\n var schema$o = [\n required$1('dom'),\n required$1('components'),\n output$1('builder', builder$1)\n ];\n\n var owner$2 = constant$1('item-widget');\n var parts$h = constant$1([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: noop\n }\n })])\n };\n }\n })]);\n\n var builder = function (detail) {\n var subs = substitutes(owner$2(), detail, parts$h());\n var components = components$1(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) ? Optional.none() : function () {\n if (detail.autofocus) {\n simulatedEvent.setSource(component.element);\n return Optional.none();\n } else {\n return Optional.none();\n }\n }();\n };\n return {\n dom: detail.dom,\n components: components,\n domModification: detail.domModification,\n events: derive$2([\n runOnExecute$1(function (component, simulatedEvent) {\n focusWidget(component).each(function (_widget) {\n simulatedEvent.stop();\n });\n }),\n run$1(mouseover(), onHover),\n run$1(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$1(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 Optional.some(true);\n } else if (detail.autofocus) {\n simulatedEvent.setSource(component.element);\n return Optional.none();\n } else {\n return Optional.none();\n }\n }\n })\n ])\n };\n };\n var schema$n = [\n required$1('uid'),\n required$1('data'),\n required$1('components'),\n required$1('dom'),\n defaulted('autofocus', false),\n defaulted('ignoreFocus', false),\n SketchBehaviours.field('widgetBehaviours', [\n Representing,\n Focusing,\n Keying\n ]),\n defaulted('domModification', {}),\n defaultUidsSchema(parts$h()),\n output$1('builder', builder)\n ];\n\n var itemSchema$2 = choose$1('type', {\n widget: schema$n,\n item: schema$p,\n separator: schema$o\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$g = constant$1([group({\n factory: {\n sketch: function (spec) {\n var itemInfo = asRawOrDie$1('menu.spec item', itemSchema$2, spec);\n return itemInfo.builder(itemInfo);\n }\n },\n name: 'items',\n unit: 'item',\n defaults: function (detail, u) {\n return has$2(u, 'uid') ? u : __assign(__assign({}, u), { uid: generate$5('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$m = constant$1([\n required$1('value'),\n required$1('items'),\n required$1('dom'),\n required$1('components'),\n defaulted('eventOrder', {}),\n field('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$1('config', configureGrid)\n ],\n matrix: [\n output$1('config', configureMatrix),\n required$1('rowSelector')\n ],\n menu: [\n defaulted('moveOnTab', true),\n output$1('config', configureMenu)\n ]\n })),\n itemMarkers(),\n defaulted('fakeFocus', false),\n defaulted('focusManager', dom$2()),\n onHandler('onHighlight')\n ]);\n\n var focus = constant$1('alloy.menu-focus');\n\n var make$7 = 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: Optional.some }),\n Keying.config(detail.movement.config(detail, detail.movement))\n ]),\n events: derive$2([\n run$1(focus$1(), 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(), {\n menu: menu,\n item: item\n });\n });\n }),\n run$1(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({\n name: 'Menu',\n configFields: schema$m(),\n partFields: parts$g(),\n factory: make$7\n });\n\n var transpose$1 = 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$e(byMenu, finish).bind(function (triggerItem) {\n return get$e(items, triggerItem).bind(function (triggerMenu) {\n var rest = trace(items, byItem, byMenu, triggerMenu);\n return Optional.some([triggerMenu].concat(rest));\n });\n }).getOr([]);\n };\n var generate$2 = function (menus, expansions) {\n var items = {};\n each(menus, function (menuItems, menu) {\n each$1(menuItems, function (item) {\n items[item] = menu;\n });\n });\n var byItem = expansions;\n var byMenu = transpose$1(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$e(menuPaths, menu).getOr([menu]);\n });\n };\n\n var init$c = function () {\n var expansions = Cell({});\n var menus = Cell({});\n var paths = Cell({});\n var primary = value$1();\n var directory = Cell({});\n var clear = function () {\n expansions.set({});\n menus.set({});\n paths.set({});\n primary.clear();\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(sPrimary);\n expansions.set(sExpansions);\n menus.set(sMenus);\n directory.set(dir);\n var sPaths = generate$2(dir, sExpansions);\n paths.set(sPaths);\n };\n var getTriggeringItem = function (menuValue) {\n return find$4(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$2(lookupItem(itemValue).toArray(), function (menuValue) {\n return getPreparedMenu(menuValue).isSome();\n });\n return get$e(paths.get(), itemValue).bind(function (path) {\n var revPath = reverse(extraPath.concat(path));\n var triggers = bind$3(revPath, function (menuValue, menuIndex) {\n return getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(function () {\n return is$1(primary.get(), menuValue) ? [] : [Optional.none()];\n }, function (data) {\n return [Optional.some(data)];\n });\n });\n return sequence(triggers);\n });\n };\n var expand = function (itemValue) {\n return get$e(expansions.get(), itemValue).map(function (menu) {\n var current = get$e(paths.get(), itemValue).getOr([]);\n return [menu].concat(current);\n });\n };\n var collapse = function (itemValue) {\n return get$e(paths.get(), itemValue).bind(function (path) {\n return path.length > 1 ? Optional.some(path.slice(1)) : Optional.none();\n });\n };\n var refresh = function (itemValue) {\n return get$e(paths.get(), itemValue);\n };\n var getPreparedMenu = function (menuValue) {\n return lookupMenu(menuValue).bind(extractPreparedMenu);\n };\n var lookupMenu = function (menuValue) {\n return get$e(menus.get(), menuValue);\n };\n var lookupItem = function (itemValue) {\n return get$e(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' ? Optional.some(prep.menu) : Optional.none();\n };\n var LayeredState = {\n init: init$c,\n extractPreparedMenu: extractPreparedMenu\n };\n\n var make$6 = function (detail, _rawUiSpec) {\n var submenuParentItems = value$1();\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({}, spec), {\n value: name,\n markers: detail.markers,\n fakeFocus: detail.fakeFocus,\n onHighlight: detail.onHighlight,\n focusManager: detail.fakeFocus ? highlights() : dom$2()\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 Optional.none();\n }\n var candidates = Highlighting.getCandidates(menu);\n return find$5(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$3(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$2(menuValues, function (mv) {\n return state.lookupMenu(mv).bind(function (prep) {\n return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none();\n });\n }));\n };\n var closeOthers = function (container, state, path) {\n var others = getMenus(state, state.otherMenus(path));\n each$1(others, function (o) {\n remove$1(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$2(items, function (i) {\n return get$d(i, 'aria-haspopup') === 'true';\n });\n each$1(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(r);\n return r;\n });\n };\n var updateAriaExpansions = function (container, path) {\n var parentItems = getSubmenuParents(container);\n each(parentItems, function (v, k) {\n var expanded = contains$2(path, k);\n set$8(v.element, 'aria-expanded', expanded);\n });\n };\n var updateMenuPath = function (container, state, path) {\n return Optional.from(path[0]).bind(function (latestMenuName) {\n return state.lookupMenu(latestMenuName).bind(function (menuPrep) {\n if (menuPrep.type === 'notbuilt') {\n return Optional.none();\n } else {\n var activeMenu = menuPrep.menu;\n var rest = getMenus(state, path.slice(1));\n each$1(rest, function (r) {\n add$2(r.element, detail.markers.backgroundMenu);\n });\n if (!inBody(activeMenu.element)) {\n Replacing.append(container, premade(activeMenu));\n }\n remove$1(activeMenu.element, [detail.markers.backgroundMenu]);\n setActiveMenu(container, activeMenu);\n closeOthers(container, state, path);\n return Optional.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 if (item.hasConfigured(Disabling) && Disabling.isDisabled(item)) {\n return Optional.some(item);\n } else {\n var value = getItemValue(item);\n return layeredState.expand(value).bind(function (path) {\n updateAriaExpansions(container, path);\n return Optional.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(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 Optional.some(item);\n }\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) ? Optional.none() : expandRight(container, item, ExpandHighlightDecision.HighlightSubmenu);\n };\n var onLeft = function (container, item) {\n return inside(item.element) ? Optional.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$1(simulatedEvent.getSource(), '.' + detail.markers.item).bind(function (target) {\n return container.getSystem().getByDom(target).toOptional().bind(function (item) {\n return f(container, item).map(always);\n });\n });\n };\n };\n var events = derive$2([\n run$1(focus(), 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$1(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 }, noop);\n });\n }),\n runOnAttached(function (container, _simulatedEvent) {\n setup(container).each(function (primary) {\n Replacing.append(container, premade(primary));\n detail.onOpenMenu(container, primary);\n if (detail.highlightImmediately) {\n setActiveMenu(container, primary);\n }\n });\n })\n ].concat(detail.navigateOnHover ? [run$1(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 Optional.from(container.components()[0]).filter(function (comp) {\n return get$d(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$2(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$1 = constant$1('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 = function (text) {\n return {\n value: generate$6(collapseItem$1()),\n meta: { text: text }\n };\n };\n var tieredMenu = single({\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('highlightImmediately', true),\n requiredObjOf('data', [\n required$1('primary'),\n required$1('menus'),\n required$1('expansions')\n ]),\n defaulted('fakeFocus', false),\n onHandler('onHighlight'),\n onHandler('onHover'),\n tieredMenuMarkers(),\n required$1('dom'),\n defaulted('navigateOnHover', true),\n defaulted('stayInDom', false),\n field('tmenuBehaviours', [\n Keying,\n Highlighting,\n Composing,\n Replacing\n ]),\n defaulted('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$6,\n extraApis: {\n tieredData: tieredData,\n singleData: singleData,\n collapseItem: collapseItem\n }\n });\n\n var makeMenu = function (detail, menuSandbox, placementSpec, 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 Optional.some(true);\n },\n onExecute: function () {\n return Optional.some(true);\n },\n onOpenMenu: function (tmenu, menu) {\n Positioning.positionWithinBounds(lazySink().getOrDie(), menu, placementSpec, getBounds());\n },\n onOpenSubmenu: function (tmenu, item, submenu, triggeringPaths) {\n var sink = lazySink().getOrDie();\n Positioning.position(sink, submenu, {\n anchor: __assign({\n type: 'submenu',\n item: item\n }, getSubmenuLayouts(triggeringPaths))\n });\n },\n onRepositionMenu: function (tmenu, primaryMenu, submenuTriggers) {\n var sink = lazySink().getOrDie();\n Positioning.positionWithinBounds(sink, primaryMenu, placementSpec, getBounds());\n each$1(submenuTriggers, function (st) {\n var submenuLayouts = getSubmenuLayouts(st.triggeringPath);\n Positioning.position(sink, st.triggeredMenu, {\n anchor: __assign({\n type: 'submenu',\n item: st.triggeringItem\n }, submenuLayouts)\n });\n });\n }\n });\n };\n var factory$m = function (detail, spec) {\n var isPartOfRelated = function (sandbox, queryElem) {\n var related = detail.getRelated(sandbox);\n return related.exists(function (rel) {\n return isPartOf$1(rel, queryElem);\n });\n };\n var setContent = function (sandbox, thing) {\n Sandboxing.setContent(sandbox, thing);\n };\n var showAt = function (sandbox, thing, placementSpec) {\n showWithin(sandbox, thing, placementSpec, Optional.none());\n };\n var showWithin = function (sandbox, thing, placementSpec, boxElement) {\n showWithinBounds(sandbox, thing, placementSpec, function () {\n return boxElement.map(function (elem) {\n return box$1(elem);\n });\n });\n };\n var showWithinBounds = function (sandbox, thing, placementSpec, getBounds) {\n var sink = detail.lazySink(sandbox).getOrDie();\n Sandboxing.openWhileCloaked(sandbox, thing, function () {\n return Positioning.positionWithinBounds(sink, sandbox, placementSpec, getBounds());\n });\n Representing.setValue(sandbox, Optional.some({\n mode: 'position',\n config: placementSpec,\n getBounds: getBounds\n }));\n };\n var showMenuAt = function (sandbox, placementSpec, menuSpec) {\n showMenuWithinBounds(sandbox, placementSpec, menuSpec, Optional.none);\n };\n var showMenuWithinBounds = function (sandbox, placementSpec, menuSpec, getBounds) {\n var menu = makeMenu(detail, sandbox, placementSpec, menuSpec, getBounds);\n Sandboxing.open(sandbox, menu);\n Representing.setValue(sandbox, Optional.some({\n mode: 'menu',\n menu: menu\n }));\n };\n var hide = function (sandbox) {\n if (Sandboxing.isOpen(sandbox)) {\n Representing.setValue(sandbox, Optional.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(tieredMenu.repositionMenus);\n break;\n case 'position':\n var sink = detail.lazySink(sandbox).getOrDie();\n Positioning.positionWithinBounds(sink, sandbox, state.config, 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$1(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: Optional.none()\n }\n }),\n Receiving.config({\n channels: __assign(__assign({}, receivingChannel$1(__assign({ isExtraPart: spec.isExtraPart }, detail.fireDismissalEventInstead.map(function (fe) {\n return { fireEventInstead: { event: fe.event } };\n }).getOr({})))), receivingChannel(__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({\n name: 'InlineView',\n configFields: [\n required$1('lazySink'),\n onHandler('onShow'),\n onHandler('onHide'),\n optionFunction('onEscape'),\n field('inlineBehaviours', [\n Sandboxing,\n Representing,\n Receiving\n ]),\n optionObjOf('fireDismissalEventInstead', [defaulted('event', dismissRequested())]),\n optionObjOf('fireRepositionEventInstead', [defaulted('event', repositionRequested())]),\n defaulted('getRelated', Optional.none),\n defaulted('isExtraPart', never),\n defaulted('eventOrder', Optional.none)\n ],\n factory: factory$m,\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 labelPrefix = 'layout-inset';\n var westEdgeX = 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 eastEdgeX = function (anchor, element) {\n return anchor.x + anchor.width - element.width;\n };\n var northY = function (anchor) {\n return anchor.y;\n };\n var southY = function (anchor, element) {\n return anchor.y + anchor.height - element.height;\n };\n var centreY = function (anchor, element) {\n return anchor.y + anchor.height / 2 - element.height / 2;\n };\n var southwest = function (anchor, element, bubbles) {\n return nu$6(eastEdgeX(anchor, element), southY(anchor, element), bubbles.insetSouthwest(), northwest$3(), 'southwest', boundsRestriction(anchor, {\n right: 0,\n bottom: 3\n }), labelPrefix);\n };\n var southeast = function (anchor, element, bubbles) {\n return nu$6(westEdgeX(anchor), southY(anchor, element), bubbles.insetSoutheast(), northeast$3(), 'southeast', boundsRestriction(anchor, {\n left: 1,\n bottom: 3\n }), labelPrefix);\n };\n var northwest = function (anchor, element, bubbles) {\n return nu$6(eastEdgeX(anchor, element), northY(anchor), bubbles.insetNorthwest(), southwest$3(), 'northwest', boundsRestriction(anchor, {\n right: 0,\n top: 2\n }), labelPrefix);\n };\n var northeast = function (anchor, element, bubbles) {\n return nu$6(westEdgeX(anchor), northY(anchor), bubbles.insetNortheast(), southeast$3(), 'northeast', boundsRestriction(anchor, {\n left: 1,\n top: 2\n }), labelPrefix);\n };\n var north = function (anchor, element, bubbles) {\n return nu$6(middleX(anchor, element), northY(anchor), bubbles.insetNorth(), south$3(), 'north', boundsRestriction(anchor, { top: 2 }), labelPrefix);\n };\n var south = function (anchor, element, bubbles) {\n return nu$6(middleX(anchor, element), southY(anchor, element), bubbles.insetSouth(), north$3(), 'south', boundsRestriction(anchor, { bottom: 3 }), labelPrefix);\n };\n var east = function (anchor, element, bubbles) {\n return nu$6(eastEdgeX(anchor, element), centreY(anchor, element), bubbles.insetEast(), west$3(), 'east', boundsRestriction(anchor, { right: 0 }), labelPrefix);\n };\n var west = function (anchor, element, bubbles) {\n return nu$6(westEdgeX(anchor), centreY(anchor, element), bubbles.insetWest(), east$3(), 'west', boundsRestriction(anchor, { left: 1 }), labelPrefix);\n };\n var lookupPreserveLayout = function (lastPlacement) {\n switch (lastPlacement) {\n case 'north':\n return north;\n case 'northeast':\n return northeast;\n case 'northwest':\n return northwest;\n case 'south':\n return south;\n case 'southeast':\n return southeast;\n case 'southwest':\n return southwest;\n case 'east':\n return east;\n case 'west':\n return west;\n }\n };\n var preserve = function (anchor, element, bubbles, placee, bounds) {\n var layout = getPlacement(placee).map(lookupPreserveLayout).getOr(north);\n return layout(anchor, element, bubbles, placee, bounds);\n };\n var lookupFlippedLayout = function (lastPlacement) {\n switch (lastPlacement) {\n case 'north':\n return south;\n case 'northeast':\n return southeast;\n case 'northwest':\n return southwest;\n case 'south':\n return north;\n case 'southeast':\n return northeast;\n case 'southwest':\n return northwest;\n case 'east':\n return west;\n case 'west':\n return east;\n }\n };\n var flip$2 = function (anchor, element, bubbles, placee, bounds) {\n var layout = getPlacement(placee).map(lookupFlippedLayout).getOr(north);\n return layout(anchor, element, bubbles, placee, bounds);\n };\n\n var global$f = tinymce.util.Tools.resolve('tinymce.util.Delay');\n\n var factory$l = function (detail) {\n var events = events$a(detail.action);\n var tag = detail.dom.tag;\n var lookupAttr = function (attr) {\n return get$e(detail.dom, 'attributes').bind(function (attrs) {\n return get$e(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({\n name: 'Button',\n factory: factory$l,\n configFields: [\n defaulted('uid', undefined),\n required$1('dom'),\n defaulted('components', []),\n SketchBehaviours.field('buttonBehaviours', [\n Focusing,\n Keying\n ]),\n option('action'),\n option('role'),\n defaulted('eventOrder', {})\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 = function (html) {\n var elem = SugarElement.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$7(elem) };\n return __assign({\n tag: name$2(elem),\n classes: classes,\n attributes: attrs\n }, contents);\n };\n\n var record = function (spec) {\n var uid = isSketchSpec(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$5('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).toOptional();\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 function _typeof(obj) {\n '@babel/helpers - typeof';\n return _typeof = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && 'function' == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;\n }, _typeof(obj);\n }\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n }\n function _isNativeReflectConstruct() {\n if (typeof Reflect === 'undefined' || !Reflect.construct)\n return false;\n if (Reflect.construct.sham)\n return false;\n if (typeof Proxy === 'function')\n return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {\n }));\n return true;\n } catch (e) {\n return false;\n }\n }\n function _construct(Parent, args, Class) {\n if (_isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class)\n _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n return _construct.apply(null, arguments);\n }\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr))\n return _arrayLikeToArray(arr);\n }\n function _iterableToArray(iter) {\n if (typeof Symbol !== 'undefined' && iter[Symbol.iterator] != null || iter['@@iterator'] != null)\n return Array.from(iter);\n }\n function _unsupportedIterableToArray(o, minLen) {\n if (!o)\n return;\n if (typeof o === 'string')\n return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === 'Object' && o.constructor)\n n = o.constructor.name;\n if (n === 'Map' || n === 'Set')\n return Array.from(o);\n if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))\n return _arrayLikeToArray(o, minLen);\n }\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length)\n len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++)\n arr2[i] = arr[i];\n return arr2;\n }\n function _nonIterableSpread() {\n throw new TypeError('Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.');\n }\n var hasOwnProperty = Object.hasOwnProperty, setPrototypeOf = Object.setPrototypeOf, isFrozen = Object.isFrozen, getPrototypeOf = Object.getPrototypeOf, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n var freeze = Object.freeze, seal = Object.seal, create$5 = Object.create;\n var _ref = typeof Reflect !== 'undefined' && Reflect, apply$1 = _ref.apply, construct = _ref.construct;\n if (!apply$1) {\n apply$1 = function apply(fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n }\n if (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n }\n if (!seal) {\n seal = function seal(x) {\n return x;\n };\n }\n if (!construct) {\n construct = function construct(Func, args) {\n return _construct(Func, _toConsumableArray(args));\n };\n }\n var arrayForEach = unapply(Array.prototype.forEach);\n var arrayPop = unapply(Array.prototype.pop);\n var arrayPush = unapply(Array.prototype.push);\n var stringToLowerCase = unapply(String.prototype.toLowerCase);\n var stringMatch = unapply(String.prototype.match);\n var stringReplace = unapply(String.prototype.replace);\n var stringIndexOf = unapply(String.prototype.indexOf);\n var stringTrim = unapply(String.prototype.trim);\n var regExpTest = unapply(RegExp.prototype.test);\n var typeErrorCreate = unconstruct(TypeError);\n function unapply(func) {\n return function (thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return apply$1(func, thisArg, args);\n };\n }\n function unconstruct(func) {\n return function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return construct(func, args);\n };\n }\n function addToSet(set, array) {\n if (setPrototypeOf) {\n setPrototypeOf(set, null);\n }\n var l = array.length;\n while (l--) {\n var element = array[l];\n if (typeof element === 'string') {\n var lcElement = stringToLowerCase(element);\n if (lcElement !== element) {\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n }\n function clone$1(object) {\n var newObject = create$5(null);\n var property;\n for (property in object) {\n if (apply$1(hasOwnProperty, object, [property])) {\n newObject[property] = object[property];\n }\n }\n return newObject;\n }\n function lookupGetter(object, prop) {\n while (object !== null) {\n var desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n return fallbackValue;\n }\n var html$1 = freeze([\n 'a',\n 'abbr',\n 'acronym',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blink',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'decorator',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meter',\n 'nav',\n 'nobr',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'spacer',\n 'span',\n 'strike',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'track',\n 'tt',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr'\n ]);\n var svg$1 = freeze([\n 'svg',\n 'a',\n 'altglyph',\n 'altglyphdef',\n 'altglyphitem',\n 'animatecolor',\n 'animatemotion',\n 'animatetransform',\n 'circle',\n 'clippath',\n 'defs',\n 'desc',\n 'ellipse',\n 'filter',\n 'font',\n 'g',\n 'glyph',\n 'glyphref',\n 'hkern',\n 'image',\n 'line',\n 'lineargradient',\n 'marker',\n 'mask',\n 'metadata',\n 'mpath',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialgradient',\n 'rect',\n 'stop',\n 'style',\n 'switch',\n 'symbol',\n 'text',\n 'textpath',\n 'title',\n 'tref',\n 'tspan',\n 'view',\n 'vkern'\n ]);\n var svgFilters = freeze([\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence'\n ]);\n var svgDisallowed = freeze([\n 'animate',\n 'color-profile',\n 'cursor',\n 'discard',\n 'fedropshadow',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignobject',\n 'hatch',\n 'hatchpath',\n 'mesh',\n 'meshgradient',\n 'meshpatch',\n 'meshrow',\n 'missing-glyph',\n 'script',\n 'set',\n 'solidcolor',\n 'unknown',\n 'use'\n ]);\n var mathMl$1 = freeze([\n 'math',\n 'menclose',\n 'merror',\n 'mfenced',\n 'mfrac',\n 'mglyph',\n 'mi',\n 'mlabeledtr',\n 'mmultiscripts',\n 'mn',\n 'mo',\n 'mover',\n 'mpadded',\n 'mphantom',\n 'mroot',\n 'mrow',\n 'ms',\n 'mspace',\n 'msqrt',\n 'mstyle',\n 'msub',\n 'msup',\n 'msubsup',\n 'mtable',\n 'mtd',\n 'mtext',\n 'mtr',\n 'munder',\n 'munderover'\n ]);\n var mathMlDisallowed = freeze([\n 'maction',\n 'maligngroup',\n 'malignmark',\n 'mlongdiv',\n 'mscarries',\n 'mscarry',\n 'msgroup',\n 'mstack',\n 'msline',\n 'msrow',\n 'semantics',\n 'annotation',\n 'annotation-xml',\n 'mprescripts',\n 'none'\n ]);\n var text = freeze(['#text']);\n var html = freeze([\n 'accept',\n 'action',\n 'align',\n 'alt',\n 'autocapitalize',\n 'autocomplete',\n 'autopictureinpicture',\n 'autoplay',\n 'background',\n 'bgcolor',\n 'border',\n 'capture',\n 'cellpadding',\n 'cellspacing',\n 'checked',\n 'cite',\n 'class',\n 'clear',\n 'color',\n 'cols',\n 'colspan',\n 'controls',\n 'controlslist',\n 'coords',\n 'crossorigin',\n 'datetime',\n 'decoding',\n 'default',\n 'dir',\n 'disabled',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'download',\n 'draggable',\n 'enctype',\n 'enterkeyhint',\n 'face',\n 'for',\n 'headers',\n 'height',\n 'hidden',\n 'high',\n 'href',\n 'hreflang',\n 'id',\n 'inputmode',\n 'integrity',\n 'ismap',\n 'kind',\n 'label',\n 'lang',\n 'list',\n 'loading',\n 'loop',\n 'low',\n 'max',\n 'maxlength',\n 'media',\n 'method',\n 'min',\n 'minlength',\n 'multiple',\n 'muted',\n 'name',\n 'nonce',\n 'noshade',\n 'novalidate',\n 'nowrap',\n 'open',\n 'optimum',\n 'pattern',\n 'placeholder',\n 'playsinline',\n 'poster',\n 'preload',\n 'pubdate',\n 'radiogroup',\n 'readonly',\n 'rel',\n 'required',\n 'rev',\n 'reversed',\n 'role',\n 'rows',\n 'rowspan',\n 'spellcheck',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'sizes',\n 'span',\n 'srclang',\n 'start',\n 'src',\n 'srcset',\n 'step',\n 'style',\n 'summary',\n 'tabindex',\n 'title',\n 'translate',\n 'type',\n 'usemap',\n 'valign',\n 'value',\n 'width',\n 'xmlns',\n 'slot'\n ]);\n var svg = freeze([\n 'accent-height',\n 'accumulate',\n 'additive',\n 'alignment-baseline',\n 'ascent',\n 'attributename',\n 'attributetype',\n 'azimuth',\n 'basefrequency',\n 'baseline-shift',\n 'begin',\n 'bias',\n 'by',\n 'class',\n 'clip',\n 'clippathunits',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cx',\n 'cy',\n 'd',\n 'dx',\n 'dy',\n 'diffuseconstant',\n 'direction',\n 'display',\n 'divisor',\n 'dur',\n 'edgemode',\n 'elevation',\n 'end',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'filterunits',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'fx',\n 'fy',\n 'g1',\n 'g2',\n 'glyph-name',\n 'glyphref',\n 'gradientunits',\n 'gradienttransform',\n 'height',\n 'href',\n 'id',\n 'image-rendering',\n 'in',\n 'in2',\n 'k',\n 'k1',\n 'k2',\n 'k3',\n 'k4',\n 'kerning',\n 'keypoints',\n 'keysplines',\n 'keytimes',\n 'lang',\n 'lengthadjust',\n 'letter-spacing',\n 'kernelmatrix',\n 'kernelunitlength',\n 'lighting-color',\n 'local',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'markerheight',\n 'markerunits',\n 'markerwidth',\n 'maskcontentunits',\n 'maskunits',\n 'max',\n 'mask',\n 'media',\n 'method',\n 'mode',\n 'min',\n 'name',\n 'numoctaves',\n 'offset',\n 'operator',\n 'opacity',\n 'order',\n 'orient',\n 'orientation',\n 'origin',\n 'overflow',\n 'paint-order',\n 'path',\n 'pathlength',\n 'patterncontentunits',\n 'patterntransform',\n 'patternunits',\n 'points',\n 'preservealpha',\n 'preserveaspectratio',\n 'primitiveunits',\n 'r',\n 'rx',\n 'ry',\n 'radius',\n 'refx',\n 'refy',\n 'repeatcount',\n 'repeatdur',\n 'restart',\n 'result',\n 'rotate',\n 'scale',\n 'seed',\n 'shape-rendering',\n 'specularconstant',\n 'specularexponent',\n 'spreadmethod',\n 'startoffset',\n 'stddeviation',\n 'stitchtiles',\n 'stop-color',\n 'stop-opacity',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke',\n 'stroke-width',\n 'style',\n 'surfacescale',\n 'systemlanguage',\n 'tabindex',\n 'targetx',\n 'targety',\n 'transform',\n 'transform-origin',\n 'text-anchor',\n 'text-decoration',\n 'text-rendering',\n 'textlength',\n 'type',\n 'u1',\n 'u2',\n 'unicode',\n 'values',\n 'viewbox',\n 'visibility',\n 'version',\n 'vert-adv-y',\n 'vert-origin-x',\n 'vert-origin-y',\n 'width',\n 'word-spacing',\n 'wrap',\n 'writing-mode',\n 'xchannelselector',\n 'ychannelselector',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'y',\n 'y1',\n 'y2',\n 'z',\n 'zoomandpan'\n ]);\n var mathMl = freeze([\n 'accent',\n 'accentunder',\n 'align',\n 'bevelled',\n 'close',\n 'columnsalign',\n 'columnlines',\n 'columnspan',\n 'denomalign',\n 'depth',\n 'dir',\n 'display',\n 'displaystyle',\n 'encoding',\n 'fence',\n 'frame',\n 'height',\n 'href',\n 'id',\n 'largeop',\n 'length',\n 'linethickness',\n 'lspace',\n 'lquote',\n 'mathbackground',\n 'mathcolor',\n 'mathsize',\n 'mathvariant',\n 'maxsize',\n 'minsize',\n 'movablelimits',\n 'notation',\n 'numalign',\n 'open',\n 'rowalign',\n 'rowlines',\n 'rowspacing',\n 'rowspan',\n 'rspace',\n 'rquote',\n 'scriptlevel',\n 'scriptminsize',\n 'scriptsizemultiplier',\n 'selection',\n 'separator',\n 'separators',\n 'stretchy',\n 'subscriptshift',\n 'supscriptshift',\n 'symmetric',\n 'voffset',\n 'width',\n 'xmlns'\n ]);\n var xml = freeze([\n 'xlink:href',\n 'xml:id',\n 'xlink:title',\n 'xml:space',\n 'xmlns:xlink'\n ]);\n var MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm);\n var ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n var DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/);\n var ARIA_ATTR = seal(/^aria-[\\-\\w]+$/);\n var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i);\n var IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\n var ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g);\n var DOCTYPE_NAME = seal(/^html$/i);\n var getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n };\n var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {\n if (_typeof(trustedTypes) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n var suffix = null;\n var ATTR_NAME = 'data-tt-policy-suffix';\n if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n var policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML: function createHTML(html) {\n return html;\n }\n });\n } catch (_) {\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n };\n function createDOMPurify() {\n var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n var DOMPurify = function DOMPurify(root) {\n return createDOMPurify(root);\n };\n DOMPurify.version = '2.3.8';\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== 9) {\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n var originalDocument = window.document;\n var document = window.document;\n var DocumentFragment = window.DocumentFragment, HTMLTemplateElement = window.HTMLTemplateElement, Node = window.Node, Element = window.Element, NodeFilter = window.NodeFilter, _window$NamedNodeMap = window.NamedNodeMap, NamedNodeMap = _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap, HTMLFormElement = window.HTMLFormElement, DOMParser = window.DOMParser, trustedTypes = window.trustedTypes;\n var ElementPrototype = Element.prototype;\n var cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n var getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n var getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n if (typeof HTMLTemplateElement === 'function') {\n var template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);\n var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n var _document = document, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;\n var importNode = originalDocument.importNode;\n var documentMode = {};\n try {\n documentMode = clone$1(document).documentMode ? document.documentMode : {};\n } catch (_) {\n }\n var hooks = {};\n DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9;\n var MUSTACHE_EXPR$1 = MUSTACHE_EXPR, ERB_EXPR$1 = ERB_EXPR, DATA_ATTR$1 = DATA_ATTR, ARIA_ATTR$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$1 = ATTR_WHITESPACE;\n var IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n var ALLOWED_TAGS = null;\n var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray(html$1), _toConsumableArray(svg$1), _toConsumableArray(svgFilters), _toConsumableArray(mathMl$1), _toConsumableArray(text)));\n var ALLOWED_ATTR = null;\n var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray(html), _toConsumableArray(svg), _toConsumableArray(mathMl), _toConsumableArray(xml)));\n var CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n var FORBID_TAGS = null;\n var FORBID_ATTR = null;\n var ALLOW_ARIA_ATTR = true;\n var ALLOW_DATA_ATTR = true;\n var ALLOW_UNKNOWN_PROTOCOLS = false;\n var SAFE_FOR_TEMPLATES = false;\n var WHOLE_DOCUMENT = false;\n var SET_CONFIG = false;\n var FORCE_BODY = false;\n var RETURN_DOM = false;\n var RETURN_DOM_FRAGMENT = false;\n var RETURN_TRUSTED_TYPE = false;\n var SANITIZE_DOM = true;\n var KEEP_CONTENT = true;\n var IN_PLACE = false;\n var USE_PROFILES = {};\n var FORBID_CONTENTS = null;\n var DEFAULT_FORBID_CONTENTS = addToSet({}, [\n 'annotation-xml',\n 'audio',\n 'colgroup',\n 'desc',\n 'foreignobject',\n 'head',\n 'iframe',\n 'math',\n 'mi',\n 'mn',\n 'mo',\n 'ms',\n 'mtext',\n 'noembed',\n 'noframes',\n 'noscript',\n 'plaintext',\n 'script',\n 'style',\n 'svg',\n 'template',\n 'thead',\n 'title',\n 'video',\n 'xmp'\n ]);\n var DATA_URI_TAGS = null;\n var DEFAULT_DATA_URI_TAGS = addToSet({}, [\n 'audio',\n 'video',\n 'img',\n 'source',\n 'image',\n 'track'\n ]);\n var URI_SAFE_ATTRIBUTES = null;\n var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n 'alt',\n 'class',\n 'for',\n 'id',\n 'label',\n 'name',\n 'pattern',\n 'placeholder',\n 'role',\n 'summary',\n 'title',\n 'value',\n 'style',\n 'xmlns'\n ]);\n var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n var NAMESPACE = HTML_NAMESPACE;\n var IS_EMPTY_INPUT = false;\n var PARSER_MEDIA_TYPE;\n var SUPPORTED_PARSER_MEDIA_TYPES = [\n 'application/xhtml+xml',\n 'text/html'\n ];\n var DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n var transformCaseFunc;\n var CONFIG = null;\n var formElement = document.createElement('form');\n var isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n var _parseConfig = function _parseConfig(cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n if (!cfg || _typeof(cfg) !== 'object') {\n cfg = {};\n }\n cfg = clone$1(cfg);\n ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR;\n URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone$1(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR) : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone$1(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS) : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {};\n FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;\n RETURN_DOM = cfg.RETURN_DOM || false;\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;\n FORCE_BODY = cfg.FORCE_BODY || false;\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false;\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false;\n IN_PLACE = cfg.IN_PLACE || false;\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$1;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n PARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE;\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? function (x) {\n return x;\n } : stringToLowerCase;\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, _toConsumableArray(text));\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone$1(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS);\n }\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone$1(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR);\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone$1(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS);\n }\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, [\n 'html',\n 'head',\n 'body'\n ]);\n }\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [\n 'mi',\n 'mo',\n 'mn',\n 'ms',\n 'mtext'\n ]);\n var HTML_INTEGRATION_POINTS = addToSet({}, [\n 'foreignobject',\n 'desc',\n 'title',\n 'annotation-xml'\n ]);\n var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n 'title',\n 'style',\n 'font',\n 'a',\n 'script'\n ]);\n var ALL_SVG_TAGS = addToSet({}, svg$1);\n addToSet(ALL_SVG_TAGS, svgFilters);\n addToSet(ALL_SVG_TAGS, svgDisallowed);\n var ALL_MATHML_TAGS = addToSet({}, mathMl$1);\n addToSet(ALL_MATHML_TAGS, mathMlDisallowed);\n var _checkValidNamespace = function _checkValidNamespace(element) {\n var parent = getParentNode(element);\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: HTML_NAMESPACE,\n tagName: 'template'\n };\n }\n var tagName = stringToLowerCase(element.tagName);\n var parentTagName = stringToLowerCase(parent.tagName);\n if (element.namespaceURI === SVG_NAMESPACE) {\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n return false;\n };\n var _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, { element: node });\n try {\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n var _removeAttribute = function _removeAttribute(name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node\n });\n }\n node.removeAttribute(name);\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {\n }\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {\n }\n }\n }\n };\n var _initDocument = function _initDocument(dirty) {\n var doc;\n var leadingWhitespace;\n if (FORCE_BODY) {\n dirty = '' + dirty;\n } else {\n var matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml') {\n dirty = '' + dirty + '';\n }\n var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {\n }\n }\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload;\n } catch (_) {\n }\n }\n var body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n var _createIterator = function _createIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);\n };\n var _isClobbered = function _isClobbered(elm) {\n return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function');\n };\n var _isNode = function _isNode(object) {\n return _typeof(Node) === 'object' ? object instanceof Node : object && _typeof(object) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';\n };\n var _executeHook = function _executeHook(entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n arrayForEach(hooks[entryPoint], function (hook) {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n var _sanitizeElements = function _sanitizeElements(currentNode) {\n var content;\n _executeHook('beforeSanitizeElements', currentNode, null);\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n _forceRemove(currentNode);\n return true;\n }\n var tagName = transformCaseFunc(currentNode.nodeName);\n _executeHook('uponSanitizeElement', currentNode, {\n tagName: tagName,\n allowedTags: ALLOWED_TAGS\n });\n if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n if (tagName === 'select' && regExpTest(/