@hmcts/media-viewer
Version:
123 lines • 21.3 kB
JavaScript
import { Component, Input, ViewChild, ViewChildren, } from '@angular/core';
import { select } from '@ngrx/store';
import * as fromActions from '../../store/actions/annotation.actions';
import * as fromSelectors from '../../store/selectors/annotation.selectors';
import * as i0 from "@angular/core";
import * as i1 from "@ngrx/store";
import * as i2 from "./comment/comment.service";
import * as i3 from "./comment-set-render.service";
import * as i4 from "../../toolbar/toolbar-event.service";
import * as i5 from "@angular/common";
import * as i6 from "./comment/comment.component";
export class CommentSetComponent {
constructor(store, commentService, renderService, toolbarEvents) {
this.store = store;
this.commentService = commentService;
this.renderService = renderService;
this.toolbarEvents = toolbarEvents;
this.pageHeights = [];
this.subscriptions = [];
this.clearSelection();
}
ngOnInit() {
this.comments$ = this.store.pipe(select(fromSelectors.getCommentsArray));
this.annoEntities$ = this.store.pipe(select(fromSelectors.getAnnotationEntities));
this.subscriptions.push(this.toolbarEvents.commentsPanelVisible.subscribe(toggle => {
this.redrawComments();
this.showCommentsPanel = toggle;
}));
this.subscriptions.push(this.toolbarEvents.rotateSubject.subscribe(rotate => this.rotateDocument()));
}
ngOnChanges(changes) {
if (changes.annotationSet) {
this.commentService.setCommentSet(this);
}
if (changes.contentScrollTop) {
if (this.container) {
this.container.nativeElement.scrollTo(0, this.contentScrollTop);
}
}
}
ngOnDestroy() {
if (this.subscriptions.length > 0) {
this.subscriptions.forEach(subscription => subscription.unsubscribe());
}
}
onSelect(annotationId) {
this.store.dispatch(new fromActions.SelectedAnnotation(annotationId));
}
onCommentDelete(comment) {
const annotation = this.annotationSet.annotations.find(anno => anno.id === comment.annotationId);
const comments = [];
const annot = {
...annotation,
comments
};
this.onAnnotationUpdate(annot);
this.redrawComments();
}
redrawComments() {
setTimeout(() => {
const componentList = this.commentComponents.map(comment => comment);
this.renderService.redrawComponents(componentList, this.pageHeights, this.rotate, this.zoom);
}, 0);
}
rotateDocument() {
if (this.panel) {
this.panel.nativeElement.style.height = '0';
}
}
onCommentUpdate(payload) {
const annotation = this.annotationSet.annotations.find(anno => anno.id === payload.comment.annotationId);
const comments = [payload.comment];
const tags = payload.tags;
const annot = {
...annotation,
comments,
tags
};
this.onAnnotationUpdate(annot);
}
onAnnotationUpdate(annotation) {
this.store.dispatch(new fromActions.SaveAnnotation(annotation));
}
onContainerClick(e) {
if (e.path && e.path[0] === this.panel.nativeElement) {
this.clearSelection();
}
}
clearSelection() {
this.store.dispatch(new fromActions.SelectedAnnotation({ annotationId: '', editable: false, selected: false }));
}
allCommentsSaved() {
this.commentService.allCommentsSaved();
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CommentSetComponent, deps: [{ token: i1.Store }, { token: i2.CommentService }, { token: i3.CommentSetRenderService }, { token: i4.ToolbarEventService }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CommentSetComponent, selector: "mv-comment-set", inputs: { annotationSet: "annotationSet", zoom: "zoom", rotate: "rotate", height: "height", pageHeights: "pageHeights", contentScrollTop: "contentScrollTop" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }, { propertyName: "commentComponents", predicate: ["commentComponent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #container [ngClass]=\"{'comments': showCommentsPanel}\">\n <div #panel [ngClass]=\"{ 'comments-panel comment-container': true, 'expanded': showCommentsPanel }\"\n [style.height.px]=\"height\"\n (click)=\"onContainerClick($event)\">\n <ng-container *ngFor=\"let comment of (comments$ | async); let i = index;\">\n <mv-anno-comment\n [ngStyle]=\"showCommentsPanel ? {} : {'display':'none'}\"\n #commentComponent\n (commentClick)=\"onSelect($event)\"\n (delete)=\"onCommentDelete($event)\"\n (updated)=\"onCommentUpdate($event)\"\n (changes)=\"allCommentsSaved()\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [index]=\"i\"\n [page]=\"comment.page\"\n [comment]=\"comment\"\n [annotation]=\"(annoEntities$ | async)[comment.annotationId]\"\n (renderComments)=\"redrawComments()\">\n </mv-anno-comment>\n </ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.CommentComponent, selector: "mv-anno-comment", inputs: ["rotate", "zoom", "index", "page", "comment", "annotation"], outputs: ["commentClick", "renderComments", "delete", "updated", "changes"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CommentSetComponent, decorators: [{
type: Component,
args: [{ selector: 'mv-comment-set', template: "<div #container [ngClass]=\"{'comments': showCommentsPanel}\">\n <div #panel [ngClass]=\"{ 'comments-panel comment-container': true, 'expanded': showCommentsPanel }\"\n [style.height.px]=\"height\"\n (click)=\"onContainerClick($event)\">\n <ng-container *ngFor=\"let comment of (comments$ | async); let i = index;\">\n <mv-anno-comment\n [ngStyle]=\"showCommentsPanel ? {} : {'display':'none'}\"\n #commentComponent\n (commentClick)=\"onSelect($event)\"\n (delete)=\"onCommentDelete($event)\"\n (updated)=\"onCommentUpdate($event)\"\n (changes)=\"allCommentsSaved()\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [index]=\"i\"\n [page]=\"comment.page\"\n [comment]=\"comment\"\n [annotation]=\"(annoEntities$ | async)[comment.annotationId]\"\n (renderComments)=\"redrawComments()\">\n </mv-anno-comment>\n </ng-container>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.Store }, { type: i2.CommentService }, { type: i3.CommentSetRenderService }, { type: i4.ToolbarEventService }], propDecorators: { annotationSet: [{
type: Input
}], zoom: [{
type: Input
}], rotate: [{
type: Input
}], height: [{
type: Input
}], pageHeights: [{
type: Input
}], contentScrollTop: [{
type: Input
}], container: [{
type: ViewChild,
args: ['container', { static: false }]
}], panel: [{
type: ViewChild,
args: ['panel', { static: false }]
}], commentComponents: [{
type: ViewChildren,
args: ['commentComponent']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1zZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvY29tbWVudC1zZXQvY29tbWVudC1zZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvY29tbWVudC1zZXQvY29tbWVudC1zZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBSUwsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsTUFBTSxFQUFTLE1BQU0sYUFBYSxDQUFDO0FBUzVDLE9BQU8sS0FBSyxXQUFXLE1BQU0sd0NBQXdDLENBQUM7QUFDdEUsT0FBTyxLQUFLLGFBQWEsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7QUFTNUUsTUFBTSxPQUFPLG1CQUFtQjtJQXFCOUIsWUFBb0IsS0FBMEMsRUFDakMsY0FBOEIsRUFDOUIsYUFBc0MsRUFDdEMsYUFBa0M7UUFIM0MsVUFBSyxHQUFMLEtBQUssQ0FBcUM7UUFDakMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUF5QjtRQUN0QyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFsQnRELGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBS2xCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQWN6QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FB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QWdCOytLQUtqQixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVFtQyxTQUFTO3NCQUFqRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ0YsS0FBSztzQkFBekMsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNELGlCQUFpQjtzQkFBbEQsWUFBWTt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LCBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2VsZWN0LCBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcblxuaW1wb3J0IHsgQW5ub3RhdGlvblNldCB9IGZyb20gJy4uL2Fubm90YXRpb24tc2V0L2Fubm90YXRpb24tc2V0Lm1vZGVsJztcbmltcG9ydCB7IEFubm90YXRpb24gfSBmcm9tICcuLi9hbm5vdGF0aW9uLXNldC9hbm5vdGF0aW9uLXZpZXcvYW5ub3RhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBDb21tZW50IH0gZnJvbSAnLi9jb21tZW50L2NvbW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgQ29tbWVudENvbXBvbmVudCB9IGZyb20gJy4vY29tbWVudC9jb21tZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tZW50U2VydmljZSB9IGZyb20gJy4vY29tbWVudC9jb21tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbWVudFNldFJlbmRlclNlcnZpY2UgfSBmcm9tICcuL2NvbW1lbnQtc2V0LXJlbmRlci5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIGZyb21TdG9yZSBmcm9tICcuLi8uLi9zdG9yZS9yZWR1Y2Vycy9yZWR1Y2Vycyc7XG5pbXBvcnQgKiBhcyBmcm9tQWN0aW9ucyBmcm9tICcuLi8uLi9zdG9yZS9hY3Rpb25zL2Fubm90YXRpb24uYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBmcm9tU2VsZWN0b3JzIGZyb20gJy4uLy4uL3N0b3JlL3NlbGVjdG9ycy9hbm5vdGF0aW9uLnNlbGVjdG9ycyc7XG5pbXBvcnQgeyBUYWdzTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvdGFncy5tb2RlbCc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Bbm5vdGF0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2V2ZW50LXNlbGVjdC5tb2RlbCc7XG5pbXBvcnQgeyBUb29sYmFyRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sYmFyLWV2ZW50LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdi1jb21tZW50LXNldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21tZW50LXNldC5jb21wb25lbnQuaHRtbCcsXG4gfSlcbmV4cG9ydCBjbGFzcyBDb21tZW50U2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgYW5ub3RhdGlvblNldDogQW5ub3RhdGlvblNldDtcbiAgQElucHV0KCkgem9vbTogbnVtYmVyO1xuICBASW5wdXQoKSByb3RhdGU6IG51bWJlcjtcbiAgQElucHV0KCkgaGVpZ2h0OiBudW1iZXI7XG4gIEBJbnB1dCgpIHBhZ2VIZWlnaHRzID0gW107XG4gIEBJbnB1dCgpIGNvbnRlbnRTY3JvbGxUb3A6IG51bWJlcjtcblxuICBjb21tZW50czogQ29tbWVudFtdO1xuICB0YWdzOiBUYWdzTW9kZWxbXTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwdWJsaWMgY29tbWVudHMkOiBPYnNlcnZhYmxlPEFubm90YXRpb25bXT47XG4gIHB1YmxpYyBhbm5vRW50aXRpZXMkOiBPYnNlcnZhYmxlPHsgW2lkOiBzdHJpbmddOiBBbm5vdGF0aW9uIH0+O1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHtzdGF0aWM6IGZhbHNlfSkgY29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgncGFuZWwnLCB7c3RhdGljOiBmYWxzZX0pIHBhbmVsOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZHJlbignY29tbWVudENvbXBvbmVudCcpIGNvbW1lbnRDb21wb25lbnRzOiBRdWVyeUxpc3Q8Q29tbWVudENvbXBvbmVudD47XG5cbiAgc2hvd0NvbW1lbnRzUGFuZWw6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yZTogU3RvcmU8ZnJvbVN0b3JlLkFubm90YXRpb25TZXRTdGF0ZT4sXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWVudFNlcnZpY2U6IENvbW1lbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlclNlcnZpY2U6IENvbW1lbnRTZXRSZW5kZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHRvb2xiYXJFdmVudHM6IFRvb2xiYXJFdmVudFNlcnZpY2UpIHtcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbW1lbnRzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZnJvbVNlbGVjdG9ycy5nZXRDb21tZW50c0FycmF5KSk7XG4gICAgdGhpcy5hbm5vRW50aXRpZXMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChmcm9tU2VsZWN0b3JzLmdldEFubm90YXRpb25FbnRpdGllcykpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy50b29sYmFyRXZlbnRzLmNvbW1lbnRzUGFuZWxWaXNpYmxlLnN1YnNjcmliZSh0b2dnbGUgPT4ge1xuICAgICAgICB0aGlzLnJlZHJhd0NvbW1lbnRzKCk7XG4gICAgICAgIHRoaXMuc2hvd0NvbW1lbnRzUGFuZWwgPSB0b2dnbGU7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy50b29sYmFyRXZlbnRzLnJvdGF0ZVN1YmplY3Quc3Vic2NyaWJlKHJvdGF0ZSA9PiB0aGlzLnJvdGF0ZURvY3VtZW50KCkpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5hbm5vdGF0aW9uU2V0KSB7XG4gICAgICB0aGlzLmNvbW1lbnRTZXJ2aWNlLnNldENvbW1lbnRTZXQodGhpcyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmNvbnRlbnRTY3JvbGxUb3ApIHtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKDAsIHRoaXMuY29udGVudFNjcm9sbFRvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWJzY3JpcHRpb24gPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdChhbm5vdGF0aW9uSWQ6IFNlbGVjdGlvbkFubm90YXRpb24pIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBmcm9tQWN0aW9ucy5TZWxlY3RlZEFubm90YXRpb24oYW5ub3RhdGlvbklkKSk7XG4gIH1cblxuICBwdWJsaWMgb25Db21tZW50RGVsZXRlKGNvbW1lbnQ6IENvbW1lbnQpIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uID0gdGhpcy5hbm5vdGF0aW9uU2V0LmFubm90YXRpb25zLmZpbmQoYW5ubyA9PiBhbm5vLmlkID09PSBjb21tZW50LmFubm90YXRpb25JZCk7XG4gICAgY29uc3QgY29tbWVudHMgPSBbXTtcbiAgICBjb25zdCBhbm5vdCA9IHtcbiAgICAgIC4uLmFubm90YXRpb24sXG4gICAgICBjb21tZW50c1xuICAgIH07XG4gICAgdGhpcy5vbkFubm90YXRpb25VcGRhdGUoYW5ub3QpO1xuICAgIHRoaXMucmVkcmF3Q29tbWVudHMoKTtcbiAgfVxuXG4gIHJlZHJhd0NvbW1lbnRzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50TGlzdDogQ29tbWVudENvbXBvbmVudFtdID0gdGhpcy5jb21tZW50Q29tcG9uZW50cy5tYXAoY29tbWVudCA9PiBjb21tZW50KTtcbiAgICAgICAgdGhpcy5yZW5kZXJTZXJ2aWNlLnJlZHJhd0NvbXBvbmVudHMoY29tcG9uZW50TGlzdCwgdGhpcy5wYWdlSGVpZ2h0cywgdGhpcy5yb3RhdGUsIHRoaXMuem9vbSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHJvdGF0ZURvY3VtZW50KCkge1xuICAgIGlmICh0aGlzLnBhbmVsKSB7XG4gICAgICB0aGlzLnBhbmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNvbW1lbnRVcGRhdGUocGF5bG9hZDoge2NvbW1lbnQ6IENvbW1lbnQsIHRhZ3M6IFRhZ3NNb2RlbFtdfSApIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uID0gdGhpcy5hbm5vdGF0aW9uU2V0LmFubm90YXRpb25zLmZpbmQoYW5ubyA9PiBhbm5vLmlkID09PSBwYXlsb2FkLmNvbW1lbnQuYW5ub3RhdGlvbklkKTtcbiAgICBjb25zdCBjb21tZW50cyA9IFtwYXlsb2FkLmNvbW1lbnRdO1xuICAgIGNvbnN0IHRhZ3MgPSBwYXlsb2FkLnRhZ3M7XG4gICAgY29uc3QgYW5ub3QgPSB7XG4gICAgICAuLi5hbm5vdGF0aW9uLFxuICAgICAgY29tbWVudHMsXG4gICAgICB0YWdzXG4gICAgfTtcbiAgICB0aGlzLm9uQW5ub3RhdGlvblVwZGF0ZShhbm5vdCk7XG4gIH1cblxuICBwdWJsaWMgb25Bbm5vdGF0aW9uVXBkYXRlKGFubm90YXRpb246IEFubm90YXRpb24pIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBmcm9tQWN0aW9ucy5TYXZlQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7XG4gIH1cblxuICBvbkNvbnRhaW5lckNsaWNrKGUpIHtcbiAgICBpZiAoZS5wYXRoICYmIGUucGF0aFswXSA9PT0gdGhpcy5wYW5lbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgZnJvbUFjdGlvbnMuU2VsZWN0ZWRBbm5vdGF0aW9uKHsgYW5ub3RhdGlvbklkOiAnJywgZWRpdGFibGU6IGZhbHNlLCBzZWxlY3RlZDogZmFsc2V9KSk7XG4gIH1cblxuICBhbGxDb21tZW50c1NhdmVkKCkge1xuICAgIHRoaXMuY29tbWVudFNlcnZpY2UuYWxsQ29tbWVudHNTYXZlZCgpO1xuICB9XG59XG4iLCI8ZGl2ICNjb250YWluZXIgW25nQ2xhc3NdPVwieydjb21tZW50cyc6IHNob3dDb21tZW50c1BhbmVsfVwiPlxuICA8ZGl2ICNwYW5lbCBbbmdDbGFzc109XCJ7ICdjb21tZW50cy1wYW5lbCBjb21tZW50LWNvbnRhaW5lcic6IHRydWUsICdleHBhbmRlZCc6IHNob3dDb21tZW50c1BhbmVsIH1cIlxuICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhlaWdodFwiXG4gICAgIChjbGljayk9XCJvbkNvbnRhaW5lckNsaWNrKCRldmVudClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb21tZW50IG9mIChjb21tZW50cyQgfCBhc3luYyk7IGxldCBpID0gaW5kZXg7XCI+XG4gICAgICA8bXYtYW5uby1jb21tZW50XG4gICAgICAgIFtuZ1N0eWxlXT1cInNob3dDb21tZW50c1BhbmVsID8ge30gOiB7J2Rpc3BsYXknOidub25lJ31cIlxuICAgICAgICAjY29tbWVudENvbXBvbmVudFxuICAgICAgICAoY29tbWVudENsaWNrKT1cIm9uU2VsZWN0KCRldmVudClcIlxuICAgICAgICAoZGVsZXRlKT1cIm9uQ29tbWVudERlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgKHVwZGF0ZWQpPVwib25Db21tZW50VXBkYXRlKCRldmVudClcIlxuICAgICAgICAoY2hhbmdlcyk9XCJhbGxDb21tZW50c1NhdmVkKClcIlxuICAgICAgICBbem9vbV09XCJ6b29tXCJcbiAgICAgICAgW3JvdGF0ZV09XCJyb3RhdGVcIlxuICAgICAgICBbaW5kZXhdPVwiaVwiXG4gICAgICAgIFtwYWdlXT1cImNvbW1lbnQucGFnZVwiXG4gICAgICAgIFtjb21tZW50XT1cImNvbW1lbnRcIlxuICAgICAgICBbYW5ub3RhdGlvbl09XCIoYW5ub0VudGl0aWVzJCB8IGFzeW5jKVtjb21tZW50LmFubm90YXRpb25JZF1cIlxuICAgICAgICAocmVuZGVyQ29tbWVudHMpPVwicmVkcmF3Q29tbWVudHMoKVwiPlxuICAgICAgPC9tdi1hbm5vLWNvbW1lbnQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=