{"version":3,"sources":["wwwroot/js/Custom/home.ts","wwwroot/js/Custom/devextreme-license.ts","wwwroot/Scripts/front-custom.js","wwwroot/js/Custom/reportDesigner.ts","wwwroot/js/Custom/scheduledEmail.ts","wwwroot/js/Custom/emailLogs.ts"],"names":["ShowWorkbooksModeEnum","ShowWorkbooksTypeEnum","HomeGroupingEnum","DevExpress","config","licenseKey","home","getCompanyId","span","$","length","parseInt","dataset","id","updateGridTitle","vm","view","showWorkbooksMode","Recent","Favorites","owner","groupedBy","irGlobal","isMobile","showWorkbooksType","Mine","OtherUsers","text","grouping","None","rowEditing","setup","_a","_b","performance","navigation","type","location","reload","setupChangePassword","json","data","workbooks","map","obj","Object","assign","lastViewedDate","Date","lastViewed","getDataSource","ouput","sort","a","b","slice","filter","x","workbook","favorite","mobileDevice","viewGroupName","ownerGroupName","groupByGroupName","menuListControl","menuList","key","icon","items","name","visible","loggedUser","permissions","createWorkbooks","company","enableMultiTenant","template","enableAdmin","badge","disabled","selectedItemKeys","All","find","showTabs","push","drawer","dxDrawer","revealMode","openedStateMode","opened","closeOnOutsideClick","e","$template","dxList","dataSource","keyExpr","itemTemplate","iconName","width","height","selectByClick","selectionMode","elementAttr","class","searchExpr","displayExpr","grouped","focusStateEnabled","hoverStateEnabled","onItemClick","itemIndex","group","groupName","itemElement","closest","html","itemData","closeMenu","dataGrid1","dxDataGrid","groupIndex","item","unselectItem","selectItem","onGroupByNoneChanged","clearGrouping","option","updateViewBadge","ds1","removeClass","ds2","addClass","ds3","undefined","Shared","Mapping","columnOption","editFavoriteOrder","Owner","Category","refresh","sortByFavoriteOrder","tabView","openMappingsPopup","openCompaniesPopup","window","href","hide","collapsibleGroups","groupTemplate","selectedItem","selectedItems","this","forEach","indexOf","onGroupRendered","component","collapseGroup","dxToolbar","widget","options","stylingMode","onClick","toggle","urlConfigs","logo","cssClass","userInitials","username","beginGroup","userProfile","userOrganization","version","date","authenticationMode","hideSubmenuOnMouseLeave","changePassword","removing","count","mappingNameDataField","ownerUserNameDataField","categoryNameDataField","lastViewedDataField","viewsCounterDataField","ko","observable","sortColumn","sortOrder","homeGridSettings","rowAlternationEnabled","headerFilter","search","enabled","columnChooser","mode","dataRowTemplate","container","tabsLink","tabs","tab","tabType","reportType","style","defaultTabId","sharedSpan","defaultWorkbook","editMode","tooltip","ownerUserName","ownerEmail","moment","format","dateFormat","catColumn","columns","dataField","colspan","rowspan","description","markup","mappingName","categoryName","viewsCounter","append","off","on","ui","notify","message","position","my","at","offset","y","repaintRows","getRowIndexByKey","updateFromServer","siteRoot","workbookId","rowIndex","deleteRow","showSharedPopup","value","css","document","querySelector","categoryId","selected","modal","dialog","confirm","done","dialogResult","index","splice","notifyError","caption","dataType","showInColumnChooser","minWidth","allowHiding","hidingPriority","showMappingColumn","showOwnerColumn","showCategoryColumn","cellTemplate","showLastViewedColumn","showViewsColumn","buttons","hint","row","searchPanel","placeholder","searchVisibleColumnsOnly","scrolling","paging","sorting","editing","confirmDelete","rowDragging","allowReordering","first","onReorder","visibleRows","getVisibleRows","toIndex","findIndex","fromIndex","order","input","favoriteOrder","showColumnLines","showRowLines","showBorders","filterValue","onRowClick","rowType","event","target","hasClass","copyTextToClipboard","companyId","url","onContentReady","element","each","click","onCellPrepared","column","cellElement","evt","beginUpdate","clearSorting","endUpdate","updateUserPreferences","onContextMenuPreparing","expandAll","collapseAll","onOptionChanged","fullName","match","toolbar","expanding","getVisibleColumns","user","workbookGrouping","subscribe","updateWorkbooksModeAndSortFavorites","dataGrid","applyBindings","get","dropDownAddFilter","addButtonPosition","parent","getBoundingClientRect","top","bottom","outerHeight","left","saveWorkbook","preventDefault","inputName","workbookName","workbookDescription","workbookCategory","workbookCategoryId","workbookCategoryName","selectedIndex","submitObj","val","isNameUnique","focus","saveShowHideWorkbooks","showSharedWorkbooks","showOtherOwners","userId","sharedWorkbooks","otherOwners","reportDesigner","allMetricName","percentFunctionType","designContainer","context","validateDesigner","designer","output","isValid","invalidMessage","ReportTypeStrEnum","Chart","rowElements","hasNonMetric","hasGroupBy","metric","groupingType","DesignerGroupingTypeEnum","GROUP_BY","aggregateReport","Pivot","groupElements","metricElements","chartType","ChartType","Bubble","Scatter","rows","groupBy","groups","checkVisibleField","array","source","eachLevelMessage","property","groupSectionName","validateFields","comparisonFilters","validateFieldsArray","$fields","$otherFields","i","field","duplicated","j","testField","queryName","allowDuplicatedNames","duplicatedName","checkDuplicatedName","displayName","trim","isExpression","errorMessage","validateFormula","formulaTop","formulaBottom","duplicate","metricId","applyObservables","applyObservablesForFieldArray","schema","tables","fields","metrics","comparisonFilter","applyObservablesForComparisonFilter","$fieldsArray","applyObservablesForField","comparisonType","DesignerComparisonTypeEnum","comparisonFilterId","divColor","computed","color","getQueryMetricName","functionType","getcomparisonTypeId","displayTableName","fieldName","autoGrouping","AutoGroupingStrEnum","FunctionTypeEnum","Normal","subscribeChanged","newValue","oldValue","applyingBindings","parentQueryName","DSUM","DesignerDataTypeEnum","DATE","autoGroupingOptions","allGroupingTypes","setTimeout","FieldFormatEnum","Currency","accountingStyle","Numeric","Percentage","decimalPlaces","AccumulatedAll","Accumulated","metricArray","remove","PercentageVariation","marginLeft","groupId","Analysis","bind","increaseGroupIdEnable","maxGroupId","elements","f","Math","max","decreaseGroupIdEnable","formatOptions","updateFilterVisibility","fieldId","adding","comparisonFilterElement","idx","replaceMetricName","replace","substr","dateOption","dateRange","dateFieldName","dateField","isManualDateOption","filters","filterVM","Filter","isComparisonFilter","removeFilter","boundField","comparisonBaseOptions","comp","hasFocus","show","mappingDataSource","getFieldName","fieldTextBoxOptions","readOnly","fieldPopoverButtonOptions","setDblClickDataSource","showDataSourcePopover","siblings","fieldRemoveButtonOptions","regexExpressionFormula","regexExpressionFormulaNames","isDbFormula","formulaReturn","getDbFormula","formula","notFoundFields","join","result","eval","isFinite","isNaN","Error","error","completeFunction","replaceValue","matches","matchAll","availableFields","getAvailableFields","expressionBuilderVM","fieldExpression","metricName","filterVariables","getFilterVariables","regexComparisonFilterVariables","designerInputModel","toJS","foundComparisonFilterVariables","includes","RegExp","replaceAll","getExpressionId","min","getExpressionBuilderVM","popup","expressionBuilderField","translateFormula","translatedFormulaTop","translatedFormulaBottom","isBinding","dataFor","calculateTotals","fieldListOptions","itemsExpr","expandedExpr","searchEnabled","timeout","lastTarget","lastFormulaFocus","end","function","caret","begin","newFormula","substring","trimLeft","formulaTopTextArea","formulaBottomTextArea","caretTo","nameTextBoxOptions","label","labelMode","groupingTypeTextBoxOptions","ArrayStore","groupingTypeOptions","valueExpr","onValueChanged","previousValue","model","calculateTotalsTextBoxOptions","topFormulaTextAreaOptions","inputAttr","onFocusIn","bottomFormulaTextAreaOptions","errorTextAreaOptions","autoResizeEnabled","treeView","dxTreeView","dxTextArea","WDSUM","expanded","saveDesign","validation","xAxis","yAxis","PivotElements","attr","callbackFunc","tempId","fromDashboard","showResultsForDesign","updateWorkbookReportList","updateWorkbookDashboardList","isWidget","widgetId","dashboard","dashboardWidget","getWidget","updateWidgetContents","updateTabView","renameField","button","divDraggable","divFieldName","toggleClass","contextFor","$data","newName","oldName","regMetaChars","pattern","rgx","compMetrics","test","showYesNoMessage","comparisonMetricField","removeAttr","keyCode","blur","restoreComparisonMetrics","showToast","addComparisonMetrics","cancelDesign","dxPopup","refreshWidgetData","getBaseSubmitObject","getActiveTab","transformInReportMetric","fromComparison","isReportMetric","isMetricField","mapField","NUMBER","COUNT","SUM","removeField","Variation","sortNextGroupId","Value","DesignerViewModel","designerVM","schemaVM","self","dropSection","mapping","fromJS","dateUnit","ComparisonDateUnitStrEnum","Day","dateUnitValue","reportTypeStr","changingReportType","removeAll","setSizeBoxElements","decimalPlacesOptions","MAX","MIN","WSUM","forExpression","functionOptions","PercentOfTotal","Rank","PercentOfRowTotal","PercentOfRowGrandTotal","PercentOfColumnTotal","PercentOfColumnGrandTotal","AbsoluteVariation","PercentVariation","TSUM","ByDay","ByWeek","ByMonth","ByQuarter","ByYear","ByMonthOnly","ByQuarterOnly","visualizationModeOptions","DesignerFieldVisualizationModeEnum","BarChart","barChartTextOptions","DesignerFieldBarChartTextEnum","barChartTextPositionOptions","DesignerFieldBarChartTextPositionEnum","Begin","Center","End","beforeMoveRowElements","arg","cancelDrop","beforeMoveGroupElements","beforeMoveMetricElements","afterMoveToRowElements","checkMetricRules","targetParent","siblingElement","oldGroupId","afterMoveToGroupElements","afterMoveToMetricElements","afterMoveComparisonFilter","transformNonMetric","addingField","dragged","$clone","koClone","bindingsApplied","afterRenderCallback","selectpicker","afterAddField","elementField","beforeRemoveField","fieldInfoPopoverOptions","$element","schemaField","showEvent","hideEvent","all","onHiding","dxPopover","removeMetrics","removeAllMetric","addSchemaField","checkDuplicated","parents","$elementsArray","$array","allMetric","findFieldByQueryName","notReportMetric","$item","itemJS","$clonedItem","clearFields","addExpression","$rawData","backgroundColor","foreColor","displayFieldNameDB","tableName","thresholdColor","thresholdValue","titleAlign","valuesAlign","formattingRuleId","formattingRuleName","showTotalValue","showSubtotalValue","visualizationMode","barChartText","barChartTextPosition","colorBar","negativeColorBar","columnWidth","partitionBy","newField","addALLMetric","NONE","addingTableFields","addTableFields","table","resolveComparison","resolveComparisonForMetric","newMetric","comparisonName","comparisonTypeId","addComparisonMetricsForFilter","hasComparisonFilter","comparisonColors","addComparisonFilter","toString","showValue","showVariation","showPercentageVariation","ComparisonDateOptionStrEnum","Previous","Month","comparisonFilterIdBase","applyFilterEvents","removeComparisonFilter","comparisonDateOptions","Manual","Predefined","comparisonDateUnitOptions","Year","Quarter","comparisonDateUnitValueOptions","filterEditorTypeArray","addNewFilter","$parent","jsonInput","filterId","scope","scopeAction","selectFormattingRule","formattingRule","openList","clearFormattingRule","increaseGroupId","rowGroupElements","observableArray","decreaseGroupId","expressionBuilderButtonOptions","comparisonFilterContext","setPositionDropdown","dropdownHeight","call","adjustReportTypeTitle","title","onReportTypeChanged","settingsReportButtonClick","callbackFunction","isFromDashboard","load","bindingHandlers","sortable","designerContainer","resize","onShowing","showCloseButton","toolbarItems","of","replaceNamesToQueryName","filtersManager","hideFiltersClick","prepareDataSourcePopover","EmailFormatEnum","SendEmptyReportEnum","Email","constructor","scheduleId","sendReport","subjectText","recipients","formats","PDF","bodyText","drilldownId","tabId","tabName","mappingId","userName","scheduleDetails","emailCount","dateAdded","toISOString","lastSentDate","lastStatus","ContainerScopeEnum","Workbook","sendEmptyReport","Yes","widgetIdEmptyReport","lastEmailSent","lastMessageId","lastSmtpResponse","schedule","scheduledDays","scheduledDaysFilter","scheduledHour","useAddressList","addressListId","companyName","organisationId","attachments","showInfoBody","cc","bcc","pdfTemplateId","AttachmentTab","scheduledEmail","validateSchedule","scheduleEmail","copyProperties","fromObject","toObject","fromValue","Array","isArray","copyIds","email","popupSendNow","emailsId","success","resp","emails","respEmail","filtered","currentEmail","currentSchedule","textStatus","failureText","enablePopupMode","isNewRow","emailsManagement","allowEdit","userReportID","returnedData","prepareEmails","store","update","usersGroups","widgets","alert","changes","cancelEditData","editRow","rowChange","c","keys","cellValue","getDxDataGrid","workbookTabs","showMessage","tabsRemoved","t","att","openPopup","form","bottomForm","formatList","getColumnValue","columnName","editRowKey","CustomStore","loadOptions","insert","values","d","Deferred","resolve","promise","arr","getFormatList","PDFLandscape","Excel","CSV","getAttachmentsOptions","generateNewAttachmentOptions","gridInstance","itemType","colCount","colSpan","editorType","editorOptions","indexList","editor","getEditor","isRequired","validationRules","printExportPDF","exportExcelCSV","buttonOptions","itemOption","refreshByCode","newRow","saveReportsMessage","dataGridOptions","selection","showCheckBoxesMode","validationCallback","v","lookup","addressLists","setCellValue","newData","defaultSetCellValue","Report","Dashboard","Notification","pdfTemplates","companies","users","emailLogs","open","showEmailLogButton","allowUpdating","allowDeleting","allowAdding","useIcons","alignItemLabelsInAllGroups","onInitialized","addButton","groupAttachment","insertAfter","customizeItem","isVisible","isDisabled","scopeText","hasFilter","infoIcon","dxTooltip","contentTemplate","args","appendTo","useMaskBehavior","showDropDownButton","displayFormat","showSelectionControls","Id","Name","onClosed","sorted","n1","n2","repaint","showTitle","focusedRowEnabled","focusedRowIndex","popupFilters","vmFilter","dateRangeOptions","multiView","startDate","endDate","showClearButton","startTimeOptions","startTime","timeBox","dxDateBox","endTime","endTimeOptions","applyOptions","vals","dxDateRangeBox","filterOptions","filtervalue","gridComponent","daysOfweek","daysOfMonth","weeklyFilter","monthlyFilter","setDate","getDate","getDay","starTimeStr","endTimeStr","getElementById","dragEnabled","hideOnOutsideClick","getSelectedRowKeys","onEditorPreparing","parentType","enable","deprecated","onRowInserted","onEditingStart","cancel","onEditCanceling","onFocusedRowChanged","_c","onSaving","JSON","parse","stringify","attachment","onSaved","onInitNewRow","userGroup","onSelectionChanged","selectedRowKeys","buttonColumn","formOptions","formData","console","log","onShown","openEmailsPopup","openEmailsManagement","emailId","EmailsId","em","emailProperties","$values","getLogs","callback","EmailId","currentLog","logs","sentFilter","recipientsFilter","startDateFilter","endDateFilter","startTimeFilter","endTimeFilter","allowGrouping","status","focusedRowKey","groupPanel","irSettings","previousStartDate","previousEndDate","newStartDate","newEndDate","localization","formatDate","recipientsOptions","sentOptions","enableThreeStateBehavior","sent","partial"],"mappings":"AAAA,IAAKA,sBAKAC,sBAOAC,iBCZLC,WAAWC,OAAO,CAAEC,WAAY,sRDAhC,SAAKL,GACDA,EAAAA,EAAA,IAAA,GAAA,MACAA,EAAAA,EAAA,OAAA,GAAA,SACAA,EAAAA,EAAA,UAAA,GAAA,WACH,CAJD,CAAKA,wBAAAA,sBAAqB,CAAA,IAK1B,SAAKC,GACDA,EAAAA,EAAA,IAAA,GAAA,MACAA,EAAAA,EAAA,KAAA,GAAA,OACAA,EAAAA,EAAA,WAAA,GAAA,aACAA,EAAAA,EAAA,OAAA,GAAA,QACH,CALD,CAAKA,wBAAAA,sBAAqB,CAAA,IAO1B,SAAKC,GACDA,EAAA,KAAA,OACAA,EAAA,QAAA,UACAA,EAAA,MAAA,QACAA,EAAA,SAAA,UACH,CALD,CAAKA,mBAAAA,iBAAgB,CAAA,IAOrB,IAAII,KAAO,WAEP,IAAIC,EAAe,WACf,IAAIC,EAAOC,EAAE,wBACb,OAAID,EAAKE,OAAS,EACPC,SAASH,EAAK,GAAGI,QAAQC,GAAI,KAEhC,CACZ,EAcA,IAAIC,EAAkB,SAAUC,GAC5B,IAAIC,EAAOD,EAAGE,qBAAuBjB,sBAAsBkB,OAAS,SAAWH,EAAGE,qBAAuBjB,sBAAsBmB,UAAY,WAAa,MAEpJC,EAAQ,GACRC,EAAY,GAFGC,SAASC,YASxBH,EAAQL,EAAGS,qBAAuBvB,sBAAsBwB,KAAO,UAAYV,EAAGS,qBAAuBvB,sBAAsByB,WAAa,YAAc,GACzI,QAATV,EACAA,GAAQ,IAGM,KAAVI,IACAJ,GAAQ,cAGhBP,EAAE,cAAckB,KAAK,GAAGX,IAAOI,OAd/BA,EAAQL,EAAGS,qBAAuBvB,sBAAsBwB,KAAO,UAAYV,EAAGS,qBAAuBvB,sBAAsByB,WAAa,iBAAmB,GAC3JL,EAAYN,EAAGa,aAAe1B,iBAAiB2B,KAAO,GAAK,OAAOd,EAAGa,aACrEnB,EAAE,cAAckB,KAAK,GAAGX,cAAiBK,IAAYD,KAc7D,EAEIU,EAAa,KAwnCjB,MAAO,CACHC,MAxnCQ,WENR,IAAIC,EAAIC,EFOJC,aAA8C,GAA/BA,YAAYC,WAAWC,MACtCC,SAASC,SAGbhB,SAASS,QACTT,SAASiB,sBAET,IAAIC,EAAO/B,EAAE,gBAAgBgC,KAAK,QAClCD,EAAKE,UAAYF,EAAKE,UAAUC,KAAIC,GAChCC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAYF,GAAG,CAAEG,eAAgB,IAAIC,KAAKJ,EAAIK,gBAGlD,IAAIC,EAAgB,WAChB,IAAIC,EAAQ,GAEZ,OAAQpC,EAAGE,qBACP,KAAKjB,sBAAsBkB,OACvBiC,EAAQX,EAAKE,UAAUU,MAAK,CAACC,EAAGC,IAAMA,EAAEP,eAAiBM,EAAEN,iBAAgBQ,MAAM,EAAG,IACpF,MACJ,KAAKvD,sBAAsBmB,UACvBgC,EAAQX,EAAKE,UAAUc,QAAOC,GAAKA,EAAEC,SAASC,WAC9C,MACJ,QACIR,EAAQX,EAAKE,UAIrB,OAAOS,CACX,EAEIS,EAAetC,SAASC,WAE5B,MAAMsC,EAAgB,OAChBC,EAAiB,SACjBC,EAAmB,WACzB,IAqFIC,EArFAC,EAAW,CACX,CACIC,IAAK,UACLC,KAAM,UACNC,MAAO,CACH,CACIF,IAAK,IAAKG,KAAM,eAAgBF,KAAM,MAAOG,SAAUC,WAAWC,YAAYC,mBAAqBF,WAAWC,YAAY9B,eAAiBkB,GAE/I,CACIM,IAAK,IAAKG,KAAkB,QAAZrC,EAAAQ,EAAKkC,eAAO,IAAA1C,OAAA,EAAAA,EAAEqC,KAAMF,KAAM,OAAQG,QAAS9B,EAAKmC,kBAChEC,SAAU,wEAAoF,QAAZ3C,EAAAO,EAAKkC,eAAO,IAAAzC,OAAA,EAAAA,EAAEoC,eAEpG,CACIH,IAAK,IAAKG,KAAM,QAASF,KAAM,cAAeG,SAAUV,GAAgBpB,EAAKqC,YAC7ED,SAAU,gFAItB,CACIV,IAAKL,EACLM,KAAM,UACNC,MAAO,CACH,CACIF,IAAK,EAAGG,KAAM,SAAUF,KAAM,QAASW,MAAOtC,EAAKE,UAAUU,MAAK,CAACC,EAAGC,IAAMA,EAAEP,eAAiBM,EAAEN,iBAAgBQ,MAAM,EAAG,IAAI7C,OAC9HkE,SAAU,sFAEd,CACIV,IAAK,EAAGG,KAAM,YAAaF,KAAM,YAAaW,MAAOtC,EAAKE,UAAUc,QAAOC,GAAKA,EAAEC,SAASC,WAAUjD,OACrGkE,SAAU,qFAEd,CACIV,IAAK,EAAGG,KAAM,MAAOF,KAAM,gBAAiBW,MAAOtC,EAAKE,UAAUhC,OAClEkE,SAAU,iGAItB,CACIV,IAAKJ,EACLK,KAAM,OACNC,MAAO,CACH,CAAEF,IAAK,GAAIG,KAAM,MAAOF,KAAM,QAASS,SAAU,8DACjD,CAAEV,IAAK,GAAIG,KAAM,OAAQF,KAAM,OAAQS,SAAU,+DACjD,CAAEV,IAAK,GAAIG,KAAM,SAAUF,KAAM,OAAQS,SAAU,kEAG3D,CACIV,IAAKH,EACLI,KAAM,YACNC,MAAO,CACH,CACIF,IAAK,GAAIG,KAAM,OAAQF,KAAM,gBAAiBS,SAAU,6EAE5D,CACIV,IAAK,GAAIG,KAAM,UAAWF,KAAM,gBAAiBS,SAAU,wGAC3DG,SAAUvC,EAAKvB,oBAAsBjB,sBAAsBmB,WAE/D,CACI+C,IAAK,GAAIG,KAAM,QAASF,KAAM,OAAQS,SAAU,mFAChDG,SAAUvC,EAAKvB,oBAAsBjB,sBAAsBmB,WAE/D,CACI+C,IAAK,GAAIG,KAAM,WAAYF,KAAM,MAAOS,SAAU,wFAClDG,SAAUvC,EAAKvB,oBAAsBjB,sBAAsBmB,aAIvE,CACI+C,IAAK,UACLC,KAAM,YACNC,MAAO,CACH,CAAEF,IAAK,GAAIG,KAAM,iBAAkBF,KAAM,iBAAkBS,SAAU,qEAAsEN,SAAUhD,SAASC,eAKtKyD,EAAmB,CACnBxC,EAAKvB,oBAAsBjB,sBAAsBiF,IAAM,EAAKzC,EAAKvB,oBAAsBjB,sBAAsBkB,OAAS,EAAI,EAC1HsB,EAAKhB,oBAAsBvB,sBAAsBgF,IAAM,GAAMzC,EAAKhB,oBAAsBvB,sBAAsBwB,KAAO,GAAK,GAC1HwC,EAASiB,MAAKzB,GAAe,aAAVA,EAAES,MAAoBE,MAAMc,MAAKzB,GAAKA,EAAEY,OAAS7B,EAAKZ,WAAUsC,KAGnF1B,EAAK2C,UACLH,EAAiBI,KAAK,IAI1B,IAAIC,EAAS5E,EAAE,WAAW6E,SAAS,CAC/BC,WAAY,QAEZC,gBAAkB5B,EAA0B,UAAX,SACjC6B,QAAS7B,EACT8B,oBAAqB9B,EACrBgB,SAAU,SAAUe,GAChB,IAAIC,EAAYnF,EAAE,iFA6OlB,OA3OAuD,EAAkB4B,EAAUC,OAAO,CAC/BC,WAAY7B,EACZ8B,QAAS,MACTC,aAAc,SAAUL,GACpB,IAAIM,EAAW,WAAWN,EAAExB,OACxBA,EAAOwB,EAAExB,KAAO,aAAa8B,WAAoB,GAErD,OAAOxF,EAAE,GAAG0D,UAAawB,EAAEtB,cAC/B,EACA6B,MAAO,IACPC,OAAQ,OACRC,eAAe,EACfC,cAAe,WACfrB,iBAAkBA,EAClBsB,YAAa,CAAEC,MAAO,uCACtBC,WAAY,CAAC,OAAQ,cACrBC,YAAa,OACbC,SAAS,EACTC,mBAAmB,EACnBC,mBAAmB,EACnBC,YAAYlB,GACR,GAAIA,EAAEmB,WAAcnB,EAAEmB,UAAkBC,OAAS,GAAMpB,EAAEmB,UAAkBC,OAAS,EAAG,CACnF,IAAIC,EAAY,GAChB,OAASrB,EAAEmB,UAAkBC,OACzB,KAAK,EACDC,EAAYnD,EACZ,MACJ,KAAK,EACDmD,EAAYlD,EACZ,MACJ,KAAK,EACDkD,EAAYjD,EAGpBtD,EAAE,6BAA8BkF,EAAEsB,YAAYC,QAAQ,mBAAmBC,KAAK,GAAGH,MAAcrB,EAAEyB,SAAS/C,OAC9G,CACA,IAAIgD,EAAYzD,EACZ0D,EAAY7G,EAAE,qBAAqB8G,WAAW,YAElD,GAAI5B,EAAEyB,SAASlD,IAAM,GAAI,CAErB,IAAIsD,EAAa,CACbT,MAAQpB,EAAEmB,UAAkBC,MAC5BU,KAAM,GAEV,IAAK,IAAIA,KAAQxD,EAAU0B,EAAEmB,UAAkBC,OAAO3C,MAClDJ,EAAgB0D,aAAaF,GAC7BA,EAAWC,OAEfzD,EAAgB2D,WAAWhC,EAAEmB,UACjC,CAEA,IAAIc,EAAuB,WACvB7G,EAAGa,SAAS1B,iBAAiB2B,MAC7ByF,EAAUO,gBACVP,EAAUQ,OAAO,oCAAoC,EACzD,EAEA,OAAQnC,EAAEyB,SAASlD,KAEf,KAAK,EACDnD,EAAGE,kBAAkBjB,sBAAsBkB,QAC3C6G,IAEA,IAAIC,EAAM9E,IACVoE,EAAUQ,OAAO,aAAcE,GAE/BV,EAAUQ,OAAO,oCAAoC,GACrDR,EAAUQ,OAAO,oCAAoC,GAErDrH,EAAE,iEAAiEyG,QAAQ,yBAAyBe,YAAY,qBAChH,MAEJ,KAAK,EACDlH,EAAGE,kBAAkBjB,sBAAsBmB,WAC3C4G,IAEA,IAAIG,EAAMhF,IACVoE,EAAUQ,OAAO,aAAcI,GAE/BN,IAEAN,EAAUQ,OAAO,oCAAoC,GACrDR,EAAUQ,OAAO,oCAAoC,GAErDrH,EAAE,iEAAiEyG,QAAQ,yBAAyBiB,SAAS,qBAC7G,MAEJ,KAAK,EACDpH,EAAGE,kBAAkBjB,sBAAsBiF,KAC3C8C,IAEA,IAAIK,EAAMlF,IACVoE,EAAUQ,OAAO,aAAcM,GAE/Bd,EAAUQ,OAAO,oCAAoC,GACrDR,EAAUQ,OAAO,oCAAoC,GAErDrH,EAAE,iEAAiEyG,QAAQ,yBAAyBe,YAAY,qBAChH,MAEJ,KAAK,GACDlH,EAAGS,kBAAkBvB,sBAAsBgF,KAC3CqC,EAAUQ,OAAO,mBAAeO,GAChC,MAEJ,KAAK,GACDtH,EAAGS,kBAAkBvB,sBAAsBwB,MAC3C6F,EAAUQ,OAAO,cAAe,CAAC,UAAW,IAAK,GAAGvD,WAAW1D,SAC/D,MAEJ,KAAK,GACG0D,WAAWC,YAAY9B,aACvB3B,EAAGS,kBAAkBvB,sBAAsByB,YAC3C4F,EAAUQ,OAAO,cAAe,CAAC,UAAW,KAAM,GAAGvD,WAAW1D,WAGhEE,EAAGS,kBAAkBvB,sBAAsBqI,QAC3ChB,EAAUQ,OAAO,cAAe,CAAC,WAAY,KAAM,OAEvD,MAEJ,KAAK,GACDF,IACA,MAEJ,KAAK,GACD7G,EAAGa,SAAS1B,iBAAiBqI,SAC7BjB,EAAUO,gBACVP,EAAUkB,aAAa,cAAe,aAAc,GACpDlB,EAAUQ,OAAO,oCAAoC,GAErD/G,EAAG0H,mBAAkB,GACrBzE,EAAgB0D,aAAa,CAAEX,MAAO,EAAGU,KAAM,IAC/C,MAEJ,KAAK,GACD1G,EAAGa,SAAS1B,iBAAiBwI,OAC7BpB,EAAUO,gBACVP,EAAUkB,aAAa,gBAAiB,aAAc,GACtDlB,EAAUQ,OAAO,oCAAoC,GAErD/G,EAAG0H,mBAAkB,GACrBzE,EAAgB0D,aAAa,CAAEX,MAAO,EAAGU,KAAM,IAC/C,MAEJ,KAAK,GACD1G,EAAGa,SAAS1B,iBAAiByI,UAC7BrB,EAAUO,gBACVP,EAAUkB,aAAa,eAAgB,aAAc,GACrDlB,EAAUQ,OAAO,oCAAoC,GAErD/G,EAAG0H,mBAAkB,GACrBzE,EAAgB0D,aAAa,CAAEX,MAAO,EAAGU,KAAM,IAC/C,MAEJ,KAAK,GACD1G,EAAGoE,UAAUpE,EAAGoE,YACZpE,EAAGoE,WACHnB,EAAgB2D,WAAWhC,EAAEmB,WAG7B9C,EAAgB0D,aAAa/B,EAAEmB,WAEnCQ,EAAUsB,UACV,MAEJ,KAAK,GACG7H,EAAGE,qBAAuBjB,sBAAsBmB,WAC5CJ,EAAGE,qBAAuBjB,sBAAsBmB,YAEhDJ,EAAG0H,mBAAmB1H,EAAG0H,qBACrB1H,EAAG0H,oBACHzE,EAAgB2D,WAAWhC,EAAEmB,WAG7B9C,EAAgB0D,aAAa/B,EAAEmB,YAI3C,MAEJ,KAAK,GACG/F,EAAGE,qBAAuBjB,sBAAsBmB,YAEhDJ,EAAG8H,qBAAqB9H,EAAG8H,uBACvB9H,EAAG8H,sBACH7E,EAAgB2D,WAAWhC,EAAEmB,WAG7B9C,EAAgB0D,aAAa/B,EAAEmB,YAGvC,MAEJ,KAAK,IACDgC,QAAQC,oBACR,MAEJ,KAAK,IACD1B,GAAY,EACZyB,QAAQE,oBAAmB,GAC3B,MAEJ,KAAK,IACDC,OAAO5G,SAAS6G,KAAO,SAI/BpI,EAAgBC,GAEZsG,GACAhC,EAAO8D,MAEf,EACAC,mBAAmB,EACnBC,cAAc5G,GACV,IAAI6G,EAAe,KACnB,GAAI7G,EAAK2B,OAAsB,YAAb3B,EAAKyB,KAAkC,YAAbzB,EAAKyB,IAAmB,CAChE,IAAIqF,EAAgBC,KAAK1B,OAAO,oBAChCrF,EAAK2B,MAAMqF,SAAQ,SAAUhC,IACgB,IAArC8B,EAAcG,QAAQjC,EAAKvD,OAC3BoF,EAAe7B,EAEvB,GACJ,CAEA,OAAOhH,EAAE,SAASgC,EAAKyB,MAAOoF,EAAe,KAAKA,EAAajF,OAAS,YAC5E,EACAsF,gBAAiB,SAAUhE,GACnBA,EAAE6B,WAAa,GACf7B,EAAEiE,UAAUC,cAAclE,EAAE6B,WACpC,IACD3B,OAAO,YAEHD,CACX,EACAO,OAAQ,sBACTb,SAAS,YA2FRyC,GAzFiBtH,EAAE,YAAYqJ,UAAU,CACzCxD,YAAa,CACTC,MAAO,6BAEXnC,MAAO,CACH,CACI2F,OAAQ,WACR1H,SAAU,SACV2H,QAAS,CACL7F,KAAM,OACN8F,YAAa,OACbC,UACI7E,EAAO8E,QACX,IAGR,CACI9H,SAAU,SACV8E,KAAM,aAAaiD,WAAWC,iEAElC,CACIhI,SAAU,SACV8E,KAAM,sFACNjB,MAAO,KAEX,CACI7D,SAAU,QACV0H,OAAQ,SACRC,QAAS,CACLM,SAAU,cACVlG,MAAO,CAAC,CACJC,KAAM7B,EAAK+H,aACXnG,MAAO,CACH,CACIC,KAAM7B,EAAKgI,SACXrD,KAAM,8CAEV,CACIsD,YAAY,EACZpG,KAAM,YAAc7B,EAAKkI,YACzBvD,KAAM,6CAEV,CACI9C,KAAM,iBAAmB7B,EAAKmI,iBAC9BxD,KAAM,sDAEV,CACIsD,YAAY,EACZpG,KAAM,wBACN8C,KAAM,iDAEV,CACI9C,KAAM,YAAc7B,EAAKoI,QACzBzD,KAAM,4CAEV,CACI9C,KAAM,SAAW7B,EAAKqI,KACtB1D,KAAM,mDAEV,CACIsD,YAAY,EACZpG,KAAM,kBACN8C,KAAM,+CACN7C,QAAgC,OAAvBwG,oBAEb,CACIL,YAAY,EACZpG,KAAM,SACN8C,KAAM,iDAIlB4D,yBAAyB,EACzBtE,YAAa,OACbI,YAAYpE,GACR,OAAQA,EAAK2E,SAAS/C,MAClB,IAAK,kBACD/C,SAAS0J,iBACT,MACJ,IAAK,SACD/B,OAAO5G,SAAS6G,KAAO,gBAGnC,OAIbY,UAAU,YAES,SAAUmB,GAAoB,GAChD,GAAIA,GAAYlK,EAAGE,oBAAqB,CACpC,IAAIiK,EAASjH,EAASiB,MAAKzB,GAAe,SAAVA,EAAES,MAAgBE,MAAMc,MAAKzB,GAAc,GAATA,EAAES,MAAkBY,MACrFb,EAASiB,MAAKzB,GAAe,SAAVA,EAAES,MAAgBE,MAAMc,MAAKzB,GAAc,GAATA,EAAES,MAAkBY,MAAQoG,EAAQ,EAAIA,EAAQ,EAAI,EAC1GzK,EAAE,+BAAgCA,EAAE,sBAAsByG,QAAQ,0BAA0BC,KAAM+D,EAAQ,EAAIA,EAAQ,EAAI,EAC9H,KACK,CACD,IAAIA,EAAQ1I,EAAKE,UAAUU,MAAK,CAACC,EAAGC,IAAMA,EAAEP,eAAiBM,EAAEN,iBAAgBQ,MAAM,EAAG,IAAI7C,OAC3FuD,EAASiB,MAAKzB,GAAe,SAAVA,EAAES,MAAgBE,MAAMc,MAAKzB,GAAc,GAATA,EAAES,MAAkBY,MAAQoG,EAClFzK,EAAE,+BAAgCA,EAAE,sBAAsByG,QAAQ,0BAA0BC,KAAK+D,EACrG,CAECjH,EAASiB,MAAKzB,GAAe,SAAVA,EAAES,MAAgBE,MAAMc,MAAKzB,GAAc,GAATA,EAAES,MAAkBY,MAAQtC,EAAKE,UAAUc,QAAOC,GAAKA,EAAEC,SAASC,WAAUjD,OAClID,EAAE,+BAAgCA,EAAE,sBAAsByG,QAAQ,0BAA0BC,KAAK3E,EAAKE,UAAUc,QAAOC,GAAKA,EAAEC,SAASC,WAAUjD,QAEhJuD,EAASiB,MAAKzB,GAAe,SAAVA,EAAES,MAAgBE,MAAMc,MAAKzB,GAAc,GAATA,EAAES,MAAkBY,MAAQtC,EAAKE,UAAUhC,OACjGD,EAAE,+BAAgCA,EAAE,sBAAsByG,QAAQ,0BAA0BC,KAAK3E,EAAKE,UAAUhC,OACpH,GAEA,MAAMyK,EAAuB,cACvBC,EAAyB,gBACzBC,EAAwB,eACxBC,EAAsB,aACtBC,EAAwB,eAC9B,IAAIxK,EAAK,CACLE,kBAAmBuK,GAAGC,WAAWjJ,EAAKvB,mBACtCkE,SAAUqG,GAAGC,WAAWjJ,EAAK2C,UAC7B3D,kBAAmBgK,GAAGC,WAAWjJ,EAAKhB,mBACtCI,SAAU4J,GAAGC,WAAWjJ,EAAKZ,UAC7B8J,WAAYF,GAAGC,WAAWjJ,EAAKkJ,YAC/BC,UAAWH,GAAGC,WAAWjJ,EAAKmJ,WAC9B9C,oBAAqB2C,GAAGC,WAAWjJ,EAAKqG,qBACxCJ,kBAAmB+C,GAAGC,YAAW,GACjCG,iBAAkB,CACdtF,YAAa,CACTC,MAAO,eAEXL,MAAO,OACPC,OAAQ,qBACR0F,uBAAuB,EACvBC,aAAc,CACVxH,SAAS,EACTyH,OAAQ,CACJC,SAAS,IAGjBC,cAAe,CACXD,SAAS,EACTE,KAAM,UAEVpG,gBAAYuC,EACZtC,QAAS,KAEToG,gBAAgBC,EAAW3E,GACvB,MAAMhF,KAAEA,GAASgF,EAEjB,IAAI4E,EAAW,GACf,GAAItL,EAAGoE,aAAe7D,SAASC,WAAY,CAEvC,IAAI2J,EAAQ,EACZzI,EAAKiB,SAAS4I,KAAK7C,SAAQ,SAAU8C,GACjC,IAAIpI,EAAO,qBACX,GACS,IADDoI,EAAIC,QAEJrI,EAAO,iBAGP,OAAQoI,EAAIE,YACR,KAAK,EACDtI,EAAO,WACP,MACJ,KAAK,EACDA,EAAO,YACP,MACJ,KAAK,EACDA,EAAO,oBAKvB,IAAIuI,EAAQH,EAAI1L,IAAM4B,EAAKiB,SAASiJ,aAAe,kBAAoB,GAGvEN,GAAY,OAFInB,EAAQ,EAAI,MAAQ,iBAEOqB,EAAI1L,gBAAgB4B,EAAK5B,6GACM6L,MAAUvI,WAAcoI,EAAIlI,kDAGtG6G,GACJ,GACJ,CAEA,IAAI0B,EAAa,GACbC,EAAkB,GACtB,GAAsB,IAAlBpK,EAAKqK,WAAmBvI,WAAWC,YAAY9B,YAAa,CAC5D,IAAIqK,EAA4B,IAAlBtK,EAAKqK,SAAiB,YAAc,YAC9CrK,EAAKuK,gBACLD,GAAW,cAActK,EAAKuK,iBAE9BvK,EAAKwK,aACLF,GAAW,eAAetK,EAAKwK,cAEnCL,EAAa,gEAAgEG,YACjF,CAEItK,EAAK5B,KAAO2B,EAAKqK,kBACjBA,EAAkB,+GAGtB,IAAI5J,EAAaR,EAAKQ,WAElBA,EADAR,EAAKQ,WACQiK,OAAOzK,EAAKQ,YAAYkK,OAAO3K,EAAK4K,YAGpC,GAGjB,MAAMC,EAAY5F,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAclC,IAAyB,EAAI,EACtF,IAAImC,GAAWzM,EAAGa,aAAe1B,iBAAiB2B,KAAO,EAAI,GAAKwL,EAC7D5F,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAcpC,KACxCqC,IACC/F,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAcnC,KACxCoC,IACC/F,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAcjC,KACxCkC,IACC/F,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAchC,KACxCiC,IAEJ,MAAMC,EAAUhL,EAAKiL,YAAc,EAAI,EACjCC,EAAS,yBACR5M,EAAG0H,qBAAuB1H,EAAGE,sBAAwBjB,sBAAsBmB,WAAaJ,EAAGa,aAAe1B,iBAAiB2B,KAAO,gBAAgB4L,mLAA2L,KAC7U1M,EAAGa,aAAe1B,iBAAiB2B,KAAO,gBAAgB4L,WAAmB,IAC9E,OACA,uBAAuBhL,EAAK4B,OAAOuI,IAAaC,gBAG/C9L,EAAGa,aAAe1B,iBAAiBqI,SAAWd,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAcpC,IAAwB,OAAO1I,EAAKmL,mBAAqB,KAC9I7M,EAAGa,aAAe1B,iBAAiBwI,OAASjB,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAcnC,IAA0B,OAAO3I,EAAKuK,qBAAuB,KAChJjM,EAAGa,aAAe1B,iBAAiByI,UAAYlB,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAclC,IAAyB,OAAQ5I,EAAKoL,aAAepL,EAAKoL,aAAe,UAAa,KAC5KpG,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAcjC,IAAuB,OAAOrI,SAAoB,KACzFwE,EAAK6F,QAAQpI,MAAKzB,GAAKA,EAAE8J,YAAchC,IAAyB,OAAO9I,EAAKqL,oBAAsB,IACnG,0JACUrL,EAAKiB,SAASC,SAA+I,GAApI,sKAC1BlB,EAAKiB,SAASC,SAAW,0HAA2H,uCAClI,IAAlBlB,EAAKqK,UAAoC,IAAlBrK,EAAKqK,UAAkBvI,WAAWC,YAAY9B,YAAc,sGAAwG,uCACzK,IAAlBD,EAAKqK,UAAoC,IAAlBrK,EAAKqK,UAAkBvI,WAAWC,YAAY9B,YAAc,mGAAqG,uCACtK,IAAlBD,EAAKqK,UAAkBvI,WAAWC,YAAY9B,YAAc,yGAA0G,kDAG9KD,EAAKiL,YAEF,gDAAgBF,mCAAyC/K,EAAKiL,8BAE9D,KAEU,KAAbrB,EAEG,oCAAgBmB,2BAAiCnB,mBAEjD,IAGVD,EAAU2B,OAAOJ,GAEjBlN,EAAE,qBAAsB2L,GAAW4B,IAAI,SAASC,GAAG,SAAS,WACxDxL,EAAKiB,SAASC,UAAW,EACzBoE,IAEA5H,WAAW+N,GAAGC,OAAO,CACjBC,QAAS,aAAa3L,EAAK4B,2BAC3BjC,KAAM,OACNiM,SAAU,CAAEC,GAAI,YAAaC,GAAI,YAAaC,OAAQ,CAAE/K,GAAI,GAAIgL,EAAG,KACnEvI,MAAO,MAGXuB,EAAKmC,UAAU8E,YAAY,CAACjH,EAAKmC,UAAU+E,iBAAiBlH,EAAKvD,OAEjE5C,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWyE,SAAW,uBACtB,CAAEC,WAAYrM,EAAK5B,GAAI8C,UAAU,GACjC,KACA,MACA,EACA,QACA,EACR,IACAlD,EAAE,wBAAyB2L,GAAW4B,IAAI,SAASC,GAAG,SAAS,WAC3DxL,EAAKiB,SAASC,UAAW,EACzBoE,IAEA5H,WAAW+N,GAAGC,OAAO,CACjBC,QAAS,aAAa3L,EAAK4B,6BAC3BjC,KAAM,OACNiM,SAAU,CAAEC,GAAI,YAAaC,GAAI,YAAaC,OAAQ,CAAE/K,GAAI,GAAIgL,EAAG,KACnEvI,MAAO,MAGX,IAAI6I,EAAWtH,EAAKmC,UAAU+E,iBAAiBlH,EAAKvD,KAChDnD,EAAGE,sBAAwBjB,sBAAsBmB,UACjDsG,EAAKmC,UAAUoF,UAAUD,GAGzBtH,EAAKmC,UAAU8E,YAAY,CAACK,IAGhCzN,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWyE,SAAW,uBACtB,CAAEC,WAAYrM,EAAK5B,GAAI8C,UAAU,GACjC,KACA,MACA,EACA,QACA,EACR,IACAlD,EAAE,uBAAwB2L,GAAW4B,IAAI,SAASC,GAAG,SAAS,WAC1DnF,QAAQmG,gBAAgBxM,EAAK5B,GACjC,IACAJ,EAAE,sBAAuB2L,GAAW4B,IAAI,SAASC,GAAG,SAAS,WACzDnM,EAAa2F,EAEZhH,EAAE,0BAA0B,GAAWyO,MAAQzM,EAAK4B,KACrD5D,EAAE,0BAA0B0O,IAAI,eAAgB,IAC/C1O,EAAE,iCAAiC,GAAWyO,MAAQzM,EAAKiL,YAE3D0B,SAASC,cAAc,sCAAwC5M,EAAK6M,WAAa,MAAcC,UAAW,EAE1G9O,EAAE,yBAAiC+O,MAAM,OAC9C,IACA/O,EAAE,wBAAyB2L,GAAW4B,IAAI,SAASC,GAAG,SAAS,WAC9C9N,WAAW+N,GAAGuB,OAAOC,QAAQ,gDAAiDjN,EAAK4B,MACzFsL,MAAK,SAAUC,GACdA,GACAtO,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWyE,SAAW,sBACtB,CAAEC,WAAYrM,EAAK5B,KACnB,WACI,MAAMkO,EAAWtH,EAAKmC,UAAU+E,iBAAiBlH,EAAKvD,KAChD2L,EAAQrN,EAAKE,UAAUgH,QAAQjH,GACrCD,EAAKE,UAAUoN,OAAOD,EAAO,GAC7BpI,EAAKmC,UAAUoF,UAAUD,GACzBhH,GAAgB,EACpB,IACA,WACIzG,SAASyO,YAAY,0DACrB5P,WAAW+N,GAAGC,OAAO,CACjBC,QAAS,wDACThM,KAAM,QACNiM,SAAU,CAAEC,GAAI,YAAaC,GAAI,YAAaC,OAAQ,CAAE/K,GAAI,GAAIgL,EAAG,KACnEvI,MAAO,KAEf,IACA,EACA,OAEZ,GACJ,GACJ,EACAoH,QAAS,CACL,CAAEC,UAAW,yBAA0ByC,QAAS,QAASrE,UAAWnJ,EAAKvB,oBAAsBjB,sBAAsBmB,UAAY,WAAQkH,EAAW/D,SAAS,EAAO2L,SAAU,SAAUC,qBAAqB,GAC7M,CAAE3C,UAAW,KAAMyC,QAAS,cAAe1L,SAAS,EAAO2L,SAAU,SAAUC,qBAAqB,GACpG,CAAE3C,UAAW,WAAYjJ,SAAS,EAAO2L,SAAU,SAAUC,qBAAqB,GAClF,CAAE3C,UAAW,UAAWjJ,SAAS,EAAO2L,SAAU,SAAUC,qBAAqB,GACjF,CACI3C,UAAW,OACXyC,QAAS,WACTC,SAAU,SACVtE,UAA+B,SAApBnJ,EAAKkJ,YAAyBlJ,EAAKvB,oBAAsBjB,sBAAsBmB,UAAYqB,EAAKmJ,eAAYtD,EACvH8H,SAAU,IACVC,aAAa,GAEjB,CACI7C,UAAW,cACX0C,SAAU,SACVD,QAAS,UACTrE,UAA+B,gBAApBnJ,EAAKkJ,YAAgClJ,EAAKvB,oBAAsBjB,sBAAsBmB,UAAYqB,EAAKmJ,eAAYtD,EAC9H8H,SAAU,GACVjK,MAAO,MACPmK,eAAgB/O,SAASC,WAAa,OAAI8G,EAC1Cb,WAAYhF,EAAKZ,WAAa1B,iBAAiBqI,QAAU,OAAIF,EAC7D/D,QAAS9B,EAAK8N,mBAElB,CACI/C,UAAW,gBACX0C,SAAU,SACVD,QAAS,QACTrE,UAA+B,kBAApBnJ,EAAKkJ,YAAkClJ,EAAKvB,oBAAsBjB,sBAAsBmB,UAAYqB,EAAKmJ,eAAYtD,EAChI8H,SAAU,GACVjK,MAAO,MACPmK,eAAgB/O,SAASC,WAAa,OAAI8G,EAC1Cb,WAAYhF,EAAKZ,WAAa1B,iBAAiBwI,MAAQ,OAAIL,EAC3D/D,QAAS9B,EAAK+N,iBAElB,CACIhD,UAAW,eACX0C,SAAU,SACVD,QAAS,WACTrE,UAA+B,iBAApBnJ,EAAKkJ,YAAiClJ,EAAKvB,oBAAsBjB,sBAAsBmB,UAAYqB,EAAKmJ,eAAYtD,EAC/H/D,QAAS9B,EAAKgO,mBACdtK,MAAO,IACPsB,WAAYhF,EAAKZ,WAAa1B,iBAAiByI,SAAW,OAAIN,EAC9DgI,eAAgB/O,SAASC,WAAa,OAAI8G,GAE9C,CACIkF,UAAW,aACX0C,SAAU,WACVD,QAAS,cACTrE,UAA+B,eAApBnJ,EAAKkJ,YAA+BlJ,EAAKvB,oBAAsBjB,sBAAsBmB,UAAYqB,EAAKmJ,eAAYtD,EAC7HnC,MAAO,IACPmK,eAAgB/O,SAASC,WAAa,OAAI8G,EAC1CoI,aAAc,SAAUrE,EAAWpC,GAC/B,GAAIA,EAAQvH,KAAKQ,WAAY,CACzB,MAAM4H,EAAOqC,OAAOlD,EAAQvH,KAAKQ,YAAYkK,OAAO3K,EAAK4K,YACzDhB,EAAU2B,OAAOlD,EACrB,CACJ,EACAvG,QAAS9B,EAAKkO,sBAElB,CACInD,UAAW,eACX0C,SAAU,SACVD,QAAS,QACTrE,UAA+B,iBAApBnJ,EAAKkJ,YAAiClJ,EAAKvB,oBAAsBjB,sBAAsBmB,UAAYqB,EAAKmJ,eAAYtD,EAC/HnC,MAAO,GACPmK,eAAgB/O,SAASC,WAAa,OAAI8G,EAC1C/D,QAAS9B,EAAKmO,iBAElB,CACIvO,KAAM,UACNkC,SAAShD,SAASC,WAClB2O,qBAAqB,EACrBU,QAAS,CAAC,CACNC,KAAM,mBACN1M,KAAM,YACNmG,SAAU,kBACVhG,QAAS,SAAUqB,GACf,OAAQA,EAAEmL,IAAIrO,KAAKiB,SAASC,QAChC,GACD,CACCkN,KAAM,wBACN1M,KAAM,YACNG,QAAS,SAAUqB,GACf,OAAOA,EAAEmL,IAAIrO,KAAKiB,SAASC,QAC/B,GACD,CACCkN,KAAM,QACN1M,KAAM,SACP,CACC0M,KAAM,OACN1M,KAAM,QACP,CACC0M,KAAM,SACN1M,KAAM,aAIlB4M,YAAa,CACTzM,SAAS,EACT4B,MAAOtC,EAAe,MAAQ,IAC9BoN,YAAa,YACbC,0BAA0B,GAE9BC,UAAW,CACPhF,KAAM,WAEViF,OAAQ,CACJnF,SAAS,GAEboF,QAAS,CACLlF,KAAM,QAEVmF,QAAS,CACLC,eAAe,GAEnBC,YAAa,CACTC,iBAAiB,EACjBpF,UAAW3L,EAAE,gBAAgBgR,QAC7BC,UAAU/L,GACN,MAAMgM,EAAchM,EAAEiE,UAAUgI,iBAChC,IAAI9L,EAAaH,EAAEiE,UAAU1G,gBAAgBkB,QAC7C,MAAMyN,EAAU/L,EAAWgM,WAAWrK,GAASA,EAAK5G,KAAO8Q,EAAYhM,EAAEkM,SAASpP,KAAK5B,KACjFkR,EAAYjM,EAAWgM,WAAWrK,GAASA,EAAK5G,KAAO8E,EAAEyB,SAASvG,KAExEiF,EAAWgK,OAAOiC,EAAW,GAC7BjM,EAAWgK,OAAO+B,EAAS,EAAGlM,EAAEyB,UAEhC,IAAI4K,EAAQ,EACRC,EAAQ,GACZnM,EAAW2D,SAAQ,SAAUqH,GAErBA,EAAIpN,WACJoN,EAAIpN,SAASwO,cAAgBF,EAC7BC,EAAM7M,KAAK,CAAE0J,WAAYgC,EAAIjQ,GAAImR,MAAOA,IAExCA,IAER,IAEArM,EAAEiE,UAAUhB,UAEZtH,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWyE,SAAW,4BACtB,CAAEnM,UAAWuP,GACb,KACA,MACA,EACA,QACA,EACR,GAEJE,iBAAiB,EACjBC,cAAc,EACdC,aAAa,EACbC,YAAa9P,EAAKhB,oBAAsBvB,sBAAsBgF,SAAMoD,EAAY7F,EAAKhB,oBAAsBvB,sBAAsBwB,KAAO,CAAC,UAAW,IAAK,GAAG8C,WAAW1D,QAAU2B,EAAKhB,oBAAsBvB,sBAAsByB,WAAa,CAAC,UAAW,KAAM,GAAG6C,WAAW1D,QAAU,CAAC,WAAY,KAAM,KAC5S0R,WAAY,SAAU5M,GAClB,GAAkB,SAAdA,EAAE6M,SAAsB7M,EAAElD,KAAM,CAChC,GAAIkD,EAAE8M,MAAMC,QAAUjS,EAAEkF,EAAE8M,MAAMC,QAAQC,SAAS,YAE7C,YADArR,SAASsR,oBAAoBjN,EAAElD,KAAKwK,WAAY,6BAIpD,IAAK3L,SAASC,WAAY,CACtB,MAAMsR,EAAYtS,IACZuS,EAAM,YAAYnN,EAAElD,KAAK5B,qBAE3BuO,SAAS/M,SADTwQ,EAAY,EACQ,GAAGC,eAAiBD,IAGpBC,CAE5B,CACJ,CACJ,EACAC,eAAgB,SAAUpN,GACtBlF,EAAE,yBAA0BkF,EAAEqN,SAASC,MAAK,WACxCxS,EAAE+I,MAAM0J,OAAM,SAAUvN,GACpB,MAAMkN,EAAYtS,IACZuS,EAAM,YAAYrS,EAAE+I,MAAM/G,KAAK,eAAehC,EAAE+I,MAAM/G,KAAK,wBAE7D2M,SAAS/M,SADTwQ,EAAY,EACQ,GAAGC,eAAiBD,IAGpBC,CAE5B,GACJ,GACJ,EACAK,eAAgB,SAAUxN,GACtB,IAAIyN,EAASzN,EAAEyN,OACE,UAAbzN,EAAE6M,SAAuBY,GACzBzN,EAAE0N,YAAYpF,GAAG,SAAS,SAAUqF,GAChC,GAAIvS,EAAG8H,uBAAyB9H,EAAGE,sBAAwBjB,sBAAsBmB,UAC7E,OAGJJ,EAAG4K,UAAU,MACb5K,EAAG2K,WAAW,IAEd,IAAIC,EAAahG,EAAEyN,OAAOzH,UAA4C,SAAvBhG,EAAEyN,OAAOzH,UAAuB,WAAQtD,EAAjD,OACtC1C,EAAEiE,UAAU2J,cACZ5N,EAAEiE,UAAU4J,eACM,OAAd7H,IACAhG,EAAEiE,UAAUpB,aAAa4K,EAAO7F,UAAW,YAAa5B,GAExD5K,EAAG4K,UAAUA,GACb5K,EAAG2K,WAAW0H,EAAO7F,YAEzB5H,EAAEiE,UAAU6J,YAEZC,GACJ,GAER,EACAC,uBAAwB,SAAUhO,GACb,YAAbA,EAAE+M,SACG/M,EAAEvB,QACHuB,EAAEvB,MAAQ,IAGduB,EAAEvB,MAAMgB,KAAK,CACTzD,KAAM,aACNkF,YAAa,WACTlB,EAAEiE,UAAUgK,WAChB,IAEJjO,EAAEvB,MAAMgB,KAAK,CACTzD,KAAM,eACNkF,YAAa,WACTlB,EAAEiE,UAAUiK,aAChB,IAGZ,EACAC,gBAAiB,SAAUnO,GACnBA,EAAEoO,UAAYpO,EAAEoO,SAASC,MAAM,4BAI/BN,GAER,EAEAO,QAAS,CACL7P,MAAO,CAAC,CACJC,KAAM,iBACNhC,SAAU,SACV0H,OAAQ,WACRC,QAAS,CACL7F,KAAM,WACN0M,KAAM,eACN3G,QAAQvE,GACJ,MAAMuO,EAA2C,WAA/BvO,EAAEiE,UAAU9B,OAAO,QACrCrH,EAAE,qBAAqB8G,WAAW,YAAYO,OAAO,yBAA0BoM,GAC/EvO,EAAEiE,UAAU2J,cACZ5N,EAAEiE,UAAU9B,OAAO,OAAQoM,EAAY,WAAa,UACpDvO,EAAEiE,UAAU9B,OAAO,OAAQoM,EAAY,eAAiB,cACxDvO,EAAEiE,UAAU6J,WAChB,EACAnP,QAAS9B,EAAKZ,WAAa1B,iBAAiB2B,OAEjD,CACCwC,KAAM,iBACNhC,SAAU,SACV0H,OAAQ,WACRC,QAAS,CACL7F,KAAM,cACN0M,KAAM,mBACNvK,YAAa,CACTC,MAAO/D,EAAKqG,oBAAsB,oBAAsB,IAE5DqB,QAAQvE,GACJ5E,EAAG8H,qBAAqB9H,EAAG8H,uBACvB9H,EAAG8H,sBACHlD,EAAEqN,QAAQ7K,SAAS,qBAGnBxC,EAAEqN,QAAQ/K,YAAY,qBAG1BtC,EAAEqN,QAAQ/K,YAAY,mBAC1B,EACA3D,QAAS9B,EAAKvB,oBAAsBjB,sBAAsBmB,YAE/D,CACCkD,KAAM,oBACNhC,SAAU,SACV0H,OAAQ,WACRC,QAAS,CACL7F,KAAM,SACN0M,KAAM,sBACN3G,QAAQvE,GACJ5E,EAAG0H,mBAAmB1H,EAAG0H,qBACrB1H,EAAG0H,oBACH9C,EAAEqN,QAAQ7K,SAAS,qBAGnBxC,EAAEqN,QAAQ/K,YAAY,qBAG1BtC,EAAEqN,QAAQ/K,YAAY,mBAC1B,EACA3D,QAAS9B,EAAKvB,oBAAsBjB,sBAAsBmB,YAE/D,cAAe,0BAI9BJ,EAAG6K,iBAAiB9F,WAAa5C,IAEjC,IAAIwQ,EAAwB,WACxB,IAAIpG,EAAU7M,EAAE,qBAAqB8G,WAAW,YAAY4M,oBAC5D7S,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWgK,KAAO,wBAClB,CACIjP,SAAUpE,EAAGoE,WACb3D,kBAAmBT,EAAGS,oBACtB6S,iBAAkBtT,EAAGa,WACrBX,kBAAmBF,EAAGE,oBACtByK,WAAY3K,EAAG2K,aACfC,UAAW5K,EAAG4K,YACd9C,oBAAqB9H,EAAG8H,sBACxByH,oBAAmBhD,EAAQpI,MAAKzB,GAAKA,EAAE8J,YAAcpC,IACrDoF,kBAAiBjD,EAAQpI,MAAKzB,GAAKA,EAAE8J,YAAcnC,IACnDoF,qBAAoBlD,EAAQpI,MAAKzB,GAAKA,EAAE8J,YAAclC,IACtDqF,uBAAsBpD,EAAQpI,MAAKzB,GAAKA,EAAE8J,YAAcjC,IACxDqF,kBAAiBrD,EAAQpI,MAAKzB,GAAKA,EAAE8J,YAAchC,UAEvDlD,OACAA,GACA,EACA,QACA,EACR,EACAtH,EAAGoE,SAASmP,UAAUZ,GACtB3S,EAAGS,kBAAkB8S,UAAUZ,GAC/B3S,EAAGa,SAAS0S,UAAUZ,GACtB5S,EAAgBC,GAEhB,IAAIwT,EAAsC,WACtCb,IAEA,IAAIc,EAAW/T,EAAE,qBAAqB8G,WAAW,YACjDiN,EAASjB,cACTiB,EAAS1M,OAAO,8BAA+B/G,EAAGE,sBAAwBjB,sBAAsBmB,WAAaJ,EAAG0H,qBAEhH+L,EAAShB,eACLzS,EAAGE,sBAAwBjB,sBAAsBmB,WAAaJ,EAAG8H,sBACjE2L,EAAShM,aAAa,yBAA0B,YAAa,OAG7DgM,EAAShM,aAAazH,EAAG2K,aAAc,YAAa3K,EAAG4K,aAG3D6I,EAASf,WACb,EAEA1S,EAAGE,kBAAkBqT,UAAUC,GAC/BxT,EAAG8H,oBAAoByL,UAAUC,GACjCxT,EAAG0H,kBAAkB6L,UAAUC,GAE/B/I,GAAGiJ,cAAc1T,EAAIN,EAAE,gBAAgBiU,IAAI,IAEvCpT,SAASC,YACTd,EAAE,6BAA6BuN,IAAI,oBAAoBC,GAAG,oBAAoB,WAC1E,IAAI0G,EAAoBlU,EAAE,iBAAkBA,EAAE+I,OAC1CoL,EAAoBnU,EAAE+I,MAAMqL,SAASH,IAAI,GAAGI,wBAC5CC,EAAMH,EAAkBI,OAC5BD,GAAQJ,EAAkBM,cAAgBxU,EAAE+I,MAAMqL,SAASI,cAE3DN,EAAkBxF,IAAI,CAAEd,SAAY,QAAS6G,KAAYN,EAAkBM,KAAOzU,EAAE+I,MAAMqL,SAAS3O,QAAUyO,EAAkBzO,QAAW,GAArF,KAA6F6O,IAAO,OAC7J,GAER,EAuDII,aAtDe,SAAUxP,GACrBA,GACAA,EAAEyP,iBAEN,IAAIC,EAAY5U,EAAE,0BACd6U,EAAgBD,EAAU,GAAWnG,MACrCqG,EAAuB9U,EAAE,iCAAiC,GAAWyO,MACrEsG,EAAmB/U,EAAE,8BAA8B,GACnDgV,EAAqBD,EAAiBtG,MACtCwG,EAAuBF,EAAiBxL,QAAQwL,EAAiBG,eAAehU,KAEhFiU,EAAY,CACZvR,KAAMiR,EACNzU,GAAIiB,EAAWW,KAAK5B,GACpB6M,YAAa6H,EACbjG,WAAYmG,EACZ5H,aAAc6H,GAuBd5C,EAAM1I,WAAWyE,SAAW,eAUhC,OATAvN,SAASsN,iBAAiBjJ,EACtBmN,EACA8C,GAvBmB,SAAUnT,GAE7B,GADA4S,EAAUQ,IAAIpT,EAAK4B,MACf5B,EAAKqT,aAAc,CACnB,MAAMtB,EAAW/T,EAAE,qBAAqB8G,WAAW,YACnDzF,EAAWW,KAAK4B,KAAO5B,EAAK4B,KAC5BvC,EAAWW,KAAKiL,YAAcjL,EAAKiL,YACnC5L,EAAWW,KAAK6M,WAAa7M,EAAK6M,WAClCxN,EAAWW,KAAKoL,aAAepL,EAAKoL,aAEpC2G,EAAS5L,SAAQ,GAEhBnI,EAAE,yBAAiC+O,MAAM,OAC9C,MAEI6F,EAAUU,QACVV,EAAUlG,IAAI,eAAgB,aAC9B7N,SAASyO,YAAY,+CAE7B,GAOI,MACA,EACA,QACA,IAEG,CACX,EAKIiG,sBA/pCwB,SAAUC,EAAqBC,EAAiBC,GACxE,IAAIC,EAA0C,UAAxBH,EAClBI,EAAkC,UAApBH,EAClB5U,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWyE,SAAW,6BACtB,CAAEoH,oBAAqBG,EAAiBF,gBAAiBG,EAAaF,OAAQA,IAC9E,WAAc,IACd,WAAc,IACd,EACA,OACR,EAupCH,CA3qCU,GGnBPG,eAAkB,WAClB,IAAIC,cAAgB,QAChBC,oBAEJ,IAAIC,gBAAkB,WAClB,OAAOhW,EAAE,sBACb,EAEIiW,QAEAC,iBAAmB,SAAUC,GAC7B,IAAIC,EAAS,CACTC,SAAS,EACTC,eAAgB,IAIpB,GAAIH,EAASnK,eAAiBuK,kBAAkBC,MAAO,CACnD,GAAIL,EAASM,cAAcxW,OAAS,EAAG,CACnC,IAAIyW,GAAe,EACfC,GAAa,EACjBR,EAASM,cAAczN,SAAQ,SAAUuJ,IACZ,IAArBA,EAAQqE,WACRF,GAAe,GAEfnE,EAAQsE,gBAAkBtE,EAAQsE,iBAAmBC,yBAAyBC,WAC9EJ,GAAa,EACrB,IACKD,GAIKC,GAAcR,EAASa,oBAC7BZ,EAAOE,eAAiB,6EACxBF,EAAOC,SAAU,IALjBD,EAAOE,eAAiB,mDACxBF,EAAOC,SAAU,EAMzB,MAEID,EAAOE,eAAiB,2CACxBF,EAAOC,SAAU,EAIjBD,EAAOC,SAAWF,EAASnK,eAAiBuK,kBAAkBU,QACtB,IAApCd,EAASe,gBAAgBjX,QACzBmW,EAAOE,eAAiB,0CACxBF,EAAOC,SAAU,IAGjBM,GAAa,EACbR,EAASe,gBAAgBlO,SAAQ,SAAUuJ,GACnCA,EAAQsE,gBAAkBtE,EAAQsE,iBAAmBC,yBAAyBC,WAC9EJ,GAAa,EACrB,IACKA,IACDP,EAAOE,eAAiB,kGACxBF,EAAOC,SAAU,IAIrBD,EAAOC,SAAgD,IAArCF,EAASgB,iBAAiBlX,SAC5CmW,EAAOE,eAAiB,mCACxBF,EAAOC,SAAU,GAG7B,KAEK,CACD,GAAsC,IAAlCF,EAASM,cAAcxW,QAAqD,IAArCkW,EAASgB,iBAAiBlX,OAGjE,OAFAmW,EAAOE,eAAiB,4CACxBF,EAAOC,SAAU,EACVD,EAQX,GALAO,GAAa,EACbR,EAASM,cAAczN,SAAQ,SAAUuJ,GACjCA,EAAQsE,gBAAkBtE,EAAQsE,iBAAmBC,yBAAyBC,WAC9EJ,GAAa,EACrB,KACKA,GAAcR,EAASa,kBAGxB,OAFAZ,EAAOE,eAAiB,qFACxBF,EAAOC,SAAU,EACVD,EAGPD,EAASiB,cAAgBC,UAAUC,QAAUnB,EAASgB,iBAAiBlX,OAAS,QAA0F2H,IAArFuO,EAASgB,iBAAiB1S,MAAK,SAAUzB,GAAK,OAAOA,EAAE5C,OAAS0V,aAAc,MACnKM,EAAOE,eAAiB,yDACxBF,EAAOC,SAAU,GAGjBF,EAASiB,cAAgBC,UAAUE,SAAWpB,EAASgB,iBAAiBlX,OAAS,QAA0F2H,IAArFuO,EAASgB,iBAAiB1S,MAAK,SAAUzB,GAAK,OAAOA,EAAE5C,OAAS0V,aAAc,MACpKM,EAAOE,eAAiB,0DACxBF,EAAOC,SAAU,EAEzB,CAEA,GAAID,EAAOC,QAAS,CAChB,IAAImB,EAAO3W,SAAS4W,QAAQtB,EAASM,cAAc1T,QAAO,SAAUC,GAAK,OAAQA,EAAE4T,QAAU,IAAI,WAAW,GACxGc,EAAS7W,SAAS4W,QAAQtB,EAASe,gBAAgBnU,QAAO,SAAUC,GAAK,OAAQA,EAAE4T,QAAU,IAAI,WAAW,GAEhH,IAAIe,EAAoB,SAAUC,EAAOC,EAAQC,GAC7C,IAAK,MAAMC,KAAYH,EACnB,GAA4E,IAAxEA,EAAMG,GAAUhV,QAAO,SAAUC,GAAK,OAAOA,EAAEa,SAAW,IAAG5D,OAAc,CAC3EmW,EAAOC,SAAU,EACjBD,EAAOE,eAAiB,GAAGuB,mEAAyEC,EAAmB,iBAAmB,MAC1I,KACJ,CAER,EAEAH,EAAkBH,EAAMrB,EAASnK,eAAiBuK,kBAAkBU,MAAQ,QAAUd,EAASnK,eAAiBuK,kBAAkBC,MAAQ,WAAa,WAAYL,EAASnK,eAAiBuK,kBAAkBU,OAC/MU,EAAkBD,EAAQvB,EAASnK,eAAiBuK,kBAAkBU,MAAQ,WAAa,UAAWd,EAASnK,eAAiBuK,kBAAkBC,MACtJ,CAEA,IAAKJ,EAAOC,QACR,OAAOD,EAEX,GAAID,EAASe,gBAAgBjX,OAAS,IAClC0W,GAAa,EACbR,EAASe,gBAAgBlO,SAAQ,SAAUuJ,GACnCA,EAAQsE,gBAAkBtE,EAAQsE,iBAAmBC,yBAAyBC,WAC9EJ,GAAa,EACrB,KACKA,GAGD,OAFAP,EAAOE,eAAiB,8EAA8EhW,GAAG0X,sBACzG5B,EAAOC,SAAU,EACVD,EAYf,GARAA,EAAOC,QAAU4B,iBAGb7B,EAAOC,UAAYF,EAASa,mBAAqBb,EAAS+B,oBAAoBjY,OAAS,IACvFmW,EAAOC,SAAU,EACjBD,EAAOE,eAAiB,2EAGxBF,EAAOC,SAAWF,EAAS+B,oBAAoBjY,OAAS,IACpDkW,EAAS+B,oBAAoBnV,QAAO,SAAUC,GAAK,OAAQA,EAAEY,MAAQ,IAAG3D,OAAS,IACjFmW,EAAOC,SAAU,EACjBD,EAAOE,eAAiB,2CAGxBF,EAAOC,SAAS,CAChB,IAAIqB,EAAS7W,SAAS4W,QAAQtB,EAAS+B,oBAAqB,QAAQ,GACpE,IAAK,MAAMH,KAAYL,EACnB,GAAIA,EAAOK,GAAU9X,OAAS,EAAG,CAC7BmW,EAAOC,SAAU,EACjBD,EAAOE,eAAiB,qCACxB,KACJ,CAER,CAGJ,OAAOF,CACX,EAEI6B,eAAiB,WACjB,IAAI7B,GAAS,EAOb,OANK+B,oBAAoB7X,GAAG6V,SAASM,YAAanW,GAAG6V,SAASe,iBAC1Dd,GAAS,GACR+B,oBAAoB7X,GAAG6V,SAASe,cAAe5W,GAAG6V,SAASM,eAC5DL,GAAS,GACR+B,oBAAoB7X,GAAG6V,SAASgB,kBACjCf,GAAS,GACNA,CACX,EAEI+B,oBAAsB,SAAUC,EAAuCC,EAA6C,MAEpH,IAAIjC,GAAS,EAEb,IAAK,IAAIkC,EAAI,EAAGA,EAAIF,IAAUnY,OAAQqY,IAAK,CACvC,IAAIC,EAAQH,IAAUE,GACtBC,EAAMlC,SAAQ,GACdkC,EAAMjC,eAAe,GACzB,CAEA,IAAK,IAAIgC,EAAI,EAAGA,EAAIF,IAAUnY,OAAQqY,IAAK,CACvC,IAAIC,EAAQH,IAAUE,GACtB,IAAIE,GAAa,EACjB,GAAID,EAAMlC,UAAW,CACjB,IAAK,IAAIoC,EAAIH,EAAI,EAAGG,EAAIL,IAAUnY,OAAQwY,IAAK,CAC3C,IAAIC,EAAYN,IAAUK,GACtBC,EAAUC,cAAgBJ,EAAMI,cAChCH,GAAa,EACbE,EAAUrC,SAAQ,GAClBqC,EAAUpC,eAAe,qBAEjC,CACA,IAAKkC,GAAcH,EACEA,IAAe5T,MAAKzB,GAAKA,EAAE2V,cAAgBJ,EAAMI,gBAE9DH,GAAa,EAEzB,CAgBA,GAfKlY,GAAGsY,wBACJL,EAAMM,eAAeC,oBAAoBP,KAEzCC,IAAelY,GAAGsY,wBAA0BL,EAAMM,oBAClDN,EAAMlC,SAAQ,GACdkC,EAAMjC,eAAeiC,EAAMjC,iBAAmB,qBAC9CF,GAAS,GAGRmC,EAAMQ,eAAkBR,EAAMQ,cAAcC,SAC7CT,EAAMlC,SAAQ,GACdkC,EAAMjC,eAAeiC,EAAMjC,iBAAmB,kCAC9CF,GAAS,GAGTmC,EAAMU,eAAgB,CACtB,IAAIC,EAAeC,gBAAgBZ,EAAMa,aAAcb,EAAMc,gBAAiBd,EAAM1B,gBAAgB,GAChGqC,IACAX,EAAMlC,SAAQ,GACdkC,EAAMjC,eAAeiC,EAAMjC,iBAAmB,IAAM4C,GACpD9C,GAAS,EAEjB,CACJ,CAEA,OAAOA,CACX,EAEI0C,oBAAsB,SAAUP,GAChC,IAAIe,GAAY,EAehB,OAdIhZ,GAAG6V,SAASM,cAAchS,MAAKzB,GAAKA,EAAE+V,gBAAkBR,EAAMQ,eAAiB/V,IAAMuV,IACpFvV,EAAE4T,UAAY2B,EAAM3B,UAAY5T,EAAEuW,YAAchB,EAAMgB,YAAgBvW,EAAE4T,UAAY2B,EAAM3B,cAC3F0C,GAAY,IAGXA,GAAahZ,GAAG6V,SAASe,gBAAgBzS,MAAKzB,GAAKA,EAAE+V,gBAAkBR,EAAMQ,eAAiB/V,IAAMuV,MACrGe,GAAY,IAGXA,GAAahZ,GAAG6V,SAASgB,iBAAiB1S,MAAKzB,GAAKA,EAAE+V,gBAAkBR,EAAMQ,eAAiB/V,IAAMuV,IACrGvV,EAAE4T,UAAY2B,EAAM3B,UAAY5T,EAAEuW,YAAchB,EAAMgB,YAAgBvW,EAAE4T,UAAY2B,EAAM3B,cAC3F0C,GAAY,GAGTA,CACX,EAEIE,iBAAmB,SAAUlZ,GAC7BmZ,8BAA8BnZ,EAAG6V,SAASM,aAC1CgD,8BAA8BnZ,EAAG6V,SAASe,eAC1CuC,8BAA8BnZ,EAAG6V,SAASgB,gBAC1C,IAAK,IAAImB,EAAI,EAAGA,EAAIhY,EAAGoZ,OAAOC,SAAS1Z,OAAQqY,IAC3CmB,8BAA8BnZ,EAAGoZ,OAAOC,SAASrB,GAAGsB,QAExDH,8BAA8BnZ,EAAGoZ,OAAOG,SAExC,IAAK,IAAIvB,EAAI,EAAGA,EAAIhY,EAAG6V,SAAS+B,oBAAoBjY,OAAQqY,IAAK,CAC7D,IAAIwB,EAAmBxZ,EAAG6V,SAAS+B,oBAAoBI,GACvDyB,oCAAoCD,EAAkBxZ,EAC1D,CACJ,EAEImZ,8BAAgC,SAAUO,GAC1C,IAAK,IAAI1B,EAAI,EAAGA,EAAI0B,IAAe/Z,OAAQqY,IAAK,CAC5C,IAAIC,EAAQyB,IAAe1B,GAC3B2B,yBAAyB1B,EAC7B,CACJ,EAEI0B,yBAA2B,SAAU1B,QACR3Q,IAAzB2Q,EAAM2B,iBACN3B,EAAM2B,eAAiBnP,GAAGC,WAAWmP,2BAA2B/Y,YACnCwG,IAA7B2Q,EAAM6B,qBACN7B,EAAM6B,mBAAqBrP,GAAGC,WAAW,KAE7CuN,EAAM8B,SAAWtP,GAAGuP,UAAS,WACzB,GAAIvR,KAAK6N,SAAU,CAEf,GAAI7N,KAAKmR,kBAAoBC,2BAA2B/Y,KACpD,OAAK2H,KAAKkQ,eAGC,UAFA,OAKX,IAAIlW,EAASzC,GAAG6V,SAAS+B,oBAAoBzT,MAAKzB,GAAKA,EAAE5C,OAAS2I,KAAKqR,uBACvE,OAAKrX,EAGMA,EAAOwX,QAFP,MAOnB,CAEI,OAAOxR,KAAK8N,iBAAmBC,yBAAyBC,SAAW,UAAY,SAEvF,GAAGwB,GAEHA,EAAMlC,QAAUtL,GAAGC,YAAW,GAC9BuN,EAAMM,eAAiB9N,GAAGC,YAAW,GACrCuN,EAAMjC,eAAiBvL,GAAGC,WAAW,IAErC,IAAIwP,EAAqB,SAAUjB,EAAUkB,EAAcP,EAAgBE,GAEvE,MAAO,IAAIb,MAAakB,MADDC,oBAAoBR,OACmBE,QAAAA,EAAsB,IACxF,EAEA7B,EAAMI,UAAY5N,GAAGuP,UAAS,WAC1B,GAAIvR,KAAK6N,UAAY7N,KAAK3I,OAAS0V,cAC/B,OAAO0E,EAAmBzR,KAAKwQ,WAAYxQ,KAAK0R,eAAgB1R,KAAKmR,iBAAkBnR,KAAKqR,sBAG5F,IAAIhE,EAAS,GAAGrN,KAAK4R,uBAAuB5R,KAAK6R,cACjD,OAAI7R,KAAK3I,OAAS0V,gBAOlBM,EAAS,GAAGA,MAAWrN,KAAK8N,iBACxB9N,KAAK8R,iBAAmBC,oBAAoB1Z,OAC5CgV,EAAS,GAAGA,MAAWrN,KAAK8R,kBAE5B9R,KAAK6N,UACD7N,KAAKmR,mBAAqBC,2BAA2B/Y,OACrDgV,EAAS,GAAGA,MAAWrN,KAAKmR,mBAAmBnR,KAAKqR,wBAGxDrR,KAAK0R,iBAAmBM,iBAAiBC,SACzC5E,EAAS,GAAGA,OAAYrN,KAAK0R,mBAhBtBrE,CAoBnB,GAAGmC,GACHA,EAAMI,UAAUsC,kBAAiB,SAAUC,EAAUC,GAC7CD,IAAaC,GAAa7a,GAAG8a,kBAC7BnD,gBACR,IAEAM,EAAM8C,gBAAkBtQ,GAAGuP,UAAS,WAChC,OAAIvR,KAAK6N,UAAY7N,KAAK3I,OAAS0V,cACxB0E,EAAmBzR,KAAKwQ,WAAYxQ,KAAK0R,eAAgBN,2BAA2B/Y,KAAM,IAG9F2H,KAAK4P,WAChB,GAAGJ,GACHA,EAAM1B,aAAaoE,kBAAiB,SAAUC,EAAUC,GACpD,GAAID,IAAaC,IAAa7a,GAAG8a,iBAC7B,GAAI7C,EAAMU,eACFiC,IAAapE,yBAAyBwE,MACtC/C,EAAMc,cAAc,IAExBpB,sBAIA,GAAIM,EAAM5W,SAAW4Z,qBAAqBC,MAAQjD,EAAMsC,iBAAmBC,oBAAoB1Z,MAAQmX,EAAM1B,iBAAmBC,yBAAyBC,SAAU,CAC/J,IAAI8D,EAAeva,GAAGmb,oBAAoBhX,MAAKzB,GAAKA,EAAEyL,QAAU8J,EAAMsC,iBAAgB3Z,KAClF2V,EAAevW,GAAGob,iBAAiBjX,MAAKzB,GAAKA,EAAEyL,QAAU8J,EAAM1B,iBAAgB3V,KACnFL,SAASyO,YAAY,eAAeuL,oBAA+BhE,oCAAgD,QAAS,GAAI7W,EAAE,qBAGlI2b,YAAW,WACPpD,EAAM1B,aAAaC,yBAAyBC,SAChD,GAAG,IAEP,CAGZ,IACAwB,EAAM7L,OAAOmH,WAAU,SAAUqH,GACzB5a,GAAG8a,mBAGHF,IAAaU,gBAAgBC,SAC7BtD,EAAMuD,iBAAgB,GAEjBZ,IAAaU,gBAAgBG,SAClCxD,EAAMuD,iBAAgB,GAGtBZ,GAAYU,gBAAgBC,UAAYX,GAAYU,gBAAgBI,WACpEzD,EAAM0D,cAAc,GAGpB1D,EAAM0D,cAAc,GAE5B,IACA1D,EAAMkC,aAAaQ,kBAAiB,SAAUC,EAAUC,GACpD,MAAMV,EAAeva,SAASgb,EAAU,IAQxC,IAPmD,IAA/CnF,oBAAoB9M,QAAQwR,GAC5BlC,EAAM7L,OAAOkP,gBAAgBI,YAExBzD,EAAM2B,mBAAqBC,2BAA2B/Y,MAASqZ,IAAiBM,iBAAiBmB,gBAAkBzB,IAAiBM,iBAAiBoB,aAAgB5D,EAAM7L,WAAakP,gBAAgBI,YAC7MzD,EAAM7L,OAAOkP,gBAAgBC,UAG7BtD,EAAMnY,OAAS0V,eAAiByC,EAAM3B,UAAY2B,EAAM2B,mBAAqBC,2BAA2B/Y,KACxG,GAAIqZ,EAAeM,iBAAiBmB,gBAAmBzB,GAAgBM,iBAAiBoB,aAAe7b,GAAG6V,SAASnK,eAAiBuK,kBAAkBC,MAClJlW,GAAG8b,cAAcC,QAAO,SAAUrZ,GAC9B,OAAOA,EAAE4T,UAAY5T,EAAE5C,OAAS0V,eAAiB9S,EAAEqY,oBAAsB9C,EAAM8C,mBAAqBrY,EAAEkX,mBAAqBC,2BAA2B/Y,MAAQ4B,EAAEyX,gBAAkBU,CACtL,QAEC,CACD,IAAItB,EAAUvZ,GAAG8b,aAAH9b,GACd,GAAIuZ,EAAQ9W,QAAOC,GAAKA,EAAE4T,UAAY5T,EAAE2V,aAAe3V,EAAE2V,cAAa1Y,OAAS,EAC3E,OAGJ4Z,EAAQ9W,QAAO,SAAUC,GACrB,OAAOA,EAAE4T,UAAY5T,EAAE5C,OAAS0V,eAAiB9S,EAAEqY,oBAAsB9C,EAAM8C,mBAAqBrY,EAAEkX,mBAAqBC,2BAA2B/Y,MAAQ4B,EAAEyX,gBAAkBU,CAAU,IAC3LnS,SAAQ,SAAUhG,GACfA,EAAEyX,aAAalC,EAAMkC,gBACjBzX,EAAEkX,mBAAqBC,2BAA2BmC,qBAAwB7B,IAAiBM,iBAAiBmB,gBAAkBzB,IAAiBM,iBAAiBoB,aAAgBnZ,EAAE0J,WAAakP,gBAAgBI,YAC/MhZ,EAAE0J,OAAOkP,gBAAgBC,SAEjC,GACR,CAER,GAAGtD,GACHA,EAAMgE,WAAaxR,GAAGuP,UAAS,WAC3B,OAAIvR,KAAKyT,UAAY,GAAKlc,GAAG6V,SAASnK,eAAiBuK,kBAAkBC,OAIrElW,GAAG6V,SAASnK,eAAiBuK,kBAAkBkG,UAAYnc,GAAG6V,SAASM,cAAc1T,OAAO,SAAUC,GAAK,OAAQA,EAAE4T,UAAY5T,EAAE2V,cAAgB5P,KAAK4P,WAAa,EAAE+D,KAAK3T,OAAO9I,OAAS,EAHrL,MAOA,GAAK8I,KAAKyT,UAAd,IACX,GAAGjE,GACHA,EAAM9S,MAAQsF,GAAGuP,UAAS,WACtB,OAAIvR,KAAKyT,WAAa,GAAKlc,GAAG6V,SAASnK,eAAiBuK,kBAAkBC,OAItElW,GAAG6V,SAASnK,eAAiBuK,kBAAkBkG,UAAYnc,GAAG6V,SAASM,cAAc1T,OAAO,SAAUC,GAAK,OAAQA,EAAE4T,UAAY5T,EAAE2V,cAAgB5P,KAAK4P,WAAa,EAAE+D,KAAK3T,OAAO9I,OAAS,EAHrL,GAOJ,eAAgB,GAAK8I,KAAKyT,cACrC,GAAGjE,GAEHA,EAAMoE,sBAAwB5R,GAAGuP,UAAS,WACtC,IAAIsC,GAAc,EACdC,EAAW,GAaf,OAZIvc,GAAG6V,SAASe,gBAAgBnU,OAAO,SAAUC,GAAK,OAAOA,EAAE2V,cAAgB5P,KAAK4P,WAAa,EAAE+D,KAAK3T,OAAO9I,OAAS,EACpH4c,EAAWvc,GAAG6V,SAASe,gBAElB5W,GAAG6V,SAASM,cAAc1T,OAAO,SAAUC,GAAK,OAAOA,EAAE2V,cAAgB5P,KAAK4P,WAAa,EAAE+D,KAAK3T,OAAO9I,OAAS,IACvH4c,EAAWvc,GAAG6V,SAASM,eAG3BoG,EAAS7T,QAAQ,SAAU8T,GACnBA,GAAK/T,OACL6T,EAAaG,KAAKC,IAAIJ,EAAYE,EAAEN,WAC5C,EAAEE,KAAK3T,OAEAA,KAAKyT,UAAYI,EAAa,CAEzC,GAAGrE,GACHA,EAAM0E,sBAAwBlS,GAAGuP,UAAS,WACtC,OAAOvR,KAAKyT,UAAY,CAC5B,GAAGjE,GACHA,EAAM2E,cAAgBnS,GAAGuP,UAAS,WAC9B,IAAIG,EAAeva,SAASqY,EAAMkC,eAAgB,IAClD,OAAmD,IAA/C1E,oBAAoB9M,QAAQwR,GACrB,CAAC,CAAEhM,MAAOmN,gBAAgBI,WAAY9a,KAAM,eAE9CqX,EAAM2B,mBAAqBC,2BAA2B/Y,MAASqZ,IAAiBM,iBAAiBmB,gBAAkBzB,IAAiBM,iBAAiBoB,YAOvJ,CACH,CAAE1N,MAAOmN,gBAAgBG,QAAS7a,KAAM,WACxC,CAAEuN,MAAOmN,gBAAgBC,SAAU3a,KAAM,YACzC,CAAEuN,MAAOmN,gBAAgBI,WAAY9a,KAAM,eATpC,CACH,CAAEuN,MAAOmN,gBAAgBG,QAAS7a,KAAM,WACxC,CAAEuN,MAAOmN,gBAAgBC,SAAU3a,KAAM,YASrD,GAAGqX,EACP,EAEI4E,uBAAyB,SAAUC,EAASC,EAAQC,GACpDtd,EAAE,oBAAoBod,MAAaE,GAAyB9K,MAAK,SAAU+K,EAAKhL,GACxE8K,GACArd,EAAE+I,MAAMrB,SAAS,UACjB1H,EAAE+I,MAAMrB,SAAS,cAGjB1H,EAAE+I,MAAMvB,YAAY,UACpBxH,EAAE+I,MAAMvB,YAAY,YAE5B,GACJ,EAEIuS,oCAAsC,SAAUD,EAAkBxZ,GAClE,IAAIkd,EAAoB,SAAUtC,EAAUC,GACpCA,GACkB7a,EAAG8b,aACrBA,GAAcrZ,QAAOC,GAAKA,EAAE4T,UAAY5T,EAAEkX,mBAAqBC,2BAA2B/Y,MAAQ4B,EAAEoX,sBAAwBN,EAAiB1Z,OAAM4I,SAAQ,SAAUuP,GACjKA,EAAMQ,YAAYR,EAAMQ,cAAc0E,QAAQ,GAAGtC,IAAY,GAAGD,KACpE,GAER,EACApB,EAAiBlW,KAAKqX,kBAAiB,SAAUC,EAAUC,GACvD,IAAKD,EAGD,OAFApB,EAAiBlW,KAAKuX,EAASuC,OAAO,EAAG,SACzCF,EAAkBrC,EAASuC,OAAO,EAAG,GAAIvC,GAI7CqC,EAAkBtC,EAAUC,EAChC,GAAGrB,GAEHA,EAAiB6D,WAAW1C,kBAAiB,SAAUC,EAAUC,GAC7DrB,EAAiB8D,UAAU9D,EAAiB8D,aAC3B,WAAb1C,IACApB,EAAiB+D,cAAc,IAC/B/D,EAAiBgE,UAAU,MAEnC,GAAGhE,GACHA,EAAiBiE,mBAAqBhT,GAAGuP,UAAS,WAC9C,MAAyC,WAAlCR,EAAiB6D,YAC5B,IAEA7D,EAAiBkE,UAAUhV,SAAQ,SAAUiV,GAEzC,IAAIlb,EAAS,IAAImb,OACjB9b,OAAOC,OAAOU,EAAQkb,EAASlb,QAC/BA,EAAOob,mBAAqBpT,GAAGC,YAAW,GAC1CiT,EAASlb,OAASA,EAClBkb,EAASG,aAAe,WACpB,IAAI7L,EAAUvS,EAAE,6BAA6B8Z,EAAiB1Z,SAC9D+c,uBAAuBpU,KAAKhG,OAAOsb,cAAc,EAAO9L,GACxDuH,EAAiBkE,QAAQ3B,OAAOtT,KACpC,CACJ,IACA+Q,EAAiBwE,sBAAwBvT,GAAGuP,UAAS,WACjD,IAAI/Q,EAAU,CAAC,CAAEkF,MAAO,GAAIvN,KAAM,MAMlC,OALAZ,EAAG6V,SAAS+B,oBAAoBlP,QAAQ,SAAUuV,GAC1CA,EAAKne,OAAS2I,KAAK3I,MACnBmJ,EAAQ5E,KAAK,CAAE8J,MAAO8P,EAAKne,KAAMc,KAAMqd,EAAK3a,QAEpD,EAAE8Y,KAAK3T,OACAQ,CACX,GAAGuQ,GAEHA,EAAiB0E,SAAWzT,GAAGC,aAC/B8O,EAAiB0E,SAAS3K,WAAU,WAC5BiG,EAAiB0E,WACjB7C,YAAW,WACP3b,EAAE,WAAWye,MACjB,GAAG,KAGHze,EAAE,WAAW0I,MAErB,IAEAoR,EAAiB+D,cAAgB9S,GAAGC,WAAW,IAC3C8O,EAAiBgE,aAAehE,EAAiBgE,YAAc,GAC/DhE,EAAiB+D,cAAca,kBAAkBC,aAAa7E,EAAiBgE,cAEnFhE,EAAiB8E,oBAAsB,CACnCnQ,MAAOqL,EAAiB+D,cACxBpY,MAAO,IACPoZ,UAAU,EACVva,SAAUwV,EAAiBiE,oBAE/BjE,EAAiBgF,0BAA4B,CACzCpb,KAAM,uBACN0M,KAAM,wBACN9L,SAAUwV,EAAiBiE,mBAC3BtU,QAAS,SAAUvE,GACfwZ,kBAAkBK,uBAAsB,SAAU/X,GAC9C8S,EAAiB+D,cAAc7W,EAAK+R,aACpCe,EAAiBgE,UAAU9W,EAAKoW,QACpC,IACAsB,kBAAkBM,sBAAsB,sBAAuBhf,EAAEkF,EAAEqN,SAAS0M,SAAS,eACzF,GAGJnF,EAAiBoF,yBAA2B,CACxCxb,KAAM,iBACN0M,KAAM,wBACN9L,SAAUwV,EAAiBiE,mBAC3BtU,QAAS,SAAUvE,GACf4U,EAAiB+D,cAAc,IAC/B/D,EAAiBgE,UAAU,KAC/B,EAER,EAEIqB,uBAAyB,qGACzBC,4BAA8B,oBAE9BjG,gBAAkB,SAAUC,WAAoBC,cAAuBxC,aAAwCwI,aAAuB,GACtI,IAAInG,aAAe,GAgBnB,GAdIrC,eAAiBC,yBAAyBwE,KACrClC,aACDF,aAAe,oBAIdE,WAGKC,gBACNH,aAAe,2BAHfA,aAAe,wBAOlBA,aAAc,CACf,IAAIoG,cAAgBC,aAAanG,WAAYC,cAAexC,aAAc,MAAOwI,aAEjF,GAAIC,cAAcE,QAAS,CACnBF,cAAcG,eAAexf,OAAS,IACtCiZ,aAAe,sBAAsBoG,cAAcG,eAAeC,KAAK,SAE3E,IACI,IAAIC,OAASC,KAAKN,cAAcE,QAAQ/B,QAAQ,IAAK,QACrD,IAAKoC,SAASF,SAAWG,MAAMH,QAC3B,MAAM,IAAII,MAAM,oDAQxB,CALA,MAAOC,GACC9G,eACAA,cAAgB,MAEpBA,cAAgB,gCAAgC8G,GACpD,CAEA,IAAK9G,aAAc,CACf,IAAI+G,EAAmB,SAAUje,GAC7BkX,aAAelX,CACnB,EAEAnB,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWwM,SAAW,kBACtB,CAAEqJ,QAASF,cAAcE,SACzBS,EACA,MACA,OAAMrY,OAAWA,OAAWA,OAAWA,GAAW,EAE1D,CACJ,CACJ,CACA,OAAOsR,YACX,EAEIqG,aAAe,SAAUnG,EAAYC,EAAexC,EAAcqJ,EAAcb,GAChF,IAAIG,EAAU3I,IAAiBC,yBAAyBwE,KAAOlC,EAAa,QAAQC,eAA2BD,OAAgBC,MAC/H,MAAM8G,EAAUX,EAAQY,SAAShB,6BACjC,IAAIK,EAAiB,GAEjBY,EAAkBhB,EAAciB,qBAAuBC,oBAAoBF,gBAE/E,IAAK,MAAM9M,KAAS4M,EAAS,CACzB,IAAIvc,EAAO2P,EAAMmE,OAAO9T,KACpB4c,EAAmBnB,EAEjBgB,EAAgB5b,MAAKzB,GAAKA,EAAE2V,YAAc/U,IAD1Cyc,EAAgB5b,MAAKzB,GAAKA,EAAE+V,cAAgBnV,IAGlD,QAAqBgE,IAAjBsY,EAA4B,CAC5B,IAAIO,EAAa,IAAID,EAAgB7H,aACrC6G,EAAUA,EAAQ/B,QAAQlK,EAAM,GAAIkN,EACxC,MAESD,GACDf,EAAe9a,KAAKf,GAExB4b,EAAUA,EAAQ/B,QAAQlK,EAAM,GAAI2M,EAE5C,CAEA,YAAqBtY,IAAjBsY,EACOV,EAGA,CACHA,UACAC,iBAGZ,EAEIiB,gBAAkBC,qBAAqBze,KAAIc,GAAKA,EAAE5C,KAAIsf,KAAK,KAC3DkB,+BAAiC,cAAcF,sBAE/CJ,mBAAqB,WACrB,IAAID,EAAkB,GACtB,IAAIQ,EAAqB9V,GAAG+V,KAAKxgB,GAAG6V,UAEhCkK,EADAQ,EAAmB7U,aAAeuK,kBAAkBkG,SAClCoE,EAAmBpK,YAAY1T,QAAOC,GAAKA,EAAE4T,SAAW5T,EAAEiW,eAG1D4H,EAAmB1J,eAAepU,QAAOC,IAAMA,EAAEiW,eAIvE,IAAK,MAAMV,KAAS8H,EAAiB,CAGjC9H,EAAM1U,SAAU,EAIhB,IAAIkd,GAAiC,EAErC,GAAIxI,EAAMQ,YAAYiI,SAAS,KAAM,CAEjC,MAAMb,EAAU5H,EAAMQ,YAAYqH,SAAS,IAAIa,OAAOL,+BAAgC,OAEtF,IAAK,MAAMrN,KAAS4M,EAAS,CACzBY,GAAiC,EAEtBxN,EAAMmE,OAAO9T,KACxB,GAAI2U,EAAM6B,mBAAoB,CAC1B,IAAIrX,EAAS8d,EAAmB3I,kBAAkBzT,MAAKzB,GAAKA,EAAE5C,KAAOmY,EAAM6B,qBACtE7B,EAAMQ,YAAYiI,SAASje,EAAOa,MAInC2U,EAAMQ,YAAcR,EAAMQ,YAAY0E,QAAQlK,EAAM,GAAI,IAAIyF,OAH5DT,EAAMQ,YAAcR,EAAMQ,YAAY0E,QAAQlK,EAAM,GAAI,IAAM,KAAKxQ,EAAOa,OAKlF,MAEI2U,EAAMQ,YAAcR,EAAMQ,YAAY0E,QAAQlK,EAAM,GAAI,IAAIyF,MAEpE,CACJ,CAEA,IAAK+H,GAAkCxI,EAAM6B,mBAAoB,CAC7D,IAAIrX,EAAS8d,EAAmB3I,kBAAkBzT,MAAKzB,GAAKA,EAAE5C,KAAOmY,EAAM6B,qBACtE7B,EAAMQ,YAAYiI,SAASje,EAAOa,QACnC2U,EAAMQ,aAAe,KAAKhW,EAAOa,QAEzC,CAGA2U,EAAMQ,YAAcR,EAAMQ,YAAYmI,WAAW,IAAK,KACtD3I,EAAMQ,YAAcR,EAAMQ,YAAYmI,WAAW,IAAK,IAC1D,CAEA,OAAOb,CACX,EAEIc,gBAAkB,WAClB,IAAId,EAAkB,GACtB,IAAIQ,EAAqB9V,GAAG+V,KAAKxgB,GAAG6V,UAQhC/V,GAAM,EAOV,OAbIigB,EADAQ,EAAmB7U,aAAeuK,kBAAkBkG,SAClCoE,EAAmBpK,YAAY1T,QAAOC,GAAKA,EAAE4T,QAAU5T,EAAEiW,eAGzD4H,EAAmB1J,eAAepU,QAAOC,GAAKA,EAAEiW,gBAKlDhZ,OAAS,IACzBG,EAAK2c,KAAKqE,OAAOf,EAAgBne,KAAIc,GAAKA,EAAEuW,YAC5CnZ,KAGGA,CACX,EAEImgB,oBACAc,uBAAyB,SAAUC,GACnC,IAAI/I,EAAQjY,GAAGihB,uBAEXlB,EAAkBC,qBAElBkB,EAAmB,SAAUhC,GAC7B,MAAMW,EAAUX,EAAQY,SAASjB,wBAEjC,IAAK,MAAM5L,KAAS4M,EAAS,CACzB,IAAIxH,EAAYpF,EAAMmE,OAAOiB,UACzB6H,EAAkBH,EAAgB5b,MAAKzB,GAAKA,EAAEyd,aAAe9H,IACjE,GAAI6H,EAAiB,CACjB,IAAI5F,EAAY,IAAI4F,EAAgBzH,eACpCyG,EAAUA,EAAQ/B,QAAQlK,EAAM,GAAIqH,EACxC,CACJ,CAEA,OAAO4E,CACX,EAEIiC,EAAuBD,EAAiBjJ,EAAMa,cAC9CsI,EAA0BF,EAAiBjJ,EAAMc,iBAGjDsI,EAAY5W,GAAG6W,QAAQ5hB,EAAE,qCAAqC,IAC7DugB,qBAAwBoB,KACzBpB,oBAAsB,CAClBhI,MAAO,KACP8H,gBAAiBA,EACjBzc,KAAMmH,GAAGC,WAAW,IACpB6L,aAAc9L,GAAGC,WAAW,IAC5B6W,gBAAiB9W,GAAGC,WAAW,IAC/BoO,WAAYrO,GAAGC,WAAW,IAC1BqO,cAAetO,GAAGC,WAAW,IAC7BkO,aAAcnO,GAAGC,WAAW,IAC5B8W,iBAAkB,CACdrc,MAAO,IACPC,OAAQ,IACRJ,QAAS,KACTU,YAAa,cACb+b,UAAW,QACXC,aAAc,WACdC,eAAe,EACf7b,YAAa,SAAUlB,GACnB,IAAIqE,EAAUgX,oBAAoBuB,iBAC9B9a,EAAO9B,EAAEyB,SAEb,GAAK4C,EAAQ2Y,SAKR,GAAIlb,IAASuC,EAAQV,cAAgB7B,EAAK2R,UAAW,CACtD,IAGIlK,EAHA0T,EAAsD,QAAzC5B,oBAAoB6B,iBAA8BpiB,EAAE,iCAA4CA,EAAE,oCAE/GqiB,EAAM,EASV,GAHI5T,EAJCzH,EAAKsb,SAIEtb,EAAKsb,SAHL,IAAItb,EAAK+R,eAMF,OAAfoJ,QAcA,GAFAE,EAAMF,EAAWI,QAAQF,IAEZ,IAAT5T,EAAa,CACb,IAAI6J,EAAI6J,EAAWI,QAAQC,MACvB/J,EAAI0J,EAAWI,QAAQF,IAKvBI,EAAa,GAHTN,EAAW/M,MAAMsN,UAAU,EAAGpK,MAGb7J,KAFjB0T,EAAW/M,MAAMsN,UAAUjK,MAEIkK,WACM,QAAzCpC,oBAAoB6B,iBACpB7B,oBAAoBnH,WAAWqJ,GAG/BlC,oBAAoBlH,cAAcoJ,EAE1C,CAGyC,QAAzClC,oBAAoB6B,iBACpB7B,oBAAoBqC,mBAAmBtN,QAGvCiL,oBAAoBsC,sBAAsBvN,QAG1C6M,GACAA,EAAWW,QAAQT,EAAM5T,EAAMxO,OAAS,EAChD,OAxDIsJ,EAAQ2Y,QAAUvG,YAAW,WACzBpS,EAAQ2Y,QAAU,IACtB,GAAG,KAwDP3Y,EAAQV,aAAe7B,CAC3B,GAEJ+b,mBAAoB,CAChBtd,MAAO,OACPud,MAAO,OACPC,UAAW,YAEfC,2BAA4B,CACxBzd,MAAO,OACPud,MAAO,YACPC,UAAW,WACX5d,WAAY,IAAI3F,WAAWsC,KAAKmhB,WAAW,CACvCnhB,KAAM1B,GAAG8iB,oBAAoB,CAAEnK,aAAc,KAAM,IACnDxV,IAAK,UAETuC,YAAa,OACbqd,UAAW,QACXC,eAAgB,SAAU7U,EAAO8U,EAAeC,EAAOxR,EAAOO,EAASpJ,GACnE,IAAI+P,EAAeC,gBAAgBoH,oBAAoBnH,aAAcmH,oBAAoBlH,gBAAiBkH,oBAAoB1J,gBAC9H0J,oBAAoBrH,aAAaA,EACrC,GAEJuK,8BAA+B,CAC3Bpe,WAAY,CAAC,CAAEoJ,MAAO,EAAGvN,KAAM,eAAiB,CAAEuN,MAAO,EAAGvN,KAAM,aAClE8E,YAAa,OACbqd,UAAW,QACX5d,MAAO,OACPud,MAAO,SACPC,UAAW,YAEfS,0BAA2B,CACvBV,MAAO,cACPC,UAAW,WACXxd,MAAO,IACPC,OAAQ,GACRie,UAAW,CACPvjB,GAAI,gCAERkjB,eAAgB,SAAU7U,EAAO8U,EAAeC,EAAOxR,EAAOO,EAASpJ,GACnE,IAAI+P,EAAeC,gBAAgBoH,oBAAoBnH,aAAcmH,oBAAoBlH,gBAAiBkH,oBAAoB1J,gBAC9H0J,oBAAoBrH,aAAaA,EACrC,EACA0K,UAAW,WACPrD,oBAAoB6B,iBAAmB,KAC3C,GAEJyB,6BAA8B,CAC1Bb,MAAO,iBACPC,UAAW,WACXxd,MAAO,IACPC,OAAQ,GACRie,UAAW,CACPvjB,GAAI,mCAERkjB,eAAgB,SAAU7U,EAAO8U,EAAeC,EAAOxR,EAAOO,EAASpJ,GACnE,IAAI+P,EAAeC,gBAAgBoH,oBAAoBnH,aAAcmH,oBAAoBlH,gBAAiBkH,oBAAoB1J,gBAC9H0J,oBAAoBrH,aAAaA,EACrC,EACA0K,UAAW,WACPrD,oBAAoB6B,iBAAmB,QAC3C,GAEJ0B,qBAAsB,CAClBC,mBAAmB,EACnBte,MAAO,IACPC,OAAQ,GACRmZ,UAAU,EACV8E,UAAW,CACP1X,MAAO,oBAKC6X,qBAAqBrV,MAAQ8R,oBAAoBrH,aACrEqH,oBAAoBwC,mBAAmBtU,MAAQ8R,oBAAoB3c,KACnE2c,oBAAoB2C,2BAA2BzU,MAAQ8R,oBAAoB1J,aAC3E0J,oBAAoBkD,8BAA8BhV,MAAQ8R,oBAAoBsB,gBAC9EtB,oBAAoBmD,0BAA0BjV,MAAQ8R,oBAAoBnH,WAC1EmH,oBAAoBsD,6BAA6BpV,MAAQ8R,oBAAoBlH,cAE7EkH,oBAAoBhI,MAAQA,EAC5BxN,GAAGiJ,cAAcuM,oBAAqBvgB,EAAE,qCAAqC,IAC7EugB,oBAAoByD,SAAWhkB,EAAE,wBAAwBikB,WAAW,YACpE1D,oBAAoBqC,mBAAqB5iB,EAAE,kCAAkCkkB,WAAW,YACxF3D,oBAAoBsC,sBAAwB7iB,EAAE,qCAAqCkkB,WAAW,YAE9F3D,oBAAoB1J,aAAaoE,kBAAiB,SAAUC,EAAUC,GAC9DD,IAAaC,IACTD,IAAapE,yBAAyBwE,MACtCiF,oBAAoBlH,cAAc,IAEtCkH,oBAAoBsC,sBAAsBxb,OAAO,WAAYkZ,oBAAoB1J,iBAAmBC,yBAAyBqN,OAErI,KAGJ5D,oBAAoBF,gBAAkBA,EAGtCE,oBAAoB6B,iBAAmB,MAEvC7B,oBAAoBhI,MAAQA,EAC5BgI,oBAAoB3c,KAAK2U,EAAMQ,eAC/BwH,oBAAoB1J,aAAa0B,EAAM1B,gBACvC0J,oBAAoBsB,gBAAgBtJ,EAAMsJ,mBAC1CtB,oBAAoBnH,WAAWqI,GAC/BlB,oBAAoBlH,cAAcqI,GAClCJ,EAAMja,OAAO,QAAS,eAAiBkZ,oBAAoBhI,MAAMQ,eACjEwH,oBAAoBsC,sBAAsBxb,OAAO,WAAYkZ,oBAAoB1J,iBAAmBC,yBAAyBqN,OAC7H5D,oBAAoByD,SAAS3c,OAAO,QAAS,CAAC,CAC1CjH,GAAI,IACJ2Y,YAAa,UACbpV,MAAO0c,EACP+D,UAAU,GAEd,CACIhkB,GAAI,IACJ2Y,YAAa,YACbpV,MAAO,CACH,CACIoV,YAAa,wCACbuJ,SAAU,oCACV3J,UAAW,OAEf,CACII,YAAa,2BACbuJ,SAAU,2BACV3J,UAAW,WAGnByL,UAAU,IAGlB,EAEIC,WAAa,SAAUxR,GAEvB,IAAIyR,EAAapO,iBAAiB5V,GAAG6V,UAErC,GAAKmO,EAAWjO,QAAhB,CAIA,IAAIwK,EAAqB9V,GAAG+V,KAAKxgB,GAAG6V,UAWpC,OATA0K,EAAmB3I,kBAAkBlP,SAAQ,SAAU8Q,GACnD,IAAIkE,EAAU,GACdlE,EAAiBkE,QAAQhV,SAAQ,SAAUiV,GACvCD,EAAQrZ,KAAKsZ,EAASlb,OAC1B,IAEA+W,EAAiBkE,QAAUA,CAC/B,IAEQ6C,EAAmB7U,YACvB,KAAKuK,kBAAkBC,MACnBqK,EAAmB0D,MAAQ1D,EAAmBpK,YAC9CoK,EAAmBpK,YAAc,GACjCoK,EAAmB2D,MAAQ3D,EAAmB1J,eAC9C0J,EAAmB1J,eAAiB,GACpC,MACJ,KAAKZ,kBAAkBU,MACnB4J,EAAmB4D,cAAgB5D,EAAmB3J,cACtD2J,EAAmB3J,cAAgB,GAIH,SAApClX,EAAE,WAAW0kB,KAAK,gBAClB1kB,EAAE,WAAW0kB,KAAK,aAAc,SAChC1kB,EAAE,WAAW6E,SAAS,YAAYwC,OAAO,UAAU,IAkBvDxG,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWwM,SAAW,OACtB0K,GAjBmB,SAAU7e,GACzB2iB,cACAA,aAAa3iB,EAAK4iB,OAAQ5iB,EAAKgK,YAE9B6Y,eACDC,qBAAqBjS,EAAKgO,GAE1BxY,UACAA,QAAQ0c,yBAAyB/iB,GACjCqG,QAAQ2c,4BAA4BhjB,IAIxCue,oBAAsB,IAC1B,GAKI,MACA,EAlDJ,MAFI1f,SAASyO,YAAY,6BAA+BgV,EAAWhO,eAAgB,SAAU,IAqDjG,EAEIwO,qBAAuB,SAAUjS,EAAKgO,GAEtC,IAAIxO,EAAM1I,WAAWkC,KAAO,uBACxBoZ,IAAWpE,EAAmBqE,SAC9BD,IACA5S,EAAM1I,WAAWwb,UAAY,wBAWjCtkB,SAASsN,iBAAiB,CAAA,EACtBkE,EACAwO,GAXmB,SAAU7e,GAC7B,GAAIijB,EAAU,CACV,IAAIG,EAAkBD,UAAUE,UAAUxE,EAAmBqE,UAC7DC,UAAUG,qBAAqBF,EAAiBpjB,EACpD,MACIqG,QAAQkd,cAAcvjB,EAE9B,GAMI,MACA,EACR,EAEIwjB,YAAc,SAAUC,GACxB,IAAIC,EAAe1lB,EAAEylB,GAAQhf,QAAQ,iBACrC,GAAKif,EAAaxT,SAAS,aAA2C,IAA7BwT,EAAa1jB,KAAK,OAA3D,CAEA,IAAI2jB,EAAeD,EAAajhB,KAAK,iBACrCkhB,EAAaC,YAAY,WACzB,IAAIpU,EAAQmU,EAAalhB,KAAK,SAE9B,GAAIkhB,EAAazT,SAAS,YAQtB,GAPAV,EAAMkT,KAAK,WAAY,QACvBlT,EAAMkT,KAAK,WAAY,QACvBlT,EAAMjE,IAAI,SACViE,EAAMjE,IAAI,QAEVvN,EAAE,WAAW0I,OAETuP,iBAAkB,CAClB,IAAIM,EAAQxN,GAAG8a,WAAWH,EAAa,IAAII,MAC3C,GAAIvN,EAAM3B,QAAU2B,EAAM3B,UAClB2B,EAAM2B,mBAAqBC,2BAA2B/Y,KAAM,CAC5D,IAAIyY,EAAUvZ,GAAG8b,aAAH9b,GACVylB,EAAUvU,EAAM4D,MAChB4Q,EAAUxU,EAAMxP,KAAK,YAErBikB,EAAe,uBACfC,EAAUF,EAAQvI,QAAQwI,EAAc,QACxCE,EAAM,IAAIlF,OAAO,IAAIiF,KAErBE,EAAcvM,EAAQ9W,QAAOC,GAAKA,EAAE4T,UAAY5T,EAAEqY,oBAAsB9C,EAAM8C,mBAAqBrY,EAAEkX,mBAAqBC,2BAA2B/Y,MAAQ4B,EAAEyX,iBAAmBlC,EAAMkC,gBAAkB0L,EAAIE,KAAKrjB,EAAE+V,iBACrNqN,EAAYnmB,OAAS,GAAK+lB,IAAYD,GACtCllB,SAASylB,iBAAiB,iDAAiD,SAAU3G,GAC7EA,GACAyG,EAAYpd,SAAQ,SAAUud,GAC1BA,EAAsBxN,YAAYwN,EAAsBxN,cAAc0E,QAAQ0I,EAAKJ,GACvF,GAER,GAER,CAER,OAGAvU,EAAMxP,KAAK,WAAYwP,EAAM4D,OAC7B5D,EAAMgV,WAAW,YACjBhV,EAAMgV,WAAW,YAEjBhV,EAAMhE,GAAG,SAAS,SAAUwE,GACxB,GAAsB,KAAlBA,EAAMyU,QAAgB,CAEtB,GADAzU,EAAM2C,iBAC8B,KAA/BnD,EAAM4D,MAAc4D,OAAe,CACpC,IAAImC,EAAW3J,EAAMxP,KAAK,YAC1BwP,EAAM4D,IAAI+F,GACV3J,EAAM4C,SAASsQ,KAAK,aAAcvJ,EACtC,CACA3J,EAAMkV,MACV,MACK,GAAsB,KAAlB1U,EAAMyU,QAAgB,CAC3BzU,EAAM2C,iBACN,IAAIwG,EAAW3J,EAAMxP,KAAK,YAC1BwP,EAAM4D,IAAI+F,GACV3J,EAAM4C,SAASsQ,KAAK,aAAcvJ,GAClC3J,EAAMkV,MACV,CACJ,IAEe3b,GAAG8a,WAAWJ,GAAQK,MAAMlP,UAEvC+E,YAAW,WACP3b,EAAE,WAAWye,MACjB,GAAG,KAGPjN,EAAM8D,QACN9D,EAAMhE,GAAG,QAAQ,WAAcgY,YAAYC,EAAQ,GAvEnD,CAyER,EACIkB,yBAA2B,SAAUlB,GACrC,GAA+C,IAA3CnlB,GAAG6V,SAAS+B,oBAAoBjY,OAEhC,YADA2mB,UAAU,kCAAmC,WAIjD,MAAMlB,EAAe1lB,EAAEylB,GAAQhf,QAAQ,iBACjC8R,EAAQxN,GAAG8a,WAAWH,EAAa,IAAII,MAEvCM,EADU9lB,GAAG8b,aAAH9b,GACYyC,QAAOC,GAAKA,EAAE4T,UAAY5T,EAAEqY,oBAAsB9C,EAAM8C,mBAAqBrY,EAAEkX,mBAAqBC,2BAA2B/Y,MAAQ4B,EAAEyX,iBAAmBlC,EAAMkC,iBAC1L2L,GAAeA,EAAYnmB,OAAmD,EAAzCK,GAAG6V,SAAS+B,oBAAoBjY,OACrEK,GAAGumB,qBAAqBtO,GAGxBqO,UAAU,kCAAmC,UAErD,EAEIE,aAAe,SAAUjU,GACe,SAApC7S,EAAE,WAAW0kB,KAAK,gBAClB1kB,EAAE,WAAW0kB,KAAK,aAAc,SAChC1kB,EAAE,WAAW6E,SAAS,YAAYwC,OAAO,UAAU,IAGvD,IAAI6d,EAAWlP,kBAAkBhU,KAAK,YACtC,GAAIkjB,EAAU,CACV,IAAIE,EAAkBD,UAAUE,UAAUH,GAC1CllB,EAAE,gBAAgB+mB,QAAQ,YAAYre,OACtCyc,UAAU6B,kBAAkBnU,EAAKuS,EACrC,KAAO,CAEH,MAAM/S,EAAM1I,WAAWkC,KAAO,uBAC9B,IAAIlM,EAAS0I,QAAQ4e,oBAAoB,CAAA,GACzC,MAAMlb,EAAU1D,QAAQ6e,eAAellB,KAAK,WAC5CrC,EAAOqM,WAAyB,kBAAZD,EAA8B,QAAU,WAE5DlL,SAASsN,iBAAiB,CAAA,EACtBkE,EACA1S,EACA0I,QAAQkd,cACR,MACA,EACR,CACJ,EAEI4B,wBAA0B,SAAU5O,EAAO6O,GAA0B,GACrE7O,EAAM3B,QAAO,GACb2B,EAAM8O,gBAAe,GACrB9O,EAAM+O,eAAc,GACf/O,EAAMgP,aACPhP,EAAMgP,UAAS,GACfhP,EAAMnY,GAAG,KAETmY,EAAM5W,SAAW4Z,qBAAqBC,MACtCjD,EAAMsC,aAAaC,oBAAoB1Z,MAEtCgmB,IACG7O,EAAM5W,SAAW4Z,qBAAqBiM,QACtCjP,EAAM1B,aAAaC,yBAAyB2Q,OAC5ClP,EAAM0D,cAAc,IAGpB1D,EAAM1B,aAAaC,yBAAyB4Q,KAGxD,EAEIC,YAAc,SAAUpP,EAAOnE,EAAQpC,GACvCoC,EAAOyI,SAASR,OAAO9D,GAEnBA,EAAMnY,OAAS0V,eAAiByC,EAAM3B,UAAY2B,EAAM2B,mBAAqBC,2BAA2B/Y,MACxGgT,EAAOyI,SAASR,QAAO,SAAUzF,GAC7B,OAAOA,EAAOxW,OAAS0V,eAAiBc,EAAOyE,oBAAsB9C,EAAM8C,mBAAqBzE,EAAO6D,iBAAmBlC,EAAMkC,iBAC3H7D,EAAOsD,mBAAqBC,2BAA2ByN,WAAahR,EAAOsD,mBAAqBC,2BAA2BmC,oBACpI,IACJrE,kBAEqB,kBAAhB7D,EAAOxQ,MAA4BtD,GAAG6V,SAASnK,eAAiBuK,kBAAkBkG,WACjE,kBAAhBrI,EAAOxQ,MAA4C,gBAAhBwQ,EAAOxQ,OAA2BtD,GAAG6V,SAASnK,eAAiBuK,kBAAkBU,QACtH4Q,gBAAgBtP,EAAMiE,UAAWpI,EAAOyI,WAEhD,EAEA,SAASgL,gBAAgBrL,EAASK,GACmD,IAA7EA,EAAS9Z,QAAO,SAAUC,GAAK,OAAOA,EAAEwZ,YAAcA,CAAS,IAAGvc,QAClE4c,EAAS9Z,QAAO,SAAUC,GAAK,OAAOA,EAAEwZ,UAAYA,CAAS,IAAGxT,SAAQ,SAAUuP,GAC9EA,EAAMiE,QAAQjE,EAAMiE,UAAY,EACpC,GAER,CAEA,IAAI9B,oBAAsB,SAAUR,GAGhC,OADuBA,IAAmBC,2BAA2B/Y,KAAO,EAAK8Y,IAAmBC,2BAA2B2N,MAAQ,EAAK5N,IAAmBC,2BAA2ByN,UAAY,EAAI,CAE9M,EAEA,SAASG,kBAAkBC,EAAYC,GACnC,IAAIC,EAAOnf,KAEXif,EAAWG,YAAc,MACzBD,EAAK/R,SAAWpL,GAAGqd,QAAQC,OAAOL,GAElC,IAAK,IAAI1P,EAAI,EAAGA,EAAI4P,EAAK/R,SAAS+B,oBAAoBjY,OAAQqY,IAAK,CAC/D,IAAIwB,EAAmBoO,EAAK/R,SAAS+B,oBAAoBI,GACzDwB,EAAiBwO,SAASzU,UAAU,SAAUpF,GACtCA,IAAU8Z,0BAA0BC,KAAOzf,KAAK0f,gBAAkB,IAClE1f,KAAK0f,cAAc,EAE3B,EAAE/L,KAAK5C,GACX,CAEAoO,EAAK/R,SAAS8O,SAAWla,GAAGC,WAAmC,IAAxBgd,EAAW9C,UAClDgD,EAAKxO,OAAS3O,GAAGqd,QAAQC,OAAOJ,GAChCC,EAAK/R,SAASuS,cAAgB3d,GAAGuP,UAAS,WAAc,OAAOvR,KAAKiD,YAAc,GAAGkc,EAAK/R,UAE1F+R,EAAKlQ,iBAAmBjN,GAAGuP,UAAS,WAChC,OAAOvR,KAAKiD,eAAiBuK,kBAAkBC,MAAQ,QAAWzN,KAAKiD,eAAiBuK,kBAAkBU,MAAQ,qBAAuB,OAC7I,GAAGiR,EAAK/R,UAER+R,EAAKS,oBAAqB,EAE1BT,EAAK/R,SAASnK,WAAW6H,WAAU,SAAUqH,GAEzC,GADAgN,EAAKS,oBAAqB,EAClBzN,IACC3E,kBAAkBkG,SAAvB,CACI,IAAK,IAAInE,EAAI,EAAGA,EAAI4P,EAAK/R,SAASgB,iBAAiBlX,OAAQqY,IACnD4P,EAAK/R,SAASgB,iBAAiBmB,GAAGmC,gBAAkBM,iBAAiBoB,aACrE+L,EAAK/R,SAASgB,iBAAiBmB,GAAGmC,aAAaM,iBAAiBmB,gBAGpEgM,EAAK/R,SAASM,YAAY9R,KAAKujB,EAAK/R,SAASgB,iBAAiBmB,IAElE4P,EAAK/R,SAASgB,eAAeyR,WAC7B,KACJ,CACI,IAAI/O,EAAUqO,EAAK/R,SAASM,YAAY4F,QAAO,SAAUrV,GAAQ,OAAOA,EAAK4P,QAAU,IACvF,IAAK,IAAI0B,EAAI,EAAGA,EAAIuB,EAAQ5Z,OAAQqY,IAChC4P,EAAK/R,SAASgB,eAAexS,KAAKkV,EAAQvB,GAE9C,CAGR4P,EAAKS,oBAAqB,EAC1BE,oBACJ,GAAGX,EAAK/R,UAER+R,EAAKY,qBAAuB,CACxB,CAAEra,MAAO,EAAGvN,KAAM,WAClB,CAAEuN,MAAO,EAAGvN,KAAM,YAClB,CAAEuN,MAAO,EAAGvN,KAAM,aAClB,CAAEuN,MAAO,EAAGvN,KAAM,gBAClB,CAAEuN,MAAO,EAAGvN,KAAM,gBAClB,CAAEuN,MAAO,EAAGvN,KAAM,iBAClB,CAAEuN,MAAO,GAAIvN,KAAM,QAGvBgnB,EAAKxM,iBAAmB,CACpB,CAAEjN,MAAOqI,yBAAyBC,SAAU7V,KAAM,WAAYqK,SAAS,GACvE,CAAEkD,MAAOqI,yBAAyBiS,IAAK7nB,KAAM,MAAOqK,SAAS,GAC7D,CAAEkD,MAAOqI,yBAAyBkS,IAAK9nB,KAAM,MAAOqK,SAAS,GAC7D,CAAEkD,MAAOqI,yBAAyB4Q,IAAKxmB,KAAM,MAAOqK,SAAS,GAC7D,CAAEkD,MAAOqI,yBAAyB2Q,MAAOvmB,KAAM,QAASqK,SAAS,GACjE,CAAEkD,MAAOqI,yBAAyBmS,KAAM/nB,KAAM,OAAQqK,SAAS,GAC/D,CAAEkD,MAAOqI,yBAAyBwE,KAAMpa,KAAM,cAAeqK,SAAS,EAAO2d,eAAe,GAC5F,CAAEza,MAAOqI,yBAAyBqN,MAAOjjB,KAAM,qBAAsBqK,SAAS,EAAO2d,eAAe,IAGxGhB,EAAK9E,oBAAsB,SAAU7K,GACjC,OAAIA,EAAMU,eACCiP,EAAKxM,iBAAiB3Y,QAAOC,GAAKA,EAAEkmB,gBAGpChB,EAAKxM,iBAAiB3Y,QAAOC,GAAKA,EAAEuI,SAEnD,EAEA2c,EAAKiB,gBAAkB,SAAU5Q,GAC7B,IAAIhP,EAAU,CACV,CAAEkF,MAAOsM,iBAAiBC,OAAQ9Z,KAAM,UACxC,CAAEuN,MAAOsM,iBAAiBqO,eAAgBloB,KAAM,oBAChD,CAAEuN,MAAOsM,iBAAiBmB,eAAgBhb,KAAM,oBAoBpD,OAjBIqX,EAAM1B,iBAAmBC,yBAAyBwE,MAAQ/C,EAAM1B,iBAAmBC,yBAAyBqN,OAC5G5a,EAAQ5E,KAAK,CAAE8J,MAAOsM,iBAAiBsO,KAAMnoB,KAAM,SAGnDgnB,EAAK/R,SAASnK,eAAiBuK,kBAAkBU,OACjD1N,EAAQ5E,KAAK,CAAE8J,MAAOsM,iBAAiBoB,YAAajb,KAAM,gBAC1DqI,EAAQ5E,KAAK,CAAE8J,MAAOsM,iBAAiBuO,kBAAmBpoB,KAAM,yBAChEqI,EAAQ5E,KAAK,CAAE8J,MAAOsM,iBAAiBwO,uBAAwBroB,KAAM,+BACrEqI,EAAQ5E,KAAK,CAAE8J,MAAOsM,iBAAiByO,qBAAsBtoB,KAAM,4BACnEqI,EAAQ5E,KAAK,CAAE8J,MAAOsM,iBAAiB0O,0BAA2BvoB,KAAM,kCACxEqI,EAAQ5E,KAAK,CAAE8J,MAAOsM,iBAAiB2O,kBAAmBxoB,KAAM,uBAChEqI,EAAQ5E,KAAK,CAAE8J,MAAOsM,iBAAiB4O,iBAAkBzoB,KAAM,uBAE1DgnB,EAAK/R,SAASnK,eAAiBuK,kBAAkBC,OACtDjN,EAAQ5E,KAAK,CAAE8J,MAAOsM,iBAAiBoB,YAAajb,KAAM,gBAG1DqX,EAAM1B,iBAAmBC,yBAAyB8S,KAC3C,CAAC,CAAEnb,MAAOsM,iBAAiBC,OAAQ9Z,KAAM,WAG7CqI,CACX,EAEA2e,EAAKzM,oBAAsB,CACvB,CAAEhN,MAAOqM,oBAAoB1Z,KAAMF,KAAM,KACzC,CAAEuN,MAAOqM,oBAAoB+O,MAAO3oB,KAAM,UAC1C,CAAEuN,MAAOqM,oBAAoBgP,OAAQ5oB,KAAM,WAC3C,CAAEuN,MAAOqM,oBAAoBiP,QAAS7oB,KAAM,YAC5C,CAAEuN,MAAOqM,oBAAoBkP,UAAW9oB,KAAM,cAC9C,CAAEuN,MAAOqM,oBAAoBmP,OAAQ/oB,KAAM,WAC3C,CAAEuN,MAAOqM,oBAAoBoP,YAAahpB,KAAM,iBAChD,CAAEuN,MAAOqM,oBAAoBqP,cAAejpB,KAAM,oBAGtDgnB,EAAKkC,yBAA2B,CAC5B,CAAE3b,MAAO4b,mCAAmCvC,MAAO5mB,KAAM,SACzD,CAAEuN,MAAO4b,mCAAmCC,SAAUppB,KAAM,cAGhEgnB,EAAKqC,oBAAsB,CACvB,CAAE9b,MAAO+b,8BAA8BppB,KAAMF,KAAM,QACnD,CAAEuN,MAAO+b,8BAA8B1C,MAAO5mB,KAAM,SACpD,CAAEuN,MAAO+b,8BAA8BxO,WAAY9a,KAAM,eAG7DgnB,EAAKuC,4BAA8B,CAC/B,CAAEhc,MAAOic,sCAAsCC,MAAOzpB,KAAM,SAC5D,CAAEuN,MAAOic,sCAAsCE,OAAQ1pB,KAAM,UAC7D,CAAEuN,MAAOic,sCAAsCG,IAAK3pB,KAAM,QAG9DgnB,EAAK4C,sBAAwB,SAAUC,GAC/BA,EAAI/jB,KAAK4P,UAAYsR,EAAK/R,SAASnK,eAAiBuK,kBAAkBkG,WACtEsO,EAAIC,YAAa,EACjBpE,UAAU,+CAAgD,WAElE,EAEAsB,EAAK+C,wBAA0B,SAAUF,GACjCA,EAAI/jB,KAAK4P,WACTmU,EAAIC,YAAa,EACjBpE,UAAU,+CAAgD,WAElE,EAEAsB,EAAKgD,yBAA2B,SAAUH,GACjCA,EAAI/jB,KAAKsgB,kBACVyD,EAAIC,YAAa,EACjBpE,UAAU,+CAAgD,WAElE,EAEAsB,EAAKiD,uBAAyB,SAAUJ,GAIpC,GAHA7C,EAAKkD,iBAAiBL,EAAI/jB,MAC1BiR,iBAEIiQ,EAAK/R,SAASnK,eAAiBuK,kBAAkBU,MAAO,CACxD,IAAI7H,EAAQ2b,EAAIM,eAAepiB,QAAQ8hB,EAAI/jB,MAC3C,GAAIoI,EAAQ,EAAG,CACX,IAAIkc,EAAiBP,EAAIM,eAAejc,EAAQ,GAC5Cmc,EAAaR,EAAI/jB,KAAKwV,UAC1BuO,EAAI/jB,KAAKwV,QAAQ8O,EAAe9O,WAChCqL,gBAAgB0D,EAAYR,EAAIM,eACpC,CACJ,CACJ,EAEAnD,EAAKsD,yBAA2B,SAAUT,GAItC,GAHA7C,EAAKkD,iBAAiBL,EAAI/jB,MAC1BiR,iBAEIiQ,EAAK/R,SAASnK,eAAiBuK,kBAAkBC,MAAO,CACxD,IAAIpH,EAAQ2b,EAAIM,eAAepiB,QAAQ8hB,EAAI/jB,MAC3C,GAAIoI,EAAQ,EAAG,CACX,IAAIkc,EAAiBP,EAAIM,eAAejc,EAAQ,GAC5Cmc,EAAaR,EAAI/jB,KAAKwV,UAC1BuO,EAAI/jB,KAAKwV,QAAQ8O,EAAe9O,WAChCqL,gBAAgB0D,EAAYR,EAAIM,eACpC,CACJ,CACJ,EAEAnD,EAAKuD,0BAA4B,SAAUV,GACvC,IAAIxS,EAAQwS,EAAI/jB,KACXuR,EAAM3B,UACPuQ,wBAAwB5O,GAE5B2P,EAAKkD,iBAAiBL,EAAI/jB,MAC1BiR,gBACJ,EAEAiQ,EAAKwD,0BAA4B,SAAUX,GAE3C,EAEA7C,EAAKf,wBAA0B,SAAU5O,GACrC4O,wBAAwB5O,EAC5B,EAEA2P,EAAKyD,mBAAqB,SAAUpT,GAChCA,EAAM3B,QAAO,GACb2B,EAAM8O,gBAAe,GACrB9O,EAAM+O,eAAc,GAEf/O,EAAMgP,aACPhP,EAAMgP,UAAS,GACfhP,EAAMnY,GAAG,KAEbmY,EAAM1B,aAAaC,yBAAyBC,SAChD,EAEAmR,EAAK0D,aAAc,EACnB1D,EAAK2D,QAAU,SAAU7kB,EAAMgL,EAAOvE,GAClC,IAAIqe,EAAS5D,EAAK6D,QAAQ/kB,GAE1B,OADAkhB,EAAK0D,aAAc,EACZE,CACX,EAEA5D,EAAK8D,gBAAkBjhB,GAAGC,YAAW,GAErCkd,EAAK+D,oBAAsB,WACvB/D,EAAK8D,iBAAgB,GACpBhsB,EAAE,gCAAwCksB,aAAa,SAC5D,EAEAhE,EAAKiE,cAAgB,SAAU5Z,EAASnD,EAAOpN,GAC3CiW,iBAEA,IAAImU,EAAepsB,EAAEuS,GACrB6Z,EAAa1kB,SAAS,qCACtB0kB,EAAa5e,GAAG,gBAAgB,WAC5B4e,EAAa5kB,YAAY,oBAC7B,IAEI0gB,EAAK0D,aAAe5pB,EAAK4U,UAAY5U,EAAKkY,mBAAqBC,2BAA2B/Y,OAC1F8mB,EAAK0D,aAAc,EACnBjQ,YAAW,KAAQuM,EAAKrB,qBAAqB7kB,EAAK,GAAK,GAE/D,EAEAkmB,EAAKmE,kBAAoB,SAAU9Z,EAASnD,EAAOpN,GAC/C,IAAIuW,EAAQvY,EAAEuS,GACdgG,EAAM7J,IAAI,qBAAsB,OAChC6J,EAAM7Q,SAAS,sCACf6Q,EAAM/K,GAAG,gBAAgB,WACrB+K,EAAM8D,QACV,GACJ,EAEA6L,EAAKoE,wBAA0B,SAAUC,EAAUvqB,EAAMwqB,GACrD,GAAIA,EACA,OAIJ,MAAO,CACHva,OAHYjS,EAAEusB,GAAU9lB,QAAQ,sBAIhCkF,UAAW4gB,EACXE,UAAW,aACXC,UAAW,aACX9e,SAAU,OACVnI,MAAO,IACPnB,SAAUtC,EAAK2qB,MACfC,SAAU,SAAU1nB,GAChBlF,EAAE,2BAA2B6sB,UAAU,YAAYnkB,MACvD,EAER,EAEAwf,EAAK9L,YAAc,WACf,OAAO8L,EAAK/R,SAASnK,eAAiBuK,kBAAkBkG,SAAWyL,EAAK/R,SAASM,YAAcyR,EAAK/R,SAASgB,cACjH,EAEA+Q,EAAKkD,iBAAmB,SAAUmB,GAC1BA,EAAS3V,WACL2V,EAASI,MACTzE,EAAK4E,gBAEL5E,EAAK6E,kBAEjB,EAEA7E,EAAK8E,eAAiB,SAAUT,EAAUva,EAAOib,GAE7C,KAAIjb,GAAShS,EAAEgS,EAAMC,QAAQib,QAAQ,gBAAgBjtB,OAAS,GAA9D,CAGA,IAAIktB,EAAiD,QAAhCjF,EAAK/R,SAASgS,cAA0BD,EAAK/R,SAASM,YAAcyR,EAAK/R,SAASe,cAiBvG,OAhBIqV,EAAS3V,WACTuW,EAAiBjF,EAAK9L,eAG1B8L,EAAKkD,iBAAiBmB,GAEtBA,EAAWrE,EAAK6D,QAAQQ,GAGxBY,EAAexoB,KAAK4nB,GAChBA,EAAS3V,UACTsR,EAAKrB,qBAAqB0F,GAKvBA,CAnBH,CAoBR,EAEArE,EAAK6E,gBAAkB,WACnB,IAAIK,EAASlF,EAAK9L,cACdiR,EAAYD,IAAS3oB,MAAK,SAAUzB,GAAK,OAAOA,EAAE5C,OAAS0V,aAAe,IAC1EuX,GACAD,EAAO/Q,OAAOgR,EACtB,EAEAnF,EAAK4E,cAAgB,WACJ5E,EAAK9L,cACXC,QAAO,SAAUkQ,GAAY,OAAOA,EAAS3V,WAAa2V,EAASI,KAAO,GACrF,EAEAzE,EAAK+E,gBAAkB,SAAUG,EAAQb,GAErC,OAAiB,OADLrE,EAAKoF,qBAAqBF,EAAQb,EAAS5T,aAAa,EAExE,EAEAuP,EAAKoF,qBAAuB,SAAUF,EAAQzU,EAAW4U,GAErD,IADA,IAAI3V,EAAQwV,IACH9U,EAAI,EAAGA,EAAIV,EAAM3X,OAAQqY,IAC9B,KAAIV,EAAMU,GAAGK,cAAgBA,GAAe4U,GAAoB3V,EAAMU,GAAG+O,kBACrE,OAAOzP,EAAMU,GAErB,OAAO,IACX,EAEA4P,EAAK6D,QAAU,SAAUyB,GACrB,IAAIC,EAAS1iB,GAAGqd,QAAQtH,KAAK0M,GACzBE,EAAc3iB,GAAGqd,QAAQC,OAAOoF,GAKpC,OAHKC,EAAY9W,UACb8W,EAAY7W,aAAaC,yBAAyBC,UACtDkD,yBAAyByT,GAClBA,CACX,EAEAxF,EAAKyF,YAAc,SAAUR,GACzBA,EAAevE,WACnB,EAEAV,EAAK0F,cAAgB,SAAUT,EAAgBU,EAAU7b,GACrD,IAAI5R,EAAK+gB,kBAET,IAAIvK,EAAS7L,GAAGqd,QAAQC,OAAO,CAC3BsE,KAAK,EACL9R,aAAcC,oBAAoB1Z,KAClC0sB,gBAAiB,UACjBvT,MAAO,GACPwT,UAAW,GACXhV,YAAa,mBAAyB,EAAN3Y,EAChCwa,UAAW,aACXoT,mBAAoB,aACpBnX,aAAcC,yBAAyBwE,KACvClb,GAAIA,EACJinB,gBAAgB,EAChBE,UAAU,EACV3Q,QAAQ,EACR6J,WAAY,aACZlP,MAAO,EACP0c,UAAW,UACXtT,iBAAkB,UAClBuT,eAAgB,GAChBC,eAAgB,EAChBxsB,KAAM4Z,qBAAqBiM,OAC3BtN,eAAgBC,2BAA2B/Y,KAC3CgZ,mBAAoB,GACpBb,SAAUnZ,EACVknB,eAAe,EACf8G,WAAY,EACZC,YAAa,EACbC,iBAAkB,EAClBC,mBAAoB,GACpB/R,SAAU,EACV/B,aAAcM,iBAAiBC,OAC/BwT,gBAAgB,EAChBC,mBAAmB,EACnBxS,cAAe,EACfvP,OAAQkP,gBAAgBG,QACxB2S,kBAAmBrE,mCAAmCvC,MACtD6G,aAAcnE,8BAA8B1C,MAC5C8G,qBAAsBlE,sCAAsCG,IAC5DgE,SAAU,GACVC,iBAAkB,GAClBC,YAAa,EACb9V,cAAc,EACdG,WAAY,GACZC,cAAe,GACfyC,iBAAiB,EACjBjY,SAAS,EACTge,gBAAiB,EACjBmN,aAAa,IAEjB,IAAIC,EAAW/G,EAAK8E,eAAepW,EAAQ,MAAM,GACjDsR,EAAK3G,uBAAyB0N,EAClBjvB,EAAE,6BAA6B+mB,QAAQ,YAC7CtI,MACV,EAEAyJ,EAAKgH,aAAe,SAAUloB,EAAMgL,GAChC,GAAIkW,EAAK/R,SAAS+B,oBAAoBjY,OAAS,EAE3C,YADA2mB,UAAU,4EAA6E,WAI3F,IAAIhQ,EAAS7L,GAAGqd,QAAQC,OAAO,CAC3BsE,KAAK,EACL9R,aAAcC,oBAAoB1Z,KAClC0sB,gBAAiB,UACjBvT,MAAO,GACP0B,cAAe,EACflD,YAAajD,cACb8E,UAAW9E,cACXiY,UAAW,GACXrhB,OAAQkP,gBAAgBG,QACxBlF,aAAcC,yBAAyBqY,KACvC/uB,GAAI0V,cACJuR,gBAAgB,EAChBC,eAAe,EACfC,UAAU,EACV3Q,QAAQ,EACR6J,WAAY3K,cACZvE,MAAO,EACP0c,UAAW,UACXC,eAAgB,GAChBC,eAAgB,EAChBxsB,KAAM4Z,qBAAqBiM,OAC3BkH,kBAAmBrE,mCAAmCvC,MACtD5N,eAAgBC,2BAA2B/Y,KAC3CuZ,iBAAkB,UAClBqT,mBAAoBlY,cACpB0G,SAAU,EACV/B,aAAcM,iBAAiBC,OAC/Bc,iBAAiB,EACjB7C,cAAc,EACdpV,SAAS,EACTge,gBAAiB,EACjBmN,aAAa,IAGH9G,EAAK9L,aAAL8L,GACDzjB,MAAKzB,GAAKA,EAAE2pB,SACrBzE,EAAK8E,eAAepW,EAAQ5E,GAAO,EAE3C,EAEAkW,EAAKkH,mBAAoB,EAEzBlH,EAAKmH,eAAiB,SAAUC,EAAOtd,GACnCkW,EAAKkH,mBAAoB,EAEzB,IADA,IAAIxV,EAAS0V,EAAM1V,SACVtB,EAAI,EAAGA,EAAIsB,EAAO3Z,OAAQqY,IAC1BsB,EAAOtB,GAAGqU,OACXzE,EAAK8E,eAAepT,EAAOtB,GAAItG,GAAO,GAE9CkW,EAAKkH,mBAAoB,CAC7B,EAEAlH,EAAKqH,kBAAoB,SAAUrU,EAAUhB,EAAgBnX,GACzD,IAAI6U,EAAQsQ,EAAK9L,cACblB,EACAtD,IAAQ7U,QAAOC,GAAKA,EAAE4T,UAAY5T,EAAEkX,mBAAqBC,2BAA2B/Y,OAAM4H,SAAQ,SAAUuP,GACxG2P,EAAKsH,2BAA2BjX,EAAOxV,EAAQmX,EACnD,IAGAtC,EAAMyE,QAAO,SAAU9D,GAAS,OAAOA,EAAM2B,mBAAqBA,GAAkB3B,EAAM6B,uBAAyBrX,EAAO3C,IAAM,GAExI,EAEA8nB,EAAKsH,2BAA6B,SAAU5Y,EAAQ7T,EAAQmX,GACxD,GAAItD,EAAOxW,OAAS0V,eAEhBc,EAAO6D,eAAiBM,iBAAiBmB,gBAExCtF,EAAO6D,gBAAkBM,iBAAiBoB,aAAe+L,EAAK/R,SAASnK,eAAiBuK,kBAAkBC,OAE3GI,EAAOqC,eAEP,OAGJ,IAAIrB,EAAQsQ,EAAK9L,cAEbqT,EAAYvH,EAAK6D,QAAQnV,GAC7BuQ,wBAAwBsI,GAAW,GACnCA,EAAUvV,eAAeA,GACrBA,IAAmBC,2BAA2BmC,qBAC9CmT,EAAU/iB,OAAOkP,gBAAgBI,YACrCyT,EAAUrV,mBAAmBrX,EAAO3C,MACpCqvB,EAAUrvB,GAAG,IACb,IAAIsvB,EAAiBxV,IAAmBC,2BAA2B2N,MAAQ,GAAM5N,IAAmBC,2BAA2ByN,UAAY,QAAU,UAGrJ6H,EAAU1W,YAAY,GAAG0W,EAAU1W,iBAAiBhW,EAAOa,SAAS8rB,KACpED,EAAUnI,eAAc,GACxBmI,EAAUlW,SAAS3C,EAAO2C,YAC1B,IAAIoW,EAAmBjV,oBAAoBR,GAC3CuV,EAAUhP,WAAW,IAAI7J,EAAO2C,eAAe3C,EAAO6D,mBAAmBkV,MAAqB5sB,EAAO3C,QAEhGwX,IAAQnT,MAAKzB,GAAKA,EAAE2V,cAAgB8W,EAAU9W,eAC/Cf,EAAMjT,KAAK8qB,EAEnB,EAEAvH,EAAKrB,qBAAuB,SAAUjQ,GAClC,GAAIA,EAAOsD,mBAAqBC,2BAA2B/Y,MAAQwV,EAAOxW,OAAS0V,eAAiBc,EAAO6D,gBAAkBM,iBAAiBmB,eAAgB,CAC1J,GAAItF,EAAO6D,gBAAkBM,iBAAiBoB,aAAe+L,EAAK/R,SAASnK,eAAiBuK,kBAAkBC,MAC1G,OAEJ0R,EAAK/R,SAAS+B,oBAAoBlP,SAAQ,SAAUjG,GAChDmlB,EAAKsH,2BAA2B5Y,EAAQ7T,EAAQoX,2BAA2B2N,OAC3EI,EAAKsH,2BAA2B5Y,EAAQ7T,EAAQoX,2BAA2ByN,WAC3EM,EAAKsH,2BAA2B5Y,EAAQ7T,EAAQoX,2BAA2BmC,oBAC/E,GACJ,CACJ,EAEA4L,EAAK0H,8BAAgC,SAAU7sB,GAC3CmlB,EAAKqH,mBAAkB,EAAM,QAASxsB,GACtCmlB,EAAKqH,mBAAkB,EAAM,YAAaxsB,GAC1CmlB,EAAKqH,mBAAkB,EAAM,sBAAuBxsB,EACxD,EAEAmlB,EAAK2H,oBAAsB9kB,GAAGuP,UAAS,WACnC,OAAO4N,EAAK/R,SAAS+B,oBAAoBjY,OAAS,CACtD,IAEAioB,EAAK4H,iBAAmB,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAEjH5H,EAAK6H,oBAAsB,WACvB,GAAI7H,EAAK9L,aAAL8L,GAAqBnlB,QAAOC,GAAKA,EAAE5C,OAAS0V,eAAiB9S,EAAEyd,eAAiB3K,gBAAe7V,OAAS,EACxG2mB,UAAU,4EAA6E,gBAI3F,GAAIsB,EAAK9L,aAAL8L,GAAqBnlB,QAAOC,GAAKA,EAAEqkB,mBAAgD,OAA3BrkB,EAAEoX,2BAA4DxS,IAA3B5E,EAAEoX,wBAAqCna,OAAS,EAC3I2mB,UAAU,2FAA4F,eAD1G,CAOA,IAFA,IAAIrM,EAAQ2N,EAAK4H,iBAAiB5H,EAAK/R,SAAS+B,oBAAoBjY,QAChEG,EAAK,EACF8nB,EAAK/R,SAAS+B,oBAAoBzT,MAAKzB,GAAKA,EAAE5C,MAAQA,KACzDA,IAGJ,IAAI2C,EAASgI,GAAGqd,QAAQC,OAAO,CAC3BjoB,GAAIA,EAAG4vB,WACPpsB,KAAM,UAAYxD,EAClBma,MAAOA,EACP0V,WAAW,EACXC,eAAe,EACfC,yBAAyB,EACzBxS,WAAYyS,4BAA4BC,SACxC/H,SAAUC,0BAA0B+H,MACpC7H,cAAe,EACf7K,UAAW,GACXE,UAAW,KACXE,QAAS,GACTuS,uBAAwB,KAE5BxtB,EAAOulB,SAASzU,UAAU,SAAUpF,GAC5BA,IAAU8Z,0BAA0BC,KAAOzf,KAAK0f,gBAAkB,IAClE1f,KAAK0f,cAAc,EAE3B,EAAE/L,KAAK3Z,IACPgX,oCAAoChX,EAAQmlB,GAC5CA,EAAK/R,SAAS+B,kBAAkBvT,KAAK5B,GACrCmlB,EAAK0H,8BAA8B7sB,GACnCytB,kBAAkBxwB,EAAE,oBA/BpB,CAgCJ,EAEAkoB,EAAKuI,uBAAyB,SAAU3W,GACpCoO,EAAK9L,cAAcC,QAAO,SAAUzF,GAAU,OAAOA,EAAOwD,uBAAyBN,EAAiB1Z,IAAM,IAC5G8nB,EAAK/R,SAAS+B,kBAAkBmE,OAAOvC,EAC3C,EAEAoO,EAAKwI,sBAAwB,CACzB,CAAEjiB,MAAO2hB,4BAA4BO,OAAQzvB,KAAM,UACnD,CAAEuN,MAAO2hB,4BAA4BC,SAAUnvB,KAAM,YACrD,CAAEuN,MAAO2hB,4BAA4BQ,WAAY1vB,KAAM,eAI3DgnB,EAAK2I,0BAA4B,CAC7B,CAAEpiB,MAAO8Z,0BAA0BuI,KAAM5vB,KAAM,QAC/C,CAAEuN,MAAO8Z,0BAA0BwI,QAAS7vB,KAAM,WAClD,CAAEuN,MAAO8Z,0BAA0B+H,MAAOpvB,KAAM,SAEhD,CAAEuN,MAAO8Z,0BAA0BC,IAAKtnB,KAAM,QAGlDgnB,EAAK8I,+BAAiC,CAClC,CAAEviB,MAAO,GACT,CAAEA,MAAO,GACT,CAAEA,MAAO,GACT,CAAEA,MAAO,GACT,CAAEA,MAAO,GACT,CAAEA,MAAO,GACT,CAAEA,MAAO,GACT,CAAEA,MAAO,GACT,CAAEA,MAAO,GACT,CAAEA,MAAO,IACT,CAAEA,MAAO,IACT,CAAEA,MAAO,KAGbyZ,EAAK+I,sBAAwB,CACzB,UAAW,OAAQ,YAAa,UAAW,sBAAuB,sBAAuB,uBAAwB,OAAQ,QAAS,WAGtI/I,EAAKgJ,aAAe,SAAUnuB,EAAQouB,EAAS5E,GAC3C,IAAIjP,EAA0Btd,EAAE,6BAA6BmxB,EAAQ/wB,SACrE,IAuBIgxB,EAAY,CAAEC,SAAUtuB,EAAO3C,MAEnCS,SAASsN,iBAJC,IAKNxE,WAAWwM,SAAW,YACtBib,GA3BmB,SAAUnT,GAC7Bd,uBAAuBc,EAASlb,OAAOsb,YAAY,EAAMf,GAEzDW,EAASlb,OAAOuuB,MAAQ,EACxBrT,EAASlb,OAAOwuB,YAAc,EAE9BtT,EAAWlT,GAAGqd,QAAQC,OAAOpK,GAG7B,IAAIlb,EAAS,IAAImb,OACjB9b,OAAOC,OAAOU,EAAQkb,EAASlb,QAC/BA,EAAOob,mBAAqBpT,GAAGC,YAAW,GAC1CiT,EAASlb,OAASA,EAClBkb,EAASG,aAAe,WACpBjB,uBAAuBpU,KAAKhG,OAAOsb,cAAc,EAAOf,GACxD6T,EAAQnT,QAAQ3B,OAAOtT,KAC3B,EAEAooB,EAAQnT,QAAQrZ,KAAKsZ,EACzB,GAUI,MACA,EACA,OACR,EAGAiK,EAAKtP,qBAAuB7N,GAAGC,YAAW,GAE1Ckd,EAAKsJ,qBAAuB,SAAUtsB,GAYlClF,EAAEkF,EAAEqN,SAAS9L,QAAQ,kBAAkBiI,IAAI,UAAW,SACtD1O,EAAEkF,EAAEqN,SAAS9L,QAAQ,kBAAkBiI,IAAI,UAAW,KACtD+iB,eAAeC,SAAS1xB,EAAEkF,EAAEqN,SAAS0M,SAAS,gBAb7B,SAAUpM,GACnBA,IACA3N,EAAEse,MAAM8K,iBAAiBzb,EAAI2Q,MAAMpjB,IACnC8E,EAAEse,MAAM+K,mBAAmB1b,EAAI2Q,MAAM5f,MACrC5D,EAAE,2BAA2B6sB,UAAU,YAAYnkB,OAE3D,IACe,SAAUmK,GAGzB,GAGoF3N,EAAEqN,QAAQ9L,QAAQ,eAAgB,QAC1H,EAEAyhB,EAAKyJ,oBAAsB,SAAUzsB,GACjCA,EAAEse,MAAM8K,iBAAiB,GACzBppB,EAAEse,MAAM+K,mBAAmB,KAC/B,EAEArG,EAAK0J,gBAAkB,SAAU1sB,GAC7B,IAAIqmB,EAAarmB,EAAEsX,UACnBtX,EAAEsX,QAAQtX,EAAEsX,UAAY,GACxB,IAAIqV,EAAmB9mB,GAAG+mB,kBACtB5J,EAAK/R,SAASe,gBAAgBnU,QAAO,SAAUC,GAAK,OAAOA,EAAE2V,cAAgBzT,EAAEyT,WAAa,IAAG1Y,OAAS,EACxG4xB,EAAmB3J,EAAK/R,SAASe,cAE5BgR,EAAK/R,SAASM,cAAc1T,QAAO,SAAUC,GAAK,OAAOA,EAAE2V,cAAgBzT,EAAEyT,WAAa,IAAG1Y,OAAS,IAC3G4xB,EAAmB3J,EAAK/R,SAASM,aAGrCoR,gBAAgB0D,EAAYsG,KAE5B,IAAIhV,EAAWgV,IAAmB/uB,QAClC+Z,EAASla,MAAK,SAAUC,EAAQC,GAAU,OAAOD,EAAE4Z,UAAY3Z,EAAE2Z,SAAW,IAC5EqV,EAAiBhV,EACrB,EACAqL,EAAK6J,gBAAkB,SAAU7sB,GAC7B,IAAIqmB,EAAarmB,EAAEsX,UACnBtX,EAAEsX,QAAQtX,EAAEsX,UAAY,GACxB,IAAIqV,EAAmB9mB,GAAG+mB,kBACtB5J,EAAK/R,SAASe,gBAAgBnU,QAAO,SAAUC,GAAK,OAAOA,EAAE2V,cAAgBzT,EAAEyT,WAAa,IAAG1Y,OAAS,EACxG4xB,EAAmB3J,EAAK/R,SAASe,cAE5BgR,EAAK/R,SAASM,cAAc1T,QAAO,SAAUC,GAAK,OAAOA,EAAE2V,cAAgBzT,EAAEyT,WAAa,IAAG1Y,OAAS,IAC3G4xB,EAAmB3J,EAAK/R,SAASM,aAGrCoR,gBAAgB0D,EAAYsG,KAE5B,IAAIhV,EAAWgV,IAAmB/uB,QAClC+Z,EAASla,MAAK,SAAUC,EAAQC,GAAU,OAAOD,EAAE4Z,UAAY3Z,EAAE2Z,SAAW,IAC5EqV,EAAiBhV,EACrB,EAEAqL,EAAK3G,uBAAyB,CAAA,EAC9B2G,EAAK8J,+BAAiC,CAClCxoB,YAAa,YACbtI,KAAM,MACNS,KAAM,SACN+D,OAAQ,OACR0K,KAAM,wBACN3G,QAAQvE,GACJgjB,EAAK3G,uBAAyBxW,GAAG8a,WAAW3gB,EAAEqN,QAAQ,IAAIuT,MAC9C9lB,EAAE,6BAA6B+mB,QAAQ,YAC7CtI,MACV,EAGR,CAEA,IAAImI,UAAY,SAAUjZ,EAAqBhM,EAAkB8D,EAAQ,KAChEkI,GAAuB,KAAZA,SAIH/F,IAATjG,IACAA,EAAO,WAGXjC,WAAW+N,GAAGC,OAAO,CACjBC,QAASA,EACThM,KAAMA,EACNiM,SAAU,CAAEC,GAAI,YAAaC,GAAI,YAAaC,OAAQ,CAAE/K,GAAI,GAAIgL,EAAG,KACnEvI,MAAOA,IAEf,EAEI+qB,kBAAoB,SAAUyB,GAC9BjyB,EAAE,6BAA8BiyB,GAAyB1kB,IAAI,oBAAoBC,GAAG,oBAAoB,WACpG,IAAI0G,EAAoBlU,EAAE,iBAAkBA,EAAE+I,OAC9CmL,EAAkBxF,IAAI,SAAU,SAChC,IAAIyF,EAAoBnU,EAAE,SAAU+I,MAAMkL,IAAI,GAAGI,wBAC7CC,EAAMH,EAAkBI,OAC5BD,GAAQJ,EAAkBM,cAAgBxU,EAAE,SAAU+I,MAAMyL,cAE5DN,EAAkBxF,IAAI,CAAEd,SAAY,QAAS6G,KAAYN,EAAkBM,KAAOzU,EAAE,SAAU+I,MAAMtD,QAAUyO,EAAkBzO,QAA3E,KAAyF6O,IAAO,GAAGA,OAC5J,IAEA,IAAI4d,EAAsB,SAAUC,GAChC,IAAIje,EAAoBlU,EAAE,sBAAuBA,EAAE+I,MAAMqL,UACzDF,EAAkBxF,IAAI,SAAU,GAAGyjB,OAC/BnyB,EAAE,gBAAiBkU,GAAmBjU,OAAS,GAC/CD,EAAE,cAAekU,GAAmBxF,IAAI,SAAcyjB,EAAiB,GAArB,MAGtD,IAAIhe,EAAoBnU,EAAE+I,MAAMqL,SAASH,IAAI,GAAGI,wBAC5CC,EAAMH,EAAkBI,OAC5BD,GAAQJ,EAAkBM,cAAgBxU,EAAE+I,MAAMqL,SAASI,cAE3DN,EAAkBxF,IAAI,CAAEd,SAAY,QAAS6G,KAAYN,EAAkBM,KAAOzU,EAAE+I,MAAMqL,SAAS3O,QAAUyO,EAAkBzO,QAA1E,KAAwF6O,IAAO,GAAGA,OAC3J,EAEoBtU,EAAE,wCAAyCiyB,GAClD/F,aAAa,UAC1BlsB,EAAE,wCAAyCiyB,GAAyB1kB,IAAI,kBAAkBC,GAAG,kBAAkB,WAC3G0kB,EAAoBE,KAAKrpB,KAAM,IACnC,GACJ,EAEI8f,mBAAqB,WACrB7oB,EAAE,aAAawS,MAAK,WAChB,IAAI9M,EAAS1F,EAAE,mBAAmB0F,SAAW,GAE7C1F,EAAE,sDAAuDA,EAAE+I,OAAOrD,OAAOA,EADlD,IAC8E,IACrG1F,EAAE,gDAAiDA,EAAE+I,OAAOrD,OAFrC,IAG3B,GACJ,EAEI2sB,sBAAwB,WACxB,IAAIC,EAAQtyB,EAAE,qBAAqBoV,MACnCpV,EAAE,qBAAqBif,SAAS,UAAUyF,KAAK,QAAmB,aAAV4N,EAAuB,SAAWA,EAC9F,EACIC,oBAAsB,WACtBF,uBACJ,EAEA,SAASG,4BACL,IAAIxtB,GAAoE,IAA3DhF,EAAE,mBAAoB,oBAAoBgC,KAAK,QAC5DhC,EAAE,sDAAuD,oBAAoB0O,IAAI,UAAW1J,EAAS,OAAS,SAC9GhF,EAAE,mBAAoB,oBAAoB0O,IAAI,QAAS1J,EAAS,OAAS,IACzEhF,EAAE,YAAa,oBAAoB0O,IAAI,QAAS1J,EAAS,oBAAsB,IAC/EhF,EAAE,mBAAoB,oBAAoBgC,KAAK,QAASgD,EAC5D,CAEA,IAAI2f,aAAyB,KACzBE,eAAgB,EAEhBvkB,GADJ2V,QAAU,GAEV,IAAI3U,MAAQ,SAAUmxB,EAAkBzK,EAAYC,EAAUyK,GAC1D3c,oBAAsB,CAClBgF,iBAAiBqO,eACjBrO,iBAAiBuO,kBACjBvO,iBAAiBwO,uBACjBxO,iBAAiByO,qBACjBzO,iBAAiB0O,0BACjB1O,iBAAiB4O,kBAGrB,IAAIgJ,EAAO,WACPlB,eAAenwB,OAAM,WACjBujB,gBAAgB6N,EAEhB/N,aAAe8N,EAEVzK,EAAW9P,oBACZ8P,EAAW9P,kBAAoB,IAEnC5X,GAAK,IAAIynB,kBAAkBC,EAAYC,GAEvCzO,iBAAiBlZ,IAGjByK,GAAG6nB,gBAAgBC,SAAStpB,QAAU,CAClCgH,YAAa,sBAGjB,IAAIuiB,EAAoB9yB,EAAE,oBAC1BM,GAAG8a,kBAAmB,EACtBrQ,GAAGiJ,cAAc1T,GAAIwyB,EAAkB,IACvCxyB,GAAG8a,kBAAmB,EACtBnD,iBACA6a,EAAkBpkB,IAAI,UAAW,SAEjC8hB,kBAAkBsC,GAClBjK,qBACAwJ,wBACAryB,EAAE,qBAAqBwN,GAAG,SAAU+kB,qBACpCvyB,EAAEwI,QAAQuqB,QAAO,WACblK,oBACJ,IAEAvoB,GAAG6V,SAAS+B,oBAAoBlP,SAAQ,SAAU8Q,GAC9C,IAAIwD,EAA0Btd,EAAE,6BAA6B8Z,EAAiB1Z,SAC9E0Z,EAAiBkE,UAAUhV,SAAQ,SAAUiV,GACzCd,uBAAuBc,EAASlb,OAAOsb,cAAc,EAAMf,EAC/D,GACJ,IAEA,IAAIgE,EAAQthB,EAAE,6BAA6B+mB,QAAQ,CAC/CiM,UAAU9tB,GACNmc,uBAAuBC,EAC3B,EACA7b,MAAO,IACPC,OAAQ,IACRutB,iBAAiB,EACjBC,aAAc,CACV,CACI5pB,OAAQ,WACRkK,QAAS,SACT5R,SAAU,QACV2H,QAAS,CACLrI,KAAM,QACNwC,KAAM,OACN+F,UACI6X,EAAM5Y,MACV,IAGR,CACIY,OAAQ,WACRkK,QAAS,SACT5R,SAAU,QACV2H,QAAS,CACLrI,KAAM,OACNwC,KAAM,OACN+F,UACI,GAAI8W,oBAAoBrH,eASpB,YARAxZ,WAAW+N,GAAGC,OAAO,CACjBC,QAAS,+CACTlI,MAAO,IACPmI,SAAU,CACNulB,GAAI,2BACJrlB,GAAI,kBAET,QAAS,KAIhB,IAAIsL,EAAamH,oBAAoBnH,aAErC,IAAKA,EAQD,YAPA1Z,WAAW+N,GAAGC,OAAO,CACjBC,QAAS,6CACTlI,MAAO,IACPmI,SAAU,CACNulB,GAAI,mCAET,UAAW,KAIlB,IACI9Z,EAAgB,GAEpB,GAHmBkH,oBAAoB1J,iBAGlBC,yBAAyBqN,QAC1C9K,EAAgBkH,oBAAoBlH,iBAE/BA,GAQD,YAPA3Z,WAAW+N,GAAGC,OAAO,CACjBC,QAAS,6CACTlI,MAAO,IACPmI,SAAU,CACNulB,GAAI,sCAET,UAAW,KAKtB,IAAIC,EAA0B,SAAU5T,GACpC,MAAMW,EAAUX,EAAQY,SAAShB,6BAEjC,IAAK,MAAM7L,KAAS4M,EAAS,CACzB,IAAIvc,EAAO2P,EAAMmE,OAAO9T,KAEpB6c,EAAa,IADKF,oBAAoBF,gBAAgB5b,MAAKzB,GAAKA,EAAE+V,cAAgBnV,IACjD+U,aACrC6G,EAAUA,EAAQ/B,QAAQlK,EAAM,GAAIkN,EACxC,CAEA,OAAOjB,CACX,EAEApG,EAAaga,EAAwBha,GACrCC,EAAgB+Z,EAAwB/Z,GAExCkH,oBAAoBhI,MAAMQ,YAAYwH,oBAAoB3c,QAC1D2c,oBAAoBhI,MAAM1B,aAAa0J,oBAAoB1J,gBAC3D0J,oBAAoBhI,MAAMsJ,gBAAgBtB,oBAAoBsB,mBAC9DtB,oBAAoBhI,MAAMa,WAAWA,GACrCmH,oBAAoBhI,MAAMc,cAAcA,GACxCiI,EAAM5Y,OACNuP,gBACJ,OAIb8O,QAAQ,YAEX/mB,EAAE,oBAAoBuN,IAAI,QAAS8lB,eAAeC,kBAAkB9lB,GAAG,QAAS6lB,eAAeC,iBACnG,GACJ,EAEIZ,EACAC,IAGAjU,kBAAkB6U,0BAAyB,WACvCZ,GACJ,GAER,EAEA,MAAO,CACHrxB,MAAOA,MACPkkB,YAAaA,YACbmB,yBAA0BA,yBAC1BgB,YAAaA,YACbtD,WAAYA,WACZyC,aAAcA,aACdiM,OAAQ,WACJlK,oBACJ,EACA2J,0BAA2BA,0BAC3BD,oBAAqBA,oBAE7B,CAztEqB,GA4tEhBzb,yBAYAqD,2BAMAoB,qBAQA8O,mCAIAG,8BAKAE,sCC9oEA8I,gBAOAC,qBDomEL,SAAK3c,GACDA,EAAA,IAAA,MACAA,EAAA,IAAA,MACAA,EAAA,IAAA,MACAA,EAAA,KAAA,OACAA,EAAA,SAAA,WACAA,EAAA,KAAA,OACAA,EAAA,MAAA,QACAA,EAAA,KAAA,OACAA,EAAA,MAAA,QACAA,EAAA,KAAA,MACH,CAXD,CAAKA,2BAAAA,yBAAwB,CAAA,IAY7B,SAAKqD,GACDA,EAAA,KAAA,OACAA,EAAA,MAAA,QACAA,EAAA,UAAA,YACAA,EAAA,oBAAA,qBACH,CALD,CAAKA,6BAAAA,2BAA0B,CAAA,IAM/B,SAAKoB,GACDA,EAAA,KAAA,OACAA,EAAA,OAAA,SACAA,EAAA,OAAA,SACAA,EAAA,KAAA,OACAA,EAAA,IAAA,MACAA,EAAA,KAAA,MACH,CAPD,CAAKA,uBAAAA,qBAAoB,CAAA,IAQzB,SAAK8O,GACDA,EAAA,MAAA,QACAA,EAAA,SAAA,UACH,CAHD,CAAKA,qCAAAA,mCAAkC,CAAA,IAIvC,SAAKG,GACDA,EAAA,KAAA,OACAA,EAAA,MAAA,QACAA,EAAA,WAAA,YACH,CAJD,CAAKA,gCAAAA,8BAA6B,CAAA,IAKlC,SAAKE,GACDA,EAAA,MAAA,QACAA,EAAA,OAAA,SACAA,EAAA,IAAA,KACH,CAJD,CAAKA,wCAAAA,sCAAqC,CAAA,IC7vE1C,MAAMgJ,MAiDFC,cACI5qB,KAAK3I,GAAK,EACV2I,KAAK6qB,WAAa,IAClB7qB,KAAK8qB,YAAa,EAClB9qB,KAAK+qB,YAAc,GACnB/qB,KAAKgrB,WAAa,GAClBhrB,KAAKirB,QAAUR,gBAAgBS,IAC/BlrB,KAAKmrB,SAAW,GAChBnrB,KAAKorB,YAAc,EACnBprB,KAAKqrB,MAAQ,EACbrrB,KAAKsrB,QAAU,GACftrB,KAAKmc,SAAW,EAEhBnc,KAAKsF,WAAa,EAClBtF,KAAK8L,aAAe,GACpB9L,KAAKurB,UAAY,EACjBvrB,KAAK2M,OAAS,EACd3M,KAAKwrB,SAAW,GAEhBxrB,KAAKyrB,gBAAkB,GACvBzrB,KAAK0rB,WAAa,EAClB1rB,KAAK2rB,WAAY,IAAInyB,MAAOoyB,cAC5B5rB,KAAK6rB,aAAe,KACpB7rB,KAAK8rB,WAAa,KAClB9rB,KAAKuoB,MAAQwD,mBAAmBC,SAChChsB,KAAKisB,gBAAkBvB,oBAAoBwB,IAC3ClsB,KAAKmsB,oBAAsB,EAE3BnsB,KAAKosB,eAAgB,EACrBpsB,KAAKqsB,cAAgB,GACrBrsB,KAAKssB,iBAAmB,GAExBtsB,KAAKusB,SAAW,QAChBvsB,KAAKwsB,cAAgB,GACrBxsB,KAAKysB,oBAAsB,GAC3BzsB,KAAK0sB,cAAgB,WACrB1sB,KAAK2sB,gBAAiB,EACtB3sB,KAAK4sB,cAAgB,KACrB5sB,KAAKsoB,UAAY,EACjBtoB,KAAKqJ,UAAY,EACjBrJ,KAAK6sB,YAAc,GACnB7sB,KAAK8sB,eAAiB,EACtB9sB,KAAK+sB,YAAc,GACnB/sB,KAAKgtB,cAAe,EACpBhtB,KAAKitB,GAAK,KACVjtB,KAAKktB,IAAM,KACXltB,KAAKmtB,cAAgB,CACzB,EAGJ,MAAMC,cAKFxC,cACI5qB,KAAK3I,GAAK,EACV2I,KAAKqrB,MAAQ,KACbrrB,KAAK2D,OAAS8mB,gBAAgBS,GAClC,GAGJ,SAAKT,GACDA,EAAA,aAAA,eACAA,EAAA,IAAA,MACAA,EAAA,KAAA,OACAA,EAAA,MAAA,QACAA,EAAA,IAAA,KACH,CAND,CAAKA,kBAAAA,gBAAe,CAAA,IAOpB,SAAKC,GACDA,EAAAA,EAAA,IAAA,GAAA,MACAA,EAAAA,EAAA,GAAA,GAAA,KACAA,EAAAA,EAAA,aAAA,GAAA,cACH,CAJD,CAAKA,sBAAAA,oBAAmB,CAAA,IAMxB,IAAI2C,eAAkB,WAElB,IAAIC,EAAmB,SAAUr0B,EAAMs0B,GAC/BA,EAAcZ,gBACdY,EAAcvC,WAAa,IAC3BuC,EAAclkB,UAAY,EAC1BkkB,EAAcV,YAAc,IAG5BU,EAAcX,cAAgB,EAG9BW,EAAchF,QAAUwD,mBAAmBC,WAC3CuB,EAAclC,MAAQ,GAGrBpyB,EAAKkC,oBACNoyB,EAAclkB,UAAY,EAC1BkkB,EAAcV,YAAc,IAG5BU,EAActB,kBAAoBvB,oBAAoBwB,MACtDqB,EAAcpB,oBAAsB,EAE5C,EAEIqB,EAAiB,SAAUC,EAAYC,GACvC,IAAK,IAAI1e,KAAYye,EACjB,QAA6B5uB,IAAzB4uB,EAAWze,GAAyB,CACpC,IAAI2e,EAAYF,EAAWze,GACvB4e,MAAMC,QAAQF,GACdD,EAAS1e,GAAY2e,EAEK,iBAAdA,EACZH,EAAeG,EAAWD,EAAS1e,IAAa,CAAA,GAGhD0e,EAAS1e,GAAY2e,CAE7B,CAER,EAEIG,EAAU,SAAU70B,EAAM80B,GAC1BA,EAAM12B,GAAK4B,EAAK5B,GAChB02B,EAAMhB,YAAc9zB,EAAK8zB,YACzBgB,EAAMlD,WAAa5xB,EAAK4xB,UAC5B,EAEIhN,EAAY,SAAUjZ,EAAqBhM,EAAkB8D,EAAQ,KAChEkI,GAAuB,KAAZA,SAIH/F,IAATjG,IACAA,EAAO,WAGXjC,WAAW+N,GAAGC,OAAO,CACjBC,QAASA,EACThM,KAAMA,EACNiM,SAAU,CAAEC,GAAI,YAAaC,GAAI,YAAaC,OAAQ,CAAE/K,GAAI,GAAIgL,EAAG,KACnEvI,MAAOA,IAEf,EAEA,SAASsxB,EAAaC,EAAyB12B,EAAI0B,GAC/C,IAAI2d,EAASjgB,WAAW+N,GAAGuB,OAAOC,QAAQ,mCAAoC+nB,EAAS/2B,OAAS,EAAI,IAAM,UAAY,WAmBlHg3B,EAAU,SAAUC,GAGpB,GAFaA,EAAKC,OAjBXnuB,SAAQ,SAAUouB,GACrB,IAAIC,EAAWr1B,EAAKm1B,OAAOp0B,QAAO,SAAU0L,GACxC,OAAOA,EAAMrO,KAAOg3B,EAAUh3B,EAClC,IACA,GAAwB,IAApBi3B,EAASp3B,OAAc,CACvB,IAAIq2B,EAAgBe,EAAS,GAC7Bd,EAAea,EAAWd,GAC1BD,EAAiBr0B,EAAMs0B,GAEnBh2B,EAAGg3B,gBAAkBh3B,EAAGg3B,eAAel3B,KAAOk2B,EAAcl2B,KAC5DE,EAAGg3B,aAAahB,GAChBh2B,EAAGi3B,gBAAgBjB,EAAchB,UAEzC,CACJ,IAKI4B,EAAKD,QAAS,CAC6B,IAAvBC,EAAKC,OAAOl3B,QAAsBi3B,EAAKC,OAAOp0B,QAAOC,GAAKA,EAAEmyB,gBAAel1B,SAAWi3B,EAAKC,OAAOl3B,OAElH2mB,EAAU,WAGVA,EAAU,4BAA6B,UAE/C,MAEIA,EAAUsQ,EAAKvpB,QAAS,QAEhC,EAEIqS,EAAQ,SAAUwX,EAAYC,GAC9B7Q,EAAU6Q,GAA4B,mCAAoC,QAC9E,EAEA9X,EAAOzQ,MAAK,SAAUC,GACdA,GACAtO,SAASsN,iBAAiB,KAAMxE,WAAWmtB,MAAQ,eAAgB,CAAEE,SAAUA,GAAYC,EAASjX,GAAO,EAAM,QAAQ,EAEjI,GACJ,CAEA,SAAS0X,EAAgBxyB,EAAGyyB,GAAW,GACnC,GAAIzyB,EAAEiE,UAAUyuB,iBAAkB,CAC9B,IAAIC,GAAY,EACZlqB,EAAU,GA6Bd,GA5BA9M,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWmtB,MAAQ,iBACnB,CACIgB,aAAc5yB,EAAEmL,IAAIrO,KAAK5B,GACzBiO,WAAYnJ,EAAEmL,IAAIrO,KAAKqM,aAE3B,SAAU0pB,GAGN,GAFAF,EAAYE,EAAad,QACzBtpB,EAAUoqB,EAAapqB,QACnBkqB,EAAW,CACXG,EAAc,CAACD,EAAajB,OAAQiB,EAAalsB,MAAM,GAEpC3G,EAAEiE,UAAU1G,gBACJw1B,QAEjBC,OAAOH,EAAajB,MAAM12B,GAAI23B,EAAajB,OAErD5xB,EAAEiE,UAAU6U,QAAU+Z,EAAa/Z,QACnC9Y,EAAEiE,UAAU0C,KAAOksB,EAAalsB,KAChC3G,EAAEiE,UAAUgvB,YAAcJ,EAAaI,YACvCjzB,EAAEiE,UAAUivB,QAAUL,EAAaK,OACvC,CACJ,GACA,MACA,EACA,QACA,OAAMxwB,OAAWA,GAAW,IAE3BiwB,EAED,YADAn4B,WAAW+N,GAAGuB,OAAOqpB,MAAM1qB,EAAS,oBAG5C,CAEA,IAAI2qB,EAAUpzB,EAAEiE,UAAU9B,OAAO,mBAC5BswB,GAyBDzyB,EAAEiE,UAAU9B,OAAO,eAAgB,SACnCnC,EAAEiE,UAAU9B,OAAO,0BAA0B,WACzCnC,EAAEiE,UAAU9B,OAAO,eAAgB,QACnCnC,EAAEiE,UAAU9B,OAAO,kBAAmBixB,EAC1C,MA5BApzB,EAAEiE,UAAUovB,iBACZrzB,EAAEiE,UAAU9B,OAAO,eAAgB,SACnCnC,EAAEiE,UAAU9B,OAAO,kBAAmBixB,GAEjCX,GACDzyB,EAAEiE,UAAUqvB,QAAQtzB,EAAEmL,IAAI/B,UAG9BpJ,EAAEiE,UAAU9B,OAAO,yBAAyB,WACxC,IAAIoxB,EAAYH,EAAQ7zB,MAAKi0B,GAAKA,EAAEj1B,MAAQyB,EAAEmL,IAAI5M,MAC9Cg1B,GACAr2B,OAAOu2B,KAAKF,EAAUz2B,MAAMgH,SAAQvF,IAChCyB,EAAEiE,UAAUyvB,UAAU1zB,EAAEmL,IAAI/B,SAAU7K,EAAKg1B,EAAUz2B,KAAKyB,GAAK,IAGvE60B,EAAQjpB,OAAOipB,EAAQrvB,QAAQwvB,GAAY,EAC/C,IAEAvzB,EAAEiE,UAAU9B,OAAO,0BAA0B,WACzCnC,EAAEiE,UAAU9B,OAAO,eAAgB,QACnCnC,EAAEiE,UAAU9B,OAAO,kBAAmBixB,EAC1C,IASR,CAEA,SAASO,IACL,OAAO74B,EAAE,wBAAwB8G,WAAW,WAChD,CAEA,SAASkxB,EAAcb,EAAsB2B,EAA0BC,GAAuB,GAC1F,IAAIC,GAAc,EAClB,IAAK,IAAI1gB,EAAI,EAAGA,EAAI6e,EAAOl3B,OAAQqY,IAAK,CACpC,IAAIwe,EAAQK,EAAO7e,GAGnB,UAFOwe,EAAMtC,gBAEO,IAAhBsC,EAAM1C,OAAe0E,IAChBA,EAAar0B,MAAKw0B,GAAKA,EAAE74B,KAAO02B,EAAM1C,QAAQ,CAC/C4E,GAAc,EACd,KACJ,CAGJ,GAAIlC,EAAMhB,YACN,IAAK,IAAIoD,EAAM,EAAGA,EAAMpC,EAAMhB,YAAY71B,OAAQi5B,IAC9C,IAAKJ,EAAar0B,MAAKw0B,GAAKA,EAAE74B,KAAO02B,EAAMhB,YAAYoD,GAAK9E,QAAQ,CAChE4E,GAAc,EACd,KACJ,CAGZ,CAEID,GAAeC,GACft5B,WAAW+N,GAAGC,OAAO,CACjBC,QAAS,6FACTC,SAAU,CACNC,GAAI,aACJC,GAAI,eAET,UAAW,IAGtB,CAEA,SAASqrB,EAAUn3B,GACf,IAAIo3B,EAAMC,EAAYC,EAElBC,EAAiB,SAAUC,EAAYrwB,GACvC,IAAIswB,EAAatwB,EAAU9B,OAAO,sBAC9B+H,EAAQjG,EAAU+E,iBAAiBurB,GAEvC,OADArqB,GAAmB,IAAXA,EAAe,EAAIA,EACpBjG,EAAUyvB,UAAUxpB,EAAOoqB,EACtC,EAQIvB,EAAQ,IAAIv4B,WAAWsC,KAAK03B,YAAY,CACxCj2B,IAAK,KACLkvB,KAAM,SAAUgH,GACZ,OAAO33B,EAAKm1B,MAChB,EACAyC,OAAQ,SAAUC,GACdxD,EAAiBr0B,EAAM63B,GAEvB,IAAIC,EAAI95B,EAAE+5B,WACN1nB,EAAM1I,WAAWmtB,MAAQ,YAQ7B,OAPAj2B,SAASsN,iBAAiB,KAAMkE,EAAKwnB,GAAQ,SAAU73B,GAEnD60B,EAAQ70B,EAAM63B,GACdC,EAAEE,QAAQH,EACd,GAAG,MAAM,EAAM,QAAQ,GACvB73B,EAAKm1B,OAAOxyB,KAAKk1B,GAEVC,EAAEG,SACb,EACA/B,OAAQ,SAAUz0B,EAAKo2B,GACnB,IAAIC,EAAI95B,EAAE+5B,WACN1nB,EAAM1I,WAAWmtB,MAAQ,YACzBO,EAAWr1B,EAAKm1B,OAAOp0B,QAAO,SAAU0L,EAAOW,EAAO8qB,GACtD,OAAOzrB,EAAMrO,KAAOqD,CACxB,IACA,GAAwB,IAApB4zB,EAASp3B,OAAc,CACvB,IAAIq2B,EAAgBe,EAAS,GAC7Bd,EAAesD,EAAQvD,GACvBD,EAAiBr0B,EAAMs0B,GAEnBt0B,EAAK41B,mBACDtB,EAAcf,eAAiBe,EAAcf,cAAct1B,OAAS,EACpEq2B,EAAcd,oBAAsBc,EAAcf,cAAcrzB,KAAIc,GAAK,IAAMA,EAAI,MAAKgtB,WAGxFsG,EAAcd,oBAAsB,IAI5C30B,SAASsN,iBAAiB,KAAMkE,EAAKikB,GAAe,SAAUt0B,GAC1D60B,EAAQ70B,EAAMs0B,EAClB,GAAG,MAAM,EAAM,QAAQ,GACvBh2B,EAAGg3B,aAAahB,GAChBh2B,EAAGi3B,gBAAgBjB,EAAchB,SACrC,CAGA,OADAwE,EAAEE,UACKF,EAAEG,SACb,EACA5d,OAAQ,SAAU5Y,GACd,IAAIq2B,EAAI95B,EAAE+5B,WAEN1nB,EAAM1I,WAAWmtB,MAAQ,cAC7Bj2B,SAASsN,iBAAiB,KAAMkE,EAAK,CAAEylB,aAAcr0B,GAAO,KAAM,MAAM,EAAM,QAAQ,GACtF,IAAI4zB,EAAWr1B,EAAKm1B,OAAOp0B,QAAO,SAAU0L,EAAOW,EAAO8qB,GACtD,OAAOzrB,EAAMrO,KAAOqD,CACxB,IAIA,OAHAzB,EAAKm1B,OAASE,EAEdyC,EAAEE,UACKF,EAAEG,SACb,IAGA3C,EAAevsB,GAAGC,WAAWhJ,EAAKm1B,OAAOl3B,OAAS,EAAI+B,EAAKm1B,OAAO,GAAK,MAEvEgD,EAAgB,SAAUpuB,GAC1B,IAAIutB,EAAa,CACb,CAAEl5B,GAAIozB,gBAAgB4G,aAAcx2B,KAAM,iBAC1C,CAAExD,GAAIozB,gBAAgBS,IAAKrwB,KAAM,OACjC,CAAExD,GAAIozB,gBAAgB6G,MAAOz2B,KAAM,SACnC,CAAExD,GAAIozB,gBAAgB8G,IAAK12B,KAAM,QASrC,OAPImI,GAAuB,cAAZA,IACXutB,EAAa,CACT,CAAEl5B,GAAIozB,gBAAgB4G,aAAcx2B,KAAM,iBAC1C,CAAExD,GAAIozB,gBAAgBS,IAAKrwB,KAAM,SAIlC01B,CACX,EAEIiB,EAAwB,SAAUzE,GAClC,MAAMvsB,EAAU,GAChB,QAAoB3B,IAAhBkuB,EACA,OAAOvsB,EAGX,IAAK,IAAI+O,EAAI,EAAGA,EAAIwd,EAAY71B,OAAQqY,GAAK,EACzC/O,EAAQ5E,KAAK61B,EAA6BliB,IAE9C,OAAO/O,CACX,EAEIixB,EAA+B,SAAUprB,GFu5FzC,IAAI7N,EAAIC,EEt5FR,IACIuK,EADAuM,EAAIlJ,EAEJqrB,EAAe5B,IACnB,GAAIvB,IAAexB,YAAYxd,GAAG8b,MAAO,CACrC,IAAItoB,GAAwC,QAAlCvK,GAACk5B,aAAY,EAAZA,EAAc5uB,QAAQ7J,aAAI,EAAJA,EAAM6J,aAAK,IAAAtK,OAAA,EAAAA,EAAEkD,MAAKzB,GAAKA,EAAE5C,KAAOk3B,IAAexB,YAAYxd,GAAG8b,UAAU,GACrGtoB,IACAC,EAAUD,EAAInK,KAEtB,CACA,MAAO,CACH+4B,SAAU,QACVC,SAAU,GACVC,QAAS,EACTj3B,MAAO,CACH,CACImJ,UAAW,eAAewL,WAC1B0K,MAAO,CACH9hB,KAAM,OAEV2I,SAAU,kCACV+wB,QAAS,EACTC,WAAY,cACZC,cAAe,CACXr1B,MAAO,IACPs1B,UAAWziB,EACX7J,MAAO6oB,IAAexB,YAAYxd,GAAG8b,MACrC/uB,YAA8C,QAAlC7D,GAACi5B,aAAY,EAAZA,EAAc5uB,QAAQ7J,aAAI,EAAJA,EAAM6J,aAAK,IAAArK,OAAA,EAAAA,EAAEuB,QAAO,SAAUC,GAAK,OAAOA,EAAE5C,GAAK,CAAG,MAAM,GAC7F4F,YAAa,OACbqd,UAAW,KACXC,eAAgB,SAAUpe,GACtB,IAAI61B,EAAY71B,EAAEiE,UAAU9B,OAAO,aACnC/G,EAAGg3B,eAAexB,YAAYiF,GAAW3G,MAAQlvB,EAAEuJ,MAEnDgsB,EAAe5B,IACf,IAAI/sB,EAAM2uB,EAAa5uB,KAAKpH,MAAKzB,GAAKA,EAAE5C,KAAO8E,EAAEuJ,QAC7C/B,EAASpM,EAAGg3B,eAAexB,YAAYiF,GAAWruB,OAClDsuB,EAAS5B,EAAK6B,UAAU,oBAAoBF,KAC/B,cAAbjvB,EAAInK,MAAyB+K,IAAW8mB,gBAAgB6G,OAAS3tB,IAAW8mB,gBAAgB8G,KACxFU,GACAA,EAAO3zB,OAAO,QAASmsB,gBAAgBS,KAI3C+G,GACAA,EAAO3zB,OAAO,aAAc8yB,EAAcruB,EAAInK,MAEtD,GAEJu5B,YAAY,EACZC,gBAAiB,CAAC,CAAEx5B,KAAM,cAE9B,CACImL,UAAW,eAAewL,YAC1B0K,MAAO,CACH9hB,KAAM,SACN2C,SAAS,GAEb+2B,QAAS,EACTh3B,KAAM,oBAAoB0U,IAC1BuiB,WAAY,cACZC,cAAe,CACXr1B,MAAO,IACPs1B,UAAWziB,EACX7J,MAAO6oB,IAAexB,YAAYxd,GAAG5L,OACrCrH,WAAY80B,EAAcpuB,GAC1B/F,YAAa,OACbqd,UAAW,KACXC,eAAgB,SAAUpe,GACtB,IAAI61B,EAAY71B,EAAEiE,UAAU9B,OAAO,aACnC/G,EAAGg3B,eAAexB,YAAYiF,GAAWruB,OAASxH,EAAEuJ,KACxD,EACAlJ,aAAc,SAAUvD,GACpB,IAAIiK,EAAQ,GAMZ,OALKnI,WAAWC,YAAYq3B,kBAAqBp5B,EAAK5B,KAAOozB,gBAAgB4G,cAAgBp4B,EAAK5B,KAAOozB,gBAAgBS,OACpHnwB,WAAWC,YAAYs3B,kBAAqBr5B,EAAK5B,KAAOozB,gBAAgB6G,OAASr4B,EAAK5B,KAAOozB,gBAAgB8G,OAC9GruB,EAAQ,mBAGL,eAAeA,MAAUjK,EAAK4B,YACzC,GAGJu3B,gBAAiB,CAAC,CAAEx5B,KAAM,cAE9B,CACIi5B,QAAS,EACTF,SAAU,SACVY,cAAe,CACXp6B,KAAM,IACNuI,QAAS,WACLnJ,EAAGg3B,eAAexB,YAAYzmB,OAAOiJ,EAAG,GACxC8gB,EAAKmC,WAAW,uCAAwC,QAAShB,EAAsBj6B,EAAGg3B,eAAexB,cACzG,IAAI2E,EAAe5B,IACnB4B,EAAa7B,UAAU6B,EAAavsB,iBAAiB5N,EAAGg3B,eAAel3B,IAAK,cAAeE,EAAGg3B,eAAexB,YACjH,KAKpB,EAEI0F,GAAgB,EAChBC,GAAS,EACTn7B,EAAK,CAEL62B,OAAQn1B,EAAKm1B,OACbgB,YAAan2B,EAAKm2B,YAClBb,aAAcA,EACdC,gBAAiBxsB,GAAGC,WAAWhJ,EAAKm1B,OAAOl3B,OAAS,EAAI+B,EAAKm1B,OAAO,GAAG7B,SAAW,IAClFoG,mBAAoB3wB,GAAGC,aAAWhJ,EAAK6J,MAAO7J,EAAK6J,KAAK9I,QAAO,SAAUC,GAAK,OAAOA,EAAE5C,GAAK,CAAG,IAAGH,OAAS,GAC3G07B,gBAAiB,CACbtwB,aAAc,CACVxH,UAAS7B,EAAK41B,kBAElBlyB,OAAQ,IACRL,WAAY4yB,EACZvmB,iBAAiB,EACjBC,cAAc,EACdvG,uBAAuB,EACvBwwB,UAAW,CACPnwB,KAAMzJ,EAAK41B,iBAAmB,WAAa,OAC3CiE,mBAAoB,UAExBvrB,YAAa,CACTzM,QAAS7B,EAAK41B,iBACdrnB,YAAa,YACbC,0BAA0B,GAE9BE,OAAQ,CACJnF,SAAS,GAEbsB,QAAS,CACL,CAAEC,UAAW,sBAAuBjJ,SAAS,GAC7C,CACIiJ,UAAW,KACXjJ,SAAS,GAEb,CACIiJ,UAAW,eACXyC,QAAS,WACT1L,UAAS7B,EAAK41B,kBAElB,CACI9qB,UAAW,aACXyC,QAAS,aACT4rB,gBAAiB,CAAC,CACdx5B,KAAM,SACNm6B,mBAAoB,SAAUC,GAC1B,QAAIA,EAAE/5B,KAAK0zB,qBAIK9tB,IAAZm0B,EAAEttB,OAAmC,OAAZstB,EAAEttB,OAIR,KAAnBstB,EAAEttB,MAAMuK,MAKhB,EACArL,QAAS,4BAGjB,CACIb,UAAW,KACXyC,QAAS,KACT1L,SAAS,GAEb,CACIiJ,UAAW,MACXyC,QAAS,MACT1L,SAAS,GAEb,CACI0L,QAAS,eACTzC,UAAW,gBACXkvB,OAAQ,CACJ32B,WAAYrD,EAAKi6B,aACjBj2B,YAAa,OACbqd,UAAW,MAEfxf,SAAS,EACTs3B,gBAAiB,CAAC,CACdx5B,KAAM,SACNm6B,mBAAoB,SAAUC,GAC1B,OAAKA,EAAE/5B,KAAK0zB,qBAII9tB,IAAZm0B,EAAEttB,OAAmC,OAAZstB,EAAEttB,OAA8B,IAAZstB,EAAEttB,KAKvD,EACAd,QAAS,8BAGjB,CACIb,UAAW,cACXyC,QAAS,UACT4rB,gBAAiB,CAAC,CAAEx5B,KAAM,cAE9B,CACImL,UAAW,WACXyC,QAAS,QAEb,CACIzC,UAAW,SACXyC,QAAS,OACT9J,MAAO,IACPu2B,OAAQ,CACJ32B,WAAY,GACZW,YAAa,OACbqd,UAAW,MAEf8X,gBAAiB,CAAC,CAAEx5B,KAAM,aAC1Bu6B,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,GAElC,MACMkF,EADYklB,IACKV,YAAY1zB,MAAKzB,GAAKA,EAAE5C,KAAOqO,IACtD0tB,EAAQ5H,SAAW5gB,aAAI,EAAJA,EAAM/P,IAC7B,EACAC,SAAS,GAEb,CACIiJ,UAAW,QACXyC,QAAS,QACT9J,MAAO,GACPu2B,OAAQ,CACJ32B,WAAY,CACR,CAAEjF,GAAI00B,mBAAmBC,SAAUnxB,KAAM,YACzC,CAAExD,GAAI00B,mBAAmBuH,OAAQz4B,KAAM,UACvC,CAAExD,GAAI00B,mBAAmBwH,UAAW14B,KAAM,cAE9CoC,YAAa,OACbqd,UAAW,MAEf8X,gBAAiB,CAAC,CAAEx5B,KAAM,cAE9B,CACImL,UAAW,kBACXyC,QAAS,oBACT9J,MAAO,GACPu2B,OAAQ,CACJ32B,WAAY,CAAC,CAAEjF,GAAI,EAAGwD,KAAM,OAAS,CAAExD,GAAI,EAAGwD,KAAM,MAAQ,CAAExD,GAAI,EAAGwD,KAAM,iBAC3EoC,YAAa,OACbqd,UAAW,MAEf6Y,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,EACtC,EACA5K,SAAS,GAEb,CACIiJ,UAAW,sBACXyC,QAAS,SACT1L,SAAS,EACTm4B,OAAQ,CACJ32B,WAAY,GACZW,YAAa,OACbqd,UAAW,MAEf6Y,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,EACtC,EACA0sB,gBAAiB,CAAC,CAAEx5B,KAAM,YAAc,CACpCA,KAAM,SACNm6B,mBAAoB,SAAUC,GAC1B,OAAIA,EAAE/5B,KAAKgzB,kBAAoBvB,oBAAoBwB,KAAO8G,EAAE/5B,KAAKsvB,QAAUwD,mBAAmBwH,gBAI9E10B,IAAZm0B,EAAEttB,OAAmC,OAAZstB,EAAEttB,OAA8B,IAAZstB,EAAEttB,KAKvD,EACAd,QAAS,wBAGjB,CACIb,UAAW,mBACXyC,QAAS,oBACT1L,SAAS,EACTq4B,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,EACtC,EACA0sB,gBAAiB,CAAC,CACdx5B,KAAM,SACNm6B,mBAAoB,SAAUC,GAC1B,OAAIA,EAAE/5B,KAAKgzB,kBAAoBvB,oBAAoB8I,mBAInC30B,IAAZm0B,EAAEttB,OAAmC,OAAZstB,EAAEttB,OAIR,KAAnBstB,EAAEttB,MAAMuK,MAKhB,EACArL,QAAS,mCAGjB,CACIb,UAAW,gBACXyC,QAAS,eACTysB,OAAQ,CACJ32B,WAAWkE,IACA,CACH0uB,MAAOj2B,EAAKw6B,cAAgB,GAC5Bz5B,OAAQf,EAAKkC,mBAAqBqF,EAAQvH,KACtC,CACI,CAAC,YAAa,IAAKuH,EAAQvH,KAAKoQ,WAChC,KACA,CAAC,CAAC,YAAa,IAAK,GAAI,MAAO,CAAC,iBAAkB,IAAK,IACvD,KACA,CAAC,CAAC,YAAa,IAAK,GAAI,MAAO,CAAC,iBAAkB,IAAK7I,EAAQvH,KAAK6zB,iBACpE,KACA,CAAC,KAAM,IAAK,IACZ,OAGhB7vB,YAAa,OACbqd,UAAW,MAEfxf,SAAS,EACTq4B,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,EACtC,GAEJ,CACI3B,UAAW,UACXyC,QAAS,SACT9J,MAAO,GACPu2B,OAAQ,CACJ32B,WAAY,CACR,CAAEjF,GAAIozB,gBAAgB4G,aAAcx2B,KAAM,iBAC1C,CAAExD,GAAIozB,gBAAgBS,IAAKrwB,KAAM,OAEjC,CAAExD,GAAIozB,gBAAgB6G,MAAOz2B,KAAM,SACnC,CAAExD,GAAIozB,gBAAgB8G,IAAK12B,KAAM,QACrCoC,YAAa,OACbqd,UAAW,MAEf6Y,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,EACtC,EACA0sB,gBAAiB,CAAC,CAAEx5B,KAAM,cAE9B,CACImL,UAAW,UACXyC,QAAS,OAEb,CACIzC,UAAW,QACXyC,QAAS,MACT9J,MAAO,IACPu2B,OAAQ,CACJ32B,WAAY,GACZW,YAAa,OACbqd,UAAW,MAEf6Y,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,GAElC,IAAItF,EAAY0vB,IAChB,MAAM/sB,EAAM3C,EAAU0C,KAAKpH,MAAKzB,GAAKA,EAAE5C,KAAO+7B,EAAQ/H,QAEhC,IAAlB+H,EAAQ/H,MACR+H,EAAQ7K,MAAQwD,mBAAmBC,SAEnCoH,EAAQ7K,MAAqB,cAAbxlB,EAAInK,KAAuBmzB,mBAAmBwH,UAAYxH,mBAAmBuH,OAGjGF,EAAQ9H,QAAUvoB,aAAG,EAAHA,EAAKlI,KAEvB,IAAIowB,EAAUuF,EAAe,UAAWpwB,GACpCgzB,EAAQ7K,QAAUwD,mBAAmBuH,QAAWrI,IAAYR,gBAAgB6G,OAASrG,IAAYR,gBAAgB8G,MACjH6B,EAAQnI,QAAUR,gBAAgBS,KAGtCkI,EAAQjH,oBAAsB,CAClC,EACArxB,SAAS,GAEb,CAAEiJ,UAAW,WAAYjJ,SAAS,GAClC,CACIiJ,UAAW,WACXjJ,SAAS,EACTq4B,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,GAClC0tB,EAAQ5G,cAAgB,EAC5B,GAEJ,CACIzoB,UAAW,gBAAiBjJ,SAAS,EAAOs3B,gBAAiB,CAAC,CAC1Dx5B,KAAM,SACNm6B,mBAAoB,SAAUC,GAC1B,MAAwB,UAApBA,EAAE/5B,KAAKszB,UAA2C,IAAnByG,EAAEttB,MAAMxO,MAI/C,EACA0N,QAAS,gCAGjB,CAAEb,UAAW,gBAAiBjJ,SAAS,GACvC,CACIiJ,UAAW,iBACXjJ,SAAS,EACTg3B,WAAY,WACZqB,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,EACtC,GAEJ,CACI3B,UAAW,WACXyC,QAAS,SACT1L,SAAS,EACTm4B,OAAQ,CACJ32B,WAAY,GACZW,YAAa,OACbqd,UAAW,MAEf8X,gBAAiB,CAAC,CACdx5B,KAAM,SACNm6B,mBAAoB,SAAUC,GAC1B,OAAKA,EAAE/5B,KAAK0zB,qBAII9tB,IAAZm0B,EAAEttB,OAAmC,OAAZstB,EAAEttB,KAKnC,EACAd,QAAS,uBAEbuuB,aAAc,SAAUC,EAAS1tB,GAC7B1F,KAAKqzB,oBAAoBD,EAAS1tB,EACtC,GAEJ,CACI3B,UAAW,cACXyC,QAAS,WAEb,CACIzC,UAAW,YACXyC,QAAS,UACT1L,SAAS,EACTm4B,OAAQ,CACJ32B,WAAY,GACZW,YAAa,OACbqd,UAAW,MAEf6Y,aAAc,SAAUC,EAAS1tB,GAE7B,GADA1F,KAAKqzB,oBAAoBD,EAAS1tB,GAC9BzM,EAAKkC,kBAAmB,CACxB,IAAID,EAAUjC,EAAKy6B,UAAUh4B,MAAKzB,GAAKA,EAAE5C,KAAO+7B,EAAQ/pB,YACxD+pB,EAAQvG,YAAc3xB,aAAO,EAAPA,EAASL,KAG0C,IADzD5B,EAAKy6B,UAAU15B,QAAO,SAAUC,GAAK,OAAOA,EAAE05B,MAAM1b,SAASvS,EAAQ,IACvE1L,QAAO,SAAUC,GAAK,OAAOA,EAAE5C,KAAOqO,CAAO,IAAGxO,SAC1Dk8B,EAAQjG,cAAgB,EAEhC,CACJ,GAEJ,CACIppB,UAAW,eACXyC,QAAS,iCACTC,SAAU,UACV3L,SAAS,EACTg3B,WAAY,YAEhB,CACI/tB,UAAW,aACXyC,QAAS,UACTC,SAAU,UACV3L,SAAS,EACTg3B,WAAY,YAEhB,CACI/tB,UAAW,cACXjJ,SAAS,GAEb,CACIlC,KAAM,UACNwO,QAAS,CAAC,CAAEvM,KAAM,UAAY,CAC1BwM,KAAM,OACN1M,KAAM,OACN+F,QAAS,SAAUvE,GACfwyB,EAAgBxyB,EACpB,GACD,CACCkL,KAAM,OACN1M,KAAM,OACN+F,QAAS,SAAUvE,GACfy3B,UAAUC,KAAK13B,EAAEmL,IAAI5M,IACzB,EACAI,WAAS7B,EAAK41B,mBAAoB51B,EAAK66B,qBACxC,CACCzsB,KAAM,WAEN1M,KAAM,qBACN+F,QAAS,SAAUvE,GACf6xB,EAAa,CAAC7xB,EAAEmL,IAAI5M,KAAMnD,EAAI0B,EAClC,MAMZ4P,aAAa,EACbhB,QAAS,CACLnF,KAAM,OACNqxB,eAAe,EACfC,eAAe,EACfC,aAAah7B,EAAK41B,iBAClBqF,UAAU,EACV7D,KAAM,CACF8D,4BAA4B,EAC5BC,cAAe,SAAUj4B,GACrBk0B,EAAOl0B,EAAEiE,SACb,EACAmJ,eAAgB,SAAUpN,GACtBk0B,EAAKmC,WAAW,uCAAwC,QAAShB,EAAsBj6B,EAAGg3B,eAAexB,cAEzG,IAAIsH,EAAYp9B,EAAE,iCAAkCkF,EAAEqN,SAAS7D,IAAI,UAAW,gBAAgBA,IAAI,cAAe,QAC7G2uB,EAAkBr9B,EAAE,0DAA2DkF,EAAEqN,SACrF6qB,EAAUE,YAAYD,EAC1B,EACAE,cAAe,SAAUv2B,GACrB,GAAsB,iBAAlBA,EAAK8F,UAA8B,CACnC,IAAI0wB,EAA2D,UAA/CjE,EAAe,WAAYxwB,KAAKI,WAChDnC,EAAKnD,QAAU25B,CACnB,CAEA,GAAsB,iBAAlBx2B,EAAK8F,UAA8B,CACnC,IAAI0wB,EAAYjE,EAAe,iBAAkBxwB,KAAKI,WACtDnC,EAAKnD,QAAU25B,CACnB,CAEA,GAAsB,YAAlBx2B,EAAK8F,UAAyB,CAC9B,IAAI0wB,EAAYjE,EAAe,iBAAkBxwB,KAAKI,WACtDnC,EAAKnD,QAAU25B,CACnB,CAEA,GAAuB,cAAnBx2B,EAAK8F,UAA2B,CAChC,IAAI0wB,EAAYx7B,EAAKkC,oBAAsBq1B,EAAe,iBAAkBxwB,KAAKI,WACjFnC,EAAKnD,QAAU25B,CACnB,CAEA,GAAuB,oBAAnBx2B,EAAK8F,UAAiC,CACtC,MAAMwkB,EAAQiI,EAAe,QAASxwB,KAAKI,WAC3C,IAAIs0B,EAAanM,IAAUwD,mBAAmBuH,QAAU/K,IAAUwD,mBAAmBwH,UACrFt1B,EAAK1C,SAAWm5B,CACpB,CAEA,GAAuB,qBAAnBz2B,EAAK8F,UAAkC,CACvC,MAAMwkB,EAAQiI,EAAe,QAASxwB,KAAKI,WAC3C,IAAIq0B,GAAalM,IAAUwD,mBAAmBuH,QAAU/K,IAAUwD,mBAAmBwH,YAAc/C,EAAe,kBAAmBxwB,KAAKI,aAAesqB,oBAAoB8I,aAC7Kv1B,EAAKnD,QAAU25B,CACnB,CAEA,GAAuB,wBAAnBx2B,EAAK8F,UAAqC,CAE1C,IAAI0wB,EADUjE,EAAe,QAASxwB,KAAKI,aACjB2rB,mBAAmBwH,WAAa/C,EAAe,kBAAmBxwB,KAAKI,aAAesqB,oBAAoBwB,IACpIjuB,EAAKnD,QAAU25B,CACnB,CAEA,GAAsB,cAAlBx2B,EAAK8F,UAA2B,CAChC,IAAI0wB,GAAajE,EAAe,iBAAkBxwB,KAAKI,WACvDnC,EAAKnD,QAAU25B,CACnB,CAEA,GAAuB,kBAAnBx2B,EAAK8F,UAA+B,CACpC,MAAMJ,EAAS6sB,EAAe,UAAWxwB,KAAKI,WAC9C,IAAIq0B,EAAY9wB,IAAW8mB,gBAAgB4G,cAAgB1tB,IAAW8mB,gBAAgBS,IACtFjtB,EAAKnD,QAAU25B,CACnB,CAEA,GAAsB,gBAAlBx2B,EAAK8F,UAA6B,CAClC,IAAI4wB,EAAYnE,EAAe,QAASxwB,KAAKI,WAEzCu0B,EADAA,IAAc5I,mBAAmBC,SACrB,WAEP2I,IAAc5I,mBAAmBwH,UAC1B,YAGA,SAEhBt1B,EAAKgc,MAAM9hB,KAAO,QAAQw8B,cAC1B,IAAIF,EAAYjE,EAAe,UAAWxwB,KAAKI,WAC/CnC,EAAKnD,QAAwB,SAAd25B,CACnB,CACJ,EACA75B,MAAO,CACH,CACI+2B,SAAU,QACVC,SAAU,EACVC,QAAS,EACTj3B,MAAO,CAAC,SACJ,CACImJ,UAAW,kBAEf,CACIA,UAAW,aACX8tB,QAAS,GAEb,CACIrrB,QAAS,KACTzC,UAAW,MAEf,CACIyC,QAAS,MACTzC,UAAW,OAEf,CACIyC,QAAS,eACTzC,UAAW,gBACX8tB,QAAS,GAEb,CACI9tB,UAAW,WACX8tB,QAAS,GAEb,CACI9tB,UAAW,YACX8tB,QAAS,EACT/2B,QAAS7B,EAAKkC,mBAElB,QAAS,CAAE4I,UAAW,QAASxI,UAAU,EAAMT,SAAS,GACxD,CAAE0L,QAAS,oBAAqBzC,UAAW,mBAAqB,sBAChE,CACIA,UAAW,mBACXyC,QAAS,qBACV,kBAER,CACCmrB,SAAU,QACVC,SAAU,EACVC,QAAS,EACTrrB,QAAS,QACT5L,MAAO,CAAC,CACAmJ,UAAW,cACXkW,MAAO,CACH7e,SAAU,CAACnC,EAAMuQ,KACb,MAAMwB,EAAW8kB,IACXnD,EAAiB3hB,EAAS6kB,UAAU7kB,EAAS7F,iBAAiB5N,EAAGg3B,eAAel3B,IAAK,kBACrFu9B,EAAY5pB,EAAS6kB,UAAU7kB,EAAS7F,iBAAiB5N,EAAGg3B,eAAel3B,IAAK,YAAc,EAC9Fw9B,EAAWlI,GAAkBiI,EAAY,+EAAiF,GAGhIprB,EAAQjF,OAAO,qCAA0CswB,WAEzD59B,EAAE,SAAS69B,UAAU,CACjB5rB,OAAQ,cACRwa,UAAW,aACXC,UAAW,aACXoR,gBAAgBC,GACZA,EAAKr3B,KAAK,qJACd,IACDs3B,SAASzrB,GAEZvS,EAAE,cAAeuS,GAASE,OAAM,WAC5B,IAAIqhB,EAAc/f,EAAS6kB,UAAU7kB,EAAS7F,iBAAiB5N,EAAGg3B,eAAel3B,IAAK,eAClF0zB,IACAA,GAAe,wBAEnB/f,EAAS6kB,UAAU7kB,EAAS7F,iBAAiB5N,EAAGg3B,eAAel3B,IAAK,cAAe0zB,EACvF,GAAE,IAId,UAAW,CACPhnB,UAAW,WACX+tB,WAAY,aACZD,QAAS,EACTE,cAAe,CACXp1B,OAAQ,QAKxB,CACIg1B,SAAU,QACVC,SAAU,EACVC,QAAS,EACTj3B,MAAO,CAAC,CACJmJ,UAAW,eACX+tB,WAAY,cAGpB,CACIH,SAAU,QACVnrB,QAAS,cACT1F,SAAU,kCACVjG,KAAM,wBACN+2B,SAAU,EACVC,QAAS,EACTj3B,MAAO,CACH,CACIi3B,QAAS,EACT/wB,SAAU,gCACVgxB,WAAY,WACZC,cAAe,CACXp3B,KAAM,MACNxC,KAAM,MACNuI,eAC0C7B,IAAlCtH,EAAGg3B,eAAexB,cAClBx1B,EAAGg3B,eAAexB,YAAc,IAEpCx1B,EAAGg3B,eAAexB,YAAYnxB,KAAK,IAAIwxB,eACvCiD,EAAKmC,WAAW,uCAAwC,QAAShB,EAAsBj6B,EAAGg3B,eAAexB,cACzG,IAAI2E,EAAe5B,IACnB4B,EAAa7B,UAAU6B,EAAavsB,iBAAiB5N,EAAGg3B,eAAel3B,IAAK,cAAeE,EAAGg3B,eAAexB,YACjH,IAGR,CACI4E,SAAU,QACV92B,KAAM,iBACNg3B,QAAS,EACTD,SAAU,EACVh3B,MAAO42B,EAAsBjD,IAAiBA,IAAexB,YAAc,OAEpF,CACC4E,SAAU,QACVC,SAAU,EACVC,QAAS,EACTrrB,QAAS,mBACT3L,KAAM,kBACND,MAAO,CACH,CACImJ,UAAW,WACX+tB,WAAY,cACZD,QAAS,EACTE,cAAe,CACXn3B,MAAO,CAAC,QAAS,SAAU,aAGnC,CACImJ,UAAW,gBACX+tB,WAAY,YACZD,QAAS,EACTE,cAAe,CACXn5B,KAAM,OACNs8B,iBAAiB,EACjBC,oBAAoB,EACpBC,cAAe,UAGvB,CACIzD,SAAU,QACVC,SAAU,EACVC,QAAS,EACTh3B,KAAM,sBACND,MAAO,CACH,CACIqf,MAAO,CAAE9hB,KAAM,QACf4L,UAAW,gBACX+tB,WAAY,WACZD,QAAS,EACTE,cAAe,CACX7Y,eAAe,EACfmc,uBAAuB,EACvB/4B,WAAY,CAAC,CAAEg5B,GAAI,EAAGC,KAAM,UAAY,CAAED,GAAI,EAAGC,KAAM,UAAY,CAAED,GAAI,EAAGC,KAAM,WAAa,CAAED,GAAI,EAAGC,KAAM,aAAe,CAAED,GAAI,EAAGC,KAAM,YAAc,CAAED,GAAI,EAAGC,KAAM,UAAY,CAAED,GAAI,EAAGC,KAAM,aACpMt4B,YAAa,OACbqd,UAAW,KACXkb,SAAU,SAAUr5B,GAChB,GAAIs2B,EAAiB,OAErB,IAAItB,EAAMh1B,EAAEiE,UAAU9B,OAAO,SAI7B,GAFAm0B,GAAgB,EAEZtB,EAAIj6B,OAAS,EAAG,CAChB,IAAIu+B,EAAStE,EAAIv3B,MAAK,CAAC87B,EAAIC,IAAOD,EAAKC,IACnC5H,EAAQQ,IACRmD,EAAe5B,IACfvqB,EAAWmsB,EAAavsB,iBAAiB4oB,EAAM12B,IAEnD8E,EAAEiE,UAAU9B,OAAO,SAAU,IAC7BnC,EAAEiE,UAAU9B,OAAO,SAAUm3B,GAE7B/D,EAAa7B,UAAUtqB,EAAU,gBAAiBkwB,GAElDt5B,EAAEiE,UAAUw1B,SAChB,CAEAnD,GAAgB,CACpB,MAKhB,iBAKhBla,MAAO,CACHgR,MAAOtwB,EAAK41B,iBAAmB,oBAAsB,mBACrDgH,WAAW,EACXn5B,MAAO,IACPC,OAAQ,MAGhBm5B,mBAAmB,EACnBv5B,QAAS,KACTw5B,gBAAiB,EAEjBtrB,QAAUxR,EAAK41B,iBAA+B,CAC1Cj0B,MAAO,CACH,cACA,CACI/B,SAAU,QACV0H,OAAQ,WACRC,QAAS,CACL6G,KAAM,UACN1M,KAAM,SACNE,KAAM,SACN6F,QAAS,SAAUvE,GACf,IAAI65B,EAAe/+B,EAAE,0BAA0BgC,KAAK,WAEhDg9B,EAAW,CAAA,EACVD,IACDC,EAAW,CACPC,iBAAkB,CACdC,WAAW,EACXf,cAAen8B,EAAK2K,WACpB8B,MAAO,CAACzM,EAAKm9B,UAAWn9B,EAAKo9B,SAC7Bnc,UAAW,SACXoc,iBAAiB,EACjBpB,iBAAiB,GAErBqB,iBAAkB,CACd7wB,MAAOzM,EAAKu9B,UACZ59B,KAAM,OACNs8B,iBAAiB,EACjBC,oBAAoB,EACpBC,cAAe,QACfkB,iBAAiB,EACjB/b,eAAgB,SAAUpe,GACtB,IAAIs6B,EAAUx/B,EAAE,iCAAiCy/B,UAAU,YACvDC,EAAUF,EAAQn4B,OAAO,SACzBnC,EAAEuJ,MAAQixB,GACVF,EAAQn4B,OAAO,QAASnC,EAAEuJ,MAElC,GAEJkxB,eAAgB,CACZlxB,MAAOzM,EAAK09B,QACZ/9B,KAAM,OACNs8B,iBAAiB,EACjBC,oBAAoB,EACpBC,cAAe,QACfkB,iBAAiB,EACjB/b,eAAgB,SAAUpe,GACtB,IAAIs6B,EAAUx/B,EAAE,kCAAkCy/B,UAAU,YACxDF,EAAYC,EAAQn4B,OAAO,SAC3BnC,EAAEuJ,MAAQ8wB,GACVC,EAAQn4B,OAAO,QAASnC,EAAEuJ,MAElC,GAEJmxB,aAAc,CACV1+B,KAAM,QACNwC,KAAM,SACN+F,UACI,IAAIo2B,EAAO7/B,EAAE,+BAA+B8/B,eAAe,YAAYz4B,OAAO,SAC9E,IAAI04B,EAAgB,CAChBZ,UAAWU,GAAQA,EAAK5/B,OAAS,EAAI4/B,EAAK,QAAKj4B,EAC/Cw3B,QAASS,GAAQA,EAAK5/B,OAAS,EAAI4/B,EAAK,GAAKA,GAAQA,EAAK5/B,OAAS,EAAI4/B,EAAK,QAAKj4B,EACjF23B,UAAWv/B,EAAE,kCAAkCy/B,UAAU,YAAYp4B,OAAO,SAC5Eq4B,QAAS1/B,EAAE,iCAAiCy/B,UAAU,YAAYp4B,OAAO,UAG7E,GAAI04B,EAAcZ,YAAcY,EAAcX,UAAYW,EAAcZ,WAAaY,EAAcX,SAC/FW,EAAcR,YAAcQ,EAAcL,UAAYK,EAAcR,WAAaQ,EAAcL,QAG/F,YADAhgC,WAAW+N,GAAGuB,OAAOqpB,MAAM,yHAA0H,qBAIzJ,IAAI2H,EAAc,KAClB,MAAMC,EAAgBpH,IACtB,GAAIkH,EAAcZ,WAAaY,EAAcX,QAAS,CAClD,IAAIc,EAAa,GACbC,EAAc,GACdC,EAAe,GACfC,EAAgB,GACpB,IAAK,IAAIvG,EAAI,IAAIv3B,KAAKw9B,EAAcZ,WAAYrF,GAAKiG,EAAcX,QAAStF,EAAEwG,QAAQxG,EAAEyG,UAAY,GAAI,CACpG,IAAIn2B,EAAO,IAAI7H,KAAKu3B,IAC2B,IAA3CoG,EAAWj3B,QAAQmB,EAAKo2B,SAAW,IACnCN,EAAWv7B,KAAKyF,EAAKo2B,SAAW,IAGS,IAAzCL,EAAYl3B,QAAQmB,EAAKm2B,YACzBJ,EAAYx7B,KAAKyF,EAAKm2B,UAE9B,CAEA,IAAK,IAAIjoB,EAAI,EAAGA,EAAI4nB,EAAWjgC,OAAQqY,IAC/B8nB,EAAangC,OAAS,GACtBmgC,EAAaz7B,KAAK,MAGtBy7B,EAAaz7B,KAAK,CAAC,sBAAuB,WAAY,IAAIu7B,EAAW5nB,QAGzE,IAASA,EAAI,EAAGA,EAAI6nB,EAAYlgC,OAAQqY,IAChC+nB,EAAcpgC,OAAS,GACvBogC,EAAc17B,KAAK,MAGvB07B,EAAc17B,KAAK,CAAC,sBAAuB,WAAY,IAAIw7B,EAAY7nB,QAG3E0nB,EAAc,CACV,CAAC,WAAY,IAAK,SAClB,KACA,CACI,CAAC,WAAY,IAAK,UAClB,MACA,CAACI,IAEL,KACA,CACI,CAAC,WAAY,IAAK,WAClB,MACA,CAACC,IAGb,CAEA,GAAIN,EAAcR,WAAaQ,EAAcL,QAAS,CAC7CM,IACDA,EAAc,IAGdA,EAAY//B,OAAS,IACrB+/B,EAAc,CAACA,EAAa,QAGhC,MAAMS,EAAch0B,OAAOszB,EAAcR,WAAW7yB,OAAO,YACrDg0B,EAAaj0B,OAAOszB,EAAcL,SAAShzB,OAAO,YACxDszB,EAAYr7B,KAAK,CAAC,CAAC,gBAAiB,KAAM87B,GAAc,MAAO,CAAC,gBAAiB,KAAMC,IAC3F,CAEIT,EAAc54B,OAAO,iBAAmB24B,GACxCC,EAAc54B,OAAO,cAAe24B,GAGxChgC,EAAE,+DAAgE,wBAAwB0O,IAAI,QAASsxB,EAAc,UAAY,QAEjIjB,EAAar2B,MACjB,IAIRqC,GAAGiJ,cAAcgrB,EAAUrwB,SAASgyB,eAAe,0BACnD5B,EAAgB/+B,EAAE,0BAAkC+mB,QAAQ,CACxDthB,MAAO,IACPC,OAAQ,IACRk5B,WAAW,EACXtM,MAAO,UACPzuB,SAAS,EACT+8B,aAAa,EACbC,oBAAoB,EACpB5N,iBAAiB,EACjBrlB,SAAU,CACNE,GAAI,SACJD,GAAI,YAETkZ,QAAQ,aAGfgY,EAAatgB,MACjB,IAGR,CACI7c,SAAU,QACV0H,OAAQ,WACRC,QAAS,CACL6G,KAAM,uBACN1M,KAAM,qBACNxC,KAAM,OACNuI,QAAS,SAASvE,GAGd6xB,EAFsB8B,IACKiI,qBACRxgC,EAAI0B,EAC3B,EACAsC,UAAU,WAtLQsD,EA6LlCu1B,cAAe,SAAUj4B,GACrBA,EAAEiE,UAAUyuB,iBAAmB51B,EAAK41B,iBACpC1yB,EAAEiE,UAAU6U,QAAUhc,EAAKgc,SAAW,GACtC9Y,EAAEiE,UAAU0C,KAAO7J,EAAK6J,MAAQ,GAChC3G,EAAEiE,UAAUgvB,YAAcn2B,EAAKm2B,aAAe,GAC9CjzB,EAAEiE,UAAUivB,QAAUp2B,EAAKo2B,SAAW,EAC1C,EACA2I,kBAAmB,SAAU77B,GACzB,GAAqB,YAAjBA,EAAE87B,WAA0B,CAC5B,IAAI5K,EAAiBlxB,EAAEmL,IAAIrO,KAE3B,GAAoB,kBAAhBkD,EAAE4H,UAA+B,CACjC5H,EAAE41B,cAAcmG,OAAS/7B,EAAEmL,IAAIrO,MAAoC,UAA5Bo0B,EAAed,SACtD,IAAItzB,EAAO,GACX,GAAgC,WAA5Bo0B,EAAed,SACftzB,EAAO,CAAC,CAAEq8B,GAAI,EAAGC,KAAM,UAAY,CAAED,GAAI,EAAGC,KAAM,UAAY,CAAED,GAAI,EAAGC,KAAM,WAAa,CAAED,GAAI,EAAGC,KAAM,aAAe,CAAED,GAAI,EAAGC,KAAM,YAAc,CAAED,GAAI,EAAGC,KAAM,UAAY,CAAED,GAAI,EAAGC,KAAM,kBAC9L,GAAgC,YAA5BlI,EAAed,SACpB,IAAK,IAAIhd,EAAI,EAAGA,GAAK,GAAIA,IACrBtW,EAAK2C,KAAK,CAAE05B,GAAI/lB,EAAGgmB,KAAMhmB,EAAE0X,aAGnC9qB,EAAE41B,cAAcz1B,WAAarD,CACjC,MACK,GAAoB,YAAhBkD,EAAE4H,UAAyB,CAChC,OAAQspB,EAAe9E,OACnB,KAAKwD,mBAAmBC,SACxB,KAAKD,mBAAmBwH,UACpBhD,EAAa,CACT,CAAEl5B,GAAIozB,gBAAgB4G,aAAcx2B,KAAM,iBAC1C,CAAExD,GAAIozB,gBAAgBS,IAAKrwB,KAAM,QAGrC,MACJ,KAAKkxB,mBAAmBuH,OACpB/C,EAAa,CACT,CAAEl5B,GAAIozB,gBAAgB4G,aAAcx2B,KAAM,iBAC1C,CAAExD,GAAIozB,gBAAgBS,IAAKrwB,KAAM,OAEjC,CAAExD,GAAIozB,gBAAgB6G,MAAOz2B,KAAM,SACnC,CAAExD,GAAIozB,gBAAgB8G,IAAK12B,KAAM,QAI7CsB,EAAE41B,cAAcz1B,WAAai0B,EAC7Bp0B,EAAE41B,cAAcv1B,aAAe,SAAUvD,GACrC,IAAIiK,EAAQ,GAMZ,OALKnI,WAAWC,YAAYq3B,kBAAqBp5B,EAAK5B,KAAOozB,gBAAgB4G,cAAgBp4B,EAAK5B,KAAOozB,gBAAgBS,OACpHnwB,WAAWC,YAAYs3B,kBAAqBr5B,EAAK5B,KAAOozB,gBAAgB6G,OAASr4B,EAAK5B,KAAOozB,gBAAgB8G,OAC9GruB,EAAQ,mBAGL,eAAeA,MAAUjK,EAAK4B,YACzC,CACJ,KACyB,aAAhBsB,EAAE4H,WACP5H,EAAE41B,cAAcz1B,WAAaH,EAAEiE,UAAU6U,QACzC9Y,EAAE41B,cAAcv1B,aAAe,SAAUvD,GACrC,IAAIiK,EAAQ,GAKZ,OAJIjK,EAAKk/B,aACLj1B,EAAQ,mBAGL,eAAeA,MAAUjK,EAAK4B,YACzC,GAEqB,UAAhBsB,EAAE4H,UACP5H,EAAE41B,cAAcz1B,WAAaH,EAAEiE,UAAU0C,KAAK9I,QAAO,SAAUC,GAAK,OAAOA,EAAE5C,IAAM,CAAG,IAEjE,WAAhB8E,EAAE4H,UACP5H,EAAE41B,cAAcz1B,WAAaH,EAAEiE,UAAUgvB,YAEpB,cAAhBjzB,EAAE4H,UACP5H,EAAE41B,cAAcz1B,WAAarD,EAAKy6B,UAAU15B,QAAO,SAAUC,GAAK,OAAOA,EAAE05B,MAAM1b,SAASoV,EAAe1gB,OAAS,IAE7F,wBAAhBxQ,EAAE4H,YACP5H,EAAE41B,cAAcz1B,WAAaH,EAAEiE,UAAUivB,QAAQr1B,QAAO,SAAUC,GAAK,OAAgB,IAATA,EAAE5C,IAAa4C,EAAE5C,IAAM,GAAK4C,EAAEoxB,OAASgC,EAAehC,KAAQ,IAEpJ,CACJ,EACA+M,cAAe,SAAUj8B,GACrBA,EAAEiE,UAAU9B,OAAO,gBAAiBnC,EAAElD,KAAK5B,GAC/C,EACAghC,eAAgB,SAAUl8B,GAClBA,EAAEyN,SACFzN,EAAEm8B,OAAgC,eAAvBn8B,EAAEyN,OAAO7F,UAE5B,EACAw0B,gBAAiB,SAAUp8B,GACvBu2B,GAAS,CACb,EACA8F,oBAAqB,SAAUr8B,GFs1F3B,IAAI3D,EAAIC,EAAIggC,EEr1FP/F,IACDn7B,EAAGg3B,aAAkB,QAAL/1B,EAAA2D,EAAEmL,WAAG,IAAA9O,OAAA,EAAAA,EAAES,MACvB1B,EAAGi3B,gBAA2B,QAAXiK,EAAK,QAALhgC,EAAA0D,EAAEmL,WAAG,IAAA7O,OAAA,EAAAA,EAAEQ,YAAI,IAAAw/B,OAAA,EAAAA,EAAElM,WAGhCgC,MACA+B,EAAWkC,WAAW,sCAAuC,UAAuC,WAA5BjE,IAAehC,UACvF+D,EAAWkC,WAAW,uCAAwC,UAAuC,YAA5BjE,IAAehC,UAEhG,EACAmM,SAAU,SAAUv8B,GAGhB,GAFAu2B,GAAS,EAEkC,UAAvCv2B,EAAEiE,UAAU9B,OAAO,gBACnB,GAAKvD,WAAWC,YAAYq3B,kBAAqBt3B,WAAWC,YAAYs3B,iBAInE,CACD,IAAIvE,EAAQx2B,EAAGg3B,eACXpyB,EAAEozB,QAAQr4B,OAAS,IAEnB62B,EAAQ4K,KAAKC,MAAMD,KAAKE,UAAU9K,IAClCP,EAAerxB,EAAEozB,QAAQ,GAAGt2B,KAAM80B,IAGtC,IAAIuK,GAAS,EACRv9B,WAAWC,YAAYq3B,kBAAqBt3B,WAAWC,YAAYs3B,oBAC/Dv3B,WAAWC,YAAYq3B,kBAAqBtE,EAAM9C,UAAYR,gBAAgBS,KAAO6C,EAAM9C,UAAYR,gBAAgB4G,gBACvHt2B,WAAWC,YAAYs3B,kBAAqBvE,EAAM9C,UAAYR,gBAAgB6G,OAASvD,EAAM9C,UAAYR,gBAAgB8G,OAC1H+G,GAAS,GAGTvK,EAAMhB,aACNgB,EAAMhB,YAAY9sB,SAAQ,SAAU64B,IAC3B/9B,WAAWC,YAAYq3B,kBAAqByG,EAAWn1B,SAAW8mB,gBAAgBS,KAAO4N,EAAWn1B,SAAW8mB,gBAAgB4G,gBAC/Ht2B,WAAWC,YAAYs3B,kBAAqBwG,EAAWn1B,SAAW8mB,gBAAgB6G,OAASwH,EAAWn1B,SAAW8mB,gBAAgB8G,OAClI+G,GAAS,EAEjB,KAIJA,IACA3hC,WAAW+N,GAAGuB,OAAOqpB,MAAM,sBAAwBv0B,WAAWC,YAAYq3B,iBAAmD,sBAAhC,4CAAsE,oBACnKl2B,EAAEm8B,QAAS,GAGXvK,EAAM9B,kBAAoBvB,oBAAoBwB,KAAO6B,EAAMxF,QAAUwD,mBAAmBwH,YACtD,IAA9BxF,EAAM5B,qBAA8BhwB,EAAEiE,UAAUivB,QAAQ3zB,MAAK,SAAUzB,GAAK,OAAOA,EAAE5C,IAAM02B,EAAM5B,qBAAuBlyB,EAAEoxB,OAAS0C,EAAM1C,KAAO,MAChJ10B,WAAW+N,GAAGuB,OAAOqpB,MAAM,sBAAuB,SAClDnzB,EAAEm8B,QAAS,GAGvB,MAvCI3hC,WAAW+N,GAAGuB,OAAOqpB,MAAM,wFAAyF,oBACpHnzB,EAAEm8B,QAAS,CAwCvB,EACAS,QAAS,SAAU58B,GACXoyB,MACA+B,EAAWkC,WAAW,sCAAuC,UAAuC,WAA5BjE,IAAehC,UACvF+D,EAAWkC,WAAW,uCAAwC,UAAuC,YAA5BjE,IAAehC,UAEhG,EACAyM,aAAc,SAAU78B,GACpBu2B,GAAS,EACTv2B,EAAElD,KAAO,IAAI0xB,MAEb,IAAI/zB,EAAS0I,QAAQ4e,oBAAoB,CAAA,GACzC/hB,EAAElD,KAAKqM,WAAa1O,EAAO0O,WAC3BnJ,EAAElD,KAAKsyB,UAAY30B,EAAO20B,UAC1BpvB,EAAElD,KAAK0T,OAAS1T,EAAK0T,OACrBxQ,EAAElD,KAAKuyB,SAAWvyB,EAAKuyB,SACvBrvB,EAAElD,KAAK8xB,YAAc9xB,EAAK6S,aAC1B3P,EAAElD,KAAKoQ,UAAYpQ,EAAKoQ,UACxBlN,EAAElD,KAAK6zB,eAAiB7zB,EAAK6zB,eAE7B,IAAImM,EAAYhgC,EAAKm2B,YAAY1zB,MAAKzB,GAAKA,EAAE5C,KAAO4B,EAAK0T,SAKzD,GAJIssB,IACA98B,EAAElD,KAAK+xB,WAAaiO,EAAUlL,OAG9B90B,EAAKkC,kBAAmB,CACxB,IAAID,EAAUjC,EAAKy6B,UAAUh4B,MAAKzB,GAAKA,EAAE5C,KAAO8E,EAAElD,KAAKoQ,YACnDnO,IACAiB,EAAElD,KAAK4zB,YAAc3xB,EAAQL,KAErC,CAEAtD,EAAGg3B,aAAapyB,EAAElD,MAClB1B,EAAGi3B,gBAAgBryB,EAAElD,KAAKszB,UAC1BoC,EAAgBxyB,GAAG,EACvB,EACA+8B,mBAAoB,SAAU/8B,GAC1B,GAAIlD,EAAK41B,iBAAkB,CAEvB,GADmB1yB,EAAEiE,UAAU9B,OAAO,wCACW,IAA7BnC,EAAEg9B,gBAAgBjiC,QAAe,CACjDiF,EAAEiE,UAAU2J,cACZ5N,EAAEiE,UAAU9B,OAAO,oCAAkE,IAA7BnC,EAAEg9B,gBAAgBjiC,QAC1E,MAAM4M,EAAU3H,EAAEiE,UAAU9B,OAAO,WAC7B86B,EAAet1B,EAAQpI,MAAKzB,GAAgB,YAAXA,EAAErB,OACzC,IAAK,IAAI2W,EAAI,EAAGA,EAAI6pB,EAAahyB,QAAQlQ,OAAQqY,IAC7CpT,EAAEiE,UAAU9B,OAAO,WAAWwF,EAAQ5D,QAAQk5B,eAA0B7pB,cAAepT,EAAEg9B,gBAAgBjiC,OAAS,GAEtHiF,EAAEiE,UAAU6J,YACZ9N,EAAEiE,UAAUw1B,SAChB,CACJ,CACJ,GAEJyD,YAAa,CACT18B,OAAQ,IACRy3B,cAAe,SAAUj4B,GACrBm0B,EAAan0B,EAAEiE,SACnB,EACA0V,UAAU,EACVwjB,SAAU/K,EACV3zB,MAAO,CACH,CACI+2B,SAAU,QACVC,SAAU,EACVC,QAAS,EACTrrB,QAAS,mBACT3L,KAAM,kBACND,MAAO,CACH,CACImJ,UAAW,WACX+tB,WAAY,cACZD,QAAS,EACTE,cAAe,CACXn3B,MAAO,CAAC,QAAS,SAAU,aAGnC,CACImJ,UAAW,gBACX+tB,WAAY,YACZD,QAAS,EACTE,cAAe,CACXn5B,KAAM,OACNs8B,iBAAiB,EACjBC,oBAAoB,EACpBC,cAAe,UAGvB,CACInb,MAAO,CAAE9hB,KAAM,QACf0C,KAAM,sBACNkJ,UAAW,gBACX+tB,WAAY,WACZD,QAAS,EACTE,cAAe,CACX7Y,eAAe,EACfmc,uBAAuB,EACvB/4B,WAAY,CAAC,CAAEg5B,GAAI,EAAGC,KAAM,UAAY,CAAED,GAAI,EAAGC,KAAM,UAAY,CAAED,GAAI,EAAGC,KAAM,WAAa,CAAED,GAAI,EAAGC,KAAM,aAAe,CAAED,GAAI,EAAGC,KAAM,YAAc,CAAED,GAAI,EAAGC,KAAM,UAAY,CAAED,GAAI,EAAGC,KAAM,aACpMt4B,YAAa,OACbqd,UAAW,OAGnB,CACIL,MAAO,CAAE9hB,KAAM,QACf0C,KAAM,uBACNkJ,UAAW,gBACX+tB,WAAY,WACZD,QAAS,EACTE,cAAe,CACX7Y,eAAe,EACfmc,uBAAuB,EACvBz6B,MAAO,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IACvH2f,eAAgB,SAAUpe,GACtB,IAAIg1B,EAAMh1B,EAAEiE,UAAU9B,OAAO,SAE7B,GAAI6yB,EAAIj6B,OAAS,EAAG,CAChB,IAAIu+B,EAAStE,EAAIv3B,MAAK,CAAC87B,EAAIC,IAAOD,EAAKC,IAEvCx5B,EAAEiE,UAAU9B,OAAO,SAAUm3B,GAE7B,IACIt5B,EAAEiE,UAAUw1B,SACmC,CAAjD,MAAOz5B,GAAKo9B,QAAQC,IAAI,uBAAyB,CACvD,CACJ,MAMhB,CACI7H,SAAU,QACVC,SAAU,EACVC,QAAS,EACTrrB,QAAS,cACT5L,MAAO,CACH,CACImJ,UAAW,YACXyC,QAAS,QACTsrB,WAAY,YACZD,QAAS,EACTE,cAAe,CACXn5B,KAAM,WACNu8B,oBAAoB,IAG5B,CACIpxB,UAAW,gBACXyC,QAAS,kBACTsrB,WAAY,aACZD,QAAS,GAEb,CACI9tB,UAAW,eACXyC,QAAS,YACTsrB,WAAY,YACZD,QAAS,EACTE,cAAe,CACXn5B,KAAM,WACNu8B,oBAAoB,IAG5B,CACIpxB,UAAW,aACXyC,QAAS,cACTqrB,QAAS,GAEb,CACI9tB,UAAW,mBACXyC,QAAS,qBACTqrB,QAAS,GAEb,CACI9tB,UAAW,aACXyC,QAAS,cACTqrB,QAAS,QAUjC56B,EAAE,uBAAuB0G,KAAK,IACjB1G,EAAE,gBAAwB+mB,QAAQ,CAC3C+W,gBAAiB,sCACjBr4B,MAAO,KACPC,OAAQ,IACRk5B,WAAW,EACXtM,MAAOtwB,EAAK41B,iBAAmB,oBAAsB,mBACrD/zB,SAAS,EACT+8B,aAAa,EACbC,oBAAoB,EACpB5N,iBAAiB,EACjBrlB,SAAU,CACNE,GAAI,SACJD,GAAI,UAER20B,QAAS,SAAUt9B,GACflF,EAAE,uBAAuB0G,KAAK1E,EAAKzB,MACnCwK,GAAGiJ,cAAc1T,EAAIqO,SAASgyB,eAAe,0BACjD,IACD5Z,QAAQ,YAELtI,MACV,CA0DA,MAAO,CACHgkB,gBAfJ,WACI5hC,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWmtB,MAAQ,YACnB,CAAA,GACA,SAAU90B,GACNg2B,EAAch2B,EAAKm1B,OAAQn1B,EAAK6J,MAChCstB,EAAUn3B,EACd,GACA,MACA,EACA,QACA,EACR,EAII0gC,qBA1DJ,SAA8BC,EAAkB,KAAM9F,GAA8B,GAChF,IAAK/4B,WAAWC,YAAY6zB,mBACxB,OAAOhR,EAAU,sDAGrB/lB,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWmtB,MAAQ,sBACP,OAAZ6L,EAAmB,CAAA,EAAK,CAAEC,SAAU,CAACD,KACrC,SAAU3gC,GACN,IAAIm1B,EAAS,GACbn1B,EAAKm1B,OAAOnuB,SAAQ,SAAU65B,GAC1B,IAAI/L,EAAQ,IAAIpD,MAChB,IAAK,IAAIpb,EAAI,EAAGA,EAAItW,EAAK8gC,gBAAgB7iC,OAAQqY,IAC/B,OAAVuqB,EAAGvqB,SAAyB1Q,IAAVi7B,EAAGvqB,KACA,iBAAVuqB,EAAGvqB,IAAmBuqB,EAAGvqB,GAAGyqB,QACnCjM,EAAM90B,EAAK8gC,gBAAgBxqB,IAAMuqB,EAAGvqB,GAAGyqB,QAGvCjM,EAAM90B,EAAK8gC,gBAAgBxqB,IAAMuqB,EAAGvqB,WAIzCwe,EAAMtC,gBAETsC,EAAMvB,eAAiBuB,EAAMvB,cAAct1B,OAAS,IACpD62B,EAAMtB,oBAAsBsB,EAAMvB,cAAcrzB,KAAIc,GAAK,IAAMA,EAAI,MAAKgtB,YAG5EmH,EAAOxyB,KAAKmyB,EAChB,IAEA90B,EAAKm1B,OAASA,EACdn1B,EAAK41B,kBAAmB,EACxB51B,EAAK66B,mBAAqBA,EAC1B1D,EAAUn3B,EACd,GACA,MACA,EACA,QACA,EACR,EAqBJ,CAtuDqB,GChGjB26B,UAAa,WA+Mb,SAASqG,EAAQC,EAAoBN,EAAkB,KAAM5C,EAAuC,MAChGl/B,SAASsN,iBAAiB,CAAA,EACtBxE,WAAWmtB,MAAQ,eACP,OAAZ6L,EAAmB,CAAEzkB,OAAQ6hB,GAAkB,CAAEmD,QAASP,EAASzkB,OAAQ6hB,GAC3EkD,EACA,MACA,EACA,QACA,EACR,CAQA,MAAO,CACHrG,KAPJ,SAAc+F,EAAkB,MAC5BK,GAAQ,SAAUhhC,IAzNtB,SAAcA,GACV,IAAImhC,EAAap4B,GAAGC,WAAWhJ,EAAKohC,KAAKnjC,OAAS,EAAI+B,EAAKohC,KAAK,GAAK,MACjEC,EAAat4B,GAAGC,WAAW,MAC3Bs4B,EAAmBv4B,GAAGC,WAAW,IACjCu4B,EAAkBx4B,GAAGC,WAAWhJ,EAAKm9B,WACrCqE,EAAgBz4B,GAAGC,WAAWhJ,EAAKo9B,SACnCqE,EAAkB14B,GAAGC,WAAWhJ,EAAKu9B,WACrCmE,EAAgB34B,GAAGC,WAAWhJ,EAAK09B,SAEnCp/B,EAAK,CACLq7B,gBAAiB,CACbj2B,OAAQ,IACRD,MAAO,IACPJ,WAAYrD,EAAKohC,KACjB1xB,iBAAiB,EACjBC,cAAc,EACdvG,uBAAuB,EACvByB,QAAS,CACL,CAAEC,UAAW,aAAcyC,QAAS,KAAM9J,MAAO,GAAIk+B,eAAe,GACpE,CAAE72B,UAAW,OAAQrH,MAAO,KAC5B,CAAEqH,UAAW,OAAQrH,MAAO,IAC5B,CAAEqH,UAAW,SAAU62B,eAAe,GACtC,CACIhiC,KAAM,UACN8D,MAAO,GACP0K,QAAS,CAAC,CACNC,KAAM,cACN1M,KAAM,OACN+F,QAAS,SAAUvE,GACfrE,SAASsR,oBAAoBjN,EAAEmL,IAAIrO,KAAK4hC,QAAU,GAAI,6BAC1D,GACD,CACCxzB,KAAM,QACN1M,KAAM,QACN+F,QAAS,SAAUvE,GACfkxB,eAAesM,qBAAqBx9B,EAAEmL,IAAIrO,KAAK2gC,SAAS,EAC5D,IAEJgB,eAAe,IAGvB/xB,aAAa,EACbiyB,cAAe7hC,EAAKohC,KAAKnjC,OAAS,EAAI+B,EAAKohC,KAAK,GAAGhjC,GAAK,KACxDy+B,mBAAmB,EACnBv5B,QAAS,KACTw+B,WAAY,CACRjgC,SAAS,GAEb4M,UAAW,CACPhF,KAAM,WAEViF,OAAQ,CACJnF,SAAS,GAEbg2B,oBAAqB,SAAUr8B,GHynJ3B,IAAI3D,EGxnJJ4hC,EAAgB,QAAL5hC,EAAA2D,EAAEmL,WAAG,IAAA9O,OAAA,EAAAA,EAAES,KACtB,GAEJogC,YAAa,CACT18B,OAAQ,IACRmZ,UAAU,EACVwjB,SAAUc,EACVx/B,MAAO,CACH,CACImJ,UAAW,aACXyC,QAAS,aACTsrB,WAAY,aACZC,cAAe,CACXp1B,OAAQ,KAGhB,CACIoH,UAAW,eACXyC,QAAS,gBACTsrB,WAAY,gBAKxBoE,iBAAkB,CACdC,WAAW,EACXf,cAAe4F,WAAWp3B,WAC1B8B,MAAO,CAACzM,EAAKm9B,UAAWn9B,EAAKo9B,SAC7Bnc,UAAW,SACXK,eAAgB,SAAUpe,GACtB,IAAI8+B,EAAoB9+B,EAAEqe,cAAc,GACpC0gB,EAAkB/+B,EAAEqe,cAAc,GAClC2gB,EAAeh/B,EAAEuJ,MAAM,GACvB01B,EAAaj/B,EAAEuJ,MAAM,GAErBu1B,IAAsBE,GAAgBD,IAAoBE,IAEtDZ,EADwB,iBAAjBW,EACSxkC,WAAW0kC,aAAaC,WAAWH,EAAc,cAGjDA,GAIhBV,EADsB,iBAAfW,EACOzkC,WAAW0kC,aAAaC,WAAWF,EAAY,cAG/CA,GAG1B,GAEJG,kBAAmB,CACf71B,MAAO60B,EACPjE,iBAAiB,GAErBkF,YAAa,CACTC,0BAA0B,EAC1B/1B,MAAO40B,EACPniC,KAAM,QAGVo+B,iBAAkB,CACd7wB,MAAOzM,EAAKu9B,UACZ59B,KAAM,OACNs8B,iBAAiB,EACjBC,oBAAoB,EACpBC,cAAe,QACf7a,eAAgB,SAAUpe,GACtB,IAAIs6B,EAAUx/B,EAAE,mBAAoB,qBAAqBy/B,UAAU,YAC/DC,EAAUF,EAAQn4B,OAAO,SACzBnC,EAAEuJ,MAAQixB,GACVF,EAAQn4B,OAAO,QAASnC,EAAEuJ,OAG9Bg1B,EAAgBv+B,EAAEuJ,MACtB,GAEJkxB,eAAgB,CACZlxB,MAAOzM,EAAK09B,QACZ/9B,KAAM,OACNs8B,iBAAiB,EACjBC,oBAAoB,EACpBC,cAAe,QACf7a,eAAgB,SAAUpe,GACtB,IAAIs6B,EAAUx/B,EAAE,qBAAsB,qBAAqBy/B,UAAU,YACjEF,EAAYC,EAAQn4B,OAAO,SAC3BnC,EAAEuJ,MAAQ8wB,GACVC,EAAQn4B,OAAO,QAASnC,EAAEuJ,OAG9Bi1B,EAAcx+B,EAAEuJ,MACpB,GAGJmxB,aAAc,CACV1+B,KAAM,QACNwC,KAAM,SACN+F,UACI,IAAIs2B,EAAgB,CAChBZ,UAAWoE,IACXnE,QAASoE,IACTjE,UAAWkE,IACX/D,QAASgE,IACT3P,WAAYuP,IACZmB,KAAMpB,KAGNtD,EAAcZ,YAAcY,EAAcX,UAAYW,EAAcZ,WAAaY,EAAcX,SAC/FW,EAAcR,YAAcQ,EAAcL,UAAYK,EAAcR,WAAaQ,EAAcL,QAE/FhgC,WAAW+N,GAAGuB,OAAOqpB,MAAM,yHAA0H,qBAIzJ2K,GAAQ,SAAUrjB,GACD3f,EAAE,kBAAkB8G,WAAW,YACvCO,OAAO,CACRhC,WAAYsa,EAAOyjB,KACnBS,cAAelkB,EAAOyjB,KAAKnjC,OAAS,EAAI0f,EAAOyjB,KAAK,GAAGhjC,GAAK,MAEpE,GAAG4B,EAAK2gC,QAAS5C,EACrB,IAIR//B,EAAE,qBAAqB0G,KAAK,IACf1G,EAAE,mBAA2B+mB,QAAQ,CAC9C+W,gBAAiB,yCACjBr4B,MAAO,IACPC,OAAQ,IACRk5B,WAAW,EACXtM,MAAO,aACPzuB,SAAS,EACT+8B,aAAa,EACbC,oBAAoB,EACpB5N,iBAAiB,EACjBrlB,SAAU,CACNE,GAAI,SACJD,GAAI,UAER20B,QAAS,SAAUt9B,GACflF,EAAE,0BAA0B0G,KAAK1E,EAAK0iC,SACtC35B,GAAGiJ,cAAc1T,EAAIqO,SAASgyB,eAAe,oBACjD,IACD5Z,QAAQ,YAELtI,MACV,CAeQA,CAAKzc,EACT,GAAG2gC,EACP,EAKJ,CAnOgB","file":"wwwroot/Scripts/front-custom.js","sourcesContent":["enum ShowWorkbooksModeEnum {\r\n All = 0,\r\n Recent = 1,\r\n Favorites = 2\r\n}\r\nenum ShowWorkbooksTypeEnum {\r\n All = 0,\r\n Mine = 1,\r\n OtherUsers = 2,\r\n Shared = 3\r\n}\r\n\r\nenum HomeGroupingEnum {\r\n None = \"None\",\r\n Mapping = \"Mapping\",\r\n Owner = \"Owner\",\r\n Category = \"Category\"\r\n}\r\n\r\nvar home = (function () {\r\n\r\n var getCompanyId = function () {\r\n let span = $(\"span#companySelected\");\r\n if (span.length > 0) {\r\n return parseInt(span[0].dataset.id, 10);\r\n }\r\n return -1;\r\n }\r\n\r\n var saveShowHideWorkbooks = function (showSharedWorkbooks, showOtherOwners, userId) {\r\n let sharedWorkbooks = showSharedWorkbooks === \"False\" ? false : true;\r\n let otherOwners = showOtherOwners === \"False\" ? false : true;\r\n irGlobal.updateFromServer({},\r\n urlConfigs.siteRoot + \"Home/SaveShowHideWorkbooks\",\r\n { showSharedWorkbooks: sharedWorkbooks, showOtherOwners: otherOwners, userId: userId },\r\n function () { },\r\n function () { },\r\n true,\r\n \"POST\");\r\n }\r\n\r\n let updateGridTitle = function (vm) {\r\n let view = vm.showWorkbooksMode() == ShowWorkbooksModeEnum.Recent ? \"Recent\" : vm.showWorkbooksMode() == ShowWorkbooksModeEnum.Favorites ? \"Favorite\" : \"All\";\r\n let mobileDevice = irGlobal.isMobile();\r\n let owner = \"\";\r\n let groupedBy = \"\";\r\n if (!mobileDevice) {\r\n owner = vm.showWorkbooksType() == ShowWorkbooksTypeEnum.Mine ? \" (Mine)\" : vm.showWorkbooksType() == ShowWorkbooksTypeEnum.OtherUsers ? \" (Other Users)\" : \"\";\r\n groupedBy = vm.grouping() === HomeGroupingEnum.None ? \"\" : ` by ${vm.grouping()}`;\r\n $(\"span.title\").text(`${view} Workbooks${groupedBy}${owner}`);\r\n }\r\n else {\r\n owner = vm.showWorkbooksType() == ShowWorkbooksTypeEnum.Mine ? \" (Mine)\" : vm.showWorkbooksType() == ShowWorkbooksTypeEnum.OtherUsers ? \" (Others)\" : \"\";\r\n if (view !== \"All\") {\r\n view += \"s\";\r\n }\r\n else {\r\n if (owner === \"\") {\r\n view += \" Workbooks\";\r\n }\r\n }\r\n $(\"span.title\").text(`${view}${owner}`);\r\n }\r\n }\r\n\r\n let rowEditing = null;\r\n var setup = function () {\r\n if (performance && performance.navigation.type == 2) {\r\n location.reload();\r\n }\r\n\r\n irGlobal.setup();\r\n irGlobal.setupChangePassword();\r\n\r\n let json = $(\".homeContent\").data(\"json\");\r\n json.workbooks = json.workbooks.map(obj => {\r\n return { ...obj, lastViewedDate: new Date(obj.lastViewed) };\r\n });\r\n\r\n let getDataSource = function () {\r\n let ouput = [];\r\n\r\n switch (vm.showWorkbooksMode()) {\r\n case ShowWorkbooksModeEnum.Recent:\r\n ouput = json.workbooks.sort((a, b) => b.lastViewedDate - a.lastViewedDate).slice(0, 10);\r\n break;\r\n case ShowWorkbooksModeEnum.Favorites:\r\n ouput = json.workbooks.filter(x => x.workbook.favorite);\r\n break;\r\n default:\r\n ouput = json.workbooks;\r\n break;\r\n }\r\n\r\n return ouput;\r\n }\r\n\r\n let mobileDevice = irGlobal.isMobile();\r\n\r\n const viewGroupName = \"View\";\r\n const ownerGroupName = \"Owners\";\r\n const groupByGroupName = \"Group By\";\r\n let menuList = [\r\n {\r\n key: \"Actions\",\r\n icon: \"eyeopen\",\r\n items: [\r\n {\r\n key: 101, name: \"New Workbook\", icon: \"add\", visible: (loggedUser.permissions.createWorkbooks() || loggedUser.permissions.workbooks()) && !mobileDevice,\r\n },\r\n {\r\n key: 102, name: json.company?.name, icon: \"tags\", visible: json.enableMultiTenant,\r\n template: `apartment${json.company?.name}`\r\n },\r\n {\r\n key: 103, name: \"Admin\", icon: \"preferences\", visible: !mobileDevice && json.enableAdmin,\r\n template: 'admin_panel_settingsAdmin'\r\n },\r\n ],\r\n },\r\n {\r\n key: viewGroupName,\r\n icon: \"eyeopen\",\r\n items: [\r\n {\r\n key: 1, name: \"Recent\", icon: \"clock\", badge: json.workbooks.sort((a, b) => b.lastViewedDate - a.lastViewedDate).slice(0, 10).length,\r\n template: 'scheduleRecent'\r\n },\r\n {\r\n key: 2, name: \"Favorites\", icon: \"favorites\", badge: json.workbooks.filter(x => x.workbook.favorite).length,\r\n template: 'starFavorites'\r\n },\r\n {\r\n key: 3, name: \"All\", icon: \"detailslayout\", badge: json.workbooks.length,\r\n template: 'format_align_justifyAll'\r\n },\r\n ],\r\n },\r\n {\r\n key: ownerGroupName,\r\n icon: \"user\",\r\n items: [\r\n { key: 11, name: \"All\", icon: \"group\", template: 'groupsAll', },\r\n { key: 12, name: \"Mine\", icon: \"card\", template: 'personMine' },\r\n { key: 13, name: \"Others\", icon: \"user\", template: 'shareOthers' },\r\n ]\r\n },\r\n {\r\n key: groupByGroupName,\r\n icon: \"alignleft\",\r\n items: [\r\n {\r\n key: 21, name: \"None\", icon: \"contentlayout\", template: 'format_align_justifyNone'\r\n },\r\n {\r\n key: 22, name: \"Mapping\", icon: \"columnchooser\", template: 'account_treeMapping',\r\n disabled: json.showWorkbooksMode === ShowWorkbooksModeEnum.Favorites\r\n },\r\n {\r\n key: 23, name: \"Owner\", icon: \"user\", template: 'personOwner',\r\n disabled: json.showWorkbooksMode === ShowWorkbooksModeEnum.Favorites\r\n },\r\n {\r\n key: 24, name: \"Category\", icon: \"pin\", template: 'categoryCategory',\r\n disabled: json.showWorkbooksMode === ShowWorkbooksModeEnum.Favorites\r\n },\r\n ]\r\n },\r\n {\r\n key: \"Options\",\r\n icon: \"alignleft\",\r\n items: [\r\n { key: 31, name: \"Show/Hide Tabs\", icon: \"inactivefolder\", template: 'tabShow/Hide Tabs', visible: !irGlobal.isMobile() }\r\n ]\r\n },\r\n ];\r\n\r\n let selectedItemKeys = [\r\n json.showWorkbooksMode === ShowWorkbooksModeEnum.All ? 3 : (json.showWorkbooksMode === ShowWorkbooksModeEnum.Recent ? 1 : 2),\r\n json.showWorkbooksType === ShowWorkbooksTypeEnum.All ? 11 : (json.showWorkbooksType === ShowWorkbooksTypeEnum.Mine ? 12 : 13),\r\n menuList.find(x => x.key === \"Group By\").items.find(x => x.name === json.grouping).key,\r\n ];\r\n\r\n if (json.showTabs) {\r\n selectedItemKeys.push(31);\r\n }\r\n\r\n let menuListControl;\r\n let drawer = $('#drawer').dxDrawer({\r\n revealMode: \"slide\",\r\n //overlap if it is a mobile device or small screen\r\n openedStateMode: !mobileDevice ? \"shrink\" : \"overlap\",\r\n opened: !mobileDevice,\r\n closeOnOutsideClick: mobileDevice,\r\n template: function (e) {\r\n var $template = $(`
`);\r\n\r\n menuListControl = $template.dxList({\r\n dataSource: menuList,\r\n keyExpr: \"key\",\r\n itemTemplate: function (e) {\r\n let iconName = `dx-icon-${e.icon}`\r\n let icon = e.icon ? ` ` : \"\";\r\n\r\n return $(`${icon}${e.name}`);\r\n },\r\n width: 160,\r\n height: \"100%\",\r\n selectByClick: false,\r\n selectionMode: \"multiple\",\r\n selectedItemKeys: selectedItemKeys,\r\n elementAttr: { class: \"dx-theme-accent-as-background-color\" },\r\n searchExpr: [\"name\", \"items.name\"],\r\n displayExpr: \"name\",\r\n grouped: true,\r\n focusStateEnabled: false,\r\n hoverStateEnabled: false,\r\n onItemClick(e) {\r\n if (e.itemIndex && (e.itemIndex as any).group >= 1 && (e.itemIndex as any).group <= 3) {\r\n let groupName = \"\";\r\n switch ((e.itemIndex as any).group) {\r\n case 1:\r\n groupName = viewGroupName;\r\n break;\r\n case 2:\r\n groupName = ownerGroupName;\r\n break;\r\n case 3:\r\n groupName = groupByGroupName;\r\n break;\r\n }\r\n $(\".dx-list-group-header span\", e.itemElement.closest(\".dx-list-group\")).html(`${groupName}: ${e.itemData.name}`);\r\n }\r\n let closeMenu = mobileDevice;\r\n let dataGrid1 = $(\"#homeWorkbookGrid\").dxDataGrid(\"instance\");\r\n\r\n if (e.itemData.key < 30) {\r\n\r\n let groupIndex = {\r\n group: (e.itemIndex as any).group,\r\n item: 0,\r\n };\r\n for (let item of menuList[(e.itemIndex as any).group].items) {\r\n menuListControl.unselectItem(groupIndex);\r\n groupIndex.item++;\r\n }\r\n menuListControl.selectItem(e.itemIndex);\r\n }\r\n\r\n let onGroupByNoneChanged = function () {\r\n vm.grouping(HomeGroupingEnum.None);\r\n dataGrid1.clearGrouping();\r\n dataGrid1.option(\"toolbar.items[0].options.visible\", false);\r\n }\r\n\r\n switch (e.itemData.key) {\r\n //View - Recent\r\n case 1:\r\n vm.showWorkbooksMode(ShowWorkbooksModeEnum.Recent);\r\n updateViewBadge();\r\n\r\n let ds1 = getDataSource();\r\n dataGrid1.option(\"dataSource\", ds1);\r\n\r\n dataGrid1.option(\"toolbar.items[1].options.visible\", false);\r\n dataGrid1.option(\"toolbar.items[2].options.visible\", false);\r\n\r\n $(\"span#itemElement-24, span#itemElement-23, span#itemElement-22\").closest(\".dx-item.dx-list-item\").removeClass(\"dx-state-disabled\");\r\n break;\r\n //View - Favorites\r\n case 2:\r\n vm.showWorkbooksMode(ShowWorkbooksModeEnum.Favorites);\r\n updateViewBadge();\r\n\r\n let ds2 = getDataSource();\r\n dataGrid1.option(\"dataSource\", ds2);\r\n\r\n onGroupByNoneChanged();\r\n\r\n dataGrid1.option(\"toolbar.items[1].options.visible\", true);\r\n dataGrid1.option(\"toolbar.items[2].options.visible\", true);\r\n\r\n $(\"span#itemElement-24, span#itemElement-23, span#itemElement-22\").closest(\".dx-item.dx-list-item\").addClass(\"dx-state-disabled\");\r\n break;\r\n //View - All Workbooks\r\n case 3:\r\n vm.showWorkbooksMode(ShowWorkbooksModeEnum.All);\r\n updateViewBadge();\r\n\r\n let ds3 = getDataSource();\r\n dataGrid1.option(\"dataSource\", ds3);\r\n\r\n dataGrid1.option(\"toolbar.items[1].options.visible\", false);\r\n dataGrid1.option(\"toolbar.items[2].options.visible\", false);\r\n\r\n $(\"span#itemElement-24, span#itemElement-23, span#itemElement-22\").closest(\".dx-item.dx-list-item\").removeClass(\"dx-state-disabled\");\r\n break;\r\n //Owner - All\r\n case 11:\r\n vm.showWorkbooksType(ShowWorkbooksTypeEnum.All);\r\n dataGrid1.option(\"filterValue\", undefined);\r\n break;\r\n //Owner - Mine\r\n case 12:\r\n vm.showWorkbooksType(ShowWorkbooksTypeEnum.Mine);\r\n dataGrid1.option(\"filterValue\", ['ownerId', '=', `${loggedUser.id()}`]);\r\n break;\r\n //Owner - Others\r\n case 13:\r\n if (loggedUser.permissions.workbooks()) {\r\n vm.showWorkbooksType(ShowWorkbooksTypeEnum.OtherUsers);\r\n dataGrid1.option(\"filterValue\", ['ownerId', '<>', `${loggedUser.id()}`]);\r\n }\r\n else {\r\n vm.showWorkbooksType(ShowWorkbooksTypeEnum.Shared);\r\n dataGrid1.option(\"filterValue\", ['editMode', '<>', '1']);\r\n }\r\n break;\r\n //Group By - None\r\n case 21:\r\n onGroupByNoneChanged();\r\n break;\r\n //Group By - Mapping\r\n case 22:\r\n vm.grouping(HomeGroupingEnum.Mapping);\r\n dataGrid1.clearGrouping();\r\n dataGrid1.columnOption(\"mappingName\", 'groupIndex', 0);\r\n dataGrid1.option(\"toolbar.items[0].options.visible\", true);\r\n\r\n vm.editFavoriteOrder(false);\r\n menuListControl.unselectItem({ group: 4, item: 2 });//unselect favorites order\r\n break;\r\n //Group By - Owner\r\n case 23:\r\n vm.grouping(HomeGroupingEnum.Owner);\r\n dataGrid1.clearGrouping();\r\n dataGrid1.columnOption(\"ownerUserName\", 'groupIndex', 0);\r\n dataGrid1.option(\"toolbar.items[0].options.visible\", true);\r\n\r\n vm.editFavoriteOrder(false);\r\n menuListControl.unselectItem({ group: 4, item: 2 });//unselect favorites order\r\n break;\r\n //Group By - Category\r\n case 24:\r\n vm.grouping(HomeGroupingEnum.Category);\r\n dataGrid1.clearGrouping();\r\n dataGrid1.columnOption(\"categoryName\", 'groupIndex', 0);\r\n dataGrid1.option(\"toolbar.items[0].options.visible\", true);\r\n\r\n vm.editFavoriteOrder(false);\r\n menuListControl.unselectItem({ group: 4, item: 2});//unselect favorites order\r\n break;\r\n //Options - Show Tabs\r\n case 31:\r\n vm.showTabs(!vm.showTabs());\r\n if (vm.showTabs()) {\r\n menuListControl.selectItem(e.itemIndex);\r\n }\r\n else {\r\n menuListControl.unselectItem(e.itemIndex);\r\n }\r\n dataGrid1.refresh();\r\n break;\r\n //Options - Edit favorite order\r\n case 32:\r\n if (vm.showWorkbooksMode() == ShowWorkbooksModeEnum.Favorites) {\r\n if (vm.showWorkbooksMode() == ShowWorkbooksModeEnum.Favorites) {\r\n //isItemSelected\r\n vm.editFavoriteOrder(!vm.editFavoriteOrder());\r\n if (vm.editFavoriteOrder()) {\r\n menuListControl.selectItem(e.itemIndex);\r\n }\r\n else {\r\n menuListControl.unselectItem(e.itemIndex);\r\n }\r\n }\r\n }\r\n break;\r\n //Options: - Sort by favorite order\r\n case 33:\r\n if (vm.showWorkbooksMode() == ShowWorkbooksModeEnum.Favorites) {\r\n //isItemSelected\r\n vm.sortByFavoriteOrder(!vm.sortByFavoriteOrder());\r\n if (vm.sortByFavoriteOrder()) {\r\n menuListControl.selectItem(e.itemIndex);\r\n }\r\n else {\r\n menuListControl.unselectItem(e.itemIndex);\r\n }\r\n }\r\n break;\r\n //Actions - New Workbook\r\n case 101:\r\n tabView.openMappingsPopup();\r\n break;\r\n //Actions - Company\r\n case 102:\r\n closeMenu = false;\r\n tabView.openCompaniesPopup(true);\r\n break;\r\n //Actions - Admin\r\n case 103:\r\n window.location.href = '/admin';\r\n break;\r\n }\r\n\r\n updateGridTitle(vm);\r\n\r\n if (closeMenu) {\r\n drawer.hide();\r\n }\r\n },\r\n collapsibleGroups: true,\r\n groupTemplate(data) {\r\n let selectedItem = null;\r\n if (data.items && data.key !== \"Actions\" && data.key !== \"Options\") {\r\n let selectedItems = this.option(\"selectedItemKeys\");\r\n data.items.forEach(function (item) {\r\n if (selectedItems.indexOf(item.key) !== -1) {\r\n selectedItem = item;\r\n }\r\n });\r\n }\r\n\r\n return $(`${data.key}${(selectedItem ? `: ${selectedItem.name}` : \"\")}`);\r\n },\r\n onGroupRendered: function (e) {\r\n if (e.groupIndex > 1)\r\n e.component.collapseGroup(e.groupIndex);\r\n },\r\n }).dxList('instance');\r\n\r\n return $template;\r\n },\r\n height: \"calc(100% - 40px)\",\r\n }).dxDrawer('instance');\r\n\r\n let toolbarControl = $('#toolbar').dxToolbar({\r\n elementAttr: {\r\n class: 'dx-theme-background-color',\r\n },\r\n items: [\r\n {\r\n widget: 'dxButton',\r\n location: 'before',\r\n options: {\r\n icon: 'menu',\r\n stylingMode: 'text',\r\n onClick() {\r\n drawer.toggle();\r\n },\r\n },\r\n },\r\n {\r\n location: 'before',\r\n html: ``,\r\n },\r\n {\r\n location: 'center',\r\n html: `
Workbooks
`,\r\n width: 200,\r\n },\r\n {\r\n location: 'after',\r\n widget: 'dxMenu',\r\n options: {\r\n cssClass: \"homeContent\",\r\n items: [{\r\n name: json.userInitials,\r\n items: [\r\n {\r\n name: json.username,\r\n html: 'person',\r\n },\r\n {\r\n beginGroup: true,\r\n name: 'Profile: ' + json.userProfile,\r\n html: 'badge',\r\n },\r\n {\r\n name: 'Organization: ' + json.userOrganization,\r\n html: 'corporate_fare',\r\n },\r\n {\r\n beginGroup: true,\r\n name: 'Interactive Reporting',\r\n html: 'equalizer',\r\n },\r\n {\r\n name: 'Version: ' + json.version,\r\n html: 'info',\r\n },\r\n {\r\n name: 'Date: ' + json.date,\r\n html: 'description',\r\n },\r\n {\r\n beginGroup: true,\r\n name: 'Change Password',\r\n html: 'password',\r\n visible: authenticationMode === \"IR\"\r\n },\r\n {\r\n beginGroup: true,\r\n name: 'Logout',\r\n html: 'logout',\r\n },\r\n ],\r\n },],\r\n hideSubmenuOnMouseLeave: false,\r\n displayExpr: 'name',\r\n onItemClick(data) {\r\n switch (data.itemData.name) {\r\n case \"Change Password\":\r\n irGlobal.changePassword();\r\n break;\r\n case \"Logout\":\r\n window.location.href = \"/Login/Logout\";\r\n break;\r\n }\r\n },\r\n },\r\n },\r\n ],\r\n }).dxToolbar(\"instance\");\r\n\r\n let updateViewBadge = function (removing: boolean = false) {\r\n if (removing && vm.showWorkbooksMode()) {\r\n let count = (menuList.find(x => x.key === \"View\").items.find(x => x.key == 1) as any).badge;\r\n (menuList.find(x => x.key === \"View\").items.find(x => x.key == 1) as any).badge = count > 0 ? count - 1 : 0;\r\n $(\".dx-list-item-badge.dx-badge\", $(\"span#itemElement-1\").closest(\".dx-item.dx-list-item\")).html((count > 0 ? count - 1 : 0) as any);\r\n }\r\n else {\r\n let count = json.workbooks.sort((a, b) => b.lastViewedDate - a.lastViewedDate).slice(0, 10).length;\r\n (menuList.find(x => x.key === \"View\").items.find(x => x.key == 1) as any).badge = count;\r\n $(\".dx-list-item-badge.dx-badge\", $(\"span#itemElement-1\").closest(\".dx-item.dx-list-item\")).html(count);\r\n }\r\n\r\n (menuList.find(x => x.key === \"View\").items.find(x => x.key == 2) as any).badge = json.workbooks.filter(x => x.workbook.favorite).length;\r\n $(\".dx-list-item-badge.dx-badge\", $(\"span#itemElement-2\").closest(\".dx-item.dx-list-item\")).html(json.workbooks.filter(x => x.workbook.favorite).length);\r\n\r\n (menuList.find(x => x.key === \"View\").items.find(x => x.key == 3) as any).badge = json.workbooks.length;\r\n $(\".dx-list-item-badge.dx-badge\", $(\"span#itemElement-3\").closest(\".dx-item.dx-list-item\")).html(json.workbooks.length);\r\n }\r\n\r\n const mappingNameDataField = \"mappingName\";\r\n const ownerUserNameDataField = \"ownerUserName\";\r\n const categoryNameDataField = \"categoryName\";\r\n const lastViewedDataField = \"lastViewed\";\r\n const viewsCounterDataField = \"viewsCounter\";\r\n let vm = {\r\n showWorkbooksMode: ko.observable(json.showWorkbooksMode),\r\n showTabs: ko.observable(json.showTabs),\r\n showWorkbooksType: ko.observable(json.showWorkbooksType),\r\n grouping: ko.observable(json.grouping),\r\n sortColumn: ko.observable(json.sortColumn),\r\n sortOrder: ko.observable(json.sortOrder),\r\n sortByFavoriteOrder: ko.observable(json.sortByFavoriteOrder),\r\n editFavoriteOrder: ko.observable(false),\r\n homeGridSettings: {\r\n elementAttr: {\r\n class: \"homeContent\"\r\n },\r\n width: '100%',\r\n height: \"calc(100vh - 40px)\",\r\n rowAlternationEnabled: true,\r\n headerFilter: {\r\n visible: true,\r\n search: {\r\n enabled: true\r\n },\r\n },\r\n columnChooser: {\r\n enabled: true,\r\n mode: \"select\"\r\n },\r\n dataSource: undefined,\r\n keyExpr: \"id\",\r\n //columnAutoWidth: true,\r\n dataRowTemplate(container, item) {\r\n const { data } = item;\r\n\r\n let tabsLink = \"\";\r\n if (vm.showTabs() && !irGlobal.isMobile()) {\r\n \r\n let count = 0;\r\n data.workbook.tabs.forEach(function (tab) {\r\n let icon = \"glyphicon-asterisk\";\r\n switch (tab.tabType) {\r\n case 1:\r\n icon = \"dashboard\";\r\n break;\r\n default:\r\n switch (tab.reportType) {\r\n case 1:\r\n icon = \"list_alt\";\r\n break;\r\n case 2:\r\n icon = \"equalizer\";\r\n break;\r\n case 3:\r\n icon = \"pivot_table_chart\";\r\n break;\r\n }\r\n break;\r\n }\r\n let style = tab.id == data.workbook.defaultTabId ? \"color: #ffc107;\" : \"\";\r\n let separator = count > 0 ? \" | \" : \"\";\r\n\r\n tabsLink += `
  • ${separator}\r\n ${icon}${tab.name}\r\n
  • `;\r\n\r\n count++;\r\n });\r\n }\r\n\r\n let sharedSpan = \"\";\r\n let defaultWorkbook = \"\";\r\n if (data.editMode !== 1 && !loggedUser.permissions.workbooks()) {\r\n let tooltip = data.editMode === 0 ? \"View Only\" : \"Shared by\";\r\n if (data.ownerUserName) {\r\n tooltip += ` User: ${data.ownerUserName}`;\r\n }\r\n if (data.ownerEmail) {\r\n tooltip += ` Email: ${data.ownerEmail}`;\r\n }\r\n sharedSpan = ` `;\r\n }\r\n\r\n if (data.id === json.defaultWorkbook) {\r\n defaultWorkbook = \" star\";\r\n }\r\n\r\n let lastViewed = data.lastViewed;\r\n if (data.lastViewed) {\r\n lastViewed = moment(data.lastViewed).format(json.dateFormat);\r\n }\r\n else {\r\n lastViewed = \"\";\r\n }\r\n\r\n const catColumn = item.columns.find(x => x.dataField === categoryNameDataField) ? 1 : 0;\r\n let colspan = (vm.grouping() === HomeGroupingEnum.None ? 6 : 5) + catColumn;\r\n if (!item.columns.find(x => x.dataField === mappingNameDataField))\r\n colspan--;\r\n if (!item.columns.find(x => x.dataField === ownerUserNameDataField))\r\n colspan--;\r\n if (!item.columns.find(x => x.dataField === lastViewedDataField))\r\n colspan--;\r\n if (!item.columns.find(x => x.dataField === viewsCounterDataField))\r\n colspan--;\r\n\r\n const rowspan = data.description ? 3 : 2;\r\n const markup = ''\r\n + (vm.editFavoriteOrder() && vm.showWorkbooksMode() === ShowWorkbooksModeEnum.Favorites && vm.grouping() === HomeGroupingEnum.None ? `` : \"\")\r\n + (vm.grouping() !== HomeGroupingEnum.None ? `` : \"\")\r\n + \"\"\r\n + `
    ${data.name}${sharedSpan}${defaultWorkbook}
    `\r\n /*+ (data.description ? `
    ${data.description}
    ` : \"\")*/\r\n + \"\"\r\n + (vm.grouping() !== HomeGroupingEnum.Mapping && item.columns.find(x => x.dataField === mappingNameDataField) ? `${data.mappingName}` : \"\")\r\n + (vm.grouping() !== HomeGroupingEnum.Owner && item.columns.find(x => x.dataField === ownerUserNameDataField) ? `${data.ownerUserName}` : \"\")\r\n + (vm.grouping() !== HomeGroupingEnum.Category && item.columns.find(x => x.dataField === categoryNameDataField) ? `${(data.categoryName ? data.categoryName : \"\")}` : \"\")\r\n + (item.columns.find(x => x.dataField === lastViewedDataField) ? `${lastViewed}` : \"\")\r\n + (item.columns.find(x => x.dataField === viewsCounterDataField) ? `${data.viewsCounter}` : \"\")\r\n + `\r\n ${ !data.workbook.favorite ? ` ` : \"\" }\r\n ${ data.workbook.favorite ? ` `: \"\"}\r\n ${ data.editMode === 1 || data.editMode === 2 || loggedUser.permissions.workbooks() ? ` ` : `` }\r\n ${ data.editMode === 1 || data.editMode === 2 || loggedUser.permissions.workbooks() ? ` ` : `` }\r\n ${ data.editMode === 1 || loggedUser.permissions.workbooks() ? ` `: ``}\r\n `\r\n + ''\r\n + (data.description ?\r\n ''\r\n + `${data.description}`\r\n + ''\r\n : \"\"\r\n )\r\n + (tabsLink !== \"\" ? \r\n ''\r\n + ``\r\n + ''\r\n : \"\"\r\n );\r\n\r\n container.append(markup);\r\n\r\n $(\".row-add-favorites\", container).off(\"click\").on(\"click\", function () {\r\n data.workbook.favorite = true;\r\n updateViewBadge();\r\n\r\n DevExpress.ui.notify({\r\n message: `Workbook '${data.name}' added to favorites`,\r\n type: 'info',\r\n position: { my: 'right top', at: 'right top', offset: { x: -20, y: 20 } },\r\n width: 300\r\n });\r\n \r\n item.component.repaintRows([item.component.getRowIndexByKey(item.key)]);\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.siteRoot + \"Home/UpdateFavorites\",\r\n { workbookId: data.id, favorite: true },\r\n null,\r\n null,\r\n true,\r\n \"POST\",\r\n false);\r\n });\r\n $(\".row-remove-favorites\", container).off(\"click\").on(\"click\", function () {\r\n data.workbook.favorite = false;\r\n updateViewBadge();\r\n\r\n DevExpress.ui.notify({\r\n message: `Workbook '${data.name}' removed to favorites`,\r\n type: 'info',\r\n position: { my: 'right top', at: 'right top', offset: { x: -20, y: 20 } },\r\n width: 300\r\n });\r\n\r\n let rowIndex = item.component.getRowIndexByKey(item.key);\r\n if (vm.showWorkbooksMode() === ShowWorkbooksModeEnum.Favorites) {//Favorites\r\n item.component.deleteRow(rowIndex);\r\n }\r\n else {\r\n item.component.repaintRows([rowIndex]);\r\n }\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.siteRoot + \"Home/UpdateFavorites\",\r\n { workbookId: data.id, favorite: false },\r\n null,\r\n null,\r\n true,\r\n \"POST\",\r\n false);\r\n });\r\n $(\".row-share-favorites\", container).off(\"click\").on(\"click\", function () {\r\n tabView.showSharedPopup(data.id);\r\n });\r\n $(\".row-edit-favorites\", container).off(\"click\").on(\"click\", function () {\r\n rowEditing = item;\r\n\r\n ($(\"#WorkbookNameEditModal\")[0] as any).value = data.name;\r\n $(\"#WorkbookNameEditModal\").css(\"border-color\", \"\");\r\n ($(\"#WorkbookDescriptionEditModal\")[0] as any).value = data.description;\r\n\r\n (document.querySelector('#WorkbookCategoryEditModal [value=\"' + data.categoryId + '\"]') as any).selected = true;\r\n\r\n ($('#modalNewWorkbookEdit') as any).modal('show');\r\n });\r\n $(\".row-delete-favorites\", container).off(\"click\").on(\"click\", function () {\r\n let result = DevExpress.ui.dialog.confirm(`Are you sure you want to delete the workbook?`, data.name);\r\n result.done(function (dialogResult) {\r\n if (dialogResult) {\r\n irGlobal.updateFromServer({},\r\n urlConfigs.siteRoot + \"Home/RemoveWorkbook\",\r\n { workbookId: data.id },\r\n function () {\r\n const rowIndex = item.component.getRowIndexByKey(item.key);\r\n const index = json.workbooks.indexOf(data);\r\n json.workbooks.splice(index, 1);\r\n item.component.deleteRow(rowIndex);\r\n updateViewBadge(true);\r\n },\r\n function () {\r\n irGlobal.notifyError(\"An error happend while the Workbook was being deleted.\");\r\n DevExpress.ui.notify({\r\n message: \"An error happend while the Workbook was being deleted\",\r\n type: 'error',\r\n position: { my: 'right top', at: 'right top', offset: { x: -20, y: 20 } },\r\n width: 400\r\n });\r\n },\r\n true,\r\n \"POST\");\r\n }\r\n });\r\n });\r\n },\r\n columns: [\r\n { dataField: \"workbook.favoriteOrder\", caption: \"order\", sortOrder: json.showWorkbooksMode === ShowWorkbooksModeEnum.Favorites ? \"asc\" : undefined, visible: false, dataType: \"number\", showInColumnChooser: false},\r\n { dataField: \"id\", caption: \"Workbook Id\", visible: false, dataType: \"number\", showInColumnChooser: false },\r\n { dataField: \"editMode\", visible: false, dataType: \"number\", showInColumnChooser: false },\r\n { dataField: \"ownerId\", visible: false, dataType: \"number\", showInColumnChooser: false },\r\n {\r\n dataField: \"name\",\r\n caption: \"Workbook\",\r\n dataType: \"string\",\r\n sortOrder: json.sortColumn === \"name\" && json.showWorkbooksMode !== ShowWorkbooksModeEnum.Favorites ? json.sortOrder : undefined,\r\n minWidth: 250,\r\n allowHiding: false\r\n },\r\n {\r\n dataField: \"mappingName\",\r\n dataType: \"string\",\r\n caption: \"Mapping\",\r\n sortOrder: json.sortColumn === \"mappingName\" && json.showWorkbooksMode !== ShowWorkbooksModeEnum.Favorites ? json.sortOrder : undefined,\r\n minWidth: 50,\r\n width: \"25%\",\r\n hidingPriority: irGlobal.isMobile() ? 0 : undefined,\r\n groupIndex: json.grouping === HomeGroupingEnum.Mapping ? 0 : undefined,\r\n visible: json.showMappingColumn\r\n },\r\n {\r\n dataField: \"ownerUserName\",\r\n dataType: \"string\",\r\n caption: \"Owner\",\r\n sortOrder: json.sortColumn === \"ownerUserName\" && json.showWorkbooksMode !== ShowWorkbooksModeEnum.Favorites ? json.sortOrder : undefined,\r\n minWidth: 50,\r\n width: \"25%\",\r\n hidingPriority: irGlobal.isMobile() ? 1 : undefined,\r\n groupIndex: json.grouping === HomeGroupingEnum.Owner ? 0 : undefined,\r\n visible: json.showOwnerColumn\r\n },\r\n {\r\n dataField: \"categoryName\",\r\n dataType: \"string\",\r\n caption: \"Category\",\r\n sortOrder: json.sortColumn === \"categoryName\" && json.showWorkbooksMode !== ShowWorkbooksModeEnum.Favorites ? json.sortOrder : undefined,\r\n visible: json.showCategoryColumn,\r\n width: 120,\r\n groupIndex: json.grouping === HomeGroupingEnum.Category ? 0 : undefined,\r\n hidingPriority: irGlobal.isMobile() ? 4 : undefined\r\n },\r\n {\r\n dataField: \"lastViewed\",\r\n dataType: \"datetime\",\r\n caption: \"Last Viewed\",\r\n sortOrder: json.sortColumn === \"lastViewed\" && json.showWorkbooksMode !== ShowWorkbooksModeEnum.Favorites ? json.sortOrder : undefined,\r\n width: 120,\r\n hidingPriority: irGlobal.isMobile() ? 2 : undefined,\r\n cellTemplate: function (container, options) {\r\n if (options.data.lastViewed) {\r\n const date = moment(options.data.lastViewed).format(json.dateFormat);\r\n container.append(date)\r\n }\r\n },\r\n visible: json.showLastViewedColumn\r\n },\r\n {\r\n dataField: \"viewsCounter\",\r\n dataType: \"number\",\r\n caption: \"Views\",\r\n sortOrder: json.sortColumn === \"viewsCounter\" && json.showWorkbooksMode !== ShowWorkbooksModeEnum.Favorites ? json.sortOrder : undefined,\r\n width: 70,\r\n hidingPriority: irGlobal.isMobile() ? 3 : undefined,\r\n visible: json.showViewsColumn\r\n },\r\n {\r\n type: \"buttons\",\r\n visible: irGlobal.isMobile() ? false : true,\r\n showInColumnChooser: false,\r\n buttons: [{\r\n hint: \"Add to favorites\",\r\n icon: \"favorites\",\r\n cssClass: \"custom-favorite\",\r\n visible: function (e) {\r\n return !e.row.data.workbook.favorite;\r\n }\r\n }, {\r\n hint: \"Remove from favorites\",\r\n icon: \"favorites\",\r\n visible: function (e) {\r\n return e.row.data.workbook.favorite;\r\n }\r\n }, {\r\n hint: \"Share\",\r\n icon: \"share\"\r\n }, {\r\n hint: \"Edit\",\r\n icon: \"edit\"\r\n }, {\r\n hint: \"Delete\",\r\n icon: \"remove\"\r\n }]\r\n },\r\n ],\r\n searchPanel: {\r\n visible: true,\r\n width: mobileDevice ? \"92%\" : 200,\r\n placeholder: 'Search...',\r\n searchVisibleColumnsOnly: true\r\n },\r\n scrolling: {\r\n mode: 'virtual'\r\n },\r\n paging: {\r\n enabled: false\r\n },\r\n sorting: {\r\n mode: 'none'\r\n },\r\n editing: {\r\n confirmDelete: false\r\n },\r\n rowDragging: {\r\n allowReordering: false,\r\n container: $(\".homeContent\").first(),\r\n onReorder(e) {\r\n const visibleRows = e.component.getVisibleRows();\r\n let dataSource = e.component.getDataSource().items();\r\n const toIndex = dataSource.findIndex((item) => item.id === visibleRows[e.toIndex].data.id);\r\n const fromIndex = dataSource.findIndex((item) => item.id === e.itemData.id);\r\n\r\n dataSource.splice(fromIndex, 1);\r\n dataSource.splice(toIndex, 0, e.itemData);\r\n\r\n let order = 0;\r\n let input = [];\r\n dataSource.forEach(function (row) {\r\n //Need to resolve when it is grouping\r\n if (row.workbook) {\r\n row.workbook.favoriteOrder = order;\r\n input.push({ workbookId: row.id, order: order });\r\n\r\n order++;\r\n }\r\n });\r\n\r\n e.component.refresh();\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.siteRoot + \"Home/UpdateFavoritesOrder\",\r\n { workbooks: input },\r\n null,\r\n null,\r\n true,\r\n \"POST\",\r\n false);\r\n }\r\n },\r\n showColumnLines: false,\r\n showRowLines: true,\r\n showBorders: false,\r\n filterValue: json.showWorkbooksType === ShowWorkbooksTypeEnum.All ? undefined : json.showWorkbooksType === ShowWorkbooksTypeEnum.Mine ? ['ownerId', '=', `${loggedUser.id()}`] : json.showWorkbooksType === ShowWorkbooksTypeEnum.OtherUsers ? ['ownerId', '<>', `${loggedUser.id()}`] : ['editMode', '<>', '1'],\r\n onRowClick: function (e) {\r\n if (e.rowType === \"data\" && e.data) {\r\n if (e.event.target && $(e.event.target).hasClass(\"viewonly\")) {\r\n irGlobal.copyTextToClipboard(e.data.ownerEmail, \"Email copied to clipboard\");\r\n return;\r\n }\r\n\r\n if (!irGlobal.isMobile()) {\r\n const companyId = getCompanyId();\r\n const url = `/wb/open/${e.data.id}?loadFromDb=True`;\r\n if (companyId > 0) {\r\n document.location = `${url}&companyId=${companyId}`;\r\n }\r\n else {\r\n document.location = url;\r\n }\r\n }\r\n }\r\n },\r\n onContentReady: function (e) {\r\n $('table tr ul.tablinks a', e.element).each(function () {\r\n $(this).click(function (e) {\r\n const companyId = getCompanyId();\r\n const url = `/wb/open/${$(this).data(\"wb\")}?tabId=${$(this).data(\"id\")}&loadFromDb=True`;\r\n if (companyId > 0) {\r\n document.location = `${url}&companyId=${companyId}`;\r\n }\r\n else {\r\n document.location = url;\r\n }\r\n });\r\n });\r\n },\r\n onCellPrepared: function (e) {\r\n let column = e.column;\r\n if (e.rowType == 'header' && column) {\r\n e.cellElement.on('click', function (evt) {\r\n if (vm.sortByFavoriteOrder() && vm.showWorkbooksMode() === ShowWorkbooksModeEnum.Favorites) {\r\n return;\r\n }\r\n\r\n vm.sortOrder(null);\r\n vm.sortColumn(\"\");\r\n\r\n let sortOrder = !e.column.sortOrder ? \"desc\" : e.column.sortOrder === \"desc\" ? \"asc\" : undefined;\r\n e.component.beginUpdate();\r\n e.component.clearSorting();\r\n if (sortOrder !== null) {\r\n e.component.columnOption(column.dataField, \"sortOrder\", sortOrder);\r\n\r\n vm.sortOrder(sortOrder);\r\n vm.sortColumn(column.dataField);\r\n }\r\n e.component.endUpdate();\r\n\r\n updateUserPreferences();\r\n });\r\n }\r\n },\r\n onContextMenuPreparing: function (e) {\r\n if (e.target === \"content\") {\r\n if (!e.items) {\r\n e.items = [];\r\n }\r\n\r\n e.items.push({\r\n text: \"Expand All\",\r\n onItemClick: function () {\r\n e.component.expandAll();\r\n }\r\n });\r\n e.items.push({\r\n text: \"Collapse All\",\r\n onItemClick: function () {\r\n e.component.collapseAll();\r\n }\r\n });\r\n }\r\n },\r\n onOptionChanged: function (e) {\r\n if (e.fullName && e.fullName.match(/columns\\[\\d+\\].visible/g)) {\r\n //Column Chooser changed\r\n //let idxColumn = parseInt(e.fullName.match(/\\d+/g));\r\n //let column = e.component.option(\"columns\")[idxColumn];\r\n updateUserPreferences();\r\n }\r\n },\r\n\r\n toolbar: {\r\n items: [{\r\n name: \"expandCollapse\",\r\n location: \"before\",\r\n widget: 'dxButton',\r\n options: {\r\n icon: \"collapse\",\r\n hint: \"Collapse All\",\r\n onClick(e) {\r\n const expanding = e.component.option('icon') === 'expand';\r\n $(\"#homeWorkbookGrid\").dxDataGrid(\"instance\").option('grouping.autoExpandAll', expanding);\r\n e.component.beginUpdate();\r\n e.component.option('icon', expanding ? 'collapse' : 'expand');\r\n e.component.option('hint', expanding ? 'Collapse All' : 'Expand All');\r\n e.component.endUpdate();\r\n },\r\n visible: json.grouping !== HomeGroupingEnum.None\r\n }\r\n }, {\r\n name: \"sortByFavorite\",\r\n location: \"before\",\r\n widget: 'dxButton',\r\n options: {\r\n icon: \"orderedlist\",\r\n hint: \"Sort by Favorite\",\r\n elementAttr: {\r\n class: json.sortByFavoriteOrder ? \"dx-state-selected\" : \"\"\r\n },\r\n onClick(e) {\r\n vm.sortByFavoriteOrder(!vm.sortByFavoriteOrder());\r\n if (vm.sortByFavoriteOrder()) {\r\n e.element.addClass(\"dx-state-selected\");\r\n }\r\n else {\r\n e.element.removeClass(\"dx-state-selected\");\r\n }\r\n\r\n e.element.removeClass(\"dx-state-focused\");\r\n },\r\n visible: json.showWorkbooksMode === ShowWorkbooksModeEnum.Favorites\r\n }\r\n }, {\r\n name: \"editFavoriteOrder\",\r\n location: \"before\",\r\n widget: 'dxButton',\r\n options: {\r\n icon: \"sorted\",\r\n hint: \"Edit Favorite Order\",\r\n onClick(e) {\r\n vm.editFavoriteOrder(!vm.editFavoriteOrder());\r\n if (vm.editFavoriteOrder()) {\r\n e.element.addClass(\"dx-state-selected\");\r\n }\r\n else {\r\n e.element.removeClass(\"dx-state-selected\");\r\n }\r\n\r\n e.element.removeClass(\"dx-state-focused\");\r\n },\r\n visible: json.showWorkbooksMode === ShowWorkbooksModeEnum.Favorites\r\n }\r\n }, \"searchPanel\", \"columnChooserButton\"]\r\n }\r\n }\r\n }\r\n vm.homeGridSettings.dataSource = getDataSource();\r\n\r\n let updateUserPreferences = function () {\r\n let columns = $(\"#homeWorkbookGrid\").dxDataGrid(\"instance\").getVisibleColumns();\r\n irGlobal.updateFromServer({},\r\n urlConfigs.user + \"UpdateUserPreferences\",\r\n {\r\n showTabs: vm.showTabs(),\r\n showWorkbooksType: vm.showWorkbooksType(),\r\n workbookGrouping: vm.grouping(),\r\n showWorkbooksMode: vm.showWorkbooksMode(),\r\n sortColumn: vm.sortColumn(),\r\n sortOrder: vm.sortOrder(),\r\n sortByFavoriteOrder: vm.sortByFavoriteOrder(),\r\n showMappingColumn: columns.find(x => x.dataField === mappingNameDataField) ? true : false,\r\n showOwnerColumn: columns.find(x => x.dataField === ownerUserNameDataField) ? true : false,\r\n showCategoryColumn: columns.find(x => x.dataField === categoryNameDataField) ? true : false,\r\n showLastViewedColumn: columns.find(x => x.dataField === lastViewedDataField) ? true : false,\r\n showViewsColumn: columns.find(x => x.dataField === viewsCounterDataField) ? true : false\r\n },\r\n undefined,\r\n undefined,\r\n true,\r\n \"POST\",\r\n false);\r\n }\r\n vm.showTabs.subscribe(updateUserPreferences);\r\n vm.showWorkbooksType.subscribe(updateUserPreferences);\r\n vm.grouping.subscribe(updateUserPreferences);\r\n updateGridTitle(vm);\r\n\r\n let updateWorkbooksModeAndSortFavorites = function () {\r\n updateUserPreferences();\r\n\r\n let dataGrid = $(\"#homeWorkbookGrid\").dxDataGrid(\"instance\");\r\n dataGrid.beginUpdate();\r\n dataGrid.option(\"rowDragging.allowReordering\", vm.showWorkbooksMode() === ShowWorkbooksModeEnum.Favorites && vm.editFavoriteOrder());\r\n\r\n dataGrid.clearSorting();\r\n if (vm.showWorkbooksMode() === ShowWorkbooksModeEnum.Favorites && vm.sortByFavoriteOrder()) {\r\n dataGrid.columnOption(\"workbook.favoriteOrder\", \"sortOrder\", \"asc\");\r\n }\r\n else {\r\n dataGrid.columnOption(vm.sortColumn(), \"sortOrder\", vm.sortOrder());\r\n }\r\n\r\n dataGrid.endUpdate();\r\n }\r\n\r\n vm.showWorkbooksMode.subscribe(updateWorkbooksModeAndSortFavorites);\r\n vm.sortByFavoriteOrder.subscribe(updateWorkbooksModeAndSortFavorites);\r\n vm.editFavoriteOrder.subscribe(updateWorkbooksModeAndSortFavorites);\r\n\r\n ko.applyBindings(vm, $(\".homeContent\").get(0));\r\n\r\n if (irGlobal.isMobile()) {\r\n $(\".loginContainer .dropdown\").off('show.bs.dropdown').on('show.bs.dropdown', function () {\r\n let dropDownAddFilter = $('.dropdown-menu', $(this));\r\n let addButtonPosition = $(this).parent().get(0).getBoundingClientRect();\r\n let top = addButtonPosition.bottom;\r\n top -= (dropDownAddFilter.outerHeight() + $(this).parent().outerHeight());\r\n\r\n dropDownAddFilter.css({ \"position\": \"fixed\", \"left\": `${(addButtonPosition.left + $(this).parent().width() - dropDownAddFilter.width()) - 10}px`, \"top\": `0px` });\r\n });\r\n }\r\n }\r\n var saveWorkbook = function (e) {\r\n if (e)\r\n e.preventDefault();\r\n\r\n var inputName = $(\"#WorkbookNameEditModal\");\r\n var workbookName = (inputName[0] as any).value;\r\n var workbookDescription = ($(\"#WorkbookDescriptionEditModal\")[0] as any).value;\r\n var workbookCategory = $(\"#WorkbookCategoryEditModal\")[0] as any;\r\n var workbookCategoryId = workbookCategory.value;\r\n var workbookCategoryName = workbookCategory.options[workbookCategory.selectedIndex].text;\r\n\r\n var submitObj = {\r\n name: workbookName,\r\n id: rowEditing.data.id,\r\n description: workbookDescription,\r\n categoryId: workbookCategoryId,\r\n categoryName: workbookCategoryName\r\n };\r\n\r\n var completeFunction = function (data) {\r\n inputName.val(data.name);\r\n if (data.isNameUnique) {\r\n const dataGrid = $(\"#homeWorkbookGrid\").dxDataGrid(\"instance\");\r\n rowEditing.data.name = data.name;\r\n rowEditing.data.description = data.description;\r\n rowEditing.data.categoryId = data.categoryId;\r\n rowEditing.data.categoryName = data.categoryName;\r\n //dataGrid.repaintRows([dataGrid.getRowIndexByKey(rowEditing.key)]);\r\n dataGrid.refresh(true);\r\n\r\n ($('#modalNewWorkbookEdit') as any).modal('hide');\r\n }\r\n else {\r\n inputName.focus();\r\n inputName.css(\"border-color\", \"indianred\");\r\n irGlobal.notifyError(\"Duplicated name, please choose another name.\");\r\n }\r\n };\r\n\r\n var url = urlConfigs.siteRoot + \"EditWorkbook\";\r\n irGlobal.updateFromServer(e,\r\n url,\r\n submitObj,\r\n completeFunction,\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n\r\n return false;\r\n };\r\n\r\n return {\r\n setup: setup,\r\n saveWorkbook: saveWorkbook,\r\n saveShowHideWorkbooks: saveShowHideWorkbooks\r\n };\r\n})();","DevExpress.config({ licenseKey: 'ewogICJmb3JtYXQiOiAxLAogICJjdXN0b21lcklkIjogImUzMjM4ZDJhLTY4YWMtNGVkNy1hZDczLTdiMGJhNmRlYTY3OSIsCiAgIm1heFZlcnNpb25BbGxvd2VkIjogMjMyCn0=.b6DwDkVvFsPEy+HqWI3SilkXRRiY77WOD7iBzDS3Za4+jxMFmdz6DtdpY6t7gGNTf2DiLTDyMu0NOeHH4jj3Y+CHPFW/wUWT42OLecOb4slua2PAvbbr5Mw1TieBoO8ZK00Sxg==' });",null,"var reportDesigner = (function () {\r\n let allMetricName = \"[ALL]\";\r\n let percentFunctionType;\r\n\r\n var designContainer = function () {\r\n return $(\"div#designContainer\");\r\n };\r\n\r\n var context;\r\n\r\n var validateDesigner = function (designer) {\r\n var output = {\r\n isValid: true,\r\n invalidMessage: \"\"\r\n };\r\n\r\n //Report or Pivot\r\n if (designer.reportType() !== ReportTypeStrEnum.Chart) {\r\n if (designer.rowElements().length > 0) {\r\n var hasNonMetric = false;\r\n var hasGroupBy = false;\r\n designer.rowElements().forEach(function (element) {\r\n if (element.metric() !== true)\r\n hasNonMetric = true;\r\n\r\n if (element.groupingType() && element.groupingType() === DesignerGroupingTypeEnum.GROUP_BY)\r\n hasGroupBy = true;\r\n });\r\n if (!hasNonMetric) {\r\n output.invalidMessage = \"It is necessary to have at least one non-metric.\";\r\n output.isValid = false;\r\n }\r\n else if (!hasGroupBy && designer.aggregateReport()) {\r\n output.invalidMessage = \"It is necessary to have at least one non-metric with 'Group By' Operation.\";\r\n output.isValid = false;\r\n }\r\n }\r\n else {\r\n output.invalidMessage = \"It is necessary to have rows definition.\";\r\n output.isValid = false;\r\n }\r\n\r\n //Pivot\r\n if (output.isValid && designer.reportType() === ReportTypeStrEnum.Pivot) {\r\n if (designer.groupElements().length === 0) {\r\n output.invalidMessage = \"It is necessary one column to pivot on.\";\r\n output.isValid = false;\r\n }\r\n else {\r\n hasGroupBy = false;\r\n designer.groupElements().forEach(function (element) {\r\n if (element.groupingType() && element.groupingType() === DesignerGroupingTypeEnum.GROUP_BY)\r\n hasGroupBy = true;\r\n });\r\n if (!hasGroupBy) {\r\n output.invalidMessage = \"It is necessary to have at least one non-metric with 'Group By' Operation on Columns(Pivot On).\";\r\n output.isValid = false;\r\n }\r\n }\r\n\r\n if (output.isValid && designer.metricElements().length === 0) {\r\n output.invalidMessage = \"It is necessary to have metrics.\";\r\n output.isValid = false;\r\n }\r\n }\r\n }\r\n //Chart\r\n else {\r\n if (designer.rowElements().length === 0 || designer.metricElements().length === 0) {\r\n output.invalidMessage = \"It is necessary a column on X and Y axis.\";\r\n output.isValid = false;\r\n return output;\r\n }\r\n\r\n hasGroupBy = false;\r\n designer.rowElements().forEach(function (element) {\r\n if (element.groupingType() && element.groupingType() === DesignerGroupingTypeEnum.GROUP_BY)\r\n hasGroupBy = true;\r\n });\r\n if (!hasGroupBy && designer.aggregateReport()) {\r\n output.invalidMessage = \"It is necessary to have at least a non-metric with 'Group By' Operation on X-Axis.\";\r\n output.isValid = false;\r\n return output;\r\n }\r\n\r\n if (designer.chartType() === ChartType.Bubble && designer.metricElements().length < 3 && designer.metricElements().find(function (x) { return x.id() === allMetricName }) === undefined) {\r\n output.invalidMessage = \"It is necessary at least 3 metrics for a Bubble Chart.\";\r\n output.isValid = false;\r\n }\r\n\r\n if (designer.chartType() === ChartType.Scatter && designer.metricElements().length < 2 && designer.metricElements().find(function (x) { return x.id() === allMetricName }) === undefined) {\r\n output.invalidMessage = \"It is necessary at least 2 metrics for a Scatter Chart.\";\r\n output.isValid = false;\r\n }\r\n }\r\n\r\n if (output.isValid) {\r\n let rows = irGlobal.groupBy(designer.rowElements().filter(function (x) { return !x.metric(); }), 'groupId', true);\r\n let groups = irGlobal.groupBy(designer.groupElements().filter(function (x) { return !x.metric(); }), 'groupId', true);\r\n\r\n var checkVisibleField = function (array, source, eachLevelMessage) {\r\n for (const property in array) {\r\n if (array[property].filter(function (x) { return x.visible(); }).length === 0) {\r\n output.isValid = false;\r\n output.invalidMessage = `${source} It is necessary to have at least one visible non-metric field ${(eachLevelMessage ? \" on each level\" : \"\")}.`;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n checkVisibleField(rows, designer.reportType() === ReportTypeStrEnum.Pivot ? \"Rows:\" : designer.reportType() === ReportTypeStrEnum.Chart ? \"X Axis: \" : \"Columns:\", designer.reportType() === ReportTypeStrEnum.Pivot ? true : false);\r\n checkVisibleField(groups, designer.reportType() === ReportTypeStrEnum.Pivot ? \"Columns:\" : \"Groups:\", designer.reportType() === ReportTypeStrEnum.Chart ? false : true);\r\n }\r\n\r\n if (!output.isValid)\r\n return output;\r\n\r\n if (designer.groupElements().length > 0) {\r\n hasGroupBy = false;\r\n designer.groupElements().forEach(function (element) {\r\n if (element.groupingType() && element.groupingType() === DesignerGroupingTypeEnum.GROUP_BY)\r\n hasGroupBy = true;\r\n });\r\n if (!hasGroupBy) {\r\n output.invalidMessage = `It is necessary to have at least a non-metric with 'Group By' Operation on ${vm.groupSectionName()}.`;\r\n output.isValid = false;\r\n return output;\r\n }\r\n }\r\n\r\n output.isValid = validateFields();\r\n //output.invalidMessage = output.isValid ? \"\" : \"Duplicated fields.\";\r\n\r\n if (output.isValid && !designer.aggregateReport() && designer.comparisonFilters().length > 0) {\r\n output.isValid = false;\r\n output.invalidMessage = \"It is not allowed to have Comparison Filter in a non-aggregated report.\";\r\n }\r\n\r\n if (output.isValid && designer.comparisonFilters().length > 0) {\r\n if (designer.comparisonFilters().filter(function (x) { return !x.name(); }).length > 0) {\r\n output.isValid = false;\r\n output.invalidMessage = \"Comparison Filter name cannot be blank.\";\r\n }\r\n\r\n if (output.isValid) {\r\n let groups = irGlobal.groupBy(designer.comparisonFilters(), 'name', true);\r\n for (const property in groups) {\r\n if (groups[property].length > 1) {\r\n output.isValid = false;\r\n output.invalidMessage = \"Duplicated comparison filter name.\";\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return output;\r\n };\r\n\r\n var validateFields = function () {\r\n var output = true;\r\n if (!validateFieldsArray(vm.designer.rowElements, vm.designer.groupElements))\r\n output = false;\r\n if (!validateFieldsArray(vm.designer.groupElements, vm.designer.rowElements))\r\n output = false;\r\n if (!validateFieldsArray(vm.designer.metricElements))\r\n output = false;\r\n return output;\r\n };\r\n\r\n var validateFieldsArray = function ($fields: KnockoutObservableArray, $otherFields: KnockoutObservableArray = null) {\r\n //Test duplicate non-metrics\r\n var output = true;\r\n\r\n for (let i = 0; i < $fields().length; i++) {\r\n let field = $fields()[i];\r\n field.isValid(true);\r\n field.invalidMessage(\"\");\r\n }\r\n\r\n for (let i = 0; i < $fields().length; i++) {\r\n let field = $fields()[i];\r\n var duplicated = false;\r\n if (field.isValid()) {\r\n for (var j = i + 1; j < $fields().length; j++) {\r\n var testField = $fields()[j];\r\n if (testField.queryName() === field.queryName()) {\r\n duplicated = true;\r\n testField.isValid(false);\r\n testField.invalidMessage(\"Duplicated field.\");\r\n }\r\n }\r\n if (!duplicated && $otherFields) {\r\n var otherField = $otherFields().find(x => x.queryName() === field.queryName());\r\n if (otherField)\r\n duplicated = true;\r\n }\r\n }\r\n if (!vm.allowDuplicatedNames())\r\n field.duplicatedName(checkDuplicatedName(field));\r\n\r\n if (duplicated || !vm.allowDuplicatedNames() && field.duplicatedName()) {\r\n field.isValid(false);\r\n field.invalidMessage(field.invalidMessage() + \" Duplicated name.\");\r\n output = false;\r\n }\r\n\r\n if (!field.displayName() || !field.displayName().trim()) {\r\n field.isValid(false);\r\n field.invalidMessage(field.invalidMessage() + \" Display name cannot be blank.\");\r\n output = false;\r\n }\r\n\r\n if (field.isExpression()) {\r\n let errorMessage = validateFormula(field.formulaTop(), field.formulaBottom(), field.groupingType(), true);\r\n if (errorMessage) {\r\n field.isValid(false);\r\n field.invalidMessage(field.invalidMessage() + \" \" + errorMessage);\r\n output = false;\r\n }\r\n }\r\n }\r\n\r\n return output;\r\n };\r\n\r\n var checkDuplicatedName = function (field) {\r\n var duplicate = false;\r\n if (vm.designer.rowElements().find(x => x.displayName() === field.displayName() && x !== field && (\r\n (x.metric() == field.metric() && x.metricId() != field.metricId()) || (x.metric() != field.metric())))) {\r\n duplicate = true;\r\n }\r\n\r\n if (!duplicate && vm.designer.groupElements().find(x => x.displayName() === field.displayName() && x !== field)) {\r\n duplicate = true;\r\n }\r\n\r\n if (!duplicate && vm.designer.metricElements().find(x => x.displayName() === field.displayName() && x !== field && (\r\n (x.metric() == field.metric() && x.metricId() != field.metricId()) || (x.metric() != field.metric())))) {\r\n duplicate = true;\r\n }\r\n\r\n return duplicate;\r\n }\r\n\r\n var applyObservables = function (vm) {\r\n applyObservablesForFieldArray(vm.designer.rowElements);\r\n applyObservablesForFieldArray(vm.designer.groupElements);\r\n applyObservablesForFieldArray(vm.designer.metricElements);\r\n for (let i = 0; i < vm.schema.tables().length; i++) {\r\n applyObservablesForFieldArray(vm.schema.tables()[i].fields);\r\n }\r\n applyObservablesForFieldArray(vm.schema.metrics);\r\n\r\n for (let i = 0; i < vm.designer.comparisonFilters().length; i++) {\r\n var comparisonFilter = vm.designer.comparisonFilters()[i];\r\n applyObservablesForComparisonFilter(comparisonFilter, vm);\r\n }\r\n };\r\n\r\n var applyObservablesForFieldArray = function ($fieldsArray) {\r\n for (var i = 0; i < $fieldsArray().length; i++) {\r\n var field = $fieldsArray()[i];\r\n applyObservablesForField(field);\r\n }\r\n };\r\n\r\n var applyObservablesForField = function (field) {\r\n if (field.comparisonType === undefined)\r\n field.comparisonType = ko.observable(DesignerComparisonTypeEnum.None);\r\n if (field.comparisonFilterId === undefined)\r\n field.comparisonFilterId = ko.observable(\"\");\r\n\r\n field.divColor = ko.computed(function () {\r\n if (this.metric()) {\r\n \r\n if (this.comparisonType() == DesignerComparisonTypeEnum.None) {\r\n if (!this.isExpression())\r\n return \"#777\"//\"#3c763d\";\r\n else\r\n return \"#444444\";\r\n }\r\n else {\r\n var filter = vm.designer.comparisonFilters().find(x => x.id() === this.comparisonFilterId());\r\n if (!filter)\r\n return \"#777\";\r\n else\r\n return filter.color();\r\n }\r\n //}\r\n //else\r\n // return \"#777\";\r\n }\r\n else {\r\n return this.groupingType() === DesignerGroupingTypeEnum.GROUP_BY ? \"#337ab7\" : \"#668aa2\";\r\n }\r\n }, field);\r\n\r\n field.isValid = ko.observable(true);\r\n field.duplicatedName = ko.observable(false);\r\n field.invalidMessage = ko.observable(\"\");\r\n\r\n var getQueryMetricName = function (metricId, functionType, comparisonType, comparisonFilterId) {\r\n let comparisonTypeId = getcomparisonTypeId(comparisonType);\r\n return `M${metricId}_T${functionType}_C${comparisonTypeId}_F${comparisonFilterId ?? \"\"}`;\r\n }\r\n\r\n field.queryName = ko.computed(function () {\r\n if (this.metric() && this.id() !== allMetricName) {\r\n return getQueryMetricName(this.metricId(), this.functionType(), this.comparisonType(), this.comparisonFilterId());\r\n }\r\n else {\r\n var output = `${this.displayTableName()}__${this.fieldName()}`;\r\n if (this.id() === allMetricName) {\r\n return output;\r\n }\r\n\r\n //if (this.isReportMetric())\r\n // output = `RM__${output}`;\r\n\r\n output = `${output}__${this.groupingType()}`;\r\n if (this.autoGrouping() !== AutoGroupingStrEnum.None)\r\n output = `${output}__${this.autoGrouping()}`;\r\n\r\n if (this.metric()/* || this.isReportMetric()*/) {\r\n if (this.comparisonType() !== DesignerComparisonTypeEnum.None)\r\n output = `${output}__${this.comparisonType()}${this.comparisonFilterId()}`;\r\n }\r\n\r\n if (this.functionType() !== FunctionTypeEnum.Normal)\r\n output = `${output}__T${this.functionType()}`;\r\n\r\n return output;\r\n }\r\n }, field);\r\n field.queryName.subscribeChanged(function (newValue, oldValue) {\r\n if (newValue !== oldValue && !vm.applyingBindings)\r\n validateFields();\r\n });\r\n //returns the base metric when it is a comparison metric\r\n field.parentQueryName = ko.computed(function () {\r\n if (this.metric() && this.id() !== allMetricName) {\r\n return getQueryMetricName(this.metricId(), this.functionType(), DesignerComparisonTypeEnum.None, \"\");\r\n }\r\n\r\n return this.queryName();\r\n }, field);\r\n field.groupingType.subscribeChanged(function (newValue, oldValue) {\r\n if (newValue !== oldValue && !vm.applyingBindings) {\r\n if (field.isExpression()) {\r\n if (newValue === DesignerGroupingTypeEnum.DSUM) {\r\n field.formulaBottom(\"\");\r\n }\r\n validateFields();\r\n }\r\n else {\r\n \r\n if (field.type() === DesignerDataTypeEnum.DATE && field.autoGrouping() !== AutoGroupingStrEnum.None && field.groupingType() !== DesignerGroupingTypeEnum.GROUP_BY) {\r\n var autoGrouping = vm.autoGroupingOptions.find(x => x.value === field.autoGrouping()).text;\r\n var groupingType = vm.allGroupingTypes.find(x => x.value === field.groupingType()).text;\r\n irGlobal.notifyError(`Cannot have ${autoGrouping} with Operation ${groupingType}. Changed Operation to Group By.`, \"right\", 80, $(\"#designContainer\"));\r\n\r\n //Cannot update directly here, otherwise the dxSelectBox won't update on screen\r\n setTimeout(function () {\r\n field.groupingType(DesignerGroupingTypeEnum.GROUP_BY);\r\n }, 100);\r\n\r\n }\r\n }\r\n }\r\n });\r\n field.format.subscribe(function (newValue) {\r\n if (vm.applyingBindings)\r\n return;\r\n\r\n if (newValue === FieldFormatEnum.Currency) {\r\n field.accountingStyle(true);\r\n }\r\n else if (newValue === FieldFormatEnum.Numeric) {\r\n field.accountingStyle(false);\r\n }\r\n\r\n if (newValue == FieldFormatEnum.Currency || newValue == FieldFormatEnum.Percentage) {\r\n field.decimalPlaces(2);\r\n }\r\n else {\r\n field.decimalPlaces(0);\r\n }\r\n });\r\n field.functionType.subscribeChanged(function (newValue, oldValue) {\r\n const functionType = parseInt(newValue, 10) as FunctionTypeEnum;\r\n if (percentFunctionType.indexOf(functionType) !== -1) {\r\n field.format(FieldFormatEnum.Percentage);\r\n }\r\n else if (field.comparisonType() === DesignerComparisonTypeEnum.None && (functionType === FunctionTypeEnum.AccumulatedAll || functionType === FunctionTypeEnum.Accumulated) && field.format() === FieldFormatEnum.Percentage) {\r\n field.format(FieldFormatEnum.Currency);\r\n }\r\n\r\n if (field.id() !== allMetricName && field.metric() && field.comparisonType() === DesignerComparisonTypeEnum.None) {\r\n if (functionType > FunctionTypeEnum.AccumulatedAll || (functionType == FunctionTypeEnum.Accumulated && vm.designer.reportType() !== ReportTypeStrEnum.Chart)) {\r\n vm.metricArray().remove(function (x) {\r\n return x.metric() && x.id() !== allMetricName && x.parentQueryName() === field.parentQueryName() && x.comparisonType() !== DesignerComparisonTypeEnum.None && x.functionType() == oldValue;\r\n });\r\n }\r\n else {\r\n let metrics = vm.metricArray()();\r\n if (metrics.filter(x => x.metric() && x.queryName() == x.queryName()).length > 1) {\r\n return;\r\n }\r\n\r\n metrics.filter(function (x) {\r\n return x.metric() && x.id() !== allMetricName && x.parentQueryName() === field.parentQueryName() && x.comparisonType() !== DesignerComparisonTypeEnum.None && x.functionType() == oldValue; })\r\n .forEach(function (x) {\r\n x.functionType(field.functionType());\r\n if (x.comparisonType() !== DesignerComparisonTypeEnum.PercentageVariation && (functionType === FunctionTypeEnum.AccumulatedAll || functionType === FunctionTypeEnum.Accumulated) && x.format() === FieldFormatEnum.Percentage) {\r\n x.format(FieldFormatEnum.Currency);\r\n }\r\n });\r\n }\r\n }\r\n }, field);\r\n field.marginLeft = ko.computed(function () {\r\n if (this.groupId() < 0 || vm.designer.reportType() === ReportTypeStrEnum.Chart) {\r\n return \"0px\";\r\n }\r\n\r\n if (vm.designer.reportType() === ReportTypeStrEnum.Analysis && vm.designer.rowElements().filter(function (x) { return !x.metric() && x.queryName() === this.queryName(); }.bind(this)).length > 0) {\r\n return \"0px\";\r\n }\r\n\r\n return `${(18 * this.groupId())}px`;\r\n }, field);\r\n field.width = ko.computed(function () {\r\n if (this.groupId() <= 0 || vm.designer.reportType() === ReportTypeStrEnum.Chart) {\r\n return \"\";\r\n }\r\n\r\n if (vm.designer.reportType() === ReportTypeStrEnum.Analysis && vm.designer.rowElements().filter(function (x) { return !x.metric() && x.queryName() === this.queryName(); }.bind(this)).length > 0) {\r\n return \"\";\r\n }\r\n\r\n return `calc(100% - ${(18 * this.groupId())}px)`;\r\n }, field);\r\n\r\n field.increaseGroupIdEnable = ko.computed(function () {\r\n let maxGroupId = -1;\r\n let elements = [];\r\n if (vm.designer.groupElements().filter(function (x) { return x.queryName() === this.queryName(); }.bind(this)).length > 0) {\r\n elements = vm.designer.groupElements();\r\n }\r\n else if (vm.designer.rowElements().filter(function (x) { return x.queryName() === this.queryName(); }.bind(this)).length > 0) {\r\n elements = vm.designer.rowElements();\r\n }\r\n\r\n elements.forEach(function (f) {\r\n if (f != this)\r\n maxGroupId = Math.max(maxGroupId, f.groupId());\r\n }.bind(this));\r\n\r\n return this.groupId() < maxGroupId + 1;\r\n\r\n }, field);\r\n field.decreaseGroupIdEnable = ko.computed(function () {\r\n return this.groupId() > 0;\r\n }, field);\r\n field.formatOptions = ko.computed(function () {\r\n let functionType = parseInt(field.functionType(), 10) as FunctionTypeEnum;\r\n if (percentFunctionType.indexOf(functionType) !== -1) {\r\n return [{ value: FieldFormatEnum.Percentage, text: \"Percentage\" }];\r\n }\r\n else if (field.comparisonType() === DesignerComparisonTypeEnum.None && (functionType === FunctionTypeEnum.AccumulatedAll || functionType === FunctionTypeEnum.Accumulated)) {\r\n return [\r\n { value: FieldFormatEnum.Numeric, text: \"Numeric\" },\r\n { value: FieldFormatEnum.Currency, text: \"Currency\" }\r\n ]\r\n }\r\n\r\n return [\r\n { value: FieldFormatEnum.Numeric, text: \"Numeric\" },\r\n { value: FieldFormatEnum.Currency, text: \"Currency\" },\r\n { value: FieldFormatEnum.Percentage, text: \"Percentage\" }\r\n ]\r\n }, field);\r\n };\r\n\r\n var updateFilterVisibility = function (fieldId, adding, comparisonFilterElement) {\r\n $(`li[data-fieldid='${fieldId}']`, comparisonFilterElement).each(function (idx, element) {\r\n if (adding) {\r\n $(this).addClass(\"hidden\");\r\n $(this).addClass(\"disabled\");\r\n }\r\n else {\r\n $(this).removeClass(\"hidden\");\r\n $(this).removeClass(\"disabled\");\r\n }\r\n });\r\n }\r\n\r\n var applyObservablesForComparisonFilter = function (comparisonFilter, vm) {\r\n let replaceMetricName = function (newValue, oldValue) {\r\n if (oldValue) {\r\n var metricArray = vm.metricArray();\r\n metricArray().filter(x => x.metric() && x.comparisonType() !== DesignerComparisonTypeEnum.None && x.comparisonFilterId() == comparisonFilter.id()).forEach(function (field) {\r\n field.displayName(field.displayName().replace(`${oldValue}`, `${newValue}`));\r\n });\r\n }\r\n }\r\n comparisonFilter.name.subscribeChanged(function (newValue, oldValue) {\r\n if (!newValue) {\r\n comparisonFilter.name(oldValue.substr(0, 1));\r\n replaceMetricName(oldValue.substr(0, 1), oldValue);\r\n return;\r\n }\r\n\r\n replaceMetricName(newValue, oldValue);\r\n }, comparisonFilter);\r\n\r\n comparisonFilter.dateOption.subscribeChanged(function (newValue, oldValue) {\r\n comparisonFilter.dateRange(comparisonFilter.dateRange());\r\n if (newValue === \"Manual\") {\r\n comparisonFilter.dateFieldName(\"\");\r\n comparisonFilter.dateField(null);\r\n }\r\n }, comparisonFilter);\r\n comparisonFilter.isManualDateOption = ko.computed(function () {\r\n return comparisonFilter.dateOption() === \"Manual\";\r\n });\r\n\r\n comparisonFilter.filters().forEach(function (filterVM) {\r\n //Copy filter properties beucase when converting an objcet to a Filter we lose the functions\r\n let filter = new Filter();\r\n Object.assign(filter, filterVM.filter);\r\n filter.isComparisonFilter = ko.observable(true);\r\n filterVM.filter = filter;\r\n filterVM.removeFilter = function () {\r\n let element = $(`.comparisonFilter[data-id=${comparisonFilter.id()}]`);\r\n updateFilterVisibility(this.filter.boundField(), false, element);\r\n comparisonFilter.filters.remove(this);\r\n }\r\n });\r\n comparisonFilter.comparisonBaseOptions = ko.computed(function () {\r\n let options = [{ value: \"\", text: \" \" }];\r\n vm.designer.comparisonFilters().forEach(function (comp) {\r\n if (comp.id() !== this.id()) {\r\n options.push({ value: comp.id(), text: comp.name() });\r\n }\r\n }.bind(this));\r\n return options;\r\n }, comparisonFilter)\r\n\r\n comparisonFilter.hasFocus = ko.observable();\r\n comparisonFilter.hasFocus.subscribe(function () {\r\n if (comparisonFilter.hasFocus()) {\r\n setTimeout(function () {\r\n $(\"#legend\").show();\r\n }, 200);\r\n }\r\n else {\r\n $(\"#legend\").hide();\r\n }\r\n });\r\n\r\n comparisonFilter.dateFieldName = ko.observable(\"\");\r\n if (comparisonFilter.dateField() && comparisonFilter.dateField() > 0) {\r\n comparisonFilter.dateFieldName(mappingDataSource.getFieldName(comparisonFilter.dateField()));\r\n }\r\n comparisonFilter.fieldTextBoxOptions = {\r\n value: comparisonFilter.dateFieldName,\r\n width: 156,\r\n readOnly: true,\r\n disabled: comparisonFilter.isManualDateOption,\r\n };\r\n comparisonFilter.fieldPopoverButtonOptions = {\r\n icon: \"bi bi-chat-left-dots\",\r\n hint: \"Choose the Date Field\",\r\n disabled: comparisonFilter.isManualDateOption,\r\n onClick: function (e) {\r\n mappingDataSource.setDblClickDataSource(function (item) {\r\n comparisonFilter.dateFieldName(item.displayName);\r\n comparisonFilter.dateField(item.fieldId);\r\n });\r\n mappingDataSource.showDataSourcePopover(\"DateNonDerivedDates\", $(e.element).siblings(\".dx-textbox\"));\r\n }\r\n };\r\n\r\n comparisonFilter.fieldRemoveButtonOptions = {\r\n icon: \"bi bi-x-circle\",\r\n hint: \"Remove the Date Field\",\r\n disabled: comparisonFilter.isManualDateOption,\r\n onClick: function (e) {\r\n comparisonFilter.dateFieldName(\"\");\r\n comparisonFilter.dateField(null);\r\n }\r\n };\r\n };\r\n\r\n var regexExpressionFormula = /\\[(?M(?\\d+)_T(?\\d+)_C(?\\d+)_F(?\\d*))\\]/g;\r\n var regexExpressionFormulaNames = /\\[(?.+?)\\]/g;\r\n\r\n var validateFormula = function (formulaTop: string, formulaBottom: string, groupingType: DesignerGroupingTypeEnum, isDbFormula: Boolean = false) {\r\n let errorMessage = \"\";\r\n\r\n if (groupingType === DesignerGroupingTypeEnum.DSUM) {\r\n if (!formulaTop) {\r\n errorMessage = \"Formula is empty\";\r\n }\r\n }\r\n else {\r\n if (!formulaTop) {\r\n errorMessage = \"Top Formula is empty\";\r\n }\r\n else if (!formulaBottom) {\r\n errorMessage = \"Bottom Formula is empty\";\r\n }\r\n }\r\n\r\n if (!errorMessage) {\r\n let formulaReturn = getDbFormula(formulaTop, formulaBottom, groupingType, \"(0)\", isDbFormula);\r\n\r\n if (formulaReturn.formula) {\r\n if (formulaReturn.notFoundFields.length > 0) {\r\n errorMessage = `Not found metrics: ${formulaReturn.notFoundFields.join(\", \")}`;\r\n }\r\n try {\r\n let result = eval(formulaReturn.formula.replace(\"=\", \"===\"));\r\n if (!isFinite(result) || isNaN(result)) {\r\n throw new Error(\"Possible division by zero or not a number result.\");\r\n }\r\n }\r\n catch (error) {\r\n if (errorMessage) {\r\n errorMessage += \"\\n\";\r\n }\r\n errorMessage += `Error evaluating expression: ${error}`;\r\n }\r\n\r\n if (!errorMessage) {\r\n let completeFunction = function (data) {\r\n errorMessage = data;\r\n };\r\n //Sync call\r\n irGlobal.updateFromServer({},\r\n urlConfigs.designer + \"ValidateFormula\",\r\n { formula: formulaReturn.formula },\r\n completeFunction,\r\n null,\r\n true, undefined, undefined, undefined, undefined, false);\r\n\r\n }\r\n }\r\n }\r\n return errorMessage;\r\n };\r\n\r\n var getDbFormula = function (formulaTop, formulaBottom, groupingType, replaceValue, isDbFormula) {\r\n let formula = groupingType === DesignerGroupingTypeEnum.DSUM ? formulaTop : `IIF((${formulaBottom}) = 0, 0, (${formulaTop})/(${formulaBottom}))`;\r\n const matches = formula.matchAll(regexExpressionFormulaNames);\r\n let notFoundFields = [];\r\n\r\n let availableFields = isDbFormula ? getAvailableFields() : expressionBuilderVM.availableFields;\r\n\r\n for (const match of matches) {\r\n let name = match.groups.name;\r\n let fieldExpression = !isDbFormula\r\n ? availableFields.find(x => x.displayName === name)\r\n : availableFields.find(x => x.queryName === name);\r\n\r\n if (replaceValue === undefined) {\r\n let metricName = `[${fieldExpression.queryName}]`;\r\n formula = formula.replace(match[0], metricName);\r\n }\r\n else {\r\n if (!fieldExpression) {\r\n notFoundFields.push(name);\r\n }\r\n formula = formula.replace(match[0], replaceValue);\r\n }\r\n }\r\n\r\n if (replaceValue === undefined) {\r\n return formula;\r\n }\r\n else {\r\n return {\r\n formula,\r\n notFoundFields,\r\n }\r\n }\r\n };\r\n\r\n var filterVariables = getFilterVariables().map(x => x.id).join(\"|\");\r\n var regexComparisonFilterVariables = `\\\\[(?${filterVariables})\\\\]`;\r\n\r\n var getAvailableFields = function () {\r\n var availableFields = [];\r\n let designerInputModel = ko.toJS(vm.designer);\r\n if (designerInputModel.reportType === ReportTypeStrEnum.Analysis) {\r\n availableFields = designerInputModel.rowElements.filter(x => x.metric && !x.isExpression);\r\n }\r\n else {\r\n availableFields = designerInputModel.metricElements.filter(x => !x.isExpression);\r\n }\r\n\r\n\r\n for (const field of availableFields) {\r\n\r\n //Set metric fields as visible to show at the tree view\r\n field.visible = true;\r\n\r\n //update display name to remove any [] and remove comparison filter variables \r\n //concatenate the filter name in the name if it is not included yet to avoid duplicated names, which would cause problem in the formulas\r\n let foundComparisonFilterVariables = false;\r\n\r\n if (field.displayName.includes(\"[\")) {\r\n\r\n const matches = field.displayName.matchAll(new RegExp(regexComparisonFilterVariables, 'gi'));\r\n\r\n for (const match of matches) {\r\n foundComparisonFilterVariables = true;\r\n\r\n let name = match.groups.name;\r\n if (field.comparisonFilterId) {\r\n let filter = designerInputModel.comparisonFilters.find(x => x.id === field.comparisonFilterId);\r\n if (!field.displayName.includes(filter.name)) {\r\n field.displayName = field.displayName.replace(match[0], ``) + ` (${filter.name})`;\r\n }\r\n else {\r\n field.displayName = field.displayName.replace(match[0], ``).trim();\r\n }\r\n }\r\n else {\r\n field.displayName = field.displayName.replace(match[0], ``).trim();\r\n }\r\n }\r\n }\r\n\r\n if (!foundComparisonFilterVariables && field.comparisonFilterId) {\r\n let filter = designerInputModel.comparisonFilters.find(x => x.id === field.comparisonFilterId);\r\n if (!field.displayName.includes(filter.name)) {\r\n field.displayName += ` (${filter.name})`;\r\n }\r\n }\r\n\r\n //replace any remain [] for () for the regex expression works\r\n field.displayName = field.displayName.replaceAll(\"[\", \"(\");\r\n field.displayName = field.displayName.replaceAll(\"]\", \")\");\r\n }\r\n\r\n return availableFields;\r\n }\r\n\r\n var getExpressionId = function () {\r\n var availableFields = [];\r\n let designerInputModel = ko.toJS(vm.designer);\r\n if (designerInputModel.reportType === ReportTypeStrEnum.Analysis) {\r\n availableFields = designerInputModel.rowElements.filter(x => x.metric && x.isExpression);\r\n }\r\n else {\r\n availableFields = designerInputModel.metricElements.filter(x => x.isExpression);\r\n }\r\n\r\n let id = -1;\r\n\r\n if (availableFields.length > 0) {\r\n id = Math.min(...availableFields.map(x => x.metricId));\r\n id--;\r\n }\r\n\r\n return id;\r\n }\r\n\r\n var expressionBuilderVM;\r\n var getExpressionBuilderVM = function (popup) {\r\n let field = vm.expressionBuilderField;\r\n\r\n let availableFields = getAvailableFields();\r\n\r\n let translateFormula = function (formula) {\r\n const matches = formula.matchAll(regexExpressionFormula);\r\n\r\n for (const match of matches) {\r\n let queryName = match.groups.queryName;\r\n let fieldExpression = availableFields.find(x => x.metricName === queryName);\r\n if (fieldExpression) {\r\n let fieldName = `[${fieldExpression.displayName}]`;\r\n formula = formula.replace(match[0], fieldName);\r\n }\r\n }\r\n\r\n return formula;\r\n };\r\n\r\n let translatedFormulaTop = translateFormula(field.formulaTop());\r\n let translatedFormulaBottom = translateFormula(field.formulaBottom());\r\n\r\n\r\n let isBinding = ko.dataFor($('#expression-builder-popup-content')[0]);\r\n if (!expressionBuilderVM || !isBinding) {\r\n expressionBuilderVM = {\r\n field: null,\r\n availableFields: availableFields,\r\n name: ko.observable(\"\"),\r\n groupingType: ko.observable(\"\"),\r\n calculateTotals: ko.observable(\"\"),\r\n formulaTop: ko.observable(\"\"),\r\n formulaBottom: ko.observable(\"\"),\r\n errorMessage: ko.observable(\"\"),\r\n fieldListOptions: {\r\n width: 300,\r\n height: 330,\r\n keyExpr: \"id\",\r\n displayExpr: \"displayName\",\r\n itemsExpr: \"items\",\r\n expandedExpr: \"expanded\",\r\n searchEnabled: true,\r\n onItemClick: function (e) {\r\n let options = expressionBuilderVM.fieldListOptions;\r\n let item = e.itemData;\r\n\r\n if (!options.timeout) {\r\n options.timeout = setTimeout(function () {\r\n options.timeout = null;\r\n }, 300);\r\n }\r\n else if (item === options.selectedItem && item.queryName) {\r\n let lastTarget = expressionBuilderVM.lastFormulaFocus === \"Top\" ? ($(\"#top-formula-expression-input\") as any) : ($(\"#bottom-formula-expression-input\") as any);\r\n\r\n let end = 0;\r\n let value;\r\n if (!item.function) {\r\n value = `[${item.displayName}]`;\r\n }\r\n else {\r\n value = item.function;\r\n }\r\n\r\n if (lastTarget === null) {\r\n //lastTarget = document.getElementById(\"TopFormula\");\r\n //let value = $(lastTarget).val();\r\n\r\n //if (value === \"\") {\r\n // $(lastTarget).val(expression);\r\n //} else {\r\n // $(lastTarget).val(`${value} ${expression}`);\r\n //}\r\n\r\n //$(lastTarget).putCursorAtEnd();\r\n } else {\r\n end = lastTarget.caret().end;\r\n\r\n if (value != \"\") {\r\n let i = lastTarget.caret().begin;\r\n let j = lastTarget.caret().end;\r\n\r\n let b = lastTarget.val().substring(0, i);\r\n let a = lastTarget.val().substring(j);\r\n\r\n let newFormula = `${b} ${value} ${a} `.trimLeft();\r\n if (expressionBuilderVM.lastFormulaFocus === \"Top\") {\r\n expressionBuilderVM.formulaTop(newFormula);\r\n }\r\n else {\r\n expressionBuilderVM.formulaBottom(newFormula);\r\n }\r\n }\r\n }\r\n\r\n if (expressionBuilderVM.lastFormulaFocus === \"Top\") {\r\n expressionBuilderVM.formulaTopTextArea.focus();\r\n }\r\n else {\r\n expressionBuilderVM.formulaBottomTextArea.focus();\r\n }\r\n\r\n if (lastTarget)\r\n lastTarget.caretTo(end + value.length + 1);\r\n }\r\n\r\n options.selectedItem = item;\r\n },\r\n },\r\n nameTextBoxOptions: {\r\n width: '100%',\r\n label: 'Name',\r\n labelMode: \"floating\",\r\n },\r\n groupingTypeTextBoxOptions: {\r\n width: '100%',\r\n label: 'Operation',\r\n labelMode: \"floating\",\r\n dataSource: new DevExpress.data.ArrayStore({\r\n data: vm.groupingTypeOptions({ isExpression: () => true, }),\r\n key: 'value',\r\n }),\r\n displayExpr: 'text',\r\n valueExpr: 'value',\r\n onValueChanged: function (value, previousValue, model, event, element, component) {\r\n let errorMessage = validateFormula(expressionBuilderVM.formulaTop(), expressionBuilderVM.formulaBottom(), expressionBuilderVM.groupingType());\r\n expressionBuilderVM.errorMessage(errorMessage);\r\n },\r\n },\r\n calculateTotalsTextBoxOptions: {\r\n dataSource: [{ value: 0, text: 'Use Formula' }, { value: 1, text: 'Sum Rows' }],\r\n displayExpr: 'text',\r\n valueExpr: 'value',\r\n width: '100%',\r\n label: 'Totals',\r\n labelMode: \"floating\",\r\n },\r\n topFormulaTextAreaOptions: {\r\n label: \"Formula Top\",\r\n labelMode: \"floating\",\r\n width: 400,\r\n height: 90,\r\n inputAttr: {\r\n id: 'top-formula-expression-input',\r\n },\r\n onValueChanged: function (value, previousValue, model, event, element, component) {\r\n let errorMessage = validateFormula(expressionBuilderVM.formulaTop(), expressionBuilderVM.formulaBottom(), expressionBuilderVM.groupingType());\r\n expressionBuilderVM.errorMessage(errorMessage);\r\n },\r\n onFocusIn: function () {\r\n expressionBuilderVM.lastFormulaFocus = \"Top\";\r\n },\r\n },\r\n bottomFormulaTextAreaOptions: {\r\n label: \"Formula Bottom\",\r\n labelMode: \"floating\",\r\n width: 400,\r\n height: 90,\r\n inputAttr: {\r\n id: 'bottom-formula-expression-input',\r\n },\r\n onValueChanged: function (value, previousValue, model, event, element, component) {\r\n let errorMessage = validateFormula(expressionBuilderVM.formulaTop(), expressionBuilderVM.formulaBottom(), expressionBuilderVM.groupingType());\r\n expressionBuilderVM.errorMessage(errorMessage);\r\n },\r\n onFocusIn: function () {\r\n expressionBuilderVM.lastFormulaFocus = \"Bottom\";\r\n },\r\n },\r\n errorTextAreaOptions: {\r\n autoResizeEnabled: true,\r\n width: 400,\r\n height: 60,\r\n readOnly: true,\r\n inputAttr: {\r\n style: \"color:#a70606\",\r\n },\r\n },\r\n };\r\n\r\n expressionBuilderVM.errorTextAreaOptions.value = expressionBuilderVM.errorMessage;\r\n expressionBuilderVM.nameTextBoxOptions.value = expressionBuilderVM.name;\r\n expressionBuilderVM.groupingTypeTextBoxOptions.value = expressionBuilderVM.groupingType;\r\n expressionBuilderVM.calculateTotalsTextBoxOptions.value = expressionBuilderVM.calculateTotals;\r\n expressionBuilderVM.topFormulaTextAreaOptions.value = expressionBuilderVM.formulaTop;\r\n expressionBuilderVM.bottomFormulaTextAreaOptions.value = expressionBuilderVM.formulaBottom;\r\n //update the field here too to render correctly the expresiion builder view\r\n expressionBuilderVM.field = field;\r\n ko.applyBindings(expressionBuilderVM, $('#expression-builder-popup-content')[0]);\r\n expressionBuilderVM.treeView = $(\"#expression-treeview\").dxTreeView(\"instance\");\r\n expressionBuilderVM.formulaTopTextArea = $(\"#metric-expression-top-formula\").dxTextArea(\"instance\");\r\n expressionBuilderVM.formulaBottomTextArea = $(\"#metric-expression-bottom-formula\").dxTextArea(\"instance\");\r\n //expressionBuilderVM.errorTextArea = $(\"#metric-expression-error\").dxTextArea(\"instance\");\r\n expressionBuilderVM.groupingType.subscribeChanged(function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n if (newValue === DesignerGroupingTypeEnum.DSUM) {\r\n expressionBuilderVM.formulaBottom(\"\");\r\n }\r\n expressionBuilderVM.formulaBottomTextArea.option(\"disabled\", expressionBuilderVM.groupingType() !== DesignerGroupingTypeEnum.WDSUM);\r\n }\r\n });\r\n }\r\n\r\n expressionBuilderVM.availableFields = availableFields;\r\n\r\n //Set to start as Top when double click on field list\r\n expressionBuilderVM.lastFormulaFocus = \"Top\";\r\n\r\n expressionBuilderVM.field = field;\r\n expressionBuilderVM.name(field.displayName());\r\n expressionBuilderVM.groupingType(field.groupingType());\r\n expressionBuilderVM.calculateTotals(field.calculateTotals());\r\n expressionBuilderVM.formulaTop(translatedFormulaTop);\r\n expressionBuilderVM.formulaBottom(translatedFormulaBottom);\r\n popup.option(\"title\", \"Expression: \" + expressionBuilderVM.field.displayName());\r\n expressionBuilderVM.formulaBottomTextArea.option(\"disabled\", expressionBuilderVM.groupingType() !== DesignerGroupingTypeEnum.WDSUM);\r\n expressionBuilderVM.treeView.option(\"items\", [{\r\n id: \"A\",\r\n displayName: \"Metrics\",\r\n items: availableFields,\r\n expanded: true,\r\n },\r\n {\r\n id: \"B\",\r\n displayName: \"Functions\",\r\n items: [\r\n {\r\n displayName: \"IIF(condition, trueValue, falseValue)\",\r\n function: \"IIF(A = B, trueValue, falseValue)\",\r\n queryName: \"IIF\",\r\n },\r\n {\r\n displayName: \"ISNULL(value, nullValue)\",\r\n function: \"ISNULL(value, nullValue)\",\r\n queryName: \"ISNULL\",\r\n },\r\n ],\r\n expanded: true,\r\n }\r\n ]);\r\n };\r\n\r\n var saveDesign = function (evt) {\r\n\r\n var validation = validateDesigner(vm.designer);\r\n\r\n if (!validation.isValid) {\r\n irGlobal.notifyError(\"This design is not valid. \" + validation.invalidMessage, \"center\", 200);\r\n return;\r\n }\r\n var designerInputModel = ko.toJS(vm.designer);\r\n\r\n designerInputModel.comparisonFilters.forEach(function (comparisonFilter) {\r\n let filters = [];\r\n comparisonFilter.filters.forEach(function (filterVM) {\r\n filters.push(filterVM.filter);\r\n });\r\n\r\n comparisonFilter.filters = filters;\r\n });\r\n\r\n switch (designerInputModel.reportType) {\r\n case ReportTypeStrEnum.Chart:\r\n designerInputModel.xAxis = designerInputModel.rowElements;\r\n designerInputModel.rowElements = [];\r\n designerInputModel.yAxis = designerInputModel.metricElements;\r\n designerInputModel.metricElements = [];\r\n break;\r\n case ReportTypeStrEnum.Pivot:\r\n designerInputModel.PivotElements = designerInputModel.groupElements;\r\n designerInputModel.groupElements = [];\r\n break;\r\n }\r\n\r\n if ($(\"#drawer\").attr(\"needToOpen\") === \"true\") {\r\n $(\"#drawer\").attr(\"needToOpen\", \"false\");\r\n $(\"#drawer\").dxDrawer(\"instance\").option(\"opened\", true);\r\n }\r\n\r\n var completeFunction = function (data) {\r\n if (callbackFunc) {\r\n callbackFunc(data.tempId, data.reportType);\r\n }\r\n if (!fromDashboard)\r\n showResultsForDesign(evt, designerInputModel);\r\n\r\n if (tabView) {\r\n tabView.updateWorkbookReportList(data);\r\n tabView.updateWorkbookDashboardList(data);\r\n }\r\n\r\n //Clear to recreate when the report designer is opened again later\r\n expressionBuilderVM = null;\r\n };\r\n irGlobal.updateFromServer({},\r\n urlConfigs.designer + \"Save\",\r\n designerInputModel,\r\n completeFunction,\r\n null,\r\n true);\r\n };\r\n\r\n var showResultsForDesign = function (evt, designerInputModel) {\r\n\r\n var url = urlConfigs.tabs + \"ShowResultsForDesign\";\r\n var isWidget = designerInputModel.widgetId ? true : false;\r\n if (isWidget)\r\n url = urlConfigs.dashboard + \"ShowResultsForDesign\";\r\n\r\n var completeFunction = function (data) {\r\n if (isWidget) {\r\n var dashboardWidget = dashboard.getWidget(designerInputModel.widgetId);\r\n dashboard.updateWidgetContents(dashboardWidget, data);\r\n } else {\r\n tabView.updateTabView(data);\r\n }\r\n };\r\n\r\n irGlobal.updateFromServer({},\r\n url,\r\n designerInputModel,\r\n completeFunction,\r\n null,\r\n true);\r\n };\r\n\r\n var renameField = function (button) {\r\n var divDraggable = $(button).closest(\"div.draggable\");\r\n if (!divDraggable.hasClass(\"dropped\") || divDraggable.data(\"all\") === true)\r\n return;\r\n var divFieldName = divDraggable.find(\"div.fieldName\");\r\n divFieldName.toggleClass(\"wrapper\");\r\n var input = divFieldName.find(\"input\");\r\n\r\n if (divFieldName.hasClass(\"wrapper\")) {\r\n input.attr(\"readonly\", \"true\");\r\n input.attr(\"disabled\", \"true\");\r\n input.off(\"keyup\");\r\n input.off(\"blur\");\r\n\r\n $(\"#legend\").hide();\r\n\r\n if (validateFields()) {\r\n let field = ko.contextFor(divDraggable[0]).$data;\r\n if (field.metric && field.metric()) {\r\n if (field.comparisonType() === DesignerComparisonTypeEnum.None) {\r\n let metrics = vm.metricArray()();\r\n let newName = input.val();\r\n let oldName = input.data(\"oldvalue\");\r\n\r\n let regMetaChars = /[-\\\\^$*+?.()|[\\]{}]/g;\r\n let pattern = oldName.replace(regMetaChars, '\\\\$&');\r\n let rgx = new RegExp(`^${pattern}`);\r\n\r\n let compMetrics = metrics.filter(x => x.metric() && x.parentQueryName() === field.parentQueryName() && x.comparisonType() !== DesignerComparisonTypeEnum.None && x.functionType() === field.functionType() && rgx.test(x.displayName()));\r\n if (compMetrics.length > 0 && oldName !== newName) {\r\n irGlobal.showYesNoMessage(\"Do you want to rename the comparison metrics?\", function (result) {\r\n if (result) {\r\n compMetrics.forEach(function (comparisonMetricField) {\r\n comparisonMetricField.displayName(comparisonMetricField.displayName().replace(rgx, newName));\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n input.data(\"oldvalue\", input.val());\r\n input.removeAttr(\"readonly\");\r\n input.removeAttr(\"disabled\");\r\n\r\n input.on(\"keyup\", function (event) {\r\n if (event.keyCode === 13) {\r\n event.preventDefault();\r\n if ((input.val() as any).trim() === \"\") {\r\n let oldValue = input.data(\"oldvalue\");\r\n input.val(oldValue);\r\n input.parent().attr(\"data-value\", oldValue);\r\n }\r\n input.blur();\r\n }\r\n else if (event.keyCode === 27) {\r\n event.preventDefault();\r\n let oldValue = input.data(\"oldvalue\");\r\n input.val(oldValue);\r\n input.parent().attr(\"data-value\", oldValue);\r\n input.blur();\r\n }\r\n });\r\n\r\n var isMetric = ko.contextFor(button).$data.metric();\r\n if (isMetric) {\r\n setTimeout(function () {\r\n $(\"#legend\").show();\r\n }, 200);\r\n }\r\n\r\n input.focus();\r\n input.on(\"blur\", function () { renameField(button) });\r\n }\r\n }\r\n var restoreComparisonMetrics = function (button) {\r\n if (vm.designer.comparisonFilters().length === 0) {\r\n showToast(\"There are no metrics to restore\", \"warning\");\r\n return;\r\n }\r\n\r\n const divDraggable = $(button).closest(\"div.draggable\");\r\n const field = ko.contextFor(divDraggable[0]).$data;\r\n const metrics = vm.metricArray()();\r\n const compMetrics = metrics.filter(x => x.metric() && x.parentQueryName() === field.parentQueryName() && x.comparisonType() !== DesignerComparisonTypeEnum.None && x.functionType() === field.functionType());\r\n if (compMetrics && compMetrics.length < (vm.designer.comparisonFilters().length * 3)) {\r\n vm.addComparisonMetrics(field);\r\n }\r\n else {\r\n showToast(\"There are no metrics to restore\", \"warning\");\r\n }\r\n }\r\n\r\n var cancelDesign = function (evt) {\r\n if ($(\"#drawer\").attr(\"needToOpen\") === \"true\") {\r\n $(\"#drawer\").attr(\"needToOpen\", \"false\");\r\n $(\"#drawer\").dxDrawer(\"instance\").option(\"opened\", true);\r\n }\r\n\r\n var widgetId = designContainer().data(\"widgetid\");\r\n if (widgetId) {\r\n var dashboardWidget = dashboard.getWidget(widgetId);\r\n $(\"#DesignModel\").dxPopup(\"instance\").hide();\r\n dashboard.refreshWidgetData(evt, dashboardWidget);\r\n } else {\r\n\r\n const url = urlConfigs.tabs + \"ShowResultsForDesign\";\r\n let config = tabView.getBaseSubmitObject({});\r\n const tabType = tabView.getActiveTab().data(\"tabtype\");\r\n config.reportType = tabType === \"ChartDesigner\" ? \"Chart\" : \"Analysis\";//set reporttype because when canceling the chart designer an error occurred\r\n\r\n irGlobal.updateFromServer({},\r\n url,\r\n config,\r\n tabView.updateTabView,\r\n null,\r\n true);\r\n }\r\n };\r\n\r\n var transformInReportMetric = function (field, fromComparison: boolean = false) {\r\n field.metric(true);\r\n field.isReportMetric(true);\r\n field.isMetricField(true);\r\n if (!field.mapField()) {\r\n field.mapField(true);\r\n field.id(\"\");\r\n }\r\n if (field.type() === DesignerDataTypeEnum.DATE) {\r\n field.autoGrouping(AutoGroupingStrEnum.None);\r\n }\r\n if (!fromComparison) {\r\n if (field.type() !== DesignerDataTypeEnum.NUMBER) {\r\n field.groupingType(DesignerGroupingTypeEnum.COUNT);\r\n field.decimalPlaces(0);\r\n }\r\n else {\r\n field.groupingType(DesignerGroupingTypeEnum.SUM);\r\n }\r\n }\r\n };\r\n\r\n var removeField = function (field, parent, event) {\r\n parent.elements.remove(field);\r\n //Remove any variation field related to the metric because we can't have it without the main metric in the moment\r\n if (field.id() !== allMetricName && field.metric() && field.comparisonType() === DesignerComparisonTypeEnum.None)\r\n parent.elements.remove(function (metric) {\r\n return metric.id() !== allMetricName && metric.parentQueryName() === field.parentQueryName() && metric.functionType() === field.functionType() &&\r\n (metric.comparisonType() === DesignerComparisonTypeEnum.Variation || metric.comparisonType() === DesignerComparisonTypeEnum.PercentageVariation);\r\n });\r\n validateFields();\r\n\r\n if ((parent.name === \"groupElements\" && vm.designer.reportType() === ReportTypeStrEnum.Analysis) ||\r\n ((parent.name === \"groupElements\" || parent.name === \"rowElements\") && vm.designer.reportType() === ReportTypeStrEnum.Pivot)) {\r\n sortNextGroupId(field.groupId(), parent.elements());\r\n }\r\n };\r\n\r\n function sortNextGroupId(groupId, elements) {\r\n if (elements.filter(function (x) { return x.groupId() === groupId; }).length === 0) {\r\n elements.filter(function (x) { return x.groupId() > groupId; }).forEach(function (field) {\r\n field.groupId(field.groupId() - 1);\r\n });\r\n }\r\n }\r\n\r\n var getcomparisonTypeId = function (comparisonType) {\r\n //None, Value, Variation, PercentageVariation\r\n let comparisonTypeId = comparisonType === DesignerComparisonTypeEnum.None ? 0 : (comparisonType === DesignerComparisonTypeEnum.Value ? 1 : (comparisonType === DesignerComparisonTypeEnum.Variation ? 2 : 3));\r\n return comparisonTypeId;\r\n }\r\n\r\n function DesignerViewModel(designerVM, schemaVM) {\r\n var self = this;\r\n\r\n designerVM.dropSection = \"Row\";\r\n self.designer = ko.mapping.fromJS(designerVM);\r\n\r\n for (let i = 0; i < self.designer.comparisonFilters().length; i++) {\r\n var comparisonFilter = self.designer.comparisonFilters()[i];\r\n comparisonFilter.dateUnit.subscribe(function (value) {\r\n if (value !== ComparisonDateUnitStrEnum.Day && this.dateUnitValue() > 12) {\r\n this.dateUnitValue(1);\r\n }\r\n }.bind(comparisonFilter));\r\n }\r\n\r\n self.designer.isWidget = ko.observable(designerVM.widgetId !== 0);\r\n self.schema = ko.mapping.fromJS(schemaVM);\r\n self.designer.reportTypeStr = ko.computed(function () { return this.reportType(); }, self.designer);\r\n\r\n self.groupSectionName = ko.computed(function () {\r\n return this.reportType() === ReportTypeStrEnum.Chart ? 'Group' : (this.reportType() === ReportTypeStrEnum.Pivot ? 'Columns (Pivot On)' : 'Group');\r\n }, self.designer);\r\n\r\n self.changingReportType = false;\r\n\r\n self.designer.reportType.subscribe(function (newValue) {\r\n self.changingReportType = true;\r\n switch (newValue) {\r\n case ReportTypeStrEnum.Analysis:\r\n for (let i = 0; i < self.designer.metricElements().length; i++) {\r\n if (self.designer.metricElements()[i].functionType() == FunctionTypeEnum.Accumulated) {\r\n self.designer.metricElements()[i].functionType(FunctionTypeEnum.AccumulatedAll);\r\n }\r\n\r\n self.designer.rowElements.push(self.designer.metricElements()[i]);\r\n }\r\n self.designer.metricElements.removeAll();\r\n break;\r\n default:\r\n var metrics = self.designer.rowElements.remove(function (item) { return item.metric(); });\r\n for (let i = 0; i < metrics.length; i++) {\r\n self.designer.metricElements.push(metrics[i]);\r\n }\r\n break;\r\n }\r\n\r\n self.changingReportType = false;\r\n setSizeBoxElements();\r\n }, self.designer);\r\n\r\n self.decimalPlacesOptions = [\r\n { value: 0, text: \"None(0)\" },\r\n { value: 1, text: \"One(0.0)\" },\r\n { value: 2, text: \"Two(0.00)\" },\r\n { value: 3, text: \"Three(0.000)\" },\r\n { value: 4, text: \"Four(0.0000)\" },\r\n { value: 5, text: \"Five(0.00000)\" },\r\n { value: 15, text: \"All\" }\r\n ];\r\n\r\n self.allGroupingTypes = [\r\n { value: DesignerGroupingTypeEnum.GROUP_BY, text: \"Group By\", enabled: true },\r\n { value: DesignerGroupingTypeEnum.MAX, text: \"Max\", enabled: true },\r\n { value: DesignerGroupingTypeEnum.MIN, text: \"Min\", enabled: true },\r\n { value: DesignerGroupingTypeEnum.SUM, text: \"Sum\", enabled: false },\r\n { value: DesignerGroupingTypeEnum.COUNT, text: \"Count\", enabled: true },\r\n { value: DesignerGroupingTypeEnum.WSUM, text: \"WSum\", enabled: false },\r\n { value: DesignerGroupingTypeEnum.DSUM, text: \"Derived Sum\", enabled: false, forExpression: true },\r\n { value: DesignerGroupingTypeEnum.WDSUM, text: \"Derived Weight Sum\", enabled: false, forExpression: true },\r\n ];\r\n\r\n self.groupingTypeOptions = function (field) {\r\n if (field.isExpression()) {\r\n return self.allGroupingTypes.filter(x => x.forExpression);\r\n }\r\n else {\r\n return self.allGroupingTypes.filter(x => x.enabled);\r\n }\r\n };\r\n\r\n self.functionOptions = function (field) {\r\n let options = [\r\n { value: FunctionTypeEnum.Normal, text: \"Normal\" },\r\n { value: FunctionTypeEnum.PercentOfTotal, text: \"Percent of Total\" },\r\n { value: FunctionTypeEnum.AccumulatedAll, text: \"Accumulated All\" }\r\n ];\r\n\r\n if (field.groupingType() !== DesignerGroupingTypeEnum.DSUM && field.groupingType() !== DesignerGroupingTypeEnum.WDSUM) {\r\n options.push({ value: FunctionTypeEnum.Rank, text: \"Rank\" });\r\n }\r\n\r\n if (self.designer.reportType() === ReportTypeStrEnum.Pivot) {\r\n options.push({ value: FunctionTypeEnum.Accumulated, text: \"Accumulated\" });\r\n options.push({ value: FunctionTypeEnum.PercentOfRowTotal, text: \"Percent of Row Total\" });\r\n options.push({ value: FunctionTypeEnum.PercentOfRowGrandTotal, text: \"Percent of Row Grand Total\" });\r\n options.push({ value: FunctionTypeEnum.PercentOfColumnTotal, text: \"Percent of Column Total\" });\r\n options.push({ value: FunctionTypeEnum.PercentOfColumnGrandTotal, text: \"Percent of Column Grand Total\" });\r\n options.push({ value: FunctionTypeEnum.AbsoluteVariation, text: \"Absolute Variation\" });\r\n options.push({ value: FunctionTypeEnum.PercentVariation, text: \"Percent Variation\" });\r\n }\r\n else if (self.designer.reportType() === ReportTypeStrEnum.Chart) {\r\n options.push({ value: FunctionTypeEnum.Accumulated, text: \"Accumulated\" });\r\n }\r\n\r\n if (field.groupingType() === DesignerGroupingTypeEnum.TSUM) {\r\n return [{ value: FunctionTypeEnum.Normal, text: \"Normal\" }];\r\n }\r\n\r\n return options;\r\n };\r\n\r\n self.autoGroupingOptions = [\r\n { value: AutoGroupingStrEnum.None, text: \" \" },\r\n { value: AutoGroupingStrEnum.ByDay, text: \"By Day\" },\r\n { value: AutoGroupingStrEnum.ByWeek, text: \"By Week\" },\r\n { value: AutoGroupingStrEnum.ByMonth, text: \"By Month\" },\r\n { value: AutoGroupingStrEnum.ByQuarter, text: \"By Quarter\" },\r\n { value: AutoGroupingStrEnum.ByYear, text: \"By Year\" },\r\n { value: AutoGroupingStrEnum.ByMonthOnly, text: \"By Month Only\" },\r\n { value: AutoGroupingStrEnum.ByQuarterOnly, text: \"By Quarter Only\" },\r\n ];\r\n\r\n self.visualizationModeOptions = [\r\n { value: DesignerFieldVisualizationModeEnum.Value, text: \"Value\" },\r\n { value: DesignerFieldVisualizationModeEnum.BarChart, text: \"Bar Chart\" }\r\n ];\r\n\r\n self.barChartTextOptions = [\r\n { value: DesignerFieldBarChartTextEnum.None, text: \"None\" },\r\n { value: DesignerFieldBarChartTextEnum.Value, text: \"Value\" },\r\n { value: DesignerFieldBarChartTextEnum.Percentage, text: \"Percentage\" }\r\n ];\r\n\r\n self.barChartTextPositionOptions = [\r\n { value: DesignerFieldBarChartTextPositionEnum.Begin, text: \"Begin\" },\r\n { value: DesignerFieldBarChartTextPositionEnum.Center, text: \"Center\" },\r\n { value: DesignerFieldBarChartTextPositionEnum.End, text: \"End\" }\r\n ];\r\n\r\n self.beforeMoveRowElements = function (arg) {\r\n if (arg.item.metric() && self.designer.reportType() !== ReportTypeStrEnum.Analysis) {\r\n arg.cancelDrop = true;\r\n showToast(\"It is not allowed to add the metric as field\", \"warning\");\r\n }\r\n };\r\n\r\n self.beforeMoveGroupElements = function (arg) {\r\n if (arg.item.metric()) {\r\n arg.cancelDrop = true;\r\n showToast(\"It is not allowed to add the metric as field\", \"warning\");\r\n }\r\n };\r\n\r\n self.beforeMoveMetricElements = function (arg) {\r\n if (!arg.item.isMetricField()) {\r\n arg.cancelDrop = true;\r\n showToast(\"It is not allowed to add the field as metric\", \"warning\");\r\n }\r\n };\r\n\r\n self.afterMoveToRowElements = function (arg) {\r\n self.checkMetricRules(arg.item);\r\n validateFields();\r\n\r\n if (self.designer.reportType() === ReportTypeStrEnum.Pivot) {\r\n let index = arg.targetParent().indexOf(arg.item);\r\n if (index > 0) {\r\n let siblingElement = arg.targetParent()[index - 1];\r\n let oldGroupId = arg.item.groupId();\r\n arg.item.groupId(siblingElement.groupId());\r\n sortNextGroupId(oldGroupId, arg.targetParent());\r\n }\r\n }\r\n };\r\n\r\n self.afterMoveToGroupElements = function (arg) {\r\n self.checkMetricRules(arg.item);\r\n validateFields();\r\n\r\n if (self.designer.reportType() !== ReportTypeStrEnum.Chart) {\r\n let index = arg.targetParent().indexOf(arg.item);\r\n if (index > 0) {\r\n let siblingElement = arg.targetParent()[index - 1];\r\n let oldGroupId = arg.item.groupId();\r\n arg.item.groupId(siblingElement.groupId());\r\n sortNextGroupId(oldGroupId, arg.targetParent());\r\n }\r\n }\r\n };\r\n\r\n self.afterMoveToMetricElements = function (arg) {\r\n var field = arg.item;\r\n if (!field.metric()) {\r\n transformInReportMetric(field);\r\n }\r\n self.checkMetricRules(arg.item);\r\n validateFields();\r\n };\r\n\r\n self.afterMoveComparisonFilter = function (arg) {\r\n\r\n };\r\n\r\n self.transformInReportMetric = function (field) {\r\n transformInReportMetric(field);\r\n };\r\n\r\n self.transformNonMetric = function (field) {\r\n field.metric(false);\r\n field.isReportMetric(false);\r\n field.isMetricField(false);\r\n /*field.queryName(`${field.tableName()}__${field.fieldName()}`);*/\r\n if (!field.mapField()) {\r\n field.mapField(true);\r\n field.id(\"\");\r\n }\r\n field.groupingType(DesignerGroupingTypeEnum.GROUP_BY)\r\n };\r\n\r\n self.addingField = false;\r\n self.dragged = function (item, event, ui) {\r\n var $clone = self.koClone(item);\r\n self.addingField = true;\r\n return $clone;\r\n };\r\n\r\n self.bindingsApplied = ko.observable(false);\r\n\r\n self.afterRenderCallback = function () {\r\n self.bindingsApplied(true);\r\n ($(\"#designContainer #ReportType\") as any).selectpicker('render');\r\n };\r\n\r\n self.afterAddField = function (element, index, data) {\r\n validateFields();\r\n\r\n var elementField = $(element);\r\n elementField.addClass(\"animate__animated animate__fadeIn\");\r\n elementField.on(\"animationend\", function () {\r\n elementField.removeClass(\"animate__animated\");\r\n });\r\n\r\n if (self.addingField && data.metric() && data.comparisonType() === DesignerComparisonTypeEnum.None) {\r\n self.addingField = false;\r\n setTimeout(() => { self.addComparisonMetrics(data); }, 1);\r\n }\r\n };\r\n\r\n self.beforeRemoveField = function (element, index, data) {\r\n var field = $(element);\r\n field.css(\"--animate-duration\", \".5s\");\r\n field.addClass(\"animate__animated animate__fadeOut\");\r\n field.on(\"animationend\", function () {\r\n field.remove();\r\n });\r\n };\r\n\r\n self.fieldInfoPopoverOptions = function ($element, data, schemaField) {\r\n if (schemaField)\r\n return undefined;\r\n\r\n let $fieldDiv = $($element).closest(\".ui-widget-content\");\r\n\r\n return {\r\n target: $fieldDiv,\r\n container: $element,\r\n showEvent: 'mouseenter',\r\n hideEvent: 'mouseleave',\r\n position: 'left',\r\n width: 330,\r\n disabled: data.all(),\r\n onHiding: function (e) {\r\n $(\"#popover-formattingRule\").dxPopover(\"instance\").hide();\r\n }\r\n };\r\n };\r\n\r\n self.metricArray = function () {\r\n return self.designer.reportType() === ReportTypeStrEnum.Analysis ? self.designer.rowElements : self.designer.metricElements;\r\n };\r\n\r\n self.checkMetricRules = function ($element) {\r\n if ($element.metric()) {\r\n if ($element.all())\r\n self.removeMetrics();\r\n else\r\n self.removeAllMetric();\r\n }\r\n }\r\n\r\n self.addSchemaField = function ($element, event, checkDuplicated) {\r\n //Abort if the field was already dropped\r\n if (event && $(event.target).parents(\".designerrow\").length > 0)\r\n return;\r\n\r\n var $elementsArray = self.designer.dropSection() === \"Row\" ? self.designer.rowElements : self.designer.groupElements;\r\n if ($element.metric()) {\r\n $elementsArray = self.metricArray();\r\n }\r\n\r\n self.checkMetricRules($element);\r\n\r\n $element = self.koClone($element);\r\n\r\n //if (!$element.metric() && !checkDuplicated || !self.checkDuplicated($elementsArray, $element)) {\r\n $elementsArray.push($element);\r\n if ($element.metric()) {\r\n self.addComparisonMetrics($element);\r\n }\r\n //}\r\n //else\r\n //irGlobal.notify(`The field ${$element.displayName()} was already added.`);\r\n return $element;\r\n };\r\n\r\n self.removeAllMetric = function () {\r\n var $array = self.metricArray();\r\n var allMetric = $array().find(function (x) { return x.id() === allMetricName; })\r\n if (allMetric)\r\n $array.remove(allMetric)\r\n }\r\n\r\n self.removeMetrics = function () {\r\n var $array = self.metricArray();\r\n $array.remove(function ($element) { return $element.metric() && !$element.all(); });\r\n };\r\n\r\n self.checkDuplicated = function ($array, $element) {\r\n var field = self.findFieldByQueryName($array, $element.queryName(), true);\r\n return field !== null;\r\n };\r\n\r\n self.findFieldByQueryName = function ($array, queryName, notReportMetric) {\r\n var array = $array();\r\n for (var i = 0; i < array.length; i++) {\r\n if (array[i].queryName() === queryName && (!notReportMetric || !array[i].isReportMetric()))\r\n return array[i];\r\n }\r\n return null;\r\n };\r\n\r\n self.koClone = function ($item) {\r\n var itemJS = ko.mapping.toJS($item);\r\n var $clonedItem = ko.mapping.fromJS(itemJS) as any;\r\n //Apply Group By always - John asked for it\r\n if (!$clonedItem.metric())\r\n $clonedItem.groupingType(DesignerGroupingTypeEnum.GROUP_BY);\r\n applyObservablesForField($clonedItem);\r\n return $clonedItem;\r\n };\r\n\r\n self.clearFields = function ($elementsArray) {\r\n $elementsArray.removeAll();\r\n };\r\n\r\n self.addExpression = function ($elementsArray, $rawData, event) {\r\n let id = getExpressionId();\r\n\r\n var metric = ko.mapping.fromJS({\r\n all: false,\r\n autoGrouping: AutoGroupingStrEnum.None,\r\n backgroundColor: \"#FFFFFF\",\r\n color: \"\",\r\n foreColor: \"\",\r\n displayName: `New Expression ${(id * -1)}`,\r\n fieldName: \"Expression\",\r\n displayFieldNameDB: \"Expression\",\r\n groupingType: DesignerGroupingTypeEnum.DSUM,\r\n id: id,\r\n isReportMetric: true,\r\n mapField: true,\r\n metric: true,\r\n metricName: \"Expression\",\r\n order: 1,\r\n tableName: \"metrics\",\r\n displayTableName: \"metrics\",\r\n thresholdColor: \"\",\r\n thresholdValue: 0,\r\n type: DesignerDataTypeEnum.NUMBER,\r\n comparisonType: DesignerComparisonTypeEnum.None,\r\n comparisonFilterId: \"\",\r\n metricId: id,\r\n isMetricField: true,\r\n titleAlign: 0,\r\n valuesAlign: 0,\r\n formattingRuleId: 0,\r\n formattingRuleName: \"\",\r\n groupId: -1,\r\n functionType: FunctionTypeEnum.Normal,\r\n showTotalValue: true,\r\n showSubtotalValue: true,\r\n decimalPlaces: 2,\r\n format: FieldFormatEnum.Numeric,\r\n visualizationMode: DesignerFieldVisualizationModeEnum.Value,\r\n barChartText: DesignerFieldBarChartTextEnum.Value,\r\n barChartTextPosition: DesignerFieldBarChartTextPositionEnum.End,\r\n colorBar: \"\",\r\n negativeColorBar: \"\",\r\n columnWidth: 0,\r\n isExpression: true,\r\n formulaTop: \"\",\r\n formulaBottom: \"\",\r\n accountingStyle: false,\r\n visible: true,\r\n calculateTotals: 0,\r\n partitionBy: false\r\n });\r\n let newField = self.addSchemaField(metric, null, true);\r\n self.expressionBuilderField = newField;\r\n let popup = $('#expression-builder-popup').dxPopup('instance');\r\n popup.show();\r\n };\r\n\r\n self.addALLMetric = function (item, event) {\r\n if (self.designer.comparisonFilters().length > 0) {\r\n showToast(\"It is not allowed to add the ALL metric when there is a comparison filter\", \"warning\");\r\n return;\r\n }\r\n\r\n var metric = ko.mapping.fromJS({\r\n all: true,\r\n autoGrouping: AutoGroupingStrEnum.None,\r\n backgroundColor: \"#FFFFFF\",\r\n color: \"\",\r\n decimalPlaces: 0,\r\n displayName: allMetricName,\r\n fieldName: allMetricName,\r\n foreColor: \"\",\r\n format: FieldFormatEnum.Numeric,\r\n groupingType: DesignerGroupingTypeEnum.NONE,\r\n id: allMetricName,\r\n isReportMetric: false,\r\n isMetricField: true,\r\n mapField: true,\r\n metric: true,\r\n metricName: allMetricName,\r\n order: 1,\r\n tableName: \"metrics\",\r\n thresholdColor: \"\",\r\n thresholdValue: 0,\r\n type: DesignerDataTypeEnum.NUMBER,\r\n visualizationMode: DesignerFieldVisualizationModeEnum.Value,\r\n comparisonType: DesignerComparisonTypeEnum.None,\r\n displayTableName: \"metrics\",\r\n displayFieldNameDB: allMetricName,\r\n groupId: -1,\r\n functionType: FunctionTypeEnum.Normal,\r\n accountingStyle: false,\r\n isExpression: false,\r\n visible: true,\r\n calculateTotals: 0,\r\n partitionBy: false\r\n });\r\n\r\n let metrics = self.metricArray()();\r\n if (!metrics.find(x => x.all())) {\r\n self.addSchemaField(metric, event, true);\r\n }\r\n }\r\n\r\n self.addingTableFields = false;\r\n\r\n self.addTableFields = function (table, event) {\r\n self.addingTableFields = true;\r\n var fields = table.fields();\r\n for (var i = 0; i < fields.length; i++) {\r\n if (!fields[i].all())\r\n self.addSchemaField(fields[i], event, true);\r\n }\r\n self.addingTableFields = false;\r\n };\r\n\r\n self.resolveComparison = function (newValue, comparisonType, filter) {\r\n var array = self.metricArray();\r\n if (newValue) {\r\n array().filter(x => x.metric() && x.comparisonType() === DesignerComparisonTypeEnum.None).forEach(function (field) {\r\n self.resolveComparisonForMetric(field, filter, comparisonType);\r\n });\r\n }\r\n else {\r\n array.remove(function (field) { return field.comparisonType() === comparisonType && field.comparisonFilterId() === filter.id(); });\r\n }\r\n };\r\n\r\n self.resolveComparisonForMetric = function (metric, filter, comparisonType) {\r\n if (metric.id() === allMetricName ||\r\n //Only for Normal, PercentOfTotal and Accumulated\r\n metric.functionType() > FunctionTypeEnum.AccumulatedAll ||\r\n //Accumulated\r\n (metric.functionType() == FunctionTypeEnum.Accumulated && self.designer.reportType() !== ReportTypeStrEnum.Chart) ||\r\n //Expression metrics created in report designer with any selected metric\r\n metric.isExpression()\r\n ) {\r\n return;\r\n }\r\n\r\n var array = self.metricArray();\r\n\r\n var newMetric = self.koClone(metric);\r\n transformInReportMetric(newMetric, true);\r\n newMetric.comparisonType(comparisonType);\r\n if (comparisonType === DesignerComparisonTypeEnum.PercentageVariation)\r\n newMetric.format(FieldFormatEnum.Percentage);\r\n newMetric.comparisonFilterId(filter.id());\r\n newMetric.id(\"\"); //remove the id, need a new one when saving\r\n var comparisonName = comparisonType === DesignerComparisonTypeEnum.Value ? \"\" : (comparisonType === DesignerComparisonTypeEnum.Variation ? \" Var.\" : \" % Var.\");\r\n //if (comparisonType !== DesignerComparisonTypeEnum.Value)\r\n // newMetric.groupingType(DesignerGroupingTypeEnum.SUM);\r\n newMetric.displayName(`${newMetric.displayName()} ${filter.name()}${comparisonName}`);\r\n newMetric.isMetricField(true);\r\n newMetric.metricId(metric.metricId());\r\n let comparisonTypeId = getcomparisonTypeId(comparisonType);\r\n newMetric.metricName(`M${metric.metricId()}_T${metric.functionType()}_C${comparisonTypeId}_F${filter.id()}`);\r\n\r\n if (!array().find(x => x.queryName() === newMetric.queryName())) {\r\n array.push(newMetric);\r\n }\r\n };\r\n\r\n self.addComparisonMetrics = function (metric) {\r\n if (metric.comparisonType() === DesignerComparisonTypeEnum.None && metric.id() !== allMetricName && metric.functionType() <= FunctionTypeEnum.AccumulatedAll) {\r\n if (metric.functionType() == FunctionTypeEnum.Accumulated && self.designer.reportType() !== ReportTypeStrEnum.Chart) {\r\n return;\r\n }\r\n self.designer.comparisonFilters().forEach(function (filter) {\r\n self.resolveComparisonForMetric(metric, filter, DesignerComparisonTypeEnum.Value);\r\n self.resolveComparisonForMetric(metric, filter, DesignerComparisonTypeEnum.Variation);\r\n self.resolveComparisonForMetric(metric, filter, DesignerComparisonTypeEnum.PercentageVariation);\r\n });\r\n }\r\n };\r\n\r\n self.addComparisonMetricsForFilter = function (filter) {\r\n self.resolveComparison(true, \"Value\", filter);\r\n self.resolveComparison(true, \"Variation\", filter);\r\n self.resolveComparison(true, \"PercentageVariation\", filter);\r\n };\r\n\r\n self.hasComparisonFilter = ko.computed(function () {\r\n return self.designer.comparisonFilters().length > 0;\r\n });\r\n\r\n self.comparisonColors = [\"#264653\", \"#2a9d8f\", \"#e9c46a\", \"#f4a261\", \"#e76f51\", \"#e63946\", \"#a5a58d\", \"#6a994e\", \"#4f5d75\"];\r\n\r\n self.addComparisonFilter = function () {\r\n if (self.metricArray()().filter(x => x.id() === allMetricName || x.metricName() === allMetricName).length > 0) {\r\n showToast(\"It is not allowed to add the comparison filter when there is a ALL metric\", \"warning\");\r\n return;\r\n }\r\n\r\n if (self.metricArray()().filter(x => x.isReportMetric() && (x.comparisonFilterId() === null || x.comparisonFilterId() === undefined)).length > 0) {\r\n showToast(\"It is not allowed to add the comparison filter when there is a field converted to metric\", \"warning\");\r\n return;\r\n }\r\n\r\n var color = self.comparisonColors[self.designer.comparisonFilters().length];\r\n var id = 1;\r\n while (self.designer.comparisonFilters().find(x => x.id() == id)) {\r\n id++;\r\n }\r\n \r\n var filter = ko.mapping.fromJS({\r\n id: id.toString(),\r\n name: \"Filter \" + id,\r\n color: color,\r\n showValue: true,\r\n showVariation: true,\r\n showPercentageVariation: true,\r\n dateOption: ComparisonDateOptionStrEnum.Previous,\r\n dateUnit: ComparisonDateUnitStrEnum.Month,\r\n dateUnitValue: 1,\r\n dateRange: 17,\r\n dateField: null,\r\n filters: [],\r\n comparisonFilterIdBase: \"\"\r\n });\r\n filter.dateUnit.subscribe(function (value) {\r\n if (value !== ComparisonDateUnitStrEnum.Day && this.dateUnitValue() > 12) {\r\n this.dateUnitValue(1);\r\n }\r\n }.bind(filter));\r\n applyObservablesForComparisonFilter(filter, self);\r\n self.designer.comparisonFilters.push(filter);\r\n self.addComparisonMetricsForFilter(filter)\r\n applyFilterEvents($(\"#designContainer\"));\r\n };\r\n\r\n self.removeComparisonFilter = function (comparisonFilter) {\r\n self.metricArray().remove(function (metric) { return metric.comparisonFilterId() === comparisonFilter.id(); });\r\n self.designer.comparisonFilters.remove(comparisonFilter);\r\n };\r\n\r\n self.comparisonDateOptions = [\r\n { value: ComparisonDateOptionStrEnum.Manual, text: \"Manual\" },\r\n { value: ComparisonDateOptionStrEnum.Previous, text: \"Previous\" },\r\n { value: ComparisonDateOptionStrEnum.Predefined, text: \"Predefined\" },\r\n //{ value: \"Next\", text: \"Next\" },\r\n ];\r\n\r\n self.comparisonDateUnitOptions = [\r\n { value: ComparisonDateUnitStrEnum.Year, text: \"Year\" },\r\n { value: ComparisonDateUnitStrEnum.Quarter, text: \"Quarter\" },\r\n { value: ComparisonDateUnitStrEnum.Month, text: \"Month\" },\r\n //{ value: \"Week\", text: \"Week\" },\r\n { value: ComparisonDateUnitStrEnum.Day, text: \"Day\" }\r\n ];\r\n\r\n self.comparisonDateUnitValueOptions = [\r\n { value: 1 },\r\n { value: 2 },\r\n { value: 3 },\r\n { value: 4 },\r\n { value: 5 },\r\n { value: 6 },\r\n { value: 7 },\r\n { value: 8 },\r\n { value: 9 },\r\n { value: 10 },\r\n { value: 11 },\r\n { value: 12 },\r\n ];\r\n\r\n self.filterEditorTypeArray = [\r\n 'TextBox', 'Date', 'DateRange', 'Numeric', 'DatabaseValuesCombo', 'DatabaseMultiSelect', 'DatabaseAutoComplete', 'None', 'Month', 'Quarter',\r\n ];\r\n\r\n self.addNewFilter = function (filter, $parent, $element) {\r\n let comparisonFilterElement = $(`.comparisonFilter[data-id=${$parent.id()}]`);\r\n var completeFunction = function (filterVM) {\r\n updateFilterVisibility(filterVM.filter.boundField, true, comparisonFilterElement);\r\n\r\n filterVM.filter.scope = 5;\r\n filterVM.filter.scopeAction = 2;\r\n\r\n filterVM = ko.mapping.fromJS(filterVM);\r\n\r\n //Copy filter properties beucase when converting an objcet to a Filter we lose the functions\r\n let filter = new Filter();\r\n Object.assign(filter, filterVM.filter);\r\n filter.isComparisonFilter = ko.observable(true);\r\n filterVM.filter = filter;\r\n filterVM.removeFilter = function () {\r\n updateFilterVisibility(this.filter.boundField(), false, comparisonFilterElement);\r\n $parent.filters.remove(this);\r\n }\r\n\r\n $parent.filters.push(filterVM);\r\n };\r\n\r\n var evt = \" \";\r\n\r\n var jsonInput = { filterId: filter.id() };\r\n\r\n irGlobal.updateFromServer(evt,\r\n urlConfigs.designer + \"GetFilter\",\r\n jsonInput,\r\n completeFunction,\r\n null,\r\n true,\r\n \"POST\");\r\n };\r\n\r\n //Always allowing duplicated names until we review this\r\n self.allowDuplicatedNames = ko.observable(false);\r\n\r\n self.selectFormattingRule = function (e) {\r\n var onSelected = function (evt) {\r\n if (evt) {\r\n e.model.formattingRuleId(evt.model.id);\r\n e.model.formattingRuleName(evt.model.name);\r\n $(\"#popover-formattingRule\").dxPopover(\"instance\").hide();\r\n }\r\n };\r\n var onHiding = function (evt) {\r\n //$(e.element).closest(\"div.field-info\").css(\"display\", \"\");\r\n //$(e.element).closest(\"div.field-info\").css(\"z-index\", \"\");\r\n };\r\n $(e.element).closest(\"div.field-info\").css(\"display\", \"block\");\r\n $(e.element).closest(\"div.field-info\").css(\"z-index\", \"9\");\r\n formattingRule.openList($(e.element).siblings(\".dx-textbox\"), onSelected, onHiding, e.element.closest(\".field-info\"), \"right\");\r\n };\r\n\r\n self.clearFormattingRule = function (e) {\r\n e.model.formattingRuleId(0);\r\n e.model.formattingRuleName(null);\r\n };\r\n\r\n self.increaseGroupId = function (e) {\r\n let oldGroupId = e.groupId();\r\n e.groupId(e.groupId() + 1);\r\n let rowGroupElements = ko.observableArray();\r\n if (self.designer.groupElements().filter(function (x) { return x.queryName() === e.queryName(); }).length > 0) {\r\n rowGroupElements = self.designer.groupElements;\r\n }\r\n else if (self.designer.rowElements().filter(function (x) { return x.queryName() === e.queryName(); }).length > 0) {\r\n rowGroupElements = self.designer.rowElements;\r\n }\r\n\r\n sortNextGroupId(oldGroupId, rowGroupElements());\r\n\r\n let elements = rowGroupElements().slice();\r\n elements.sort(function (a: any, b: any) { return a.groupId() - b.groupId(); });\r\n rowGroupElements(elements);\r\n };\r\n self.decreaseGroupId = function (e) {\r\n let oldGroupId = e.groupId();\r\n e.groupId(e.groupId() - 1);\r\n let rowGroupElements = ko.observableArray();\r\n if (self.designer.groupElements().filter(function (x) { return x.queryName() === e.queryName(); }).length > 0) {\r\n rowGroupElements = self.designer.groupElements;\r\n }\r\n else if (self.designer.rowElements().filter(function (x) { return x.queryName() === e.queryName(); }).length > 0) {\r\n rowGroupElements = self.designer.rowElements;\r\n }\r\n\r\n sortNextGroupId(oldGroupId, rowGroupElements());\r\n\r\n let elements = rowGroupElements().slice();\r\n elements.sort(function (a: any, b: any) { return a.groupId() - b.groupId(); });\r\n rowGroupElements(elements);\r\n };\r\n\r\n self.expressionBuilderField = {};\r\n self.expressionBuilderButtonOptions = {\r\n stylingMode: 'contained',\r\n text: '...',\r\n type: 'normal',\r\n height: \"22px\",\r\n hint: \"Click to edit formula\",\r\n onClick(e) {\r\n self.expressionBuilderField = ko.contextFor(e.element[0]).$data;\r\n let popup = $('#expression-builder-popup').dxPopup('instance');\r\n popup.show();\r\n },\r\n };\r\n\r\n }\r\n\r\n var showToast = function (message = undefined, type = undefined, width = 300) {\r\n if (!message || message === \"\") {\r\n return;\r\n }\r\n\r\n if (type === undefined) {\r\n type = \"success\";\r\n }\r\n\r\n DevExpress.ui.notify({\r\n message: message,\r\n type: type,\r\n position: { my: 'right top', at: 'right top', offset: { x: -20, y: 20 } },\r\n width: width\r\n });\r\n };\r\n\r\n var applyFilterEvents = function (comparisonFilterContext) {\r\n $(\".dropdown-avaliablefilters\", comparisonFilterContext).off('show.bs.dropdown').on('show.bs.dropdown', function () {\r\n let dropDownAddFilter = $('.dropdown-menu', $(this));\r\n dropDownAddFilter.css(\"height\", \"300px\");\r\n let addButtonPosition = $(\"button\", this).get(0).getBoundingClientRect();\r\n let top = addButtonPosition.bottom;\r\n top -= (dropDownAddFilter.outerHeight() + $(\"button\", this).outerHeight());\r\n\r\n dropDownAddFilter.css({ \"position\": \"fixed\", \"left\": `${(addButtonPosition.left + $(\"button\", this).width() - dropDownAddFilter.width())}px`, \"top\": `${top}px` });\r\n });\r\n\r\n let setPositionDropdown = function (dropdownHeight) {\r\n let dropDownAddFilter = $('.dropdown-menu.open', $(this).parent());\r\n dropDownAddFilter.css(\"height\", `${dropdownHeight}px`);\r\n if ($(\".bs-searchbox\", dropDownAddFilter).length > 0) {\r\n $(\".inner.open\", dropDownAddFilter).css(\"height\", `${(dropdownHeight - 40)}px`);\r\n }\r\n\r\n let addButtonPosition = $(this).parent().get(0).getBoundingClientRect();\r\n let top = addButtonPosition.bottom;\r\n top -= (dropDownAddFilter.outerHeight() + $(this).parent().outerHeight());\r\n\r\n dropDownAddFilter.css({ \"position\": \"fixed\", \"left\": `${(addButtonPosition.left + $(this).parent().width() - dropDownAddFilter.width())}px`, \"top\": `${top}px` });\r\n }\r\n\r\n let selectPicker = ($('.ir-selectpicker.predefiniedDateRange', comparisonFilterContext) as any);\r\n selectPicker.selectpicker('render');\r\n $('.ir-selectpicker.predefiniedDateRange', comparisonFilterContext).off('show.bs.select').on('show.bs.select', function () {\r\n setPositionDropdown.call(this, 250);\r\n });\r\n };\r\n\r\n var setSizeBoxElements = function () {\r\n $(\".designer\").each(function () {\r\n let height = $(\".designer > div\").height() - 45;\r\n let comparisonHeight = 150;\r\n $(\"table:not(#tComparisonFilters) td.elementsRow > div\", $(this)).height(height - comparisonHeight - 70);\r\n $(\"table#tComparisonFilters td.elementsRow > div\", $(this)).height(comparisonHeight);\r\n });\r\n }\r\n\r\n var adjustReportTypeTitle = function () {\r\n let title = $(\"select#ReportType\").val() as any;\r\n $(\"select#ReportType\").siblings(\"button\").attr(\"title\", title === \"Analysis\" ? \"Report\" : title);\r\n }\r\n var onReportTypeChanged = function () {\r\n adjustReportTypeTitle();\r\n }\r\n\r\n function settingsReportButtonClick() {\r\n let opened = $('.settings-report', '#designContainer').data('open') === true;\r\n $('.settings-report-container, .settings-report-header', '#designContainer').css('display', opened ? 'none' : 'block');\r\n $('.settings-report', '#designContainer').css('width', opened ? '30px' : '');\r\n $('.designer', '#designContainer').css('width', opened ? 'calc(100% - 30px)' : '');\r\n $('.settings-report', '#designContainer').data('open', !opened);\r\n }\r\n\r\n var callbackFunc: Function = null;\r\n var fromDashboard = false;\r\n context = \"\";\r\n var vm;\r\n var setup = function (callbackFunction, designerVM, schemaVM, isFromDashboard) {\r\n percentFunctionType = [\r\n FunctionTypeEnum.PercentOfTotal,\r\n FunctionTypeEnum.PercentOfRowTotal,\r\n FunctionTypeEnum.PercentOfRowGrandTotal,\r\n FunctionTypeEnum.PercentOfColumnTotal,\r\n FunctionTypeEnum.PercentOfColumnGrandTotal,\r\n FunctionTypeEnum.PercentVariation\r\n ];\r\n\r\n let load = function () {\r\n formattingRule.setup(function () {\r\n fromDashboard = isFromDashboard ? true : false;\r\n\r\n callbackFunc = callbackFunction;\r\n\r\n if (!designerVM.comparisonFilters)\r\n designerVM.comparisonFilters = [];\r\n\r\n vm = new DesignerViewModel(designerVM, schemaVM);\r\n\r\n applyObservables(vm);\r\n\r\n //https://github.com/rniemeyer/knockout-sortable\r\n ko.bindingHandlers.sortable.options = {\r\n placeholder: 'ui-state-highlight',\r\n };\r\n\r\n let designerContainer = $(\"#designContainer\");\r\n vm.applyingBindings = true;\r\n ko.applyBindings(vm, designerContainer[0]);\r\n vm.applyingBindings = false;\r\n validateFields();\r\n designerContainer.css(\"display\", \"block\");\r\n\r\n applyFilterEvents(designerContainer);\r\n setSizeBoxElements();\r\n adjustReportTypeTitle();\r\n $(\"select#ReportType\").on(\"change\", onReportTypeChanged);\r\n $(window).resize(function () {\r\n setSizeBoxElements();\r\n });\r\n\r\n vm.designer.comparisonFilters().forEach(function (comparisonFilter) {\r\n let comparisonFilterElement = $(`.comparisonFilter[data-id=${comparisonFilter.id()}]`);\r\n comparisonFilter.filters().forEach(function (filterVM) {\r\n updateFilterVisibility(filterVM.filter.boundField(), true, comparisonFilterElement);\r\n });\r\n });\r\n\r\n let popup = $(\"#expression-builder-popup\").dxPopup({\r\n onShowing(e) {\r\n getExpressionBuilderVM(popup);\r\n },\r\n width: 730,\r\n height: 480,\r\n showCloseButton: false,\r\n toolbarItems: [\r\n {\r\n widget: 'dxButton',\r\n toolbar: 'bottom',\r\n location: 'after',\r\n options: {\r\n text: 'Close',\r\n icon: 'undo',\r\n onClick() {\r\n popup.hide();\r\n },\r\n },\r\n },\r\n {\r\n widget: 'dxButton',\r\n toolbar: 'bottom',\r\n location: 'after',\r\n options: {\r\n text: 'Save',\r\n icon: 'save',\r\n onClick() {\r\n if (expressionBuilderVM.errorMessage()) {\r\n DevExpress.ui.notify({\r\n message: \"Formula is invalid. Please check the errors.\",\r\n width: 300,\r\n position: {\r\n of: \"#metric-expression-error\",\r\n at: 'center bottom',\r\n }\r\n }, 'error', 3000);\r\n return;\r\n }\r\n\r\n let formulaTop = expressionBuilderVM.formulaTop();\r\n\r\n if (!formulaTop) {\r\n DevExpress.ui.notify({\r\n message: \"Formula is empty.\\nPlease enter a formula.\",\r\n width: 200,\r\n position: {\r\n of: \"#metric-expression-top-formula\"\r\n }\r\n }, 'warning', 3000);\r\n return;\r\n }\r\n\r\n let groupingType = expressionBuilderVM.groupingType();\r\n let formulaBottom = \"\";\r\n\r\n if (groupingType === DesignerGroupingTypeEnum.WDSUM) {\r\n formulaBottom = expressionBuilderVM.formulaBottom();\r\n\r\n if (!formulaBottom) {\r\n DevExpress.ui.notify({\r\n message: \"Formula is empty.\\nPlease enter a formula.\",\r\n width: 200,\r\n position: {\r\n of: \"#metric-expression-bottom-formula\"\r\n }\r\n }, 'warning', 3000);\r\n return;\r\n }\r\n }\r\n\r\n let replaceNamesToQueryName = function (formula) {\r\n const matches = formula.matchAll(regexExpressionFormulaNames);\r\n\r\n for (const match of matches) {\r\n let name = match.groups.name;\r\n let fieldExpression = expressionBuilderVM.availableFields.find(x => x.displayName === name);\r\n let metricName = `[${fieldExpression.queryName}]`;\r\n formula = formula.replace(match[0], metricName);\r\n }\r\n\r\n return formula;\r\n };\r\n\r\n formulaTop = replaceNamesToQueryName(formulaTop);\r\n formulaBottom = replaceNamesToQueryName(formulaBottom);\r\n\r\n expressionBuilderVM.field.displayName(expressionBuilderVM.name());\r\n expressionBuilderVM.field.groupingType(expressionBuilderVM.groupingType());\r\n expressionBuilderVM.field.calculateTotals(expressionBuilderVM.calculateTotals());\r\n expressionBuilderVM.field.formulaTop(formulaTop);\r\n expressionBuilderVM.field.formulaBottom(formulaBottom);\r\n popup.hide();\r\n validateFields();\r\n },\r\n },\r\n }\r\n ],\r\n }).dxPopup('instance');\r\n\r\n $(\"#designContainer\").off(\"click\", filtersManager.hideFiltersClick).on(\"click\", filtersManager.hideFiltersClick);\r\n });\r\n }\r\n\r\n if (isFromDashboard) {\r\n load();\r\n }\r\n else {\r\n mappingDataSource.prepareDataSourcePopover(function () {\r\n load();\r\n });\r\n }\r\n };\r\n\r\n return {\r\n setup: setup,\r\n renameField: renameField,\r\n restoreComparisonMetrics: restoreComparisonMetrics,\r\n removeField: removeField,\r\n saveDesign: saveDesign,\r\n cancelDesign: cancelDesign,\r\n resize: function () {\r\n setSizeBoxElements();\r\n },\r\n settingsReportButtonClick: settingsReportButtonClick,\r\n onReportTypeChanged: onReportTypeChanged,\r\n };\r\n}());\r\n\r\n/* Remove these enum and use the enum as int */\r\nenum DesignerGroupingTypeEnum {\r\n SUM = \"SUM\",\r\n MIN = \"MIN\",\r\n MAX = \"MAX\",\r\n WSUM = \"WSUM\",\r\n GROUP_BY = \"GROUP_BY\",\r\n NONE = \"NONE\",\r\n COUNT = \"COUNT\",\r\n DSUM = \"DSUM\",\r\n WDSUM = \"WDSUM\",\r\n TSUM = \"TSUM\",\r\n}\r\nenum DesignerComparisonTypeEnum {\r\n None = \"None\",\r\n Value = \"Value\",\r\n Variation = \"Variation\",\r\n PercentageVariation = \"PercentageVariation\"\r\n}\r\nenum DesignerDataTypeEnum {\r\n NONE = \"NONE\",\r\n STRING = \"STRING\",\r\n NUMBER = \"NUMBER\",\r\n DATE = \"DATE\",\r\n BIT = \"BIT\",\r\n BOOL = \"BOOL\"\r\n}\r\nenum DesignerFieldVisualizationModeEnum {\r\n Value = \"Value\",\r\n BarChart = \"BarChart\"\r\n}\r\nenum DesignerFieldBarChartTextEnum {\r\n None = \"None\",\r\n Value = \"Value\",\r\n Percentage = \"Percentage\"\r\n}\r\nenum DesignerFieldBarChartTextPositionEnum {\r\n Begin = \"Begin\",\r\n Center = \"Center\",\r\n End = \"End\"\r\n}","declare var urlConfigs: any;\r\n\r\nclass Email {\r\n id: number;\r\n scheduleId: string;\r\n sendReport: boolean;\r\n userId: number;\r\n userName: string;\r\n mappingId: number;\r\n subjectText: string;\r\n recipients: string;\r\n formats: EmailFormatEnum;\r\n bodyText: string;\r\n drilldownId: number;\r\n tabId: number;\r\n tabName: string;\r\n widgetId: number;\r\n workbookId: number;\r\n workbookName: string;\r\n isHtml: boolean;\r\n scheduleDetails: string;\r\n emailCount: number;\r\n dateAdded: string;\r\n lastSentDate: Date;\r\n lastStatus: string;\r\n scope: ContainerScopeEnum;\r\n sendEmptyReport: SendEmptyReportEnum;\r\n widgetIdEmptyReport: number;\r\n\r\n lastEmailSent: boolean;\r\n lastMessageId: string;\r\n lastSmtpResponse: string;\r\n\r\n schedule: string; //EmailSchedule\r\n scheduledDays: Array;\r\n scheduledDaysFilter: string;\r\n scheduledHour: string;\r\n useAddressList: boolean;\r\n addressListId: number;\r\n\r\n filterId: number;\r\n companyId: number;\r\n companyName: string;\r\n organisationId: number;\r\n attachments: Array;\r\n showInfoBody: boolean;\r\n cc: string;\r\n bcc: string;\r\n pdfTemplateId: number;\r\n //config: EmailReportConfig;\r\n\r\n constructor() {\r\n this.id = 0;\r\n this.scheduleId = \" \";\r\n this.sendReport = true;\r\n this.subjectText = \"\";\r\n this.recipients = \"\";\r\n this.formats = EmailFormatEnum.PDF;\r\n this.bodyText = \"\";\r\n this.drilldownId = 0;\r\n this.tabId = 0;\r\n this.tabName = \"\";\r\n this.widgetId = 0;\r\n\r\n this.workbookId = 0;\r\n this.workbookName = \"\";\r\n this.mappingId = 0;\r\n this.userId = 0;\r\n this.userName = \"\";\r\n \r\n this.scheduleDetails = \"\";\r\n this.emailCount = 0;\r\n this.dateAdded = new Date().toISOString();\r\n this.lastSentDate = null;\r\n this.lastStatus = null;\r\n this.scope = ContainerScopeEnum.Workbook;\r\n this.sendEmptyReport = SendEmptyReportEnum.Yes;\r\n this.widgetIdEmptyReport = 0;\r\n\r\n this.lastEmailSent = false;\r\n this.lastMessageId = \"\";\r\n this.lastSmtpResponse = \"\";\r\n\r\n this.schedule = \"Daily\";\r\n this.scheduledDays = [];\r\n this.scheduledDaysFilter = \"\";\r\n this.scheduledHour = \"08:00:00\";\r\n this.useAddressList = false;\r\n this.addressListId = null;\r\n this.filterId = -1;\r\n this.companyId = 0;\r\n this.companyName = \"\";\r\n this.organisationId = 0;\r\n this.attachments = [];\r\n this.showInfoBody = false;\r\n this.cc = null;\r\n this.bcc = null;\r\n this.pdfTemplateId = 0;\r\n }\r\n}\r\n\r\nclass AttachmentTab {\r\n id: number;\r\n tabId: number;\r\n format: EmailFormatEnum;\r\n\r\n constructor() {\r\n this.id = 0;\r\n this.tabId = null;\r\n this.format = EmailFormatEnum.PDF;\r\n }\r\n}\r\n\r\nenum EmailFormatEnum {\r\n PDFLandscape = \"PDFLandscape\",\r\n PDF = \"PDF\",\r\n HTML = \"HTML\",\r\n Excel = \"Excel\",\r\n CSV = \"CSV\"\r\n}\r\nenum SendEmptyReportEnum {\r\n Yes = 0,\r\n No = 1,\r\n Notification = 2\r\n}\r\n\r\nvar scheduledEmail = (function () {\r\n\r\n var validateSchedule = function (data, scheduleEmail: Email) {\r\n if (scheduleEmail.useAddressList) {\r\n scheduleEmail.recipients = \" \";\r\n scheduleEmail.companyId = 0;\r\n scheduleEmail.companyName = \"\";\r\n }\r\n else {\r\n scheduleEmail.addressListId = 0;\r\n }\r\n\r\n if (scheduleEmail.scope === ContainerScopeEnum.Workbook) {\r\n scheduleEmail.tabId = 0;\r\n }\r\n\r\n if (!data.enableMultiTenant) {\r\n scheduleEmail.companyId = 0;\r\n scheduleEmail.companyName = \"\";\r\n }\r\n\r\n if (scheduleEmail.sendEmptyReport === SendEmptyReportEnum.Yes) {\r\n scheduleEmail.widgetIdEmptyReport = 0;\r\n }\r\n };\r\n\r\n var copyProperties = function (fromObject, toObject) {\r\n for (let property in fromObject) {\r\n if (fromObject[property] !== undefined) {\r\n let fromValue = fromObject[property];\r\n if (Array.isArray(fromValue)) {\r\n toObject[property] = fromValue;\r\n }\r\n else if (typeof fromValue === \"object\") {\r\n copyProperties(fromValue, toObject[property] || {});\r\n }\r\n else {\r\n toObject[property] = fromValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n var copyIds = function (data, email) {\r\n email.id = data.id;\r\n email.attachments = data.attachments;\r\n email.scheduleId = data.scheduleId;\r\n };\r\n\r\n var showToast = function (message = undefined, type = undefined, width = 300) {\r\n if (!message || message === \"\") {\r\n return;\r\n }\r\n\r\n if (type === undefined) {\r\n type = \"success\";\r\n }\r\n\r\n DevExpress.ui.notify({\r\n message: message,\r\n type: type,\r\n position: { my: 'right top', at: 'right top', offset: { x: -20, y: 20 } },\r\n width: width\r\n });\r\n };\r\n\r\n function popupSendNow(emailsId: Array, vm, data) {\r\n let result = DevExpress.ui.dialog.confirm(`Do you confirm sending the email${(emailsId.length > 1 ? \"s\" : \"\")} now?`, \"Confirm\");\r\n\r\n let updateEmails = function (emails) {\r\n emails.forEach(function (respEmail) {\r\n let filtered = data.emails.filter(function (value) {\r\n return value.id === respEmail.id;\r\n });\r\n if (filtered.length === 1) {\r\n let scheduleEmail = filtered[0];\r\n copyProperties(respEmail, scheduleEmail);\r\n validateSchedule(data, scheduleEmail);\r\n\r\n if (vm.currentEmail() && vm.currentEmail().id === scheduleEmail.id) {\r\n vm.currentEmail(scheduleEmail);\r\n vm.currentSchedule(scheduleEmail.schedule);\r\n }\r\n }\r\n });\r\n }\r\n let success = function (resp) {\r\n updateEmails(resp.emails);\r\n\r\n if (resp.success) {\r\n let allEmailsSent = resp.emails.length === 0 ? true : resp.emails.filter(x => x.lastEmailSent).length === resp.emails.length;\r\n if (allEmailsSent) {\r\n showToast('Success');\r\n }\r\n else {\r\n showToast('Some emails were not sent', 'warning');\r\n }\r\n }\r\n else {\r\n showToast(resp.message, 'error');\r\n }\r\n }\r\n\r\n let error = function (textStatus, failureText) {\r\n showToast(failureText ? failureText : 'An unexpected error has occurred', 'error');\r\n }\r\n\r\n result.done(function (dialogResult) {\r\n if (dialogResult) {\r\n irGlobal.updateFromServer(null, urlConfigs.email + \"SendEmailNow\", { emailsId: emailsId }, success, error, true, \"POST\", true);\r\n }\r\n });\r\n }\r\n\r\n function enablePopupMode(e, isNewRow = false) {\r\n if (e.component.emailsManagement) {\r\n let allowEdit = true;\r\n let message = \"\";\r\n irGlobal.updateFromServer({},\r\n urlConfigs.email + \"GetEmailDetail\",\r\n {\r\n userReportID: e.row.data.id,\r\n workbookId: e.row.data.workbookId\r\n },\r\n function (returnedData) {\r\n allowEdit = returnedData.success;\r\n message = returnedData.message;\r\n if (allowEdit) {\r\n prepareEmails([returnedData.email], returnedData.tabs, false);\r\n\r\n const gridSource = e.component.getDataSource(),\r\n gridStore = gridSource.store();\r\n\r\n gridStore.update(returnedData.email.id, returnedData.email);\r\n\r\n e.component.filters = returnedData.filters;\r\n e.component.tabs = returnedData.tabs;\r\n e.component.usersGroups = returnedData.usersGroups;\r\n e.component.widgets = returnedData.widgets;\r\n }\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true, undefined, undefined, false);\r\n\r\n if (!allowEdit) {\r\n DevExpress.ui.dialog.alert(message, \"Emails Management\");\r\n return;\r\n }\r\n }\r\n\r\n let changes = e.component.option(\"editing.changes\");\r\n if (!isNewRow) {\r\n e.component.cancelEditData();\r\n e.component.option(\"editing.mode\", \"popup\");\r\n e.component.option(\"editing.changes\", changes);\r\n\r\n if (!isNewRow) {\r\n e.component.editRow(e.row.rowIndex);\r\n }\r\n\r\n e.component.option(\"editing.popup.onShown\", function () {\r\n var rowChange = changes.find(c => c.key === e.row.key);\r\n if (rowChange) {\r\n Object.keys(rowChange.data).forEach(key => {\r\n e.component.cellValue(e.row.rowIndex, key, rowChange.data[key]);\r\n });\r\n }\r\n changes.splice(changes.indexOf(rowChange), 1);\r\n });\r\n\r\n e.component.option(\"editing.popup.onHiding\", function () {\r\n e.component.option(\"editing.mode\", \"cell\");\r\n e.component.option(\"editing.changes\", changes);\r\n });\r\n }\r\n else {\r\n e.component.option(\"editing.mode\", \"popup\");\r\n e.component.option(\"editing.popup.onHiding\", function () {\r\n e.component.option(\"editing.mode\", \"cell\");\r\n e.component.option(\"editing.changes\", changes);\r\n });\r\n }\r\n }\r\n\r\n function getDxDataGrid() {\r\n return $(\"#scheduledEmailsGrid\").dxDataGrid(\"instance\") as any;\r\n }\r\n\r\n function prepareEmails(emails: Array, workbookTabs: Array, showMessage: boolean = true) {\r\n let tabsRemoved = false;\r\n for (var i = 0; i < emails.length; i++) {\r\n let email = emails[i];\r\n delete email.scheduleDetails;\r\n\r\n if (email.tabId !== 0 && workbookTabs) {\r\n if (!workbookTabs.find(t => t.id === email.tabId)) {\r\n tabsRemoved = true;\r\n break;\r\n }\r\n }\r\n\r\n if (email.attachments) {\r\n for (var att = 0; att < email.attachments.length; att++) {\r\n if (!workbookTabs.find(t => t.id === email.attachments[att].tabId)) {\r\n tabsRemoved = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (showMessage && tabsRemoved) {\r\n DevExpress.ui.notify({\r\n message: \"Some tabs used in the email have been removed. Please save the workbook to use the emails.\",\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\"\r\n }\r\n }, \"warning\", 3000);\r\n return;\r\n }\r\n }\r\n\r\n function openPopup(data) {\r\n let form, bottomForm, formatList;\r\n\r\n let getColumnValue = function (columnName, component) {\r\n let editRowKey = component.option('editing.editRowKey');\r\n let index = component.getRowIndexByKey(editRowKey);\r\n index = index === -1 ? 0 : index;\r\n return component.cellValue(index, columnName);\r\n };\r\n //let setColumnValue = function (columnName, value) {\r\n // let editRowKey = gridInstance.option('editing.editRowKey');\r\n // let index = gridInstance.getRowIndexByKey(editRowKey);\r\n // index = index === -1 ? 0 : index;\r\n // return gridInstance.cellValue(index, columnName, value);\r\n //};\r\n\r\n let store = new DevExpress.data.CustomStore({\r\n key: \"id\",\r\n load: function (loadOptions) {\r\n return data.emails;\r\n },\r\n insert: function (values) {\r\n validateSchedule(data, values);\r\n\r\n var d = $.Deferred();\r\n var url = urlConfigs.email + \"SaveEmail\";\r\n irGlobal.updateFromServer(null, url, values, function (data) {\r\n //values.id = id;\r\n copyIds(data, values);\r\n d.resolve(values);\r\n }, null, true, \"POST\", true);\r\n data.emails.push(values);\r\n\r\n return d.promise();\r\n },\r\n update: function (key, values) {\r\n var d = $.Deferred();\r\n var url = urlConfigs.email + \"SaveEmail\";\r\n var filtered = data.emails.filter(function (value, index, arr) {\r\n return value.id === key;\r\n });\r\n if (filtered.length === 1) {\r\n let scheduleEmail = filtered[0];\r\n copyProperties(values, scheduleEmail);\r\n validateSchedule(data, scheduleEmail);\r\n\r\n if (data.emailsManagement) {\r\n if (scheduleEmail.scheduledDays && scheduleEmail.scheduledDays.length > 0) {\r\n scheduleEmail.scheduledDaysFilter = scheduleEmail.scheduledDays.map(x => \"#\" + x + \"#\").toString();\r\n }\r\n else {\r\n scheduleEmail.scheduledDaysFilter = \"\";\r\n }\r\n }\r\n\r\n irGlobal.updateFromServer(null, url, scheduleEmail, function (data) {\r\n copyIds(data, scheduleEmail);\r\n }, null, true, \"POST\", true);\r\n vm.currentEmail(scheduleEmail);\r\n vm.currentSchedule(scheduleEmail.schedule);\r\n }\r\n\r\n d.resolve();\r\n return d.promise();\r\n },\r\n remove: function (key) {\r\n var d = $.Deferred();\r\n\r\n var url = urlConfigs.email + \"DeleteEmail\";\r\n irGlobal.updateFromServer(null, url, { userReportID: key }, null, null, true, \"POST\", true);\r\n var filtered = data.emails.filter(function (value, index, arr) {\r\n return value.id !== key;\r\n });\r\n data.emails = filtered;\r\n\r\n d.resolve();\r\n return d.promise();\r\n }\r\n });\r\n\r\n let currentEmail = ko.observable(data.emails.length > 0 ? data.emails[0] : null);\r\n\r\n let getFormatList = function (tabType) {\r\n let formatList = [\r\n { id: EmailFormatEnum.PDFLandscape, name: \"PDF Landscape\" },\r\n { id: EmailFormatEnum.PDF, name: \"PDF\" },\r\n { id: EmailFormatEnum.Excel, name: \"Excel\" },\r\n { id: EmailFormatEnum.CSV, name: \"CSV\" }\r\n ];\r\n if (tabType && tabType === \"Dashboard\") {\r\n formatList = [\r\n { id: EmailFormatEnum.PDFLandscape, name: \"PDF Landscape\" },\r\n { id: EmailFormatEnum.PDF, name: \"PDF\" }\r\n ];\r\n }\r\n\r\n return formatList;\r\n }\r\n\r\n let getAttachmentsOptions = function (attachments) {\r\n const options = [];\r\n if (attachments === undefined) {\r\n return options;\r\n }\r\n\r\n for (let i = 0; i < attachments.length; i += 1) {\r\n options.push(generateNewAttachmentOptions(i));\r\n }\r\n return options;\r\n }\r\n\r\n let generateNewAttachmentOptions = function (index) {\r\n let i = index;\r\n let tabType = undefined;\r\n let gridInstance = getDxDataGrid();\r\n if (currentEmail().attachments[i].tabId) {\r\n let tab = (gridInstance?.tabs || data?.tabs)?.find(x => x.id === currentEmail().attachments[i].tabId) || [];\r\n if (tab) {\r\n tabType = tab.type;\r\n }\r\n }\r\n return {\r\n itemType: 'group',\r\n colCount: 11,\r\n colSpan: 1,\r\n items: [\r\n {\r\n dataField: `attachments[${i}].tabId`,\r\n label: {\r\n text: `Tab`,\r\n },\r\n cssClass: \"scheduledEmail-attachment-label\",\r\n colSpan: 6,\r\n editorType: 'dxSelectBox',\r\n editorOptions: {\r\n width: 160,\r\n indexList: i,\r\n value: currentEmail().attachments[i].tabId,\r\n dataSource: (gridInstance?.tabs || data?.tabs)?.filter(function (x) { return x.id > 0; }) || [],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n onValueChanged: function (e) {\r\n let indexList = e.component.option(\"indexList\");\r\n vm.currentEmail().attachments[indexList].tabId = e.value;\r\n\r\n gridInstance = getDxDataGrid();\r\n let tab = gridInstance.tabs.find(x => x.id === e.value)\r\n let format = vm.currentEmail().attachments[indexList].format;\r\n let editor = form.getEditor(`attachmentsFormat${indexList}`);\r\n if (tab.type === \"Dashboard\" && (format === EmailFormatEnum.Excel || format === EmailFormatEnum.CSV)) {\r\n if (editor) {\r\n editor.option(\"value\", EmailFormatEnum.PDF);\r\n }\r\n }\r\n\r\n if (editor) {\r\n editor.option(\"dataSource\", getFormatList(tab.type));\r\n }\r\n }\r\n },\r\n isRequired: true,\r\n validationRules: [{ type: 'required' }]\r\n },\r\n {\r\n dataField: `attachments[${i}].format`,\r\n label: {\r\n text: `Format`,\r\n visible: false\r\n },\r\n colSpan: 3,\r\n name: `attachmentsFormat${i}`,\r\n editorType: 'dxSelectBox',\r\n editorOptions: {\r\n width: 112,\r\n indexList: i,\r\n value: currentEmail().attachments[i].format,\r\n dataSource: getFormatList(tabType),\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n onValueChanged: function (e) {\r\n let indexList = e.component.option(\"indexList\");\r\n vm.currentEmail().attachments[indexList].format = e.value;\r\n },\r\n itemTemplate: function (data) {\r\n let style = \"\";\r\n if (!loggedUser.permissions.printExportPDF() && (data.id === EmailFormatEnum.PDFLandscape || data.id === EmailFormatEnum.PDF) ||\r\n !loggedUser.permissions.exportExcelCSV() && (data.id === EmailFormatEnum.Excel || data.id === EmailFormatEnum.CSV)) {\r\n style = \"color: #afadad;\";\r\n }\r\n\r\n return `
    ${data.name}
    `;\r\n }\r\n\r\n },\r\n validationRules: [{ type: 'required' }]\r\n },\r\n {\r\n colSpan: 2,\r\n itemType: \"button\",\r\n buttonOptions: {\r\n text: \"X\",\r\n onClick: function () {\r\n vm.currentEmail().attachments.splice(i, 1);\r\n form.itemOption('attachments-container.attachmentList', 'items', getAttachmentsOptions(vm.currentEmail().attachments));\r\n let gridInstance = getDxDataGrid();\r\n gridInstance.cellValue(gridInstance.getRowIndexByKey(vm.currentEmail().id), \"attachments\", vm.currentEmail().attachments);\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n\r\n let refreshByCode = false;\r\n let newRow = false;\r\n let vm = {\r\n\r\n emails: data.emails,\r\n usersGroups: data.usersGroups,\r\n currentEmail: currentEmail,\r\n currentSchedule: ko.observable(data.emails.length > 0 ? data.emails[0].schedule : \"\"),\r\n saveReportsMessage: ko.observable(data.tabs ? data.tabs.filter(function (x) { return x.id < 0; }).length > 0 : false),\r\n dataGridOptions: {\r\n headerFilter: {\r\n visible: data.emailsManagement ? true : false,\r\n },\r\n height: 230,\r\n dataSource: store,\r\n showColumnLines: false,\r\n showRowLines: true,\r\n rowAlternationEnabled: false,\r\n selection: {\r\n mode: data.emailsManagement ? 'multiple' : 'none',\r\n showCheckBoxesMode: 'always'\r\n },\r\n searchPanel: {\r\n visible: data.emailsManagement,\r\n placeholder: 'Search...',\r\n searchVisibleColumnsOnly: true\r\n },\r\n paging: {\r\n enabled: false\r\n },\r\n columns: [\r\n { dataField: 'scheduledDaysFilter', visible: false },\r\n {\r\n dataField: \"id\",\r\n visible: false,\r\n },\r\n {\r\n dataField: 'workbookName',\r\n caption: 'Workbook',\r\n visible: data.emailsManagement ? true : false\r\n },\r\n {\r\n dataField: \"recipients\",\r\n caption: \"Recipients\",\r\n validationRules: [{\r\n type: \"custom\",\r\n validationCallback: function (v) {\r\n if (v.data.useAddressList) {\r\n return true;\r\n }\r\n\r\n if (v.value === undefined || v.value === null) {\r\n return false;\r\n }\r\n\r\n if (v.value.trim() === \"\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n message: \"Recipients is required\"\r\n }/*{ type: 'required' }*/],\r\n },\r\n {\r\n dataField: \"cc\",\r\n caption: \"CC\",\r\n visible: false,\r\n },\r\n {\r\n dataField: \"bcc\",\r\n caption: \"BCC\",\r\n visible: false,\r\n },\r\n {\r\n caption: 'Address List',\r\n dataField: 'addressListId',\r\n lookup: {\r\n dataSource: data.addressLists,\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n visible: true,\r\n validationRules: [{\r\n type: \"custom\",\r\n validationCallback: function (v) {\r\n if (!v.data.useAddressList) {\r\n return true;\r\n }\r\n\r\n if (v.value === undefined || v.value === null || v.value === 0) {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n message: \"Address List is required\"\r\n }]\r\n },\r\n {\r\n dataField: \"subjectText\",\r\n caption: \"Subject\",\r\n validationRules: [{ type: 'required' }],\r\n },\r\n {\r\n dataField: 'userName',\r\n caption: 'User',\r\n },\r\n {\r\n dataField: 'userId',\r\n caption: 'User',\r\n width: 150,\r\n lookup: {\r\n dataSource: [],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n validationRules: [{ type: 'required' }],\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n\r\n const component = getDxDataGrid();\r\n const user = component.usersGroups.find(x => x.id === value);\r\n newData.userName = user?.name;\r\n },\r\n visible: false\r\n },\r\n {\r\n dataField: 'scope',\r\n caption: 'Scope',\r\n width: 85,\r\n lookup: {\r\n dataSource: [\r\n { id: ContainerScopeEnum.Workbook, name: \"Workbook\" },\r\n { id: ContainerScopeEnum.Report, name: \"Report\" },\r\n { id: ContainerScopeEnum.Dashboard, name: \"Dashboard\" }\r\n ],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n validationRules: [{ type: 'required' }]\r\n },\r\n {\r\n dataField: 'sendEmptyReport',\r\n caption: 'Send Empty Report',\r\n width: 85,\r\n lookup: {\r\n dataSource: [{ id: 0, name: \"Yes\" }, { id: 1, name: \"No\" }, { id: 2, name: \"Notification\" }],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n },\r\n visible: false\r\n },\r\n {\r\n dataField: 'widgetIdEmptyReport',\r\n caption: 'Widget',\r\n visible: false,\r\n lookup: {\r\n dataSource: [],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n },\r\n validationRules: [{ type: 'required' }, {\r\n type: \"custom\",\r\n validationCallback: function (v) {\r\n if (v.data.sendEmptyReport === SendEmptyReportEnum.Yes || v.data.scope !== ContainerScopeEnum.Dashboard) {\r\n return true;\r\n }\r\n\r\n if (v.value === undefined || v.value === null || v.value === 0) {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n message: \"Widget is required\"\r\n }]\r\n },\r\n {\r\n dataField: 'notificationText',\r\n caption: 'Notification Text',\r\n visible: false,\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n },\r\n validationRules: [{\r\n type: \"custom\",\r\n validationCallback: function (v) {\r\n if (v.data.sendEmptyReport !== SendEmptyReportEnum.Notification) {\r\n return true;\r\n }\r\n\r\n if (v.value === undefined || v.value === null) {\r\n return false;\r\n }\r\n\r\n if (v.value.trim() === \"\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n message: \"Notification Text is required\"\r\n }]\r\n },\r\n {\r\n dataField: 'pdfTemplateId',\r\n caption: 'PDF Template',\r\n lookup: {\r\n dataSource(options) {\r\n return {\r\n store: data.pdfTemplates || [],\r\n filter: data.enableMultiTenant && options.data ?\r\n [\r\n ['companyId', '=', options.data.companyId],\r\n 'or',\r\n [['companyId', '=', 0], 'and', ['organisationId', '=', 0]],\r\n 'or',\r\n [['companyId', '=', 0], 'and', ['organisationId', '=', options.data.organisationId]],\r\n 'or',\r\n ['id', '=', 0]\r\n ] : null,\r\n };\r\n },\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n visible: false,\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n }\r\n },\r\n {\r\n dataField: 'formats',\r\n caption: 'Format',\r\n width: 70,\r\n lookup: {\r\n dataSource: [\r\n { id: EmailFormatEnum.PDFLandscape, name: \"PDF Landscape\" },\r\n { id: EmailFormatEnum.PDF, name: \"PDF\" },\r\n /*{ id: \"HTML\", name: \"HTML\" },*/\r\n { id: EmailFormatEnum.Excel, name: \"Excel\" },\r\n { id: EmailFormatEnum.CSV, name: \"CSV\" }],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n },\r\n validationRules: [{ type: 'required' }],\r\n },\r\n {\r\n dataField: 'tabName',\r\n caption: 'Tab',\r\n },\r\n {\r\n dataField: 'tabId',\r\n caption: 'Tab',\r\n width: 160,\r\n lookup: {\r\n dataSource: [],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n\r\n let component = getDxDataGrid();\r\n const tab = component.tabs.find(x => x.id === newData.tabId);\r\n\r\n if (newData.tabId === 0)\r\n newData.scope = ContainerScopeEnum.Workbook;\r\n else {\r\n newData.scope = tab.type === \"Dashboard\" ? ContainerScopeEnum.Dashboard : ContainerScopeEnum.Report;\r\n }\r\n\r\n newData.tabName = tab?.name;\r\n\r\n let formats = getColumnValue(\"formats\", component);\r\n if (newData.scope !== ContainerScopeEnum.Report && (formats === EmailFormatEnum.Excel || formats === EmailFormatEnum.CSV)) {\r\n newData.formats = EmailFormatEnum.PDF;\r\n }\r\n\r\n newData.widgetIdEmptyReport = 0;\r\n },\r\n visible: false\r\n },\r\n { dataField: 'bodyText', visible: false, },\r\n {\r\n dataField: 'schedule',\r\n visible: false,\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n newData.scheduledDays = [];\r\n }\r\n },\r\n {\r\n dataField: 'scheduledDays', visible: false, validationRules: [{\r\n type: \"custom\",\r\n validationCallback: function (v) {\r\n if (v.data.schedule !== \"Daily\" && v.value.length === 0) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n message: \"Scheduled Days is required\"\r\n }],\r\n },\r\n { dataField: 'scheduledHour', visible: false, },\r\n {\r\n dataField: 'useAddressList',\r\n visible: false,\r\n editorType: 'dxSwitch',\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n }\r\n },\r\n {\r\n dataField: 'filterId',\r\n caption: 'Filter',\r\n visible: false,\r\n lookup: {\r\n dataSource: [],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n validationRules: [{\r\n type: \"custom\",\r\n validationCallback: function (v) {\r\n if (!v.data.useAddressList) {\r\n return true;\r\n }\r\n\r\n if (v.value === undefined || v.value === null) {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n message: \"Filter is required\"\r\n }],\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n }\r\n },\r\n {\r\n dataField: 'companyName',\r\n caption: 'Company',\r\n },\r\n {\r\n dataField: 'companyId',\r\n caption: 'Company',\r\n visible: false,\r\n lookup: {\r\n dataSource: [],\r\n displayExpr: 'name',\r\n valueExpr: 'id',\r\n },\r\n setCellValue: function (newData, value) {\r\n this.defaultSetCellValue(newData, value);\r\n if (data.enableMultiTenant) {\r\n let company = data.companies.find(x => x.id === newData.companyId);\r\n newData.companyName = company?.name;\r\n\r\n let companies = data.companies.filter(function (x) { return x.users.includes(value); });\r\n if (companies.filter(function (x) { return x.id === value; }).length === 0) {\r\n newData.pdfTemplateId = 0;\r\n }\r\n }\r\n }\r\n },\r\n {\r\n dataField: 'showInfoBody',\r\n caption: 'Show Workbook/Report Info Body',\r\n dataType: 'boolean',\r\n visible: false,\r\n editorType: 'dxSwitch'\r\n },\r\n {\r\n dataField: 'sendReport',\r\n caption: 'Enabled',\r\n dataType: 'boolean',\r\n visible: true,\r\n editorType: 'dxSwitch'\r\n },\r\n {\r\n dataField: 'attachments',\r\n visible: false\r\n },\r\n {\r\n type: \"buttons\",\r\n buttons: [{ name: \"delete\" }, {\r\n hint: \"Edit\",\r\n icon: \"edit\",\r\n onClick: function (e) {\r\n enablePopupMode(e);\r\n }\r\n }, {\r\n hint: \"Logs\",\r\n icon: \"file\",\r\n onClick: function (e) {\r\n emailLogs.open(e.row.key);\r\n },\r\n visible: data.emailsManagement && data.showEmailLogButton ? true : false\r\n }, {\r\n hint: \"Send Now\",\r\n //icon: \"video\",\r\n icon: \"chevrondoubleright\",\r\n onClick: function (e) {\r\n popupSendNow([e.row.key], vm, data);\r\n }\r\n }]\r\n }\r\n\r\n ],\r\n\r\n showBorders: true,\r\n editing: {\r\n mode: \"cell\",//\"popup\",\r\n allowUpdating: true,\r\n allowDeleting: true,\r\n allowAdding: data.emailsManagement ? false : true,\r\n useIcons: true,\r\n form: {\r\n alignItemLabelsInAllGroups: false,\r\n onInitialized: function (e) {\r\n form = e.component;\r\n },\r\n onContentReady: function (e) {\r\n form.itemOption('attachments-container.attachmentList', 'items', getAttachmentsOptions(vm.currentEmail().attachments));\r\n\r\n let addButton = $(\".scheduledEmail-attachment-add\", e.element).css(\"display\", \"inline-block\").css(\"margin-left\", \"10px\");\r\n let groupAttachment = $(\".scheduledEmail-attachment-group .dx-form-group-caption\", e.element);\r\n addButton.insertAfter(groupAttachment);\r\n },\r\n customizeItem: function (item) {\r\n if (item.dataField == \"scheduledDays\") {\r\n let isVisible = getColumnValue(\"schedule\", this.component) !== \"Daily\";\r\n item.visible = isVisible;\r\n }\r\n\r\n if (item.dataField == \"addressListId\") {\r\n let isVisible = getColumnValue(\"useAddressList\", this.component);\r\n item.visible = isVisible;\r\n }\r\n\r\n if (item.dataField == \"filterId\") {\r\n let isVisible = getColumnValue(\"useAddressList\", this.component);\r\n item.visible = isVisible;\r\n }\r\n\r\n if (item.dataField === \"companyId\") {\r\n let isVisible = data.enableMultiTenant && !getColumnValue(\"useAddressList\", this.component);\r\n item.visible = isVisible;\r\n }\r\n\r\n if (item.dataField === \"sendEmptyReport\") {\r\n const scope = getColumnValue(\"scope\", this.component);\r\n let isDisabled = scope !== ContainerScopeEnum.Report && scope !== ContainerScopeEnum.Dashboard;\r\n item.disabled = isDisabled;\r\n }\r\n\r\n if (item.dataField === \"notificationText\") {\r\n const scope = getColumnValue(\"scope\", this.component);\r\n let isVisible = (scope === ContainerScopeEnum.Report || scope === ContainerScopeEnum.Dashboard) && getColumnValue(\"sendEmptyReport\", this.component) === SendEmptyReportEnum.Notification;\r\n item.visible = isVisible;\r\n }\r\n\r\n if (item.dataField === \"widgetIdEmptyReport\") {\r\n const scope = getColumnValue(\"scope\", this.component);\r\n let isVisible = scope === ContainerScopeEnum.Dashboard && getColumnValue(\"sendEmptyReport\", this.component) !== SendEmptyReportEnum.Yes;\r\n item.visible = isVisible;\r\n }\r\n\r\n if (item.dataField == \"recipients\") {\r\n let isVisible = !getColumnValue(\"useAddressList\", this.component);\r\n item.visible = isVisible;\r\n }\r\n\r\n if (item.dataField === \"pdfTemplateId\") {\r\n const format = getColumnValue(\"formats\", this.component);\r\n let isVisible = format === EmailFormatEnum.PDFLandscape || format === EmailFormatEnum.PDF;\r\n item.visible = isVisible;\r\n }\r\n\r\n if (item.dataField == \"showInfoBody\") {\r\n let scopeText = getColumnValue(\"scope\", this.component);\r\n if (scopeText === ContainerScopeEnum.Workbook) {\r\n scopeText = \"Workbook\";\r\n }\r\n else if (scopeText === ContainerScopeEnum.Dashboard) {\r\n scopeText = \"Dashboard\";\r\n }\r\n else {\r\n scopeText = \"Report\";\r\n }\r\n item.label.text = `Show ${scopeText} Info Body`;\r\n let isVisible = getColumnValue(\"formats\", this.component);\r\n item.visible = isVisible === \"HTML\";\r\n }\r\n },\r\n items: [\r\n {\r\n itemType: 'group',\r\n colCount: 2,\r\n colSpan: 2,\r\n items: ['userId',\r\n {\r\n dataField: 'useAddressList',\r\n },\r\n {\r\n dataField: 'recipients',\r\n colSpan: 2,\r\n },\r\n {\r\n caption: 'CC',\r\n dataField: 'cc',\r\n },\r\n {\r\n caption: 'BCC',\r\n dataField: 'bcc',\r\n },\r\n {\r\n caption: 'Address List',\r\n dataField: 'addressListId',\r\n colSpan: 1,\r\n },\r\n {\r\n dataField: 'filterId',\r\n colSpan: 1,\r\n },\r\n {\r\n dataField: 'companyId',\r\n colSpan: 1,\r\n visible: data.enableMultiTenant\r\n },\r\n 'tabId', { dataField: 'scope', disabled: true, visible: false },\r\n { caption: 'Send Empty Report', dataField: 'sendEmptyReport' }, 'widgetIdEmptyReport',\r\n {\r\n dataField: 'notificationText',\r\n caption: 'Notification Text'\r\n }, 'pdfTemplateId',\r\n ],\r\n }, {\r\n itemType: 'group',\r\n colCount: 2,\r\n colSpan: 2,\r\n caption: 'Email',\r\n items: [{\r\n dataField: 'subjectText',\r\n label: {\r\n template: (data, element) => {\r\n const dataGrid = getDxDataGrid();\r\n const useAddressList = dataGrid.cellValue(dataGrid.getRowIndexByKey(vm.currentEmail().id), \"useAddressList\");\r\n const hasFilter = dataGrid.cellValue(dataGrid.getRowIndexByKey(vm.currentEmail().id), \"filterId\") > 0;\r\n const infoIcon = useAddressList && hasFilter ? ' ' : \"\";\r\n const labelText = `Subject`;\r\n\r\n element.append(`
    ${labelText}${infoIcon}
    `);\r\n\r\n $('
    ').dxTooltip({\r\n target: '#helpedInfo',\r\n showEvent: 'mouseenter',\r\n hideEvent: 'mouseleave',\r\n contentTemplate(args) {\r\n args.html('
    Use the [AddressListFilter] tag to add the filter value in the email subject and body text
    ');\r\n },\r\n }).appendTo(element);\r\n\r\n $('#helpedInfo', element).click(function () {\r\n let subjectText = dataGrid.cellValue(dataGrid.getRowIndexByKey(vm.currentEmail().id), \"subjectText\");\r\n if (subjectText) {\r\n subjectText += \" [AddressListFilter]\";\r\n }\r\n dataGrid.cellValue(dataGrid.getRowIndexByKey(vm.currentEmail().id), \"subjectText\", subjectText);\r\n });\r\n },\r\n }\r\n },\r\n 'formats', {\r\n dataField: 'bodyText',\r\n editorType: 'dxTextArea',\r\n colSpan: 2,\r\n editorOptions: {\r\n height: 100,\r\n }\r\n }\r\n ],\r\n },\r\n {\r\n itemType: 'group',\r\n colCount: 2,\r\n colSpan: 2,\r\n items: [{\r\n dataField: \"showInfoBody\",\r\n editorType: 'dxSwitch'\r\n }]\r\n },\r\n {\r\n itemType: 'group',\r\n caption: 'Attachments',\r\n cssClass: \"scheduledEmail-attachment-group\",\r\n name: 'attachments-container',\r\n colCount: 2,\r\n colSpan: 2,\r\n items: [\r\n {\r\n colSpan: 2,\r\n cssClass: \"scheduledEmail-attachment-add\",\r\n editorType: 'dxButton',\r\n editorOptions: {\r\n icon: 'add',\r\n text: 'Add',\r\n onClick() {\r\n if (vm.currentEmail().attachments === undefined) {\r\n vm.currentEmail().attachments = [];\r\n }\r\n vm.currentEmail().attachments.push(new AttachmentTab());\r\n form.itemOption('attachments-container.attachmentList', 'items', getAttachmentsOptions(vm.currentEmail().attachments));\r\n let gridInstance = getDxDataGrid();\r\n gridInstance.cellValue(gridInstance.getRowIndexByKey(vm.currentEmail().id), \"attachments\", vm.currentEmail().attachments);\r\n },\r\n },\r\n },\r\n {\r\n itemType: 'group',\r\n name: 'attachmentList',\r\n colSpan: 2,\r\n colCount: 2,\r\n items: getAttachmentsOptions(currentEmail() ? currentEmail().attachments : []),\r\n }]\r\n }, {\r\n itemType: 'group',\r\n colCount: 2,\r\n colSpan: 2,\r\n caption: 'Schedule Details',\r\n name: 'ScheduleDetails',\r\n items: [\r\n {\r\n dataField: 'schedule',\r\n editorType: 'dxSelectBox',\r\n colSpan: 1,\r\n editorOptions: {\r\n items: ['Daily', 'Weekly', 'Monthly'],\r\n },\r\n },\r\n {\r\n dataField: 'scheduledHour',\r\n editorType: 'dxDateBox',\r\n colSpan: 1,\r\n editorOptions: {\r\n type: 'time',\r\n useMaskBehavior: true,\r\n showDropDownButton: false,\r\n displayFormat: \"HH:mm\",\r\n },\r\n },\r\n {\r\n itemType: 'group',\r\n colCount: 2,\r\n colSpan: 2,\r\n name: 'ScheduleDetailsHour',\r\n items: [\r\n {\r\n label: { text: 'Days' },\r\n dataField: 'scheduledDays',\r\n editorType: 'dxTagBox',\r\n colSpan: 2,\r\n editorOptions: {\r\n searchEnabled: true,\r\n showSelectionControls: true,\r\n dataSource: [{ Id: 1, Name: 'Sunday' }, { Id: 2, Name: 'Monday' }, { Id: 3, Name: 'Tuesday' }, { Id: 4, Name: 'Wednesday' }, { Id: 5, Name: 'Thursday' }, { Id: 6, Name: 'Friday' }, { Id: 7, Name: 'Saturday' }],\r\n displayExpr: 'Name',\r\n valueExpr: 'Id',\r\n onClosed: function (e) {\r\n if (refreshByCode) { return };\r\n\r\n let arr = e.component.option('value');\r\n\r\n refreshByCode = true;\r\n\r\n if (arr.length > 0) {\r\n let sorted = arr.sort((n1, n2) => n1 - n2);\r\n let email = currentEmail();\r\n let gridInstance = getDxDataGrid();\r\n let rowIndex = gridInstance.getRowIndexByKey(email.id);\r\n\r\n e.component.option('values', []);\r\n e.component.option('values', sorted);\r\n\r\n gridInstance.cellValue(rowIndex, \"scheduledDays\", sorted);\r\n\r\n e.component.repaint();\r\n }\r\n\r\n refreshByCode = false;\r\n }\r\n }\r\n },\r\n ]\r\n },\r\n 'sendReport'\r\n ],\r\n }\r\n ]\r\n },\r\n popup: {\r\n title: data.emailsManagement ? 'Emails Management' : 'Scheduled Emails',\r\n showTitle: true,\r\n width: 800,\r\n height: 600,\r\n },\r\n },\r\n focusedRowEnabled: true,\r\n keyExpr: \"id\",\r\n focusedRowIndex: 0,\r\n\r\n toolbar: !data.emailsManagement ? undefined : {\r\n items: [\r\n \"searchPanel\",\r\n {\r\n location: 'after',\r\n widget: 'dxButton',\r\n options: {\r\n hint: \"Filters\",\r\n icon: 'filter',\r\n name: 'filter',\r\n onClick: function (e) {\r\n let popupFilters = $(\"#scheduledEmailsFilter\").data(\"dxPopup\");\r\n\r\n let vmFilter = { };\r\n if (!popupFilters) {\r\n vmFilter = {\r\n dateRangeOptions: {\r\n multiView: false,\r\n displayFormat: data.dateFormat,\r\n value: [data.startDate, data.endDate],\r\n labelMode: \"hidden\",\r\n showClearButton: true,\r\n useMaskBehavior: true,\r\n },\r\n startTimeOptions: {\r\n value: data.startTime,\r\n type: 'time',\r\n useMaskBehavior: true,\r\n showDropDownButton: false,\r\n displayFormat: \"HH:mm\",\r\n showClearButton: true,\r\n onValueChanged: function (e) {\r\n let timeBox = $(\"#scheduledEmailsFilterEndTime\").dxDateBox(\"instance\");\r\n let endTime = timeBox.option(\"value\");\r\n if (e.value > endTime) {\r\n timeBox.option(\"value\", e.value);\r\n }\r\n }\r\n },\r\n endTimeOptions: {\r\n value: data.endTime,\r\n type: 'time',\r\n useMaskBehavior: true,\r\n showDropDownButton: false,\r\n displayFormat: \"HH:mm\",\r\n showClearButton: true,\r\n onValueChanged: function (e) {\r\n let timeBox = $(\"#scheduledEmailsFilterStarTime\").dxDateBox(\"instance\");\r\n let startTime = timeBox.option(\"value\");\r\n if (e.value < startTime) {\r\n timeBox.option(\"value\", e.value);\r\n }\r\n }\r\n },\r\n applyOptions: {\r\n text: 'Apply',\r\n icon: 'filter',\r\n onClick() {\r\n let vals = $(\"#scheduledEmailsFilterDates\").dxDateRangeBox(\"instance\").option(\"value\");\r\n var filterOptions = {\r\n startDate: vals && vals.length > 0 ? vals[0] : undefined,\r\n endDate: vals && vals.length > 1 ? vals[1] : vals && vals.length > 0 ? vals[0] : undefined,\r\n startTime: $(\"#scheduledEmailsFilterStarTime\").dxDateBox(\"instance\").option(\"value\"),\r\n endTime: $(\"#scheduledEmailsFilterEndTime\").dxDateBox(\"instance\").option(\"value\")\r\n };\r\n\r\n if (filterOptions.startDate && !filterOptions.endDate || !filterOptions.startDate && filterOptions.endDate ||\r\n filterOptions.startTime && !filterOptions.endTime || !filterOptions.startTime && filterOptions.endTime) {\r\n\r\n DevExpress.ui.dialog.alert(`The date range and/or the time range needs to be selected, it is not allowed to select only half of the date or a time`, \"Emails Management\");\r\n return;\r\n }\r\n\r\n let filtervalue = null;\r\n const gridComponent = getDxDataGrid();\r\n if (filterOptions.startDate && filterOptions.endDate) {\r\n let daysOfweek = [];\r\n let daysOfMonth = []\r\n let weeklyFilter = [];\r\n let monthlyFilter = [];\r\n for (var d = new Date(filterOptions.startDate); d <= filterOptions.endDate; d.setDate(d.getDate() + 1)) {\r\n let date = new Date(d);\r\n if (daysOfweek.indexOf(date.getDay() + 1) === -1) {\r\n daysOfweek.push(date.getDay() + 1);\r\n }\r\n\r\n if (daysOfMonth.indexOf(date.getDate()) === -1) {\r\n daysOfMonth.push(date.getDate());\r\n }\r\n }\r\n\r\n for (var i = 0; i < daysOfweek.length; i++) {\r\n if (weeklyFilter.length > 0) {\r\n weeklyFilter.push(\"or\");\r\n }\r\n\r\n weeklyFilter.push(['scheduledDaysFilter', 'contains', `#${daysOfweek[i]}#`]);\r\n }\r\n\r\n for (var i = 0; i < daysOfMonth.length; i++) {\r\n if (monthlyFilter.length > 0) {\r\n monthlyFilter.push(\"or\");\r\n }\r\n\r\n monthlyFilter.push(['scheduledDaysFilter', 'contains', `#${daysOfMonth[i]}#`]);\r\n }\r\n\r\n filtervalue = [\r\n ['schedule', '=', 'Daily'],\r\n 'or',\r\n [\r\n ['schedule', '=', 'Weekly'],\r\n 'and',\r\n [weeklyFilter]\r\n ],\r\n 'or',\r\n [\r\n ['schedule', '=', 'Monthly'],\r\n 'and',\r\n [monthlyFilter]\r\n ]\r\n ];\r\n }\r\n\r\n if (filterOptions.startTime && filterOptions.endTime) {\r\n if (!filtervalue) {\r\n filtervalue = [];\r\n }\r\n \r\n if (filtervalue.length > 0) {\r\n filtervalue = [filtervalue, \"and\"];\r\n }\r\n\r\n const starTimeStr = moment(filterOptions.startTime).format(\"HH:mm:ss\");\r\n const endTimeStr = moment(filterOptions.endTime).format(\"HH:mm:ss\");\r\n filtervalue.push([[\"scheduledHour\", \">=\", starTimeStr], \"and\", [\"scheduledHour\", \"<=\", endTimeStr]]);\r\n }\r\n\r\n if (gridComponent.option(\"filterValue\") !== filtervalue) {\r\n gridComponent.option(\"filterValue\", filtervalue);\r\n }\r\n\r\n $(\".dx-toolbar .dx-button[aria-label='filter'] i.dx-icon-filter\", \"#scheduledEmailsGrid\").css(\"color\", filtervalue ? \"#337ab7\" : \"#333\");\r\n\r\n popupFilters.hide();\r\n },\r\n }\r\n }\r\n\r\n ko.applyBindings(vmFilter, document.getElementById(\"scheduledEmailsFilter\"));\r\n popupFilters = ($(\"#scheduledEmailsFilter\") as any).dxPopup({\r\n width: 600,\r\n height: 150,\r\n showTitle: true,\r\n title: \"Filters\",\r\n visible: false,\r\n dragEnabled: false,\r\n hideOnOutsideClick: false,\r\n showCloseButton: true,\r\n position: {\r\n at: \"center\",\r\n my: \"center\",\r\n }\r\n }).dxPopup(\"instance\");\r\n }\r\n\r\n popupFilters.show();\r\n }\r\n }\r\n },\r\n {\r\n location: 'after',\r\n widget: 'dxButton',\r\n options: {\r\n hint: \"Send Selected Emails\",\r\n icon: 'chevrondoubleright',\r\n text: \"Send\",\r\n onClick: function(e) {\r\n const gridComponent = getDxDataGrid();\r\n const keys = gridComponent.getSelectedRowKeys();\r\n popupSendNow(keys, vm, data);\r\n },\r\n disabled: true\r\n }\r\n }\r\n ],\r\n \r\n },\r\n\r\n onInitialized: function (e) {\r\n e.component.emailsManagement = data.emailsManagement;\r\n e.component.filters = data.filters || [];\r\n e.component.tabs = data.tabs || [];\r\n e.component.usersGroups = data.usersGroups || [];\r\n e.component.widgets = data.widgets || [];\r\n },\r\n onEditorPreparing: function (e) {\r\n if (e.parentType === \"dataRow\") {\r\n let scheduledEmail = e.row.data;\r\n\r\n if (e.dataField === \"scheduledDays\") {\r\n e.editorOptions.enable = e.row.data && scheduledEmail.schedule !== \"Daily\";\r\n let data = [];\r\n if (scheduledEmail.schedule === \"Weekly\")\r\n data = [{ Id: 1, Name: 'Sunday' }, { Id: 2, Name: 'Monday' }, { Id: 3, Name: 'Tuesday' }, { Id: 4, Name: 'Wednesday' }, { Id: 5, Name: 'Thursday' }, { Id: 6, Name: 'Friday' }, { Id: 7, Name: 'Saturday' }];\r\n else if (scheduledEmail.schedule === \"Monthly\") {\r\n for (var i = 1; i <= 31; i++) {\r\n data.push({ Id: i, Name: i.toString() });\r\n }\r\n }\r\n e.editorOptions.dataSource = data;\r\n }\r\n else if (e.dataField === \"formats\") {\r\n switch (scheduledEmail.scope) {\r\n case ContainerScopeEnum.Workbook:\r\n case ContainerScopeEnum.Dashboard:\r\n formatList = [\r\n { id: EmailFormatEnum.PDFLandscape, name: \"PDF Landscape\" },\r\n { id: EmailFormatEnum.PDF, name: \"PDF\" }\r\n /*, { id: \"HTML\", name: \"HTML\" },*/\r\n ];\r\n break;\r\n case ContainerScopeEnum.Report:\r\n formatList = [\r\n { id: EmailFormatEnum.PDFLandscape, name: \"PDF Landscape\" },\r\n { id: EmailFormatEnum.PDF, name: \"PDF\" }\r\n /*, { id: \"HTML\", name: \"HTML\" }*/,\r\n { id: EmailFormatEnum.Excel, name: \"Excel\" },\r\n { id: EmailFormatEnum.CSV, name: \"CSV\" }\r\n ];\r\n break;\r\n }\r\n e.editorOptions.dataSource = formatList;\r\n e.editorOptions.itemTemplate = function (data) {\r\n let style = \"\";\r\n if (!loggedUser.permissions.printExportPDF() && (data.id === EmailFormatEnum.PDFLandscape || data.id === EmailFormatEnum.PDF) ||\r\n !loggedUser.permissions.exportExcelCSV() && (data.id === EmailFormatEnum.Excel || data.id === EmailFormatEnum.CSV)) {\r\n style = \"color: #afadad;\";\r\n }\r\n\r\n return `
    ${data.name}
    `;\r\n }\r\n }\r\n else if (e.dataField === \"filterId\") {\r\n e.editorOptions.dataSource = e.component.filters;\r\n e.editorOptions.itemTemplate = function (data) {\r\n let style = \"\";\r\n if (data.deprecated) {\r\n style = \"color: #afadad;\";\r\n }\r\n\r\n return `
    ${data.name}
    `;\r\n }\r\n }\r\n else if (e.dataField === \"tabId\") {\r\n e.editorOptions.dataSource = e.component.tabs.filter(function (x) { return x.id >= 0; });\r\n }\r\n else if (e.dataField === \"userId\") {\r\n e.editorOptions.dataSource = e.component.usersGroups;\r\n }\r\n else if (e.dataField === \"companyId\") {\r\n e.editorOptions.dataSource = data.companies.filter(function (x) { return x.users.includes(scheduledEmail.userId); })\r\n }\r\n else if (e.dataField === \"widgetIdEmptyReport\") {\r\n e.editorOptions.dataSource = e.component.widgets.filter(function (x) { return x.id === 0 || (x.id >= 0 && x.tabId == scheduledEmail.tabId); });\r\n }\r\n }\r\n },\r\n onRowInserted: function (e) {\r\n e.component.option(\"focusedRowKey\", e.data.id);\r\n },\r\n onEditingStart: function (e) {\r\n if (e.column) {\r\n e.cancel = e.column.dataField !== \"sendReport\";\r\n }\r\n },\r\n onEditCanceling: function (e) {\r\n newRow = false;\r\n },\r\n onFocusedRowChanged: function (e) {\r\n if (!newRow) {\r\n vm.currentEmail(e.row?.data);\r\n vm.currentSchedule(e.row?.data?.schedule);\r\n }\r\n\r\n if (currentEmail()) {\r\n bottomForm.itemOption('ScheduleDetails.scheduledDaysWeekly', 'visible', currentEmail().schedule === 'Weekly');\r\n bottomForm.itemOption('ScheduleDetails.scheduledDaysMonthly', 'visible', currentEmail().schedule === 'Monthly');\r\n }\r\n },\r\n onSaving: function (e) {\r\n newRow = false;\r\n\r\n if (e.component.option(\"editing.mode\") === \"popup\") {\r\n if (!loggedUser.permissions.printExportPDF() && !loggedUser.permissions.exportExcelCSV()) {\r\n DevExpress.ui.dialog.alert(\"User does not have 'Print Report and Export PDF' or 'Export to Excel/CSV' permission.\", \"Scheduled Emails\");\r\n e.cancel = true;\r\n }\r\n else {\r\n let email = vm.currentEmail() as Email;\r\n if (e.changes.length > 0) {\r\n //clone\r\n email = JSON.parse(JSON.stringify(email));\r\n copyProperties(e.changes[0].data, email);\r\n }\r\n\r\n let cancel = false;\r\n if (!loggedUser.permissions.printExportPDF() || !loggedUser.permissions.exportExcelCSV()) {\r\n if (!loggedUser.permissions.printExportPDF() && (email.formats === EmailFormatEnum.PDF || email.formats === EmailFormatEnum.PDFLandscape) ||\r\n !loggedUser.permissions.exportExcelCSV() && (email.formats === EmailFormatEnum.Excel || email.formats === EmailFormatEnum.CSV)) {\r\n cancel = true;\r\n }\r\n\r\n if (email.attachments) {\r\n email.attachments.forEach(function (attachment) {\r\n if (!loggedUser.permissions.printExportPDF() && (attachment.format === EmailFormatEnum.PDF || attachment.format === EmailFormatEnum.PDFLandscape) ||\r\n !loggedUser.permissions.exportExcelCSV() && (attachment.format === EmailFormatEnum.Excel || attachment.format === EmailFormatEnum.CSV)) {\r\n cancel = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n if (cancel) {\r\n DevExpress.ui.dialog.alert(`User does not have ${(!loggedUser.permissions.printExportPDF() ? \"Print Report and Export PDF\" : \"Export to Excel/CSV\")} permission.`, \"Scheduled Emails\");\r\n e.cancel = true;\r\n }\r\n\r\n if (email.sendEmptyReport !== SendEmptyReportEnum.Yes && email.scope === ContainerScopeEnum.Dashboard) {\r\n if (email.widgetIdEmptyReport === 0 || !e.component.widgets.find(function (x) { return x.id == email.widgetIdEmptyReport && x.tabId == email.tabId; })) {\r\n DevExpress.ui.dialog.alert(\"Widget is required.\", \"Email\");\r\n e.cancel = true;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n onSaved: function (e) {\r\n if (currentEmail()) {\r\n bottomForm.itemOption('ScheduleDetails.scheduledDaysWeekly', 'visible', currentEmail().schedule === 'Weekly');\r\n bottomForm.itemOption('ScheduleDetails.scheduledDaysMonthly', 'visible', currentEmail().schedule === 'Monthly');\r\n }\r\n },\r\n onInitNewRow: function (e) {\r\n newRow = true;\r\n e.data = new Email();\r\n\r\n let config = tabView.getBaseSubmitObject({});\r\n e.data.workbookId = config.workbookId;\r\n e.data.mappingId = config.mappingId;\r\n e.data.userId = data.userId;\r\n e.data.userName = data.userName;\r\n e.data.subjectText = data.workbookName\r\n e.data.companyId = data.companyId;\r\n e.data.organisationId = data.organisationId;\r\n\r\n let userGroup = data.usersGroups.find(x => x.id === data.userId);\r\n if (userGroup) {\r\n e.data.recipients = userGroup.email;\r\n }\r\n\r\n if (data.enableMultiTenant) {\r\n let company = data.companies.find(x => x.id === e.data.companyId);\r\n if (company) {\r\n e.data.companyName = company.name;\r\n }\r\n }\r\n\r\n vm.currentEmail(e.data);\r\n vm.currentSchedule(e.data.schedule);\r\n enablePopupMode(e, true);\r\n },\r\n onSelectionChanged: function (e){\r\n if (data.emailsManagement) {\r\n const isDisabled = e.component.option(\"toolbar.items[2].options.disabled\");\r\n if (isDisabled !== (e.selectedRowKeys.length === 0)) {\r\n e.component.beginUpdate();\r\n e.component.option(\"toolbar.items[2].options.disabled\", e.selectedRowKeys.length === 0);\r\n const columns = e.component.option(\"columns\");\r\n const buttonColumn = columns.find(x => x.type === \"buttons\");\r\n for (var i = 0; i < buttonColumn.buttons.length; i++) {\r\n e.component.option(`columns[${columns.indexOf(buttonColumn)}].buttons[${i}].disabled`, e.selectedRowKeys.length > 0)\r\n }\r\n e.component.endUpdate();\r\n e.component.repaint();\r\n }\r\n }\r\n }\r\n },\r\n formOptions: {\r\n height: 245,\r\n onInitialized: function (e) {\r\n bottomForm = e.component;\r\n },\r\n readOnly: true,\r\n formData: currentEmail,\r\n items: [\r\n {\r\n itemType: 'group',\r\n colCount: 5,\r\n colSpan: 5,\r\n caption: 'Schedule Details',\r\n name: 'ScheduleDetails',\r\n items: [\r\n {\r\n dataField: 'schedule',\r\n editorType: 'dxSelectBox',\r\n colSpan: 1,\r\n editorOptions: {\r\n items: ['Daily', 'Weekly', 'Monthly'],\r\n },\r\n },\r\n {\r\n dataField: 'scheduledHour',\r\n editorType: 'dxDateBox',\r\n colSpan: 1,\r\n editorOptions: {\r\n type: 'time',\r\n useMaskBehavior: true,\r\n showDropDownButton: false,\r\n displayFormat: \"HH:mm\",\r\n },\r\n },\r\n {\r\n label: { text: 'Days' },\r\n name: 'scheduledDaysWeekly',\r\n dataField: 'scheduledDays',\r\n editorType: 'dxTagBox',\r\n colSpan: 3,\r\n editorOptions: {\r\n searchEnabled: true,\r\n showSelectionControls: true,\r\n dataSource: [{ Id: 1, Name: 'Sunday' }, { Id: 2, Name: 'Monday' }, { Id: 3, Name: 'Tuesday' }, { Id: 4, Name: 'Wednesday' }, { Id: 5, Name: 'Thursday' }, { Id: 6, Name: 'Friday' }, { Id: 7, Name: 'Saturday' }],\r\n displayExpr: 'Name',\r\n valueExpr: 'Id',\r\n },\r\n },\r\n {\r\n label: { text: 'Days' },\r\n name: 'scheduledDaysMonthly',\r\n dataField: 'scheduledDays',\r\n editorType: 'dxTagBox',\r\n colSpan: 3,\r\n editorOptions: {\r\n searchEnabled: true,\r\n showSelectionControls: true,\r\n items: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 29, 30, 31],\r\n onValueChanged: function (e) {\r\n let arr = e.component.option('value');\r\n\r\n if (arr.length > 0) {\r\n let sorted = arr.sort((n1, n2) => n1 - n2);\r\n\r\n e.component.option('values', sorted);\r\n\r\n try {\r\n e.component.repaint();\r\n } catch (e) { console.log('exception on repaint'); }\r\n }\r\n }\r\n },\r\n },\r\n\r\n ],\r\n },\r\n {\r\n itemType: 'group',\r\n colCount: 5,\r\n colSpan: 5,\r\n caption: 'Information',\r\n items: [\r\n {\r\n dataField: 'dateAdded',\r\n caption: 'Added',\r\n editorType: 'dxDateBox',\r\n colSpan: 2,\r\n editorOptions: {\r\n type: 'datetime',\r\n showDropDownButton: false,\r\n },\r\n },\r\n {\r\n dataField: 'lastEmailSent',\r\n caption: 'Last Email Sent',\r\n editorType: 'dxCheckBox',\r\n colSpan: 1,\r\n },\r\n {\r\n dataField: 'lastSentDate',\r\n caption: 'Last Sent',\r\n editorType: 'dxDateBox',\r\n colSpan: 2,\r\n editorOptions: {\r\n type: 'datetime',\r\n showDropDownButton: false,\r\n },\r\n },\r\n {\r\n dataField: 'lastStatus',\r\n caption: 'Last Status',\r\n colSpan: 5,\r\n },\r\n {\r\n dataField: 'lastSmtpResponse',\r\n caption: 'Last STMP Response',\r\n colSpan: 5,\r\n },\r\n {\r\n dataField: 'emailCount',\r\n caption: 'Email Count',\r\n colSpan: 1,\r\n },\r\n\r\n ]\r\n }\r\n ]\r\n\r\n }\r\n };\r\n\r\n $(\"#EmailsPopupContent\").html(\"\");\r\n let popup = ($(\"#EmailsPopup\") as any).dxPopup({\r\n contentTemplate: `
    `,\r\n width: 1200,\r\n height: 600,\r\n showTitle: true,\r\n title: data.emailsManagement ? 'Emails Management' : 'Scheduled Emails',\r\n visible: false,\r\n dragEnabled: false,\r\n hideOnOutsideClick: false,\r\n showCloseButton: true,\r\n position: {\r\n at: \"center\",\r\n my: \"center\",\r\n },\r\n onShown: function (e) {\r\n $(\"#EmailsPopupContent\").html(data.view);\r\n ko.applyBindings(vm, document.getElementById(\"scheduledEmailsContext\"));\r\n }\r\n }).dxPopup(\"instance\");\r\n\r\n popup.show();\r\n };\r\n\r\n function openEmailsManagement(emailId: number = null, showEmailLogButton: boolean = true) {\r\n if (!loggedUser.permissions.emailsManagement()) {\r\n return showToast(\"User does not have permission to Emails Management\");\r\n }\r\n\r\n irGlobal.updateFromServer({},\r\n urlConfigs.email + \"GetEmailsManagement\",\r\n emailId === null ? {} : { EmailsId: [emailId] },\r\n function (data) {\r\n let emails = [];\r\n data.emails.forEach(function (em) {\r\n let email = new Email();\r\n for (var i = 0; i < data.emailProperties.length; i++) {\r\n if (em[i] !== null && em[i] !== undefined) {\r\n if (typeof em[i] === \"object\" && em[i].$values) {\r\n email[data.emailProperties[i]] = em[i].$values;\r\n }\r\n else {\r\n email[data.emailProperties[i]] = em[i];\r\n }\r\n }\r\n }\r\n delete email.scheduleDetails;\r\n\r\n if (email.scheduledDays && email.scheduledDays.length > 0) {\r\n email.scheduledDaysFilter = email.scheduledDays.map(x => \"#\" + x + \"#\").toString();\r\n }\r\n\r\n emails.push(email);\r\n });\r\n\r\n data.emails = emails;\r\n data.emailsManagement = true;\r\n data.showEmailLogButton = showEmailLogButton;\r\n openPopup(data);\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n }\r\n\r\n function openEmailsPopup() {\r\n irGlobal.updateFromServer({},\r\n urlConfigs.email + \"GetEmails\",\r\n {},\r\n function (data) {\r\n prepareEmails(data.emails, data.tabs);\r\n openPopup(data);\r\n },\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n }\r\n\r\n return {\r\n openEmailsPopup: openEmailsPopup,\r\n openEmailsManagement: openEmailsManagement\r\n };\r\n\r\n}());\r\n","interface EmailLogResultData {\r\n emailId: number;\r\n logs: Array;\r\n partial: string;\r\n startDate: string;\r\n endDate: string;\r\n startTime: string;\r\n endTime: string;\r\n}\r\n\r\ninterface EmailLogItem {\r\n id: number;\r\n emailId: number;\r\n date: string;\r\n sent: boolean;\r\n messageId: string;\r\n smtpResponse: string;\r\n status: string;\r\n recipients: string;\r\n}\r\n\r\ninterface EmailLogFilterOptions {\r\n startDate: string;\r\n endDate: string;\r\n startTime: string;\r\n endTime: string;\r\n recipients: string;\r\n sent: boolean;\r\n}\r\n\r\nvar emailLogs = (function () {\r\n\r\n function show(data: EmailLogResultData) {\r\n let currentLog = ko.observable(data.logs.length > 0 ? data.logs[0] : null);\r\n let sentFilter = ko.observable(null);\r\n let recipientsFilter = ko.observable(\"\");\r\n let startDateFilter = ko.observable(data.startDate);\r\n let endDateFilter = ko.observable(data.endDate);\r\n let startTimeFilter = ko.observable(data.startTime);\r\n let endTimeFilter = ko.observable(data.endTime);\r\n\r\n let vm = {\r\n dataGridOptions: {\r\n height: 270,\r\n width: 778,\r\n dataSource: data.logs,\r\n showColumnLines: false,\r\n showRowLines: true,\r\n rowAlternationEnabled: false,\r\n columns: [\r\n { dataField: \"emailLogId\", caption: \"Id\", width: 80, allowGrouping: false },\r\n { dataField: \"date\", width: 110},\r\n { dataField: \"sent\", width: 50},\r\n { dataField: \"status\", allowGrouping: false },\r\n {\r\n type: \"buttons\",\r\n width: 75,\r\n buttons: [{\r\n hint: \"Copy Status\",\r\n icon: \"copy\",\r\n onClick: function (e) {\r\n irGlobal.copyTextToClipboard(e.row.data.status || \"\", \"Status copied to clipboard\");\r\n }\r\n }, {\r\n hint: \"Email\",\r\n icon: \"email\",\r\n onClick: function (e) {\r\n scheduledEmail.openEmailsManagement(e.row.data.emailId, false);\r\n }\r\n }],\r\n allowGrouping: false\r\n }\r\n ],\r\n showBorders: true,\r\n focusedRowKey: data.logs.length > 0 ? data.logs[0].id : null,\r\n focusedRowEnabled: true,\r\n keyExpr: \"id\",\r\n groupPanel: {\r\n visible: true\r\n },\r\n scrolling: {\r\n mode: 'virtual'\r\n },\r\n paging: {\r\n enabled: false\r\n },\r\n onFocusedRowChanged: function (e) {\r\n currentLog(e.row?.data);\r\n }\r\n },\r\n formOptions: {\r\n height: 130,\r\n readOnly: true,\r\n formData: currentLog,\r\n items: [\r\n {\r\n dataField: 'recipients',\r\n caption: 'Recipients',\r\n editorType: 'dxTextArea',\r\n editorOptions: {\r\n height: 60\r\n }\r\n },\r\n {\r\n dataField: 'smtpResponse',\r\n caption: 'STMP Response',\r\n editorType: 'dxTextArea',\r\n }\r\n ]\r\n },\r\n\r\n dateRangeOptions: {\r\n multiView: false,\r\n displayFormat: irSettings.dateFormat,\r\n value: [data.startDate, data.endDate],\r\n labelMode: \"hidden\",\r\n onValueChanged: function (e) {\r\n let previousStartDate = e.previousValue[0];\r\n let previousEndDate = e.previousValue[1];\r\n let newStartDate = e.value[0];\r\n let newEndDate = e.value[1];\r\n\r\n if (previousStartDate !== newStartDate || previousEndDate !== newEndDate) {\r\n if (typeof newStartDate === \"object\") {\r\n startDateFilter(DevExpress.localization.formatDate(newStartDate, \"yyyy-MM-dd\"));\r\n }\r\n else {\r\n startDateFilter(newStartDate);\r\n }\r\n\r\n if (typeof newEndDate === \"object\") {\r\n endDateFilter(DevExpress.localization.formatDate(newEndDate, \"yyyy-MM-dd\"));\r\n }\r\n else {\r\n endDateFilter(newEndDate);\r\n }\r\n }\r\n }\r\n },\r\n recipientsOptions: {\r\n value: recipientsFilter,\r\n showClearButton: true\r\n },\r\n sentOptions: {\r\n enableThreeStateBehavior: true,\r\n value: sentFilter,\r\n text: 'Sent'\r\n },\r\n\r\n startTimeOptions: {\r\n value: data.startTime,\r\n type: 'time',\r\n useMaskBehavior: true,\r\n showDropDownButton: false,\r\n displayFormat: \"HH:mm\",\r\n onValueChanged: function (e) {\r\n let timeBox = $(\"#emailLogEndTime\", \"#emailLogsContext\").dxDateBox(\"instance\");\r\n let endTime = timeBox.option(\"value\");\r\n if (e.value > endTime) {\r\n timeBox.option(\"value\", e.value);\r\n }\r\n\r\n startTimeFilter(e.value);\r\n }\r\n },\r\n endTimeOptions: {\r\n value: data.endTime,\r\n type: 'time',\r\n useMaskBehavior: true,\r\n showDropDownButton: false,\r\n displayFormat: \"HH:mm\",\r\n onValueChanged: function (e) {\r\n let timeBox = $(\"#emailLogStartTime\", \"#emailLogsContext\").dxDateBox(\"instance\");\r\n let startTime = timeBox.option(\"value\");\r\n if (e.value < startTime) {\r\n timeBox.option(\"value\", e.value);\r\n }\r\n\r\n endTimeFilter(e.value);\r\n }\r\n },\r\n\r\n applyOptions: {\r\n text: 'Apply',\r\n icon: 'filter',\r\n onClick() {\r\n var filterOptions = {\r\n startDate: startDateFilter(),\r\n endDate: endDateFilter(),\r\n startTime: startTimeFilter(),\r\n endTime: endTimeFilter(),\r\n recipients: recipientsFilter(),\r\n sent: sentFilter()\r\n } as EmailLogFilterOptions;\r\n\r\n if (filterOptions.startDate && !filterOptions.endDate || !filterOptions.startDate && filterOptions.endDate ||\r\n filterOptions.startTime && !filterOptions.endTime || !filterOptions.startTime && filterOptions.endTime) {\r\n\r\n DevExpress.ui.dialog.alert(`The date range and/or the time range needs to be selected, it is not allowed to select only half of the date or a time`, \"Emails Management\");\r\n return;\r\n }\r\n\r\n getLogs(function (result: EmailLogResultData) {\r\n const grid = $(\"#emailLogsGrid\").dxDataGrid(\"instance\");\r\n grid.option({\r\n dataSource: result.logs,\r\n focusedRowKey: result.logs.length > 0 ? result.logs[0].id : null\r\n });\r\n }, data.emailId, filterOptions)\r\n },\r\n }\r\n };\r\n\r\n $(\"#emailLogsContext\").html(\"\");\r\n let popup = ($(\"#EmailLogsPopup\") as any).dxPopup({\r\n contentTemplate: `
    `,\r\n width: 800,\r\n height: 600,\r\n showTitle: true,\r\n title: \"Email Logs\",\r\n visible: false,\r\n dragEnabled: false,\r\n hideOnOutsideClick: false,\r\n showCloseButton: true,\r\n position: {\r\n at: \"center\",\r\n my: \"center\",\r\n },\r\n onShown: function (e) {\r\n $(\"#EmailLogsPopupContent\").html(data.partial);\r\n ko.applyBindings(vm, document.getElementById(\"emailLogsContext\"));\r\n }\r\n }).dxPopup(\"instance\");\r\n\r\n popup.show();\r\n }\r\n\r\n function getLogs(callback: Function, emailId: number = null, filterOptions: EmailLogFilterOptions = null) {\r\n irGlobal.updateFromServer({},\r\n urlConfigs.email + \"GetEmailLogs\",\r\n emailId === null ? { Filter: filterOptions } : { EmailId: emailId, Filter: filterOptions },\r\n callback,\r\n null,\r\n true,\r\n \"POST\",\r\n true);\r\n }\r\n\r\n function open(emailId: number = null) {\r\n getLogs(function (data: EmailLogResultData) {\r\n show(data);\r\n }, emailId);\r\n }\r\n\r\n return {\r\n open: open\r\n }\r\n}());"]}