{"version":3,"sources":["SmartSnippetSuggestions.min__7d400a8f34d33214ce02.js","./src/ui/SmartSnippet/SmartSnippetCommon.ts","./src/ui/SmartSnippet/SmartSnippetSuggestions.ts","./src/ui/ResultLink/ResultLinkCommon.ts","./src/misc/AttachShadowPolyfill.ts","./node_modules/dompurify/dist/purify.js","./src/ui/ResultLink/ResultLink.ts","./src/ui/SmartSnippet/SmartSnippetCollapsibleSuggestion.ts"],"names":["webpackJsonpCoveo__temporary","229","module","exports","__webpack_require__","questionAnswer","answerSnippet","sanitize","USE_PROFILES","html","e","Object","defineProperty","value","getDefaultSnippetStyle","contentClassName","transformSnippetLinks","renderedSnippetParent","alwaysOpenInNewWindow","logAnalytics","Dom","nodeListToArray","querySelectorAll","forEach","link","bindAnalyticsToLink","target","299","__extends","this","extendStatics","setPrototypeOf","__proto__","Array","d","b","p","hasOwnProperty","__","constructor","prototype","create","QUESTIONS_LIST_TITLE_CLASSNAME","QUESTIONS_LIST_CLASSNAME","SmartSnippetSuggestionsClassNames","HAS_QUESTIONS_CLASSNAME","BASE_CLASSNAME","element","options","bindings","SmartSnippetSuggestions","ID","titleId","uniqueId","ComponentOptions","initComponentOptions","bind","onRootElement","QueryEvents","deferredQuerySuccess","data","handleQuerySuccess","_this","get","contentLoaded","enumerable","configurable","getCorrespondingResult","find","queryController","getLastResults","results","result","raw","documentId","contentIdKey","contentIdValue","hasQuestions","relatedQuestions","length","$$","toggleClass","searchUid","renderedQuestionAnswer","isEqual","detachContent","appendChild","title","buildTitle","el","questionAnswers","buildQuestionAnswers","detach","className","id","l","innerCSS","getInnerCSS","answers","map","SmartSnippetCollapsibleSuggestion","getBindings","Utils","isNullOrUndefined","SmartSnippetCollapsibleSuggestionClassNames","RAW_CONTENT_CLASSNAME","titleField","hrefTemplate","source","useIFrame","container","ariaLabelledby","answer","build","Promise","all","loading","then","styles","children","filter","HTMLScriptElement","type","toLowerCase","innerHTML","join","doExport","exportGlobally","buildFieldOption","defaultValue","buildStringOption","buildBooleanOption","Component","Initialization","registerAutoCreateComponent","474","executeOnlyOnce","once","on","longPressTimer","window","setTimeout","clearTimeout","522","__awaiter","elementOptions","autoUpdateContainer","contentBody","onLoad","shadowRootContainer","__generator","_a","label","scrolling","resolve","addEventListener","contentDocument","body","style","margin","autoUpdateHeight","onSizeChanged","mode","elementToResize","content","onUpdate","lastWidth","clientWidth","lastHeight","clientHeight","MutationObserver","width","height","observe","attributes","characterData","childList","subtree","thisArg","_arguments","P","generator","reject","fulfilled","step","next","rejected","done","apply","verb","n","v","op","f","TypeError","_","y","t","call","ops","pop","trys","push","g","sent","throw","return","Symbol","iterator","534","587","588","global","factory","_typeof","obj","_setPrototypeOf","o","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","_construct","Parent","args","Class","a","Constructor","Function","instance","arguments","_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","isArray","_arrayLikeToArray","iter","from","minLen","toString","slice","name","test","len","i","arr2","unapply","func","_len","_key","addToSet","set","array","transformCaseFunc","stringToLowerCase","lcElement","isFrozen","clone","object","property","newObject","lookupGetter","prop","fallbackValue","console","warn","desc","getOwnPropertyDescriptor","getPrototypeOf","createDOMPurify","undefined","getGlobal","DOMPurify","root","version","removed","document","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","_window$NamedNodeMap","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","trustedTypes","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","ownerDocument","trustedTypesPolicy","_createTrustedTypesPolicy","emptyHTML","createHTML","_document","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","documentMode","hooks","createHTMLDocument","PARSER_MEDIA_TYPE","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","IS_ALLOWED_URI$1","IS_ALLOWED_URI","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","concat","html$1","svg$1","svgFilters","mathMl$1","text","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","svg","mathMl","xml","CUSTOM_ELEMENT_HANDLING","seal","tagNameCheck","writable","attributeNameCheck","allowCustomizedBuiltInElements","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","SAFE_FOR_TEMPLATES","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","KEEP_CONTENT","IN_PLACE","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","SUPPORTED_PARSER_MEDIA_TYPES","CONFIG","formElement","isRegexOrFunction","testValue","RegExp","_parseConfig","cfg","indexOf","x","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","freeze","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","svgDisallowed","ALL_MATHML_TAGS","mathMlDisallowed","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","_forceRemove","node","arrayPush","parentNode","removeChild","outerHTML","remove","_removeAttribute","attribute","getAttributeNode","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","stringMatch","dirtyPayload","parseFromString","documentElement","createDocument","insertBefore","createTextNode","childNodes","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","_isNode","_executeHook","entryPoint","currentNode","arrayForEach","hook","_sanitizeElements","regExpTest","allowedTags","hasChildNodes","firstElementChild","_basicCustomElementTest","childCount","stringReplace","_isValidAttribute","lcTag","lcName","stringIndexOf","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","_attr","stringTrim","forceKeepAttr","getAttributeType","createScriptURL","setAttributeNS","arrayPop","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","importedNode","oldNode","returnNode","typeErrorCreate","toStaticHTML","firstChild","nodeIterator","shadowroot","serializedHTML","doctype","DOCTYPE_NAME","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks","_ref","fun","thisValue","Func","String","match","replace","trim","_len2","_key2","createPolicy","suffix","currentScript","hasAttribute","getAttribute","policyName","scriptUrl","70","__assign","assign","s","os","ResultLink","debounce","saveLastQuery","documentURL","escapedClickUri","logDocumentOpen","Defer","flush","globalOptions","searchInterface","originalOptionsObject","initialOptions","resultLinkOptions","componentOptionsModel","ComponentOptionsModel","attributesEnum","resultLink","extend","resolveResult","openQuickview","DeviceUtils","isMobileDevice","Assert","exists","quickviewShouldBeOpened","renderUri","bindEventToOpen","getDisplayedTitle","titleAsText","getDisplayedTitleAsText","openLink","location","href","getResultUri","openLinkInNewWindow","open","openLinkInOutlook","hasOutlookField","openLinkAsConfigured","toExecuteOnOpen","bindOnClickIfNotUndefined","bindOpenQuickviewIfNotUndefined","setHrefIfNotAlready","openLinkThatIsNotAnAnchor","titleTemplate","newTitle","StringUtils","buildStringTemplateFromResult","StreamHighlightUtils","highlightStreamText","termsToHighlight","phrasesToHighlight","HighlightUtils","highlightString","titleHighlights","setHtml","escape","clickUri","onClick","AccessibleButton","withElement","withLabel","withSelectAction","resultElement","trigger","ResultListEvents","preventDefault","elementIsAnAnchor","openInOutlook","isNonEmptyString","usageAnalytics","logClickEvent","analyticsActionCauseList","documentOpen","documentTitle","author","getFieldValue","filterProtocol","uri","isAbsolute","isRelative","field","setField","OSUtils","OS_NAME","MACOSX","WINDOWS","isUriThatMustBeOpenedInQuickview","QueryUtils","hasHTMLVersion","buildCustomOption","709","710","QUESTION_CLASSNAME","QUESTION_TITLE_CLASSNAME","QUESTION_TITLE_LABEL_CLASSNAME","QUESTION_TITLE_CHECKBOX_CLASSNAME","QUESTION_SNIPPET_CLASSNAME","QUESTION_SNIPPET_CONTAINER_CLASSNAME","QUESTION_SNIPPET_HIDDEN_CLASSNAME","SHADOW_CLASSNAME","SOURCE_CLASSNAME","SOURCE_TITLE_CLASSNAME","SOURCE_URL_CLASSNAME","labelId","snippetId","checkboxId","expanded","question","searchQueryUid","collapsibleContainer","buildCollapsibleContainer","buildStyle","updateExpanded","styleTag","checkbox","buildCheckbox","toggle","role","tabindex","ariaControls","withEnterKeyboardAction","shadowContainer","snippetAndSourceContainer","attachShadow","shadowRoot","buildAnswerSnippetContent","append","buildSourceUrl","buildSourceTitle","snippet","getSanitizedAnswerSnippet","sendOpenSnippetLinkAnalytics","buildLink","sendOpenSourceAnalytics","sendExpandAnalytics","sendCollapseAnalytics","updateIFrameExpanded","iframe","SVGIcons","icons","arrowUp","arrowDown","logCustomEvent","expandSmartSnippetSuggestion","analyticsSuggestionMeta","collapseSmartSnippetSuggestion","openSmartSnippetSuggestionSource","openSmartSnippetSuggestionInlineLink","linkText","innerText","linkURL"],"mappings":"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","file":"SmartSnippetSuggestions.min__7d400a8f34d33214ce02.js","sourcesContent":["webpackJsonpCoveo__temporary([21,42],{\n\n/***/ 229:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dompurify_1 = __webpack_require__(588);\nvar Dom_1 = __webpack_require__(1);\nvar ResultLinkCommon_1 = __webpack_require__(474);\nexports.getDefaultSnippetStyle = function (contentClassName) { return \"\\n body {\\n font-family: \\\"Lato\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif, sans-serif;\\n }\\n\\n .\" + contentClassName + \" > :first-child {\\n margin-top: 0;\\n }\\n\\n .\" + contentClassName + \" > :last-child {\\n margin-bottom: 0;\\n }\\n\"; };\nfunction getSanitizedAnswerSnippet(questionAnswer) {\n if (!questionAnswer.answerSnippet) {\n return '';\n }\n // dompurify can fail to execute in some environment (salesforce locker service)\n try {\n return dompurify_1.sanitize(questionAnswer.answerSnippet, {\n USE_PROFILES: { html: true }\n });\n }\n catch (e) {\n return questionAnswer.answerSnippet;\n }\n}\nexports.getSanitizedAnswerSnippet = getSanitizedAnswerSnippet;\nexports.transformSnippetLinks = function (renderedSnippetParent, alwaysOpenInNewWindow, logAnalytics) {\n Dom_1.Dom.nodeListToArray(renderedSnippetParent.querySelectorAll('a')).forEach(function (link) {\n ResultLinkCommon_1.bindAnalyticsToLink(link, function () { return logAnalytics(link); });\n link.target = alwaysOpenInNewWindow ? '_blank' : '_top';\n });\n};\n\n\n/***/ }),\n\n/***/ 299:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__webpack_require__(709);\nvar Component_1 = __webpack_require__(7);\nvar GlobalExports_1 = __webpack_require__(3);\nvar QueryEvents_1 = __webpack_require__(11);\nvar Dom_1 = __webpack_require__(1);\nvar underscore_1 = __webpack_require__(0);\nvar SmartSnippetCollapsibleSuggestion_1 = __webpack_require__(710);\nvar Strings_1 = __webpack_require__(6);\nvar Initialization_1 = __webpack_require__(2);\nvar Utils_1 = __webpack_require__(4);\nvar SmartSnippetCommon_1 = __webpack_require__(229);\nvar ComponentOptions_1 = __webpack_require__(8);\nvar BASE_CLASSNAME = 'coveo-smart-snippet-suggestions';\nvar HAS_QUESTIONS_CLASSNAME = BASE_CLASSNAME + \"-has-questions\";\nvar QUESTIONS_LIST_CLASSNAME = BASE_CLASSNAME + \"-questions\";\nvar QUESTIONS_LIST_TITLE_CLASSNAME = QUESTIONS_LIST_CLASSNAME + \"-title\";\nexports.SmartSnippetSuggestionsClassNames = {\n HAS_QUESTIONS_CLASSNAME: HAS_QUESTIONS_CLASSNAME,\n QUESTIONS_LIST_CLASSNAME: QUESTIONS_LIST_CLASSNAME,\n QUESTIONS_LIST_TITLE_CLASSNAME: QUESTIONS_LIST_TITLE_CLASSNAME\n};\n/**\n * The SmartSnippetSuggestions component displays additional queries for which a Coveo Smart Snippets model can provide relevant excerpts.\n */\nvar SmartSnippetSuggestions = /** @class */ (function (_super) {\n __extends(SmartSnippetSuggestions, _super);\n function SmartSnippetSuggestions(element, options, bindings) {\n var _this = _super.call(this, element, SmartSnippetSuggestions.ID, bindings) || this;\n _this.element = element;\n _this.options = options;\n _this.titleId = underscore_1.uniqueId(QUESTIONS_LIST_TITLE_CLASSNAME);\n _this.options = ComponentOptions_1.ComponentOptions.initComponentOptions(element, SmartSnippetSuggestions, options);\n _this.bind.onRootElement(QueryEvents_1.QueryEvents.deferredQuerySuccess, function (data) { return _this.handleQuerySuccess(data); });\n return _this;\n }\n Object.defineProperty(SmartSnippetSuggestions.prototype, \"loading\", {\n get: function () {\n return this.contentLoaded;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @warning This method only works for the demo. In practice, the source of the answer will not always be part of the results.\n */\n SmartSnippetSuggestions.prototype.getCorrespondingResult = function (questionAnswer) {\n return underscore_1.find(this.queryController.getLastResults().results, function (result) { return result.raw[questionAnswer.documentId.contentIdKey] === questionAnswer.documentId.contentIdValue; });\n };\n SmartSnippetSuggestions.prototype.handleQuerySuccess = function (data) {\n var questionAnswer = data.results.questionAnswer;\n var hasQuestions = !!(questionAnswer && questionAnswer.relatedQuestions.length);\n Dom_1.$$(this.element).toggleClass(HAS_QUESTIONS_CLASSNAME, hasQuestions);\n if (hasQuestions) {\n this.searchUid = data.results.searchUid;\n if (this.renderedQuestionAnswer && underscore_1.isEqual(questionAnswer, this.renderedQuestionAnswer)) {\n return;\n }\n this.detachContent();\n this.element.appendChild((this.title = this.buildTitle()).el);\n this.element.appendChild((this.questionAnswers = this.buildQuestionAnswers(questionAnswer.relatedQuestions)).el);\n }\n else {\n this.detachContent();\n }\n this.renderedQuestionAnswer = questionAnswer;\n };\n SmartSnippetSuggestions.prototype.detachContent = function () {\n this.title && this.title.detach();\n this.questionAnswers && this.questionAnswers.detach();\n this.title = this.questionAnswers = null;\n };\n SmartSnippetSuggestions.prototype.buildTitle = function () {\n return Dom_1.$$('span', { className: QUESTIONS_LIST_TITLE_CLASSNAME, id: this.titleId }, Strings_1.l('SuggestedQuestions'));\n };\n SmartSnippetSuggestions.prototype.buildQuestionAnswers = function (questionAnswers) {\n var _this = this;\n var innerCSS = this.getInnerCSS();\n var answers = questionAnswers.map(function (questionAnswer) {\n return new SmartSnippetCollapsibleSuggestion_1.SmartSnippetCollapsibleSuggestion({\n questionAnswer: questionAnswer,\n bindings: _this.getBindings(),\n innerCSS: Utils_1.Utils.isNullOrUndefined(innerCSS)\n ? SmartSnippetCommon_1.getDefaultSnippetStyle(SmartSnippetCollapsibleSuggestion_1.SmartSnippetCollapsibleSuggestionClassNames.RAW_CONTENT_CLASSNAME)\n : innerCSS,\n searchUid: _this.searchUid,\n titleField: _this.options.titleField,\n hrefTemplate: _this.options.hrefTemplate,\n alwaysOpenInNewWindow: _this.options.alwaysOpenInNewWindow,\n source: _this.getCorrespondingResult(questionAnswer),\n useIFrame: _this.options.useIFrame\n });\n });\n var container = Dom_1.$$.apply(void 0, ['ul',\n { className: QUESTIONS_LIST_CLASSNAME, ariaLabelledby: this.titleId }].concat(answers.map(function (answer) { return answer.build(); })));\n this.contentLoaded = Promise.all(answers.map(function (answer) { return answer.loading.then(function () { return answer; }); }));\n return container;\n };\n SmartSnippetSuggestions.prototype.getInnerCSS = function () {\n var styles = Dom_1.$$(this.element)\n .children()\n .filter(function (element) { return element instanceof HTMLScriptElement && element.type.toLowerCase() === 'text/css'; })\n .map(function (element) { return element.innerHTML; });\n return styles.length ? styles.join('\\n') : null;\n };\n SmartSnippetSuggestions.ID = 'SmartSnippetSuggestions';\n SmartSnippetSuggestions.doExport = function () {\n GlobalExports_1.exportGlobally({\n SmartSnippetSuggestions: SmartSnippetSuggestions\n });\n };\n /**\n * The options for the SmartSnippetSuggestions\n * @componentOptions\n */\n SmartSnippetSuggestions.options = {\n /**\n * The field to display for the title.\n */\n titleField: ComponentOptions_1.ComponentOptions.buildFieldOption({ defaultValue: '@title' }),\n /**\n * Specifies a template literal from which to generate the title and URI's `href` attribute value (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the [`field`]{@link SmartSnippet.options.uriField} option value.\n *\n * The template literal can reference any number of fields from the parent result. It can also reference global\n * scope properties.\n *\n * **Examples:**\n *\n * - The following markup generates an `href` value such as `http://uri.com?id=itemTitle`:\n *\n * ```html\n * <a class='CoveoSmartSnippet' data-href-template='${clickUri}?id=${raw.title}'></a>\n * ```\n *\n * - The following markup generates an `href` value such as `localhost/fooBar`:\n *\n * ```html\n * <a class='CoveoSmartSnippet' data-href-template='${window.location.hostname}/{Foo.Bar}'></a>\n * ```\n *\n * Default value is `undefined`.\n */\n hrefTemplate: ComponentOptions_1.ComponentOptions.buildStringOption(),\n /**\n * Specifies whether the component should open its links in a new window instead of opening them in the current\n * context.\n *\n * Default value is `false`.\n */\n alwaysOpenInNewWindow: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * Specify if the SmartSnippetSuggestion snippet should be displayed inside an iframe or not.\n *\n * Use this option in specific cases where your environment has limitations around iframe usage.\n *\n * **Examples:**\n *\n * ```html\n * <div class='CoveoSmartSnippetSuggestions' data-use-i-frame='true'></div>\n * ```\n *\n * Default value is `true`.\n */\n useIFrame: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: true })\n };\n return SmartSnippetSuggestions;\n}(Component_1.Component));\nexports.SmartSnippetSuggestions = SmartSnippetSuggestions;\nInitialization_1.Initialization.registerAutoCreateComponent(SmartSnippetSuggestions);\nSmartSnippetSuggestions.doExport();\n\n\n/***/ }),\n\n/***/ 474:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar underscore_1 = __webpack_require__(0);\nvar Dom_1 = __webpack_require__(1);\nfunction bindAnalyticsToLink(element, logAnalytics) {\n var executeOnlyOnce = underscore_1.once(function () { return logAnalytics(); });\n Dom_1.$$(element).on(['contextmenu', 'click', 'mousedown', 'mouseup'], executeOnlyOnce);\n var longPressTimer;\n Dom_1.$$(element).on('touchstart', function () {\n longPressTimer = window.setTimeout(executeOnlyOnce, 1000);\n });\n Dom_1.$$(element).on('touchend', function () {\n if (longPressTimer) {\n clearTimeout(longPressTimer);\n }\n });\n}\nexports.bindAnalyticsToLink = bindAnalyticsToLink;\n\n\n/***/ }),\n\n/***/ 522:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [0, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dom_1 = __webpack_require__(1);\n__webpack_require__(587);\nfunction attachShadow(element, options) {\n return __awaiter(this, void 0, void 0, function () {\n var elementOptions, autoUpdateContainer, contentBody, onLoad, shadowRootContainer;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n elementOptions = { className: 'coveo-shadow-iframe', scrolling: 'no', title: options.title };\n if (!options.useIFrame) return [3 /*break*/, 2];\n autoUpdateContainer = Dom_1.$$('iframe', elementOptions).el;\n onLoad = new Promise(function (resolve) { return autoUpdateContainer.addEventListener('load', function () { return resolve(); }); });\n element.appendChild(autoUpdateContainer);\n return [4 /*yield*/, onLoad];\n case 1:\n _a.sent();\n contentBody = autoUpdateContainer.contentDocument.body;\n return [3 /*break*/, 3];\n case 2:\n autoUpdateContainer = Dom_1.$$('div', elementOptions).el;\n contentBody = autoUpdateContainer;\n element.appendChild(autoUpdateContainer);\n _a.label = 3;\n case 3:\n contentBody.style.margin = '0';\n shadowRootContainer = Dom_1.$$('div', { style: 'overflow: auto;' }).el;\n contentBody.appendChild(shadowRootContainer);\n autoUpdateHeight(autoUpdateContainer, shadowRootContainer, options.onSizeChanged);\n if (options.mode === 'open') {\n Object.defineProperty(element, 'shadowRoot', { get: function () { return shadowRootContainer; } });\n }\n return [2 /*return*/, shadowRootContainer];\n }\n });\n });\n}\nexports.attachShadow = attachShadow;\nfunction autoUpdateHeight(elementToResize, content, onUpdate) {\n var lastWidth = content.clientWidth;\n var lastHeight = content.clientHeight;\n var heightObserver = new MutationObserver(function () {\n if (lastWidth === content.clientWidth && lastHeight === content.clientHeight) {\n return;\n }\n lastWidth = content.clientWidth;\n lastHeight = content.clientHeight;\n elementToResize.style.width = content.clientWidth + \"px\";\n elementToResize.style.height = content.clientHeight + \"px\";\n if (onUpdate) {\n onUpdate();\n }\n });\n heightObserver.observe(content, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true\n });\n}\n\n\n/***/ }),\n\n/***/ 534:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 587:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 588:\n/***/ (function(module, exports, __webpack_require__) {\n\n/*! @license DOMPurify 2.4.0 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.4.0/LICENSE */\n\n(function (global, factory) {\n true ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory());\n})(this, (function () { 'use strict';\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\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\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\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) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\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\n var hasOwnProperty = Object.hasOwnProperty,\n setPrototypeOf = Object.setPrototypeOf,\n isFrozen = Object.isFrozen,\n getPrototypeOf = Object.getPrototypeOf,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n var freeze = Object.freeze,\n seal = Object.seal,\n create = Object.create; // eslint-disable-line import/no-mutable-exports\n\n var _ref = typeof Reflect !== 'undefined' && Reflect,\n apply = _ref.apply,\n construct = _ref.construct;\n\n if (!apply) {\n apply = function apply(fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n }\n\n if (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n }\n\n if (!seal) {\n seal = function seal(x) {\n return x;\n };\n }\n\n if (!construct) {\n construct = function construct(Func, args) {\n return _construct(Func, _toConsumableArray(args));\n };\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\n return apply(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\n return construct(func, args);\n };\n }\n /* Add properties to a lookup table */\n\n function addToSet(set, array, transformCaseFunc) {\n transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;\n\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n var l = array.length;\n\n while (l--) {\n var element = array[l];\n\n if (typeof element === 'string') {\n var lcElement = transformCaseFunc(element);\n\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n }\n /* Shallow clone an object */\n\n function clone(object) {\n var newObject = create(null);\n var property;\n\n for (property in object) {\n if (apply(hasOwnProperty, object, [property])) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n }\n /* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\n\n function lookupGetter(object, prop) {\n while (object !== null) {\n var desc = getOwnPropertyDescriptor(object, prop);\n\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n }\n\n var html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']); // SVG\n\n var svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\n var svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.\n // We still need to know them so that we can do namespace\n // checks properly in case one wants to add them to\n // allow-list.\n\n var svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\n var mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover']); // Similarly to SVG, we want to know all MathML elements,\n // even those that we disallow by default.\n\n var mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\n var text = freeze(['#text']);\n\n var html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns', 'slot']);\n var svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\n var mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\n var xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n var MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\n\n var ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n var DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\n\n var ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\n\n var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n );\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 // eslint-disable-line no-control-regex\n );\n var DOCTYPE_NAME = seal(/^html$/i);\n\n var getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n };\n /**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\n\n\n var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {\n if (_typeof(trustedTypes) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n } // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n\n\n var suffix = null;\n var ATTR_NAME = 'data-tt-policy-suffix';\n\n if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n var policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML: function createHTML(html) {\n return html;\n },\n createScriptURL: function createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n };\n\n function createDOMPurify() {\n var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n\n var DOMPurify = function DOMPurify(root) {\n return createDOMPurify(root);\n };\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n\n\n DOMPurify.version = '2.4.0';\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n\n var originalDocument = window.document;\n var document = window.document;\n var DocumentFragment = window.DocumentFragment,\n HTMLTemplateElement = window.HTMLTemplateElement,\n Node = window.Node,\n Element = window.Element,\n NodeFilter = window.NodeFilter,\n _window$NamedNodeMap = window.NamedNodeMap,\n NamedNodeMap = _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap,\n HTMLFormElement = window.HTMLFormElement,\n DOMParser = window.DOMParser,\n 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'); // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n\n if (typeof HTMLTemplateElement === 'function') {\n var template = document.createElement('template');\n\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);\n\n var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n var _document = document,\n implementation = _document.implementation,\n createNodeIterator = _document.createNodeIterator,\n createDocumentFragment = _document.createDocumentFragment,\n getElementsByTagName = _document.getElementsByTagName;\n var importNode = originalDocument.importNode;\n var documentMode = {};\n\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n var hooks = {};\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n\n DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9;\n var MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n ERB_EXPR$1 = ERB_EXPR,\n DATA_ATTR$1 = DATA_ATTR,\n ARIA_ATTR$1 = ARIA_ATTR,\n IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE$1 = ATTR_WHITESPACE;\n var IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n\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 /* Allowed attribute names */\n\n var ALLOWED_ATTR = null;\n var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray(html), _toConsumableArray(svg), _toConsumableArray(mathMl), _toConsumableArray(xml)));\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n\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 /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n\n var FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n\n var FORBID_ATTR = null;\n /* Decide if ARIA attributes are okay */\n\n var ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n\n var ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n\n var ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n\n var SAFE_FOR_TEMPLATES = false;\n /* Decide if document with <html>... should be returned */\n\n var WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n\n var SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n\n var FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n\n var RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n\n var RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n\n var RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n\n var SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n\n var SANITIZE_NAMED_PROPS = false;\n var SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n\n var KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n\n var IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n\n var USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n\n var FORBID_CONTENTS = null;\n var DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n\n var DATA_URI_TAGS = null;\n var DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n\n var URI_SAFE_ATTRIBUTES = null;\n var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\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 /* Document namespace */\n\n var NAMESPACE = HTML_NAMESPACE;\n var IS_EMPTY_INPUT = false;\n /* Parsing of strict XHTML documents */\n\n var PARSER_MEDIA_TYPE;\n var SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n var DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n var transformCaseFunc;\n /* Keep a reference to config to pass to hooks */\n\n var CONFIG = null;\n /* Ideally, do not touch anything below this line */\n\n /* ______________________________________________ */\n\n var formElement = document.createElement('form');\n\n var isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n\n\n var _parseConfig = function _parseConfig(cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n\n\n if (!cfg || _typeof(cfg) !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n\n\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? function (x) {\n return x;\n } : stringToLowerCase;\n /* Set configuration parameters */\n\n ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$1;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\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\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\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n\n\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, _toConsumableArray(text));\n ALLOWED_ATTR = [];\n\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\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\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\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 /* Merge configuration parameters */\n\n\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n\n\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n\n\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n\n\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n } // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n\n\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n var HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n\n var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\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 /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n\n var _checkValidNamespace = function _checkValidNamespace(element) {\n var parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: HTML_NAMESPACE,\n tagName: 'template'\n };\n }\n\n var tagName = stringToLowerCase(element.tagName);\n var parentTagName = stringToLowerCase(parent.tagName);\n\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n } // The only way to switch from MathML to SVG is via\n // svg if parent is either <annotation-xml> or MathML\n // text integration points.\n\n\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n } // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n\n\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n } // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n\n\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n } // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n\n\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n } // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n\n\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n } // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG or MathML). Return false just in case.\n\n\n return false;\n };\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n\n\n var _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\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\n node.removeAttribute(name); // We void attribute values for unremovable \"is\"\" attributes\n\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n\n\n var _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n var doc;\n var leadingWhitespace;\n\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n var matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml') {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n }\n\n var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n\n\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload;\n } catch (_) {// Syntax error if dirtyPayload is invalid xml\n }\n }\n\n var body = doc.body || doc.documentElement;\n\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n\n\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n\n\n var _createIterator = function _createIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);\n };\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n\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 /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n\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 /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n\n\n var _executeHook = function _executeHook(entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], function (hook) {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n\n\n var _sanitizeElements = function _sanitizeElements(currentNode) {\n var content;\n /* Execute a hook if present */\n\n _executeHook('beforeSanitizeElements', currentNode, null);\n /* Check if element is clobbered or can clobber */\n\n\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Check if tagname contains Unicode */\n\n\n if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Now let's check the element's type and name */\n\n\n var tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n\n _executeHook('uponSanitizeElement', currentNode, {\n tagName: tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n\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\n return true;\n }\n /* Mitigate a problem with templates inside select */\n\n\n if (tagName === 'select' && regExpTest(/<template/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Remove element if anything forbids its presence */\n\n\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;\n }\n /* Keep content except for bad-listed elements */\n\n\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n var parentNode = getParentNode(currentNode) || currentNode.parentNode;\n var childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n\n if (childNodes && parentNode) {\n var childCount = childNodes.length;\n\n for (var i = childCount - 1; i >= 0; --i) {\n parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));\n }\n }\n }\n\n _forceRemove(currentNode);\n\n return true;\n }\n /* Check whether element has a valid namespace */\n\n\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n\n return true;\n }\n\n if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\\/no(script|embed)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Sanitize element content to be template-safe */\n\n\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\n /* Get the element's text content */\n content = currentNode.textContent;\n content = stringReplace(content, MUSTACHE_EXPR$1, ' ');\n content = stringReplace(content, ERB_EXPR$1, ' ');\n\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeElements', currentNode, null);\n\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param {string} lcTag Lowercase tag name of containing element.\n * @param {string} lcName Lowercase attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n\n\n var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n\n\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _basicCustomElementTest(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if (!value) ; else {\n return false;\n }\n\n return true;\n };\n /**\n * _basicCustomElementCheck\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n * @param {string} tagName name of the tag of the node to sanitize\n */\n\n\n var _basicCustomElementTest = function _basicCustomElementTest(tagName) {\n return tagName.indexOf('-') > 0;\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param {Node} currentNode to sanitize\n */\n\n\n var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n var attr;\n var value;\n var lcName;\n var l;\n /* Execute a hook if present */\n\n _executeHook('beforeSanitizeAttributes', currentNode, null);\n\n var attributes = currentNode.attributes;\n /* Check if we have attributes; if not we might have a text node */\n\n if (!attributes) {\n return;\n }\n\n var hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR\n };\n l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n\n while (l--) {\n attr = attributes[l];\n var _attr = attr,\n name = _attr.name,\n namespaceURI = _attr.namespaceURI;\n value = name === 'value' ? attr.value : stringTrim(attr.value);\n lcName = transformCaseFunc(name);\n /* Execute a hook if present */\n\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n\n _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n\n value = hookEvent.attrValue;\n /* Did the hooks approve of the attribute? */\n\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Remove attribute */\n\n\n _removeAttribute(name, currentNode);\n /* Did the hooks approve of the attribute? */\n\n\n if (!hookEvent.keepAttr) {\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n\n\n if (regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n\n\n if (SAFE_FOR_TEMPLATES) {\n value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n value = stringReplace(value, ERB_EXPR$1, ' ');\n }\n /* Is `value` valid for this attribute? */\n\n\n var lcTag = transformCaseFunc(currentNode.nodeName);\n\n if (!_isValidAttribute(lcTag, lcName, value)) {\n continue;\n }\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n\n\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value\n\n\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Handle attributes that require Trusted Types */\n\n\n if (trustedTypesPolicy && _typeof(trustedTypes) === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n value = trustedTypesPolicy.createHTML(value);\n break;\n\n case 'TrustedScriptURL':\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n\n\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n\n arrayPop(DOMPurify.removed);\n } catch (_) {}\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeAttributes', currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param {DocumentFragment} fragment to iterate over recursively\n */\n\n\n var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n var shadowNode;\n\n var shadowIterator = _createIterator(fragment);\n /* Execute a hook if present */\n\n\n _executeHook('beforeSanitizeShadowDOM', fragment, null);\n\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHook('uponSanitizeShadowNode', shadowNode, null);\n /* Sanitize tags and elements */\n\n\n if (_sanitizeElements(shadowNode)) {\n continue;\n }\n /* Deep shadow DOM detected */\n\n\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n /* Check attributes, sanitize if necessary */\n\n\n _sanitizeAttributes(shadowNode);\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeShadowDOM', fragment, null);\n };\n /**\n * Sanitize\n * Public method providing core sanitation functionality\n *\n * @param {String|Node} dirty string or DOM node\n * @param {Object} configuration object\n */\n // eslint-disable-next-line complexity\n\n\n DOMPurify.sanitize = function (dirty) {\n var cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var body;\n var importedNode;\n var currentNode;\n var oldNode;\n var returnNode;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n\n IS_EMPTY_INPUT = !dirty;\n\n if (IS_EMPTY_INPUT) {\n dirty = '<!-->';\n }\n /* Stringify, in case dirty is an object */\n\n\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n // eslint-disable-next-line no-negated-condition\n if (typeof dirty.toString !== 'function') {\n throw typeErrorCreate('toString is not a function');\n } else {\n dirty = dirty.toString();\n\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n }\n }\n /* Check we can run. Otherwise fall back or ignore */\n\n\n if (!DOMPurify.isSupported) {\n if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {\n if (typeof dirty === 'string') {\n return window.toStaticHTML(dirty);\n }\n\n if (_isNode(dirty)) {\n return window.toStaticHTML(dirty.outerHTML);\n }\n }\n\n return dirty;\n }\n /* Assign config vars */\n\n\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n\n\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n var tagName = transformCaseFunc(dirty.nodeName);\n\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n\n if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n\n\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n\n\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n\n\n var nodeIterator = _createIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n\n\n while (currentNode = nodeIterator.nextNode()) {\n /* Fix IE's strange behavior with manipulated textNodes #89 */\n if (currentNode.nodeType === 3 && currentNode === oldNode) {\n continue;\n }\n /* Sanitize tags and elements */\n\n\n if (_sanitizeElements(currentNode)) {\n continue;\n }\n /* Shadow DOM detected, sanitize it */\n\n\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n /* Check attributes, sanitize if necessary */\n\n\n _sanitizeAttributes(currentNode);\n\n oldNode = currentNode;\n }\n\n oldNode = null;\n /* If we sanitized `dirty` in-place, return it. */\n\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n\n\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n\n if (ALLOWED_ATTR.shadowroot) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n\n return returnNode;\n }\n\n var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n\n\n if (SAFE_FOR_TEMPLATES) {\n serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$1, ' ');\n serializedHTML = stringReplace(serializedHTML, ERB_EXPR$1, ' ');\n }\n\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n /**\n * Public method to set the configuration once\n * setConfig\n *\n * @param {Object} cfg configuration object\n */\n\n\n DOMPurify.setConfig = function (cfg) {\n _parseConfig(cfg);\n\n SET_CONFIG = true;\n };\n /**\n * Public method to remove the configuration\n * clearConfig\n *\n */\n\n\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n /**\n * Public method to check if an attribute value is valid.\n * Uses last set config, if any. Otherwise, uses config defaults.\n * isValidAttribute\n *\n * @param {string} tag Tag name of containing element.\n * @param {string} attr Attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n */\n\n\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n\n var lcTag = transformCaseFunc(tag);\n var lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n /**\n * AddHook\n * Public method to add DOMPurify hooks\n *\n * @param {String} entryPoint entry point for the hook to add\n * @param {Function} hookFunction function to execute\n */\n\n\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n\n hooks[entryPoint] = hooks[entryPoint] || [];\n arrayPush(hooks[entryPoint], hookFunction);\n };\n /**\n * RemoveHook\n * Public method to remove a DOMPurify hook at a given entryPoint\n * (pops it from the stack of hooks if more are present)\n *\n * @param {String} entryPoint entry point for the hook to remove\n * @return {Function} removed(popped) hook\n */\n\n\n DOMPurify.removeHook = function (entryPoint) {\n if (hooks[entryPoint]) {\n return arrayPop(hooks[entryPoint]);\n }\n };\n /**\n * RemoveHooks\n * Public method to remove all DOMPurify hooks at a given entryPoint\n *\n * @param {String} entryPoint entry point for the hooks to remove\n */\n\n\n DOMPurify.removeHooks = function (entryPoint) {\n if (hooks[entryPoint]) {\n hooks[entryPoint] = [];\n }\n };\n /**\n * RemoveAllHooks\n * Public method to remove all DOMPurify hooks\n *\n */\n\n\n DOMPurify.removeAllHooks = function () {\n hooks = {};\n };\n\n return DOMPurify;\n }\n\n var purify = createDOMPurify();\n\n return purify;\n\n}));\n//# sourceMappingURL=purify.js.map\n\n\n/***/ }),\n\n/***/ 70:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__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};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Component_1 = __webpack_require__(7);\nvar ComponentOptions_1 = __webpack_require__(8);\nvar ComponentOptionsModel_1 = __webpack_require__(28);\nvar AnalyticsActionListMeta_1 = __webpack_require__(10);\nvar ResultListEvents_1 = __webpack_require__(29);\nvar HighlightUtils_1 = __webpack_require__(68);\nvar DeviceUtils_1 = __webpack_require__(24);\nvar OSUtils_1 = __webpack_require__(180);\nvar Initialization_1 = __webpack_require__(2);\nvar QueryUtils_1 = __webpack_require__(21);\nvar Assert_1 = __webpack_require__(5);\nvar Utils_1 = __webpack_require__(4);\nvar Defer_1 = __webpack_require__(31);\nvar Dom_1 = __webpack_require__(1);\nvar StreamHighlightUtils_1 = __webpack_require__(119);\nvar StringUtils_1 = __webpack_require__(22);\nvar underscore_1 = __webpack_require__(0);\nvar GlobalExports_1 = __webpack_require__(3);\n__webpack_require__(534);\nvar AccessibleButton_1 = __webpack_require__(15);\nvar ResultLinkCommon_1 = __webpack_require__(474);\n/**\n * The `ResultLink` component automatically transform a search result title into a clickable link pointing to the\n * original item.\n *\n * This component is a result template component (see [Result Templates](https://docs.coveo.com/en/413/)).\n */\nvar ResultLink = /** @class */ (function (_super) {\n __extends(ResultLink, _super);\n /**\n * Creates a new `ResultLink` component.\n * @param element The HTMLElement on which to instantiate the component.\n * @param options The options for the `ResultLink` component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n * @param result The result to associate the component with.\n * @param os\n */\n function ResultLink(element, options, bindings, result, os) {\n var _this = _super.call(this, element, ResultLink.ID, bindings) || this;\n _this.element = element;\n _this.options = options;\n _this.bindings = bindings;\n _this.result = result;\n _this.os = os;\n _this.logAnalytics = underscore_1.debounce(function () {\n _this.queryController.saveLastQuery();\n var documentURL = Dom_1.$$(_this.element).getAttribute('href');\n if (documentURL == undefined || documentURL == '') {\n documentURL = _this.escapedClickUri;\n }\n if (_this.options.logAnalytics) {\n _this.options.logAnalytics(documentURL);\n }\n else {\n _this.logDocumentOpen(documentURL);\n }\n Defer_1.Defer.flush();\n }, 1500, true);\n var globalOptions = _this.searchInterface.options.originalOptionsObject[ResultLink.ID] || {};\n var initialOptions = ComponentOptions_1.ComponentOptions.initComponentOptions(element, ResultLink, __assign({}, globalOptions, options));\n var resultLinkOptions = _this.componentOptionsModel.get(ComponentOptionsModel_1.ComponentOptionsModel.attributesEnum.resultLink);\n _this.options = underscore_1.extend({}, initialOptions, resultLinkOptions);\n _this.result = result || _this.resolveResult();\n if (_this.options.openQuickview == null) {\n _this.options.openQuickview = result.raw['connectortype'] == 'ExchangeCrawler' && DeviceUtils_1.DeviceUtils.isMobileDevice();\n }\n if (!_this.element.hasAttribute('tabindex')) {\n _this.element.setAttribute('tabindex', '0');\n }\n Assert_1.Assert.exists(_this.componentOptionsModel);\n Assert_1.Assert.exists(_this.result);\n if (!_this.quickviewShouldBeOpened()) {\n // Bind on multiple \"click\" or \"mouse\" events.\n // Create a function that will be executed only once, so as not to log multiple events\n // Once a result link has been opened, and that we log at least one analytics event,\n // it should not matter if the end user open the same link multiple times with different methods.\n // It's still only one \"click\" event as far as UA is concerned.\n // Also need to handle \"longpress\" on mobile (the contextual menu), which we assume to be 1 s long.\n ResultLinkCommon_1.bindAnalyticsToLink(element, function () { return _this.logAnalytics(); });\n }\n _this.renderUri(element, result);\n _this.bindEventToOpen();\n return _this;\n }\n ResultLink.prototype.renderUri = function (element, result) {\n if (/^\\s*$/.test(this.element.innerHTML)) {\n var title = this.getDisplayedTitle();\n this.element.innerHTML = title;\n var titleAsText = this.getDisplayedTitleAsText();\n if (!this.element.hasAttribute('aria-label')) {\n this.element.setAttribute('aria-label', titleAsText);\n }\n if (!this.element.title) {\n this.element.title = titleAsText;\n }\n }\n };\n /**\n * Opens the result in the same window, no matter how the actual component is configured for the end user.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n ResultLink.prototype.openLink = function (logAnalytics) {\n if (logAnalytics === void 0) { logAnalytics = true; }\n if (logAnalytics) {\n this.logAnalytics();\n }\n window.location.href = this.getResultUri();\n };\n /**\n * Opens the result in a new window, no matter how the actual component is configured for the end user.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n ResultLink.prototype.openLinkInNewWindow = function (logAnalytics) {\n if (logAnalytics === void 0) { logAnalytics = true; }\n if (logAnalytics) {\n this.logAnalytics();\n }\n window.open(this.getResultUri(), '_blank');\n };\n /**\n * Tries to open the result in Microsoft Outlook if the result has an `outlookformacuri` or `outlookuri` field.\n *\n * Normally, this implies the result should be a link to an email.\n *\n * If the needed fields are not present, this method does nothing.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n ResultLink.prototype.openLinkInOutlook = function (logAnalytics) {\n if (logAnalytics === void 0) { logAnalytics = true; }\n if (this.hasOutlookField()) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n this.openLink();\n }\n };\n /**\n * Opens the link in the same manner the end user would.\n *\n * This essentially simulates a click on the result link.\n *\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n ResultLink.prototype.openLinkAsConfigured = function (logAnalytics) {\n if (logAnalytics === void 0) { logAnalytics = true; }\n if (this.toExecuteOnOpen) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n this.toExecuteOnOpen();\n }\n };\n ResultLink.prototype.bindEventToOpen = function () {\n return (this.bindOnClickIfNotUndefined() ||\n this.bindOpenQuickviewIfNotUndefined() ||\n this.setHrefIfNotAlready() ||\n this.openLinkThatIsNotAnAnchor());\n };\n ResultLink.prototype.getDisplayedTitle = function () {\n if (!this.options.titleTemplate) {\n return this.result.title\n ? HighlightUtils_1.HighlightUtils.highlightString(this.result.title, this.result.titleHighlights, null, 'coveo-highlight')\n : this.escapedClickUri;\n }\n else {\n var newTitle = StringUtils_1.StringUtils.buildStringTemplateFromResult(this.options.titleTemplate, this.result);\n return newTitle\n ? StreamHighlightUtils_1.StreamHighlightUtils.highlightStreamText(newTitle, this.result.termsToHighlight, this.result.phrasesToHighlight)\n : this.escapedClickUri;\n }\n };\n ResultLink.prototype.getDisplayedTitleAsText = function () {\n var container = Dom_1.$$('div');\n container.setHtml(this.getDisplayedTitle());\n return container.text();\n };\n Object.defineProperty(ResultLink.prototype, \"escapedClickUri\", {\n get: function () {\n return underscore_1.escape(this.result.clickUri);\n },\n enumerable: true,\n configurable: true\n });\n ResultLink.prototype.bindOnClickIfNotUndefined = function () {\n var _this = this;\n if (this.options.onClick != undefined) {\n this.toExecuteOnOpen = function (e) {\n _this.options.onClick.call(_this, e, _this.result);\n };\n new AccessibleButton_1.AccessibleButton()\n .withElement(this.element)\n .withLabel(this.result.title)\n .withSelectAction(function (e) { return _this.toExecuteOnOpen(e); })\n .build();\n return true;\n }\n else {\n return false;\n }\n };\n ResultLink.prototype.bindOpenQuickviewIfNotUndefined = function () {\n var _this = this;\n if (this.quickviewShouldBeOpened()) {\n this.toExecuteOnOpen = function () {\n Dom_1.$$(_this.bindings.resultElement).trigger(ResultListEvents_1.ResultListEvents.openQuickview);\n };\n Dom_1.$$(this.element).on('click', function (e) {\n e.preventDefault();\n _this.toExecuteOnOpen();\n });\n return true;\n }\n else {\n return false;\n }\n };\n ResultLink.prototype.openLinkThatIsNotAnAnchor = function () {\n var _this = this;\n if (!this.elementIsAnAnchor()) {\n this.toExecuteOnOpen = function () {\n if (_this.options.alwaysOpenInNewWindow) {\n if (_this.options.openInOutlook) {\n _this.openLinkInOutlook();\n }\n else {\n _this.openLinkInNewWindow();\n }\n }\n else {\n _this.openLink();\n }\n };\n Dom_1.$$(this.element).on('click', function () {\n _this.toExecuteOnOpen();\n });\n return true;\n }\n return false;\n };\n ResultLink.prototype.setHrefIfNotAlready = function () {\n // Do not erase any value put in href by the template, etc. Allows\n // using custom click urls while still keeping analytics recording\n // and other behavior brought by the component.\n if (this.elementIsAnAnchor() && !Utils_1.Utils.isNonEmptyString(Dom_1.$$(this.element).getAttribute('href'))) {\n Dom_1.$$(this.element).setAttribute('href', this.getResultUri());\n if (this.options.alwaysOpenInNewWindow && !(this.options.openInOutlook && this.hasOutlookField())) {\n Dom_1.$$(this.element).setAttribute('target', '_blank');\n }\n return true;\n }\n else {\n return false;\n }\n };\n ResultLink.prototype.logDocumentOpen = function (href) {\n this.usageAnalytics.logClickEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.documentOpen, {\n documentURL: href,\n documentTitle: this.result.title,\n author: Utils_1.Utils.getFieldValue(this.result, 'author')\n }, this.result, this.root);\n };\n ResultLink.prototype.filterProtocol = function (uri) {\n var isAbsolute = /^(https?|ftp|file|mailto|tel|sip):/i.test(uri);\n var isRelative = /^(\\/|\\.\\/|\\.\\.\\/)/.test(uri);\n return isAbsolute || isRelative ? uri : '';\n };\n ResultLink.prototype.getResultUri = function () {\n if (this.options.hrefTemplate) {\n var uri = StringUtils_1.StringUtils.buildStringTemplateFromResult(this.options.hrefTemplate, this.result);\n return this.filterProtocol(uri);\n }\n if (this.options.field == undefined && this.options.openInOutlook) {\n this.setField();\n }\n if (this.options.field != undefined) {\n return this.filterProtocol(Utils_1.Utils.getFieldValue(this.result, this.options.field));\n }\n return this.filterProtocol(this.result.clickUri);\n };\n ResultLink.prototype.elementIsAnAnchor = function () {\n return this.element.tagName == 'A';\n };\n ResultLink.prototype.setField = function () {\n var os = Utils_1.Utils.exists(this.os) ? this.os : OSUtils_1.OSUtils.get();\n if (os == OSUtils_1.OS_NAME.MACOSX && this.hasOutlookField()) {\n this.options.field = '@outlookformacuri';\n }\n else if (os == OSUtils_1.OS_NAME.WINDOWS && this.hasOutlookField()) {\n this.options.field = '@outlookuri';\n }\n };\n ResultLink.prototype.hasOutlookField = function () {\n var os = Utils_1.Utils.exists(this.os) ? this.os : OSUtils_1.OSUtils.get();\n if (os == OSUtils_1.OS_NAME.MACOSX && this.result.raw['outlookformacuri'] != undefined) {\n return true;\n }\n else if (os == OSUtils_1.OS_NAME.WINDOWS && this.result.raw['outlookuri'] != undefined) {\n return true;\n }\n return false;\n };\n ResultLink.prototype.isUriThatMustBeOpenedInQuickview = function () {\n return this.escapedClickUri.toLowerCase().indexOf('ldap://') == 0;\n };\n ResultLink.prototype.quickviewShouldBeOpened = function () {\n return (this.options.openQuickview || this.isUriThatMustBeOpenedInQuickview()) && QueryUtils_1.QueryUtils.hasHTMLVersion(this.result);\n };\n ResultLink.ID = 'ResultLink';\n ResultLink.doExport = function () {\n GlobalExports_1.exportGlobally({\n ResultLink: ResultLink\n });\n };\n /**\n * The options for the ResultLink\n * @componentOptions\n */\n ResultLink.options = {\n /**\n * Specifies the field to use to output the component `href` attribute value.\n *\n * **Tip:**\n * > Instead of specifying a value for the `field` option, you can directly add an `href` attribute to the\n * > `ResultLink` HTML element. Then, you can use a custom script to generate the `href` value.\n *\n * **Examples:**\n * - With the following markup, the `ResultLink` outputs its `href` value using the `@uri` field (rather than the\n * default field):\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-field=\"@uri\"></a>\n * ```\n *\n * - In the following result template, the custom `getMyKBUri()` function provides the `href` value:\n *\n * ```html\n * <script id=\"KnowledgeArticle\" type=\"text/underscore\" class=\"result-template\">\n * <div class='CoveoIcon>'></div>\n * <a class=\"CoveoResultLink\" href=\"<%= getMyKBUri(raw) %>\"></a>\n * <div class=\"CoveoExcerpt\"></div>\n * </script>\n * ```\n *\n * See also [`hrefTemplate`]{@link ResultLink.options.hrefTemplate}, which can override this option.\n *\n * By default, the component uses the `@clickUri` field of the item to output the value of its `href` attribute.\n */\n field: ComponentOptions_1.ComponentOptions.buildFieldOption(),\n /**\n * Specifies whether the component should try to open its link in Microsoft Outlook.\n *\n * Setting this option to `true` is normally useful for `ResultLink` instances related to Microsoft Exchange emails.\n *\n * If this option is `true`, clicking the `ResultLink` calls the\n * [`openLinkInOutlook`]{@link ResultLink.openLinkInOutlook} method instead of the\n * [`openLink`]{@link ResultLink.openLink} method.\n *\n * Default value is `false`.\n */\n openInOutlook: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * Specifies whether the component should open its link in the [`Quickview`]{@link Quickview} component rather than\n * loading through the original URL.\n *\n * Default value is `false`.\n */\n openQuickview: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * Specifies whether the component should open its link in a new window instead of opening it in the current\n * context.\n *\n * If this option is `true`, clicking the `ResultLink` calls the\n * [`openLinkInNewWindow`]{@link ResultLink.openLinkInNewWindow} method instead of the\n * [`openLink`]{@link ResultLink.openLink} method.\n *\n * **Note:**\n * > If a search page contains a [`ResultPreferences`]{@link ResultsPreferences} component whose\n * > [`enableOpenInNewWindow`]{@link ResultsPreferences.options.enableOpenInNewWindow} option is `true`, and the end\n * > user checks the <b>Always open results in new window</b> box, `ResultLink` components in this page will always\n * > open their links in a new window when the end user clicks them, no matter what the value of their\n * > `alwaysOpenInNewWindow` option is.\n *\n * Default value is `false`.\n */\n alwaysOpenInNewWindow: ComponentOptions_1.ComponentOptions.buildBooleanOption({ defaultValue: false }),\n /**\n * Specifies a template literal from which to generate the `ResultLink` `href` attribute value (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the [`field`]{@link ResultLink.options.field} option value.\n *\n * The template literal can reference any number of fields from the parent result. It can also reference global\n * scope properties.\n *\n * **Examples:**\n *\n * - The following markup generates an `href` value such as `http://uri.com?id=itemTitle`:\n *\n * ```html\n * <a class='CoveoResultLink' data-href-template='${clickUri}?id=${raw.title}'></a>\n * ```\n *\n * - The following markup generates an `href` value such as `localhost/fooBar`:\n *\n * ```html\n * <a class='CoveoResultLink' data-href-template='${window.location.hostname}/{Foo.Bar}'></a>\n * ```\n *\n * Default value is `undefined`.\n */\n hrefTemplate: ComponentOptions_1.ComponentOptions.buildStringOption(),\n /**\n * Specifies a template literal from which to generate the `ResultLink` display title (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the default `ResultLink` display title behavior.\n *\n * The template literal can reference any number of fields from the parent result. However, if the template literal\n * references a key whose value is undefined in the parent result fields, the `ResultLink` title displays the\n * name of this key instead.\n *\n * This option is ignored if the `ResultLink` innerHTML contains any value.\n *\n * **Examples:**\n *\n * - The following markup generates a `ResultLink` display title such as `Case number: 123456` if both the\n * `raw.objecttype` and `raw.objectnumber` keys are defined in the parent result fields:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${raw.objecttype} number: ${raw.objectnumber}\"></a>\n * ```\n *\n * - The following markup generates `${myField}` as a `ResultLink` display title if the `myField` key is undefined\n * in the parent result fields:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${myField}\"></a>\n * ```\n *\n * - The following markup generates `Foobar` as a `ResultLink` display title, because the `ResultLink` innterHTML is\n * not empty:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${will} ${be} ${ignored}\">Foobar</a>\n * ```\n *\n * Default value is `undefined`.\n *\n * @availablesince [January 2017 Release (v1.1865.9)](https://docs.coveo.com/en/396/#january-2017-release-v118659)\n */\n titleTemplate: ComponentOptions_1.ComponentOptions.buildStringOption(),\n /**\n * Specifies an event handler function to execute when the user clicks the `ResultLink` component.\n *\n * The handler function takes a JavaScript [`Event`](https://developer.mozilla.org/en/docs/Web/API/Event) object and\n * an [`IQueryResult`]{@link IQueryResult} as its parameters.\n *\n * Overriding the default behavior of the `onClick` event can allow you to execute specific code instead.\n *\n * **Note:**\n * > You cannot set this option directly in the component markup as an HTML attribute. You must either set it in the\n * > [`init`]{@link init} call of your search interface (see\n * > [Passing Component Options in the init Call](https://docs.coveo.com/en/346/#passing-component-options-in-the-init-call)),\n * > or before the `init` call, using the `options` top-level function (see\n * > [Passing Component Options Before the init Call](https://docs.coveo.com/en/346/#passing-component-options-before-the-init-call)).\n *\n * **Example:**\n * ```javascript\n * // You can set the option in the 'init' call:\n * Coveo.init(document.querySelector(\"#search\"), {\n * ResultLink : {\n * onClick : function(e, result) {\n * e.preventDefault();\n * // Custom code to execute with the item URI and title.\n * openUriInASpecialTab(result.clickUri, result.title);\n * }\n * }\n * });\n *\n * // Or before the 'init' call, using the 'options' top-level function:\n * // Coveo.options(document.querySelector('#search'), {\n * // ResultLink : {\n * // onClick : function(e, result) {\n * // e.preventDefault();\n * // // Custom code to execute with the item URI and title.\n * // openUriInASpecialTab(result.clickUri, result.title);\n * // }\n * // }\n * // });\n * ```\n */\n onClick: ComponentOptions_1.ComponentOptions.buildCustomOption(function () {\n return null;\n }),\n /**\n * Specify this option to log additional analytics when this result link is pressed.\n *\n * **Example:**\n * ```javascript\n * const resultLink = new Coveo.ResultLink(\n * linkElement,\n * {\n * logAnalytics: (href) => Coveo.logCustomEvent(\n * Coveo.analyticsActionCauseList.openSmartSnippetSource,\n * {\n * searchQueryUid: searchInterface.queryController.lastSearchUid,\n * documentTitle: result.title,\n * author: Utils.getFieldValue(result, 'author'),\n * documentURL: href\n * },\n * element\n * )\n * },\n * searchInterface.getBindings(),\n * result\n * )\n * ```\n */\n logAnalytics: ComponentOptions_1.ComponentOptions.buildCustomOption(function () { return null; })\n };\n return ResultLink;\n}(Component_1.Component));\nexports.ResultLink = ResultLink;\nInitialization_1.Initialization.registerAutoCreateComponent(ResultLink);\n\n\n/***/ }),\n\n/***/ 709:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 710:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__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};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar underscore_1 = __webpack_require__(0);\nvar AccessibleButton_1 = __webpack_require__(15);\nvar SVGIcons_1 = __webpack_require__(12);\nvar AttachShadowPolyfill_1 = __webpack_require__(522);\nvar Dom_1 = __webpack_require__(1);\nvar Strings_1 = __webpack_require__(6);\nvar AnalyticsActionListMeta_1 = __webpack_require__(10);\nvar ResultLink_1 = __webpack_require__(70);\nvar Utils_1 = __webpack_require__(4);\nvar SmartSnippetCommon_1 = __webpack_require__(229);\nvar QUESTION_CLASSNAME = \"coveo-smart-snippet-suggestions-question\";\nvar QUESTION_TITLE_CLASSNAME = QUESTION_CLASSNAME + \"-title\";\nvar QUESTION_TITLE_LABEL_CLASSNAME = QUESTION_TITLE_CLASSNAME + \"-label\";\nvar QUESTION_TITLE_CHECKBOX_CLASSNAME = QUESTION_TITLE_CLASSNAME + \"-checkbox\";\nvar QUESTION_SNIPPET_CLASSNAME = QUESTION_CLASSNAME + \"-snippet\";\nvar QUESTION_SNIPPET_CONTAINER_CLASSNAME = QUESTION_SNIPPET_CLASSNAME + \"-container\";\nvar QUESTION_SNIPPET_HIDDEN_CLASSNAME = QUESTION_SNIPPET_CLASSNAME + \"-hidden\";\nvar SHADOW_CLASSNAME = QUESTION_SNIPPET_CLASSNAME + \"-content\";\nvar RAW_CONTENT_CLASSNAME = SHADOW_CLASSNAME + \"-raw\";\nvar SOURCE_CLASSNAME = QUESTION_CLASSNAME + \"-source\";\nvar SOURCE_TITLE_CLASSNAME = SOURCE_CLASSNAME + \"-title\";\nvar SOURCE_URL_CLASSNAME = SOURCE_CLASSNAME + \"-url\";\nexports.SmartSnippetCollapsibleSuggestionClassNames = {\n QUESTION_CLASSNAME: QUESTION_CLASSNAME,\n QUESTION_TITLE_CLASSNAME: QUESTION_TITLE_CLASSNAME,\n QUESTION_TITLE_LABEL_CLASSNAME: QUESTION_TITLE_LABEL_CLASSNAME,\n QUESTION_TITLE_CHECKBOX_CLASSNAME: QUESTION_TITLE_CHECKBOX_CLASSNAME,\n QUESTION_SNIPPET_CLASSNAME: QUESTION_SNIPPET_CLASSNAME,\n QUESTION_SNIPPET_CONTAINER_CLASSNAME: QUESTION_SNIPPET_CONTAINER_CLASSNAME,\n QUESTION_SNIPPET_HIDDEN_CLASSNAME: QUESTION_SNIPPET_HIDDEN_CLASSNAME,\n SHADOW_CLASSNAME: SHADOW_CLASSNAME,\n RAW_CONTENT_CLASSNAME: RAW_CONTENT_CLASSNAME,\n SOURCE_CLASSNAME: SOURCE_CLASSNAME,\n SOURCE_TITLE_CLASSNAME: SOURCE_TITLE_CLASSNAME,\n SOURCE_URL_CLASSNAME: SOURCE_URL_CLASSNAME\n};\nvar SmartSnippetCollapsibleSuggestion = /** @class */ (function () {\n function SmartSnippetCollapsibleSuggestion(options) {\n this.options = options;\n this.labelId = underscore_1.uniqueId(QUESTION_TITLE_LABEL_CLASSNAME);\n this.snippetId = underscore_1.uniqueId(QUESTION_SNIPPET_CLASSNAME);\n this.checkboxId = underscore_1.uniqueId(QUESTION_TITLE_CHECKBOX_CLASSNAME);\n this.expanded = false;\n }\n Object.defineProperty(SmartSnippetCollapsibleSuggestion.prototype, \"loading\", {\n get: function () {\n return this.contentLoaded;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SmartSnippetCollapsibleSuggestion.prototype, \"analyticsSuggestionMeta\", {\n get: function () {\n var _a = this.options.questionAnswer, documentId = _a.documentId, question = _a.question, answerSnippet = _a.answerSnippet;\n return {\n searchQueryUid: this.options.searchUid,\n documentId: documentId,\n question: question,\n answerSnippet: answerSnippet\n };\n },\n enumerable: true,\n configurable: true\n });\n SmartSnippetCollapsibleSuggestion.prototype.build = function () {\n var collapsibleContainer = this.buildCollapsibleContainer(this.options.questionAnswer, this.buildStyle(this.options.innerCSS));\n var title = this.buildTitle(this.options.questionAnswer.question);\n this.updateExpanded();\n return Dom_1.$$('li', {\n className: QUESTION_CLASSNAME,\n ariaLabelledby: this.labelId\n }, title, collapsibleContainer).el;\n };\n SmartSnippetCollapsibleSuggestion.prototype.buildStyle = function (innerCSS) {\n var styleTag = document.createElement('style');\n styleTag.innerHTML = innerCSS;\n return styleTag;\n };\n SmartSnippetCollapsibleSuggestion.prototype.buildTitle = function (question) {\n var _this = this;\n var checkbox = this.buildCheckbox(question);\n var label = Dom_1.$$('span', { className: QUESTION_TITLE_LABEL_CLASSNAME, id: this.labelId });\n label.text(question);\n var title = Dom_1.$$('span', { className: QUESTION_TITLE_CLASSNAME }, label, checkbox);\n title.on('click', function () { return _this.toggle(); });\n return title;\n };\n SmartSnippetCollapsibleSuggestion.prototype.buildCheckbox = function (question) {\n var _this = this;\n this.checkbox = Dom_1.$$('div', {\n role: 'button',\n tabindex: 0,\n ariaControls: this.snippetId,\n className: QUESTION_TITLE_CHECKBOX_CLASSNAME,\n id: this.checkboxId\n });\n new AccessibleButton_1.AccessibleButton()\n .withElement(this.checkbox)\n .withLabel(Strings_1.l('ExpandQuestionAnswer', question))\n .withEnterKeyboardAction(function () { return _this.toggle(); })\n .build();\n return this.checkbox;\n };\n SmartSnippetCollapsibleSuggestion.prototype.buildCollapsibleContainer = function (questionAnswer, style) {\n var _this = this;\n var shadowContainer = Dom_1.$$('div', { className: SHADOW_CLASSNAME });\n this.snippetAndSourceContainer = Dom_1.$$('div', { className: QUESTION_SNIPPET_CONTAINER_CLASSNAME }, shadowContainer);\n this.collapsibleContainer = Dom_1.$$('div', { className: QUESTION_SNIPPET_CLASSNAME, id: this.snippetId }, this.snippetAndSourceContainer);\n this.contentLoaded = AttachShadowPolyfill_1.attachShadow(shadowContainer.el, {\n mode: 'open',\n title: Strings_1.l('AnswerSpecificSnippet', questionAnswer.question),\n useIFrame: this.options.useIFrame\n }).then(function (shadowRoot) {\n shadowRoot.appendChild(_this.buildAnswerSnippetContent(questionAnswer, style).el);\n });\n if (this.options.source) {\n this.snippetAndSourceContainer.append(this.buildSourceUrl().el);\n this.snippetAndSourceContainer.append(this.buildSourceTitle().el);\n }\n return this.collapsibleContainer;\n };\n SmartSnippetCollapsibleSuggestion.prototype.buildAnswerSnippetContent = function (questionAnswer, style) {\n var _this = this;\n var snippet = Dom_1.$$('div', { className: RAW_CONTENT_CLASSNAME }, SmartSnippetCommon_1.getSanitizedAnswerSnippet(questionAnswer));\n SmartSnippetCommon_1.transformSnippetLinks(snippet.el, this.options.alwaysOpenInNewWindow, function (link) { return _this.sendOpenSnippetLinkAnalytics(link); });\n var container = Dom_1.$$('div', {}, snippet);\n container.append(style);\n return container;\n };\n SmartSnippetCollapsibleSuggestion.prototype.buildSourceTitle = function () {\n var link = this.buildLink(SOURCE_TITLE_CLASSNAME);\n link.text(Utils_1.Utils.getFieldValue(this.options.source, this.options.titleField));\n return link;\n };\n SmartSnippetCollapsibleSuggestion.prototype.buildSourceUrl = function () {\n var link = this.buildLink(SOURCE_URL_CLASSNAME);\n link.text(link.el.href);\n return link;\n };\n SmartSnippetCollapsibleSuggestion.prototype.buildLink = function (className) {\n var _this = this;\n var element = Dom_1.$$('a', { className: \"CoveoResultLink \" + className });\n new ResultLink_1.ResultLink(element.el, {\n hrefTemplate: this.options.hrefTemplate,\n logAnalytics: function (href) { return _this.sendOpenSourceAnalytics(element.el, href); },\n alwaysOpenInNewWindow: this.options.alwaysOpenInNewWindow\n }, __assign({}, this.options.bindings, { resultElement: this.collapsibleContainer.el }), this.options.source);\n return element;\n };\n SmartSnippetCollapsibleSuggestion.prototype.toggle = function () {\n this.expanded = !this.expanded;\n this.updateExpanded();\n if (this.expanded) {\n this.sendExpandAnalytics();\n }\n else {\n this.sendCollapseAnalytics();\n }\n };\n SmartSnippetCollapsibleSuggestion.prototype.updateIFrameExpanded = function () {\n var iframe = this.snippetAndSourceContainer.find('iframe');\n if (!iframe) {\n return;\n }\n this.expanded ? iframe.removeAttribute('tabindex') : iframe.setAttribute('tabindex', '-1');\n };\n SmartSnippetCollapsibleSuggestion.prototype.updateExpanded = function () {\n this.checkbox.setAttribute('aria-expanded', this.expanded.toString());\n this.checkbox.setHtml(this.expanded ? SVGIcons_1.SVGIcons.icons.arrowUp : SVGIcons_1.SVGIcons.icons.arrowDown);\n this.collapsibleContainer.setAttribute('aria-hidden', (!this.expanded).toString());\n this.collapsibleContainer.toggleClass(QUESTION_SNIPPET_HIDDEN_CLASSNAME, !this.expanded);\n this.collapsibleContainer.el.style.height = this.expanded ? this.snippetAndSourceContainer.el.clientHeight + \"px\" : '0px';\n this.updateIFrameExpanded();\n };\n SmartSnippetCollapsibleSuggestion.prototype.sendExpandAnalytics = function () {\n return this.options.bindings.usageAnalytics.logCustomEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.expandSmartSnippetSuggestion, this.analyticsSuggestionMeta, this.checkbox.el);\n };\n SmartSnippetCollapsibleSuggestion.prototype.sendCollapseAnalytics = function () {\n return this.options.bindings.usageAnalytics.logCustomEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.collapseSmartSnippetSuggestion, this.analyticsSuggestionMeta, this.checkbox.el);\n };\n SmartSnippetCollapsibleSuggestion.prototype.sendOpenSourceAnalytics = function (element, href) {\n return this.options.bindings.usageAnalytics.logClickEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.openSmartSnippetSuggestionSource, __assign({}, this.analyticsSuggestionMeta, { documentTitle: this.options.source.title, author: Utils_1.Utils.getFieldValue(this.options.source, 'author'), documentURL: href }), this.options.source, element);\n };\n SmartSnippetCollapsibleSuggestion.prototype.sendOpenSnippetLinkAnalytics = function (link) {\n return this.options.bindings.usageAnalytics.logClickEvent(AnalyticsActionListMeta_1.analyticsActionCauseList.openSmartSnippetSuggestionInlineLink, __assign({}, this.analyticsSuggestionMeta, { linkText: link.innerText, linkURL: link.href }), this.options.source, link);\n };\n return SmartSnippetCollapsibleSuggestion;\n}());\nexports.SmartSnippetCollapsibleSuggestion = SmartSnippetCollapsibleSuggestion;\n\n\n/***/ })\n\n});\n\n\n// WEBPACK FOOTER //\n// SmartSnippetSuggestions.min__7d400a8f34d33214ce02.js","import { sanitize } from 'dompurify';\nimport { IQuestionAnswerResponse, IRelatedQuestionAnswerResponse } from '../../rest/QuestionAnswerResponse';\nimport { Dom } from '../../utils/Dom';\nimport { bindAnalyticsToLink } from '../ResultLink/ResultLinkCommon';\n\nexport const getDefaultSnippetStyle = (contentClassName: string) => `\n body {\n font-family: \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif, sans-serif;\n }\n\n .${contentClassName} > :first-child {\n margin-top: 0;\n }\n\n .${contentClassName} > :last-child {\n margin-bottom: 0;\n }\n`;\n\nexport function getSanitizedAnswerSnippet(questionAnswer: IQuestionAnswerResponse | IRelatedQuestionAnswerResponse) {\n if (!questionAnswer.answerSnippet) {\n return '';\n }\n // dompurify can fail to execute in some environment (salesforce locker service)\n try {\n return sanitize(questionAnswer.answerSnippet, {\n USE_PROFILES: { html: true }\n });\n } catch (e) {\n return questionAnswer.answerSnippet;\n }\n}\n\nexport const transformSnippetLinks = (\n renderedSnippetParent: HTMLElement,\n alwaysOpenInNewWindow: boolean,\n logAnalytics: (link: HTMLAnchorElement) => void\n) => {\n Dom.nodeListToArray(renderedSnippetParent.querySelectorAll('a')).forEach((link: HTMLAnchorElement) => {\n bindAnalyticsToLink(link, () => logAnalytics(link));\n link.target = alwaysOpenInNewWindow ? '_blank' : '_top';\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/SmartSnippet/SmartSnippetCommon.ts","import 'styling/_SmartSnippetSuggestions';\nimport { Component } from '../Base/Component';\nimport { exportGlobally } from '../../GlobalExports';\nimport { IComponentBindings } from '../Base/ComponentBindings';\nimport { QueryEvents, IQuerySuccessEventArgs } from '../../events/QueryEvents';\nimport { IRelatedQuestionAnswerResponse, IQuestionAnswerResponse } from '../../rest/QuestionAnswerResponse';\nimport { $$, Dom } from '../../utils/Dom';\nimport { uniqueId, isEqual, find } from 'underscore';\nimport { SmartSnippetCollapsibleSuggestion, SmartSnippetCollapsibleSuggestionClassNames } from './SmartSnippetCollapsibleSuggestion';\nimport { l } from '../../strings/Strings';\nimport { Initialization } from '../Base/Initialization';\nimport { Utils } from '../../utils/Utils';\nimport { getDefaultSnippetStyle } from './SmartSnippetCommon';\nimport { ComponentOptions } from '../Base/ComponentOptions';\nimport { IFieldOption } from '../Base/IComponentOptions';\n\nconst BASE_CLASSNAME = 'coveo-smart-snippet-suggestions';\nconst HAS_QUESTIONS_CLASSNAME = `${BASE_CLASSNAME}-has-questions`;\nconst QUESTIONS_LIST_CLASSNAME = `${BASE_CLASSNAME}-questions`;\nconst QUESTIONS_LIST_TITLE_CLASSNAME = `${QUESTIONS_LIST_CLASSNAME}-title`;\n\nexport const SmartSnippetSuggestionsClassNames = {\n HAS_QUESTIONS_CLASSNAME,\n QUESTIONS_LIST_CLASSNAME,\n QUESTIONS_LIST_TITLE_CLASSNAME\n};\n\nexport interface ISmartSnippetSuggestionsOptions {\n titleField: IFieldOption;\n hrefTemplate?: string;\n alwaysOpenInNewWindow?: boolean;\n useIFrame?: boolean;\n}\n\n/**\n * The SmartSnippetSuggestions component displays additional queries for which a Coveo Smart Snippets model can provide relevant excerpts.\n */\nexport class SmartSnippetSuggestions extends Component {\n static ID = 'SmartSnippetSuggestions';\n\n static doExport = () => {\n exportGlobally({\n SmartSnippetSuggestions\n });\n };\n\n /**\n * The options for the SmartSnippetSuggestions\n * @componentOptions\n */\n static options: ISmartSnippetSuggestionsOptions = {\n /**\n * The field to display for the title.\n */\n titleField: ComponentOptions.buildFieldOption({ defaultValue: '@title' }),\n\n /**\n * Specifies a template literal from which to generate the title and URI's `href` attribute value (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the [`field`]{@link SmartSnippet.options.uriField} option value.\n *\n * The template literal can reference any number of fields from the parent result. It can also reference global\n * scope properties.\n *\n * **Examples:**\n *\n * - The following markup generates an `href` value such as `http://uri.com?id=itemTitle`:\n *\n * ```html\n * <a class='CoveoSmartSnippet' data-href-template='${clickUri}?id=${raw.title}'></a>\n * ```\n *\n * - The following markup generates an `href` value such as `localhost/fooBar`:\n *\n * ```html\n * <a class='CoveoSmartSnippet' data-href-template='${window.location.hostname}/{Foo.Bar}'></a>\n * ```\n *\n * Default value is `undefined`.\n */\n hrefTemplate: ComponentOptions.buildStringOption(),\n\n /**\n * Specifies whether the component should open its links in a new window instead of opening them in the current\n * context.\n *\n * Default value is `false`.\n */\n alwaysOpenInNewWindow: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * Specify if the SmartSnippetSuggestion snippet should be displayed inside an iframe or not.\n *\n * Use this option in specific cases where your environment has limitations around iframe usage.\n *\n * **Examples:**\n *\n * ```html\n * <div class='CoveoSmartSnippetSuggestions' data-use-i-frame='true'></div>\n * ```\n *\n * Default value is `true`.\n */\n useIFrame: ComponentOptions.buildBooleanOption({ defaultValue: true })\n };\n\n private readonly titleId = uniqueId(QUESTIONS_LIST_TITLE_CLASSNAME);\n private contentLoaded: Promise<SmartSnippetCollapsibleSuggestion[]>;\n private title: Dom;\n private questionAnswers: Dom;\n private renderedQuestionAnswer: IQuestionAnswerResponse;\n private searchUid: string;\n\n constructor(public element: HTMLElement, public options?: ISmartSnippetSuggestionsOptions, bindings?: IComponentBindings) {\n super(element, SmartSnippetSuggestions.ID, bindings);\n this.options = ComponentOptions.initComponentOptions(element, SmartSnippetSuggestions, options);\n this.bind.onRootElement(QueryEvents.deferredQuerySuccess, (data: IQuerySuccessEventArgs) => this.handleQuerySuccess(data));\n }\n\n public get loading() {\n return this.contentLoaded;\n }\n\n /**\n * @warning This method only works for the demo. In practice, the source of the answer will not always be part of the results.\n */\n private getCorrespondingResult(questionAnswer: IRelatedQuestionAnswerResponse) {\n return find(\n this.queryController.getLastResults().results,\n result => result.raw[questionAnswer.documentId.contentIdKey] === questionAnswer.documentId.contentIdValue\n );\n }\n\n private handleQuerySuccess(data: IQuerySuccessEventArgs) {\n const questionAnswer = data.results.questionAnswer;\n const hasQuestions = !!(questionAnswer && questionAnswer.relatedQuestions.length);\n $$(this.element).toggleClass(HAS_QUESTIONS_CLASSNAME, hasQuestions);\n if (hasQuestions) {\n this.searchUid = data.results.searchUid;\n if (this.renderedQuestionAnswer && isEqual(questionAnswer, this.renderedQuestionAnswer)) {\n return;\n }\n this.detachContent();\n this.element.appendChild((this.title = this.buildTitle()).el);\n this.element.appendChild((this.questionAnswers = this.buildQuestionAnswers(questionAnswer.relatedQuestions)).el);\n } else {\n this.detachContent();\n }\n this.renderedQuestionAnswer = questionAnswer;\n }\n\n private detachContent() {\n this.title && this.title.detach();\n this.questionAnswers && this.questionAnswers.detach();\n this.title = this.questionAnswers = null;\n }\n\n private buildTitle() {\n return $$('span', { className: QUESTIONS_LIST_TITLE_CLASSNAME, id: this.titleId }, l('SuggestedQuestions'));\n }\n\n private buildQuestionAnswers(questionAnswers: IRelatedQuestionAnswerResponse[]) {\n const innerCSS = this.getInnerCSS();\n const answers = questionAnswers.map(\n questionAnswer =>\n new SmartSnippetCollapsibleSuggestion({\n questionAnswer,\n bindings: this.getBindings(),\n innerCSS: Utils.isNullOrUndefined(innerCSS)\n ? getDefaultSnippetStyle(SmartSnippetCollapsibleSuggestionClassNames.RAW_CONTENT_CLASSNAME)\n : innerCSS,\n searchUid: this.searchUid,\n titleField: this.options.titleField,\n hrefTemplate: this.options.hrefTemplate,\n alwaysOpenInNewWindow: this.options.alwaysOpenInNewWindow,\n source: this.getCorrespondingResult(questionAnswer),\n useIFrame: this.options.useIFrame\n })\n );\n const container = $$(\n 'ul',\n { className: QUESTIONS_LIST_CLASSNAME, ariaLabelledby: this.titleId },\n ...answers.map(answer => answer.build())\n );\n this.contentLoaded = Promise.all(answers.map(answer => answer.loading.then(() => answer)));\n return container;\n }\n\n private getInnerCSS() {\n const styles = $$(this.element)\n .children()\n .filter(element => element instanceof HTMLScriptElement && element.type.toLowerCase() === 'text/css')\n .map(element => element.innerHTML);\n return styles.length ? styles.join('\\n') : null;\n }\n}\n\nInitialization.registerAutoCreateComponent(SmartSnippetSuggestions);\nSmartSnippetSuggestions.doExport();\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/SmartSnippet/SmartSnippetSuggestions.ts","import { once } from 'underscore';\nimport { $$ } from '../../utils/Dom';\n\nexport function bindAnalyticsToLink(element: HTMLElement, logAnalytics: () => void) {\n const executeOnlyOnce = once(() => logAnalytics());\n\n $$(element).on(['contextmenu', 'click', 'mousedown', 'mouseup'], executeOnlyOnce);\n let longPressTimer: number;\n $$(element).on('touchstart', () => {\n longPressTimer = window.setTimeout(executeOnlyOnce, 1000);\n });\n $$(element).on('touchend', () => {\n if (longPressTimer) {\n clearTimeout(longPressTimer);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/ResultLink/ResultLinkCommon.ts","import { $$ } from '../utils/Dom';\nimport 'styling/_AttachShadowPolyfill';\n\nexport interface IShadowOptions {\n title: string;\n onSizeChanged?: Function;\n useIFrame?: Boolean;\n}\n\nexport async function attachShadow(element: HTMLElement, options: IShadowOptions & ShadowRootInit): Promise<HTMLElement> {\n const elementOptions = { className: 'coveo-shadow-iframe', scrolling: 'no', title: options.title };\n let autoUpdateContainer: HTMLIFrameElement | HTMLElement;\n let contentBody: HTMLElement;\n if (options.useIFrame) {\n autoUpdateContainer = $$('iframe', elementOptions).el;\n const onLoad = new Promise(resolve => autoUpdateContainer.addEventListener('load', () => resolve()));\n element.appendChild(autoUpdateContainer);\n await onLoad;\n contentBody = (autoUpdateContainer as HTMLIFrameElement).contentDocument.body;\n } else {\n autoUpdateContainer = $$('div', elementOptions).el;\n contentBody = autoUpdateContainer;\n element.appendChild(autoUpdateContainer);\n }\n\n contentBody.style.margin = '0';\n const shadowRootContainer = $$('div', { style: 'overflow: auto;' }).el;\n contentBody.appendChild(shadowRootContainer);\n autoUpdateHeight(autoUpdateContainer, shadowRootContainer, options.onSizeChanged);\n if (options.mode === 'open') {\n Object.defineProperty(element, 'shadowRoot', { get: () => shadowRootContainer });\n }\n\n return shadowRootContainer;\n}\n\nfunction autoUpdateHeight(elementToResize: HTMLElement, content: HTMLElement, onUpdate?: Function) {\n let lastWidth = content.clientWidth;\n let lastHeight = content.clientHeight;\n\n const heightObserver = new MutationObserver(() => {\n if (lastWidth === content.clientWidth && lastHeight === content.clientHeight) {\n return;\n }\n lastWidth = content.clientWidth;\n lastHeight = content.clientHeight;\n elementToResize.style.width = `${content.clientWidth}px`;\n elementToResize.style.height = `${content.clientHeight}px`;\n if (onUpdate) {\n onUpdate();\n }\n });\n heightObserver.observe(content, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/misc/AttachShadowPolyfill.ts","/*! @license DOMPurify 2.4.0 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.4.0/LICENSE */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory());\n})(this, (function () { 'use strict';\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\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\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\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) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\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\n var hasOwnProperty = Object.hasOwnProperty,\n setPrototypeOf = Object.setPrototypeOf,\n isFrozen = Object.isFrozen,\n getPrototypeOf = Object.getPrototypeOf,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n var freeze = Object.freeze,\n seal = Object.seal,\n create = Object.create; // eslint-disable-line import/no-mutable-exports\n\n var _ref = typeof Reflect !== 'undefined' && Reflect,\n apply = _ref.apply,\n construct = _ref.construct;\n\n if (!apply) {\n apply = function apply(fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n }\n\n if (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n }\n\n if (!seal) {\n seal = function seal(x) {\n return x;\n };\n }\n\n if (!construct) {\n construct = function construct(Func, args) {\n return _construct(Func, _toConsumableArray(args));\n };\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\n return apply(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\n return construct(func, args);\n };\n }\n /* Add properties to a lookup table */\n\n function addToSet(set, array, transformCaseFunc) {\n transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;\n\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n var l = array.length;\n\n while (l--) {\n var element = array[l];\n\n if (typeof element === 'string') {\n var lcElement = transformCaseFunc(element);\n\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n }\n /* Shallow clone an object */\n\n function clone(object) {\n var newObject = create(null);\n var property;\n\n for (property in object) {\n if (apply(hasOwnProperty, object, [property])) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n }\n /* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\n\n function lookupGetter(object, prop) {\n while (object !== null) {\n var desc = getOwnPropertyDescriptor(object, prop);\n\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n }\n\n var html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']); // SVG\n\n var svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\n var svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.\n // We still need to know them so that we can do namespace\n // checks properly in case one wants to add them to\n // allow-list.\n\n var svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\n var mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover']); // Similarly to SVG, we want to know all MathML elements,\n // even those that we disallow by default.\n\n var mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\n var text = freeze(['#text']);\n\n var html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns', 'slot']);\n var svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\n var mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\n var xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n var MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\n\n var ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n var DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\n\n var ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\n\n var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n );\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 // eslint-disable-line no-control-regex\n );\n var DOCTYPE_NAME = seal(/^html$/i);\n\n var getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n };\n /**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\n\n\n var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {\n if (_typeof(trustedTypes) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n } // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n\n\n var suffix = null;\n var ATTR_NAME = 'data-tt-policy-suffix';\n\n if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n var policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML: function createHTML(html) {\n return html;\n },\n createScriptURL: function createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n };\n\n function createDOMPurify() {\n var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n\n var DOMPurify = function DOMPurify(root) {\n return createDOMPurify(root);\n };\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n\n\n DOMPurify.version = '2.4.0';\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n\n var originalDocument = window.document;\n var document = window.document;\n var DocumentFragment = window.DocumentFragment,\n HTMLTemplateElement = window.HTMLTemplateElement,\n Node = window.Node,\n Element = window.Element,\n NodeFilter = window.NodeFilter,\n _window$NamedNodeMap = window.NamedNodeMap,\n NamedNodeMap = _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap,\n HTMLFormElement = window.HTMLFormElement,\n DOMParser = window.DOMParser,\n 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'); // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n\n if (typeof HTMLTemplateElement === 'function') {\n var template = document.createElement('template');\n\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);\n\n var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n var _document = document,\n implementation = _document.implementation,\n createNodeIterator = _document.createNodeIterator,\n createDocumentFragment = _document.createDocumentFragment,\n getElementsByTagName = _document.getElementsByTagName;\n var importNode = originalDocument.importNode;\n var documentMode = {};\n\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n var hooks = {};\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n\n DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9;\n var MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n ERB_EXPR$1 = ERB_EXPR,\n DATA_ATTR$1 = DATA_ATTR,\n ARIA_ATTR$1 = ARIA_ATTR,\n IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE$1 = ATTR_WHITESPACE;\n var IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n\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 /* Allowed attribute names */\n\n var ALLOWED_ATTR = null;\n var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray(html), _toConsumableArray(svg), _toConsumableArray(mathMl), _toConsumableArray(xml)));\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n\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 /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n\n var FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n\n var FORBID_ATTR = null;\n /* Decide if ARIA attributes are okay */\n\n var ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n\n var ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n\n var ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n\n var SAFE_FOR_TEMPLATES = false;\n /* Decide if document with <html>... should be returned */\n\n var WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n\n var SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n\n var FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n\n var RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n\n var RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n\n var RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n\n var SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n\n var SANITIZE_NAMED_PROPS = false;\n var SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n\n var KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n\n var IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n\n var USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n\n var FORBID_CONTENTS = null;\n var DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n\n var DATA_URI_TAGS = null;\n var DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n\n var URI_SAFE_ATTRIBUTES = null;\n var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\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 /* Document namespace */\n\n var NAMESPACE = HTML_NAMESPACE;\n var IS_EMPTY_INPUT = false;\n /* Parsing of strict XHTML documents */\n\n var PARSER_MEDIA_TYPE;\n var SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n var DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n var transformCaseFunc;\n /* Keep a reference to config to pass to hooks */\n\n var CONFIG = null;\n /* Ideally, do not touch anything below this line */\n\n /* ______________________________________________ */\n\n var formElement = document.createElement('form');\n\n var isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n\n\n var _parseConfig = function _parseConfig(cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n\n\n if (!cfg || _typeof(cfg) !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n\n\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? function (x) {\n return x;\n } : stringToLowerCase;\n /* Set configuration parameters */\n\n ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$1;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\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\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\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n\n\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, _toConsumableArray(text));\n ALLOWED_ATTR = [];\n\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\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\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\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 /* Merge configuration parameters */\n\n\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n\n\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n\n\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n\n\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n } // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n\n\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n var HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n\n var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\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 /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n\n var _checkValidNamespace = function _checkValidNamespace(element) {\n var parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: HTML_NAMESPACE,\n tagName: 'template'\n };\n }\n\n var tagName = stringToLowerCase(element.tagName);\n var parentTagName = stringToLowerCase(parent.tagName);\n\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n } // The only way to switch from MathML to SVG is via\n // svg if parent is either <annotation-xml> or MathML\n // text integration points.\n\n\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n } // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n\n\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n } // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n\n\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n } // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n\n\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n } // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n\n\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n } // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG or MathML). Return false just in case.\n\n\n return false;\n };\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n\n\n var _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\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\n node.removeAttribute(name); // We void attribute values for unremovable \"is\"\" attributes\n\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n\n\n var _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n var doc;\n var leadingWhitespace;\n\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n var matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml') {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n }\n\n var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n\n\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload;\n } catch (_) {// Syntax error if dirtyPayload is invalid xml\n }\n }\n\n var body = doc.body || doc.documentElement;\n\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n\n\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n\n\n var _createIterator = function _createIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);\n };\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n\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 /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n\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 /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n\n\n var _executeHook = function _executeHook(entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], function (hook) {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n\n\n var _sanitizeElements = function _sanitizeElements(currentNode) {\n var content;\n /* Execute a hook if present */\n\n _executeHook('beforeSanitizeElements', currentNode, null);\n /* Check if element is clobbered or can clobber */\n\n\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Check if tagname contains Unicode */\n\n\n if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Now let's check the element's type and name */\n\n\n var tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n\n _executeHook('uponSanitizeElement', currentNode, {\n tagName: tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n\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\n return true;\n }\n /* Mitigate a problem with templates inside select */\n\n\n if (tagName === 'select' && regExpTest(/<template/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Remove element if anything forbids its presence */\n\n\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;\n }\n /* Keep content except for bad-listed elements */\n\n\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n var parentNode = getParentNode(currentNode) || currentNode.parentNode;\n var childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n\n if (childNodes && parentNode) {\n var childCount = childNodes.length;\n\n for (var i = childCount - 1; i >= 0; --i) {\n parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));\n }\n }\n }\n\n _forceRemove(currentNode);\n\n return true;\n }\n /* Check whether element has a valid namespace */\n\n\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n\n return true;\n }\n\n if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\\/no(script|embed)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n\n return true;\n }\n /* Sanitize element content to be template-safe */\n\n\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\n /* Get the element's text content */\n content = currentNode.textContent;\n content = stringReplace(content, MUSTACHE_EXPR$1, ' ');\n content = stringReplace(content, ERB_EXPR$1, ' ');\n\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeElements', currentNode, null);\n\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param {string} lcTag Lowercase tag name of containing element.\n * @param {string} lcName Lowercase attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n\n\n var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n\n\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _basicCustomElementTest(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if (!value) ; else {\n return false;\n }\n\n return true;\n };\n /**\n * _basicCustomElementCheck\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n * @param {string} tagName name of the tag of the node to sanitize\n */\n\n\n var _basicCustomElementTest = function _basicCustomElementTest(tagName) {\n return tagName.indexOf('-') > 0;\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param {Node} currentNode to sanitize\n */\n\n\n var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n var attr;\n var value;\n var lcName;\n var l;\n /* Execute a hook if present */\n\n _executeHook('beforeSanitizeAttributes', currentNode, null);\n\n var attributes = currentNode.attributes;\n /* Check if we have attributes; if not we might have a text node */\n\n if (!attributes) {\n return;\n }\n\n var hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR\n };\n l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n\n while (l--) {\n attr = attributes[l];\n var _attr = attr,\n name = _attr.name,\n namespaceURI = _attr.namespaceURI;\n value = name === 'value' ? attr.value : stringTrim(attr.value);\n lcName = transformCaseFunc(name);\n /* Execute a hook if present */\n\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n\n _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n\n value = hookEvent.attrValue;\n /* Did the hooks approve of the attribute? */\n\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Remove attribute */\n\n\n _removeAttribute(name, currentNode);\n /* Did the hooks approve of the attribute? */\n\n\n if (!hookEvent.keepAttr) {\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n\n\n if (regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n\n\n if (SAFE_FOR_TEMPLATES) {\n value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n value = stringReplace(value, ERB_EXPR$1, ' ');\n }\n /* Is `value` valid for this attribute? */\n\n\n var lcTag = transformCaseFunc(currentNode.nodeName);\n\n if (!_isValidAttribute(lcTag, lcName, value)) {\n continue;\n }\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n\n\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value\n\n\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Handle attributes that require Trusted Types */\n\n\n if (trustedTypesPolicy && _typeof(trustedTypes) === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n value = trustedTypesPolicy.createHTML(value);\n break;\n\n case 'TrustedScriptURL':\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n\n\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n\n arrayPop(DOMPurify.removed);\n } catch (_) {}\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeAttributes', currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param {DocumentFragment} fragment to iterate over recursively\n */\n\n\n var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n var shadowNode;\n\n var shadowIterator = _createIterator(fragment);\n /* Execute a hook if present */\n\n\n _executeHook('beforeSanitizeShadowDOM', fragment, null);\n\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHook('uponSanitizeShadowNode', shadowNode, null);\n /* Sanitize tags and elements */\n\n\n if (_sanitizeElements(shadowNode)) {\n continue;\n }\n /* Deep shadow DOM detected */\n\n\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n /* Check attributes, sanitize if necessary */\n\n\n _sanitizeAttributes(shadowNode);\n }\n /* Execute a hook if present */\n\n\n _executeHook('afterSanitizeShadowDOM', fragment, null);\n };\n /**\n * Sanitize\n * Public method providing core sanitation functionality\n *\n * @param {String|Node} dirty string or DOM node\n * @param {Object} configuration object\n */\n // eslint-disable-next-line complexity\n\n\n DOMPurify.sanitize = function (dirty) {\n var cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var body;\n var importedNode;\n var currentNode;\n var oldNode;\n var returnNode;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n\n IS_EMPTY_INPUT = !dirty;\n\n if (IS_EMPTY_INPUT) {\n dirty = '<!-->';\n }\n /* Stringify, in case dirty is an object */\n\n\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n // eslint-disable-next-line no-negated-condition\n if (typeof dirty.toString !== 'function') {\n throw typeErrorCreate('toString is not a function');\n } else {\n dirty = dirty.toString();\n\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n }\n }\n /* Check we can run. Otherwise fall back or ignore */\n\n\n if (!DOMPurify.isSupported) {\n if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {\n if (typeof dirty === 'string') {\n return window.toStaticHTML(dirty);\n }\n\n if (_isNode(dirty)) {\n return window.toStaticHTML(dirty.outerHTML);\n }\n }\n\n return dirty;\n }\n /* Assign config vars */\n\n\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n\n\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n var tagName = transformCaseFunc(dirty.nodeName);\n\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n\n if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n\n\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n\n\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n\n\n var nodeIterator = _createIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n\n\n while (currentNode = nodeIterator.nextNode()) {\n /* Fix IE's strange behavior with manipulated textNodes #89 */\n if (currentNode.nodeType === 3 && currentNode === oldNode) {\n continue;\n }\n /* Sanitize tags and elements */\n\n\n if (_sanitizeElements(currentNode)) {\n continue;\n }\n /* Shadow DOM detected, sanitize it */\n\n\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n /* Check attributes, sanitize if necessary */\n\n\n _sanitizeAttributes(currentNode);\n\n oldNode = currentNode;\n }\n\n oldNode = null;\n /* If we sanitized `dirty` in-place, return it. */\n\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n\n\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n\n if (ALLOWED_ATTR.shadowroot) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n\n return returnNode;\n }\n\n var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n\n\n if (SAFE_FOR_TEMPLATES) {\n serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$1, ' ');\n serializedHTML = stringReplace(serializedHTML, ERB_EXPR$1, ' ');\n }\n\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n /**\n * Public method to set the configuration once\n * setConfig\n *\n * @param {Object} cfg configuration object\n */\n\n\n DOMPurify.setConfig = function (cfg) {\n _parseConfig(cfg);\n\n SET_CONFIG = true;\n };\n /**\n * Public method to remove the configuration\n * clearConfig\n *\n */\n\n\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n /**\n * Public method to check if an attribute value is valid.\n * Uses last set config, if any. Otherwise, uses config defaults.\n * isValidAttribute\n *\n * @param {string} tag Tag name of containing element.\n * @param {string} attr Attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n */\n\n\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n\n var lcTag = transformCaseFunc(tag);\n var lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n /**\n * AddHook\n * Public method to add DOMPurify hooks\n *\n * @param {String} entryPoint entry point for the hook to add\n * @param {Function} hookFunction function to execute\n */\n\n\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n\n hooks[entryPoint] = hooks[entryPoint] || [];\n arrayPush(hooks[entryPoint], hookFunction);\n };\n /**\n * RemoveHook\n * Public method to remove a DOMPurify hook at a given entryPoint\n * (pops it from the stack of hooks if more are present)\n *\n * @param {String} entryPoint entry point for the hook to remove\n * @return {Function} removed(popped) hook\n */\n\n\n DOMPurify.removeHook = function (entryPoint) {\n if (hooks[entryPoint]) {\n return arrayPop(hooks[entryPoint]);\n }\n };\n /**\n * RemoveHooks\n * Public method to remove all DOMPurify hooks at a given entryPoint\n *\n * @param {String} entryPoint entry point for the hooks to remove\n */\n\n\n DOMPurify.removeHooks = function (entryPoint) {\n if (hooks[entryPoint]) {\n hooks[entryPoint] = [];\n }\n };\n /**\n * RemoveAllHooks\n * Public method to remove all DOMPurify hooks\n *\n */\n\n\n DOMPurify.removeAllHooks = function () {\n hooks = {};\n };\n\n return DOMPurify;\n }\n\n var purify = createDOMPurify();\n\n return purify;\n\n}));\n//# sourceMappingURL=purify.js.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dompurify/dist/purify.js\n// module id = 588\n// module chunks = 18 21 88","import { Component } from '../Base/Component';\nimport { ComponentOptions } from '../Base/ComponentOptions';\nimport { ComponentOptionsModel } from '../../models/ComponentOptionsModel';\nimport { IResultsComponentBindings } from '../Base/ResultsComponentBindings';\nimport { analyticsActionCauseList } from '../Analytics/AnalyticsActionListMeta';\nimport { IResultLinkOptions } from './ResultLinkOptions';\nimport { ResultListEvents } from '../../events/ResultListEvents';\nimport { HighlightUtils } from '../../utils/HighlightUtils';\nimport { IQueryResult } from '../../rest/QueryResult';\nimport { DeviceUtils } from '../../utils/DeviceUtils';\nimport { OS_NAME, OSUtils } from '../../utils/OSUtils';\nimport { Initialization } from '../Base/Initialization';\nimport { QueryUtils } from '../../utils/QueryUtils';\nimport { Assert } from '../../misc/Assert';\nimport { Utils } from '../../utils/Utils';\nimport { Defer } from '../../misc/Defer';\nimport { $$ } from '../../utils/Dom';\nimport { StreamHighlightUtils } from '../../utils/StreamHighlightUtils';\nimport { StringUtils } from '../../utils/StringUtils';\nimport { debounce, extend, escape } from 'underscore';\nimport { exportGlobally } from '../../GlobalExports';\n\nimport 'styling/_ResultLink';\nimport { AccessibleButton } from '../../utils/AccessibleButton';\nimport { bindAnalyticsToLink } from './ResultLinkCommon';\n\n/**\n * The `ResultLink` component automatically transform a search result title into a clickable link pointing to the\n * original item.\n *\n * This component is a result template component (see [Result Templates](https://docs.coveo.com/en/413/)).\n */\nexport class ResultLink extends Component {\n static ID = 'ResultLink';\n\n static doExport = () => {\n exportGlobally({\n ResultLink: ResultLink\n });\n };\n\n /**\n * The options for the ResultLink\n * @componentOptions\n */\n static options: IResultLinkOptions = {\n /**\n * Specifies the field to use to output the component `href` attribute value.\n *\n * **Tip:**\n * > Instead of specifying a value for the `field` option, you can directly add an `href` attribute to the\n * > `ResultLink` HTML element. Then, you can use a custom script to generate the `href` value.\n *\n * **Examples:**\n * - With the following markup, the `ResultLink` outputs its `href` value using the `@uri` field (rather than the\n * default field):\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-field=\"@uri\"></a>\n * ```\n *\n * - In the following result template, the custom `getMyKBUri()` function provides the `href` value:\n *\n * ```html\n * <script id=\"KnowledgeArticle\" type=\"text/underscore\" class=\"result-template\">\n * <div class='CoveoIcon>'></div>\n * <a class=\"CoveoResultLink\" href=\"<%= getMyKBUri(raw) %>\"></a>\n * <div class=\"CoveoExcerpt\"></div>\n * </script>\n * ```\n *\n * See also [`hrefTemplate`]{@link ResultLink.options.hrefTemplate}, which can override this option.\n *\n * By default, the component uses the `@clickUri` field of the item to output the value of its `href` attribute.\n */\n field: ComponentOptions.buildFieldOption(),\n\n /**\n * Specifies whether the component should try to open its link in Microsoft Outlook.\n *\n * Setting this option to `true` is normally useful for `ResultLink` instances related to Microsoft Exchange emails.\n *\n * If this option is `true`, clicking the `ResultLink` calls the\n * [`openLinkInOutlook`]{@link ResultLink.openLinkInOutlook} method instead of the\n * [`openLink`]{@link ResultLink.openLink} method.\n *\n * Default value is `false`.\n */\n openInOutlook: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * Specifies whether the component should open its link in the [`Quickview`]{@link Quickview} component rather than\n * loading through the original URL.\n *\n * Default value is `false`.\n */\n openQuickview: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * Specifies whether the component should open its link in a new window instead of opening it in the current\n * context.\n *\n * If this option is `true`, clicking the `ResultLink` calls the\n * [`openLinkInNewWindow`]{@link ResultLink.openLinkInNewWindow} method instead of the\n * [`openLink`]{@link ResultLink.openLink} method.\n *\n * **Note:**\n * > If a search page contains a [`ResultPreferences`]{@link ResultsPreferences} component whose\n * > [`enableOpenInNewWindow`]{@link ResultsPreferences.options.enableOpenInNewWindow} option is `true`, and the end\n * > user checks the <b>Always open results in new window</b> box, `ResultLink` components in this page will always\n * > open their links in a new window when the end user clicks them, no matter what the value of their\n * > `alwaysOpenInNewWindow` option is.\n *\n * Default value is `false`.\n */\n alwaysOpenInNewWindow: ComponentOptions.buildBooleanOption({ defaultValue: false }),\n\n /**\n * Specifies a template literal from which to generate the `ResultLink` `href` attribute value (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the [`field`]{@link ResultLink.options.field} option value.\n *\n * The template literal can reference any number of fields from the parent result. It can also reference global\n * scope properties.\n *\n * **Examples:**\n *\n * - The following markup generates an `href` value such as `http://uri.com?id=itemTitle`:\n *\n * ```html\n * <a class='CoveoResultLink' data-href-template='${clickUri}?id=${raw.title}'></a>\n * ```\n *\n * - The following markup generates an `href` value such as `localhost/fooBar`:\n *\n * ```html\n * <a class='CoveoResultLink' data-href-template='${window.location.hostname}/{Foo.Bar}'></a>\n * ```\n *\n * Default value is `undefined`.\n */\n hrefTemplate: ComponentOptions.buildStringOption(),\n\n /**\n * Specifies a template literal from which to generate the `ResultLink` display title (see\n * [Template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals)).\n *\n * This option overrides the default `ResultLink` display title behavior.\n *\n * The template literal can reference any number of fields from the parent result. However, if the template literal\n * references a key whose value is undefined in the parent result fields, the `ResultLink` title displays the\n * name of this key instead.\n *\n * This option is ignored if the `ResultLink` innerHTML contains any value.\n *\n * **Examples:**\n *\n * - The following markup generates a `ResultLink` display title such as `Case number: 123456` if both the\n * `raw.objecttype` and `raw.objectnumber` keys are defined in the parent result fields:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${raw.objecttype} number: ${raw.objectnumber}\"></a>\n * ```\n *\n * - The following markup generates `${myField}` as a `ResultLink` display title if the `myField` key is undefined\n * in the parent result fields:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${myField}\"></a>\n * ```\n *\n * - The following markup generates `Foobar` as a `ResultLink` display title, because the `ResultLink` innterHTML is\n * not empty:\n *\n * ```html\n * <a class=\"CoveoResultLink\" data-title-template=\"${will} ${be} ${ignored}\">Foobar</a>\n * ```\n *\n * Default value is `undefined`.\n *\n * @availablesince [January 2017 Release (v1.1865.9)](https://docs.coveo.com/en/396/#january-2017-release-v118659)\n */\n titleTemplate: ComponentOptions.buildStringOption(),\n\n /**\n * Specifies an event handler function to execute when the user clicks the `ResultLink` component.\n *\n * The handler function takes a JavaScript [`Event`](https://developer.mozilla.org/en/docs/Web/API/Event) object and\n * an [`IQueryResult`]{@link IQueryResult} as its parameters.\n *\n * Overriding the default behavior of the `onClick` event can allow you to execute specific code instead.\n *\n * **Note:**\n * > You cannot set this option directly in the component markup as an HTML attribute. You must either set it in the\n * > [`init`]{@link init} call of your search interface (see\n * > [Passing Component Options in the init Call](https://docs.coveo.com/en/346/#passing-component-options-in-the-init-call)),\n * > or before the `init` call, using the `options` top-level function (see\n * > [Passing Component Options Before the init Call](https://docs.coveo.com/en/346/#passing-component-options-before-the-init-call)).\n *\n * **Example:**\n * ```javascript\n * // You can set the option in the 'init' call:\n * Coveo.init(document.querySelector(\"#search\"), {\n * ResultLink : {\n * onClick : function(e, result) {\n * e.preventDefault();\n * // Custom code to execute with the item URI and title.\n * openUriInASpecialTab(result.clickUri, result.title);\n * }\n * }\n * });\n *\n * // Or before the 'init' call, using the 'options' top-level function:\n * // Coveo.options(document.querySelector('#search'), {\n * // ResultLink : {\n * // onClick : function(e, result) {\n * // e.preventDefault();\n * // // Custom code to execute with the item URI and title.\n * // openUriInASpecialTab(result.clickUri, result.title);\n * // }\n * // }\n * // });\n * ```\n */\n onClick: ComponentOptions.buildCustomOption<(e: Event, result: IQueryResult) => any>(() => {\n return null;\n }),\n\n /**\n * Specify this option to log additional analytics when this result link is pressed.\n *\n * **Example:**\n * ```javascript\n * const resultLink = new Coveo.ResultLink(\n * linkElement,\n * {\n * logAnalytics: (href) => Coveo.logCustomEvent(\n * Coveo.analyticsActionCauseList.openSmartSnippetSource,\n * {\n * searchQueryUid: searchInterface.queryController.lastSearchUid,\n * documentTitle: result.title,\n * author: Utils.getFieldValue(result, 'author'),\n * documentURL: href\n * },\n * element\n * )\n * },\n * searchInterface.getBindings(),\n * result\n * )\n * ```\n */\n logAnalytics: ComponentOptions.buildCustomOption<(href: string) => void>(() => null)\n };\n\n private toExecuteOnOpen: (e?: Event) => void;\n\n /**\n * Creates a new `ResultLink` component.\n * @param element The HTMLElement on which to instantiate the component.\n * @param options The options for the `ResultLink` component.\n * @param bindings The bindings that the component requires to function normally. If not set, these will be\n * automatically resolved (with a slower execution time).\n * @param result The result to associate the component with.\n * @param os\n */\n constructor(\n public element: HTMLElement,\n public options: IResultLinkOptions,\n public bindings?: IResultsComponentBindings,\n public result?: IQueryResult,\n public os?: OS_NAME\n ) {\n super(element, ResultLink.ID, bindings);\n\n const globalOptions = this.searchInterface.options.originalOptionsObject[ResultLink.ID] || {};\n const initialOptions = ComponentOptions.initComponentOptions(element, ResultLink, { ...globalOptions, ...options });\n const resultLinkOptions = this.componentOptionsModel.get(ComponentOptionsModel.attributesEnum.resultLink);\n this.options = extend({}, initialOptions, resultLinkOptions);\n\n this.result = result || this.resolveResult();\n\n if (this.options.openQuickview == null) {\n this.options.openQuickview = result.raw['connectortype'] == 'ExchangeCrawler' && DeviceUtils.isMobileDevice();\n }\n if (!this.element.hasAttribute('tabindex')) {\n this.element.setAttribute('tabindex', '0');\n }\n\n Assert.exists(this.componentOptionsModel);\n Assert.exists(this.result);\n\n if (!this.quickviewShouldBeOpened()) {\n // Bind on multiple \"click\" or \"mouse\" events.\n // Create a function that will be executed only once, so as not to log multiple events\n // Once a result link has been opened, and that we log at least one analytics event,\n // it should not matter if the end user open the same link multiple times with different methods.\n // It's still only one \"click\" event as far as UA is concerned.\n // Also need to handle \"longpress\" on mobile (the contextual menu), which we assume to be 1 s long.\n\n bindAnalyticsToLink(element, () => this.logAnalytics());\n }\n this.renderUri(element, result);\n this.bindEventToOpen();\n }\n public renderUri(element: HTMLElement, result?: IQueryResult) {\n if (/^\\s*$/.test(this.element.innerHTML)) {\n const title = this.getDisplayedTitle();\n this.element.innerHTML = title;\n\n const titleAsText = this.getDisplayedTitleAsText();\n if (!this.element.hasAttribute('aria-label')) {\n this.element.setAttribute('aria-label', titleAsText);\n }\n\n if (!this.element.title) {\n this.element.title = titleAsText;\n }\n }\n }\n /**\n * Opens the result in the same window, no matter how the actual component is configured for the end user.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n public openLink(logAnalytics = true) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n window.location.href = this.getResultUri();\n }\n\n /**\n * Opens the result in a new window, no matter how the actual component is configured for the end user.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n public openLinkInNewWindow(logAnalytics = true) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n window.open(this.getResultUri(), '_blank');\n }\n\n /**\n * Tries to open the result in Microsoft Outlook if the result has an `outlookformacuri` or `outlookuri` field.\n *\n * Normally, this implies the result should be a link to an email.\n *\n * If the needed fields are not present, this method does nothing.\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n public openLinkInOutlook(logAnalytics = true) {\n if (this.hasOutlookField()) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n this.openLink();\n }\n }\n\n /**\n * Opens the link in the same manner the end user would.\n *\n * This essentially simulates a click on the result link.\n *\n * @param logAnalytics Specifies whether the method should log an analytics event.\n */\n public openLinkAsConfigured(logAnalytics = true) {\n if (this.toExecuteOnOpen) {\n if (logAnalytics) {\n this.logAnalytics();\n }\n this.toExecuteOnOpen();\n }\n }\n\n protected bindEventToOpen(): boolean {\n return (\n this.bindOnClickIfNotUndefined() ||\n this.bindOpenQuickviewIfNotUndefined() ||\n this.setHrefIfNotAlready() ||\n this.openLinkThatIsNotAnAnchor()\n );\n }\n\n private getDisplayedTitle() {\n if (!this.options.titleTemplate) {\n return this.result.title\n ? HighlightUtils.highlightString(this.result.title, this.result.titleHighlights, null, 'coveo-highlight')\n : this.escapedClickUri;\n } else {\n let newTitle = StringUtils.buildStringTemplateFromResult(this.options.titleTemplate, this.result);\n return newTitle\n ? StreamHighlightUtils.highlightStreamText(newTitle, this.result.termsToHighlight, this.result.phrasesToHighlight)\n : this.escapedClickUri;\n }\n }\n\n private getDisplayedTitleAsText() {\n const container = $$('div');\n container.setHtml(this.getDisplayedTitle());\n return container.text();\n }\n\n private get escapedClickUri() {\n return escape(this.result.clickUri);\n }\n\n private bindOnClickIfNotUndefined() {\n if (this.options.onClick != undefined) {\n this.toExecuteOnOpen = (e: MouseEvent) => {\n this.options.onClick.call(this, e, this.result);\n };\n\n new AccessibleButton()\n .withElement(this.element)\n .withLabel(this.result.title)\n .withSelectAction((e: Event) => this.toExecuteOnOpen(e))\n .build();\n\n return true;\n } else {\n return false;\n }\n }\n\n private bindOpenQuickviewIfNotUndefined() {\n if (this.quickviewShouldBeOpened()) {\n this.toExecuteOnOpen = () => {\n $$(this.bindings.resultElement).trigger(ResultListEvents.openQuickview);\n };\n\n $$(this.element).on('click', (e: Event) => {\n e.preventDefault();\n this.toExecuteOnOpen();\n });\n\n return true;\n } else {\n return false;\n }\n }\n\n private openLinkThatIsNotAnAnchor() {\n if (!this.elementIsAnAnchor()) {\n this.toExecuteOnOpen = () => {\n if (this.options.alwaysOpenInNewWindow) {\n if (this.options.openInOutlook) {\n this.openLinkInOutlook();\n } else {\n this.openLinkInNewWindow();\n }\n } else {\n this.openLink();\n }\n };\n\n $$(this.element).on('click', () => {\n this.toExecuteOnOpen();\n });\n\n return true;\n }\n return false;\n }\n\n private setHrefIfNotAlready() {\n // Do not erase any value put in href by the template, etc. Allows\n // using custom click urls while still keeping analytics recording\n // and other behavior brought by the component.\n if (this.elementIsAnAnchor() && !Utils.isNonEmptyString($$(this.element).getAttribute('href'))) {\n $$(this.element).setAttribute('href', this.getResultUri());\n if (this.options.alwaysOpenInNewWindow && !(this.options.openInOutlook && this.hasOutlookField())) {\n $$(this.element).setAttribute('target', '_blank');\n }\n return true;\n } else {\n return false;\n }\n }\n\n private logDocumentOpen(href: string) {\n this.usageAnalytics.logClickEvent(\n analyticsActionCauseList.documentOpen,\n {\n documentURL: href,\n documentTitle: this.result.title,\n author: Utils.getFieldValue(this.result, 'author')\n },\n this.result,\n this.root\n );\n }\n\n private logAnalytics = debounce(\n () => {\n this.queryController.saveLastQuery();\n let documentURL = $$(this.element).getAttribute('href');\n if (documentURL == undefined || documentURL == '') {\n documentURL = this.escapedClickUri;\n }\n if (this.options.logAnalytics) {\n this.options.logAnalytics(documentURL);\n } else {\n this.logDocumentOpen(documentURL);\n }\n Defer.flush();\n },\n 1500,\n true\n );\n\n private filterProtocol(uri: string) {\n const isAbsolute = /^(https?|ftp|file|mailto|tel|sip):/i.test(uri);\n const isRelative = /^(\\/|\\.\\/|\\.\\.\\/)/.test(uri);\n\n return isAbsolute || isRelative ? uri : '';\n }\n\n private getResultUri(): string {\n if (this.options.hrefTemplate) {\n const uri = StringUtils.buildStringTemplateFromResult(this.options.hrefTemplate, this.result);\n return this.filterProtocol(uri);\n }\n\n if (this.options.field == undefined && this.options.openInOutlook) {\n this.setField();\n }\n\n if (this.options.field != undefined) {\n return this.filterProtocol(Utils.getFieldValue(this.result, <string>this.options.field));\n }\n\n return this.filterProtocol(this.result.clickUri);\n }\n\n private elementIsAnAnchor() {\n return this.element.tagName == 'A';\n }\n\n private setField() {\n let os = Utils.exists(this.os) ? this.os : OSUtils.get();\n if (os == OS_NAME.MACOSX && this.hasOutlookField()) {\n this.options.field = '@outlookformacuri';\n } else if (os == OS_NAME.WINDOWS && this.hasOutlookField()) {\n this.options.field = '@outlookuri';\n }\n }\n\n private hasOutlookField() {\n let os = Utils.exists(this.os) ? this.os : OSUtils.get();\n if (os == OS_NAME.MACOSX && this.result.raw['outlookformacuri'] != undefined) {\n return true;\n } else if (os == OS_NAME.WINDOWS && this.result.raw['outlookuri'] != undefined) {\n return true;\n }\n return false;\n }\n\n private isUriThatMustBeOpenedInQuickview(): boolean {\n return this.escapedClickUri.toLowerCase().indexOf('ldap://') == 0;\n }\n\n private quickviewShouldBeOpened() {\n return (this.options.openQuickview || this.isUriThatMustBeOpenedInQuickview()) && QueryUtils.hasHTMLVersion(this.result);\n }\n}\n\nInitialization.registerAutoCreateComponent(ResultLink);\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/ResultLink/ResultLink.ts","import { IRelatedQuestionAnswerResponse } from '../../rest/QuestionAnswerResponse';\nimport { uniqueId } from 'underscore';\nimport { AccessibleButton } from '../../utils/AccessibleButton';\nimport { SVGIcons } from '../../utils/SVGIcons';\nimport { attachShadow } from '../../misc/AttachShadowPolyfill';\nimport { $$, Dom } from '../../utils/Dom';\nimport { l } from '../../strings/Strings';\nimport { IQueryResult } from '../../rest/QueryResult';\nimport {\n analyticsActionCauseList,\n IAnalyticsSmartSnippetSuggestionMeta,\n IAnalyticsSmartSnippetSuggestionOpenSnippetInlineLinkMeta,\n IAnalyticsSmartSnippetSuggestionOpenSourceMeta\n} from '../Analytics/AnalyticsActionListMeta';\nimport { ResultLink } from '../ResultLink/ResultLink';\nimport { IComponentBindings } from '../Base/ComponentBindings';\nimport { Utils } from '../../utils/Utils';\nimport { IFieldOption } from '../Base/IComponentOptions';\nimport { getSanitizedAnswerSnippet, transformSnippetLinks } from './SmartSnippetCommon';\n\nconst QUESTION_CLASSNAME = `coveo-smart-snippet-suggestions-question`;\nconst QUESTION_TITLE_CLASSNAME = `${QUESTION_CLASSNAME}-title`;\nconst QUESTION_TITLE_LABEL_CLASSNAME = `${QUESTION_TITLE_CLASSNAME}-label`;\nconst QUESTION_TITLE_CHECKBOX_CLASSNAME = `${QUESTION_TITLE_CLASSNAME}-checkbox`;\nconst QUESTION_SNIPPET_CLASSNAME = `${QUESTION_CLASSNAME}-snippet`;\nconst QUESTION_SNIPPET_CONTAINER_CLASSNAME = `${QUESTION_SNIPPET_CLASSNAME}-container`;\nconst QUESTION_SNIPPET_HIDDEN_CLASSNAME = `${QUESTION_SNIPPET_CLASSNAME}-hidden`;\nconst SHADOW_CLASSNAME = `${QUESTION_SNIPPET_CLASSNAME}-content`;\nconst RAW_CONTENT_CLASSNAME = `${SHADOW_CLASSNAME}-raw`;\nconst SOURCE_CLASSNAME = `${QUESTION_CLASSNAME}-source`;\nconst SOURCE_TITLE_CLASSNAME = `${SOURCE_CLASSNAME}-title`;\nconst SOURCE_URL_CLASSNAME = `${SOURCE_CLASSNAME}-url`;\n\nexport const SmartSnippetCollapsibleSuggestionClassNames = {\n QUESTION_CLASSNAME,\n QUESTION_TITLE_CLASSNAME,\n QUESTION_TITLE_LABEL_CLASSNAME,\n QUESTION_TITLE_CHECKBOX_CLASSNAME,\n QUESTION_SNIPPET_CLASSNAME,\n QUESTION_SNIPPET_CONTAINER_CLASSNAME,\n QUESTION_SNIPPET_HIDDEN_CLASSNAME,\n SHADOW_CLASSNAME,\n RAW_CONTENT_CLASSNAME,\n SOURCE_CLASSNAME,\n SOURCE_TITLE_CLASSNAME,\n SOURCE_URL_CLASSNAME\n};\n\nexport class SmartSnippetCollapsibleSuggestion {\n private readonly labelId = uniqueId(QUESTION_TITLE_LABEL_CLASSNAME);\n private readonly snippetId = uniqueId(QUESTION_SNIPPET_CLASSNAME);\n private readonly checkboxId = uniqueId(QUESTION_TITLE_CHECKBOX_CLASSNAME);\n private contentLoaded: Promise<void>;\n private snippetAndSourceContainer: Dom;\n private collapsibleContainer: Dom;\n private checkbox: Dom;\n private expanded = false;\n\n constructor(\n private readonly options: {\n readonly questionAnswer: IRelatedQuestionAnswerResponse;\n readonly bindings: IComponentBindings;\n readonly innerCSS: string;\n readonly searchUid: string;\n readonly titleField: IFieldOption;\n readonly hrefTemplate?: string;\n readonly alwaysOpenInNewWindow?: boolean;\n readonly source?: IQueryResult;\n readonly useIFrame?: boolean;\n }\n ) {}\n\n public get loading() {\n return this.contentLoaded;\n }\n\n private get analyticsSuggestionMeta(): IAnalyticsSmartSnippetSuggestionMeta {\n const { documentId, question, answerSnippet } = this.options.questionAnswer;\n return {\n searchQueryUid: this.options.searchUid,\n documentId,\n question,\n answerSnippet\n };\n }\n\n public build() {\n const collapsibleContainer = this.buildCollapsibleContainer(this.options.questionAnswer, this.buildStyle(this.options.innerCSS));\n const title = this.buildTitle(this.options.questionAnswer.question);\n this.updateExpanded();\n return $$(\n 'li',\n {\n className: QUESTION_CLASSNAME,\n ariaLabelledby: this.labelId\n },\n title,\n collapsibleContainer\n ).el as HTMLLIElement;\n }\n\n private buildStyle(innerCSS: string) {\n const styleTag = document.createElement('style');\n styleTag.innerHTML = innerCSS;\n return styleTag;\n }\n\n private buildTitle(question: string) {\n const checkbox = this.buildCheckbox(question);\n const label = $$('span', { className: QUESTION_TITLE_LABEL_CLASSNAME, id: this.labelId });\n label.text(question);\n const title = $$('span', { className: QUESTION_TITLE_CLASSNAME }, label, checkbox);\n title.on('click', () => this.toggle());\n return title;\n }\n\n private buildCheckbox(question: string) {\n this.checkbox = $$('div', {\n role: 'button',\n tabindex: 0,\n ariaControls: this.snippetId,\n className: QUESTION_TITLE_CHECKBOX_CLASSNAME,\n id: this.checkboxId\n });\n new AccessibleButton()\n .withElement(this.checkbox)\n .withLabel(l('ExpandQuestionAnswer', question))\n .withEnterKeyboardAction(() => this.toggle())\n .build();\n return this.checkbox;\n }\n\n private buildCollapsibleContainer(questionAnswer: IRelatedQuestionAnswerResponse, style: HTMLStyleElement) {\n const shadowContainer = $$('div', { className: SHADOW_CLASSNAME });\n this.snippetAndSourceContainer = $$('div', { className: QUESTION_SNIPPET_CONTAINER_CLASSNAME }, shadowContainer);\n this.collapsibleContainer = $$('div', { className: QUESTION_SNIPPET_CLASSNAME, id: this.snippetId }, this.snippetAndSourceContainer);\n this.contentLoaded = attachShadow(shadowContainer.el, {\n mode: 'open',\n title: l('AnswerSpecificSnippet', questionAnswer.question),\n useIFrame: this.options.useIFrame\n }).then(shadowRoot => {\n shadowRoot.appendChild(this.buildAnswerSnippetContent(questionAnswer, style).el);\n });\n if (this.options.source) {\n this.snippetAndSourceContainer.append(this.buildSourceUrl().el);\n this.snippetAndSourceContainer.append(this.buildSourceTitle().el);\n }\n return this.collapsibleContainer;\n }\n\n private buildAnswerSnippetContent(questionAnswer: IRelatedQuestionAnswerResponse, style: HTMLStyleElement) {\n const snippet = $$('div', { className: RAW_CONTENT_CLASSNAME }, getSanitizedAnswerSnippet(questionAnswer));\n transformSnippetLinks(snippet.el, this.options.alwaysOpenInNewWindow, link => this.sendOpenSnippetLinkAnalytics(link));\n const container = $$('div', {}, snippet);\n container.append(style);\n return container;\n }\n\n private buildSourceTitle() {\n const link = this.buildLink(SOURCE_TITLE_CLASSNAME);\n link.text(Utils.getFieldValue(this.options.source!, <string>this.options.titleField));\n return link;\n }\n\n private buildSourceUrl() {\n const link = this.buildLink(SOURCE_URL_CLASSNAME);\n link.text((link.el as HTMLAnchorElement).href);\n return link;\n }\n\n private buildLink(className: string) {\n const element = $$('a', { className: `CoveoResultLink ${className}` });\n new ResultLink(\n element.el,\n {\n hrefTemplate: this.options.hrefTemplate,\n logAnalytics: href => this.sendOpenSourceAnalytics(element.el, href),\n alwaysOpenInNewWindow: this.options.alwaysOpenInNewWindow\n },\n { ...this.options.bindings, resultElement: this.collapsibleContainer.el },\n this.options.source\n );\n return element;\n }\n\n private toggle() {\n this.expanded = !this.expanded;\n this.updateExpanded();\n if (this.expanded) {\n this.sendExpandAnalytics();\n } else {\n this.sendCollapseAnalytics();\n }\n }\n\n private updateIFrameExpanded() {\n const iframe = this.snippetAndSourceContainer.find('iframe');\n if (!iframe) {\n return;\n }\n this.expanded ? iframe.removeAttribute('tabindex') : iframe.setAttribute('tabindex', '-1');\n }\n\n private updateExpanded() {\n this.checkbox.setAttribute('aria-expanded', this.expanded.toString());\n this.checkbox.setHtml(this.expanded ? SVGIcons.icons.arrowUp : SVGIcons.icons.arrowDown);\n this.collapsibleContainer.setAttribute('aria-hidden', (!this.expanded).toString());\n this.collapsibleContainer.toggleClass(QUESTION_SNIPPET_HIDDEN_CLASSNAME, !this.expanded);\n this.collapsibleContainer.el.style.height = this.expanded ? `${this.snippetAndSourceContainer.el.clientHeight}px` : '0px';\n this.updateIFrameExpanded();\n }\n\n private sendExpandAnalytics() {\n return this.options.bindings.usageAnalytics.logCustomEvent<IAnalyticsSmartSnippetSuggestionMeta>(\n analyticsActionCauseList.expandSmartSnippetSuggestion,\n this.analyticsSuggestionMeta,\n this.checkbox.el\n );\n }\n\n private sendCollapseAnalytics() {\n return this.options.bindings.usageAnalytics.logCustomEvent<IAnalyticsSmartSnippetSuggestionMeta>(\n analyticsActionCauseList.collapseSmartSnippetSuggestion,\n this.analyticsSuggestionMeta,\n this.checkbox.el\n );\n }\n\n private sendOpenSourceAnalytics(element: HTMLElement, href: string) {\n return this.options.bindings.usageAnalytics.logClickEvent<IAnalyticsSmartSnippetSuggestionOpenSourceMeta>(\n analyticsActionCauseList.openSmartSnippetSuggestionSource,\n {\n ...this.analyticsSuggestionMeta,\n documentTitle: this.options.source.title,\n author: Utils.getFieldValue(this.options.source, 'author'),\n documentURL: href\n },\n this.options.source,\n element\n );\n }\n\n private sendOpenSnippetLinkAnalytics(link: HTMLAnchorElement) {\n return this.options.bindings.usageAnalytics.logClickEvent<IAnalyticsSmartSnippetSuggestionOpenSnippetInlineLinkMeta>(\n analyticsActionCauseList.openSmartSnippetSuggestionInlineLink,\n {\n ...this.analyticsSuggestionMeta,\n linkText: link.innerText,\n linkURL: link.href\n },\n this.options.source,\n link\n );\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ui/SmartSnippet/SmartSnippetCollapsibleSuggestion.ts"],"sourceRoot":""}