ngx-extended-pdf-viewer
Version:
Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.
224 lines • 25.4 kB
JavaScript
import { Component, ContentChild, Input, ViewChild, effect } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./pdf-shy-button-service";
import * as i2 from "@angular/platform-browser";
import * as i3 from "../../pdf-notification-service";
import * as i4 from "../../pdf-csp-policy.service";
export class PdfShyButtonComponent {
pdfShyButtonServiceService;
sanitizer;
renderer;
pdfCspPolicyService;
primaryToolbarId;
secondaryMenuId;
cssClass = 'invisible';
eventBusName = undefined;
l10nId;
l10nLabel;
title;
toggled;
disabled;
order;
action = undefined;
closeOnClick = true;
onlySecondaryMenu = false;
ariaHasPopup = false;
ariaControls;
role;
PDFViewerApplication;
renderContent = false;
buttonRef;
nestedContent = null;
_imageHtml;
get imageHtml() {
if (this._imageHtml) {
// allow non-literal svg tags (sanitized in the setter)
return this.sanitizer.bypassSecurityTrustHtml(this._imageHtml); // NOSONAR
}
return undefined;
}
set image(value) {
const svgTags = [
// 'a' is not allowed!
'animate',
'animateMotion',
'animateTransform',
'audio',
'canvas',
'circle',
'clipPath',
'defs',
'desc',
'discard',
'ellipse',
'feBlend',
'feColorMatrix',
'feComponentTransfer',
'feComposite',
'feConvolveMatrix',
'feDiffuseLighting',
'feDisplacementMap',
'feDistantLight',
'feDropShadow',
'feFlood',
'feFuncA',
'feFuncB',
'feFuncG',
'feFuncR',
'feGaussianBlur',
'feImage',
'feMerge',
'feMergeNode',
'feMorphology',
'feOffset',
'fePointLight',
'feSpecularLighting',
'feSpotLight',
'feTile',
'feTurbulence',
'filter',
'foreignObject',
'g',
'iframe',
'image',
'line',
'linearGradient',
'marker',
'mask',
'metadata',
'mpath',
'path',
'pattern',
'polygon',
'polyline',
'radialGradient',
'rect',
'script',
'set',
'stop',
'style',
'svg',
'switch',
'symbol',
'text',
'textPath',
'title',
'tspan',
'unknown',
'use',
'video',
'view',
];
// only <svg> and SVG tags are allowed
const tags = value.split('<').filter((tag) => tag.length > 0);
const legal = tags.every((tag) => tag.startsWith('svg') || tag.startsWith('/') || svgTags.includes(tag.split(/\s|>/)[0]));
if (!legal) {
throw new Error('Illegal image for PDFShyButton. Only SVG images are allowed. Please use only the tags <svg> and <path>. ' + value);
}
this._imageHtml = this.pdfCspPolicyService.sanitizeHTML(value);
}
constructor(pdfShyButtonServiceService, sanitizer, renderer, notificationService, pdfCspPolicyService) {
this.pdfShyButtonServiceService = pdfShyButtonServiceService;
this.sanitizer = sanitizer;
this.renderer = renderer;
this.pdfCspPolicyService = pdfCspPolicyService;
effect(() => {
this.PDFViewerApplication = notificationService.onPDFJSInitSignal();
});
}
ngAfterViewInit() {
this.updateButtonImage();
}
ngOnInit() {
this.pdfShyButtonServiceService.add(this);
}
ngOnChanges(changes) {
this.pdfShyButtonServiceService.update(this);
}
onClick(htmlEvent) {
if (htmlEvent instanceof KeyboardEvent && htmlEvent.key !== 'Enter' && htmlEvent.key !== ' ') {
return;
}
if (this.action) {
this.action(htmlEvent, false);
htmlEvent.preventDefault();
}
else if (this.eventBusName) {
this.PDFViewerApplication?.eventBus.dispatch(this.eventBusName);
htmlEvent.preventDefault();
}
}
updateButtonImage() {
if (this.buttonRef) {
const el = this.buttonRef.nativeElement;
if (this._imageHtml) {
const temp = this.renderer.createElement('div');
this.pdfCspPolicyService.addTrustedHTML(temp, this._imageHtml);
const image = temp.children[0];
if (!el.innerHTML.includes(image.innerHTML)) {
// if using SSR, the HTML code may already be there
this.renderer.appendChild(el, image);
}
}
else {
const childNodes = el.childNodes;
for (let child of childNodes) {
this.renderer.removeChild(el, child);
}
}
}
}
ngAfterContentInit() {
if (this.primaryToolbarId === 'nestedComponent') {
this.renderContent = !!this.nestedContent;
console.log('renderContent', this.renderContent);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PdfShyButtonComponent, deps: [{ token: i1.PdfShyButtonService }, { token: i2.DomSanitizer }, { token: i0.Renderer2 }, { token: i3.PDFNotificationService }, { token: i4.PdfCspPolicyService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PdfShyButtonComponent, selector: "pdf-shy-button", inputs: { primaryToolbarId: "primaryToolbarId", secondaryMenuId: "secondaryMenuId", cssClass: "cssClass", eventBusName: "eventBusName", l10nId: "l10nId", l10nLabel: "l10nLabel", title: "title", toggled: "toggled", disabled: "disabled", order: "order", action: "action", closeOnClick: "closeOnClick", onlySecondaryMenu: "onlySecondaryMenu", ariaHasPopup: "ariaHasPopup", ariaControls: "ariaControls", role: "role", image: "image" }, queries: [{ propertyName: "nestedContent", first: true, predicate: ["nestedContent"], descendants: true }], viewQueries: [{ propertyName: "buttonRef", first: true, predicate: ["buttonRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (!onlySecondaryMenu) {\n@if (nestedContent) {\n<span (click)=\"onClick($event)\" onKeyDown=\"onClick($event)\" [class]=\"cssClass\">\n <ng-content></ng-content>\n</span>\n}\n@else {\n<button type=\"button\" [id]=\"primaryToolbarId\" class=\"toolbarButton\" [class]=\"cssClass\" [title]=\"title\"\n [attr.data-l10n-id]=\"l10nId\" [class.toggled]=\"toggled\" [disabled]=\"disabled\" (click)=\"onClick($event)\"\n [attr.aria-label]=\"title\" [attr.role]=\"role\" [attr.aria-expanded]=\"toggled ? 'true' : (ariaHasPopup ? 'false' : null)\"\n [attr.aria-haspopup]=\"ariaHasPopup\" [attr.aria-controls]=\"ariaControls\" #buttonRef></button>\n}\n}", styles: [".hidden,.always-in-secondary-menu,.visibleXXSView,.visibleTinyView,.visibleSmallView,.visibleMediumView,.visibleLargeView,.visibleXLView,.visibleXXLView{display:none}\n"] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PdfShyButtonComponent, decorators: [{
type: Component,
args: [{ selector: 'pdf-shy-button', template: "@if (!onlySecondaryMenu) {\n@if (nestedContent) {\n<span (click)=\"onClick($event)\" onKeyDown=\"onClick($event)\" [class]=\"cssClass\">\n <ng-content></ng-content>\n</span>\n}\n@else {\n<button type=\"button\" [id]=\"primaryToolbarId\" class=\"toolbarButton\" [class]=\"cssClass\" [title]=\"title\"\n [attr.data-l10n-id]=\"l10nId\" [class.toggled]=\"toggled\" [disabled]=\"disabled\" (click)=\"onClick($event)\"\n [attr.aria-label]=\"title\" [attr.role]=\"role\" [attr.aria-expanded]=\"toggled ? 'true' : (ariaHasPopup ? 'false' : null)\"\n [attr.aria-haspopup]=\"ariaHasPopup\" [attr.aria-controls]=\"ariaControls\" #buttonRef></button>\n}\n}", styles: [".hidden,.always-in-secondary-menu,.visibleXXSView,.visibleTinyView,.visibleSmallView,.visibleMediumView,.visibleLargeView,.visibleXLView,.visibleXXLView{display:none}\n"] }]
}], ctorParameters: () => [{ type: i1.PdfShyButtonService }, { type: i2.DomSanitizer }, { type: i0.Renderer2 }, { type: i3.PDFNotificationService }, { type: i4.PdfCspPolicyService }], propDecorators: { primaryToolbarId: [{
type: Input
}], secondaryMenuId: [{
type: Input
}], cssClass: [{
type: Input
}], eventBusName: [{
type: Input
}], l10nId: [{
type: Input
}], l10nLabel: [{
type: Input
}], title: [{
type: Input
}], toggled: [{
type: Input
}], disabled: [{
type: Input
}], order: [{
type: Input
}], action: [{
type: Input
}], closeOnClick: [{
type: Input
}], onlySecondaryMenu: [{
type: Input
}], ariaHasPopup: [{
type: Input
}], ariaControls: [{
type: Input
}], role: [{
type: Input
}], buttonRef: [{
type: ViewChild,
args: ['buttonRef', { static: false }]
}], nestedContent: [{
type: ContentChild,
args: ['nestedContent', { static: false }]
}], image: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNoeS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3BkZi1zaHktYnV0dG9uL3BkZi1zaHktYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvdG9vbGJhci9wZGYtc2h5LWJ1dHRvbi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1DLFNBQVMsRUFBRSxZQUFZLEVBQWMsS0FBSyxFQUFnQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFhN0osTUFBTSxPQUFPLHFCQUFxQjtJQXVKdEI7SUFDQTtJQUNBO0lBRUE7SUF6SkgsZ0JBQWdCLENBQVM7SUFHekIsZUFBZSxDQUFTO0lBR3hCLFFBQVEsR0FBdUIsV0FBVyxDQUFDO0lBRzNDLFlBQVksR0FBdUIsU0FBUyxDQUFDO0lBRzdDLE1BQU0sQ0FBUztJQUdmLFNBQVMsQ0FBUztJQUdsQixLQUFLLENBQVM7SUFHZCxPQUFPLENBQVU7SUFHakIsUUFBUSxDQUFVO0lBR2xCLEtBQUssQ0FBUztJQUdkLE1BQU0sR0FBMEUsU0FBUyxDQUFDO0lBRzFGLFlBQVksR0FBWSxJQUFJLENBQUM7SUFHN0IsaUJBQWlCLEdBQVksS0FBSyxDQUFDO0lBR25DLFlBQVksR0FBeUMsS0FBSyxDQUFDO0lBRzNELFlBQVksQ0FBcUI7SUFHakMsSUFBSSxDQUFxQjtJQUV4QixvQkFBb0IsQ0FBb0M7SUFFekQsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUVjLFNBQVMsQ0FBYTtJQUVmLGFBQWEsR0FBc0IsSUFBSSxDQUFDO0lBRWxGLFVBQVUsQ0FBcUI7SUFFdkMsSUFBVyxTQUFT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RGxCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxJQUFJO3NCQURWLEtBQUs7Z0JBT3FDLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFUyxhQUFhO3NCQUE5RCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBYXJDLEtBQUs7c0JBRGYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIFJlbmRlcmVyMiwgVmlld0NoaWxkLCBlZmZlY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IElQREZWaWV3ZXJBcHBsaWNhdGlvbiB9IGZyb20gJy4uLy4uL29wdGlvbnMvcGRmLXZpZXdlci1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBQZGZDc3BQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcGRmLWNzcC1wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBQREZOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcGRmLW5vdGlmaWNhdGlvbi1zZXJ2aWNlJztcbmltcG9ydCB7IFJlc3BvbnNpdmVDU1NDbGFzcyB9IGZyb20gJy4uLy4uL3Jlc3BvbnNpdmUtdmlzaWJpbGl0eSc7XG5pbXBvcnQgeyBQZGZTaHlCdXR0b25TZXJ2aWNlIH0gZnJvbSAnLi9wZGYtc2h5LWJ1dHRvbi1zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRmLXNoeS1idXR0b24nLFxuICBzdHlsZVVybHM6IFsnLi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vcGRmLXNoeS1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQZGZTaHlCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwcmltYXJ5VG9vbGJhcklkOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNlY29uZGFyeU1lbnVJZDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjc3NDbGFzczogUmVzcG9uc2l2ZUNTU0NsYXNzID0gJ2ludmlzaWJsZSc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGV2ZW50QnVzTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsMTBuSWQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbDEwbkxhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRvZ2dsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvcmRlcjogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhY3Rpb246ICgoaHRtbEV2ZW50PzogRXZlbnQsIGlzU2Vjb25kYXJ5TWVudWU/OiBib29sZWFuKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY2xvc2VPbkNsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgb25seVNlY29uZGFyeU1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUhhc1BvcHVwOiBib29sZWFuIHwgJ3RydWUnIHwgJ21lbnUnIHwgJ2RpYWxvZycgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUNvbnRyb2xzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHJlbmRlckNvbnRlbnQgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdidXR0b25SZWYnLCB7IHN0YXRpYzogZmFsc2UgfSkgYnV0dG9uUmVmOiBFbGVtZW50UmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoJ25lc3RlZENvbnRlbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgbmVzdGVkQ29udGVudDogRWxlbWVudFJlZiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2ltYWdlSHRtbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBnZXQgaW1hZ2VIdG1sKCk6IHN0cmluZyB8IFNhZmVIdG1sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5faW1hZ2VIdG1sKSB7XG4gICAgICAvLyBhbGxvdyBub24tbGl0ZXJhbCBzdmcgdGFncyAoc2FuaXRpemVkIGluIHRoZSBzZXR0ZXIpXG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5faW1hZ2VIdG1sKTsgLy8gTk9TT05BUlxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbWFnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ZnVGFncyA9IFtcbiAgICAgIC8vICdhJyBpcyBub3QgYWxsb3dlZCFcbiAgICAgICdhbmltYXRlJyxcbiAgICAgICdhbmltYXRlTW90aW9uJyxcbiAgICAgICdhbmltYXRlVHJhbnNmb3JtJyxcbiAgICAgICdhdWRpbycsXG4gICAgICAnY2FudmFzJyxcbiAgICAgICdjaXJjbGUnLFxuICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICdkZWZzJyxcbiAgICAgICdkZXNjJyxcbiAgICAgICdkaXNjYXJkJyxcbiAgICAgICdlbGxpcHNlJyxcbiAgICAgICdmZUJsZW5kJyxcbiAgICAgICdmZUNvbG9yTWF0cml4JyxcbiAgICAgICdmZUNvbXBvbmVudFRyYW5zZmVyJyxcbiAgICAgICdmZUNvbXBvc2l0ZScsXG4gICAgICAnZmVDb252b2x2ZU1hdHJpeCcsXG4gICAgICAnZmVEaWZmdXNlTGlnaHRpbmcnLFxuICAgICAgJ2ZlRGlzcGxhY2VtZW50TWFwJyxcbiAgICAgICdmZURpc3RhbnRMaWdodCcsXG4gICAgICAnZmVEcm9wU2hhZG93JyxcbiAgICAgICdmZUZsb29kJyxcbiAgICAgICdmZUZ1bmNBJyxcbiAgICAgICdmZUZ1bmNCJyxcbiAgICAgICdmZUZ1bmNHJyxcbiAgICAgICdmZUZ1bmNSJyxcbiAgICAgICdmZUdhdXNzaWFuQmx1cicsXG4gICAgICAnZmVJbWFnZScsXG4gICAgICAnZmVNZXJnZScsXG4gICAgICAnZmVNZXJnZU5vZGUnLFxuICAgICAgJ2ZlTW9ycGhvbG9neScsXG4gICAgICAnZmVPZmZzZXQnLFxuICAgICAgJ2ZlUG9pbnRMaWdodCcsXG4gICAgICAnZmVTcGVjdWxhckxpZ2h0aW5nJyxcbiAgICAgICdmZVNwb3RMaWdodCcsXG4gICAgICAnZmVUaWxlJyxcbiAgICAgICdmZVR1cmJ1bGVuY2UnLFxuICAgICAgJ2ZpbHRlcicsXG4gICAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgICAnZycsXG4gICAgICAnaWZyYW1lJyxcbiAgICAgICdpbWFnZScsXG4gICAgICAnbGluZScsXG4gICAgICAnbGluZWFyR3JhZGllbnQnLFxuICAgICAgJ21hcmtlcicsXG4gICAgICAnbWFzaycsXG4gICAgICAnbWV0YWRhdGEnLFxuICAgICAgJ21wYXRoJyxcbiAgICAgICdwYXRoJyxcbiAgICAgICdwYXR0ZXJuJyxcbiAgICAgICdwb2x5Z29uJyxcbiAgICAgICdwb2x5bGluZScsXG4gICAgICAncmFkaWFsR3JhZGllbnQnLFxuICAgICAgJ3JlY3QnLFxuICAgICAgJ3NjcmlwdCcsXG4gICAgICAnc2V0JyxcbiAgICAgICdzdG9wJyxcbiAgICAgICdzdHlsZScsXG4gICAgICAnc3ZnJyxcbiAgICAgICdzd2l0Y2gnLFxuICAgICAgJ3N5bWJvbCcsXG4gICAgICAndGV4dCcsXG4gICAgICAndGV4dFBhdGgnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICd0c3BhbicsXG4gICAgICAndW5rbm93bicsXG4gICAgICAndXNlJyxcbiAgICAgICd2aWRlbycsXG4gICAgICAndmlldycsXG4gICAgXTtcblxuICAgIC8vIG9ubHkgPHN2Zz4gYW5kIFNWRyB0YWdzIGFyZSBhbGxvd2VkXG4gICAgY29uc3QgdGFncyA9IHZhbHVlLnNwbGl0KCc8JykuZmlsdGVyKCh0YWcpID0+IHRhZy5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBsZWdhbCA9IHRhZ3MuZXZlcnkoKHRhZykgPT4gdGFnLnN0YXJ0c1dpdGgoJ3N2ZycpIHx8IHRhZy5zdGFydHNXaXRoKCcvJykgfHwgc3ZnVGFncy5pbmNsdWRlcyh0YWcuc3BsaXQoL1xcc3w+LylbMF0pKTtcbiAgICBpZiAoIWxlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgaW1hZ2UgZm9yIFBERlNoeUJ1dHRvbi4gT25seSBTVkcgaW1hZ2VzIGFyZSBhbGxvd2VkLiBQbGVhc2UgdXNlIG9ubHkgdGhlIHRhZ3MgPHN2Zz4gYW5kIDxwYXRoPi4gJyArIHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5faW1hZ2VIdG1sID0gdGhpcy5wZGZDc3BQb2xpY3lTZXJ2aWNlLnNhbml0aXplSFRNTCh2YWx1ZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBkZlNoeUJ1dHRvblNlcnZpY2VTZXJ2aWNlOiBQZGZTaHlCdXR0b25TZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2U6IFBERk5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZGZDc3BQb2xpY3lTZXJ2aWNlOiBQZGZDc3BQb2xpY3lTZXJ2aWNlLFxuICApIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5QREZWaWV3ZXJBcHBsaWNhdGlvbiA9IG5vdGlmaWNhdGlvblNlcnZpY2Uub25QREZKU0luaXRTaWduYWwoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVCdXR0b25JbWFnZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucGRmU2h5QnV0dG9uU2VydmljZVNlcnZpY2UuYWRkKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMucGRmU2h5QnV0dG9uU2VydmljZVNlcnZpY2UudXBkYXRlKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2soaHRtbEV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChodG1sRXZlbnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGh0bWxFdmVudC5rZXkgIT09ICdFbnRlcicgJiYgaHRtbEV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aW9uKSB7XG4gICAgICB0aGlzLmFjdGlvbihodG1sRXZlbnQsIGZhbHNlKTtcbiAgICAgIGh0bWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudEJ1c05hbWUpIHtcbiAgICAgIHRoaXMuUERGVmlld2VyQXBwbGljYXRpb24/LmV2ZW50QnVzLmRpc3BhdGNoKHRoaXMuZXZlbnRCdXNOYW1lKTtcbiAgICAgIGh0bWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVCdXR0b25JbWFnZSgpIHtcbiAgICBpZiAodGhpcy5idXR0b25SZWYpIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5idXR0b25SZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICh0aGlzLl9pbWFnZUh0bWwpIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucGRmQ3NwUG9saWN5U2VydmljZS5hZGRUcnVzdGVkSFRNTCh0ZW1wLCB0aGlzLl9pbWFnZUh0bWwpO1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRlbXAuY2hpbGRyZW5bMF07XG4gICAgICAgIGlmICghZWwuaW5uZXJIVE1MLmluY2x1ZGVzKGltYWdlLmlubmVySFRNTCkpIHtcbiAgICAgICAgICAvLyBpZiB1c2luZyBTU1IsIHRoZSBIVE1MIGNvZGUgbWF5IGFscmVhZHkgYmUgdGhlcmVcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGVsLCBpbWFnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBlbC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZE5vZGVzKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChlbCwgY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLnByaW1hcnlUb29sYmFySWQgPT09ICduZXN0ZWRDb21wb25lbnQnKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbnRlbnQgPSAhIXRoaXMubmVzdGVkQ29udGVudDtcbiAgICAgIGNvbnNvbGUubG9nKCdyZW5kZXJDb250ZW50JywgdGhpcy5yZW5kZXJDb250ZW50KTtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAoIW9ubHlTZWNvbmRhcnlNZW51KSB7XG5AaWYgKG5lc3RlZENvbnRlbnQpIHtcbjxzcGFuIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiBvbktleURvd249XCJvbkNsaWNrKCRldmVudClcIiBbY2xhc3NdPVwiY3NzQ2xhc3NcIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9zcGFuPlxufVxuQGVsc2Uge1xuPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2lkXT1cInByaW1hcnlUb29sYmFySWRcIiBjbGFzcz1cInRvb2xiYXJCdXR0b25cIiBbY2xhc3NdPVwiY3NzQ2xhc3NcIiBbdGl0bGVdPVwidGl0bGVcIlxuICBbYXR0ci5kYXRhLWwxMG4taWRdPVwibDEwbklkXCIgW2NsYXNzLnRvZ2dsZWRdPVwidG9nZ2xlZFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cInRpdGxlXCIgW2F0dHIucm9sZV09XCJyb2xlXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJ0b2dnbGVkID8gJ3RydWUnIDogKGFyaWFIYXNQb3B1cCA/ICdmYWxzZScgOiBudWxsKVwiXG4gIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiYXJpYUhhc1BvcHVwXCIgW2F0dHIuYXJpYS1jb250cm9sc109XCJhcmlhQ29udHJvbHNcIiAjYnV0dG9uUmVmPjwvYnV0dG9uPlxufVxufSJdfQ==