ng-devui
Version:
DevUI components based on Angular
162 lines • 39.6 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output, TemplateRef, } from '@angular/core';
import { QuadrantDiagramService } from './quadrant-diagram.service';
import { DEFAULT_AXIS_CONFIGS, DEFAULT_QUADRANT_CONFIGS, LABEL_SIZE } from './quadrant.config';
import * as i0 from "@angular/core";
import * as i1 from "./quadrant-diagram.service";
import * as i2 from "@angular/common";
import * as i3 from "ng-devui/dragdrop";
import * as i4 from "ng-devui/fullscreen";
import * as i5 from "./quadrant-axis/quadrant-axis.component";
import * as i6 from "./quadrant-region/quadrant-region.component";
export class QuadrantDiagramComponent {
static { this.ID_SEED = 0; }
get id() {
return this.diagramId;
}
constructor(quadrantDiagramService) {
this.quadrantDiagramService = quadrantDiagramService;
this.axisConfigs = DEFAULT_AXIS_CONFIGS;
this.quadrantConfigs = DEFAULT_QUADRANT_CONFIGS;
this.view = {
height: 900,
width: 950,
};
this.labelData = [];
this.currentLabelSize = 'large';
this.showQuadrants = true;
this.dropEvent = new EventEmitter();
this.zoomInEvent = new EventEmitter();
this.zoomOutEvent = new EventEmitter();
this.fullScreenEvent = new EventEmitter();
this.dropScope = 'default';
this.showToolbar = true;
this.isFullScreen = false;
if (this.diagramId === undefined) {
const id = QuadrantDiagramComponent.ID_SEED++;
this.diagramId = 'devui-quadrant-diagram-' + id;
}
}
ngOnInit() {
this.initAxisData();
this.originHeight = this.view.height;
this.originWidth = this.view.width;
}
ngOnChanges(changes) {
const { axisConfigs, view } = changes;
if (axisConfigs || view) {
this.initAxisData();
this.originHeight = this.view.height;
this.originWidth = this.view.width;
}
}
launchFullscreen({ isFullscreen }) {
if (typeof window !== 'undefined' && isFullscreen) {
this.isFullScreen = isFullscreen;
this.view = {
height: window.screen.height,
width: window.screen.width,
};
this.initAxisData();
}
else {
this.isFullScreen = isFullscreen;
this.view = {
height: this.originHeight,
width: this.originWidth,
};
this.initAxisData();
}
this.fullScreenEvent.emit(isFullscreen);
}
onDrop(e) {
const xAxisValue = this.quadrantDiagramService.getXAxisValue(this.view, this.axisConfigs, e.nativeEvent.offsetX);
const yAxisValue = this.quadrantDiagramService.getYAxisValue(this.view, this.axisConfigs, e.nativeEvent.offsetY);
this.quadrantDiagramService.setListPointerEvents(this.diagramId, '');
this.quadrantDiagramService.hideAxisLine(this.diagramId);
this.dropEvent.emit({ dragData: e.dragData, xAxisValue: xAxisValue, yAxisValue: yAxisValue });
}
initAxisData() {
const axisConfigKeys = Object.keys(DEFAULT_AXIS_CONFIGS);
for (let i = 0; i < axisConfigKeys.length; i++) {
if (this.axisConfigs[axisConfigKeys[i]] === undefined) {
this.axisConfigs[axisConfigKeys[i]] = DEFAULT_AXIS_CONFIGS[axisConfigKeys[i]];
}
}
this.axisConfigs.axisOrigin = {
x: this.axisConfigs.originPosition.left,
y: this.view.height - this.axisConfigs.originPosition.bottom,
};
this.axisConfigs.axisTop = this.axisConfigs.axisMargin;
this.axisConfigs.axisRight = this.view.width - this.axisConfigs.axisMargin;
this.axisConfigs.axisWidth = this.axisConfigs.axisRight - this.axisConfigs.axisOrigin.x;
this.axisConfigs.axisHeight = this.axisConfigs.axisOrigin.y - this.axisConfigs.axisTop;
this.axisConfigs.yAxisTicksNum = this.axisConfigs.yAxisRange.max - this.axisConfigs.yAxisRange.min;
this.axisConfigs.xAxisTicksNum = this.axisConfigs.xAxisRange.max - this.axisConfigs.xAxisRange.min;
this.axisConfigs.xTickSpacing = this.axisConfigs.axisWidth / this.axisConfigs.xAxisTicksNum;
this.axisConfigs.yTickSpacing = this.axisConfigs.axisHeight / this.axisConfigs.yAxisTicksNum;
}
zoomOut(size) {
const index = LABEL_SIZE.indexOf(size);
if (index > 0) {
this.currentLabelSize = LABEL_SIZE[index - 1];
}
this.zoomOutEvent.emit(this.currentLabelSize);
}
zoomIn(size) {
const index = LABEL_SIZE.indexOf(size);
if (index < LABEL_SIZE.length - 1) {
this.currentLabelSize = LABEL_SIZE[index + 1];
}
this.zoomInEvent.emit(this.currentLabelSize);
}
dragOverEvent(e) {
this.quadrantDiagramService.setListPointerEvents(this.diagramId, 'none');
this.quadrantDiagramService.showAxisLine(e.offsetX, e.offsetY, this.diagramId, this.view, this.axisConfigs);
}
handleDropOut() {
this.quadrantDiagramService.setListPointerEvents(this.diagramId, '');
this.quadrantDiagramService.hideAxisLine(this.diagramId);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuadrantDiagramComponent, deps: [{ token: i1.QuadrantDiagramService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: QuadrantDiagramComponent, selector: "d-quadrant-diagram", inputs: { axisConfigs: "axisConfigs", quadrantConfigs: "quadrantConfigs", view: "view", normalLabelTemplate: "normalLabelTemplate", largeLabelTemplate: "largeLabelTemplate", smallLabelTemplate: "smallLabelTemplate", labelData: "labelData", currentLabelSize: "currentLabelSize", showQuadrants: "showQuadrants", diagramId: "diagramId", dropScope: "dropScope", showToolbar: "showToolbar" }, outputs: { dropEvent: "dropEvent", zoomInEvent: "zoomInEvent", zoomOutEvent: "zoomOutEvent", fullScreenEvent: "fullScreenEvent" }, host: { properties: { "attr.id": "this.id" } }, usesOnChanges: true, ngImport: i0, template: "<d-fullscreen (fullscreenLaunch)=\"launchFullscreen($event)\" [zIndex]=\"1001\">\n <div fullscreen-target>\n <div\n [id]=\"diagramId\"\n dDroppable\n [dropScope]=\"dropScope\"\n (dragOverEvent)=\"dragOverEvent($event)\"\n (dropEvent)=\"onDrop($event)\"\n (dragleave)=\"handleDropOut()\"\n class=\"devui-quadrant-diagram\"\n [style.height.px]=\"view?.height\"\n [style.width.px]=\"view?.width\"\n >\n <div *ngIf=\"showToolbar\" class=\"devui-control-zoom-container\" [style.right.px]=\"axisConfigs.axisMargin\">\n <div class=\"devui-icon-display\" [class.disabled]=\"currentLabelSize === 'small'\" (click)=\"zoomOut(currentLabelSize)\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <polygon fill=\"#293040\" points=\"14 7 14 9 2 9 2 7\"></polygon>\n </g>\n </svg>\n </div>\n <div class=\"devui-icon-display\" [class.disabled]=\"currentLabelSize === 'large'\" (click)=\"zoomIn(currentLabelSize)\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <polygon fill=\"#293040\" points=\"7 7 7 2 9 2 9 7 14 7 14 9 9 9 9 14 7 14 7 9 2 9 2 7\"></polygon>\n </g>\n </svg>\n </div>\n <div fullscreen-launch class=\"devui-icon-display\">\n <svg\n *ngIf=\"!isFullScreen\"\n width=\"14px\"\n height=\"14px\"\n viewBox=\"0 0 14 14\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(-1482.000000, -1285.000000)\" fill=\"#293040\" fill-rule=\"nonzero\">\n <g transform=\"translate(1481.000000, 1284.000000)\">\n <path\n d=\"M15,1 L15,6 L13,6 L13,3 L10,3 L10,1 L15,1 Z M15,10 L15,15 L10,15 L10,13 L13,13 L13,10 L15,10\n Z M1,15 L1,10 L3,10 L3,13 L6,13 L6,15 L1,15 Z M1,1 L6,1 L6,3 L3,3 L3,6 L1,6 L1,1 Z\"\n id=\"Combined-Shape\"\n ></path>\n </g>\n </g>\n </g>\n </svg>\n <svg\n *ngIf=\"isFullScreen\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n d=\"M10,6 L10,1 L12,1 L12,4 L15,4 L15,6 L10,6 Z M6,1 L6,6 L1,6 L1,4 L4,4 L4,1 L6,1 Z M10,15 L10,10 L15,10 L15,12\n L12,12 L12,15 L10,15 Z M6,10 L6,15 L4,15 L4,12 L1,12 L1,10 L6,10 Z\"\n id=\"\u5F62\u72B6\"\n fill=\"#293040\"\n fill-rule=\"nonzero\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n <d-quadrant-axis [diagramId]=\"diagramId\" [view]=\"view\" [axisConfigs]=\"axisConfigs\"></d-quadrant-axis>\n <d-quadrant-region\n [view]=\"view\"\n [labelData]=\"labelData\"\n [axisConfigs]=\"axisConfigs\"\n [quadrantConfigs]=\"quadrantConfigs\"\n [currentLabelSize]=\"currentLabelSize\"\n [showQuadrants]=\"showQuadrants\"\n [dropScope]=\"dropScope\"\n [diagramId]=\"diagramId\"\n ></d-quadrant-region>\n </div>\n </div>\n</d-fullscreen>\n", styles: [".devui-quadrant-diagram{position:relative}.devui-control-zoom-container{display:flex;align-items:center;justify-content:space-between;padding:0 8px;position:absolute;top:-4px;height:32px;width:96px;box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background:var(--devui-base-bg, #ffffff);z-index:10}.devui-icon-display{cursor:pointer}.devui-icon-display svg g polygon,.devui-icon-display svg g g,.devui-icon-display svg g path{fill:var(--devui-icon-text, #808080)}.devui-icon-display:hover svg g polygon,.devui-icon-display:hover svg g g,.devui-icon-display:hover svg g path{fill:var(--devui-brand, #0a59f7)}.disabled{cursor:not-allowed}.disabled svg g polygon,.disabled svg g g,.disabled svg g path{fill:var(--devui-disabled-text, #c2c2c2)}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DroppableDirective, selector: "[dDroppable]", inputs: ["dragOverClass", "dropScope", "placeholderTag", "placeholderStyle", "placeholderText", "allowDropOnItem", "dragOverItemClass", "nestingTargetRect", "switchWhileCrossEdge", "defaultDropPosition", "dropSortCountSelector", "dropSortVirtualScrollOption"], outputs: ["dragEnterEvent", "dragOverEvent", "dragLeaveEvent", "dropEvent"] }, { kind: "component", type: i4.FullscreenComponent, selector: "d-fullscreen", inputs: ["mode", "zIndex", "target", "container", "beforeChange"], outputs: ["fullscreenLaunch"] }, { kind: "component", type: i5.QuadrantDiagramAxisComponent, selector: "d-quadrant-axis", inputs: ["axisConfigs", "view", "diagramId"] }, { kind: "component", type: i6.QuadrantRegionComponent, selector: "d-quadrant-region", inputs: ["quadrantConfigs", "axisConfigs", "view", "labelData", "normalLabelTemplate", "largeLabelTemplate", "smallLabelTemplate", "currentLabelSize", "showQuadrants", "dropScope", "diagramId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuadrantDiagramComponent, decorators: [{
type: Component,
args: [{ selector: 'd-quadrant-diagram', changeDetection: ChangeDetectionStrategy.OnPush, template: "<d-fullscreen (fullscreenLaunch)=\"launchFullscreen($event)\" [zIndex]=\"1001\">\n <div fullscreen-target>\n <div\n [id]=\"diagramId\"\n dDroppable\n [dropScope]=\"dropScope\"\n (dragOverEvent)=\"dragOverEvent($event)\"\n (dropEvent)=\"onDrop($event)\"\n (dragleave)=\"handleDropOut()\"\n class=\"devui-quadrant-diagram\"\n [style.height.px]=\"view?.height\"\n [style.width.px]=\"view?.width\"\n >\n <div *ngIf=\"showToolbar\" class=\"devui-control-zoom-container\" [style.right.px]=\"axisConfigs.axisMargin\">\n <div class=\"devui-icon-display\" [class.disabled]=\"currentLabelSize === 'small'\" (click)=\"zoomOut(currentLabelSize)\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <polygon fill=\"#293040\" points=\"14 7 14 9 2 9 2 7\"></polygon>\n </g>\n </svg>\n </div>\n <div class=\"devui-icon-display\" [class.disabled]=\"currentLabelSize === 'large'\" (click)=\"zoomIn(currentLabelSize)\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <polygon fill=\"#293040\" points=\"7 7 7 2 9 2 9 7 14 7 14 9 9 9 9 14 7 14 7 9 2 9 2 7\"></polygon>\n </g>\n </svg>\n </div>\n <div fullscreen-launch class=\"devui-icon-display\">\n <svg\n *ngIf=\"!isFullScreen\"\n width=\"14px\"\n height=\"14px\"\n viewBox=\"0 0 14 14\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(-1482.000000, -1285.000000)\" fill=\"#293040\" fill-rule=\"nonzero\">\n <g transform=\"translate(1481.000000, 1284.000000)\">\n <path\n d=\"M15,1 L15,6 L13,6 L13,3 L10,3 L10,1 L15,1 Z M15,10 L15,15 L10,15 L10,13 L13,13 L13,10 L15,10\n Z M1,15 L1,10 L3,10 L3,13 L6,13 L6,15 L1,15 Z M1,1 L6,1 L6,3 L3,3 L3,6 L1,6 L1,1 Z\"\n id=\"Combined-Shape\"\n ></path>\n </g>\n </g>\n </g>\n </svg>\n <svg\n *ngIf=\"isFullScreen\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n d=\"M10,6 L10,1 L12,1 L12,4 L15,4 L15,6 L10,6 Z M6,1 L6,6 L1,6 L1,4 L4,4 L4,1 L6,1 Z M10,15 L10,10 L15,10 L15,12\n L12,12 L12,15 L10,15 Z M6,10 L6,15 L4,15 L4,12 L1,12 L1,10 L6,10 Z\"\n id=\"\u5F62\u72B6\"\n fill=\"#293040\"\n fill-rule=\"nonzero\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n <d-quadrant-axis [diagramId]=\"diagramId\" [view]=\"view\" [axisConfigs]=\"axisConfigs\"></d-quadrant-axis>\n <d-quadrant-region\n [view]=\"view\"\n [labelData]=\"labelData\"\n [axisConfigs]=\"axisConfigs\"\n [quadrantConfigs]=\"quadrantConfigs\"\n [currentLabelSize]=\"currentLabelSize\"\n [showQuadrants]=\"showQuadrants\"\n [dropScope]=\"dropScope\"\n [diagramId]=\"diagramId\"\n ></d-quadrant-region>\n </div>\n </div>\n</d-fullscreen>\n", styles: [".devui-quadrant-diagram{position:relative}.devui-control-zoom-container{display:flex;align-items:center;justify-content:space-between;padding:0 8px;position:absolute;top:-4px;height:32px;width:96px;box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background:var(--devui-base-bg, #ffffff);z-index:10}.devui-icon-display{cursor:pointer}.devui-icon-display svg g polygon,.devui-icon-display svg g g,.devui-icon-display svg g path{fill:var(--devui-icon-text, #808080)}.devui-icon-display:hover svg g polygon,.devui-icon-display:hover svg g g,.devui-icon-display:hover svg g path{fill:var(--devui-brand, #0a59f7)}.disabled{cursor:not-allowed}.disabled svg g polygon,.disabled svg g g,.disabled svg g path{fill:var(--devui-disabled-text, #c2c2c2)}\n"] }]
}], ctorParameters: () => [{ type: i1.QuadrantDiagramService }], propDecorators: { axisConfigs: [{
type: Input
}], quadrantConfigs: [{
type: Input
}], view: [{
type: Input
}], normalLabelTemplate: [{
type: Input
}], largeLabelTemplate: [{
type: Input
}], smallLabelTemplate: [{
type: Input
}], labelData: [{
type: Input
}], currentLabelSize: [{
type: Input
}], showQuadrants: [{
type: Input
}], diagramId: [{
type: Input
}], dropEvent: [{
type: Output
}], zoomInEvent: [{
type: Output
}], zoomOutEvent: [{
type: Output
}], fullScreenEvent: [{
type: Output
}], dropScope: [{
type: Input
}], showToolbar: [{
type: Input
}], id: [{
type: HostBinding,
args: ['attr.id']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhZHJhbnQtZGlhZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9xdWFkcmFudC1kaWFncmFtL3F1YWRyYW50LWRpYWdyYW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvcXVhZHJhbnQtZGlhZ3JhbS9xdWFkcmFudC1kaWFncmFtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFFTixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7OztBQVEvRixNQUFNLE9BQU8sd0JBQXdCO2FBQzVCLFlBQU8sR0FBRyxDQUFDLEFBQUosQ0FBSztJQXVCbkIsSUFDSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxZQUFvQixzQkFBOEM7UUFBOUMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQTFCekQsZ0JBQVcsR0FBaUIsb0JBQW9CLENBQUM7UUFDakQsb0JBQWUsR0FBNEIsd0JBQXdCLENBQUM7UUFDcEUsU0FBSSxHQUFpQjtZQUM1QixNQUFNLEVBQUUsR0FBRztZQUNYLEtBQUssRUFBRSxHQUFHO1NBQ1gsQ0FBQztRQUlPLGNBQVMsR0FBNkIsRUFBRSxDQUFDO1FBQ3pDLHFCQUFnQixHQUFjLE9BQU8sQ0FBQztRQUN0QyxrQkFBYSxHQUFHLElBQUksQ0FBQztRQUVwQixjQUFTLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdkQsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FB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RyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0UsU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtGLEVBQUU7c0JBREwsV0FBVzt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFF1YWRyYW50RGlhZ3JhbVNlcnZpY2UgfSBmcm9tICcuL3F1YWRyYW50LWRpYWdyYW0uc2VydmljZSc7XHJcbmltcG9ydCB7IElBeGlzQ29uZmlncywgSUxhYmVsRGF0YUNvbmZpZ3MsIElRdWFkcmFudENvbmZpZ3MsIElWaWV3Q29uZmlncywgbGFiZWxTaXplIH0gZnJvbSAnLi9xdWFkcmFudC1kaWFncmFtLnR5cGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FYSVNfQ09ORklHUywgREVGQVVMVF9RVUFEUkFOVF9DT05GSUdTLCBMQUJFTF9TSVpFIH0gZnJvbSAnLi9xdWFkcmFudC5jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLXF1YWRyYW50LWRpYWdyYW0nLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9xdWFkcmFudC1kaWFncmFtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9xdWFkcmFudC1kaWFncmFtLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBRdWFkcmFudERpYWdyYW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgc3RhdGljIElEX1NFRUQgPSAwO1xyXG4gIEBJbnB1dCgpIGF4aXNDb25maWdzOiBJQXhpc0NvbmZpZ3MgPSBERUZBVUxUX0FYSVNfQ09ORklHUztcclxuICBASW5wdXQoKSBxdWFkcmFudENvbmZpZ3M6IEFycmF5PElRdWFkcmFudENvbmZpZ3M+ID0gREVGQVVMVF9RVUFEUkFOVF9DT05GSUdTO1xyXG4gIEBJbnB1dCgpIHZpZXc6IElWaWV3Q29uZmlncyA9IHtcclxuICAgIGhlaWdodDogOTAwLFxyXG4gICAgd2lkdGg6IDk1MCxcclxuICB9O1xyXG4gIEBJbnB1dCgpIG5vcm1hbExhYmVsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgbGFyZ2VMYWJlbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIHNtYWxsTGFiZWxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKSBsYWJlbERhdGE6IEFycmF5PElMYWJlbERhdGFDb25maWdzPiA9IFtdO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRMYWJlbFNpemU6IGxhYmVsU2l6ZSA9ICdsYXJnZSc7XHJcbiAgQElucHV0KCkgc2hvd1F1YWRyYW50cyA9IHRydWU7XHJcbiAgQElucHV0KCkgZGlhZ3JhbUlkO1xyXG4gIEBPdXRwdXQoKSBkcm9wRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHpvb21JbkV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSB6b29tT3V0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZ1bGxTY3JlZW5FdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBASW5wdXQoKSBkcm9wU2NvcGUgPSAnZGVmYXVsdCc7XHJcbiAgQElucHV0KCkgc2hvd1Rvb2xiYXIgPSB0cnVlO1xyXG4gIHByaXZhdGUgb3JpZ2luSGVpZ2h0O1xyXG4gIHByaXZhdGUgb3JpZ2luV2lkdGg7XHJcbiAgaXNGdWxsU2NyZWVuID0gZmFsc2U7XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcclxuICBnZXQgaWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaWFncmFtSWQ7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcXVhZHJhbnREaWFncmFtU2VydmljZTogUXVhZHJhbnREaWFncmFtU2VydmljZSkge1xyXG4gICAgaWYgKHRoaXMuZGlhZ3JhbUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3QgaWQgPSBRdWFkcmFudERpYWdyYW1Db21wb25lbnQuSURfU0VFRCsrO1xyXG4gICAgICB0aGlzLmRpYWdyYW1JZCA9ICdkZXZ1aS1xdWFkcmFudC1kaWFncmFtLScgKyBpZDtcclxuICAgIH1cclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRBeGlzRGF0YSgpO1xyXG4gICAgdGhpcy5vcmlnaW5IZWlnaHQgPSB0aGlzLnZpZXcuaGVpZ2h0O1xyXG4gICAgdGhpcy5vcmlnaW5XaWR0aCA9IHRoaXMudmlldy53aWR0aDtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgYXhpc0NvbmZpZ3MsIHZpZXcgfSA9IGNoYW5nZXM7XHJcbiAgICBpZiAoYXhpc0NvbmZpZ3MgfHwgdmlldykge1xyXG4gICAgICB0aGlzLmluaXRBeGlzRGF0YSgpO1xyXG4gICAgICB0aGlzLm9yaWdpbkhlaWdodCA9IHRoaXMudmlldy5oZWlnaHQ7XHJcbiAgICAgIHRoaXMub3JpZ2luV2lkdGggPSB0aGlzLnZpZXcud2lkdGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsYXVuY2hGdWxsc2NyZWVuKHsgaXNGdWxsc2NyZWVuIH0pIHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBpc0Z1bGxzY3JlZW4pIHtcclxuICAgICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSBpc0Z1bGxzY3JlZW47XHJcbiAgICAgIHRoaXMudmlldyA9IHtcclxuICAgICAgICBoZWlnaHQ6IHdpbmRvdy5zY3JlZW4uaGVpZ2h0LFxyXG4gICAgICAgIHdpZHRoOiB3aW5kb3cuc2NyZWVuLndpZHRoLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmluaXRBeGlzRGF0YSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSBpc0Z1bGxzY3JlZW47XHJcbiAgICAgIHRoaXMudmlldyA9IHtcclxuICAgICAgICBoZWlnaHQ6IHRoaXMub3JpZ2luSGVpZ2h0LFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm9yaWdpbldpZHRoLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmluaXRBeGlzRGF0YSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mdWxsU2NyZWVuRXZlbnQuZW1pdChpc0Z1bGxzY3JlZW4pO1xyXG4gIH1cclxuXHJcbiAgb25Ecm9wKGU6IGFueSkge1xyXG4gICAgY29uc3QgeEF4aXNWYWx1ZSA9IHRoaXMucXVhZHJhbnREaWFncmFtU2VydmljZS5nZXRYQXhpc1ZhbHVlKHRoaXMudmlldywgdGhpcy5heGlzQ29uZmlncywgZS5uYXRpdmVFdmVudC5vZmZzZXRYKTtcclxuICAgIGNvbnN0IHlBeGlzVmFsdWUgPSB0aGlzLnF1YWRyYW50RGlhZ3JhbVNlcnZpY2UuZ2V0WUF4aXNWYWx1ZSh0aGlzLnZpZXcsIHRoaXMuYXhpc0NvbmZpZ3MsIGUubmF0aXZlRXZlbnQub2Zmc2V0WSk7XHJcbiAgICB0aGlzLnF1YWRyYW50RGlhZ3JhbVNlcnZpY2Uuc2V0TGlzdFBvaW50ZXJFdmVudHModGhpcy5kaWFncmFtSWQsICcnKTtcclxuICAgIHRoaXMucXVhZHJhbnREaWFncmFtU2VydmljZS5oaWRlQXhpc0xpbmUodGhpcy5kaWFncmFtSWQpO1xyXG4gICAgdGhpcy5kcm9wRXZlbnQuZW1pdCh7IGRyYWdEYXRhOiBlLmRyYWdEYXRhLCB4QXhpc1ZhbHVlOiB4QXhpc1ZhbHVlLCB5QXhpc1ZhbHVlOiB5QXhpc1ZhbHVlIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdEF4aXNEYXRhKCkge1xyXG4gICAgY29uc3QgYXhpc0NvbmZpZ0tleXMgPSBPYmplY3Qua2V5cyhERUZBVUxUX0FYSVNfQ09ORklHUyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF4aXNDb25maWdLZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLmF4aXNDb25maWdzW2F4aXNDb25maWdLZXlzW2ldXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5heGlzQ29uZmlnc1theGlzQ29uZmlnS2V5c1tpXV0gPSBERUZBVUxUX0FYSVNfQ09ORklHU1theGlzQ29uZmlnS2V5c1tpXV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuYXhpc0NvbmZpZ3MuYXhpc09yaWdpbiA9IHtcclxuICAgICAgeDogdGhpcy5heGlzQ29uZmlncy5vcmlnaW5Qb3NpdGlvbi5sZWZ0LFxyXG4gICAgICB5OiB0aGlzLnZpZXcuaGVpZ2h0IC0gdGhpcy5heGlzQ29uZmlncy5vcmlnaW5Qb3NpdGlvbi5ib3R0b20sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5heGlzQ29uZmlncy5heGlzVG9wID0gdGhpcy5heGlzQ29uZmlncy5heGlzTWFyZ2luO1xyXG4gICAgdGhpcy5heGlzQ29uZmlncy5heGlzUmlnaHQgPSB0aGlzLnZpZXcud2lkdGggLSB0aGlzLmF4aXNDb25maWdzLmF4aXNNYXJnaW47XHJcbiAgICB0aGlzLmF4aXNDb25maWdzLmF4aXNXaWR0aCA9IHRoaXMuYXhpc0NvbmZpZ3MuYXhpc1JpZ2h0IC0gdGhpcy5heGlzQ29uZmlncy5heGlzT3JpZ2luLng7XHJcbiAgICB0aGlzLmF4aXNDb25maWdzLmF4aXNIZWlnaHQgPSB0aGlzLmF4aXNDb25maWdzLmF4aXNPcmlnaW4ueSAtIHRoaXMuYXhpc0NvbmZpZ3MuYXhpc1RvcDtcclxuICAgIHRoaXMuYXhpc0NvbmZpZ3MueUF4aXNUaWNrc051bSA9IHRoaXMuYXhpc0NvbmZpZ3MueUF4aXNSYW5nZS5tYXggLSB0aGlzLmF4aXNDb25maWdzLnlBeGlzUmFuZ2UubWluO1xyXG4gICAgdGhpcy5heGlzQ29uZmlncy54QXhpc1RpY2tzTnVtID0gdGhpcy5heGlzQ29uZmlncy54QXhpc1JhbmdlLm1heCAtIHRoaXMuYXhpc0NvbmZpZ3MueEF4aXNSYW5nZS5taW47XHJcbiAgICB0aGlzLmF4aXNDb25maWdzLnhUaWNrU3BhY2luZyA9IHRoaXMuYXhpc0NvbmZpZ3MuYXhpc1dpZHRoIC8gdGhpcy5heGlzQ29uZmlncy54QXhpc1RpY2tzTnVtO1xyXG4gICAgdGhpcy5heGlzQ29uZmlncy55VGlja1NwYWNpbmcgPSB0aGlzLmF4aXNDb25maWdzLmF4aXNIZWlnaHQgLyB0aGlzLmF4aXNDb25maWdzLnlBeGlzVGlja3NOdW07XHJcbiAgfVxyXG5cclxuICB6b29tT3V0KHNpemUpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gTEFCRUxfU0laRS5pbmRleE9mKHNpemUpO1xyXG4gICAgaWYgKGluZGV4ID4gMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYWJlbFNpemUgPSBMQUJFTF9TSVpFW2luZGV4IC0gMV0gYXMgbGFiZWxTaXplO1xyXG4gICAgfVxyXG4gICAgdGhpcy56b29tT3V0RXZlbnQuZW1pdCh0aGlzLmN1cnJlbnRMYWJlbFNpemUpO1xyXG4gIH1cclxuXHJcbiAgem9vbUluKHNpemUpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gTEFCRUxfU0laRS5pbmRleE9mKHNpemUpO1xyXG4gICAgaWYgKGluZGV4IDwgTEFCRUxfU0laRS5sZW5ndGggLSAxKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudExhYmVsU2l6ZSA9IExBQkVMX1NJWkVbaW5kZXggKyAxXSBhcyBsYWJlbFNpemU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnpvb21JbkV2ZW50LmVtaXQodGhpcy5jdXJyZW50TGFiZWxTaXplKTtcclxuICB9XHJcblxyXG4gIGRyYWdPdmVyRXZlbnQoZSkge1xyXG4gICAgdGhpcy5xdWFkcmFudERpYWdyYW1TZXJ2aWNlLnNldExpc3RQb2ludGVyRXZlbnRzKHRoaXMuZGlhZ3JhbUlkLCAnbm9uZScpO1xyXG4gICAgdGhpcy5xdWFkcmFudERpYWdyYW1TZXJ2aWNlLnNob3dBeGlzTGluZShlLm9mZnNldFgsIGUub2Zmc2V0WSwgdGhpcy5kaWFncmFtSWQsIHRoaXMudmlldywgdGhpcy5heGlzQ29uZmlncyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVEcm9wT3V0KCkge1xyXG4gICAgdGhpcy5xdWFkcmFudERpYWdyYW1TZXJ2aWNlLnNldExpc3RQb2ludGVyRXZlbnRzKHRoaXMuZGlhZ3JhbUlkLCAnJyk7XHJcbiAgICB0aGlzLnF1YWRyYW50RGlhZ3JhbVNlcnZpY2UuaGlkZUF4aXNMaW5lKHRoaXMuZGlhZ3JhbUlkKTtcclxuICB9XHJcbn1cclxuIiwiPGQtZnVsbHNjcmVlbiAoZnVsbHNjcmVlbkxhdW5jaCk9XCJsYXVuY2hGdWxsc2NyZWVuKCRldmVudClcIiBbekluZGV4XT1cIjEwMDFcIj5cbiAgPGRpdiBmdWxsc2NyZWVuLXRhcmdldD5cbiAgICA8ZGl2XG4gICAgICBbaWRdPVwiZGlhZ3JhbUlkXCJcbiAgICAgIGREcm9wcGFibGVcbiAgICAgIFtkcm9wU2NvcGVdPVwiZHJvcFNjb3BlXCJcbiAgICAgIChkcmFnT3ZlckV2ZW50KT1cImRyYWdPdmVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAoZHJvcEV2ZW50KT1cIm9uRHJvcCgkZXZlbnQpXCJcbiAgICAgIChkcmFnbGVhdmUpPVwiaGFuZGxlRHJvcE91dCgpXCJcbiAgICAgIGNsYXNzPVwiZGV2dWktcXVhZHJhbnQtZGlhZ3JhbVwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInZpZXc/LmhlaWdodFwiXG4gICAgICBbc3R5bGUud2lkdGgucHhdPVwidmlldz8ud2lkdGhcIlxuICAgID5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93VG9vbGJhclwiIGNsYXNzPVwiZGV2dWktY29udHJvbC16b29tLWNvbnRhaW5lclwiIFtzdHlsZS5yaWdodC5weF09XCJheGlzQ29uZmlncy5heGlzTWFyZ2luXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ1aS1pY29uLWRpc3BsYXlcIiBbY2xhc3MuZGlzYWJsZWRdPVwiY3VycmVudExhYmVsU2l6ZSA9PT0gJ3NtYWxsJ1wiIChjbGljayk9XCJ6b29tT3V0KGN1cnJlbnRMYWJlbFNpemUpXCI+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxNnB4XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjE2cHhcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZyBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxuICAgICAgICAgICAgICA8cG9seWdvbiBmaWxsPVwiIzI5MzA0MFwiIHBvaW50cz1cIjE0IDcgMTQgOSAyIDkgMiA3XCI+PC9wb2x5Z29uPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRldnVpLWljb24tZGlzcGxheVwiIFtjbGFzcy5kaXNhYmxlZF09XCJjdXJyZW50TGFiZWxTaXplID09PSAnbGFyZ2UnXCIgKGNsaWNrKT1cInpvb21JbihjdXJyZW50TGFiZWxTaXplKVwiPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPVwiMTZweFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxNnB4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgdmVyc2lvbj1cIjEuMVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGcgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICAgICAgPHBvbHlnb24gZmlsbD1cIiMyOTMwNDBcIiBwb2ludHM9XCI3IDcgNyAyIDkgMiA5IDcgMTQgNyAxNCA5IDkgOSA5IDE0IDcgMTQgNyA5IDIgOSAyIDdcIj48L3BvbHlnb24+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGZ1bGxzY3JlZW4tbGF1bmNoIGNsYXNzPVwiZGV2dWktaWNvbi1kaXNwbGF5XCI+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgKm5nSWY9XCIhaXNGdWxsU2NyZWVuXCJcbiAgICAgICAgICAgIHdpZHRoPVwiMTRweFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxNHB4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTQgMTRcIlxuICAgICAgICAgICAgdmVyc2lvbj1cIjEuMVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGcgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0xNDgyLjAwMDAwMCwgLTEyODUuMDAwMDAwKVwiIGZpbGw9XCIjMjkzMDQwXCIgZmlsbC1ydWxlPVwibm9uemVyb1wiPlxuICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxNDgxLjAwMDAwMCwgMTI4NC4wMDAwMDApXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE1LDEgTDE1LDYgTDEzLDYgTDEzLDMgTDEwLDMgTDEwLDEgTDE1LDEgWiBNMTUsMTAgTDE1LDE1IEwxMCwxNSBMMTAsMTMgTDEzLDEzIEwxMywxMCBMMTUsMTBcbiAgICAgICAgICAgICAgICBaIE0xLDE1IEwxLDEwIEwzLDEwIEwzLDEzIEw2LDEzIEw2LDE1IEwxLDE1IFogTTEsMSBMNiwxIEw2LDMgTDMsMyBMMyw2IEwxLDYgTDEsMSBaXCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJDb21iaW5lZC1TaGFwZVwiXG4gICAgICAgICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICpuZ0lmPVwiaXNGdWxsU2NyZWVuXCJcbiAgICAgICAgICAgIHdpZHRoPVwiMTZweFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxNnB4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgdmVyc2lvbj1cIjEuMVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGcgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTEwLDYgTDEwLDEgTDEyLDEgTDEyLDQgTDE1LDQgTDE1LDYgTDEwLDYgWiBNNiwxIEw2LDYgTDEsNiBMMSw0IEw0LDQgTDQsMSBMNiwxIFogTTEwLDE1IEwxMCwxMCBMMTUsMTAgTDE1LDEyXG4gICAgICAgIEwxMiwxMiBMMTIsMTUgTDEwLDE1IFogTTYsMTAgTDYsMTUgTDQsMTUgTDQsMTIgTDEsMTIgTDEsMTAgTDYsMTAgWlwiXG4gICAgICAgICAgICAgICAgaWQ9XCLlvaLnirZcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCIjMjkzMDQwXCJcbiAgICAgICAgICAgICAgICBmaWxsLXJ1bGU9XCJub256ZXJvXCJcbiAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkLXF1YWRyYW50LWF4aXMgW2RpYWdyYW1JZF09XCJkaWFncmFtSWRcIiBbdmlld109XCJ2aWV3XCIgW2F4aXNDb25maWdzXT1cImF4aXNDb25maWdzXCI+PC9kLXF1YWRyYW50LWF4aXM+XG4gICAgICA8ZC1xdWFkcmFudC1yZWdpb25cbiAgICAgICAgW3ZpZXddPVwidmlld1wiXG4gICAgICAgIFtsYWJlbERhdGFdPVwibGFiZWxEYXRhXCJcbiAgICAgICAgW2F4aXNDb25maWdzXT1cImF4aXNDb25maWdzXCJcbiAgICAgICAgW3F1YWRyYW50Q29uZmlnc109XCJxdWFkcmFudENvbmZpZ3NcIlxuICAgICAgICBbY3VycmVudExhYmVsU2l6ZV09XCJjdXJyZW50TGFiZWxTaXplXCJcbiAgICAgICAgW3Nob3dRdWFkcmFudHNdPVwic2hvd1F1YWRyYW50c1wiXG4gICAgICAgIFtkcm9wU2NvcGVdPVwiZHJvcFNjb3BlXCJcbiAgICAgICAgW2RpYWdyYW1JZF09XCJkaWFncmFtSWRcIlxuICAgICAgPjwvZC1xdWFkcmFudC1yZWdpb24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kLWZ1bGxzY3JlZW4+XG4iXX0=