UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

411 lines 40.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectorRef, ElementRef, Renderer2 } from '@angular/core'; import { NgForm } from '@angular/forms'; import { Annotation, Comment } from '../../../../data/annotation-set.model'; import { AnnotationStoreService } from '../../../../data/annotation-store.service'; import { PdfService } from '../../../../data/pdf.service'; import { Utils } from '../../../../data/utils'; import { EmLoggerService } from '../../../../logging/em-logger.service'; import { PdfRenderService } from '../../../../data/pdf-render.service'; export class CommentItemComponent { /** * @param {?} annotationStoreService * @param {?} pdfService * @param {?} pdfRenderService * @param {?} ref * @param {?} renderer * @param {?} utils * @param {?} log */ constructor(annotationStoreService, pdfService, pdfRenderService, ref, renderer, utils, log) { this.annotationStoreService = annotationStoreService; this.pdfService = pdfService; this.pdfRenderService = pdfRenderService; this.ref = ref; this.renderer = renderer; this.utils = utils; this.log = log; this.commentSubmitted = new EventEmitter(); this.commentRendered = new EventEmitter(); this.model = new Comment(null, null, null, null, null, null, null, null, null); this.log.setClass('CommentItemComponent'); } /** * @return {?} */ ngOnInit() { this.hideButton = true; this.focused = false; this.sliceComment = this.comment.content; this.commentFocusSub = this.annotationStoreService.getCommentFocusSubject() .subscribe((options) => { if (options.annotation.id === this.comment.annotationId) { if (options.showButton) { this.onEdit(); } else { this.handleShowBtn(); } this.ref.detectChanges(); } else { this.onBlur(); } }); this.commentBtnSub = this.annotationStoreService.getCommentBtnSubject() .subscribe((commentId) => { (commentId === this.comment.id) ? this.handleShowBtn() : this.handleHideBtn(); }); this.dataLoadedSub = this.pdfRenderService.getDataLoadedSub() .subscribe((dataLoaded) => { if (dataLoaded) { this.annotationTopPos = this.getRelativePosition(this.comment.annotationId); this.commentTopPos = this.annotationTopPos; this.utils.sortByX(this.annotation.rectangles, true); this.annotationHeight = this.utils.getAnnotationLineHeight(this.annotation.rectangles); this.annotationLeftPos = this.annotation.rectangles[0].x; this.commentRendered.emit(true); this.collapseComment(); } }); this.commentItem.statusChanges.subscribe(() => { if (this.focused) { this.expandComment(); } }); } /** * @return {?} */ setHeight() { this.renderer.setStyle(this.commentArea.nativeElement, 'height', 'fit-content'); this.renderer.setStyle(this.commentArea.nativeElement, 'height', (this.commentArea.nativeElement.scrollHeight) + 'px'); this.commentHeight = this.commentSelector.nativeElement.getBoundingClientRect().height; this.commentRendered.emit(true); if (!this.ref['destroyed']) { this.ref.detectChanges(); } } /** * @return {?} */ ngOnDestroy() { if (this.commentFocusSub) { this.commentFocusSub.unsubscribe(); } if (this.commentBtnSub) { this.commentBtnSub.unsubscribe(); } if (this.dataLoadedSub) { this.dataLoadedSub.unsubscribe(); } } /** * @return {?} */ onSubmit() { /** @type {?} */ const comment = this.convertFormToComment(this.commentItem); this.annotationStoreService.editComment(comment); this.commentSubmitted.emit(this.annotation); this.viewOnly(); } /** * @return {?} */ onEdit() { this.editOnly(); } /** * @return {?} */ onCancel() { this.renderer.setProperty(this.commentArea.nativeElement, 'value', this.comment.content); this.viewOnly(); } /** * @return {?} */ viewOnly() { this.renderer.addClass(this.commentArea.nativeElement, 'view-mode'); this.focused = false; } /** * @return {?} */ editOnly() { this.focused = true; this.renderer.removeClass(this.commentArea.nativeElement, 'view-mode'); } /** * @return {?} */ isModified() { if (this.comment.createdDate === null) { return false; } else if (this.comment.lastModifiedBy === null) { return false; } else if (this.comment.createdDate === this.comment.lastModifiedDate) { return false; } else { return true; } } /** * @return {?} */ onBlur() { if (!this.ref['destroyed']) { this.ref.detectChanges(); } } /** * @param {?} commentForm * @return {?} */ convertFormToComment(commentForm) { return new Comment(this.comment.id, this.comment.annotationId, null, null, new Date(), null, null, null, commentForm.value.content); } /** * @return {?} */ handleDeleteComment() { this.annotationStoreService.deleteComment(this.comment.id); } /** * @param {?} event * @return {?} */ handleCommentClick(event) { event.stopPropagation(); this.annotationStoreService.setCommentBtnSubject(this.comment.id); this.annotationStoreService.setAnnotationFocusSubject(this.annotation); } /** * @return {?} */ handleShowBtn() { new Promise(resolve => { this.hideButton = false; this.expandComment(); resolve('Success'); }).then(() => { this.setHeight(); setTimeout(() => { this.commentArea.nativeElement.focus(); }); }); } /** * @return {?} */ handleHideBtn() { new Promise(resolve => { if (!this.commentItem.value.content) { this.annotationStoreService.deleteComment(this.comment.id); } this.focused = false; this.hideButton = true; this.collapseComment(); resolve('Success'); }).then(() => { this.setHeight(); }); } /** * @return {?} */ collapseComment() { new Promise(resolve => { this.expandComment(); resolve('Success'); }).then(() => { if (!this.isCommentEmpty()) { this.shrinkComment(); } this.renderer.addClass(this.commentArea.nativeElement, 'collapsed'); this.renderer.removeClass(this.commentArea.nativeElement, 'expanded'); this.renderer.addClass(this.detailsWrapper.nativeElement, 'collapsed'); this.renderer.addClass(this.commentArea.nativeElement, 'view-mode'); this.setHeight(); }); } /** * @return {?} */ isCommentEmpty() { return this.comment.content === null; } /** * @return {?} */ isShrinkable() { return this.commentArea.nativeElement.scrollHeight > 31; } /** * @return {?} */ shrinkComment() { if (this.isShrinkable()) { this.sliceComment = this.removeMultipleLines().slice(0, 20) + '...'; } } /** * @return {?} */ removeMultipleLines() { return this.comment.content.split('\n').join(' '); } /** * @return {?} */ expandComment() { this.renderer.addClass(this.commentArea.nativeElement, 'expanded'); this.renderer.removeClass(this.commentArea.nativeElement, 'collapsed'); this.renderer.removeClass(this.detailsWrapper.nativeElement, 'collapsed'); this.renderer.addClass(this.detailsWrapper.nativeElement, 'expanded'); this.sliceComment = this.comment.content; this.setHeight(); } /** * @param {?} annotationId * @return {?} */ getRelativePosition(annotationId) { /** @type {?} */ const svgSelector = this.pdfRenderService.getViewerElementRef().nativeElement .querySelector(`g[data-pdf-annotate-id="${annotationId}"]`); if (svgSelector === null) { return null; } else { /** @type {?} */ const highlightRect = (/** @type {?} */ (svgSelector.getBoundingClientRect())); /** @type {?} */ const wrapperRect = (/** @type {?} */ (this.pdfService.getAnnotationWrapper().nativeElement.getBoundingClientRect())); return (highlightRect.y - wrapperRect.top); } } } CommentItemComponent.decorators = [ { type: Component, args: [{ selector: 'app-comment-item', template: "<form class=\"aui-comment comment-list-item\"\n (ngSubmit)=\"onSubmit()\"\n #commentSelector\n #commentItem=\"ngForm\"\n (click)=\"handleCommentClick($event)\"\n [style.top.px]=\"commentTopPos\">\n <div #detailsWrapper id=\"detailsWrapper\" class=\"aui-comment__header\">\n <span *ngIf=\"comment.createdByDetails\" class=\"aui-comment__author\">{{comment.createdByDetails.forename}} {{comment.createdByDetails.surname}}</span>\n <time #commentDate class=\"aui-comment__meta\" ng-controller=\"datCtrl\">{{ comment.createdDate | date: 'd MMMM y h:mm a' }}</time>\n <div *ngIf=\"false\">\n <span>modified By: {{comment.lastModifiedByDetails.forename}} {{comment.lastModifiedByDetails.surname}}</span>\n <time class=\"aui-comment__meta\" ng-controller=\"datCtrl\"><br>{{ comment.lastModifiedDate | date: 'd MMMM y h:mm a' }}</time>\n </div>\n </div>\n\n <textarea\n #commentArea\n (blur)=\"onBlur()\"\n type=\"text\"\n [class.mimic-focus]=\"focused\"\n class=\"aui-comment__content form-control mimic-focus view-mode\"\n required\n [ngModel]=\"sliceComment\" name=\"content\"\n value=\"comment.content\"\n [readonly]=\"!focused\"></textarea>\n\n <div [hidden]=\"hideButton\" class=\"aui-comment__footer commentBtns\">\n <button *ngIf=\"focused\" type=\"submit\" class=\"govuk-button\" role=\"button\">Save</button>\n <button *ngIf=\"!focused\" (click)=\"onEdit()\" class=\"govuk-button\" role=\"button\">Edit</button>\n <button\n *ngIf=\"!focused\"\n class=\"govuk-button hmcts hmcts-button--secondary\"\n role=\"button\"\n (click)=\"handleDeleteComment()\">Delete</button>\n <button\n *ngIf=\"focused\"\n class=\"govuk-button hmcts hmcts-button--secondary\"\n role=\"button\"\n (click)=\"onCancel()\">Cancel</button>\n </div>\n</form>\n", styles: ["form{width:95%;margin-bottom:5px;position:absolute;background-color:#fff;padding:20px 20px 0}form textarea{width:95%;padding:2px;border:none;font-size:17px;font-family:nta,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-weight:400;overflow:hidden;resize:none}.mimic-focus{outline-offset:-2px;outline:#0b0c0c auto 5px}textarea.view-mode:focus{outline:0}#detailsWrapper{padding:0}#detailsWrapper.expanded{margin-bottom:15px}.commentBtns{height:50px}.expanded{margin-top:0}.collapsed{height:30px}textarea.expanded{margin-bottom:10px}textarea.collapsed{margin-top:-25px;max-height:20px}.collapsed>time{display:none}"] }] } ]; CommentItemComponent.ctorParameters = () => [ { type: AnnotationStoreService }, { type: PdfService }, { type: PdfRenderService }, { type: ChangeDetectorRef }, { type: Renderer2 }, { type: Utils }, { type: EmLoggerService } ]; CommentItemComponent.propDecorators = { comment: [{ type: Input }], annotation: [{ type: Input }], commentSubmitted: [{ type: Output }], commentRendered: [{ type: Output }], commentSelector: [{ type: ViewChild, args: ['commentSelector',] }], commentArea: [{ type: ViewChild, args: ['commentArea',] }], commentItem: [{ type: ViewChild, args: ['commentItem',] }], detailsWrapper: [{ type: ViewChild, args: ['detailsWrapper',] }], commentDate: [{ type: ViewChild, args: ['commentDate',] }] }; if (false) { /** * @type {?} * @private */ CommentItemComponent.prototype.commentBtnSub; /** * @type {?} * @private */ CommentItemComponent.prototype.commentFocusSub; /** * @type {?} * @private */ CommentItemComponent.prototype.dataLoadedSub; /** @type {?} */ CommentItemComponent.prototype.hideButton; /** @type {?} */ CommentItemComponent.prototype.focused; /** @type {?} */ CommentItemComponent.prototype.sliceComment; /** @type {?} */ CommentItemComponent.prototype.comment; /** @type {?} */ CommentItemComponent.prototype.annotation; /** @type {?} */ CommentItemComponent.prototype.commentSubmitted; /** @type {?} */ CommentItemComponent.prototype.commentRendered; /** @type {?} */ CommentItemComponent.prototype.commentSelector; /** @type {?} */ CommentItemComponent.prototype.commentArea; /** @type {?} */ CommentItemComponent.prototype.commentItem; /** @type {?} */ CommentItemComponent.prototype.detailsWrapper; /** @type {?} */ CommentItemComponent.prototype.commentDate; /** @type {?} */ CommentItemComponent.prototype.model; /** @type {?} */ CommentItemComponent.prototype.commentTopPos; /** @type {?} */ CommentItemComponent.prototype.commentHeight; /** @type {?} */ CommentItemComponent.prototype.annotationTopPos; /** @type {?} */ CommentItemComponent.prototype.annotationLeftPos; /** @type {?} */ CommentItemComponent.prototype.annotationHeight; /** * @type {?} * @private */ CommentItemComponent.prototype.annotationStoreService; /** * @type {?} * @private */ CommentItemComponent.prototype.pdfService; /** * @type {?} * @private */ CommentItemComponent.prototype.pdfRenderService; /** * @type {?} * @private */ CommentItemComponent.prototype.ref; /** * @type {?} * @private */ CommentItemComponent.prototype.renderer; /** * @type {?} * @private */ CommentItemComponent.prototype.utils; /** * @type {?} * @private */ CommentItemComponent.prototype.log; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi92aWV3ZXJzL2Fubm90YXRpb24tcGRmLXZpZXdlci9jb21tZW50cy9jb21tZW50LWl0ZW0vY29tbWVudC1pdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWEsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3SSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQU92RSxNQUFNOzs7Ozs7Ozs7O0lBMkJGLFlBQW9CLHNCQUE4QyxFQUM5QyxVQUFzQixFQUN0QixnQkFBa0MsRUFDbEMsR0FBc0IsRUFDdEIsUUFBbUIsRUFDbkIsS0FBWSxFQUNaLEdBQW9CO1FBTnBCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFD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MUIsZ0RBQXlCOzs7OztJQUViLHNEQUFzRDs7Ozs7SUFDdEQsMENBQThCOzs7OztJQUM5QixnREFBMEM7Ozs7O0lBQzFDLG1DQUE4Qjs7Ozs7SUFDOUIsd0NBQTJCOzs7OztJQUMzQixxQ0FBb0I7Ozs7O0lBQ3BCLG1DQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmLCBSZW5kZXJlcjJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOZ0Zvcm19IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQW5ub3RhdGlvbiwgQ29tbWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zZXQubW9kZWwnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhL3BkZi5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS91dGlscyc7XG5pbXBvcnQgeyBFbUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9sb2dnaW5nL2VtLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBkZlJlbmRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhL3BkZi1yZW5kZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWNvbW1lbnQtaXRlbScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbW1lbnQtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY29tbWVudC1pdGVtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ29tbWVudEl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwcml2YXRlIGNvbW1lbnRCdG5TdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGNvbW1lbnRGb2N1c1N1YjogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgZGF0YUxvYWRlZFN1YjogU3Vic2NyaXB0aW9uO1xuICAgIGhpZGVCdXR0b246IGJvb2xlYW47XG4gICAgZm9jdXNlZDogYm9vbGVhbjtcbiAgICBzbGljZUNvbW1lbnQ6IHN0cmluZztcblxuICAgIEBJbnB1dCgpIGNvbW1lbnQ6IENvbW1lbnQ7XG4gICAgQElucHV0KCkgYW5ub3RhdGlvbjogQW5ub3RhdGlvbjtcblxuICAgIEBPdXRwdXQoKSBjb21tZW50U3VibWl0dGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBjb21tZW50UmVuZGVyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQFZpZXdDaGlsZCgnY29tbWVudFNlbGVjdG9yJykgY29tbWVudFNlbGVjdG9yOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbW1lbnRBcmVhJykgY29tbWVudEFyZWE6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY29tbWVudEl0ZW0nKSBjb21tZW50SXRlbTogTmdGb3JtO1xuICAgIEBWaWV3Q2hpbGQoJ2RldGFpbHNXcmFwcGVyJykgZGV0YWlsc1dyYXBwZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY29tbWVudERhdGUnKSBjb21tZW50RGF0ZTogRWxlbWVudFJlZjtcbiAgICBcbiAgICBtb2RlbCA9IG5ldyBDb21tZW50KG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuICAgIGNvbW1lbnRUb3BQb3M6IG51bWJlcjtcbiAgICBjb21tZW50SGVpZ2h0OiBudW1iZXI7XG4gICAgYW5ub3RhdGlvblRvcFBvczogbnVtYmVyO1xuICAgIGFubm90YXRpb25MZWZ0UG9zOiBudW1iZXI7XG4gICAgYW5ub3RhdGlvbkhlaWdodDogbnVtYmVyO1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYW5ub3RhdGlvblN0b3JlU2VydmljZTogQW5ub3RhdGlvblN0b3JlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHBkZlNlcnZpY2U6IFBkZlNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZSZW5kZXJTZXJ2aWNlOiBQZGZSZW5kZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBsb2c6IEVtTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZy5zZXRDbGFzcygnQ29tbWVudEl0ZW1Db21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5oaWRlQnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2xpY2VDb21tZW50ID0gdGhpcy5jb21tZW50LmNvbnRlbnQ7XG5cbiAgICAgICAgdGhpcy5jb21tZW50Rm9jdXNTdWIgPSB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0Q29tbWVudEZvY3VzU3ViamVjdCgpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYW5ub3RhdGlvbi5pZCA9PT0gdGhpcy5jb21tZW50LmFubm90YXRpb25JZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNob3dCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25FZGl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNob3dCdG4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25CbHVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRCdG5TdWIgPSB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0Q29tbWVudEJ0blN1YmplY3QoKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY29tbWVudElkKSA9PiB7XG4gICAgICAgICAgICAgICAgKGNvbW1lbnRJZCA9PT0gdGhpcy5jb21tZW50LmlkKSA/IHRoaXMuaGFuZGxlU2hvd0J0bigpIDogdGhpcy5oYW5kbGVIaWRlQnRuKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kYXRhTG9hZGVkU3ViID0gdGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmdldERhdGFMb2FkZWRTdWIoKVxuICAgICAgICAgICAgLnN1YnNjcmliZSggKGRhdGFMb2FkZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YUxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25Ub3BQb3MgPSB0aGlzLmdldFJlbGF0aXZlUG9zaXRpb24odGhpcy5jb21tZW50LmFubm90YXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudFRvcFBvcyA9IHRoaXMuYW5ub3RhdGlvblRvcFBvcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlscy5zb3J0QnlYKHRoaXMuYW5ub3RhdGlvbi5yZWN0YW5nbGVzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uSGVpZ2h0ID0gdGhpcy51dGlscy5nZXRBbm5vdGF0aW9uTGluZUhlaWdodCh0aGlzLmFubm90YXRpb24ucmVjdGFuZ2xlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkxlZnRQb3MgPSB0aGlzLmFubm90YXRpb24ucmVjdGFuZ2xlc1swXS54O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1lbnRSZW5kZXJlZC5lbWl0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlQ29tbWVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tbWVudEl0ZW0uc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZENvbW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0KCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsICdmaXQtY29udGVudCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsICh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0KSArICdweCcpO1xuICAgICAgICB0aGlzLmNvbW1lbnRIZWlnaHQgPSAgdGhpcy5jb21tZW50U2VsZWN0b3IubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIHRoaXMuY29tbWVudFJlbmRlcmVkLmVtaXQodHJ1ZSk7XG4gICAgICAgIGlmICghdGhpcy5yZWZbJ2Rlc3Ryb3llZCddKSB7XG4gICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tbWVudEZvY3VzU3ViKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRGb2N1c1N1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbW1lbnRCdG5TdWIpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudEJ0blN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGFMb2FkZWRTdWIpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZFN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TdWJtaXQoKSB7XG4gICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmNvbnZlcnRGb3JtVG9Db21tZW50KHRoaXMuY29tbWVudEl0ZW0pO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZWRpdENvbW1lbnQoY29tbWVudCk7XG4gICAgICAgIHRoaXMuY29tbWVudFN1Ym1pdHRlZC5lbWl0KHRoaXMuYW5ub3RhdGlvbik7XG5cbiAgICAgICAgdGhpcy52aWV3T25seSgpO1xuICAgIH1cblxuICAgIG9uRWRpdCgpIHtcbiAgICAgICAgdGhpcy5lZGl0T25seSgpO1xuICAgIH1cblxuICAgIG9uQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdGhpcy5jb21tZW50LmNvbnRlbnQpO1xuICAgICAgICB0aGlzLnZpZXdPbmx5KCk7XG4gICAgfVxuXG4gICAgdmlld09ubHkoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LCAndmlldy1tb2RlJyk7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGVkaXRPbmx5KCkge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ3ZpZXctbW9kZScpO1xuICAgIH1cblxuICAgIGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmNvbW1lbnQuY3JlYXRlZERhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbW1lbnQubGFzdE1vZGlmaWVkQnkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbW1lbnQuY3JlYXRlZERhdGUgPT09IHRoaXMuY29tbWVudC5sYXN0TW9kaWZpZWREYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQmx1cigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZlsnZGVzdHJveWVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnZlcnRGb3JtVG9Db21tZW50KGNvbW1lbnRGb3JtOiBOZ0Zvcm0pOiBDb21tZW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tZW50KFxuICAgICAgICAgICAgdGhpcy5jb21tZW50LmlkLFxuICAgICAgICAgICAgdGhpcy5jb21tZW50LmFubm90YXRpb25JZCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbmV3IERhdGUoKSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGNvbW1lbnRGb3JtLnZhbHVlLmNvbnRlbnRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBoYW5kbGVEZWxldGVDb21tZW50KCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZGVsZXRlQ29tbWVudCh0aGlzLmNvbW1lbnQuaWQpO1xuICAgIH1cblxuICAgIGhhbmRsZUNvbW1lbnRDbGljayhldmVudDogYW55KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0Q29tbWVudEJ0blN1YmplY3QodGhpcy5jb21tZW50LmlkKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldEFubm90YXRpb25Gb2N1c1N1YmplY3QodGhpcy5hbm5vdGF0aW9uKTtcbiAgICB9XG5cbiAgICBoYW5kbGVTaG93QnRuKCkge1xuICAgICAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZUJ1dHRvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5leHBhbmRDb21tZW50KCk7XG4gICAgICAgICAgICByZXNvbHZlKCdTdWNjZXNzJyk7XG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZUhpZGVCdG4oKSB7XG4gICAgICAgIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbW1lbnRJdGVtLnZhbHVlLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZGVsZXRlQ29tbWVudCh0aGlzLmNvbW1lbnQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmhpZGVCdXR0b24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUNvbW1lbnQoKTtcbiAgICAgICAgICAgIHJlc29sdmUoJ1N1Y2Nlc3MnKTtcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb2xsYXBzZUNvbW1lbnQoKSB7XG4gICAgICAgIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRDb21tZW50KCk7XG4gICAgICAgICAgICByZXNvbHZlKCdTdWNjZXNzJyk7XG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29tbWVudEVtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNocmlua0NvbW1lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LCAnY29sbGFwc2VkJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2V4cGFuZGVkJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZGV0YWlsc1dyYXBwZXIubmF0aXZlRWxlbWVudCwgJ2NvbGxhcHNlZCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQsICd2aWV3LW1vZGUnKTtcblxuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNDb21tZW50RW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQuY29udGVudCA9PT0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgaXNTaHJpbmthYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCA+IDMxO1xuICAgIH1cblxuICAgIHNocmlua0NvbW1lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2hyaW5rYWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnNsaWNlQ29tbWVudCA9IHRoaXMucmVtb3ZlTXVsdGlwbGVMaW5lcygpLnNsaWNlKDAsIDIwKSArICcuLi4nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlTXVsdGlwbGVMaW5lcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50LmNvbnRlbnQuc3BsaXQoJ1xcbicpLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBleHBhbmRDb21tZW50KCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2V4cGFuZGVkJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LCAnY29sbGFwc2VkJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kZXRhaWxzV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnY29sbGFwc2VkJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kZXRhaWxzV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnZXhwYW5kZWQnKTtcblxuICAgICAgICB0aGlzLnNsaWNlQ29tbWVudCA9IHRoaXMuY29tbWVudC5jb250ZW50O1xuICAgICAgICB0aGlzLnNldEhlaWdodCgpO1xuICAgIH1cblxuICAgIGdldFJlbGF0aXZlUG9zaXRpb24oYW5ub3RhdGlvbklkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdmdTZWxlY3RvciA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXRWaWV3ZXJFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVlcnlTZWxlY3RvcihgZ1tkYXRhLXBkZi1hbm5vdGF0ZS1pZD1cIiR7YW5ub3RhdGlvbklkfVwiXWApO1xuICAgICAgICBpZiAoc3ZnU2VsZWN0b3IgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0UmVjdCA9IDxET01SZWN0PiBzdmdTZWxlY3Rvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gPERPTVJlY3Q+IHRoaXMucGRmU2VydmljZS5nZXRBbm5vdGF0aW9uV3JhcHBlcigpLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoaGlnaGxpZ2h0UmVjdC55IC0gd3JhcHBlclJlY3QudG9wKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==