@hmcts/media-viewer
Version:
121 lines • 19.8 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { v4 as uuid } from 'uuid';
import * as i0 from "@angular/core";
import * as i1 from "../../../../toolbar/toolbar-event.service";
import * as i2 from "../highlight-create/highlight-create.service";
export class BoxHighlightCreateComponent {
constructor(toolbarEvents, highlightService) {
this.toolbarEvents = toolbarEvents;
this.highlightService = highlightService;
this.saveSelection = new EventEmitter();
this.drawStartX = -1;
this.drawStartY = -1;
this.backgroundColor = 'none';
this.subscriptions = [];
}
ngOnInit() {
this.subscriptions = [
this.toolbarEvents.drawModeSubject.subscribe(drawMode => {
this.defaultHeight = drawMode ? '100%' : '0px';
this.defaultWidth = drawMode ? '100%' : '0px';
}),
this.toolbarEvents.redactWholePage.subscribe(() => {
this.wholePage = true;
})
];
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => {
subscription.unsubscribe();
});
}
initHighlight(event) {
if (this.wholePage) {
this.highlightPage();
return;
}
const rect = event.target.getBoundingClientRect(), offsetX = event.clientX - rect.left, offsetY = event.clientY - rect.top;
console.log(`initHighlight: rect=${JSON.stringify(rect)}, clientX=${event.clientX}, clientY=${event.clientY}, offsetX=${offsetX}, offsetY=${offsetY}`);
this.position = 'absolute';
this.backgroundColor = 'yellow';
this.drawStartX = offsetX;
this.drawStartY = offsetY;
this.display = 'block';
this.height = 50;
this.width = 50;
this.top = this.drawStartY;
this.left = this.drawStartX;
switch (this.rotate) {
case 90:
this.top = this.drawStartY - this.height;
break;
case 180:
this.top = this.drawStartY - this.height;
this.left = this.drawStartX - this.width;
break;
case 270:
this.left = this.drawStartX - this.width;
break;
}
}
updateHighlight(event) {
const rect = event.target.getBoundingClientRect(), offsetX = event.clientX - rect.left, offsetY = event.clientY - rect.top;
console.log(`updateHighlight: rect=${JSON.stringify(rect)}, clientX=${event.clientX}, clientY=${event.clientY}, offsetX=${offsetX}, offsetY=${offsetY}`);
if (this.drawStartX > 0 && this.drawStartY > 0) {
this.height = Math.abs(offsetY - this.drawStartY);
this.width = Math.abs(offsetX - this.drawStartX);
this.top = Math.min(offsetY, this.drawStartY);
this.left = Math.min(offsetX, this.drawStartX);
}
}
createHighlight() {
if (this.height / this.zoom > 5 || this.width / this.zoom > 5) {
let rectangle = this.highlightService
.applyRotation(this.pageHeight, this.pageWidth, this.height, this.width, this.top, this.left, this.rotate, this.zoom);
rectangle = { id: uuid(), ...rectangle };
this.saveSelection.emit({ rectangles: [rectangle], page: this.page });
this.resetHighlight();
}
}
resetHighlight() {
this.drawStartX = -1;
this.drawStartY = -1;
this.display = 'none';
this.width = 0;
this.height = 0;
this.backgroundColor = 'none';
this.position = 'initial';
this.wholePage = false;
}
highlightPage() {
this.height = this.pageHeight;
this.width = this.pageWidth;
this.top = 0;
this.left = 0;
this.createHighlight();
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BoxHighlightCreateComponent, deps: [{ token: i1.ToolbarEventService }, { token: i2.HighlightCreateService }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BoxHighlightCreateComponent, selector: "mv-box-highlight-create", inputs: { page: "page", pageHeight: "pageHeight", pageWidth: "pageWidth", rotate: "rotate", zoom: "zoom", container: "container" }, outputs: { saveSelection: "saveSelection" }, viewQueries: [{ propertyName: "highlight", first: true, predicate: ["boxHighlight"], descendants: true }], ngImport: i0, template: "<div [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BoxHighlightCreateComponent, decorators: [{
type: Component,
args: [{ selector: 'mv-box-highlight-create', template: "<div [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.ToolbarEventService }, { type: i2.HighlightCreateService }], propDecorators: { page: [{
type: Input
}], pageHeight: [{
type: Input
}], pageWidth: [{
type: Input
}], rotate: [{
type: Input
}], zoom: [{
type: Input
}], container: [{
type: Input
}], saveSelection: [{
type: Output
}], highlight: [{
type: ViewChild,
args: ['boxHighlight', { static: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7O0FBVWxDLE1BQU0sT0FBTywyQkFBMkI7SUE2QnRDLFlBQTZCLGFBQWtDLEVBQzVDLGdCQUF3QztRQUQ5QixrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFDNUMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF3QjtRQXJCakQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBNkMsQ0FBQztRQUl4RixlQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBVWhCLG9CQUFlLEdBQUcsTUFBTSxDQUFDO1FBR2pCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUdvQixDQUFDO0lBRWhFLFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMs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QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNO2dCQUV1QyxTQUFTO3NCQUF0RCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSZWN0YW5nbGUgfSBmcm9tICcuLi8uLi9hbm5vdGF0aW9uLXZpZXcvcmVjdGFuZ2xlL3JlY3RhbmdsZS5tb2RlbCc7XG5pbXBvcnQgeyBIaWdobGlnaHRDcmVhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vaGlnaGxpZ2h0LWNyZWF0ZS9oaWdobGlnaHQtY3JlYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9vbGJhckV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3Rvb2xiYXIvdG9vbGJhci1ldmVudC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXYtYm94LWhpZ2hsaWdodC1jcmVhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBCb3hIaWdobGlnaHRDcmVhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgcGFnZTogbnVtYmVyO1xuICBASW5wdXQoKSBwYWdlSGVpZ2h0OiBudW1iZXI7XG4gIEBJbnB1dCgpIHBhZ2VXaWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSByb3RhdGU6IG51bWJlcjtcbiAgQElucHV0KCkgem9vbTogbnVtYmVyO1xuICBASW5wdXQoKSBjb250YWluZXI6IHsgdG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciB9O1xuXG4gIEBPdXRwdXQoKSBzYXZlU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJlY3RhbmdsZXM6IFJlY3RhbmdsZVtdLCBwYWdlOiBudW1iZXIgfT4oKTtcblxuICBAVmlld0NoaWxkKCdib3hIaWdobGlnaHQnLCB7IHN0YXRpYzogZmFsc2UgfSkgaGlnaGxpZ2h0OiBFbGVtZW50UmVmO1xuXG4gIGRyYXdTdGFydFggPSAtMTtcbiAgZHJhd1N0YXJ0WSA9IC0xO1xuICB0b3A6IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgZGlzcGxheTogc3RyaW5nO1xuICBkcmF3TW9kZTogYm9vbGVhbjtcbiAgZGVmYXVsdEhlaWdodDogc3RyaW5nO1xuICBkZWZhdWx0V2lkdGg6IHN0cmluZztcbiAgcG9zaXRpb246IHN0cmluZztcbiAgYmFja2dyb3VuZENvbG9yID0gJ25vbmUnO1xuICB3aG9sZVBhZ2U6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdG9vbGJhckV2ZW50czogVG9vbGJhckV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZ2hsaWdodFNlcnZpY2U6IEhpZ2hsaWdodENyZWF0ZVNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgIHRoaXMudG9vbGJhckV2ZW50cy5kcmF3TW9kZVN1YmplY3Quc3Vic2NyaWJlKGRyYXdNb2RlID0+IHtcbiAgICAgICAgdGhpcy5kZWZhdWx0SGVpZ2h0ID0gZHJhd01vZGUgPyAnMTAwJScgOiAnMHB4JztcbiAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSBkcmF3TW9kZSA/ICcxMDAlJyA6ICcwcHgnO1xuICAgICAgfSksXG4gICAgICB0aGlzLnRvb2xiYXJFdmVudHMucmVkYWN0V2hvbGVQYWdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMud2hvbGVQYWdlID0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgXTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRIaWdobGlnaHQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy53aG9sZVBhZ2UpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0UGFnZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICBvZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xuICAgIGNvbnNvbGUubG9nKGBpbml0SGlnaGxpZ2h0OiByZWN0PSR7SlNPTi5zdHJpbmdpZnkocmVjdCl9LCBjbGllbnRYPSR7ZXZlbnQuY2xpZW50WH0sIGNsaWVudFk9JHtldmVudC5jbGllbnRZfSwgb2Zmc2V0WD0ke29mZnNldFh9LCBvZmZzZXRZPSR7b2Zmc2V0WX1gKTtcblxuICAgIHRoaXMucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ3llbGxvdyc7XG4gICAgdGhpcy5kcmF3U3RhcnRYID0gb2Zmc2V0WDtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSBvZmZzZXRZO1xuXG4gICAgdGhpcy5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLmhlaWdodCA9IDUwO1xuICAgIHRoaXMud2lkdGggPSA1MDtcbiAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WTtcbiAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFg7XG5cbiAgICBzd2l0Y2ggKHRoaXMucm90YXRlKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WSAtIHRoaXMuaGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WSAtIHRoaXMuaGVpZ2h0O1xuICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFggLSB0aGlzLndpZHRoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFggLSB0aGlzLndpZHRoO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB1cGRhdGVIaWdobGlnaHQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCByZWN0ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICAgIG9mZnNldFkgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3A7XG4gICAgICBjb25zb2xlLmxvZyhgdXBkYXRlSGlnaGxpZ2h0OiByZWN0PSR7SlNPTi5zdHJpbmdpZnkocmVjdCl9LCBjbGllbnRYPSR7ZXZlbnQuY2xpZW50WH0sIGNsaWVudFk9JHtldmVudC5jbGllbnRZfSwgb2Zmc2V0WD0ke29mZnNldFh9LCBvZmZzZXRZPSR7b2Zmc2V0WX1gKTtcbiAgICBpZiAodGhpcy5kcmF3U3RhcnRYID4gMCAmJiB0aGlzLmRyYXdTdGFydFkgPiAwKSB7XG4gICAgICB0aGlzLmhlaWdodCA9IE1hdGguYWJzKG9mZnNldFkgLSB0aGlzLmRyYXdTdGFydFkpO1xuICAgICAgdGhpcy53aWR0aCA9IE1hdGguYWJzKG9mZnNldFggLSB0aGlzLmRyYXdTdGFydFgpO1xuICAgICAgdGhpcy50b3AgPSBNYXRoLm1pbihvZmZzZXRZLCB0aGlzLmRyYXdTdGFydFkpO1xuICAgICAgdGhpcy5sZWZ0ID0gTWF0aC5taW4ob2Zmc2V0WCwgdGhpcy5kcmF3U3RhcnRYKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVIaWdobGlnaHQoKSB7XG4gICAgaWYgKHRoaXMuaGVpZ2h0IC8gdGhpcy56b29tID4gNSB8fCB0aGlzLndpZHRoIC8gdGhpcy56b29tID4gNSkge1xuICAgICAgbGV0IHJlY3RhbmdsZSA9IHRoaXMuaGlnaGxpZ2h0U2VydmljZVxuICAgICAgICAuYXBwbHlSb3RhdGlvbih0aGlzLnBhZ2VIZWlnaHQsIHRoaXMucGFnZVdpZHRoLCB0aGlzLmhlaWdodCwgdGhpcy53aWR0aCwgdGhpcy50b3AsIHRoaXMubGVmdCwgdGhpcy5yb3RhdGUsIHRoaXMuem9vbSk7XG4gICAgICByZWN0YW5nbGUgPSB7IGlkOiB1dWlkKCksIC4uLnJlY3RhbmdsZSB9IGFzIGFueTtcbiAgICAgIHRoaXMuc2F2ZVNlbGVjdGlvbi5lbWl0KHsgcmVjdGFuZ2xlczogW3JlY3RhbmdsZV0sIHBhZ2U6IHRoaXMucGFnZSB9KTtcbiAgICAgIHRoaXMucmVzZXRIaWdobGlnaHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0SGlnaGxpZ2h0KCkge1xuICAgIHRoaXMuZHJhd1N0YXJ0WCA9IC0xO1xuICAgIHRoaXMuZHJhd1N0YXJ0WSA9IC0xO1xuICAgIHRoaXMuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLndpZHRoID0gMDtcbiAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSAnbm9uZSc7XG4gICAgdGhpcy5wb3NpdGlvbiA9ICdpbml0aWFsJztcbiAgICB0aGlzLndob2xlUGFnZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBoaWdobGlnaHRQYWdlKCkge1xuICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5wYWdlSGVpZ2h0O1xuICAgIHRoaXMud2lkdGggPSB0aGlzLnBhZ2VXaWR0aDtcbiAgICB0aGlzLnRvcCA9IDA7XG4gICAgdGhpcy5sZWZ0ID0gMDtcbiAgICB0aGlzLmNyZWF0ZUhpZ2hsaWdodCgpO1xuICB9XG59XG4iLCI8ZGl2IFtzdHlsZS5oZWlnaHRdPVwiZGVmYXVsdEhlaWdodFwiXG4gICAgIFtzdHlsZS53aWR0aF09XCJkZWZhdWx0V2lkdGhcIlxuICAgICAobW91c2Vkb3duKT1cImluaXRIaWdobGlnaHQoJGV2ZW50KVwiXG4gICAgIChtb3VzZW1vdmUpPVwidXBkYXRlSGlnaGxpZ2h0KCRldmVudClcIlxuICAgICAobW91c2V1cCk9XCJjcmVhdGVIaWdobGlnaHQoKVwiPlxuICA8ZGl2ICNib3hIaWdobGlnaHRcbiAgICAgY2xhc3M9XCJib3gtaGlnaGxpZ2h0XCJcbiAgICAgW3N0eWxlLmRpc3BsYXldPVwiZGlzcGxheVwiXG4gICAgIFtzdHlsZS5wb3NpdGlvbl09XCJwb3NpdGlvblwiXG4gICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXG4gICAgIFtzdHlsZS5oZWlnaHRdPVwiaGVpZ2h0ID8gaGVpZ2h0ICsgJ3B4JyA6ICcxMDAlJ1wiXG4gICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aCA/IHdpZHRoICsgJ3B4JyA6ICcxMDAlJ1wiXG4gICAgIFtzdHlsZS50b3BdPVwidG9wICsgJ3B4J1wiXG4gICAgIFtzdHlsZS5sZWZ0XT1cImxlZnQgKyAncHgnXCI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=