@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
350 lines • 27.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, HostBinding, ViewChild, HostListener, SecurityContext } from '@angular/core';
import * as prism from 'prismjs';
import 'prismjs/components/prism-markup-templating.js';
import 'prismjs/components/prism-typescript';
import 'prismjs/components/prism-php';
import 'prismjs/components/prism-ruby';
import 'prismjs/components/prism-json';
import 'prismjs/components/prism-java';
import 'prismjs/components/prism-markdown';
import 'prismjs/components/prism-scss';
import 'prismjs/components/prism-swift';
import { DomSanitizer } from '@angular/platform-browser';
/** @enum {string} */
var SnippetType = {
single: 'single',
multi: 'multi',
inline: 'inline',
};
export { SnippetType };
/** @enum {string} */
var SnippetLanguage = {
javascript: 'javascript',
json: 'json',
typescript: 'typescript',
markup: 'markup',
markdown: 'markdown',
php: 'php',
ruby: 'ruby',
scss: 'scss',
css: 'css',
html: 'html',
xml: 'xml',
clike: 'clike',
java: 'java',
swift: 'swift',
};
export { SnippetLanguage };
var CodeSnippet = /** @class */ (function () {
/**
* Creates an instance of CodeSnippet.
*/
function CodeSnippet(sanitizer) {
this.sanitizer = sanitizer;
/**
* It can be `"single"`, `"multi"` or `"inline"`
*/
this.display = SnippetType.single;
/**
* Text displayed in the tooltip when user clicks button to copy code.
*
*/
this.feedbackText = 'Copiado'; // TODO: i18n
/**
* Snippet highlight language
*
*/
this.language = SnippetLanguage.javascript;
/**
* Time in miliseconds to keep the feedback tooltip displayed.
*
*/
this.feedbackTimeout = 3000;
/**
* Set to `true` to show an expanded code snippet.
*/
this.expanded = false;
/**
* Set to `true` to show a loading code snippet.
*/
this.skeleton = false;
this.snippetClass = true;
this.showFeedback = false;
CodeSnippet.codeSnippetCount++;
}
Object.defineProperty(CodeSnippet.prototype, "snippetSingleClass", {
get: /**
* @return {?}
*/
function () {
return this.display === SnippetType.single;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CodeSnippet.prototype, "snippetMultiClass", {
get: /**
* @return {?}
*/
function () {
return this.display === SnippetType.multi;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CodeSnippet.prototype, "snippetInlineClass", {
get: /**
* @return {?}
*/
function () {
return this.display === SnippetType.inline;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CodeSnippet.prototype, "btnCopyClass", {
get: /**
* @return {?}
*/
function () {
return this.display === SnippetType.inline;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CodeSnippet.prototype, "displayStyle", {
get: /**
* @return {?}
*/
function () {
return this.display !== SnippetType.inline ? 'block' : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CodeSnippet.prototype, "attrType", {
get: /**
* @return {?}
*/
function () {
return this.display === SnippetType.inline ? 'button' : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CodeSnippet.prototype, "shouldShowExpandButton", {
get: /**
* @return {?}
*/
function () {
return this.code ? this.code.nativeElement.getBoundingClientRect().height > 255 : false;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
CodeSnippet.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.highlight) {
this.content = prism.highlight(this.content, prism.languages[this.language], this.language);
}
this.codeHtml = this.sanitizer.sanitize(SecurityContext.HTML, this.content);
};
/**
* @return {?}
*/
CodeSnippet.prototype.toggleSnippetExpansion = /**
* @return {?}
*/
function () {
this.expanded = !this.expanded;
};
/**
* Copies the code from the `<code>` block to clipboard.
*/
/**
* Copies the code from the `<code>` block to clipboard.
* @return {?}
*/
CodeSnippet.prototype.copyCode = /**
* Copies the code from the `<code>` block to clipboard.
* @return {?}
*/
function () {
// create invisible, uneditable textarea with our code in it
/** @type {?} */
var textarea = document.createElement('textarea');
textarea.value = this.code.nativeElement.innerText || this.code.nativeElement.textContent;
textarea.setAttribute('readonly', '');
textarea.style.position = 'absolute';
textarea.style.right = '-99999px';
document.body.appendChild(textarea);
// save user selection
/** @type {?} */
var selected = document.getSelection().rangeCount ? document.getSelection().getRangeAt(0) : null;
// copy to clipboard
textarea.select();
document.execCommand('copy');
// remove textarea
document.body.removeChild(textarea);
// restore user selection
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
};
/**
* On copy button click, copies the code and shows feedback.
*/
/**
* On copy button click, copies the code and shows feedback.
* @return {?}
*/
CodeSnippet.prototype.onCopyButtonClicked = /**
* On copy button click, copies the code and shows feedback.
* @return {?}
*/
function () {
var _this = this;
this.copyCode();
this.showFeedback = true;
setTimeout((/**
* @return {?}
*/
function () {
_this.showFeedback = false;
}), this.feedbackTimeout);
};
/**
* Inline code snippet acts as button and makes the whole component clickable.
*
* This handles clicks in that case.
*/
/**
* Inline code snippet acts as button and makes the whole component clickable.
*
* This handles clicks in that case.
* @return {?}
*/
CodeSnippet.prototype.hostClick = /**
* Inline code snippet acts as button and makes the whole component clickable.
*
* This handles clicks in that case.
* @return {?}
*/
function () {
if (this.display !== SnippetType.inline) {
return;
}
this.onCopyButtonClicked();
};
/**
* Variable used for creating unique ids for code-snippet components.
*/
CodeSnippet.codeSnippetCount = 0;
CodeSnippet.decorators = [
{ type: Component, args: [{
selector: 'suka-code-snippet',
template: "\n <ng-container *ngIf=\"display === 'inline'; else notInline\">\n <span\n sukaTooltip=\"Copiado\"\n tooltipTrigger=\"click\"\n tooltipDuration=\"3000\"\n >\n <ng-container *ngTemplateOutlet=\"codeTemplate\"></ng-container>\n </span>\n </ng-container>\n\n <ng-template #notInline>\n <div class=\"snippet-container\" attr.aria-label=\"Copy code snippet\">\n <ng-container *ngIf=\"skeleton\">\n <span *ngIf=\"display === 'single'; else multiSkeleton\"></span>\n <ng-template #multiSkeleton>\n <span></span>\n <span></span>\n <span></span>\n </ng-template>\n </ng-container>\n <pre *ngIf=\"!skeleton\"><ng-container *ngTemplateOutlet=\"codeTemplate\"></ng-container></pre>\n </div>\n\n <button\n *ngIf=\"!skeleton\"\n class=\"snippet-button\"\n attr.aria-label=\"Copiar\"\n (click)=\"onCopyButtonClicked()\"\n [ngClass]=\"{\n 'snippet-button--copied': showFeedback\n }\"\n sukaTooltip=\"Copiado\"\n tooltipTrigger=\"click\"\n tooltipDuration=\"3000\"\n tabindex=\"0\">\n <suka-icon icon=\"copy\"></suka-icon>\n </button>\n\n <button\n *ngIf=\"display === 'multi' && shouldShowExpandButton\"\n class=\"btn snippet-btn--expand\"\n (click)=\"toggleSnippetExpansion()\"\n type=\"button\">\n <span class=\"snippet-btn--text\">{{expanded ? 'Mostrar menos' : 'Mostrar mas'}}\n <suka-icon icon=\"chevron-down\"></suka-icon>\n </span>\n </button>\n </ng-template>\n <ng-template #codeTemplate>\n <code #code [innerHtml]=\"codeHtml\"></code>\n </ng-template>\n "
}] }
];
/** @nocollapse */
CodeSnippet.ctorParameters = function () { return [
{ type: DomSanitizer }
]; };
CodeSnippet.propDecorators = {
display: [{ type: Input }],
feedbackText: [{ type: Input }],
content: [{ type: Input }],
highlight: [{ type: Input }],
language: [{ type: Input }],
feedbackTimeout: [{ type: Input }],
expanded: [{ type: HostBinding, args: ['class.snippet--expand',] }, { type: Input }],
skeleton: [{ type: HostBinding, args: ['class.skeleton',] }, { type: Input }],
snippetClass: [{ type: HostBinding, args: ['class.snippet',] }],
snippetSingleClass: [{ type: HostBinding, args: ['class.snippet--single',] }],
snippetMultiClass: [{ type: HostBinding, args: ['class.snippet--multi',] }],
snippetInlineClass: [{ type: HostBinding, args: ['class.snippet--inline',] }],
btnCopyClass: [{ type: HostBinding, args: ['class.btn--copy',] }],
displayStyle: [{ type: HostBinding, args: ['style.display',] }],
attrType: [{ type: HostBinding, args: ['attr.type',] }],
code: [{ type: ViewChild, args: ['code', { static: false },] }],
hostClick: [{ type: HostListener, args: ['click',] }]
};
return CodeSnippet;
}());
export { CodeSnippet };
if (false) {
/**
* Variable used for creating unique ids for code-snippet components.
* @type {?}
*/
CodeSnippet.codeSnippetCount;
/** @type {?} */
CodeSnippet.prototype.codeHtml;
/**
* It can be `"single"`, `"multi"` or `"inline"`
* @type {?}
*/
CodeSnippet.prototype.display;
/**
* Text displayed in the tooltip when user clicks button to copy code.
*
* @type {?}
*/
CodeSnippet.prototype.feedbackText;
/**
* Code content
*
* @type {?}
*/
CodeSnippet.prototype.content;
/**
* Code highlight
*
* @type {?}
*/
CodeSnippet.prototype.highlight;
/**
* Snippet highlight language
*
* @type {?}
*/
CodeSnippet.prototype.language;
/**
* Time in miliseconds to keep the feedback tooltip displayed.
*
* @type {?}
*/
CodeSnippet.prototype.feedbackTimeout;
/**
* Set to `true` to show an expanded code snippet.
* @type {?}
*/
CodeSnippet.prototype.expanded;
/**
* Set to `true` to show a loading code snippet.
* @type {?}
*/
CodeSnippet.prototype.skeleton;
/** @type {?} */
CodeSnippet.prototype.snippetClass;
/** @type {?} */
CodeSnippet.prototype.code;
/** @type {?} */
CodeSnippet.prototype.showFeedback;
/**
* @type {?}
* @private
*/
CodeSnippet.prototype.sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1zbmlwcGV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9jb2RlLXNuaXBwZXQvY29kZS1zbmlwcGV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBRVosZUFBZSxFQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLCtDQUErQyxDQUFDO0FBQ3ZELE9BQU8scUNBQXFDLENBQUM7QUFDN0MsT0FBTyw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sK0JBQStCLENBQUM7QUFDdkMsT0FBTywrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7OztJQUdqRSxRQUFTLFFBQVE7SUFDakIsT0FBUSxPQUFPO0lBQ2YsUUFBUyxRQUFROzs7OztJQUlqQixZQUFjLFlBQVk7SUFDMUIsTUFBYyxNQUFNO0lBQ3BCLFlBQWMsWUFBWTtJQUMxQixRQUFjLFFBQVE7SUFDdEIsVUFBYyxVQUFVO0lBQ3hCLEtBQWMsS0FBSztJQUNuQixNQUFjLE1BQU07SUFDcEIsTUFBYyxNQUFNO0lBQ3BCLEtBQWMsS0FBSztJQUNuQixNQUFjLE1BQU07SUFDcEIsS0FBYyxLQUFLO0lBQ25CLE9BQWMsT0FBTztJQUNyQixNQUFjLE1BQU07SUFDcEIsT0FBYyxPQUFPOzs7QUFHdkI7SUF5SUU7O09BRUc7SUFDSCxxQkFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYzs7OztRQXpFbEMsWUFB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QWdCLEdBQUcsQ0FBQyxDQUFDOztnQkE3RDdCLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixRQUFRLEVBQUUscXVEQW9EVDtpQkFDRjs7OztnQkFoRlEsWUFBWTs7OzBCQTRGbEIsS0FBSzsrQkFLTCxLQUFLOzBCQU1MLEtBQUs7NEJBTUwsS0FBSzsyQkFNTCxLQUFLO2tDQU1MLEtBQUs7MkJBS0wsV0FBVyxTQUFDLHVCQUF1QixjQUFHLEtBQUs7MkJBSzNDLFdBQVcsU0FBQyxnQkFBZ0IsY0FBRyxLQUFLOytCQUVwQyxXQUFXLFNBQUMsZUFBZTtxQ0FDM0IsV0FBVyxTQUFDLHVCQUF1QjtvQ0FHbkMsV0FBVyxTQUFDLHNCQUFzQjtxQ0FHbEMsV0FBVyxTQUFDLHVCQUF1QjsrQkFHbkMsV0FBVyxTQUFDLGlCQUFpQjsrQkFJN0IsV0FBVyxTQUFDLGVBQWU7MkJBRzNCLFdBQVcsU0FBQyxXQUFXO3VCQUl2QixTQUFTLFNBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs0QkEwRW5DLFlBQVksU0FBQyxPQUFPOztJQVF2QixrQkFBQztDQUFBLEFBbk5ELElBbU5DO1NBMUpZLFdBQVc7Ozs7OztJQUl0Qiw2QkFBNEI7O0lBQzVCLCtCQUEwQjs7Ozs7SUFLMUIsOEJBQW1EOzs7Ozs7SUFLbkQsbUNBQWtDOzs7Ozs7SUFNbEMsOEJBQXlCOzs7Ozs7SUFNekIsZ0NBQTBCOzs7Ozs7SUFNMUIsK0JBQWdFOzs7Ozs7SUFNaEUsc0NBQWdDOzs7OztJQUtoQywrQkFBZ0U7Ozs7O0lBS2hFLCtCQUF5RDs7SUFFekQsbUNBQWtEOztJQXFCbEQsMkJBQTJDOztJQU0zQyxtQ0FBcUI7Ozs7O0lBS1QsZ0NBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIFZpZXdDaGlsZCxcbiAgSG9zdExpc3RlbmVyLFxuICBPbkluaXQsXG4gIFNlY3VyaXR5Q29udGV4dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIHByaXNtIGZyb20gJ3ByaXNtanMnO1xuaW1wb3J0ICdwcmlzbWpzL2NvbXBvbmVudHMvcHJpc20tbWFya3VwLXRlbXBsYXRpbmcuanMnO1xuaW1wb3J0ICdwcmlzbWpzL2NvbXBvbmVudHMvcHJpc20tdHlwZXNjcmlwdCc7XG5pbXBvcnQgJ3ByaXNtanMvY29tcG9uZW50cy9wcmlzbS1waHAnO1xuaW1wb3J0ICdwcmlzbWpzL2NvbXBvbmVudHMvcHJpc20tcnVieSc7XG5pbXBvcnQgJ3ByaXNtanMvY29tcG9uZW50cy9wcmlzbS1qc29uJztcbmltcG9ydCAncHJpc21qcy9jb21wb25lbnRzL3ByaXNtLWphdmEnO1xuaW1wb3J0ICdwcmlzbWpzL2NvbXBvbmVudHMvcHJpc20tbWFya2Rvd24nO1xuaW1wb3J0ICdwcmlzbWpzL2NvbXBvbmVudHMvcHJpc20tc2Nzcyc7XG5pbXBvcnQgJ3ByaXNtanMvY29tcG9uZW50cy9wcmlzbS1zd2lmdCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmV4cG9ydCBlbnVtIFNuaXBwZXRUeXBlIHtcbiAgc2luZ2xlID0gJ3NpbmdsZScsXG4gIG11bHRpID0gJ211bHRpJyxcbiAgaW5saW5lID0gJ2lubGluZSdcbn1cblxuZXhwb3J0IGVudW0gU25pcHBldExhbmd1YWdlIHtcbiAgamF2YXNjcmlwdCAgPSAnamF2YXNjcmlwdCcsXG4gIGpzb24gICAgICAgID0gJ2pzb24nLFxuICB0eXBlc2NyaXB0ICA9ICd0eXBlc2NyaXB0JyxcbiAgbWFya3VwICAgICAgPSAnbWFya3VwJyxcbiAgbWFya2Rvd24gICAgPSAnbWFya2Rvd24nLFxuICBwaHAgICAgICAgICA9ICdwaHAnLFxuICBydWJ5ICAgICAgICA9ICdydWJ5JyxcbiAgc2NzcyAgICAgICAgPSAnc2NzcycsXG4gIGNzcyAgICAgICAgID0gJ2NzcycsXG4gIGh0bWwgICAgICAgID0gJ2h0bWwnLFxuICB4bWwgICAgICAgICA9ICd4bWwnLFxuICBjbGlrZSAgICAgICA9ICdjbGlrZScsXG4gIGphdmEgICAgICAgID0gJ2phdmEnLFxuICBzd2lmdCAgICAgICA9ICdzd2lmdCcsXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtY29kZS1zbmlwcGV0JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheSA9PT0gJ2lubGluZSc7IGVsc2Ugbm90SW5saW5lXCI+XG4gICAgICA8c3BhblxuICAgICAgICBzdWthVG9vbHRpcD1cIkNvcGlhZG9cIlxuICAgICAgICB0b29sdGlwVHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgICAgdG9vbHRpcER1cmF0aW9uPVwiMzAwMFwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2RlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbm90SW5saW5lPlxuICAgICAgPGRpdiBjbGFzcz1cInNuaXBwZXQtY29udGFpbmVyXCIgYXR0ci5hcmlhLWxhYmVsPVwiQ29weSBjb2RlIHNuaXBwZXRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJkaXNwbGF5ID09PSAnc2luZ2xlJzsgZWxzZSBtdWx0aVNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbXVsdGlTa2VsZXRvbj5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHByZSAqbmdJZj1cIiFza2VsZXRvblwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2RlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj48L3ByZT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiIXNrZWxldG9uXCJcbiAgICAgICAgY2xhc3M9XCJzbmlwcGV0LWJ1dHRvblwiXG4gICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cIkNvcGlhclwiXG4gICAgICAgIChjbGljayk9XCJvbkNvcHlCdXR0b25DbGlja2VkKClcIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgJ3NuaXBwZXQtYnV0dG9uLS1jb3BpZWQnOiBzaG93RmVlZGJhY2tcbiAgICAgICAgfVwiXG4gICAgICAgIHN1a2FUb29sdGlwPVwiQ29waWFkb1wiXG4gICAgICAgIHRvb2x0aXBUcmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICB0b29sdGlwRHVyYXRpb249XCIzMDAwXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgIDxzdWthLWljb24gaWNvbj1cImNvcHlcIj48L3N1a2EtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheSA9PT0gJ211bHRpJyAmJiBzaG91bGRTaG93RXhwYW5kQnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJidG4gc25pcHBldC1idG4tLWV4cGFuZFwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVTbmlwcGV0RXhwYW5zaW9uKClcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic25pcHBldC1idG4tLXRleHRcIj57e2V4cGFuZGVkID8gJ01vc3RyYXIgbWVub3MnIDogJ01vc3RyYXIgbWFzJ319XG4gICAgICAgICAgPHN1a2EtaWNvbiBpY29uPVwiY2hldnJvbi1kb3duXCI+PC9zdWthLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNjb2RlVGVtcGxhdGU+XG4gICAgICA8Y29kZSAjY29kZSBbaW5uZXJIdG1sXT1cImNvZGVIdG1sXCI+PC9jb2RlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGBcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBDb2RlU25pcHBldCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBWYXJpYWJsZSB1c2VkIGZvciBjcmVhdGluZyB1bmlxdWUgaWRzIGZvciBjb2RlLXNuaXBwZXQgY29tcG9uZW50cy5cbiAgICovXG4gIHN0YXRpYyBjb2RlU25pcHBldENvdW50ID0gMDtcbiAgcHVibGljIGNvZGVIdG1sOiBTYWZlSHRtbDtcblxuICAvKipcbiAgICogSXQgY2FuIGJlIGBcInNpbmdsZVwiYCwgYFwibXVsdGlcImAgb3IgYFwiaW5saW5lXCJgXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5OiBTbmlwcGV0VHlwZSA9IFNuaXBwZXRUeXBlLnNpbmdsZTtcbiAgLyoqXG4gICAqIFRleHQgZGlzcGxheWVkIGluIHRoZSB0b29sdGlwIHdoZW4gdXNlciBjbGlja3MgYnV0dG9uIHRvIGNvcHkgY29kZS5cbiAgICpcbiAgICovXG4gIEBJbnB1dCgpIGZlZWRiYWNrVGV4dCA9ICdDb3BpYWRvJzsgLy8gVE9ETzogaTE4blxuXG4gIC8qKlxuICAgKiBDb2RlIGNvbnRlbnRcbiAgICpcbiAgICovXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ29kZSBoaWdobGlnaHRcbiAgICpcbiAgICovXG4gIEBJbnB1dCgpIGhpZ2hsaWdodDogZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNuaXBwZXQgaGlnaGxpZ2h0IGxhbmd1YWdlXG4gICAqXG4gICAqL1xuICBASW5wdXQoKSBsYW5ndWFnZTogU25pcHBldExhbmd1YWdlID0gU25pcHBldExhbmd1YWdlLmphdmFzY3JpcHQ7XG5cbiAgLyoqXG4gICAqIFRpbWUgaW4gbWlsaXNlY29uZHMgdG8ga2VlcCB0aGUgZmVlZGJhY2sgdG9vbHRpcCBkaXNwbGF5ZWQuXG4gICAqXG4gICAqL1xuICBASW5wdXQoKSBmZWVkYmFja1RpbWVvdXQgPSAzMDAwO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIHRvIHNob3cgYW4gZXhwYW5kZWQgY29kZSBzbmlwcGV0LlxuICAgKi9cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zbmlwcGV0LS1leHBhbmQnKSBASW5wdXQoKSBleHBhbmRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIHRvIHNob3cgYSBsb2FkaW5nIGNvZGUgc25pcHBldC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2tlbGV0b24nKSBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc25pcHBldCcpIHNuaXBwZXRDbGFzcyA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc25pcHBldC0tc2luZ2xlJykgZ2V0IHNuaXBwZXRTaW5nbGVDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ID09PSBTbmlwcGV0VHlwZS5zaW5nbGU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zbmlwcGV0LS1tdWx0aScpIGdldCBzbmlwcGV0TXVsdGlDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ID09PSBTbmlwcGV0VHlwZS5tdWx0aTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNuaXBwZXQtLWlubGluZScpIGdldCBzbmlwcGV0SW5saW5lQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheSA9PT0gU25pcHBldFR5cGUuaW5saW5lO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLS1jb3B5JykgZ2V0IGJ0bkNvcHlDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ID09PSBTbmlwcGV0VHlwZS5pbmxpbmU7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBnZXQgZGlzcGxheVN0eWxlKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXkgIT09IFNuaXBwZXRUeXBlLmlubGluZSA/ICdibG9jaycgOiBudWxsO1xuICB9XG4gIEBIb3N0QmluZGluZygnYXR0ci50eXBlJykgZ2V0IGF0dHJUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXkgPT09IFNuaXBwZXRUeXBlLmlubGluZSA/ICdidXR0b24nIDogbnVsbDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2NvZGUnLCB7IHN0YXRpYzogZmFsc2UgfSkgY29kZTtcblxuICBnZXQgc2hvdWxkU2hvd0V4cGFuZEJ1dHRvbigpIHtcbiAgICByZXR1cm4gdGhpcy5jb2RlID8gdGhpcy5jb2RlLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ID4gMjU1IDogZmFsc2U7XG4gIH1cblxuICBzaG93RmVlZGJhY2sgPSBmYWxzZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb2RlU25pcHBldC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcbiAgICBDb2RlU25pcHBldC5jb2RlU25pcHBldENvdW50Kys7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5oaWdobGlnaHQpIHtcbiAgICAgIHRoaXMuY29udGVudCA9IHByaXNtLmhpZ2hsaWdodCh0aGlzLmNvbnRlbnQsIHByaXNtLmxhbmd1YWdlc1t0aGlzLmxhbmd1YWdlXSwgdGhpcy5sYW5ndWFnZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlSHRtbCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCB0aGlzLmNvbnRlbnQpO1xuICB9XG5cbiAgdG9nZ2xlU25pcHBldEV4cGFuc2lvbigpIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29waWVzIHRoZSBjb2RlIGZyb20gdGhlIGA8Y29kZT5gIGJsb2NrIHRvIGNsaXBib2FyZC5cbiAgICovXG4gIHB1YmxpYyBjb3B5Q29kZSgpIHtcbiAgICAvLyBjcmVhdGUgaW52aXNpYmxlLCB1bmVkaXRhYmxlIHRleHRhcmVhIHdpdGggb3VyIGNvZGUgaW4gaXRcbiAgICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGV4dGFyZWEudmFsdWUgPSB0aGlzLmNvZGUubmF0aXZlRWxlbWVudC5pbm5lclRleHQgfHwgdGhpcy5jb2RlLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgdGV4dGFyZWEuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgICB0ZXh0YXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgdGV4dGFyZWEuc3R5bGUucmlnaHQgPSAnLTk5OTk5cHgnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dGFyZWEpO1xuXG4gICAgLy8gc2F2ZSB1c2VyIHNlbGVjdGlvblxuICAgIGNvbnN0IHNlbGVjdGVkID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCkucmFuZ2VDb3VudCA/IGRvY3VtZW50LmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCkgOiBudWxsO1xuXG4gICAgLy8gY29weSB0byBjbGlwYm9hcmRcbiAgICB0ZXh0YXJlYS5zZWxlY3QoKTtcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuXG4gICAgLy8gcmVtb3ZlIHRleHRhcmVhXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0YXJlYSk7XG5cbiAgICAvLyByZXN0b3JlIHVzZXIgc2VsZWN0aW9uXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpLmFkZFJhbmdlKHNlbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gY29weSBidXR0b24gY2xpY2ssIGNvcGllcyB0aGUgY29kZSBhbmQgc2hvd3MgZmVlZGJhY2suXG4gICAqL1xuICBvbkNvcHlCdXR0b25DbGlja2VkKCkge1xuICAgIHRoaXMuY29weUNvZGUoKTtcblxuICAgIHRoaXMuc2hvd0ZlZWRiYWNrID0gdHJ1ZTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93RmVlZGJhY2sgPSBmYWxzZTtcbiAgICB9LCB0aGlzLmZlZWRiYWNrVGltZW91dCk7XG4gIH1cblxuICAvKipcbiAgICogSW5saW5lIGNvZGUgc25pcHBldCBhY3RzIGFzIGJ1dHRvbiBhbmQgbWFrZXMgdGhlIHdob2xlIGNvbXBvbmVudCBjbGlja2FibGUuXG4gICAqXG4gICAqIFRoaXMgaGFuZGxlcyBjbGlja3MgaW4gdGhhdCBjYXNlLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBob3N0Q2xpY2soKSB7XG4gICAgaWYgKHRoaXMuZGlzcGxheSAhPT0gU25pcHBldFR5cGUuaW5saW5lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbkNvcHlCdXR0b25DbGlja2VkKCk7XG4gIH1cbn1cbiJdfQ==