UNPKG

@dllcn/ngx-clipboard

Version:
290 lines 22.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Inject, Injectable, Optional } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { WINDOW } from 'ngx-window-token'; import { Subject } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "ngx-window-token"; // The following code is heavily copy from https://github.com/zenorocha/clipboard.js var ClipboardService = /** @class */ (function () { function ClipboardService(document, window) { this.document = document; this.window = window; this.copySubject = new Subject(); this.copyResponse$ = this.copySubject.asObservable(); } Object.defineProperty(ClipboardService.prototype, "isSupported", { get: /** * @return {?} */ function () { return !!this.document.queryCommandSupported && !!this.document.queryCommandSupported('copy') && !!this.window; }, enumerable: true, configurable: true }); /** * @param {?} element * @return {?} */ ClipboardService.prototype.isTargetValid = /** * @param {?} element * @return {?} */ function (element) { if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) { if (element.hasAttribute('disabled')) { throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); } return true; } throw new Error('Target should be input or textarea'); }; /** * copyFromInputElement */ /** * copyFromInputElement * @param {?} targetElm * @return {?} */ ClipboardService.prototype.copyFromInputElement = /** * copyFromInputElement * @param {?} targetElm * @return {?} */ function (targetElm) { try { this.selectTarget(targetElm); /** @type {?} */ var re = this.copyText(); this.clearSelection(targetElm, this.window); return re && this.isCopySuccessInIE11(); } catch (error) { return false; } }; // this is for IE11 return true even if copy fail // this is for IE11 return true even if copy fail /** * @return {?} */ ClipboardService.prototype.isCopySuccessInIE11 = // this is for IE11 return true even if copy fail /** * @return {?} */ function () { /** @type {?} */ var clipboardData = this.window['clipboardData']; if (clipboardData && clipboardData.getData) { if (!clipboardData.getData('Text')) { return false; } } return true; }; /** * Creates a fake textarea element, sets its value from `text` property, * and makes a selection on it. */ /** * Creates a fake textarea element, sets its value from `text` property, * and makes a selection on it. * @param {?} content * @param {?=} container * @return {?} */ ClipboardService.prototype.copyFromContent = /** * Creates a fake textarea element, sets its value from `text` property, * and makes a selection on it. * @param {?} content * @param {?=} container * @return {?} */ function (content, container) { if (container === void 0) { container = this.window.document.body; } // check if the temp textarea still belongs to the current container. // In case we have multiple places using ngx-clipboard, one is in a modal using container but the other one is not. if (this.tempTextArea && !container.contains(this.tempTextArea)) { this.destroy(this.tempTextArea.parentElement); } if (!this.tempTextArea) { this.tempTextArea = this.createTempTextArea(this.document, this.window); try { container.appendChild(this.tempTextArea); } catch (error) { throw new Error('Container should be a Dom element'); } } this.tempTextArea.value = content; return this.copyFromInputElement(this.tempTextArea); }; // remove temporary textarea if any // remove temporary textarea if any /** * @param {?=} container * @return {?} */ ClipboardService.prototype.destroy = // remove temporary textarea if any /** * @param {?=} container * @return {?} */ function (container) { if (container === void 0) { container = this.window.document.body; } if (this.tempTextArea) { container.removeChild(this.tempTextArea); // removeChild doesn't remove the reference from memory this.tempTextArea = undefined; } }; // select the target html input element // select the target html input element /** * @private * @param {?} inputElement * @return {?} */ ClipboardService.prototype.selectTarget = // select the target html input element /** * @private * @param {?} inputElement * @return {?} */ function (inputElement) { inputElement.select(); inputElement.setSelectionRange(0, inputElement.value.length); return inputElement.value.length; }; /** * @private * @return {?} */ ClipboardService.prototype.copyText = /** * @private * @return {?} */ function () { return this.document.execCommand('copy'); }; // Moves focus away from `target` and back to the trigger, removes current selection. // Moves focus away from `target` and back to the trigger, removes current selection. /** * @private * @param {?} inputElement * @param {?} window * @return {?} */ ClipboardService.prototype.clearSelection = // Moves focus away from `target` and back to the trigger, removes current selection. /** * @private * @param {?} inputElement * @param {?} window * @return {?} */ function (inputElement, window) { // tslint:disable-next-line:no-unused-expression inputElement && inputElement.focus(); window.getSelection().removeAllRanges(); }; // create a fake textarea for copy command // create a fake textarea for copy command /** * @private * @param {?} doc * @param {?} window * @return {?} */ ClipboardService.prototype.createTempTextArea = // create a fake textarea for copy command /** * @private * @param {?} doc * @param {?} window * @return {?} */ function (doc, window) { /** @type {?} */ var isRTL = doc.documentElement.getAttribute('dir') === 'rtl'; /** @type {?} */ var ta; ta = doc.createElement('textarea'); // Prevent zooming on iOS ta.style.fontSize = '12pt'; // Reset box model ta.style.border = '0'; ta.style.padding = '0'; ta.style.margin = '0'; // Move element out of screen horizontally ta.style.position = 'absolute'; ta.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically /** @type {?} */ var yPosition = window.pageYOffset || doc.documentElement.scrollTop; ta.style.top = yPosition + 'px'; ta.setAttribute('readonly', ''); return ta; }; /** * Pushes copy operation response to copySubject, to provide global access * to the response. */ /** * Pushes copy operation response to copySubject, to provide global access * to the response. * @param {?} response * @return {?} */ ClipboardService.prototype.pushCopyReponse = /** * Pushes copy operation response to copySubject, to provide global access * to the response. * @param {?} response * @return {?} */ function (response) { this.copySubject.next(response); }; ClipboardService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ ClipboardService.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [WINDOW,] }] } ]; }; /** @nocollapse */ ClipboardService.ngInjectableDef = i0.defineInjectable({ factory: function ClipboardService_Factory() { return new ClipboardService(i0.inject(i1.DOCUMENT), i0.inject(i2.WINDOW, 8)); }, token: ClipboardService, providedIn: "root" }); return ClipboardService; }()); export { ClipboardService }; if (false) { /** * @type {?} * @private */ ClipboardService.prototype.tempTextArea; /** * @type {?} * @private */ ClipboardService.prototype.copySubject; /** @type {?} */ ClipboardService.prototype.copyResponse$; /** @type {?} */ ClipboardService.prototype.document; /** * @type {?} * @private */ ClipboardService.prototype.window; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNsaXBib2FyZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRsbGNuL25neC1jbGlwYm9hcmQvIiwic291cmNlcyI6WyJsaWIvbmd4LWNsaXBib2FyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7OztBQUszQztJQU9JLDBCQUM2QixRQUFhLEVBQ0YsTUFBVztRQUR0QixhQUFRLEdBQVIsUUFBUSxDQUFLO1FBQ0YsV0FBTSxHQUFOLE1BQU0sQ0FBSztRQUwzQyxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFzQixDQUFDO1FBQ2pELGtCQUFhLEdBQW1DLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFLcEYsQ0FBQztJQUVKLHNCQUFXLHlDQUFXOzs7O1FBQXRCO1lBQ0ksT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNuSCxDQUFDOzs7T0FBQTs7Ozs7SUFFTSx3Q0FBYTs7OztJQUFwQixVQUFxQixPQUErQztRQUNoRSxJQUFJLE9BQU8sWUFBWSxnQkFBZ0IsSUFBSSxPQUFPLFlBQVksbUJBQW1CLEVBQUU7WUFDL0UsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLG1GQUFtRixDQUFDLENBQUM7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QUcsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNoQyxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoQyxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7SUFDSSwwQ0FBZTs7Ozs7O0lBQXRCLFVBQXVCLFFBQTRCO1FBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O2dCQS9ISixVQUFVLFNBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzs7O2dEQVF6QixNQUFNLFNBQUMsUUFBUTtnREFDZixRQUFRLFlBQUksTUFBTSxTQUFDLE1BQU07OzsyQkFsQmxDO0NBeUlDLEFBaElELElBZ0lDO1NBL0hZLGdCQUFnQjs7Ozs7O0lBQ3pCLHdDQUFzRDs7Ozs7SUFFdEQsdUNBQXdEOztJQUN4RCx5Q0FBdUY7O0lBR25GLG9DQUFzQzs7Ozs7SUFDdEMsa0NBQStDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBXSU5ET1cgfSBmcm9tICduZ3gtd2luZG93LXRva2VuJztcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElDbGlwYm9hcmRSZXNwb25zZSB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIGhlYXZpbHkgY29weSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS96ZW5vcm9jaGEvY2xpcGJvYXJkLmpzXG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ2xpcGJvYXJkU2VydmljZSB7XG4gICAgcHJpdmF0ZSB0ZW1wVGV4dEFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICBwcml2YXRlIGNvcHlTdWJqZWN0ID0gbmV3IFN1YmplY3Q8SUNsaXBib2FyZFJlc3BvbnNlPigpO1xuICAgIHB1YmxpYyBjb3B5UmVzcG9uc2UkOiBPYnNlcnZhYmxlPElDbGlwYm9hcmRSZXNwb25zZT4gPSB0aGlzLmNvcHlTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHB1YmxpYyBkb2N1bWVudDogYW55LFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFdJTkRPVykgcHJpdmF0ZSB3aW5kb3c6IGFueVxuICAgICkge31cblxuICAgIHB1YmxpYyBnZXQgaXNTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkICYmICEhdGhpcy5kb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQoJ2NvcHknKSAmJiAhIXRoaXMud2luZG93O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1RhcmdldFZhbGlkKGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgYXR0cmlidXRlLiBQbGVhc2UgdXNlIFwicmVhZG9ubHlcIiBpbnN0ZWFkIG9mIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IHNob3VsZCBiZSBpbnB1dCBvciB0ZXh0YXJlYScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNvcHlGcm9tSW5wdXRFbGVtZW50XG4gICAgICovXG4gICAgcHVibGljIGNvcHlGcm9tSW5wdXRFbGVtZW50KHRhcmdldEVsbTogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0VGFyZ2V0KHRhcmdldEVsbSk7XG4gICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuY29weVRleHQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24odGFyZ2V0RWxtLCB0aGlzLndpbmRvdyk7XG4gICAgICAgICAgICByZXR1cm4gcmUgJiYgdGhpcy5pc0NvcHlTdWNjZXNzSW5JRTExKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGlzIGlzIGZvciBJRTExIHJldHVybiB0cnVlIGV2ZW4gaWYgY29weSBmYWlsXG4gICAgaXNDb3B5U3VjY2Vzc0luSUUxMSgpIHtcbiAgICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IHRoaXMud2luZG93WydjbGlwYm9hcmREYXRhJ107XG4gICAgICAgIGlmIChjbGlwYm9hcmREYXRhICYmIGNsaXBib2FyZERhdGEuZ2V0RGF0YSkge1xuICAgICAgICAgICAgaWYgKCFjbGlwYm9hcmREYXRhLmdldERhdGEoJ1RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmFrZSB0ZXh0YXJlYSBlbGVtZW50LCBzZXRzIGl0cyB2YWx1ZSBmcm9tIGB0ZXh0YCBwcm9wZXJ0eSxcbiAgICAgKiBhbmQgbWFrZXMgYSBzZWxlY3Rpb24gb24gaXQuXG4gICAgICovXG4gICAgcHVibGljIGNvcHlGcm9tQ29udGVudChjb250ZW50OiBzdHJpbmcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0ZW1wIHRleHRhcmVhIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgY29udGFpbmVyLlxuICAgICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgbXVsdGlwbGUgcGxhY2VzIHVzaW5nIG5neC1jbGlwYm9hcmQsIG9uZSBpcyBpbiBhIG1vZGFsIHVzaW5nIGNvbnRhaW5lciBidXQgdGhlIG90aGVyIG9uZSBpcyBub3QuXG4gICAgICAgIGlmICh0aGlzLnRlbXBUZXh0QXJlYSAmJiAhY29udGFpbmVyLmNvbnRhaW5zKHRoaXMudGVtcFRleHRBcmVhKSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KHRoaXMudGVtcFRleHRBcmVhLnBhcmVudEVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnRlbXBUZXh0QXJlYSkge1xuICAgICAgICAgICAgdGhpcy50ZW1wVGV4dEFyZWEgPSB0aGlzLmNyZWF0ZVRlbXBUZXh0QXJlYSh0aGlzLmRvY3VtZW50LCB0aGlzLndpbmRvdyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnRlbXBUZXh0QXJlYSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGFpbmVyIHNob3VsZCBiZSBhIERvbSBlbGVtZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZW1wVGV4dEFyZWEudmFsdWUgPSBjb250ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5jb3B5RnJvbUlucHV0RWxlbWVudCh0aGlzLnRlbXBUZXh0QXJlYSk7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHRlbXBvcmFyeSB0ZXh0YXJlYSBpZiBhbnlcbiAgICBwdWJsaWMgZGVzdHJveShjb250YWluZXI6IEhUTUxFbGVtZW50ID0gdGhpcy53aW5kb3cuZG9jdW1lbnQuYm9keSkge1xuICAgICAgICBpZiAodGhpcy50ZW1wVGV4dEFyZWEpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLnRlbXBUZXh0QXJlYSk7XG4gICAgICAgICAgICAvLyByZW1vdmVDaGlsZCBkb2Vzbid0IHJlbW92ZSB0aGUgcmVmZXJlbmNlIGZyb20gbWVtb3J5XG4gICAgICAgICAgICB0aGlzLnRlbXBUZXh0QXJlYSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNlbGVjdCB0aGUgdGFyZ2V0IGh0bWwgaW5wdXQgZWxlbWVudFxuICAgIHByaXZhdGUgc2VsZWN0VGFyZ2V0KGlucHV0RWxlbWVudDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpbnB1dEVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIGlucHV0RWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBpbnB1dEVsZW1lbnQudmFsdWUubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb3B5VGV4dCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICB9XG4gICAgLy8gTW92ZXMgZm9jdXMgYXdheSBmcm9tIGB0YXJnZXRgIGFuZCBiYWNrIHRvIHRoZSB0cmlnZ2VyLCByZW1vdmVzIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgIHByaXZhdGUgY2xlYXJTZWxlY3Rpb24oaW5wdXRFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCwgd2luZG93OiBXaW5kb3cpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgIGlucHV0RWxlbWVudCAmJiBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhIGZha2UgdGV4dGFyZWEgZm9yIGNvcHkgY29tbWFuZFxuICAgIHByaXZhdGUgY3JlYXRlVGVtcFRleHRBcmVhKGRvYzogRG9jdW1lbnQsIHdpbmRvdzogV2luZG93KTogSFRNTFRleHRBcmVhRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGlzUlRMID0gZG9jLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpID09PSAncnRsJztcbiAgICAgICAgbGV0IHRhOiBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgICAgICB0YSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgICAvLyBQcmV2ZW50IHpvb21pbmcgb24gaU9TXG4gICAgICAgIHRhLnN0eWxlLmZvbnRTaXplID0gJzEycHQnO1xuICAgICAgICAvLyBSZXNldCBib3ggbW9kZWxcbiAgICAgICAgdGEuc3R5bGUuYm9yZGVyID0gJzAnO1xuICAgICAgICB0YS5zdHlsZS5wYWRkaW5nID0gJzAnO1xuICAgICAgICB0YS5zdHlsZS5tYXJnaW4gPSAnMCc7XG4gICAgICAgIC8vIE1vdmUgZWxlbWVudCBvdXQgb2Ygc2NyZWVuIGhvcml6b250YWxseVxuICAgICAgICB0YS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRhLnN0eWxlW2lzUlRMID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSAnLTk5OTlweCc7XG4gICAgICAgIC8vIE1vdmUgZWxlbWVudCB0byB0aGUgc2FtZSBwb3NpdGlvbiB2ZXJ0aWNhbGx5XG4gICAgICAgIGNvbnN0IHlQb3NpdGlvbiA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgdGEuc3R5bGUudG9wID0geVBvc2l0aW9uICsgJ3B4JztcbiAgICAgICAgdGEuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgICAgICAgcmV0dXJuIHRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1c2hlcyBjb3B5IG9wZXJhdGlvbiByZXNwb25zZSB0byBjb3B5U3ViamVjdCwgdG8gcHJvdmlkZSBnbG9iYWwgYWNjZXNzXG4gICAgICogdG8gdGhlIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBwdXNoQ29weVJlcG9uc2UocmVzcG9uc2U6IElDbGlwYm9hcmRSZXNwb25zZSkge1xuICAgICAgICB0aGlzLmNvcHlTdWJqZWN0Lm5leHQocmVzcG9uc2UpO1xuICAgIH1cbn1cbiJdfQ==