UNPKG

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.

215 lines 24.1 kB
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; 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", 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\" #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\" #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 }], buttonRef: [{ type: ViewChild, args: ['buttonRef', { static: false }] }], nestedContent: [{ type: ContentChild, args: ['nestedContent', { static: false }] }], image: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNoeS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3BkZi1zaHktYnV0dG9uL3BkZi1zaHktYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvdG9vbGJhci9wZGYtc2h5LWJ1dHRvbi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1DLFNBQVMsRUFBRSxZQUFZLEVBQWMsS0FBSyxFQUFnQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFhN0osTUFBTSxPQUFPLHFCQUFxQjtJQThJdEI7SUFDQTtJQUNBO0lBRUE7SUFoSkgsZ0JBQWdCLENBQVM7SUFHekIsZUFBZSxDQUFTO0lBR3hCLFFBQVEsR0FBdUIsV0FBVyxDQUFDO0lBRzNDLFlBQVksR0FBdUIsU0FBUyxDQUFDO0lBRzdDLE1BQU0sQ0FBUztJQUdmLFNBQVMsQ0FBUztJQUdsQixLQUFLLENBQVM7SUFHZCxPQUFPLENBQVU7SUFHakIsUUFBUSxDQUFVO0lBR2xCLEtBQUssQ0FBUztJQUdkLE1BQU0sR0FBMEUsU0FBUyxDQUFDO0lBRzFGLFlBQVksR0FBWSxJQUFJLENBQUM7SUFHN0IsaUJBQWlCLEdBQVksS0FBSyxDQUFDO0lBRWxDLG9CQUFvQixDQUFvQztJQUV6RCxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRWMsU0FBUyxDQUFhO0lBRWYsYUFBYSxHQUFzQixJQUFJLENBQUM7SUFFbEYsVUFBVSxDQUFxQjtJQUV2QyxJQUFXLFNBQVM7UUFDbEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLHVEQUF1RDtZQUN2RCxPQUFPLElBQUks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c0JBQTlELFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFhckMsS0FBSztzQkFEZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgUmVuZGVyZXIyLCBWaWV3Q2hpbGQsIGVmZmVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgSVBERlZpZXdlckFwcGxpY2F0aW9uIH0gZnJvbSAnLi4vLi4vb3B0aW9ucy9wZGYtdmlld2VyLWFwcGxpY2F0aW9uJztcbmltcG9ydCB7IFBkZkNzcFBvbGljeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9wZGYtY3NwLXBvbGljeS5zZXJ2aWNlJztcbmltcG9ydCB7IFBERk5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9wZGYtbm90aWZpY2F0aW9uLXNlcnZpY2UnO1xuaW1wb3J0IHsgUmVzcG9uc2l2ZUNTU0NsYXNzIH0gZnJvbSAnLi4vLi4vcmVzcG9uc2l2ZS12aXNpYmlsaXR5JztcbmltcG9ydCB7IFBkZlNoeUJ1dHRvblNlcnZpY2UgfSBmcm9tICcuL3BkZi1zaHktYnV0dG9uLXNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZGYtc2h5LWJ1dHRvbicsXG4gIHN0eWxlVXJsczogWycuL3BkZi1zaHktYnV0dG9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFBkZlNoeUJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgQElucHV0KClcbiAgcHVibGljIHByaW1hcnlUb29sYmFySWQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2Vjb25kYXJ5TWVudUlkOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNzc0NsYXNzOiBSZXNwb25zaXZlQ1NTQ2xhc3MgPSAnaW52aXNpYmxlJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZXZlbnRCdXNOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGwxMG5JZDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsMTBuTGFiZWw6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdG9nZ2xlZDogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIG9yZGVyOiBudW1iZXI7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFjdGlvbjogKChodG1sRXZlbnQ/OiBFdmVudCwgaXNTZWNvbmRhcnlNZW51ZT86IGJvb2xlYW4pID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjbG9zZU9uQ2xpY2s6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvbmx5U2Vjb25kYXJ5TWVudTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgUERGVmlld2VyQXBwbGljYXRpb246IElQREZWaWV3ZXJBcHBsaWNhdGlvbiB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgcmVuZGVyQ29udGVudCA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2J1dHRvblJlZicsIHsgc3RhdGljOiBmYWxzZSB9KSBidXR0b25SZWY6IEVsZW1lbnRSZWY7XG5cbiAgQENvbnRlbnRDaGlsZCgnbmVzdGVkQ29udGVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBuZXN0ZWRDb250ZW50OiBFbGVtZW50UmVmIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfaW1hZ2VIdG1sOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGdldCBpbWFnZUh0bWwoKTogc3RyaW5nIHwgU2FmZUh0bWwgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9pbWFnZUh0bWwpIHtcbiAgICAgIC8vIGFsbG93IG5vbi1saXRlcmFsIHN2ZyB0YWdzIChzYW5pdGl6ZWQgaW4gdGhlIHNldHRlcilcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLl9pbWFnZUh0bWwpOyAvLyBOT1NPTkFSXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGltYWdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdmdUYWdzID0gW1xuICAgICAgLy8gJ2EnIGlzIG5vdCBhbGxvd2VkIVxuICAgICAgJ2FuaW1hdGUnLFxuICAgICAgJ2FuaW1hdGVNb3Rpb24nLFxuICAgICAgJ2FuaW1hdGVUcmFuc2Zvcm0nLFxuICAgICAgJ2F1ZGlvJyxcbiAgICAgICdjYW52YXMnLFxuICAgICAgJ2NpcmNsZScsXG4gICAgICAnY2xpcFBhdGgnLFxuICAgICAgJ2RlZnMnLFxuICAgICAgJ2Rlc2MnLFxuICAgICAgJ2Rpc2NhcmQnLFxuICAgICAgJ2VsbGlwc2UnLFxuICAgICAgJ2ZlQmxlbmQnLFxuICAgICAgJ2ZlQ29sb3JNYXRyaXgnLFxuICAgICAgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLFxuICAgICAgJ2ZlQ29tcG9zaXRlJyxcbiAgICAgICdmZUNvbnZvbHZlTWF0cml4JyxcbiAgICAgICdmZURpZmZ1c2VMaWdodGluZycsXG4gICAgICAnZmVEaXNwbGFjZW1lbnRNYXAnLFxuICAgICAgJ2ZlRGlzdGFudExpZ2h0JyxcbiAgICAgICdmZURyb3BTaGFkb3cnLFxuICAgICAgJ2ZlRmxvb2QnLFxuICAgICAgJ2ZlRnVuY0EnLFxuICAgICAgJ2ZlRnVuY0InLFxuICAgICAgJ2ZlRnVuY0cnLFxuICAgICAgJ2ZlRnVuY1InLFxuICAgICAgJ2ZlR2F1c3NpYW5CbHVyJyxcbiAgICAgICdmZUltYWdlJyxcbiAgICAgICdmZU1lcmdlJyxcbiAgICAgICdmZU1lcmdlTm9kZScsXG4gICAgICAnZmVNb3JwaG9sb2d5JyxcbiAgICAgICdmZU9mZnNldCcsXG4gICAgICAnZmVQb2ludExpZ2h0JyxcbiAgICAgICdmZVNwZWN1bGFyTGlnaHRpbmcnLFxuICAgICAgJ2ZlU3BvdExpZ2h0JyxcbiAgICAgICdmZVRpbGUnLFxuICAgICAgJ2ZlVHVyYnVsZW5jZScsXG4gICAgICAnZmlsdGVyJyxcbiAgICAgICdmb3JlaWduT2JqZWN0JyxcbiAgICAgICdnJyxcbiAgICAgICdpZnJhbWUnLFxuICAgICAgJ2ltYWdlJyxcbiAgICAgICdsaW5lJyxcbiAgICAgICdsaW5lYXJHcmFkaWVudCcsXG4gICAgICAnbWFya2VyJyxcbiAgICAgICdtYXNrJyxcbiAgICAgICdtZXRhZGF0YScsXG4gICAgICAnbXBhdGgnLFxuICAgICAgJ3BhdGgnLFxuICAgICAgJ3BhdHRlcm4nLFxuICAgICAgJ3BvbHlnb24nLFxuICAgICAgJ3BvbHlsaW5lJyxcbiAgICAgICdyYWRpYWxHcmFkaWVudCcsXG4gICAgICAncmVjdCcsXG4gICAgICAnc2NyaXB0JyxcbiAgICAgICdzZXQnLFxuICAgICAgJ3N0b3AnLFxuICAgICAgJ3N0eWxlJyxcbiAgICAgICdzdmcnLFxuICAgICAgJ3N3aXRjaCcsXG4gICAgICAnc3ltYm9sJyxcbiAgICAgICd0ZXh0JyxcbiAgICAgICd0ZXh0UGF0aCcsXG4gICAgICAndGl0bGUnLFxuICAgICAgJ3RzcGFuJyxcbiAgICAgICd1bmtub3duJyxcbiAgICAgICd1c2UnLFxuICAgICAgJ3ZpZGVvJyxcbiAgICAgICd2aWV3JyxcbiAgICBdO1xuXG4gICAgLy8gb25seSA8c3ZnPiBhbmQgU1ZHIHRhZ3MgYXJlIGFsbG93ZWRcbiAgICBjb25zdCB0YWdzID0gdmFsdWUuc3BsaXQoJzwnKS5maWx0ZXIoKHRhZykgPT4gdGFnLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGxlZ2FsID0gdGFncy5ldmVyeSgodGFnKSA9PiB0YWcuc3RhcnRzV2l0aCgnc3ZnJykgfHwgdGFnLnN0YXJ0c1dpdGgoJy8nKSB8fCBzdmdUYWdzLmluY2x1ZGVzKHRhZy5zcGxpdCgvXFxzfD4vKVswXSkpO1xuICAgIGlmICghbGVnYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBpbWFnZSBmb3IgUERGU2h5QnV0dG9uLiBPbmx5IFNWRyBpbWFnZXMgYXJlIGFsbG93ZWQuIFBsZWFzZSB1c2Ugb25seSB0aGUgdGFncyA8c3ZnPiBhbmQgPHBhdGg+LiAnICsgdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9pbWFnZUh0bWwgPSB0aGlzLnBkZkNzcFBvbGljeVNlcnZpY2Uuc2FuaXRpemVIVE1MKHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcGRmU2h5QnV0dG9uU2VydmljZVNlcnZpY2U6IFBkZlNoeUJ1dHRvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgbm90aWZpY2F0aW9uU2VydmljZTogUERGTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHBkZkNzcFBvbGljeVNlcnZpY2U6IFBkZkNzcFBvbGljeVNlcnZpY2UsXG4gICkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLlBERlZpZXdlckFwcGxpY2F0aW9uID0gbm90aWZpY2F0aW9uU2VydmljZS5vblBERkpTSW5pdFNpZ25hbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvbkltYWdlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wZGZTaHlCdXR0b25TZXJ2aWNlU2VydmljZS5hZGQodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wZGZTaHlCdXR0b25TZXJ2aWNlU2VydmljZS51cGRhdGUodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgb25DbGljayhodG1sRXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGh0bWxFdmVudCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgJiYgaHRtbEV2ZW50LmtleSAhPT0gJ0VudGVyJyAmJiBodG1sRXZlbnQua2V5ICE9PSAnICcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3Rpb24pIHtcbiAgICAgIHRoaXMuYWN0aW9uKGh0bWxFdmVudCwgZmFsc2UpO1xuICAgICAgaHRtbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50QnVzTmFtZSkge1xuICAgICAgdGhpcy5QREZWaWV3ZXJBcHBsaWNhdGlvbj8uZXZlbnRCdXMuZGlzcGF0Y2godGhpcy5ldmVudEJ1c05hbWUpO1xuICAgICAgaHRtbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUJ1dHRvbkltYWdlKCkge1xuICAgIGlmICh0aGlzLmJ1dHRvblJlZikge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLmJ1dHRvblJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHRoaXMuX2ltYWdlSHRtbCkge1xuICAgICAgICBjb25zdCB0ZW1wID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5wZGZDc3BQb2xpY3lTZXJ2aWNlLmFkZFRydXN0ZWRIVE1MKHRlbXAsIHRoaXMuX2ltYWdlSHRtbCk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGVtcC5jaGlsZHJlblswXTtcbiAgICAgICAgaWYgKCFlbC5pbm5lckhUTUwuaW5jbHVkZXMoaW1hZ2UuaW5uZXJIVE1MKSkge1xuICAgICAgICAgIC8vIGlmIHVzaW5nIFNTUiwgdGhlIEhUTUwgY29kZSBtYXkgYWxyZWFkeSBiZSB0aGVyZVxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZWwsIGltYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGVsLmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkTm9kZXMpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGVsLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKHRoaXMucHJpbWFyeVRvb2xiYXJJZCA9PT0gJ25lc3RlZENvbXBvbmVudCcpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29udGVudCA9ICEhdGhpcy5uZXN0ZWRDb250ZW50O1xuICAgICAgY29uc29sZS5sb2coJ3JlbmRlckNvbnRlbnQnLCB0aGlzLnJlbmRlckNvbnRlbnQpO1xuICAgIH1cbiAgfVxufVxuIiwiQGlmICghb25seVNlY29uZGFyeU1lbnUpIHtcbkBpZiAobmVzdGVkQ29udGVudCkge1xuPHNwYW4gKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiIG9uS2V5RG93bj1cIm9uQ2xpY2soJGV2ZW50KVwiIFtjbGFzc109XCJjc3NDbGFzc1wiPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L3NwYW4+XG59XG5AZWxzZSB7XG48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbaWRdPVwicHJpbWFyeVRvb2xiYXJJZFwiIGNsYXNzPVwidG9vbGJhckJ1dHRvblwiIFtjbGFzc109XCJjc3NDbGFzc1wiIFt0aXRsZV09XCJ0aXRsZVwiXG4gIFthdHRyLmRhdGEtbDEwbi1pZF09XCJsMTBuSWRcIiBbY2xhc3MudG9nZ2xlZF09XCJ0b2dnbGVkXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwidGl0bGVcIiAjYnV0dG9uUmVmPjwvYnV0dG9uPlxufVxufSJdfQ==