UNPKG

@ema/js-base-library

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

277 lines 26.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * Provides utilities for DOM manipulation */ export class DomUtil { /** * Adds a class to a HTMLElement. * @param {?} el * @param {?} className * @return {?} */ static addClass(el, className) { if (el.classList) el.classList.add(className); else el.className += ' ' + className; } /** * Checks whether a HTMLElement has a class. * @param {?} el * @param {?} className * @return {?} */ static hasClass(el, className) { if (el.classList) el.classList.contains(className); else new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className); } /** * Removes a class form a HTMLElement. * @param {?} el * @param {?} className * @return {?} */ static removeClass(el, className) { if (el.classList) el.classList.remove(className); else el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); } /** * Removes a class from a HTMLElement when present, or adds it when not present. * @param {?} el * @param {?} className * @return {?} */ static toggleClass(el, className) { if (el.classList) { el.classList.toggle(className); } else { /** @type {?} */ let classes = el.className.split(' '); /** @type {?} */ let existingIndex = classes.indexOf(className); if (existingIndex >= 0) classes.splice(existingIndex, 1); else classes.push(className); el.className = classes.join(' '); } } /** * Removes a HTMLElement from the DOM. * @param {?} el * @return {?} */ static remove(el) { el.parentNode.removeChild(el); } /** * Returns an object with all the attributes of a HTMLElement as key / value pairs. * @param {?} el * @return {?} */ static getAttributes(el) { /** @type {?} */ let attrs = el.attributes; /** @type {?} */ let obj = {}; /** @type {?} */ let i = 0; for (; i < attrs.length; i++) { obj[attrs[i].name] = attrs[i].value; } return obj; } /** * Sets attributes of a HTMLElement. * @param {?} el * @param {?} attributes * @return {?} */ static setAttributes(el, attributes) { Object.keys(attributes).forEach((/** * @param {?} k * @return {?} */ (k) => { el.setAttribute(k, attributes[k]); })); } /** * Get a style property of a HTMLElement. * @param {?} el * @param {?} styleProp * @return {?} */ static getStyle(el, styleProp) { /** @type {?} */ let value; /** @type {?} */ const defaultView = el.ownerDocument.defaultView; // W3C standard way: if (defaultView && defaultView.getComputedStyle) { // sanitize property name to css notation (hypen separated words eg. font-Size) styleProp = styleProp.replace(/([A-Z])/g, '-$1').toLowerCase(); return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp); } else if (el['currentStyle']) { // IE // sanitize property name to camelCase styleProp = styleProp.replace(/\-(\w)/g, (/** * @param {?} str * @param {?} letter * @return {?} */ function (str, letter) { return letter.toUpperCase(); })); value = el['currentStyle'][styleProp]; // convert other units to pixels on IE if (/^\d+(em|pt|%|ex)?$/i.test(value)) { return ((/** * @param {?} value * @return {?} */ function (value) { /** @type {?} */ const oldLeft = el.style.left; /** @type {?} */ const oldRsLeft = el['runtimeStyle'].left; el['runtimeStyle'].left = el['currentStyle'].left; el.style.left = value || 0; value = el.style['pixelLeft'] + 'px'; el.style.left = oldLeft; el['runtimeStyle'].left = oldRsLeft; return value; }))(value); } return value; } } /** * Returns the width and height of the viewport. * @return {?} */ static viewportSize() { /** @type {?} */ let obj = { width: undefined, height: undefined }; if (typeof window !== 'undefined') { if (window.innerHeight) { obj.width = window.innerWidth; obj.height = window.innerHeight; } else { obj.width = document.documentElement.clientWidth; obj.height = document.documentElement.clientHeight; } } // todo: native if (typeof window === 'undefined') { } return obj; } /** * @param {?} str * @return {?} */ static copyToClipboard(str) { /** @type {?} */ const el = document.createElement('textarea'); el.value = str; // Set its value to the string that you want copied el.setAttribute('readonly', ''); // Make it readonly to be tamper-proof el.style.position = 'absolute'; el.style.left = '-9999px'; // Move outside the screen to make it invisible document.body.appendChild(el); // Append the <textarea> element to the HTML document // Append the <textarea> element to the HTML document /** @type {?} */ const selected = document.getSelection().rangeCount > 0 // Check if there is any content selected previously ? document.getSelection().getRangeAt(0) // Store selection if found : false; el.select(); // Select the <textarea> content document.execCommand('copy'); // Copy - only works as a result of a user action (e.g. click events) document.body.removeChild(el); // Remove the <textarea> element if (selected) { // If a selection existed before copying document.getSelection().removeAllRanges(); // Unselect everything on the HTML document document.getSelection().addRange(selected); // Restore the original selection } } /** * @param {?} el * @param {?=} duration * @param {?=} delay * @param {?=} display * @return {?} */ static fadeIn(el, duration = 300, delay = 0, display = 'block') { /** @type {?} */ let step = (1 / duration) * 10; el.style.opacity = '0'; el.style.display = display; setTimeout((/** * @return {?} */ () => { ((/** * @return {?} */ function fade() { /** @type {?} */ let val = parseFloat(el.style.opacity); if (!((val += step) > 1)) { el.style.opacity = val.toString(); requestAnimationFrame(fade); } }))(); }), delay); } /** * @param {?} el * @param {?=} duration * @param {?=} delay * @param {?=} visible * @return {?} */ static fadeOut(el, duration = 300, delay = 0, visible = false) { /** @type {?} */ let step = (1 / duration) * 10; el.style.opacity = '1'; setTimeout((/** * @return {?} */ () => { ((/** * @return {?} */ function fade() { /** @type {?} */ let opacity = Number(el.style.opacity); opacity = opacity - step; el.style.opacity = opacity.toString(); if (opacity < 0) { if (visible === false) { el.style.display = 'none'; el.style.opacity = '1'; } } else { requestAnimationFrame(fade); } }))(); }), delay); } /** * @param {?} name * @return {?} */ static getUrlParameterByName(name) { /** @type {?} */ let match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search); return match && decodeURIComponent(match[1].replace(/\+/g, ' ')); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLXV0aWwuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZW1hL2pzLWJhc2UtbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9kb20tdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBR0EsTUFBTSxPQUFPLE9BQU87Ozs7Ozs7SUFLaEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFlLEVBQUUsU0FBaUI7UUFDOUMsSUFBSSxFQUFFLENBQUMsU0FBUztZQUNaLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDOztZQUU1QixFQUFFLENBQUMsU0FBUyxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUM7SUFDeEMsQ0FBQzs7Ozs7OztJQUtELE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBZSxFQUFFLFNBQWlCO1FBQzlDLElBQUksRUFBRSxDQUFDLFNBQVM7WUFDWixFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7WUFFakMsSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRSxDQUFDOzs7Ozs7O0lBS0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFlLEVBQUUsU0FBaUI7UUFDakQsSUFBSSxFQUFFLENBQUMsU0FBUztZQUNaLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDOztZQUUvQixFQUFFLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0gsQ0FBQzs7Ozs7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TyxHQUFHLENBQUMsRUFBRTtvQkFDYixJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7d0JBQ25CLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzt3QkFDMUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO3FCQUMxQjtpQkFDSjtxQkFBTTtvQkFDSCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDL0I7WUFDTCxDQUFDLEVBQUMsRUFBRSxDQUFDO1FBQ1QsQ0FBQyxHQUFFLEtBQUssQ0FBQyxDQUFDO0lBRWQsQ0FBQzs7Ozs7SUFFRCxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBWTs7WUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMzRSxPQUFPLEtBQUssSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FHSiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdmlkZXMgdXRpbGl0aWVzIGZvciBET00gbWFuaXB1bGF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBEb21VdGlsIHtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjbGFzcyB0byBhIEhUTUxFbGVtZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRDbGFzcyhlbDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QpXG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGVsLmNsYXNzTmFtZSArPSAnICcgKyBjbGFzc05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBIVE1MRWxlbWVudCBoYXMgYSBjbGFzcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgaGFzQ2xhc3MoZWw6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAoZWwuY2xhc3NMaXN0KVxuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG5ldyBSZWdFeHAoJyhefCApJyArIGNsYXNzTmFtZSArICcoIHwkKScsICdnaScpLnRlc3QoZWwuY2xhc3NOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgY2xhc3MgZm9ybSBhIEhUTUxFbGVtZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVDbGFzcyhlbDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QpXG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoJyhefFxcXFxiKScgKyBjbGFzc05hbWUuc3BsaXQoJyAnKS5qb2luKCd8JykgKyAnKFxcXFxifCQpJywgJ2dpJyksICcgJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gYSBIVE1MRWxlbWVudCB3aGVuIHByZXNlbnQsIG9yIGFkZHMgaXQgd2hlbiBub3QgcHJlc2VudC5cbiAgICAgKi9cbiAgICBzdGF0aWMgdG9nZ2xlQ2xhc3MoZWw6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY2xhc3NlcyA9IGVsLmNsYXNzTmFtZS5zcGxpdCgnICcpO1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nSW5kZXggPSBjbGFzc2VzLmluZGV4T2YoY2xhc3NOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nSW5kZXggPj0gMClcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnNwbGljZShleGlzdGluZ0luZGV4LCAxKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goY2xhc3NOYW1lKTtcblxuICAgICAgICAgICAgZWwuY2xhc3NOYW1lID0gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgSFRNTEVsZW1lbnQgZnJvbSB0aGUgRE9NLlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmUoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIGEgSFRNTEVsZW1lbnQgYXMga2V5IC8gdmFsdWUgcGFpcnMuXG4gICAgICovXG4gICAgc3RhdGljIGdldEF0dHJpYnV0ZXMoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGxldCBhdHRycyA9IGVsLmF0dHJpYnV0ZXMsIG9iaiA9IHt9LCBpID0gMDtcbiAgICAgICAgZm9yICg7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgb2JqW2F0dHJzW2ldLm5hbWVdID0gYXR0cnNbaV0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGF0dHJpYnV0ZXMgb2YgYSBIVE1MRWxlbWVudC5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0QXR0cmlidXRlcyhlbDogSFRNTEVsZW1lbnQsIGF0dHJpYnV0ZXM6IG9iamVjdCkge1xuICAgICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoaywgYXR0cmlidXRlc1trXSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHN0eWxlIHByb3BlcnR5IG9mIGEgSFRNTEVsZW1lbnQuXG4gICAgICovXG4gICAgc3RhdGljIGdldFN0eWxlKGVsOiBIVE1MRWxlbWVudCwgc3R5bGVQcm9wOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICBjb25zdCBkZWZhdWx0VmlldyA9IGVsLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgICAgIC8vIFczQyBzdGFuZGFyZCB3YXk6XG4gICAgICAgIGlmIChkZWZhdWx0VmlldyAmJiBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgICAvLyBzYW5pdGl6ZSBwcm9wZXJ0eSBuYW1lIHRvIGNzcyBub3RhdGlvbiAoaHlwZW4gc2VwYXJhdGVkIHdvcmRzIGVnLiBmb250LVNpemUpXG4gICAgICAgICAgICBzdHlsZVByb3AgPSBzdHlsZVByb3AucmVwbGFjZSgvKFtBLVpdKS9nLCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxbJ2N1cnJlbnRTdHlsZSddKSB7IC8vIElFXG4gICAgICAgICAgICAvLyBzYW5pdGl6ZSBwcm9wZXJ0eSBuYW1lIHRvIGNhbWVsQ2FzZVxuICAgICAgICAgICAgc3R5bGVQcm9wID0gc3R5bGVQcm9wLnJlcGxhY2UoL1xcLShcXHcpL2csIGZ1bmN0aW9uKHN0ciwgbGV0dGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YWx1ZSA9IGVsWydjdXJyZW50U3R5bGUnXVtzdHlsZVByb3BdO1xuICAgICAgICAgICAgLy8gY29udmVydCBvdGhlciB1bml0cyB0byBwaXhlbHMgb24gSUVcbiAgICAgICAgICAgIGlmICgvXlxcZCsoZW18cHR8JXxleCk/JC9pLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRMZWZ0ID0gZWwuc3R5bGUubGVmdCwgb2xkUnNMZWZ0ID0gZWxbJ3J1bnRpbWVTdHlsZSddLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsWydydW50aW1lU3R5bGUnXS5sZWZ0ID0gZWxbJ2N1cnJlbnRTdHlsZSddLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSB2YWx1ZSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsLnN0eWxlWydwaXhlbExlZnQnXSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSBvbGRMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBlbFsncnVudGltZVN0eWxlJ10ubGVmdCA9IG9sZFJzTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0pKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LlxuICAgICAqL1xuICAgIHN0YXRpYyB2aWV3cG9ydFNpemUoKSB7XG4gICAgICAgIGxldCBvYmogPSB7d2lkdGg6dW5kZWZpbmVkLCBoZWlnaHQ6dW5kZWZpbmVkfTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgb2JqLndpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgICAgICAgICAgb2JqLmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqLndpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgICAgIG9iai5oZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRvZG86IG5hdGl2ZVxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHsgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb3B5VG9DbGlwYm9hcmQoc3RyOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOyAgLy8gQ3JlYXRlIGEgPHRleHRhcmVhPiBlbGVtZW50XG4gICAgICAgIGVsLnZhbHVlID0gc3RyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBpdHMgdmFsdWUgdG8gdGhlIHN0cmluZyB0aGF0IHlvdSB3YW50IGNvcGllZFxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJycpOyAgICAgICAgICAgICAgICAvLyBNYWtlIGl0IHJlYWRvbmx5IHRvIGJlIHRhbXBlci1wcm9vZlxuICAgICAgICBlbC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGVsLnN0eWxlLmxlZnQgPSAnLTk5OTlweCc7ICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb3V0c2lkZSB0aGUgc2NyZWVuIHRvIG1ha2UgaXQgaW52aXNpYmxlXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpOyAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgPHRleHRhcmVhPiBlbGVtZW50IHRvIHRoZSBIVE1MIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID1cbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpLnJhbmdlQ291bnQgPiAwICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgY29udGVudCBzZWxlY3RlZCBwcmV2aW91c2x5XG4gICAgICAgICAgICAgICAgPyBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KDApICAgICAvLyBTdG9yZSBzZWxlY3Rpb24gaWYgZm91bmRcbiAgICAgICAgICAgICAgICA6IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgZmFsc2UgdG8ga25vdyBubyBzZWxlY3Rpb24gZXhpc3RlZCBiZWZvcmVcbiAgICAgICAgZWwuc2VsZWN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSA8dGV4dGFyZWE+IGNvbnRlbnRcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgICAgICAgICAgICAgICAgICAgLy8gQ29weSAtIG9ubHkgd29ya3MgYXMgYSByZXN1bHQgb2YgYSB1c2VyIGFjdGlvbiAoZS5nLiBjbGljayBldmVudHMpXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpOyAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgPHRleHRhcmVhPiBlbGVtZW50XG4gICAgICAgIGlmIChzZWxlY3RlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgc2VsZWN0aW9uIGV4aXN0ZWQgYmVmb3JlIGNvcHlpbmdcbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOyAgICAvLyBVbnNlbGVjdCBldmVyeXRoaW5nIG9uIHRoZSBIVE1MIGRvY3VtZW50XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS5hZGRSYW5nZShzZWxlY3RlZCk7ICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgc2VsZWN0aW9uXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZmFkZUluKGVsOiBIVE1MRWxlbWVudCwgZHVyYXRpb246IG51bWJlciA9IDMwMCwgZGVsYXk6IG51bWJlciA9IDAsIGRpc3BsYXk6IHN0cmluZyA9ICdibG9jaycpe1xuICAgICAgICBsZXQgc3RlcCA9ICgxIC8gZHVyYXRpb24pICogMTA7XG4gICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5O1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIChmdW5jdGlvbiBmYWRlKCkge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBwYXJzZUZsb2F0KGVsLnN0eWxlLm9wYWNpdHkpO1xuICAgICAgICAgICAgICAgIGlmICghKCh2YWwgKz0gc3RlcCkgPiAxKSkge1xuICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gdmFsLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmYWRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZhZGVPdXQoZWw6IEhUTUxFbGVtZW50LCBkdXJhdGlvbjogbnVtYmVyID0gMzAwLCBkZWxheTogbnVtYmVyID0gMCwgdmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlKXtcbiAgICAgICAgbGV0IHN0ZXAgPSAoMSAvIGR1cmF0aW9uKSAqIDEwO1xuICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIChmdW5jdGlvbiBmYWRlKCkge1xuICAgICAgICAgICAgICAgIGxldCBvcGFjaXR5OiBudW1iZXIgPSBOdW1iZXIoZWwuc3R5bGUub3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgb3BhY2l0eSA9IG9wYWNpdHkgLSBzdGVwO1xuICAgICAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSBvcGFjaXR5LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wYWNpdHkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmFkZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfSwgZGVsYXkpO1xuXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFVybFBhcmFtZXRlckJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gUmVnRXhwKCdbPyZdJyArIG5hbWUgKyAnPShbXiZdKiknKS5leGVjKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICByZXR1cm4gbWF0Y2ggJiYgZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzFdLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcbiAgICB9XG5cblxufVxuIl19