@hmcts/annotation-ui-lib
Version:
PDF Viewer and ability to highlight text with and comment tracking
334 lines • 30.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild, ElementRef, Input, ChangeDetectorRef, Renderer2 } from '@angular/core';
import { PdfService } from '../../data/pdf.service';
import { AnnotationStoreService } from '../../data/annotation-store.service';
import { Annotation } from '../../data/annotation-set.model';
import { NpaService } from '../../data/npa.service';
import { ApiHttpService } from '../../data/api-http.service';
import { Utils } from '../../data/utils';
import { PdfAnnotateWrapper } from '../../data/js-wrapper/pdf-annotate-wrapper';
import { CommentsComponent } from './comments/comments.component';
import { ContextualToolbarComponent } from './contextual-toolbar/contextual-toolbar.component';
import { EmLoggerService } from '../../logging/em-logger.service';
import { RenderOptions } from '../../data/js-wrapper/renderOptions.model';
import { PdfRenderService } from '../../data/pdf-render.service';
import { RotationFactoryService } from './rotation-toolbar/rotation-factory.service';
var AnnotationPdfViewerComponent = /** @class */ (function () {
function AnnotationPdfViewerComponent(pdfService, npaService, apiHttpService, annotationStoreService, utils, ref, renderer, pdfAnnotateWrapper, pdfRenderService, rotationFactoryService, log) {
this.pdfService = pdfService;
this.npaService = npaService;
this.apiHttpService = apiHttpService;
this.annotationStoreService = annotationStoreService;
this.utils = utils;
this.ref = ref;
this.renderer = renderer;
this.pdfAnnotateWrapper = pdfAnnotateWrapper;
this.pdfRenderService = pdfRenderService;
this.rotationFactoryService = rotationFactoryService;
this.log = log;
this.rotationComponents = [];
}
/**
* @return {?}
*/
AnnotationPdfViewerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.loadAnnotations(this.annotate);
this.pdfService.preRun();
this.pdfRenderService.setRenderOptions(new RenderOptions(this.url, null, parseFloat('1.33'), 0, []));
if (this.rotate) {
this.pdfPageSubscription = this.pdfRenderService.listPagesSubject
.subscribe(function (listPages) {
_this.rotationComponents.forEach(function (rc) { return rc.destroy(); });
listPages.forEach(function (pageDetails) {
_this.rotationComponents.push(_this.rotationFactoryService.addToDom(pageDetails));
});
});
}
this.pdfRenderService.render(this.viewerElementRef);
this.pdfService.setAnnotationWrapper(this.annotationWrapper);
this.pageNumberSubscription = this.pdfService.getPageNumber()
.subscribe(function (page) { return _this.page = page; });
this.focusedAnnotationSubscription = this.annotationStoreService.getAnnotationFocusSubject()
.subscribe(function (focusedAnnotation) { return _this.focusHighlightStyle(focusedAnnotation); });
};
/**
* @return {?}
*/
AnnotationPdfViewerComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.pdfAnnotateWrapper.getUi().addEventListener('annotation:click', this.handleAnnotationClick.bind(this));
};
/**
* @return {?}
*/
AnnotationPdfViewerComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.pageNumberSubscription) {
this.pageNumberSubscription.unsubscribe();
}
if (this.focusedAnnotationSubscription) {
this.focusedAnnotationSubscription.unsubscribe();
}
if (this.pdfPageSubscription) {
this.pdfPageSubscription.unsubscribe();
}
};
/**
* @param {?} annotate
* @return {?}
*/
AnnotationPdfViewerComponent.prototype.loadAnnotations = /**
* @param {?} annotate
* @return {?}
*/
function (annotate) {
if (annotate) {
this.log.info('annotations are enabled');
this.apiHttpService.setBaseUrl(this.baseUrl);
this.annotationStoreService.preLoad(this.annotationSet);
this.npaService.outputDmDocumentId.next(this.outputDmDocumentId);
}
else {
this.log.info('annotations are disabled');
this.annotationStoreService.preLoad(null);
}
};
/**
* @param {?} event
* @param {?=} isPage
* @return {?}
*/
AnnotationPdfViewerComponent.prototype.handleClick = /**
* @param {?} event
* @param {?=} isPage
* @return {?}
*/
function (event, isPage) {
if (this.annotate) {
if (!this.utils.clickIsHighlight(event)) {
this.unfocusAnnotation();
this.annotationStoreService.setToolBarUpdate(null, null);
}
this.commentsComponent.handleAnnotationBlur();
if (isPage) {
this.pdfService.setPageNumber(this.utils.getClickedPage(event));
}
}
};
/**
* @return {?}
*/
AnnotationPdfViewerComponent.prototype.renderComments = /**
* @return {?}
*/
function () {
this.unfocusAnnotation();
this.commentsComponent.showAllComments();
};
/**
* @return {?}
*/
AnnotationPdfViewerComponent.prototype.unfocusAnnotation = /**
* @return {?}
*/
function () {
this.annotationStoreService.setAnnotationFocusSubject(new Annotation());
this.annotationStoreService.setCommentBtnSubject(null);
this.annotationStoreService.setCommentFocusSubject(new Annotation(), null);
};
/**
* @param {?} event
* @return {?}
*/
AnnotationPdfViewerComponent.prototype.handleAnnotationClick = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (!this.contextualToolbar.isShowToolbar) {
/** @type {?} */
var annotationId = event.getAttribute('data-pdf-annotate-id');
this.annotationStoreService.getAnnotationById(annotationId)
.then(function (annotation) {
_this.annotationStoreService.setAnnotationFocusSubject(annotation);
_this.annotationStoreService.setCommentFocusSubject(annotation);
_this.annotationStoreService.setToolBarUpdate(annotation, true);
});
}
};
/**
* @param {?} focusedAnnotation
* @return {?}
*/
AnnotationPdfViewerComponent.prototype.focusHighlightStyle = /**
* @param {?} focusedAnnotation
* @return {?}
*/
function (focusedAnnotation) {
var _this = this;
Array.from(this.viewerElementRef.nativeElement.querySelector("#pageContainer" + this.page + " .annotationLayer").childNodes)
.forEach(function (annotationDom) {
if (annotationDom.dataset.pdfAnnotateId === focusedAnnotation.id) {
_this.renderer.addClass(annotationDom, 'comment-selected');
}
else {
_this.renderer.removeClass(annotationDom, 'comment-selected');
}
});
if (!this.ref['destroyed']) {
this.ref.detectChanges();
}
};
AnnotationPdfViewerComponent.decorators = [
{ type: Component, args: [{
selector: 'app-annotation-pdf-viewer',
template: "\n<app-comments (click)=\"handleClick($event, false)\" #commentsComponent\n *ngIf=\"annotate\"></app-comments>\n\n<div id=\"annotation-wrapper\" #annotationWrapper>\n <app-contextual-toolbar (deletedAnnotation)=\"renderComments()\" #contextualToolbar></app-contextual-toolbar>\n\n <div id=\"content-wrapper\"\n #contentWrapper\n (click)=\"handleClick($event, true)\">\n <div id=\"viewer\" #viewer class=\"pdfViewer\"></div>\n </div>\n</div>\n",
styles: ["#annotation-wrapper{position:relative;width:100%}#content-wrapper{overflow:hidden}"]
}] }
];
AnnotationPdfViewerComponent.ctorParameters = function () { return [
{ type: PdfService },
{ type: NpaService },
{ type: ApiHttpService },
{ type: AnnotationStoreService },
{ type: Utils },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: PdfAnnotateWrapper },
{ type: PdfRenderService },
{ type: RotationFactoryService },
{ type: EmLoggerService }
]; };
AnnotationPdfViewerComponent.propDecorators = {
annotate: [{ type: Input }],
dmDocumentId: [{ type: Input }],
outputDmDocumentId: [{ type: Input }],
url: [{ type: Input }],
annotationSet: [{ type: Input }],
baseUrl: [{ type: Input }],
rotate: [{ type: Input }],
contentWrapper: [{ type: ViewChild, args: ['contentWrapper',] }],
viewerElementRef: [{ type: ViewChild, args: ['viewer',] }],
annotationWrapper: [{ type: ViewChild, args: ['annotationWrapper',] }],
commentsComponent: [{ type: ViewChild, args: ['commentsComponent',] }],
contextualToolbar: [{ type: ViewChild, args: ['contextualToolbar',] }]
};
return AnnotationPdfViewerComponent;
}());
export { AnnotationPdfViewerComponent };
if (false) {
/** @type {?} */
AnnotationPdfViewerComponent.prototype.annotate;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.dmDocumentId;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.outputDmDocumentId;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.url;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.annotationSet;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.baseUrl;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.rotate;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.page;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.focusedAnnotationSubscription;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pageNumberSubscription;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pdfPageSubscription;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.rotationComponents;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.contentWrapper;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.viewerElementRef;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.annotationWrapper;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.commentsComponent;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.contextualToolbar;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pdfService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.npaService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.apiHttpService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.annotationStoreService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.utils;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.ref;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pdfAnnotateWrapper;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pdfRenderService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.rotationFactoryService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.log;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ub3RhdGlvbi1wZGYtdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi92aWV3ZXJzL2Fubm90YXRpb24tcGRmLXZpZXdlci9hbm5vdGF0aW9uLXBkZi12aWV3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBeUMsTUFBTSxlQUFlLENBQUM7QUFFcEosT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBaUIsVUFBVSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDM0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDL0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUtyRjtJQTJCSSxzQ0FBb0IsVUFB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Q2hpbGQsIEVsZW1lbnRSZWYsIElucHV0LCBDaGFuZ2VEZXRlY3RvclJlZiwgUmVuZGVyZXIyLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIENvbXBvbmVudFJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7UGRmU2VydmljZX0gZnJvbSAnLi4vLi4vZGF0YS9wZGYuc2VydmljZSc7XG5pbXBvcnQge0Fubm90YXRpb25TdG9yZVNlcnZpY2V9IGZyb20gJy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7SUFubm90YXRpb25TZXQsIEFubm90YXRpb259IGZyb20gJy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zZXQubW9kZWwnO1xuaW1wb3J0IHtOcGFTZXJ2aWNlfSBmcm9tICcuLi8uLi9kYXRhL25wYS5zZXJ2aWNlJztcbmltcG9ydCB7QXBpSHR0cFNlcnZpY2V9IGZyb20gJy4uLy4uL2RhdGEvYXBpLWh0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL2RhdGEvdXRpbHMnO1xuaW1wb3J0IHsgUGRmQW5ub3RhdGVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vZGF0YS9qcy13cmFwcGVyL3BkZi1hbm5vdGF0ZS13cmFwcGVyJztcbmltcG9ydCB7IENvbW1lbnRzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21tZW50cy9jb21tZW50cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udGV4dHVhbFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL2NvbnRleHR1YWwtdG9vbGJhci9jb250ZXh0dWFsLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVtTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvZW0tbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVuZGVyT3B0aW9ucyB9IGZyb20gJy4uLy4uL2RhdGEvanMtd3JhcHBlci9yZW5kZXJPcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IFBkZlJlbmRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9kYXRhL3BkZi1yZW5kZXIuc2VydmljZSc7XG5pbXBvcnQgeyBSb3RhdGlvbkZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi9yb3RhdGlvbi10b29sYmFyL3JvdGF0aW9uLWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBSb3RhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vcm90YXRpb24tdG9vbGJhci9yb3RhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUm90YXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL3JvdGF0aW9uLWZhY3RvcnkubW9kZWwnO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWFubm90YXRpb24tcGRmLXZpZXdlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Fubm90YXRpb24tcGRmLXZpZXdlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYW5ub3RhdGlvbi1wZGYtdmlld2VyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvblBkZlZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBJbnB1dCgpIGFubm90YXRlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRtRG9jdW1lbnRJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG91dHB1dERtRG9jdW1lbnRJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHVybDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFubm90YXRpb25TZXQ6IElBbm5vdGF0aW9uU2V0O1xuICAgIEBJbnB1dCgpIGJhc2VVcmw6IHN0cmluZztcbiAgICBASW5wdXQoKSByb3RhdGU6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHBhZ2U6IG51bWJlcjtcbiAgICBwcml2YXRlIGZvY3VzZWRBbm5vdGF0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBwYWdlTnVtYmVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBwZGZQYWdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcm90YXRpb25Db21wb25lbnRzOiBDb21wb25lbnRSZWY8Um90YXRpb25Db21wb25lbnQ+W10gPSBbXTtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRlbnRXcmFwcGVyJykgY29udGVudFdyYXBwZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgndmlld2VyJykgdmlld2VyRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdhbm5vdGF0aW9uV3JhcHBlcicpIGFubm90YXRpb25XcmFwcGVyOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbW1lbnRzQ29tcG9uZW50JykgY29tbWVudHNDb21wb25lbnQ6IENvbW1lbnRzQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRleHR1YWxUb29sYmFyJykgY29udGV4dHVhbFRvb2xiYXI6IENvbnRleHR1YWxUb29sYmFyQ29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwZGZTZXJ2aWNlOiBQZGZTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbnBhU2VydmljZTogTnBhU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGFwaUh0dHBTZXJ2aWNlOiBBcGlIdHRwU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGFubm90YXRpb25TdG9yZVNlcnZpY2U6IEFubm90YXRpb25TdG9yZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHBkZkFubm90YXRlV3JhcHBlcjogUGRmQW5ub3RhdGVXcmFwcGVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcGRmUmVuZGVyU2VydmljZTogUGRmUmVuZGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJvdGF0aW9uRmFjdG9yeVNlcnZpY2U6IFJvdGF0aW9uRmFjdG9yeVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBsb2c6IEVtTG9nZ2VyU2VydmljZSkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvYWRBbm5vdGF0aW9ucyh0aGlzLmFubm90YXRlKTtcbiAgICAgICAgdGhpcy5wZGZTZXJ2aWNlLnByZVJ1bigpO1xuICAgICAgICB0aGlzLnBkZlJlbmRlclNlcnZpY2Uuc2V0UmVuZGVyT3B0aW9ucyhuZXcgUmVuZGVyT3B0aW9ucyhcbiAgICAgICAgICAgIHRoaXMudXJsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoJzEuMzMnKSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbXVxuICAgICAgICApKTtcblxuICAgICAgICBpZiAodGhpcy5yb3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucGRmUGFnZVN1YnNjcmlwdGlvbiA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5saXN0UGFnZXNTdWJqZWN0XG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3RQYWdlczogUm90YXRpb25Nb2RlbFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvbkNvbXBvbmVudHMuZm9yRWFjaChyYyA9PiByYy5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIGxpc3RQYWdlcy5mb3JFYWNoKHBhZ2VEZXRhaWxzID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb25Db21wb25lbnRzLnB1c2godGhpcy5yb3RhdGlvbkZhY3RvcnlTZXJ2aWNlLmFkZFRvRG9tKHBhZ2VEZXRhaWxzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wZGZSZW5kZXJTZXJ2aWNlLnJlbmRlcih0aGlzLnZpZXdlckVsZW1lbnRSZWYpO1xuICAgICAgICB0aGlzLnBkZlNlcnZpY2Uuc2V0QW5ub3RhdGlvbldyYXBwZXIodGhpcy5hbm5vdGF0aW9uV3JhcHBlcik7XG5cbiAgICAgICAgdGhpcy5wYWdlTnVtYmVyU3Vic2NyaXB0aW9uID0gdGhpcy5wZGZTZXJ2aWNlLmdldFBhZ2VOdW1iZXIoKVxuICAgICAgICAgICAgLnN1YnNjcmliZShwYWdlID0+IHRoaXMucGFnZSA9IHBhZ2UpO1xuICAgICAgICB0aGlzLmZvY3VzZWRBbm5vdGF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmdldEFubm90YXRpb25Gb2N1c1N1YmplY3QoKVxuICAgICAgICAgICAgLnN1YnNjcmliZShmb2N1c2VkQW5ub3RhdGlvbiA9PiB0aGlzLmZvY3VzSGlnaGxpZ2h0U3R5bGUoZm9jdXNlZEFubm90YXRpb24pKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMucGRmQW5ub3RhdGVXcmFwcGVyLmdldFVpKCkuYWRkRXZlbnRMaXN0ZW5lcignYW5ub3RhdGlvbjpjbGljaycsIHRoaXMuaGFuZGxlQW5ub3RhdGlvbkNsaWNrLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5wYWdlTnVtYmVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VOdW1iZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mb2N1c2VkQW5ub3RhdGlvblN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQW5ub3RhdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBkZlBhZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucGRmUGFnZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZEFubm90YXRpb25zKGFubm90YXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChhbm5vdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnYW5ub3RhdGlvbnMgYXJlIGVuYWJsZWQnKTtcbiAgICAgICAgICAgIHRoaXMuYXBpSHR0cFNlcnZpY2Uuc2V0QmFzZVVybCh0aGlzLmJhc2VVcmwpO1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnByZUxvYWQodGhpcy5hbm5vdGF0aW9uU2V0KTtcbiAgICAgICAgICAgIHRoaXMubnBhU2VydmljZS5vdXRwdXREbURvY3VtZW50SWQubmV4dCh0aGlzLm91dHB1dERtRG9jdW1lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdhbm5vdGF0aW9ucyBhcmUgZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5wcmVMb2FkKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlQ2xpY2soZXZlbnQ6IGFueSwgaXNQYWdlPzogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5hbm5vdGF0ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnV0aWxzLmNsaWNrSXNIaWdobGlnaHQoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bmZvY3VzQW5ub3RhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRUb29sQmFyVXBkYXRlKG51bGwsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21tZW50c0NvbXBvbmVudC5oYW5kbGVBbm5vdGF0aW9uQmx1cigpO1xuXG4gICAgICAgICAgICBpZiAoaXNQYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZGZTZXJ2aWNlLnNldFBhZ2VOdW1iZXIodGhpcy51dGlscy5nZXRDbGlja2VkUGFnZShldmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyQ29tbWVudHMoKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c0Fubm90YXRpb24oKTtcbiAgICAgICAgdGhpcy5jb21tZW50c0NvbXBvbmVudC5zaG93QWxsQ29tbWVudHMoKTtcbiAgICB9XG5cbiAgICB1bmZvY3VzQW5ub3RhdGlvbigpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldEFubm90YXRpb25Gb2N1c1N1YmplY3QobmV3IEFubm90YXRpb24oKSk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRDb21tZW50QnRuU3ViamVjdChudWxsKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldENvbW1lbnRGb2N1c1N1YmplY3QobmV3IEFubm90YXRpb24oKSwgbnVsbCk7XG4gICAgfVxuXG4gICAgaGFuZGxlQW5ub3RhdGlvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0dWFsVG9vbGJhci5pc1Nob3dUb29sYmFyKSB7XG4gICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uSWQgPSBldmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGRmLWFubm90YXRlLWlkJyk7XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0QW5ub3RhdGlvbkJ5SWQoYW5ub3RhdGlvbklkKVxuICAgICAgICAgICAgICAgIC50aGVuKChhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRBbm5vdGF0aW9uRm9jdXNTdWJqZWN0KGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0Q29tbWVudEZvY3VzU3ViamVjdChhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldFRvb2xCYXJVcGRhdGUoYW5ub3RhdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb2N1c0hpZ2hsaWdodFN0eWxlKGZvY3VzZWRBbm5vdGF0aW9uOiBBbm5vdGF0aW9uKSB7XG4gICAgICAgIEFycmF5LmZyb20odGhpcy52aWV3ZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgI3BhZ2VDb250YWluZXIke3RoaXMucGFnZX0gLmFubm90YXRpb25MYXllcmApLmNoaWxkTm9kZXMpXG4gICAgICAgICAgICAuZm9yRWFjaCgoYW5ub3RhdGlvbkRvbTogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRG9tLmRhdGFzZXQucGRmQW5ub3RhdGVJZCA9PT0gZm9jdXNlZEFubm90YXRpb24uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhhbm5vdGF0aW9uRG9tLCAnY29tbWVudC1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoYW5ub3RhdGlvbkRvbSwgJ2NvbW1lbnQtc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnJlZlsnZGVzdHJveWVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIl19