UNPKG

@hmcts/media-viewer

Version:
177 lines 33.1 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { distinctUntilChanged } from 'rxjs/operators'; import * as fromSelector from '../../../store/selectors/annotation.selectors'; import * as i0 from "@angular/core"; import * as i1 from "@ngrx/store"; import * as i2 from "./comment.service"; import * as i3 from "../../services/tags/tags.services"; import * as i4 from "@angular/common"; import * as i5 from "@angular/forms"; import * as i6 from "./text-highlight/text-highlight.directive"; import * as i7 from "./textarea-auto-expand/textarea-auto-expand.directive"; import * as i8 from "../../tags/tags.component"; import * as i9 from "rpx-xui-translation"; import * as i10 from "../../pipes/date/date.pipe"; export class CommentComponent { constructor(store, commentService, tagsServices) { this.store = store; this.commentService = commentService; this.tagsServices = tagsServices; this.CHAR_LIMIT = 5000; this.totalPrevPagesHeight = 0; this.hasUnsavedChanges = false; this.commentClick = new EventEmitter(); this.renderComments = new EventEmitter(); this.delete = new EventEmitter(); this.updated = new EventEmitter(); this.changes = new EventEmitter(); this.rotate = 0; this.zoom = 1; } ngOnInit() { this.subscriptions = this.store.select(fromSelector.getComponentSearchText) .pipe(distinctUntilChanged()).subscribe(searchString => this.searchString = searchString); this.reRenderComments(); this.marginToComment$ = this.commentService.marginToCommentEmitter.asObservable(); } ngAfterContentInit() { if (this.tagItems && this.tagItems.length) { this.tagsServices.updateTagItems(this.tagItems, this._comment.annotationId); } } ngOnDestroy() { this.subscriptions.unsubscribe(); } set comment(comment) { this._comment = { ...comment }; this.page = this._comment.page; this.lastUpdate = comment.lastModifiedDate ? comment.lastModifiedDate : comment.createdDate; this.author = comment.createdByDetails; this.createdBy = comment.createdBy; this.editor = comment.lastModifiedByDetails; this.originalComment = comment.content; this.fullComment = this.originalComment; this.selected = this._comment.selected; this._editable = this._comment.editable; this.tagItems = this._comment.tags; const pageMarginBottom = 10; this.totalPrevPagesHeight = 0; for (let i = 0; i < this.page - 1; i++) { const height = this._comment.pages[i + 1] ? this._comment.pages[i + 1].styles.height : undefined; if (height) { this.totalPrevPagesHeight += height + pageMarginBottom; } } } get comment() { return this._comment; } set annotation(annotation) { this._rectangle = annotation.rectangles .reduce((prev, current) => prev.y < current.y ? prev : current); const actualHeight = this._comment.pages[this.page].styles.height / this.zoom; switch (this.rotate) { case 90: this.rectTop = this._rectangle.x; break; case 180: this.rectTop = actualHeight - (this._rectangle.y + this._rectangle.height); break; case 270: this.rectTop = actualHeight - (this._rectangle.x + this._rectangle.width); break; default: this.rectTop = this._rectangle.y; } this.rectLeft = this._rectangle.x; } get editable() { return this._editable; } onCommentChange(updatedComment) { this.hasUnsavedChanges = this.originalComment.substring(0, this.CHAR_LIMIT) !== updatedComment.substring(0, this.CHAR_LIMIT); this.commentService.onCommentChange(this.hasUnsavedChanges); } deleteOrCancel() { if (!this.editable) { this.delete.emit(this._comment); } else { this.hasUnsavedChanges = false; this._editable = false; this.fullComment = this.originalComment; this.changes.emit(false); if (!this.author && !this.fullComment) { this.delete.emit(this._comment); } } } editOrSave() { if (!this.editable) { this._editable = true; } else { this._comment.content = this.fullComment.substring(0, this.CHAR_LIMIT); const tags = this.tagsServices.getNewTags(this._comment.annotationId); const payload = { comment: this._comment, tags }; this.updated.emit(payload); this.hasUnsavedChanges = false; this._editable = false; this.changes.emit(false); } } onCommentClick() { if (!this.selected) { this.selected = true; this._editable = false; this.commentClick.emit({ annotationId: this._comment.annotationId, editable: this._editable, selected: true }); } } reRenderComments() { this.renderComments.emit(this._comment); } get commentTop() { return this.totalPrevPagesHeight + (this.rectTop * this.zoom); } get height() { return this.form.nativeElement.getBoundingClientRect().height / this.zoom; } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommentComponent, deps: [{ token: i1.Store }, { token: i2.CommentService }, { token: i3.TagsServices }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CommentComponent, selector: "mv-anno-comment", inputs: { rotate: "rotate", zoom: "zoom", index: "index", page: "page", comment: "comment", annotation: "annotation" }, outputs: { commentClick: "commentClick", renderComments: "renderComments", delete: "delete", updated: "updated", changes: "changes" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "editableComment", first: true, predicate: ["editableComment"], descendants: true }], ngImport: i0, template: "<div\n #form\n (click)=\"onCommentClick()\"\n class=\"aui-comment\"\n [ngClass]=\"{ stylestoggle: (marginToComment$ | async) }\"\n [style.top.px]=\"commentTop\"\n [style.zIndex]=\"selected ? 100 : 0\"\n>\n <div id=\"detailsWrapper {{ index }}\" class=\"aui-comment__header\">\n <span *ngIf=\"author && !editor\" class=\"aui-comment__author\">\n {{ author.forename }} {{ author.surname }}\n </span>\n <span *ngIf=\"editor\" class=\"aui-comment__author\">\n {{ editor.forename }} {{ editor.surname }}\n </span>\n <time [hidden]=\"!selected && !this.editable\" class=\"aui-comment__meta\">\n {{ lastUpdate | momentDate : \"d MMMM y h:mm a\" }}\n </time>\n </div>\n <mv-tags\n [tagItems]=\"tagItems\"\n [userId]=\"createdBy\"\n [editable]=\"editable\"\n [annoId]=\"_comment.annotationId\"\n >\n </mv-tags>\n <textarea\n *ngIf=\"selected && editable\"\n #editableComment\n mvTextAreaAutoExpand\n type=\"text\"\n required\n name=\"content\"\n [maxlength]=\"CHAR_LIMIT\"\n class=\"aui-comment__content form-control mimic-focus edit-mode expanded\"\n [(ngModel)]=\"fullComment\"\n (ngModelChange)=\"reRenderComments(); onCommentChange($event)\"\n aria-label=\"comment\"\n >\n </textarea>\n <p\n *ngIf=\"!editable\"\n mvTextHighlight\n class=\"commentText\"\n [textToHighlight]=\"searchString\"\n >\n {{ fullComment }}\n </p>\n <div\n *ngIf=\"\n selected ||\n this.editable ||\n (!fullComment.length && tagItems && !tagItems.length)\n \"\n class=\"aui-comment__footer commentBtns\"\n >\n <button\n class=\"govuk-button\"\n type=\"button\"\n role=\"button\"\n (click)=\"editOrSave()\"\n >\n {{ !editable ? (\"Edit\" | rpxTranslate) : (\"Save\" | rpxTranslate) }}\n </button>\n <button\n type=\"button\"\n role=\"button\"\n class=\"govuk-button govuk-button--secondary\"\n (click)=\"deleteOrCancel()\"\n >\n {{ !editable ? (\"Delete\" | rpxTranslate) : (\"Cancel\" | rpxTranslate) }}\n </button>\n </div>\n <span class=\"aui-comment__private\">{{ \"private\" | rpxTranslate }}</span>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.TextHighlightDirective, selector: "[mvTextHighlight]", inputs: ["textToHighlight"] }, { kind: "directive", type: i7.TextareaAutoExpandDirective, selector: "[mvTextAreaAutoExpand]" }, { kind: "component", type: i8.TagsComponent, selector: "mv-tags", inputs: ["tagItems", "userId", "editable", "annoId"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.RpxTranslatePipe, name: "rpxTranslate" }, { kind: "pipe", type: i10.MomentDatePipe, name: "momentDate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommentComponent, decorators: [{ type: Component, args: [{ selector: 'mv-anno-comment', template: "<div\n #form\n (click)=\"onCommentClick()\"\n class=\"aui-comment\"\n [ngClass]=\"{ stylestoggle: (marginToComment$ | async) }\"\n [style.top.px]=\"commentTop\"\n [style.zIndex]=\"selected ? 100 : 0\"\n>\n <div id=\"detailsWrapper {{ index }}\" class=\"aui-comment__header\">\n <span *ngIf=\"author && !editor\" class=\"aui-comment__author\">\n {{ author.forename }} {{ author.surname }}\n </span>\n <span *ngIf=\"editor\" class=\"aui-comment__author\">\n {{ editor.forename }} {{ editor.surname }}\n </span>\n <time [hidden]=\"!selected && !this.editable\" class=\"aui-comment__meta\">\n {{ lastUpdate | momentDate : \"d MMMM y h:mm a\" }}\n </time>\n </div>\n <mv-tags\n [tagItems]=\"tagItems\"\n [userId]=\"createdBy\"\n [editable]=\"editable\"\n [annoId]=\"_comment.annotationId\"\n >\n </mv-tags>\n <textarea\n *ngIf=\"selected && editable\"\n #editableComment\n mvTextAreaAutoExpand\n type=\"text\"\n required\n name=\"content\"\n [maxlength]=\"CHAR_LIMIT\"\n class=\"aui-comment__content form-control mimic-focus edit-mode expanded\"\n [(ngModel)]=\"fullComment\"\n (ngModelChange)=\"reRenderComments(); onCommentChange($event)\"\n aria-label=\"comment\"\n >\n </textarea>\n <p\n *ngIf=\"!editable\"\n mvTextHighlight\n class=\"commentText\"\n [textToHighlight]=\"searchString\"\n >\n {{ fullComment }}\n </p>\n <div\n *ngIf=\"\n selected ||\n this.editable ||\n (!fullComment.length && tagItems && !tagItems.length)\n \"\n class=\"aui-comment__footer commentBtns\"\n >\n <button\n class=\"govuk-button\"\n type=\"button\"\n role=\"button\"\n (click)=\"editOrSave()\"\n >\n {{ !editable ? (\"Edit\" | rpxTranslate) : (\"Save\" | rpxTranslate) }}\n </button>\n <button\n type=\"button\"\n role=\"button\"\n class=\"govuk-button govuk-button--secondary\"\n (click)=\"deleteOrCancel()\"\n >\n {{ !editable ? (\"Delete\" | rpxTranslate) : (\"Cancel\" | rpxTranslate) }}\n </button>\n </div>\n <span class=\"aui-comment__private\">{{ \"private\" | rpxTranslate }}</span>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.Store }, { type: i2.CommentService }, { type: i3.TagsServices }], propDecorators: { commentClick: [{ type: Output }], renderComments: [{ type: Output }], delete: [{ type: Output }], updated: [{ type: Output }], changes: [{ type: Output }], rotate: [{ type: Input }], zoom: [{ type: Input }], index: [{ type: Input }], page: [{ type: Input }], form: [{ type: ViewChild, args: ['form', { static: false }] }], editableComment: [{ type: ViewChild, args: ['editableComment', { static: false }] }], comment: [{ type: Input }], annotation: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYS12aWV3ZXIvc3JjL2xpYi9hbm5vdGF0aW9ucy9jb21tZW50LXNldC9jb21tZW50L2NvbW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvY29tbWVudC1zZXQvY29tbWVudC9jb21tZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBU3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3RELE9BQU8sS0FBSyxZQUFZLE1BQU0sK0NBQStDLENBQUM7Ozs7Ozs7Ozs7OztBQVE5RSxNQUFNLE9BQU8sZ0JBQWdCO0lBdUMzQixZQUNVLEtBQTBDLEVBQ2pDLGNBQThCLEVBQ3ZDLFlBQTBCO1FBRjFCLFVBQUssR0FBTCxLQUFLLENBQXFDO1FBQ2pDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUN2QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXhDcEMsZUFBVSxHQUFHLElBQUksQ0FBQztRQVVsQix5QkFBb0IsR0FBRyxDQUFDLENBQUM7UUFJekIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBUWhCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFDdkQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQzdDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3JDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBeUMsQ0FBQztRQUNwRSxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN2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R0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzVFLENBQUM7a0lBeEtVLGdCQUFnQjtzSEFBaEIsZ0JBQWdCLHlmQzlCN0IsOG9FQTJFQTs7NEZEN0NhLGdCQUFnQjtrQkFKNUIsU0FBUzsrQkFDRSxpQkFBaUI7a0lBMkJqQixZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRThCLElBQUk7c0JBQXZDLFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFDYSxlQUFlO3NCQUE3RCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkE2QnpDLE9BQU87c0JBRFYsS0FBSztnQkE2QkYsVUFBVTtzQkFEYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbW1lbnR9IGZyb20gJy4vY29tbWVudC5tb2RlbCc7XG5pbXBvcnQge1VzZXJ9IGZyb20gJy4uLy4uL21vZGVscy91c2VyLm1vZGVsJztcbmltcG9ydCB7UmVjdGFuZ2xlfSBmcm9tICcuLi8uLi9hbm5vdGF0aW9uLXNldC9hbm5vdGF0aW9uLXZpZXcvcmVjdGFuZ2xlL3JlY3RhbmdsZS5tb2RlbCc7XG5pbXBvcnQge1NlbGVjdGlvbkFubm90YXRpb259IGZyb20gJy4uLy4uL21vZGVscy9ldmVudC1zZWxlY3QubW9kZWwnO1xuaW1wb3J0IHtDb21tZW50U2VydmljZX0gZnJvbSAnLi9jb21tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtUYWdzTW9kZWx9IGZyb20gJy4uLy4uL21vZGVscy90YWdzLm1vZGVsJztcbmltcG9ydCB7VGFnc1NlcnZpY2VzfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWdzL3RhZ3Muc2VydmljZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7U3RvcmV9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCAqIGFzIGZyb21TdG9yZSBmcm9tICcuLi8uLi8uLi9zdG9yZS9yZWR1Y2Vycy9yZWR1Y2Vycyc7XG5pbXBvcnQgKiBhcyBmcm9tU2VsZWN0b3IgZnJvbSAnLi4vLi4vLi4vc3RvcmUvc2VsZWN0b3JzL2Fubm90YXRpb24uc2VsZWN0b3JzJztcbmltcG9ydCB7IEFubm90YXRpb25TZXQgfSBmcm9tICcuLi8uLi9hbm5vdGF0aW9uLXNldC9hbm5vdGF0aW9uLXNldC5tb2RlbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uIH0gZnJvbSAnLi4vLi4vYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi12aWV3L2Fubm90YXRpb24ubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdi1hbm5vLWNvbW1lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tbWVudC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcblxuICBDSEFSX0xJTUlUID0gNTAwMDtcbiAgbGFzdFVwZGF0ZTogc3RyaW5nO1xuICBvcmlnaW5hbENvbW1lbnQ6IHN0cmluZztcbiAgZnVsbENvbW1lbnQ6IHN0cmluZztcbiAgYXV0aG9yOiBVc2VyO1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgZWRpdG9yOiBVc2VyO1xuICBfY29tbWVudDogQ29tbWVudDtcbiAgX2VkaXRhYmxlOiBib29sZWFuO1xuICBfcmVjdGFuZ2xlO1xuICB0b3RhbFByZXZQYWdlc0hlaWdodCA9IDA7XG4gIHJlY3RUb3A7XG4gIHJlY3RMZWZ0O1xuICBwYWdlSGVpZ2h0OiBudW1iZXI7XG4gIGhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7XG4gIHNlbGVjdGVkOiBib29sZWFuO1xuICBzZWFyY2hTdHJpbmc6IHN0cmluZztcbiAgcHVibGljIHRhZ0l0ZW1zOiBUYWdzTW9kZWxbXTtcbiAgbWFyZ2luVG9Db21tZW50JDogT2JzZXJ2YWJsZTxib29sZWFuPiA7XG5cblxuXG4gIEBPdXRwdXQoKSBjb21tZW50Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdGlvbkFubm90YXRpb24+KCk7XG4gIEBPdXRwdXQoKSByZW5kZXJDb21tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tbWVudD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tbWVudD4oKTtcbiAgQE91dHB1dCgpIHVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtjb21tZW50OiBDb21tZW50LCB0YWdzOiBUYWdzTW9kZWxbXX0+KCk7XG4gIEBPdXRwdXQoKSBjaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBASW5wdXQoKSByb3RhdGUgPSAwO1xuICBASW5wdXQoKSB6b29tID0gMTtcbiAgQElucHV0KCkgaW5kZXg6IG51bWJlcjtcbiAgQElucHV0KCkgcGFnZTogbnVtYmVyO1xuXG4gIEBWaWV3Q2hpbGQoJ2Zvcm0nLCB7c3RhdGljOiBmYWxzZX0pIGZvcm06IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2VkaXRhYmxlQ29tbWVudCcsIHtzdGF0aWM6IGZhbHNlfSkgZWRpdGFibGVDb21tZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZTxmcm9tU3RvcmUuQW5ub3RhdGlvblNldFN0YXRlPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1lbnRTZXJ2aWNlOiBDb21tZW50U2VydmljZSxcbiAgICBwcml2YXRlIHRhZ3NTZXJ2aWNlczogVGFnc1NlcnZpY2VzXG4gICkge31cblxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHRoaXMuc3RvcmUuc2VsZWN0KGZyb21TZWxlY3Rvci5nZXRDb21wb25lbnRTZWFyY2hUZXh0KVxuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSkuc3Vic2NyaWJlKHNlYXJjaFN0cmluZyA9PiB0aGlzLnNlYXJjaFN0cmluZyA9IHNlYXJjaFN0cmluZyk7XG4gICAgdGhpcy5yZVJlbmRlckNvbW1lbnRzKCk7XG4gICAgdGhpcy5tYXJnaW5Ub0NvbW1lbnQkID0gdGhpcy5jb21tZW50U2VydmljZS5tYXJnaW5Ub0NvbW1lbnRFbWl0dGVyLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRhZ0l0ZW1zICYmIHRoaXMudGFnSXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRhZ3NTZXJ2aWNlcy51cGRhdGVUYWdJdGVtcyh0aGlzLnRhZ0l0ZW1zLCB0aGlzLl9jb21tZW50LmFubm90YXRpb25JZCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgY29tbWVudChjb21tZW50OiBDb21tZW50KSB7XG4gICAgdGhpcy5fY29tbWVudCA9IHsuLi5jb21tZW50fTtcbiAgICB0aGlzLnBhZ2UgPSB0aGlzLl9jb21tZW50LnBhZ2U7XG4gICAgdGhpcy5sYXN0VXBkYXRlID0gY29tbWVudC5sYXN0TW9kaWZpZWREYXRlID8gY29tbWVudC5sYXN0TW9kaWZpZWREYXRlIDogY29tbWVudC5jcmVhdGVkRGF0ZTtcbiAgICB0aGlzLmF1dGhvciA9IGNvbW1lbnQuY3JlYXRlZEJ5RGV0YWlscztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGNvbW1lbnQuY3JlYXRlZEJ5O1xuICAgIHRoaXMuZWRpdG9yID0gY29tbWVudC5sYXN0TW9kaWZpZWRCeURldGFpbHM7XG4gICAgdGhpcy5vcmlnaW5hbENvbW1lbnQgPSBjb21tZW50LmNvbnRlbnQ7XG4gICAgdGhpcy5mdWxsQ29tbWVudCA9IHRoaXMub3JpZ2luYWxDb21tZW50O1xuICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLl9jb21tZW50LnNlbGVjdGVkO1xuICAgIHRoaXMuX2VkaXRhYmxlID0gdGhpcy5fY29tbWVudC5lZGl0YWJsZTtcbiAgICB0aGlzLnRhZ0l0ZW1zID0gdGhpcy5fY29tbWVudC50YWdzO1xuICAgIGNvbnN0IHBhZ2VNYXJnaW5Cb3R0b20gPSAxMDtcbiAgICB0aGlzLnRvdGFsUHJldlBhZ2VzSGVpZ2h0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFnZSAtIDE7IGkrKykge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5fY29tbWVudC5wYWdlc1tpICsgMV0gPyB0aGlzLl9jb21tZW50LnBhZ2VzW2kgKyAxXS5zdHlsZXMuaGVpZ2h0IDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGhlaWdodCkge1xuICAgICAgICB0aGlzLnRvdGFsUHJldlBhZ2VzSGVpZ2h0ICs9IGhlaWdodCArIHBhZ2VNYXJnaW5Cb3R0b207XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBnZXQgY29tbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbWVudDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBhbm5vdGF0aW9uKGFubm90YXRpb246IEFubm90YXRpb24pIHtcbiAgICB0aGlzLl9yZWN0YW5nbGUgPSBhbm5vdGF0aW9uLnJlY3RhbmdsZXNcbiAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IHByZXYueSA8IGN1cnJlbnQueSA/IHByZXYgOiBjdXJyZW50KTtcbiAgICBjb25zdCBhY3R1YWxIZWlnaHQgPSB0aGlzLl9jb21tZW50LnBhZ2VzW3RoaXMucGFnZV0uc3R5bGVzLmhlaWdodCAvIHRoaXMuem9vbTtcbiAgICBzd2l0Y2ggKHRoaXMucm90YXRlKSB7XG4gICAgICBjYXNlIDkwOiB0aGlzLnJlY3RUb3AgPSB0aGlzLl9yZWN0YW5nbGUueDtcbiAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6IHRoaXMucmVjdFRvcCA9IGFjdHVhbEhlaWdodCAtICh0aGlzLl9yZWN0YW5nbGUueSArIHRoaXMuX3JlY3RhbmdsZS5oZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDogdGhpcy5yZWN0VG9wID0gYWN0dWFsSGVpZ2h0IC0gKHRoaXMuX3JlY3RhbmdsZS54ICsgdGhpcy5fcmVjdGFuZ2xlLndpZHRoKTtcbiAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDogdGhpcy5yZWN0VG9wID0gdGhpcy5fcmVjdGFuZ2xlLnk7XG4gICAgfVxuICAgIHRoaXMucmVjdExlZnQgPSB0aGlzLl9yZWN0YW5nbGUueDtcbiAgfVxuXG4gIGdldCBlZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdGFibGU7XG4gIH1cblxuICBvbkNvbW1lbnRDaGFuZ2UodXBkYXRlZENvbW1lbnQpIHtcbiAgICB0aGlzLmhhc1Vuc2F2ZWRDaGFuZ2VzID1cbiAgICAgIHRoaXMub3JpZ2luYWxDb21tZW50LnN1YnN0cmluZygwLCB0aGlzLkNIQVJfTElNSVQpICE9PSB1cGRhdGVkQ29tbWVudC5zdWJzdHJpbmcoMCwgdGhpcy5DSEFSX0xJTUlUKTtcbiAgICB0aGlzLmNvbW1lbnRTZXJ2aWNlLm9uQ29tbWVudENoYW5nZSh0aGlzLmhhc1Vuc2F2ZWRDaGFuZ2VzKTtcbiAgfVxuXG4gIGRlbGV0ZU9yQ2FuY2VsKCkge1xuICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xuICAgICAgdGhpcy5kZWxldGUuZW1pdCh0aGlzLl9jb21tZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYXNVbnNhdmVkQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgdGhpcy5fZWRpdGFibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZnVsbENvbW1lbnQgPSB0aGlzLm9yaWdpbmFsQ29tbWVudDtcbiAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KGZhbHNlKTtcbiAgICAgIGlmICghdGhpcy5hdXRob3IgJiYgIXRoaXMuZnVsbENvbW1lbnQpIHtcbiAgICAgICAgdGhpcy5kZWxldGUuZW1pdCh0aGlzLl9jb21tZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZWRpdE9yU2F2ZSgpIHtcbiAgICBpZiAoIXRoaXMuZWRpdGFibGUpIHtcbiAgICAgIHRoaXMuX2VkaXRhYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29tbWVudC5jb250ZW50ID0gdGhpcy5mdWxsQ29tbWVudC5zdWJzdHJpbmcoMCwgdGhpcy5DSEFSX0xJTUlUKTtcbiAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ3NTZXJ2aWNlcy5nZXROZXdUYWdzKHRoaXMuX2NvbW1lbnQuYW5ub3RhdGlvbklkKTtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuX2NvbW1lbnQsXG4gICAgICAgIHRhZ3NcbiAgICAgIH07XG4gICAgICB0aGlzLnVwZGF0ZWQuZW1pdChwYXlsb2FkKTtcbiAgICAgIHRoaXMuaGFzVW5zYXZlZENoYW5nZXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VkaXRhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmNoYW5nZXMuZW1pdChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgb25Db21tZW50Q2xpY2soKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2VkaXRhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmNvbW1lbnRDbGljay5lbWl0KHsgYW5ub3RhdGlvbklkOiB0aGlzLl9jb21tZW50LmFubm90YXRpb25JZCwgZWRpdGFibGU6IHRoaXMuX2VkaXRhYmxlLCBzZWxlY3RlZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICByZVJlbmRlckNvbW1lbnRzKCkge1xuICAgIHRoaXMucmVuZGVyQ29tbWVudHMuZW1pdCh0aGlzLl9jb21tZW50KTtcbiAgfVxuXG4gIGdldCBjb21tZW50VG9wKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG90YWxQcmV2UGFnZXNIZWlnaHQgKyAodGhpcy5yZWN0VG9wICogdGhpcy56b29tKTtcbiAgfVxuXG5cbiAgZ2V0IGhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC8gdGhpcy56b29tO1xuICB9XG59XG4iLCI8ZGl2XG4gICNmb3JtXG4gIChjbGljayk9XCJvbkNvbW1lbnRDbGljaygpXCJcbiAgY2xhc3M9XCJhdWktY29tbWVudFwiXG4gIFtuZ0NsYXNzXT1cInsgc3R5bGVzdG9nZ2xlOiAobWFyZ2luVG9Db21tZW50JCB8IGFzeW5jKSB9XCJcbiAgW3N0eWxlLnRvcC5weF09XCJjb21tZW50VG9wXCJcbiAgW3N0eWxlLnpJbmRleF09XCJzZWxlY3RlZCA/IDEwMCA6IDBcIlxuPlxuICA8ZGl2IGlkPVwiZGV0YWlsc1dyYXBwZXIge3sgaW5kZXggfX1cIiBjbGFzcz1cImF1aS1jb21tZW50X19oZWFkZXJcIj5cbiAgICA8c3BhbiAqbmdJZj1cImF1dGhvciAmJiAhZWRpdG9yXCIgY2xhc3M9XCJhdWktY29tbWVudF9fYXV0aG9yXCI+XG4gICAgICB7eyBhdXRob3IuZm9yZW5hbWUgfX0ge3sgYXV0aG9yLnN1cm5hbWUgfX1cbiAgICA8L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCJlZGl0b3JcIiBjbGFzcz1cImF1aS1jb21tZW50X19hdXRob3JcIj5cbiAgICAgIHt7IGVkaXRvci5mb3JlbmFtZSB9fSB7eyBlZGl0b3Iuc3VybmFtZSB9fVxuICAgIDwvc3Bhbj5cbiAgICA8dGltZSBbaGlkZGVuXT1cIiFzZWxlY3RlZCAmJiAhdGhpcy5lZGl0YWJsZVwiIGNsYXNzPVwiYXVpLWNvbW1lbnRfX21ldGFcIj5cbiAgICAgIHt7IGxhc3RVcGRhdGUgfCBtb21lbnREYXRlIDogXCJkIE1NTU0geSBoOm1tIGFcIiB9fVxuICAgIDwvdGltZT5cbiAgPC9kaXY+XG4gIDxtdi10YWdzXG4gICAgW3RhZ0l0ZW1zXT1cInRhZ0l0ZW1zXCJcbiAgICBbdXNlcklkXT1cImNyZWF0ZWRCeVwiXG4gICAgW2VkaXRhYmxlXT1cImVkaXRhYmxlXCJcbiAgICBbYW5ub0lkXT1cIl9jb21tZW50LmFubm90YXRpb25JZFwiXG4gID5cbiAgPC9tdi10YWdzPlxuICA8dGV4dGFyZWFcbiAgICAqbmdJZj1cInNlbGVjdGVkICYmIGVkaXRhYmxlXCJcbiAgICAjZWRpdGFibGVDb21tZW50XG4gICAgbXZUZXh0QXJlYUF1dG9FeHBhbmRcbiAgICB0eXBlPVwidGV4dFwiXG4gICAgcmVxdWlyZWRcbiAgICBuYW1lPVwiY29udGVudFwiXG4gICAgW21heGxlbmd0aF09XCJDSEFSX0xJTUlUXCJcbiAgICBjbGFzcz1cImF1aS1jb21tZW50X19jb250ZW50IGZvcm0tY29udHJvbCBtaW1pYy1mb2N1cyBlZGl0LW1vZGUgZXhwYW5kZWRcIlxuICAgIFsobmdNb2RlbCldPVwiZnVsbENvbW1lbnRcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cInJlUmVuZGVyQ29tbWVudHMoKTsgb25Db21tZW50Q2hhbmdlKCRldmVudClcIlxuICAgIGFyaWEtbGFiZWw9XCJjb21tZW50XCJcbiAgPlxuICA8L3RleHRhcmVhPlxuICA8cFxuICAgICpuZ0lmPVwiIWVkaXRhYmxlXCJcbiAgICBtdlRleHRIaWdobGlnaHRcbiAgICBjbGFzcz1cImNvbW1lbnRUZXh0XCJcbiAgICBbdGV4dFRvSGlnaGxpZ2h0XT1cInNlYXJjaFN0cmluZ1wiXG4gID5cbiAgICB7eyBmdWxsQ29tbWVudCB9fVxuICA8L3A+XG4gIDxkaXZcbiAgICAqbmdJZj1cIlxuICAgICAgc2VsZWN0ZWQgfHxcbiAgICAgIHRoaXMuZWRpdGFibGUgfHxcbiAgICAgICghZnVsbENvbW1lbnQubGVuZ3RoICYmIHRhZ0l0ZW1zICYmICF0YWdJdGVtcy5sZW5ndGgpXG4gICAgXCJcbiAgICBjbGFzcz1cImF1aS1jb21tZW50X19mb290ZXIgY29tbWVudEJ0bnNcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJnb3Z1ay1idXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJlZGl0T3JTYXZlKClcIlxuICAgID5cbiAgICAgIHt7ICFlZGl0YWJsZSA/IChcIkVkaXRcIiB8IHJweFRyYW5zbGF0ZSkgOiAoXCJTYXZlXCIgfCBycHhUcmFuc2xhdGUpIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiZ292dWstYnV0dG9uIGdvdnVrLWJ1dHRvbi0tc2Vjb25kYXJ5XCJcbiAgICAgIChjbGljayk9XCJkZWxldGVPckNhbmNlbCgpXCJcbiAgICA+XG4gICAgICB7eyAhZWRpdGFibGUgPyAoXCJEZWxldGVcIiB8IHJweFRyYW5zbGF0ZSkgOiAoXCJDYW5jZWxcIiB8IHJweFRyYW5zbGF0ZSkgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxzcGFuIGNsYXNzPVwiYXVpLWNvbW1lbnRfX3ByaXZhdGVcIj57eyBcInByaXZhdGVcIiB8IHJweFRyYW5zbGF0ZSB9fTwvc3Bhbj5cbjwvZGl2PlxuIl19