UNPKG

stimulsoft-forms

Version:
788 lines 111 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0aW11bHNvZnQtZm9ybXMvc3JjL2xpYi9zZXJ2aWNlcy9tb2RlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcvQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcvRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFHckUsTUFBTSxPQUFPLGVBQWU7YUFDWixlQUFVLEdBQUcsVUFBVSxBQUFiLENBQWM7YUFDeEIsZ0JBQVcsR0FBRyxXQUFXLEFBQWQsQ0FBZTthQUMxQixXQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEFBQXBCLENBQXFCO0lBZ0hsQyxnQkFBZ0IsQ0FBQyxPQUFPO1FBQzdCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxJQUFJLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDcEIsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXO1lBQ2QsTUFBTSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUM7UUFDNUcsSUFBSSxDQUFDLFdBQVc7WUFDZCxNQUFNLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUN0RyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBVyxZQUFZLENBQUMsS0FBYztRQUNwQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ25DLElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBVyxvQkFBb0I7UUFDN0IsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQVcsb0JBQW9CLENBQUMsS0FBYztRQUM1QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDM0MsSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQVcsY0FBYyxDQUFDLEtBQWM7UUFDdEMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNyQyxJQUFJLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQVcsbUJBQW1CO1FBQzVCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFDRCxJQUFXLG1CQUFtQixDQUFDLEtBQWM7UUFDM0MsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQzFDLElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFXLE1BQU0sQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLElBQUksU0FBUyxDQUFDO1lBQUUsT0FBTztRQUVsRyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxDQUNMLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUM1QyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLE1BQU07WUFDNUQsQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUNyQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFXLG1CQUFtQjtRQUM1QixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLElBQUksSUFBSSxDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsSUFBSSxLQUFLLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQVcsWUFBWSxDQUFDLEtBQUs7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLEtBQUssSUFBSSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUNELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxVQUFVLENBQUMsS0FBYTtRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBSSxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsSUFBSSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFXLE1BQU0sQ0FBQyxLQUFhO1FBQzdCLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUNNLGNBQWMsQ0FBQyxVQUFVO1FBQzlCLElBQUksTUFBTSxHQUFHLFVBQVU7YUFDcEIsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7YUFDbEIsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7YUFDbEIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7YUFDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7YUFDbEIsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ00saUJBQWlCLENBQUMsVUFBa0I7UUFDekMsSUFBSSxPQUFPLFVBQVUsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDdEUsSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLENBQUM7aUJBQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixRQUFRLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNqQyxLQUFLLFdBQVc7b0JBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO29CQUNyRCxNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7b0JBQ25ELE1BQU07Z0JBQ1I7b0JBQ0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxNQUFNO1lBQ1YsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ00seUJBQXlCLENBQUMsT0FBTztRQUN0QyxJQUFJLFdBQVcsR0FBRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLHFCQUFxQixFQUFFLENBQUM7UUFDN0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sSUFBSSxPQUFPLENBQ2hCLFdBQVcsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFDNUIsV0FBVyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUM1QixXQUFXLEVBQUUsS0FBSyxFQUNsQixXQUFXLEVBQUUsTUFBTSxDQUNwQixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUNNLGlCQUFpQixDQUFDLFdBQW1CO1FBQzFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0csQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBQ00sU0FBUyxDQUFDLEtBQUs7UUFDcEIsT0FBTyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUM7SUFDcEMsQ0FBQztJQUNNLFVBQVUsQ0FBQyxLQUFLO1FBQ3JCLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNNLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBQ00sV0FBVyxDQUFDLEdBQUc7UUFDcEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQzthQUFNLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3JELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQzVCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDaEIsR0FBRyxNQUFNO2dCQUNULENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDN0MsQ0FBQyxFQUNGLEVBQUUsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFhO1FBQzNDLElBQ0UsQ0FBQyxJQUFJO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sWUFBWSxlQUFlO1lBQzFELENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsRUFDbEQsQ0FBQztZQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQ3hELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7YUFBTSxJQUNMLElBQUksSUFBSSxRQUFRO1lBQ2hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLFlBQVksZUFBZTtZQUMxRCxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLEVBQ2pELENBQUM7WUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLCtCQUErQixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLGlCQUFpQjtnQkFDM0csSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsK0JBQStCLEdBQUcsS0FBSyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNNLFNBQVMsQ0FBQyxPQUFZLEVBQUUsbUJBQTRCLEtBQUssRUFBRSxhQUFjO1FBQzlFLElBQUksT0FBTyxZQUFZLFdBQVcsRUFBRSxDQUFDO1lBQ25DLElBQUksR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLENBQUM7YUFBTSxJQUFJLE9BQU8sWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDekIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLGFBQWEsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFDTSxRQUFRLENBQUMsUUFBUTtRQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFGLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxPQUF3QjtRQUN4QyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2pDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN2RCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFZO1FBQ2hDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsZ0JBQWdCLEdBQUcsS0FBSztRQUM1RCxJQUFJLElBQUksR0FBWSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsSUFBSSxDQUFDLElBQWE7UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN2QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDTSxxQkFBcUIsQ0FBQyxLQUFlO1FBQzFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUNuQixJQUFJLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDMUIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2RSxDQUFDO0lBQ00sa0JBQWtCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3hDLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDL0IsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxDQUFDO1lBQ3RGLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ00sYUFBYSxDQUFDLE9BQU87UUFDMUIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ25CLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxlQUFlLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEYsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixXQUFXLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEdBQUcsV0FBVyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakgsS0FBSyxFQUFFLENBQUM7UUFDVixDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksR0FBRyxXQUFXLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBNEI7UUFDM0MsSUFBSSxPQUFPLENBQUMsV0FBVyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZELElBQUksa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1lBQzVCLEtBQUssSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ3JELGtCQUFrQixJQUFJLEdBQUcsQ0FBQztZQUM1QixDQUFDO1lBQ0QsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDOUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMvQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsWUFBWSxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQy9CLENBQUM7aUJBQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxHQUFHLFlBQVksRUFBRSxDQUFDO2dCQUN4QyxPQUFPLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQyxPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsQ0FBQztpQkFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMzQyxPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUNELGlCQUFpQjtRQUNmLElBQ0UsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztZQUN2QyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxFQUN2RSxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQztJQUNILENBQUM7SUFDRCxZQUFZO1FBQ1YsWUFBWSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzNDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ00sUUFBUTtRQUNiLE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNsQyxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNNLGNBQWM7UUFDbkIsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUNwQyxJQUFJLFdBQVcsQ0FBQztRQUNoQixJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDO1lBQzlDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDekIsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDN0MsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUMxQixDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdEMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDckMsV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUN4QixDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNOLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUNNLHFCQUFxQjtRQUMxQixPQUFPLGFBQWEsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxZQUFZLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUMvRixDQUFDO0lBQ00sUUFBUTtRQUNiLE9BQU8sU0FBUyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDL0IsQ0FBQztJQUNNLFVBQVUsQ0FBQyxJQUFhO1FBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1lBRS9ELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQVcsZUFBZSxDQUFDLEtBQXFCO1FBQzlDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBVyxpQkFBaUIsQ0FBQyxLQUFtQjtRQUM5QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzRSxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUNELElBQVcsWUFBWSxDQUFDLEtBQXlCO1FBQy9DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQi