UNPKG

@ale-rainbow/rainbow-notification

Version:

Alcatel-Lucent Enterprise Rainbow Notification

423 lines (420 loc) 94.7 kB
'use strict'; /** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors */ /** Used as references for various `Number` constants. */ const INFINITY = 1 / 0; /** `Object#toString` result references. */ const symbolTag = '[object Symbol]'; /** Used to match HTML entities and HTML characters. */ const reUnescapedHtml = /[&<>"'`]/g; const reHasUnescapedHtml = RegExp(reUnescapedHtml.source); /** Used to map characters to HTML entities. */ const htmlEscapes = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;', '`': '&#96;' }; /** Detect free variable `global` from Node.js. */ const freeGlobal = typeof global === 'object' && global && global.Object === Object && global; /** Detect free variable `self`. */ const freeSelf = typeof self === 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ const root = freeGlobal || freeSelf || Function('return this')(); /** * The base implementation of `_.propertyOf` without support for deep paths. * * @private * @param {object} object The object to query. * @returns {Function} Returns the new accessor function. */ function basePropertyOf(object) { return function (key) { return object == null ? undefined : object[key]; }; } /** * Used by `_.escape` to convert characters to HTML entities. * * @private * @param {string} chr The matched character to escape. * @returns {string} Returns the escaped character. */ const escapeHtmlChar = basePropertyOf(htmlEscapes); /** Used for built-in method references. */ const objectProto = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) * of values. */ const objectToString = objectProto.toString; /** Built-in value references. */ const Symbol = root.Symbol; /** Used to convert symbols to primitives and strings. */ const symbolProto = Symbol ? Symbol.prototype : undefined; const symbolToString = symbolProto ? symbolProto.toString : undefined; /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString(value) { // Exit early for strings to avoid a performance hit in some environments. if (typeof value === 'string') { return value; } if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : ''; } const result = (String(value)); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return Boolean(value) && typeof value === 'object'; } /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol(value) { return typeof value === 'symbol' || (isObjectLike(value) && objectToString.call(value) == symbolTag); } /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to process. * @returns {string} Returns the string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? '' : baseToString(value); } /** * Converts the characters "&", "<", ">", '"', "'", and "\`" in `string` to * their corresponding HTML entities. * * **Note:** No other characters are escaped. To escape additional * characters use a third-party library like [_he_](https://mths.be/he). * * Though the ">" character is escaped for symmetry, characters like * ">" and "/" don't need escaping in HTML and have no special meaning * unless they're part of a tag or unquoted attribute value. See * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) * (under "semi-related fun fact") for more details. * * Backticks are escaped because in IE < 9, they can break out of * attribute values or HTML comments. See [#59](https://html5sec.org/#59), * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and * [#133](https://html5sec.org/#133) of the * [HTML5 Security Cheatsheet](https://html5sec.org/) for more details. * * When working with HTML you should always * [quote attribute values](http://wonko.com/post/html-escaping) to reduce * XSS vectors. * * @static * @since 0.1.0 * @memberOf _ * @category String * @param {string} [string=''] The string to escape. * @returns {string} Returns the escaped string. * @example * * _.escape('fred, barney, & pebbles'); * // => 'fred, barney, &amp; pebbles' */ const _escape = function escape(string) { string = toString(string); return (string && reHasUnescapedHtml.test(string)) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string; }; /* eslint-disable no-multi-str */ class RainbowNotificationAction { constructor() { this.optionsDefaultLabel = 'default'; this.optionsHeaderLabel = null; this.choiceTitleLabel = null; this.handler = null; this.focus = false; this.choiceVisible = false; this.optionVisible = false; } static create(config) { const action = new RainbowNotificationAction(); Object.keys(config).forEach((key) => { if (config[key]) action[key] = config[key]; }); return action; } toogleChoice(notif) { return () => { const choiceElem = document.getElementById(`callNotif_choice_${notif.id}_${this.name}`); const choiceActionElem = document.getElementById(`callNotif_${notif.id}_${this.name}`); if (choiceElem && choiceActionElem) { this.choiceVisible = !this.choiceVisible; choiceElem.style.opacity = this.choiceVisible ? 1 : 0; choiceElem.style.zIndex = this.choiceVisible ? 1 : -1; choiceActionElem.textContent = this.choiceVisible ? this.choiceCloseLabel : this.label; } }; } toogleOption(notif) { const optionElem = document.getElementById(`callNotif_option_${notif.id}_${this.name}`); if (optionElem) { this.optionVisible = !this.optionVisible; optionElem.style.opacity = this.optionVisible ? 1 : 0; optionElem.style.zIndex = this.optionVisible ? 1 : -1; } } choiceAction(choiceId) { return () => { this.choiceHandler(choiceId); }; } optionAction(optionId) { return () => { this.optionHandler(optionId); }; } } class RainbowNotification { constructor() { this.id = null; this.convId = null; this.type = null; this.message = null; this.mdMessage = null; this.origin = null; this.avatarURL = null; this.avatarURLs = null; this.webinarAvatarURL = null; this.infoTitle = null; this.infoMessage = null; this.callSubject = null; this.called = null; this.calledMessage = null; this.urgency = 'std'; this.urgencyLabel = null; this.delay = 15000; this.delayTimeout = null; this.autoCloseAction = null; this.infoHandler = null; this.actions = null; this.iconPath = 'assets/images'; this.urgencyIcon = null; this.urgencyClass = null; this.isDarkTheme = false; this.close = false; } static create(config) { const rainbowNotification = new RainbowNotification(); Object.keys(config).forEach((key) => { if (config[key] && rainbowNotification[key] !== undefined) { rainbowNotification[key] = config[key]; } }); if (rainbowNotification.urgency) { const icons = { std: null, low: 'bulb', middle: 'problem-alert', high: 'siren' }; const classes = { std: null, low: 'extCallNotif__urg-notify', middle: 'extCallNotif__urg-warning', high: 'extCallNotif__urg-emergency' }; rainbowNotification.urgencyIcon = `${rainbowNotification.iconPath}/sprite.svg#${icons[rainbowNotification.urgency]}`; rainbowNotification.urgencyClass = classes[rainbowNotification.urgency]; } return rainbowNotification; } getHTMLContent() { const close = this.close ? `<div class='extCallNotif__close' id="callNotif_${this.id}_closeButton"><svg><use href="${this.iconPath}/sprite.svg#close"></svg></div>` : ''; const urgency = (this.urgencyLabel && this.urgencyLabel !== 'std') ? `<div class='extCallNotif__urg ${this.urgencyClass}'><svg><use href="${this.urgencyIcon}"></svg>${this.urgencyLabel}</div>` : ''; let avatar = this.avatarURL ? `<img class='extCallNotif__img' src='${this.avatarURL}' draggable='false' alt='' />` : ''; if (this.avatarURLs) { avatar = this.getRoomAvatar(); } if (this.webinarAvatarURL) { avatar = this.getWebinarAvatar(); } const origin = this.origin ? `<div class='extCallNotif__origin'>${_escape(this.origin)}</div>` : ''; const message = `<div class='extCallNotif__message'>${this.message}</div>`; const infoTitle = this.infoTitle ? `<div class='extCallNotif__infoTitle'>${this.infoTitle}</div>` : ''; const infoMessage = this.infoMessage ? `<div class='extCallNotif__infoMessage'>${this.infoMessage}</div>` : ''; const callSubject = this.callSubject ? `<div class='extCallNotif__callSubject'>${_escape(this.callSubject)}</div>` : ''; const calledMessage = this.calledMessage ? `<div class='extCallNotif__calledMessage'>${this.calledMessage}</div>` : ''; const called = this.called ? `<div class='extCallNotif__called'>${this.called}</div>` : ''; const mdMessage = this.mdMessage ? `<div class='extCallNotif__mdMessage'>${this.mdMessage}</div>` : ''; let actionsArea = ''; if (this.actions) { actionsArea = this.actions.reduce((buffer, action) => { if (action.name === 'closeButton') return buffer; if (action.choice) { const choiceTitle = action.choiceTitleLabel ? `<div id='choiceTitle' class='extCallNotif__choice-title'>${action.choiceTitleLabel}</div>` : ''; let choices = action.choice.reduce((buff, choice) => { return buff + `<li id='${choice.id}' class='extCallNotif__choice' tabindex='0' role="menuitem">${choice.label}</li>`; }, ''); choices += `<section id='callNotif_choice_close_${this.id}_${action.name}' class='extCallNotif__choiceClose'>${action.choiceCloseLabel}</section>`; buffer += `<ul id='callNotif_choice_${this.id}_${action.name}' class='extCallNotif__choices' role='menu' aria-labelledby='callNotif_${this.id}_${action.name}'>${choiceTitle}${choices}</ul>`; } let arrow = ''; let options = ''; if (action.options) { const optionsHeader = `<div class='extCallNotif__option--header'>${action.optionsHeaderLabel}</div>`; const optionsItems = action.options.reduce((buff, option, ind) => { return buff + `<div id='${option.id}' class='extCallNotif__option'><svg draggable='false'><use xlink:href='${this.iconPath}/sprite.svg#${option.icon}'></use></svg>${option.label}${ind ? '' : ' (' + action.optionsDefaultLabel + ')'}</div>`; }, ''); options = `<div id='callNotif_option_${this.id}_${action.name}' class='extCallNotif__options'>${optionsHeader}${optionsItems}</div>`; action.label = action.options[0].label; arrow = `<div class='extCallNotif__arrow' id='callNotif_${this.id}_${action.name}_options'><div><svg draggable='false'><use xlink:href ='${this.iconPath}/sprite.svg#arrow_dropup'></use></svg></div></div>`; } const icon = action.icon ? `<svg class='extCallNotif__icon' draggable='false'><use xlink:href='${this.iconPath}/sprite.svg#${action.icon}'></use></svg>` : ''; return buffer + `<button type="button" id='callNotif_${this.id}_${action.name}' class='extCallNotif__button extCallNotif__button--${action.color} extCallNotification-reset--button' aria-haspopup='true' aria-expanded='${this.actions}' aria-controls='callNotif_choice_${this.id}_${action.name}'>${options}<span class='extCallNotif__button--content'>${icon}${action.label}</span>${arrow}</button>`; }, ''); actionsArea = `<div class='extCallNotif__actions'>${actionsArea}</div>`; } return `<div class='extCallNotification'> ${close} ${urgency} <div class='extCallNotificationMain'>\ ${avatar}${infoTitle}${infoMessage}\ <div class='extCallNotificationContent'>${origin}${message}${mdMessage}${calledMessage}${called}${callSubject}${actionsArea} </div>\ </div>\ </div>`; } attachActionHandlers(attach = true) { if (this.actions) { const methodName = attach ? 'addEventListener' : 'removeEventListener'; this.actions.forEach((action) => { const actionButtonElem = document.getElementById(`callNotif_${this.id}_${action.name}`); if (actionButtonElem) { if (action.choice) { actionButtonElem[methodName]('click', action.toogleChoice(this)); const childnodes = Array.from(document.getElementById(`callNotif_choice_${this.id}_${action.name}`).childNodes); childnodes.forEach((choiceElem) => { if (choiceElem.id !== 'choiceTitle') { if (choiceElem.id.includes('callNotif_choice_close')) { choiceElem[methodName]('click', action.toogleChoice(this)); } else { choiceElem[methodName]('click', action.choiceAction(choiceElem.id)); } } }); } else if (action.options) { actionButtonElem[methodName]('click', (event) => { action.optionAction(action.options[0].id)(); event.stopPropagation(); }); const actionButtonOptionsElem = document.getElementById(`callNotif_${this.id}_${action.name}_options`); actionButtonOptionsElem[methodName]('click', (event) => { action.toogleOption(this); event.stopPropagation(); }); const childnodes = Array.from(document.getElementsByClassName(`extCallNotif__option`)); childnodes.forEach((optionElem) => { optionElem[methodName]('click', (event) => { action.optionAction(optionElem.getAttribute('id'))(); event.stopPropagation(); }); }); } else { actionButtonElem[methodName]('click', (event) => { action.handler(event); event.stopPropagation(); }); } } }); } } getRoomAvatar() { let buffer = '<div class="extCallNotif__roomImg"><div class="extCallNotif__trivial--big">'; if (this.avatarURLs.length === 1) { buffer += ` <div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--1o2"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[0]}" alt=""/></div> \ <div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--2o2 extCallNotif__trival__avatar--grey"></div> `; } if (this.avatarURLs.length === 2) { buffer += ` <div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--1o2"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[0]}" alt="" /></div> \ <div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--2o2"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[1]}" alt="" /></div> `; } if (this.avatarURLs.length > 2) { buffer += ` <div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--1o3"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[0]}" alt="" /></div> \ <div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--2o3"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[1]}" alt="" /></div> \ <div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--3o3"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[2]}" alt="" /></div> `; } buffer += '</div></div>'; return buffer; } getWebinarAvatar() { if (this.webinarAvatarURL === 'default') { const colorClass = this.computeWebinarColor(this.origin); const buffer = '<svg class="webinar-banner" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 304 152"><defs><linearGradient id="Dégradé_sans_nom_587" x1="312.59" y1="92.98" x2="-43.17" y2="0.13" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff" stop-opacity="0.1"/><stop offset="0.56" stop-color="#281e00" stop-opacity="0.4"/><stop offset="1" stop-color="#140000" stop-opacity="0.8"/></linearGradient><linearGradient id="Dégradé_sans_nom_585" x1="414.86" y1="134.51" x2="208.64" y2="70" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff" stop-opacity="0.1"/><stop offset="0.52" stop-color="#281e00" stop-opacity="0.4"/><stop offset="1" stop-color="#140000" stop-opacity="0.9"/></linearGradient><linearGradient id="Dégradé_sans_nom_588" x1="-114.57" y1="26.11" x2="86.11" y2="113.43" xlink:href="#Dégradé_sans_nom_587"/></defs><rect style="fill: ' + colorClass + ';" x="" y="0" width="304" height="152" /><g class="gradients"><polygon points="0.18 0 104.78 104.97 210.13 0 0.18 0" style="fill:url(#Dégradé_sans_nom_587)"/><polygon points="304 0 210.18 0 104.81 105 151.64 152 304 152 304 0" style="fill:url(#Dégradé_sans_nom_585)"/><polygon points="0.18 0 0 0 0 152 151.64 152 0.18 0" style="fill:url(#Dégradé_sans_nom_588)"/></g><g class="decorations"><circle cx="268.39" cy="23.51" r="3"/><path d="M38.53,87.4,14.7,88.67l5.06,6.26-1.17,6.21,3.93-2.79,5.19,6.43L38.57,87.45Zm-11,13.94-3.94-4.88,6.52-4.09-8.69,1.4-2.68-3.31,16.15-.86Z"/><path d="M38.56,12.07a3,3,0,1,1-3,3,3,3,0,0,1,3-3m0-3a6,6,0,1,0,6,6,6,6,0,0,0-6-6Z"/><path d="M288.94,116.71a1.5,1.5,0,1,1-1.5,1.5,1.5,1.5,0,0,1,1.5-1.5m0-3a4.5,4.5,0,1,0,4.5,4.5,4.51,4.51,0,0,0-4.5-4.5Z"/><path d="M84.17,88h-2V86a1,1,0,0,0-1-1h-1a1,1,0,0,0-1,1v2h-2a1,1,0,0,0-1,1v1a1,1,0,0,0,1,1h2v2a1,1,0,0,0,1,1h1a1,1,0,0,0,1-1V91h2a1,1,0,0,0,1-1V89A1,1,0,0,0,84.17,88Z"/><path d="M22.46,23.36a26.15,26.15,0,0,1,1.39,2.46l2.69-1.33A26.87,26.87,0,0,0,25,21.74Z"/><path d="M18.92,18.89c.67.7,1.3,1.43,1.88,2.16l2.35-1.87c-.64-.8-1.33-1.59-2.06-2.36Z"/><path d="M16,63.37l2.44,1.74c.61-.85,1.18-1.69,1.73-2.52l-2.51-1.65C17.1,61.74,16.54,62.55,16,63.37Z"/><path d="M14.61,15.06c.78.6,1.53,1.21,2.23,1.84l2-2.24c-.76-.68-1.57-1.34-2.4-2Z"/><path d="M28.06,46l-2.89-.8c-.25.9-.55,1.83-.87,2.76l2.82,1C27.48,48,27.79,47,28.06,46Z"/><path d="M26,51.84l-2.76-1.18c-.37.87-.78,1.76-1.21,2.65l2.69,1.33C25.18,53.7,25.61,52.75,26,51.84Z"/><path d="M19.2,58.45,21.76,60c.55-.9,1.06-1.78,1.54-2.65l-2.63-1.45C20.21,56.75,19.72,57.59,19.2,58.45Z"/><path d="M12.4,68.09,14.74,70c.65-.81,1.27-1.61,1.87-2.4l-2.4-1.81C13.63,66.52,13,67.3,12.4,68.09Z"/><path d="M29.23,39.86l-3-.3c-.09.93-.23,1.88-.41,2.83l2.94.57C29,41.92,29.12,40.88,29.23,39.86Z"/><path d="M27.78,27.4l-2.82,1a23.16,23.16,0,0,1,.79,2.7l2.93-.68A27.77,27.77,0,0,0,27.78,27.4Z"/><path d="M4.91,77.53l2.41,1.79c.58-.77,1.17-1.56,1.8-2.37L6.74,75.12Z"/><path d="M2.29,86.64,0,85.2v3.51l.77.45C1.24,88.34,1.75,87.5,2.29,86.64Z"/><path d="M0,4.46V7.23c.6.23,1.22.46,1.88.73L3,5.18C2,4.76,1,4.4.13,4.09Z"/><path d="M1.41,82.49,3.9,84.16c.53-.79,1.09-1.6,1.68-2.44L3.13,80C2.53,80.84,2,81.68,1.41,82.49Z"/><path d="M9.77,11.82c.86.5,1.69,1,2.48,1.55l1.66-2.49c-.83-.56-1.71-1.11-2.62-1.64Z"/><path d="M2.19,111A9.47,9.47,0,0,1,0,110.61v3.09a13.09,13.09,0,0,0,2.11.25Z"/><path d="M26.23,33.89a26.55,26.55,0,0,1,.15,2.83h3a29.78,29.78,0,0,0-.17-3.15Z"/><path d="M11,74.61l1.88-2.31-2.32-1.9c-.65.79-1.29,1.57-1.9,2.34Z"/><path d="M4.58,9.12c.89.41,1.78.85,2.63,1.29L8.59,7.75C7.7,7.28,6.77,6.83,5.83,6.4Z"/><path d="M11.51,110.38a4.84,4.84,0,0,0,1.19-3.09,4,4,0,0,0-.12-1L9.66,107a1.76,1.76,0,0,1,0,.31,1.85,1.85,0,0,1-.51,1.18Z"/><path d="M4.83,110.71l.61,2.93a13,13,0,0,0,3.19-1.08L7.3,109.87A10.88,10.88,0,0,1,4.83,110.71Z"/><path d="M284.45,141.81c-.85-.49-1.68-1-2.47-1.55l-1.67,2.5c.84.56,1.73,1.11,2.62,1.64Z"/><path d="M281.82,85.54l-2.34-1.87c-.65.81-1.27,1.61-1.87,2.4L280,87.88C280.59,87.11,281.19,86.33,281.82,85.54Z"/><path d="M279.61,138.58c-.77-.6-1.53-1.22-2.23-1.84l-2,2.24c.76.67,1.57,1.34,2.4,2Z"/><path d="M289.31,76.1l-2.41-1.79q-.87,1.17-1.8,2.37l2.38,1.84Z"/><path d="M278.26,90.27l-2.45-1.74c-.6.85-1.17,1.69-1.72,2.52l2.5,1.65C277.12,91.9,277.68,91.09,278.26,90.27Z"/><path d="M282.72,43.25a4.85,4.85,0,0,0-1.2,3.09,4,4,0,0,0,.12,1l2.92-.67a1.76,1.76,0,0,1,0-.31,1.85,1.85,0,0,1,.51-1.18Z"/><path d="M283.27,79c-.61.76-1.23,1.53-1.88,2.31l2.31,1.91,1.91-2.34Z"/><path d="M265,113.78l3,.29c.09-.92.23-1.87.41-2.83l-2.94-.56C265.25,111.72,265.09,112.76,265,113.78Z"/><path d="M266.16,107.64l2.89.8c.25-.91.54-1.84.87-2.76l-2.83-1C266.74,105.67,266.43,106.67,266.16,107.64Z"/><path d="M275,95.18l-2.57-1.55c-.54.89-1.05,1.78-1.53,2.65l2.63,1.44C274,96.89,274.5,96,275,95.18Z"/><path d="M266.44,126.23l2.82-1a25.29,25.29,0,0,1-.79-2.7l-2.93.68A27,27,0,0,0,266.44,126.23Z"/><path d="M271.77,130.28a25.47,25.47,0,0,1-1.4-2.47l-2.69,1.34a30,30,0,0,0,1.56,2.74Z"/><path d="M275.3,134.74c-.67-.7-1.3-1.42-1.88-2.15l-2.35,1.86c.64.8,1.33,1.6,2.07,2.36Z"/><path d="M268.22,101.8,271,103c.37-.87.78-1.76,1.21-2.65L269.5,99C269,99.94,268.61,100.88,268.22,101.8Z"/><path d="M300.8,44.84A8.42,8.42,0,0,0,298.61,42l-1.94,2.29a5.4,5.4,0,0,1,1.41,1.86Z"/><path d="M301.76,49.58c0-.47,0-.94-.06-1.38l-3,.31a9.25,9.25,0,0,1,.05,1.07,14.81,14.81,0,0,1-.09,1.59l3,.35A16.46,16.46,0,0,0,301.76,49.58Z"/><path d="M299.68,151.27v0l.09,0,.09-.39,1.14-2.3-.21-.1-.35-.14s-1-.22-2.56-.7l-.88,2.87c1.3.4,2.21.63,2.59.72Z"/><path d="M298.13,53.9a26.52,26.52,0,0,1-.87,2.72l2.82,1c.38-1,.7-2,.95-3Z"/><path d="M268,119.74a24.11,24.11,0,0,1-.16-2.82h-3a30.12,30.12,0,0,0,.17,3.16Z"/><path d="M304,149.94l-.33-.14-.94,2.2H304Z"/><path d="M289.65,144.51c-.91-.41-1.8-.85-2.64-1.28l-1.38,2.66c.88.46,1.81.91,2.77,1.35Z"/><path d="M292.81,71.15l-2.49-1.67q-.79,1.18-1.68,2.43l2.44,1.74C291.69,72.79,292.27,72,292.81,71.15Z"/><path d="M295.09,146.72c-.93-.33-1.85-.68-2.74-1l-1.13,2.78c.93.37,1.89.74,2.87,1.09Z"/><path d="M289.4,42.92,288.79,40a13.54,13.54,0,0,0-3.2,1.08l1.33,2.69A11,11,0,0,1,289.4,42.92Z"/><path d="M293.45,64.48c-.47.81-1,1.65-1.52,2.52l2.54,1.59c.56-.89,1.09-1.76,1.58-2.61Z"/><path d="M295.49,40.25a11.83,11.83,0,0,0-3.37-.56l-.09,3a8.48,8.48,0,0,1,2.53.42Z"/><path d="M298.89,60.53l-2.73-1.24c-.39.84-.82,1.72-1.29,2.62l2.66,1.39C298,62.35,298.48,61.42,298.89,60.53Z"/></g><g class="elements"><path d="M96.55,136.5H91.38l-2.9-11.25c-.1-.4-.29-1.22-.55-2.48s-.4-2.1-.44-2.53c-.06.53-.21,1.38-.44,2.55s-.42,2-.54,2.49L83.62,136.5H78.46L73,115.09h4.47l2.74,11.69c.48,2.16.82,4,1,5.61.06-.56.19-1.42.4-2.59s.41-2.07.59-2.72l3.12-12h4.3l3.12,12c.13.54.3,1.36.51,2.47s.36,2,.47,2.84c.09-.76.25-1.71.47-2.85s.41-2.06.58-2.76l2.73-11.69H102Z" style="fill:#fff"/><path d="M120,136.5H107.7V115.09H120v3.72h-7.79v4.7h7.25v3.72h-7.25v5.52H120Z" style="fill:#fff"/><path d="M127.5,115.09h6.67c3,0,5.24.43,6.61,1.29a4.53,4.53,0,0,1,2.06,4.13,5.2,5.2,0,0,1-.9,3.15,3.62,3.62,0,0,1-2.4,1.48v.14a4.75,4.75,0,0,1,2.94,1.7,5.54,5.54,0,0,1,.9,3.31,5.45,5.45,0,0,1-2.12,4.57,9.1,9.1,0,0,1-5.75,1.64h-8Zm4.54,8.48h2.64a4.81,4.81,0,0,0,2.67-.57,2.13,2.13,0,0,0,.83-1.89,1.9,1.9,0,0,0-.9-1.77,5.87,5.87,0,0,0-2.85-.53H132Zm0,3.6v5.58h3a4.46,4.46,0,0,0,2.77-.71,2.64,2.64,0,0,0,.89-2.2q0-2.67-3.81-2.67Z" style="fill:#fff"/><path d="M150.66,136.5V115.09h4.54V136.5Z" style="fill:#fff"/><path d="M182.59,136.5h-5.77l-9.32-16.2h-.13c.18,2.86.28,4.91.28,6.13V136.5h-4.06V115.09h5.73l9.3,16h.1c-.15-2.79-.22-4.75-.22-5.91V115.09h4.09Z" style="fill:#fff"/><path d="M204.09,136.5l-1.55-5.09h-7.81l-1.55,5.09h-4.9l7.56-21.5h5.55L209,136.5Zm-2.64-8.9q-2.14-6.93-2.42-7.84c-.18-.6-.31-1.08-.39-1.43q-.48,1.88-2.77,9.27Z" style="fill:#fff"/><path d="M219.22,128.29v8.21h-4.54V115.09h6.24q4.37,0,6.46,1.59a6.34,6.34,0,0,1,1.05,8.19,6.79,6.79,0,0,1-2.94,2.3q4.83,7.23,6.3,9.33h-5l-5.11-8.21Zm0-3.7h1.46a5.59,5.59,0,0,0,3.18-.71,2.55,2.55,0,0,0,1-2.26,2.35,2.35,0,0,0-1-2.17,6.36,6.36,0,0,0-3.24-.64h-1.38Z" style="fill:#fff"/><path d="M263.58,70.23,234.1,65a1.87,1.87,0,0,0-2.17,1.52L228,88.66a1.87,1.87,0,0,0,1.52,2.17L259,96a1.87,1.87,0,0,0,2.17-1.52l3.9-22.11A1.87,1.87,0,0,0,263.58,70.23ZM250.47,88.32l-5.62-1-9.35-1.65,8.7-11.05,3.14,9.28L251,79.68l3.23,9.3Zm5-12.31a2,2,0,1,1-1.62-2.32A2,2,0,0,1,255.48,76Z" style="fill:#f8f8f8"/><path d="M60.48,48.9a6.81,6.81,0,1,0,7.9,5.53A6.81,6.81,0,0,0,60.48,48.9Zm0,11.49-1.56-8.86,6.6,2.89.17,1Z" style="fill:#f8f8f8"/><path d="M81.3,63.32,77.48,41.65A2,2,0,0,0,75.17,40L43.65,45.59A2,2,0,0,0,42,47.9l3.82,21.67a2,2,0,0,0,2.32,1.62l31.51-5.55A2,2,0,0,0,81.3,63.32ZM63.4,65.46a10,10,0,1,1,8.12-11.58A10,10,0,0,1,63.4,65.46Z" style="fill:#f8f8f8"/><g id="guy"><path d="M157.74,40h0a2.88,2.88,0,0,1,0-5.75h0v5.48c0,.09,0,.18,0,.27Z" style="fill:#fff"/><path d="M160.07,29.29c0-8.22,2.23-13.32,13.32-13.32a4.06,4.06,0,0,0,1.87-.51l.91-.46.1-.32h.13l0,.08a2.61,2.61,0,0,0,1.71,1.2c6.07,1.17,8.54,5,8.54,13.32v.26h-1.95l-3.23-4.29-1.12-1.49-1.71.78-9.11,4.06,1.85-4.95-5.86,3.65L162,29.55h-1.88Z" style="fill:#fff"/><path d="M189.21,40h-.16c0-.09,0-.17,0-.26V34.29l.14,0h0a2.88,2.88,0,0,1,0,5.75Z" style="fill:#fff"/><path d="M183.27,59.69l.65.25c1.62.66,5.39,2.47,5.39,4.87V87H157.43V64.81c0-2.4,3.77-4.21,5.4-4.87l.67-.25h0c1.4,2.06,5.31,3.55,9.89,3.55S181.87,61.75,183.27,59.69Z" style="fill:#fff"/><path d="M180.82,58.9a5.72,5.72,0,0,1-1.12.71,16.38,16.38,0,0,1-12.67,0,6.23,6.23,0,0,1-1.12-.71c.85-.24,1.74-.44,2.67-.62l1.91-.36V55.15h0a15.63,15.63,0,0,0,2.92.28,15.82,15.82,0,0,0,2.85-.26v2.76l1.91.36C179.08,58.46,180,58.66,180.82,58.9Z" style="fill:#fff"/><path d="M183.61,31.92l-3.92-5.23-11.75,5.23h-2.08l1-2.61-4.22,2.61h-2.55v7.83a13.32,13.32,0,0,0,26.64,0V31.92Zm-16.77,5.21a1.31,1.31,0,1,1,0-2.61h0a1.31,1.31,0,0,1,0,2.61Zm14.38-1.3a1.31,1.31,0,1,1-1.3-1.31,1.31,1.31,0,0,1,1.3,1.31Z" style="fill:#fff"/><g class="border"> \ <path d="M166.85,34.52h0a1.31,1.31,0,1,0,1.3,1.31A1.3,1.3,0,0,0,166.84,34.52Z"/><path d="M179.92,34.52a1.31,1.31,0,1,0,1.3,1.31h0A1.31,1.31,0,0,0,179.92,34.52Z"/><path d="M189.21,31.92l-.15,0v0h0V29.31c0-7.38-1.8-14-10.44-15.67-.72-.14.78-2.54,0-2.61h-.06A8.53,8.53,0,0,0,176,12.36h-.07c-.45,0-2-1.36-2.43-1.36v0h-.06c-.26.14,1.07,2.21.84,2.35a2.26,2.26,0,0,1-.84.28c-13.06,0-15.67,7-15.67,15.67v2.6a5.23,5.23,0,1,0,0,10.45l.25,0a15.65,15.65,0,0,0,10.21,12.17V56c-6,1.15-13.09,4.1-13.09,8.86V89.35h36.55V64.81c0-3.42-3.64-5.91-7.93-7.46a2.49,2.49,0,0,1,.13.67,2.29,2.29,0,0,0-.14-.68,32.23,32.23,0,0,0-5.1-1.36V54.52h0a15.68,15.68,0,0,0,10.25-12.18h0l.36,0a5.23,5.23,0,0,0,5.24-5.21v0A5.24,5.24,0,0,0,189.21,31.92ZM157.74,40h0a2.88,2.88,0,0,1,0-5.75h0v5.48c0,.09,0,.18,0,.27Zm2.33-10.73c0-8.22,2.23-13.32,13.32-13.32a4.06,4.06,0,0,0,1.87-.51l.91-.46.1-.32h.13l0,.08a2.61,2.61,0,0,0,1.71,1.2c6.07,1.17,8.54,5,8.54,13.32v.26h-1.95l-3.23-4.29-1.12-1.49-1.71.78-9.11,4.06,1.85-4.95-5.86,3.65L162,29.55h-1.88Zm23.2,30.4.65.25c1.62.66,5.39,2.47,5.39,4.87V87H157.43V64.81c0-2.4,3.77-4.21,5.4-4.87l.67-.25h0c1.4,2.06,5.31,3.55,9.89,3.55S181.87,61.75,183.27,59.69Zm-2.45-.79a5.72,5.72,0,0,1-1.12.71,16.38,16.38,0,0,1-12.67,0,6.23,6.23,0,0,1-1.12-.71c.85-.24,1.74-.44,2.67-.62l1.91-.36V55.15h0a15.63,15.63,0,0,0,2.92.28,15.82,15.82,0,0,0,2.85-.26v2.76l1.91.36C179.08,58.46,180,58.66,180.82,58.9Zm5.89-19.15a13.32,13.32,0,0,1-26.64,0V31.92h2.55l4.22-2.61-1,2.61h2.08l11.75-5.23,3.92,5.23h3.1Zm2.5.27h-.16c0-.09,0-.17,0-.26V34.29l.14,0h0a2.88,2.88,0,0,1,0,5.75Z"/></g></g><g id="screen"><rect x="117.65" y="58.79" width="4.94" height="23.04" style="fill:#fff"/><rect x="124.23" y="63.18" width="4.94" height="18.65" style="fill:#fff"/><rect x="130.81" y="68.66" width="4.94" height="13.16" style="fill:#fff"/><rect x="111.07" y="68.66" width="4.94" height="13.16" style="fill:#fff"/><path d="M120.39,41.24V34.1a7.14,7.14,0,1,0,7.13,7.14Z" style="fill:#fff"/><path d="M122,39.59h7.13A7.13,7.13,0,0,0,122,32.46Z" style="fill:#fff"/><path d="M200.21,22.41H193.3c.11,1.31.17,2.65.18,4h6.73V86.75H106V26.41h48.19c0-1.35.06-2.69.17-4H106a4,4,0,0,0-4,4V86.75a4,4,0,0,0,4,4h41.36A20.84,20.84,0,0,1,145.7,98h.12a2,2,0,0,0-.65,1.47v.11H162.1v-.11a2,2,0,0,0-.65-1.47h.12a21.09,21.09,0,0,1-1.66-7.21h40.3a4,4,0,0,0,4-4V26.41A4,4,0,0,0,200.21,22.41Z" style="fill:#fff"/></g></g></svg>'; return `<div class="extCallNotif__webinarImg">${buffer}</div>`; } return `<img class="extCallNotif__webinarImg" src="${this.webinarAvatarURL}" alt="" />`; } getActionByName(actionName) { return this.actions.find((action) => { return action.name === actionName; }); } computeWebinarColor(name) { const upperCaseWebinarName = name.toUpperCase(); const colors = ["#d3a575", "#eb8d8d", "#d47ab0", "#b38deb", "#9aa3ed", "#76a6e5", "#92d0de", "#a7d6bc", "#99c86b", "#b4d43d", "#dcd33b", "#eec838"]; let sum = 0; for (let i = 0; i < upperCaseWebinarName.length; i++) { sum += upperCaseWebinarName.charCodeAt(i); } return colors[sum % 12]; } } exports.RainbowNotification = RainbowNotification; exports.RainbowNotificationAction = RainbowNotificationAction; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlcyI6WyIuLi9zcmMvZXNjYXBlLmpzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbmNvbnN0IElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbmNvbnN0IHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG5jb25zdCByZVVuZXNjYXBlZEh0bWwgPSAvWyY8PlwiJ2BdL2c7XG5jb25zdCByZUhhc1VuZXNjYXBlZEh0bWwgPSBSZWdFeHAocmVVbmVzY2FwZWRIdG1sLnNvdXJjZSk7XG5cbi8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovXG5jb25zdCBodG1sRXNjYXBlcyA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OycsXG4gICAgJ2AnOiAnJiM5NjsnXG59O1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuY29uc3QgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xuY29uc3QgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xuY29uc3Qgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG59XG5cbi8qKlxuICogVXNlZCBieSBgXy5lc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAqL1xuY29uc3QgZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sRXNjYXBlcyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbmNvbnN0IG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xuY29uc3Qgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG5jb25zdCBTeW1ib2wgPSByb290LlN5bWJvbDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG5jb25zdCBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQ7XG5jb25zdCBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gKFN0cmluZyh2YWx1ZSkpO1xuICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICAgIHJldHVybiBCb29sZWFuKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIFwiJlwiLCBcIjxcIiwgXCI+XCIsICdcIicsIFwiJ1wiLCBhbmQgXCJcXGBcIiBpbiBgc3RyaW5nYCB0b1xuICogdGhlaXIgY29ycmVzcG9uZGluZyBIVE1MIGVudGl0aWVzLlxuICpcbiAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbFxuICogY2hhcmFjdGVycyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gKlxuICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICogXCI+XCIgYW5kIFwiL1wiIGRvbid0IG5lZWQgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmdcbiAqIHVubGVzcyB0aGV5J3JlIHBhcnQgb2YgYSB0YWcgb3IgdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLiBTZWVcbiAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAqICh1bmRlciBcInNlbWktcmVsYXRlZCBmdW4gZmFjdFwiKSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEJhY2t0aWNrcyBhcmUgZXNjYXBlZCBiZWNhdXNlIGluIElFIDwgOSwgdGhleSBjYW4gYnJlYWsgb3V0IG9mXG4gKiBhdHRyaWJ1dGUgdmFsdWVzIG9yIEhUTUwgY29tbWVudHMuIFNlZSBbIzU5XShodHRwczovL2h0bWw1c2VjLm9yZy8jNTkpLFxuICogWyMxMDJdKGh0dHBzOi8vaHRtbDVzZWMub3JnLyMxMDIpLCBbIzEwOF0oaHR0cHM6Ly9odG1sNXNlYy5vcmcvIzEwOCksIGFuZFxuICogWyMxMzNdKGh0dHBzOi8vaHRtbDVzZWMub3JnLyMxMzMpIG9mIHRoZVxuICogW0hUTUw1IFNlY3VyaXR5IENoZWF0c2hlZXRdKGh0dHBzOi8vaHRtbDVzZWMub3JnLykgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBXaGVuIHdvcmtpbmcgd2l0aCBIVE1MIHlvdSBzaG91bGQgYWx3YXlzXG4gKiBbcXVvdGUgYXR0cmlidXRlIHZhbHVlc10oaHR0cDovL3dvbmtvLmNvbS9wb3N0L2h0bWwtZXNjYXBpbmcpIHRvIHJlZHVjZVxuICogWFNTIHZlY3RvcnMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZXNjYXBlKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcydcbiAqL1xuY29uc3QgX2VzY2FwZSA9IGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzVW5lc2NhcGVkSHRtbC50ZXN0KHN0cmluZykpID9cbiAgICAgICAgc3RyaW5nLnJlcGxhY2UocmVVbmVzY2FwZWRIdG1sLCBlc2NhcGVIdG1sQ2hhcikgOlxuICAgICAgICBzdHJpbmc7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBfZXNjYXBlO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tbXVsdGktc3RyICovXG5pbXBvcnQgX2VzY2FwZSBmcm9tICcuL2VzY2FwZSc7XG5leHBvcnQgY2xhc3MgUmFpbmJvd05vdGlmaWNhdGlvbkFjdGlvbiB7XG5cbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xuICAgIHB1YmxpYyBjb2xvcjogc3RyaW5nO1xuICAgIHB1YmxpYyBpY29uOiBzdHJpbmc7XG4gICAgcHVibGljIG9wdGlvbnM6IGFueVtdO1xuICAgIHB1YmxpYyBvcHRpb25zRGVmYXVsdExhYmVsOiBzdHJpbmcgPSAnZGVmYXVsdCc7XG4gICAgcHVibGljIG9wdGlvbnNIZWFkZXJMYWJlbDogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgb3B0aW9uSGFuZGxlcjogYW55O1xuICAgIHB1YmxpYyBjaG9pY2U6IGFueVtdO1xuICAgIHB1YmxpYyBjaG9pY2VUaXRsZUxhYmVsOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBjaG9pY2VDbG9zZUxhYmVsOiBzdHJpbmc7XG4gICAgcHVibGljIGNob2ljZUhhbmRsZXI6IGFueTtcbiAgICBwdWJsaWMgaGFuZGxlcjogYW55ID0gbnVsbDtcbiAgICBwdWJsaWMgZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgY2hvaWNlVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgb3B0aW9uVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoY29uZmlnOiBhbnkpOiBSYWluYm93Tm90aWZpY2F0aW9uQWN0aW9uIHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gbmV3IFJhaW5ib3dOb3RpZmljYXRpb25BY3Rpb24oKTtcbiAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4geyBpZiAoY29uZmlnW2tleV0pIGFjdGlvbltrZXldID0gY29uZmlnW2tleV07IH0pO1xuICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b29nbGVDaG9pY2Uobm90aWY6IFJhaW5ib3dOb3RpZmljYXRpb24pOiBhbnkge1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hvaWNlRWxlbTogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNhbGxOb3RpZl9jaG9pY2VfJHtub3RpZi5pZH1fJHt0aGlzLm5hbWV9YCk7XG4gICAgICAgICAgICBjb25zdCBjaG9pY2VBY3Rpb25FbGVtOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY2FsbE5vdGlmXyR7bm90aWYuaWR9XyR7dGhpcy5uYW1lfWApO1xuICAgICAgICAgICAgaWYgKGNob2ljZUVsZW0gJiYgY2hvaWNlQWN0aW9uRWxlbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hvaWNlVmlzaWJsZSA9ICF0aGlzLmNob2ljZVZpc2libGU7XG4gICAgICAgICAgICAgICAgY2hvaWNlRWxlbS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5jaG9pY2VWaXNpYmxlID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgY2hvaWNlRWxlbS5zdHlsZS56SW5kZXggPSB0aGlzLmNob2ljZVZpc2libGUgPyAxIDogLTE7XG4gICAgICAgICAgICAgICAgY2hvaWNlQWN0aW9uRWxlbS50ZXh0Q29udGVudCA9IHRoaXMuY2hvaWNlVmlzaWJsZSA/IHRoaXMuY2hvaWNlQ2xvc2VMYWJlbCA6IHRoaXMubGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHRvb2dsZU9wdGlvbihub3RpZjogUmFpbmJvd05vdGlmaWNhdGlvbik6IGFueSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbkVsZW06IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjYWxsTm90aWZfb3B0aW9uXyR7bm90aWYuaWR9XyR7dGhpcy5uYW1lfWApO1xuICAgICAgICBpZiAob3B0aW9uRWxlbSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25WaXNpYmxlID0gIXRoaXMub3B0aW9uVmlzaWJsZTtcbiAgICAgICAgICAgIG9wdGlvbkVsZW0uc3R5bGUub3BhY2l0eSA9IHRoaXMub3B0aW9uVmlzaWJsZSA/IDEgOiAwO1xuICAgICAgICAgICAgb3B0aW9uRWxlbS5zdHlsZS56SW5kZXggPSB0aGlzLm9wdGlvblZpc2libGUgPyAxIDogLTE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hvaWNlQWN0aW9uKGNob2ljZUlkOiBzdHJpbmcpIHsgcmV0dXJuICgpID0+IHsgdGhpcy5jaG9pY2VIYW5kbGVyKGNob2ljZUlkKTsgfTsgfVxuICAgIHB1YmxpYyBvcHRpb25BY3Rpb24ob3B0aW9uSWQ6IHN0cmluZykgeyByZXR1cm4gKCkgPT4geyB0aGlzLm9wdGlvbkhhbmRsZXIob3B0aW9uSWQpOyB9OyB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYWluYm93Tm90aWZpY2F0aW9uIHtcblxuICAgIHB1YmxpYyBpZDogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgY29udklkOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBtZE1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIG9yaWdpbjogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgYXZhdGFyVVJMOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBhdmF0YXJVUkxzOiBzdHJpbmdbXSA9IG51bGw7XG4gICAgcHVibGljIHdlYmluYXJBdmF0YXJVUkw6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIGluZm9UaXRsZTogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgaW5mb01lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIGNhbGxTdWJqZWN0OiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBjYWxsZWQ6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIGNhbGxlZE1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIHVyZ2VuY3k6IHN0cmluZyA9ICdzdGQnO1xuICAgIHB1YmxpYyB1cmdlbmN5TGFiZWw6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIGRlbGF5OiBudW1iZXIgPSAxNTAwMDtcbiAgICBwdWJsaWMgZGVsYXlUaW1lb3V0ID0gbnVsbDtcbiAgICBwdWJsaWMgYXV0b0Nsb3NlQWN0aW9uID0gbnVsbDtcbiAgICBwdWJsaWMgaW5mb0hhbmRsZXI6IGFueSA9IG51bGw7XG4gICAgcHVibGljIGFjdGlvbnM6IFJhaW5ib3dOb3RpZmljYXRpb25BY3Rpb25bXSA9IG51bGw7XG4gICAgcHVibGljIGljb25QYXRoOiBzdHJpbmcgPSAnYXNzZXRzL2ltYWdlcyc7XG4gICAgcHVibGljIHVyZ2VuY3lJY29uOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyB1cmdlbmN5Q2xhc3M6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIGlzRGFya1RoZW1lOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNsb3NlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShjb25maWc6IGFueSkge1xuICAgICAgICBjb25zdCByYWluYm93Tm90aWZpY2F0aW9uID0gbmV3IFJhaW5ib3dOb3RpZmljYXRpb24oKTtcbiAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1trZXldICYmIHJhaW5ib3dOb3RpZmljYXRpb25ba2V5XSAhPT0gdW5kZWZpbmVkKSB7IHJhaW5ib3dOb3RpZmljYXRpb25ba2V5XSA9IGNvbmZpZ1trZXldOyB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyYWluYm93Tm90aWZpY2F0aW9uLnVyZ2VuY3kpIHtcbiAgICAgICAgICAgIGNvbnN0IGljb25zID0geyBzdGQ6IG51bGwsIGxvdzogJ2J1bGInLCBtaWRkbGU6ICdwcm9ibGVtLWFsZXJ0JywgaGlnaDogJ3NpcmVuJyB9O1xuICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IHsgc3RkOiBudWxsLCBsb3c6ICdleHRDYWxsTm90aWZfX3VyZy1ub3RpZnknLCBtaWRkbGU6ICdleHRDYWxsTm90aWZfX3VyZy13YXJuaW5nJywgaGlnaDogJ2V4dENhbGxOb3RpZl9fdXJnLWVtZXJnZW5jeScgfTtcbiAgICAgICAgICAgIHJhaW5ib3dOb3RpZmljYXRpb24udXJnZW5jeUljb24gPSBgJHtyYWluYm93Tm90aWZpY2F0aW9uLmljb25QYXRofS9zcHJpdGUuc3ZnIyR7aWNvbnNbcmFpbmJvd05vdGlmaWNhdGlvbi51cmdlbmN5XX1gO1xuICAgICAgICAgICAgcmFpbmJvd05vdGlmaWNhdGlvbi51cmdlbmN5Q2xhc3MgPSBjbGFzc2VzW3JhaW5ib3dOb3RpZmljYXRpb24udXJnZW5jeV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhaW5ib3dOb3RpZmljYXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldEhUTUxDb250ZW50KCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGNsb3NlID0gdGhpcy5jbG9zZSA/IGA8ZGl2IGNsYXNzPSdleHRDYWxsTm90aWZfX2Nsb3NlJyBpZD1cImNhbGxOb3RpZl8ke3RoaXMuaWR9X2Nsb3NlQnV0dG9uXCI+PHN2Zz48dXNlIGhyZWY9XCIke3RoaXMuaWNvblBhdGh9L3Nwcml0ZS5zdmcjY2xvc2VcIj48L3N2Zz48L2Rpdj5gIDogJyc7XG4gICAgICAgIGNvbnN0IHVyZ2VuY3kgPSAodGhpcy51cmdlbmN5TGFiZWwgJiYgdGhpcy51cmdlbmN5TGFiZWwgIT09ICdzdGQnKSA/IGA8ZGl2IGNsYXNzPSdleHRDYWxsTm90aWZfX3VyZyAke3RoaXMudXJnZW5jeUNsYXNzfSc+PHN2Zz48dXNlIGhyZWY9XCIke3RoaXMudXJnZW5jeUljb259XCI+PC9zdmc+JHt0aGlzLnVyZ2VuY3lMYWJlbH08L2Rpdj5gIDogJyc7XG4gICAgICAgIGxldCBhdmF0YXIgPSB0aGlzLmF2YXRhclVSTCA/IGA8aW1nIGNsYXNzPSdleHRDYWxsTm90aWZfX2ltZycgc3JjPScke3RoaXMuYXZhdGFyVVJMfScgZHJhZ2dhYmxlPSdmYWxzZScgYWx0PScnIC8+YCA6ICcnO1xuICAgICAgICBpZiAodGhpcy5hdmF0YXJVUkxzKSB7IGF2YXRhciA9IHRoaXMuZ2V0Um9vbUF2YXRhcigpOyB9XG4gICAgICAgIGlmICh0aGlzLndlYmluYXJBdmF0YXJVUkwpIHsgYXZhdGFyID0gdGhpcy5nZXRXZWJpbmFyQXZhdGFyKCk7IH1cbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdGhpcy5vcmlnaW4gPyBgPGRpdiBjbGFzcz0nZXh0Q2FsbE5vdGlmX19vcmlnaW4nPiR7X2VzY2FwZSh0aGlzLm9yaWdpbil9PC9kaXY+YCA6ICcnO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYDxkaXYgY2xhc3M9J2V4dENhbGxOb3RpZl9fbWVzc2FnZSc+JHt0aGlzLm1lc3NhZ2V9PC9kaXY+YDtcbiAgICAgICAgY29uc3QgaW5mb1RpdGxlID0gdGhpcy5pbmZvVGl0bGUgPyBgPGRpdiBjbGFzcz0nZXh0Q2FsbE5vdGlmX19pbmZvVGl0bGUnPiR7dGhpcy5pbmZvVGl0bGV9PC9kaXY+YCA6ICcnO1xuICAgICAgICBjb25zdCBpbmZvTWVzc2FnZSA9IHRoaXMuaW5mb01lc3NhZ2UgPyBgPGRpdiBjbGFzcz0nZXh0Q2FsbE5vdGlmX19pbmZvTWVzc2FnZSc+JHt0aGlzLmluZm9NZXNzYWdlfTwvZGl2PmAgOiAnJztcbiAgICAgICAgY29uc3QgY2FsbFN1YmplY3QgPSB0aGlzLmNhbGxTdWJqZWN0ID8gYDxkaXYgY2xhc3M9J2V4dENhbGxOb3RpZl9fY2FsbFN1YmplY3QnPiR7X2VzY2FwZSh0aGlzLmNhbGxTdWJqZWN0KX08L2Rpdj5gIDogJyc7XG4gICAgICAgIGNvbnN0IGNhbGxlZE1lc3NhZ2UgPSB0aGlzLmNhbGxlZE1lc3NhZ2UgPyBgPGRpdiBjbGFzcz0nZXh0Q2FsbE5vdGlmX19jYWxsZWRNZXNzYWdlJz4ke3RoaXMuY2FsbGVkTWVzc2FnZX08L2Rpdj5gIDogJyc7XG4gICAgICAgIGNvbnN0IGNhbGxlZCA9IHRoaXMuY2FsbGVkID8gYDxkaXYgY2xhc3M9J2V4dENhbGxOb3RpZl9fY2FsbGVkJz4ke3RoaXMuY2FsbGVkfTwvZGl2PmAgOiAnJztcbiAgICAgICAgY29uc3QgbWRNZXNzYWdlID0gdGhpcy5tZE1lc3NhZ2UgPyBgPGRpdiBjbGFzcz0nZXh0Q2FsbE5vdGlmX19tZE1lc3NhZ2UnPiR7dGhpcy5tZE1lc3NhZ2V9PC9kaXY+YCA6ICcnO1xuXG4gICAgICAgIGxldCBhY3Rpb25zQXJlYSA9ICcnO1xuICAgICAgICBpZiAodGhpcy5hY3Rpb25zKSB7XG4gICAgICAgICAgICBhY3Rpb25zQXJlYSA9IHRoaXMuYWN0aW9ucy5yZWR1Y2UoKGJ1ZmZlcjogc3RyaW5nLCBhY3Rpb246IFJhaW5ib3dOb3RpZmljYXRpb25BY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLm5hbWUgPT09ICdjbG9zZUJ1dHRvbicpIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jaG9pY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hvaWNlVGl0bGUgPSBhY3Rpb24uY2hvaWNlVGl0bGVMYWJlbCA/IGA8ZGl2IGlkPSdjaG9pY2VUaXRsZScgY2xhc3M9J2V4dENhbGxOb3RpZl9fY2hvaWNlLXRpdGxlJz4ke2FjdGlvbi5jaG9pY2VUaXRsZUxhYmVsfTwvZGl2PmAgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNob2ljZXMgPSBhY3Rpb24uY2hvaWNlLnJlZHVjZSgoYnVmZjogc3RyaW5nLCBjaG9pY2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmYgKyBgPGxpIGlkPScke2Nob2ljZS5pZH0nIGNsYXNzPSdleHRDYWxsTm90aWZfX2Nob2ljZScgdGFiaW5kZXg9JzAnIHJvbGU9XCJtZW51aXRlbVwiPiR7Y2hvaWNlLmxhYmVsfTwvbGk+YDtcbiAgICAgICAgICAgICAgICAgICAgfSwgJycpO1xuICAgICAgICAgICAgICAgICAgICBjaG9pY2VzICs9IGA8c2VjdGlvbiBpZD0nY2FsbE5vdGlmX2Nob2ljZV9jbG9zZV8ke3RoaXMuaWR9XyR7YWN0aW9uLm5hbWV9JyBjbGFzcz0nZXh0Q2FsbE5vdGlmX19jaG9pY2VDbG9zZSc+JHthY3Rpb24uY2hvaWNlQ2xvc2VMYWJlbH08L3NlY3Rpb24+YDtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyICs9IGA8dWwgaWQ9J2NhbGxOb3RpZl9jaG9pY2VfJHt0aGlzLmlkfV8ke2FjdGlvbi5uYW1lfScgY2xhc3M9J2V4dENhbGxOb3RpZl9fY2hvaWNlcycgcm9sZT0nbWVudScgYXJpYS1sYWJlbGxlZGJ5PSdjYWxsTm90aWZfJHt0aGlzLmlkfV8ke2FjdGlvbi5uYW1lfSc+JHtjaG9pY2VUaXRsZX0ke2Nob2ljZXN9PC91bD5gO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhcnJvdyA9ICcnO1xuICAgICAgICAgICAgICAgIGxldCBvcHRpb25zID0gJyc7XG4gICAgIC