stimulsoft-forms
Version:
Stimulsoft PDF Forms
788 lines • 111 kB
JavaScript
import { Injectable } from "@angular/core";
import { camelCase, indexOf } from "lodash";
import { Subject } from "rxjs";
import { StiForm } from "../elements/StiForm";
import { StiFormPageElement } from "../elements/StiFormPageElement";
import { StiPanelElement } from "../elements/StiPanelElement";
import { StiTableElement } from "../elements/StiTableElement";
import { StiNumberRangeFormat, StiThousandSeparator, StiUnitAlignment } from "../system/enums";
import { StiStaticHelperService } from "./sti-static-helper.service";
import * as i0 from "@angular/core";
export class StiModelService {
static { this.PAGE_CLASS = "sti-page"; }
static { this.PANEL_CLASS = "sti-panel"; }
static { this.THEMES = ["Light", "Dark"]; }
toggleTieredMenu(element) {
let elementRect = this.getPositionRelativeToForm(element);
let menuWidth = 104;
let menuHeight = 165;
this.tieredMenuY =
window.innerHeight - elementRect.bottom >= menuHeight ? elementRect.bottom : elementRect.top - menuHeight;
this.tieredMenuX =
window.innerWidth - elementRect.left > menuWidth ? elementRect.left : elementRect.right - menuWidth;
this.showTieredMenu = true;
}
get showTrialBar() {
return this._showTrialBar;
}
set showTrialBar(value) {
let lastState = this._showTrialBar;
if (value != lastState) {
this._showTrialBar = value;
}
}
get showTrialModalWindow() {
return this._showTrialModalWindow;
}
set showTrialModalWindow(value) {
let lastState = this._showTrialModalWindow;
if (value != lastState) {
this._showTrialModalWindow = value;
}
}
get showTrialTitle() {
return this._showTrialTitle;
}
set showTrialTitle(value) {
let lastState = this._showTrialTitle;
if (value != lastState) {
this._showTrialTitle = value;
}
}
get canCloseTrialWindow() {
return this._canCloseTrialWindow;
}
set canCloseTrialWindow(value) {
let lastState = this._canCloseTrialWindow;
if (value != lastState) {
this._canCloseTrialWindow = value;
}
}
set ribbon(value) {
if ((value == "Insert" && !this.showInsertTab) || (this.viewerMode && value != "Preview"))
return;
if (value != this._ribbon) {
let oldRibbon = this._ribbon;
this._ribbon = value;
this.interfaceEvent.next({ name: "setRibbon", data: { ribbon: value, oldRibbon: oldRibbon } });
}
}
get ribbon() {
return this._ribbon;
}
get previewMode() {
return this._ribbon == "Preview";
}
get pdfPreviewMode() {
return this._ribbon == "PDFPreview";
}
get fileMenuMode() {
return this._ribbon == "File";
}
canDelete() {
return (window.getSelection().toString().length == 0 &&
document.activeElement.tagName.toLocaleLowerCase() == "body" &&
!this.draggingElement &&
!this.showSignatureEditor);
}
get showSaveToPdfButton() {
return this.settings?.showSaveToPdfButton ?? true;
}
get showEditButton() {
return this.settings?.showEditButton ?? false;
}
set embeddedMode(value) {
this._embeddedMode = value;
}
get embeddedMode() {
return this._embeddedMode || this.properties?.embeddedMode === true;
}
get cursor() {
return this._cursor;
}
get zoom() {
return this._zoom;
}
set requestUrl(value) {
this._requestUrl = value;
this.isWebView = value == "WebView";
}
get requestUrl() {
return this._requestUrl;
}
set zoom(value) {
if (value <= 0.1) {
this._zoom = 0.1;
}
else if (value >= 4) {
this._zoom = 4;
}
else {
this._zoom = value;
}
}
set cursor(value) {
if (value == "default" && this.selectedComponent?.hover) {
this._cursor = "move";
}
else {
this._cursor = value;
}
}
formattingDate(dateFormat) {
let result = dateFormat
.replace(/M/g, "k")
.replace(/m/g, "r")
.replace(/tt/g, "a")
.replace(/k/g, "m")
.replace(/r/g, "M");
return result;
}
setZoomFromString(zoomString) {
if (typeof zoomString != "string") {
return;
}
if (zoomString.includes("%")) {
let zoom = Number(zoomString.slice(0, zoomString.indexOf("%"))) / 100;
if (zoom <= 0.1) {
this.zoom = 0.1;
}
else if (zoom >= 4) {
this.zoom = 4;
}
else {
this.zoom = zoom;
}
}
else {
switch (zoomString.toLowerCase()) {
case "pagewidth":
this.formEvents.next({ name: "SetZoomByPageWidth" });
break;
case "onepage":
this.formEvents.next({ name: "SetZoomByOnePage" });
break;
default:
this.formEvents.next({ name: "SetDefaultZoom" });
break;
}
}
}
getPositionRelativeToForm(element) {
let elementRect = element?.getBoundingClientRect();
let formRect = this.rootFormElement?.getBoundingClientRect();
if (formRect) {
return new DOMRect(elementRect?.x - formRect?.x, elementRect?.y - formRect?.y, elementRect?.width, elementRect?.height);
}
else {
return elementRect;
}
}
getBooleanSetting(settingName) {
return this.settings && this.isNotEmpty(this.settings[settingName]) && this.isBoolean(this.settings[settingName])
? this.settings[settingName]
: true;
}
isBoolean(value) {
return typeof value === "boolean";
}
isNotEmpty(value) {
return value?.toString()?.length > 0;
}
saveLastFormState() {
this.form.reportVersion = this.buildVersion;
this.form.reportChanged = StiStaticHelperService.dateToJsonDate(new Date());
this.lastSavedFormState = this.form.saveToReportJsonObject().serialize();
}
toCamelCase(obj) {
if (Array.isArray(obj)) {
return obj.map((v) => this.toCamelCase(v));
}
else if (obj != null && obj.constructor === Object) {
return Object.keys(obj).reduce((result, key) => ({
...result,
[camelCase(key)]: this.toCamelCase(obj[key]),
}), {});
}
return obj;
}
showColumnPreview(index, type) {
if (!type &&
this.selectedComponent?.element instanceof StiTableElement &&
!this.selectedComponent?.element.showColumnsEditor) {
this.selectedComponent.element.showColumnsEditor = true;
this.needToRefresh.next(true);
}
else if (type == "totals" &&
this.selectedComponent?.element instanceof StiTableElement &&
!this.selectedComponent?.element.showTotalsEditor) {
this.selectedComponent.element.showTotalsEditor = true;
this.needToRefresh.next(true);
}
setTimeout(() => {
if (this.currentContentEditableItemIndex != index || this.previousSelectedComponent != this.selectedComponent)
this.currentContentEditableItem.next(index);
this.currentContentEditableItemIndex = index;
});
}
showError(message, sendedFromButton = false, buttonElement) {
if (message instanceof ArrayBuffer) {
var enc = new TextDecoder("utf-8");
message = enc.decode(message);
}
else if (message instanceof Event) {
message = message.type;
}
else if (message?.text) {
message = message.text;
}
if (buttonElement) {
this.currentUsedButtonElement = buttonElement;
}
this.sendedFromButton = sendedFromButton;
this.errorWindowMessage = message;
if (this.errorWindowMessage != "abort") {
this.showErrorWindow = true;
}
}
getImage(fileName) {
return this.imagesArray && this.imagesArray[fileName] ? this.imagesArray[fileName] : "";
}
removeUnusedCells(element) {
element.columns.forEach((column) => {
if (column["cells"].length != element.rowLabels.length) {
column["cells"].splice(element.rowLabels.length, column["cells"].length - 1);
}
});
}
startPdfExport(form) {
if (form) {
this.setFormFromString(JSON.stringify(form));
}
this.startPdfExportEvent.next(true);
}
setFormFromString(str, loadSavedSetings = false) {
let form = new StiForm();
form.loadFormJsonString(str);
if (loadSavedSetings) {
this.loadSavedSettings();
}
this.form = form;
}
get form() {
return this._form;
}
set form(form) {
this.updateForm(form);
this.checkOnUniqueNames();
form.formEvents.next({ name: "SetForm" });
this.firstFormState = this.form.saveToReportJsonObject().serialize();
if (this.viewerMode && this.isMobile()) {
setTimeout(() => {
this.isMobileViewer.next(true);
});
}
}
arrayOfStylesToString(array) {
if (!array)
return;
let styles = [];
if (array.length > 0) {
array.forEach((item) => {
if (item != "Underline") {
styles.push(item);
}
});
}
return styles.length > 0 ? styles.join(" ").toLocaleLowerCase() : "";
}
checkOnUniqueNames() {
this.form.allElements.forEach((element) => {
let currentName = element.name;
let uniqueElements = this.form.allElements.filter((elem) => elem.name == currentName);
if (uniqueElements.length > 1) {
this.setUniqueName(element);
}
});
}
setUniqueName(element) {
let regex = /\d+$/;
let currentName = element.name ?? element.type.replace("_", "").replace("Element", "");
let index = 0;
let currentPosition = element.name?.match(regex) ? element.name?.match(regex)[0] : null;
if (currentPosition) {
currentName = currentName.slice(0, currentName.length - currentPosition.length);
}
while (this.form.allElements.find((element) => element.name == `${currentName + (index != 0 ? index + 1 : "")}`)) {
index++;
}
element.name = currentName + (index != 0 ? index + 1 : "");
}
checkNumberRange(element) {
if (element.rangeFormat == StiNumberRangeFormat.Digits) {
let maximumValueString = "";
for (let index = element.maximum; index > 0; index--) {
maximumValueString += "9";
}
let maximumValue = Number(maximumValueString);
let minimumValue = -Number(maximumValueString);
if (element.value > maximumValue) {
element.value = maximumValue;
}
else if (element.value < minimumValue) {
element.value = minimumValue;
}
}
else {
if (element.value > element.maximum) {
element.value = Number(element.maximum);
}
else if (element.value < element.minimum) {
element.value = Number(element.minimum);
}
}
}
showTrialLog() {
if (this.showTrialBar || this.showTrialTitle || this.showTrialModalWindow) {
console.warn("You are using a trial version of the Stimulsoft PDF Forms!");
}
}
loadSavedSettings() {
if (localStorage.getItem("StiFormSettings") &&
(this.isWebView || this.isCloudMode || this.properties?.cloudPlanIdent)) {
this.form?.settings?.loadFormJsonString(localStorage.getItem("StiFormSettings"));
}
}
saveSettings() {
localStorage.removeItem("StiFormSettings");
localStorage.setItem("StiFormSettings", this.form.settings.saveToJsonObject({}).serialize());
}
isMobile() {
const toMatch = [/Android/i, /webOS/i, /iPhone/i, /iPad/i, /iPod/i, /BlackBerry/i, /Windows Phone/i];
return toMatch.some((toMatchItem) => {
return navigator.userAgent.match(toMatchItem);
});
}
getBrowserType() {
let userAgent = navigator.userAgent;
let browserName;
if (userAgent.match(/chrome|chromium|crios/i)) {
browserName = "chrome";
}
else if (userAgent.match(/firefox|fxios/i)) {
browserName = "firefox";
}
else if (userAgent.match(/safari/i)) {
browserName = "safari";
}
else if (userAgent.match(/opr\//i)) {
browserName = "opera";
}
else if (userAgent.match(/edg/i)) {
browserName = "edge";
}
else {
browserName = "No browser detection";
}
return browserName;
}
getScaleWithTranslate() {
return `translate(${this.zoom <= 1 ? 0 : ((this.zoom - 1) / 2) * 100}%) scale(${this.zoom})`;
}
getScale() {
return `scale(${this.zoom})`;
}
updateForm(form) {
this._form = form;
this.selectedComponent = null;
this.lastUsedPage = null;
form.formEvents.subscribe((e) => this.formEvents.next(e));
if (form.pages?.length > 0) {
this.previousPadding = form.pages[0].padding.clone();
this.previousContentAreaWidth = form.pages[0].contentAreaWidth;
setTimeout(() => {
this.needToRefresh.next(true);
}, 0);
}
form.formEvents.next({ name: "UpdateForm" });
}
set elementToUpdate(value) {
let oldValue = this._elementToUpdate;
this._elementToUpdate = value;
if (oldValue != value) {
this.formEvents.next({ name: "ElementToUpdateChanged", value: value });
}
}
get elementToUpdate() {
return this._elementToUpdate;
}
get selectedComponent() {
return this._selectedComponent;
}
set selectedComponent(value) {
let oldValue = this._selectedComponent;
this._selectedPage = null;
this._selectedComponent = value;
this.needToRefresh.next(true);
if (oldValue != value) {
this.formEvents.next({ name: "SelectedComponentChanged", value: value });
}
}
get selectedPage() {
return this._selectedPage;
}
set selectedPage(value) {
let oldValue = this._selectedPage;
this._selectedComponent = null;
this._selectedPage = value;
this.needToRefresh.next(true);
if (oldValue != value) {
this.formEvents.next({ name: "SelectedPageChanged", value: value });
}
}
get lastUsedPage() {
return this._lastUsedPage ?? this.selectedPage ?? this.form?.pages[0];
}
set lastUsedPage(value) {
this._lastUsedPage = value;
}
getSelectedComponentPage() {
return this.getElementPage(this._selectedComponent?.element);
}
getElementPage(element) {
return this.form?.pages.find((p) => p.elements.find((e) => e == element) != null);
}
getElementPageForScroll(element) {
return this.form?.pages.find((p) => p.elements.find((e) => e == element) != null
? p.elements.find((e) => e == element)
: this.getElementPanel(element));
}
overToolbar(x, y) {
let elementsDiv = document.elementsFromPoint(x, y).find((elem) => elem?.classList.contains("elements"));
return elementsDiv ? true : false;
}
getElementPanel(element) {
let result;
this.form.pages.forEach((page) => {
page.allElements.forEach((panel) => {
if (panel instanceof StiPanelElement && panel.elements.indexOf(element) >= 0) {
result = panel;
}
});
});
return result;
}
formatNumber(value, format, decimalDigits, unitAlignment, unit) {
let formatedValue = this.formatNumberWithThousandSeparator(value, format, decimalDigits);
switch (unitAlignment) {
case StiUnitAlignment.PrefixInside:
return `${unit}${formatedValue}`;
case StiUnitAlignment.PrefixInsideSpace:
return `${unit} ${formatedValue}`;
case StiUnitAlignment.SuffixInside:
return `${formatedValue}${unit}`;
case StiUnitAlignment.SuffixInsideSpace:
return `${formatedValue} ${unit}`;
}
return formatedValue;
}
getFormattedValue(element, inValue) {
let value = inValue;
try {
if (typeof value === "number" && !isNaN(value)) {
value = this.formatNumberWithThousandSeparator(parseFloat(value.toFixed(element.decimalDigits)), element.thousandSeparator, element.decimalDigits);
}
}
catch {
value = "";
}
return value;
}
formatNumberWithThousandSeparator(value, format, decimalDigits) {
let isNegative = false;
if (value == undefined) {
return "";
}
let result;
if (decimalDigits > 0) {
result = value.toFixed(decimalDigits);
}
else {
result = value.toString();
}
if (result.indexOf("-") != -1) {
isNegative = true;
}
if (isNegative) {
result = result.slice(1, result.length);
}
if (format == StiThousandSeparator.None) {
return (isNegative ? "-" : "") + result;
}
else if (format == StiThousandSeparator.NoneComma) {
return (isNegative ? "-" : "") + result.replace(".", ",");
}
else if (format == StiThousandSeparator.Comma) {
var chars = (decimalDigits > 0 ? result.slice(0, indexOf(result, ".")) : result).split("").reverse();
var withCommas = [];
for (var i = 1; i <= chars.length; i++) {
withCommas.push(chars[i - 1]);
if (i % 3 == 0 && i != chars.length) {
withCommas.push(",");
}
}
result =
decimalDigits > 0
? withCommas.reverse().join("") + result.slice(indexOf(result, "."), result.length)
: withCommas.reverse().join("");
return (isNegative ? "-" : "") + result;
}
else if (format == StiThousandSeparator.Dot) {
var chars = (decimalDigits > 0 ? result.slice(0, indexOf(result, ".")) : result).split("").reverse();
var withDotts = [];
for (var i = 1; i <= chars.length; i++) {
withDotts.push(chars[i - 1]);
if (i % 3 == 0 && i != chars.length) {
withDotts.push(".");
}
}
result =
decimalDigits > 0
? withDotts.reverse().join("") + "," + result.slice(indexOf(result, ".") + 1, result.length)
: withDotts.reverse().join("");
return (isNegative ? "-" : "") + result;
}
else if (format == StiThousandSeparator.Apostrophe) {
var chars = (decimalDigits > 0 ? result.slice(0, indexOf(result, ".")) : result).split("").reverse();
var withSpaces = [];
for (var i = 1; i <= chars.length; i++) {
withSpaces.push(chars[i - 1]);
if (i % 3 == 0 && i != chars.length) {
withSpaces.push("`");
}
}
result =
decimalDigits > 0
? withSpaces.reverse().join("") + "." + result.slice(indexOf(result, ".") + 1, result.length)
: withSpaces.reverse().join("");
return (isNegative ? "-" : "") + result;
}
}
getWindowScaling() {
return window.devicePixelRatio * 100;
}
getScaling() {
if (this.getWindowScaling() < 125) {
return "";
}
else if (125 <= this.getWindowScaling() && this.getWindowScaling() < 150) {
return "_x1_25";
}
else if (150 <= this.getWindowScaling() && this.getWindowScaling() < 175) {
return "_x1_5";
}
else if (175 <= this.getWindowScaling() && this.getWindowScaling() < 200) {
return "_x1_75";
}
else if (200 <= this.getWindowScaling() && this.getWindowScaling() < 300) {
return "_x2";
}
else if (300 <= this.getWindowScaling() && this.getWindowScaling() < 400) {
return "_x3";
}
else if (this.getWindowScaling() > 400) {
return "_x4";
}
}
getPageFromPoint(x, y) {
let pageDiv;
for (let elem of document.elementsFromPoint(x, y)) {
if (elem?.classList.contains(StiModelService.PAGE_CLASS)) {
pageDiv = elem;
break;
}
}
if (pageDiv) {
for (let page of this.form.pages) {
if (page.element?.nativeElement == pageDiv) {
pageDiv = page;
break;
}
}
}
// let pageDiv = document.elementsFromPoint(x, y).find((elem) => elem?.classList.contains(StiModelService.PAGE_CLASS));
return pageDiv ? pageDiv : null;
}
getPanelFromPoint(x, y, excludeId) {
let page = this.getPageFromPoint(x, y);
let panelDivs = document
.elementsFromPoint(x, y)
.filter((elem) => elem?.classList.contains(StiModelService.PANEL_CLASS) && elem.id != excludeId);
return panelDivs && page
? page.allElements.find((e) => panelDivs.find((p) => e.guid == p.id))
: null;
}
getMouseOverPagePosition(event) {
let page = this.getPageFromPoint(event.clientX, event.clientY);
if (page) {
let rect = this.getPositionRelativeToForm(page.element.nativeElement);
return {
x: event.clientX - (rect.left + page.padding.left * this.zoom),
y: event.clientY - (rect.top + page.padding.top * this.zoom),
};
}
return null;
}
getMouseOverPanelPosition(event, excludeId) {
let panel = this.getPanelFromPoint(event.clientX, event.clientY, excludeId);
if (panel) {
let rect = this.getPositionRelativeToForm(panel.element.nativeElement);
return { x: event.clientX - rect.left, y: event.clientY - rect.top };
}
return null;
}
loadAttachedFile() {
let input = document.createElement("input");
input.type = "file";
let this_ = this;
input.onchange = (_) => {
let file = Array.from(input.files)[0];
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function () {
this_.form.attachedFiles.push(reader.result);
this_.interfaceEvent.next({ name: "FileAttached", data: reader.result });
};
};
input.click();
}
downloadFiles(data, file_name) {
let file = new Blob([data]);
let a = document.createElement("a"), url = URL.createObjectURL(file);
a.href = url;
a.download = file_name;
document.body.appendChild(a);
a.click();
setTimeout(function () {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 0);
}
constructor() {
this._showTrialBar = false;
this._showTrialModalWindow = false;
this._showTrialTitle = false;
this._canCloseTrialWindow = true;
this._zoom = 1;
this._cursor = "default";
this._ribbon = "Home";
this.interfaceEvent = new Subject();
this.isMobileViewer = new Subject();
this.needToRefresh = new Subject();
this.needToUpdateHelper = new Subject();
this.startPdfExportEvent = new Subject();
this.needToRefreshInnerProperties = new Subject();
this.currentContentEditableItem = new Subject();
this.retryButtonRequest = new Subject();
this.fontFamilies = [];
this.assemblyInfo = [];
this.formTreeInnerItemsStates = [];
this.userName = "";
this.currentPropertyGridMode = "Properties";
this.showFormElementsList = false;
this.sortFormElementsList = false;
this.showComponentsTab = true;
this.showInsertTab = true;
this.hideActiveDropdown = new Subject();
this.showSignatureEditor = false;
this.showDraggableModalWindow = false;
this.showFormTreeWarningWindow = false;
this.hideActiveAutocompleteList = new Subject();
this.formTreeWarningMessage = "";
this.needToSelectedComponent = new Subject();
this.showButtonMessageWindow = false;
this.showTieredMenu = false;
this.showTrialTimerWindow = false;
this.isInitialized = false;
this.showContextMenu = false;
this.showHelpWindow = false;
this.showSaveDialog = false;
this.showErrorWindow = false;
this.basePlanIsTrial = false;
this.viewerMode = false;
this.isCloudMode = false;
this.disableCloseButton = false;
this.showCornerRadius = true;
this.showAboutWindow = false;
this.showGroupPreview = false;
this.showToolboxSetup = false;
this.showModalWindow = false;
this.showProgressAfterUpdatePage = false;
this.canDrag = true;
this.tieredMenuX = 0;
this.tieredMenuY = 0;
this.currentExpressionInfo = 0; //0-none,1-label column,2-totals,3-label component.
this.buildVersion = "";
this.buildDate = "";
this.errorWindowMessage = "";
this.propertyGridWidth = 395;
this.currentTablePropertyHeader = new Subject();
this.currentTableHeader = "Main";
this.formEvents = new Subject();
this.saveDialogFromNew = false;
this.saveDialogFromOpen = false;
this.sendedFromButton = false;
this.loadingFromCloud = false;
this.showColorDialog = false;
this.showMoreColorDialog = false;
this.userIsAuthorized = false;
this.userWasChecked = false;
this.showSaveDialogFromCloud = false;
this.hasEmptyReuiredFields = false;
this.showExpressionEditor = false;
this.showProgress = false;
this.isWebView = false;
this.currentSelectedFileOption = "Open";
this._embeddedMode = false;
this.embeddedEvent = function (data) { };
this.fileName = "Form.mrt";
this.enteredUrls = [];
let savedData = {};
this.interfaceEvent.subscribe(e => {
switch (e.name) {
case "setRibbon":
if (!this.viewerMode) {
if (e.data.ribbon == "Preview") {
savedData = { form: this.form, selectedGuid: this.selectedComponent?.element.guid ?? this.selectedPage?.guid };
let form = new StiForm();
form.loadFormJsonString(this.form.saveToJsonObject().serialize());
this._form = form;
this.formEvents.next({ name: "ValueChanged" });
}
else if (e.data.oldRibbon == "Preview") {
let form = new StiForm();
form.loadFormJsonString(savedData["form"].saveToJsonObject().serialize());
let selectedElement = form.getElementByGuid(savedData["selectedGuid"]);
if (selectedElement) {
if (!(selectedElement instanceof StiFormPageElement)) {
selectedElement.needToSelectComponent = true;
}
else {
this.selectedPage = selectedElement;
}
}
this._form = form;
this.formEvents.next({ name: "ValueChanged" });
}
}
break;
}
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiModelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiModelService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiModelService, decorators: [{
type: Injectable
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0aW11bHNvZnQtZm9ybXMvc3JjL2xpYi9zZXJ2aWNlcy9tb2RlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcvQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcvRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFHckUsTUFBTSxPQUFPLGVBQWU7YUFDWixlQUFVLEdBQUcsVUFBVSxBQUFiLENBQWM7YUFDeEIsZ0JBQVcsR0FBRyxXQUFXLEFBQWQsQ0FBZTthQUMxQixXQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEFBQXBCLENBQXFCO0lBZ0hsQyxnQkFBZ0IsQ0FBQyxPQUFPO1FBQzdCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxJQUFJLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDcEIsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXO1lBQ2QsTUFBTSxD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