{"version":3,"sources":["contextmenu.js","api/WebAccess/ControlsTemplates.js","api/WebAccess/Global.js","api/WebAccess/BaseObject.js","api/WebAccess/models/BaseObjectModel.js","api/WebAccess/models/DocumentModel.js","api/WebAccess/models/TaskModel.js","api/WebAccess/models/JobModel.js","api/WebAccess/models/ReferenceRecordModel.js","api/WebAccess/models/FolderModel.js","api/WebAccess/models/WizardModel.js","api/WebAccess/Extension.js","api/WebAccess/WebAccess.js","api/WebAccess/mixins/pluginMixin.js","api/WebAccess/mixins/formMixin.js","api/WebAccess/Plugin.js","pages-main.js","links.js","LocalCopies.js","proxy.js","components.js","ReferenceSelect.js","ReferenceSelectDataProvider.js","PickRequisite.js","UserList.js","KeepAlive.js","api/WebAccess/current/User.js","api/WebAccess/Collection.js","api/WebAccess/mixins/linkMixin.js","api/WebAccess/Link.js","api/WebAccess/URL.js","api/WebAccess/utils/utils.js","api/WebAccess/cache/cache.js","api/WebAccess/utils/log/log.js","api/WebAccess/history/history.js","api/WebAccess/cache/sessionCache.js","api/WebAccess/cache/serverCache.js","api/WebAccess/services/services.js","api/WebAccess/templates/templates.js","api/WebAccess/services/authenticaion/authenticaion.js","api/WebAccess/services/reference/reference.js","api/WebAccess/services/script/script.js","api/WebAccess/services/entity/entity.js","api/WebAccess/services/session/session.js","api/WebAccess/services/task/task.js","api/WebAccess/services/folder/folder.js","api/WebAccess/services/document/document.js","api/WebAccess/services/cardform/cardform.js","api/WebAccess/services/requisite/requisite.js","api/WebAccess/components/components.js","api/WebAccess/components/dataViews/BaseDataProvider.js","api/WebAccess/components/dataViews/gridPlugins/_controls/selectList/SelectListControl.js","api/WebAccess/components/dataViews/gridPlugins/_controls/selectList/DateValuesPlugin.js","api/WebAccess/components/dataViews/gridPlugins/_controls/selectList/SpecialValuesPlugin.js","api/WebAccess/components/dataViews/gridPlugins/_controls/DateControl.js","api/WebAccess/components/dataViews/gridPlugins/_editors/StringEditor.js","api/WebAccess/components/dataViews/gridPlugins/_editors/TextEditor.js","api/WebAccess/components/dataViews/gridPlugins/_editors/PickEditor.js","api/WebAccess/components/dataViews/gridPlugins/_editors/DateEditor.js","api/WebAccess/components/dataViews/gridPlugins/_editors/IntegerEditor.js","api/WebAccess/components/dataViews/gridPlugins/_editors/FloatEditor.js","api/WebAccess/components/dataViews/gridPlugins/_editors/BaseObjectSelectEditor.js","api/WebAccess/components/dataViews/gridPlugins/_editors/ReferenceEditor.js","api/WebAccess/components/dataViews/gridPlugins/_editors/DocumentEditor.js","api/WebAccess/components/dataViews/gridPlugins/SortingPlugin.js","api/WebAccess/components/dataViews/gridPlugins/GroupingPlugin.js","api/WebAccess/components/dataViews/gridPlugins/FooterPlugin.js","api/WebAccess/components/dataViews/gridPlugins/CheckboxPlugin.js","api/WebAccess/components/dataViews/gridPlugins/ContextMenuPlugin.js","api/WebAccess/components/dataViews/gridPlugins/ColumnResizePlugin.js","api/WebAccess/components/dataViews/gridPlugins/FilteringPlugin.js","api/WebAccess/components/dataViews/gridPlugins/DetailsContextMenu.js","api/WebAccess/components/dataViews/gridPlugins/EditPlugin.js","api/WebAccess/components/dataViews/Grid.js","api/WebAccess/components/dialogs/BaseDialog.js","api/WebAccess/components/dialogs/BaseMultiSelect.js","api/WebAccess/components/dialogs/ReferenceGridDialog.js","api/WebAccess/components/dialogs/SortableMultiSelect.js","api/WebAccess/components/dialogs/SelectableMultiSelect.js","api/WebAccess/components/dialogs/MessageBox.js","api/WebAccess/components/dialogs/CreateDocument.js","api/WebAccess/components/dialogs/FormDialog.js","api/WebAccess/components/dialogs/FormDialogDataProvider.js","api/WebAccess/components/dialogs/ReportParamsDialog.js","api/WebAccess/components/dialogs/FloatDialog.js","api/WebAccess/components/menus/BaseContextMenu.js","api/WebAccess/components/menus/OnlyIconsContextMenu.js","api/WebAccess/components/forms/FormBuilder.js","api/WebAccess/components/forms/validators.js","api/WebAccess/components/forms/requisites/DocumentSelect.js","api/WebAccess/components/forms/requisites/MultiSelect.js","api/WebAccess/components/forms/requisites/Pick.js","api/WebAccess/components/forms/requisites/ReferenceSelect.js","api/WebAccess/components/wrappers/BasePageElement.js","api/WebAccess/components/wrappers/toolBar/ToolBarButton.js","api/WebAccess/components/wrappers/toolBar/ToolBarGroup.js","api/WebAccess/components/wrappers/toolBar/Buttons.js","api/WebAccess/components/wrappers/toolBar/Groups.js","api/WebAccess/components/wrappers/sideBar/Tab.js","api/WebAccess/components/wrappers/sideBar/Tabs.js","api/WebAccess/components/wrappers/sideBar/_ExplorerTabs.js","api/WebAccess/components/wrappers/sideBar/SideBar.js","api/WebAccess/components/wrappers/sideBar/_ExplorerSideBar.js","api/WebAccess/components/wrappers/form/Link.js","api/WebAccess/components/wrappers/form/Button.js","api/WebAccess/components/wrappers/folderTree/FolderTree.js","api/WebAccess/components/notifications/InlineHint.js","api/WebAccess/components/notifications/Spinner.js","api/WebAccess/mixins/requisitesMixin.js","api/WebAccess/components/wrappers/form/RequisiteCollection.js","api/WebAccess/components/wrappers/form/BaseTableLine.js","api/WebAccess/components/wrappers/form/TableRow.js","api/WebAccess/components/wrappers/form/TableColumn.js","api/WebAccess/components/wrappers/form/Table.js","api/WebAccess/components/wrappers/form/Form.js","api/WebAccess/components/wrappers/objectList/ListItem.js","api/WebAccess/components/wrappers/objectList/CustomWorkListItem.js","api/WebAccess/components/wrappers/objectList/ObjectList.js","api/WebAccess/components/wrappers/objectList/FolderList.js","api/WebAccess/components/wrappers/objectList/ObjectsTable.js","api/WebAccess/components/wrappers/requisites/BaseRequisite.js","api/WebAccess/components/wrappers/requisites/BaseObjectSelectRequisite.js","api/WebAccess/components/wrappers/requisites/Reference.js","api/WebAccess/components/wrappers/requisites/Document.js","api/WebAccess/components/wrappers/requisites/Text.js","api/WebAccess/components/wrappers/requisites/Date.js","api/WebAccess/components/wrappers/requisites/Pick.js","api/WebAccess/components/wrappers/requisites/Integer.js","api/WebAccess/components/wrappers/requisites/Radio.js","api/WebAccess/components/wrappers/requisites/CheckBox.js","api/WebAccess/components/wrappers/requisites/ObjectList.js","api/WebAccess/components/wrappers/requisites/_details/editModeMixin.js","api/WebAccess/components/wrappers/requisites/_details/BaseRequisite.js","api/WebAccess/components/wrappers/requisites/_details/Reference.js","api/WebAccess/components/wrappers/requisites/_details/Document.js","api/WebAccess/components/wrappers/requisites/_details/Text.js","api/WebAccess/components/wrappers/requisites/_details/Date.js","api/WebAccess/components/wrappers/requisites/_details/Pick.js","api/WebAccess/components/wrappers/requisites/_details/Integer.js","api/WebAccess/components/wrappers/details/Detail.js","api/WebAccess/components/wrappers/details/DetailsInitializer.js","api/WebAccess/components/notifications/Toast.js","api/WebAccess/components/wrappers/sideBar/_ExplorerTab.js","api/WebAccess/components/wrappers/toolBar/ToolBar.js","api/WebAccess/components/actionButton/ActionButton.js","api/WebAccess/components/createPanel/CreatePanel.js","api/WebAccess/components/header/Header.js","api/WebAccess/current/current.js","api/WebAccess/current/window/window.js","api/WebAccess/current/statistics/statistics.js","api/WebAccess/factories/factories.js","api/WebAccess/factories/BaseFactory.js","api/WebAccess/factories/references/references.js","api/WebAccess/factories/scripts/scripts.js","api/WebAccess/factories/reports/reports.js","api/WebAccess/factories/folders/folders.js","api/WebAccess/factories/tasks/tasks.js","api/WebAccess/factories/jobs/jobs.js","api/WebAccess/factories/dialogs/dialogs.js","api/WebAccess/factories/eDocuments/eDocuments.js","api/WebAccess/isbuilder/constants.js","api/WebAccess/domainMethods/VariantParameter.js","api/WebAccess/domainMethods/VariantParameterFactory.js","api/WebAccess/domainMethods/EntityMethods.js","core/Core.js","pages.js","core/agent/agent.js","core/agent/RunWithAgentDialog.js","core/header/header.js","core/header/actions/actions.js","core/sideBar/sideBar.js","core/toolBars/toolBars.js","core/toolBars/objectList/objectList.js","core/toolBars/main/main.js","core/toolBars/main/statuses.js","core/toolBars/main/currentPeriod.js","core/toolBars/reference/reference.js","core/toolBars/job/job.js","core/footer/footer.js","core/footer/agentNotStartedWidget.js","core/footer/openedDocumentsWidget.js","core/dropping.js","core/objectList/objectList.js","core/objectList/dragging.js","core/preview/preview.js","core/preview/scrolling.js","core/contextmenu/contextmenu.js","core/login/authentication.js","core/customWorks/customWorks.js","core/tasks/tasks.js","core/pages/pages.js","core/pages/login.js","core/pages/explorer.js","core/documents/documents.js","core/jobs/jobs.js","api/WebAccess/agent/agent.session.js","api/WebAccess/agent/agent.js","api/WebAccess/agent/transport/transport.js","api/WebAccess/agent/transport/BaseTransport.js","api/WebAccess/agent/transport/HTTP.js","api/WebAccess/agent/updates/updates.js","api/WebAccess/agent/edms/edms.js","api/WebAccess/agent/notifications/notifications.js","api/WebAccess/agent/clipboard/clipboard.js","core/settings/settings.js","core/cards/cards.js","core/grid/grid.js","core/grid/reference/ReferenceDataSource.js","core/grid/reference/SelectListDataProvider.js","core/grid/reference/reference.js","core/grid/details/DetailsDataProvider.js","core/grid/details/details.js","core/grid/Filters.js","core/migration/migration.js","core/migration/localStorage.js","core/migration/templates.js","core/report/reportPage.js","core/requisites/requisites.js","core/requisites/baseSelectRequisite.js","core/requisites/documentSelectRequisite.js","core/requisites/documentSelectDataProvider.js","core/requisites/referenceRecordSelectRequisite.js","Task.js","Document.js","Folder.js","ToolBar.js","MultiselectModalWindow.js","CardFormLoader.js","document.preview.js","ObjectHistory.js","core/clipboard.js"],"names":["ContextMenu","$","ensurePanelAdded","panel_added","append","panel","mousedown","ev","stopPropagation","showPanel","removeClass","redraw","hidePanel","hasClass","addClass","data","onHide","call","hideAllPanels","each","this","getOffset","elem","offset","doInit","ipad","hide","init","scrollStep","fn","contextMenu","menu","eventName","off","on","toggle","defaults","width","arrowWidth","shiftX","shiftY","cssClass","arrowImage","items","options","extend","el","p","parents","first","hideAll","prototype","_panel","show","opt_event","targetElement","lastPanel","lastElement","fillContainer","coords","getCoordsFor","top","Math","floor","tuneContainer","onShow","ok","one","preventDefault","click","showAt","isInternal","left","event","scroller","id","style","imageArrowUp","css","divArrowUp","html","render","imageArrowDown","divArrowDown","height","padLeft","find","wheel","e","delta","window","wheelDelta","detail","cancelEvent","cancelBubble","cancel","returnValue","scrollTop","innerHeight","attr","removeEventListener","onmousewheel","document","position","overflow","background","padding","WA","ENV","isAndroid","max","paddingTop","iScroll","useTransform","addEventListener","scroll","autohide","clearTimeout","jContainer","target","correspondingUseElement","jContextMenuTable","setTimeout","isTablet","body","_this","renderItem","L","it","item","proxy","self","jsaction","Function","oncreate","cont","res","onCreate","upd","i","visibility","text","separator","bottomSeparator","type","tbl","href","isDefault","disabled","isDisabled","selected","tr","icon","image","iconx","imageX","icony","imageY","hoverIcon","hoverImage","hoverIconX","hoverImageX","hoverIconY","hoverImageY","imgCell","renderImage","iconHoverCSSClass","iconCSSClass","textCell","_event","_","clone","Core","isStatisticEnabled","CR","statistics","write","page","getLocation","action","stataction","name","area","get","onClick","subMenu","arrowCell","subPanel","zIndex","parseInt","showSubMenu","$this","parentCoords","parentItem","hideSubMenu","mouseenter","mouseleave","hover","isHover","jIcon","indexOf","backgroundImage","backgroundPosition","backgroundRepeat","c0","useShift","w","h","ww","windowWidth","scr","scrollLeft","hh","windowHeight","lastPanelVisible","getItemById","jQuery","ControlTemplate","CT","Description","toolBar","sideBar","form","dialog","button","buttonSvg","group","groupCollapsed","tab","search","tabHelp","selectedItemsArea","selectedItem","availableItemsArea","availableItem","emptyPlaceholder","sortingButtons","sortButtons","format","str","params","arguments","length","_params","Array","slice","replace","s","key","formatDate","date","datepicker","df","regional","currentCultureName","dateFormat","formatDateTime","time","timepicker","tf","formatParts","split","timeFormat","tmptime","ampm","hours","getHours","minutes","getMinutes","seconds","getSeconds","hour12","leadzero","parseDate","ParseDateTime","getHash","m","charCodeAt","objectTypeToString","objectType","OBJECT_TYPE","EDOCUMENT","FOLDER","TASK","JOB","REFERENCE_RECORD","ANY","UNKNOWN","raise","objectKindToObjectType","objectKind","toUpperCase","getISBString","msg","opt_is_async","R","Code","SRV","callSync","done","d","generateUniqueID","len","radix","CHARS","chars","uuid","random","r","join","hideAllPopups","fixSvg","browser","xmlns","xlink","replacingSvgs","svgs","getElementsByTagName","prevSvg","svgUse","firstChild","svgName","getAttribute","newSvg","createElementNS","setAttribute","className","baseVal","newSvgUse","setAttributeNS","appendChild","push","forEach","parent","parentNode","insertBefore","removeChild","MIN_SUPPORTS_WINDOW_WIDTH","MIN_SUPPORTS_WINDOW_HEIGHT","parseDateTime","inp","val","y","tmpDate","daysInMonth","cultureName","russianLocale","enLocale","trim","Date","culture","dateseparator","today","dmy","substring","getMonth","getFullYear","getDate","tmpTime","splice","ParseTime","BUTTON","LARGE","SMALL","FORM_METHOD","POST","GET","ENCTYPE","MULTIPART","URLENCODED","LAST_REFERENCES","ALL","ONLY_USERS","USERS_AND_GROUPS","COMPONENT_TOKEN","REFERENCE","SCRIPT","REPORT","USER","WIZARD","USER_OR_GROUP","SEARCH","DIALOG","WORK_STATE","INIT","RUNNING","DONE","CONTROLLED","ABORTED","CONTINUED","REQUISITE_TYPE","EMPTY","DATE","FLOAT","PICK","STRING","TEXT","INTEGER","LARGE_INTEGER","DOCUMENT","OBJECT_LIST","ACTION_ENABLED_MODE","ENABLED_ALWAYS","DISABLED_ALWAYS","ENABLED_ON_BROWSE","ENABLED_ON_EDIT","DISABLED_ON_BROWSE_EMPTY","requisiteTypeToString","reqType","requisiteTypeFromString","SIDEBAR_ORIENTATION","ORIENTATION","HORIZONTAL","VERTICAL","MODEL","FULL","CARD","CONTENT","LINK","WORK_ACCESS_TYPE","MANUAL","PARTICIPANTS","JOB_KIND","NOTICE","CONTROL_JOB","MESSAGE_TYPE","WARNING","ERROR","INFO","FOLDER_CONTENT_TYPE","SPEC_FOLDER_TYPE","FOLDER_TYPE","INBOX","OUTBOX","FAVORITES","COMMON_FOLDER","USER_FOLDER","SHORTCUTS","LOG_LEVEL","WARN","DEBUG","SERIALIZATION","LITE","DIALOG_ACTION","OK","CANCEL","REFERENCE_MODAL_MODE","VIEW","SINGLE","MULTI","VARIANT_TYPE","BOOLEAN","DATE_TIME","USER_GROUP","USER_ROLE","INTEGER_COLLECTION","SINGLE_COLLECTION","STRING_COLLECTION","BOOLEAN_COLLECTION","DATE_TIME_COLLECTION","TASK_COLLECTION","JOB_COLLECTION","FOLDER_COLLECTION","DOCUMENT_COLLECTION","REFERENCE_RECORD_COLLECTION","USER_COLLECTION","USER_GROUP_COLLECTION","USER_ROLE_COLLECTION","String","trunc","n","substr","switchLayout","string","map","q","t","u","o","[","]","a","f","g","j","k","l",";","'","z","x","c","v","b",",",".","/","`","ch","replaceAll","needle","replacement","RegExp","escapeHtml","entityMap","&","<",">","\"","stripHtml","newLinesToBR","makeSafeString","endsWith","Object","defineProperty","value","searchString","subjectString","toString","undefined","lastIndex","fromISBuilderToNormal","isInBrackets","newStr","cloneFunction","func","reFn","exec","conf","args","constructor","apply","concat","hasOwnProperty","D","fromISO","day","tz","rx","UTC","setUTCMinutes","getUTCMinutes","NaN","override","superFunction","WIZARD_DOCUMENT_STEP_SHOW_MODE","BODY","TOKEN_OPERATION","DOWNLOAD_DOCUMENT_BODY","UPLOAD_DOCUMENT_BODY","UPDATE_AGENT","SIGN_DOCUMENT","SIGN_TASK","GET_NEW_JOB_LIST","LOCK_VERSION","UNLOCK_VERSION","GET_ENCRYPTION_KEY","DIAGNOSTICS","BaseObject","Class","_events","fire","EVENT","CLASS_INIT","_parseArguments","_simplifyName","toLowerCase","bind","opt_context","ENABLE_EVENTS_LOGGING","console","log","unbind","isTouch","makeArray","isFunction","fireAll","mainFunc","isRun","me","mainFuncWrapper","result","newArgs","merge","asString","toJSON","ACCESS_RIGHTS","NO_ACCESS","CHANGE","COMMAND_TYPE","SHOW_DIALOG","END","EXECUTE_SEARCH","BaseObjectModel","_super","load","rawData","JSONData","toURL","link","Link","ID","Type","ReferenceCode","url","URL","IsNew","setParam","executeAction","actionName","opt_params","serializedForm","serialize","onlyValue","returnRowNumber","withoutTables","transformMultiReqsToDetailRows","requisites","_setActionResultAndExecuteAgain","executeEntityMethod","methodName","opt_parameters","Error","showDialogAndExecuteAction","dialogName","FC","dialogs","getObjectByName","CMP","FormDialog","AFTER_ACTION","dialogActionName","commandNumber","commandType","commandResult","Deferred","ReferenceName","toLinkModel","ViewName","ReferenceView","ActionName","SerializedForm","CommandNumber","CommandType","CommandResult","response","responseAsObject","parseJSON","ErrorHide","changes","Changes","changedMultiSelects","ChangedMultiSelectRequisitesValues","isExist","applyServerSideChanges","cmds","Commands","_performCommands","resolve","fail","errorMessage","Result","reject","promise","commandsResult","allCommandsRunner","allCommandsQueue","cmd","cmdNumber","number","cmdType","then","_performShowDialogCommand","_performEndCommand","_performExecuteSeachCommand","cmdResult","def","factories","getObjectByInstanceID","InstanceID","actionResult","__RESULT","forms","FormBuilder","addObjectList","SearchContentKind","SearchResult","BaseDialog","title","setHtml","DocumentModel","parameters","domainMethods","MethodResult","isMethodAvailable","TaskModel","start","StartTask","loadEvents","standardRouteEvents","eventsForCurrentRoute","StandardRouteCode","task","eventCallback","standardRouteCode","WebAccess","Events","JobModel","currentStandardRouteEvents","LeadTaskStandartRouteCode","blocks","WorkflowBlockID","bindBeforeAskingCommonEvent","commonEvent","CONTROLJOB","ReferenceRecordModel","viewName","FolderModel","WizardModel","global","Extension","setAsCurrent","Ext_Click","reload","ReloadExtension","_whenInitComplete","ready","Init","state","_getFileExtensionFromURL","parts","include","ajaxSetup","async","cache","getScript","createElement","extensions","components","services","templates","TMPL","mixins","isbuilder","ISB","history","environment","environmentInfo","isMobile","agent","navigator","userAgent","oldMobileBrowser","modernMobile","orientation","os","isIOS","documentElement","isVertical","platform","appVersion","SideBarInit","AgentInit","ToolBarInit","FormControlsInit","DetailsInit","ObjectListInit","_DetailsGridInit","UserInfoInit","_userInfoInit","when","current","spinner","notifications","Spinner","inlineHint","InlineHint","ExtensionsInit","FolderTreeInit","_extensionsDataInit","FormInit","extension","ext","isCurrent","EXT","resolveWith","shift","Task","Job","Document","ReferenceRecord","Folder","Wizard","setEvents","events","error","opt_value","message","exception","logMsg","stack","tryCatchDecorator","TCD","decoratedFunction","err","ErrorShow","_location","location","path","pathname","lastIndexOf","logout","mobileView","cookie","isSessionInitialized","isPluginAvailable","always","isAvailableResponse","endSession","CallService","pluginMixin","_plugins","arg","param","isPlainObject","plugins","plugin","__isPlugin","registerPlugin","register","methods","warning","info","isPluginRegistered","pluginName","selectors","details","links","buttons","tabs","searches","toolBarButtons","toolBarGroups","formMixin","objectList","states","_preInit","tables","_postInit","WR","wrappers","_containerInit","_jContainer","containerSelector","_getSubItems","Detail","Form","_getFormData","serviceURL","controls","_initObjectList","warn","Collection","Button","_ExplorerSideBar","_sideBarContainerSelector","_ExplorerTabs","_ExplorerTab","SideBar","Tabs","Tab","ToolBar","Buttons","ToolBarButton","groups","Groups","ToolBarGroup","_detailsGridInit","tableParams","formData","grids","_getGrids","objectLink","_getObjectLink","objectView","_getObjectView","Table","tablesInit","table","values","not","focus","select","elementSelector","ComponentClass","jSearchTarget","_jSubElements","bindLeaderDrivenLogic","bindLeaderDrivenLoginOnRequisites","row","reqs","toArray","req","currentColumnMetadata","getColumnMetadata","reqInfo","Requisite","leaderRequisites","lookUpLeaderRequisites","drivenRequisites","leader","leadReq","tableName","rowId","getRowId","reqName","lookup","driven","drivenReq","_initLeaderDrivenLogic","rows","_table","_row","newRow","editMode","_getControls","jInput","rs","extraParams","LeadSelID","_getLookupValues","jControl","needClearDriven","fillLeaderRequisites","leadValues","leaderRequisiteValues","_getRequisiteByFullName","setValue","_fillLeaderForDetailSectionRequisite","_clearRequisitesValue","leadReqVal","getValue","fullName","isString","getRowById","reqFullNames","clear","requisite","getReferenceSelectParams","settings","recordId","refCode","getReferences","queryContext","referenceCodesAndReqNamesInDetailSection","JSON","parse","requisiteNumber","stringify","filter","useadditional","disablespecialprocessing","getRow","getTable","ReferenceSelectDataProvider","sendQuery","count","leadingRequisitesValue","encodedTitle","displayValue","Plugin","context","afterClassInit","afterMainClassInit","GetWSSParam","Url","IsFirstParam","CheckForLoginPage","_isSessionAlive","GetParamInURL","getParam","ChangeParamInURL","RemoveParamInURL","removeParam","PrepareUrl","ParamStr","Params","newUrl","charAt","DoAction","NeedSubmitForm","NewFormAction","InHash","submit","GetURLHash","ActTab","GetURLWithoutHash","ex","asStringWithoutHash","DoActionHash","callback","ShowTopSpinner","ExtensionName","Success","HideTopSpinner","ShowMessage","ShowError","HintShow","WrnShow","SerializeForm","__legacy_serializeForm","cardForm","hidd","dispInp","jAttachments","AttachmentStr","kind","additionalAttachmentInfo","BindBeforeUnload","initDef","g_formContainerSelector","g_prevFormVal","g_RightsChanged","UnbindBeforeUnload","CloseWindow","close","ShowJobCard","ShowJobAttachments","ShowJobState","GetJobEdit","mode","Kind","SaveInBaseJob","needToClose","SetJobApproveParams","CancelSetJobApproveParams","BaseAcceptContolJob","ResumeContolJob","CreateJobSubTask","open","CloseBaseJobWindow","jobId","onunload","FreeJob","JobID","WSSParam","ajax","contentType","dataType","success","ShowTaskCard","ShowAttachments","ShowState","ShowTaskHistory","dateInput","setHours","setMinutes","setSeconds","difference","now","getTime","ShowTaskDeadlineActualizeDialog","AbortTask","RestartTask","RestoreTask","EnterEditMode","SaveInTask","SaveAndCloseTask","CreateSubTask","DoImportance","MakeRequestImportance","next","prev","TaskID","Value","CallbackFunc","BaseChangeStandartRoute","LoadRouteParams","route_id","StandartRouteSelected","BaseCancelStandartRoute","CloseBaseTaskWindow","taskId","FreeTask","ShowEDocCard","ShowVersionList","ShowRightsList","ShowSignInfo","ShowBoundEDocs","ShowEDocHistory","ShowEDocPreview","EditModeForEDoc","SaveInDoc","save_ok","warningMessage","CallbackOrAction","NTF","showWarning","reloadParentWindowOnClose","opener","isNeedAddInAttachments","AddAttachment","NeedUpdateOnChildClose","ShowSetDocumentRightsDialog","save_fail","save","DocumentID","Password","EncryptionKey","receiverObjectLink","currentUrl","view","SaveRights","saveAndAttach","edocid","stage","EDocID","Stage","model","SaveWithEncoding","passwordChkbox","certChkBox","onError","is","RequestPasswordForDecryption","password","Encoding","GetEncryptionKeyForDoc","PluginName","encryptionKey","onClose","stop","docID","encoding","onSuccess","RequestToken","token","transmitRequest","DocID","Version","Token","EncodeType","EncryptionPluginName","src","rightsJson","rightsChanged","IsRightsListValid","ShowInfo","currentRights","CheckRightsHaveChanged","newEcoding","GetDocNewEncoding","rightRecords","rec","right","isGroup","RequestActionWithGroup","UserID","IsGroup","RightType","rightsDelegationSetting","GetRightsDelegationSettingValue","rightsDelegationInitVal","rightsDelegationChanged","SetEncryptionForDocument","RightsJSON","RightsDelegationTurnedOn","groupID","accessLevel","onActionSelected","actions","needCheck","mbox","MessageBox","okCancelButtons","opcode","OpenUpUserGroup","groupName","children","showQuestion","needOpenSubgroups","onGroupOpened","GroupID","NeedProcessSubGroups","RenderItems","AddUserByDiv","severity","Severity","Number","RightsDelegationCheckBoxVal","RightsDelegationCheckBox","oldValue","newValue","sort","RightsObject","RightsChanged","OnEncryptionSet","passwordCheckBox","certCheckBox","currentEncoding","newEncoding","EncodingType","RequestSetEncryption","EncodingChanged","encChanged","removeAttr","certEncryptEnabled","ChangeTabDoc","tabName","ChangeTab","CloseDocWindow","UndoEDoc","SaveAndCloseEDoc","timeoutHandler","LockUnlock","isLocked","jButton","UseGlobalLock","toastMsg","Toast","jIsLocked","showSuccess","_1","_2","DocSendAsAttachment","test","Export","selectId","checkedId","inNewWindow","VerNumber","CloseExportDlg","FreeEDoc","referrer","ChkExportedVersion","VerList","ChkLockID","s_res","Warning","enableLock","EnableLock","prop","GetImgByExt","CloseImportDlg","BaseCloseDocWindow","edocId","ShowFolderCard","ShowFolderRights","UndoFolderCard","EnterEditMode_FolderCard","ChangeTabFolder","BaseCloseFolderCardWindow","folderId","FreeFolder","SaveFolderCard","need_close","noCheckSubObj","FolderKind","FolderID","selectedUsers","checkCurrentUserRights","saveRightsByService","mainText","additionalText","removeDefaultButtons","addButton","CurrentUserID","SaveFolderCard_WithQuestions","SaveAndCloseFolder","ConfirmDialogNew","folderID","needClose","rightsToSubObjectsDialog","applyRights","isNeedReplace","wdialog","waitDialog","NewUserRights","OldUserRights","NeedReplace","resultDialog","removeCloseButton","showError","rightsDialog","oldRights","parseRightsList","maxRights","hasFullRights","rightsType","newRights","rights","rightsArray","user","DisableIsAllCheckboxNotChecked","reqname","el_query","defaultFlag","searchAreaText","checked","searchAreaCard","searchAreaName","searchObjEDocument","searchObjCustomWork","searchObjFolder","txt","btn","DisableButton","DisableTextbars","htmlWarning","before","remove","DisableTextbox","DisableSearchBtn","SearchPseudoArchiveTagChanged","CloseBaseWizardWindow","FreeWizard","DisableWizardButtons","OpenObjectInWizardStep","notAutomatically","jShowRefCard","versionNum","hasVersions","isAvailable","g_defaultListAction","openForWrite","docLink","getPlugin","SendEDocToAgent","ConfirmDialog","okText","isShowCancelButton","CardTabClick","changeTab","updateTab","_saveExtended","needShowError","ShowAllCustomWorkState","ReloadExplorer","reloadExplorer","PageInit","resize","setRealHeightAndWidthOnResize","setRealHeightAndWidth","initCollapsableElements","InitMouseEvents","InitTooltips","pagezoom","RefSel_AttachResult","AfterSelectFunc","IsNeedCallFuncOnClr","needFillLeadAndDriven","ClrVal","g_FillLead","g_FillDriven","change","RefSel_AttachMultiResult","BindLeaderDrivenRequisites","g_GetLeadSelIDs","leaderRequisiteName","leaderParts","leaderControlName","LeadIDs","ht","leaderData","isEmptyObject","getFirstRefCode","dataProvider","_leaderControlName","SetValue","FillDrivenIfItResultHasOneRecord","ClrOnlyDriven","DrivenIDs","CurentID","IDs","reqID","LeadSelIDs","refurl","Clear","encodeURI","RefSel_InitHint","RefSelID","RefCode","updateHintData","newRecID","compcode","qtip","InitAdditionalInfoTooltip","removeData","inpId","showInstructionDialog","BindHelpIcoClickOnModalWindow","debug","linktoOldconsole","dir","object","selector","E","CallServiceSync","CallServiceInternal","service_method","error_handler","OnTabChanged","dfmTabName","SB","BEFORE_TAB_SWITCH","callbackRunChecker","htmlEl","triggerHandler","AFTER_TAB_SWITCH","hasAttr","getElementIndexByAttr","array","hasAncestor","closest","whenAllDone","deferreds","currentDeferred","failures","successes","cookieName","sessionId","keepAliveLoop","getSession","setSession","expires","runSession","keepAlive","browserSessionIsRestored","setInterval","_isDarkTheme","_prefixIfDark","getSelectedLinks","opt_contextMenuObj","takeLinkFromContextMenu","takeLinkFromCard","takeLinksFromPage","cardObj","CompCode","refcode","getCardObjectName","Subject","Name","ReferenceCaption","contextMenuCopyObj","getItems","HTMLElement","node","caption","makeLinksFromItems","getSelectedItems","desc","referenceName","refCaption","convertTypeToKind","getCurrentFolderId","pasteLinksToFolder","destId","source","Links","SourceID","getID","SourceType","EnableOrDisableCheckAll","some","folderTree","updateByFolderID","pasteLinksToBoundDocuments","pasteLinksDefault","DestID","DestType","setLinksSource","sourceId","sourceType","setItem","CopyLinks","opt_contextMenuCopyObj","clipboard","copyLinksToClipboard","copiedLinksCount","completeMsg","CutLinks","convertAgentLinksToLinkModels","convertedLinks","Desc","convertLinkModelsToAgentLinks","linkModels","isAllRecordsInFolderSelected","_isAllSelected","PasteLinks","destType","g_ViewOnlyMsg","ShowTopSpinnerResult","getItem","getLinksFromClipboard","DeleteLinks","needSubmit","needConfirmDeleting","afterDeleteCallback","isFromTree","getSourceType","callDeleteLinksService","linksToDelete","sourceFol","UserFilterText","getLikeFilter","UserFilterRequisites","getlikeFilterRequisites","PredefinedFilter","getPredefinedFilter","updateNodesWithFolder","updateChkAll","UpdateCopyPasteIcons","GetSelectedID","ConfirmDelete","ReturnLocalCopyCM","obj","version","ReturnLocalCopy","documentID","versionNumber","encodingType","fileName","editDate","OnConfirmRecoverLocalCopy","additionalParams","_returnLocalCopyRequest","resultMessage","RemoveItemFromRecoveryList","modifyDate","GetLastEditDate","confirm","0","1","GetDocumentFileName","LocalCopyRecommendedAction","ShowDocumentRecoveryConfirmation","GetDocumentEncodingType","pass","ReturnDocument","successCallback","errCallback","invoke","getDocumentListItem","contents","textContent","nodeValue","VersionNumber","GetEncodingPluginName","onConfirm","disableButton","_jDialog","GetConfirmRecoveryDlgHtml","ShowDocumentDeleteCopyConfirmation","yesNoButtons","spinnerImage","spinnerHtml","outerHTML","recoveryProcMsg","OpenLocalCopyCM","OpenLocalCopy","DeleteLocalCopyCM","DeleteLocalCopy","OnDeleteCallback","SilentMode","OnConfirmDeleteLocalCopy","updateOpenedDocumentsWidget","ShowLocalCopiesWindow","localCopies","ControlName","Documents","content","instruction","MakeInfoMessage","wordWrap","maxHeight","isShowOkButton","cancelText","initJs","IsRecoveryListEmpty","CloseRecoveryDialog","AddEmptyItemToList","footer","openedDocumentsWidget","update","Doc","OnPasswordEnter","OnClose","SetNewPassword","ChangePassword","passwordConfirm","oldPassword","docName","passwordInput","onOpen","BindPasswordFieldToOk","OnKeyUpPassDoc","keyCode","keyup","enableButton","SetPasswordForDoc","checkbox","confirmation","IsPasswordConfirmed","ChangeDocPassword","changePassword","OldPassword","NewPassword","ShowWarning","SetCertForDoc","passwordCheckbox","IsError","GetBuilderResources","LoadSubRelations","additional","list","InitHover","InitListClick","ShowRelations","tblID","tbl_ids","trAdd","isAdded","after","CheckIsSearchNotEmpty","emptyCriteriaWarningMessage","isAnyCriteriaFilled","criteriaContainer","criterionInputs","unique","criterionInput","BindOnEnterToSearchCrit","ClearSearch","searchTD","RefSelect_GetSelectedValue","RecID","Reference_OpenRecordInNewWindow","viewNameParam","g_SysCode","g_ExtName","InputOnMouseOverForShowAddIcons","IsShowCreateButton","IsAccessDenied","icons","OpenIco","CreateRecIco","selVal","eq","InputOnMouseOutForShowAddIcons","EditVersion","funcReload","ReloadVersionList","VerLockOrUnlock","Ver","addArea","InitContentListToolbox","cont_id","setInlineHint","checkBox","clearInlineHint","labels","filterVariants","arr","FilterEDMSContent","componentID","filterVal","filterRequisites","setLikeFilter","LinkClick","SaveLastRun","GetStandardRouteCodeByAnalit","routeID","failCallback","GetRecordWithFilteredRequisitedByAnalit","referenceCode","filterExpression","filterValue","recordsCount","startFromRecord","sortIndex","sortDirection","FilterExpression","FilterValue","Requisites","RecordsCount","StartFromRecord","SortIndex","SortDirection","ToggleItem","trigger","ToggleAllItem","isSearchMode","ToggleAllItemsInComponent","comp_id","comp","isChecked","UpdateSelectionNumbers","objList","num","prepend","GetRowsCount","iconSrc","ToggleFolderItem","chk","EntityListInit","_comp","allowSelect","enableActions","listReq","el0","scrollActive","superHeight","InitObjectContentsAutoLoad","chkAll","eventHandler","_updateSelection","_selectItem","jItem","bindSelectItems","jItems","which","bindOpenItems","jLink","DoFirstAction","handler","InitShowHideActions","ShowContextMenu","pageX","pageY","lr","ListRequisite","onUpdate","trs","hoverEventNames","GetEventsName","isManualTriggered","isKeyNavigationActive","EntityList_ShowAction","EntityList_HideAction","MakeActions","listActionsSettings","objKindMap","edoc","job","fol","ref","usr","ver","GetObjectInfoFromRow","objKind","sett","needshow","SetPreviewActionFirst","g_isPreviewEnabled","SortEditActionsByPriority","actionsHTML","objStr","hyperlink","MakeActionListItemHyperlink","ITEM_IMG_TEMPLATE","iconHtml","img","innewwindow","js","retFalse","temp","defaultAction","secondAction","DoNotShowInSearchResults","toolBars","main","DoNotShowWhenAgentEnabled","ShowWhenAgentEnabled","IsDocOpenedForEditByDefault","g_openDocForEditByDefault","IsDocOpenedForReadByDefault","IsIsDocOpenedForEditByDefaultAndPreviewDisabled","IsIsDocOpenedForReadByDefaultAndPreviewDisabled","IsRecoverActionsAvailable","IsReturnActionAvailable","IsOpenActionsAvailable","jContext","$el","GetSelectedObjects","BindOnScroll","any","$loadbtn","AutoLoad","mc","bottomDistance","offsetHeight","MinBottomDistanceToStartAutoLoad","removeSpinningThingy","spinningThingy","spinnerIcon","spinnerText","appendTo","_loadPage","mainScroll","refresh","objs","g_MaxRowsPerPage","autoLoadNoMore","UpdateRowsCount","ExplorerInitialScroll","initialItemsCount","itemsOnPage","nextPage","ceil","initScroll","enableButtonAddInListRequisite","idListReq","RegisterEmptyCheck","control","g_EmptyCheckFunc","ProcessEmptyChecks","scrollbarWidth","div","w1","innerWidth","w2","Reference_SelectRecord","InitSearchField","blur","GenReloadVersionList","controlID","ErrorClientID","ShowFolderTree","ClearSelectedElements","SetElementToolBar","UpdateFolderTreeScroll","isChildFolder","sourceFolderPath","targetFolderPath","currentFolderPath","isRootFolder","dragEl","InitContextMenuForBound","InitCheckboxRequisite","displayControl","valueControl","yes","no","getHintDataObj","eval","AttachTooltipToElement","opt_showAfterAttach","opt_showOptions","opt_positionOptions","getContent","dataobject","zindex","GenerateAdditionalInfoTooltipHtml","hintContent","classes","effect","solo","delay","fixed","leave","viewport","adjust","mouse","my","at","api","opt_position","hintTimeout","hint","getAnchorElementFromRequisiteInfo","Href","Text","generateHtmlForContentTextFromRequisites","listOfRequisitesInfo","anchor","Caption","reqCount","generateHtmlForContentTextForImage","imgsrc","Image","Validator","regexstr","decimalSeparator","keypress","code","fromCharCode","docSelection","selection","Sel","createRange","SelLength","moveStart","SelStart","SelEnd","selectionStart","selectionEnd","major","patt","isIDevice","oldf","g_clipboard","GetButtonsData","copy_button","del_button","sign_button","sign_button_initially_disabled","copy_button_initially_disabled","del_button_initially_disabled","copy_button_title","del_button_title","isFilled","IsList","Values","isListReq","isSelected","objType","reason","checkedBoxes","dbg_is_hover","ListRequisiteClass","AjaxInProcess","valJSON","OnLoad","onLoadFunc","Disable","ReadOnly","Enable","SignLinks","GetSelectedLinks","hrefs","signLinks","newLinkWithName","ShowSpinner","linkContainer","apiLinks","HideSpinner","IsAttachments","oldCount","svcParams","ClientID","CustomWorkID","CustomWorkType","callServiceToPaste","svcMethodName","CallMyService","RenderList","newCount","pasteCount","e1","e2","AddLinks","counter","CheckObject","AddObject","UpdateList","sel","cannotDelete","ValuesJSON","delCount","errorStr","ids","grep","inArray","index","DeleteLink","AddRefRec","input_id","add_id","ReferenceSelectInstance","EnableSameRecords","AddRefRecToList","newObj","InitAttachments","att","SetCannotDelete","GetLinks","ContentKind","ShowScrollBar","EmptyText","IsShowActions","NewValues","listContainer","empty","HTML","InitJS","method","errorCallback","lastFocusedInputId","container","results","inpParent","selectedItems","selectedItemsCont","fakeInp","contId","timeout","spinner_timeout","refcodes","refcodesCount","selectedRefCode","selectedRefIsClosed","minChars","mustMatch","showNoMatchText","cellIDIndex","cellToInput","multiselect","allowlike","isCustomSelect","currentPage","maxPages","mainReferenceCode","sendQueryOnlyOnEnter","suggestInProcess","suggestLastMode","NoMatchText","CancelText","SelectText","TitleText","pollInputChanged","onInputChanged","changeInpWidthAndPadding","pollTimer","interval","HideContainer","_hidePlaceholder","_showPlaceholder","oldID","newValues","onlyLast","replaceSelectedItem","deleteAllItems","hideContainer","needTriggerResult","setValues","process","oldv","onImgClick","prependTo","SetDisabled","moveInputToSelecetedItem","initSelecetedItems","clearBlurTimeout","suggest","isReadonly","_ids","_names","hiddVals","inpVals","names","createNewSelecetedItemHTML","createNewSelecetedItem","multi_windowResizeInit","rsTimeout","loadPage","disableSendQuery","check","selectEmpty","moveReference","refCaptions","nextSelIndex","altKey","checkLongDeletion","deleteOneItem","multiLeft","multiRight","selectReference","selected_row","_hideAndResetContainer","_startDeleteTime","_deleteTimeout","move","overed","scrollToOver","overTop","getValues","idParts","groupcode","oldHiddVal","triggerResultEvent","isOne","placeholder","refDesc","hintData","getHintData","delIco","dataText","spanClass","lastItem","middleX","outerWidth","clientX","changeHiddenValue","callSelectEmpty","isNeedAnimate","removeFunc","oldval","animate","childspan","isInitOrBlur","checkVis","parentWidth","inpWidth","getTextMetric","sumWidthBeforeInp","sumWidthAll","isInp","dLeft","setCoordForContainer","input","textMetric","display","styles","replaced","last","toBegin","toEnd","AlwaysEmpty","showContainer","firstItem","bindScrollLoad","getQueryValue","vs","showSpinner","hideSpinner","IsPseudoReference","setReferences","references","_checkIsReferencesSetProperly","_getReferencesCount","_makeIconAccessible","addReferences","_getToolTip","lbl","refs","lastRequests","afterShowCallback","onSearchQueryDoneCallback","refsWithRecords","lastQuery","query","onSearchError","searchInOtherReferences","refsWithErrorMessage","requests","OnSuccessFunc","OnErrorFunc","isHttp","deferred","pop","abort","lastSelectedRefCode","updateTableVisibility","isEmpty","createRows","Query","Page","Limit","OnSuccess","OnError","limit","makeTitleAndFooter","beforeRefCodes","afterRefCodes","makeDivs","codes","hintClass","NeedShowHint","class","table_html","rowsByUid","isNaN","rowUid","highlight","newRows","siblings","outerHeight","wh","minWidth","term","ReferenceSelect","SetSelected","resultMulti","ReplaceSelectedItem","ReplaceLastSelectedItem","SetValues","SetEnabled","_parseResponse","pagesCount","entities","jqXHR","textStatus","errorThrown","firstN","status","currRowData","entity","DropDownList","keyvalues","opt","initValue","prevValue","_isShown","onAfterChange","filterPlaceholder","addPlaceholder","keyPress","isVisible","goTo","selectCurrent","direction","newEl","selEl","toggleSelected","keyFilter","tmp","hasItems","setCoord","selectedEl","setInitValue","setPrevValue","opt_needTriggerResult","valueIsChanged","getDisplayValue","clearDropDownListItems","addDropDownListItem","removeDropDownListItem","disable","enable","DropDown","HidePickContainer","UserRightInit","ObjectID","HashCode","Msg","IsNeedHideTree","jRightsTable","updateTree","hideFilterView","rootUl","treeview","collapsed","dataWS","onAfterSuccess","MarkAllGroupsAndUsers","InitTabletContextMenu","delegate","UserInTreeMouseOver","UserInTreeMouseOut","UserRightsMouseOver","UserRightsMouseOut","contextmenuButton","UserListShowContextMenu","undelegate","InitRightsUserTreeKeyNavigation","filterInput","keydown","FilterUserAjax","currentTarget","CheckIfFavoritesEmpty","favGroup","fillTree","nodes","buildTreeNodeHTML","RightsTable","selectedIDs","MarkUser","currObj","_GetContextMenu","favoritesGroup","addMenuItemText","addClickHandler","favoritesMenuItemText","favoritesClickHandler","actionIcon","menuItems","favoritesIcon","itemID","liID","addOrRemoveFavorites","IsSelected","getReferenceCode","itemId","needToAdd","PrincipalID","NeedToAdd","favGroupUl","ReloadFavoritesGroup","initTreeViewItemEvents","add","markUnmarkItemAsFavorite","span","AddFavoritesToRightsTable","ItemId","isFavorite","iconClass","UserRightTreeInit","GetHashCode","live","SetEvents","SetCurrentUsers","arrow","SetRightChoose","SetNewRight","GetUserID","prefixIndex","currentRightVal","rightsID","parentsUntil","isOldUser","IsOldUser","g_MaxRightsValue","GetFullRightsUserCount","SelUsers","oldSelUsers","oldUser","rightValue","RightsToNumber","g_OldChangedUsers","fullRightsUserCount","ChangeRightCycle","sp","DelIco","RemoveUserFromRights","mark","NewUserID","NewUserName","lastFilledRow","NewUserRight","jCircleCell","jThis","circleRight","newRow_div","rightsCell","ClearInputFilterUser","SetDefaultFilterValue","FilterUser","idSrc","idDest","UserFilterTTimeout","DoFilter","elJq","GlobalFilterUser","cloneDiv","UserTreeId","FilterAreaId","ObjectType","defvalue","AjaxUserSearch","FilterArea","currUser","rightsTable","tree","filterResults","mainContent","rightsUserList","UpDownKeyNavigation","down","currentItem","nextItem","FindSiblingOrParent","UnhoverAllItems","HoverItem","ScrollToHoveredItem","sibling","subItem","ExpandOrCollapseGroup","expand","currentID","lis","SelectItem","DeselectItem","scope","InitializeSessionRoutiness","SessionKeepAlive","SessionUpdateTime","xhr","ObjLockKeepAlive","LockUpdateTime","exports","User","_current","models","_arr","elements","addElement","deleteElement","deletedElement","linkMixin","isNew","openInDesktop","fromLinkModel","opt_referenceName","getObjectType","_url","_getUrlFromLink","_refresh","opt_target","openIn","win","paramName","_getParam","_getNonEncoded","decodeURIComponent","getParamInHash","setParamInHash","newHash","_setParam","hashIndex","getExtension","hash","re","encodeURIComponent","urlWithoutHash","regexS","regex","host","_getPageNameByKind","utils","compareData","v1","v2","NEGATIVE_INFINITY","parseFloat","Cache","_errorCatched","_data","removeItem","isStorageAvailable","_getStorage","localStorage","setObject","getObject","includedLevels","W","I","Log","_disabled","saveImmediate","maxStackSize","_writeTimeOut","strToLevel","level","getLevel","logLevel","setLevel","isDebug","_write","isLogsEnabled","_isDisabled","queue","_writeQueue","Queue","tag","_log","showLastMessages","line","dt","Time","fd","getMilliseconds","Level","Tag","Message","messages","logParams","onerror","errorMsg","lineNumber","logDebug","ENABLE_EVENTS_LOGGING_JQUERY","prevOn","prevOff","prevTrigger","prevTriggerHandler","History","allowHistory","pushState","POP_STATE","CHANGE_STATE","PUSH_STATE","replaceState","SessionCache","sessionStorage","sessionOnly","sessionCache","ServerCache","ParamName","ParamValue","serverCache","opt_spinnerText","opt_onCompleteSpinnerText","opt_hideError","opt_hideWarning","_call","showHint","isError","rejectWith","brokenSessionText","responseText","errResp","_sessionBrokenDialog","_sessionRestoredDialog","statusCode","isOpened","isSingleInstance","openLogin","reference","script","authenticaion","folder","session","cardform","prepare","opt_control_id","hasID","templateName","opt_data","opt_disableCache","opt_sync","opt_partials","jDeferred","getCustomDeferred","loadPartials","partials","findTemplate","template","_template","invertedNames","invert","queries","partialKey","partialName","partial","findCompiledTemplate","findCachedTemplate","findRemoteTemplate","cached","Hogan","compile","templateText","userName","newPassword","confirmPassword","isFirstLogin","failed","Login","PasswordOld","PasswordNew","PasswordConfirm","IsFirstLogin","loginUser","providerName","userRealm","userPassword","rememberMe","request","UserName","Realm","ProviderName","RememberMe","getReferenceRecordsNames","jsonObject","deleteRecord","recordID","RecordID","columnsAutoWidthEnabled","referenceView","isEnabled","opt_placementContext","PlacementContext","Enabled","setFilter","filterID","opt_referenceView","FilterID","createNewFilter","filterName","saveFilter","opt_filterName","FilterName","removeFilter","getReferenceCaption","run","scriptName","scriptParametes","runWithSerializedForm","setUserStatus","StatusName","SetNewLanguage","langCode","LangCode","setPreviewScale","scaleValue","ScaleValue","setTheme","themeName","opt_themeType","setCustomTheme","themeType","backgroundColor","textColor","addLastUsedObject","objectID","objectName","ObjectName","removeLastUsedObject","deleteLinks","sourceID","pasteLinks","destID","createTaskWithAttachments","attachments","Attachments","setAttachmentsRights","taskID","Rights","setStatusForAllObjects","statusName","VERSION_STATE","DEFAULT","IN_DESING","ACTIVE","OBSOLETE","getNameById","docs","setNote","docId","verNumber","note","Note","setState","State","createTableRow","detailNum","callFunc","Obj","View","DetailNum","copyTableRow","sourceRowID","SourceRowID","deleteTableRow","rowID","RowID","needSaveObject","folderIdToPaste","Req","Cmd","NeedSaveObject","FolderIDToPaste","ReceiverObjectLink","build","Model","buildSync","showLogoutPrompt","exit","showReportParams","reportName","ShowReportParams","menus","_details","dataViews","DV","gridPlugins","_controls","_editors","selectList","passEventToContainer","element","jEl","SPECIAL_VALUE","BLANK","NOBLANK","DATE_SPECIAL_VALUE","YESTERDAY","TODAY","TOMORROW","THIS_WEEK","THIS_MONTH","THIS_YEAR","BaseDataProvider","loadOptions","totalCount","loadState","saveState","savedWithoutErrors","extendDefaults","ELLIPSIS","TEMPLATES","MAIN_INPUT","LIST_RECORD","POPUP_AREA","LOAD_MARGIN","SelectListControl","instanceID","listInstanceID","_jDropDownIcon","_jWait","_jInput","_jOk","_jCancel","_jCheckBoxContaier","_spinnerTimeout","selectedRecords","_render","initialValue","_getInputValue","_initControls","_bindEvents","notSelectedRecords","like","openList","_applyLike","_hideEllipsis","_showEllipsis","_applyOnEnter","column","ctrlKey","charCode","_initListControls","_jList","_bindListEvents","ITEM_SELECT","_applyList","_handleScroll","_hideOpenedControls","jList","skip","records","listRecord","leftPosition","winWidth","rightPosition","BEFORE_LIST_OPEN","waitText","jArea","scrollHeight","_appendRecords","isPending","take","fadeIn","BEFORE_RECORDS_APPEND","fadeOut","record","currentLike","invertedMode","_validateLike","VALUE_CHANGED","jOption","compact","isInverted","DisplayValue","updateState","newState","filterType","equalRes","columnType","Like","In","Equal","ON_GET_VALUE","CONTROL_EVENT","DateValuesPlugin","_selectList","_beforeListOpen","_beforeRecordsAppend","_isExist","where","byref_records","unshift","SpecialValuesPlugin","_onGetValue","_onRecordSelect","jInp","Display","findIndex","emptyIndex","emptyRecord","hasEmptyRecords","byref_filter","without","findWhere","blankAndNoBlankItems","chain","TEMPLATE","DateControl","showTime","dateType","_fillInputValue","_applyFilter","isSet","prevBeforeShow","newBeforeShow","OPEN","formatFunc","GET_VALUE","StringEditor","renderState","_column","_gridComp","_value","_displayValue","grid","commit","commitChanges","isUndefined","field","_getWrapper","_updateData","_getValueForRender","initKeyNavigation","leaveOut","stayHere","stopImmediatePropagation","isAllTextSelected","range","end","hasText","ui","ENTER","_isAllTextSelected","caret","ESCAPE","DOWN","UP","_handleUpDownKey","LEFT","RIGHT","shiftKey","metaKey","_wrapper","parentCurrent","_parent","isRequired","isReadOnly","row_id","sectionNumber","hasCalculation","isValueChanged","serializeValue","applyValue","newData","loadValue","validate","valid","destroy","setCustomAction","opt_tooltip","_getColumn","currentTable","columns","TextEditor","PickEditor","_renderer","selectedKey","selectedValue","Pick","renderAsync","clearValues","wrapper","addValue","DateEditor","initPicker","adjustDate","IntegerEditor","currentColumn","autoNumeric","mDec","aPad","FloatEditor","precision","BaseObjectSelectEditor","defaultValue","hiddenInputValue","selectedRecordID","detailRecordId","_createRenderer","jEditContainer","isFocused","hasNoValue","disableSlickOnEnter","passKeyToInput","press","Event","selectAllText","focusToInput","unFocus","BACKSPACE","DELETE","ignoredKeys","CONTROL","TAB","SHIFT","PAGE_UP","PAGE_DOWN","CAPS_LOCK","_getSelectedItemElements","_createWrapper","ReferenceEditor","Reference","opt_refCode","setMainReference","addLastObjectsPseudoReference","lastReferences","removeLastObjectsPseudoReference","bindReferenceGridDialog","DocumentEditor","DocumentSelect","SortingPlugin","_grid","_useServer","useServer","Grid","BEFORE_GRID_INIT","_onGridBeforeInit","COLUMN_INIT","_onColumnInit","GRID_INIT","_onGridInit","reSortColumns","_reSort","dataView","byref_settings","byref_column","isSpecialColumn","sortable","slickGrid","_bindOnSort","_restoreSorting","AFTER_DATA_LOADED","sortingColumns","Sort","sortInfo","columnId","sortAsc","IsAsc","setSortColumns","_columns","comparer","g1","g2","setSortColumn","rowsArr","_isNew","rowData","rank","fastSort","invalidate","onSort","subscribe","sortCol","reloadData","GroupingPlugin","_oldGrouping","_groupItemMetadataProvider","Slick","Data","GroupItemMetadataProvider","GET_VISIBLE_COLUMNS_FOR_DIALOG","_onGetVisibleColumnsForDialog","SET_VISIBLE_COLUMNS_FROM_DIALOG","_onSetVisibleColumnsFromDialog","_onAfterDataLoaded","unGroupColumnsById","_unGroupColumnsById_exported","updateGroupingInfo","_updateGroupingInfo_exported","toogleGrouping","_toogleGrouping_exported","_includeGroupedColumns","_excludeGroupedColumns","columnIds","grouping","GroupColumns","getUID","removeGroupBy","headerCssClass","getter","formatter","byref_dataView","byref_options","onColumnsReordered","_getGrouping","newGrouping","pluck","isEqual","collapseAllGroups","onUnGroup","jColumn","showColumn","onGroupSort","prevGrouping","groupCol","SortIsAsc","_restoreGrouping","_handleGroupToggle","IsGroupPanelVisible","setGrid","shrinked","gridColumn","restoreGroupedColumns","Opened","expandCollapseGroup","_setupGroupsReordering","prepareDataBeforeToggle","groupingKey","isCollapsed","containment","connectWith","cursor","tolerance","distance","forcePlaceholderSize","beginUpdate","resortGroupColumns","receive","sender","toast","PageIndex","sortColumnInfo","handleGroupByDrop","bindGroupSort","hideColumn","getGrouping","col","_updatePlaceHolder","groupsCount","isExpand","currentGrouping","LastCollapsedGroupingKey","needToEnable","jPHolder","jGroupBy","setOptions","showGroupByRow","groupByRowHeight","resizeViewport","byref_visibleColumns","groupInfo","unGroupingColumns","visibleColumn","FooterPlugin","pageIndex","pageSize","_jPager","_jPagerControls","_selectExpression","STATE_LOADED","_afterGridStateLoaded","_afterGridDataLoaded","updateFooter","_updateFooter_exported","initPager","DATA_LOADED","renderTemplates","_setCountLabel","navPanel","recordsFrom","recordsTo","currentPageText","PAGE_CHANGE","gridId","pageIndexSaved","jGridContainer","Take","selectOn","center","currentFilter","CurrentFilter","DisplayHint","currentRecordsRange","HasFilterExpression","CurrentFilterName","CurrentFilterNameHint","FilterHint","IsFilterEnabled","IsEnabled","CurrentRecordsRange","CurrentPage","Options","Selected","FirstDisabled","PrevDisabled","NextDisabled","LastDisabled","pager","showPagerRow","pagerRowHeight","_initCounter","resetFilterState","changeFilterState","_bindFilterEvents","_bindPagerEvents","Filters","resetFilter","afterClick","_getData","PAGE_LIMIT_CHANGE","jPager","_toggleRecordCountDisplayMode","jRowCount","spinnerShowDelay","GlobalPageFilter","Expression","_dataSource","GlobalPageFilterLikeQuery","total","CheckboxPlugin","_checkboxSelector","CheckboxSelectColumn","toolTip","checkboxColumndDef","getColumnDefinition","setSelectionModel","RowSelectionModel","selectActiveRow","syncGridSelection","onSelectedRowsChanged","SELECTED_ROWS_CHANGED","__nonDataRow","getSelectionModel","selectOnClickEvent","ContextMenuPlugin","_contextMenuOptions","_customMenuClass","_contextMenu","_form","opt_form","from","openContextMenu","_openContextMenu_exported","clientY","_openLegacyContextMenu","_openBaseContextMenu","setForm","BaseContextMenu","generateItems","_removeMenuSelectCssClassAndReturnClickedRow","bindActionsToMenuItems","srcElement","jRow","ColumnResizePlugin","_settings","_onAfterGridDataLoaded","_onWindowsResize","autoAdjustColumnWidth","_autoAdjustColumnWidth_exported","resizable","_columnsWidthIsEmpty","_saveColumnWidthState","IsColumnsAutoWidthEnabled","onColumnsResized","columnsWidth","resizeCanvas","forceFitColumns","autosizeColumns","getColumns","ColumnsWidth","SELECT_LIST_PAGE_SIZE","FilteringPlugin","groupDisplayLimit","selectListDataProvider","_selectListContainerSelector","_popupSelector","_slickHeaderSelector","_dataPickerInputSelector","_datePickerSelector","toggleFiltering","_toggleFiltersArea_exported","updateFilter","_updateFilter_exported","getFillingRequisites","_getFillingRequisites","setHeaderRowVisibility","IsFilterPanelVisible","CF","_updateFilterExpression","mouseup","has","jTarget","FILTER_UPDATE","expression","_getColumnExpression","onHeaderRowCellRendered","renderControl","closeOtherControls","columnFilters","ColumnsFilter","SelectList","columnFilter","selectListDataProviderSettings","requisiteName","_updateStateAndReloadData","noop","isPrevAutoFilter","IsNeedSave","SavedFilters","_getAutoFilterName","setupFiltersState","setSelectedRows","_updateControlsState","_removeDeniedColumns","_convertToSBRSE","_convertToHumanRedableText","allColumnsIds","filters","maxFilterID","keys","needTrunc","reqFilter","requsiteName","columnName","wrapWith","space","getDateFilter","yesterday","setDate","_makeOneDayDateExpression","tomorrow","curr","getDay","firstDay","lastDay","_makeDateBetweenExpression","block","dateFilter","operand","likeExpr","_makeDateTimeLikeExpression","displayValueFieldName","likeValue","d2","currentFilterExpr","GF","equalValue","ITEM","ADD","COPY","VALUE","DISPLAY_VALUE","DetailsContextMenu","_sectionNumber","_clickedCell","_clickedInContextMenu","dfmName","_dfmName","_getRowIdFromEvent","isTableDisabled","label","opt_disabled","_canAddNewRow","_canCopyRow","_getCellNumberFromEvent","editor","getCellEditor","setActiveCell","getDataLength","editActiveCell","addRow","copyRow","deleteRow","reqArray","currTable","tablesArr","getTables","isChanged","currentTableColumns","hasColumnWithDisabledGuiChange","getCanGUIRead","isSystem","copyRowOnServer","touch","jCell","hasFilledRequisites","lastRow","EditPlugin","_pending","_selectionModel","_exceptions","_bindedTables","enableCellNavigation","editable","autoEdit","StubSelectionModel","CellSelectionModel","onCellChange","cell","onEditorInit","onBeforeCellEditorDestroy","onGetEditor","byref_editor","lastActiveCell","needRestoreEditorAfterReload","onKeyDown","DFMName","ROW_ADDED","DATA_RELOADED","onAddNewItem","getIdxById","scrollRowToTop","_onFocusOrUnFocus","targetInExceptions","activeElement","_needSetGridsKeyScope","navigateUp","resetActiveCell","_setGridsKeyScopeTimeout","globalKeyScope","setScope","ASTERISK","_queryDelay","_saveStateDelay","dataSource","getRowAdditionalInfo","cellTemplate","_initializeColumns","VisibleColumns","getVisibleColumns","_initializeGrid","setTable","setColumns","newColumns","nextVisibleColumns","visible","sortBy","headerRowHeight","rowHeight","explicitInitialization","syncColumnCellResize","enableColumnReorder","DataView","visColumns","onRowCountChanged","updateRowCount","onRowsChanged","invalidateRows","opt_force","prevState","fadeSpeed","fadeTO","fadeTo","BEFORE_DATA_LOADED","Rows","setItems","endUpdate","rawColumns","ALIGNMENT_RIGHT","IsRequired","TextAlign","columnSettings","Field","IsVisible","Width","Index","Hint","DateType","HasCalculation","IsReadOnly","Precision","asyncPostRender","_excludeSpecialColumns","getColumnsForDialog","GET_COLUMNS_FOR_DIALOG","getVisibleColumnsForDialog","setVisibleColumnsFromDialog","setVisibleColumns","SET_VISIBLE_COLUMNS","visibleIds","visibleColumns","QueryInstanceID","opt_index","oldColumns","newColumn","isCurrentPeriodEnabled","ToggleCurrentPeriod","modalWindowButtons","_setKeyBindings","dialogClass","closeText","modal","enterOk","closeOnEscape","keyScope","isSingleme","keyBindings","_jContent","_isFitted","enter","setSpinner","opt_text","setTitle","AFTER_OPEN","showCancelButton","setWidth","setHeight","_placeInCenter","_setupKeyScope","keyName","buttonId","changeButton","updateButtons","addButtonIcon","primary","secondary","removeButtonIcon","enableButtonWaitState","originalText","disableButtonWaitState","orginalText","addHelpIcon","isCustomDlg","wnd","onOK","onCancel","existingButtons","closeDialog","data-name","globalPrevBeforeUnloadFunc","globalPrevFormVal","onbeforeunload","optimalHeight","round","AdjustDialogIfIpad","InitHoverForButtons","autoOpen","beforeClose","BEFORE_CLOSE","AFTER_CLOSE","BEFORE_CLOSE_BY_ESCAPE","_setStatisticsClasses","BEFORE_CLOSE_BY_CROSS","jDialog","of","jModalWindowContainer","AFTER_CLOSE_BY_OK","AFTER_CLOSE_BY_CANCEL","BaseMultiSelect","availableItemslabel","selectedItemslabel","filteredItemsEmptyPlaceholder","defaultRecordIcon","defaultMarkedRecordIcon","isSelectionChanged","_html","_navigationKeyCodes","_handlers","_jSelectedItemsTable","_jAvailableItemsList","_lastFilterValue","_displayOptions","_datatable","availableItems","opt_selectedItems","opt_settings","instance","_hoverItem","_unhoverItem","selectItem","newItem","_addItemToSelectedItems","keyPressEventHandler","upDownKeyNavigation","_findSiblingOrParent","UnhoverGroup","HoverGroup","_scrollListToHoveredItem","recordsList","rightArrowKeyPress","leftArrowKeyPress","deleteKeyPress","idToRemove","rowDeleteButton","deleteItemFromSelectedItemsTable","_prepareAvailableItemsArea","_prepareSelectedItemsArea","_jFilterInput","_initEvents","_markSelectedItemsInAvailableItemsList","_fixSelectedItemsTableBorder","renderedItems","isAreaReadonly","osName","is_readonly","tooltip","redaonly_attr","placeholder_message","tabindex","selItems","_markRecord","_renderSelectedItem","displayDelete","displayOptions","extra_attributes","display_delete","display_options","option_name","area_class","_initSelectedItemsEvents","_InitAvailableItemsListEvents","_initFilterInputEvents","_initExtraEvents","_InitKeyNavigation","isNeedProcessChild","_getColumnsInfo","cols","bVisible","bSortable","colWidth","sWidth","dataTable","sScrollY","bAutoWidth","bDeferRender","bPaginate","oLanguage","sZeroRecords","aoColumns","tableWidth","_initSingleSelectedItemEvents","idx","_getSelectedItemById","fnDeleteRow","_addPlaceholderIfTableIsempty","_getAvailableItemById","iconImage","treeMode","favoriteUserIconClass","treeModeRecordIconClass","treeModeMarkedRecordIconClass","jRows","_InitSingleSelectedRecordEvents","DeleteItemFromSelection","fnAddData","jNewRow","_getItemsListHeight","itemHeight","expr","Contains","words","matches","sendRecordsToParent","locationOrigin","origin","protocol","postMessage","destination","convertObjectListRecord","BROWSER_TOOLBAR_HEIGHT","MIN_DIALOG_MARGIN","MAX_DIALOG_MARGIN_PERCENT","ReferenceGridDialog","modalDialogTitle","_addReferenceCaptionToTitle","referenceUrl","_makeReferenceRecordUrl","filterQuery","hideToolbar","leaderSelectedId","_changeDialogBodyMinWidth","_changeDialogDimensions","_bindDialogEvents","_addSelectRecordColumn","filterTitle","referenceCaption","modalmode","likefilter","jIframe","IframeWindow","contentDocument","dialogWidth","dialogHeight","_sendSelectedRecords","_initSelectionButton","_bindDisableSelectButtonInSigleMode","_bindDisableSelectButtonInMultiMode","contentWindow","referenceInit","ReferenceGridDialogCellClick","recId","selectedRow","leaderValues","_getLeaderValues","sendRecordById","columnsAmount","selectRecordColumnIndex","selectRecordColumn","leadReqNames","selId","leadColumnName","originalEvent","afterGroupName","create","createButton","sendMultiSelectedRecords","getButtons","createAndShow","selectionDone","cb","selectionCancel","opt_records","convertedRecords","SortableMultiSelect","is_hidden","rowSelector","_swapRows","itemSelector","jPair","SelectableMultiSelect","jMarkedRow","messageBoxIcon","messageBoxIcons","question","baseDialog","buttonText","buttonClick","okButton","okCallback","yesCallback","noCallback","cancelCallback","messageBoxButtons","showInfo","defaultButtonId","setMainText","setAdditionalText","_setDefaultButton","_getHtml","splitterIndex","_createSettingsObject","showOkButton","mainTextHtml","additionalTextHtml","CreateDocument","_jWindow","jWindow","formIsValid","isFormValid","CheckFileSize","initCreateNewDocumentControl","opt_mode","folder_id","FavoritesFolderID","Mode","moveOpenedDialogToCenter","LAYOUT","_pendingOperations","_keepAliveTimer","_keepAlive","_freeDialog","ObjectList","baseShow","_beforeShow","_afterShow","_registerOperation","operation","_unRegisterOperation","Height","_fixStyles","_initActions","_initTabs","_initDetails","isAnySelected","_jObject","Actions","_initActionItems","_executeDefaultAction","HasChangeEventHandler","_handleAction","BEFORE_ACTION","getLabel","setLabel","setTooltip","_unHighlightRequisites","allGrids","gridName","getActiveCell","DialogInstanceID","_getRequisitesToSend","_commandList","_handleFailSave","preventClose","setOrientation","jTabs","activeTabDfmName","Initiializer","DetailsInitiializer","DataProviderClass","FormDialogDataProvider","dataProviderOptions","DialogName","detailsInitiializer","COMPLETE","initiializer","gridInstances","waitForData","_locked","_getAvailableHeight","_DFMName","initialState","_dialogName","_detailSectionNumber","DetailSectionNumber","makeParams","jTable","_saveSateTimeout","_makeKey","ReportParamsDialog","requisitesModels","FormData","FormHtml","validateForm","isValid","globalWebAccess","FLOAT_DIALOG_TEMPLATE","FloatDialog","_inited","_createHtml","floatDialogTemplate","showMinimizeButton","minimized","showCloseButton","contentAsHtml","isLoading","hidden","loadingText","_jTitle","_jMinimizingIcon","_jCloseIcon","_jContentArea","_jLoading","_jLoadingText","setMinimized","isMinimized","newTitle","setTitleAsHtml","newTitleHtml","setContentAsHtml","setContent","showLoader","isUserExpanded","niceScroll","cursorcolor","cursorwidth","cursorborder","autohidemode","cursorborderradius","railpadding","horizrailenabled","railalign","_imageWidth","_imageHeight","_isRendered","_menu","opt_menuItems","imageWidth","imageHeight","_makeMenuObject","addItem","opt_icon","opt_bottomSeparator","opt_selected","getSelectedItem","setSelectedItem","opt_iconCSSClass","force","OnlyIconsContextMenu","opt_controlId","controlId","jMenu","isHorizontal","itemEls","jObjOffset","showIn","atTop","invalidFields","displayErrors","heigth","_orientaion","_request","_action","_method","_enctype","_constructors","isHtmlFormEnabled","jForm","opt_byId","byId","jField","pickInstance","jRadios","BaseObjectSelectRequisite","setControlValue","_preventDoubles","getHeight","getHeigth","_removeField","addText","afterRender","_addItem","_asterisk","rules","addInput","opt_maxlength","opt_validateRules","opt_type","opt_defaultValue","asterisk","addFileField","addHiddenField","addDate","_wrapControl","addTextArea","opt_defaultvalue","addTextFrame","opt_maxHeigth","maxHeigth","addTextarea","addSelect","mustache_options","addRadioButtons","addReferenceSelect","opt_toolTip","opt_searchReqName","opt_filter","other","searchReqName","opt_links","opt_isList","opt_referenceCode","object_type","isList","addMultiSelect","referenceNames","opt_isMultiSelect","isMultiSelect","addPick","opt_displayValues","opt_disabledValues","opt_editable","displayValues","disabledValues","fromServerSide","validateRules","addCustomField","control_html","addCheckbox","opt_isChecked","_tryGetValue","addValidationRule","opt_error_message","_validators","_markAsValid","_markAsInvalid","ruleName","prevColor","jBorder","_getFieldBorder","errorsHtml","_fillItem","setAction","setMethod","form_method","setEnctype","enctype","sync","jMasterDeferred","clean","_preRender","launchPostRender","_postRender","_parseServiceResult","pickWrapper","_fullSerialization","_defaultSerialization","FType","FormJS","formdata","reqTypes","referenceSelect","multiSelect","pick","reqUD_inv","deserialize","setDisplayValue","isDate","isDigit","isNumber","isEmail","validateEmail","min","ruleValue","email","requestMap","ToolTip","SearchReqName","getData","MultiSelect","RefNames","Filter","IsMultiSelect","DisplayValues","DisabledValues","Editable","BasePageElement","_storedEvents","_byNameSelectorTemplate","isHidden","getTooltip","setIcon","jSvgIcon","jSpriteIcon","jUseElement","getIcon","opt_callback","_disableClickHandler","_defaultAction","_inlineEvent","_eventHandler","buttonName","continueDefaultAction","_storeInlineEvents","_eventHanler","jObject","_storeEvents","_restoreEvents","_restoreInlineEvents","buttonSelector","groupSelector","isEnabledOnAttachmentSelected","isEnabledOnAborted","isEnabledOnDone","isEnabledOnRunning","_jGroup","isSmall","_setupSmallIcon","_linkedAction","_enabledMode","enabledWhen","_enabledWhen","_disabledHint","_hint","isSynthetic","_isConverted","_setupIcon","firstIcon","secondIcon","to","picName","storedSmallIcon","storedLargeIcon","_setupLargeIcon","_putInColumn","_takeFromColumn","_convertToSmall","largeButtonsCount","firstColumnSelector","jFirstColumn","nextAll","_convertToLarge","_jColumn","convertTo","buttonType","getLinkedAction","getEnabledMode","getIsEnabledOnAttachnentSelected","Boolean","getIsEnabledOnAborted","getIsEnabledOnDone","getIsEnabledOnRunning","unSelect","hideNextSeparator","showNextSeparator","_setActualHint","setHints","disabledHint","GROUP_FOLD_MODE","SHRINK_SMALL_BUTTONS","CONVERT_LARGE_BUTTONS","COLLAPSE","AUTO","toolBarConatainerSelector","separatorSelector","groupHeaderSelector","buttonAndColumnSelector","smallButtonSelector","jToolBarConatainer","toolBarBottomBorderClass","buttonArrowSelector","_index","priority","_isCollapsed","opt_smallSized","newButton","collapse","headerInlineBlock","addedGroupSelector","jButtonArrows","smallItems","tbgroup_header","evt","docWidth","jHiddenDiv","divWidth","jAddedDiv","_autoHideGroup","jGroup","rebind","frameDocument","jFrame","_shrinkSmallButtons","canBeShrinked","_autoCompress","fold","unfold","_autoRestore","_restoreSmallButtons","_convertLargeButtons","jLargeButtons","_convertSmallButtons","jSmallButtons","btnByName","foldMode","fitToWidth","getWidth","jSmallItems","jHeader","filteredButtons","filtered","addBottomBorder","color","jBottomBorder","byNameSelectorTemplate","_buttonsByActionName","_buttonsByEnabledMode","_buttonsEnabledOnAttachmentSelection","linkedAction","enabledMode","_jToolBarConatainer","_jSearchTarget","toolGroupName","currentGroupSelector","jToolGroup","currentButtonSelector","jExistingButton","buttonClass","buttonTemplate","existingButton","getButtonsByActionName","getButtonsByEnabledMode","getButtonsEnabledOnAttachmentSelection","toolGroupNameToAppendAfter","jToolBar","jExistingGroup","jBeforeGroup","existingGroup","sideBarConatainerSelector","tabSelector","cardFormTabTemplate","opt_current","_jSideBar","sidebar","_defaultClickHandler","_tabSelector","_cardFormTabTemplate","_cardFormTabSelector","_cssClass","_noCardFormAtStartFound","_jSideBarConatainer","_jPlaceHolder","_jCardForm","_jScroller","_jAfterTabs","_actualizeCurrentOnClick","currentSidebar","_updateCurrentSelectedTab","_jSelectedTab","_currentTabSelector","_jExistingTab","_preparePage","_bindOpenHandler","currentTabSelector","_openHandler","targetTabSelector","currentTabName","noCardFormAtStartFound","wrapInner","nowSelect","CustomSearch","_fitHorizontalTabs","_fitTabs","_fitVerticalTabs","_getSideBarSize","sizeName","sideBarSize","_getLastTabSize","availableSize","jMore","moreSize","lastSize","_internalExpand","jSideBar","firstTab","prevId","tabsLeft","_internalCollapse","toggleClass","jLeftColumn","afterTabsWidth","marginRight","lastTab","smallIcon","moveSidebarToLeftColumn","jRightColumn","initSavedTextHeight","jTreeArea","jLeftContainer","jTreeContainer","jExpandTreeContainer","jExpandHeaderContainer","_moveSidebarBeforeCustomWorkCard","jMainContainer","jAttachment","attachmentWidth","FolderTree","_containerId","_promise","initComponent","containerId","selectNode","nodeInfo","_buildFolderUrl","prevPath","nextPath","hasCover","hasFolderCover","hasCoverOnly","showCoverOnly","markAsSelected","_findNode","openNode","toggleNode","loadNode","_mapNodes","selectNodeByPath","fpath","triggerClick","currentPath","updateUnreadJobCount","forceUpdateCache","_findNodes","showUnread","ForceUpdateCache","unreadCount","_updateNode","folderPath","_getNodeContent","_findNodesWithFolder","getCurrentFolderName","setFolderVisibleName","updateFolderName","_findNodePath","predicate","nodesPath","childNodes","filteredNodes","changeFunc","ReactDOM","React","Component","constants","systemCode","getElementById","onFail","hasChildren","selectedNode","FolderPath","SelectedTreeItem","expanded","IsOpening","treeitem","_dialogId","_customDialogId","opt_dialogId","opt_details","showInDialog","dialogId","opt_messageType","_updateContext","jDialogContent","jError","typeClass","closeIcon","margin-bottom","isPreviewPage","wrap","jSpinner","timer","_start","showDelayed","opt_delay","_stop","dialogTopSpinner","opt_message","requisitesMixin","_createRequisite","reqData","opt_isDetail","opt_grid","REQ","Integer","Radio","CheckBox","BaseRequisite","_initRequisiteValues","reqsData","globalReqValuesInit","_reqValuesInit","isRendered","_reqName","currReqValueInit","_bindMirrors","_isChanged","_disable","_enable","parentTable","_parentTable","_disableReadOnlyFields","getRequisiteByControlId","reqI","controlsIds","RequisiteCollection","toDictionary","resultDict","BaseTableLine","_jDataItems","_makeFullName","newRowNum","ROW_NUMBER","TableRow","_rowID","rowNum","rowNumReq","requisitesData","_getActualValues","modHiddReqs","hiddReqs","fullReqName","reqNameParts","getRequisites","reqVal","TableColumn","_isVisible","_isSystem","_isCanGUIRead","IsSystem","IsRendered","IsCanGUIRead","setCanGUIRead","currentRow","parentGrid","COMMAND","ADD_ROW","DELETE_ROW","ColumnsCollection","colsData","_createTableColumn","newCol","RowsCollection","rowsData","rowsInit","_addRow","parentTableSelector","_deleteRow","_uid","_currentForm","_columnsMetadata","_gridColumnsMetadata","detailName","parentTabName","_hasPendingOperation","_objectLink","_objectView","getReferenceView","isreadonly","_initColumns","_initRows","tableRows","getColumnsMetadata","fieldName","_makeRowsData","_makeEmptyRow","opt_row","mapObject","rowsMetadata","columnMetadata","columnRequisiteName","gridColumnMetadata","requisiteMetadata","activeCell","columnsMetadata","_updateRowID","oldId","newId","deleteItem","getRows","resultRowsByName","rowI","_getGeneratedRow","isBuilderEventsSupported","opt_requisiteValues","newRowNumber","_getNextRowNumber","_sendRequest","reduce","reqValue","CmdCode","Section","RowData","lastRowNum","exisitingRows","_appendNewRowToDataView","tableRow","currentRequisite","setUntouched","sourceRowId","_tryToDeleteRow","commands","existingCommand","bindOnRowRequisites","colNames","CHANGE_TYPE","REQUISITE_CHANGE","DETAIL_ROW_INSERT","DETAIL_ROW_DELETE","PICK_VALUES_CHANGE","FORM_CONTROL_CHANGE","FORM_REQUISITE_CONTROL_CHANGE","ACTION_CHANGE","REQUISITE_GUI_CHANGE","CONTROL_TYPE","TABLE","REQUISITE","HYPERLINK","MULTISELECT","DETAIL_SECTION_REQUISITE","serviceUrl","_calcServiceCall","_fillRequisites","isInitialized","_bindCalculation","_getRequisiteValueDependsOnOptions","getType","dateTimeFormat","isShowTime","opt_options","useRowNumber","reqControl","refSelectInstance","currentValue","isArray","detailIndex","currentValueArray","multiReqNames","rowIdentifier","_bindRequisiteCalculation","rebindRow","rebindTable","isCalculationDisabled","_showSpinner","RequisiteName","RequisiteValue","resp","_hideSpinner","_applyRequisiteChanges","_applyMultiSelectRequisiteChanges","_applyPickValuesChange","_applySectionsChange","_applyFormControlChanges","_applyActionChanges","_applyRequisiteGuiChange","guiChanges","_applyGuiChangesCallback","isRequisiteEnabled","CanGUIRead","CanGUIWrite","currentRecord","getRecords","actionChanges","IsChecked","DisabledHint","controlChanges","currentControl","isControlEnabled","ControlType","filteredTabs","changedRequisites","isMultiselect","First","Second","oldVal","needReset","Items","DisplayText","changedSections","uniq","sectonNumber","disableHidePreviousInlineHint","_highlightRequisites","reqsStr","_saveData","_fillRowsID","isJSON","mes","RowNumber2ID","newRowIDs","section","tempID","realID","ListItem","isTableItem","_setupBindings","showBindIcon","CustomWorkListItem","removeUnreadStyle","addUnreadStyle","isUnread","_jMainContainer","_getType","objectSelector","_items","_isTable","_getItemsElementsinTable","searchTarget","isAllItemsSelected","getFilteredItems","filterSelector","filteredItems","_getItemIdByjObject","removeItems","opt_needUpdateTree","needUpdateTree","linkKind","elementKind","selectAll","isShowFolders","_setCheckedForFilteredItems","selectItemByID","deselectAll","toggleAll","invertSelection","jCheckedItemsLength","jListBox","_onItemsChanged","_onItemSelected","enableCheckBoxOnItemsSelect","FolderList","likeFilterValue","likeFilterRequisites","predefinedFilter","sortIsAsc","setPredefinedFilter","isPredefinedFilterEmpty","setSort","isObject","getSort","likeRequisites","currentScrollTop","jObjectContents","jFolderItems","pageHeight","shownPage","currentFolderId","_loadAndInsertNewPage","pageNumber","pageCountToLoad","needUseFilters","needUseSort","afterLoadCallback","loadFolderContent","itemsToLoad","onclick","emptyMessage","opt_itemsToLoad","opt_needUseFilters","opt_needUseSort","uid","newQueryParams","ctrl","filterReq","currentQueryParams","setIsShowFolders","ObjectsTable","_selectedItems","_setGrid","_slickGrid","_slickGridDataView","itemData","__name","__code","selectedRowIds","getSelectedRowIds","newSelectedItemsData","rowIdStr","selectedRowNums","_raiseOnSelectEvent","getSelectedRows","allItemNums","newSelectedRowNums","lastSelected","_isCalculationDisabled","_referenceViewName","_allControlsInit","opt_parent","_type","_bindUnHighlightOnChange","_raiseInitEvent","unHighlight","referenceViewName","disableCalculation","enableCalculation","_bindControlEvents","reqFullName","_fireChange","opt_ev","jLabel","_getLabelForControl","jC","opt_jControl","_getControlValue","controlName","_setInvisibleValues","opt_displayValue","_disableControl","_enableControl","opt_NeedTriggerResult","jReq","jReqIcon","reqObj","jReqInput","opt_color","opt_speed","speed","blink","prevBorder","colorLuminance","hex","lum","rgb","borderColor","reqSelector","_getJElementForHighlight","reqChild","reqRef","fakeInput","fakereq","AFTER_CHANGE","onControlInitComplete","jCustomControl","opt_leadRequisiteValues","jHidden","controlInit","changedData","jHidd","leadRequisiteValues","getFilter","refSelect","_setControlsValues","_updateNewValues","updatedNewValues","withoutDisplayValues","addValues","currentValues","_addValues","allValues","clearReferences","oldRefs","newRefs","ROUTELASTOBJS","DisableSpecialProcessing","valuesToBeSet","entry","baseSetValue","isCheckbox","_isCheckBox","_isEditable","jDisplay","_getCheckBoxControl","ddInstance","cardFormControl","isCheckBox","_applyControlMethod","opt_isDisabled","removeValue","jControlValue","isNull","getSelectedValue","newLink","editModeMixin","isEditMode","_filter","_filters","_pickValues","_references","_customAction","_mainReference","_lastReferences","_lastValue","_addLastObjectsPseudoReference","_bindReferenceGridDialog","_bindGridEvents","_reInitControls","refName","setFilters","_clearPick","editorActive","getEditorLock","isActive","updateItem","cellStyle","rownNum","setCellCssStyles","flashCellById","curCol","_useTable","_jTables","useTable","opt_tableName","CELL","CELL_WITH_MENU","DATA_ATTR","COLUMNS","SECTION_NUMBER","BUILDER_EVENTS_ENABLED","COLUMN_AUTO_WIDTH","_detailsSelector","_dv","_jDetails","_cellMarkUp","_templates","_contextMenuMarKUp","detailsSelector","ContextMenuClass","cellWithMenu","cellMarkUp","contextMenuMarkUp","_setTemplates","_initializeGridInstances","isSideBarBindEventBeforeTab","_getExtraColumns","columnAutoWidth","isBuilderEventsEnabled","sortedColumns","getCellTemplate","rowNumber","cellNumber","columnDef","dataContext","_contextMenuMarkUp","valueId","hasValue","openCardButtonTitle","cssClasses","attributes","data-recid","contextmenu","_getAvailablePlugins","stateVariable","disableOnResizeBinding","config","align","showMessage","opt_sticky","opt_duration","sticky","duration","actionButtonSelector","_jActionButon","moreButtonHeaderSelector","moreButtonContainer","moreButtonSelector","_initButtonMore","jMoreButtonHeaderSelector","jMoreButtonSelector","jActions","ActionButton","_model","_dispatchChangeEvent","CreatePanel","button_model","_initButton","button_name","removeButton","Header","childObjects","ExplorerHeader","Current","FullName","login","organization","Organization","defaultCertificate","DefaultCertificate","isTable","_isDefined","recID","unescape","refView","getKind","typesKinds","2","3","9","initCreatePanel","createPanel","initHeader","createPanelData","header","Window","_isOnBeforeCloseExecuted","_closeCheckerTimeoutHandlers","nameLowered","_bindOnBeforeClose","_bindOnAfterClose","_getWindowOpener","closed","_startWindowCloseChecker","_runCallbackIfClose","_unbindOnBeforeClose","_unbindOnAfterClose","_clearAndDeleteCloseCheckerTimeoutHandler","frameElement","childWindow","onCloseFunc","childWindowName","updateExplorerContent","openExplorer","jLikeFilter","predefinedFilters","regionID","reloadParentExplorer","reloadParentGrid","op","formChanged","updateParentExplorerContent","_ignoredActions","_ignoredAreas","HTMLelement","opt_actionTarget","_getParams","Action","writeQueue","stat","tagName","actionAndArea","_getActionAndAreas","Area","areas","Target","_getTargetAndAreas","returnFirstOnly","_getAreaFromElement","areaElement","cNames","cName","actionAndAreas","scripts","reports","folders","tasks","jobs","documents","eDocuments","BaseFactory","getObjectByID","opt_modelType","proxyCall","_handleModel","objectInfo","ReferenceFactory","getRecordByID","openInModal","newSettings","createRecord","opt_environmentVars","opt_ourFirmID","opt_paramVars","paramVars","envVars","environmentVars","bindTo","ourFirmID","Script","execute","createRequestModel","requestModel","webAccessClientClassName","requestParams","showDialogAndExecute","Report","_execute","opt_referenceRecord","integratedReportRefereneceRecordId","integratedReportRefereneceCode","BEFORE_EXECUTING","ReportName","guid","deprecatedObject","download","openByAgent","Repository","DownloadTool","loc","secure","executeIntegrated","referenceRecord","opt_isModal","_showDialog","report","showDialogAndExecuteIntegrated","ABORT_FILLING_PARAMS","queryParamsAndExecute","_queryParams","queryParamsAndExecuteIntegrated","_queryParamsFromXml","serializeForm","getReportByName","FoldersFactory","InboxFolderID","OutboxFolderID","CommonFolderID","getRootFolderID","folderType","getFolderByID","createFolder","opt_name","TasksFactory","getTaskByID","createTask","parentLink","deadLine","JobsFactory","DialogsFactory","_getObjectBy","getDialogByID","getDialogByName","getDialogByInstanceID","attrName","attrValue","EDocumentsFactory","getDocumentByID","createNewFromTemplate","typeCode","kindCode","templateCode","DomainConstants","_ourFirmsConstants","g_SharedPublicConstants","g_OurFirmsPublicConstants","getOurFirmConstant","firmId","VariantParameter","getVariantTypeFromLinkType","linkType","getVariantCollectionTypeFromVariantType","VariantParameterFactory","сreateVariantParameter","parameter","сreateVariantParameterFromNumber","сreateVariantParameterFromBoolean","сreateVariantParameterFromString","сreateVariantParameterFromObject","boolean","сreateVariantParameterFromDate","parameterType","variantParameters","parameterValue","variantParameterFactory","isLinkModel","__type","isLinkModelArray","isDateArray","parseMethodResult","methodResult","linkArray","dateArray","service","entityId","factory","entityLink","methodParameters","px","intVal","clientWidth","clientHeight","namespace","ns","IsListExist","callbackIfExist","SelectAll","InitKeyNavigation","GetScroller","maincont","ArrowKeyNavigation","IsDownPressed","IsPageUpDown","maincont_h","hovered","oldnext","CheckHovered","newNext","next_top","next_h","tocheck","OpenBounds","PerformDefaultAction","nameCont","KeyboardActionWithLink","toolBarBtnSelector","miniToolbarBtnSelector","needCheckIsListExist","hasClassSelected","toolBtn","OpenCard","openCardLnk","ShowObjectCard","SaveCard","shortcutBind","actionname","shortcut","DeleteSelectedRecords","OpenInDesktopClient","CloseTaskWindow","CloseJobWindow","CloseWizardWindow","confmsg","wizardKey","ShowTopSpinnerMessageIfVeryLongQuery","showTopSpinnerTimer","IsModalShown","dlg","instant","inModal","ShowAllRows","ShowAllRowsPostback","GetPageNameByKind","MakeHref","pagename","g_WebServerName","utf8_decode","aa","bb","MakeHrefsFromLinks","InitTree","incScroll","side","scrollTimeout","InitToolbar","OpenForEdit","deselect","CreateTask","opt_withoutAttachments","CreateFolder","CreateTaskTM","CreateFromTemplate","CreateNewDocument","CreateFromFile","CreateFromTemplateOrFile","BindToRecord","RefName","Record","UnBindFromRecord","DeleteAll","ShowFolder","LoadSearch","JobSearch","SearchEDoc","TaskSearch","GeneralSearch","ShowSearchLoader","SearchName","ChangePositionSearchButtons","jSearch","heightNew","jsearchCriterias","jsearchCriteriasDiv","searchCriteriasDivHeight","searchCriteriasHeight","margin-right","padding-right","overflow-x","AfterSearch","searchId","ExecuteSearch","showLastObjects","searchName","executeLastActedObjectsSearch","actedByRequisiteId","actedDateRequisiteId","Constants","usersReference","REFERENCE_NAME","lastWeek","fromDate","ShowReferences","HeaderText","IconAlt","FindParam","aoData","ShowReferenceRecords","refview","linkData","jsAction","CreateRefRecord","Reference_CreateRecord","fillreq","afterCreateCallback","parentParam","parentReq","IsUseOurFirm","firms","GetAllOurFirms","CreateOurFirmSelectForm","SetOurFirmID","NewRecordService","CP","pickRequisites","useOurFirm","FirmID","OurFirmID","RequisiteValuesJSON","EnvironmentVarsJSON","ParamsJSON","customTitle","currentCaption","ShowAddRegion","isDoc","tdAdd","added","helper","LoadAddRegion","DocShowAddRegion","ChangeUnreadCountInTree","AddRegionTo","td","MakeReadedWhenClick","wopenf","withoutmenu","screen","availWidth","availHeight","oSize","oWindow","alert","g_ErrMes","UnlockEDoc","LockEDoc","SaveInJob","SaveAndCloseJob","AcceptContolJob","g_LeadJobID","g_ConfirmParam","Content","$dialog","Job_SetFocusToEditText","DoHighImportance","DoLowImportance","CancelStandartRoute","Task_SetFocusToEditText","ReferenceCard_ShowTab","Num","ReferenceCard_ShowDefaultTab","Reference_IsDisabled","Reference_GetPrefix","Reference_GetName","Reference_GetView","Reference_GetRecordID","Reference_Save","SuccessCallback","isAutoSave","getNewRecordName","parentId","decodeURI","setOpenersRequisite","Reference_SaveAndClose","Reference_ForceUpdateRequisitesFromDatabase","Reference_ContextMenu_Card_OnCreate","Reference_ContextMenu_Copy_OnCreate","Reference_CopyRecord","Reference_ContextMenu_Delete_OnCreate","Reference_ContextMenu_Delete","Reference_DeleteRecord_ToolItemClick","confirmDialogMessage","SourceRecordID","Reference_CopyRecord_ToolItemClick","BaseCloseRecordCard","FreeRecord","CloseRecordCardWindow","CloseFolderCardWindow","SideItem_Click","notInExplorer","RemoveParamsStr","nameLink","DoDefaultAction","StartAction","currentDefaultAction","needDisableAgentSetts","isSearch","ExpandCollapseButtonMouseDown","SetExpandCollapseButtonImage","ExpandCollapseButtonMouseOver","ExpandCollapseButtonMouseLeave","DestImageType","ArrowImages","RemoveAllCircleArrowClasses","reg","match","ApplyStyle","StyleName","ChangeItemTextsVisible","ChangeItemExpandCollapse","sub_divs","GetObjectCardUrl","OpenFolder","newFolderPath","fpathParam","folderTitle","SendAsAttachment","routecode","subject","attach","setSubject","onload","ShowInsideFolders","ShowAttachedToTasks","lowerKind","ObjCopyLink","ObjDeleteLink","CurrentActionHTMLElement","lrList","GetCryptoObject","WrapToShowErrors","CacheKeepAlive","cache_id","Key","SearchCacheKeepAlive","SearchGUID","UniqueID","OpenReference","ExitBtnClick","callbackFunc","InitTheme","ThemeName","ViewPreviewSettingsModal_DisableControls","ViewPreviewSettingsModal_ChangePreviewSettings","radio","ReloadWindowToLoadPlugin","RegisterUserMenuHelpItem","g_UserMenuHelpItem","InitExplorerSidebar","opt_width","isIntegratedSearchMode","okFunc","clearAllModalDivs","bgClass","errHTML","okClick","AppendDialogHelpIcon","ShowDialog","InstructionResize","$ins","CreateDatePicker","clientId","cntl","setDefaults","isClosing","beforeShow","inst","onSelect","needTriggerChange","$input","dateText","SetValidDate","showOn","buttonImageOnly","datetimepicker","showButtonPanel","timeArr","TT","CheckPeriod","idPO","dPO","groupToolbarItems","CopyInfoToClientBuffer","nodeName","copyTextToClipboard","ShowModalWindow","executeAndCloseFunc","handlerExecuted","errMsg","msgType","MakeErrorMessage","MakeWarningMessage","shownMessageType","warnMsg","showInformation","infoMsg","hideReferenceDropDown","drag","needShowButtons","showButtons","dragStart","cnt","afterOpen","ExportEDocNow","eDocId","needLock","needExport","transform","toEsd","withOnlyApprovingSigns","openPreview","GetPreviewEDocUrl","doc_id","ver_num","explock","transformName","useFullScreen","ExportEDoc","hideLock","openRead","OkFunc","AgentCallback","showLock","needShowWindow","modalWindow","verNumberCheckedRadio","transformationsPick","UpdateExportDialog","jExportWithOnlyApprovingSignature","jExportToEsd","ShowLock","IsExport","ShowTransformations","ShowToEsd","CheckLock","CreateVersionToolbar","verNum","ImportEDocNew","ImportEDoc","helpContextId","GetImportModeSettings","g_import_btn","checkFileSize","isImporting","isPressed","DisplayMode","successText","ImportEDocNewToolbar","DoIt","decryptedKey","emds","getDocumentDecryptedKey","edms","Callback","decryptKey","DecryptKey","Pass","OnImportOkClick","ShowMessageInDialog","IsImporting","isFileSizeAccepted","allowCreateActiveVersion","CheckAllowCreateActiveVersion","currentState","kindName","EDocKind","importEdocId","jEDocTr","AllowMultipleActiveVersions","CountActiveVersions","CheckVersionAllowLock","unlockDocLabel","unlockDoc","allowLock","radios","SignEDoc","jModalWnd","jTokenPinMessage","jTokenPinInput","UseAgent","SignEDoc_InitControls","isMultiple","showTokenPinControls","withAnimation","pinPadding","newHeight","tokenPinMessageHeight","tokenPinInputHeight","hideTokenPinControls","getSelectedVersionNumber","getIsApproving","getIsSubstitute","getSelectedCertificate","id_base64","plugin_version","getSelectedUser","setAllowedUserCodes","getSubstitutedUserCodes","signTypeVal","vis","app","signType","IsApprovingSignType","verData","VersionNum","verSelect","pleaseWaitMessage","checkConditions","canApprovingSign","CanApprovingSign","signatures","SignsInfo","userCode","UserCode","docKind","certSelect","curCert","certData","sid","CertificateID","isApproving","isSubstitute","curUserCode","curUserName","signErr","sign","SignatureType","ByUser","cert","UnlockDocIfNeed","_topSpinner","_pleaseWaitText","_pleaseWaitCounter","users","curUserCodes","opt_customWorkSignResults","signWithCertificate","dcCert","NeedLock","signResult","dc","Sign","appLang","SignStr","UserCertificateStr","Comment","IsApprovingSign","IsSubstituted","SubstUser","locateAndSign","signWithFile","filename","_password","GetCertificateFromFile","opt_docId","updateSignIco","opt_id","signatureIcon","signIco","runWithCheckReadByUser","confirmed","confirmSignDialog","okAction","confirmDialog","saveDialogParams","getErrorWithDocName","onSignCallback","edocVersion","EdocId","additionalInfo","signDocument","GetCertificateFromStorage","selectedVersion","onlyActual","signVersions","versions","signResults","OnlyActual","docsWithManyVersions","askFinished","buildNextDialog","CopyEdoc","source_id","jModalWindow","popup","rnd","validForm","pleaseWait","InitCreateNewDocumentControl","ReportError","SetEditorAppFromFile","$file","req_id","analit","myDateSort","size","files","fileSize","MaxRequestLength","ReferenceOpen","viewname","sys","WizardExecute","InitFolderCover","TMExecute","ComponentExecuteInNewProcess","IsWebAccess","iframe","jFiltrationPanel","iframe_wnd","parentWindow","changeCoverStylesImages","imagesPath","jFrameContents","jFrameHead","rel","InsertRouteSchemaImage","RouteSchemaPath","showHints","ContextMenuCheckAll","showRouteModal","SetStandardRoute","ShowMultiSelectModalWindow","showObserversModal","threeDotsDiv","BindHelpIcoClick","ico","g_IsExtHelpAvailable","isExplorerAboutIco","lastUrl","menu_items","_lastUrl","contextId","UpdateModalWindowExtHelpLinks","newLinks","ViewOnDesktop","isForEdit","currentVersion","versionName","OpenWithAgent","Lock","removeDownloadInProgressStatus","jDoc","jDocIcon","setDownloadInProgressStatus","jUploadIcon","checkDocumentHasLocalCopy","GetEDocumentObject","docObj","AskForActionOnDocument","selectedVerRadio","canExportWithLock","AskOpenForView","SendVersionToAgent","lock","EDocumentVersion","GetDocID","GetCurrentVersion","Versions","VerNum","RequestTokenAndContinue","isPreviewSupported","OpenEDocForView","hrefForExport","formatSupported","Operation","OpenDoc","GetAgentOpenDocRequestParamsObject","clearPluginCache","RequestTokenCallback","verIndex","ClientName","Editor","EditorCode","observetype","CloseObservingType","GetAgentOpenDocRequestParams","ProcessResponse","ShutdownAgentSession","selectToolbarBtnOnShowContextMenu","OpenEDocByAgent","ReplaceWizardLinks","wizardLinkRegExp","migration","checkNotifications","initAboutMenu","initSettingsMenu","initFastSearchFilter","initViewSwitchingMenu","initExtensionsMenu","initCurrentFolder","dragging","initPreFiltersMenu","createFolderContextMenu","initTabs","cards","bindButtonsEnablingOnFormChange","customWorks","bindButtonsEnabling","initSelectStandardRouteButton","initPreviewSettings","initColoringRecordsSettings","initAutoCleaningSettings","initAgentControls","initDocDefaultAction","initManagedFoldersSettings","QueryInstanceId","fitDialogOverlayToPage","createResizeEndEvent","treeWidth","VisibleAddedDivs","g_ResStr","TimerCloseMenu","LeftRegionWidth","needExit","c_MultiSelectCloseStatus","c_MultiSelectCloseStatus_OK","c_MultiSelectCloseStatus_Canceled","MIN_WINDOW_WIDTH","MIN_WINDOW_HEIGHT","lastWindowWidth","offsetWidth","h1","h2","scrollbarHeight","adaptiveRules","applyExtraZoomForSurface","resetZoomForAndroid","jMeta","reset","resetZoomForIpad","denyScale","allowScale","isHorizontalScrollExist","overflow-y","setDocumentPreviewHeight","jContentContainer","iframeHeight","setAttachmentsHeight","cardHeight","jCard","headerHeight","contentHight","AttachmentBottomPadding","jLeftColumnHeight","jInstruction","jListReq","jToolbar","setMinimalWindowWidth","jAttachmentsIsVisible","jScroller","setSavedTextWidth","inIframe","setMainColumnsHeight","toolbarPanelHeight","jHistoryTable","QFilterHeight","jFolderCover","setGridHeight","fullHeight","_wh","oldWidth","oldHeight","jOverlay","resizeTO","lastWindowHeight","isRightButton","EDocument","lockUnlockRunning","EDocumentClass","el_name","CopyDoc","islocked","LockUnlockOnCreate","GetLockUnlockText","EnsureVersions","handle","currentVersionNumber","SetCurrentVersionNumber","GetActualVersionNumber","GetVersions","UpdateVersions","GetContextMenu","FirstValidCertificate","SignVersion","GetVersionByNumber","GetVersionLockImage","imgHTML","IsLocked","ShowAllVersions","LifeStage","OpenRead","localCopiesCount","isShowPreview","OpenEdit","ViewInEditor","Import","ImportVersion","LockUnlockVersion","doAction","ReturnDoc_CanClick","ReturnDoc_CanClick_Reason","_SignVersion","certObj","CreateVersion","EDocumentVersionClass","ReturnVersion","CreateNew","Delete","CanChange","DBLock","LockedByUser","LockTime","SetState","IsLockedByMe","ChangeCountActualVersions","CurrentLifestage","ChangeNote","JobClass","MarkAsReadOnCreate","MarkAsRead","unread","IsRead","regionalSettings","getSelectedLang","selectedLangSelector","newLang","setNewLang","setLanguage","cancelNewLang","lastCount","lastTotalCount","lastIsFiltered","ShowRowsCount","GetTotalRowsCount","isFiltered","ModifyRowsCount","addCount","needHide","make","CreateMessageHtml","secondText","messageHtml","lock_label","DocumentId","availableTransformations","getIframeDocument","iframeNode","lastWnd","_fillHiddenParamsCallback","ShowReport","opt_reportCaption","executeFunction","InitReportParams","fillHiddenParamsCallback","GetParamControl","GetParamValue","required","hiddenParams","isOpera","hFrame","ShowReportWithoutParams","divDebug","z-index","opacity","dataTableExt","oSort","mainContainer","currentHistotyTable","InitHistoryTable","tableSelector","sortDownHtml","sortUpHtml","isInit","colnum","sType","sScrollX","aaSorting","fnAdjustColumnSizing","outline","globalCore","needShowInstruction","showEnableInstruction","canUseInCurrentDevice","needShow","requestName","checkSessionState","isSessionError","RunWithAgentDialog","agentAction","_getPlugin","pluginObj","showDialog","defForSession","isSessionRegistered","beginSession","setSessionInitialized","_startAgent","isStarted","_updateAgent","checkUpdateState","updates","getUpdateProgress","ON_UPDATING","AFTER_UPDATING","restart","_initSession","CHECK_STATE_INTERVAL","errCount","ON_FAIL_UPDATING","checkUpdates","BEFORE_UPDATING","_initAgentUI","agentNotStartedWidget","cancelStart","jClickedElement","downloadDebPackageButton","downloadRpmPackageButton","uploadLogs","saveDocDefaultActionSettings","contains","initializeAgentSession","isDisableSetted","g_IsAgentEnabled","beforeUpdating","onUpdating","afterUpdating","onFailUpdating","BUTTONS","RUN_AGENT","WITHOUT_AGENT","PING_SUSPECT_FAIL_TIME","PING_MAX_TIME","_agentStartTimeoutID","_agentStartFailTimeoutID","_waitDialog","_clearCheckAgentTimers","_initButtons","_initDownloadLink","_initUpdateHandling","_runAgent","_initCheckAgentTimers","_disableAgent","AFTER_DOWNLOAD","_beforeUpdating","progress","_onUpdating","_afterUpdating","_onFailUpdating","_unbindUpdateHandlers","AFTER_START","_iw","_jo","_preInitObjects","_initHovers","oldImage","jAbout","initCurrentUserHint","usersRefCode","userId","hasHint","jUsername","tabGiven","jCardFormTabs","jSelectedTab","jTabItem","dtTables","fnDraw","setOrientationCookie","isNeedInvert","setHorizontal","setVertical","WITHOUT_FILTER_NAME","onSelectFilter","jFilters","statusesMenuItems","menuItem","baseMenu","iconSymbol","jSelectedItemText","menuSelector","allFilters","selectedFilterName","IsHidden","statuses","Tooltip","Icon","statusesMenu","initSortMenu","getHoverIconCssClass","OFF","defaultDirection","ASC","isAsc","sortItemOnClick","clickedItem","DESC","jSortText","jSortIcon","setSortByMenuItem","sortIcon","toolbarWidth","getSourceId","enableDeleteButton","toolItem","deleteLinkFromCard","folderTab","pasteToFolder","_createTask","taskTab","handled","$list","getObjectListWidth","addWidth","getToolbarWidth","objectListWidth","jGroups","MAX_SAFE_INTEGER","enableButtonOnItemsSelect","allItems","enableButtonOnItemsSelectGt","jCheckAll","processFirstSelectedItem","processCurrentObject","enableObjectCardBtn","TOOLBAR_ACTIONS_WITH_OBJECT_GROUP","openObjectCard","copyObject","enableButtonForDocOrRefRecord","kindLowered","openObjectHistory","showAttachedToTasks","showInsideFolders","showBoundDocuments","sendAsAttachment","openFolderContent","folderContentUrl","isSelectedSecondLevelInRelationTree","enableCutAndDeleteLinksBtn","enablePasteLinksBtnOnFolderChange","enablePasteLinksBtn","currFolIsReadolny","pasteBoundsInTab","deleteBoundsInTab","enableSendAsTaskAttachment","FolderType","createAndAttach","docUrl","enableButtonOnObjectTypeSelected","objects","availableStatuses","statusNameInClassRX","getStatusIconByStatusName","opt_normalClean","toolItemEl","afterChangeCallback","isForList","massSetUserStatus","succFunc","updateStatusInList","statusEl","showStatusContextMenu","userStatusMenu","getUserStatusMenu","openStatusContextMenu","openStatusContextMenuForList","getStatusOfItem","itemEl","statusButtonForListOnInit","isSelectedOnlyReferences","getStatusNameForItems","elStatusName","showHorizontalStatusContextMenu","generalMenu","menuIconEl","itemsStatus","menuitems","imageCSSClass","menuId","oldOnShow","SetCurrentPeriod","onPeriodSet","CURRENT_PERIOD_TYPE","CURRENT","PREVIOUS","SLIDING","CUSTOM","CURRENT_PERIOD_LENGTH","MONTH","QUARTER","YEAR","currentPick","currentPickData","uniqueID","styleClass","previousPick","previousPickData","lastDays","lastDaysHtml","beginDateData","endDateData","currentPickHtml","previousPickHtml","beginDateHtml","endDateHtml","currentPickLabel","previousPickLabel","lastDaysLabel","lastDaysLabelEnd","periodLabel","beginDateLabel","endDateLabel","Previous","LastDays","BeginDate","EndDate","setType","period","PeriodType","PeriodLength","Period","AsString","days","begin","formType","setCurrentPeriodService","PerionBegin","PeriodEnd","CurrentPeriodType","CurrentPeriodLength","Location","createCurrentPeriodFilterMenu","opt_needDisableChangeCurrentPeriod","needDisableChangeCurrentPeriod","isCurrentPeriodRequired","cm","appendCurrentPeriodInPageTitle","jObjectName","serverBegin","serverEnd","selectFilterButton","toggleFilterPanel","selectUseArchiveDataButton","RefView","enabled","toggleUseArchiveDataPanel","selectGroupButton","toggleGroupPanel","selectVisibleColumns","newVisibleColumns","enableDeleteRecordBtn","hasRights","enableCopyRecordBtn","DeleteRecord","CreateCurrentFilterMenu","contextMenuElementSelector","createReferenceMenu","SetCurrentFilterState","PeriodSetCallback","getReferenceContext","getPlacementContext","ExportRecords","ExecuteBeforeQueryParamsEvent","performResultCode","jActiveText","activeText","PerformResultName","ActiveText","newActiveText","JobWFSetResult","JobWFParams","JobWFParamsEmptyResult","JobWFSetEmptyResult","DoItAdditionalAction","fillJobChoiceText","initPerformButton","spanText","choices","DisplayName","performResult","additionalSettings","perform","CheckIsWf","ResultNotEmpty","hasAskableParams","performResultInMobile","resultEl","g_ContentFilterTimeout","switchView","viewmode","showCover","currentView","updateFilterInputWidth","filterAreaWidth","checkAllWidth","currFldWidth","filterDropdownWidth","updateFolderListItems","jFastSearch","resetFilterInputWidth","onFilterInputKeyDown","clearButton","onFilterInputKeyUp","toogleCurrentFolderArrow","jCurrentFolderArrow","jCurrentFolder","globalFooter","AgentNotStartedWidget","onStart","onDownload","TITLE_TEMPLATE","CONTENT_TEMPLATE","OpenedDocumentsWidget","_requestGetOpenedDocuments","_startGetOpenedDocumentsTimer","intervalInSec","getOpenedDocuments","_prevDocs","doc","IsObservable","getOpenedDocumentsListComponentHtml","titleHtml","wrappedContent","jOpenDocumentList","dropping","droppable","jDroppbable","isfolderAcceptObject","associations","5","enableCopyButton","isCopyKeyPressed","getTreeItemId","getTreeItemParentId","getDraggingLinks","jDraged","accept","allow","jReciever","recieverType","getFolderType","hoverClass","drop","draggable","dragIsFromFolderTree","handleDrop","enableEscapeButton","isCancelKeyPressed","revert","filterLinks","getObjectName","removeSelection","moveLinks","bindLinks","attachToTask","refreshAll","OL","pastedCount","signListItems","linkModel","sortedLinks","signSortedLinks","signDocuments","getSignedCustomWork","SignTask","SignJob","signCustomWork","showSigningUnsupportedDialog","jDraggable","refreshObjects","dragSetup","dropSetup","MaxVisuallyStackedObjects","jAttachedToCursorItem","cursorAt","preview","_checkDocumentType","accepted","isScrollableDocument","opt_extension","isTextDocument","isSpreadSheet","fixHttpLinks","getFrame","rebindPassthrow","objectsData","selectedObj","resizeTextDocuments","wrapAll","jCentered","isResized","jComments","bindHover","jComment","commentAreaName","commentIdSelector","border","text-align","-webkit-backface-visibility","frames","prevScroll","scrollTo","alignComments","jReviewControl","Directions","directions","_reset","scrolling","_jFrame","_jArea","_jDoc","_href","_jImage","_direction","_areaHeight","_pagesIterator","_height","_width","_isIE","_jPageNumber","_lastPageHandlerTimout","postInit","previewHandlerUrl","convertedObj","prepareFirstImage","fillWithPlaceHolders","attachToFrameScrolling","loadNeighbors","pageCount","frame","handleCurrentPage","jPage","elementFromPoint","_areaWidth","pageNum","bindOnLoad","getURLForPage","complete","device","rotatePages","placeholders","margin","placeholderMargin","abs","margin-top","rotateCW","rotateCCW","opt_rotate","opt_direction","neighborsCount","rotatePage","jumpToPage","setScale","jHolders","jPages","zoomPages","showContextMenuForManyObjects","jClickedEl","types","menuType","resultMenuItems","getMassMenuItemsByTypes","_toggleMarkAsReadMenuItemText","getOrAddContextMenuFormCache","setMenuProperties","hasStatusBar","every","showContextMenuInternal","markAsReadMenuItem","enableItem","disableItem","setDefaultItem","defaultItem","showContextMenuForOneObject","listItem","menuOptions","specObjType","specObjTypeLen","contextMenuSettings","menusCache","jListParent","showReferenceContextMenu","showForFolderTreeItem","menuSettings","deleteItemById","updateContextMenu","props","copyItem","dd","resultMenuItemsId","currentItems","newResultMenuItems","newResultMenuItemsId","selectClickedElementAndUnselectOther","clickedId","hasClicked","enableDisableItems","isElementInFolderTree","g_IsReferenceReadOnly","newItems","changedItems","switchItemsForAgent","com","localcopy","current_fol","copyFolderLinkOnCreate","jFol","canCopy","pasteLinksOnCreate","pasteLinksToFolderOnCreate","canPaste","deleteLinksFromFolder","jParentFolder","parentFolderId","handleDeleteAction","setAutoCleanFolder","deleteLinksFromFolderOnCreate","canDelete","sendAsTaskAttachmentForFolderOnCreate","canSend","createAndAttachOnCreate","jAttachmentsToolbar","jAttachButton","showFolderInList","currentNeedToShow","currentFolderID","NeedToShow","showFolderInListOnCreate","RemoveUserStatusCookie","LoginUser","changePasswordCallback","showMessageCallback","showErrorCallback","returnUrl","loginFunc","AUTH_REQUEST_RESULT","CHANGE_DEFAULT_PASSWOD","SHOW_LOGON_MESSAGE","g_defaultPage","STD_AUTH_PROVIDERS","ChangeUserPassword","WINDOWS","SQL","NOVELL","textAreaSelector","buttonNames","isControlChangedBefore","enableButtonsOnFormChange","setButtonsEnablingOnEnabledMode","jRoute","jAdditionalIcons","jSelectStandardRoute","ChangeStandartRoute","isBindNeeded","TaskChange","toolBarButtonNames","enableButtonNames","toolBarButton","pages","selectedProvider","defaultRealm","jLogin","jPassword","jRealm","jChangePasswordLabel","jLoginLabel","jDefaultRealm","jProviders","jLoginContainer","jAdvancedSettingsContainer","waitIntervalID","initInputsFocus","initDomObjects","bindInputHandlers","onAuthenticationProviderChange","processUserName","toggleAdvancedSettings","formSubmit","isLoginDisabled","credentials","g_userCredentials","loginField","passwordField","realmField","enteredLogin","authenticatedUserName","showMessageOnLogin","showLogonMessage","showChangePasswordMessage","firstMsg","firstLogin","buttonSet","showLoginForm","findDomain","connectionString","domain","hasDomain","separators","domainInfo","hideMessageOnLogin","showPasswordChangeForm","showWait","hideWait","loginform","explorer","_jFilterContainer","_jSpinner","setCurrentState","openFolder","_initFolderTreeScroll","_initExpandFoldertree","_exec","FolderId","ShowCover","IsCoverOnly","FilterJs","Main","MainJs","hasCoverSelector","jCoverFrame","getTitle","refreshList","executeQuickSearch","collapseFolderTree","expandFolderTree","_initShowFolderInList","bindShowFoldersInListClick","jShowFoldersInListButton","selectedSelector","_setShowFolderInListState","loadAvailableTransformations","","availableTransformation","massExport","transformationValues","transformationIsSuccess","disableTransformation","archiveName","transformationName","selectedDocuments","exportSettings","CompressResult","PackToEsd","massExportVersionAsk","massExportLockAsk","massExportLockAll","formBuilder","lastactive","ask","nolock","showExportResult","exportFailedDocuments","DocumentsMassExportResult","failedDoc","currentDocument","exportDocuments","Settings","ArchiveName","TransformationName","res2","OnlyApprovingSignaturesType","versionFromForm","DocumentMassExportSettings","docSetting","showDialogForOneDocument","isLast","setting","needBlock","exportParam","askLock","docSettingAsked","updateExportSettings","prevSetting","removeDocFromExportSettings","HelpPageCode","exportHelpLink","toggleReadStatus","jobIds","unreadJobs","markAsRead","JobIDList","AgentSession","SessionID","g_UserContextID","UserLanguage","g_User","SystemLanguage","System","IsSecured","Host","WebLinkServer","g_MaxJsonRequestLength","NewJobsNotificationToken","ClientAffinity","_proxy","language","Language","Agent","_availablePlugins","isDisabledValue","isARM","ua","isBlackberry","_showState","booleanResult","transport","respObj","_showWaitMoreDialog","_showWaitMoreDialogTimeout","isAgentStartedAfterWait","cancelClickAndOnClose","waitForStart","_showAgentStartedInAnotherSessionDialog","_onConnectionLost","isRegistered","afterStartAgent","packageName","g_AgentInstallID","attemptNumber","_checkSessionStateLoop","attemptIndex","maxAttemptNumber","pingResponse","httpReady","_getHTTP","HTTP","getTransport","BaseTransport","_isCanceled","sessionID","startTime","getSessionRegistrationStatus","_send","_run","_getSessionID","uri","engine","_startInWebKit","_startInFirefox","_startDefault","getAgentServerUrl","ajaxParams","resultAjaxParams","respText","http","checkDocumentLocalCopies","certificateID","comment","isApprovingSign","isForSubstitute","substituteUserCode","onSignedCallback","pluginVersion","tokenPinCode","DocumentVersion","AdditionalInfo","PluginVersion","TokenPinCode","_signObject","signJob","jobID","signTask","encryptionType","_getObjectDecryptedKey","getTaskDecryptedKey","getJobDecryptedKey","transmittedRefs","addLink","getLinkSourceLocation","setAutoCleaningSettings","defaultSettings","autocleaningFolderList","defaultLinks","jSettingsAutocleaningEnable","jSettingsAutocleaningOnCompletion","jSettingsAutocleaningPeriod","jSettingsAutocleaningAfterdays","AllUsersNeedDeleteLinks","AllUsersLinkStoringPeriod","AutoCleanInbox","AutoCleanOutbox","saveAutoCleaningSettings","changeChildControlsCheckedState","jParentControl","parentControlIsChecked","managedFoldersIDs","jChildCheckbox","updateManagedFoldersLinks","saveTimeout","installAgent","InitializeAgentSession","startAgent","isOK","themes","jCheck","jDownload","jLaunch","jUploadLogFiles","applyPreviewSettings","isPreviewEnabled","isColoringRecordsEnabled","isFullscreenPreview","openDocForEditByDefault","openCardByDefault","g_isColoringRecordsEnabled","g_isFullscreenPreview","EnablePreview","EnableColoringRecords","UseFullScreenPreview","OpenCardByDefault","OpenDocForEditByDefault","jOpenFullscreenPreviewChk","jColoringRecordsEnabled","g_isColoringRecordsSettingsHidden","jSettingsAutocleaningDefault","AutocleaningDefaultChangeLink","changedObjects","switchAutoCleaningSettings","updateDefaultAutocleaningSettings","createAutocleaningSettingsFromDefaultSettings","enableAutoClean","cleanMode","linkStoringPeriod","CleanMode","LinkStoringPeriod","addAutoCleanFolder","removeAutoCleanFolder","cancelLock","setNewLanguage","callee","lang","langCaption","relogin","reloginLater","isPassthrough","enableRadioButton","jBtn","disableRadioButton","jOpenPreviewFromListChk","jOpenCardFromListChk","jOpenEditorFromListChk","jOpenDocForReadingDefaultChk","jOpenDocForEditingDefaultChk","loadThemesData","initThemesEvents","setCustomColor","rgbColor","opt_commit","applyTheme","changeTheme","jChildContainer","jParentCheckbox","checkedItemsLength","allItemsLength","ManagedFoldersIDs","bindButtonsEnablingOnMainSectionRequisitesKeypress","bindButtonsEnablingOnDetailSectionRequisitesKeypress","g_ReferencePlacementContext","currentTab","prefix","ReferenceDataSource","_cacheID","placementContext","CacheID","rowsQuery","globalLikeFilter","SelectExpression","IgnoreRestrictions","QueryContext","GlobalLikeFilter","forceSaveToServer","SelectListDataProvider","_cachedPages","lastLike","lastExpression","lastCurrentPeriodEnabled","specialRecords","CustomFilter","SelectExpr","Skip","queryInstanceID","LINK_CELL","getReferenceRecordStyle","styleRules","TextColor","G","B","IsBold","IsItalic","IsStrikeOut","forceReloadData","initReference","createReferenceRecordObj","getReferenceRecordRowAdditionalInfo","backgroundColorObj","BackgroundColor","data-refcode","oncontextmenu","referenceRecordsCellTemplate","columnRecId","referenceGrid","notifyObjectList","DetailsDataProvider","_DetailSectionNumber","ObjectLink","CardTypeCode","clearFilter","getGrid","newSavedFilters","reloadFiltersAndData","enableFilterActions","disableFilterActions","initFilterMenuItems","autoFilter","saveFilterItemIndex","prevLast","currentMenu","saveCurrentFilter","saveCurrentFilterAs","deleteFilter","newCurrentFilter","UnselectAllRecords","createNew","autoFilterName","selectedID","emptyItem","wellFormedFilters","btnsDisabled","updateFilterMenuWidget","jFilterMenuWidget","handlers","newVersion","g_Version","oldVersion","clearOldCache","clearOldTemplates","reportPage","ReportDialog","showFinishDialog","jCaptionContainer","jCaption","jSpinnerText","reportCaption","BaseSelectRequisite","linkPageName","_initControl","_jHidden","_bindOnPaste","_onPaste","clipboardData","pastedData","_parsePastedDataAndGetLinks","_loadExtendedDataForLinks","extendedLinks","_setValueByLinks","extendedLink","_convertLinkToReferenceSelectValue","pastedLines","_parsePastedLine","lineLowered","_webServerNameLowered","_sysCodeLowered","_parseSuitableUrl","DocumentSelectRequisite","_showAdditionalButtons","isAccessDenied","_hideAdditionalButtons","referenceSelectPluginSettings","DocumentSelectDataProvider","_attachResult","afterSelectCallback","isNeedCallAfterSelectCallbackOnClear","_link","documentName","idIndex","idStr","afterSelectFunc","isNeedCallFuncOnClear","jIcons","jOpenIco","jOpenBodyIco","openSelected","inputId","openSelectedBody","queryString","sortRequisite","iconName","g_ImgsByDocExt","editorIcon","signIcon","ReferenceRecordSelectRequisite","CreateSubTaskFromListActions","CreateSubTaskFromContextMenu","newTaskID","serviceName","serviceParams","newCard","pageUrl","ShowAskableParams","StandardRouteID","WorkID","WorkType","WorkflowBlock","currentDialog","ClearOpAfterError","ShowErrorOnAskableParams","errMessage","setStandardRouteCallback","ShowWarningForTaskRouteException","_showWarningFunc","_isModalShown","GetRouteSelectedItemsCount","inps","ms","isModalShown","dataObject","TaskRouteChanged","UsersRefName","UserGroupsRefName","StandardRoutesRefName","RouteLastObjectsRefName","isInModal","selItem","isNeedToAddLastObject","itemToReplace","MAX_ROUTE_PARTICIPANT_COUNT","CurrentUsersCount","ExpandUsersGroup","replaceGroup","isButtonClicked","yesBtn","InitTaskRouteModalWindowsOpts","customPlaceHolder","excludeGroups","customPlaceholder","OnAfterOpen","OnSelectedItem","ShowRouteModalWindowAfterLoad","BindRemoveLastObjectBtn","touchDev","rowIco","delBtn","ShowEncodedObjectError","InitAttachmentsResize","attd","minX","defaultAttachWidth","maxX","clamp","ShowOnlyCurrentRelatedTasks","jTreeElements","jArrow","jChildrenOfCurrentElement","jExpandCollapseArrow","jChildrenOfParentForCurrentElement","ScrollTreeToCurrentJob","jCurrentItem","currentItemPos","jSavedText","ShowTaskAttachmentsAssignRightDlg","userRights","ProceedTaskStarting","attachmentsRights","EncryptWithCertCheckbox","encryption","rightType","dropDownList","lastResponse","getUserDefaultCertificate","signingCustomWorkIds","_sendSignDataToAgent","certId","afterSignCallback","getErrorWithCustomWorkName","SignCustomWork","opt_silent","certificate","certArr","IsValid","successMessageCode","jTokenPinCode","jDocsTokenPinCode","tokenPinCodeId","pinCodeValue","GetEncryptedCustomWorkTree","GetDecryptedKey","GetEncryptedTaskTree","GetEncryptedJobTree","initialSavedTextSize","allowedPages","savedTextInitTop","jTextarea","isResize","handles","originalSize","minHeight","encryptTaskWithCert","encryptCheckBox","EncryptTaskWithCert","MainTaskID","ParseLocalCopyModifyDate","timedateSeparatorIndex","timePart","datePart","monthSeparatorIndex","daySeparatorIndex","month","year","hoursSeparatorIndex","minsSeparatorIndex","mins","secs","GetDocumentSizeAsString","sizeB","sizeMB","sizeKB","LocalCopies","hasOnlyOneCopy","documentVersion","localCopyModifyDate","EditDate","documentModifyDate","LastModifiedText","Size","4","GetFileNameFromDoc","ExportCert","certid","registerDisableShowUnreadControlForMobile","kindsToDisable","noKey","disableShowUnreadControl","jShowUnreadControl","getShowUnreadControl","showUnreadPick","RegisterDisableShowUnreadControlForMobile","DisableShowUnreadControl","MultiSelectModalWindow","rsInstance","withGroupColumn","selectedRecordsTable","filterSpinner","groupsListMessageBox","navigationKeyCodes","lastFilterValue","defaultRecordIconClass","defaultMarkedRecordIconClass","treeUrl","treeModeGroupIconClass","treeModeMarkedGroupIconClass","favoriteUserGroupIconClass","recordsListContextMenu","bindWindowOnInput","_lastRequests","_filterTimeout","_isNotAllRecordsShown","bindThis","convNewValues","convertRefSelectItemToThis","convertRefSelectItemIdToThisId","requestTree","sendRequests","fillAvailableGroups","sendRequest","onSuccessGetData","isLoaded","onErrorGetData","MULTI_SELECT_RECORD_COUNT","rowsLen","findSelectedItemById","showModalWindow","buildHtml","Label","hideContextMenu","_InitInternalObjects","fillItemsList","fillSelectedItemsTable","_InitEvents","_adjustModalWindowIfSmallScreen","_disableRefSelectInputIfAndroid","groupname","buildLeftArea","buildSelectedRecords","buildSelectedItemsTable","buildSelectedItemsTableRow","_BuildPlaceholderString","filterDisabledAttr","showGroupsListMessage","hideGroupsListMessage","buildItemsList","buildGroupsList","_updateRecordsList","showInfoInGroupsList","_isFilterEmpty","MarkSelectedRecordsInList","buildSingleGroup","g_group","recordName","Filtrator","_InitRecordsListEvents","msgBox","_InitScrollForTouchScreens","maxScrollY","recordsListScroll","_InitSelectedRecordsEvents","_InitLeftAreaEvents","_InitFilterInputEvents","UnhoverItem","ShowHideRecordsGroup","_InitItemsListContextMenu","_initHintEvents","pos","ShowContextMenuTablet","contextMenuBtn","_KeyPressEventHandler","MakeFilterRequest","RightArrowKeyPress","LeftArrowKeyPress","DeleteKeyPress","HideRecordsGroup","MoveCursor","GetNextItemToSelect","NextItem","ScrollListToHoveredItem","findSiblingOrParent","scrollListToHoveredItem","getItemsListHeight","ShowRecordsGroup","groupTitle","gr","grEl","changedValue","_CheckFilterValue","whiteSpaceCheck","_addItemCollectionToSelectedTable","MarkRecord","checkEmptyTable","favoritesItem","markedIconClass","emptyRow","c_CardFormCmd_AddDetailItem","c_CardFormCmd_DeleteDetailItem","startMonitoringTime","CardForm","someWait","CardFormInitMonitor","setFullScreenInPda","isExcelDocument","exts","isWordDocument","wordExts","getjSheetFrame","jMainFrame","jInnerFrame","getObjectDataType","npocomputer","modules","previewdoc","asposeSelectors","comments","commentAnchors","commentArea","wordDocumentSelector","insertedText","deletedText","WAforPDA","insertAfter","selectVersion","autoResizeFrame","scale","min-width","getSheetSize","min-height","onPickChangeScale","jBody","jSheet","jFooter","isActiveBtn","isTurnOnBtn","disableScreen","wrapperId","changePage","actionFromPage","hadlerParams","frameId","background-color","styleLink","isImage","commentsColumn","infoStr","scaleVal","frameLoad","fitTo","printDocFromPreview","iframeContent","print","setFrameHeight","docBody","frameBody","CreatePreviewScrollForiPad","AttachHandlersToTabs","initSelectedVersion","jScale","jScaleInput","setScaleIcon","disableTrackChanges","disableComments","fitWidth","fitHeight","fitWindow","fitToHeight","RefreshScrollInIFrame","scaleHeightText","scaleWidthText","scaleWindowText","newH","errorType","pageNumberField","newPageNumber","currEl","currPageNumber","toggleTrackChanges","toggleComments","actionUrl","objData","concatSymbol","allowCopyText","jButtonsPanel","buttonOffset","buttonsPanelOffset","buttonsPanelHeight","currFrame","isErrorMsg","childElementCount","errorObj","verId","hideError","Id","PageCount","docExtension","DocExtension","IsImage","errType","enableTrackChanges","frameDoc","commentButton","enableComments","delCommentsSelectors","getDeletedCommentsSelector","anchors","buttonTrack","reviewBlockWidth","docContainer","oldMarginStr","newMargin","getCommentIdByAnchorName","commentAreas","commentSelectors","ShowAll","copyLinksToClientBuffer","textHtml","textPlain","copy","text/html","text/plain","copyLinksInSessionStorage"],"mappings":"AAAA,GAAIA,cAEJ,SAAWC,GAQT,QAASC,KACFC,IACHA,GAAc,EACdF,EAAE,QAAQG,OAAOC,EAAMC,UAAU,SAAUC,GAAMA,EAAGC,sBAIxD,QAASC,GAAUJ,GACjBA,EAAMK,YAAY,iCAAiCC,SAGrD,QAASC,GAAUP,GACZA,EAAMQ,SAAS,mCAClBR,EAAMS,SAAS,iCACXT,EAAMU,KAAK,gBAAkBV,EAAMU,KAAK,eAAeC,QACzDX,EAAMU,KAAK,eAAeC,OAAOC,KAAKZ,EAAMU,KAAK,iBAKvD,QAASG,KACPjB,EAAE,0BAA0BkB,KAAK,WAC/BP,EAAUX,EAAEmB,SAIhB,QAASC,GAAUC,GACjB,MAAOA,GAAKC,SAGd,QAASC,KACPvB,EAAE,WACKA,EAAEwB,MACLxB,EAAE,QAAQK,UAAU,WAAcN,YAAY0B,WAvCpD,GAAIrB,GAAQJ,EAAE,0HACV0B,GAAO,EACPxB,GAAc,EAEdyB,EAAa,EAuCjB3B,GAAE4B,GAAGC,YAAc,SAAUC,EAAMC,GAIjC,MAHwB,mBAAbA,KACTA,EAAY,SACd/B,EAAEmB,MAAMa,IAAID,GAAWE,GAAGF,EAAW,WAAcD,EAAKI,OAAOf,KAAMf,KAC9De,KAGT,IAAIgB,IACFC,MAAO,IACPC,WAAY,GACZC,OAAQ,EACRC,OAAQ,GACRC,SAAU,GACVC,WAAY,iBAGd1C,aAAc,SAAU2C,EAAOC,GACxBjB,IACHA,GAAO,EACPH,KAEFJ,KAAKuB,MAAQA,EACb1C,EAAE4C,OAAOzB,KAAMgB,EAAUQ,IAG3B5C,YAAY0B,KAAO,SAAUoB,GAC3B,GAAIC,GAAI1C,CACJyC,KAAIC,EAAI9C,EAAE6C,GAAIE,QAAQ,6BAA6BC,SACvDrC,EAAUmC,IAGZ/C,YAAYkD,QAAU,WACpBhC,KAGFjB,EAAE4C,OAAO7C,YAAYmD,WACnBhB,OAAQ,SAAUb,EAAM8B,GACD,mBAAVA,KACTA,EAAS/C,GACXH,IACKG,EAAMQ,SAAS,iCAIlBO,KAAKiC,KAAK/B,EAAM8B,GAHhBxC,EAAUwC,IAKdC,KAAM,SAAU/B,EAAM8B,EAAQE,GAC5BlC,KAAKmC,cAAgBjC,CAErB,IAAIwB,GAAK7C,EAAEqB,EACPM,GAAa,IAAGA,GAAcA,GACb,mBAAVwB,KACTA,EAAS/C,GACXe,KAAKoC,UAAYJ,EACjBhC,KAAKqC,YAAcX,EACnBM,EAASnD,EAAEmD,GACXlD,IACAkD,EAAOrC,KAAK,cAAeK,MAC3BA,KAAKsC,cAAcN,EAAQE,EAC3B,IAAIK,GAASvC,KAAKwC,aAAavC,EAAUyB,GAAKM,GAAQ,EAKtD,IAJAO,EAAOE,IAAMC,KAAKC,MAAMJ,EAAOE,KAE3BF,EAAOE,IAAM,IAAGF,EAAOE,IAAM,IACjCzC,KAAK4C,cAAcZ,EAAQO,GAAQ,GAC/BvC,KAAK6C,OAAQ,CACf,GAAIC,GAAK9C,KAAK6C,OAAOhD,KAAKG,KAC1B,IAAI8C,KAAO,EACT,OAEAjE,EAAEwB,MACJxB,EAAE,QAAQkE,IAAI,YAAa,SAAU5D,GACnCA,EAAG6D,iBACH7D,EAAGC,kBACHP,EAAE,4BAA4BoE,UAIlC5D,EAAU2C,IAGZkB,OAAQ,SAAUX,EAAQP,EAAQmB,EAAYjB,GAmB5C,GAjBI1B,EAAa,IAAGA,GAAcA,GAC7BwB,IACHA,EAAS/C,GACXe,KAAKoC,UAAYJ,EACjBlD,IACAkD,EAAOrC,KAAK,cAAeK,MAC3BA,KAAKsC,cAAcN,EAAQE,GAC3BK,EAAOa,MAAQpC,EAASG,OACxBoB,EAAOE,KAAOzB,EAASI,OACvBmB,EAAOa,MAAQpD,KAAKmB,OACpBoB,EAAOE,KAAOzC,KAAKoB,OACd+B,IACHZ,EAASvC,KAAKwC,aAAaD,EAAQP,GAAQ,IAGzCO,EAAOE,IAAM,IAAGF,EAAOE,IAAM,IACjCzC,KAAK4C,cAAcZ,EAAQO,GACvBvC,KAAK6C,OAAQ,CACf,GAAIC,GAAK9C,KAAK6C,OAAOhD,KAAKG,KAC1B,IAAI8C,KAAO,EACT,OAEJzD,EAAU2C,IAGZM,cAAe,SAAUN,EAAQqB,GAE/B,GAAIC,GAAWzE,EAAE,WAAa0E,GAAI,eAAgBC,MAAO,oBACrDC,EAAe5E,EAAE,8CAA8C6E,IAAI,aAAc,UAAUA,IAAI,SAAU,WACzGC,EAAa9E,EAAE,4BAA4B6E,IAAI,WAAY,SAASpD,MACxEqD,GAAW3E,OAAOyE,GAElBH,EAASM,KAAK5D,KAAK6D,OAAO7B,EAAQnD,EAAEwB,KAAMgD,GAC1C,IAAIS,GAAiBjF,EAAE,4CAA4C6E,IAAI,aAAc,UAAUA,IAAI,SAAU,WACzGK,EAAelF,EAAE,8BAA8B6E,IAAI,WAAY,SAASpD,MAC5EyD,GAAa/E,OAAO8E,GACpB9B,EAAO4B,KAAKD,GAAY3E,OAAOsE,GAAUtE,OAAO+E,GAAcL,IAAI,SAAUJ,EAASU,WAGvFpB,cAAe,SAAUZ,EAAQO,EAAQ0B,GACvC,GAAIX,GAAWzE,EAAE,gBAAiBmD,GAC9B+B,EAAelF,EAAE,aAAcmD,GAC/B2B,EAAa9E,EAAE,WAAYmD,GAC3B8B,EAAiBC,EAAaG,KAAK,OACnCT,EAAeE,EAAWO,KAAK,OAE/BC,EAAQ,SAAUC,GACpB,GAAId,GAAWzE,EAAE,iBACbwF,EAAQ,CACZD,GAAIA,EAAIA,EAAIE,OAAOjB,MAEfe,EAAEG,WAEJF,EAAQD,EAAEG,WAAa,IACdH,EAAEI,SAEXH,GAASD,EAAEI,OAAS,EAGtB,IAAIC,GAAc,SAAUL,GAU1B,MATIA,GAAEhF,iBACJgF,EAAEhF,kBAEAgF,EAAEpB,gBACJoB,EAAEpB,iBAEJoB,EAAEM,cAAe,EACjBN,EAAEO,QAAS,EACXP,EAAEQ,aAAc,GACT,EAIT,OADAtB,GAASuB,UAAUvB,EAASuB,YAAc,GAAKR,GACxCI,EAAYL,GAGrB,IAAI7B,EAAOE,KAAO,GAAI,CACpB,GAAIA,GAAMF,EAAOE,GACbA,GAAMT,EAAOgC,SAAW,GAAKM,OAAOQ,cAAarC,GAAQA,EAAMT,EAAOgC,SAAWM,OAAOQ,YAAe,IAC3G9C,EAAO+C,KAAK,QAAS,IAAIrB,KAAMN,KAAMb,EAAOa,KAAO,KAAMX,IAAKA,EAAM,OACpEa,EAASyB,KAAK,QAAS,IACvBhB,EAAazD,OACbqD,EAAWrD,OACPgE,OAAOU,qBAAqBV,OAAOU,oBAAoB,iBAAkBb,GAAO,GACpFG,OAAOW,aAAeC,SAASD,aAAe,SAE9C,IAAIjD,EAAOgC,SAAWnF,EAAEyF,QAAQN,SAAW,GAUzC,GATAhC,EAAO0B,KACLN,KAAMb,EAAOa,KAAO,KACpBX,IAAK,OACLuB,OAAQnF,EAAEyF,QAAQN,SAAW,GAAK,KAClCmB,SAAU,QACVC,SAAU,WAEZtB,EAAeJ,KAAMzC,MAAOe,EAAOf,QAASoE,WAAY,WAAYpD,OACpEwB,EAAaC,KAAMzC,MAAOe,EAAOf,QAASoE,WAAY,WAAYpD,OAC7DpD,EAAEwB,KAMA,CACL,GAAIiF,GAAUC,GAAGC,IAAIC,YAAc/C,KAAKgD,IAAI,EAAGnD,EAAOa,KAAOpB,EAAOf,QAAU,GAAKsB,EAAOa,KAAO,EAMjG,IALApB,EAAO+C,KAAK,QAAS,IAAIrB,KAAMN,KAAMkC,EAAU,KAAM7C,IAAK,SAC1DT,EAAO0B,IAAI,SAAU7E,EAAEyF,QAAQN,SAAW,GAAK,MAC/CD,EAAaL,KAAMyB,SAAU,QAAS1C,IAAKT,EAAOgC,SAAW,OAAQ/B,OACrE0B,EAAWD,KAAMyB,SAAU,QAAS1C,IAAK,QAAYiB,IAAI,UAAW,UAAUzB,OAC9EqB,EAASI,KAAM0B,SAAU,OAAQO,WAAY,MAAO3B,OAAQhC,EAAOgC,SAAW,GAAI/C,MAAOpC,EAAEyF,QAAQrD,QAAU,MAAOvB,SAAS,yBACxH6F,GAAGC,IAAIC,YAAa,CAAwB,GAAIG,SAAQ,gBAAkBC,cAAc,IACzFvB,OAAOU,qBAAqBV,OAAOU,oBAAoB,iBAAkBb,GAAO,GACpFG,OAAOW,aAAeC,SAASD,aAAe,SAd9ClB,GAAaL,KAAMyB,SAAU,QAAS1C,IAAKT,EAAOgC,SAAW,EAAI,OAAQ/B,OACzE0B,EAAWD,KAAMyB,SAAU,QAAS1C,IAAK,QAAYR,OACrDqB,EAASI,KAAM0B,SAAU,SAAUpB,OAAQhC,EAAOgC,WAC9CM,OAAOwB,kBAAkBxB,OAAOwB,iBAAiB,iBAAkB3B,GAAO,GAC9EG,OAAOW,aAAeC,SAASD,aAAed,MAY3C,CACL,GAAImB,GAAUC,GAAGC,IAAIC,YAAc/C,KAAKgD,IAAI,EAAGnD,EAAOa,KAAOpB,EAAOf,QAAU,GAAKsB,EAAOa,KAAO,EACjGpB,GAAO+C,KAAK,QAAS,IAAIrB,KAAMN,KAAMkC,EAAU,KAAM7C,IAAK,SAC1Da,EAASyB,KAAK,QAAS,IACvBhB,EAAazD,OACbqD,EAAWrD,OACPgE,OAAOU,qBAAqBV,OAAOU,oBAAoB,iBAAkBb,GAAO,GACpFG,OAAOW,aAAeC,SAASD,aAAe,KAIlD3B,EAASyC,OAAO5B,GAChBJ,EAAad,MAAM,SAAU9D,GAC3BmE,EAASuB,UAAUvB,EAASuB,YAAcrE,KAE5CmD,EAAWV,MAAM,SAAU9D,GACzBmE,EAASuB,UAAUvB,EAASuB,YAAcrE,IAE5C,IAAIwF,EACJnH,GAAE,0BACCgC,IAAI,0BACJA,IAAI,0BACJC,GAAG,yBAA0B,WAAkBkF,GAAUC,aAAaD,KACtElF,GAAG,yBAA0B,SAAU3B,GACtC,GAAI+G,GAAarH,EAAEmB,MAEfmG,EAAShH,EAAGgH,MAGhB,KAAIA,EAAOC,wBAAX,CAIA,GAAIC,GAAoBH,EAAWhC,KAAK,oBACxC8B,GAAWM,WAAW,WACpB1H,YAAY0B,KAAK+F,GACb/B,OAAOwB,kBAAkBxB,OAAOU,oBAAoB,iBAAkBb,GAAO,GACjFG,OAAOW,aAAeC,SAASD,aAAe,MAC7C,SAKTpB,OAAQ,SAAU7B,EAAQuE,EAAUlD,GAClC,GAAImD,GAAO3H,EAAE,uEAAuEa,SAASM,KAAKqB,UAAUqC,IAAI,QAAS1D,KAAKiB,MAC1HjB,MAAKuD,IACPiD,EAAKzB,KAAK,KAAM/E,KAAKuD,GACvB,IAAIkD,GAAQzG,IAMZ,OALAnB,GAAEkB,KAAK0G,EAAMlF,MACX,WACEiF,EAAKxH,OAAOH,EAAE,aAAaG,OAAOH,EAAE,aAAaG,OAAOyH,EAAMC,WAAW1G,KAAMgC,EAAQnD,EAAEwB,KAAMgD,QAE/FxE,EAAEwB,MAAMmG,EAAKxH,OAAOH,EAAE,gHAAkH8H,EAAE,SAAW,eAClJH,GAGTE,WAAY,SAAUE,EAAI5E,EAAQuE,EAAUlD,GAC1C,GAAIoD,GAAQzG,KACR6G,IACJhI,GAAE4C,OAAOoF,EAAMD,EACf,IAAIE,GAAQL,EAAMM,IACE,oBAATD,KACTA,GAAUD,KAAMA,EAAMlG,KAAM8F,IAC1BI,EAAKG,WACPH,EAAKG,SAAW,GAAIC,UAASJ,EAAKG,WAEhCH,EAAKK,WACPL,EAAKK,SAAW,GAAID,UAASJ,EAAKK,UAEpC,IAAIC,GACAC,EAAMvI,EAAE,wCAGZ,IAFIgI,EAAKQ,UACPR,EAAKQ,SAASxH,KAAKuH,EAAKP,EAAMJ,GAC5BI,EAAKK,SAAU,CACjB,GAAII,GAAMT,EAAKK,SAASrH,KAAKiH,EAC7B,IAAkB,gBAAPQ,GACT,IAAK,GAAIC,KAAKD,GACZT,EAAKU,GAAKD,EAAIC,GAKpB,GAAwB,WAApBV,EAAKW,WAAT,CAWA,OAPIX,EAAKY,OACPZ,EAAKY,KAAOd,EAAEE,EAAKY,OAErBZ,EAAKa,UAAYb,EAAKa,WAAab,EAAKc,gBACpCd,EAAKa,WACPN,EAAI1H,SAAS,qCAEPmH,EAAKe,MAEX,IAAK,OACHR,EAAIxD,KAAK,sCAAwC+C,EAAEE,EAAKY,MAAQ,SAChE,MAGF,SACE,GAAII,GAAMhJ,EAAE,iFACRgI,GAAKiB,MACPX,EAAOtI,EAAE,YAAcgI,EAAKiB,KAAO,KAAOjB,EAAKV,OAAS,YAAcU,EAAKV,OAAS,IAAM,IAAM,SAChGiB,EAAIpI,OAAOmI,IAGXA,EAAOC,EAETD,EAAKnI,OAAO6I,GAERhB,EAAc,SAAGgB,EAAI9C,KAAK,QAAS8B,EAAc,SAErDA,EAAc,QAAIA,EAAc,SAAKA,EAAKkB,UAC1ClB,EAAKmB,SAAWnB,EAAKmB,UAAYnB,EAAKoB,WAClCpB,EAAc,SAChBO,EAAI1H,SAAS,6BACXmH,EAAKmB,UACPZ,EAAI1H,SAAS,8BACXmH,EAAKqB,UACPd,EAAI1H,SAAS,6BAEf,IAAIyI,GAAKtJ,EAAE,YACXgJ,GAAI7I,OAAOmJ,GAIXtB,EAAKuB,KAAOvB,EAAKuB,MAAQvB,EAAKwB,MAC9BxB,EAAKyB,MAAQzB,EAAKyB,OAASzB,EAAK0B,OAChC1B,EAAK2B,MAAQ3B,EAAK2B,OAAS3B,EAAK4B,OAEhC5B,EAAK6B,UAAY7B,EAAK6B,WAAa7B,EAAK8B,WACxC9B,EAAK+B,WAAa/B,EAAK+B,YAAc/B,EAAKgC,YAC1ChC,EAAKiC,WAAajC,EAAKiC,YAAcjC,EAAKkC,WAE1C,IAAIC,GAAUnK,EAAE,iDAAqDgI,EAAK6B,UAAY,eAAiB,IAAM,UAC7GP,GAAGnJ,OAAOgK,GACV7B,EAAO6B,EAGHnC,EAAK6B,WACPvB,EAAKnI,OAAOgB,KAAKiJ,YAAYpC,EAAK6B,UAAW7B,EAAK+B,WAAY/B,EAAKiC,WAAYjC,EAAKqC,mBAAmB,IAGzG/B,EAAKnI,OAAOgB,KAAKiJ,YAAYpC,EAAKuB,KAAMvB,EAAKyB,MAAOzB,EAAK2B,MAAO3B,EAAKsC,cAAc,GAEnF,IAAIC,GAAWvK,EAAE,sDAAsD+E,KAAKiD,EAAKY,KAGjF,IAFAU,EAAGnJ,OAAOoK,IAELvC,EAAKmB,SAAU,CAClB,GAAIqB,GAASC,EAAEC,MAAMlG,EACrBwE,GAAI5E,MAAM,SAAU9D,GAiBlB,MAhBIqK,MAAKC,oBAAsBlE,GAAGmE,IAAMnE,GAAGmE,GAAGC,YAE5CpE,GAAGmE,GAAGC,WAAWC,OACfC,KAAMtE,GAAGuE,cACTC,OAAQlD,EAAKmD,YAAcnD,EAAKoD,MAAQpD,EAAKtD,IAAM,kBACnD2G,KAAM,cACN/D,OAAQtH,EAAE4H,EAAMtE,eAAegI,IAAI,MAASrD,EAAMqB,IAAMrB,EAAMqB,GAAGgC,IAAI,MAIrEtD,EAAKuD,SAAWvD,EAAKiB,MAAQjB,EAAKG,YAChCH,EAAKuD,SAASvD,EAAKuD,QAAQvK,KAAKG,KAAM6G,EAAMJ,EAAO4C,GACnDxC,EAAKG,UAAUH,EAAKG,SAASnH,KAAKiH,GACtChH,KAEFX,EAAGC,mBACI,IAGX,GAAIyH,EAAKwD,QAAS,CAChB,GAAIC,GAAYzL,EAAE,uDAAuD6E,KAAMzC,MAAOjB,KAAKkB,WAAa,MACxGoJ,GAAUtL,OAAO,aAAegB,KAAKsB,WAAa,4CAClD6G,EAAGnJ,OAAOsL,EACV,IAAIC,GAAW1L,EAAE,2EAA2E6E,KAAM8G,OAAQC,SAASzI,EAAO0B,IAAI,UAAW,IAAM,GAC/ImD,GAAK6D,YAAc,WACjB,GAAIC,GAAQvD,EACR7E,EAAStC,EAAU0K,EACvBpI,GAAOa,MAAQuH,EAAM1J,QAAU,EAC/BsB,EAAOE,KAAO,CACd,IAAImI,GAAe3K,EAAU+B,EAC7BO,GAAOa,MAAQwH,EAAaxH,KAC5Bb,EAAOE,KAAOmI,EAAanI,IAC3BoE,EAAKwD,QAAQQ,WAAahE,EAC1BA,EAAKwD,QAAQnH,OAAOX,EAAQgI,GAAU,IAExC1D,EAAKiE,YAAc,WAActL,EAAU+K,IAC3CnD,EAAI2D,WAAWlE,EAAK6D,aACpBtD,EAAI4D,WAAWnE,EAAKiE,aACpB1D,EAAIpI,OAAOuL,GAEb1C,EAAIoD,MAAM,WACRpD,EAAInI,SAAS,UACZ,WACDmI,EAAIvI,YAAY,WAItB,MAAO8H,KAET6B,YAAa,SAAUb,EAAME,EAAOE,EAAOW,EAAc+B,GACvD,GAAIC,GAAQ,IACZ,IAAI/C,EAAM,CACR,GAAI/G,GAAW,0BAA4B6J,EAAU,kCAAoC,KAAO/B,EAAe,2BAA6BA,EAAe,GAGvJgC,GAFA/C,EAAKgD,QAAQ,kBAAmB,EACd,mBAAT9C,GACDzJ,EAAE,eAAiBwC,EAAW,YAAYqC,KAAM2H,gBAAiB,QAAUjD,EAAO,KAAMkD,oBAAsBhD,EAAS,OAAUE,EAAS,KAAM+C,iBAAkB,cAElK1M,EAAE,eAAiBwC,EAAW,UAAY+G,EAAO,QAGnDvJ,EAAE,eAAiBwC,EAAW,uBAAyB+G,EAAO,eAG1E,MAAO+C,IAET3I,aAAc,SAAUgJ,EAAIxJ,EAAQyJ,GAElC,GAAIrE,IAAQhE,KAAMoI,EAAGpI,MAAQqI,EAAWzL,KAAKmB,OAAS,GAAIsB,IAAK+I,EAAG/I,KAAOgJ,EAAWzL,KAAKoB,OAAS,IAC9FsK,EAAI1J,EAAOf,QACX0K,EAAI3J,EAAOgC,SACX4H,EAAKC,cACLC,EAAMjN,EAAE,QAAQkN,YAChBD,KACFF,GAAME,EAAM,GAEd,IAAIE,GAAKC,cAWT,OATI7E,GAAIhE,KAAOsI,EAAIE,EAAK,IACtBxE,EAAIhE,KAAOwI,EAAK,EAAIF,GAElBtE,EAAIhE,KAAO,IACbgE,EAAIhE,KAAO,IAERgE,EAAI3E,IAAM5D,EAAEyF,QAAQO,YAAe8G,EAAIK,GAAMR,EAAG/I,IAAM5D,EAAEyF,QAAQO,YAAc8G,GAAK,GAAKvE,EAAI3E,IAAMkJ,EAAI9M,EAAEyF,QAAQN,YACnHoD,EAAI3E,IAAM+I,EAAG/I,IAAMkJ,GAEdvE,GAET8E,iBAAkB,WAChB,MAAOlM,MAAKoC,WAAiD,UAApCpC,KAAKoC,UAAUsB,IAAI,eAE9CyI,YAAa,SAAU5I,GACrB,GAAI6D,GAAM,IAOV,OANAvI,GAAEkB,KAAKC,KAAKuB,MAAO,WACjB,GAAIvB,KAAKuD,IAAMA,EAEb,MADA6D,GAAMpH,MACC,IAGJoH,MAIVgF;ACjfHC,gBAAkBC,IAAOC,YAAe,2CAExCD,GAAGE,WACHF,GAAGG,WACHH,GAAGI,QACHJ,GAAGK,UAWHL,GAAGE,QAAQI,OAAU,uMAKrBN,GAAGE,QAAQK,UAAY,2VAgBvBP,GAAGE,QAAQM,MAAQ,4XAgBnBR,GAAGE,QAAQO,eAAiB,uGAY5BT,GAAGG,QAAQO,IAAM,iRAiBjBV,GAAGG,QAAQQ,OAAS,mcAgBpBX,GAAGI,KAAKM,IAAM,+FAadV,GAAGI,KAAKQ,QAAU,sIAOlBZ,GAAGK,OAAOQ,kBAAoB,8+BAiB9Bb,GAAGK,OAAOS,aAAe,wzBAczBd,GAAGK,OAAOU,mBAAqB,q8BAc/Bf,GAAGK,OAAOW,cAAgB,4iBAQ1BhB,GAAGK,OAAOY,iBAAmB,2FAE7BjB,GAAGK,OAAOa,eAAkB,2KAI5BlB,GAAGK,OAAOc,YAAc;ACrIxB,QAASC,QAAOC,EAAKC,GACnB,IAAKD,GAAOE,UAAUC,OAAS,EAAG,MAAOH,EACzC,IAAII,GAAUH,CAGd,QAFIC,UAAUC,OAAS,GAAuB,gBAAXC,MACjCA,EAAUC,MAAMjM,UAAUkM,MAAMpO,KAAKgO,UAAW,IAC3CF,EAAIO,QAAQ,gBAAiB,SAAUC,EAAGC,GAC/C,MAAIA,KAAOL,GACFA,EAAQK,GAERD,IAcb,QAASE,YAAWC,EAAMZ,GACxB,IAAK7O,EAAE0P,WAAY,MAAO,EAC1B,IAAIC,GAAKd,GAAU7O,EAAE0P,WAAWE,SAASC,oBAAoBC,UAC7D,OAAO9P,GAAE0P,WAAWF,WAAWG,EAAIF,GAarC,QAASM,gBAAeC,EAAMnB,GAC5B,IAAK7O,EAAE0P,aAAe1P,EAAEiQ,WAAY,MAAO,EAC3C,IAAa,OAATD,EAAe,MAAO,EAC1B,IAAIL,GAAIO,CAER,IAAIrB,EAAQ,CACV,GAAIsB,GAActB,EAAOuB,MAAM,IAC/BT,GAAKQ,EAAY,GAEfD,EADEC,EAAYlB,OAAS,EAClBkB,EAAY,GAEZ,OAGPR,GAAK3P,EAAE0P,WAAWE,SAASC,oBAAoBC,WAC/CI,EAAKlQ,EAAEiQ,WAAWL,SAASC,oBAAoBQ,UAGjD,IACIC,GADAC,EAAOL,EAAG3D,QAAQ,OAAQ,EAE1BiE,EAAQR,EAAKS,WACbC,EAAUV,EAAKW,aACfC,EAAUZ,EAAKa,YAGnB,IAAIL,EAAQ,GAAKE,EAAU,GAAKE,EAAU,EAAG,CAC3C,GAAIL,EAAM,CACR,GAAIO,GAASN,EAAQ,EACN,KAAXM,IACFA,EAAS,IACXR,EAAUJ,EACLb,QAAQ,MAAO0B,SAASD,IACxBzB,QAAQ,KAAMyB,GACdzB,QAAQ,MAAO0B,SAASL,IACxBrB,QAAQ,KAAMqB,GACdrB,QAAQ,MAAO0B,SAASH,IACxBvB,QAAQ,KAAMuB,GACdvB,QAAQ,MAAQmB,GAAS,GAAK,KAAO,UAE1CF,GAAUJ,EACLb,QAAQ,MAAO0B,SAASP,IACxBnB,QAAQ,KAAMmB,GACdnB,QAAQ,MAAO0B,SAASL,IACxBrB,QAAQ,KAAMqB,GACdrB,QAAQ,MAAO0B,SAASH,IACxBvB,QAAQ,KAAMuB,EAErB,OAAOpB,YAAWQ,EAAML,GAAM,IAAMW,EAEpC,MAAOd,YAAWQ,EAAML,GA+J5B,QAASqB,WAAUvB,GACjB,MAAOhK,QAAOwL,cAAcxB,GAmB9B,QAASyB,SAAQpC,GACf,IAAKA,EAAK,MAAO,EACjBqC,GAAI,SACJrE,EAAI,CACJ,KAAK,GAAIpE,GAAI,EAAGA,EAAIoG,EAAIG,OAAQvG,IAAKoE,GAAS,IAAJA,EAAUlB,SAASkD,EAAIsC,WAAW1I,GAAI,KAAOyI,CACvF,OAAOrE,GAoQT,QAASuE,oBAAmBC,GAC1B,OAAQA,GACN,IAAKC,aAAYC,UACf,MAAO,MACT,KAAKD,aAAYE,OACf,MAAO,KACT,KAAKF,aAAYG,KACf,MAAO,MACT,KAAKH,aAAYI,IACf,MAAO,KACT,KAAKJ,aAAYK,iBACf,MAAO,KACT,KAAKL,aAAYM,IACf,MAAO,KACT,KAAKN,aAAYO,QACf,MAAO,SACT,SACEpL,GAAGqL,MAAM,gBAAkBT,GAG/B,MAAO,MAaT,QAASU,wBAAuBC,GAC9B,IAAKA,EAAY,MAAO,KACxB,QAAQA,EAAWC,eACjB,IAAK,OACH,MAAOX,aAAYC,SACrB,KAAK,MACH,MAAOD,aAAYE,MACrB,KAAK,OACH,MAAOF,aAAYG,IACrB,KAAK,MACH,MAAOH,aAAYI,GACrB,KAAK,MACH,MAAOJ,aAAYK,gBACrB,KAAK,MACH,MAAOL,aAAYM,GACrB,KAAK,UACH,MAAON,aAAYO,OACrB,SACEpL,GAAGqL,MAAM,gBAGb,MAAO,MAggBT,QAASI,cAAaC,EAAKC,GACzB,GAAIC,GAAI,GACJxR,GAASyR,KAAQH,EAAI/C,QAAQ,IAAM,OAEvC,OADAgD,KAAiBA,GAAeA,EAC5BA,EACK3L,GAAG8L,IAAIxR,KAAK,oCAAqCF,IAExD4F,GAAG8L,IAAIC,SAAS,oCAAqC3R,GAAM4R,KAAK,SAAUnK,GACxE+J,EAAI/J,EAAIoK,IAEHL,GAWX,QAASM,kBAAiBC,EAAKC,GAC7B,GAC8BpK,GAD1BqK,EAAQ,iEAAiE3C,MAAM,IAC/E4C,EAAQD,EAAOE,IAGnB,IAFAH,EAAQA,GAASE,EAAM/D,OAEnB4D,EAEF,IAAKnK,EAAI,EAAGA,EAAImK,EAAKnK,IAAKuK,EAAKvK,GAAKsK,EAAM,EAAInP,KAAKqP,SAAWJ,OACzD,CAEL,GAAIK,EAQJ,KALAF,EAAK,GAAKA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAM,IAC3CA,EAAK,IAAM,IAINvK,EAAI,EAAGA,EAAI,GAAIA,IACbuK,EAAKvK,KACRyK,EAAI,EAAoB,GAAhBtP,KAAKqP,SACbD,EAAKvK,GAAKsK,EAAY,IAALtK,EAAgB,EAAJyK,EAAW,EAAMA,IAKpD,MAAOF,GAAKG,KAAK,IA0DnB,QAASC,iBAEPrT,EAAE,iBAAiByB,OAEnBzB,EAAE,oBAAoByB,OAsDxB,QAAS6R,QAAOzQ,GACd,GAA4B,OAAxB6D,GAAGC,IAAI4M,QAAQnI,KAAnB,CAOA,IAAK,GALDoI,GAAQ,6BACRC,EAAQ,+BAERC,KACAC,EAAO9Q,EAAG+Q,qBAAqB,OAC1BlL,EAAI,EAAGA,EAAIiL,EAAK1E,OAAQvG,IAAK,CACpC,GAAImL,GAAUF,EAAKjL,GACfoL,EAASD,EAAQE,WACjBC,EAAUF,EAAOG,aAAa,eAAiBH,EAAOG,aAAa,QAEnEC,EAAS7N,SAAS8N,gBAAgBX,EAAO,MAC7CU,GAAOE,aAAa,QAASP,EAAQQ,UAAUC,QAC/C,IAAIC,GAAYlO,SAAS8N,gBAAgBX,EAAO,MAChDe,GAAUC,eAAef,EAAO,OAAQO,GACxCE,EAAOO,YAAYF,GAEnBb,EAAcgB,MAAOb,QAASA,EAASK,OAAQA,IAEjDR,EAAciB,QAAQ,SAAUxB,GAC9B,GAAIyB,GAASzB,EAAEU,QAAQgB,UACvBD,GAAOE,aAAa3B,EAAEe,OAAQf,EAAEU,SAChCe,EAAOG,YAAY5B,EAAEU,YA9xCzB,GAAImB,2BAA4B,KAK5BC,2BAA6B,IA8H7BC,cAAgBjE,cAAgB,SAAUkE,GAE5C,GAAIC,GACAzC,EACAxB,EACAkE,EACAC,EACAC,EACA7M,EACAG,EACAgG,EAGA2G,EAFAC,EAAgB,QAChBC,EAAW,OAQf,IAJEN,EADkB,WAAhBpV,EAAE+I,KAAKoM,GACHnV,EAAE2V,KAAKR,GAEPnV,EAAE2V,KAAKR,EAAIC,QAEdA,EAAK,MAAO,KAEjB,IAA8B,IAA1BA,EAAI7I,QAAQ,UACd,MAAO,IAAIqJ,MAAKhK,SAASwJ,EAAI/F,QAAQ,SAAU,IAAIA,QAAQ,KAAM,IAAK,IAGxEmG,GAAc3F,mBAEM,WAAhB7P,EAAE+I,KAAKoM,KACLA,EAAI5I,QAAQ,QAAS,IACvBiJ,EAAcC,GAGZN,EAAI5I,QAAQ,QAAS,IACvBiJ,EAAcE,GAIlB,IAQIrF,GARAwF,EAAU7V,EAAE0P,WAAWE,SAAS4F,GAChC3M,EAAYgN,EAAQC,cACpBjH,EAASgH,EAAQ/F,WAAWM,MAAMvH,GAClCwH,EAAarQ,EAAEiQ,WAAWL,SAAS4F,GAAanF,WAAWD,MAAM,KAEjE2F,EAAQ,GAAIH,MACZI,EAAMZ,EAAIhF,MAAMvH,GAGhBmH,IAEJ,KAAKtH,EAAI,EAAGA,EAAImG,EAAOI,OAAQvG,IAC7BmG,EAAOnG,GAAK1I,EAAE2V,KAAK9G,EAAOnG,IAAIuN,UAAU,EAAG,EAI7C,IAAoB,IAAfD,EAAI/G,QAAkB+G,EAAI,IAAMpK,SAASoK,EAAI,GAAI,IAAM,GAAKpK,SAASoK,EAAI,GAAI,KAAO,IAAuB,IAAfA,EAAI/G,SAAiB+G,EAAI,GAOxH,MANArD,GAAIyC,EACJjE,EAAI4E,EAAMG,WACVb,EAAIU,EAAMI,cACVb,EAAU,GAAIM,MAAKP,EAAGlE,EAAI,EAAG,GAC7BoE,EAAc3J,SAAS0J,EAAQc,UAAW,IAEtCb,GAAe5C,GAAKA,EAAI,EACnB,GAAKiD,MAAKP,EAAGlE,EAAGwB,GAEhB,IAKX,IAAoB,IAAfqD,EAAI/G,QAAkB+G,EAAI,IAAuB,IAAfA,EAAI/G,QAAkB+G,EAAI,KAAOA,EAAI,GAO1E,MANArD,GAAIqD,EAAInH,EAAOtC,QAAQ,MACvB4E,EAAIvF,SAASoK,EAAInH,EAAOtC,QAAQ,MAAO,IAAM,EAC7C8I,EAAIU,EAAMI,cACVb,EAAU,GAAIM,MAAKP,EAAGlE,EAAI,EAAG,GAC7BoE,EAAc3J,SAAS0J,EAAQc,UAAW,IAEtCb,GAAe5C,GAAKA,EAAI,GAAKxB,GAAK,IAAMA,GAAK,EACxC,GAAKyE,MAAKP,EAAGlE,EAAGwB,GAEhB,IAIX,IAAkB,GAAdqD,EAAI/G,QAAe+G,EAAIzJ,QAAQ,MAAO,EAAI,CAsB5C,GArBAoG,EAAIqD,EAAInH,EAAOtC,QAAQ,MACvB4E,EAAIvF,SAASoK,EAAInH,EAAOtC,QAAQ,MAAO,IAAM,EAC7C8I,EAAIzJ,SAASoK,EAAInH,EAAOtC,QAAQ,MAAO,IAGnC8I,EAAI,MACMA,GAARA,EAAI,GAAS,KAAgB,KAI/BA,EAAI,OACNA,EAAI,MAGNC,EAAU,GAAIM,MAAKP,EAAGlE,EAAI,EAAG,GAC7BoE,EAAc3J,SAAS0J,EAAQc,UAAW,IAE1CpG,EAAO,KAGPqG,QAAUrW,EAAE2V,KAAKP,GAAKhF,MAAM,KACxBiG,QAAQpH,OAAS,GAAKoH,QAAQ9J,QAAQ,MAAO,EAAI,CAMnD,IAJA+I,EAAUe,QAAQC,OAAO,EAAG,GAC5BtG,EAAOqG,QAAQ,GAGV3N,EAAI,EAAGA,EAAI2H,EAAWpB,OAAQvG,IACjC2H,EAAW3H,GAAK1I,EAAE2V,KAAKtF,EAAW3H,IAAIuN,UAAU,EAAG,EAGrDjG,GAAOuG,UAAUF,QAAShG,GAI5B,MAAIkF,IAAe5C,GAAKA,EAAI,GAAKxB,GAAK,IAAMA,GAAK,EAC3CnB,EACK,GAAK4F,MAAKP,EAAGlE,EAAGwB,EAAG3C,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAG1C,GAAK4F,MAAKP,EAAGlE,EAAGwB,GAGf,KAGd,MAAO,OAkDL6D,QAEFC,OAAO,EAEPC,OAAO,GAWLC,aAEFC,KAAM,OAENC,IAAK,OAYHC,SAEFC,UAAW,sBAEXC,WAAY,qCAaVC,iBAEFC,IAAK,GAELC,WAAY,QAEZC,iBAAkB,OAahB7F,aAEFO,QAAS,GAETL,OAAQ,EAERD,UAAW,EAEXG,IAAK,EAELD,KAAM,EAEN2F,gBAAiB,EAEjBxF,IAAK,EAELyF,UAAW,EAEXC,OAAQ,EAERC,OAAQ,EAER5F,iBAAkB,EAElB6F,KAAM,GAENC,OAAQ,GAERC,cAAe,IAEfC,OAAQ,IAERC,OAAQ,KAYNC,YAEFC,KAAM,EAENC,QAAS,EAETC,KAAM,EAENC,WAAY,EAEZC,QAAS,EAETC,UAAW,GAWTC,gBAEFC,MAAO,EAEPC,KAAM,EAENC,MAAO,EAEPC,KAAM,EAENC,OAAQ,EAERpB,UAAW,EAEXqB,KAAM,EAENC,QAAS,EAETC,cAAe,EAEfC,SAAU,EAEVC,YAAa,IAUXC,qBAEFC,eAAgB,EAEhBC,gBAAiB,EAEjBC,kBAAmB,EAEnBC,gBAAiB,EAEjBC,yBAA0B,EAW5BC,uBAAwB,SAAUC,GAChC,OAAQ,GAAKA,GACX,IAAK,IACH,MAAO,MACT,KAAK,IACH,MAAO,OACT,KAAK,IACH,MAAO,MACT,KAAK,IACH,MAAO,QACT,KAAK,IACH,MAAO,WACT,KAAK,IACH,MAAO,MACT,KAAK,IACH,MAAO,SACT,KAAK,IACH,MAAO,cACT,KAAK,IACH,MAAO,UACT,KAAK,KACH,MAAO,eAIbC,wBAA0B,SAAUD,GAClC,OAAQA,GACN,IAAK,OACH,MAAO,EACT,KAAK,QACH,MAAO,EACT,KAAK,OACH,MAAO,EACT,KAAK,SACH,MAAO,EACT,KAAK,YACH,MAAO,EACT,KAAK,OACH,MAAO,EACT,KAAK,UACH,MAAO,EACT,KAAK,eACH,MAAO,EACT,KAAK,WACH,MAAO,EACT,KAAK,aACH,MAAO,KAuFb,IAAIE,qBACAC,YAAcD,qBAEhBE,WAAY,EAEZC,SAAU,GAWRC,OAEFC,KAAM,EAENC,KAAM,EAENC,QAAS,EAETC,KAAM,GAWJC,kBAEFhD,IAAK,EAELiD,OAAQ,EAERC,aAAc,GAWZC,UAEF1I,IAAK,EAEL2I,OAAQ,EAERC,YAAa,GAWXC,cAEFC,QAAS,EAETC,MAAO,EAEPC,KAAM,GAWJC,qBAEFpJ,UAAW,EAEXG,IAAK,EAELD,KAAM,EAEN2F,gBAAiB,EAEjBxF,IAAK,GAWHgJ,iBAAmBC,aAErBC,MAAO,EAEPC,OAAQ,EAERC,UAAW,EAEXC,cAAe,EAEfC,YAAa,EAEbC,UAAW,EAEXxD,OAAQ,GAYNyD,WAEFX,MAAO,IAEPY,KAAM,IAENX,KAAM,IAENY,MAAO,KAYLC,eAEFC,KAAM,IAEN3B,KAAM,KAYJ4B,eAEFC,GAAI,WAEJC,OAAQ,gBAYNC,sBAEFC,KAAM,EAENC,OAAQ,EAERC,MAAO,GAWLC,cAEFrD,QAAS,EAETmD,OAAQ,EAERrD,OAAQ,EAERwD,QAAS,EAETC,UAAW,EAEXzK,KAAM,EAENC,IAAK,EAELF,OAAQ,EAERqH,SAAU,EAEVlH,iBAAkB,EAElB6F,KAAM,GAEN2E,WAAY,GAEZC,UAAW,GAEXC,mBAAoB,GAEpBC,kBAAmB,GAEnBC,kBAAmB,GAEnBC,mBAAoB,GAEpBC,qBAAsB,GAEtBC,gBAAiB,GAEjBC,eAAgB,GAEhBC,kBAAmB,GAEnBC,oBAAqB,GAErBC,4BAA6B,GAE7BC,gBAAiB,GAEjBC,sBAAuB,GAEvBC,qBAAsB,GAUxBC,QAAOja,UAAUka,MAAQ,SAAUC,GACjC,MAAM,GAAKlc,KACPA,KAAKmc,OACHD,EAAI,EAAUlc,KAAK,GAAK,MACrBA,KAAKmc,OAAO,EAAGD,EAAI,IAAMlc,KAAK8N,QAAUoO,EAAI,MAAQ,IAEtD,GAAKlc,KALa,IAe3Bgc,OAAOja,UAAUqa,aAAe,SAAUC,GACxC,GAAIC,IACFC,EAAK,IACL7Q,EAAK,IACLtH,EAAK,IACL4N,EAAK,IACLwK,EAAK,IACLtI,EAAK,IACLuI,EAAK,IACLlV,EAAK,IACLmV,EAAK,IACL/a,EAAK,IACLgb,IAAK,IACLC,IAAK,IACLC,EAAK,IACL1O,EAAK,IACLqD,EAAK,IACLsL,EAAK,IACLC,EAAK,IACLpR,EAAK,IACLqR,EAAK,IACLC,EAAK,IACLC,EAAK,IACLC,IAAK,IACLC,IAAM,IACNC,EAAK,IACLC,EAAK,IACLC,EAAK,IACLC,EAAK,IACLC,EAAK,IACLvB,EAAK,IACLlM,EAAK,IACL0N,IAAK,IACLC,IAAK,IACLC,IAAM,IACNC,IAAM,IAGR,OAAOvU,GAAEtJ,MAAMsc,IAAI,SAAUwB,GAC3B,MAAOxB,GAAIwB,KACV7L,KAAK,KAWV+J,OAAOja,UAAUgc,WAAa,SAAUC,EAAQC,GAC9C,MAAIje,MAAKkO,QAAgBlO,KAAKkO,QAAQ,GAAIgQ,QAAOF,EAAQ,KAAMC,GAAe,IAClEje,MASdgc,OAAOja,UAAUoc,WAAa,WAC5B,GAAIC,IACFC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLpB,IAAK,QACLQ,IAAK,SAGP,OAAO5B,QAAOhc,MAAMkO,QAAQ,aAAc,SAAUC,GAClD,MAAOiQ,GAAUjQ,MAYrB6N,OAAOja,UAAU0c,UAAY,WAC3B,MAAIze,MAAKkO,QAAgBlO,KAAKkO,QAAQ,iBAAkB,IACjDlO,MAWTgc,OAAOja,UAAU2c,aAAe,WAC9B,MAAI1e,MAAKkO,QAAgBlO,KAAKkO,QAAQ,OAAQ,QAClClO,MAUdgc,OAAOja,UAAU4c,eAAiB,WAChC,MAAI3e,MAAKkO,QAAgBlO,KAAKkO,QAAQ,kBAAmB,KAC7ClO,MASuB,kBAA1Bgc,QAAOja,UAAUyS,OAC1BwH,OAAOja,UAAUyS,KAAO,WACtB,MAAOxU,MAAKkO,QAAQ,aAAc,MASjC8N,OAAOja,UAAU6c,UACpBC,OAAOC,eAAe9C,OAAOja,UAAW,YACtCgd,MAAO,SAAUC,EAAc7Z,GAC7B,GAAI8Z,GAAgBjf,KAAKkf,YACRC,SAAbha,GAA0BA,EAAW8Z,EAAcnR,UACrD3I,EAAW8Z,EAAcnR,QAE3B3I,GAAY6Z,EAAalR,MACzB,IAAIsR,GAAYH,EAAc7T,QAAQ4T,EAAc7Z,EACpD,OAAOia,MAAc,GAAMA,IAAcja,KAY/C6W,OAAOja,UAAUsd,sBAAwB,WACvC,IAAKrf,KAAKkO,QAAS,MAAOlO,KAI1B,KAAK,GAHD2N,GAAM3N,KACNsf,GAAe,EACfC,EAAS,GACJhY,EAAI,EAAGA,EAAIoG,EAAIG,OAAQvG,IAChB,KAAVoG,EAAIpG,IAAc+X,EAGF,MAAX3R,EAAIpG,IAAeA,EAAI,EAAKoG,EAAIG,QACrB,KAAdH,EAAIpG,EAAI,IAA2B,KAAdoG,EAAIpG,EAAI,IAA2B,KAAdoG,EAAIpG,EAAI,IAA2B,KAAdoG,EAAIpG,EAAI,IAA2B,KAAdoG,EAAIpG,EAAI,KAC9F+X,GAAgBA,EAChB/X,GAAK,GALPgY,EAAS5R,EAAImH,UAAU,EAAGvN,GAAK,IAAMoG,EAAImH,UAAUvN,EAAI,EAAGoG,EAAIG,OAUlE,OAAe,KAAXyR,EAAsB5R,EAAIO,QAAQ,MAAO,KAAKA,QAAQ,MAAO,SAC1DqR,EAAOrR,QAAQ,MAAO,KAAKA,QAAQ,MAAO,SAWnD,IAAIsR,eAAgB,SAAUC,GAC5B,GAAIC,GAAO,yDACPvR,EAAIsR,EAAKP,WAAWhR,QAAQ,WAAY,IACxC8B,EAAI0P,EAAKC,KAAKxR,EAClB,KAAK6B,IAAMA,EAAElC,OAAQ,MAAO,KAC5B,IAAI8R,IACF3V,KAAM+F,EAAE,IAAM,GACd6P,KAAM7P,EAAE,GAAG9B,QAAQ,OAAQ,IAAIe,MAAM,KACrCzI,KAAMwJ,EAAE,IAAM,IAGZzG,EAAQtC,SAASlF,UAAU+d,YAAYC,MAAM/f,QAASggB,OAAOJ,EAAKC,KAAMD,EAAKpZ,MACjF,KAAK,GAAI4H,KAAOqR,GACVA,EAAKQ,eAAe7R,KACtB7E,EAAM6E,GAAOqR,EAAKrR,GAGtB,OAAO7E,KAqET,WACE,GAAI2W,GAAI,GAAIzL,MAAK,4BACZyL,IAAY,gBAANA,EAyBTzL,KAAK0L,QAAU,SAAUhS,GACvB,MAAO,IAAIsG,MAAKtG,IAzBlBsG,KAAK0L,QAAU,SAAUhS,GACvB,GAAIiS,GAAKC,EACTC,EAAK,oEACL3e,EAAI2e,EAAGX,KAAKxR,MACZ,IAAIxM,EAAE,GAAI,CACRye,EAAMze,EAAE,GAAGsN,MAAM,KACjB,KAAK,GAAI1H,GAAI,EAAGZ,EAAIyZ,EAAItS,OAAQvG,EAAIZ,EAAGY,IACrC6Y,EAAI7Y,GAAKkD,SAAS2V,EAAI7Y,GAAI,KAAO,CAInC,OAFA6Y,GAAI,IAAM,EACVA,EAAM,GAAI3L,MAAKA,KAAK8L,IAAIR,MAAMtL,KAAM2L,IAC/BA,EAAInL,WACLtT,EAAE,KACJ0e,EAA2B,GAArB5V,SAAS9I,EAAE,GAAI,IACjBA,EAAE,KAAI0e,GAAM5V,SAAS9I,EAAE,GAAI,KACnB,KAARA,EAAE,KAAW0e,IAAM,GACnBA,GAAID,EAAII,cAAcJ,EAAIK,gBAAkBJ,IAE3CD,GAPoBM,IAS7B,MAAOA,SAcbzZ,SAASlF,UAAU4e,SAAW,SAAUlB,GACtC,GAAImB,GAAgB5gB,IACpB,OAAO,YAEL,MADAA,MAAK4gB,cAAgBA,EACdnB,EAAKM,MAAM/f,KAAM6N,YAwB5B,IAAIgT,iCAEFC,KAAM,EAENlI,KAAM,GAYJmI,iBAEFC,uBAAwB,EAExBC,qBAAsB,EAEtBC,aAAc,EAEdC,cAAe,EAEfC,UAAW,EAEXC,iBAAkB,GAElBC,aAAc,GAEdC,eAAgB,GAEhBC,mBAAoB,IAEpBC,YAAa;ACnxCf,YAWA,IAAIC,YAAaC,MAAMlgB,QAErBlB,KAAM,SAAUZ,GACTK,KAAK4hB,UACR5hB,KAAK4hB,YAEP5hB,KAAK6hB,KAAKH,WAAWI,MAAMC,WAAY/hB,OAKzCkT,UAAW,aAGX0O,QAAS,KASTI,gBAAiB,SAAUnC,KAQ3BoC,cAAe,SAAUhY,GAMvB,MALAA,GAAO,GAAKA,EACZA,EAAOA,EAAK0U,iBAAiBuD,cACH,OAAtBjY,EAAKkS,OAAO,EAAG,KACjBlS,EAAOA,EAAKkS,OAAO,EAAGlS,EAAK6D,SAEtB7D,GAYTkY,KAAM,SAAUlY,EAAMwV,EAAM2C,GAmB1B,MAlBAnY,GAAOjK,KAAKiiB,cAAchY,GAEtB3F,OAAO+d,uBAETC,QAAQC,IAAI,mBAAqBtY,EAAM4D,WAGpC7N,KAAK4hB,UACR5hB,KAAK4hB,YAGH5hB,KAAK4hB,UACF5hB,KAAK4hB,QAAQ3X,KAChBjK,KAAK4hB,QAAQ3X,OAEfwV,EAAS2C,EAAcvjB,EAAEiI,MAAM2Y,EAAM2C,GAAe3C,EACpDzf,KAAK4hB,QAAQ3X,GAAMsJ,KAAKkM,IAEnBzf,MAWTwiB,OAAQ,SAAUvY,GAQhB,MAPAA,GAAOjK,KAAKiiB,cAAchY,GAEtB3F,OAAO+d,uBAETC,QAAQC,IAAI,qBAAuBtY,EAAM4D,WAE3C7N,KAAK4hB,QAAQ3X,MACNjK,MAYT6hB,KAAM,SAAU5X,GACdA,EAAOjK,KAAKiiB,cAAchY,GAGtB3F,OAAO+d,wBACJ9c,GAAGC,IAAIid,WACVH,QAAQC,IAAI,mBAAqBtY,EAAM4D,WAQ3C,IAAIgS,GAAOhhB,EAAE6jB,UAAU7U,UAEvB,IADAgS,EAAK1K,OAAO,EAAG,GACXnV,KAAK4hB,SAAW5hB,KAAK4hB,QAAQ3X,GAAO,CACtC,IAAK,GAAI1C,GAAI,EAAGmK,EAAM1R,KAAK4hB,QAAQ3X,GAAM6D,OAAQvG,EAAImK,EAAKnK,IACxD,GAAI1I,EAAE8jB,WAAW3iB,KAAK4hB,QAAQ3X,GAAM1C,IAAK,CACvC,GAAIyK,GAAIhS,KAAK4hB,QAAQ3X,GAAM1C,GAAGwY,MAAM/f,KAAM6f,EAC1C,IAAgB,mBAAL7N,KAAqBA,EAC9B,OAAO,EAIb,OAAO,IAkBX4Q,QAAS,SAAUhiB,EAAWiiB,GAC5BjiB,EAAYZ,KAAKiiB,cAAcrhB,GAG3B0D,OAAO+d,wBACJ9c,GAAGC,IAAIid,WACVH,QAAQC,IAAI,sBAAwB3hB,EAAWiN,WAOnD,IAAIiV,IAAQ,EACRC,EAAK/iB,KACL6f,EAAOhhB,EAAE6jB,UAAU7U,UACvBgS,GAAK1K,OAAO,EAAG,EAGf,IAAI6N,GAAkB,SAAUC,GAC9B,GAAqB,mBAAVA,IAAyBA,EAAQ,CAC1CJ,EAAS9C,MAAMgD,EAAIlD,EAEnB,IAAIqD,GAAUrkB,EAAEskB,OAAO,QAAUviB,GAAYif,EAC7CkD,GAAGlB,KAAK9B,MAAMgD,EAAIG,GAEpBJ,GAAQ,GAGNI,EAAUrkB,EAAEskB,OAAO,SAAWviB,EAAWoiB,GAAkBnD,GAC3D7N,EAAI+Q,EAAGlB,KAAK9B,MAAMgD,EAAIG,EACrBJ,IACHE,EAAgBhR,IAYpBoR,SAAU,WACR,MAAOvkB,GAAEwkB,OAAOrjB,SAYlB8hB,OACEC,WAAY;ACnNhB,YAUA,IAAIuB,gBAEFnM,MAAO,EAEPoM,UAAW,EAEX5I,KAAM,EAEN6I,OAAQ,EAER7K,KAAM,IAUJ8K,cACFC,YAAa,EACbC,IAAK,EACLC,eAAgB,GAWdC,gBAAkBnC,WAAWjgB,QAM/BlB,KAAM,SAAUZ,GACdK,KAAK8jB,OAAOnkB,GAERkO,UAAUC,OAAS,GAAG9N,KAAK+jB,KAAKpkB,IAItCuT,UAAW,kBACX8Q,WAQAD,KAAM,SAAUE,GAGdjkB,KAAKgkB,QAAUC,EACfjkB,KAAK6hB,KAAK,iBAAkB7hB,KAAKgkB,SAEjCnlB,EAAE4C,OAAOzB,KAAMA,KAAKgkB,SAEpBhkB,KAAK6hB,KAAK,gBAAiB7hB,KAAKgkB,UAUlCE,MAAO,WACL,GAAIC,GAAO,GAAI5e,IAAG6e,KAAKpkB,KAAKqkB,GAAIrkB,KAAKskB,KAAMtkB,KAAKukB,eAC5CC,EAAM,GAAIjf,IAAGkf,IAAIN,EAIrB,OAHInkB,MAAK0kB,OACPF,EAAIG,SAAS,OAAQ,QAEhBH,GAaTI,cAAe,SAAUC,EAAYC,GACnC,GAAIC,EACJ,IAAID,GAAuC,eAAzBA,EAAW5R,UAA4B,CAEvD,GAAIvG,GAASmY,CACbC,GAAiBpY,EAAOD,KAAKsY,WAC3BC,WAAW,EACXC,iBAAiB,EACjBC,eAAe,EACfC,gCAAgC,QAGlCL,IACEM,WAAYP,EAGhB,OAAO9kB,MAAKslB,gCAAgCT,EAAYE,IAY1DQ,oBAAqB,SAAUC,EAAYC,GACzC,KAAM,IAAIC,OAAM,qBAalBC,2BAA4B,SAAUd,EAAYe,GAChD,GAAI7C,GAAK/iB,IACT,OAAI4lB,OAEFrgB,IAAGsgB,GAAGC,QAAQC,gBAAgBH,EAAYlN,MAAMC,MAAMpH,KAAK,SAAU5E,GACnEA,EAAO1K,OACP0K,EAAOwV,KAAK5c,GAAGygB,IAAIF,QAAQG,WAAWnE,MAAMoE,aAAc,SAAUC,EAAkBlD,GACpF,GAAIkD,IAAqB5L,cAAcC,GACrC,MAAOuI,GAAG6B,cAAcC,EAAYlY,OAKnC3M,KAAKslB,gCAAgCT,IAWhDS,gCAAiC,SAAUT,EAAYE,EAAgBqB,EAAeC,EAAaC,GACjG,GAAIvD,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,UA4Cf,OA1CAhhB,IAAG8L,IAAIxR,KAAK,wBACVukB,KAAM,GAAK7e,IAAG6e,KAAKrB,EAAGsB,GAAItB,EAAGuB,KAAMvB,EAAGyD,eAAgBC,cACtDC,SAAsC,mBAArB3D,GAAG4D,cAAgC,GAAK5D,EAAG4D,cAC5DC,WAAY/B,EACZgC,eAAgB9B,MAChB+B,cAAeV,GAAiB,EAChCW,YAAaV,GAAe,EAC5BW,cAAeV,QACd/U,KAAK,SAAU0V,GAChB,GAAIC,GAAmBroB,EAAEsoB,UAAUF,EAGnCG,YAGA,IAAIC,GAAUH,EAAiBI,QAC3BC,EAAsBL,EAAiBM,kCACvCzE,GAAGrW,MAAQqW,EAAGrW,KAAK+a,WAAW1E,EAAGrW,KAAKgb,uBAAuBL,EAASE,EAG1E,IAAII,GAAOT,EAAiBU,QAC5B7E,GAAG8E,iBAAiBF,GAEpB1E,EAAO6E,YAENC,KAAK,SAAUC,EAAcf,GAE9B,GAAIA,EAAU,CACZ,GAAIA,EAASgB,OAAQ,CACnB,GAAItoB,GAAOd,EAAEsoB,UAAUF,EAASgB,QAE5BZ,EAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC3BzE,GAAGrW,MAAQqW,EAAGrW,KAAK+a,WAAW1E,EAAGrW,KAAKgb,uBAAuBL,EAASE,GAG5EtE,EAAOiF,OAAOjB,EAASvB,WAEvBzC,GAAOiF,WAIJjF,EAAOkF,WAUhBN,iBAAkB,SAAUF,GAC1B,GAAI1E,GAASpkB,EAAE0nB,UACf,IAAIoB,EAAK7Z,OAAS,EAAG,CAEnB,GAAIsa,MAGAC,EAAoBxpB,EAAE0nB,WAGtB+B,EAAmBD,CAEvB/e,GAAEvJ,KAAK4nB,EAAM,SAAUY,GACrB,GAAIC,GAAYD,EAAIE,OAChBC,EAAUH,EAAI3gB,IAElB0gB,GAAmBA,EAAiBK,KAAK,WAEvC,QAASD,GACP,IAAKjF,cAAaC,YAEhB,MAAOX,IAAG6F,0BAA0BL,EACtC,KAAK9E,cAAaE,IAEhB,MAAOZ,IAAG8F,mBAAmBN,EAC/B,KAAK9E,cAAaG,eAEhB,MAAOb,IAAG+F,4BAA4BP,MAGzCI,KAAK,SAAUI,GAEhBX,EAAe7U,MACbkV,OAAUD,EACV5gB,KAAQ8gB,EACRzF,OAAU8F,QAMhBT,EAAiB/W,KAAK,WAEpBwR,GAAGuC,gCAAgCT,WAAYuD,EAAe,GAAGK,OAAQL,EAAe,GAAGxgB,KAAMwgB,EAAe,GAAGnF,QAAQ1R,KAAK,WAC9H0R,EAAO6E,cAERC,KAAK,WAEN9E,EAAOiF,WAITG,EAAkBP,cAElB7E,GAAO6E,SAET,OAAO7E,GAAOkF,WAShBS,0BAA2B,SAAUhb,GACnC,GAAIob,GAAMnqB,EAAE0nB,UAoBZ,OAlBAjiB,QAAOiB,GAAG0jB,UAAUnD,QAAQoD,sBAAsBtb,EAAOub,WAAYzQ,MAAMC,MAAMpH,KAAK,SAAUC,GAC9FA,EAAEvP,OACFuP,EAAE2Q,KAAK5c,GAAGygB,IAAIF,QAAQG,WAAWnE,MAAMoE,aAAc,SAAUrB,EAAY5B,GAEzE,GAAImG,IACFC,SAAYpG,EAGd3Z,GAAEkI,EAAE9E,KAAKsY,YAAYK,YAAYtlB,KAAK,SAAUyd,EAAGP,GACjDmM,EAAanM,GAAKO,EAAE,KAGtBwL,EAAIlB,QAAQsB,OAEbrB,KAAK,WACNiB,EAAId,WAGCc,EAAIb,WAUbU,mBAAoB,SAAUjb,GAC5B,GAAIob,GAAMnqB,EAAE0nB,UAEZ,OADAyC,GAAId,SACGc,EAAIb,WAUbW,4BAA6B,SAAUlb,GACrC,GAAIob,GAAMnqB,EAAE0nB,WAER7Z,EAAO,GAAInH,IAAGygB,IAAIsD,MAAMC,YAAY,mBAExC7c,GAAK8c,cAAc,UAAW5b,EAAO6b,kBAAmB7b,EAAO8b,cAAc,EAE7E,IAAI/c,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQ6D,WAAW,qBAQ3C,OAPAhd,GAAOid,MAAQjjB,EAAE,uBACjBgG,EAAOkd,QAAQnd,EAAK7I,UACpB8I,EAAO1L,MAAQ,IACf0L,EAAO1K,OAGP+mB,EAAIlB,UACGkB,EAAIb;AC5Vf,GAAI2B,eAAgBjG,gBAAgBpiB,QAClCyR,UAAW,gBAWXqS,oBAAqB,SAAUC,EAAYC,GACzC,GAAIjU,GAAI3S,EAAE0nB,WACNxD,EAAK/iB,KACL+pB,EAAa/b,MAAMjM,UAAUkM,MAAMpO,KAAKgO,UAAW,EAuBvD,OArBAtI,IAAGykB,cAAczE,oBAAoB,yCACnCvlB,KAAKqkB,GAAI,GAAImB,EAAYuE,GAAYxY,KAAK,SAAUnK,GAClD,GAAIigB,GAAUjgB,EAAIkgB,QACdC,EAAsBngB,EAAIogB,kCAC1BzE,GAAGrW,MAAQqW,EAAGrW,KAAK+a,WAAW1E,EAAGrW,KAAKgb,uBAAuBL,EAASE,GAE1E/V,EAAEsW,QAAQ1gB,EAAI6iB,gBACblC,KAAK,SAAUC,EAAc5gB,GAC9B,GAAIA,EAAK,CACP,GAAIA,EAAI6gB,OAAQ,CACd,GAAItoB,GAAOyH,EAAI6gB,OACXZ,EAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC3BzE,GAAGrW,MAAQqW,EAAGrW,KAAK+a,WAAW1E,EAAGrW,KAAKgb,uBAAuBL,EAASE,GAE5E/V,EAAE0W,OAAO9gB,EAAIse,WAEblU,GAAE0W,OAAOF,KAIRxW,EAAE2W,WAUX+B,kBAAmB,SAAU1E,GAC3B,MAAOjgB,IAAGykB,cAAcE,kBAAkB,6CAA8ClqB,KAAKqkB,GAAImB;AClDrG,GAAI2E,WAAYtG,gBAAgBpiB,QAC9BlB,KAAM,SAAUZ,GACdK,KAAK8jB,OAAOnkB,IAEduT,UAAW,YAEXkX,MAAO,WACLpqB,KAAK4iB,QAAQ,QAAS,WAAcyH,eAGtCC,WAAY,SAAUC,GACpB,GAAIxH,GAAK/iB,KACLwqB,EAAwBD,EAAoBvqB,KAAKyqB,kBAEhB,oBAA1BD,IAA+E,mBAA/BA,GAAsBE,MAE/E7rB,EAAEkB,KAAKyqB,EAAsBE,KAAM,SAAU9pB,EAAW+pB,GACtD5H,EAAGZ,KAAKvhB,EAAW+pB,MAMzB/H,QAAS,SAAUhiB,EAAWiiB,EAAU+H,GACtC,QAAS/I,GAAKjhB,GACZ,GAAkD,mBAAvCiqB,WAAUC,OAAOF,IAAwF,mBAA5CC,WAAUC,OAAOF,GAAmBF,KAAqB,CAC/H,GAAI1Y,GAAI6Y,UAAUC,OAAOF,GAAmBF,KAAK9pB,GAAWf,KAAKG,KAAM6N,UAAU,GACjF,SAAgB,mBAALmE,KAAqBA,IAOpC,GAAgC,mBAArB4Y,GAAkC,CAC3C,GAAI9H,IAAQ,EACRC,EAAK/iB,KAGLgjB,EAAkB,SAAUC,IACT,mBAAVA,IAAyBA,KAClCJ,IACAE,EAAGlB,KAAK,QAAUjhB,IAEpBkiB,GAAQ,GAGN9Q,EAAI6P,EAAK,SAAWjhB,EAAWoiB,EAC9BF,IACHE,EAAgBhR,OAKlBhS,MAAK8jB,OAAOljB,EAAWiiB;ACtD7B,GAAIkI,UAAWlH,gBAAgBpiB,QAC7ByR,UAAW,WAGXoX,WAAY,SAAUC,GACpB,GAAIxH,GAAK/iB,KACLgrB,EAA6BT,EAAoBvqB,KAAKirB,0BAEjB,oBAA9BD,IAE6D,mBAA3DA,GAA2BE,OAAOlrB,KAAKmrB,kBAChDtsB,EAAEkB,KAAKirB,EAA2BE,OAAOlrB,KAAKmrB,iBAAkB,SAAUvqB,EAAW+pB,GACnF5H,EAAGZ,KAAKvhB,EAAW+pB,MAM3BS,4BAA6B,SAAUC,GACrC,GAAItI,GAAK/iB,IACNnB,GAAE8jB,WAAW0I,IACdtI,EAAGZ,KAAK,oBAAqBkJ,MAW/BnS,UAEF1I,IAAK,EAEL2I,OAAQ,EAERmS,WAAY;ACrCd,GAAIC,sBAAuB1H,gBAAgBpiB,QACzCyR,UAAW,uBAWXqS,oBAAqB,SAAUC,EAAYC,GACzC,GAAIjU,GAAI3S,EAAE0nB,WACNxD,EAAK/iB,KACL+pB,EAAa/b,MAAMjM,UAAUkM,MAAMpO,KAAKgO,UAAW,GAEnD2d,EAAgC,cAArBzI,EAAG4D,cAAgC,GAAK5D,EAAG4D,aAuB1D,OAtBAphB,IAAGykB,cAAczE,oBAAoB,0CACnC,GAAIhgB,IAAG6e,KAAKpkB,KAAKqkB,GAAIjU,YAAYK,iBAAkBzQ,KAAKukB,eACxDiH,EAAUhG,EAAYuE,GAAYxY,KAAK,SAAUnK,GAC/C,GAAIigB,GAAUjgB,EAAIkgB,QACdC,EAAsBngB,EAAIogB,kCAC1BzE,GAAGrW,MAAQqW,EAAGrW,KAAK+a,WAAW1E,EAAGrW,KAAKgb,uBAAuBL,EAASE,GAE1E/V,EAAEsW,QAAQ1gB,EAAI6iB,gBACblC,KAAK,SAAUC,EAAc5gB,GAC9B,GAAIA,EAAK,CACP,GAAIA,EAAI6gB,OAAQ,CACd,GAAItoB,GAAOyH,EAAI6gB,OACXZ,EAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC3BzE,GAAGrW,MAAQqW,EAAGrW,KAAK+a,WAAW1E,EAAGrW,KAAKgb,uBAAuBL,EAASE,GAE5E/V,EAAE0W,OAAO9gB,EAAIse,WAEblU,GAAE0W,OAAOF,KAIRxW,EAAE2W,WAUX+B,kBAAmB,SAAU1E,GAC3B,MAAOjgB,IAAGykB,cAAcE,kBAAkB,8CAA+C,GAAI3kB,IAAG6e,KAAKpkB,KAAKqkB,GAAIjU,YAAYK,iBAAkBzQ,KAAKukB,eAAgBiB;ACnDrK,GAAIiG,aAAc5H,gBAAgBpiB,QAChCyR,UAAW;ACFb,GAAIwY,aAAc7H,gBAAgBpiB,QAChClB,KAAM,SAAUZ,GACdK,KAAK8jB,OAAOnkB,IAEduT,UAAW;ACJb,cAUA,SAAWyY,GACT,GAAIC,GAAYlK,WAAWjgB,QACzBlB,KAAM,SAAUZ,GACdd,EAAE4C,OAAOzB,KAAML,IAGjBsK,KAAM,GAMN4hB,aAAc,WACmB,YAA3BhB,UAAU/gB,cAA6BgiB,UAAU9rB,KAAMA,KAAKiK,MAAM,GACjE6hB,UAAU9rB,KAAMA,KAAKiK,MAAM,IAOlC8hB,OAAQ,WACNC,gBAAgBhsB,KAAKiK,QAIzB0hB,GAAOC,UAAYA,GAClBtnB;ACrCH,cACA,WA4BE,GAAIumB,GAAY,WACd,GAAI9jB,GAAO/G,IAGXA,MAAKisB,qBASLjsB,KAAKksB,MAAQ,SAAUzM,GAYrB,MAXKA,GAEO5gB,EAAE8jB,WAAWlD,GAGC,YAApBla,GAAG4mB,KAAKC,QACVpsB,KAAKisB,kBAAkB1Y,KAAKkM,GAE5BA,EAAKM,MAAM/f,MALbuF,GAAGqL,MAAM,8BAFTrL,GAAGqL,MAAM,mDAAoD,YAUxD5Q,MASTA,KAAKqsB,yBAA2B,SAAU7H,GACxC,IAAKA,EAAK,MAAO,KACjB,IAAIA,EAAIpZ,QAAQ,QAAS,EAAI,MAAO,KACpC,IAAIkhB,GAAQ9H,EAAIvV,MAAM,KAAK,GAAGA,MAAM,IACpC,OAAOqd,GAAMA,EAAMxe,OAAS,IAiC9B9N,KAAKusB,QAAU,SAAU/H,GACvB,GAAI5c,GAAO5H,KAAKqsB,yBAAyB7H,EACzC,QAAQ5c,GACN,IAAK,KACH/I,EAAE2tB,WAAYC,OAAO,EAAOC,OAAO,IACnC7tB,EAAE8tB,UAAUnI,GACZ3lB,EAAE2tB,WAAYC,OAAO,EAAMC,OAAO,GAClC,MACF,KAAK,MACH,GAAIvI,GAAOjf,SAAS0nB,cAAc,OAClCzI,GAAKlR,aAAa,MAAO,cACzBkR,EAAKlR,aAAa,OAAQ,YAC1BkR,EAAKlR,aAAa,OAAQuR,GAC1Btf,SAASuN,qBAAqB,QAAQ,GAAGa,YAAY6Q,EACrD,MACF,SACEnkB,KAAK4Q,MAAM,gCAAiChJ,GAGhD,MAAO5H,OAWTA,KAAK6sB,cAUL7sB,KAAK8sB,WAAa9sB,KAAKgmB,OAUvBhmB,KAAK+sB,SAAW/sB,KAAKqR,OAUrBrR,KAAKgtB,UAAYhtB,KAAKitB,QAUtBjtB,KAAKipB,UAAYjpB,KAAK6lB,MAUtB7lB,KAAKktB,UAQLltB,KAAK0sB,SAQL1sB,KAAKmtB,UAAYntB,KAAKotB,OAStBptB,KAAKqtB,WAOLrtB,KAAKgqB,iBAaLhqB,KAAKstB,YAActtB,KAAKwF,IAAMlB,OAAOipB,gBA6CrCvtB,KAAKstB,YAAYE,SAAW,WAC1B,GAAIC,GAAQC,UAAUC,UAAUzL,cAC5B0L,EAAoBH,EAAMriB,QAAQ,cAAe,GAAQqiB,EAAMriB,QAAQ,aAAc,GAAQqiB,EAAMriB,QAAQ,gBAAiB,GAAQqiB,EAAMriB,QAAQ,gBAAiB,EACnKyiB,EAAqC,mBAAfC,YAC1B,OAAOF,IAAoBC,GAG7B7tB,KAAKstB,YAAY7nB,UAAY,WAC3B,MAAoC,YAA7BsB,EAAKumB,YAAYS,GAAG9jB,MAG7BjK,KAAKstB,YAAYU,MAAQ,WACvB,MAAoC,QAA7BjnB,EAAKumB,YAAYS,GAAG9jB,MAG7BjK,KAAKstB,YAAY7K,QAAU,WACzB,GAAIgL,GAAQC,UAAUC,UAAUzL,aAEhC,OAAQ,gBAAkBhd,UAAS+oB,kBAAmCR,EAAMriB,QAAQ,YAAa,GAAMqiB,EAAMriB,QAAQ,aAAc,IAMrIpL,KAAKstB,YAAYY,WAAa,WAC5B,MAAKrvB,GAAEyF,QAAQN,SAAWnF,EAAEyF,QAAQrD,QAAW,GASjDjB,KAAKstB,YAAYa,SAAW,UACxBT,UAAUU,WAAWhjB,QAAQ,SAAU,IAAIpL,KAAKstB,YAAYa,SAAW,WACvET,UAAUU,WAAWhjB,QAAQ,SAAU,IAAIpL,KAAKstB,YAAYa,SAAW,SACvET,UAAUU,WAAWhjB,QAAQ,WAAY,GAAMsiB,UAAUU,WAAWhjB,QAAQ,SAAU,IAAIpL,KAAKstB,YAAYa,SAAW,SAS1HnuB,KAAKmsB,KAAOttB,EAAE0nB,WAedvmB,KAAKquB,YAAcxvB,EAAE0nB,WASrBvmB,KAAKsuB,UAAYzvB,EAAE0nB,WASnBvmB,KAAKuuB,YAAc1vB,EAAE0nB,WAOrBvmB,KAAKwuB,iBAAmB3vB,EAAE0nB,WAO1BvmB,KAAKyuB,YAAc5vB,EAAE0nB,WAOrBvmB,KAAK0uB,eAAiB7vB,EAAE0nB,WAGxBvmB,KAAK2uB,iBAAmB9vB,EAAE0nB,WAO1BvmB,KAAK4uB,aAAe/vB,EAAE0nB,WACtBvmB,KAAK6uB,cAAgBhwB,EAAE0nB,WAiHvB1nB,EAAEiwB,KAAK9uB,KAAKwuB,kBAAkBjd,KAAK,WAC5B1S,EAAE,QAAQY,SAAS,YACtBsH,EAAKgoB,QAAQC,QAAU,GAAIzpB,IAAGygB,IAAIiJ,cAAcC,QAChDnoB,EAAKgoB,QAAQI,WAAa,GAAI5pB,IAAGygB,IAAIiJ,cAAcG,cASvDpvB,KAAKqvB,eAAiBxwB,EAAE0nB,WASxBvmB,KAAKsvB,eAAiBzwB,EAAE0nB,WAIxBvmB,KAAKuvB,oBAAsB1wB,EAAE0nB,WAQ7BvmB,KAAKwvB,SAAW3wB,EAAE0nB,WAMlB1nB,EAAEiwB,KAAK9uB,KAAKuvB,qBAAqBhe,KAAK,WACpC,IAAK,GAAIke,KAAa1oB,GAAK8lB,WAAY,CACrC,GAAI6C,GAAM,GAAI9D,WAAU7kB,EAAK8lB,WAAW4C,GACxC1oB,GAAK8lB,WAAW4C,GAAaC,EAKzBA,EAAIC,YAAW5oB,EAAK8lB,WAAWkC,QAAUW,GAE/C3oB,EAAK6oB,IAAM7oB,EAAK8lB,WAChB9lB,EAAKsoB,eAAevH,YAQtBjpB,EAAEiwB,KAAK9uB,KAAKuuB,YACLvuB,KAAKquB,YACLruB,KAAKwuB,iBACLxuB,KAAKyuB,YACLzuB,KAAKqvB,eACLrvB,KAAK0uB,eACL1uB,KAAKwvB,SACLxvB,KAAK4uB,cAAcrd,KAAK,WAEtB,IADAxK,EAAKolB,KAAK0D,YAAY9oB,GACfA,EAAKklB,kBAAkBne,QAC5B/G,EAAKklB,kBAAkB6D,QAAQjwB,KAAKkH,KAK/C/G,KAAK+vB,KAAO,GAAI5F,WAChBnqB,KAAKgwB,IAAM,GAAIjF,UACf/qB,KAAKiwB,SAAW,GAAInG,eACpB9pB,KAAKkwB,gBAAkB,GAAI3E,sBAC3BvrB,KAAKmwB,OAAS,GAAI1E,aAClBzrB,KAAKowB,OAAS,GAAI1E,aAElB1rB,KAAK8qB,UAOL9qB,KAAKqwB,UAAY,SAAUC,GACzBzxB,EAAEkB,KAAKuwB,EAAQ,SAAUliB,EAAK2Q,GAC5BhY,EAAK+jB,OAAO1c,GAAO2Q,KAkBvB/e,KAAK4Q,MAAQ,SAAU2f,EAAOC,GAC5B,GAAIC,GAAU,EAGZA,GADID,EACM7pB,EAAE4pB,GAAS,KAAOC,EAElB7pB,EAAE4pB,EAGd,IAAIG,GAAY,GAAIhL,OAAM+K,GACtBE,EAASjjB,OAAO,yBAA0B+iB,EAASC,EAAUE,MAKjE,MAHItsB,QAAOie,KAAKA,IAAIgO,MAAM,UAAWI,GAErCD,EAAUzmB,KAAOsmB,EACXG,GAwBR1wB,KAAK6wB,kBAAoB7wB,KAAK8wB,IAAM,SAAUC,GAC5C,MAAO,YACL,IACE,MAAOA,GAAkBhR,MAAM/f,KAAM6N,WACrC,MAAOmjB,GAIP,MAHI1sB,QAAOie,KAAKA,IAAIgO,MAAM,UAAWS,GACjC1sB,OAAOge,SAASA,QAAQC,IAAIyO,GAChCC,UAAUtqB,EAAE,YAAc,KAAOqqB,EAAIP,SAAS,GACvC,QAWbzwB,KAAKkxB,UAAY,GAajBlxB,KAAK8J,YAAc,WACjB,GAAM9J,KAAKmxB,SAAU,MAAOnxB,MAAKkxB,SACjC,KAAK5sB,OAAO6sB,SAAU,MAAO,EAC7B,IAAIC,GAAO9sB,OAAO6sB,SAASE,QAE3B,OADArxB,MAAKkxB,UAAYE,EAAKjV,OAAO,EAAGiV,EAAKE,YAAY,KAAO,GAAGpP,cACpDliB,KAAKkxB,WAWdlxB,KAAKwtB,SAAW,WACd,MAAQ3uB,GAAE,eAAeiP,OAAS,GAUpC9N,KAAKuxB,OAAS,WACZ,GAAIC,GAAaxxB,KAAKwtB,UAuBtB,OArBA3uB,GAAE4yB,OAAO,OAAQ,MAEbD,GAGEjsB,GAAGkoB,MAAMiE,wBAEXnsB,GAAGkoB,MAAMkE,kBAAkB,cACxBC,OAAO,SAAUC,GAEZA,GACFtsB,GAAGkoB,MAAMqE,eAOnBC,YAAY,iCAAmC,WAAcztB,OAAO6sB,SAAW,eAGxEnxB,MAKXsE,QAAOumB,UAAYvmB,OAAOiB,GAAK,GAAIslB;ACxtBrC,cACA,SAAsBc,GAQpBA,EAAOqG,aACLC,YASAjQ,gBAAiB,WACf,GAAIe,GAAK/iB,IACT+iB,GAAGkP,WACH,KAAK,GAAIC,GAAM,EAAGA,EAAMrkB,UAAUC,SAAUokB,EAAK,CAC/C,GAAIC,GAAQtkB,UAAUqkB,EACtB,IAAIrzB,EAAEuzB,cAAcD,IAAUA,EAAMlS,eAAe,WAGjD,IAAK,GAFDoS,GAAUF,EAAME,QAEX9qB,EAAI,EAAGA,EAAI8qB,EAAQvkB,OAAQvG,IAAK,CACvC,GAAI+qB,GAASD,EAAQ9qB,EAEjB+qB,IAAUA,EAAOC,cAAe,GAClCxP,EAAGyP,eAAeF,MAkB5BE,eAAgB,SAAUF,GACxB,GAAIvP,GAAK/iB,IACT,IAAIsyB,EAAOG,UAAYH,EAAOroB,KAAM,CAClC,GAAIyoB,GAAUJ,EAAOG,SAAS1P,EAE9B,KAAK,GAAIyC,KAAckN,GACjB1yB,KAAKigB,eAAeuF,IACtBjD,IAAIoQ,QAAQ,SAAU,IAAIL,EAAOroB,KAAO,gCAAiCub,EAAa,KAExFxlB,KAAKwlB,GAAckN,EAAQlN,EAG7BxlB,MAAKiyB,SAAS1e,KAAK+e,EAAOroB,MAC1BsY,IAAIqQ,KAAK,SAAU,IAAMN,EAAOroB,KAAO,oBAEvC1E,IAAGqL,MAAMjK,EAAE,+CAYfksB,mBAAoB,SAASC,GAC3B,MAAO9yB,MAAKiyB,SAAS7mB,QAAQ0nB,MAAgB,KAMhDxuB,OAAOumB,UAAUqC;ACnFpB,cAEA,SAAWvB,GAET,GAAIoH,IACFC,QAAS,oBACTC,MAAO,IACPC,QAAS,yCACTC,KAAM,2BACNC,SAAU,+BACVC,eAAgB,kBAChBC,cAAe,kBAiBbC,GACFpH,KAAM,KACNzf,KAAM,KACNsmB,QAAS,KACTvmB,QAAS,KACTD,QAAS,KACTlI,OAAQ,KACRkvB,WAAY,KACZC,OAAQ,KASRC,SAAU,WACR,GAAI3Q,GAAK/iB,IAcT,OAbA+iB,GAAG0Q,QACDD,WAAY30B,EAAE0nB,WACdyM,QAASn0B,EAAE0nB,WACX8M,eAAgBx0B,EAAE0nB,WAClB+M,cAAez0B,EAAE0nB,WACjB4M,KAAMt0B,EAAE0nB,WACRoN,OAAQ90B,EAAE0nB,WACV0M,MAAOp0B,EAAE0nB,WACT2M,QAASr0B,EAAE0nB,WACX7Z,KAAM7N,EAAE0nB,YAGVxD,EAAGoJ,KAAOttB,EAAE0nB,WACLxD,GAUT6Q,UAAW,WACT,GAAI7Q,GAAK/iB,KACL6zB,EAAKlI,EAAO3F,IAAI8N,QAEpB/Q,GAAGgR,eAAexiB,KAAK,WACrBwR,EAAGiR,YAAcn1B,EAAEkkB,EAAGkR,mBAEtBlR,EAAGiQ,QAAUjQ,EAAGmR,aAAanB,EAAUC,QAASa,EAAGb,QAAQmB,QAC3DpR,EAAG0Q,OAAOT,QAAQlL,UAElB/E,EAAGrW,KAAO,GAAImnB,GAAGnnB,KAAK0nB,KAAKrR,EAAGsR,eAAgBtR,EAAGuR,WAAYvR,GAC7DA,EAAGrW,KAAK6nB,SAAW,GAAI7S,YACvBqB,EAAGrW,KAAKyf,KAAKxD,KAAK,WAChB5F,EAAG0Q,OAAO/mB,KAAKob,YAGbjpB,EAAE8jB,WAAWI,EAAGyR,iBAClBzR,EAAGyR,kBAEHlS,QAAQmS,KAAK,0DAA4D1R,EAAG7P,UAAY,KAE1F6P,EAAG0Q,OAAOD,WAAW1L,UAErB/E,EAAGrW,KAAK6nB,SAAStB,MAAQ,GAAItH,GAAO+I,WAAW3R,EAAGmR,aAAanB,EAAUE,MAAOY,EAAGnnB,KAAK0X,OACxFrB,EAAG0Q,OAAOR,MAAMnL,UAChB/E,EAAGrW,KAAK6nB,SAASrB,QAAU,GAAIvH,GAAO+I,WAAW3R,EAAGmR,aAAanB,EAAUG,QAASW,EAAGnnB,KAAKioB,SAC5F5R,EAAG0Q,OAAOP,QAAQpL,UAEbviB,GAAGioB,aACe,YAAjBzK,EAAG7P,WAAgD,aAArB3N,GAAGuE,eACnCiZ,EAAGtW,QAAU,GAAIonB,GAAGpnB,QAAQmoB,iBAAiB7R,EAAGkR,kBAAoB,IAAMlR,EAAG8R,0BAA2B9R,GACxGA,EAAGtW,QAAQ0mB,KAAO,GAAIU,GAAGpnB,QAAQqoB,cAAc/R,EAAGmR,aAAanB,EAAUK,SAAUS,EAAGpnB,QAAQsoB,cAAehS,EAAGkR,kBAAoB,IAAMlR,EAAG8R,0BAA2B9R,KAExKA,EAAGtW,QAAU,GAAIonB,GAAGpnB,QAAQuoB,QAAQjS,EAAGkR,kBAAoB,IAAMlR,EAAG8R,0BAA2B9R,GAC/FA,EAAGtW,QAAQ0mB,KAAO,GAAIU,GAAGpnB,QAAQwoB,KAAKlS,EAAGmR,aAAanB,EAAUI,KAAMU,EAAGpnB,QAAQyoB,KAAMnS,EAAGkR,kBAAoB,IAAMlR,EAAG8R,0BAA2B9R,KAItJA,EAAG0Q,OAAON,KAAKrL,UAEf/E,EAAGvW,QAAU,GAAIkV,YAEZnc,GAAGioB,aACNzK,EAAGvW,QAAU,GAAIqnB,GAAGrnB,QAAQ2oB,QAC5BpS,EAAGvW,QAAQ0mB,QAAU,GAAIW,GAAGrnB,QAAQ4oB,QAAQrS,EAAGmR,aAAanB,EAAUM,eAAgBQ,EAAGrnB,QAAQ6oB,gBACjGtS,EAAG0Q,OAAOJ,eAAevL,UACzB/E,EAAGvW,QAAQ8oB,OAAS,GAAIzB,GAAGrnB,QAAQ+oB,OAAOxS,EAAGmR,aAAanB,EAAUO,cAAeO,EAAGrnB,QAAQgpB,gBAGhGzS,EAAG0Q,OAAOH,cAAcxL,YAI1B/E,EAAG0S,iBAAiBlkB,KAAK,WACvB,GAAImkB,IACFC,SAAU5S,EAAGsR,eACbuB,MAAO7S,EAAG8S,YACVC,WAAY/S,EAAGgT,iBACfC,WAAYjT,EAAGkT,iBACf3B,WAAYvR,EAAGuR,WACfvF,QAAShM,GAGP4Q,EAAS5Q,EAAGmR,aAAanB,EAAUC,QAASrH,EAAO3F,IAAI8N,SAASpnB,KAAKwpB,MAAOR,GAC5ES,IACJ,KAAK,GAAI/nB,KAAOulB,GAAQ,CACtB,GAAIyC,GAAQzC,EAAOvlB,EACnB+nB,GAAW5iB,KAAK6iB,EAAMjK,MAExBttB,EAAEiwB,KAAK/O,MAAMgD,EAAIoT,GAAYxN,KAAK,WAChC5F,EAAGrW,KAAK6nB,SAASZ,OAASA,EAC1B5Q,EAAG0Q,OAAOE,OAAO7L,aAIrB,IAAI2L,GAASnqB,EAAEyZ,EAAG0Q,QAAQ4C,QAQ1B,OAPAx3B,GAAEiwB,KAAK/O,MAAMgD,EAAI0Q,GAAQ7B,OAAO,WAC9B7O,EAAGoJ,KAAKrE,UACHviB,GAAGioB,YACNzK,EAAGiR,YAAY9vB,KAAK,gCAAgCoyB,IAAI,iBAAiBz0B,QAAQ00B,QAAQC,WAItFzT,GAaTmR,aAAc,SAAUuC,EAAiBC,EAAgB5R,GACvD,GAAIvjB,MACAwhB,EAAK/iB,IACT8kB,GAAaA,IAAgBiK,QAAShM,EAGtC,KAAK,GAFD4T,GAAgB5T,EAAGiR,YAAY9vB,KAAKuyB,GAE/BlvB,EAAI,EAAG2V,EAAIyZ,EAAc7oB,OAAQvG,EAAI2V,EAAG3V,IAAK,CACpD,GAAIrH,GAAO,GAAIw2B,GAAeC,EAAcpvB,GAAIud,EAC3CvjB,GAAMrB,EAAK+J,QAAO1I,EAAMrB,EAAK+J,MAAQ/J,GAC1CqB,EAAMrB,EAAK+J,MAAM2sB,cAAgBr1B,EAAMrB,EAAK+J,MAAM2sB,kBAClDr1B,EAAMrB,EAAK+J,MAAM2sB,cAAcrjB,KAAKojB,EAAcpvB,IAEpD,MAAOhG,IAOTs1B,sBAAuB,WAGrB,QAASC,GAAkCV,EAAOW,GAEhD,IAAK,GADDC,GAAOD,EAAI1R,WAAW4R,UACjBja,EAAI,EAAGA,EAAIga,EAAKlpB,OAAQkP,IAAK,CACpC,GAAIka,GAAMF,EAAKha,GACXma,EAAwBf,EAAMgB,kBAAkBF,EAAIjtB,KAExD,IAAIktB,EAAuB,CACzB,GAAIE,GAAUF,EAAsBG,SACpC,IAAID,GACEA,EAAQE,kBAAoBF,EAAQG,wBAA0BH,EAAQI,iBAAkB,CAE1F,GAAIC,GAASpuB,EAAEzK,EAAEsoB,UAAUkQ,EAAQE,mBAAmBjb,IAAI,SAAUqb,GAClE,OAASC,UAAWxB,EAAMnsB,KAAM4tB,MAAOd,EAAIe,WAAYC,QAASJ,KAG9DK,EAASn5B,EAAEsoB,UAAUkQ,EAAQG,wBAC7BS,EAAS3uB,EAAEzK,EAAEsoB,UAAUkQ,EAAQI,mBAAmBnb,IAAI,SAAU4b,GAClE,OAASN,UAAWxB,EAAMnsB,KAAM4tB,MAAOd,EAAIe,WAAYC,QAASG,IAGlEnV,GAAGoV,uBAAuBjB,EAAKQ,EAAQM,EAAQC,MAtBzD,GAAIlV,GAAK/iB,IAgDT,OAnBAnB,GAAEiwB,KAAK/L,EAAG0Q,OAAOE,QAAQhL,KAAK,WAC5B,IAAK,GAAIiP,KAAa7U,GAAGrW,KAAK6nB,SAASZ,OAAQ,CAI7C,IAAK,GAHDyC,GAAQrT,EAAGrW,KAAK6nB,SAASZ,OAAOiE,GAEhCQ,EAAOhC,EAAMgC,KAAKnB,UACb1vB,EAAI,EAAGA,EAAI6wB,EAAKtqB,OAAQvG,KAC/B,SAAW8wB,EAAQC,GACjBxB,EAAkCuB,EAAQC,IACzClC,EAAOgC,EAAK7wB,KAGjB,SAAW8wB,GACTA,EAAOlW,KAAK,SAAU,SAAUoW,GAC9BzB,EAAkCuB,EAAQE,MAE3CnC,MAIArT,GAIToV,uBAAwB,SAAUjB,EAAKQ,EAAQM,EAAQC,GACrD,GAAIlV,GAAK/iB,IAET,QAAKk3B,GAA0B,IAAlBQ,EAAO5pB,QAAkC,IAAlBmqB,EAAOnqB,OAAsBiV,GAEjEmU,EAAI/U,KAAK,iBAAkB,SAAUqW,GAE9BA,GAELlvB,EAAE4tB,EAAIuB,gBAAgB14B,KAAK,SAAU24B,GACnC,GAAIC,GAAKD,EAAO/4B,KAAK,0BACrB,IAAIg5B,GAAMA,EAAGC,YAAa,CACxB,GAAIA,GAAcD,EAAGC,WAErB/5B,GAAE4C,OAAOm3B,GACPC,UAAW,WACT,MAAO9V,GAAG+V,iBAAiBpB,EAAQM,MAGvCW,EAAGC,YAAcA,OAKvB1B,EAAI/U,KAAK,yBAA0B,SAAU4W,EAAU55B,EAAIQ,EAAMq5B,GAsB/D,QAASC,GAAqBt5B,GAC5B,IAAK,GAAI4H,GAAI,EAAGA,EAAImwB,EAAO5pB,OAAQvG,IAAK,CACtC,GAAI2xB,GAAav5B,EAAKw5B,sBAAsBnB,EAAOzwB,GACnD,IAAI2xB,EAAY,CACd,GAAIvB,GAAU5U,EAAGqW,wBAAwB1B,EAAOnwB,GAC5CowB,KAGFA,EAAQ0B,SAASH,EAAW,GAAIA,EAAW,IAAI,GAG/CnW,EAAGuW,qCAAqC3B,EAASuB,EAAW,OA9BhEv5B,GAAuB,OAAfA,EAAKof,OAIXia,GACFjW,EAAGwW,sBAAsBtB,GAG3BgB,EAAqBt5B,IAOrBojB,EAAGwW,sBAAsBtB,KAwBtBlV,IAUT+V,iBAAkB,SAAUpB,EAAQM,GAGlC,IAAK,GAFDjV,GAAK/iB,KACLiU,EAAM,GACD1M,EAAI,EAAGA,EAAImwB,EAAO5pB,OAAQvG,IAAK,CACtC,GAAIowB,GAAU5U,EAAGqW,wBAAwB1B,EAAOnwB,GAChD,IAAKowB,EAAL,CACA,GAAI6B,GAAa7B,EAAQ8B,UACzBxlB,IAAO+jB,EAAOzwB,GAAK,IAAMowB,EAAQ1tB,KAAO,KAAOuvB,EAAaA,EAAa,IAAM,KAEjF,MAAOvlB,IASTmlB,wBAAyB,SAAUM,GACjC,GAAI3W,GAAK/iB,IACT,OAAIsJ,GAAEqwB,SAASD,GAEN3W,EAAGrW,KAAK2Y,WAAWqU,GAGnB3W,EAAGrW,KAAK6nB,SAASZ,OAAO+F,EAAS9B,WAAWgC,WAAWF,EAAS7B,OAAOxS,WAAWqU,EAAS3B,UAStGwB,sBAAuB,SAAUM,GAE/B,IAAK,GADD9W,GAAK/iB,KACAuH,EAAI,EAAIA,EAAIsyB,EAAa/rB,OAAQvG,IAAK,CAC7C,GAAI2wB,GAAYnV,EAAGqW,wBAAwBS,EAAatyB,GACpD2wB,IAAWA,EAAU4B,OAAM,KAUnCR,qCAAsC,SAAUS,EAAWhb,GA8BzD,QAASib,GAAyB3C,EAAS4C,EAAUC,GACnD,GAAIxC,GAAS,KACTM,EAAS,IACTX,GAAQE,kBAAoBF,EAAQG,yBAEtCE,EAASpuB,EAAEzK,EAAEsoB,UAAUkQ,EAAQE,mBAAmBjb,IAAI,SAAUqb,GAC9D,OAASC,UAAWxB,EAAMnsB,KAAM4tB,MAAOd,EAAIe,WAAYC,QAASJ,KAGlEK,EAASn5B,EAAEsoB,UAAUkQ,EAAQG,wBAG/B,IAAI2C,GAAUJ,EAAUK,gBAAgB,GACpCC,EAAeJ,EAASI,YAQ5B,OANIJ,GAASK,0CAA4CL,EAASK,yCAAyCH,KACzGE,EAAeE,KAAKC,MAAMH,GAC1BA,EAAaI,gBAAkBR,EAASK,yCAAyCH,GAAS1R,OAC1F4R,EAAeE,KAAKG,UAAUL,IAGzBx7B,EAAE4C,QACP8a,EAAG,GACHoe,OAAQ,QAAUT,EAClBU,cAAeX,EAASW,cAAgB,IAAM,IAC9CC,yBAA0B,IAC1BR,aAAcA,EACdxB,UAAW9V,EAAG+V,iBAAiBpB,EAAQM,QAxD3C,GAAIjV,GAAK/iB,KACL+2B,EAAMgD,EAAUe,SAChB1E,EAAQW,EAAIgE,WACZ5D,EAAwBf,EAAMgB,kBAAkB2C,EAAU9vB,KAE9D,IAAIktB,EAAuB,CACzB,GAAIE,GAAUF,EAAsBG,SACpC,IAAID,EAAS,CAEX,GAAI4C,GAAWp7B,EAAEsoB,UAAUkQ,EAAQ4C,UAC/BrsB,EAASosB,EAAyB3C,EAAS4C,EAAUlb,EAEzDic,6BAA4BC,UAAUhB,EAASzV,IAAK5W,EAAQ,SAAUstB,EAAO9zB,GAC3E,GAAIzH,GAAOyH,EAAI,EACXzH,IAAwC,OAAhCA,EAAKw7B,wBACfpB,EAAUlY,KAAK,yBAA0B,KAAM,MAAQ5X,KAAMtK,EAAKy7B,aAAcrc,MAAOpf,EAAK4D,GAAI83B,aAAc17B,EAAKiqB,MAAOuP,sBAAuBt6B,EAAEsoB,UAAUxnB,EAAKw7B,0BAA2B,QA+CzMxP,GAAOuB,OAAOqG,UAAYA,GACzBjvB,OAAOumB;AC1aV,cACA,SAA+Bc,GAS7BA,EAAO2P,OAAS5Z,WAAWjgB,QACzB8wB,YAAY,EACZtoB,KAAM,KACNiJ,UAAW,SAEX3S,KAAM,SAAUqN,GAEd,MADA5N,MAAK8jB,OAAOlW,GACL5N,MAoCTyyB,SAAU,SAAU8I,GAElB,MADAv7B,MAAKmiB,KAAK,YAAaniB,KAAKw7B,oBAY9BC,mBAAoB,SAASF,QAM9Bj3B,OAAOumB;AC7BV,QAAS6Q,aAAYC,EAAKC,GACxB,MAAID,GAAIzZ,cAAc9W,QAAQ,WAAY,GAChCwwB,EAAe,IAAM,KAAO,QAE/B,GAGT,QAASC,mBAAkBz0B,GAEzB,QAAW,MAAPA,MAAiB,GAAKA,GAAKgE,QAAQ,kBAAmB,GAAqB,gBAAPhE,IAAmBA,EAAIse,OAAsB,UAAbte,EAAIse,UAC1GngB,GAAGwnB,SAAS+O,gBAAgB,MAErB,GAMX,QAASC,eAAc9xB,EAAMua,GAE3B,MAAO,IAAKjf,IAAGkf,IAAID,GAAMwX,SAAS/xB,GAGpC,QAASgyB,kBAAiBzX,EAAK2N,EAAOpT,GAEpC,MAAO,IAAKxZ,IAAGkf,IAAID,GAAMG,SAASwN,EAAOpT,GAAOqE,WAGlD,QAAS8Y,kBAAiB1X,EAAK2N,GAE7B,MAAO,IAAK5sB,IAAGkf,IAAID,GAAM2X,YAAYhK,GAAO/O,WAG9C,QAASgZ,YAAW5X,EAAK6X,GAGvB,IAAK,GAFDC,GAASD,EAASptB,MAAM,KACxBstB,EAAS/X,EACJjd,EAAI,EAAGA,EAAI+0B,EAAOxuB,OAAQvG,IACjC,GAAiB,IAAb+0B,EAAO/0B,GACT,GAA2B,KAAvB+0B,EAAO/0B,GAAGi1B,OAAO,GACnBD,EAASL,iBAAiBK,EAAQD,EAAO/0B,GAAG4U,OAAO,QAC9C,CACL,GAAIxa,GAAI26B,EAAO/0B,GAAG0H,MAAM,IACxBstB,GAASN,iBAAiBM,EAAQ56B,EAAE,GAAIA,EAAE,IAIhD,MAAO46B,GAET,QAASE,UAASJ,EAAUK,EAAgBC,EAAeC,GACzDt2B,WAAW,WACT,IACE,GAAIg2B,GAASD,EAASptB,MAAM,IAE5B,IAAIytB,EAAgB,CAClB,IAAK,GAAIn1B,GAAI,EAAGA,EAAI+0B,EAAOxuB,OAAQvG,IACjC,GAAiB,IAAb+0B,EAAO/0B,GACT,GAA2B,KAAvB+0B,EAAO/0B,GAAGi1B,OAAO,GACnB39B,EAAE,IAAMy9B,EAAO/0B,GAAG4U,OAAO,IAAIlI,IAAI,QAC5B,CACL,GAAItS,GAAI26B,EAAO/0B,GAAG0H,MAAM,IACxBpQ,GAAE,IAAM8C,EAAE,IAAIsS,IAAItS,EAAE,IAI1B,GAAImb,GAAIje,EAAE,aACW,OAAjB89B,GACF7f,EAAE/X,KAAK,SAAU43B,GAEnB7f,EAAE+f,aACG,CACL,GAAIrY,GAAMlgB,OAAO6sB,SAASrpB,IACZ,OAAV80B,GAAkBA,IACpBpY,EAAMsY,WAAWtY,IAEnBA,EAAM4X,WAAW5X,EAAK6X,EAEtB,IAAIU,GAASl+B,EAAE,aACM,IAAjBk+B,EAAOjvB,SACT0W,EAAMyX,iBAAiBzX,EAAK,YAAauY,EAAO9oB,QAGpC,MAAV2oB,GAAkBA,IACpBpY,EAAMwY,oBAAsB,IAAMxY,GAE/BoY,GAAUP,EAASjxB,QAAQ,OAAQ,IACtCoZ,EAAMwY,kBAAkBxY,IAE1BlgB,OAAO6sB,SAASrpB,KAAO0c,GAEzB,MAAOyY,MAER,KAGL,QAASH,YAAWtY,GAElB,MADAjC,KAAIkS,KAAK,aAAc,oEAChB,GAAKlvB,IAAGkf,IAAID,GAAMzU,UAG3B,QAASitB,mBAAkBxY,GAEzB,MADAjC,KAAIkS,KAAK,aAAc,2EAChB,GAAKlvB,IAAGkf,IAAID,GAAM0Y,sBAG3B,QAASC,cAAad,EAAUe,GAC9BX,SAASJ,GAAU,GAAO,GAAO,GACjCe,IAGF,QAASpR,iBAAgB0D,GACvBnN,IAAIkS,KAAK,aAAc,iGACvB4I,eAAe12B,EAAE,4BACjBorB,YAAY,wCAA0CuL,cAAe5N,GAAO,SAAUtoB,GAChFA,EAAIm2B,SACNC,eAAe,GAAI,GACnBC,YAAY92B,EAAE,oBAAqBA,EAAE,WAAY,WAAcwqB,SAASrpB,KAAOqpB,SAASrpB,QAExF41B,UAAUt2B,EAAIse,SAKpB,QAASiY,UAAS1sB,GAChBggB,UAAUhgB,GAAK,GAEjB,QAAS2sB,SAAQ3sB,GACfggB,UAAUhgB,GAAK,GAKjB,QAAS4sB,eAAc5J,GACrB,MAAI1uB,IAAGioB,aAAejoB,GAAGmE,GAAGgD,KAAK+a,UACxBqW,uBAAuB7J,GAEvB1uB,GAAGmE,GAAGgD,KAAK0W,WAItB,QAAS0a,wBAAuB7J,GAC9B,GAAI/tB,EAGFA,GADE+tB,EACWp1B,EAAEo1B,GAEFp1B,EAAE,OAGjB,IAAImT,GAAI,GACJ+rB,EAAW73B,EAAWhC,KAAK,YAE7B8N,GADqB,GAAnB+rB,EAASjwB,OACP5H,EAAWhC,KAAK,mHAGhB65B,EAAS75B,KAAK,0EAGpB,IAAI85B,GAAO93B,EAAWhC,KAAK,sBAAsBy2B,OAAO,WACtD,GAAIsD,GAAUp/B,EAAE,IAAMA,EAAEmB,MAAM+E,KAAK,QAInC,OAHuB,IAAnBg5B,EAASjwB,SACXmwB,EAAUA,EAAQtD,OAAO,aAEpBsD,EAAQnwB,OAAS,GAE1BkE,GAAIA,EAAEgT,YAAc,IAAMgZ,EAAKhZ,WAG/B,IAAIkZ,GAAer/B,EAAE,mBAAmBqF,KAAK,kBAC7C,IAA6C,GAAzCg6B,EAAah6B,KAAK,aAAa4J,OAAa,CAC9C,GAAIqwB,KACJD,GAAah6B,KAAK,gCAAgCnE,KAAK,WACrD,GAAIq+B,GAAOv/B,EAAEmB,MAAM+E,KAAK,QACpBs5B,EAA2B,EAClB,SAATD,IACFC,EAA2B,IAAMx/B,EAAEmB,MAAM+E,KAAK,aAEhDo5B,EAAc5qB,KAAK6qB,EAAO,IAAMv/B,EAAEmB,MAAM+E,KAAK,MAAQs5B,KAEvDrsB,GAAK,gBAAkBmsB,EAAclsB,KAAK,KAE5C,MAAOD,GAIT,QAASssB,oBACP,GACIC,GADAtK,EAAoBuK,uBAIpBj5B,IAAGioB,YACL+Q,EAAU1/B,EAAE0nB,WACZgY,EAAQzW,WAERyW,EAAUh5B,GAAG4mB,KAGfoS,EAAQhtB,KAAK,WACXktB,cAAgBZ,cAAc5J,GAE9B1uB,GAAGmE,GAAGpF,OAAO6d,KAAK,cAAe,WAC/B,OAAK0b,cAAc5J,IAAsBwK,eAAsC,GAAnBC,kBACnD/3B,EAAE,uBAMjB,QAASg4B,sBACPp5B,GAAGmE,GAAGpF,OAAOke,OAAO,eAEtB,QAASoc,eACPr5B,GAAGmE,GAAGpF,OAAOu6B,QAMf,QAASC,eACPrC,SAAS,yBAAyB,GAEpC,QAASsC,sBACPtC,SAAS,wBAAwB,GAEnC,QAASuC,gBACPvC,SAAS,uBAAuB,GAElC,QAASwC,cACP,GAAIC,GAAOnD,cAAc,OACC,SAAtBmD,EAAKhd,cAGH3c,GAAGwpB,QAAQoQ,OAASjmB,SAASoS,WAC/BmR,SAAS,SAAS,GAElBA,SAAS,aAAa,GAGxBA,SAAS,aAAa,GAG1B,QAAS2C,eAAcC,GACrBV,qBACIU,EACF5C,SAAS,qCAAqC,GAE9CA,SAAS,iCAAiC,GAG9C,QAAS6C,uBACPX,qBACAlC,SAAS,mCAAmC,GAE9C,QAAS8C,6BACP9C,SAAS,+BAA+B,GAE1C,QAAS+C,qBAAoBxtB,GAClB,MAALA,GACFnT,EAAE,iBAAiBoV,IAAIjC,GAEzByqB,SAAS,8BAA8B,GAEzC,QAASgD,mBACPd,qBACAlC,SAAS,8BAA8B,GAGzC,QAASiD,oBACPp7B,OAAOq7B,KAAKvD,WAAWjL,SAASrpB,KAAM,+BAExC,QAAS83B,oBAAmBC,GAC1Bv7B,OAAOw7B,SAAW,WAAcC,QAAQF,IAE1C,QAASE,SAAQC,GACf,GAAI7uB,GACA8uB,EAAWvE,YAAYvK,SAASrpB,MAAM,EAa1C,OAZAjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,oBAAsByb,EAC3BtgC,KAAM,aAAeqgC,EAAQ,KAC7BvT,OAAO,EACP4T,QAAS,SAAUj5B,GACjB+J,EAAI/J,EAAIoK,KAGZqqB,kBAAkB1qB,GACXA,EAKT,QAASmvB,gBACP7D,SAAS,sBAAsB,GAEjC,QAAS8D,mBACP9D,SAAS,4BAA4B,GAEvC,QAAS+D,aACP/D,SAAS,2BAA2B,GAEtC,QAASgE,mBACPhE,SAAS,sCAAsC,GAGjD,QAASpS,aAEP,IAAKxrB,EAAE,yBAAyBY,SAAS,YAAa,CAEpDZ,EAAE,sBAAsBqF,KAAK,iBAAiBxE,SAAS,WAEvD,IAAIghC,GAAY7hC,EAAE,cAAcgD,OAEhC,IAAI6+B,EAAU5yB,OAAS,GAA2C,mBAA9B4yB,GAAU/gC,KAAK,YAA2D,MAA7B+gC,EAAU/gC,KAAK,WAAoB,CAClH,GAAI6R,GAAIkvB,EAAU/gC,KAAK,UAEnB+gC,GAAUzsB,MAAM7I,QAAQ,OAAQ,IAClCoG,EAAEmvB,SAAS,IACXnvB,EAAEovB,WAAW,IACbpvB,EAAEqvB,WAAW,IAEf,IAAIC,GAAcjiC,EAAEkiC,MAAQvvB,EAAEwvB,SAC1BF,GAAa,EACfG,gCACE,WAAcpiC,EAAE,sBAAsBqF,KAAK,iBAAiB5E,YAAY,eAI1Eq/B,qBACAlC,SAAS,+BAA+B,QAI1CkC,sBACAlC,SAAS,+BAA+B,IAK9C,QAASyE,aACPzE,SAAS,+BAA+B,GAE1C,QAAS0E,eACP1E,SAAS,iCAAiC,GAE5C,QAAS2E,eACP3E,SAAS,iCAAiC,GAE5C,QAAS4E,iBACP,GAAInC,GAAOnD,cAAc,OACC,SAAtBmD,EAAKhd,cACPua,SAAS,aAAa,GAGtBA,SAAS,aAAa,GAG1B,QAAS6E,cACP3C,qBACAlC,SAAS,8BAA8B,GAEzC,QAAS8E,oBACP5C,qBACAlC,SAAS,sCAAsC,GAEjD,QAAS+E,iBACPl9B,OAAOq7B,KAAKvD,WAAWjL,SAASrpB,KAAM,uCAExC,QAAS25B,cAAa//B,EAAIuS,EAAKvQ,GAC7Bi7B,qBACA+C,sBAAsB3F,cAAc,MAAO9nB,EAAK,SAAU7M,GACpDA,EAAIoK,IACF3S,EAAE6C,GAAIjC,SAASiE,GACjB7E,EAAE6C,GAAIpC,YAAYoE,GAElB7E,EAAE6C,GAAIhC,SAASgE,GAEN,QAAPuQ,EACFpV,EAAE6C,GAAIigC,OAAOriC,YAAYoE,IAChBuQ,EAAM,QACfpV,EAAE6C,GAAIkgC,OAAOtiC,YAAYoE,MAKjC,QAASg+B,uBAAsBG,EAAQC,EAAOC,GAC5C,GAAI9B,GAAWvE,YAAYvK,SAASrpB,MAAM,EAC1CjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,0BAA4Byb,EACjCtgC,KAAM,cAAgBkiC,EAAS,eAAiBC,EAAQ,KACxDzB,QAAS,SAAUj5B,GACZy0B,kBAAkBz0B,EAAIoK,IACzBuwB,EAAa36B,MAKrB,QAAS46B,yBAAwBtgC,EAAIgC,GAC9B7E,EAAE6C,GAAIjC,SAASiE,GAGlB48B,eAFA7D,SAAS,kBAAkB,GAK/B,QAASwF,iBAAgBC,GACvBzF,SAAS,oCAAoC,GAE/C,QAAS0F,yBACPxD,qBACAlC,SAAS,mCAAmC,EAAMP,iBAAiBr9B,EAAE,cAAckG,KAAK,UAAW,UAErG,QAASq9B,yBAAwBhF,GAC/BuB,qBAC8B,KAA1B5C,cAAc,SAChBqB,IAEAX,SAAS,mCAAmC,GAGhD,QAAS4F,qBAAoBC,GAC3Bh+B,OAAOw7B,SAAW,WAAcyC,SAASD,IAE3C,QAASC,UAASV,GAChB,GAAI1wB,GACA8uB,EAAWvE,YAAYvK,SAASrpB,MAAM,EAa1C,OAZAjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,sBAAwByb,EAC7BtgC,KAAM,cAAgBkiC,EAAS,KAC/BpV,OAAO,EACP4T,QAAS,SAAUj5B,GACjB+J,EAAI/J,EAAIoK,KAGZqqB,kBAAkB1qB,GACXA,EAOT,QAASqxB,gBACP/F,SAAS,mCAAmC,GAE9C,QAASgG,mBACPhG,SAAS,sCAAsC,GAEjD,QAASiG,kBACPjG,SAAS,qCAAqC,GAEhD,QAASkG,gBACPlG,SAAS,uCAAuC,GAElD,QAASmG,kBACPnG,SAAS,qCAAqC,GAEhD,QAASoG,mBACPpG,SAAS,sCAAsC,GAEjD,QAASqG,mBACPrG,SAAS,sCAAsC,GAGjD,QAASsG,mBACP,GAAI7D,GAAOnD,cAAc,OACC,SAAtBmD,EAAKhd,eAAiD,OAAtBgd,EAAKhd,cACvCua,SAAS,aAAa,GAEtBA,SAAS,aAAa,GAkB1B,QAASuG,WAAU5F,GAuDjB,QAAS6F,GAAQC,GAuBf,QAASC,KACH/F,EAAUA,KAEZuB,qBACAlC,SAAS,aAAa,IAnB1B,GAPIl3B,GAAGygB,IAAIod,IAAIhU,aACb7pB,GAAGygB,IAAIod,IAAIhU,WAAWttB,UAClBohC,GAAgB39B,GAAGmE,GAAGylB,WAAWkU,YAAYH,IAGnD39B,GAAGmE,GAAGpF,OAAOg/B,4BAETh/B,OAAOi/B,OACT,KAEMC,GAA8D,SAAnCl/B,OAAOi/B,OAAOh+B,GAAGuE,eAA+D,QAAnCxF,OAAOi/B,OAAOh+B,GAAGuE,eAC3FxF,OAAOi/B,OAAOE,cAAc,GAAIl+B,IAAG6e,KAAK7e,GAAGmE,GAAG2a,GAAIjU,YAAYC,YAE5D/L,OAAOi/B,OAAOG,wBAGhB1jC,KAAKu2B,QAGT,MAAOnyB,IAWT,GAA2C,OAAvC23B,cAAc,QAAQ7Z,cACxB,GAAIrjB,EAAE,QAAQY,SAAS,UAAW,CAChC,GAAI8D,GAAKw4B,cAAc,MACnBjf,EAAIje,EAAE,cACN2lB,EAAM1H,EAAE/X,KAAK,SACjByf,GAAMyX,iBAAiBzX,EAAK,OAAQ,QACpCA,EAAMyX,iBAAiBzX,EAAK,KAAMjhB,GAClCihB,EAAM0X,iBAAiB1X,EAAK,QAC5B1H,EAAE/X,KAAK,SAAUyf,GACjB1H,EAAE+f,aAGF8G,6BAA4BR,OAI9BA,KAIJ,QAASS,GAAU5S,GACjBwM,iBACIxM,GACFC,UAAUD,GAAK,GAInB,QAAS6S,GAAKlkC,GACZoyB,YAAY,sBAAuBpyB,EAAM,SAAUyH,GAC5CA,EAAIm2B,SAGPC,iBACAA,eAAe72B,EAAE,sBAAuB,KACxCs8B,KAJAW,EAAUx8B,EAAIse,SAlHpB2X,eAAe12B,EAAE,eAEjB,IAAI68B,IAAyB,EAEzB7jC,GAASmkC,WAAYr5B,SAASsxB,cAAc,MAAO,IAAKgI,SAAU,GAAIC,cAAe,GACzFrkC,GAAKskC,mBAAqB,IAC1B,IAAIC,GAAa,GAAI3+B,IAAGkf,GACxB,IAAkD,QAA9Cyf,EAAWlI,SAAS,QAAQ9Z,cAC9B,GAAmC,IAA/BgiB,EAAWlI,SAAS,QAAe,CACrC,GAAIp0B,GAAyC,SAAlCs8B,EAAWlI,SAAS,UAAuB5rB,YAAYG,KAAOH,YAAYI,GACrF7Q,GAAKskC,mBAAqB,GAAI1+B,IAAG6e,KAAK3Z,SAASy5B,EAAWlI,SAAS,QAAS,IAAKp0B,GACjF47B,GAAyB,MAEM,IAA3BzH,cAAc,YAChBp8B,EAAKskC,mBAAqB,GAAI1+B,IAAG6e,KAAK3Z,SAASy5B,EAAWlI,SAAS,UAAW,IAAK5rB,YAAYE,QAIrG,IAAI6zB,GAAOpI,cAAc,OACzB,QAAQoI,EAAKpzB,eACX,IAAK,aACHqzB,WAAW,SAAUh9B,GACfA,EAAIm2B,QACN0F,IAEAW,EAAUx8B,EAAIse,QAGlB,MACF,KAAK,GACL,IAAK,WACL,IAAK,OACHngB,GAAGmE,GAAGgD,KAAK23B,cAAc,SAAUvhC,EAAIogC,GACjCpgC,EAAImgC,EAAQC,GACXU,MACJ,EAAMjkC,EAAKskC,mBACd,MACF,KAAK,cACH,GAAIK,GAAS/+B,GAAGwpB,QAAQ1K,GACpBkgB,EAAQ1lC,EAAE,gBAAgBqF,KAAK,8BAA8B+P,KACjE1O,IAAG8L,IAAIxR,KAAK,uCACV2kC,OAAQF,EACRG,MAAOF,IACNhzB,KAAK,SAAUmzB,GAChBzB,MACClb,KAAK,SAAUwI,GAChBqT,EAAUrT,IAEZ,MACF,SACEsT,EAAKlkC,IA0EX,QAASglC,kBAAiBd,EAAMlkC,GAC9B,GAAIilC,GAAiB/lC,EAAE,gCACnBgmC,EAAahmC,EAAE,4BACfimC,EAAU,SAAUvU,GAASsU,EAAW9/B,KAAK,WAAW,GAAO6/B,EAAejlC,KAAK,WAAY,MAAO69B,iBAAkBE,UAAUnN,GAEtI,IADA5wB,EAAKqkC,cAAgB,GACjBY,EAAeG,GAAG,cAAkBH,EAAejlC,KAAK,aAAkD,IAAnCilC,EAAejlC,KAAK,YAAmB,CAChH,GAAIgN,GAASq4B,6BAA6B,GAAI,SAAUC,GAEtD,MADAtlC,GAAKokC,SAAWkB,EACZ1/B,GAAG0qB,SAASiV,SAAW,GAAK,MAE9BC,wBAAuB5/B,GAAG0qB,SAAS5L,GAAI9e,GAAG0qB,SAASiV,SAAU3/B,GAAG0qB,SAASmV,WAAYH,EAAU,SAAUI,GACvG1lC,EAAKqkC,cAAgBqB,EACrBxB,EAAKlkC,IACJmlC,OAGLjB,GAAKlkC,IAGP,aADMgN,IAAQA,EAAOhI,OAASgI,EAAO24B,QAAU,WAAcjI,eAAe,IAAI,GAAMkI,UAIxF,MADMX,GAAejlC,KAAK,aAAkD,IAAnCilC,EAAejlC,KAAK,cAAmBA,EAAKokC,SAAWa,EAAejlC,KAAK,aAChH4F,GAAG0qB,SAASiV,SAAW,GAAK,MAE9BC,wBAAuB5/B,GAAG0qB,SAAS5L,GAAI9e,GAAG0qB,SAASiV,SAAU3/B,GAAG0qB,SAASmV,WAAYzlC,EAAKokC,SAAU,SAAUsB,GAC5G1lC,EAAKqkC,cAAgBqB,EACrBxB,EAAKlkC,IACJmlC,OAGLjB,GAAKlkC,GAGP,QAASwlC,wBAAuBK,EAAOC,EAAU3S,EAAYmS,EAAUS,EAAWZ,GAChFa,aAAa5kB,gBAAgBC,uBAAwB,SAAU4kB,GAC7D/a,UAAU4C,MAAMoY,gBAAgB,qBAAsB,cAElDC,MAASN,EACTO,QAAW,EACXC,MAASJ,EACTK,WAAcR,EACdS,qBAAwBpT,EACxBiR,SAAYkB,IACX1zB,KAAK,SAAU0V,GACZye,GAAaA,EAAUze,EAAShE,UACnC8E,KAAK,SAAUd,GACZ6d,GAASA,EAAQ7d,EAASwJ,YAEjC+U,EAAO,GAGZ,QAASpB,YAAWhH,EAAU7M,GAC5B,GAAI4V,GAAMtnC,EAAE,qBAAqBoV,MAC7B7M,KACAg/B,EAAa,GACbC,GAAgB,CAGpB,KAAKC,oBAEH,MADA9I,kBACO+I,SAAS5/B,EAAE,iCAGpB,IAAI6/B,GAAgB3nC,EAAE,0BACf2nC,GAAc7mC,KAAK,YAA+C,KAAjC6mC,EAAc7mC,KAAK,YAAmB6mC,EAAc7mC,KAAK,UAAW8mC,uBAAuBD,EAAcvyB,MAAOkyB,GAAO,IAAM,IACrK,IAAIO,GAAaC,kBAAkB9nC,EAAE,gCAAiCA,EAAE,4BAExE,IAAqC,KAAjC2nC,EAAc7mC,KAAK,YAAsB+mC,EAAa,GAAKP,EAAI/6B,QAAQ,QAAS,EAAK,CAEvF,IAAK,GADDw7B,GAAeT,EAAIl3B,MAAM,KACpB1H,EAAI,EAAGA,EAAIq/B,EAAa94B,OAAQvG,IAAK,CAC5C,GAAIs/B,GAAMhoC,EAAE2V,KAAKoyB,EAAar/B,GAC9B,IAAIs/B,EAAK,CACP,GAAIva,GAAQua,EAAI53B,MAAM,KAClB1L,EAAK+oB,EAAM,GACXwa,GAAS,GAAI,EAAG,GAAGr8B,SAAS6hB,EAAM,GAAI,KACtCya,GAAU,CACd,IAAwB,GAApBxjC,EAAG6H,QAAQ,MAAY,CAEzB,GADA7H,EAAKA,EAAG4Y,OAAO,GACG,GAAduqB,EAKF,WADAM,wBAAuBzjC,EAAI+oB,EAAM,GAAI,WAAc8X,WAAWhH,EAAU7M,IAHxEwW,IAAU,EAOd3/B,EAAImM,MAAO0zB,QAAS1jC,EAAI2jC,QAASH,EAASI,UAAWL,KAGzDV,EAAavnC,EAAEwkB,OAAOjc,GACtBi/B,GAAgB,EAElB,GAAIe,GAA0BC,kCAC1BC,EAA4E,GAAlDzoC,EAAE,6BAA6Bc,KAAK,WAC9D4nC,EAA0BH,GAA2BE,CACzDE,2BAA2BC,WAAYrB,EAAYsB,yBAA0BN,GAA2Bf,GAAiBkB,EAAyBnK,GAGpJ,QAAS4J,wBAAuBW,EAASC,EAAaC,GACpD,GAAIC,IAAWnhC,EAAE,iCAAkCA,EAAE,wBAAyBA,EAAE,oCAC5E/C,EAAO,mCAAqC+C,EAAE,yCAA2C,QAC7F/C,IAAQ,kCACRA,GAAQ,gCACRA,GAAQ,0BAA4B+C,EAAE,sBAAwB,SAC9D/C,GAAQ,0BACR,KAAK,GAAI2D,GAAI,EAAGA,EAAIugC,EAAQh6B,OAAQvG,IAAK,CACvC,GAAIwgC,GAAkB,GAALxgC,CACjB3D,IAAQ,yCACmB2D,EAAI,iCAAmCwgC,EAAY,WAAa,IAAM,YAAcxgC,EAAI,0BACvFA,EAAI,KAC5BugC,EAAQvgC,GAAK,iBAEnB3D,GAAQ,oBAER,IAAIokC,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UAC9BD,GAAK/mC,MAAQ,IACb+mC,EACGE,gBAAgB,WACf,GAAIC,GAAStpC,EAAE,kBAAkBqF,KAAK,iBAAiBa,KAAK,SAC5D,QAAQojC,GACN,IAAK,IAAKC,gBAAgBT,EAASC,GAAa,EAAMC,EAAmB,MACzE,KAAK,IAAKO,gBAAgBT,EAASC,GAAa,EAAOC,EAAmB,MAC1E,KAAK,IACHhpC,EAAE,gBAAkB8oC,EAAU,aAAeA,GAASzjC,KAAK,6BAA6BjB,QACpF4kC,GAAkBA,MAGzB,WAAcrK,kBACnB,IAAI6K,GAAYxpC,EAAE,gBAAkB8oC,EAAU,aAAeA,GAASW,SAAS,oBAAoBA,WAAW7gC,MAC9GugC,GAAKO,aAAa5hC,EAAE,2CAA4C0hC,GAAYzkC,GAG9E,QAASwkC,iBAAgBT,EAASC,EAAaY,EAAmBC,GAChEljC,GAAG8L,IAAIxR,KAAK,kCAAoC6oC,QAAWf,EAASgB,qBAAwBH,EAAmBI,aAAe,IAC3HvI,QAAQ,SAAU9+B,GACjB,IAAK,GAAIgG,GAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAAK,CACrC,GAAIV,GAAOtF,EAAMgG,EACbshC,cAAahqC,EAAEgI,EAAKY,MAAM,KAE5B5I,EAAE,cAAgBgI,EAAKtD,GAAK,WAAasD,EAAKtD,IAAI+kC,SAAS,wCAAwCpkC,KAAK,SAAW0jC,EAAc,KAAK3kC,QAI1IpE,EAAE,gBAAkB8oC,EAAU,aAAeA,GAASzjC,KAAK,6BAA6BjB,QACpFwlC,GAAeA,MAEpB1gB,KAAK,SAAUwI,GACd,GAAIuY,GAA+B,OAAnBvY,EAAMwY,SAAoBC,OAAOzY,EAAMwY,UAAY5pB,MACnE5Z,IAAGmE,GAAGylB,WAAWltB,KAAKsuB,EAAOpR,OAAW2pB,KAI9C,QAASzB,mCACP,GAAI4B,IAA8B,EAC9BC,EAA2BrqC,EAAE,4BAEjC,OADIqqC,GAAyBp7B,SAAUm7B,EAA8BC,EAAyBnE,GAAG,aAC1FkE,EAGT,QAASxC,wBAAuB0C,EAAUC,GACxC,MAAID,GAASr7B,QAAUs7B,EAASt7B,SACK,KAAjCq7B,EAASA,EAASr7B,OAAS,KAAWq7B,EAAWA,EAAShtB,OAAO,EAAGgtB,EAASr7B,OAAS,IACrD,KAAjCs7B,EAASA,EAASt7B,OAAS,KAAWs7B,EAAWA,EAASjtB,OAAO,EAAGitB,EAASt7B,OAAS,IACtFq7B,EAASl6B,MAAM,KAAKo6B,OAAOp3B,KAAK,MAAQm3B,EAASn6B,MAAM,KAAKo6B,OAAOp3B,KAAK,MAI9E,QAASu1B,0BAAyB8B,EAAcC,EAAeC,GAC7D,GAAIC,GAAmB5qC,EAAE,gCACrB6qC,EAAe7qC,EAAE,4BACjBomC,EAAawE,EAAiB9pC,KAAK,YAAc8pC,EAAiB9pC,KAAK,YAAc,GACrFgqC,EAAkBpkC,GAAG0qB,SAASiV,SAC9B0E,EAAcjD,kBAAkB8C,EAAkBC,EAEtD,OAAIC,IAAmBC,GAAeL,GACpCD,EAAaO,aAAeD,EAC5BN,EAAavF,SAAWkB,MACxBN,kBAAiB,SAAUv9B,GACzB0iC,qBAAqBH,EAAiBviC,EAAKoiC,IAC1CF,SAGDE,GAAiBA,GAAkBjM,SAAS,EAAMwM,gBAAiBR,KAGzE,QAASO,sBAAqBH,EAAiBL,EAAcE,GAC3DF,EAAaxF,WAAav+B,GAAG0qB,SAAS5L,GACtC9e,GAAGwnB,SAASltB,KAAK,+BAAgCypC,GAC9CjJ,QACD,SAAUj5B,GAER,GAAI4iC,GAAczkC,GAAG0qB,SAASiV,UAAYoE,EAAaO,cAAgE,KAAhDhrC,EAAE,2BAA2Bc,KAAK,UACzG4F,IAAG0qB,SAASiV,SAAWoE,EAAaO,aACpCrM,eAAe72B,EAAE,sBAAuB,KACpC6iC,GAAiBA,GAAkBjM,SAAS,EAAMwM,gBAAiBC,MAExEjiB,KACD,SAAU3gB,GACR,GAAIqiC,GAAmB5qC,EAAE,+BACzB4qC,GAAiB9pC,KAAK,WAAY,MAC9BgqC,EAAkB,EAAGF,EAAiBQ,WAAW,WAChDR,EAAiB1kC,KAAK,WAAW,GAClC4kC,EAAkB,GAAK,EAAG9qC,EAAE,4BAA4BkG,KAAK,WAC5DlG,EAAE,4BAA4BorC,WAAW,WAC1CT,GAAiBA,GAAkBjM,SAAS,EAAO7X,MAAOte,MAMpE,QAASu/B,mBAAkB8C,EAAkBC,GAC3C,GAAIjE,GAAW,EACXyE,EAAqBR,EAAa3E,GAAG,WAUzC,OATImF,IACFzE,IAEEgE,EAAiB1E,GAAG,cACtBU,EAAW,EACPyE,GACFzE,KAGGA,EAGT,QAAS0E,cAAaC,GACpB,QAASC,KAEP,GADAhN,eAAe12B,EAAE,gBAAgB,GAClB,SAAXyjC,EACFpH,UAAU,WACRsH,eAAe3jC,EAAE,mBAAoBo1B,cAAc,aAEhD,CACL,GAAImD,GAAOnD,cAAc,QAAQ7Z,aACrB,WAARgd,GAA4B,WAARA,GAA6B,YAARA,EAC3CzC,SAAS,QAAU2N,EAAU,iCAAiC,GAE9D3N,SAAS,QAAU2N,EAAU,2BAA2B,IAK9DC,IAEF,QAASE,YACP5L,qBACAlC,SAAS,8BAA8B,GAGzC,QAAS+N,oBACP7L,qBACAqE,UAAU,WACRsH,eAAe3jC,EAAE,mBAAoBo1B,cAAc,OACnD91B,aAAa3B,OAAOi/B,OAAOkH,kBAK/B,QAASC,cAEP,GAAIlG,GAASzI,cAAc,MACvB4O,EAAmC,KAAxB9rC,EAAE,aAAaoV,MAC1B22B,EAAU/rC,EAAE,oBAEhBw+B,gBAAgBsN,EAA+BhkC,EAAE,kBAAtBA,EAAE,iBAE7BorB,YAAY4Y,EAAW,wBAA0B,uBAAyB7G,WAAYU,EAAQqG,eAAe,GAAS,SAAU5nB,GAC9H,GAAIA,EAAOsa,QAAS,CAClB,GAAIuN,GAAW,GAAIvlC,IAAGygB,IAAIiJ,cAAc8b,MACpCC,EAAYnsC,EAAE,YAEU,MAAxBA,EAAE,aAAaoV,OACjB22B,EAAQ1mC,KAAK,OAAOa,KAAK,aAAc,uBACvC6lC,EAAQ1mC,KAAK,wBAAwBN,KAAK+C,EAAE,wBAC5CqkC,EAAU/2B,IAAI,GACd62B,EAASG,YAAYtkC,EAAE,uBAEvBikC,EAAQ1mC,KAAK,OAAOa,KAAK,aAAc,qBACvC6lC,EAAQ1mC,KAAK,wBAAwBN,KAAK+C,EAAE,sBAC5CqkC,EAAU/2B,IAAI,GACd62B,EAASG,YAAYtkC,EAAE,uBACvBpB,GAAGmE,GAAGylB,WAAW7uB,QAEnBk9B,eAAe,GAAI,GAEnBl5B,OAAO6sB,SAASrpB,KAAOm0B,iBAAiB33B,OAAO6sB,SAASrpB,KAAM,SAAU,WAGxEmpB,WAAUhO,EAAOyC,OAAO,GACxB8X,eAAe,GAAI,IAEpB,SAAU0N,EAAIC,EAAIna,GACnBC,UAAUD,GAAK,GACfwM,eAAe,GAAI,KA0BvB,QAAS4N,uBACH,UAAUC,KAAKla,SAASE,UAC1BoL,SAAS,mBAAmB,GAE5Bn4B,OAAOq7B,KAAKvD,WAAWjL,SAASrpB,KAAM,oBAG1C,QAASwjC,QAAO/nC,EAAIgoC,EAAUC,EAAWC,GACvC9M,oBACA,IACIna,GADAknB,EAAY7sC,EAAE,IAAM0sC,EAAW,oBAAoBt3B,MAEnDgsB,EAAWvE,YAAYvK,SAASrpB,MAAM,EACD0c,GAArC3lB,EAAE,IAAM2sC,GAAWzG,GAAG,YAAqB,gBAAkBxhC,EAAK,yBAA2BmoC,EAAY,gBAAkBzL,EAClH,gBAAkB18B,EAAK,yBAA2BmoC,EAAY,eAAiBzL,EACxFwL,GACFnnC,OAAOq7B,KAAKnb,EAAK,cAAe,IAChCmnB,kBAEAxa,SAASrpB,KAAO0c,EAKpB,QAASmnB,kBACPhN,oBACA,IAAI6F,GAASzI,cAAc,KAE3B,IADA6P,SAASpH,GACLt/B,SAAS2mC,SAAS3pB,cAAc9W,QAAQ,mBAAoB,EAC9D9G,OAAOu6B,YACF,CACL,GAAIra,GAAMlgB,OAAO6sB,SAASrpB,IAC1B0c,GAAM0X,iBAAiB1X,EAAK,KAAM,IAC9B,mBAAuBuX,eAAc,SACvCvX,EAAM0X,iBAAiB1X,EAAK,QAE9BlgB,OAAO6sB,SAASrpB,KAAO0c,GAG3B,QAASsnB,oBAAmBC,EAASvH,EAAQwH,GAC3C,GAAIC,MACAhM,EAAWvE,YAAYvK,SAASrpB,MAAM,EAC1CjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,6CAA+Cyb,EACpDtgC,KAAM,cAAgB6kC,EAAS,gBAAkBuH,EAAQhtB,MAAQ,wBACjE0N,OAAO,EACPC,OAAO,EACP2T,QAAS,SAAUj5B,GACjB,IAAKy0B,kBAAkBz0B,EAAIoK,GAAI,CAC7By6B,EAAQ7kC,EAAIoK,EACNy6B,EAAMC,SAASvO,SAASsO,EAAMC,SACjB,IAAfD,EAAMvmB,OAAekY,QAAQqO,EAAMvmB,MACvC,IAAIymB,GAAiC,QAApBF,EAAMG,WACnB1qC,EAAK7C,EAAE,IAAMmtC,EACbG,GACFzqC,EAAGuoC,WAAW,YAEdvoC,EAAGqD,KAAK,WAAY,YAAYsnC,KAAK,WAAW,OAO1D,QAASC,aAAY5c,GACnB,GAAIve,GACA8uB,EAAWvE,YAAYvK,SAASrpB,MAAM,EAc1C,OAbAjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,8BAAgCyb,EACrCtgC,KAAM,iBAAmB+vB,EAAM,KAC/BjD,OAAO,EACPC,OAAO,EACP2T,QAAS,SAAUj5B,GACjB+J,EAAI/J,EAAIoK,KAGZqqB,kBAAkB1qB,GACXA,EAGT,QAASo7B,kBACP5N,oBACA,IAAI6F,GAASzI,cAAc,KAE3B,IADA6P,SAASpH,GACLt/B,SAAS2mC,SAAS3pB,cAAc9W,QAAQ,mBAAoB,GAAM2wB,cAAc,SAAS7Z,cAAc9W,QAAQ,cAAe,EAChI9G,OAAOu6B,YACF,CACL,GAAIra,GAAMlgB,OAAO6sB,SAASrpB,IAC1B0c,GAAM0X,iBAAiB1X,EAAK,KAAM,IAC9B,mBAAuBuX,eAAc,SACvCvX,EAAM0X,iBAAiB1X,EAAK,QAE9BA,EAAM0X,iBAAiB1X,EAAK,QAC5BlgB,OAAO6sB,SAAW3M,GAItB,QAASgoB,oBAAmBC,GAC1BnoC,OAAOw7B,SAAW,WAAc8L,SAASa,IAE3C,QAASb,UAASpH,GAChB,GAAIrzB,GACA8uB,EAAWvE,YAAYvK,SAASrpB,MAAM,EAa1C,OAZAjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,2BAA6Byb,EAClCtgC,KAAM,cAAgB6kC,EAAS,KAC/B/X,OAAO,EACP4T,QAAS,SAAUj5B,GACjB+J,EAAI/J,EAAIoK,KAGZqqB,kBAAkB1qB,GACXA,EAKT,QAASu7B,kBACPjQ,SAAS,6BAA6B,GAExC,QAASkQ,oBACPlQ,SAAS,mCAAmC,GAE9C,QAASmQ,kBACPjO,qBACAlC,SAAS,0CAA0C,GAErD,QAASoQ,4BACP,GAAI3N,GAAOnD,cAAc,OACC,SAAtBmD,EAAKhd,cACPua,SAAS,6BAA6B,GAEtCA,SAAS,6BAA6B,GAM1C,QAASqQ,iBAAgB1C,GACvB/M,eAAe12B,EAAE,gBAAgB,GAClB,cAAXyjC,EACG9D,oBAGH7J,SAAS,QAAU2N,EAAU,2BAA2B,GAFxDnZ,UAAUtqB,EAAE,kCAAkC,GAKhD81B,SAAS,QAAU2N,EAAU,2BAA2B,GAI5D,QAAS2C,2BAA0BC,GACjC1oC,OAAOw7B,SAAW,WAAcmN,WAAWD,IAE7C,QAASC,YAAWD,GAClB,GAAI77B,GACA8uB,EAAWvE,YAAYvK,SAASrpB,MAAM,EAa1C,OAZAjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,0BAA4Byb,EACjCtgC,KAAM,gBAAkBqtC,EAAW,KACnCvgB,OAAO,EACP4T,QAAS,SAAUj5B,GACjB+J,EAAI/J,EAAIoK,KAGZqqB,kBAAkB1qB,GACXA,EAET,QAAS+7B,gBAAeC,EAAYC,GAClC,GAAIC,GAAaxuC,EAAE,qCAAqCoV,MACpDq5B,EAAW/nC,GAAGmE,GAAG2a,EAMrB,IAHI9e,GAAGioB,aACL4f,GAAgB,IAEb9G,oBAGH,MAFA9I,sBACAvM,WAAUtqB,EAAE,kCAAkC,EAG9C,KAAKymC,IAAmB7nC,GAAGioB,YAAkD,eAApCjoB,GAAGmE,GAAG+C,QAAQ0mB,KAAKpE,QAAQ9kB,KAAwB,CAC1F,GAAIsjC,GAAgB1uC,EAAE,gCAAgCoV,MAClDuyB,EAAgB3nC,EAAE,sCAAsCoV,KAE5D,IAAIs5B,IAAkB/G,EAAe,CACnC,GAAKgH,yBAoBHC,oBAAoBH,EAAUH,OApBD,CAC7B,GAAIxgC,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,WAE5ByF,EAAW/mC,EAAE,yBACbgnC,EAAiBhnC,EAAE,oCACnBijB,EAAQjjB,EAAE,UAEdgG,GAAOihC,uBACPjhC,EAAOkhC,UAAU,WAAYlnC,EAAE,kBAAmB,WAChD8mC,oBAAoBH,EAAUH,KAEhCxgC,EAAOkhC,UAAU,gBAAiBlnC,EAAE,kBAAmB,WAErD9H,EAAE,gCAAgCoV,IAAIs5B,EAAgB,IAAMO,cAAgB,MAC5EL,oBAAoBH,EAAUH,KAEhCxgC,EAAOkhC,UAAU,SAAUlnC,EAAE,UAAW,cAExCgG,EAAO1K,KAAKyrC,EAAUC,EAAgB/jB,EAAO,WAI/C,QAMN,GAAkB,MAAdyjB,GAAkC,IAAZC,EAAgB,CAET,mBAApB,iBAAiCjQ,eAAe12B,EAAE,eAE7D,IAAIs5B,GAAWvE,YAAYvK,SAASrpB,MAAM,EAc1C,YAbAjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,+BAAiCyb,EACtCtgC,KAAM,gBAAkB2tC,EAAW,oBAAsBD,EAAa,KACtE3gB,OAAO,EACP2T,QAAS,SAAUj5B,GACZy0B,kBAAkBz0B,EAAIoK,IACzBu8B,6BAA6B3mC,EAAIoK,EAAG27B,MAO5CY,6BAA6B,KAAMZ,GAGrC,QAASa,sBACPd,gBAAe,GAGjB,QAASa,8BAA6B98B,EAAKk8B,GAGzC,QAASrqC,KACP67B,qBACAlC,SAAS/uB,OAAO,wCAAyCy/B,EAAa,eAAiB,SAAS,GAGlG,QAASxoC,KACP9F,EAAE,cAAcyB,OARa,mBAApB,iBAAiCk9B,eAAe,GAAI,GAWpD,MAAPvsB,EACFnO,IAEAmrC,iBAAiBh9B,EAAKnO,EAAI6B,GAI9B,QAAS8oC,qBAAoBS,EAAUC,GAErC5oC,GAAG8L,IAAIxR,KAAK,gCAAkCytC,SAAYY,IAAY38B,KAAK,SAAUnK,GAC/EA,EAAM,EAERgnC,yBAAyBD,GAEzBjB,eAAeiB,GAAW,KAKhC,QAASC,0BAAyBjB,GAkBhC,QAASkB,GAAYC,GACnB,GAAIf,GAAgB1uC,EAAE,gCAAgCoV,MAClDuyB,EAAgB3nC,EAAE,sCAAsCoV,MACxDs6B,EAAUC,GAEdD,GAAQtsC,OACRsD,GAAG8L,IAAIxR,KAAK,oCACVytC,SAAU/nC,GAAGmE,GAAG2a,GAChBoqB,cAAelB,EACfmB,cAAelI,EACfmI,YAAaL,IACZ/8B,KAAK,SAAUnK,GAChBmnC,EAAQ1P,QACR+P,EAAaxnC,KACZ2gB,KAAK,SAAU3gB,GAChBmnC,EAAQ1P,QACR+P,EAAaxnC,KAIjB,QAASonC,KACP,GAAI7hC,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQ6D,UAMhC,OALAhd,GAAOihC,uBACPjhC,EAAOkiC,oBACPliC,EAAOid,MAAQjjB,EAAE,sCACjBgG,EAAOkd,QAAQnc,OAAO,sHAAuH/G,EAAE,iCAExIgG,EAGT,QAASiiC,GAAaxnC,GACpB,GAAIuF,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,UAC5B7gC,IACFuF,EAAO+gC,SAAW/mC,EAAE,6BACpBgG,EAAOghC,eAAiBvmC,EACxBuF,EAAO24B,QAAU,WACf3G,qBACAr6B,OAAO6sB,SAASpF,UAElBpf,EAAOmiC,cAGPnQ,qBACAr6B,OAAO6sB,SAASpF,UA5DpB,GAAIgjB,GAAe,GAAIxpC,IAAGygB,IAAIF,QAAQmiB,WAElCyF,EAAW/mC,EAAE,4BACbgnC,EAAiBhnC,EAAE,iCACnBijB,EAAQjjB,EAAE,eAEdooC,GAAanB,uBACbmB,EAAalB,UAAU,eAAgBlnC,EAAE,OAAQ,WAC/C0nC,GAAY,KAEdU,EAAalB,UAAU,iBAAkBlnC,EAAE,mCAAoC,WAC7E0nC,GAAY,KAEdU,EAAalB,UAAU,UAAWlnC,EAAE,MAAO,WAAcumC,eAAeC,GAAY,KAEpF4B,EAAa9sC,KAAKyrC,EAAUC,EAAgB/jB,EAAO,YAmDrD,QAAS4jB,0BAQP,IAAK,GAPDD,GAAgB1uC,EAAE,gCAAgCoV,MAClDuyB,EAAgB3nC,EAAE,sCAAsCoV,MAExD+6B,EAAYC,gBAAgBzI,GAC5B0I,EAAY,KACZC,GAAgB,EAEX5nC,EAAI,EAAGA,EAAIynC,EAAUlhC,OAAQvG,IACpC,GAAIynC,EAAUznC,GAAGhE,IAAMuqC,cAAe,CACpCoB,EAAYF,EAAUznC,GAAG6nC,UACzB,OAIJ,GAAIF,GAEF,IAAK,GADDG,GAAYJ,gBAAgB1B,GACvBhmC,EAAI,EAAGA,EAAI8nC,EAAUvhC,OAAQvG,IACpC,GAAI8nC,EAAU9nC,GAAGhE,IAAMuqC,cAAe,CACpCqB,GAAgB,CAChB,YAKJA,IAAgB,CAGlB,OAAOA,GAGT,QAASF,iBAAgBK,GAIvB,IAAK,GAHDrsB,MAEAssB,EAAcD,EAAOrgC,MAAM,KACtB1H,EAAI,EAAGA,EAAIgoC,EAAYzhC,OAAQvG,IAAK,CAC3C,GAAIioC,GAAOD,EAAYhoC,GAAG0H,MAAM,IAChCgU,GAAO1P,MAAOhQ,GAAIisC,EAAK,GAAIJ,WAAYI,EAAK,KAG9C,MAAOvsB,GAKT,QAASwsB,gCAA+BC,EAASC,GAC/C,GAAI9nC,GAAMhJ,EAAE,iBAER+wC,GAAc,GACd/wC,EAAE,qBAAqBiP,OAAS,GAAKjP,EAAE,qBAAqBiP,OAAS,GAAKjP,EAAE,qBAAqBiP,OAAS,GACvGjP,EAAE,uBAAuBiP,OAAS,GAAKjP,EAAE,uBAAuBiP,OAAS,GAAKjP,EAAE,uBAAuBiP,OAAS,KACrH8hC,GAAc,EAEhB,IAAIC,GAAiBhxC,EAAE,qBAAqBiP,OAAS,EAAIjP,EAAE,qBAAqB,GAAGixC,QAAUF,EACzFG,EAAiBlxC,EAAE,qBAAqBiP,OAAS,EAAIjP,EAAE,qBAAqB,GAAGixC,QAAUF,EACzFI,EAAiBnxC,EAAE,qBAAqBiP,OAAS,EAAIjP,EAAE,qBAAqB,GAAGixC,QAAUF,EACzFK,EAAqBpxC,EAAE,uBAAuBiP,OAAS,EAAIjP,EAAE,uBAAuB,GAAGixC,QAAUF,EACjGM,EAAsBrxC,EAAE,uBAAuBiP,OAAS,EAAIjP,EAAE,uBAAuB,GAAGixC,QAAUF,EAClGO,EAAkBtxC,EAAE,uBAAuBiP,OAAS,EAAIjP,EAAE,uBAAuB,GAAGixC,QAAUF,CAChF/wC,GAAE,WAAWqF,KAAK,yCAIlB,IAAd2D,EAAIiG,SACNjG,EAAMhJ,EAAE,YAGV,IAAIuxC,GAAMvoC,EAAI3D,KAAK,mBACfmsC,EAAMxoC,EAAI3D,KAAK,0BACfgoC,EAAUrtC,EAAEwxC,GAAKzO,KAAK,mBAEtB0O,GAAgB,EAChBC,GAAkB,CAoBtB,KAlBKJ,GAAoBD,GAAwBD,KAErCE,GAAoBD,GAAwBD,GAAuBF,GAEpEI,IACTG,GAAgB,GAJhBA,GAAgB,EAObT,GAAmBE,GAAmBC,IACzCO,GAAkB,IAGhBV,IAAkBM,GAAoBJ,GAAmBG,GAAwBD,IACnFK,GAAgB,GAKdA,EAAe,CACjB,GAAIE,GAAc,wIAEc7pC,EAAE,gCACN,YAEN,IAAlBulC,EAAQp+B,QAAajP,EAAEwxC,GAAKI,OAAOD,GAEvCH,EAAItrC,KAAK,YAAY,GACrBsrC,EAAI3wC,SAAS,gBAGTwsC,GAAQp+B,OAAS,GAAGo+B,EAAQwE,SAEhCL,EAAIpG,WAAW,YACfoG,EAAI/wC,YAAY,WAGdixC,IAEFH,EAAIrrC,KAAK,YAAY,GACrBqrC,EAAI1wC,SAAS,kBAGb0wC,EAAInG,WAAW,YACfmG,EAAI9wC,YAAY,iBAGpB,QAASqxC,gBAAejB,GAEtBD,+BAA+BC,EAAS,0BAE1C,QAASkB,kBAAiBlB,GACxBD,+BAA+BC,EAAS,0BAE1C,QAASmB,+BAA8BnB,GACrCD,+BAA+BC,EAAS,0BAK1C,QAASoB,uBAAsB1iC,GAC7B9J,OAAOw7B,SAAW,WAAciR,WAAW3iC,IAG7C,QAAS2iC,YAAW3iC,GAClB,GAAI+C,GACA8uB,EAAWvE,YAAYvK,SAASrpB,MAAM,EAa1C,OAZAjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,0BAA4Byb,EACjCtgC,KAAM,WAAayO,EAAM,KACzBqe,OAAO,EACP4T,QAAS,SAAUj5B,GACjB+J,EAAI/J,EAAIoK,KAGZqqB,kBAAkB1qB,GACXA,EAGT,QAAS6/B,wBACPnyC,EAAE,wBAAwBa,SAAS,YAAYqF,KAAK,WAAY,YAIlE,QAASksC,wBAAuBC,GAC9B,GAAIC,GAAetyC,EAAE,mBAErB,IAAIsyC,EAAarjC,OAAS,EACxB,GAAsC,QAAlCqjC,EAAaxxC,KAAK,cACpB,GAAqC,QAAjCwxC,EAAaxxC,KAAK,YAAuB,CAC3C,GAAI4D,GAAK4tC,EAAaxxC,KAAK,MACvByxC,EAAaD,EAAaxxC,KAAK,WAC/B0xC,EAAkD,QAApCF,EAAaxxC,KAAK,cAEpC,IAAI4F,GAAGkoB,MAAM6jB,eAAwC,mBAAfF,IAAgC,GAAKA,GAAe,KAAgC,YAAxBG,oBAChG,GAAIF,EAAa,CACf,GAAIG,IAAe,CACsB,SAArCL,EAAaxxC,KAAK,kBACpB6xC,GAAe,EAIjB,IAAIC,GAAU,GAAIlsC,IAAG6e,KAAK7gB,EAAI6M,YAAYC,UACtC8gC,GAAaxxC,KAAK,aAAekhB,+BAA+BC,KAClEtX,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,WACtCogC,gBAAgBpuC,EAAI6tC,EAAYI,KAC/BzpB,KAAK,WACFmpB,GACFO,EAAQ9R,SAMZ8R,EAAQ9R,WAKViS,gBAAgBhoB,MAAOjjB,EAAE,QAASc,KAAMd,EAAE,4BAA6BwqC,EAAavtC,QAASiuC,OAAQlrC,EAAE,MAAO3C,OAAQ,OAAQ/C,MAAO,QAAS6wC,oBAAoB,QAIpKX,GAAaluC,aAMjBy6B,WAAU/2B,EAAE,gCAqDlB,QAASorC,cAAa3H,GACpB,GAAI4H,GAAY,WACd3U,eAAe12B,EAAE,gBAAgB,GACrB,mBAARkD,GACF80B,qBAEFlC,SAAS,QAAU2N,EAAU,2BAA2B,GAG1D,IAAe,QAAXA,GAAqBvrC,EAAE,iBAAiBiP,OAC1CtE,KAAKiD,QAAQwlC,UAAU,OAClB,CACL,GAAIpoC,GAAOvF,OAAO6sB,SAASE,SAASnP,aAChCrY,GAAKuB,QAAQ,gBAAiB,EAChC++B,aAAaC,GACNvgC,EAAKuB,QAAQ,mBAAoB,EACxC0hC,gBAAgB1C,GACD,mBAARvgC,GAA+BkyB,cAAc,SAAkD,QAAvCA,cAAc,QAAQ7Z,cAUrF8vB,IATInzC,EAAE,2CAA2CiP,OAC/CvI,GAAGmE,GAAGgD,KAAKwlC,cAAcF,GAAW,EAAO,GACzCG,eAAe,IAGjBH,KAQR,QAASpiC,UAAS0N,GAChB,MAAQA,GAAI,GAAM,IAAMA,EAAIA,EAM9B,QAAS80B,0BAEP,MADA3V,UAAS,cACF,EAGT,QAAS4V,kBACP9sC,GAAGmE,GAAGpF,OAAOguC,iBAGf,QAASC,YACP1zC,EAAE,WACAA,EAAEyF,QAAQkuC,OAAO,WAAcC,kCAC/BC,wBACAC,0BACAC,kBACAC,iBAEFzmC,SAAS0mC,SAAS,WAChBxsC,WAAW,WACTosC,yBACC,OAKP,QAASK,qBAAoB/+B,EAAKrU,EAAM4D,EAAIyvC,EAAiBC,EAAqBvb,EAAQO,GACxF,GAAY,MAARt4B,EAAc,CACZd,EAAE8jB,WAAWqwB,IAAkBA,EAAgBrzC,EAAK,GAExD,IAAIuzC,GAAyBxb,EAAO5pB,OAAS,GAAKmqB,EAAOnqB,OAAS,CAC9DolC,KACFC,OAAO5vC,GAAI,EAAM00B,GACjBmb,WAAW7vC,IAAO6vC,WAAW7vC,GAAI5D,EAAK,IACtC0zC,aAAa9vC,IAAO8vC,aAAa9vC,MAGnCyQ,EAAIs/B,aAGAL,IAAqBD,EAAgB,MACzCG,OAAO5vC,GAAI,EAAO00B,GAItB,QAASsb,0BAAyBv/B,EAAKrU,EAAMqzC,GACpB,MAAnBA,GAAyBA,EAAgBh/B,EAAKrU,GAOpD,QAAS6zC,4BAA2BjwC,EAAIm0B,EAAQM,EAAQC,GAGtDwb,gBAAgBlwC,GAAM,WAEpB,IAAK,GADD0Q,GAAM,GACD1M,EAAI,EAAGA,EAAImwB,EAAO5pB,OAAQvG,IAAK,CACtC,GAEImsC,GAFAC,EAAcjc,EAAOnwB,GAAG0H,MAAM,KAC9B2kC,EAAoBD,EAAY,EAGlCD,GADyB,IAAvBC,EAAY7lC,OACQ,GAEA6lC,EAAY,GAGpC1/B,GAAO+jB,EAAOzwB,GAAK,IAAMmsC,EAAsB,IAAMja,SAASma,GAAqB,IAErF,MAAO3/B,IAITm/B,WAAW7vC,GAAM,SAAUswC,GAGzB,IAAK,GAFDC,GAAKj1C,EAAEsoB,UAAU0sB,GAEZtsC,EAAI,EAAGA,EAAImwB,EAAO5pB,OAAQvG,IAAK,CACtC,GAAIwsC,GAAaD,EAAG9b,EAAOzwB,IACvBqsC,EAAoBlc,EAAOnwB,GAAG0H,MAAM,KAAK,EAE7C,KAAKpQ,EAAEm1C,cAAcD,GAAa,CAChC,GAAI//B,GAAMnV,EAAE,SAAW+0C,EACvB,IAAI5/B,EAAIlG,OAAS,EAAG,CAClB,GAAI6qB,GAAK3kB,EAAIrU,KAAK,2BACdw6B,EAAUxB,EAAGsb,kBAEb5Z,EAAe1B,EAAG0B,YAElB1B,GAAG2B,0CAA4C3B,EAAG2B,yCAAyCH,KAC7FE,EAAeE,KAAKC,MAAMH,GAC1BA,EAAaI,gBAAkB9B,EAAG2B,yCAAyCH,GAAS1R,OACpF4R,EAAeE,KAAKG,UAAUL,GAGhC,IAAI7V,GAAMmU,EAAGnU,IACT5W,EAAS/O,EAAE4C,QACb8a,EAAG,GACHoe,OAAQ,QAAUoZ,EAAW,GAC7BnZ,cAAejC,EAAGiC,cAAgB,IAAM,IACxCC,yBAA0B,IAC1BR,aAAcA,GACb1B,EAAGC,gBAEND,GAAGub,aAAajZ,UAAUzW,EAAK5W,EAAQ,SAAWumC,GAChD,MAAO,UAAUjZ,EAAO9zB,GACtB,GAAIzH,GAAOyH,EAAI,EACXzH,IAAwC,OAAhCA,EAAKw7B,wBACfiY,WAAWe,GAAoBx0C,EAAKw7B,0BAGvCyY,IAGL/0C,EAAE,IAAM+0C,GAAmBQ,SAASL,GAAYT,YAMtDD,aAAa9vC,GAAM,WACjB,IACE,IAAK,GAAIgE,GAAI,EAAGA,EAAI0wB,EAAOnqB,OAAQvG,IACjC8sC,iCAAiCpc,EAAO1wB,GAAIksC,gBAAgBxb,EAAO1wB,KAErE,MAAO01B,MAMb,QAASkW,QAAO9uB,EAAIiwB,EAAeC,GACjC,GACIC,GADAC,IAEJ,KAGE,IAFmBA,EAAfH,EAAqBG,EAAIz0B,OAAOu0B,GACzBE,EAAIz0B,OAAOqE,EAAIkwB,GACrBhtC,EAAI,EAAGA,EAAIktC,EAAI3mC,OAAQvG,IAAK,CAC/BitC,EAAWC,EAAIltC,EACf,IAAIyM,GAAMnV,EAAE,IAAM21C,EAClBxgC,GAAIogC,SAAS,MAAMd,UAErB,MAAOrW,KAIX,QAASxD,UAASib,EAAO1gC,GACvB,GAAIwJ,GAAI3e,EAAE,WAAa61C,GAAOzgC,KAC9B,OAAoB,mBAALuJ,GAAmB,GAAKA,EAGzC,QAAS62B,kCAAiC9wC,EAAIoxC,GAC5C,GAAIC,GAAS/1C,EAAE,IAAM0E,GAAIwB,KAAK,SAC9BlG,GAAE,IAAM0E,GAAIsxC,QACZh2C,EAAEqhC,MACAt4B,KAAM,MACNw4B,SAAU,OACV5b,IAAKowB,EAAS,cAAgBE,UAAUH,KACxCjoB,OAAO,EACP2T,QAAS,SAAUj5B,GACjB,GAAIgxB,GAAOhxB,EAAI6H,MAAM,OACjBmpB,GAAKtqB,OAAS,GAAgB,SAAXsqB,EAAK,IAAgC,GAAfA,EAAKtqB,QAChDjP,EAAE,IAAM0E,GAAI6wC,SAAShc,EAAK,GAAGnpB,MAAM,MAAMqkC,YAOjD,QAASyB,iBAAgBrzC,EAAIszC,EAAUC,GAIrC,QAASC,GAAevqC,EAAOwqC,EAAUF,GACvB,MAAZE,GAAgC,IAAZA,GACtBxqC,EAAMhL,KAAK,aAAe4D,GAAI4xC,EAAUC,SAAUH,IAClDtqC,EAAMrL,YAAY,YAAY+1C,KAAK,QACnCC,0BAA0B3qC,IAE1BA,EAAM4qC,WAAW,aAAaj2C,YAAY,YAAY+1C,KAAK,QAAQA,KAAK,WAT5E,GAAIG,GAAQ9zC,EAAGqD,KAAK,KACpBrD,GAAGhC,SAAS,QAAQC,KAAK,aAAe4D,GAAIyxC,EAAUI,SAAUH,IAAW31C,YAAY,YAAY+1C,KAAK,QAYxG3zC,EAAGygB,KAAK,aAAc,WACpB+yB,EAAer2C,EAAEmB,MAAOnB,EAAE,WAAa22C,GAAOvhC,MAAOghC,KAEvDvzC,EAAGuhB,OAAO,SAAU5f,EAAO1D,GACzBu1C,EAAer2C,EAAEmB,MAAgB,MAARL,EAAeA,EAAK,GAAK,KAAOs1C,KAwC7D,QAAS92B,YAAW1W,GAClB,OAAQ,GAAKA,GAAM0W,aA4CrB,QAASs3B,yBACPlwC,GAAGwnB,SAASltB,KAAK,6BAA+BykB,KAAQ/e,GAAGuE,cAAeua,GAAM0X,cAAc,QAASsE,QAAQ,SAAUpd,GACvH,GAAItW,GAAS,GAAIke,WAAUiC,WAAWhH,QAAQ6D,UAC9Chd,GAAOkd,QAAQ7pB,KAAKioB,OAAOrkB,MAC3B+I,EAAO1L,MAAQ,QACf0L,EAAO3I,OAAS,OAChB2I,EAAOid,MAAQ5pB,KAAKioB,OAAO2B,MAC3Bjd,EAAOklC,OAASlrC,EAAE,SAClBgG,EAAO1K,OACPyzC,8BAA8B,iBAC7BnlB,MAAM,SAAUA,GACjBjO,QAAQC,IAAIgO,KAh3Da,mBAAlBjsB,QAAOge,QAChBhe,OAAOge,SAAYC,IAAK,aAAiBozB,MAAO,cAChB,MAAvBpwC,GAAGC,IAAI4M,QAAQnI,OACxB2rC,iBAAmBtxC,OAAOge,QAC1Bhe,OAAOge,SACLC,IAAK,SAAUkO,GAkBb,QAASolB,GAAIC,GACX,IAAK3nC,IAAK2nC,GACRF,iBAAiBrzB,IAAIpU,EAAI,KAAO2nC,EAAO3nC,GAAG+Q,WAAWjD,MAAM,KAAKhN,MAAM,MAAM,IAjBhF,GAAsB,gBAAXwhB,GAET,WADAmlB,kBAAiBrzB,IAAIkO,EAIvB,IAAsB,kBAAXA,GAET,WADAmlB,kBAAiBrzB,IAAIkO,EAAQvR,WAI/B,IAAIuR,GAA6B,gBAAXA,IAAsD,mBAAxBA,GAAkB,SAEpE,WADAmlB,kBAAiBrzB,IAAI,kBAAoBkO,EAAQslB,SASnD,KACEH,iBAAiBrzB,IAAIszB,EAAIplB,IACzB,MAAOulB,GACPJ,iBAAiBrzB,IAAIkO,KAEtBklB,MAAO,cAsId,IAAIlX,eAsDAD,wBAoyCAzM,YAAakkB,iBAEjB,WAOE,QAASC,GAAoBC,EAAgBvoC,EAAQwvB,EAAU7M,EAAO9D,GACpE7e,EAASA,KACT,IAAIwoC,GAAgB,WAAkB7lB,GAAOA,EAAMxQ,MAAM,KAAMlS,WAC/DhP,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK2xB,EACLx2C,KAAMd,EAAEwkB,OAAOzV,GACf6e,MAAOA,EACPC,OAAO,EACP2T,QAAS,SAAUj5B,GACjB,MAAKA,IAILA,EAAMA,EAAIoK,OACNqqB,kBAAkBz0B,IACE,mBAAbg2B,IACTA,EAASh2B,SANTgvC,MAQJ7lB,MAAO6lB,IAIXrkB,YAAc,SAAUokB,EAAgBvoC,EAAQwvB,EAAU7M,GACxD2lB,EAAoBC,EAAgBvoC,EAAQwvB,EAAU7M,GAAO,IAG/D0lB,gBAAkB,SAAUE,EAAgBvoC,EAAQwvB,EAAU7M,GAC5D2lB,EAAoBC,EAAgBvoC,EAAQwvB,EAAU7M,GAAO,MA8FjE,IAAIkjB,oBACAL,cACAC,gBA4IAgD,aAAe,SAAUjZ,EAAUgN,EAASkM,GAC9B,SAAZlM,IAAoBkM,EAAa;AAErC,GAAIC,GAAKhxC,GAAGmE,GAAG+C,OAEX8pC,IAAIA,EAAG10B,KAAK00B,EAAU,MAAEz0B,MAAM00B,kBAAmBD,EAAGpjB,KAAKiX,GAE7D,IAAItnB,IAAQ,EACR2zB,EAAqB,WACvB,GAAIzkC,EAKJ,OAJIorB,KACFprB,EAAIorB,KAENta,GAAQ,EACD9Q,EAETskC,GAAaA,GAAc,EAE3B,IAAII,GAAS73C,EAAE,gBAAgB87B,OAAO,SAAWyP,EAAU,KAEvDnnB,EAASpkB,EAAE,QAAQ83C,eAAe,gBAAiBvM,EAASkM,EAAYG,EAAoBC,GAC3F5zB,IAA2B,mBAAVG,KAAyBA,GAC7CwzB,IAGEF,GAAIA,EAAG10B,KAAK00B,EAAU,MAAEz0B,MAAM80B,iBAAkBL,EAAGpjB,KAAKiX,IAqB9DvrC,GAAE4B,GAAGo2C,QAAU,SAAU5sC,GACvB,MAA2BkV,UAApBnf,KAAK+E,KAAKkF,IAYnB6sC,sBAAwB,SAAUC,EAAO3oC,EAAK2Q,GAC5C,IAAK,GAAIxX,GAAI,EAAGmK,EAAMqlC,EAAMjpC,OAAQvG,EAAImK,EAAKnK,IAC3C,GAAIwvC,EAAMxvC,GAAG6G,KAAS2Q,EACpB,MAAOxX,EAGX,QAAO,GAOTN,SAASlF,UAAU4e,SAAW,SAAUlB,GACtC,GAAImB,GAAgB5gB,IACpB,OAAO,YAEL,MADAA,MAAK4gB,cAAgBA,EACdnB,EAAKM,MAAM/f,KAAM6N,aAuB5BhP,EAAE4B,GAAGu2C,YAAc,SAAUn6B,GAC3B,MAAO7c,MAAK26B,OAAO,WACjB,QAAS97B,EAAEmB,MAAMi3C,QAAQp6B,GAAG/O,UAQhCjP,EAAEq4C,YAAc,WACd,GAAIC,MACAl0B,EAASpkB,EAAE0nB,UAgCf,OA9BA1nB,GAAEkB,KAAK8N,UAAW,SAAUtG,EAAGwnB,GAC7B,GAAIqoB,GAAkBv4C,EAAE0nB,UACxBwI,GAAQpG,KAAK,WACXyuB,EAAgBtvB,SAAQ,EAAOja,YAC9B,WACDupC,EAAgBtvB,SAAQ,EAAMja,aAEhCspC,EAAU5jC,KAAK6jC,KAGjBv4C,EAAEiwB,KAAK/O,MAAMlhB,EAAGs4C,GAAWxuB,KAAK,WAC9B,GAAI0uB,MACAC,IAWJ,OATAz4C,GAAEkB,KAAK8N,UAAW,SAAUtG,EAAGsY,GAG7B,GAAI1Z,GAAS0Z,EAAK,GAAKw3B,EAAWC,EAC9B33C,EAAOkgB,EAAK,EAEhB1Z,GAAOoN,KAAK5T,GAAwB,IAAhBA,EAAKmO,OAAenO,EAAK,GAAKkgB,KAGhDw3B,EAASvpC,OACJmV,EAAOiF,OAAOnI,MAAMkD,EAAQo0B,GAG9Bp0B,EAAO6E,QAAQ/H,MAAMkD,EAAQq0B,KAG/Br0B,GAQT,WACE,GAAIs0B,GAAa,cACbC,GAAY,GAAI/iC,OAAOusB,UACvByW,EAAgB,KAEhBC,EAAa,WACf,MAAO74C,GAAE4yB,OAAO8lB,IAGdI,EAAa,WACf,GAAIn2C,IAAYo2C,QAAS,GAAInjC,OAAK,GAAKA,OAAMusB,UAAY,KACzDniC,GAAE4yB,OAAO8lB,EAAYC,EAAWh2C,IAG9Bq2C,EAAa,WACf,GACIpoC,GAAU,IACVqoC,EAAY,WAEVJ,IAAcC,IACY,UAArBpyC,GAAGuE,gBACViuC,0BAA2B,GAI1BN,KAAeA,EAAgBO,YAAYF,EAAWroC,IAC3DqoC,IAGuB,WAArBvyC,GAAGuE,cAA2B6tC,IAE7BrxC,WAAW,WACdyxC,0BAA2B,EAC3BJ,KACC,KAEHE,OAIF,WACEvzC,OAAO2zC,aAAe,WACpB,OAAO,GAGT3zC,OAAO4zC,cAAgB,WACrB,MAAO;CC78DX,SAAWvsB,GAiET,QAASwsB,GAAiBC,GACxB,GAAInlB,KAeJ,OAVIA,GAHEmlB,EAEqB,aAArB7yC,GAAGuE,eAAqD,qBAArBvE,GAAGuE,cAChCuuC,EAAwBD,GAGxBE,EAAiBF,GAInBG,IAYZ,QAASD,GAAiBE,GAGxB,QAEIn0B,GAAIm0B,EAAQj1C,GACZ+gB,KAAMk0B,EAAQ5wC,KAAK,GACnB6wC,SAAYD,EAAQE,QAAUF,EAAQE,QAAU,GAChDnsC,YAAaisC,EAAQrwC,GAAKqwC,EAAQrwC,GAAGjE,KAAK,kBAAkBuD,OAASkxC,MAK3E,QAASA,KACP,OAAQ9tB,UAAU/gB,eAChB,IAAK,MAAO,MAAO+gB,WAAUmF,IAAI4oB,OACjC,KAAK,OAAQ,MAAO/tB,WAAUkF,KAAK6oB,OACnC,KAAK,MAAO,MAAOrzC,IAAG0qB,SAAS4oB,IAC/B,KAAK,YAAa,MAAOhuB,WAAUqF,gBAAgB4oB,iBAAmB,KAAOjuB,UAAUqF,gBAAgB2oB,IACvG,SAAS,MAAO,IAUpB,QAASR,GAAwBU,GAC/B,GAAI7wC,KAcJ,OAbAA,GAASqL,KAAKhO,GAAGmE,GAAG8pB,WAAWwlB,WAAWD,EAAmBx1C,KAErC,IAApB2E,EAAS4F,QAAuC,mBAAhB5F,GAAS,KAC3CA,EAAS,GAAK6wC,EAEVA,YAA8B3sC,SAAU2sC,YAA8BE,cAA2C,kBAA5BF,EAAmBnxC,KAC1GM,EAAS,GAAG+B,KAAO8uC,EAAmB5wC,GAAGjE,KAAK,yBAAyBuD,OAEnEsxC,EAAmBG,OACrBhxC,EAAS,GAAG+B,KAAO8uC,EAAmBG,KAAKC,UAI1CC,EAAmBlxC,GAQ5B,QAASqwC,KACP,GAAIrwC,GAAW3C,GAAGmE,GAAG8pB,WAAW6lB,kBAChC,OAAOD,GAAmBlxC,GAS5B,QAASkxC,GAAmB73C,GAC1B,GAAI0xB,GAAQ3pB,EAAE/H,GAAO+a,IAAI,SAAUzV,GACjC,GAAIyyC,GAAOzyC,EAAKoD,IAChB,IAAIpD,EAAK0yC,eAAsC,qBAArBh0C,GAAGuE,cAAsC,CAEjE,GAAI0vC,GAAa36C,EAAE,uBAAuBc,KAAK,YAC/C25C,GAAOE,EAAa,KAAO3yC,EAAKoD,KAElC,OACEoa,GAAIxd,EAAKtD,GACT+gB,KAAMzd,EAAKu3B,KAAK,GAAGrtB,cACnB0nC,SAAU5xC,EAAK0yC,cAAgB1yC,EAAK0yC,cAAgB,GACpDhtC,YAAa+sC,IAGjB,OAAOrmB,GAGT,QAASwmB,GAAkB7xC,GACzB,OAAQA,EAAK,GAAGmJ,eACd,IAAK,IAAK,MAAO,MACjB,KAAK,IAAK,MAAO,KACjB,KAAK,IAAK,MAAO,KACjB,KAAK,IAAK,MAAO,MACjB,KAAK,IAAK,MAAO,MAEnB,MAAO,GA2CT,QAAS2oC,KACP,MAA+B,YAA3B7uB,UAAU/gB,eAAwD,IAAzBiyB,cAAc,QAClDA,cAAc,MAEhB,KAuDT,QAAS4d,GAAmBC,EAAQ3mB,EAAO4mB,EAAQzc,GACjDrL,YAAY,yBAA2Bub,SAAUsM,EAAQE,MAAO7mB,GAAS,SAAU7rB,GACjF,GAAIA,EAAIm2B,QAAS,CACf,GAAI/rB,GAAI3S,EAAE0nB,UAEK,OAAVszB,GAAuC,MAAnBA,EAAOE,UAAqBF,EAAOE,UAAYx0C,GAAGwpB,QAAQirB,SAAiC,MAAtBH,EAAOI,WACnGzoC,EAAIjM,GAAGwnB,SAASltB,KAAK,4BAA8BytC,SAAUuM,EAAOE,SAAUD,MAAO7mB,IAErFzhB,EAAEsW,UAGJtW,EAAEogB,OAAO,WACFiK,kBAAkBz0B,KACH,GAAdA,EAAI6gB,OACkB,mBAAbmV,IACT8c,0BACA9c,MAGA73B,GAAGmE,GAAG8pB,WAAWzH,SAAS6F,OAAO,WAAcsoB,4BAE3C5wC,EAAE6wC,KAAKlnB,EAAO,SAAUvxB,GAAM,MAAOA,GAAGkG,MAAQwI,YAAYE,UAC9D/K,GAAGmE,GAAG0wC,WAAWC,iBAAiBT,GACpCpc,eAAe72B,EAAE,eAAgBS,EAAI6gB,QAAS,MAGxB,mBAAbmV,IACTI,eAAe72B,EAAE,sBAAuB,YAKhD62B,gBAAe72B,EAAE,YAAaS,EAAIse,OAAQ,OAKhD,QAAS40B,GAA2BxU,EAAO7S,EAAOmK,GAChDrL,YAAY,4CAA8CyS,OAAQsB,EAAOgU,MAAO7mB,GAC9E,SAAU7rB,GACJA,EAAIm2B,QACD1B,kBAAkBz0B,KACH,GAAdA,EAAI6gB,QACNiyB,0BACuB,mBAAZ9c,GACTA,IAEAv+B,EAAE,cAAcg+B,UAEK,mBAAZO,IACTI,eAAe72B,EAAE,sBAAuB,MAI9C62B,eAAe72B,EAAE,YAAaS,EAAIse,OAAQ,OAKlD,QAAS60B,GAAkBC,EAAQC,EAAUV,EAAU3c,GACrDrL,YAAY,4BAA8ByoB,OAAUA,EAAQC,SAAYA,EAAUV,SAAYA,GAAY,SAAU3yC,GAC7Gy0B,kBAAkBz0B,KACH,GAAdA,EAAI6gB,QACNiyB,0BACuB,mBAAZ9c,GACTA,IAEiB,WAAbqd,GAEFl1C,GAAGmE,GAAG8pB,WAAWzH,SAEbziB,EAAE6wC,QAAS,SAAUz4C,GAAM,MAAOA,GAAGkG,MAAQwI,YAAYE,UAC3D/K,GAAGmE,GAAG0wC,WAAWC,iBAAiBG,GACpChd,eAAe72B,EAAE,eAAgBS,EAAI6gB,QAAS,MAE9CppB,EAAE,cAAcg+B,UAGG,mBAAZO,IACTI,eAAe72B,EAAE,sBAAuB,QAhWlDglB,EAAO+uB,eAAiB,SAAUC,EAAUC,GAC1Cr1C,GAAGmnB,MAAMmuB,QAAQ,WAAYF,GAC7Bp1C,GAAGmnB,MAAMmuB,QAAQ,aAAcD,IASjCjvB,EAAOmvB,UAAY,SAAUC,GAC3BL,eAAe,KAAM,MAErBrd,gBACA,IAAIpK,GAAQklB,EAAiB4C,EAE7BvxC,MAAKwxC,UAAUC,qBAAqBhoB,GAAO1hB,KAAK,SAAU2pC,GACxD1d,eAAe72B,EAAE,eAAgBu0C,GAAmB,OACnDnzB,KAAK,SAAUozB,GAChB3d,eAAe2d,EAAa,QAUhCxvB,EAAOyvB,SAAW,SAAUL,GAC1B1d,gBAEA,IAAI2P,GAAW0M,GAGC,OAAZ1M,EACF0N,eAAe,KAAM,MAErBA,eAAe1N,EAAU,IAG3B,IAAI/Z,GAAQklB,EAAiB4C,EAE7BvxC,MAAKwxC,UAAUC,qBAAqBhoB,GAAO1hB,KAAK,SAAU2pC,GACxD1d,eAAe72B,EAAE,YAAau0C,GAAmB,OAChDnzB,KAAK,SAAUozB,GAChB3d,eAAe2d,EAAa,QAqIhCxvB,EAAO0vB,8BAAgC,SAAUpoB,GAE/C,IAAK,GADDqoB,MACK/zC,EAAI,EAAGA,EAAI0rB,EAAMnlB,OAAQvG,IAAK,CACrC,GAAIqG,IACFuxB,KAAQsa,EAAkBxmB,EAAM1rB,GAAG+c,MACnCD,GAAM4O,EAAM1rB,GAAG8c,GACfo0B,SAAYxlB,EAAM1rB,GAAGkxC,SACrB8C,KAAQtoB,EAAM1rB,GAAGgF,YAEnB+uC,GAAe/nC,KAAK3F,GAEtB,MAAO0tC,IAST3vB,EAAO6vB,8BAAgC,SAAUC,GAE/C,IAAK,GADDH,MACK/zC,EAAI,EAAGA,EAAIk0C,EAAW3tC,OAAQvG,IAAK,CAC1C,GAAIqG,IACF0W,KAAQm3B,EAAWl0C,GAAG43B,KAAK,GAC3B9a,GAAMo3B,EAAWl0C,GAAG8c,GACpBo0B,SAAYgD,EAAWl0C,GAAGkxC,SAC1BlsC,YAAekvC,EAAWl0C,GAAGg0C,KAE/BD,GAAe/nC,KAAK3F,GAEtB,MAAO0tC,IAUT3vB,EAAO+vB,6BAA+B,WACpC,MAAqC,aAA9Bn2C,GAAGmpB,eAAetC,WAA4B7mB,GAAGmE,GAAG8pB,YAAcjuB,GAAGmE,GAAG8pB,WAAWmoB,gBAW5FhwB,EAAOiwB,WAAa,SAAUC,EAAUjC,EAAQxc,GAC9C,GAAqB,IAAjB0e,cAEF,WADAC,sBAAqBD,cAAe,IAIf,oBAAZ1e,IACTC,eAAe12B,EAAE,gBACH,MAAZk1C,IAAkBA,EAAW,UACZ,mBAAVjC,IAAmC,MAAVA,IAAgBA,EAASF,IAE7D,IAAIG,IACFE,SAAUx0C,GAAGmnB,MAAMsvB,QAAQ,YAC3B/B,WAAY10C,GAAGmnB,MAAMsvB,QAAQ,cAG/BnxB,WAAU4C,MAAMkE,kBAAkB,aAAaC,OAAO,SAAUC,GAC1DA,EACFhH,UAAU4C,MAAMutB,UAAUiB,wBAAwB1qC,KAAK,SAAU0hB,GAC/D,GAAIA,EAAMnlB,OAAS,GAAqB,gBAATmlB,GAE7B,OAAQ4oB,GACN,IAAK,SAAUlC,EAAmBC,EAAQ3mB,EAAO4mB,EAAQzc,EAAW,MACpE,KAAK,YAAakd,EAA2BV,EAAQ3mB,EAAOmK,OAK9DI,oBAEDzV,KAAK,WACNwyB,EAAkBX,EAAQiC,EAAUhC,EAAOE,SAAU3c,KAGvDmd,EAAkBX,EAAQiC,EAAUhC,EAAOE,SAAU3c,GAEvDsd,eAAe,KAAM,SAqGzB/uB,EAAOuwB,YAAc,SAAUtjB,EAAa3F,EAAOkpB,EAAYxB,EAAUyB,EAAqBC,EAAqBC,GAe/G,QAASC,KACP,GAAIpW,GAAM5gC,GAAGuE,aACb,QAAQq8B,GACN,IAAK,WACH,MAAO,QACT,KAAK,MACH,MAAO,WACT,KAAK,MACH,MAAO,KACT,KAAK,OACH,MAAO,MACT,SACE,MAAO,UAIb,QAASqW,KACPnf,eAAe12B,EAAE,iBACjBorB,YAAY,uCACV+nB,MAAO2C,EACP1C,SAAW2C,GAAa3gB,cAAc,MACtCke,WAAYsC,IACZI,eAAgBp3C,GAAGmE,GAAG8pB,WAAWopB,gBACjCC,qBAAsBt3C,GAAGmE,GAAG8pB,WAAWspB,0BACvCC,iBAAkBx3C,GAAGmE,GAAG8pB,WAAWwpB,uBAClC,SAAU51C,GACPA,EAAIm2B,SACNn2B,EAAMA,EAAI6gB,OACC,GAAP7gB,GACqB,UAAnBm1C,KACFh3C,GAAGmE,GAAG8pB,WAAWzH,SAASxa,KAAK,WACzBhM,GAAGmE,GAAG0wC,YACR70C,GAAGmE,GAAG0wC,WAAW6C,sBAAsB13C,GAAGmE,GAAGswC,WAEjDkD,aAAar+C,EAAE,uBAAwBA,EAAE,YACzCs+C,uBACA3f,eAAe72B,EAAE,gBAAiBS,GAAM,KACxC8yC,2BAEAr7C,EAAE,cAAcg+B,SAEdh+B,EAAE8jB,WAAW05B,IAAsBA,KAEzB,IAAVxf,GAAcW,eAAe72B,EAAE,yBAA0B,MAG/D62B,eAAep2B,EAAIse,MAAO,OA5DlC,GAAImX,GAA+B,mBAAdsf,GAA4B,GAAKA,EAClDO,EAAgC,mBAAZ/B,GAA0B,GAAKA,CAEvD,IAAK2B,GAA+B,IAAjBR,cAEZ,CACc,MAAfljB,IAAqBA,EAAc,GACvC,IAAI6jB,KAGFA,GADkB,mBAATxpB,IAAiC,MAATA,EACjBmqB,gBAAgBnqB,MAEhBA,EAqDdwpB,EAAc3uC,OAAS,GACzBsuC,EAAsBA,GAAuD,mBAAxBA,GACjDA,EACFiB,cAAcZ,EAAc3uC,QAAQyD,KAAK,WACvCirC,MAIFA,KAIFT,qBAAqBp1C,EAAE,wBAAyB,SAzElDo1C,sBAAqBD,cAAe,OA6EvCx3C;ACxdH,QAASg5C,mBAAkBC,GACzB,GAAI12C,GAAO02C,EAAIp1C,GACXq1C,EAAU32C,EAAK9B,KAAK,WACpB0gC,EAAW5+B,EAAK9B,KAAK,YACrB+tB,EAAajsB,EAAK9B,KAAK,gBAC3B04C,iBAAgBF,EAAIh6C,GAAIi6C,EAAW/X,EAAWA,EAAW,GAAM3S,EAAaA,EAAa,IAI3F,QAAS2qB,iBAAgBC,EAAYC,EAAeC,EAAc9qB,EAAY+qB,EAAUC,GACtFt0C,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChD,GAAIyrB,GAA4B,SAAUpxC,EAAQqxC,GAChD,GAAIpwC,IAAWk2B,WAAc4Z,EAAY3X,QAAW4X,EAAe1X,WAAc2X,EAAc1X,qBAAwBpT,EAEjHkrB,IAAkBn/C,EAAE4C,OAAOmM,EAAQowC,GAEzCC,wBAAwBrwC,EAAQ,SAAUqV,GACxC,GAAIi7B,GAAgBv3C,EAAE,kCACtBo1C,sBAAqBmC,GACrBC,2BAA2BT,EAAYC,IACtC,SAAU3sB,GACX,GAAIktB,GAAgB,EACpB,KACEA,EAAgBltB,EAAIP,QACpB,MAAOrsB,GACP85C,EAAgBv3C,EAAE,gCAEpB+2B,UAAUwgB,MAGVE,EAAaxvC,eAAe,GAAI6F,MAAKqpC,EAAWA,EAAWO,gBAAgBX,EAAYC,KACvFW,EAAW5wC,OAAO/G,EAAE,oCAAsC43C,EAAGZ,EAAea,EAAIX,EAAWA,EAAWY,oBAAoBf,KAAiBv/B,aAC3IwU,EAA4E,WAAlE+rB,2BAA4BhB,EAAa,IAAMC,GAA+B,GAAMjwC,OAAO/G,EAAE,oBAAsB43C,EAAGH,IAAejgC,YACnJwgC,kCAAiCL,EAAS3rB,EAAS,SAAUhmB,GAC3D,MAAIiyC,yBAAwBlB,IAAe,MACzC1Y,8BAA6B,KAAM,SAAU6Z,GAAQd,EAA0BpxC,GAAUo3B,SAAU8a,UAGrGd,GAA0BpxC,EAAQ,UAMxC,QAASmyC,gBAAepB,EAAYC,EAAeC,EAAc9qB,EAAY+qB,EAAUC,GACrFt0C,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChD,GAAIyrB,GAA4B,SAAUC,GACxC,GAAIpwC,IAAWk2B,WAAc4Z,EAAY3X,QAAW4X,EAAe1X,WAAc2X,EAAc1X,qBAAwBpT,EACjHkrB,IAAkBn/C,EAAE4C,OAAOmM,EAAQowC,GACzCC,wBAAwBrwC,EAAQ,SAAUqV,GACxC,GAAIi7B,GAAgBv3C,EAAE,gCACtBo1C,sBAAqBmC,GACrBC,2BAA2BT,EAAYC,IACtC,SAAU3sB,GACX,GAAIktB,GAAgB,EACpB,KACEA,EAAgBltB,EAAIP,QACpB,MAAOrsB,GACP85C,EAAgBv3C,EAAE,8BAEpB+2B,UAAUwgB,KAId,OAAIU,yBAAwBlB,IAAe,MACzC1Y,8BAA6B,KAAM,SAAU6Z,GAAQd,GAA4Bha,SAAU8a,UAG7Fd,GAA0B,QAK9B,QAASE,yBAAwBrwC,EAAQmxC,EAAiBC,GACxDrZ,aAAa5kB,gBAAgBE,qBAAuBF,gBAAgBC,uBAAwB,SAAU4kB,GACpG/mC,EAAE4C,OAAOmM,GAAUo4B,MAASJ,IAE5Bp8B,KAAKikB,MAAMwxB,OAAO,kBAAmB,aAAcrxC,GAAQ2D,KAAK,SAAU0R,GACtE87B,EAAgB97B,KACjB8E,KAAK,SAAS9E,GACf+7B,EAAY/7B,MAGbrV,EAAmB,WAAGA,EAAgB,SAG3C,QAASsxC,qBAAoB1Z,GAC3B,MAAO3mC,GAAE,SACN87B,OAAO,yCACPA,OAAO,IAAM6K,GAGlB,QAASiZ,qBAAoB3Y,GAC3B,GAAIj/B,GAAOq4C,oBAAoBpZ,GAC3BpW,EAAM7oB,EAAK3C,KAAK,kBAAkBa,KAAK,OACvCkF,EAAOpD,EAAK3C,KAAK,kBAAkBi7C,WAAW,EAClD,QAAUl1C,EAAKm1C,YAAcn1C,EAAKm1C,YAAcn1C,EAAKo1C,WAAa,IAAM3vB,EAG1E,QAAS2uB,iBAAgBvY,EAAOwZ,GAC9B,GAAIhxC,GAAO4wC,oBAAoBpZ,GAC5BnL,OAAO,YAAc2kB,EAAgB,KACrCv6C,KAAK,gBACR,OAASuJ,GAAOA,EAAO,GAGzB,QAASswC,yBAAwB9Y,GAC/B,MAAOoZ,qBAAoBpZ,GAAO/gC,KAAK,YAGzC,QAASw6C,uBAAsBzZ,GAC7B,MAAOoZ,qBAAoBpZ,GAAO/gC,KAAK,iBAGzC,QAAS45C,kCAAiCluB,EAASkC,EAAS6sB,GAC1D,GAAI7yC,GAAS,GAAIpH,IAAGunB,WAAWhH,QAAQmiB,UACvCt7B,GAAO1L,MAAQ,IACf0L,EAAOklC,OAASlrC,EAAE,WAClBgG,EAAOu7B,gBAAgB,WACrBv7B,EAAO8yC,cAAc,mBACrB9yC,EAAO8yC,cAAc,uBACrB5gD,EAAE,oCAAqC8N,EAAO+yC,SAASjsC,UAAUi9B,SACjE/jC,EAAO+yC,SAASx7C,KAAK,eAAe5D,OAAOqhC,OAAO2G,WAAWrmC,OACzDu9C,GAAWA,EAAU7yC,IACxB,MACHA,EAAO47B,aAAa9X,EAASkC,EAAUgtB,6BAGzC,QAASC,oCAAmCnvB,EAASkC,EAAS6sB,GAC5D,GAAI7yC,GAAS,GAAIpH,IAAGunB,WAAWhH,QAAQmiB,UACvCt7B,GAAO1L,MAAQ,IACf0L,EAAOkzC,aAAaL,EAAW,MAC/B7yC,EAAO47B,aAAa9X,EAASkC,GAG/B,QAASgtB,6BACP,GAAI/7C,GAAO,GACPk8C,EAAe,cACfC,EAAclhD,EAAE,oBAAsBihD,EAAe,MAAM,GAAGE,UAC9DC,EAAkBphD,EAAE,UAAU+E,KAAK+C,EAAE,6BAA6B,GAAGq5C,SAEzE,OADAp8C,IAAQ/E,EAAE,SAAS+E,KAAKm8C,EAAcE,GAAiBl7C,KAAK,KAAM,oBAAoBzE,OAAO,GAAG0/C,UAIlG,QAASE,iBAAgB3C,GACvB4C,cAAc5C,EAAIh6C,GAAIg6C,EAAIp1C,GAAGpD,KAAK,YAIpC,QAASo7C,eAAczC,EAAYC,GACjCn0C,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChD,GAAI1kB,IAAWk2B,WAAc4Z,EAAY3X,QAAW4X,EACpDrrB,GAAO2sB,OAAO,gBAAiBrxC,GAAQma,KAAK,SAAU9E,GACpD,IACE,GAAIi7B,GAAgBj7B,EAAOwN,OAC3BgN,aAAYygB,EAAev3C,EAAE,SAC7B,MAAOvC,SAKf,QAASg8C,mBAAkB7C,GACzB8C,gBAAgB9C,EAAIh6C,GAAIg6C,EAAIp1C,GAAGpD,KAAK,YAItC,QAASs7C,iBAAgB3C,EAAYC,EAAe2C,EAAkBC,GACpE/2C,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChD,GAAIkuB,GAA2B,WAC7B,GAAItC,GAAgB,EACpBvY,cAAa5kB,gBAAgBQ,eAAgB,SAAUqkB,GACrD,GAAIh4B,IAAWk2B,WAAc4Z,EAAY3X,QAAW4X,EAAe3X,MAASJ,EAC5E/a,WAAU4C,MAAMoY,gBAAgB,kBAAmB,aAAcj4B,GAAQ2D,KAAK,SAAU0R,GACtFi7B,EAAgBv3C,EAAE,6BAClB85C,8BACKF,GACHxE,qBAAqBmC,GAEvBC,2BAA2BT,EAAYC,GACnC2C,GAAkBA,MACrBv4B,KAAK,SAAU9E,GAChB,IACEi7B,EAAgBj7B,EAAOwN,QACvB,MAAOrsB,GACP85C,EAAgBv3C,EAAE,0BAGf45C,GAAY7iB,UAAUwgB,MAE5BR,EAAYC,GAGjB,IAAI4C,EACFC,QACK,CACL,GAAIlC,GAAU33C,EAAE,6BACZgsB,EAA4E,UAAlE+rB,2BAA4BhB,EAAa,IAAMC,GAA8B,GAAKh3C,EAAE,yBAClGi5C,oCAAmCtB,EAAS3rB,EAAS6tB,MAM3D,QAASE,uBAAsBC,GAC7B5uB,YAAY,4BAA8B6uB,YAAa,qBAAsBtkB,OAAQz9B,EAAEwkB,QAASw9B,UAAWF,KAAkB,SAAUv5C,GACrI,GAAIA,EAAIm2B,QAAS,CACf,GAAIujB,GAAUjiD,EAAEuI,EAAI6gB,OAAOrkB,KAC3B,IAAIk9C,EAAQxY,WAAWx6B,OAAS,EAAG,CACjC,GAAIizC,GAAcC,gBAAgBr6C,EAAwB,GAAtBg6C,EAAY7yC,OAAc,kCAAoC,sCAAsC,GAAGkyC,UACvIrzC,EAAS,GAAIke,WAAUiC,WAAWhH,QAAQ6D,YAAas3B,UAAU,EAAOC,UAAW,KACvFv0C,GAAOid,MAAQjjB,EAAE,0BACjBgG,EAAOkd,QAAQk3B,EAAcliD,EAAE,2BAA2B6E,IAAI,aAAc,QAAQA,IAAI,aAAc,UAAUA,IAAI,WAAY,YAAYA,IAAI,aAAc,KAAKE,KAAKk9C,GAAS,GAAGd,WACpLrzC,EAAOw0C,gBAAiB,EACxBx0C,EAAOy0C,WAAaz6C,EAAE,SACtBgG,EAAOmlC,oBAAqB,EAC5BnlC,EAAO1L,MAAQ,IACf0L,EAAO1K,OACPyzC,8BAA8B,mBAAoB72C,EAAE,mBAAqB8N,EAAOpJ,IAAI3B,QAAQ,eAE9F,GAAIwF,EAAI6gB,OAAOo5B,OAAQ,CACrB,GAAIvkC,GAAI,GAAI7V,UAASG,EAAI6gB,OAAOo5B,OAChC/6C,YAAW,WACTwW,EAAEiD,MAAMzb,SACP,SAGY,WAAb8C,EAAIse,OAAsBpD,QAAQC,IAAI,kBAE5Cib,oBAIJ,QAAS2gB,4BAA2BrY,EAAOC,GACzC,GAAIp5B,GAAS9N,EAAE,2BACf8N,GAAOzI,KAAK,OAAS4hC,EAAQ,YAAcC,EAAU,KAAK2K,SACtD4Q,oBAAoB30C,IAEtB40C,oBAAoB50C,GAIxB,QAAS60C,oBAAmB70C,GAC1BA,EAAOzI,KAAK,iBAAiBokC,SAAS,QAAQtpC,OAAO,SAAW2H,EAAE,SAAW,WAG/E,QAAS26C,qBAAoB30C,GAC3B,MAA4D,IAArDA,EAAOzI,KAAK,iBAAiBA,KAAK,SAAS4J,OAGpD,QAASyzC,qBAAoB50C,GAC3BA,EAAOzI,KAAK,uBAAuBjB,QAGrC,QAASw9C,+BACHj3C,KAAKi4C,OAAOC,uBACdl4C,KAAKi4C,OAAOC,sBAAsBC,SAnQtC,GAAIjD;ACCJ,QAAS1Z,8BAA6B4c,EAAKC,EAAiBC,EAASC,EAAgBC,GACnF,GAAI/nB,IACFn3B,GAAI,WACF,GAAImiC,GAAWpmC,EAAE,gBAAgBoV,KAEjC,IADApV,EAAE,gBAAgBc,KAAK,WAAW,GAC5BoiD,GAAkBF,EAAiB,CACvC,GAAII,GAAkBpjD,EAAE,uBAAuBoV,KAC/C,OAAO4tC,GAAgB5c,EAAUgd,GAEnC,GAAMD,GAAkBH,EAAiB,CACvC,GAAIK,GAAcrjD,EAAE,mBAAmBoV,MACnCguC,EAAkBpjD,EAAE,uBAAuBoV,KAC/C,OAAO4tC,GAAgBK,EAAajd,EAAUgd,GAEhD,GAAIJ,EAAiB,MAAOA,GAAgB5c,KAG5Ct4B,EAAS,GAAIpH,IAAGunB,WAAWhH,QAAQ6D,WAAWsQ,GAE9CkoB,EAAU,oCAIVC,EAAgB,gDACfJ,EAAiB,wBAA0Br7C,EAAE,gBAAkB,mHAAqHgG,EAAOpJ,GAAK,mBAAqB,IACxN,mBAAqBoD,EAAE,YAAc,gHAAiHgG,EAAOpJ,GAAI,oBAC9Jw+C,GAAoBC,EAAiB,mBAAqBr7C,EAAE,gBAAkB,uHAAyHgG,EAAOpJ,GAAK,mBAAqB,IAC3O,sBAUF,OAPAoJ,GAAOid,MAAQjjB,EAAE,kBACjBgG,EAAOmlC,oBAAqB,EAEtBgQ,IAASn1C,EAAO24B,QAAU,WAAawc,MAC7Cn1C,EAAO01C,OAAS,WAAcC,sBAAsB31C,GAASA,EAAO8yC,cAAc,oBAClF9yC,EAAOkd,QAAQs4B,EAAUC,GACzBz1C,EAAO1K,OACA0K,EAGT,QAAS41C,gBAAel/C,EAAO3B,EAAI6B,GACjC,GAAqB,IAAjBF,EAAMm/C,QAAe,CACvBn/C,EAAML,iBACNK,EAAMjE,iBACN,IAAIwN,GAAS/N,EAAE,mBAAqB0E,GAAIkQ,SAASA,SAASvP,KAAK,iBAE/D,OADK0I,GAAOnN,SAAS,aAAamN,EAAO3J,SAClC,GAIX,QAASq/C,uBAAsB31C,GAC7B9N,EAAE,gBAAgB4jD,MAAM,SAAUtjD,GACX,IAAjBN,EAAEmB,MAAMiU,MAEVtH,EAAO+1C,aAAa,mBAGpB/1C,EAAO8yC,cAAc,qBAM3B,QAASkD,mBAAkBC,GACzBA,EAAW/jD,EAAE+jD,GACTA,EAAS7d,GAAG,YAEN6d,EAASjjD,KAAK,aAGd4F,GAAG0qB,SAASiV,SAAW,GACzBF,6BAA6B,GAAI,SAAUC,EAAU4d,GACnD,QAAKC,oBAAoB7d,EAAU4d,KACnCD,EAASjjD,KAAK,WAAYslC,IACnB,IAET,WACS2d,EAASjjD,KAAK,aAA4C,IAA7BijD,EAASjjD,KAAK,aAAqBijD,EAAS3Y,WAAW,aAE7F,GAUF1kC,GAAG0qB,SAASiV,UAAY,EAC1BF,6BAA6B,GAAI,SAAUC,GACzC2d,EAASjjD,KAAK,WAAYslC,IAG5B,WACS2d,EAASjjD,KAAK,aAAeijD,EAAS79C,KAAK,WAAW,KAI/D69C,EAASjjD,KAAK,WAAY,MAKhC,QAASojD,qBAEP,GAAIC,GAAiB,SAAUd,EAAajd,EAAUI,GACpDA,EAAkBA,EAAgBA,EAAgB,GAClD9/B,GAAGwnB,SAASltB,KAAK,iCAAmCikC,WAAYv+B,GAAG0qB,SAAS5L,GAAI4+B,YAAaf,EAAagB,YAAaje,EAAUjB,cAAgBqB,IAAiBhF,QAAQ,WACxK7C,eAAe72B,EAAE,0CAA2C,OAC3DohB,KAAK,SAAUwI,GAChBmN,UAAUnN,KAIVhrB,IAAG0qB,SAASiV,UAAY,GAE1BF,6BAA6B,GAAI,SAAUkd,EAAajd,EAAU4d,GAChE,QAAKC,oBAAoB7d,EAAU4d,KAEP,GAAxBt9C,GAAG0qB,SAASiV,UACdS,aAAa5kB,gBAAgBC,uBAAwB,SAAU4kB,GAC7D/a,UAAU4C,MAAMoY,gBAAgB,qBAAsB,cAClDC,MAASvgC,GAAG0qB,SAAS5L,GAAI0hB,QAAW,EAAGC,MAASJ,EAAOK,WAAc1gC,GAAG0qB,SAASiV,SAAUgB,qBAAwB3gC,GAAG0qB,SAASmV,WAAYrB,SAAYme,IACxJ3wC,KAAK,SAAS0V,GACX+7B,EAAed,EAAajd,EAAUhe,EAAShE,UAChD8E,KAAK,SAASd,GACfyW,UAAUzW,EAASwJ,YAEtBlrB,GAAG0qB,SAAS5L,GAAI,IACZ,IAET2+B,EAAed,EAAajd,EAAU,OAC/B,KACN,KAAM,MAAM,GAInB,QAAS6d,qBAAoB7d,EAAU4d,GAErC,MAAgB,IAAZ5d,GAAkC,IAAhB4d,GACpBM,YAAYx8C,EAAE,oCAAqC,KAAM,IAAK,WAAc9H,EAAE,uBAAuB03B,WAC9F,GAEL0O,GAAY4d,GACdM,YAAYx8C,EAAE,4CAA6C,KAAM,IAAK,WAAc9H,EAAE,uBAAuB03B,WACtG,GAEO,IAAZ0O,EAIN,QAASme,eAAcR,GACrBA,EAAW/jD,EAAE+jD,EACb,IAAIS,GAAmBxkD,EAAE,+BACrB+jD,GAAS7d,GAAG,aAEgB,GAAxBx/B,GAAG0qB,SAASiV,UACdme,EAAiB1jD,KAAK,WAAY,MAER,GAAxB4F,GAAG0qB,SAASiV,UACdF,6BAA6B,GAAI,SAAUC,GAEzC,MADAoe,GAAiB1jD,KAAK,WAAYslC,IAC3B,GAET,WACSoe,EAAiB1jD,KAAK,aAA4C,IAA7BijD,EAASjjD,KAAK,aAAqBijD,EAAS3Y,WAAW,cAU7E,GAAxB1kC,GAAG0qB,SAASiV,WACTme,EAAiB1jD,KAAK,aAAoD,IAArC0jD,EAAiB1jD,KAAK,aAC9DqlC,6BAA6B,GAAI,SAAUC,GAGzC,MAFAoe,GAAiB1jD,KAAK,WAAYslC,IAE3B,GAET,WACOoe,EAAiB1jD,KAAK,aAAoD,IAArC0jD,EAAiB1jD,KAAK,aAAqBijD,EAAS79C,KAAK,WAAW;ACvLxH,QAASksB,WAAUhgB,EAAKqyC,GACtBzkD,EAAEiwB,KAAKvpB,GAAGipB,kBAAkB7F,KAAK,WAE/BpjB,GAAGygB,IAAIod,IAAIhU,WAAWttB,UAClBwhD,EACF/9C,GAAGmE,GAAGylB,WAAW2f,UAAU79B,GAE3B1L,GAAGmE,GAAGylB,WAAWkU,YAAYpyB,KAQnC,QAASmW,aACPvoB,EAAEiwB,KAAKvpB,GAAGipB,kBAAkB7F,KAAK,WAC/BpjB,GAAGygB,IAAIod,IAAIhU,WAAWttB,YAO1B,QAASyhD,qBAAoBtyC,GAC3B,GAAIE,EAcJ,OAbAtS,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,sCACL7kB,KAAM,YAAcsR,EAAI/C,QAAQ,IAAM,OAAS,KAC/Cue,OAAO,EACPC,OAAO,EACP2T,QAAS,SAAUj5B,GACjB+J,EAAI/J,EAAIoK,KAGZqqB,kBAAkB1qB,GACXA,EAIT,QAASqyC,kBAAiB57C,EAAM21C,EAAKh6C,EAAIm1C,EAAS/d,EAAQ8oB,GACxD5kD,EAAEqhC,MACAt4B,KAAM,MACNw4B,SAAU,OACV5b,IAAK,qBAAuB5c,EAAO,OAASrE,EAAK,YAAcm1C,EAAU,WAAa/d,EAAS,eAAiB8oB,EAChHpjB,QAAS,SAAUj5B,GACjB,IAAKy0B,kBAAkBz0B,GAAM,CAC3Bm2C,EAAI35C,KAAKwD,EACT,IAAIs8C,GAAOnG,EAAIr5C,KAAK,QACpBy/C,WAAUD,GACVE,cAAcF,GACoB,aAA9Bn+C,GAAGmpB,eAAetC,SAA4B7mB,GAAGmE,GAAG8pB,YAAYjuB,GAAGmE,GAAG8pB,WAAW3R,KAAK,mBAMlG,QAASgiC,eAAcj8C,EAAM21C,GAC3B,GAEI5iB,GAFAxyB,EAAKtJ,EAAE0+C,GAAK9pC,SAGZ5L,EAAMM,EAAGsL,SACTqwC,EAAQj8C,EAAI9C,KAAK,MACjBg/C,EAAUD,EAAM70C,MAAM,IAExB0rB,GADgB,OAAdopB,EAAQ,GACDA,EAAQ,GAERllD,EAAE,QAAUilD,GAAO7vC,MAAQ,GAGtC,IAKI+vC,GALAP,EAAa5kD,EAAE,QAAUilD,GAAO7vC,MAEhC1Q,EAAK4E,EAAGpD,KAAK,MACb2zC,EAAUvwC,EAAGpD,KAAK,YAClBk/C,EAAU97C,EAAGw5B,OAAOliC,SAAS,YAE5BwkD,IACH97C,EAAG+7C,MAAM,iCAEXF,EAAQ77C,EAAGw5B,OACPqiB,EAAMjf,GAAG,aAAekf,GAC1BD,EAAM/hD,OACNpD,EAAE0+C,GAAKr5C,KAAK,mBAAmB5E,YAAY,gBAAgBI,SAAS,iBACpEskD,EAAMpgD,KAAK,qCACX4/C,iBAAiB57C,EAAMo8C,EAAOzgD,EAAIm1C,EAAS/d,EAAQ8oB,KAEnDO,EAAM1jD,OACNzB,EAAE0+C,GAAKr5C,KAAK,oBAAoB5E,YAAY,iBAAiBI,SAAS,iBAU1E,QAASykD,uBAAsBziD,EAAI0iD,EAA6BhnB,GAC9D,GAAIinB,IAAsB,EACtBC,EAAoBzlD,EAAE6C,GAAIE,QAAQ,iBAClC2iD,EAAkB1lD,EAAE2lD,OAAOF,EAAkBpgD,KAAK,qCAQtD,IANArF,EAAEkB,KAAKwkD,EAAiB,SAAUh9C,EAAGk9C,GAE9BA,EAAelhD,GAAGqb,SAAS,kBAAqB6lC,EAAelhD,GAAGqb,SAAS,gBAC9EylC,EAAsBA,GAA2D,IAAnCxlD,EAAE2V,KAAK3V,EAAE4lD,GAAgBxwC,UAGtEowC,EAOH,MADAjnB,MACO,CANP,IAAIzwB,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,UAChCt7B,GAAO02B,YAAY+gB,EAA6B,KAAM,KAAM,WAC1D,OAAO,IAQb,QAASM,2BAEP7lD,EAAE,oBAAoBypC,WAAWA,SAAS,0BAA0BpkC,KAAK,oBAAoBu+C,MAAM,SAAUp/C,GACtF,IAAjBA,EAAMm/C,SAAyD,GAAxC3jD,EAAE,4BAA4BiP,QACvDjP,EAAE,kCAAkCoE,UAI1C,QAAS0hD,eAEP,GAAIC,GAAW/lD,EAAE,iBAAiBqF,KAAK,aACvC0gD,GAAS1gD,KAAK,SAAS+P,IAAI,IAC3B2wC,EAAS1gD,KAAK,gBAAgBA,KAAK,QAAQwsC,SAe7C,QAASmU,4BAA2Bh+C,EAAM4M,GACxC,GAAIwhC,GAAUp2C,EAAEgI,GAAMlH,KAAK,WACvBmlD,EAAQjmD,EAAE,WAAa4U,GAAQQ,KACnC,IAAc,KAAV6wC,EAAc,CAChB,GAAIrnC,GAAIqnC,EAAM71C,MAAM,IAKpB,OAJgB,IAAZwO,EAAE3P,SACJmnC,EAAUx3B,EAAE,GACZqnC,EAAQrnC,EAAE,KAEJw3B,EAAS6P,GAEjB,MAAO,MAIX,QAASC,iCAAgCl+C,EAAM4M,EAAQ+X,GACrD,GAAIw5B,GAAgBx5B,EAAW,YAAcA,EAAW,GACpDhO,EAAIqnC,2BAA2Bh+C,EAAM4M,EACzCnP,QAAOq7B,KAAK,uBAAyBslB,UAAY,QAAUC,UAAY,aAAepQ,UAAUt3B,EAAE,IAAMwnC,EAAgB,OAASxnC,EAAE,GAAK,WAAa/J,EAAQ,SAAW+J,EAAE,IAG5K,QAAS2nC,iCAAgCzjD,EAAIsS,EAAKoxC,EAAoBC,GACpE,GAAItiC,GAAKlkB,EAAE6C,GAAIu1C,QAAQ,wBACnBqO,EAAQviC,EAAG7e,KAAK,wBAEhBqhD,EAAUD,EAAMphD,KAAK,gBACrBshD,EAAeF,EAAMphD,KAAK,iBAC1BuhD,EAASZ,2BAA2BU,EAASvxC,EAAIjP,KAAK,MAC5C,OAAV0gD,GAA6B,MAAXA,GAAmBJ,GAA2C,QAAxBrxC,EAAIrU,KAAK,aAAiD,YAAxBqU,EAAIrU,KAAK,aAA6BqU,EAAIrU,KAAK,eAAgB,IAAS,QAAQ0rC,KAAKoa,EAAO,IAGxLF,EAAQjlD,OAFRilD,EAAQtjD,OAKNmjD,IAAuBC,GAA0C,YAAxBrxC,EAAIjP,KAAK,YACpDygD,EAAavjD,OAEbujD,EAAallD,OAGfglD,EAAMrjD,OAENqjD,EAAMphD,KAAK,gBAAgBwhD,GAAG,GAAG3gD,KAAK,QAAS,4BAC/CugD,EAAMphD,KAAK,gBAAgBjC,OAG7B,QAAS0jD,kCACP9mD,EAAEmB,MAAMyT,SAASvP,KAAK,wBAAwB5D,OAAO4D,KAAK,KAAK5D,OAkEjE,QAASslD,aAAYlkD,EAAIuP,GACvBosB,eAAepsB,EACf,IAAI40C,EAEFA,GAD8B,mBAArBC,mBACI,WAAcxhD,OAAO6sB,SAASpF,UAE9B+5B,kBACfx/C,WAAWu/C,EAAY,KAkBzB,QAASE,iBAAgB1hC,EAAI2hC,EAAK/0C,EAAKg1C,GACrC,GAAIha,KACJ5O,gBAAepsB,EACf,IAAI40C,EAEFA,GAD8B,mBAArBC,mBACI,WAAcxhD,OAAO6sB,SAASpF,UAE9B+5B,kBACfjnD,EAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,oCACL7kB,KAAM,cAAgB0kB,EAAK,gBAAkB2hC,EAAM,KACnDv5B,OAAO,EACPC,OAAO,EACP2T,QAAS,SAAUj5B,GACjBo2B,eAAe,GAAI,GACnByO,EAAQ7kC,EAAIoK,EACPqqB,kBAAkBoQ,KACA,IAAjBA,EAAMC,SAAgC,IAAfD,EAAMvmB,MAC/BmgC,IAEqB,IAAjB5Z,EAAMC,QACRjb,UAAUgb,EAAMC,SAAS,GAEzBjb,UAAUgb,EAAMvmB,OAAO,OAWnC,QAASwgC,wBAAuBC,GAC9BC,gBACAlM,0BAGF,QAASA,2BACP,GAAImM,GAAWxnD,EAAE,YAAYqF,KAAK,UAC9BmiD,GAASv4C,SACPjP,EAAE,SAASiP,OAAS,EACtBu4C,EAASthD,KAAK,YAAY,GAEvBshD,EAASthD,KAAK,YAAY,IAInC,QAASuhD,iBAAgB/I,GAClB1+C,EAAEwB,MACDxB,EAAE0+C,GAAK99C,SAAS,aAClBZ,EAAE0+C,GAAKtpC,IAAI,IAAI3U,YAAY,YAKjC,QAAS8mD,iBACP,GAAIG,GAAS5/C,EAAE,aAAe,IAC1B6/C,EAAiB3nD,EAAE,0CACvB,IAAI2nD,EAAe14C,OAAS,EAAG,CAC7B,GAAI24C,GAAMD,EAAevyC,MAAMhF,MAAM,IACrC,KAAK1H,EAAI,EAAGA,EAAIk/C,EAAI34C,OAAQvG,IAC1Bg/C,GAAUE,EAAIl/C,GAAG2a,cAAgB,IAEnCqkC,GAASA,EAAOpqC,OAAO,EAAGoqC,EAAOz4C,OAAS,GAC1CjP,EAAE,eAAekG,KAAK,cAAewhD,IAIzC,QAASG,mBAAkBC,EAAaC,EAAWC,GACjDthD,GAAGmE,GAAG8pB,WAAWszB,cAAcF,EAAWC,GAAkB96B,SAExDviB,KAAKC,oBAEPlE,GAAGmE,GAAGC,WAAWC,OACfC,KAAMtE,GAAGuE,cACTC,OAAQ,cACRG,KAAM,cACN/D,OAAQtH,EAAE,IAAM8nD,GAAax8C,IAAI,KAYvC,QAAS48C,WAAUrlD,GACjB7C,EAAE,cAAckG,KAAK,SAAUrD,EAAGoG,MAAM+0B,SAI1C,QAASmqB,aAAYzjD,GACnB,GAAI08B,GAAWvE,YAAYvK,SAASrpB,MAAM,EAC1CjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,uBAAyByb,EAC9BtgC,KAAM,UAAY4D,EAAK,KACvBkpB,OAAO,EACPC,OAAO,EACP2T,QAAS,SAAUj5B,OAOvB,QAAS6/C,8BAA6BC,EAASnI,EAAiBoI,GAC9DC,wCAAwCzgD,EAAE,yBAA0B,IAAMA,EAAE,SAAW,OAASugD,EAAS,IAAKvgD,EAAE,YAAa,EAAG,EAAG,EAAG,GAAIo4C,EAAiBoI,GAa7J,QAASC,yCAAwCC,EAAeC,EAAkBC,EAAaliC,EAAYmiC,EAAcC,EAAiBC,EAAWC,EAAe5I,EAAiBoI,GACnLlR,gBAAgB,8BACd1xB,cAAe8iC,EACfO,iBAAkBN,EAClBO,YAAaN,EACbO,WAAYziC,EACZ0iC,aAAcP,EACdQ,gBAAiBP,EACjBQ,UAAWP,EACXQ,cAAeP,GACd,SAAUhoD,GACPA,EAAK49B,QACuB,mBAAnBwhB,IACTA,EAAgBp/C,GAGlBwnD,EAAaxnD,KAQnB,QAASwoD,YAAWzmD,GAClB,GAAIyG,GAAKzG,EAAGE,QAAQ,QAChBuG,GAAG1I,SAAS,aACd0I,EAAG7I,YAAY,YACfoC,EAAG2qC,KAAK,WAAW,KAGnBlkC,EAAGzI,SAAS,YACZgC,EAAG2qC,KAAK,WAAW,IAErB3qC,EAAG0mD,QAAQ,kBAGb,QAASC,eAAc3mD,GACrB,GAAIsS,GACAs0C,EAAyC,UAAzBvsB,cAAc,OAC9Bl9B,GAAE6C,GAAIqjC,GAAG,YACNujB,EAUHzpD,EAAE6C,GAAIuoC,WAAW,WAAWllC,KAAK,QAAS4B,EAAE,6CAT5C9H,EAAE,wBAAwBkB,KAAK,WACzBlB,EAAEmB,MAAM+kC,GAAG,cACb/wB,EAAMnV,EAAEmB,MAAMkE,KAAK,eAAea,KAAK,WAAW,GAClDojD,WAAWn0C,MAGfnV,EAAE6C,GAAIqD,KAAK,QAAS4B,EAAE,mBAOxB9H,EAAE,kBAAkBkB,KAAK,WACvBiU,EAAMnV,EAAEmB,MAAMkE,KAAK,eAAea,KAAK,WAAW,GAClDojD,WAAWn0C,KAEbnV,EAAE6C,GAAIpC,YAAY,aAAayF,KAAK,QAAS4B,EAAE2hD,EAAe,0CAA4C,gBAE5GnL,uBAGF,QAASoL,2BAA0BC,GACjC,GAGIx0C,GAHAy0C,EAAO5pD,EAAE,IAAM2pD,GACf9mD,EAAK7C,EAAE,IAAM2pD,EAAU,UAGvB9mD,GAAGqjC,GAAG,aACR0jB,EAAKvkD,KAAK,wBAAwBnE,KAChC,WACEiU,EAAMnV,EAAEmB,MAAMkE,KAAK,eAAea,KAAK,UAAW,QAClDojD,WAAWn0C,KAGfnV,EAAE6C,GAAIqD,KAAK,QAAS4B,EAAE,mBAGtB8hD,EAAKvkD,KAAK,aAAanE,KACrB,WACEiU,EAAMnV,EAAEmB,MAAMkE,KAAK,eAAea,KAAK,UAAW,IAClDojD,WAAWn0C,KAGfnV,EAAE6C,GAAIqD,KAAK,QAAS4B,EAAE,gBAExBw2C,qBAAqBsL,EACrB,IAAIC,GAAYhnD,EAAGqjC,GAAG,WACtBz+B,YAAW,WAAc5E,EAAGqD,KAAK,UAAW2jD,IAAc,GAI5D,QAASC,0BACP,GAAIC,GAAU/pD,EAAE,0BACZgqD,EAAMhqD,EAAE,iBAAkB+pD,GAAS96C,QAAU86C,EAAQnpD,SAAS,kBAAoB,EAAI,EAC1F,IAAW,GAAPopD,EACFhqD,EAAE,wDAAwD6xC,aACrD,CACL7xC,EAAE,uFAAuFiqD,QAAQ,mDACjG,IAAI3hD,GAAOtI,EAAE,uDAGoC,IAA7CA,EAAE,uBAAwB+pD,GAAS96C,SACrC+6C,EAAME,eAGR,IAAIn/B,GAAQjjB,EAAE,qBAAsBkiD,EAChCA,GAAM,IAAGA,EAAM,GACnB,IAAIG,GAAUt7C,OAAO,sBAAuBm7C,EAC5C1hD,GAAKvD,KAAK8J,OAAO,uDAAwDs7C,EAASp/B,KAwFtF,QAASq/B,kBAAiBt+C,GACxB,GAAIu+C,EAEFA,GADEv+C,EAAMlL,SAAS,OACXkL,EAEFA,EAAMlL,SAAS,UACXkL,EAAM8I,SAASvP,KAAK,mBAEpByG,EAAMzG,KAAK,mBAGrBikD,WAAWe,GAIb,QAASC,gBAAeC,EAAOC,EAAaC,GAC1C,GAAIb,GAAOW,EACPjhD,EAAKsgD,EAAKngB,SAAS,kBAMvB,IALAmgB,EAAKngB,SAAS,WAAW5oC,SAAS,QAGlCy9C,qBAAqBoM,GAEJ,GAAbphD,EAAG2F,OAAP,CAGA,GAAI07C,GAAM3qD,EAAEsJ,EAAG,GACf,IAAItJ,EAAE4qD,cAAgBlkD,GAAGC,IAAIC,aAAe2jD,EAAM3pD,SAAS,mBAAoB,CAC7E,GAAIkM,GAAIy9C,EAAMjpD,SAASsC,IAAM2mD,EAAMplD,SAAW,EAC9ColD,GAAM1lD,IAAI,gBAAiB,SAC3BgvC,sBAAsB,KAAM/mC,GAC5B9M,EAAE6qD,aAAc,EAEbF,EAAI7pD,KAAK,iBACZ6pD,EAAI7pD,KAAK,cAAe,KACxBgqD,6BAGF,IAAIJ,GAAUH,EAAMxnD,QAAQ,kBACxBgoD,EAAS/qD,EAAE,IAAM0qD,EAAQxkD,KAAK,MAAQ,UACrB,IAAjB6kD,EAAO97C,SACT26C,EAAOA,EAAK7mD,QAAQ,iBACpBgoD,EAASnB,EAAKvkD,KAAK,WAOrB,IAAI2lD,GAAe,WAMjB,GAAIC,GAAmB,WACrB5M,aAAakM,EAAOQ,EAAOlqD,SAAS,cACpCy9C,qBAAqBoM,IAUnBQ,EAAc,SAAUC,GAC1Bf,iBAAiBe,GACjBF,IACAE,EAAMzqD,SAQRS,MAAKiqD,gBAAkB,SAAUC,GAC/BA,EAAO1nC,OAAO,wBAAwBL,KAAK,uBAAwB,SAAUhjB,GAC1D,IAAbA,EAAGgrD,QACLhrD,EAAGC,kBACH2qD,EAAYlrD,EAAEmB,WAUpBA,KAAKoqD,cAAgB,SAAUF,GAC7BA,EACGhmD,KAAK,2BACLrD,IAAI,wBACJC,GAAG,uBAAwB,SAAU3B,GAEpCA,EAAGC,oBAEJyB,IAAI,oBACJC,GAAG,mBAAoB,SAAU3B,GAChCA,EAAGC,iBACH,IAAIirD,GAAQxrD,EAAEmB,MAAMi3C,QAAQ,qBAAqB/yC,KAAK,2BACtDomD,eAAcD,EAAOA,EAAM1qD,KAAK,YAKtCypD,EAAMzpD,KAAK,kBAAmBmqD,IAI5BS,EAAU,GAAIV,EAwBlB,IArBIP,GACFkB,oBAAoBriD,GAGtBw7C,UAAUx7C,GAEVoiD,EAAQH,cAAcjiD,GAClBkhD,GACFkB,EAAQN,gBAAgB9hD,GAG1BA,EAAGqa,OAAO,0BAA0BL,KAAK,yBAA0B,SAAU/d,GAO3E,MANAA,GAAEpB,iBACFoB,EAAEhF,kBACFqrD,gBAAgB5rD,EAAEmB,UAAaoD,KAAQgB,EAAEsmD,MAAOjoD,IAAO2B,EAAEumD,QAAS,GAGlExN,qBAAqBoM,IACd,IAGLA,EAAQz7C,OAAQ,CAClB,GAAI88C,GAAKC,cAActB,EAAQxkD,KAAK,MAChC6lD,GAAGE,UAAUF,EAAGE,SAASjrD,KAAK+qD,KAItC,QAAShH,eAAcmH,GACrBA,EAAIvoC,OAAO,wBAAwBL,KAAK,uBAAwB,SAAUhjB,GACxEA,EAAGC,iBACH,IAAIuL,GAAQ9L,EAAEmB,KACdipD,kBAAiBt+C,GACjBuyC,aAAavyC,EAAM8I,SAAU5U,EAAE,WAAWa,SAAS,gBAIvD,QAASikD,WAAUoH,GACjB,IAAIlsD,EAAEwB,KAAN,CACA,GAAI2qD,GAAkBC,cAAc,mBACpCF,GACGvoC,OAAOwoC,EAAgB,IAAI7oC,KAAK6oC,EAAgB,GAAI,SAAU7rD,EAAI+rD,GAC5DC,wBAAyBD,IAC5BrsD,EAAE,eAAeS,YAAY,SAC7BT,EAAEmB,MAAMN,SAAS,YAGpB8iB,OAAOwoC,EAAgB,IAAI7oC,KAAK6oC,EAAgB,GAAI,SAAU7rD,EAAI+rD,GAC5DC,wBAAyBD,GAC5BrsD,EAAEmB,MAAMV,YAAY,YAK5B,QAASkrD,qBAAoBO,GACtBlsD,EAAEwB,MACL0qD,EAAIhrD,KAAK,WACP,GAAI4K,GAAQ9L,EAAEmB,KACd2K,GACG6X,OAAO,iCAAiCL,KAAK,gCAAiC,SAAUhjB,EAAI+rD,GACtFC,wBAAyBD,GAC5BE,sBAAsBzgD,EAAOogD,KAGhCvoC,OAAO,iCAAiCL,KAAK,gCAAiC,SAAUhjB,EAAI+rD,GACtFC,wBAAyBD,GAC5BG,sBAAsB1gD,OAUlC,QAASygD,uBAAsB1pD,EAAIqpD,GAEjC,QAASO,GAAY5pD,GACnB,GAAkC,mBAAvB6pD,qBAAoC,CAC7C,GAAIC,IAAeC,KAAQ,YAAa/gC,KAAQ,OAAQghC,IAAO,MAAOC,IAAO,SAAUC,IAAO,kBAAmBC,IAAO,eAAgBC,IAAO,oBAC3IhlD,EAAQilD,qBAAqBrqD,GAC7BsqD,EAAUllD,EAAMs3B,KAAKlc,aACzBpb,GAAMc,KAAO4jD,EAAWQ,EAExB,IAAIC,GACA/sB,EAAOp4B,EAAMqB,GAAGpD,KAAK,OACzB,QAAQm6B,GACN,IAAK,cACH+sB,EAAOV,oBAAiC,WACxC,MACF,KAAK,aACHU,EAAOV,oBAAgC,UACvC,MACF,SACEU,EAAOV,oBAAoBzkD,EAAMc,MAGrC,GAAIqkD,EAAM,CAER,GAAInkB,GAAUx+B,EAAEqxB,OAAOsxB,EAAK1qD,MAAM0M,MAAM,GAAI,SAAUpH,GAAQ,OAAOA,EAAKqlD,UAAW5nD,OAAOuC,EAAKqlD,UAAUplD,IAC3G,IAAIghC,EAAQh6B,OAAS,EAAG,CACP,QAAXk+C,GAA6B,eAAR9sB,GAAiC,cAARA,IAChDitB,sBAAsBrkB,GAClBskB,oBAAoBC,0BAA0BvkB,GAGpD,KAAK,GADDwkB,GAAc,4BACT/kD,EAAI,EAAGA,EAAIugC,EAAQh6B,OAAQvG,IAAK,CACvC,GAAIV,GAAOihC,EAAQvgC,GAEfglD,EAAS,SAAYzlD,EAAMvD,GAC7B,aAAeuD,EAAMs3B,KACrB,cAAgBt3B,EAAMs3B,KACtB,kBAA4C,mBAAjBt3B,GAAM4xC,QAAyB,GAAK5xC,EAAM4xC,SACrE,iBAAmB5xC,EAAMqB,GAAGpD,KAAK,WACjC,qBAAyB+B,EAAMqB,GAAGpD,KAAK,YAAc+B,EAAMqB,GAAGpD,KAAK,YAAc,IACjF,uBAA2B+B,EAAMqB,GAAGpD,KAAK,iBAAmB+B,EAAMqB,GAAGpD,KAAK,iBAAmB,IAC7F,KAGEynD,EAAYC,4BAA4B5lD,EAAMC,GAG9CW,EAAOd,EAAEE,EAAKY,KACH,QAAXukD,GAA+B,cAAXnlD,EAAKtD,KAIzBkE,EAHG/F,EAAGjC,SAAS,UAGRkH,EAAE,qBAFFA,EAAE,uBAMb,IAAI+lD,GAAoB,iDACpBC,EAAiC,mBAAd9lD,GAAKuB,KAAwBsF,OAAOg/C,GAAqBtkD,KAAMvB,EAAKuB,OAAU,EACrGkkD,IAAe5+C,OAAO,oHACpBk/C,IAAOD,EACP1iD,KAAQpD,EAAKtD,GACbuE,KAAsB,IAAb0kD,EAAkBA,EAAY,IACvCrmD,OAA+B,QAApBU,EAAKgmD,YAAyB,WAAa/lD,EAAMs3B,KAAOt3B,EAAMvD,GAAK,KAAQ,mBACtFnE,gBAAmB,sFACnB0tD,GAA+B,mBAAjBjmD,GAAKG,SAA0B,0CAA4CH,EAAKG,SAAW,aAAeulD,EAAS,UAAY,GAC7IQ,SAA0B,IAAbP,EAAkB,GAAK,gBACpC5iC,MAASniB,IAGb,MAAO6kD,GAAc,WAI3B,MAAO,GAIT,GAAIxL,GAAUjiD,EAAE6C,GAAIhC,SAAS,kBAAkBwE,KAAK,WACpD,KAAKinD,uBAAyBrK,EAAQhzC,OAAS,EAAG,CAEhD,GAAIw+C,GAAchB,EAAY5pD,EACX,KAAf4qD,IACFxL,EAAQ9hD,OAAOstD,GACfxL,EAAQ58C,KAAK,gBAAgBjC,SAMnC,QAASkqD,uBAAsBrkB,GAE7B,GAAIA,EAAQ,GAAGvkC,GAAG2e,eAAiBqvB,oBACjC,IAAK,GAAIhqC,GAAI,EAAGA,EAAIugC,EAAQh6B,OAAQvG,IAClC,GAAIugC,EAAQvgC,GAAGhE,GAAG2e,eAAiBqvB,oBAAqB,CACtD,GAAIyb,GAAOllB,EAAQvgC,EACnBugC,GAAQvgC,GAAKugC,EAAQ,GACrBA,EAAQ,GAAKklB,CACb,QAMR,QAASX,2BAA0BvkB,GAGjC,IAAK,GAFDmlB,GAAgB,OAChBC,EAAe,eACV3lD,EAAI,EAAGA,EAAIugC,EAAQh6B,OAAQvG,IAClC,GAAIugC,EAAQvgC,GAAGhE,GAAG2e,eAAiB+qC,GAAiB1lD,EAAI,GAAKugC,EAAQvgC,EAAI,GAAGhE,GAAG2e,eAAiBgrC,EAAc,CAC5G,GAAIF,GAAOllB,EAAQvgC,EACnBugC,GAAQvgC,GAAKugC,EAAQvgC,EAAI,GACzBugC,EAAQvgC,EAAI,GAAKylD,CACjB,QAMN,QAASG,4BACP,OAAQ3jD,KAAK4jD,SAASC,KAAK/E,eAG7B,QAASgF,6BACP,OAAQ/nD,GAAGkoB,MAAM6jB,cAGnB,QAASic,wBACP,MAAOhoD,IAAGkoB,MAAM6jB,cAGlB,QAASkc,+BACP,MAAOD,yBAA0BE,0BAGnC,QAASC,+BACP,MAAOH,0BAA2BE,0BAGpC,QAASE,mDACP,MAAOH,iCAAkCpB,mBAG3C,QAASwB,mDACP,MAAOF,iCAAkCtB,mBAG3C,QAASyB,2BAA0B/mD,GACjC,MAAOjI,GAAEiI,EAAMqB,GAAGozB,SAAS97B,SAAS,6BAGtC,QAASquD,yBAAwBhnD,GAC/B,MAAOjI,GAAEiI,EAAMqB,GAAGozB,SAAS97B,SAAS,yBAGtC,QAASsuD,wBAAuBjnD,GAC9B,GAAIknD,GAAWnvD,EAAEiI,EAAMqB,GAAGozB,QAC1B,OAAOyyB,GAASvuD,SAAS,0BAA4BuuD,EAASvuD,SAAS,4BAKzE,QAAS4rD,uBAAsB3pD,GAC7B,GAAIusD,GAAMpvD,EAAE6C,EACRusD,GAAIxuD,SAAS,oBAAsBwuD,EAAIxuD,SAAS,gBAClDZ,EAAE6C,GAAIpC,YAAY,kBAAkB4E,KAAK,gBAAgBwsC,SAK7D,QAASwd,sBACP,GAAIhmD,GAAW3C,GAAGmE,GAAG8pB,WAAW6lB,kBAChC,OAAO/vC,GAAEpB,GAAUoU,IAAI,SAAUzV,GAC/B,OACEtD,GAAIsD,EAAKtD,GACT66B,KAAMv3B,EAAKu3B,KACXsa,QAAS7xC,EAAK0yC,cAAgB1yC,EAAK0yC,cAAgB,MAMzD,QAASoQ,4BAA2B/C,EAAWC,GAK7C,QAASsH,GAAa5Q,GACpB,GAAI1+C,EAAE6qD,aAAenkD,GAAGC,IAAIC,YAC1B5G,EAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7B,GAAIjI,EAAE/D,GAAGmE,GAAG8pB,WAAWwlB,YAAYoV,OAEjC,IAAKvvD,EAAE,4BAA4BiP,OAAQ,CACzC,GAAIugD,GAAWxvD,EAAE,wCAA0C8H,EAAE,kBAAoB,UAAU1D,MAAM,WAC/FpE,EAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7B+8C,EAAS/Q,KAEX8Q,EAAS3d,UAEX6M,GAAI2G,MAAMmK,QAIZxvD,GAAE,4BAA4B6xC,eAG7B,CACL,GAAI6d,GAAKhR,EAAI37C,QAAQ,mBACjB0B,EAAWirD,CACfA,GAAG/rC,OAAO,oBAAoBL,KAAK,mBAAoB,WACrD,GAAItjB,EAAE4qD,aACJ,GAAI+E,GAAiBjR,EAAI,GAAGkR,aAAenrD,EAAS,GAAGmrD,aAAenrD,EAASnD,SAASsC,IAAM86C,EAAIp9C,SAASsC,QAE3G,IAAgB,OAAZ2P,EACF,GAAIo8C,GAAiBjR,EAAIv5C,SAAWV,EAASU,SAAWV,EAASuB,gBAEjE,IAAI2pD,GAAiBjR,EAAI,GAAGkR,aAAenrD,EAAS,GAAGmrD,aAAenrD,EAAS,GAAGuB,SAGlF2pD,IAAkBE,IACpBH,EAAG/rC,OAAO,oBACV3jB,EAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7B+8C,EAAS/Q,SAOnB,QAAS+Q,GAAS/Q,GAwBhB,QAASoR,KACHpR,EAAI59C,KAAK,oBACX49C,EAAI59C,KAAK,kBAAkB+wC,SAC3B6M,EAAI59C,KAAK,iBAAkB,OA1B/B,GAAIkK,GAAO0zC,EAAI59C,KAAK,WACfkK,KACHA,EAAO,GAET0zC,EAAI59C,KAAK,WAAYkK,EAAO,EAE5B,IAAImjC,GAAWznC,GAAGmE,GAAGswC,OAEjB4M,IAAaC,GACfthD,GAAGmE,GAAG8pB,WAAWszB,cAAcF,EAAWC,GAG5C8H,GAEA,IAAIC,GAAiB/vD,EAAE,wDACnBgwD,EAAchwD,EAAE,oEAChBiwD,EAAcjwD,EAAE,uCAAuC+E,KACzD+C,EAAE,eAEJioD,GAAe5vD,OAAO6vD,GAAa7vD,OAAO8vD,GAC1CF,EAAeG,SAASxR,GACxBA,EAAI59C,KAAK,iBAAkBivD,GAS3BrpD,GAAGmE,GAAG8pB,WAAWw7B,UAAUhiB,EAAUnjC,GAAM0H,KAAK,SAAUnK,GAExD,GADAunD,KACK9yB,kBAAkBz0B,GAAM,CAC3B,GAAI8zB,GAAQqiB,EAAIjV,SAAS,YAAYx6B,MACrCyvC,GAAIv+C,OAAOoI,GACX+hD,eAAe5L,GAAK,GAChB1+C,EAAE4qD,cAAgBnlD,OAAO2qD,YAC3BA,WAAWC,UAEb5oD,WAAW,WACT,GAAI6oD,GAAO5R,EAAIjV,SAAS,WACxB,IAAI6mB,EAAKrhD,OAASotB,EAChBizB,EAAa5Q,OACR,CACL,GAAI4R,EAAKrhD,OAASshD,iBAAkB,CAClC,GAAIC,GAAiBxwD,EAAE,4BAA6B0+C,EACvB,IAAzB8R,EAAevhD,OACjBjP,EAAE,yCAA2C8H,EAAE,iBAAmB,UAAUooD,SAASxR,GAElF8R,EAAeptD,OAEtBpD,EAAE,4BAA4ByB,OAGhCgvD,kBAMIzwD,EAAE4qD,cAAgBnlD,OAAO2qD,YAC3BA,WAAWC,UAIqB,aAA9B3pD,GAAGmpB,eAAetC,SAA4B7mB,GAAGmE,GAAG8pB,YAAYjuB,GAAGmE,GAAG8pB,WAAW3R,KAAK,gBACzF,MAEJkG,KAAK,WACN4mC,MApHJ,GAAIv8C,GAAU7M,GAAGC,IAAI4M,QAAQnI,KAAKiY,cAE9BwsC,EAAmC,GAsHvC7vD,GAAE,8BAA8BkB,KAAK,WACnC,GAAI4K,GAAQ9L,EAAEmB,KACd2K,GAAMhL,KAAK,WAAY,WACrBd,EAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7B+8C,EAAS3jD,OAGbwjD,EAAaxjD,KAIjB,QAAS4kD,uBAAsBC,EAAmBC,GAChD,GAAIlS,GAAM1+C,EAAE,6BACZ,IAAI0+C,EAAIzvC,OAAQ,CACd,GAAI4hD,GAA4B,IAAhBD,EAAqB,EAAI/sD,KAAKitD,KAAKH,EAAoBC,GAAe,CACtFlS,GAAI59C,KAAK,WAAY+vD,EAGrB,IAAIE,GAAanlD,SAAS5L,EAAE4yB,OAAO,eAAgB,GAC/Cm+B,IACFtpD,WAAW,WACTi3C,EAAI37C,QAAQ,mBAAmBiD,UAAU+qD,IACxC,IAMT,QAASC,gCAA+BC,EAAWnwD,GACrC,MAARA,EACiB,GAAfA,EAAKmO,QACPjP,EAAE,IAAMixD,GAAW5rD,KAAK,UAAU5E,YAAY,YAAY2qC,WAAW,YAIvEprC,EAAE,IAAMixD,GAAW5rD,KAAK,UAAUxE,SAAS,YAAYqF,KAAK,WAAY,aAikB5E,QAASgrD,oBAAmBC,EAASvwC,GAEnC,GADAwwC,iBAAiB18C,KAAKkM,GAClBuwC,EAEF,IAAK,GADD1/B,IAAU,OAAQ,QAAS,SAAU,SAChC/oB,EAAI,EAAGA,EAAI+oB,EAAOxiB,SAAUvG,EACnC,IACEyoD,EAAQ1/B,EAAO/oB,IAAI2oD,oBAErB,MAAO9rD,KAMb,QAAS8rD,sBAEP5pD,WAAW,WAET,IAAK,GADDxD,IAAK,EACAyE,EAAI,EAAGA,EAAI0oD,iBAAiBniD,SAAUvG,EAC7C,IAAK0oD,iBAAiB1oD,KAAM,CAC1BzE,GAAK,CACL,OAGJjE,EAAE,gBAAgBkB,KAAK,WACrB,GAAIQ,GACAyH,CACJzH,GAAO1B,EAAEmB,MAAML,KAAK,oBACfY,IACHA,EAAQ1B,EAAEmB,MAAM+E,KAAK,aAA4C,KAA7BlG,EAAEmB,MAAM+E,KAAK,YAAsB,IAAM,IAC7ElG,EAAEmB,MAAML,KAAK,mBAAoBY,IAGnCyH,GAAYlF,GAAc,KAARvC,EACdyH,EACFnJ,EAAEmB,MAAM+E,KAAK,WAAY,YAAYrF,SAAS,YAE9Cb,EAAEmB,MAAMiqC,WAAW,YAAY3qC,YAAY,eAG9C,KASL,QAAS6wD,kBACP,GAAIC,GAAMvxD,EAAE,kIAEZA,GAAE,cAAcG,OAAOoxD,EACvB,IAAIC,GAAKxxD,EAAE,MAAOuxD,GAAKE,YACvBF,GAAI1sD,IAAI,aAAc,SACtB,IAAI6sD,GAAK1xD,EAAE,MAAOuxD,GAAKE,YAEvB,OADAzxD,GAAEuxD,GAAK1f,SACC2f,EAAKE,EAGf,QAASC,wBAAuB9uD,GAC9B,GAAIwnD,GAAMrqD,EAAE6C,GACRyG,EAAK+gD,EAAItnD,QAAQ,cACjBsnD,GAAInkB,GAAG,YACT58B,EAAGzI,SAAS,YAEZyI,EAAG7I,YAAY,YAEjB49C,aAAa/0C,EAAGsL,SAAU5U,EAAE,WAAWa,SAAS,cAChDy9C,uBASF,QAASsT,mBACP5xD,EAAE,0BAA0B03B,MAAM,WAChC,GAAIxT,GAAKlkB,EAAEmB,KACN+iB,GAAGtjB,SAAS,wBAEM,iBAAjBsjB,EAAGhe,KAAK,OACVge,EAAG9O,IAAI,IACT8O,EAAGrjB,SAAS,yBAGbgxD,KAAK,WACJ,GAAI3tC,GAAKlkB,EAAEmB,KACK,KAAZ+iB,EAAG9O,QACL8O,EAAG9O,IAAI8O,EAAGpjB,KAAK,UACfojB,EAAGzjB,YAAY,yBAEhBS,KAAK,WACN,GAAIgjB,GAAKlkB,EAAEmB,OACP+iB,EAAGpjB,KAAK,UAAyB,IAAZojB,EAAG9O,OAAe8O,EAAG9O,OAAS8O,EAAGpjB,KAAK,SAG7DojB,EAAGrjB,SAAS,sBAFZqjB,EAAG9O,IAAI8O,EAAGpjB,KAAK,YAYvB,QAASgxD,sBAAqBC,EAAWpsB,EAAQqsB,GAC/C,MAAO,YACLhyD,EAAEqhC,MACAt4B,KAAM,MACNw4B,SAAU,OACV5b,IAAK9W,OAAO,0DAA2D82B,EAAQqsB,GAC/ExwB,QAAS,SAAUj5B,GACZy0B,kBAAkBz0B,KACrBvI,EAAE,IAAM+xD,GAAWhtD,KAAKwD,GACxBo2B,mBAGJjN,MAAO,SAAUS,GACfwM,eAAexM,EAAK,MAEtBtE,OAAO,KAMb,QAASokC,gBAAepvD,GACtBqvD,sBAAsBrvD,GACtBsvD,kBAAkBtvD,GAClB7C,EAAE,SAASoD,OAAOiC,KAAK,kBAAkBjC,OACrCqC,OAAO2sD,wBAAwBA,yBAIrC,QAASC,eAAcC,EAAkBC,EAAkBC,GAMzD,GAAI5K,GAAM2K,EAAiBniD,MAAMkiD,EACjC,OAAQ1K,GAAI34C,OAAS,GAAwB,GAAnB24C,EAAIr7C,QAAQ,KAAYimD,GAAqBF,EAIzE,QAASG,cAAaC,GACpB,MAAoE,IAA5D1yD,EAAE0yD,GAAQ99C,SAASA,SAASA,OAAO,eAAe3F,OAI5D,QAAS0jD,yBAAwBzG,GAC1BA,IAAKA,EAAMlsD,EAAE,UAClBksD,EACGvoC,OAAO,qBAAqBL,KAAK,oBAAqB,SAAU/d,GAE/D,MADAqmD,iBAAgB5rD,EAAEmB,MAAMsoC,eAAkBllC,KAAQgB,EAAEsmD,MAAOjoD,IAAO2B,EAAEumD,SAC7D,IAKb,QAAS8G,uBAAsB/vD,GAE7B,GAAIgwD,GAAiB7yD,EAAE6O,OAAO,eAAgBhM,EAAGqD,KAAK,OAAQrD,GAC1DiwD,EAAe9yD,EAAE6O,OAAO,aAAchM,EAAGqD,KAAK,OAAQrD,EAC1DA,GAAG/B,KAAK,aAAasU,IAAM,SAAU8K,GACnC,MAAqB,mBAAVA,GAIF4yC,EAAa19C,OAHpBy9C,EAAerlB,KAAK,UAAWttB,GAASrd,EAAG/B,KAAK,aAAaiyD,SAC7DD,GAAa19C,IAAI8K,KAKrB2yC,EAAevvC,KAAK,eAAgB,WAC9BuvC,EAAe3sB,GAAG,YACpB4sB,EAAa19C,IAAIvS,EAAG/B,KAAK,aAAaiyD,KAEtCD,EAAa19C,IAAIvS,EAAG/B,KAAK,aAAakyD,MAM5C,QAASC,gBAAepwD,IACtB,MAAuC,mBAAxBA,IAAG/B,KAAK,aAA8BoyD,KAAK,IAAMrwD,GAAGqD,KAAK,aAAe,KAAOrD,GAAG/B,KAAK,aAKxG,QAASqyD,wBAAuBtwD,EAAIvC,EAAI8yD,EAAqBC,EAAiBC,GAE5E,GAAIC,GAAa,SAAU1wD,EAAI07B,GAC7B,GAAIi1B,GAAaP,eAAepwD,EACP,oBAAd2wD,IACY,IAAjBA,EAAW9uD,IAAmC,IAAvB8uD,EAAWjd,UACpCrjB,YAAY,qCAAuCkjB,QAASod,EAAWjd,SAAU0P,MAAOuN,EAAW9uD,IAAM,SAAU6D,GACjH,IAAIA,EAAIm2B,QAaN,WADA77B,GAAG2zC,KAAK,UAXR3zC,GAAG2zC,KAAK,UACR3zC,EAAG2zC,KAAKid,OAAS,IAEjB,IAAI1uD,GAAO2uD,kCAAkCnrD,EAAI6gB,OACjD,OAAIrkB,QACEw5B,GAAUA,EAASx5B,QAEvBlC,GAAG2zC,KAAK,aAYpB4c,GAAuBA,KAAwB,EAC/CC,EAAkBA,MAClBC,EAAsBA,MAGjBzwD,EAAGjC,SAAS,aACf2yD,EAAW1wD,EAAI,SAAU8wD,GACvBA,EAAc3zD,EAAE2zD,GAEhBA,EAAYtuD,KAAK,KAAKie,KAAK,aAAc,WACvCzgB,EAAG2zC,KAAK,OAAQl2C,KAElBuC,EAAGhC,SAAS,YAAY21C,KAAK,WAAWA,MACtC7xC,OAASivD,QAAS,yDAClBxwD,KAAMpD,EAAE4C,QACNixD,QAAQ,EACRC,MAAM,EACNC,MAAO,KACNV,GACHpR,SAAWr5C,KAAM+qD,GACjBlyD,MACEoyD,QAAQ,EACRG,OAAO,EAAMD,MAAO,IACpBE,OAAO,GAET3tD,SAAUtG,EAAE4C,QACVsxD,SAAUl0D,EAAEyF,QACZouD,QAAQ,EACRvsD,OAAQ,QACR6sD,QACEC,OAAO,EACP31C,EAAG,GACHpJ,EAAG,GAELg/C,GAAI,cACJC,GAAI,eACHhB,GACH7hC,QACEruB,KAAM,SAAUoB,EAAO+vD,GAChB1xD,EAAGqjC,GAAG,aACT1hC,EAAML,qBAKVivD,GAAqBvwD,EAAG2zC,KAAK,OAAQl2C,KAO/C,QAASm2C,2BAA0B5zC,EAAI2xD,GACrC,GAAItwC,GAAKrhB,CACJ7C,GAAEwB,MACL0iB,EAAGP,OAAO,mBAAmBL,KAAK,kBAAmB,SAAUhjB,GAC7D,GAAIwL,GAAQ9L,EAAEmB,KACVszD,cAAartD,aAAaqtD,aAC9BA,YAAchtD,WAAW,WACvB0rD,uBAAuBrnD,EAAOxL,GAAI,EAAMggB,OAAWk0C,IAClD,OACF7wC,OAAO,mBAAmBL,KAAK,kBAAmB,WAC/CmxC,aAAartD,aAAaqtD,eAMpC,QAASf,mCAAkCgB,GAGzC,QAASC,GAAkCn8B,GAEzC,GAAIpU,GAAS,EAQb,OAPqB,OAAhBoU,EAAQo8B,MAAgC,IAAhBp8B,EAAQo8B,MAAgC,MAAhBp8B,EAAQq8B,MAAgC,IAAhBr8B,EAAQq8B,KACnFzwC,EAASvV,OAAO,wCAAyC2pB,EAAQo8B,KAAMp8B,EAAQq8B,MAE3D,MAAhBr8B,EAAQq8B,MAAgC,IAAhBr8B,EAAQq8B,OAClCzwC,EAASoU,EAAQq8B,MAGdzwC,EAGT,QAAS0wC,GAAyCC,GAIhD,IAAK,GAHD3wC,GAAS,GACT4wC,EAAS,GACT72C,EAAI,EACCzV,EAAI,EAAGA,EAAIqsD,EAAqB9lD,OAAQvG,IAC/CssD,EAASL,EAAkCI,EAAqBrsD,IAClD,IAAVssD,IACF5wC,GAAUvV,OAAO,6BAA+BkmD,EAAqBrsD,GAAGusD,SAAW,GAAKD,EAAc,GAAL72C,EAAS,QAAU,IACpH+2C,IACA/2C,IAGJ,OAAOiG,GAGT,QAAS+wC,GAAmCC,GAC1C,MAAOvmD,QAAO,iCAAkCumD,GA/BlD,GAAIF,GAAW,EAkCXnwD,EAAO+vD,EAAyCJ,EAAKzL,YACrD8E,EAAM,EAMV,OALkB,OAAd2G,EAAKW,QACPtH,EAAMoH,EAAmCT,EAAKW,QAIhC,GAAZH,EACKrmD,OAAO,mKAMiB/G,EAAE,SAAW,eAChC/C,EAAMgpD,EAAa,IAAPA,EAAY,sBAAwB,IAErD,IA/zDX,SAAW/tD,GACTA,EAAE4B,GAAGgB,QACH0yD,UAAW,SAAUC,EAAUC,GAiD7B,MAhDAr0D,MAAKD,KAAK,WACRlB,EAAEmB,MAAMs0D,SAAS,SAAUjxD,GACzB,GAAiC,aAA7BxE,EAAEmB,MAAM+E,KAAK,YAAjB,CAEA,GAAIgC,GAAO/G,KACPu0D,EAAOlxD,EAAM8mD,KACjB,IAAY,GAARoK,GAAqB,GAARA,EAAW,CAC1B,GAAIh3C,GAAIvB,OAAOw4C,aAAaD,GACxBE,EAAevvD,SAASwvD,SAC5B,IAAID,EAAc,CAChB1tD,EAAKwvB,OACL,IAAIo+B,GAAMF,EAAaG,cACnBC,EAAYJ,EAAaG,cAAcntD,KAAKqG,MAChD6mD,GAAIG,UAAU,aAAc/tD,EAAKgY,MAAMjR,QACvCinD,SAAWJ,EAAIltD,KAAKqG,OAAS+mD,EAC7BG,OAASD,SAAWF,EACpBh2D,EAAEwE,EAAM8C,QAAQiiD,QAAQ,cAExB2M,UAAW1xD,EAAM8C,OAAO8uD,eACxBD,OAAS3xD,EAAM8C,OAAO+uD,aACK,MAAvB3vD,GAAGC,IAAI4M,QAAQnI,MAAwC,MAAxB1E,GAAGC,IAAI4M,QAAQ+iD,OAChDt2D,EAAEwE,EAAM8C,QAAQiiD,QAAQ,SAI5B,IAAIn0C,GAAMlN,EAAKgY,MAAM5C,OAAO,EAAG44C,UAAYx3C,EAAIxW,EAAKgY,MAAM5C,OAAO64C,QAC7DI,EAAO,GAAIl3C,QAAOk2C,EACtB,KAAKgB,EAAK/pB,KAAKp3B,GACb,OAAO,CAET,IAAIohD,GAAY,gBAAkBhqB,KAAK3d,UAAUU,WAcjD,OAZIimC,KACEgB,EACF/uD,WAAW,WAET2N,EAAMlN,EAAKgY,MACXlgB,EAAEkI,GAAMkN,IAAIA,EAAI/F,QAAQ,QAASmmD,KAChC,GAGH/tD,WAAW,WAAczH,EAAEkI,GAAMkN,IAAIA,EAAI/F,QAAQ,QAASmmD,KAAsB,KAG7E,QAINr0D,SAGVoM,OAkEH,IAAIkpD,MAAO,GAmDPC,YAAc,KA6JdpY,sBACJ,WAEE,QAASqY,GAAe/M,GACtB,MAAOA,GAAK9oD,KAAK,mBAAqB,WACpC,GAAIyH,KAYJ,OAXAA,GAAIquD,YAAchN,EAAKvkD,KAAK,sBACxBkD,EAAIquD,YAAY3nD,SAClB1G,EAAIsuD,WAAajN,EAAKvkD,KAAK,kBAC3BkD,EAAIuuD,YAAclN,EAAKvkD,KAAK,gBAC5BkD,EAAIwuD,+BAAiCxuD,EAAIuuD,YAAYl2D,SAAS,YAC9D2H,EAAIyuD,+BAAiCzuD,EAAIquD,YAAYh2D,SAAS,YAC9D2H,EAAI0uD,8BAAgC1uD,EAAIsuD,WAAWj2D,SAAS,YAC5D2H,EAAI2uD,kBAAoB3uD,EAAIquD,YAAY1wD,KAAK,SAC7CqC,EAAI4uD,iBAAmB5uD,EAAIsuD,WAAW3wD,KAAK,UAE7C0jD,EAAK9oD,KAAK,iBAAkByH,GACrBA,KAIX+1C,qBAAuB,SAAUoM,GAC/B,GAAI0M,IAAW,CACf,IAAK1M,GAAYA,EAAQz7C,OAGlB,CACL,GAAI88C,GAAKC,cAActB,EAAQxkD,KAAK,MACpCkxD,IAAYrL,EAAGsL,QAAUtL,EAAGuL,QAAUvL,EAAGuL,OAAOroD,OAAS,MAJzDy7C,GAAU1qD,EAAE,0BACZ8pD,wBAKF,IAAIlrC,GAAI+3C,EAAejM,GACnB6M,EAAY7M,EAAQ9pD,SAAS,iBAQ7B42D,EAAa,SAAUC,GACzB,MAAQ/M,GAAQrlD,KAAK,SAAWoyD,EAAU,iBAAuB,OAGnE,IAAI74C,EAAEg4C,YAAY3nD,OAChB,GAAImoD,GAAY1M,EAAQrlD,MAAMkyD,EAAY,GAAK,KAAO,kBAAkBtoD,OACjE2P,EAAEo4C,gCAAgCp4C,EAAEg4C,YAAYn2D,YAAY,YAAYyF,KAAK,QAAS0Y,EAAEs4C,mBAGzFM,EAAW,QAAUA,EAAW,SAAWA,EAAW,QACnD54C,EAAEm4C,gCAAgCn4C,EAAEk4C,YAAYr2D,YAAY,YAAYyF,KAAK,QAAS4B,EAAE,oCAE7F8W,EAAEk4C,YAAY5wD,KAAK,QAAS4B,EAAE,sBAG5B4iD,EAAQrlD,MAAMkyD,EAAY,GAAK,KAAO,gCAAgCtoD,OACnE2P,EAAEq4C,+BAA+Br4C,EAAEi4C,WAAWh2D,SAAS,YAAYqF,KAAK,QAAS4B,EAAE,wCAEnF8W,EAAEq4C,+BAA+Br4C,EAAEi4C,WAAWp2D,YAAY,YAAYyF,KAAK,QAAS0Y,EAAEu4C,sBAG1F,CACH,GAAIO,GAAS5vD,EAAE,oBACV8W,GAAEo4C,gCAAgCp4C,EAAEg4C,YAAY/1D,SAAS,YAAYqF,KAAK,QAASwxD,GACnF94C,EAAEq4C,+BAA+Br4C,EAAEi4C,WAAWh2D,SAAS,YAAYqF,KAAK,QAASwxD,GACjF94C,EAAEm4C,gCAAgCn4C,EAAEk4C,YAAYj2D,SAAS,YAAYqF,KAAK,QAASwxD,GAExFrc,8BASR,IAAIgD,cAAe,SAAUuL,EAAMmB,GACjC,GAAI4M,GAAe/N,EAAKvkD,KAAK,oBACzBsyD,GAAa1oD,OAAS,EACxB87C,EAAO7kD,KAAK,UAAW,KAAKA,KAAK,QAAS4B,EAAE,iBAE5CijD,EAAOtqD,YAAY,aAAa2qC,WAAW,WAAWllC,KAAK,QAAS4B,EAAE,gBAgMtE8vD,cAAe,EAuVf5L,eACJ,WAcE,QAAS6L,oBAAmBnzD,GAC1BvD,KAAKuD,GAAKA,EAZZ,GAAIgxB,YAIJs2B,eAAgB,SAAUtnD,GAGxB,MAFKgxB,UAAStU,eAAe1c,KAC3BgxB,SAAShxB,GAAM,GAAImzD,oBAAmBnzD,IACjCgxB,SAAShxB,IAQlBmzD,mBAAmB30D,WAEjB40D,eAAe,EAQfxqC,KAAM,SAAUgG,GACd,GAAIpP,GAAK/iB,IACTnB,GAAE4C,OAAOshB,EAAIoP,GACbpP,EAAG7iB,KAAOrB,EAAE,IAAMkkB,EAAGxf,IACrBwf,EAAGozC,OAASt3D,EAAEsoB,UAAUpE,EAAGozC,OAC3B,IAAIS,GAAU/3D,EAAEwkB,OAAON,EAAGozC,OAG1B,IAFAt3D,EAAE,IAAMkkB,EAAGxf,GAAK,SAAS0Q,IAAI2iD,GAC7B7zC,EAAG4zC,eAAgB,EACfxkC,EAAM0kC,OAAQ,CAChB,GAAIC,GAAa,GAAI7vD,UAASkrB,EAAM0kC,OACpCC,GAAWj3D,KAAKkjB,GAElBo6B,qBAAqBp6B,EAAG7iB,OAG1B62D,QAAS,WACP,GAAIh0C,GAAK/iB,IACT+iB,GAAG7iB,KAAKgE,KAAK,4BAA4BxE,SAAS,YAC/CwE,KAAK,qCAAqC5D,OAC7CyiB,EAAG7iB,KAAKgE,KAAK,qCAAqC5D,OAClDyiB,EAAGi0C,UAAW,GAGhBC,OAAQ,WACN,GAAIl0C,GAAK/iB,IACT+iB,GAAG7iB,KAAKgE,KAAK,4BAA4B5E,YAAY,YAClD4E,KAAK,2BAA2BjC,OACnC8gB,EAAG7iB,KAAKgE,KAAK,qCAAqCjC,OAClD8gB,EAAGi0C,UAAW,GAWhBE,UAAW,SAAU95B,EAAU+d,GAC7B,GAAIp4B,GAAK/iB,KACLizB,EAAQlQ,EAAGo0C,kBAgBf,OAfmB,IAAflkC,EAAMmkC,MAER5tD,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,WACtC/H,KAAKgqB,WAAW6jC,UAAU/tD,EAAEgT,IAAI2W,EAAMA,MAAO,SAAU9O,GACrD,GAAImzC,GAAkBz4D,EAAE4C,UAAW0iB,EAInC,OAFAmzC,GAAsB,KAAIA,EAAsB,WACzCA,GAAsB,KACtBA,QAKX,GAAK/xD,IAAGygB,IAAIod,IAAI2H,OAAO9oC,KAAK0E,EAAE,yBAEzB3G,MAST86C,UAAW,SAAU1d,EAAU+d,GAC7B,GAAIp4B,GAAK/iB,IAET06C,gBAAe,KAAM,MAErB33B,EAAGw0C,YAAY5wD,EAAE,cAEjB,IAAI6wD,GAAgBz0C,EAAGo0C,kBACvB,IAA2B,IAAvBK,EAAcJ,MAAa,CAC7B,GAAI3b,GAAa+b,EAAcvkC,MAC3BwkC,EAAWjc,8BAA8BC,EAC7CjyC,MAAKwxC,UAAUC,qBAAqBwc,GAAUlmD,KAAK,SAAU2pC,GAC3Dn4B,EAAG20C,YAAY/wD,EAAE,eAAgBu0C,GAAmB,OACnDnzB,KAAK,SAAUozB,GAChBp4B,EAAG20C,YAAYvc,EAAa,WAG9Bp4B,GAAGw0C,YAAY5wD,EAAE,wBAAyB,MAU9Ci1C,WAAY,SAAUxe,EAAU+d,GAC9B,GAAIp4B,GAAK/iB,IAET,KAAI+iB,EAAGi0C,WAEFj0C,EAAG4zC,cAIN,GAHA5zC,EAAG4zC,eAAgB,EACnBjc,eAAe,KAAM,MACrB33B,EAAGw0C,YAAY5wD,EAAE,gBACZoc,EAAG40C,cAyBD,CACL,GAAIC,GAAW70C,EAAGozC,OAAOroD,OACrB+pD,GACFC,SAAU/0C,EAAGxf,GAAK,QAClBw0D,aAAch1C,EAAGg1C,aACjBC,eAAgBj1C,EAAGi1C,gBAGjBC,EAAqB,SAAUC,EAAeL,GAChD90C,EAAGo1C,cAAcD,EACfL,EACA,SAAUzwD,GACR2b,EAAGq1C,WAAWhxD,EAEd,IAAIixD,GAAWt1C,EAAGozC,OAAOroD,OACrBwqD,EAAaD,EAAWT,CACxBU,GAAa,GACfv1C,EAAG7iB,KAAKkoD,QAAQ,SAAUrlC,EAAGozC,QACT,KAAhBhb,GAAuB,EAGzBp4B,EAAG20C,YAAYvc,EAAa,KAF5Bp4B,EAAG20C,YAAY/wD,EAAE,eAAgB2xD,GAAa,KAGhDpe,2BAEAn3B,EAAG20C,YAAY/wD,EAAE,sBAAuB,KAEtCy2B,GAAUA,EAASh2B,GACvB2b,EAAG4zC,eAAgB,GAErB,SAAUr5C,EAAGi7C,EAAIC,GACfz1C,EAAG4zC,eAAgB,IAIzB9rC,WAAU4C,MAAMkE,kBAAkB,aAAaC,OAAO,SAAUC,GAC1DA,EACFroB,KAAKwxC,UAAUiB,wBACZ1qC,KAAK,SAAU0hB,GACdp0B,EAAE4C,OAAOo2D,GAAa/d,MAAO7mB,IAC7BglC,EAAmB,aAAcJ,KAChC9vC,KAAK,WACNkwC,EAAmB,mBAAoBJ,KAG3CI,EAAmB,mBAAoBJ,SApE3ChtC,WAAU4C,MAAMkE,kBAAkB,aAAaC,OAAO,SAAUC,GAC1DA,EACFroB,KAAKwxC,UAAUiB,wBAAwB1qC,KAAK,SAAU0hB,GACpDlQ,EAAG01C,SAASxlC,EAAOlQ,EAAIqa,EAAU+d,GACjCp4B,EAAG4zC,eAAgB,IAGrB5kC,YAAY,mCACV,KACA,SAAU3qB,GACR,GAAIA,EAAIm2B,QAAS,CACf,GAAItK,GAAQ7rB,EAAI6gB,MAChBlF,GAAG01C,SAASxlC,EAAOlQ,EAAIqa,EAAU+d,OAEjCp4B,GAAG20C,YAAYtwD,EAAIse,MAAO,IAE5B3C,GAAG4zC,eAAgB,GAErB,WACE5zC,EAAG4zC,eAAgB,OA2DjC8B,SAAU,SAAUxlC,EAAOlQ,EAAIqa,EAAU+d,GACvC,GAAIp4B,GAAK/iB,IACT,KAAI+iB,EAAGi0C,SAAP,CAEA,GAAI0B,GAAU,CACVzlC,IACFp0B,EAAEkB,KAAKkzB,EAAO,WAEZ,GAAIlQ,EAAG41C,YAAY34D,SAEXo9B,GAAcA,EAASp9B,OAG3B,MAFA+iB,GAAG61C,UAAU54D,MACb04D,GAAW,EACJ31C,EAAGmzC,SAKdwC,EAAU,EACZ31C,EAAG81C,WAAW,WACQ,KAAhB1d,EACFp4B,EAAG20C,YAAY/wD,EAAE,eAAgB+xD,GAAU,KAE3C31C,EAAG20C,YAAYvc,EAAa,OAGhCp4B,EAAG20C,YAAY/wD,EAAE,sBAAuB,OAO5Cu1C,YAAa,SAAUjpB,EAAOmK,EAAU+d,GACtC,GAAIp4B,GAAK/iB,IACT,KAAI+iB,EAAGi0C,SAAP,CAEA,GAAIj0C,GAAK/iB,IACT,KAAK+iB,EAAG4zC,cAAe,CACrB,IAAK1jC,EAAO,CACV,GAAI6lC,GAAM/1C,EAAGo0C,kBACb,IAAI2B,EAAIC,aACN,MACF9lC,GAAQ6lC,EAAI7lC,MAEd,GAAI2kC,GAAW70C,EAAGozC,OAAOroD,MACrB,IAAYmlB,EAAMnlB,OAAS,GAC7BuvC,cAAcpqB,EAAMnlB,OAAQiV,EAAG40C,cAAiB1kC,EAAMnlB,OAAS,EAAInH,EAAE,6BAA8BssB,EAAMnlB,QAAUnH,EAAE,6BAAgC,MAAM4K,KAAK,WAG9J,GADAwR,EAAG4zC,eAAgB,EACd5zC,EAAG40C,cAiBN50C,EAAGw0C,YAAY5wD,EAAE,iBAEjBpB,GAAG8L,IAAIxR,KAAK,yCACVi4D,SAAU/0C,EAAGxf,GAAK,QAClBw0D,aAAch1C,EAAGg1C,aACjBC,eAAgBj1C,EAAGi1C,eACnBgB,WAAYn6D,EAAEwkB,OAAO4P,IACpB,KAAM,MAAM,GAAM,GAAM1hB,KAAK,SAAUnK,EAAKm2C,GAC7Cx6B,EAAGq1C,WAAWhxD,EACd,IAAIixD,GAAWt1C,EAAGozC,OAAOroD,OACrBmrD,EAAWrB,EAAWS,CAQ1B,IAPoB,KAAhBld,EACFp4B,EAAG20C,YAAY/wD,EAAE,gBAAiBsyD,GAAW,KAE7Cl2C,EAAG20C,YAAYvc,EAAa,KAC9BjB,0BACAn3B,EAAG4zC,eAAgB,EAEfpZ,EAAIrR,QAAS,CACf,GAAIgtB,GAAW3+B,KAAKC,MAAM+iB,EAAIrR,QAC9B,IAAIgtB,EAASxrB,SAAU,CACrB,GAAI/gC,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,YAAahnC,MAAO,KACpD0L,GAAO02B,YAAY61B,EAASxrB,SAAUwrB,EAASvrB,eAAez/B,QAAQ,KAAM,mBAG/E6Z,KAAK,SAAU3jB,GAChB2e,EAAG4zC,eAAgB,CAEnB,IAAIhqD,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,YAAahnC,MAAO,KACpD0L,GAAOmiC,UAAU1qC,SA9CE,CACrB,GAAI+0D,GAAMt6D,EAAEyd,IAAI2W,EAAO,SAAU9O,GAAQ,MAAO1Z,UAAS0Z,EAAKE,GAAI,KAClEtB,GAAGozC,OAASt3D,EAAEu6D,KAAKr2C,EAAGozC,OAAQ,SAAU34C,GAAK,MAAO3e,GAAEw6D,QAAQ77C,EAAE6G,GAAI80C,KAAQ,GAC5E,IAAId,GAAWt1C,EAAGozC,OAAOroD,OACrBmrD,EAAWrB,EAAWS,CACtBY,GAAW,IACbl2C,EAAGw0C,YAAY5wD,EAAE,iBACjBoc,EAAG81C,WAAW,WACQ,KAAhB1d,EACFp4B,EAAG20C,YAAY/wD,EAAE,gBAAiBsyD,GAAW,KAE7Cl2C,EAAG20C,YAAYvc,EAAa,KAC9Bp4B,EAAG4zC,eAAgB,IAEjBv5B,GAAUv+B,EAAEkB,KAAKkzB,EAAO,SAAUqmC,EAAOn1C,GAAQiZ,EAASjZ,YA2C1Eo1C,WAAY,SAAUhc,EAAKngB,EAAUnsB,GACnC,GAAI8R,GAAK/iB,IACL+iB,GAAGi0C,UAEPh3D,KAAKk8C,cAAe73B,GAAIk5B,EAAIh6C,GAAI47B,KAAMoe,EAAInf,KAAMqa,SAAU8E,EAAI7E,SAAW,KAAOtb,EAAUnsB,IAI5F4jC,MAAO,SAAUzX,GACf,GAAIra,GAAK/iB,IACT,KAAI+iB,EAAGi0C,SAAP,CAEA,GAAIj0C,GAAK/iB,IACJ+iB,GAAG4zC,gBACN5zC,EAAG4zC,eAAgB,EAEfv5B,GACFv+B,EAAEkB,KAAKgjB,EAAGozC,OAAQ,WAAc/4B,EAASp9B,QAG3C+iB,EAAGozC,UACHpzC,EAAG81C,WAAW,WACZ91C,EAAG4zC,eAAgB,OAOzB6C,UAAW,SAAUC,GACnB,GAAI12C,GAAK/iB,IACT,KAAI+iB,EAAGi0C,SAAP,CAEA,GAAI0C,EACJ,KACEA,EAASjvD,SAAS5L,EAAE,WAAa46D,GAAUxlD,MAAO,IAClD,MAAO7P,GACPs1D,EAAS,EAEX,GAAIA,EAAQ,CACV,GAAIxiC,GAAMr4B,EAAE,IAAM46D,GAAU95D,MAC5Bu3B,GAAIyiC,wBAAwBtgC,WAGvBtW,EAAG62C,qBAAsB,GAAW72C,EAAG7iB,MAAmD,SAA1C6iB,EAAG7iB,KAAK6E,KAAK,0BACQ,GAApElG,EAAEu6D,KAAKr2C,EAAGozC,OAAQ,SAAU34C,GAAK,MAAOA,GAAE6G,IAAMq1C,IAAU5rD,QAC5DiV,EAAG82C,gBAAgBH,GAGrB32C,EAAG82C,gBAAgBH,MAMzBG,gBAAiB,SAAUH,GACzB,GAAI32C,GAAK/iB,IACT,KAAI+iB,EAAGi0C,SAAP,CAEA,GAAI8C,IAAWz1C,GAAIq1C,EAAQv6B,KAAM,MAAOsZ,SAAU11B,EAAGkyB,QACjDlyB,GAAGmzC,OACLnzC,EAAGozC,OAAO5iD,KAAKumD,GAEf/2C,EAAGozC,QAAU2D,GAEf/2C,EAAGw0C,YAAY5wD,EAAE,gBACjBoc,EAAG81C,WAAW,WACZ91C,EAAG20C,YAAY,GAAI,OAKvBqC,gBAAiB,SAAUhC,EAAcC,GACvCh4D,KAAK23D,eAAgB,EACrB33D,KAAK+3D,aAAeA,EACpB/3D,KAAKg4D,eAAiBA,CACtB,IAAIgC,GAAMh6D,KAAKE,KAAK0B,QAAQ,gBAGxBmhB,GAFOi3C,EAAIp4D,QAAQ,0BAEd5B,KACT+iB,GAAG7iB,KAAKgE,KAAK,yBACVa,KAAK,OAAQ,OACbod,KAAK,cAAe,SAAU/d,GAI7B,MAHAA,GAAEpB,iBACFoB,EAAEhF,kBACFqrD,gBAAgB5rD,EAAEmB,UAAaoD,KAAQgB,EAAEsmD,MAAOjoD,IAAO2B,EAAEumD,QAAS,IAC3D,KAIbsP,gBAAiB,SAAUd,GACzB,GAAIp2C,GAAK/iB,IACTnB,GAAEkB,KAAKo5D,EAAK,WACV,GAAIpiC,GAAMl4B,EAAE,IAAMmB,KAAO,mCAAoC+iB,EAAG7iB,KAC5D62B,GAAIjpB,QACNipB,EAAIr3B,SAAS,oBAUnBy3D,iBAAkB,WAChB,GAAKn3D,KAAKk2D,OAEL,CACH,GAAI30D,GAAQvB,KAAKE,KAAKgE,KAAK,yBACvBkD,EAAMg2C,cAAc77C,EAIxB,OAHIA,GAAMo5B,OAAO,kBAAkB7sB,SACjC1G,EAAI2xD,cAAe,GAEd3xD,EAPP,MAAOg2C,eAAcp9C,KAAKE,KAAKgE,KAAK,kBAYxCg2D,SAAU,WACR,GAAKl6D,KAAKk2D,OAEL,CACH,GAAI30D,GAAQvB,KAAKE,KAAKgE,KAAK,gBACvBkD,EAAMg2C,cAAc77C,EAIxB,OAHIA,GAAMo5B,OAAO,kBAAkB7sB,SACjC1G,EAAI2xD,cAAe,GAEd3xD,EAPP,MAAOg2C,eAAcp9C,KAAKE,KAAKgE,KAAK,kBAcxCqzD,YAAa,SAAUtmD,EAAK2hD,GACtBA,EACF7W,qBAAqB9qC,EAAK2hD,GAE1Bv1B,eAAepsB,IAOnBymD,YAAa,SAAUzmD,EAAK2hD,GAC1Bp1B,eAAevsB,EAAK2hD,IAKtBiG,WAAY,SAAUz7B,GACpB,GAAIra,GAAK/iB,KAEL42D,EAAU/3D,EAAEwkB,OAAON,EAAGozC,OAC1Bt3D,GAAE,IAAMkkB,EAAGxf,GAAK,SAAS0Q,IAAI2iD,GAC7B7zC,EAAGo1C,cAAc,cACfL,SAAU/0C,EAAGxf,GAAK,QAClB42D,YAAap3C,EAAGo3C,YAChBllB,QAASlyB,EAAGkyB,QACZihB,OAAQnzC,EAAGmzC,OACXkE,cAAer3C,EAAGq3C,cAClBjE,OAAQS,EACRyD,UAAWt3C,EAAGs3C,UACdC,cAAev3C,EAAGu3C,eACjB,SAAUlzD,GACX2b,EAAGq1C,WAAWhxD,GACU,mBAAbg2B,IACTA,EAASv9B,KAAKkjB,KAElBm3B,2BAGFke,WAAY,SAAUhxD,KACpB,GAAI2b,IAAK/iB,IACY,OAAjBoH,IAAImzD,YAENx3C,GAAGozC,OAASt3D,EAAEsoB,UAAU/f,IAAImzD,WAC5B17D,EAAE,IAAMkkB,GAAGxf,GAAK,SAAS0Q,IAAI7M,IAAImzD,WAEnC,IAAIC,eAAgB37D,EAAE,IAAMkkB,GAAGxf,GAAK,QACpCi3D,eAAcC,QACV13C,GAAGq3C,eAAiBr3C,GAAGozC,OAAOroD,OAAS,EACzC0sD,cAAc96D,SAAS,yBAEvB86D,cAAcl7D,YAAY,yBAExB8H,IAAIszD,MAAMF,cAAc52D,KAAKwD,IAAIszD,MACjCtzD,IAAIuzD,QAAQ5I,KAAK3qD,IAAIuzD,QACzB97D,EAAE,IAAMkkB,GAAGxf,GAAK,WAAW0mC,WAAW,WAAWllC,KAAK,QAAS4B,EAAE,cACjE,KACEupD,qBACA,MAAO9rD,IACT+4C,qBAAqBn9C,KAAKE,MAC1B6iB,GAAG7iB,KAAKkoD,QAAQ,WAQlB+P,cAAe,SAAUyC,EAAQhtD,EAAQwvB,EAAUy9B,GACjD,GAAI93C,GAAK/iB,IACT+xB,aAAY,uBAAyB6oC,EAAQhtD,EAAQ,SAAUxG;AACzDA,EAAIm2B,QACkB,mBAAbH,IACTA,EAASv9B,KAAKkjB,EAAI3b,EAAI6gB,QAGxBlF,EAAGw0C,YAAY,mEAAoE,MAEpFsD,IASLlC,YAAa,SAAUpb,GAErB,MADAA,GAAIpe,KAAOoe,EAAIpe,KAAKpuB,eACI,OAApB/Q,KAAKm6D,aACN5c,EAAIpe,MAAQn/B,KAAKm6D,cACJ,OAAZ5c,EAAIpe,MAAiBoe,EAAI9E,UAAYz4C,KAAKi1C,WAGiC,GAAvEp2C,EAAEu6D,KAAKp5D,KAAKm2D,OAAQ,SAAU34C,GAAK,MAAOA,GAAE6G,IAAMk5B,EAAIl5B,KAAOvW,QAQvE8qD,UAAW,SAAUrb,GACnBA,EAAIpe,KAAOoe,EAAIpe,KAAKpuB,aACpB,IAAI+oD,IAAWz1C,GAAIk5B,EAAIl5B,GAAI8a,KAAMoe,EAAIpe,KAAKpuB,cAAe0nC,SAAU8E,EAAI9E,SACnEz4C,MAAKk2D,OACPl2D,KAAKm2D,OAAO5iD,KAAKumD,GAEjB95D,KAAKm2D,QAAU2D,OAQvB,IAAI7J,qBAmRAqD;CCv8DJ,SAAWz0D,GACT,GAAIi8D,GAAqB,KAErBniC,EAAK,SAAU3kB,EAAK0I,EAAGkwC,GACzB5sD,KAAKO,KAAKyT,EAAK0I,EAAGkwC,GAEpBj0B,GAAG52B,WAEDiS,IAAK,KACL+mD,UAAW,KACXC,QAAS,KACT5kC,MAAO,KACPw2B,IAAK,KACLhjC,MAAO,KACP63B,OAAQ,KACRzjB,KAAM,KACNi9B,UAAW,KACXC,cAAe,KACfC,kBAAmB,KACnBC,QAAS,KAETC,OAAQ,GAGRx8B,MAAO,KACPy8B,QAAS,KACTC,gBAAiB,KAGjB/2C,IAAK,KACLg3C,YACAC,cAAe,EACfC,gBAAiB,KACjBC,qBAAqB,EACrB/iC,YAAa,KACblzB,IAAK,GACLktD,MAAO,IACPgJ,SAAU,EACVC,WAAW,EACXC,iBAAiB,EACjBC,YAAa,EACbC,YAAa,EACbC,aAAa,EACb3hC,yCAA0C,KAC1C4hC,WAAW,EACXthC,eAAe,EACfuhC,gBAAgB,EAChBj0D,UAAU,EACVk0D,YAAa,EACbC,SAAU,EACVC,kBAAmB,GACnBpoB,aAAc,KACdqoB,sBAAsB,EAEtBC,kBAAkB,EAClBC,gBAAiB,OACjBC,YAAa/1D,EAAE,oBACfg2D,WAAYh2D,EAAE,iBACdi2D,WAAYj2D,EAAE,wBACdk2D,UAAWl2D,EAAE,oBAEbpG,KAAM,SAAUyT,EAAKxS,EAASorD,GAwGxB,QAASkQ,KACP,GAAK/1D,EAAKiN,IAAI+wB,GAAG,UAEjB,IACEh+B,EAAKg2D,eAAeh2D,EAAKw1D,sBACzBx1D,EAAKi2D,2BACLC,EAAY32D,WAAWw2D,EAAkBI,GACzC,MAAO5zD,KA9Gf,GAAIvC,GAAOlI,EAAE4C,OAAOzB,KAAMwB,EAG1B,IAFAuF,EAAKiN,IAAMnV,EAAEmV,IAETjN,EAAKiN,IAAIvU,SAAS,mBAAtB,CA0EA,GAzEIsH,EAAKo1D,gBAAgBp1D,EAAKiN,IAAItU,SAAS,aAE3CqH,EAAKiN,IACFtU,SAAS,YACTC,KAAK,WAAYoH,EAAKmB,UACtBia,KAAK,kBAAmB,WAEnBpb,EAAKiN,IAAIjP,KAAK,OAAS+1D,GAEzBj8D,EAAE,IAAMi8D,GAAoBqC,gBAG9Bp2D,EAAKq0D,QAAQ17D,SAAS,2BACtBqH,EAAKq2D,mBAELtC,EAAqB/zD,EAAKiN,IAAIjP,KAAK,QAEpCod,KAAK,iBAAkB,WAEtBpb,EAAKi2D,0BAAyB,GAC9Bj2D,EAAKq0D,QAAQ97D,YAAY,2BACpByH,EAAKi3B,KAAK/pB,OAAUlN,EAAKiN,IAAIC,OAAOlN,EAAKs2D,qBAE/Cl7C,KAAK,cAAe,SAAU/d,EAAGoZ,GAChCzW,EAAKiN,IAAIrU,KAAK,WAAY6d,GAC1BzW,EAAKiN,IAAIo0C,QAAQ,cACjBrhD,EAAKq2D,qBAENj7C,KAAK,sBAAuB,SAAU/d,EAAGk5D,EAAOC,EAAWC,GAC1Dz2D,EAAK02D,oBAAoBH,EAAOC,EAAWC,GAC3Cz2D,EAAKq2D,qBAENj7C,KAAK,QAAS,WACbpb,EAAK22D,iBACL32D,EAAKs2D,qBAENl7C,KAAK,gBAAiB,WACrBpb,EAAK42D,kBAENx7C,KAAK,WAAY,SAAU/d,EAAGglC,EAAUw0B,GACvC72D,EAAKsyB,SAAS+P,EAAUw0B,GACxB72D,EAAKq2D,qBAENj7C,KAAK,YAAa,SAAU/d,EAAGm5D,EAAWK,GACzC72D,EAAK82D,UAAUN,EAAWK,GAC1B72D,EAAKq2D,qBAENj7C,KAAK,cAAe,SAAU/d,EAAGoZ,GAC1BA,GACJzW,EAAKiN,IAAIjP,KAAK,WAAY,YAAYrF,SAAS,gBAAgBqF,KAAK,YAAY,GAChFgC,EAAKk0D,UAAU/2D,KAAK,cAAcxE,SAAS,gBAC3CqH,EAAKm0D,cAAch3D,KAAK,QAAQxE,SAAS,gBACrCqH,EAAK6lD,IAAI9+C,QACX/G,EAAK6lD,IAAIltD,SAAS,uBAGpBqH,EAAKiN,IAAIi2B,WAAW,YAAY3qC,YAAY,gBAAgByF,KAAK,WAAY,GAC7EgC,EAAKk0D,UAAU/2D,KAAK,cAAc5E,YAAY,gBAC9CyH,EAAKm0D,cAAch3D,KAAK,QAAQ5E,YAAY,gBACxCyH,EAAK6lD,IAAI9+C,QACX/G,EAAK6lD,IAAIttD,YAAY,sBAKzByH,EAAKiN,IAAIo0C,QAAQ,uBAAwB5qC,KAG7CzW,EAAKk0D,UAAYl0D,EAAKiN,IAAIP,SAE1B1M,EAAKiN,IAAImO,KAAK,UAAWpb,EAAMA,EAAK+2D,SAGhCj/D,EAAEwB,MAAQkF,GAAGC,IAAIC,YAAa,CAChC,GAAoD,IAAhD5G,EAAE,YAAckI,EAAKiN,IAAIjP,KAAK,OAAO+I,OAAc,CACrD,GAAIuiC,GAAMxxC,EAAE,0DAA4DkI,EAAKiN,IAAIjP,KAAK,MAAQ,QAC3Fyd,OAAO,SACPvf,MAAM,WACL8D,EAAKiN,IAAIuiB,SAGb13B,GAAE,QAAQG,OAAOqxC,OAEjBxxC,GAAE,YAAckI,EAAKiN,IAAIjP,KAAK,OAAOyd,OAAO,SAASvf,MAAM,WACzD8D,EAAKiN,IAAIuiB,SAIbxvB,GAAKiN,IAAIP,SAASxQ,MAAM,WACtBpE,EAAE,YAAckI,EAAKiN,IAAIjP,KAAK,OAAO9B,UAKzC,GAAI8D,EAAKm1D,WACP,GAAIr9D,EAAEwB,MAAQkF,GAAGC,IAAIC,YAAa,CAChCsB,EAAKg3D,KAAOh3D,EAAKiN,IAAIC,KACrB,IAAIgpD,GAAY,KACZC,EAAW,GAUfn2D,GAAKiN,IAAImO,KAAK,QAAS,WACrB86C,EAAY32D,WAAWw2D,EAAkBI,KACxC/6C,KAAK,OAAQ,WACV86C,GAAWh3D,aAAag3D,UAKhCl2D,GAAKiN,IAAImO,KAAK,SAAU,WAEtBpb,EAAKi3B,KAAK/pB,IAAI,IAAMpV,EAAEmB,MAAMiU,QAIrB,OAAP24C,IACF7lD,EAAK6lD,IAAM/tD,EAAE+tD,GACVltD,SAAS,UACTyiB,KAAK,mBAAoB,SAAUhjB,GAGlC,MADA27D,GAAqB/zD,EAAKiN,IAAIjP,KAAK,MAC5BgC,EAAKi3D,WAAW7+D,MAK7BN,EAAE,QAAQsjB,KAAK,kBAAmB,SAAUhjB,GAC1C,GAAIqd,GAAI3d,EAAEM,EAAGgH,OACb,IAAIqW,GAAKA,EAAE1O,OAAS,EAAG,CACrB,GAAIoF,GAAYsJ,EAAE,GAAGtJ,SACjBA,IAAaA,EAAUC,UACzBD,EAAYA,EAAUC,SAEC,gBAAdD,IAA0BA,EAAU9H,QAAQ,UAAW,GAAM8H,EAAU9H,QAAQ,YAAa,IAChE,IAAjCrE,EAAKqvB,MAAMlyB,KAAK,MAAM4J,QAAmC,KAAnB/G,EAAKiN,IAAIC,OACjDlN,EAAKyvB,QAAO,GAEVzvB,EAAKg0D,UAAUh2B,GAAG,aAAah+B,EAAK42D,qBAGtC52D,GAAKg0D,UAAUh2B,GAAG,aAAah+B,EAAK42D,kBAI5C52D,EAAKs0D,OAAS,UAA4B,IAAhB34D,KAAKqP,SAAiB,GAChDhL,EAAKg0D,UAAYl8D,EAAE,yFAA2FkI,EAAKs0D,OAAS,YAAYtM,SAAS,QACjJhoD,EAAKi0D,QAAUn8D,EAAE,yDAAyDkwD,SAAShoD,EAAKg0D,WACxFh0D,EAAK6iB,MAAQ/qB,EAAE,eAAeo/D,UAAUl3D,EAAKg0D,WAC7Ch0D,EAAKqvB,MAAQv3B,EAAE,oEAAoEkwD,SAAShoD,EAAKi0D,QAAQ92D,KAAK,YAC9G6C,EAAK06C,OAAS5iD,EAAE,eAAekwD,SAAShoD,EAAKg0D,WAEzCh0D,EAAKk1D,aACPl1D,EAAKqvB,MAAM12B,SAAS,wBAItBqH,EAAKo0D,kBAAoBt8D,EAAE,wCAC3BkI,EAAKm0D,cAAgBr8D,EAAE,mCAEvBkI,EAAKo0D,kBAAkBh5C,KAAK,kBAAmB,WAE7Cpb,EAAKm0D,cAAc5yB,SAAS,aAAa4b,MAAMn9C,EAAKiN,KACpDjN,EAAKi2D,2BACL12D,WAAW,WACTS,EAAKiN,IAAIuiB,SACR,OAEDviB,EAAIvU,SAAS,iBACfsH,EAAKiN,IAAIkqD,cAEXn3D,EAAKo0D,kBAAkBn8D,OAAO+H,EAAKm0D,eACnCn0D,EAAKk0D,UAAUnS,QAAQ/hD,EAAKo0D,mBAE5Bp0D,EAAKo3D,2BAELp3D,EAAKq3D,qBAEDr3D,EAAKi3B,KAAK/pB,OAAOlN,EAAKq2D,mBAG1Br2D,EAAKiN,IAAItU,SAAS,mBAElBb,EAAE,WAAckI,EAAKi2D,+BAGvBgB,WAAY,SAAU7+D,GACpB,GAAI4H,GAAO/G,IACXb,GAAG6D,iBACH7D,EAAGC,kBACE2H,EAAKiN,IAAIjP,KAAK,aAAgBgC,EAAKiN,IAAIjP,KAAK,cAC/CgC,EAAKg0D,UAAUz6D,OACfyG,EAAKqvB,MAAMqkC,QAAQllB,WAAW,WAC9BxuC,EAAKq1D,YAAc,EACnBr1D,EAAKs3D,mBACLt3D,EAAK01D,gBAAkB,WACvB11D,EAAKu3D,QAAQ,WACXv3D,EAAKi0D,QAAQn2D,UAAU,OAK7B05D,WAAY,WACV,GAAIx3D,GAAO/G,IACX,OAAQ+G,GAAKiN,IAAIjP,KAAK,aAGxBq5D,mBAAoB,SAAUI,EAAMC,GAUlC,IAAK,GATD13D,GAAO/G,KAEP0+D,EAAW33D,EAAKi3B,KAAK/pB,MACrB0qD,EAAU53D,EAAKiN,IAAIC,MAEnBklD,EAAMqF,IAASE,EAAWA,EAASzvD,MAAM,SACzC2vD,EAAQH,IAAWE,EAAUA,EAAQ1vD,MAAM,SAE3CrL,EAAO,GACF2D,EAAI,EAAGA,EAAIq3D,EAAM9wD,OAAQvG,IAAK,CACrC,GAAI0M,KACJA,GAAIlN,EAAKg1D,aAAel9D,EAAE2V,KAAK2kD,EAAI5xD,IACnC0M,EAAIlN,EAAKi1D,aAAen9D,EAAE2V,KAAKoqD,EAAMr3D,IACR,IAAzB0M,EAAIlN,EAAKg1D,eACXn4D,GAAQmD,EAAK83D,2BAA2B5qD,IAY5C,GARAlN,EAAK+3D,uBAAuB,KAAMjgE,EAAE+E,IAGpC0C,WAAW,WACTS,EAAKi2D,0BAAyB,IAC7B,MAGEj2D,EAAKg4D,uBAAwB,CAChC,GAAIC,EACJngE,GAAEyF,QAAQ6d,KAAK,mBAAoB,WAC7B68C,GAAW/4D,aAAa+4D,GAC5BA,EAAY14D,WAAW,WACrBS,EAAKi2D,4BACJ,OAELj2D,EAAKg4D,wBAAyB,IAKlCE,SAAU,SAAU56D,GAClB,GAAI0C,GAAO/G,KACP2B,EAAIoF,EAAKq1D,WACT/3D,KAAS,EACX1C,EAAI,EACK0C,IAAS,EAClB1C,GAAK,EACa,GAAT0C,EACT1C,GAAK,EACa,GAAT0C,IACT1C,EAAIoF,EAAKs1D,UAGP16D,EAAI,IAAGA,EAAI,GACXA,EAAIoF,EAAKs1D,WAAU16D,EAAIoF,EAAKs1D,UAE5Bt1D,EAAKq1D,aAAez6D,IACtBoF,EAAKq1D,YAAcz6D,EACnBoF,EAAKu3D,YAKTD,iBAAkB,WAChB,GAAIt3D,GAAO/G,IACXiG,cAAac,EAAK83B,OAClB93B,EAAKiN,IAAIuiB,SAGXwmC,eAAgB,SAAUmC,GACxB,GAAIn4D,GAAO/G,IACXsG,YAAW,WACT,GAAIkX,GAAI3e,EAAE2V,KAAKzN,EAAKiN,IAAIC,MACxB,IAAIuJ,IAAMzW,EAAKg3D,KAAM,CAEdmB,IACHn4D,EAAKg3D,KAAOvgD,EAEd,IAAI2hD,GAAQ3hD,CACZ2hD,GAAQA,EAAMjxD,QAAQ,KAAM,GAC5B,IAAIwD,GAAMytD,EAAMrxD,MACZ4D,IAAO3K,EAAK60D,UACV70D,EAAKu0D,SAASr1D,aAAac,EAAKu0D,SACpCv0D,EAAKu0D,QAAUh1D,WAAW,WAGpBS,EAAKg3D,KAAKjwD,OAAS,IACrB/G,EAAK01D,gBAAkB,OACvB11D,EAAKu3D,QAAQ,WACXv3D,EAAKi0D,QAAQn2D,UAAU,IACtBq6D,KAEJn4D,EAAK6rD,SAEC,IAALp1C,GAAYzW,EAAKk1D,aACnBl1D,EAAKq4D,aAAY,GAEnBr4D,EAAK42D,mBAGR,IAIL0B,cAAe,SAAU7tD,GACvB,GAAIzK,GAAO/G,KACPs/D,EAAczgE,EAAEskB,MAAMpc,EAAK6iB,MAAM0e,WAAYvhC,EAAK06C,OAAOnZ,YACzDpgC,EAAWo3D,EAAY3kC,OAAO,YAClC,IAAS,GAALnpB,EACF,MAAOtJ,EAEP,IAAIq3D,GAAeD,EAAYhG,MAAMpxD,EAAS5I,YAAY,YAAY6K,IAAI,IAAMqH,CAOhF,OANI+tD,KAAgB,IAClBA,EAAeD,EAAYxxD,OAAS,GAElCyxD,GAAgBD,EAAYxxD,SAC9ByxD,EAAe,GAEV1gE,EAAEygE,EAAYn1D,IAAIo1D,IAAe7/D,SAAS,aAKrDo+D,QAAS,SAAU15D,GACjB,GAAI2C,GAAO3C,EAAEzE,IAEb,KAAIoH,EAAKiN,IAAIjP,KAAK,cAAegC,EAAKiN,IAAIjP,KAAK,YAA/C,CAaA,GAXM,WAAWsmC,KAAKjnC,EAAEo+C,UAAcz7C,EAAKg0D,UAAUh2B,GAAG,aACtDh+B,EAAKiN,IAAIrU,KAAK,WAAY,SAIxByE,EAAEo7D,QAAuB,IAAbp7D,EAAEo+C,SAA2C,IAA1B3jD,EAAE2V,KAAKzN,EAAKiN,IAAIC,SAAiBlN,EAAKg0D,UAAUh2B,GAAG,aACpFh+B,EAAKi3D,WAAW55D,GAKd2C,EAAKk1D,aAAe,2BAA2B5wB,KAAKjnC,EAAEo+C,UAAsC,IAA1B3jD,EAAE2V,KAAKzN,EAAKiN,IAAIC,OAGpF,OAFA7P,EAAEpB,iBACFoB,EAAEhF,kBACMgF,EAAEo+C,SACR,IAAK,IAEEz7C,EAAK04D,oBAGR14D,EAAK22D,iBAFL32D,EAAK24D,cAAc34D,EAAKiN,IAAI2tB,OAI9B,MACF,KAAK,IACH56B,EAAK44D,WAAU,EACf,MACF,KAAK,IACH54D,EAAK64D,YAAW,EAChB,MACF,KAAK,IAEE74D,EAAKg0D,UAAUh2B,GAAG,aACrBh+B,EAAK44D,WAEP,MACF,KAAK,IACE54D,EAAKg0D,UAAUh2B,GAAG,aACrBh+B,EAAK64D,aA4Bb,GArBI74D,EAAK00D,cAAgB,GAAK,YAAYpwB,KAAKjnC,EAAEo+C,UAAYz7C,EAAKg0D,UAAUh2B,GAAG,cAC7E3gC,EAAEpB,iBACFoB,EAAEhF,kBAEe,IAAbgF,EAAEo+C,SAA8B,IAAbp+C,EAAEo+C,SACvBz7C,EAAK84D,gBAAgB94D,EAAKs4D,cAAc,KAKxC,MAAMh0B,KAAKjnC,EAAEo+C,UAA8B,IAAlBz7C,EAAKiN,IAAIC,QACpC7P,EAAEpB,iBACFoB,EAAEhF,kBAEG2H,EAAK04D,oBAGR14D,EAAK22D,iBAFL32D,EAAK24D,cAAc34D,EAAKiN,IAAI4tB,SAM3B,iBAAiByJ,KAAKjnC,EAAEo+C,WAAaz7C,EAAKg0D,UAAUh2B,GAAG,aAAeh+B,EAAKy1D,mBAAuB,WAAWnxB,KAAKjnC,EAAEo+C,UAAYz7C,EAAKg0D,UAAUh2B,GAAG,aAAeh+B,EAAKoD,MAGzK,OAFA/F,EAAEpB,iBACFoB,EAAEhF,kBACMgF,EAAEo+C,SACR,IAAK,IACCz7C,EAAKqvB,MAAM2O,GAAG,YAChBh+B,EAAK66B,OAGL76B,EAAKs4D,eAAc,EAErB,MACF,KAAK,IACCt4D,EAAKqvB,MAAM2O,GAAG,YAChBh+B,EAAK46B,OAGL56B,EAAKs4D,cAAc,EAErB,MACF,KAAK,GACL,IAAK,IACH,GAAIt4D,EAAKqvB,MAAM2O,GAAG,YAAa,CAE7B,GAAI+6B,GAAe/4D,EAAKoD,KACJ,OAAhB21D,EACFA,EAAa78D,QAEb8D,EAAKyvB,aAIPzvB,GAAK84D,gBAAgB94D,EAAKs4D,cAAc,GAE1C,MACF,KAAK,IACHt4D,EAAK42D,oBAIT,IAAkB,IAAdv5D,EAAEo+C,SAAiBz7C,EAAKm1D,UAAW,CAGrC,GAAIgD,IAAmB,CACnBn4D,GAAKw1D,uBAGPx1D,EAAKg5D,yBAEa,KAAd37D,EAAEo+C,SACJp+C,EAAEpB,iBACFoB,EAAEhF,kBACF8/D,GAAmB,GAEnBA,GAAmB,GAIvBn4D,EAAKg2D,eAAemC,MAM1BO,kBAAmB,WACjB,GAAI14D,GAAO/G,IAQX,OAL8B,QAA1B+G,EAAKi5D,mBACPj5D,EAAKi5D,iBAAmBnhE,EAAEkiC,OAIvBliC,EAAEkiC,MAAQh6B,EAAKi5D,iBAAoB,OAKpCj5D,EAAKk5D,gBAAgBh6D,aAAac,EAAKk5D,gBAC3Cl5D,EAAKk5D,eAAiB35D,WAAW,WAC/BS,EAAKi5D,iBAAmB,MACvB,MAGI,IAETA,iBAAkB,KAClBC,eAAgB,KAIhB91D,IAAK,WACH,GAAIpD,GAAO/G,IACX,OAAO+G,GAAKqvB,MAAMlyB,KAAK,gBAIzB09B,KAAM,WACJ5hC,KAAKkgE,MAAK,IAIZv+B,KAAM,WACJ3hC,KAAKkgE,KAAK,IAGZA,KAAM,SAAU77D,GACd,GAGI87D,GAHAp5D,EAAO/G,KACP+uB,EAAUhoB,EAAKoD,MACfw3B,EAAQt9B,EAAQ,EAAI0qB,EAAQ4S,OAAS5S,EAAQ6S,MAE7C7S,GAAQjhB,OAAS,EACf6zB,EAAK7zB,OAAS,IAChBihB,EAAQtb,SAASvP,KAAK,eAAe5E,YAAY,cACjD6gE,EAASx+B,EAAKjiC,SAAS,eAGzBygE,EAASp5D,EAAKqvB,MAAMlyB,KAAK,YAAYxE,SAAS,cAEhDqH,EAAKq5D,aAAaD,IAGpBC,aAAc,SAAUD,GACtB,GAAIp5D,GAAO/G,IACX,IAAImgE,GAAUA,EAAOryD,OAAS,EAAG,CAC/B,GAAIuyD,GAAUF,EAAOh7D,WAAW1C,GAC3B49D,GAAUF,EAAOn8D,SAAY+C,EAAKi0D,QAAQh3D,UAC7C+C,EAAKi0D,QAAQn2D,UAAUkC,EAAKi0D,QAAQn2D,YAAcw7D,EAAUF,EAAOn8D,UAEjEq8D,EAAU,GACZt5D,EAAKi0D,QAAQn2D,UAAUkC,EAAKi0D,QAAQn2D,YAAcw7D,EAAUF,EAAOn8D,SAAW+C,EAAKi0D,QAAQh3D,YAMjGs8D,UAAW,WACT,GAAIv5D,GAAO/G,KACPwd,IAoBJ,OAnB2B,QAAvBzW,EAAKm0D,eACPn0D,EAAKm0D,cAAc5yB,SAAS,QAAQvoC,KAAK,WACvC,GACI24C,GADA7xC,EAAOhI,EAAEmB,MAETuD,EAAK,GAAKsD,EAAKlH,KAAK,MACpB4gE,EAAUh9D,EAAG0L,MAAM,IACD,IAAlBsxD,EAAQzyD,QACV4qC,EAAU6nB,EAAQ,GAClBh9D,EAAKg9D,EAAQ,IAEb7nB,EAAU3xC,EAAKktC,kBAEjBz2B,EAAEjK,MACAitD,UAAW9nB,EACXn1C,GAAIA,EACJ0G,KAAM,GAAKpD,EAAKlH,KAAK,YAIpB6d,GAIT6b,SAAU,SAAU+P,EAAUw0B,GAC5B,GAAI72D,GAAO/G,KACPygE,EAAa15D,EAAKi3B,KAAK/pB,KAG3B,KACOlN,EAAKk1D,aACRl1D,EAAK22D,gBAAe,GAEtB,MAAOt5D,GACPke,QAAQC,IAAIne,GAGE,MAAZglC,GAEFriC,EAAK+3D,uBAAuB11B,GAGxBw0B,IACA72D,EAAKm1D,UACPn1D,EAAK25D,mBAAmBD,EAAYr3B,GAEpCriC,EAAKiN,IAAIo0C,QAAQ,uBAAwBhf,KAI7CriC,EAAKiN,IAAIrU,KAAK,WAAY,IAAkB,MAAZypC,KAIlCy0B,UAAW,SAAUN,EAAWK,GAC9B,GAAI72D,GAAO/G,IACX,IAAI+G,EAAKk1D,YAAa,CACpB,GAAIwE,GAAa15D,EAAKi3B,KAAK/pB,KAE3BlN,GAAK22D,gBAAe,EAGpB,KAAK,GADD95D,GAAO,GACF2D,EAAI,EAAGA,EAAIg2D,EAAUzvD,OAAQvG,IAAK,CACzC,GAAI0M,KACJA,GAAIlN,EAAKg1D,aAAel9D,EAAE2V,KAAK+oD,EAAUh2D,GAAGi5D,UAAY,IAAMjD,EAAUh2D,GAAGhE,IAC3E0Q,EAAIlN,EAAKi1D,aAAen9D,EAAE2V,KAAK+oD,EAAUh2D,GAAG0C,MACf,IAAzBgK,EAAIlN,EAAKg1D,eAEXn4D,GAAQmD,EAAK83D,2BAA2B5qD,IAG5ClN,EAAK+3D,uBAAuB,KAAMjgE,EAAE+E,IAC9Bg6D,GACJ72D,EAAK25D,mBAAmBD,EAAYlD,GAGtCx2D,EAAKiN,IAAIrU,KAAK,WAAY,IAAc,IAARiE,MAIpC88D,mBAAoB,SAAUD,EAAYxsD,GACxC,GAAIlN,GAAO/G,IACP+G,GAAKi3B,KAAK/pB,OAASwsD,IACjB15D,EAAKk1D,YAEPl1D,EAAKiN,IAAIo0C,QAAQ,eAAgBn0C,EAAKlN,EAAKu5D,cAE3Cv5D,EAAKiN,IAAIo0C,QAAQ,UAAWn0C,MAMlCuiB,OAAQ,SAAUmqC,EAAOj/D,GACvB,GAAIqF,GAAO/G,KACP8/D,EAAep+D,EAAKA,EAAMi/D,EAAQ55D,EAAKqvB,MAAMlyB,KAAK,MAAQ6C,EAAKqvB,MAAMlyB,KAAK,cAC9E,IAAoB,MAAhB47D,EAAsB,CACxB,GAAIngE,GAAOmgE,EAAangE,KAAK,YAAc,IAC3C,IAAa,OAATA,EAAe,CACjB,GAAIsU,IAAOtU,EAAK4D,GAAI5D,EAAKy7B,aAAcz7B,EAAKiqB,MAAOjqB,EAAKw7B,uBACxDp0B,GAAKiN,IAAIC,IAAIA,EAAIlN,EAAKi1D,cACtB/nD,EAAI,IAAMlN,EAAKo1D,gBAAkBp1D,EAAK00D,cAAgB,GAAK10D,EAAKk1D,YAAel1D,EAAK20D,gBAAkB,IAAO,IAAMznD,EAAI,GAEvHlN,EAAKsyB,SAASplB,GAAK,GAGS,OAAxB1O,GAAGC,IAAI4M,QAAQnI,MAA4D,IAA3ClD,EAAKiN,IAAIpS,QAAQ,eAAekM,QAElExH,WAAW,WACTS,EAAKiN,IAAI08C,OACT3pD,EAAKiN,IAAIuiB,SACR,KAELxvB,EAAK42D,mBAMXQ,yBAA0B,WACxB,GAAIp3D,GAAO/G,IAKX,IAFsC,GAAlCnB,EAAE,sBAAsBiP,QAAejP,EAAE,sBAAsB6E,IAAI,WAAY,YAEpC,GAA3CqD,EAAKm0D,cAAch3D,KAAK,SAAS4J,OAAa,CAEhD,GAAI8yD,GAAc75D,EAAKiN,IAAIrU,KAAK,eAAiBoH,EAAKiN,IAAIrU,KAAK,eAAiBoH,EAAKiN,IAAIjP,KAAK,cAC9FgC,GAAKq0D,QAAUv8D,EAAE,2CACdsjB,KAAK,kBAAmB,WACvBpb,EAAKiN,IAAIuiB,UAEV72B,SAASqH,EAAKiN,IAAIjP,KAAK,UACvBA,KAAK,cAAe67D,GAEnB/hE,EAAEwB,MACJ0G,EAAKk0D,UAAU94C,KAAK,mBAAoB,SAAU/d,GAChD2C,EAAKiN,IAAIuiB,QACJhxB,GAAGC,IAAIC,cACVrB,EAAEhF,kBACFgF,EAAEpB,oBAKR+D,EAAKk0D,UAAUj8D,OAAO+H,EAAKq0D,SAC3Br0D,EAAKk0D,UAAUl2D,KAAK,kBAAmB,aAEvCgC,EAAKq0D,QAAQt6D,GAAG,cAAe,SAAUsD,GAGvC,MAFAA,GAAEpB,iBACFoB,EAAEhF,mBACK,IAQT2H,EAAKm0D,cAAcl8D,OAAO+H,EAAKiN,KAE/BjN,EAAKiN,IACFtU,SAAS,kBACTyiB,KAAK,kBAAmB,WACvBpb,EAAKi2D,6BAEN76C,KAAK,kBAAmB,SAAU/d,GAEjCA,EAAEhF,sBAMVy/D,2BAA4B,SAAU5qD,GAEpC,GAAIlN,GAAO/G,IAEX,IAA6B,IAAzBiU,EAAIlN,EAAKi1D,aAAoB,MAAO,EAGxC,IAAI7hC,GAAU,GACV52B,EAAK0Q,EAAIlN,EAAKg1D,aACdwE,GAAW,GAAKh9D,GAAI0L,MAAM,IAER,IAAlBsxD,EAAQzyD,QACVqsB,EAAUomC,EAAQ,GAClBh9D,EAAKg9D,EAAQ,IAEbpmC,EAAUpzB,EAAKktC,iBAGjB,IAAI4sB,GAAU,IACC,KAAX1mC,GAAmD,mBAA3BpzB,GAAKy0D,SAASrhC,KACxC0mC,EAAU95D,EAAKy0D,SAASrhC,GAG1B,IAAI2mC,GAAW/5D,EAAKg6D,YAAY5mC,EAAS52B,EAAI0Q,EAAIlN,EAAKi1D,cAClDgF,EAASniE,EAAEwB,OAAS0G,EAAKw3D,aAAe,sIAAyIx3D,EAAKk1D,YAAc,IAAM,GAC1MgF,EAAW,eAAiBhtD,EAAIlN,EAAKi1D,aAAa79C,aAAe,KAGjE+iD,EAAY,EAMhB,OAL6B,KAAzBjtD,EAAIlN,EAAKi1D,eACXgF,EAAS,GACTE,EAAY,oBAGP,gBAAkBJ,EAAgB,MAAII,EAAY,cAAgBjtD,EAAIlN,EAAKg1D,aAAe,KAAOkF,EAAWH,EAAe,KAAI,QACnI,GAAK7sD,EAAIlN,EAAKi1D,cAAc79C,aAAe,OAAS6iD,EAAS,WAIlElC,uBAAwB,SAAU7qD,EAAK1S,GACrC,GACI4/D,GADAp6D,EAAO/G,IAGX,IAAqB,mBAAVuB,IAAkC,MAATA,EAAe,CACjD,GAAIqC,GAAOmD,EAAK83D,2BAA2B5qD,EAC3C,IAAY,IAARrQ,EAAY,MAChBu9D,GAAWtiE,EAAE+E,OAEbu9D,GAAW5/D,CAGTwF,GAAKw3D,aACP4C,EAASzhE,SAAS,iBAElByhE,EAASh/C,KAAK,kBAAmB,SAAU/d,GACzC,GAAI2C,EAAKk1D,YAAa,CAEpB73D,EAAEhF,iBACF,IAAIuL,GAAQ9L,EAAEmB,MACVohE,EAAUz2D,EAAMxK,SAASiD,KAAQuH,EAAM02D,YAAW,GAAQ,CAE1Dj9D,GAAEk9D,QAAUF,EACdz2D,EAAM8lC,OAAO1pC,EAAKiN,KAElBrJ,EAAMu5C,MAAMn9C,EAAKiN,KAEnBjN,EAAKi2D,2BAEP12D,WAAW,WACTS,EAAKiN,IAAIuiB,SACR,OAEL4qC,EAASj9D,KAAK,KAAKnB,IAAI,6BAA8B,WAAcgE,EAAK24D,cAAc7gE,EAAEmB,MAAMyT,aAGhG1M,EAAKiN,IAAIy8B,OAAO0wB,GAGhBtiE,EAAEkB,KAAKohE,EAAU,WACXtiE,EAAEmB,MAAMP,SAAS,SACnB61C,0BAA0Bz2C,EAAEmB,SAKhC+G,EAAKiN,IAAIC,IAAI,IACblN,EAAKg3D,KAAO,GAGZh3D,EAAKw6D,oBAGLx6D,EAAKi2D,4BAIP0C,cAAe,SAAU74D,EAAM26D,EAAiBC,GAC9C,GAAI16D,GAAO/G,IACX,IAAI6G,EAAKiH,OAAS,EAAG,CACnB,GAAI4zD,GAAa,WACf7iE,EAAEgI,GAAM6pC,QACR,IAAIixB,GAAS56D,EAAKi3B,KAAK/pB,KAEvBlN,GAAKw6D,oBAELx6D,EAAK25D,mBAAmBiB,EAAQ,MAEhC56D,EAAKi2D,2BAE6C,GAA9Cj2D,EAAKm0D,cAAc5yB,SAAS,QAAQx6B,QACtC/G,EAAKq4D,YAAYoC,KAAoB,GAGrCC,MAAkB,EACpB56D,EAAK+6D,SAAU3gE,MAAO,GAAK,IAAK,SAAUygE,GAE1CA,MAMNhE,eAAgB,SAAU8D,GACxB,GAAIz6D,GAAO/G,IACX,IAA2B,OAAvB+G,EAAKm0D,cAAwB,CAC/B,GAAI2G,GAAY96D,EAAKm0D,cAAc5yB,SAAS,OACxCu5B,GAAU/zD,OAAS,GACrB/G,EAAKq4D,YAAYoC,KAAoB,GAEvCK,EAAUnxB,SAEZ3pC,EAAKw6D,oBACLx6D,EAAKi2D,4BAIPA,yBAA0B,SAAU8E,GAClC,GAAI/6D,GAAO/G,IAEX,IAAuB,OAAnB+G,EAAKk0D,UAAoB,CAE3B,GAAIl0D,EAAKk0D,UAAUl2B,GAAG,WAAY,CAChC,GAAIg9B,GAAW,WACTh7D,EAAKk0D,UAAUl2B,GAAG,cACpBh+B,EAAKi2D,2BACLn+D,EAAE,QAAQ2jB,OAAO,sBAAuBu/C,IAI5C,YADAljE,GAAE,QAAQsjB,KAAK,sBAAuB4/C,GAIxC,GAAIC,GAAcj7D,EAAKk0D,UAAUh6D,QAAU,EAC3C8F,GAAKo0D,kBAAkBz3D,KAAMzC,MAAS+gE,IAKxC,GAAIC,GAAW,EACXpjE,GAAEwB,OACJ4hE,EAAW,IAEbl7D,EAAKiN,IAAItQ,KAAMzC,MAAUghE,EAAWl7D,EAAKm7D,cAAcn7D,EAAKiN,MAG5D,IAAImuD,GAAoB,EACpBC,EAAc,EACdC,GAAQ,CACe,QAAvBt7D,EAAKm0D,eACPn0D,EAAKm0D,cAAc5yB,WAAWvoC,KAAK,WACjC,GAAI2L,GAAI7M,EAAEmB,MAAMqhE,YAAW,EAC3Be,IAAe12D,EAEV22D,IACHF,GAAqBz2D,EACrB22D,EAAQxjE,EAAEmB,MAAMP,SAAS,oBAK/B,IAAI6iE,GAAQN,EAAcG,GAEtBG,EAAQ,GAAKA,EAAQ,GAAOR,IAAiB/6D,EAAKiN,IAAI+wB,GAAG,aAAWu9B,EAAQ,OACrD,OAAvBv7D,EAAKm0D,gBACPn0D,EAAKm0D,cAAcx3D,KAAMN,KAAMk/D,IAC/Bv7D,EAAKo0D,kBAAkBpvD,WAAW,IAEpChF,EAAKw7D,wBAIPL,cAAe,SAAUM,GACvB,GAAIh8D,GAAO3H,EAAE,QACT4jE,EAAaj8D,EAAKtC,KAAK,oBAC3B,IAAyB,GAArBu+D,EAAW30D,OAAa,CAC1B20D,EAAa5jE,EAAE,SAASa,SAAS,cAAcgE,KAC7CyB,SAAU,WACV/B,MAAM,IACNX,KAAK,IACLigE,QAAS,SAEXl8D,EAAKxH,OAAOyjE,EAEZ,IAAIE,IAAU,YAAa,aAAc,cAAe,cAAe,cAAe,iBAAkB,iBACxG9jE,GAAEkB,KAAK4iE,EAAQ,WACb,GAAIx0D,GAAInO,KAAKkf,UACbujD,GAAW/+D,IAAIyK,EAAGq0D,EAAM9+D,IAAIyK,MAGhC,GAAI1G,GAAO+6D,EAAMvuD,MAAM/F,QAAQ,KAAM,UAAUA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,OACnF,OAAOu0D,GAAW7+D,KAAK6D,GAAM45D,cAI/BE,kBAAmB,WACjB,GAAIx6D,GAAO/G,KACPm5D,EAAM,EACiB,QAAvBpyD,EAAKm0D,eACPn0D,EAAKm0D,cAAc5yB,SAAS,QAAQvoC,KAAK,WACvCo5D,GAAOt6D,EAAEmB,MAAML,KAAK,MAAQ,MAIrB,IAAPw5D,IACFA,EAAMA,EAAIh9C,OAAO,EAAGg9C,EAAIrrD,OAAS,GACjC/G,EAAKq2D,oBAGPr2D,EAAKi3B,KAAK/pB,IAAIklD,IAIhBsE,oBAAqB,SAAUH,EAAOC,EAAWC,GAC/C,GAAIA,GAAWA,IAAY,EACvBz2D,EAAO/G,KAEP4iE,EAAW77D,EAAKm0D,cAAch3D,KAAK,iBAAmBo5D,EAAQ,KAKlE,IAJIE,IACFoF,EAAWA,EAASC,QAGlBD,EAAS90D,OAAS,EAAG,CACvB80D,EAAS1e,MAAMn9C,EAAKiN,KACpBjN,EAAK24D,cAAckD,GAAU,GAAM,EAEnC,IAAIh/D,GAAO,EACX/E,GAAEkB,KAAKw9D,EAAW,WAChB35D,GAAQmD,EAAK83D,2BAA2B7+D,QAI1C+G,EAAK+3D,uBAAuB,KAAMjgE,EAAE+E,IAEpC0C,WAAW,WACTS,EAAKiN,IAAIuiB,SACR,OAKPopC,UAAW,SAAUmD,GACnB,GACIj8D,GADAE,EAAO/G,IAGT6G,GADEi8D,EACK/7D,EAAKm0D,cAAc5yB,SAAS,cAE5BvhC,EAAKiN,IAAI4tB,OAElB/6B,EAAK4pC,OAAO1pC,EAAKiN,KAEjB1N,WAAW,WACTS,EAAKiN,IAAIuiB,SACR,KAEHxvB,EAAKi2D,4BAIP4C,WAAY,SAAUmD,GACpB,GACIl8D,GADAE,EAAO/G,IAGT6G,GADEk8D,EACKh8D,EAAKm0D,cAAc5yB,SAAS,aAE5BvhC,EAAKiN,IAAI2tB,OAElB96B,EAAKq9C,MAAMn9C,EAAKiN,KAEhB1N,WAAW,WACTS,EAAKiN,IAAIuiB,SACR,KAEHxvB,EAAKi2D,4BAIPoC,YAAa,SAAU4D,GACrB,GAAIj8D,GAAO/G,IACX,IAAI+G,EAAK80D,WAAamH,EAAa,CACjCj8D,EAAKiN,IAAIC,IAAI,GAIb,IAAIpN,GAAOE,EAAKm0D,cAAch3D,KAAK,OAChB,IAAf2C,EAAKiH,OAEP/G,EAAKiN,IAAIrU,KAAK,YAAY,GAGtBoH,EAAKk1D,YAEPl1D,EAAKiN,IAAIo0C,QAAQ,eAAgB,OAGjCrhD,EAAKiN,IAAIo0C,QAAQ,UAAW,SAOpC6a,cAAe,WACb,GAAIl8D,GAAO/G,IAMX,IALAnB,EAAEkB,KAAKlB,EAAE,iBAAkB,WACrBA,EAAEmB,MAAM+E,KAAK,OAASgC,EAAKs0D,QAAQx8D,EAAEmB,MAAMM,SAIX,GAAlCzB,EAAE,sBAAsBiP,QAAe/G,EAAK6lD,IAAIhrD,QAAQ,cAAckM,OAAS,EAAG,CACpF/G,EAAKw7D,uBACLx7D,EAAKg0D,UAAU94D,MACf,IAAIihE,GAAYn8D,EAAKqvB,MAAMlyB,KAAK,WAC5Bg/D,GAAUvjE,KAAK,YAAyD,GAA3CoH,EAAKqvB,MAAMlyB,KAAK,iBAAiB4J,QAAao1D,EAAUxjE,SAAS,cAC9Fb,EAAE4qD,eACC1iD,EAAKg0D,UAAUp7D,KAAK,WAGvBoH,EAAKg0D,UAAUp7D,KAAK,WAAWuvD,UAF/BnoD,EAAKg0D,UAAUp7D,KAAK,UAAW,GAAIiG,SAAQmB,EAAKg0D,UAAU72D,KAAK,eAAe,MAOpF6C,EAAKo8D,kBAGPA,eAAgB,WACd,GAAIp8D,GAAO/G,IACX+G,GAAKi0D,QAAQn6D,IAAI,oBAAoBC,GAAG,mBAAoB,WAC1D,GAEI0tD,GAFAlrD,EAAWzE,EAAEmB,MACbo2B,EAAQ9yB,EAASY,KAAK,cAErB6C,GAAKy1D,mBAENhO,EADE3vD,EAAE4qD,aACarzB,EAAMpyB,SAAWV,EAASU,SAAWV,EAASnD,SAASsC,IAAM2zB,EAAMj2B,SAASsC,IAE5E2zB,EAAMpyB,UAAYV,EAASuB,YAAcvB,EAASU,UAEjEwqD,EAAiB,KAAKznD,EAAKk4D,SAAS,OAM9CtB,cAAe,WACb,GAAI52D,GAAO/G,IACsB,UAA7B+G,EAAKiN,IAAIrU,KAAK,aAChBoH,EAAKq4D,aAAY,GAEnBr4D,EAAKg5D,0BAIPA,uBAAwB,WACtB,GAAIh5D,GAAO/G,IACX+G,GAAK20D,gBAAkB,KACvB30D,EAAK40D,qBAAsB,EAC3B50D,EAAKi0D,QAAQn6D,IAAI,oBACjBkG,EAAKqvB,MAAMqkC,QAAQllB,WAAW,WAC9BxuC,EAAKq1D,YAAc,EACnBr1D,EAAKg3D,KAAO,GACZl/D,EAAE,iBAAiByB,QAGrB8iE,cAAe,WACb,GAAIr8D,GAAO/G,KACPwd,EAAIzW,EAAKiN,IAAIC,KACjB,IAAIlN,EAAKk1D,YAAa,CACpB,GAAIoH,GAAK7lD,EAAEvO,MAAM,IACjBuO,GAAI6lD,EAAGA,EAAGv1D,OAAS,GAErB,MAAOjP,GAAE2V,KAAKgJ,IAGhB8lD,YAAa,WACX,GAAIv8D,GAAO/G,IACiB,OAAxB+G,EAAKw0D,iBAAyBt1D,aAAac,EAAKw0D,iBACpDx0D,EAAKw0D,gBAAkBj1D,WAAW,WAChC,GAAI0oB,GAAUjoB,EAAK6lD,IAAI1oD,KAAK,6BACxBkE,EAAOrB,EAAK6lD,IAAI1oD,KAAK,yBACF,KAAnB8qB,EAAQlhB,OACV/G,EAAK6lD,IAAI5tD,OAAO,+DAEhBgwB,EAAQ/sB,OAEVmG,EAAK9H,QACJ,KAEHyG,EAAKy1D,kBAAmB,EACxBz1D,EAAKiN,IAAItU,SAAS,qBAGpB6jE,YAAa,WACX,GAAIx8D,GAAO/G,IAEX,IAD4B,MAAxB+G,EAAKw0D,iBAAyBt1D,aAAac,EAAKw0D,iBACnC,OAAbx0D,EAAK6lD,IAAc,CACrB,GAAI59B,GAAUjoB,EAAK6lD,IAAI1oD,KAAK,6BACxBkE,EAAOrB,EAAK6lD,IAAI1oD,KAAK,yBAErB8qB,KACFA,EAAQ1uB,OACR8H,EAAKnG,QAGT8E,EAAKy1D,kBAAmB,EACxBz1D,EAAKiN,IAAI1U,YAAY,qBAIvB20C,gBAAiB,WACf,GAAIltC,GAAO/G,IAEX,KAAK,GAAI04C,KAAW3xC,GAAKy0D,SAEvB,IAAKz0D,EAAKy0D,SAAS9iB,GAAS8qB,kBAC1B,MAAO9qB,EAGX,OAAO,IAST+qB,cAAe,SAAUC,GAKvB,MAJA1jE,MAAK2jE,8BAA8BD,GACnC1jE,KAAKw7D,SAAWkI,EAChB1jE,KAAKy7D,cAAgBz7D,KAAK4jE,sBAC1B5jE,KAAK6jE,sBACE7jE,MAST8jE,cAAe,SAAUJ,GACvB1jE,KAAK2jE,8BAA8BD,EACtB7kE,GAAE4C,OAAOzB,KAAKw7D,SAAUkI,EAGrC,OAFA1jE,MAAKy7D,cAAgBz7D,KAAK4jE,sBAC1B5jE,KAAK6jE,sBACE7jE,MAOT2jE,8BAA+B,SAAUD,GAClCA,GAAYn+D,GAAGqL,MAAM,mDAAoD,cACpD,gBAAf8yD,IACTn+D,GAAGqL,MAAM,oDAQbizD,oBAAqB,WACnB7jE,KAAK4sD,IAAIttD,YAAY,yBACrBU,KAAK4sD,IAAI7nD,KAAK,QAAS/E,KAAK+jE,gBAO9BA,YAAa,WACX,GAAIC,GAAM,sBACNhkE,MAAKy7D,cAAgB,IAAGuI,EAAM,wBAClC,IAAIC,KACJ,KAAK,GAAIp9D,KAAQ7G,MAAKw7D,SACpByI,EAAK1wD,KAAKvT,KAAKw7D,SAAS30D,GAAMitD,QAEhC,OAAOntD,GAAEq9D,EAAK,IAAMC,EAAKhyD,KAAK,MAAQ,MAOxC2xD,oBAAqB,WACnB,GAAI1oC,GAAQ,CACZ,KAAK,GAAIje,KAAKjd,MAAKw7D,SACbx7D,KAAKw7D,SAASv7C,eAAehD,MAC7Bie,CAGN,OAAOA,IAITgpC,gBAEA5F,QAAS,SAAU6F,EAAmBjF,GAOpC,QAASkF,KACP,GAAIjqC,EACJ,IAAmC,GAA/BpzB,EAAKs9D,gBAAgBv2D,OACvBqsB,EAAUpzB,EAAKktC,sBAGf,KAAK,GAAIyE,KAAW3xC,GAAKy0D,SACvB,GAAI38D,EAAEw6D,QAAQ3gB,EAAS3xC,EAAKs9D,mBAAoB,EAAI,CAClDlqC,EAAUue,CACV,OAIN3xC,EAAK20D,gBAAkBvhC,EAGvBpzB,EAAKu9D,UAAYC,EACjBx9D,EAAKu3D,QAAQ6F,GACbp9D,EAAKw8D,cAGP,QAASiB,KAEPz9D,EAAKw8D,cAGP,QAASkB,KACP19D,EAAKs9D,mBACLt9D,EAAK29D,uBACL,IAAIC,KACJ,KAAK,GAAIjsB,KAAW3xC,GAAKy0D,SAAU,CACjC,GAAIoJ,GAAgB,SAAWlsB,GAC7B,MAAO,UAAU2jB,EAAU18D,GAErBA,EAAKmO,OAAS,GAChB/G,EAAKs9D,gBAAgB9wD,KAAKmlC,KAG7BA,GACCmsB,EAAc,SAAWnsB,GAC3B,MAAO,UAAUznC,EAAK6zD,GAEhB7zD,IAAQlK,EAAK21D,cAEf31D,EAAK29D,qBAAqBhsB,GAAWznC,EAAIhC,MAAM,KAAK,MAGvDypC,EAEHisB,GAASpxD,KAAKxM,EAAKk0B,UAAUyd,EAAS6rB,EAAO,EAAGx9D,EAAKrB,IAAKk/D,EAAeC,IAE3E99D,EAAKm9D,aAAerlE,EAAEskB,MAAMpc,EAAKm9D,aAAcS,GAE/CI,SAAWlmE,EAAEiwB,KAAK/O,MAAM/f,KAAM2kE,GAC9BI,SAASxzD,KAAK6yD,GAA2Br8C,KAAKy8C,GA5DhD,GAAIz9D,GAAO/G,IAGX,KAAMk/D,EAAN,CA6DA,KAAOn4D,EAAKm9D,aAAap2D,OAAS,GAChC/G,EAAKm9D,aAAac,MAAMC,OAI1B,IAAIl+D,EAAKk1D,aAAuC,YAAxBl1D,EAAK01D,iBAAmD,IAAlB11D,EAAKiN,IAAIC,MAGrE,MAFAlN,GAAK42D,oBACL52D,GAAKw8D,aAIPx8D,GAAKu8D,aAEL,IAAIiB,GAAiC,YAAxBx9D,EAAK01D,gBAAgC,GAAK11D,EAAKq8D,eAU5D,IAPImB,GAASx9D,EAAKu9D,WAAav9D,EAAK20D,iBAAmB30D,EAAKm+D,sBAC1Dn+D,EAAKq1D,YAAc,EACnBr1D,EAAKi0D,QAAQn2D,UAAU,KAKpB0/D,GAASx9D,EAAKu9D,WAA8C,mBAAzBv9D,GAAK20D,iBAA2D,MAAxB30D,EAAK20D,kBAA6B30D,EAAK00D,cAAgB,EAAG,CACxI,GAAI10D,EAAK00D,cAAgB,EAiCvB,MAhCA10D,GAAKs9D,mBACLt9D,EAAK29D,6BAEC39D,EAAKu1D,kBACTv1D,EAAKk0B,UAAUl0B,EAAKu1D,kBAAmBiI,EAAO,EAAGx9D,EAAKrB,IAAK,SAAU22D,EAAU18D,GAE7E,GAAIA,EAAKmO,OAAS,EAAG,CACnB,IAAK,GAAI4qC,KAAW3xC,GAAKy0D,SACvBz0D,EAAKs9D,gBAAgB9wD,KAAKmlC,EAE5B0rB,SACK,CACL,IAAK,GAAI1rB,KAAW3xC,GAAKy0D,SACnB9iB,IAAY3xC,EAAKu1D,mBACnBv1D,EAAKs9D,gBAAgB9wD,KAAKmlC,EAG9B+rB,OAED,SAAUxzD,EAAK6zD,GAEZ7zD,IAAQlK,EAAK21D,cAEf31D,EAAK29D,qBAAqB39D,EAAKu1D,mBAAqBrrD,EAAIhC,MAAM,KAAK,MAEpE8Y,KAAKy8C,GAIRC,IAKF19D,GAAK20D,gBAAkB30D,EAAKktC,kBAI5BzqC,KAAKC,oBAEPlE,GAAGmE,GAAGC,WAAWC,OACfC,KAAMtE,GAAGuE,cACTC,OAAQ,YACRG,KAAM,qBACN/D,OAAQY,EAAKiN,IAAI7J,IAAI,KAIzBpD,EAAKm9D,aAAa3wD,KAAKxM,EAAKk0B,UAAUl0B,EAAK20D,gBAAiB6I,EAAOx9D,EAAKq1D,YAAar1D,EAAKrB,IAAK,SAAU22D,EAAU18D,GAEjHoH,EAAKs1D,SAAWA,EACQ,GAApBt1D,EAAKq1D,aAAkBr1D,EAAKqvB,MAAMqkC,QAAQllB,WAAW,WAGzDxuC,EAAKo+D,wBACLC,QAAUr+D,EAAKs+D,WAAWt+D,EAAK20D,gBAAiB/7D,EAAMwkE,GAEjDiB,SAAoC,QAAxBr+D,EAAK01D,iBAAqD,YAAxB11D,EAAK01D,gBAItD11D,EAAK42D,iBAHL52D,EAAKk8D,gBACDkB,GAAmBA,KAKzBp9D,EAAKw8D,eACJ,SAAUtyD,EAAK6zD,GAIhB/9D,EAAKo+D,wBAEM,SAAPl0D,GACFlK,EAAK+nC,UAAUg2B,EAASn+D,EAAE,yBAA2BsK,GAEvDlK,EAAKw8D,iBAGPx8D,EAAKu9D,UAAYC,EACjBx9D,EAAKm+D,oBAAsBn+D,EAAK20D,kBAGlCzgC,UAAW,SAAUga,EAASqwB,EAAOC,EAAMC,EAAOC,EAAWC,GAC3D,GAAI3+D,GAAO/G,IAEX,KAAK+G,EAAKy0D,SAASvmB,GAAU,CAC3B,GAAIzjC,GAAI3S,EAAE0nB,UAEV,OADA/U,GAAE0W,SACK1W,EAGT,GAAImpB,GAAS,EAQb,IANEA,EADE5zB,EAAKy0D,SAASvmB,IAAiD,OAArCluC,EAAKy0D,SAASvmB,GAAiB,OAClDluC,EAAKy0D,SAASvmB,GAAiB,OAE/BluC,EAAKiN,IAAIrU,KAAK,UAIrBoH,EAAKy0D,SAASvmB,GAChB,GAAIpa,GAA2B9zB,EAAKy0D,SAASvmB,GAAmC,wBAGlF,IAAI5a,GAAetzB,EAAKszB,YAEpBtzB,GAAKuzB,0CAA4CvzB,EAAKuzB,yCAAyC2a,KACjG5a,EAAeE,KAAKC,MAAMH,GAC1BA,EAAaI,gBAAkB1zB,EAAKuzB,yCAAyC2a,GAASxsB,OACtF4R,EAAeE,KAAKG,UAAUL,GAGhC,IAAI7V,GAAMzd,EAAKyd,IAAM,YAAcswB,UAAUG,GACzCrnC,EAAS/O,EAAE4C,QACb8a,EAAG+oD,GAAS,GACZK,MAAOH,EACP37D,KAAM07D,EACN5qC,OAAQA,EACR0O,KAAMtiC,EAAKiN,IAAIrU,KAAK,QACpBi7B,cAAe7zB,EAAK6zB,cAAgB,IAAM,IAC1CC,yBAA0BA,EAA2B,IAAM,IAC3DR,aAAcA,GACbtzB,EAAK6xB,gBAER,OAAO7xB,GAAKmtC,aAAajZ,UAAUzW,EAAK5W,EAAQ63D,EAAWC,IAI7DP,sBAAuB,WACrB,GAAIp+D,GAAO/G,IACyB,oBAAxB+G,GAAKs9D,iBAAiE,GAA/Bt9D,EAAKs9D,gBAAgBv2D,SAAiB/G,EAAK40D,oBAC5F50D,EAAKqvB,MAAMn0B,OAEX8E,EAAKqvB,MAAM91B,OAGbyG,EAAKqvB,MAAMz2B,KAAK,UAAWoH,EAAK20D,kBAGlC5sB,UAAW,SAAU79B,EAAKkzD,GACxB,GAAIp9D,GAAO/G,IACX+G,GAAK6+D,mBAAmBzB,GAGpBlzD,EAAI7F,QAAQ,OAAQ,IAEpB6F,EADElK,EAAKk1D,YACDhrD,EAAIhC,MAAM,KAAK,GAEfgC,EAAI/C,QAAQ,IAAK,OAKG,IAA1BnH,EAAKiN,IAAI7T,SAASsC,MAGtBsE,EAAKqvB,MAAMxyB,KAAK,6CAA+CqN,EAAM,cACrElK,EAAKk8D,gBACDkB,GAAmBA,IACvBp9D,EAAKw8D,gBAIPqC,mBAAoB,SAAUzB,GAC5B,GAAIp9D,GAAO/G,IAEX,IAAI+G,EAAK00D,cAAgB,EAAG,CAC1B,GAAIoK,MACAC,KACA/2C,EAAU82C,CAGd,KAAK,GAAIntB,KAAW3xC,GAAKy0D,SACvBzsC,EAAQxb,KAAKmlC,GACTA,GAAW3xC,EAAK20D,kBAClB3sC,EAAU+2C,EAId,IAAIC,GAAW,SAAUC,EAAOjL,GAC9B,GAAoB,GAAhBiL,EAAMl4D,OACRitD,EAAUN,YACL,CAEL,IAAK,GADD72D,GAAO,GACF2D,EAAI,EAAGA,EAAIy+D,EAAMl4D,OAAQvG,IAChC,GAAoC,mBAAxBR,GAAKs9D,iBAAkCxlE,EAAEw6D,QAAQ2M,EAAMz+D,GAAIR,EAAKs9D,mBAAoB,GACvD,mBAA7Bt9D,GAAK29D,sBAAqF,mBAAvC39D,GAAK29D,qBAAqBsB,EAAMz+D,IAAqB,CAElH,GAAIlG,GAAW,EACX2kE,GAAMz+D,IAAMR,EAAK20D,kBAAiBr6D,EAAW,YAC7C0F,EAAK40D,sBAAqBt6D,GAAY,WAE1CuC,GAAQ,6BAA+BvC,EAAW,mBAAqB2kE,EAAMz+D,GAAK,KAClF3D,GACE,6GAKFA,GAAQmD,EAAKy0D,SAASwK,EAAMz+D,IAAIusD,QAEQ,mBAA7B/sD,GAAK29D,sBAAqF,mBAAvC39D,GAAK29D,qBAAqBsB,EAAMz+D,MAC5F3D,GAAQ,KAAO/E,EAAE2V,KAAKzN,EAAK29D,qBAAqBsB,EAAMz+D,IAAI2a,eAAiB,KAG7Ete,GAAQ,SAGZm3D,EAAUn3D,KAAKA,GAAMM,KAAK,OACvBie,KAAK,kBAAmB,WAAcpb,EAAK84D,gBAAgB7/D,KAAMmkE,KACjEl5D,MACC,WAAcpM,EAAEmB,MAAMN,SAAS,UAC/B,WAAcb,EAAEmB,MAAMyT,SAAS60B,SAAS,kBAAkBhpC,YAAY,YAM9EymE,GAASF,EAAgB9+D,EAAK6iB,OAC1Bi8C,EAAe/3D,OAAS,EAC1B/G,EAAK6iB,MAAM3nB,OAEX8E,EAAK6iB,MAAMtpB,OAIbylE,EAASD,EAAe/+D,EAAK06C,QACzBqkB,EAAch4D,OAAS,EACzB/G,EAAK06C,OAAOx/C,OAEZ8E,EAAK06C,OAAOnhD,WAGdyG,GAAK6iB,MAAMtpB,OACXyG,EAAK06C,OAAOnhD,QAKhBu/D,gBAAiB,SAAUrmB,EAAY2qB,GACrC,GAAIp9D,GAAO/G,KACP2K,EAAQ9L,EAAE26C,EACV7uC,GAAMlL,SAAS,YACjBsH,EAAK40D,qBAAuBhxD,EAAMlL,SAAS,UAE3CsH,EAAK40D,qBAAsB,EAIzB50D,EAAK40D,oBACPhxD,EAAMjL,SAAS,UAEfiL,EAAMrL,YAAY,UAGpByH,EAAKiN,IAAIuiB,QACTxvB,EAAK20D,gBAAkB/wD,EAAMhL,KAAK,WAClCoH,EAAKu3D,QAAQ6F,IAIfpD,YAAa,SAAUroB,EAASn1C,EAAIkE,GAClC,GAAIV,GAAO/G,KAEPimE,EAAal/D,EAAKy0D,SAAS9iB,IAAY3xC,EAAKy0D,SAAS9iB,GAASwtB,aAAe,QAAU,EAE3F,IAAIn/D,EAAKy0D,SAAS9iB,IAAY3xC,EAAKy0D,SAAS9iB,GAASwtB,aAAc,CACjE,GAAI3iE,EAAG6H,QAAQ,OAAQ,EAAI,CACzB,GAAIm1D,GAAUh9D,EAAG0L,MAAM,IACvBypC,GAAU6nB,EAAQ,GAClBh9D,EAAKg9D,EAAQ,GAEfO,SAAW,gCAAoCpoB,EAAU,cAAoBn1C,EAAK,aAElFu9D,UAAW,YAAe,GAAKr5D,GAAWyG,QAAQ,KAAM,UAAa,IAEvE,QACEnJ,KAAQ+7D,SACRqF,MAASF,IAKbZ,WAAY,SAAUlrC,EAAS/B,EAAM+rC,GACnC,GAEIiB,GAFAr+D,EAAO/G,KAGPomE,EAAa,EAEjBr/D,GAAK6+D,mBAAmBzB,EAExB,IAAIkC,KAEJ,IAAIjuC,EAAKtqB,OAAS,EAAG,CACnBsqB,EAAK5kB,QAAQ,SAAUujB,EAAKxvB,GAC1B,GAAI++D,MAAM77D,SAASssB,EAAIxzB,GAAI,MAAQwzB,EAAIxzB,IAAM,EAAG,CAC9C,GAAIgjE,GAAS,GAAK7jE,KAAKqP,QACvBs0D,GAAUE,GAAUxvC,CACpB,IAAI+pC,GAAW/5D,EAAKg6D,YAAY5mC,EAASpD,EAAIxzB,GAAIwzB,EAAInN,MACrDw8C,IAAc,0DAA4DtF,EAAgB,OAAKv5D,EAAI,GAAK,EAAI,aAAe,aAAe,kBAAoBg/D,EAAS,KAAOzF,EAAe,KAAI,IACjMsF,GAAc,qBAAuBr/D,EAAKy/D,UAAUzvC,EAAIqE,aAAcr0B,EAAKq8D,iBAAmB,YAE9FgD,IAAc,2BAA6B7+D,EAAI,GAAK,EAAI,aAAe,aAAe,KACtF6+D,GAAc,gCAAkCrvC,EAAIqE,aAAe,cAEhD,GAAfhD,EAAKtqB,SACP/G,EAAKs1D,SAAWt1D,EAAKq1D,YAGzBgK,IAAc,UAIhBr/D,EAAKqvB,MAAMlyB,KAAK,YAAYuP,SAASi9B,QAErC,IAAI+1B,GAAU5nE,EAAEunE,EAEhBvnE,GAAEkB,KAAK0mE,EAAS,SAAUnN,EAAO/gC,GAC/B,GAAIguC,GAAS1nE,EAAE05B,GAAQ54B,KAAK,SAC5Bd,GAAE05B,GAAQ54B,KAAK,UAAW0mE,EAAUE,KAGtC,IAAIxb,GAAMhkD,EAAKqvB,MAAMp3B,OAAOynE,GAASviE,KAAK,uBAC1C6mD,GAAIvoC,OAAO,wBAAwBL,KAAK,uBAAwB,WAActjB,EAAEmB,MAAM0mE,SAAS,eAAepnE,YAAY,cAAeT,EAAEmB,MAAMN,SAAS,gBACtJ8iB,OAAO,wBAAwBL,KAAK,uBAAwB,WAActjB,EAAEmB,MAAMyT,SAASvP,KAAK,eAAe5E,YAAY,gBAC3HkjB,OAAO,mBAAmBL,KAAK,kBAAmB,WAAcpb,EAAKyvB,QAAO,EAAO33B,EAAEmB,SACzFolE,GAAU,EACNr+D,EAAKy0D,SAASrhC,GAAS+rC,cACzBnb,EAAIhrD,KAAK,WACPu1C,0BAA0Bz2C,EAAEmB,SAIhC+G,EAAKiN,IAAIo0C,QAAQ,iBAAkBjuB,EAAS4wB,QAGpB,IAApBhkD,EAAKq1D,aACPgJ,GAAWr+D,EAAK+0D,gBAChB/0D,EAAKq4D,aAAY,GACbr4D,EAAK+0D,iBACP/0D,EAAKqvB,MAAMxyB,KAAK,6CAA+CmD,EAAK21D,YAAc,eAIpF31D,EAAKs1D,SAAWt1D,EAAKq1D,WAIzB,OAAOgJ,IAGT7C,qBAAsB,WACpB,GAAIx7D,GAAO/G,KACPud,EAAIxW,EAAKk0D,SACb,IAAU,OAAN19C,EAAY,CACd,GAAI9a,GAAM8a,EAAEpd,SAASsC,IAAM8a,EAAEvZ,SAAW,EACpCA,EAAS+C,EAAKg0D,UAAU4L,cACxBC,EAAK/nE,EAAEyF,QAAQN,QACdvB,GAAMuB,EAAU4iE,IACnBnkE,EAAM8a,EAAEpd,SAASsC,IAAMuB,EAAS,EAC5BvB,EAAM,IAAGA,EAAM,GAGrB,IAAIxB,GAAQsc,EAAE8jD,YAAW,GAAQ,CACjCt6D,GAAKg0D,UAAUr3D,KACbN,KAAOma,EAAEpd,SAAa,KACtBsC,IAAKA,EACLxB,MAAOA,EACP4lE,SAAUnkE,KAAKgD,IAAIzE,EAAO,SAMhCulE,UAAW,SAAUznD,EAAO+nD,GAC1B,MAAY,IAARA,EAAmB/nD,EAChBA,EAAM7Q,QAAQ,GAAIgQ,QAAO,0BAA4B4oD,EAAK54D,QAAQ,qCAAsC,QAAU,0BAA2B,MAAO,wBAI7JkvD,iBAAkB,WAChB,GAAIr2D,GAAO/G,IACXnB,GAAE,WACIkI,EAAKq0D,SACPr0D,EAAKq0D,QAAQr2D,KAAK,cAAe,OAKvCs4D,iBAAkB,WAChB,GAAIt2D,GAAO/G,IACXnB,GAAE,WACA,GAAIkI,EAAKq0D,QAAS,CAChB,GAAIoH,GAAQz7D,EAAKq0D,QAAQ3nD,SAASg9B,SAASvsC,KAAK,UAC5C08D,EAAc4B,EAAM7iE,KAAK,eAAiB6iE,EAAM7iE,KAAK,eAAiB6iE,EAAMz9D,KAAK,cACrFgC,GAAKq0D,QAAQr2D,KAAK,cAAe67D,QAMzC/hE,EAAE4B,GAAGgB,QACHslE,gBAAiB,SAAUvlE,EAASorD,GAGlC,MAFA5sD,MAAKL,KAAK,0BAA2B,GAAIg5B,GAAG34B,KAAMwB,EAASorD,IAC3D5sD,KAAKooD,QAAQ,QACNpoD,MAETgnE,YAAa,SAAUxpD,GACrBxd,KAAKooD,QAAQ,eAAgB5qC,KAE/ByF,OAAQ,SAAUsnC,GAChB,MAAOvqD,MAAKmiB,KAAK,SAAUooC,IAE7B0c,YAAa,SAAU1c,GACrB,MAAOvqD,MAAKmiB,KAAK,cAAeooC,IAElC2c,oBAAqB,SAAU5J,EAAOC,GACpCv9D,KAAKooD,QAAQ,uBAAwBkV,EAAOC,GAAW,KAEzD4J,wBAAyB,SAAU7J,EAAOC,GACxCv9D,KAAKooD,QAAQ,uBAAwBkV,EAAOC,GAAW,KAEzD1oB,MAAO,WACL70C,KAAKooD,QAAQ,UAEf+U,cAAe,WACbn9D,KAAKooD,QAAQ,kBAEfhU,SAAU,SAAUngC,EAAK2pD,GAEvB,MADA59D,MAAKooD,QAAQ,YAAan0C,EAAK2pD,IACxB/+D,EAAEmB,OAEXonE,UAAW,SAAU/wC,EAAQunC,GAE3B,MADA59D,MAAKooD,QAAQ,aAAc/xB,EAAQunC,IAC5B/+D,EAAEmB,OAEXk+D,YAAa,WAEX,MADAl+D,MAAKooD,QAAQ,gBAAgB,IACtBvpD,EAAEmB,OAEXqnE,WAAY,WAEV,MADArnE,MAAKooD,QAAQ,gBAAgB,IACtBvpD,EAAEmB,UAGZoM;CC7yDH,SAAWvN,EAAG8sB,GA+BZ,GAAIqP,IASFC,UAAW,SAAUzW,EAAK5W,EAAQ63D,EAAWC,GAC3C,GAAI3iD,GAAK/iB,IAET,OAAOnB,GAAEqhC,MACPt4B,KAAM,OACNw4B,SAAU,OACV5b,IAAKA,EACLkI,OAAO,EACP/sB,KAAMiO,EACNyyB,QAAS,SAAUj5B,GACjB,IAAKy0B,kBAAkBz0B,GAAM,CAC3B,GAAIzH,GAAOojB,EAAGukD,eAAelgE,EACzBzH,GAAK0gC,QACHolC,GAAWA,EAAU9lE,EAAK4nE,WAAY5nE,EAAK6nE,UAE3C9B,GAASA,EAAQ/lE,EAAKqoB,cAAc,KAI9CuI,MAAO,SAAUk3C,EAAOC,EAAYC,GAC9BjC,GAASA,EAAQgC,GAAY,OAUvCJ,eAAgB,SAAUrgD,GACxB,GAAI2gD,GAAS3gD,EAAS7b,QAAQ,MAC1By8D,EAAS5gD,EAAS9K,OAAO,EAAGyrD,GAC5BjoE,EAAOsnB,EAAS9K,OAAOyrD,EAAS,EAEpC,IAAsB,SAAlB/oE,EAAE2V,KAAKqzD,GAAoB,CAC7B,GAAIzvC,GAAOz4B,EAAKsP,MAAM,QAClBu4D,EAAWpvC,EAAK9b,IAAI,SAAUya,GAEhC,GADAA,EAAMl4B,EAAE2V,KAAKuiB,GACJ,CACP,GAAI+wC,GAAc/wC,EAAI9nB,MAAM,IAC5B,QACE1L,GAAIukE,EAAY,GAChB1sC,aAAc0sC,EAAY,GAC1Bl+C,MAAOk+C,EAAY,GACnB3sC,uBAAwB2sC,EAAY,IAGtC,MAAO,QAERntC,OAAO,SAAUotC,GAAU,QAASA,GAEvC,QACE1nC,SAAS,EACTknC,WAAY98D,SAASo9D,EAAQ,IAC7BL,SAAUA,GAGZ,OACEnnC,SAAS,EACTrY,aAAcroB,IAOtBgsB,GAAOqP,4BAA8BA,GAEpC5uB,OAAQ9H;CC5GX,SAAWzF,GACT,QAASmpE,GAAah0D,EAAK44C,EAAK5uB,EAAMiqC,EAAWC,EAAKtH,GACpD5gE,KAAKO,KAAKyT,EAAK44C,EAAK5uB,EAAMiqC,EAAWC,EAAKtH,GAE5CoH,EAAajmE,WACXiS,IAAK,KACL44C,IAAK,KACL5uB,KAAM,KACNg9B,QAAS,KACTmN,UAAW,KACXC,UAAW,KAEXC,UAAU,EAEVC,cAAe,KAEfL,aAQA1nE,KAAM,SAAUyT,EAAK44C,EAAK5uB,EAAMiqC,EAAWC,EAAKtH,GAE9C,GAAI79C,GAAK/iB,IACT+iB,GAAG/O,IAAMA,EACT+O,EAAG6pC,IAAMA,EACT7pC,EAAGib,KAAOA,EACVjb,EAAGolD,UAAYnqC,EAAK/pB,MACpB8O,EAAGqlD,UAAYrlD,EAAGolD,UAClBplD,EAAGklD,UAAYA,EACfllD,EAAGwlD,kBAAuB3H,EAAeA,EAAcj6D,EAAE,sBAEzD9H,EAAE4C,OAAOshB,EAAImlD,GAGRnlD,EAAG/O,IAAIrU,KAAK,kBAEVojB,EAAG/O,IAAIvU,SAAS,aASnBsjB,EAAGylD,iBACHzlD,EAAG/O,IAAIlT,GAAG,sBAAuB,WAC/BiiB,EAAGib,KAAK/pB,IAAI,UAVd8O,EAAG/O,IAAImO,KAAK,qBAAsB,SAAUhjB,GAC1CA,EAAGC,kBACC2jB,EAAGslD,SAAUtlD,EAAGziB,OACfyiB,EAAG9gB,SAGV8gB,EAAG/O,IAAIq4B,KAAK,YAAY,IAS1BtpB,EAAG/O,IAAImO,KAAK,uBAAwBY,EAAIA,EAAG0lD,UAGvC1lD,EAAG6pC,KAAK7pC,EAAG6pC,IAAIzqC,KAAK,qBAAsB,SAAUhjB,GACtDA,EAAGC,kBACC2jB,EAAGslD,SAAUtlD,EAAGziB,OACfyiB,EAAG9gB,SAIVqE,WAAW,WAAczH,EAAE,QAAQsjB,KAAK,qBAAsB,SAAUhjB,GAAM4jB,EAAGziB,UAAe,KAChGgG,WAAW,WAAc,IAAMzH,EAAE,UAAUsgD,WAAWj7C,KAAK,QAAQie,KAAK,qBAAsB,SAAUhjB,GAAM4jB,EAAGziB,SAAc,MAAO8D,MAAU,KAChJkC,WAAW,WAAc,IAAMzH,EAAE,UAAUsgD,WAAWj7C,KAAK,YAAYie,KAAK,qBAAsB,SAAUhjB,GAAM4jB,EAAGziB,SAAc,MAAO8D,MAAU,KACpJkC,WAAW,WAAczH,EAAE,6BAA6BsjB,KAAK,qBAAsB,SAAUhjB,GAAM4jB,EAAGziB,UAAe,KAGrHyiB,EAAG/O,IAAIrU,KAAK,gBAAgB,KAIhC6oE,eAAgB,WACd,GAAIzlD,GAAK/iB,IACT+iB,GAAG/O,IAAIuiB,MAAM,WACP13B,EAAEmB,MAAMiU,OAAS8O,EAAGwlD,oBACtB1pE,EAAEmB,MAAMV,YAAY,sBACpBT,EAAEmB,MAAMiU,IAAI,OAIhB8O,EAAG/O,IAAI08C,KAAK,WACW,IAAjB7xD,EAAEmB,MAAMiU,OACVpV,EAAEmB,MAAMN,SAAS,sBACjBb,EAAEmB,MAAMiU,IAAI8O,EAAGwlD,oBAEf1pE,EAAEmB,MAAMV,YAAY,yBAM1BmpE,SAAU,SAAUrkE,GAElB,GAAI2e,GAAK3e,EAAEzE,KACP+oE,EAA0B,MAAd3lD,EAAGi4C,SAAmBj4C,EAAGi4C,QAAQj2B,GAAG,WAEpD,KAAIhiB,EAAG/O,IAAIvU,SAAS,cAAesjB,EAAG/O,IAAIjP,KAAK,YAE/C,GAAI2jE,GACF,GAAI,cAAcr9B,KAAKjnC,EAAEo+C,UAAY,SAASnX,KAAKjnC,EAAEo+C,SAInD,OAFAp+C,EAAEpB,iBACFoB,EAAEhF,kBACMgF,EAAEo+C,SACR,IAAK,IAEHz/B,EAAG4lD,KAAKD,GAAY,EAAK,EACzB,MACF,KAAK,IAEH3lD,EAAG4lD,KAAKD,EAAY,EAAI,EACxB,MACF,KAAK,GACL,IAAK,IACH3lD,EAAG6lD,gBACH/pE,EAAE,iBAAiByB,MACnB,MACF,KAAK,IACHyiB,EAAGziB,YAKL,UAAU+qC,KAAKjnC,EAAEo+C,UAAYp+C,EAAEo7D,QACjCz8C,EAAG9gB,QAMT0mE,KAAM,SAAUE,GACd,GAAI9lD,GAAK/iB,IACT,IAAK+iB,EAAGi4C,QAAR,CACA,GACI8N,GADAC,EAAQhmD,EAAGi4C,QAAQ92D,KAAK,cAIR,IAAhB6kE,EAAMj7D,QAA4B,GAAb+6D,GACvBE,EAAQhmD,EAAGi4C,QAAQ92D,KAAK,YACxB6e,EAAGimD,eAAeD,IAGdF,IAAa,GACfC,EAAQC,EAAMnnC,OACM,GAAhBknC,EAAMh7D,SACRg7D,EAAQC,EAAMt1D,SAASvP,KAAK,YAE9B6e,EAAGimD,eAAeF,IAGD,GAAbD,IACFC,EAAQC,EAAMpnC,OACM,GAAhBmnC,EAAMh7D,SACRg7D,EAAQC,EAAMt1D,SAASvP,KAAK,aAE9B6e,EAAGimD,eAAeF,MAM1BE,eAAgB,SAAUtnE,GACxBA,EAAG+R,SAASvP,KAAK,eAAe5E,YAAY,cAC5CoC,EAAGhC,SAAS,eAIduC,KAAM,WACJ,GAAI8gB,GAAK/iB,IAGT,KAAI+iB,EAAG/O,IAAIvU,SAAS,gBAApB,CAGA,GAAIwpE,GAAY,KACZC,EAAMnmD,EAAG/O,IAAIrU,KAAK,SAMtB,IALkB,mBAAPupE,KACTD,EAAYC,EAAIj6D,MAAM,KACtB8T,EAAGi4C,QAAU,OAGVj4C,EAAGi4C,QAAS,CAGf,IAAK,GAFDp3D,GAAO,8IACPulE,GAAW,EACN5hE,EAAI,EAAGyV,EAAI,EAAGO,EAAIwF,EAAGklD,UAAUn6D,OAAQvG,EAAIgW,EAAGhW,IAC3B,MAAtBwb,EAAGklD,UAAU1gE,GAAG,KACD,MAAb0hE,GAAmC,MAAbA,GAAqBpqE,EAAEw6D,QAAQt2C,EAAGklD,UAAU1gE,GAAG,GAAI0hE,KAAc,KACzFrlE,GAAQ,0CAA4Cmf,EAAGklD,UAAU1gE,GAAG,GAAK,YAAc,KAAOyV,EAAI,GAAK,EAAI,cAAgB,cAAgB,eAAiB+F,EAAGklD,UAAU1gE,GAAG,GAAK,iBAAmB4W,WAAW4E,EAAGklD,UAAU1gE,GAAG,IAAM,uBAAyBwb,EAAGklD,UAAU1gE,GAAG,GAAK,aACnR4hE,GAAW,EACXnsD,IAKDmsD,KACHvlE,GAAQ,kDAAoD+C,EAAE,kBAAoB,cAGpF/C,GAAQ,+BACRmf,EAAGi4C,QAAUn8D,EAAE+E,GAAMmrD,SAAS,QAE1Boa,GAEFpmD,EAAGi4C,QAAQ92D,KAAK,qBACb+G,MAAM,WAAcpM,EAAEmB,MAAMN,SAAS,eAAkB,WAAcb,EAAEmB,MAAMyT,SAASvP,KAAK,eAAe5E,YAAY,gBACtHkjB,OAAO,sBAAsBL,KAAK,qBAAsB,WACvDY,EAAG6lD,cAAc5oE,QAMzB+iB,EAAGqmD,WAEErmD,EAAGi4C,QAAQj2B,GAAG,cAEjBlmC,EAAE,iBAAiByB,OACnByiB,EAAGi4C,QAAQ/4D,QAEb8gB,EAAGslD,UAAW,IAIhBO,cAAe,SAAUS,GACvB,GACI3nE,GADAqhB,EAAK/iB,IAGP0B,GADgB,MAAd2nE,GAA2C,mBAAdA,GAC1BtmD,EAAGi4C,QAAQ92D,KAAK,eAEhBrF,EAAEwqE,GAGQ,GAAb3nE,EAAGoM,QACLiV,EAAGsW,SAAS33B,EAAGqD,KAAK,cAIxBukE,aAAc,WACZ,MAAOtpE,MAAKq5B,SAASr5B,KAAKmoE,YAG5BoB,aAAc,WACZ,MAAOvpE,MAAKq5B,SAASr5B,KAAKooE,YAG5B/uC,SAAU,SAAUta,EAAOsc,EAAcmuC,GACvC,GAAIzmD,GAAK/iB,KACL49D,EAAqB4L,KAA0B,EAC/CC,GAAiB,CAErB,IAA4B,mBAAjBpuC,IACT,IAAK,GAAI9zB,GAAI,EAAGA,EAAIwb,EAAGklD,UAAUn6D,OAAQvG,IACvC,GAAIwb,EAAGklD,UAAU1gE,GAAG,KAAOwX,EAAO,CAChCgE,EAAGqlD,UAAYrlD,EAAGib,KAAK/pB,MAEvB8O,EAAG/O,IAAIC,IAAI8O,EAAGklD,UAAU1gE,GAAG,IAC3Bwb,EAAGib,KAAK/pB,IAAI8K,GAEZ0qD,GAAiB,CAEjB,YAIJ1mD,GAAGqlD,UAAYrlD,EAAGib,KAAK/pB,MACvB8O,EAAG/O,IAAIC,IAAIonB,GACXtY,EAAGib,KAAK/pB,IAAI8K,GACZ0qD,GAAiB,CAGnB,IAAI7L,GAAqB6L,EAAgB,CACvC1mD,EAAG/O,IAAIs/B,SACPvwB,EAAG/O,IAAI1U,YAAY,qBACnB,IAAIke,GAAIuF,EAAGib,KAAK/pB,KACZ8O,GAAGulD,eAAevlD,EAAGulD,cAAc9qD,GACvCuF,EAAG/O,IAAIo0C,QAAQ,UAAW5qC,IAG5B,MAAOxd,OAGTy5B,SAAU,WACR,MAAOz5B,MAAKg+B,KAAK/pB,OAGnBy1D,gBAAiB,WACf,GAAI3mD,GAAK/iB,IACT,OAAI+iB,GAAG/O,IAAIvU,SAAS,sBACX,GAEAsjB,EAAG/O,IAAIC,OAIlB01D,uBAAwB,WAItB,MAHA3pE,MAAKioE,aACCjoE,KAAKg7D,SAASh7D,KAAKg7D,QAAQtqB,SACjC1wC,KAAKg7D,QAAU,KACRh7D,MAIT4pE,oBAAqB,SAAU/iE,GAI7B,MAHA7G,MAAKioE,UAAU10D,KAAK1M,GACd7G,KAAKg7D,SAASh7D,KAAKg7D,QAAQtqB,SACjC1wC,KAAKg7D,QAAU,KACRh7D,MAGT6pE,uBAAwB,SAAUz7D,GAEhC,IAAK,GADD2U,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGklD,UAAUn6D,OAAQvG,IACvC,GAAIwb,EAAGklD,UAAU1gE,GAAG,KAAO6G,EAAK,CAC9B2U,EAAGklD,UAAU1gE,GAAG,GAAK,KACfvH,KAAKg7D,SAASh7D,KAAKg7D,QAAQtqB,SACjC1wC,KAAKg7D,QAAU,IACf,OAGJ,MAAOh7D,OAITM,KAAM,WAGJ,MAFIN,MAAKg7D,SAASh7D,KAAKg7D,QAAQ16D,OAC/BN,KAAKqoE,UAAW,EACTroE,MAGT8pE,QAAS,WAEP,MADA9pE,MAAKgU,IAAItU,SAAS,gBACXM,MAGT+pE,OAAQ,WAEN,MADA/pE,MAAKgU,IAAI1U,YAAY,gBACdU,MAGTopE,SAAU,WACR,GAAIrmD,GAAK/iB,KACLud,EAAIwF,EAAG/O,IAEPvR,EAAM8a,EAAEpd,SAASsC,IAAM8a,EAAEvZ,SAAW,EACpCA,EAAS+e,EAAGi4C,QAAQ2L,cACpBC,EAAK/nE,EAAEyF,QAAQN,QACdvB,GAAMuB,EAAU4iE,IACnBnkE,EAAM8a,EAAEpd,SAASsC,IAAMuB,EAAS,EAC5BvB,EAAM,IAAGA,EAAM,IAGrBsgB,EAAGi4C,QAAQt3D,KACTN,KAAOma,EAAEpd,SAASiD,KAAO,EACzBX,IAAKA,EACLxB,MAAOyB,KAAKgD,IAAI6X,EAAEtc,QAAU,GAAI,KAChC4lE,SAAU9jD,EAAG/O,IAAIqtD,YAAW,GAAQ,MAO1CxiE,EAAE4B,GAAGgB,QACHuoE,SAAU,SAAUpd,EAAK5uB,EAAMiqC,EAAWC,GAGxC,MAFAloE,MAAKL,KAAK,uBAAwB,GAAIqoE,GAAanpE,EAAEmB,MAAO4sD,EAAK5uB,EAAMiqC,EAAWC,IAClFloE,KAAKooD,QAAQ,QACNpoD,MAETiqE,kBAAmB,WAEjB,MADAjqE,MAAKL,KAAK,wBAAwBW,OAC3BN,SAGVoM;ACzXH,QAAS89D,eAAcpS,EAAUqS,EAAUC,EAAUC,EAAKC,GACxD,GAAIC,GAAe1rE,EAAE,WACjB2rE,EAAa,SAAUnnE,EAAOonE,GAChC,GAAIH,EAAgB,CACdG,GAAgB5rE,EAAE,qBAAuBi5D,GAAUx3D,MACvD,IAAIoqE,GAAS7rE,EAAE,MAAQi5D,GAAU2C,OACjCiQ,GAAOC,UACLnmD,IAAK,0BACLomD,WAAW,EACX1qC,MACEC,YAAa,kCACbC,SAAU,OACVyqC,OAAQ,cAAgBV,EAAW,kBAAoBC,EAAW,mBAClE39C,OAAO,EACPC,OAAO,EACP9kB,KAAM,OACNkjE,eAAgB,SAAUppE,EAAIyF,GAC5BtI,EAAE6C,GAAIwC,KAAK,SAASnE,KAAK,WACvBu1C,0BAA0Bz2C,EAAEmB,SAE9B+qE,sBAAsBR,GACtB1rE,EAAE,eAAeyB,OAC+B,GAA5CzB,EAAE,MAAMypC,SAAS,MAAMA,WAAWx6B,OACpCjP,EAAE,qBAAqBoD,OAEvBpD,EAAE,qBAAqByB,OAGzBzB,EAAE,aAAamF,OAAOnF,EAAE,iBAAiBmF,WAErCnF,EAAEwB,MAAQkF,GAAGC,IAAIC,cACnBulE,sBAAsBnsE,EAAE,6BAA8B6C,QAUhE,GAJA6oE,EAAaU,SAAS,mBAAoB,YAAaC,qBACvDX,EAAaU,SAAS,mBAAoB,WAAYE,oBACtDZ,EAAaU,SAAS,mBAAoB,YAAaG,qBACvDb,EAAaU,SAAS,mBAAoB,WAAYI,oBACjDxsE,EAAEwB,MAASkF,GAAGC,IAAIC,YAEhB,CACL,GAAI6lE,GAAoB,2HACxBzsE,GAAE,6BAA8B0rE,GAAcrmE,KAAK,UAAUusC,OAAO66B,GAAmB1pC,OAAOpf,OAAO,SAASL,KAAK,QAASopD,6BAH5HhB,GAAaiB,WAAW,0BAA2B,eAAeP,SAAS,oCAAqC,cAAeM,wBAKjIE,kCAEA,IAAIC,GAAc7sE,EAAE,gBAAkBi5D,EACtC4T,GAAYC,QAAQ,SAAUxsE,GAC5B,GAAkB,GAAdA,EAAGqjD,QAML,MAAOopB,gBAAezsE,EAAI,KAAO24D,EAAU,oBAAsBA,EAAUqS,EAAUC,EAAUpqE,KAAMqqE,EALrGqB,GAAYhb,MACZ,IAAIwS,GAAYrkE,EAAE,iCAAkC,oBAC5B,IAApBqkE,EAAUp1D,SAAao1D,EAAYrkE,EAAE,qBAAqBqF,KAAK,MAAMA,KAAK,mCAC9EgnE,qBAAsBW,cAAe3I,MAQ3CqH,GAAazpE,GAAG,eAAgB,WAC9B49B,gBAAkB,IAGpB6rC,EAAazpE,GAAG,kBAAmB0pE,GACnCA,EAAW,MAAM,GAGnB,QAASsB,uBAAsBC,GACzBA,EAASzjC,SAAS,MAAMA,WAAWx6B,OAAS,EAC9CjP,EAAE,qBAAqByB,OAGnBzB,EAAE,qBAAqBiP,OAAS,IAClCi+D,EAAShnE,KAAK,QAAS,IACvBlG,EAAE,qBAAqBoD,QAM7B,QAAS+pE,UAAS5kE,GAChB,GAAIxD,GAAO,EACX,IAAiB,MAAbwD,EAAIse,OACFte,EAAI6gB,OAAOna,OAAS,EAEtB,IAAK,GADDm+D,GAAQ7kE,EAAI6gB,OACP1gB,EAAI,EAAGA,EAAI0kE,EAAMn+D,OAAQvG,IAC5B0kE,EAAM1kE,GAAGhE,GAAK,IAChBK,GAAQsoE,kBAAkBD,EAAM1kE,IAQxC,OAAO3D,GAGT,QAASsoE,mBAAkBhzB,GACzB,GAAIt1C,GAAOs1C,EAAKzxC,IAChB,OAAO7D,GAGT,QAASmnE,uBAAsBoB,GAE7B,IAAK,GADDC,GAAcvtE,EAAE,2BAA2BoV,MAAMhF,MAAM,KAClD1H,EAAI,EAAGA,EAAI6kE,EAAYt+D,OAAQvG,IAAK,CAC3C,GAAIhE,GAAK6oE,EAAY7kE,GAAG0H,MAAM,KAAK,EACzB,KAAN1L,GAAU8oE,SAASF,EAAYjoE,KAAK,IAAMX,IAAK,IAIvD,QAASynE,uBAAsBzpE,GAC7B,GAAIA,EAAM2C,KAAK,mBAAmB4J,OAAS,EACzCvM,EAAM2C,KAAK,mBAAmBse,OAAO,SAASL,KAAK,QAASopD,6BACvD,CACL,GAAID,GAAoB,2HACxB/pE,GAAM2C,KAAK,UAAUusC,OAAO66B,GAAmB1pC,OAAOpf,OAAO,SAASL,KAAK,QAASopD,0BAIxF,QAASA,yBAAwBnnE,GAC/BA,EAAEpB,iBAAkBoB,EAAEhF,iBACtB,IAAIktE,GAAUztE,EAAEmB,KACXssE,GAAQvnE,KAAK,QAAOunE,EAAUA,EAAQ1qE,QAAQ,0BACnD,IAAIjB,GAAO4rE,gBAAgBD,EAASztE,EAAE,MACtC8B,GAAKuC,QAASE,KAAQgB,EAAEsmD,MAAOjoD,IAAO2B,EAAEumD,QAI1C,QAAS4hB,iBAAgB1lE,EAAM2lE,GAC7B,GACIC,GACAC,EACAC,EACAC,EAGAC,EAPAC,KAKAC,EAAgB,qBAChBC,EAASnmE,EAAK9B,KAAK,MAEnBkoE,EAAOD,CACM,MAAbA,EAAO,KAAaC,EAAOD,EAAO7wD,OAAO,IACzCqwD,EAAelkC,SAAS,MAAMA,SAAS,IAAM2kC,GAAMn/D,OAAS,GAAKjH,EAAKpH,SAAS,aACjFktE,EAAwBhmE,EAAE,yBAC1BimE,EAAwB,WACtBM,qBAAqBrmE,EAAMmmE,GAAQ,EAAOR,IAE5CO,EAAgB,4BAGhBJ,EAAwBhmE,EAAE,oBAC1BimE,EAAwB,WACtBM,qBAAqBrmE,EAAMmmE,GAAQ,EAAMR,KAGzCW,WAAWH,IAEbP,EAAkB9lE,EAAE,qBACpB+lE,EAAkB,WAChB7tE,EAAE,iBAAiBqF,KAAK,UAAY8oE,EAAS,KAAK9oE,KAAK,WAAWkkD,QAAQ,UAE5EykB,EAAa,sBAGbJ,EAAkB9lE,EAAE,qBACpB+lE,EAAkB,WAAc7jC,aAAahiC,GAAOwlE,SAASxlE,GAAM,IACnEgmE,EAAa,mBAGfC,EAAUv5D,MAAO9L,KAAMglE,EAAiBriE,QAASsiE,EAAiBtkE,KAAMykE,IACxEC,EAAUv5D,MAAO9L,KAAMklE,EAAuBviE,QAASwiE,EAAuBxkE,KAAM2kE,GAEpF,IAAIpsE,GAAO,GAAI/B,aAAYkuE,GAAa7rE,MAAO,SAC3C6F,GAAUvD,GAAIsD,EAAK9B,KAAK,MAAOq5B,KAAM,MAAOsa,QAASnzC,GAAGmE,GAAG0jE,mBAAoBltE,KAAM2G,EAAMsB,GAAItB,EAEnG,OADAlG,GAAKoG,KAAOD,EACLnG,EAMT,QAASusE,sBAAqBrmE,EAAMwmE,EAAQC,EAAWd,GACrD,GAAIS,GAAOI,EACPtmC,GAAU,CACG,MAAbsmC,EAAO,KAAaJ,EAAOI,EAAOlxD,OAAO,GAAI4qB,GAAU,GAC3DhV,YAAY,uCAAyCw7C,YAAaN,EAAM/lC,QAASH,EAASymC,UAAWF,GACnG,SAAUlmE,GACR,GAAIA,EAAIm2B,QAAS,CACf,GAAIkwC,GAAajB,EAAelkC,SAAS,KAKzC,IAJyB,GAArBmlC,EAAW3/D,SACb2/D,EAAa5uE,EAAE,aACf2tE,EAAextE,OAAOyuE,IAEpBH,GACF,GAA8C,GAA1CG,EAAWnlC,SAAS,IAAM2kC,GAAMn/D,OAAa,CAC/C,GAAIvE,EACA1C,GAAK4M,OAAO,qBAAqB3F,OAAS,EAC5C4/D,qBAAqBlB,EAAgBiB,IAGrClkE,EAAQ1C,EAAK4M,SAASA,SAASlK,QAC/BokE,uBAAuBpkE,GACvBA,EAAMwlD,SAAS0e,GACflkE,EAAMjK,YAAY,eAClBiK,EAAMrF,KAAK,gBAAgB5E,YAAY,eACH,GAAhCmuE,EAAWnlC,WAAWx6B,QAC0B,GAA9C0+D,EAAelkC,SAAS,YAAYx6B,QACtC0+D,EAAe1jB,QAAQ,+BAEzBjqD,EAAE,aAAa8rE,UAAWiD,IAAKpB,KAE/B3tE,EAAE,aAAa8rE,UAAWiD,IAAKrkE,KAGnCskE,yBAAyBR,EAAQC,QAInCG,GAAWnlC,SAAS,MAAQ2kC,GAAMv8B,SAClCm9B,yBAAyBR,EAAQC,EAEnCxB,uBAAsBU,MAK9B,QAASkB,sBAAqBlB,EAAgBiB,GAQ5C5uE,EAAE,WAAWc,KAAK,eAAe,GAInC,QAASguE,wBAAuB9mE,GAC9B,GAAIinE,GAAOjnE,EAAK3C,KAAK,oBAClBie,KAAK,YAAa+oD,qBAClB/oD,KAAK,WAAYgpD,oBACjBrqE,GAAG,QAAS,WACX,GAAIY,GAAK7C,EAAEmB,KACX6oC,cAAannC,GACb2qE,SAAS3qE,GAAI,KAEd4mC,SAAS,OACRzpC,GAAEwB,MAAQkF,GAAGC,IAAIC,YACnBulE,sBAAsBnkE,EAAK3C,KAAK,qBAEhC4pE,EAAK3rD,KAAK,cAAeopD,yBAI7B,QAASwC,2BAA0BrsE,GACjC7C,EAAE6C,GAAI+R,SAASizD,SAAS,MAAMp+B,WAAWpkC,KAAK,0BAA0BjB,QAG1E,QAASkqE,YAAWa,GAGlB,IAAK,GAFD5B,GAAcvtE,EAAE,2BAA2BoV,MAAMhF,MAAM,KACvDonD,GAAa,EACR9uD,EAAI,EAAGA,EAAI6kE,EAAYt+D,OAAQvG,IAAK,CAC3C,GAAIhE,GAAK6oE,EAAY7kE,GAAG0H,MAAM,KAAK,EAC/B1L,IAAMyqE,IAAQ3X,GAAa,GAEjC,MAAOA,GAKT,QAASwX,0BAAyBtqE,EAAI0qE,GACpC,GAAI1qE,EAAI,CACN,GAAIsD,GAAOhI,EAAE,aAAaypC,SAAS,YAAYpkC,KAAK,IAAMX,GAAIqqE,IAAI/uE,EAAE,qBAAqBqF,KAAK,IAAMX,IAChG6E,EAAOvB,EAAKyhC,SAAS,QAAQpkC,KAAK,UAClC6iC,EAAmB,KAATxjC,EAAG,GACb2qE,EAAYnnC,EAAU,wBAA0B,uBAChDsvB,EAAa8W,WAAW5pE,EAExB0qE,IACW,KAAT1qE,EAAG,GACA8yD,GACHjuD,EAAK9I,YAAY4uE,GAAWxuE,SAAS,4BAIlC22D,GACHjuD,EAAK9I,YAAY,yBAAyBI,SAAS,6BAGvDmH,EAAKnH,SAAS,cAGD,KAAT6D,EAAG,GACA8yD,GACHjuD,EAAK9I,YAAY,4BAA4BI,SAASwuE,GAInD7X,GACHjuD,EAAK9I,YAAY,6BAA6BI,SAAS,yBAG3DmH,EAAK3C,KAAK,aAAa5E,YAAY,YACnCuH,EAAKvH,YAAY,cAKvB,QAAS6uE,mBAAkBrW,EAAUqS,EAAUiE,GAC7CvvE,EAAE,OAASi5D,GAAU6S,UACnBnmD,IAAK,0BACLomD,WAAW,EACX1qC,MACEC,YAAa,kCACbC,SAAU,OACVyqC,OAAQ,eAAiBV,EAAW,mBAAqBiE,EAAc,mBACvE3hD,OAAO,EACPC,OAAO,EACP9kB,KAAM,UAKV/I,EAAE,iBAAiBwvE,KAAK,YAAa,WAAcxvE,EAAEmB,MAAMN,SAAS,UACpEb,EAAE,iBAAiBwvE,KAAK,WAAY,WAAcxvE,EAAEmB,MAAMV,YAAY,UAEtEgH,WAAWgoE,UAAW,KACtBC,kBAIF,QAASrD,qBAAoB7nE,GAC3B,GAAI3B,GAAK2B,EAAMwoE,aAEf,IADAhtE,EAAE,WAAY,qBAAqBS,YAAY,QAAQ4E,KAAK,yBAAyBR,IAAI,aAAc,UACnG7E,EAAE6C,GAAIoM,SACHjP,EAAE6C,GAAIjC,SAAS,UAAW,CAC7B,GAAI+uE,GAAQ3vE,EAAE6C,GAAIwC,KAAK,wBACvBsqE,GAAM9qE,IAAI,aAAc,WAI5B7E,EAAE6C,GAAIhC,SAAS,QAIjB,QAASyrE,oBAAmB9nE,GAC1BxE,EAAE,WAAY,aAAaS,YAAY,QAAQ4E,KAAK,yBAAyBR,IAAI,aAAc,SAC/F,IAAIhC,GAAK2B,EAAMwoE,aACfhtE,GAAE6C,GAAIwC,KAAK,yBAAyBR,IAAI,aAAc,UAEtD7E,EAAE6C,GAAIpC,YAAY,QAIpB,QAASmvE,gBAAevuE,GACtBwuE,YAAYxuE,GAGd,QAASyuE,WAAUxmE,GACjB,GAAI8+B,GAAS9+B,EAAGpD,KAAK,MACjB6pE,EAAc3nC,EAAO77B,QAAQ,IAIjC,OAHIwjE,KAAe,IACjB3nC,EAASA,EAAO9qB,OAAOyyD,EAAc,IAEhC3nC,EAMT,QAASynC,aAAYhtE,GACnBA,EAAK7C,EAAE6C,EACP,IAIImtE,GAJAv/B,EAAS5tC,EAAGqD,KAAK,SACjB+pE,EAAWptE,EAAGqD,KAAK,QACnB8C,EAAMhJ,EAAE6C,GAAIqtE,aAAa,SACzB9nC,EAAS0nC,UAAU9vE,EAAEgJ,EAAIA,EAAIiG,OAAS,KAGtCkhE,EAAYC,UAAUhoC,EAI1B,MAAI6nC,EAAWI,kBAAqBxtE,EAAG+R,SAAShU,SAAS,SAA+B,GAApByvE,kBAAyBF,GAA7F,CACA,GAAIF,EAAW,IAAMK,uBAAuBloC,GAAS,MAAOV,UAAS5/B,EAAE,iCACvE,KAAIjF,EAAG+R,SAAShU,SAAS6vC,GAAzB,CAKA,IAAK,GAFD8/B,GAAWvwE,EAAE,kCACbwwE,EAAcD,EAASn7D,MAAMhF,MAAM,KAC9B1H,EAAI,EAAGA,EAAI8nE,EAAYvhE,OAAQvG,IAAK,CAC3C,GAAI+nE,GAAUD,EAAY9nE,GAAG0H,MAAM,IACnC,IAAIqgE,EAAQ,IAAMroC,EAAQ,CACxB4nC,EAAkBS,EAAQ,GAC1BD,EAAY9nE,GAAK0/B,EAAS,IAAM6nC,CAChC,QAGJ,GAAIS,GAAaC,eAAe3wE,EAAE2V,KAAK9S,EAAG+R,SAAS1O,KAAK,UAEhC,IAApBmqE,kBAAyBJ,EAAWS,GAAcP,IAAcS,kBAAkBxoC,KAElF+nC,GAAaF,GAAYS,IAAcE,kBAAkBxoC,SAAiBwoC,mBAAkBxoC,GAAUwoC,kBAAkBxoC,GAAU,GAEtIvlC,EAAG+R,SAAS1O,KAAK,QAASuqC,GAAQhwC,YAAY,YAC9CoC,EAAGglE,SAAS,QAAQj/D,KAAKd,EAAE,SAAW9H,EAAE2V,KAAK9S,EAAG+R,SAAS1O,KAAK,SAASgM,iBACvEq+D,EAASn7D,IAAIo7D,EAAYp9D,KAAK,MAE9BpT,EAAE,WAAWupD,QAAQ,mBAKvB,QAAS6mB,WAAUhoC,GAGjB,IAAK,GAFDmoC,GAAWvwE,EAAE,wCACbwwE,EAAcD,EAASn7D,MAAMhF,MAAM,KAC9B1H,EAAI,EAAGA,EAAI8nE,EAAYvhE,OAAQvG,IAAK,CAC3C,GAAI+nE,GAAUD,EAAY9nE,GAAG0H,MAAM,IACnC,IAAIqgE,EAAQ,IAAMroC,EAChB,OAAO,EAGX,OAAO,EAGT,QAASuoC,gBAAe1oC,GACtB,OAAQA,GACN,IAAK,OAAQ,MAAO,EACpB,KAAK,SAAU,MAAO,EACtB,KAAK,OAAQ,MAAO,IAIxB,QAASR,qBACP,GAAI8oC,GAAWvwE,EAAE,iCACjB,SAAIuwE,EAASthE,OAAS,IACbqhE,yBAA2B,EAOtC,QAASA,wBAAuBloC,GAK9B,IAAK,GAJDmoC,GAAWvwE,EAAE,kCACbwwE,EAAcD,EAASn7D,MAAMhF,MAAM,KACnCygE,EAAsB,EAEjBnoE,EAAI,EAAGA,EAAI8nE,EAAYvhE,OAAQvG,IAAK,CAC3C,GAAI+nE,GAAUD,EAAY9nE,GAAG0H,MAAM,IACjB,IAAdqgE,EAAQ,IAAWA,EAAQ,IAAMroC,KAASyoC,EAEhD,MAAOA,GAKT,QAASC,kBAAiBzvE,GACxB,GAAI0vE,GAAK/wE,EAAEqB,GAAMuT,SACbq7D,EAAWc,EAAGtnC,SAAS,IAAMsnC,EAAG7qE,KAAK,UAAUA,KAAK,OACxC,IAAZ+pE,GAAiBI,iBAAmB,IACxCJ,GAAY,EACRA,EAAWI,mBAAkBJ,EAAW,GAC5Cc,EAAGtnC,SAAS,UAAYwmC,EAAW,MAAM7rE,SAI3C,QAASmoE,qBAAoB/nE,GAC3B,GAAI3B,GAAK7C,EAAEwE,EAAMwoE,eACbgE,EAASnuE,EAAGwC,KAAK,aACjB2rE,GAAO/hE,OAAS,IAClBpM,EAAGhC,SAAS,QACZmwE,EAAOnsE,IAAI,aAAc,YAK7B,QAAS2nE,oBAAmBhoE,GAC1B,GAAI3B,GAAK7C,EAAEwE,EAAMwoE,eACbgE,EAASnuE,EAAGwC,KAAK,aACjB2rE,GAAO/hE,OAAS,IAClB+hE,EAAOnsE,IAAI,aAAc,UACzBhC,EAAGpC,YAAY,SAKnB,QAASwwE,sBAAqB5vE,GAC5B,GAAIwB,GAAK7C,EAAEqB,GACPiI,EAAKzG,EAAG+R,SAASA,QAGrB,IAAItL,EAAGsL,SAASA,SAASvP,KAAK,YAAY4J,QAAU,EAClDy4B,SAAS5/B,EAAE,sCACN,CACL,GAAIsgC,GAAS0nC,UAAUxmE,EAEvB,IAAwB,GAApB+mE,kBAAyBD,UAAUhoC,GAAS,MAChD,IAAImoC,GAAWvwE,EAAE,kCACbwwE,EAAcD,EAASn7D,MAAMhF,MAAM,IAIvC,KAAKkgE,uBAAuBloC,GAAS,MAAOV,UAAS5/B,EAAE,iCAEvD,KAAK,GAAIY,GAAI,EAAGA,EAAI8nE,EAAYvhE,OAAQvG,IAAK,CAC3C,GAAI+nE,GAAUD,EAAY9nE,GAAG0H,MAAM,IACnC,IAAIqgE,EAAQ,IAAMroC,EAAQ,CACxBooC,EAAY9nE,GAAK,EACjB,QAIJ6nE,EAASn7D,IAAIo7D,EAAYp9D,KAAK,KAAK/D,QAAQ,KAAM,MACjD/F,EAAGuoC,SAEH27B,SAASxtE,EAAE,WAAWqF,KAAK,OAAS+iC,IAAS,GAI/CpoC,EAAE,WAAWupD,QAAQ,gBAGvB,QAASikB,UAAS3qE,EAAIquE,GACpB,GAAIruE,EAAGoM,OAAS,EACd,GAAIpM,EAAGjC,SAAS,UAEVswE,EACFruE,EAAG8gB,OAAO,yBAAyB8lB,SAAS,KAAKvjC,KAAK,QAAS,IAG/DrD,EACCuJ,MAAM,WACLpM,EAAEmB,MAAMsoC,SAAS,KAAKrmC,QACrB,WACDpD,EAAEmB,MAAMsoC,SAAS,KAAKhoC,SAEvBgoC,SAAS,KACThpC,YAAY,gCAAgCI,SAAS,6BACrDqF,KAAK,QAAS4B,EAAE,QAChBrG,OACAyC,IAAI,eAAgB,WACnB8lC,aAAannC,EAAG/B,KAAK,QACrB0sE,SAAS3qE,GAAI,SAKjB,IADAA,EAAK7C,EAAE,WAAWqF,KAAK,OAASxC,EAAGqD,KAAK,OACpCrD,EAAGoM,OAAS,EAAG,CACjB,GAAI8+C,GAAMlrD,EAAGwC,KAAK,SACa,MAA3BxC,EAAGqD,KAAK,MAAMy3B,OAAO,GAEnBuzC,GACFnjB,EAAIttD,YAAY,wBAAwBA,YAAY,4BAA4BI,SAAS,iCACzFgC,EAAGhC,SAAS,YAEZktD,EAAIttD,YAAY,iCAAiCI,SAASgC,EAAGjC,SAAS,YAAc,2BAA6B,wBACjHZ,EAAE,kBAAkBqF,KAAK,6BAA6B5E,YAAY,4BAA4BI,SAAS,wBACvGgC,EAAGpC,YAAY,WAGbywE,GACFnjB,EAAIttD,YAAY,yBAAyBA,YAAY,6BAA6BI,SAAS,kCAC3FgC,EAAGhC,SAAS,YAEZktD,EAAIttD,YAAY,kCAAkCI,SAASgC,EAAGjC,SAAS,YAAc,4BAA8B,yBACnHZ,EAAE,kBAAkBypC,SAAS,MAAMpkC,KAAK,8BAA8B5E,YAAY,6BAA6BI,SAAS,yBACxHgC,EAAGpC,YAAY,YAS3B,QAASupC,cAAa3oC,GACpB,GAAIwB,GAAK7C,EAAEqB,GACP8vE,EAAYtuE,EAAGqD,KAAK,MACpBkrE,EAAcvuE,EAAGwC,KAAK,cAAcuD,OAEpC2uB,EAAQv3B,EAAE,iBACVqxE,EAAgB95C,EAAMlyB,KAAK,UAE/B,IAAIkyB,EAAMlyB,KAAK,UAAY8rE,EAAY,eAAiBA,GAAWliE,OACjE,OAAO,CAETjP,GAAE,WAAWupD,QAAQ,gBAErBikB,SAAS3qE,GAAI,EAGb,IAAIyuE,GAAe,EAEf53C,EAAS23C,EAAc3mE,OAAM,EACjCgvB,GAAOxzB,KAAK,KAAM,OAASirE,GAC3Bz3C,EAAOr0B,KAAK,WAAW5E,YAAY,YAAYyF,KAAK,QAAS4B,EAAE,2BAC/D,IAAIypE,GAAc73C,EAAOr0B,KAAK,UAC9BksE,GAAYrrE,KAAK,QAAS4B,EAAE,8BAG5B9H,EAAEkB,KAAKqwE,EAAYlsE,KAAK,KAAM,WAC5B,GAAImsE,GAAQxxE,EAAEmB,MACVswE,GAAeD,EAAMtrE,KAAK,OAC1BurE,IAAepB,iBACjBmB,EAAM/wE,YAAY,YAAYyF,KAAK,QAAS,IAE5CsrE,EAAM3wE,SAAS,YAAYqF,KAAK,QAAS4B,EAAE,kCAG/CypE,EAAYlsE,KAAK,QAAQ5E,YAAY,WAErC,IAAIixE,GAAah4C,EAAOr0B,KAAK,UAAUuD,KAAKwoE,EAC5CC,GAAchsB,MAAM3rB,EAAOt2B,OAG3B,IAAI6+D,GAAWhP,eAAepwD,EAC9B,IAAwB,mBAAbo/D,GAA0B,CAEnCyP,EAAWtmC,WAAW,QAEtB,IAAIspB,GAAOh7B,EAAOr0B,KAAK,mBACvBqvD,GAAKj0D,YAAY,YAAY+1C,KAAK,QAAQpL,WAAW,aAAatqC,KAAK,YAAamhE,GACpFxrB,0BAA0Bie,OACrB,CAELgd,EAAWxrE,KAAK,QAASkrE,EACzB,IAAIO,GAAaj4C,EAAOr0B,KAAK,mBAC7BssE,GAAWlxE,YAAY,QAAQA,YAAY,YAAY+1C,KAAK,QAAQA,KAAK,WACzEm7B,EAAWvmC,WAAW,aAIxB1R,EAAO9kB,SAASvP,KAAK,SAASnE,KAAK,WACjClB,EAAEmB,MAAMV,YAAY,YAAY+1C,KAAK,QACrCC,0BAA0Bz2C,EAAEmB,SAG9B0uE,YAAYn2C,EAAOr0B,KAAK,qBAAsBisE,EAE9C,IAAIf,GAAWvwE,EAAE,kCACbwwE,EAAcD,EAASn7D,KAE3B,OADAm7D,GAASn7D,IAAIo7D,EAAcW,EAAY,IAAMG,EAAe,MACrD,EAKT,QAASM,sBAAqB/uE,GACvB7C,EAAEwB,KAMLxB,EAAE6C,GAAI0mD,QAAQ,SALVvpD,EAAE6C,GAAIjC,SAAS,cACjBZ,EAAE6C,GAAIpC,YAAY,YAClBT,EAAE6C,GAAIuS,IAAI,KAMhB,QAASy8D,uBAAsBhvE,EAAIqd,GAC5BlgB,EAAEwB,MACqB,GAAtBxB,EAAE6C,GAAIuS,MAAMnG,SACdjP,EAAE6C,GAAIuS,IAAI8K,GACVlgB,EAAE6C,GAAIhC,SAAS,aAKrB,QAASixE,YAAWC,EAAOC,EAAQnvE,GACjCuE,aAAa6qE,oBACbA,mBAAqBxqE,WAAW,WAAcyqE,SAASH,EAAOC,EAAQnvE,IAAQ,KAEhF,QAASqvE,UAASH,EAAOC,EAAQnvE,GAC/B,GAAIsvE,GAAOnyE,EAAE6C,GACTqd,EAAQlgB,EAAE2V,KAAKw8D,EAAK/8D,MACxB,IAAoB,GAAhB8K,EAAMjR,OAAa,CACrBjP,EAAE,IAAMgyE,GAAQpW,OAChB,IAAIwW,GAAmB,EACvBpyE,GAAE,IAAM+xE,EAAQ,oBAAoB7wE,KAAK,WACvC,GAAKlB,EAAEmB,MAAM+E,KAAK,aAAagM,cAAc3F,QAAQ2T,EAAMhO,iBAAkB,GAA0D,GAAlDlS,EAAEmB,MAAMyT,SAAS1O,KAAK,MAAMkK,MAAM,MAAMnB,OAAc,CACzI,GAAIsiD,GAAMvxD,EAAEmB,MAAMyT,QAClB,IAAIw9D,EAAiB7lE,QAAQglD,EAAIrrD,KAAK,SAAU,EAAI,CAClD,GAAImsE,GAAW9gB,EAAI7mD,OAAM,EACzB1K,GAAE,IAAMgyE,GAAQ7xE,OAAOkyE,GACvBD,EAAmBA,EAAmB7gB,EAAIrrD,KAAK,MAAQ,QAI7DlG,EAAE,IAAMgyE,GAAQ5uE,OAChBpD,EAAE,IAAM+xE,GAAOtwE,WAGfzB,GAAE,IAAMgyE,GAAQpW,QAAQn6D,OACxBzB,EAAE,IAAM+xE,GAAO3uE,OAInB,QAAS2pE,gBAAezsE,EAAIgyE,EAAYC,EAAcjH,EAAUkH,EAAY3vE,EAAI4vE,GAI9E,MAHAhrB,iBAAgB5kD,GAChBuE,aAAa6qE,oBACbA,mBAAqBxqE,WAAW,WAAcirE,eAAeJ,EAAYC,EAAcjH,EAAUkH,EAAY3vE,EAAI4vE,IAAc,KAC1G,IAAdnyE,EAAGqjD,QAIZ,QAAS+uB,gBAAeJ,EAAYC,EAAcjH,EAAUkH,EAAY3vE,EAAI4vE,GAC1E,GAAIN,GAAOnyE,EAAE6C,GACTqd,EAAQlgB,EAAE2V,KAAKw8D,EAAK/8D,MACxB,IAAoB,GAAhB8K,EAAMjR,QAAeiR,GAASuyD,EAE5B9nE,KAAKC,oBAEPlE,GAAGmE,GAAGC,WAAWC,OACfC,KAAMtE,GAAGuE,cACTC,OAAQ,cACRG,KAAM,YACN/D,OAAQ6qE,EAAK7mE,IAAI,KAIrBtL,EAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,0BACL7kB,KAAM,eAAiBwqE,EAAW,kBAAoBkH,EAAa,iCAAmCtyD,EAAQ,KAC9G0N,OAAO,EACPC,OAAO,EACP2T,QAAS,SAAUj5B,GACjB,GAAIoqE,GAAa3yE,EAAE,IAAMuyE,EACzBvyE,GAAE,IAAMsyE,GAAY7wE,OACpBzB,EAAE,qBAAqByB,MAEvB,IAAI8uE,GAAW,IAAMvwE,EAAE,kCAAkCoV,KAEzDu9D,GAAW/W,QAAQx4D,OAEQ,GAAvBmF,EAAIoK,EAAEyW,OAAOna,OACf0jE,EAAWxyE,OAAO,yCAA2C2H,EAAE,qBAAuB,WAEtF9H,EAAEuI,EAAIoK,EAAEyW,QAAQloB,KAAK,WACnB,GAAI0xE,GAAWzxE,KACXqtE,EAASoE,EAASluE,EAClBkuE,GAAS1qC,UAASsmC,EAAS,KAAOA,EACtC,IACI5wD,GADA45C,EAAc+Y,EAAShkE,QAAQ,IAAMiiE,EAAS,OAAQ,CAEtDoE,GAASluE,IAAK,EACK,MAAjBkuE,EAASle,MAEX92C,EAAI5d,EAAE4yE,EAAShqE,MACXgV,EAAEhd,SAAS,SACbgd,EAAE1c,KAAK,WACLu1C,0BAA0Bz2C,EAAEmB,SAGhCqsE,SAAS5vD,EAAG45C,KAGZ55C,EAAI5d,EAAE0zD,kCAAkCkf,EAASle,OACjD92C,EAAE1X,KAAK,KAAMsoE,GAAQ1tE,KAAK,MAAO8xE,EAAShqE,MAAMzI,OAAO,6BACvDqtE,SAAS5vD,EAAG45C,IAKZ55C,EADEzc,KAAKyH,KACH5I,EAAE,4BAA+B4yE,EAAa,KAAI,UAElD,KAGJh1D,GACF+0D,EAAWxyE,OAAOyd,MAGlB5d,EAAEwB,MAAQkF,GAAGC,IAAIC,cACnBulE,sBAAsBwG,EAAWttE,KAAK,qBAExC6mE,sBAAsBlsE,EAAE,oBAIzB,CACLA,EAAE,IAAMsyE,GAAYlvE,OACpB6pE,sBAAsBjtE,EAAE,QACxB,IAAI6yE,GAAc7yE,EAAE,UACmB,IAAnC6yE,EAAY/xE,KAAK,iBACnB+xE,EAAYtpB,QAAQ,oBAAoB,IACxCspB,EAAY/xE,KAAK,cAAe,OAElCd,EAAE,IAAMuyE,GAAc9wE,QAI1B,QAASmrE,mCACP,GAAIkG,GAAO9yE,EAAE,uBACT+yE,EAAgB/yE,EAAE,qBAClBgzE,EAAchzE,EAAE,aAChB6yE,EAAc7yE,EAAE,iBAChBizE,EAAiBjzE,EAAE,oBAClBA,GAAEwB,MACLwxE,EAAY7tE,OAAO6tE,EAAYp+D,SAASA,SAASzP,UAAUN,IAAI,WAAY,OAG7E,IAAIquE,GAAsB,SAAUC,GAClC,GAAIL,EAAK7jE,OAAS,GAA4B,QAAvB6jE,EAAKjuE,IAAI,WAAsB,CACpD,GAAIuuE,GAAcN,EAAKztE,KAAK,YAAYtC,QAAQ,WAChD,IAAIqwE,EAAYnkE,OAAQ,CAEtB,GAAIokE,EACAF,IACFE,EAAWD,EAAY/tE,KAAK,oBACL,GAAnBguE,EAASpkE,SACXokE,EAAWC,EAAoBF,EAAaD,KAI9CE,EAAWC,EAAoBF,EAAaD,GAE1CE,EAASpkE,SACXskE,IACAC,EAAUH,GACVI,EAAoBJ,EAAUF,QAI5BA,IACFK,EAAUV,EAAKztE,KAAK,qBACpB2tE,EAAYhtE,UAAU,KAGtBwtE,EAAUV,EAAKztE,KAAK,oBACpB2tE,EAAYhtE,UAAU,UAIvB,CACH,GAAIotE,GAAcL,EAAc1tE,KAAK,WACrC,IAAI+tE,EAAYnkE,OAAQ,CACtB,GAAIokE,EAEFA,GADEF,EACSC,EAAYtwC,KAAK,oBAGjBswC,EAAYrwC,OAEpBswC,EAASpkE,SAAQokE,EAAWD,GACjCG,IACAC,EAAUH,GACVI,EAAoBJ,EAAUF,OAG1BA,IACFK,EAAUT,EAActpC,SAAS,sBACjCupC,EAAYhtE,UAAU,KAGtBwtE,EAAUT,EAActpC,SAAS,qBACjCupC,EAAYhtE,UAAU,QAM1BstE,EAAsB,SAAUtrE,EAAMmrE,GACxC,GAAIE,EACJ,IAAIF,EACFE,EAAWrrE,EAAK86B,KAAK,oBACE,GAAnBuwC,EAASpkE,SAITokE,EAHGrrE,EAAK4M,OAAO,aAAa3F,OAGjBjH,EAFAsrE,EAAoBtrE,EAAKjF,QAAQ,oBAAqBowE,QAKhE,CACLE,EAAWrrE,EAAK+6B,KAAK,mBACrB,IAAI2wC,IAAU,CAad,IAZuB,GAAnBL,EAASpkE,SACNjH,EAAK4M,OAAO,aAAa3F,QAO5BokE,EAAWrrE,EACX0rE,GAAU,IAPVL,EAAWrrE,EAAKjF,QAAQ,oBACxB2wE,GAAU,EACa,GAAnBL,EAASpkE,SACXokE,EAAWC,EAAoBtrE,EAAKjF,QAAQ,oBAAqBowE,MAOnEO,EAAS,CACX,GAAIC,GAAUN,EAAShuE,KAAK,kBACxBsuE,GAAQ1kE,SACVokE,EAAWM,IAIjB,MAAON,IAGLO,EAAwB,SAAUC,GACpC,GAAIf,EAAK7jE,OAAS,GAA4B,QAAvB6jE,EAAKjuE,IAAI,WAAsB,CACpD,GAAIuuE,GAAcN,EAAKztE,KAAK,YAAYtC,QAAQ,mBAChD,IAAI8wE,EACET,EAAYxyE,SAAS,eACvBwyE,EAAY3pC,SAAS,eAAerlC,YAGtC,IAAIgvE,EAAYxyE,SAAS,eACvBwyE,EAAY3pC,SAAS,eAAerlC,YAEpC,KAAKgvE,EAAYx+D,OAAO,aAAa3F,OAAQ,CAC3C,GAAI2F,GAASw+D,EAAYrwE,QAAQ,mBACjCwwE,KACAC,EAAU5+D,GACVA,EAAO60B,SAAS,eAAerlC,WAOrCqvE,EAAsB,SAAUzrE,EAAMmrE,GACxC,GAAIL,EAAKh3C,OAAO,YAAY32B,SAAW6tE,EAAY7tE,UAChD4tE,EAAc5tE,SAAW6tE,EAAY7tE,UAA4C,QAAhC4tE,EAAcluE,IAAI,WAAuB,CAE3F,GAAIM,GAAS,GACT2uE,EAAY9rE,EAAK9B,KAAK,MACtB6tE,EAAMjB,EAAKh3C,OAAO,YAAY7sB,OAAS6jE,EAAKztE,KAAK,cAAgB0tE,EAActpC,SAAS,mBAG5F,IAAI0pC,EAAM,CACR,IAAK,GAAIzqE,GAAIqrE,EAAI9kE,OAAS,EAAGvG,GAAK,EAAGA,IACnC,GAAI1I,EAAE+zE,EAAIrrE,IAAIxC,KAAK,OAAS4tE,EAAW,CACrC3uE,GAAoB,IAATuD,EAAI,EACf,OAGAsqE,EAAY7tE,SAAWA,EAAS,KAClC6tE,EAAYhtE,UAAUgtE,EAAYhtE,YAAc,QAE7C,CACL,IAAK,GAAI0C,GAAI,EAAGA,EAAIqrE,EAAI9kE,OAAQvG,IAC9B,GAAI1I,EAAE+zE,EAAIrrE,IAAIxC,KAAK,OAAS4tE,EAAW,CACrC3uE,GAAoB,IAATuD,EAAI,EACf,OAGAvD,EAAS6tE,EAAYhtE,YAAc,KACrCgtE,EAAYhtE,UAAUgtE,EAAYhtE,YAAc,OAMpDwtE,EAAY,SAAUxrE,GACxBurE,IACmB,GAAfT,EAAK7jE,QAAsC,QAAvB6jE,EAAKjuE,IAAI,WAC/BmD,EAAK8zB,OAAO,6BAA6Bj7B,SAAS,QAElDmH,EAAK3C,KAAK,6BAA6BxE,SAAS,SAE7CmH,EAAKpH,SAAS,gBAAkBoH,EAAKiH,QACpCjH,EAAK3C,KAAK,WAAW,GAAGgP,UAAU9H,QAAQ,YAAa,GACzDvE,EAAK3C,KAAK,+BAA+BR,IAAI,aAAc,YAI7D0uE,EAAkB,WACpB,GAAIxoD,GAAQkoD,EAAe5tE,KAAK,WACZ,IAAhB0lB,EAAM9b,SAAa8b,EAAQkoD,EAAe5tE,KAAK,MAAMA,KAAK,aAC9D0lB,EAAMtqB,YAAY,QAAQ4E,KAAK,yBAAyBR,IAAI,aAAc,UAC1EkmB,EAAMnW,SAASnU,YAAY,UAGzBuzE,EAAa,WACA,GAAflB,EAAK7jE,QAAsC,QAAvB6jE,EAAKjuE,IAAI,WAC3BkuE,EAAc1tE,KAAK,YAAYjB,QAC/B0uE,EAAKztE,KAAK,YAAYjB,SAGtB6vE,EAAe,WACjB,GAAIjsE,GAAsB,GAAf8qE,EAAK7jE,QAAsC,QAAvB6jE,EAAKjuE,IAAI,WACtCkuE,EAAc1tE,KAAK,YAAYjB,QAC/B0uE,EAAKztE,KAAK,YAAYjB,QACpBkF,EAAKupE,EAAYxtE,KAAK,YAAc2C,EAAK9B,KAAK,MAAQ,KAC1D+qE,sBAAqB3nE,EAAGjE,KAAK,YAAYokC,aAGvCyqC,EAAQ,QACZ3kE,KAAI,OAAQ2kE,EAAO,WAAyC,MAA3BhB,IAAoB,IAAc,IACnE3jE,IAAI,KAAM2kE,EAAO,WAA0C,MAA5BhB,IAAoB,IAAe,IAClE3jE,IAAI,QAAS2kE,EAAO,WAA2C,MAA7BN,IAAsB,IAAc,IACtErkE,IAAI,OAAQ2kE,EAAO,WAA4C,MAA9BN,IAAsB,IAAe,IACtErkE,IAAI,QAAS2kE,EAAO,WAA4B,MAAdF,MAAqB,IACvDzkE,IAAI,SAAU2kE,EAAO,WAA8B,MAAhBD,MAAuB,IAC1D1kE,IAAI,YAAa2kE,EAAO,WAAqF,MAAvEl0E,GAAE,UAAU6xD,OAAQ7xD,EAAE,qBAAqB03B,QAAS67C,KAA0B,IACpHvzE,EAAE,qBAAqB03B,MAAM,WAAck6C,qBAAqBzwE,MAAOoyE,MAv+BzE,GAAI1zC,iBAAkB,EAoXlB+wC,qBAuRAqB;AC3oBJ,QAASkC,8BACP1sE,WAAW2sE,iBAAkBC,mBAG/B,QAASD,oBACPp0E,EAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,0BACLkI,OAAO,EACP2T,QAAS,SAAU1gC,EAAM+nE,EAAYyL,GAEnC,IACMtoD,WACFhsB,EAAEiwB,KAAKvpB,GAAG+oB,WAAW/c,KAAK,WACxBsZ,UAAU4C,MAAMqqB,cAGpB,MAAO1zC,GACPke,QAAQC,IAAI,2CAEdjc,WAAW2sE,iBAAkBC,oBACxB3tE,GAAGwnB,SAAS+O,gBAAgBq3C,EAAItL,SAEvCt3C,MAAO,SAAUS,GACf1qB,WAAW2sE,iBAAkBC,oBACxB3tE,GAAGwnB,SAAS+O,gBAAgB9K,EAAI62C,WAK3C,QAASuL,kBAAiB5uD,EAAK7kB,GAC7B,GAAIwR,IAAI,EACJosC,GACF+d,QAAS,KAwBX,OApBAz8D,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAKA,EACLkI,OAAO,EACPD,OAAO,EACP9sB,KAAMA,EACN0gC,QAAS,SAAUj5B,GACjB+J,EAAI/J,EAAIoK,GAEV+e,MAAO,SAAUS,GACfusB,EAAI+d,QAAUh1D,WAAW,WAAc8sE,iBAAiBvzE,KAAKuzE,iBAAkB5uD,EAAK7kB,IAAS0zE,iBACxF9tE,GAAGwnB,SAAS+O,gBAAgB9K,EAAI62C,WAGrC12D,IACFosC,EAAI+d,QAAUh1D,WAAW,WAAc8sE,iBAAiBvzE,KAAKuzE,iBAAkB5uD,EAAK7kB,IAAS0zE,iBAGxF91B;CC3DT,SAAW+1B,GAGT,GAAIC,GAAOD,EAAQC,KAAO,SAAU5zE,GAClC2J,EAAE7H,OAAOzB,KAAML,GAGjB4zE,GAAKxxE,UAAU+d,YAAcyzD,EAC7BA,EAAKxxE,UAAUmd,SAAW,WACxB,MAAO,wBAITq0D,EAAKxkD,QAAU,WACb,MAAOwkD,GAAKC,WAGbxzE,KAAKyzE,SAAWzzE,KAAKyzE;CCjBxB,SAAW9nD,GAQT,GAAI+I,GAAa/S,MAAMlgB,QACrByR,UAAW,aAOXwgE,QAOAnzE,KAAM,SAAUozE,GACd3zE,KAAK0zE,OACL,KAAK,GAAIzpE,KAAQ0pE,GACf3zE,KAAK4zE,WAAW3pE,EAAM0pE,EAAS1pE,KAYnC2pE,WAAY,SAAU3pE,EAAMtK,GAG1B,MAFAK,MAAKiK,GAAQtK,EACRd,EAAE8jB,WAAWhjB,IAAOK,KAAK0zE,KAAKngE,KAAK5T,GACjCK,MAUT6zE,cAAe,SAAU5pE,GACvB,GAAI8Y,GAAK/iB,KACL8zE,EAAiB,IACrB,IAAI/wD,EAAG9Y,GAAO,CACZ6pE,EAAiB/wD,EAAG9Y,SACb8Y,GAAG9Y,EAEV,KAAK,GAAI1C,GAAI,EAAGA,EAAIwb,EAAG2wD,KAAK5lE,OAAQvG,IAClC,GAAIwb,EAAG2wD,KAAKnsE,KAAOusE,EAAgB,CACjC/wD,EAAG2wD,KAAKv+D,OAAO5N,EAAG,EAClB,QAIN,MAAOusE,IAQTh6C,MAAO,WACL,GAAI/W,GAAK/iB,IACT,KAAK,GAAIiK,KAAQ8Y,GACXlkB,EAAEw6D,QAAQt2C,EAAG9Y,GAAO8Y,EAAG2wD,SAAU,SAC5B3wD,GAAG9Y,EAId,OADAjK,MAAK0zE,QACE1zE,MAQTk7B,MAAO,WACL,MAAOl7B,MAAK0zE,KAAK5lE,QASnB2Z,QAAS,SAAUxd,GACjB,QAASjK,KAAKiK,IAQhBgtB,QAAS,WACP,MAAOj3B,MAAK0zE,OAKhB/nD,GAAO+I,WAAaA,GAEnBpwB,OAAOumB;ACpHV,cAEA,SAAWc,GAQT,GAAIooD,IAQFp0C,KAAM,WACJ,GAAInb,GAAMxkB,KAAKkkB,OAKf,OAJIlkB,MAAKg0E,OACPxvD,EAAIG,SAAS,OAAQ,QAEvBH,EAAImb,OACG3/B,MAUTi0E,cAAe,WACb,GAAIzvD,GAAMxkB,KAAKkkB,OAIf,OAHAM,GAAIG,SAAS,UAAW,GACxBH,EAAIG,SAAS,SACbH,EAAImb,OACG3/B,MAUTkkB,MAAO,WAGL,GAAIM,GAAM,GAAIjf,IAAGkf,IAAIzkB,KAKrB,OAJIA,MAAKg0E,OACPxvD,EAAIG,SAAS,OAAQ,QAGhBH,GAUTiC,YAAa,WACX,OACEpC,GAAIrkB,KAAKuD,GACT47B,KAAMjvB,mBAAmBlQ,KAAK4H,MAC9B6wC,SAAUz4C,KAAKu5C,gBAWnB26B,cAAe,SAAUxvC,GAKvB,MAJKA,IAAOn/B,GAAGqL,MAAM,oDACrB5Q,KAAKuD,GAAKmhC,EAAMrgB,GAChBrkB,KAAK4H,KAAOiJ,uBAAuB6zB,EAAMvF,MACzCn/B,KAAKu5C,cAAgB7U,EAAM+T,SACpBz4C,MAWTojB,SAAU,WACR,MAAOvkB,GAAEwkB,QACP9f,GAAIvD,KAAKuD,GACTqE,KAAM5H,KAAK4H,KACX2xC,cAAev5C,KAAKu5C,iBAM1B5tB,GAAOooD,UAAYA,GAClBzvE,OAAOumB,UAAUqC;AC7GpB,cACA,SAAWvB,GAgBT,GAAIvH,GAAOzC,MAAMlgB,QAAQkqB,EAAOuB,OAAO6mD,YACrC7gE,UAAW,OACX3P,GAAI,EACJqE,KAAMwI,YAAYO,QAClB4oC,cAAe,KACfy6B,OAAO,EAEPzzE,KAAM,SAAUgD,EAAIqE,EAAMusE,GACxB,MAAI7N,OAAM/iE,IAAqB,gBAAPA,IACtBvD,KAAKuD,GAAKgC,GAAGmE,GAAGswC,QAChBh6C,KAAK4H,KAAOrC,GAAGmE,GAAG0qE,gBAClBp0E,KAAKu5C,cAAgBh0C,GAAGmE,GAAG0jE,mBACpBptE,OAGS,gBAAPuD,IACTvD,KAAKuD,GAAKA,EAAO,GACjBvD,KAAK4H,KAAOrE,EAAS,KACrBvD,KAAKu5C,cAAgBh2C,EAAkB,gBAEvCvD,KAAKuD,GAAKA,EACVvD,KAAK4H,KAAOA,EACZ5H,KAAKu5C,cAAgB46B,GAEhBn0E,QAMX2rB,GAAOvH,KAAOA,GACb9f,OAAOumB;AChDV,cACA,SAAWc,GAWT,GAAIlH,GAAM9C,MAAMlgB,QACdyR,UAAW,MACXmhE,KAAM,GAEN9zE,KAAM,SAAUikB,GAQd,MAPmB,gBAARA,IAAsC,SAAlBA,EAAItR,UACjClT,KAAKq0E,KAAOr0E,KAAKs0E,gBAAgB9vD,GAEjCxkB,KAAKq0E,KAAO7vD,EAETA,IAAKxkB,KAAKq0E,KAAO/vE,OAAO6sB,SAASrpB,MACtC9H,KAAKu0E,WACEv0E,MAQTu0E,SAAU,aA6BV50C,KAAM,SAAU60C,GAEd,MADAA,GAAaA,GAAc,SACpBlwE,OAAOq7B,KAAK3/B,KAAKq0E,KAAMG,IAYhCC,OAAQ,SAAUC,GAChB,MAAOA,GAAIvjD,SAASrpB,KAAO9H,KAAKq0E,MAYlCr4C,SAAU,SAAU24C,GAClB,MAAO30E,MAAK40E,UAAUD,EAAW30E,KAAKk9B,wBAaxC03C,UAAW,SAAUD,EAAWnwD,GAC9B,GAAI2N,GAAQnyB,KAAK60E,eAAerwD,EAAKmwD,EACrC,KACE,MAAOG,oBAAmB3iD,GAC1B,MAAO7oB,GACP,MAAO6oB,KAaX4iD,eAAgB,SAAUJ,GACxB,MAAO30E,MAAK40E,UAAUD,EAAW,IAAM30E,KAAK+P,YAY9CilE,eAAgB,SAAUL,EAAW51D,GACnC,GAAIgE,GAAK/iB,KACLi1E,EAAUlyD,EAAGmyD,UAAUP,EAAW51D,EAAO,IAAMgE,EAAGhT,WAAWoM,OAAO,EAC9C,OAAtB84D,EAAQz4C,OAAO,KAAYy4C,EAAUA,EAAQ94D,OAAO,IACxD4G,EAAGsxD,KAAOtxD,EAAGma,sBAAwB,IAAM+3C,GAW7CllE,QAAS,WACP,GAAIolE,GAAYn1E,KAAKq0E,KAAKjpE,QAAQ,IAClC,OAAI+pE,KAAa,EACRn1E,KAAKq0E,KAAKl4D,OAAOg5D,EAAY,GAE7B,IAWXC,aAAc,WACZ,MAAO7vE,IAAG8mB,yBAAyBrsB,KAAKq0E,OAU1Cn3C,oBAAqB,WACnB,GAAIi4C,GAAYn1E,KAAKq0E,KAAKjpE,QAAQ,IAClC,OAAI+pE,KAAa,EACRn1E,KAAKq0E,KAAKl4D,OAAO,EAAGg5D,GAEpBn1E,KAAKq0E,MAchB1vD,SAAU,SAAUgwD,EAAW51D,GAC7B,GAAIs2D,GAAOr1E,KAAK+P,QAAQ/P,KAAKq0E,KAO7B,OALAr0E,MAAKq0E,KAAOr0E,KAAKk1E,UAAUP,EAAW51D,EAAO/e,KAAKk9B,uBAC9Cm4C,IACFr1E,KAAKq0E,KAAOr0E,KAAKq0E,KAAO,IAAMgB,GAEhCr1E,KAAKu0E,WACEv0E,MAeTk1E,UAAW,SAAUP,EAAW51D,EAAOyF,GACrC,GAAI+X,GAAS/X,EACT8wD,EAAK,GAAIp3D,QAAO,UAAay2D,EAAY,YAAa,KACtD3kE,EAAIslE,EAAG31D,KAAK4c,EAMhB,OALKvsB,GAGHusB,EAASA,EAAOruB,QAAQonE,EAAItlE,EAAE,GAAK2kE,EAAY,IAAMY,mBAAmBx2D,IAFxEwd,IAAYA,EAAOnxB,QAAQ,OAAQ,EAAM,IAAM,KAAOupE,EAAY,IAAMY,mBAAmBx2D,GAItFwd,GAYTJ,YAAa,SAAUw4C,GACrB,GAAI5xD,GAAK/iB,KACLq1E,EAAOtyD,EAAGhT,QAAQgT,EAAGsxD,MACrBmB,EAAiBzyD,EAAGma,sBACpBo4C,EAAK,GAAIp3D,QAAO,WAAcy2D,EAAY,YAAa,KAW3D,OAVAa,GAAiBA,EAAetnE,QAAQonE,EAAI,MAAMpnE,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KAC1B,MAArDsnE,EAAeh5C,OAAOg5C,EAAe1nE,OAAS,KAChD0nE,EAAiBA,EAAer5D,OAAO,EAAGq5D,EAAe1nE,OAAS,IAEhEunE,EACFtyD,EAAGsxD,KAAOmB,EAAiB,IAAMH,EAEjCtyD,EAAGsxD,KAAOmB,EAEZzyD,EAAGwxD,WACIv0E,MAWT60E,eAAgB,SAAUrwD,EAAKva,GAC7BA,EAAOA,EAAKiE,QAAQ,OAAQ,OAAQA,QAAQ,OAAQ,MACpD,IAAIunE,GAAS,SAAWxrE,EAAO,YAC3ByrE,EAAQ,GAAIx3D,QAAOu3D,EAAQ,KAC3Bza,EAAU,IAMd,OAFEA,GAHGx2C,EAGOkxD,EAAM/1D,KAAK6E,GAFXkxD,EAAM/1D,KAAKrb,OAAO6sB,SAASrpB,MAIlCkzD,EAGIA,EAAQ,GAFR,IAcXsZ,gBAAiB,SAAUnwD,GACzB,GAAIwxD,GAAOrxE,OAAO6sB,SAASrpB,KAAKqU,OAAO,EAAG7X,OAAO6sB,SAASrpB,KAAKwpB,YAAY,KAAO,GAC9EznB,EAAO7J,KAAK41E,mBAAmB1lE,mBAAmBiU,EAAKvc,OACvD4c,EAAMmxD,EAAO9rE,EAAO,SAAWo7C,UACzB,OAAS9gC,EAAK5gB,IACb4gB,EAAKo1B,cAAgB,aAAeg8B,mBAAmBpxD,EAAKo1B,eAAiB,IAC9E,QAAU2L,SACpB,OAAO1gC,IAYToxD,mBAAoB,SAAUx3C,GAC5B,OAAQA,EAAKrtB,eACX,IAAK,OAAQ,MAAO,SACpB,KAAK,MAAO,MAAO,YACnB,KAAK,MAAO,MAAO,SACnB,KAAK,OAAQ,MAAO,UACpB,KAAK,MAAO,MAAO,eACnB,SACE,MAAO,MAGX,MAAO,OAWTqS,SAAU,WACR,MAAOpjB,MAAKq0E,OAKhB1oD,GAAOlH,IAAMA,GACZngB,OAAOumB;ACjVV,cAEA,SAAWc,GAOTA,EAAOkqD,SAEPlqD,EAAOkqD,MAAMC,YAAc,SAAUC,EAAIC,EAAI51C,GAuB3C,MAtBW,QAAP21C,IAAaA,EAAK,IACX,OAAPC,IAAaA,EAAK,IAEtBD,GAAM,GAAKA,GAAI7zD,cACf8zD,GAAM,GAAKA,GAAI9zD,cAEe,QAA1Bke,EAASle,gBAEX6zD,EAAY,IAANA,EAAW,GAAIthE,MAAK,IAAK,EAAG,EAAG,EAAG,EAAG,GAAKV,cAAc,GAAKgiE,GACnEC,EAAY,IAANA,EAAW,GAAIvhE,MAAK,IAAK,EAAG,EAAG,EAAG,EAAG,GAAKV,cAAc,GAAKiiE,IAGvC,SAA1B51C,EAASle,gBACX6zD,EAAY,IAANA,EAAW/sC,OAAOitC,kBAAoBC,WAAWH,EAAGh4D,WAAW,IAAK,MAC1Ei4D,EAAY,IAANA,EAAWhtC,OAAOitC,kBAAoBC,WAAWF,EAAGj4D,WAAW,IAAK,OAG9C,WAA1BqiB,EAASle,gBACX6zD,GAAMA,EACNC,GAAMA,GAGJD,EAAKC,GAAW,EAChBD,EAAKC,EAAW,EACb,IAIR1xE,OAAOumB;ACxCV,cAOA,SAAWc,GAEP,GAAIwqD,GAAQz0D,WAAWjgB,QACrB20E,eAAe,EACf71E,KAAM,SAAUZ,KAKhB02E,OACEx7B,QAAS,SAAUzsC,EAAK2Q,GAEtB,MADA/e,MAAKoO,GAAO2Q,EACL/e,MAETs2E,WAAY,SAASloE,SACZpO,MAAKoO,IAEd4tC,QAAS,SAAU5tC,GACjB,MAAOpO,MAAKoO,IAEd0rB,MAAO,WACL,IAAKn4B,IAAK3B,MACHnB,EAAE8jB,WAAW3iB,KAAK2B,WACd3B,MAAK2B,EAGhB,OAAO3B,QAGXkT,UAAW,QAWXqjE,mBAAoB,WAClB,QAAUjyE,OAAsB,eAAMtE,KAAKo2E,eAQ7CI,YAAa,WACX,MAAIx2E,MAAKu2E,mBAA2BjyE,OAAOmyE,cAEzCl0D,IAAIkS,KAAK,QAAS,gFACXz0B,KAAKq2E,QAahBC,WAAY/wE,GAAGurB,IAAI,SAAU1iB,GAC3B,GAAI2U,GAAK/iB,IACT,KACAA,KAAKw2E,cAAcF,WAAWloE,GAC9BpO,KAAK6hB,KAAK,cAAezT,GACvB,MAAOhK,GACPme,IAAIgO,MAAM,QAASnsB,GACnB2e,EAAGqzD,eAAgB,EAErB,MAAOp2E,QAaT66C,QAAS,SAAUzsC,EAAK2Q,GACtB,GAAIgE,GAAK/iB,IACT,KACAA,KAAKw2E,cAAc37B,QAAQzsC,EAAK2Q,GAChC/e,KAAK6hB,KAAK,UAAWzT,EAAK2Q,GACxB,MAAO3a,GACPme,IAAIgO,MAAM,QAAQnsB,GAClB2e,EAAGqzD,eAAgB,EAGrB,MAAOp2E,OAYTg8C,QAAS,SAAU5tC,GACf,MAAOpO,MAAKw2E,cAAcx6B,QAAQ5tC,IAatCsoE,UAAWnxE,GAAGurB,IAAI,SAAS1iB,EAAK2Q,GAE9B,MADA/e,MAAK66C,QAAQzsC,EAAKvP,EAAEwkB,OAAOtE,IACpB/e,OAYT22E,UAAW,SAAUvoE,GAClB,GAAI2Q,GAAQ/e,KAAKg8C,QAAQ5tC,EACzB,OAAO2Q,KAAmB,cAATA,EAAuBlgB,EAAEsoB,UAAUpI,GAAS,OAWhE+a,MAAO,WAEL,MADA95B,MAAKw2E,cAAc18C,QACZ95B,OAOX2rB,GAAOe,MAAQ,GAAIypD,GACnBxqD,EAAOe,MAAMypD,MAAQA,GACtB7xE,OAAOumB;ACoKV,GAzUA,SAAWc,GACT,YAEA,IAAIirD,IACF5gC,GAAM,KACN6gC,GAAM,IAAK,KACXC,GAAM,IAAK,IAAK,KAChB52D,GAAM,IAAK,IAAK,IAAK,MAgBnB62D,EAAMr1D,WAAWjgB,QACnByR,UAAW,MACX8jE,WAAW,EACXC,eAAe,EACfC,aAAc,GACdC,cAAe,KAEf52E,KAAM,WACCP,KAAKiI,eAAcjI,KAAKg3E,WAAY,IAI3CI,WAAY,SAAUC,GACpB,OAAQA,GACN,IAAK,QACH,MAAOn9D,WAAUX,KAEnB,KAAK,OACL,IAAK,UACH,MAAOW,WAAUC,IAEnB,KAAK,OACH,MAAOD,WAAUV,IAEnB,KAAK,QACH,MAAOU,WAAUE,KAEnB,SACE,MAAO,QAIbk9D,SAAU,WACT,MAAO/xE,IAAGmnB,MAAMsvB,QAAQ,cAAgBh8C,KAAKo3E,WAAW5tE,KAAK+tE,WAAar9D,UAAUX,OAGrFi+D,SAAU,SAAUH,GAElB,MADA9xE,IAAGmnB,MAAMmuB,QAAQ,YAAaw8B,GACvBr3E,MAUTiI,WAAY,WACV,OAAS3D,OAAOmzE,SAAiD,SAAtClyE,GAAGmnB,MAAMsvB,QAAQ,kBAW9C+tB,OAAQ,WAGN,MAFAxkE,IAAGmnB,MAAMmuB,QAAQ,gBAAiB,QAClC76C,KAAKg3E,WAAY,EACVh3E,MAKT03E,OAAQ,SAAU9pE,GAChB,IAAKpE,KAAKmuE,cAAe,MAAO33E,KAChC,IAAIA,KAAK43E,YAAa,MAAO53E,KAC7B,IAAyB,UAArBuF,GAAGuE,eACF8D,EAAL,CACA,GAAI5N,KAAKi3E,cACP1xE,GAAG8L,IAAIxR,KAAK,yBAA0B+N,OACjC,CACL,GAAIiqE,GAAQtyE,GAAGmnB,MAAMiqD,UAAU,WAC/BkB,GAAMtkE,KAAK3F,GACXrI,GAAGmnB,MAAMgqD,UAAU,OAAQmB,GACvBA,EAAM/pE,OAAS9N,KAAKk3E,cAAcl3E,KAAK83E,cAE7C,MAAO93E,QAQT83E,YAAa,WACX,GAAI93E,KAAK43E,YAAa,MAAO53E,KAC7B,IAAI63E,GAAQtyE,GAAGmnB,MAAMiqD,UAAU,OAQ/B,OAPA1wE,cAAajG,KAAKm3E,eAElBn3E,KAAKm3E,cAAgB7wE,WAAW,WAC9Bf,GAAG8L,IAAIxR,KAAK,+BAAiCk4E,MAASF,IAAStmE,KAAK,SAAU8uB,GACxEA,GAAS96B,GAAGmnB,MAAMgqD,UAAU,cAEjC,KACI12E,MAUT8pE,QAAS,WAGP,MAFAvkE,IAAGmnB,MAAMmuB,QAAQ,gBAAiB,SAClC76C,KAAKg3E,WAAY,EACVh3E,MAaTy0B,KAAM,SAAUujD,EAAKvnD,GACnB,IAAIzwB,KAAKg3E,UAAT,CACAgB,EAAMA,GAAO,UACbA,EAAMA,EAAIjnE,aACV,IAAIwM,GAAI1P,UAAUC,MAClB,OAAO9N,MAAKi4E,KAAK/9D,UAAUC,KAAM69D,EAAKhqE,MAAMjM,UAAUoT,OAAOtV,KAAKgO,UAAW,EAAG0P,MAclFoV,QAAS,SAAUqlD,EAAKvnD,GACtB,MAAOzwB,MAAKy0B,KAAKujD,EAAKvnD,IAaxBmC,KAAM,SAAUolD,EAAKvnD,GACnB,IAAIzwB,KAAKg3E,UAAT,CACAgB,EAAMA,GAAO,UACbA,EAAMA,EAAIjnE,aACV,IAAIwM,GAAI1P,UAAUC,MAClB,OAAO9N,MAAKi4E,KAAK/9D,UAAUV,KAAMw+D,EAAKhqE,MAAMjM,UAAUoT,OAAOtV,KAAKgO,UAAW,EAAG0P,MAalFgT,MAAO,SAAUynD,EAAKvnD,GACpB,IAAIzwB,KAAKg3E,UAAT,CACAgB,EAAMA,GAAO,UACbA,EAAMA,EAAIjnE,aACV,IAAIwM,GAAI1P,UAAUC,MAClB,OAAO9N,MAAKi4E,KAAK/9D,UAAUX,MAAOy+D,EAAKhqE,MAAMjM,UAAUoT,OAAOtV,KAAKgO,UAAW,EAAG0P,MAUnF26D,iBAAkB,WAChB,GAAIL,GAAQtyE,GAAGmnB,MAAMiqD,UAAU,WAC/B,KAAK,GAAIpvE,KAAKswE,GAAO,CACnB,GAAIM,GAAON,EAAMtwE,GACb6wE,EAAK,GAAI3jE,MAAK0jE,EAAKE,MACnBC,EAAK1pE,eAAewpE,GAAInpE,MAAM,KAAK,GAAK,IAAMmpE,EAAG1oE,aAAe,IAAM0oE,EAAGG,iBAC7Ej2D,SAAQC,IAAI+1D,EAAK,IAAMH,EAAKK,MAAQ,IAAML,EAAKM,IAAM,IAAMN,EAAKO,SAGlE,MAAO14E,OAGT6iE,KAAM,WACJ7iE,KAAKk4E,oBASPr0C,KAAM,WAEJ,MADA7jC,MAAK83E,cACE93E,MAST21C,MAAO,SAAUqiC,EAAKvnD,GACpB,IAAIzwB,KAAKg3E,UAAT,CACA,GAAIvmD,GAEAlT,EAAI1P,UAAUC,MAQlB,OAPA2iB,GAAUziB,MAAMjM,UAAUoT,OAAOtV,KAAKgO,UAAW,EAAG0P,GAE1C,IAANA,IAASkT,GAAWunD,IACxBA,EAAa,IAANz6D,EAAW,UAAYy6D,EAE9BA,EAAMA,EAAIjnE,cAEH/Q,KAAKi4E,KAAK/9D,UAAUE,MAAO49D,EAAKvnD,KAWzCwnD,KAAM,SAAUZ,EAAOW,EAAKW,GAC1B,GAAI/B,EAAe52E,KAAKs3E,YAAYlsE,QAAQisE,MAAW,EAAI,MAAOr3E,KAElE,IAAIo4E,GAAK,GAAI3jE,MACT+H,EAAI5N,eAAewpE,GAAInpE,MAAM,KAAK,GAAK,IAAMmpE,EAAG1oE,aAAe,IAAM0oE,EAAGG,iBAC5Ev4E,MAAK6hB,KAAK,YAAaw1D,EAAO76D,EAAGw7D,EAAKW,EAEtC,IAAI/qE,IAAWyqE,KAAQ,GAAI5jE,MAAQgkE,IAAOT,EAAKQ,MAASnB,EAAOqB,QAAWC,EAAS1mE,KAAK,MACpF2mE,GAAap8D,EAAGw7D,GAAKh4D,OAAO24D,GAAU1mE,KAAK,IAE/C,IAA4B,OAAxB1M,GAAGC,IAAI4M,QAAQnI,KACjB,OAAQotE,GACN,IAAKn9D,WAAUX,MACb+I,QAAQiO,MAAMqoD,EACd,MACF,KAAK1+D,WAAUV,KACb8I,QAAQsQ,KAAKgmD,EACb,MACF,KAAK1+D,WAAUC,KACbmI,QAAQmS,KAAKmkD,EACb,MACF,KAAK1+D,WAAUE,MACf,QACEkI,QAAQC,IAAIq2D,OAGhBt2D,SAAQC,IAAIq2D,EAId,OADA54E,MAAK03E,OAAO9pE,GACL5N,QAMPuiB,EAAM,GAAIw0D,EACdprD,GAAOpJ,IAAM,WACXA,EAAIozB,MAAM51B,MAAMwC,EAAK1U,YAIvBhP,EAAE4C,OAAOkqB,EAAOpJ,IAAKA,GAErBje,OAAOu0E,QAAU,SAAsBC,EAAUt0D,EAAKu0D,GAMpD,MALKxzE,IAAGC,IAAIid,UAGVu2D,SAAS,UAAYtrE,OAAO,cAAeorE,EAAUt0D,EAAKu0D,IAF1Dx2D,EAAIgO,MAAM,UAAW7iB,OAAO,cAAeorE,EAAUt0D,EAAKu0D,KAIrD,IAIRz0E,OAAOumB,UAAUgrD,OAKhBvxE,OAAO+d,uBAAyB/d,OAAO20E,6BAA8B,CACvE,GAAIC,QAAS9sE,OAAO3L,GAAGK,EACvBsL,QAAO3L,GAAGK,GAAK,WAEb,MADAwhB,SAAQC,IAAI,YAAa1U,WAClBqrE,OAAOn5D,MAAM/f,KAAM6N,WAG5B,IAAIsrE,SAAU/sE,OAAO3L,GAAGI,GACxBuL,QAAO3L,GAAGI,IAAM,WAEd,MADAyhB,SAAQC,IAAI,aAAc1U,WACnBsrE,QAAQp5D,MAAM/f,KAAM6N,WAG7B,IAAIurE,aAAchtE,OAAO3L,GAAG2nD,OAC5Bh8C,QAAO3L,GAAG2nD,QAAU,WAMlB,MALK7iD,IAAGC,IAAIid,UAGVu2D,SAAS,kBAAoBnrE,UAAU,IAFvCyU,QAAQC,IAAI,iBAAkB1U,WAIzBurE,YAAYr5D,MAAM/f,KAAM6N,WAGjC,IAAIwrE,oBAAqBjtE,OAAO3L,GAAGk2C,cACnCvqC,QAAO3L,GAAGk2C,eAAiB,WAMzB,MALKpxC,IAAGC,IAAIid,UAGVu2D,SAAS,yBAA2BnrE,UAAU,IAF9CyU,QAAQC,IAAI,wBAAyB1U,WAIhCwrE,mBAAmBt5D,MAAM/f,KAAM6N;AC3W1C,cAEA,SAAW8d,GAIT,GAAI2tD,GAAU53D,WAAWjgB,QACvB83E,aAAc,KAEdh5E,KAAM,WACJ,GAAIwiB,GAAK/iB,IACT+iB,GAAGw2D,aAAej1E,OAAO+oB,SAAWA,QAAQmsD,UAExCz2D,EAAGw2D,cAELj1E,OAAOwB,iBAAiB,OAAQ,WAC9BQ,WAAW,WACThC,OAAOwB,iBAAiB,WAAY,WAClCid,EAAGlB,KAAKkB,EAAGjB,MAAM23D,UAAWp2E,OAC5B0f,EAAGlB,KAAKkB,EAAGjB,MAAM43D,aAAcr2E,MAAM+oB,UAEtC,MAYTotD,UAAW,SAAUptD,EAAOxC,EAAOpF,GACjC,GAAIzB,GAAK/iB,IACL+iB,GAAGw2D,cACAntD,EAAMxkB,OACTwkB,EAAMxkB,KAAOrC,GAAGuE,eAGlBujB,QAAQmsD,UAAUptD,EAAOxC,EAAOpF,GAChCzB,EAAGlB,KAAKkB,EAAGjB,MAAM63D,WAAYvtD,EAAOxC,EAAOpF,GAC3CzB,EAAGlB,KAAKkB,EAAGjB,MAAM43D,aAActtD,IAE/B9nB,OAAOq7B,KAAKnb,EAAK,UAWrBo1D,aAAc,SAAUxtD,EAAOxC,EAAOpF,GACpC,GAAIzB,GAAK/iB,IACL+iB,GAAGw2D,eACAntD,EAAMxkB,OACTwkB,EAAMxkB,KAAOrC,GAAGuE,eAGlBujB,QAAQusD,aAAaxtD,EAAOxC,EAAOpF,GACnCzB,EAAGlB,KAAKkB,EAAGjB,MAAM63D,WAAYvtD,EAAOxC,EAAOpF,GAC3CzB,EAAGlB,KAAKkB,EAAGjB,MAAM43D,aAActtD,KAOnCtK,OAIE63D,WAAY,YAIZF,UAAW,WAIXC,aAAc,gBAIlB/tD,GAAO0B,QAAU,GAAIisD,IACpBzuD;ACxFH,cAOA,SAAWc,GACP,GAAIkuD,GAAeluD,EAAOe,MAAMypD,MAAM10E,QACpClB,KAAM,SAAUZ,GACdK,KAAK8jB,OAAOnkB,IAUd42E,mBAAoB,WAClB,QAAUjyE,OAAwB,gBASpCkyE,YAAa,WACX,MAAIx2E,MAAKu2E,mBAA2BjyE,OAAOw1E,gBAEzCx3D,QAAQmS,KAAK,gFACNz0B,KAAKq2E,SAMlB1qD,GAAOe,MAAMqtD,YAAcpuD,EAAOe,MAAMstD,aAAe,GAAIH,IAC5Dv1E,OAAOumB;ACzCV,cAOA,SAAWc,GACT,GAAIsuD,GAActuD,EAAOe,MAAMypD,MAAM10E,QACnClB,KAAM,SAAUZ,GACdK,KAAK8jB,OAAOnkB,IAUd42E,mBAAoB,WAClB,QAAUjyE,OAAwB,gBAYpCgyE,WAAY/wE,GAAGurB,IAAI,SAAU1iB,GAC3B,GAAI2U,GAAK/iB,IACT,KACEA,KAAKw2E,cAAcF,WAAWloE,GAC9BpO,KAAK6hB,KAAK,cAAezT,GACzB,MAAOhK,GACPme,IAAIgO,MAAM,QAASnsB,GACnB2e,EAAGqzD,eAAgB,EAErB,MAAOp2E,QAaT66C,QAAS,SAAUzsC,EAAK2Q,GACtB,GAAIgE,GAAK/iB,IAET,OADA+e,GAAQlgB,EAAEwkB,OAAOtE,GACVxZ,GAAG8L,IAAIxR,KAAK,wCAA0Cq6E,UAAW9rE,EAAK+rE,WAAYp7D,IAASxN,KAAK,WACrGwR,EAAGlB,KAAK,UAAWzT,EAAK2Q,KACvBgJ,KAAK,SAAS3jB,GACfme,IAAIgO,MAAM,QAASnsB,GACnB2e,EAAGqzD,eAAgB,KAavBp6B,QAAS,SAAU5tC,GACjB,GAAI2U,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,UASf,OARAhhB,IAAG8L,IAAIxR,KAAK,wCAA0Cq6E,UAAW9rE,IAAOmD,KAAK,SAAUwN,GACrFA,EAAQlgB,EAAEsoB,UAAUpI,GACpBkE,EAAO6E,QAAQ/I,KACdgJ,KAAK,SAAU3jB,GAChB6e,EAAOiF,OAAO9jB,GACdme,IAAIgO,MAAM,QAASnsB,GACnB2e,EAAGqzD,eAAgB,IAEdnzD,GAITyzD,UAAW,SAAStoE,EAAI2Q,GACtB,MAAO/e,MAAK66C,QAAQzsC,EAAK2Q,IAG3B43D,UAAW,SAASvoE,EAAI2Q,GACtB,MAAO/e,MAAKg8C,QAAQ5tC,IAQtBooE,YAAa,WACX,MAAIx2E,MAAKu2E,mBAA2BjyE,OAAOw1E,gBAEzCx3D,QAAQmS,KAAK,gFACNz0B,KAAKq2E,SAMlB1qD,GAAOe,MAAM0tD,YAAc,GAAIH,IAC9B31E,OAAOumB;AClHV,cAEA,SAAWc,GAmCTA,EAAOoB,SAASltB,KAAO,SAAUs2C,EAAgBrxB,EAAYu1D,EAAiBC,EAA2BC,EAAeC,GACtH,MAAO7uD,GAAOoB,SAAS0tD,MAAMtkC,EAAgBrxB,GAAY,EAAMu1D,EAAiBC,EAA2BC,EAAeC,IAsB5H7uD,EAAOoB,SAASzb,SAAW,SAAU6kC,EAAgBrxB,EAAYu1D,EAAiBC,EAA2BC,EAAeC,GAC1H,MAAO7uD,GAAOoB,SAAS0tD,MAAMtkC,EAAgBrxB,GAAY,EAAOu1D,EAAiBC,EAA2BC,EAAeC,IAQ7H7uD,EAAOoB,SAAS0tD,MAAQ,SAAUtkC,EAAgBrxB,EAAY2H,EAAO4tD,EAAiBC,EAA2BC,EAAeC,GACzHrkC,GAAgB5wC,GAAGqL,MAAM,mDAAoD,iBAElF,IAAI8pE,GAAW,SAAUzpE,EAAK0pE,GAC5B1pD,UAAUhgB,EAAK0pE,GAGbN,MAAoB,IAAOA,EAAkBA,GAAmB,IAChEC,KAA8B,IAAOA,EAA4BA,GAA6B,IAClGC,EAAgBA,IAAiB,EACjCC,EAAkBA,IAAmB,CACrC,IAAI5sE,GAASkX,MAETigD,EAAW34D,OAAOma,UACtBw+C,GAAS1kC,QAAU0kC,EAASxzD,KAC5BwzD,EAASx0C,MAAQw0C,EAASh9C,KAEtBsyD,KAAoB,GACtBh9C,eAAeg9C,EAGjB,IAAIlH,GAAMt0E,EAAEqhC,MACVt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK2xB,EACLx2C,KAAMd,EAAEwkB,OAAOzV,GACf6e,MAAOA,EACPC,OAAO,EACP2T,QAAS,SAAUj5B,GACjB,MAAKA,IAQLA,EAAMA,EAAIoK,EAELgpE,GAAmC,OAAhBpzE,EAAI8kC,SAC1BwuC,EAAStzE,EAAI8kC,SAAS,GAGnB9kC,EAAIm2B,QASH+8C,KAA8B,GAChC98C,eAAe88C,EAA2B,MATvCC,GACHtpD,UAAU7pB,EAAIse,OAAO,GAEnB20D,KAAoB,GACtB78C,eAAe68C,GAEjBtV,EAAS6V,WAAWxzE,GAAMA,EAAIse,MAAOte,UAOnCy0B,kBAAkBz0B,IACtB29D,EAASl1C,YAAYzoB,GAAMA,EAAI6gB,OAAQ7gB,OA5BrC29D,EAAS6V,eAAgB,mBACrBP,KAAoB,GACtB78C,eAAe68C,MA2BlB9pD,MAAO,SAAUS,GAClB,GAAI6pD,EACJ,IAAI1kC,EAAe/qC,QAAQ,uCAAwC,EAAnE,CACOugB,EAAOoB,SAAS+O,gBAAgB9K,EAAI62C,UACvC0S,GAAgB,EAChBM,EAAoBl0E,EAAE,wBAMrB4zE,GAAeG,EAAS1pD,EAAI8pD,cAAc,EAC/C,IAAIC,IACF9yD,OAAQ,KACRsV,SAAS,EACT2O,QAAS,KACTxmB,MAAOm1D,GAAqB7pD,EAAI8pD,aAElC/V,GAAS6V,WAAWG,GAAUF,GAAqB7pD,EAAI8pD,aAAc9pD,IACjEqpD,KAAoB,GACtB78C,eAAe68C,MAMrB,OADAtV,GAASE,MAAQkO,EAAIlO,MACdF,GAITp5C,EAAOoB,SAASiuD,qBAAuB,KACvCrvD,EAAOoB,SAASkuD,uBAAyB,KAMzCtvD,EAAOoB,SAAS+O,gBAAkB,SAAUo/C,GAE1C,GAAkB,KAAdA,EACF,OAAO,CAGT,IAAkB,KAAdA,EAGF,MAFA31E,IAAGmE,GAAGylB,WAAWltB,KAAK0E,EAAE,4BACxB4b,IAAIgO,MAAM,UAAW,yBACd,CAGT,IAAkB,KAAd2qD,EAAmB,CACrB,GAAIvuE,GAASgf,EAAOoB,SAASkuD,sBAwB7B,OAvBMtuE,IAAUA,EAAOwuE,YACrBxuE,EAAOkyB,QAGJlT,EAAOoB,SAASiuD,sBAcnBruE,EAASgf,EAAOoB,SAASiuD,qBACzBruE,EAAO1K,SAdP0K,EAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,YAAahnC,MAAO,MAChD0L,EAAOpJ,GAAK,MACZoJ,EAAOyuE,kBAAmB,EAC1BzuE,EAAOihC,uBACNC,UAAU,eAAgBlnC,EAAE,gBAAiB,cAG7CknC,UAAU,UAAWlnC,EAAE,eAAgB,WACtC02B,iBACA93B,GAAGmE,GAAGpF,OAAO+2E,cAEdp5E,KAAK0E,EAAE,uBAAwBA,EAAE,+BAAgCA,EAAE,WAAY,YAMlFglB,EAAOoB,SAASiuD,qBAAuBruE,GAChC,EAEP,GAAIA,GAASgf,EAAOoB,SAASiuD,oBAc/B,OAbQruE,IAAUA,EAAOwuE,YACrBxuE,EAAOkyB,QACFlT,EAAOoB,SAASkuD,yBACnBtuE,EAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,WAC5Bt7B,EAAOyuE,kBAAmB,EAC1BzuE,EAAOihC,uBACNC,UAAU,eAAgBlnC,EAAE,OAC5B1E,KAAK0E,EAAE,yBAA0BA,EAAE,iCAAkCA,EAAE,QAAS,UAG5EgG,EAASgf,EAAOoB,SAASkuD,uBAClCtvD,EAAOoB,SAASkuD,uBAAyBtuE,GAEpC,GAUTgf,EAAOoB,SAASuuD,aAShB3vD,EAAOoB,SAASwuD,UAUhB5vD,EAAOoB,SAASg7C,UAUhBp8C,EAAOoB,SAASrC,QAUhBiB,EAAOoB,SAASyuD,iBAUhB7vD,EAAOoB,SAAS0uD,UAUhB9vD,EAAOoB,SAAS2uD,WAShB/vD,EAAOoB,SAAS7nB,YAShBymB,EAAOoB,SAAS4uD,YAShBhwD,EAAOoB,SAASgN,cAEfz1B,OAAOumB;AC7TV,cAEA,SAAWc,GAWTA,EAAOqB,UAAU4uD,QAAU,SAAUC,GACnC,GAAIC,IAAQ,CACRD,KAAgBC,GAAQ,EAE5B,IAAIn8E,IACF0kB,GAAMxlB,EAAEuzB,cAAcypD,IAAkB,GAAKpnE,OAAMusB,UAAY66C,EAC/DC,MAASA,EACTn1E,EAAK,WACH,MAAO,UAAUkW,GACf,MAAOlW,GAAE9H,EAAE2V,KAAKqI,MAOtB,OAFIhe,GAAEuzB,cAAcypD,IAAiBh9E,EAAE4C,OAAO9B,EAAMk8E,GAE7Cl8E,GAkCTgsB,EAAOqB,UAAUnpB,OAAS,SAAUk4E,EAAcC,EAAUC,EAAkBC,EAAUC,GAEtFH,EAAWA,GAAYrwD,EAAOqB,UAAU4uD,UACxCM,EAAWA,IAAY,CACvB,IAAIE,GAAYC,GAgBhB,OAdIxuE,WAAUC,OAAS,GAAG6d,EAAO/a,MAAM,oDAEvC0rE,EAAaH,GAAc5qE,KAAK,SAASgrE,GACvCC,EAAaT,EAAcG,EAAUD,GAAkB1qE,KAAK,SAAUkrE,GACpE,GAAI74E,GAAO64E,EAAS,GAAG54E,OAAOm4E,EAAUO,EACxCH,GAAUvsD,YAAY7vB,MAAO4D,MAC5BmkB,KAAK,SAAUiJ,GAChBorD,EAAUxB,WAAW56E,MAAOgxB,QAG7BjJ,KAAK,SAAUiJ,GAChBorD,EAAUxB,WAAW56E,MAAOgxB,MAGvBorD,GAUTzwD,EAAOqB,UAAUjJ,KAAO,SAAUg4D,EAAcE,EAAkBC,GAChEA,EAAWA,IAAY,CACvB,IAAIE,GAAYC,GAShB,OARIxuE,WAAUC,OAAS,GAAG6d,EAAO/a,MAAM,oDAEvC4rE,EAAaT,EAAcG,EAAUD,GAAkB1qE,KAAK,SAASmrE,GACnEN,EAAUvsD,YAAY7vB,MAAO08E,EAAU,OACtC30D,KAAK,SAAUiJ,GAChBorD,EAAUxB,WAAW56E,MAAOgxB,MAGvBorD,EAUT,IAAIC,GAAoB,WACtB,GAAID,GAAYhwE,OAAOma,UAGvB,OAFA61D,GAAU/7C,QAAU+7C,EAAU7qE,KAC9B6qE,EAAU7rD,MAAQ6rD,EAAUr0D,KACrBq0D,GAULE,EAAe,SAAUH,GAC3B,GAAIC,GAAYhwE,OAAOma,WACnBo2D,EAAgBrzE,EAAEszE,OAAOT,GACzBU,IACJ,IAAIV,IAAiBt9E,EAAEm1C,cAAcmoC,GAAe,CAElD,IAAK,GAAIW,KAAcX,GAAc,CACnC,GAAIY,GAAcZ,EAAaW,EAC/BD,GAAQtpE,KAAKipE,EAAaO,IAG5Bl+E,EAAEiwB,KAAK/O,MAAMlhB,EAAGg+E,GAAStrE,KAAK,WAI5B,IAAK,GAHDgrE,MACA18D,EAAOhhB,EAAE6jB,UAAU7U,WAEdtG,EAAG,EAAGA,EAAEsY,EAAK/R,OAAQvG,IAAK,CACjC,GAAIy1E,GAAUn9D,EAAKtY,EACnBg1E,GAASI,EAAcK,EAAQ,KAAOA,EAAQ,GAGhDZ,EAAUt0D,QAAQy0D,KACjBx0D,KAAK,SAASiJ,GACforD,EAAUt0D,QAAQkJ,SAIpBorD,GAAUt0D,WAEZ,OAAOs0D,IAULI,EAAe,SAAUT,EAAcG,EAAUD,GACnD,GAAIG,GAAYv9E,EAAE0nB,UAclB,OAbA02D,GAAqBlB,GAAcxqE,KAAK,SAAUkrE,GAChDL,EAAUt0D,SAAS20D,EAAUV,MAC5Bh0D,KAAK,WACNm1D,EAAmBnB,EAAcE,GAAkB1qE,KAAK,SAAUkrE,GAChEL,EAAUt0D,SAAS20D,EAAUV,MAC5Bh0D,KAAK,WACNo1D,EAAmBpB,EAAcG,EAAUD,GAAkB1qE,KAAK,SAAUkrE,GAC1EL,EAAUt0D,SAAS20D,EAAUV,MAC5Bh0D,KAAK,SAAUiJ,GAChBorD,EAAUl0D,QAAQ8I,EAAK+qD,UAItBK,GAULa,EAAuB,SAAUlB,GACnC,GAAI94D,GAASpkB,EAAE0nB,UACf,IAAMjiB,OAAO0oB,WAAa+uD,EAAa3wE,QAAQ,oBAAqB,EAAI,CACtE,GAAIqxE,GAAWn4E,OAAO0oB,UAClBoE,EAAO2qD,EAAa7tE,QAAQ,MAAO,KAAKA,QAAQ,gBAAiB,GAIrE,IAHgB,MAAZkjB,EAAK,KAAYA,EAAOA,EAAKtc,UAAU,IAC3C2nE,EAAWA,EAASrrD,GAEdqrD,GAAYA,EAASx8D,eAAe,KAExC,MADAgD,GAAO6E,QAAQ20D,GACRx5D,EAIX,MADAA,GAAOiF,SACAjF,GAULi6D,EAAqB,SAAUnB,EAAcE,GAC/C,GAAIh5D,GAASpkB,EAAE0nB,WACX62D,EAAS73E,GAAGmnB,MAAMsvB,QAAQ+/B,EAC9B,IAAMqB,IAAWnB,EAAkB,CACjC,GAAIQ,GAAWY,MAAMC,QAAQF,EAE7B,OADAn6D,GAAO6E,QAAQ20D,GACRx5D,EAIT,MADAA,GAAOiF,SACAjF,GAULk6D,EAAqB,SAAUpB,EAAcG,EAAUD,GACzD,GAAIh5D,GAASpkB,EAAE0nB,UASf,OARA1nB,GAAEqhC,MAAO1b,IAAK,aAAeu3D,EAActvD,OAAUyvD,EAAUxvD,MAASuvD,IAAoB1qE,KAAK,SAAUgsE,GACzG5xD,EAAOe,MAAMmuB,QAAQkhC,EAAcwB,EACnC,IAAId,GAAWY,MAAMC,QAAQC,EAC7Bt6D,GAAO6E,QAAQ20D,KACdlsD,MAAM,SAAUA,GACjBtN,EAAOiF,OAAOqI,KAGTtN,IAIR3e,OAAOumB;ACzPV,cACA,SAAWc,GAOTA,EAAO6vD,cAAcx4B,eAAiB,SAAUw6B,EAAUt7B,EAAau7B,EAAaC,EAAiBC,EAAct9C,EAASu9C,GAgB1H,MAfA7rD,aAAY,uCACV8rD,MAAOL,EACPM,YAAa57B,EACb67B,YAAaN,EACbO,gBAAiBN,EACjBO,aAAcN,GACb,SAAUv2E,GACPA,EAAIm2B,QACF8C,GACFA,EAAQj5B,GAENw2E,GACFA,EAAOx2E,MAGN,GAQTukB,EAAO6vD,cAAc0C,UAAY,SAAUC,EAAcX,EAAUY,EAAWC,EAAcC,EAAYj+C,EAASu9C,GAC/G,GAAIW,IACFC,SAAUhB,EACVz5C,SAAUs6C,EACVI,MAAOL,EACPM,aAAcP,EACdQ,WAAYL,EAYd,OATAvsD,aAAY,6BAA8BwsD,EAAS,SAAUn3E,GACvDA,EAAIm2B,QACF8C,GACFA,EAAQj5B,GAENw2E,GACFA,EAAOx2E,MAGN,IAGR9C,OAAOumB,UAAUkC;ACrDpB,cACA,SAAWpB,GAQTA,EAAO2vD,UAAUsD,yBAA2B,SAAUzlB,GACpD,GAAI3nD,GAAI3S,EAAE0nB,UAkBV,OAhBAhhB,IAAG8L,IAAIxR,KAAK,+CACVs5D,IAAKA,GACJ,GAAI,IAAI,GAAM,GAAM5nD,KAAK,SAAU5R,GACpC,GAAIk/E,GAAatkD,KAAKC,MAAM76B,GAExBi/D,IACJigB,GAAWrrE,QAAQ,SAAU3M,EAAMyyD,GACjC,GAAIn1C,GAAO,GAAI5e,IAAG6e,KAAKvd,EAAKtD,GAAI6M,YAAYK,iBAAkB5J,EAAKuuC,SACnEjxB,GAAW,KAAItd,EAAKoD,KACpB20D,EAAM/3D,EAAKtD,IAAM4gB,IAEnB3S,EAAEsW,QAAQ82C,KACT72C,KAAK,SAAUiJ,GAChBxf,EAAE0W,OAAO8I,KAGJxf,EAAE2W,WAgBXwD,EAAO2vD,UAAUwD,aAAe,SAAUz3B,EAAe03B,GACvD,MAAOpzD,GAAO9rB,KAAK,gCAEf0kB,cAAiB8iC,EACjB23B,SAAYD,GAEdp4E,EAAE,oBACFA,EAAE,4BAA4BohB,KAAK,WACjC8C,UAAUiC,WAAWmC,cAAc8b,MAAMjpC,aAc/C6pB,EAAO2vD,UAAU2D,wBAA0B,SAAU53B,EAAe63B,EAAeC,EAAWC,GAC5F,MAAOzzD,GAAO9rB,KAAK,2CACjB0kB,cAAiB8iC,EACjB1gC,cAAiBu4D,EACjBG,iBAAoBD,GAAwB,GAC5CE,QAAWH,KAafxzD,EAAO2vD,UAAUiE,UAAY,SAAUl4B,EAAem4B,EAAUC,EAAmBL,GACjF,MAAOzzD,GAAO9rB,KAAK,6BACjB0kB,cAAiB8iC,EACjB1gC,cAAiB84D,GAAqB,GACtCJ,iBAAoBD,GAAwB,GAC5CM,SAAYF,KAchB7zD,EAAO2vD,UAAUqE,gBAAkB,SAAUt4B,EAAeu4B,EAAYH,EAAmBL,GACzF,MAAOzzD,GAAO9rB,KAAK,mCACjB0kB,cAAiB8iC,EACjB1gC,cAAiB84D,GAAqB,GACtCJ,iBAAoBD,GAAwB,GAC5CvmC,KAAQ+mC,KAgBZj0D,EAAO2vD,UAAUuE,WAAa,SAAUx4B,EAAem4B,EAAUM,EAAgBL,EAAmBL,GAClG,MAAOzzD,GAAO9rB,KAAK,8BACjB0kB,cAAiB8iC,EACjB1gC,cAAiB84D,GAAqB,GACtCJ,iBAAoBD,GAAwB,GAC5CM,SAAYF,EACZO,WAAcD,GAAkB,MAapCn0D,EAAO2vD,UAAU0E,aAAe,SAAU34B,EAAem4B,EAAUC,EAAmBL,GACpF,MAAOzzD,GAAO9rB,KAAK,gCACjB0kB,cAAiB8iC,EACjB1gC,cAAiB84D,GAAqB,GACtCJ,iBAAoBD,GAAwB,GAC5CM,SAAYF,KAYhB7zD,EAAO2vD,UAAU2E,oBAAsB,SAAU54B,GAC/C,MAAO17B,GAAO9rB,KAAK,uCACjB0kB,cAAiB8iC,MAKpB/iD,OAAOumB,UAAUkC;ACvKpB,cACA,SAAWpB,GAcTA,EAAO4vD,OAAO2E,IAAM,SAAUC,EAAYC,GACxC,MAAOz0D,GAAO9rB,KAAK,oBAAsBg5C,KAAQsnC,EAAY7jD,OAAU8jD,KAoBzEz0D,EAAO4vD,OAAO8E,sBAAwB,SAAUF,EAAYp7D,GAC1D,MAAO4G,GAAO9rB,KAAK,sCAAwCg5C,KAAQsnC,EAAYt5D,eAAkB9B,MAGlGzgB,OAAOumB,UAAUkC;ACxCpB,cACA,SAAWpB,GAcTA,EAAOo8C,OAAOuY,cAAgB,SAAU/iC,EAAKgjC,GAC3C,MAAO50D,GAAO9rB,KAAK,8BACjBs/B,KAAQoe,EAAInf,KACZ/Z,GAAMk5B,EAAIh6C,GACVg9E,WAAcA,IACb,GAAO,KAIXj8E,OAAOumB,UAAUkC;ACxBpB,cACA,SAAWpB,GAWTA,EAAO+vD,QAAQ8E,eAAiB,SAAUC,GACxC,MAAO90D,GAAO9rB,KAAK,iCAAmC6gF,SAAUD,IAAY,GAAO,IAmBrF90D,EAAO+vD,QAAQiF,gBAAkB,SAAUC,GAEzC,MAAOj1D,GAAO9rB,KAAK,iCAAmCghF,WAAYD,IAAc,GAAO,IAoBzFj1D,EAAO+vD,QAAQoF,SAAW,SAAUC,EAAWC,GAE7C,OAAQ3gD,SAAW,EAAO1N,QAAW,0BAsBvChH,EAAO+vD,QAAQuF,eAAiB,SAAUC,EAAWC,EAAiBC,GACpE,OAAQ/gD,SAAW,EAAO1N,QAAW,0BAkBvChH,EAAO+vD,QAAQ2F,kBAAoB,SAAU9nC,EAAe+nC,EAAUC,GAClE,MAAO51D,GAAO9rB,KAAK,mCAAoCsqE,SAAUmX,EAAUE,WAAYD,EAAY/6D,cAAe+yB,IAAiB,GAAO,IAiB9I5tB,EAAO+vD,QAAQ+F,qBAAuB,SAAUH,GAC9C,MAAO31D,GAAO9rB,KAAK,sCAAwCsqE,SAAUmX,IAAY,GAAO,IAc1F31D,EAAO+vD,QAAQgG,YAAc,SAAUzuD,EAAO0uD,EAAU/mC,GAEtD,IAAK,GADDr5C,MACKgG,EAAI,EAAGA,EAAI0rB,EAAMnlB,OAAQvG,IAChChG,EAAMgG,GAAK0rB,EAAM1rB,GAAGkf,aAEtB,IAAI7Y,IACFksC,MAAOv4C,EACPw4C,SAAU4nC,EACV1nC,WAAY/pC,mBAAmB0qC,GAIjC,OADAr4B,KAAIqQ,KAAK,eAAgB/zB,EAAEwkB,OAAOzV,IAC3B+d,EAAO9rB,KAAK,4BAA6B+N,GAAQ,GAAO,IAcjE+d,EAAO+vD,QAAQkG,WAAa,SAAU3uD,EAAO4uD,EAAQhmC,GAEnD,IAAK,GADDt6C,MACKgG,EAAI,EAAGA,EAAI0rB,EAAMnlB,OAAQvG,IAChChG,EAAMgG,GAAK0rB,EAAM1rB,GAAGkf,aAEtB,IAAI7Y,IACFksC,MAAOv4C,EACPi5C,OAAQqnC,EACRpnC,SAAUvqC,mBAAmB2rC,GAK/B,OAFAt5B,KAAIqQ,KAAK,cAAe/zB,EAAEwkB,OAAOzV,IAE1B+d,EAAO9rB,KAAK,gCAAkCi6C,MAAOv4C,EAAOi5C,OAAQqnC,EAAQpnC,SAAUvqC,mBAAmB2rC,KAAa,GAAO,KAIrIv3C,OAAOumB,UAAUkC;AC7KpB,cACA,SAAWpB,GAoBTA,EAAOjB,KAAKo3D,0BAA4B,SAAUC,GAChD,MAAOp2D,GAAOra,SAAS,wCACrB0wE,YAAaD,IACZ,GAAO,IAeZp2D,EAAOjB,KAAKu3D,qBAAuB,SAAUC,EAAQ5yC,GACnD,MAAO3jB,GAAOra,SAAS,mCACrBuwB,OAAQqgD,EAAQC,OAAQ7yC,IACvB,GAAO,GAAO,KAIlBhrC,OAAOumB,UAAUkC;AC9CpB,cACA,SAAWpB,GAcTA,EAAO8vD,OAAO2G,uBAAyB,SAAUp1C,EAAUq1C,GACzD,MAAO12D,GAAO9rB,KAAK,uCACjBytC,SAAYN,EACZuzC,WAAc8B,IACb,GAAO,KAIX/9E,OAAOumB,UAAUkC;ACvBpB,YAcA,IAAIu1D,gBAEFC,QAAS,EAETC,UAAW,EAEXC,OAAQ,EAERC,SAAU,IAGZ,SAAW/2D,GAQTA,EAAOzmB,SAASs4C,WAOhB7xB,EAAOzmB,SAASy9E,YAAc,SAAUxpB,GACtC,GAAI3nD,GAAI3S,EAAE0nB,UAeV,OAbAhhB,IAAG8L,IAAIxR,KAAK,wCACVs5D,IAAKA,GACJ,GAAI,IAAI,GAAM,GAAM5nD,KAAK,SAAU5R,GACpC,GAAIijF,GAAO/jF,EAAEsoB,UAAUxnB,EACnBijF,IAAQA,EAAK90E,OAAS,EACxB0D,EAAEsW,QAAQ86D,EAAK,GAAG34E,MAElBuH,EAAE0W,OAAOvhB,EAAE,2BAEZohB,KAAK,SAAUiJ,GAChBxf,EAAE0W,OAAO8I,KAGJxf,EAAE2W,WAkBXwD,EAAOzmB,SAASs4C,QAAQqlC,QAAU,SAAUC,EAAOC,EAAWC,GAC5D,MAAOr3D,GAAO9rB,KAAK,oCACjBikC,WAAcg/C,EACdxjC,cAAiByjC,EACjBE,KAAQD,IACP,GAAO,IAmBZr3D,EAAOzmB,SAASs4C,QAAQ0lC,SAAW,SAAUJ,EAAOC,EAAW32D,GAC7D,MAAOT,GAAO9rB,KAAK,qCACjBikC,WAAcg/C,EACdxjC,cAAiByjC,EACjBI,MAAS/2D,IACR,GAAO,KAIX9nB,OAAOumB,UAAUkC;AC3GpB,cACA,SAAWpB,GAcTA,EAAOgwD,SAASyH,eAAiB,SAAU7lC,EAAKl4B,EAAY8e,EAAMk/C,EAAWzrD,EAAWnP,EAAQyzD,GAC9F,GAAIoH,GAAYpH,KAAa,EAAQvwD,EAAOra,SAAWqa,EAAO9rB,IAC9D,OAAOyjF,GAAS,iCACdC,IAAKhmC,EACLuK,WAAYziC,MACZm+D,KAAMr/C,EACNs/C,UAAWJ,EACXr6C,OAAQvgB,IACP,GAAO,IAiBZkD,EAAOgwD,SAAS+H,aAAe,SAAUnmC,EAAKl4B,EAAY8e,EAAMk/C,EAAWM,EAAa/rD,EAAWnP,EAAQyzD,GACzG,GAAIoH,GAAYpH,KAAa,EAAQvwD,EAAOra,SAAWqa,EAAO9rB,IAC9D,OAAOyjF,GAAS,+BACdC,IAAKhmC,EACLimC,KAAMr/C,EACNs/C,UAAWJ,EACXO,YAAaD,EACb36C,OAAQvgB,EACRq/B,WAAYziC,QACT,GAAO,IAiBdsG,EAAOgwD,SAASkI,eAAiB,SAAUtmC,EAAKpZ,EAAMk/C,EAAWS,EAAO5H,GACtE,GAAIoH,GAAYpH,KAAa,EAAQvwD,EAAOra,SAAWqa,EAAO9rB,IAC9D,OAAOyjF,GAAS,iCACdC,IAAKhmC,EACLimC,KAAMr/C,EACNs/C,UAAWJ,EACXU,MAAOD,IACN,GAAO,IAiBZn4D,EAAOgwD,SAAS93C,KAAO,SAAU0Z,EAAKpZ,EAAMnN,EAAMzO,EAAKy7D,EAAgBC,GACrE,MAAOt4D,GAAO9rB,KAAK,uBACjB0jF,IAAKhmC,EACLimC,KAAMr/C,EACN+/C,IAAKltD,EACLmtD,IAAK57D,EACL67D,eAAgBJ,EAChBK,gBAAiBJ,IAChB,GAAO,GAAO,GAAM,IAezBt4D,EAAOgwD,SAASt3C,cAAgB,SAAUkZ,EAAKpZ,EAAMnN,EAAMzO,EAAKy7D,EAAgB//C,GAC9E,MAAOtY,GAAO9rB,KAAK,gCACjB0jF,IAAKhmC,EACLimC,KAAMr/C,EACN+/C,IAAKltD,EACLmtD,IAAK57D,EACL67D,eAAgBJ,EAChBM,mBAAuBrgD,GAAsBA,EAAmB1gC,GAAK0gC,EAAmBxd,cAAgB,OACvG,GAAO,GAAO,GAAM,KAIxBniB,OAAOumB,UAAUkC;AC7HpB,cACA,SAAWpB,GASTA,EAAO44D,MAAQ,SAAU7/C,GACvB,MAAO7Z,WAAUkC,SAASltB,KAAK,yBAA2B2kF,MAAS9/C,KAWrE/Y,EAAO84D,UAAY,SAAU//C,GAC3B,MAAO7Z,WAAUkC,SAASzb,SAAS,yBAA2BkzE,MAAS9/C,MAGxEpgC,OAAOumB,UAAUkC,SAASgN;AC1B7B,cAEA,SAAWpO,GAiBLA,EAAOmB,WAAWhH,WAQlB6F,EAAOmB,WAAWhH,QAAQ4+D,iBAAmB,WAC3C,GAAIC,GAAO,SAAUl0D,GACW,IAA1B5xB,EAAE,aAAaiP,QACjBmgC,kBAAmBxmC,KAAMgpB,EAASxvB,MAAO,IAAK+C,OAAQ,QAAUutB,QAGpE,OADAozD,GAAKh+E,EAAE,iBACAglB,EAAOmB,WAAWhH,SAU3B6F,EAAOmB,WAAWhH,QAAQ8+D,iBAAmB,SAAUC,EAAYthF,EAAIm1C,GACrEosC,iBAAiBD,EAAYthF,EAAIm1C,IASnC/sB,EAAOmB,WAAWi4D,SASlBp5D,EAAOmB,WAAWxD,SASlBqC,EAAOmB,WAAWxD,MAAMjE,cAS1BsG,EAAOmB,WAAWgH,YAUlBnI,EAAOmB,WAAWgH,SAASd,WAQ3BrH,EAAOmB,WAAWgH,SAASpnB,QAQ3Bif,EAAOmB,WAAWgH,SAASsmB,cAO3BzuB,EAAOmB,WAAWgH,SAASpnB,KAAK2Y,cAShCsG,EAAOmB,WAAWgH,SAASpnB,KAAK2Y,WAAW2/D,YAO3Cr5D,EAAOmB,WAAWgH,SAASN,cAQ3B7H,EAAOmB,WAAWgH,SAASrnB,WAS3Bkf,EAAOmB,WAAWgH,SAAStnB,WAQ3Bmf,EAAOmB,WAAWmC,cAAgBtD,EAAOmB,WAAWsW,OAQpDzX,EAAOmB,WAAWm4D,UAAYt5D,EAAOmB,WAAWo4D,MAQhDv5D,EAAOmB,WAAWm4D,UAAUE,eAS5Bx5D,EAAOmB,WAAWm4D,UAAUE,YAAYC,aAQzCz5D,EAAOmB,WAAWm4D,UAAUE,YAAYE,YAQvC15D,EAAOmB,WAAWm4D,UAAUE,YAAYC,UAAUE,YAChDC,qBAAsB,SAAUC,EAASniF,GACvC,GAAIoiF,GAAM5mF,EAAE2mF,GACR53E,GAAU63E,EAAI1gD,GAAG,YAAa0gD,EAAIxxE,MAAOwxE,EAAIh+E,OAAQg+E,EAAI9lF,KAAK,QAElE,OADA8lF,GAAI7jF,QAAQ,cAAcwmD,QAAQ/kD,EAAOuK,IAClC,GAGT83E,eACE3vE,IAAK,MACL4vE,MAAO,QACPC,QAAS,WAGXC,oBACEC,UAAW,YACXC,MAAO,QACPC,SAAU,WACVC,UAAW,YACXC,WAAY,aACZC,UAAW,eAKhB7hF,OAAOumB;AC5NV,cACA,SAAqCc,GASnCA,EAAOy6D,iBAAmB1kE,WAAWjgB,QACnCT,SAAU,KAEVT,KAAM,SAAU05B,GACdj6B,KAAK8jB,OAAOmW,GACZj6B,KAAKgB,aAWP+iB,KAAM,SAAUsiE,GACd,GAAIpjE,GAASpkB,EAAE0nB,WACX5mB,IAGJ,OADAsjB,GAAO6E,QAAQnoB,GACRsjB,EAAOkF,WAWhBm+D,WAAY,SAAU3rD,GACpB,GAAI1X,GAASpkB,EAAE0nB,WACX2U,EAAQ,CAGZ,OADAjY,GAAO6E,QAAQoT,GACRjY,EAAOkF,WAWhBo+D,UAAW,WACT,GAAItjE,GAASpkB,EAAE0nB,WACX6F,IAGJ,OADAnJ,GAAO6E,QAAQsE,GACRnJ,EAAOkF,WAWhBq+D,UAAW,SAAUp6D,GACnB,GAAInJ,GAASpkB,EAAE0nB,WACXkgE,GAAqB,CAGzB,OADAxjE,GAAO6E,QAAQ2+D,GACRxjE,EAAOkF,WAUhBu+D,eAAgB,SAAUL,GAExB,MAAOxnF,GAAE4C,UAAWzB,KAAKgB,SAAUqlF,OAItC9gF,GAAGygB,IAAIi/D;CC/FV,SAA8Bt5D,GAC5B,YAEA,IAAIg7D,GAAW,MACXC,GACFC,WAAY,gDACZC,YAAa,iDACbC,WAAY,6CAEVC,EAAc,GAmBdC,EAAoBt7D,EAAOs7D,kBAAoBvlE,WAAWjgB,QAAQ8D,GAAG2nB,OAAO8E,cAC9E9e,UAAW,oBACXg0E,WAAY,KACZC,eAAgB,KAChBlzD,kBAAmB,KACnBigB,aAAc,KACd9nB,SACAy6C,SAAU,IAEV7yC,YAAa,KACbozD,eAAgB,KAChBC,OAAQ,KACRC,QAAS,KACTC,KAAM,KACNC,SAAU,KACVC,mBAAoB,KAEpBC,gBAAiB,KAEjBnnF,KAAM,SAAU0zB,EAAmBigB,EAAclzC,GAC/C,GAAI+hB,GAAK/iB,IAET+iB,GAAGe,SACHf,EAAGqJ,OACDu7D,oBAGF5kE,EAAGqJ,MAAQvtB,EAAE4C,UAAWshB,EAAGqJ,MAAOprB,GAElC+hB,EAAGmxB,aAAeA,EAClBnxB,EAAGmkE,WAAaz1E,mBAChBsR,EAAGokE,eAAiB11E,mBACpBsR,EAAGkR,kBAAoBA,EACvBlR,EAAGiR,YAAcn1B,EAAEo1B,GACnBlR,EAAG6kE,WAWLA,QAAS,WACP,GAAI7kE,GAAK/iB,IACMuF,IAAGynB,UAAUnpB,OAAO+iF,EAAUC,YAC3CxiE,GAAItB,EAAGmkE,WACPW,aAAc9kE,EAAG+kE,mBAChBv2E,KAAK,SAAU3N,GAChBmf,EAAGiR,YAAYpwB,KAAKA,GACpBmf,EAAGglE,gBACHhlE,EAAGilE,eAEL,OAAOjlE,IAWT+kE,eAAgB,WACd,GAAI/kE,GAAK/iB,IACT,OAAS+iB,GAAGqJ,MAAMu7D,iBAAmB5kE,EAAGqJ,MAAMu7D,gBAAgB75E,QAAYiV,EAAGqJ,MAAM67D,oBAAsBllE,EAAGqJ,MAAM67D,mBAAmBn6E,OAAW64E,EAAW5jE,EAAGqJ,MAAM87D,MAWtKH,cAAe,WACb,GAAIhlE,GAAK/iB,IAGT,OAFA+iB,GAAGqkE,eAAiBvoF,EAAE,kBAAmBkkB,EAAGkR,mBAC5ClR,EAAGukE,QAAUzoF,EAAE,cAAekkB,EAAGkR,mBAC1BlR,GAWTilE,YAAa,WACX,GAAIjlE,GAAK/iB,IA8BT,OA7BA+iB,GAAGqkE,eAAenkF,MAAMpE,EAAEiI,MAAMic,EAAGolE,SAAUplE,IAC7CA,EAAGukE,QAAQxmF,GAAG,SAAUjC,EAAEiI,MAAMic,EAAGqlE,WAAYrlE,IAC/CA,EAAGukE,QAAQxmF,GAAG,QAASjC,EAAEiI,MAAMic,EAAGslE,cAAetlE,IACjDA,EAAGukE,QAAQxmF,GAAG,OAAQjC,EAAEiI,MAAMic,EAAGulE,cAAevlE,IAChDA,EAAGukE,QAAQxmF,GAAG,QAASjC,EAAEiI,MAAMic,EAAGwlE,cAAexlE,IAG7CA,EAAGqJ,MAAMo8D,QAAmC,SAAzBzlE,EAAGqJ,MAAMo8D,OAAO5gF,MAErCmb,EAAGukE,QAAQxmF,GAAG,sBAAuB,SAAUsD,GAC7C,GAAIgK,GAAMhK,EAAE+lD,OAAS/lD,EAAEo+C,OAEvB,IAAY,KAARp0C,EAAY,CACd,GAAI4F,GAAM+O,EAAGukE,QACTh5E,EAAOwB,cAAckE,EACzBA,GAAIC,IAAI5F,WAAWC,IACnB0F,EAAIs/B,SACJvwB,EAAG8b,QAGL,IAAa,KAARzwB,GAAsB,MAARA,IAAgBhK,EAAEqkF,QAAS,CAC5C,GAAIz0E,GAAM+O,EAAGukE,OACbtzE,GAAIC,IAAI5F,WAAW,GAAIoG,QACvBT,EAAIs/B,SACJvwB,EAAG8b,WAKF9b,GAWTwlE,cAAe,SAAUnkF,EAAGoN,GAC1B,GAAIuR,GAAK/iB,KACL0oF,EAAWtkF,EAAE+lD,OAAS/lD,EAAEo+C,OAI5B,OAHiB,MAAbkmC,GACF3lE,EAAGukE,QAAQl/B,QAAQ,UAEdrlC,GAUTslE,cAAe,WACb,GAAItlE,GAAK/iB,IAET,OADI+iB,GAAGukE,QAAQrzE,QAAU0yE,GAAU5jE,EAAGukE,QAAQrzE,IAAI,IAC3C8O,GAWTulE,cAAe,WACb,GAAIvlE,GAAK/iB,IAET,OADI+iB,GAAGqJ,MAAMu7D,iBAAmB5kE,EAAGqJ,MAAMu7D,gBAAgB75E,QAAQiV,EAAGukE,QAAQrzE,IAAI0yE,GACzE5jE,GAWT4lE,kBAAmB,WACjB,GAAI5lE,GAAK/iB,IAMT,OALA+iB,GAAG6lE,OAAS/pF,EAAE,IAAMkkB,EAAGokE,gBACvBpkE,EAAGskE,OAAStkE,EAAG6lE,OAAO1kF,KAAK,cAC3B6e,EAAG0kE,mBAAqB1kE,EAAG6lE,OAAO1kF,KAAK,MACvC6e,EAAGwkE,KAAOxkE,EAAG6lE,OAAO1kF,KAAK,SACzB6e,EAAGykE,SAAWzkE,EAAG6lE,OAAO1kF,KAAK,aACtB6e,GAWT8lE,gBAAiB,WACf,GAAI9lE,GAAK/iB,IAQT,OAPA+iB,GAAG6lE,OAAO9nF,GAAG,UAAW,SAAU3B,EAAIupD,EAAW3pC,EAAO2jD,EAAS96D,GAC/Dmb,EAAGlB,KAAKolE,EAAkBnlE,MAAMgnE,YAAapgC,EAAW3pC,EAAO2jD,EAAS96D,KAE1Emb,EAAGwkE,KAAKzmF,GAAG,QAASjC,EAAEiI,MAAMic,EAAGgmE,WAAYhmE,IAC3CA,EAAGykE,SAAS1mF,GAAG,QAASjC,EAAEiI,MAAMic,EAAG8b,MAAO9b,IAC1CA,EAAG0kE,mBAAmB3mF,GAAG,SAAUjC,EAAEiI,MAAMic,EAAGimE,cAAejmE,IAEtDA,GAWTkmE,oBAAqB,WAEnB,MADArqF,aAAYkD,UACLihB,IAWTo4D,SAAU,WACR,GAAIp4D,GAAK/iB,KACLkpF,EAAQrqF,EAAE,IAAMkkB,EAAGokE,eACvB,SAAS+B,EAAMp7E,QAWjBq6E,SAAU,WACR,GAAIplE,GAAK/iB,IACT,OAAI+iB,GAAGo4D,eACLp4D,GAAG8b,SAIL9b,EAAGqJ,MAAMviB,KAAO,EAChBkZ,EAAGqJ,MAAM+8D,KAAO,EAEhBpmE,EAAG2kE,gBAAkBphF,WAAW,WAC9Byc,EAAGqkE,eAAe1nF,SAAS,wCAC1B,KAEHqjB,EAAGmxB,aAAanwB,KAAKhB,EAAGqJ,OAAO7a,KAAK,SAAU63E,GAC5CnjF,aAAa8c,EAAG2kE,iBAChB3kE,EAAGqkE,eAAe9nF,YAAY,sCAE9B,IAAIi9E,IACF8M,WAAYzC,EAAUE,aAGpBwC,EAAe,KACfC,EAAW1qF,EAAEyF,QAAQrD,QACrBuoF,EAAiBD,GAAYxmE,EAAGiR,YAAY7zB,SAASiD,KAAO2f,EAAGiR,YAAYqtC,aAE3EkoB,GAAWC,EAAgBzmE,EAAG8jD,WAChCyiB,EAAevmE,EAAGiR,YAAY7zB,SAASiD,MAEnB,IAAlBomF,GAAwC,OAAjBF,IACzBE,EAAgB,GAGlBzmE,EAAGlB,KAAKolE,EAAkBnlE,MAAM2nE,iBAAkB1mE,EAAIqmE,EACvC7jF,IAAGynB,UAAUnpB,OAAO+iF,EAAUG,YAEzCG,WAAYnkE,EAAGokE,eACf9wD,OAAQ+yD,EACRv3C,OAAQlrC,EAAE,MACVy6C,WAAYz6C,EAAE,UACd+iF,SAAU/iF,EAAE,QACZxB,UACE2hC,MAAO0iD,EACPpmF,KAAMkmF,EACN7mF,IAAKsgB,EAAGiR,YAAY7zB,SAASsC,IAAMsgB,EAAGiR,YAAY2yC,cAClD1lE,MAAO8hB,EAAGiR,YAAY/yB,QACtB4lE,SAAU9jD,EAAG8jD,WAEd,KAAM,KAAM0V,GAAUhrE,KAAK,SAAU3N,GACtC/E,EAAE,QAAQG,OAAO4E,GACjBmf,EAAG4lE,oBACH5lE,EAAG8lE,sBAGF9lE,IAWTimE,cAAe,SAAU3lF,EAAO1D,GAC9B,GAAIojB,GAAK/iB,KACLkK,EAAO7G,EAAM8C,OACbwjF,EAAQ5mE,EAAG0kE,kBAKf,OAHIkC,GAAM9kF,YAAc8kF,EAAM7kF,eAAiBoF,EAAK0/E,aAAe5C,GACjEjkE,EAAG8mE,iBAEE9mE,GAWT8mE,eAAgB,WACd,GAAI9mE,GAAK/iB,IACT,KAAI+iB,EAAGqJ,MAAM09D,UAAb,CAEA/mE,EAAGqJ,MAAMviB,OACTkZ,EAAGqJ,MAAM09D,WAAY,EACrB/mE,EAAGqJ,MAAM+8D,KAAOpmE,EAAGqJ,MAAM29D,KAAOhnE,EAAGqJ,MAAMviB,IAEzC,IAAIyxD,GAAUh1D,WAAW,WACvByc,EAAGskE,OAAO2C,OAAO,MAChB,IAEHjnE,GAAGmxB,aAAanwB,KAAKhB,EAAGqJ,OAAO7a,KAAK,SAAU63E,GAC5CrmE,EAAGlB,KAAKolE,EAAkBnlE,MAAMmoE,sBAAuBb,EAASrmE,GAChEA,EAAGqJ,MAAM09D,WAAY,EACrB7jF,aAAaq1D,GAEbv4C,EAAGskE,OAAO6C,QAAQ,KAClB5gF,EAAE8/E,GAASrpF,KAAK,SAAUoqF,GAGxB5kF,GAAGynB,UAAUnpB,OAAO+iF,EAAUE,YAAaqD,GAAQ,GAAO,GAAM54E,KAAK,SAAU4mE,GAC7Ep1D,EAAG0kE,mBAAmBzoF,OAAOm5E,WAerCiQ,WAAY,WACV,GAAIrlE,GAAK/iB,KACLoqF,EAAernE,EAAGukE,QAAQrzE,QAAU0yE,EAAY5jE,EAAGukE,QAAQrzE,MAAQ,GACnEuzC,EAAezkC,EAAGqJ,MAAMu7D,gBAAgB75E,OAASiV,EAAGqJ,MAAM67D,mBAAmBn6E,MAKjF,OAJAiV,GAAGqJ,MAAMu7D,mBACT5kE,EAAGqJ,MAAM67D,sBACTllE,EAAGqJ,MAAMi+D,cAAe,EAEnBtnE,EAAGunE,cAAcF,KAKlBrnE,EAAGqJ,MAAM87D,OAASkC,GAAe5iC,EAAe,KAClDzkC,EAAGqJ,MAAM87D,KAAOkC,EAChBrnE,EAAGlB,KAAKolE,EAAkBnlE,MAAMyoE,cAAexnE,EAAG0W,aAE7C1W,IARLA,EAAGukE,QAAQrzE,IAAI,IACR8O,IAkBXunE,cAAe,SAAUvrE,GACvB,GAAIgE,GAAK/iB,IACT,QAAQ+iB,EAAGqJ,MAAMo8D,OAAO5gF,MACtB,IAAK,UACH,OAAQ0+D,OAAOvnD,EACjB,KAAK,QACH,OAAQunD,OAAOvnD,EAAMhB,WAAW,IAAK,MAEzC,OAAO,GAWTgrE,WAAY,WACV,GAAIhmE,GAAK/iB,IACT+iB,GAAGqJ,MAAMu7D,gBAAkB5kE,EAAGqJ,MAAMu7D,oBACpC5kE,EAAGqJ,MAAM67D,mBAAqBllE,EAAGqJ,MAAM67D,uBAGvCllE,EAAGqJ,MAAMu7D,gBAAkBr+E,EAAEA,EAAEyZ,EAAGqJ,MAAMu7D,iBAAiBrrE,IAAI,SAAU6tE,EAAQ7wB,GAC7E,GAAIkxB,GAAUznE,EAAG6lE,OAAO1kF,KAAK,KAAO,GAAKimF,EAAOroD,OAAOnjB,iBAAmB,eAC1E,OAAI6rE,GAAQ18E,SAAW08E,EAAQzlD,GAAG,YAChC,OAEOhiB,EAAGqJ,MAAMu7D,gBAAgBruB,MAEhCmxB,UAIJ1nE,EAAGqJ,MAAM67D,mBAAqB3+E,EAAEA,EAAEyZ,EAAGqJ,MAAM67D,oBAAoB3rE,IAAI,SAAU6tE,EAAQ7wB,GACnF,GAAIkxB,GAAUznE,EAAG6lE,OAAO1kF,KAAK,KAAO,GAAKimF,EAAOroD,OAAOnjB,iBAAmB,eAC1E,OAAI6rE,GAAQ18E,QAAU08E,EAAQzlD,GAAG,YAC/B,OAEOhiB,EAAGqJ,MAAM67D,mBAAmB3uB,MAEnCmxB,SAKJ,IAAIhjE,GAAU,SAAU1I,EAAO2rE,GAC7B,MAAIA,KACOphF,EAAEyZ,EAAGqJ,MAAM67D,oBAAoB/jF,KAAK,SAAU8N,GAAK,MAAOA,GAAE8vB,QAAU/iB,MAEtEzV,EAAEyZ,EAAGqJ,MAAMu7D,iBAAiBzjF,KAAK,SAAU8N,GAAK,MAAOA,GAAE8vB,QAAU/iB,IAsChF,OAhCAgE,GAAG6lE,OAAO1kF,KAAK,gCAAgCnE,KAAK,WAClD,GAAIgf,GAAQlgB,EAAEmB,MAAMiU,KACfwT,GAAQ1I,GAAO,IAClBgE,EAAGqJ,MAAMu7D,gBAAgBp0E,MACvB+Q,KAAMzlB,EAAEmB,MAAML,KAAK,QACnBmiC,MAAO/iB,EACP4rE,aAAc9rF,EAAEmB,MAAM+E,KAAK,aAMjCge,EAAG6lE,OAAO1kF,KAAK,sCAAsCnE,KAAK,WACxD,GAAIgf,GAAQlgB,EAAEmB,MAAMiU,KACfwT,GAAQ1I,GAAO,IAClBgE,EAAGqJ,MAAM67D,mBAAmB10E,MAC1B+Q,KAAMzlB,EAAEmB,MAAML,KAAK,QACnBmiC,MAAO/iB,EACP4rE,aAAc9rF,EAAEmB,MAAM+E,KAAK,aAK7Bge,EAAGqJ,MAAMu7D,iBAAmB5kE,EAAGqJ,MAAMu7D,gBAAgB75E,OACvDiV,EAAGukE,QAAQrzE,IAAI0yE,GAEf5jE,EAAGukE,QAAQrzE,IAAI,IAGjB8O,EAAGqJ,MAAM87D,KAAO,GAChBnlE,EAAG8b,QACH9b,EAAGlB,KAAKolE,EAAkBnlE,MAAMyoE,cAAexnE,EAAG0W,YAC3C1W,GAYT6nE,YAAa,SAAUC,GACrB,GAAI9nE,GAAK/iB,IAIT,OAHAnB,GAAE4C,OAAOshB,EAAGqJ,MAAOy+D,GACnB9nE,EAAGukE,QAAQrzE,IAAI8O,EAAG+kE,kBAClB/kE,EAAG8b,QACI9b,GAWT8b,MAAO,WACL,GAAI9b,GAAK/iB,IACT,IAAK+iB,EAAGwkE,KAIR,MAHAxkE,GAAGwkE,KAAK1mF,IAAI,SACZkiB,EAAGykE,SAAS3mF,IAAI,SAChBkiB,EAAG6lE,OAAOl4C,SACH3tB,GAWT0W,SAAU,WACR,GAAI1W,GAAK/iB,KACL8qF,EAAc/nE,EAAGqJ,MAAMu7D,iBAAmB5kE,EAAGqJ,MAAMu7D,gBAAgB75E,OAAU,KAAO,OACpFi9E,EAAW,KAEXC,EAAajoE,EAAGqJ,MAAMo8D,OAAO5gF,IAEZ,WAAfojF,GAA2C,YAAfA,GAA8C,SAAfF,IAC3D/nE,EAAGqJ,MAAM87D,OACXnlE,EAAGqJ,MAAM87D,KAAOnlE,EAAGqJ,MAAM87D,KAAKnqE,WAAW,IAAK,MAEhD+sE,EAAa,QACbC,EAAWlsF,EAAE2V,KAAKuO,EAAGqJ,MAAM87D,MAG7B,IAAInpE,IACFksE,KAAQpsF,EAAE2V,KAAKuO,EAAGqJ,MAAM87D,MACxBgD,GAAMnoE,EAAGqJ,MAAMu7D,gBACfwD,MAASJ,EACTzmE,KAAQwmE,EAUV,OAPA/nE,GAAGlB,KAAKolE,EAAkBnlE,MAAMspE,aAAcroE,EAAIhE,GAE9CgE,EAAGqJ,MAAMi+D,eACXtrE,EAAMmsE,GAAKnoE,EAAGqJ,MAAM67D,mBACpBlpE,EAAMuF,KAAO,WAGRvF,KAIT+C,OAQEspE,aAAc,WAQdb,cAAe,SAUfzB,YAAa,SASbW,iBAAkB,iBASlBQ,sBAAuB,0BAI1B3lF,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYC,UAAUE;CC9nBxD,SAAyB35D,GACvB,YAEA,IAAI+5D,GAAgB/5D,EAAOk6D,mBACvBwF,EAAgB1/D,EAAOs7D,kBAAkBnlE,KAS7C6J,GAAO2/D,iBAAmB/lF,GAAG+1B,OAAO75B,QAClCwI,KAAM,sBAENshF,YAAa,KAUb94D,SAAU,SAAU6yD,GAClB,GAAIviE,GAAK/iB,IAIT,OAHA+iB,GAAGwoE,YAAcjG,EAChBnjE,KAAKkpE,EAAc5B,iBAAkB5qF,EAAEiI,MAAMic,EAAGyoE,gBAAiBzoE,IACjEZ,KAAKkpE,EAAcpB,sBAAuBprF,EAAEiI,MAAMic,EAAG0oE,qBAAsB1oE,QAW9E44B,eAAgB,WACd,GAAI54B,GAAK/iB,IACT,OAAO+iB,GAAGwoE,YAAY3C,OAAO1kF,KAAK,IAAMwhF,EAAc3vE,IAAM,gBAAgBgvB,GAAG,aAYjF2mD,SAAU,SAAU3sE,EAAO2rE,GACzB,GAAI3nE,GAAK/iB,KACLosB,EAAQrJ,EAAGwoE,YAAYn/D,KAC3B,OAAIs+D,IACMphF,EAAE8iB,EAAM67D,oBAAoB0D,OAAQ7pD,MAAO/iB,IAASjR,SAEnDxE,EAAE8iB,EAAMu7D,iBAAiBgE,OAAQ7pD,MAAO/iB,IAASjR,QAa9D09E,gBAAiB,SAAUlG,EAAYsG,GACrC,GAAI7oE,GAAK/iB,KACL0qF,EAAapF,EAAWl5D,MAAMi+D,YAmDlC,OAjDAuB,GAAcC,SACZtoF,IAAK,GAAKmiF,EAAcS,WAAWxnE,iBACnCI,MAAO2mE,EAAcS,UACrB9qD,aAAc10B,EAAE,oBAChBiB,KAAM89E,EAAcS,UACpB9vB,WAAYtzC,EAAG2oE,SAAShG,EAAcS,UAAWuE,GACjDj4B,QAAS,qBAGXm5B,EAAcC,SACZtoF,IAAK,GAAKmiF,EAAcQ,YAAYvnE,iBACpCI,MAAO2mE,EAAcQ,WACrB7qD,aAAc10B,EAAE,qBAChBiB,KAAM89E,EAAcQ,WACpB7vB,WAAYtzC,EAAG2oE,SAAShG,EAAcQ,WAAYwE,KAGpDkB,EAAcC,SACZtoF,IAAK,GAAKmiF,EAAcO,WAAWtnE,iBACnCI,MAAO2mE,EAAcO,UACrB5qD,aAAc10B,EAAE,oBAChBiB,KAAM89E,EAAcO,UACpB5vB,WAAYtzC,EAAG2oE,SAAShG,EAAcO,UAAWyE,KAGnDkB,EAAcC,SACZtoF,IAAK,GAAKmiF,EAAcM,UAAUrnE,iBAClCI,MAAO2mE,EAAcM,SACrB3qD,aAAc10B,EAAE,mBAChBiB,KAAM89E,EAAcM,SACpB3vB,WAAYtzC,EAAG2oE,SAAShG,EAAcM,SAAU0E,KAGlDkB,EAAcC,SACZtoF,IAAK,GAAKmiF,EAAcK,OAAOpnE,iBAC/BI,MAAO2mE,EAAcK,MACrB1qD,aAAc10B,EAAE,gBAChBiB,KAAM89E,EAAcK,MACpB1vB,WAAYtzC,EAAG2oE,SAAShG,EAAcK,MAAO2E,KAG/CkB,EAAcC,SACZtoF,IAAK,GAAKmiF,EAAcI,WAAWnnE,iBACnCI,MAAO2mE,EAAcI,UACrBzqD,aAAc10B,EAAE,oBAChBiB,KAAM89E,EAAcI,UACpBzvB,WAAYtzC,EAAG2oE,SAAShG,EAAcI,UAAW4E,KAG5C3nE,MAMVxd,GAAGunB,WAAWm4D,UAAUE,YAAYC,UAAUE;CCrIjD,SAAyB35D,GACvB,YAEA,IAAI+5D,GAAgB/5D,EAAO+5D,cACvB2F,EAAgB1/D,EAAOs7D,kBAAkBnlE,KAU7C6J,GAAOmgE,oBAAsBvmF,GAAG+1B,OAAO75B,QACrCwI,KAAM,sBAENshF,YAAa,KAWb94D,SAAU,SAAU6yD,GAClB,GAAIviE,GAAK/iB,IAMT,OALA+iB,GAAGwoE,YAAcjG,EAChBnjE,KAAKkpE,EAAc5B,iBAAkB5qF,EAAEiI,MAAMic,EAAGyoE,gBAAiBzoE,IACjEZ,KAAKkpE,EAAcpB,sBAAuBprF,EAAEiI,MAAMic,EAAG0oE,qBAAsB1oE,IAC3EZ,KAAKkpE,EAAcD,aAAcvsF,EAAEiI,MAAMic,EAAGgpE,YAAahpE,IACzDZ,KAAKkpE,EAAcvC,YAAajqF,EAAEiI,MAAMic,EAAGipE,gBAAiBjpE,QAY/DipE,gBAAiB,SAAUtjC,EAAW3pC,EAAO2jD,EAAS96D,GACpD,GAAImb,GAAK/iB,IACT,IAAI4H,IAAS89E,EAAc3vE,IAAK,CAC9B,GAAIk2E,GAAOlpE,EAAGwoE,YAAY3C,OAAO1kF,KAAK,uBAElCwkD,MAAc,GAChB3lC,EAAGwoE,YAAYn/D,MAAMi+D,cAAe,EACpC4B,EAAK5/C,KAAK,WAAW,KAErBtpB,EAAGwoE,YAAYn/D,MAAMi+D,cAAe,EACpC4B,EAAK5/C,KAAK,WAAW,IAGvBtpB,EAAGwoE,YAAYn/D,MAAMu7D,mBACrB5kE,EAAGwoE,YAAYn/D,MAAM67D,sBAavB,MAVIrgF,KAAS89E,EAAcC,OAAS/9E,IAAS89E,EAAcE,SACrDl9B,KAAc,GAAS3lC,EAAG2oE,SAAS3sE,KAChCgE,EAAGwoE,YAAYn/D,MAAMu7D,kBAAiB5kE,EAAGwoE,YAAYn/D,MAAMu7D,oBAChE5kE,EAAGwoE,YAAYn/D,MAAMu7D,gBAAgBp0E,MACnCuuB,MAAO/iB,EACPuF,KAAM1c,EACNskF,QAASxpB,KAIR3/C,GAWT44B,eAAgB,WACd,GAAI54B,GAAK/iB,IACT,OAAO+iB,GAAGwoE,YAAY3C,OAAO1kF,KAAK,IAAMwhF,EAAc3vE,IAAM,gBAAgBgvB,GAAG,aAWjF0mD,qBAAsB,SAAUG,EAAetG,GAC7C,GAAIviE,GAAK/iB,IAUT,OATI+iB,GAAG44B,kBACLryC,EAAEsiF,GAAe7rF,KAAK,SAAUoqF,GAC9BA,EAAO9zB,YAAa,EAEhB/sD,EAAEg8E,EAAWl5D,MAAM67D,oBAAoBkE,WAAYrqD,MAASqoD,EAAOprE,WAAa,IAClForE,EAAO9zB,YAAa,KAInBtzC,GAYT2oE,SAAU,SAAU3sE,EAAO2rE,GACzB,GAAI3nE,GAAK/iB,KACLosB,EAAQrJ,EAAGwoE,YAAYn/D,KAC3B,OAAIs+D,IACMphF,EAAE8iB,EAAM67D,oBAAoB0D,OAAQ7pD,MAAO/iB,IAASjR,SAEnDxE,EAAE8iB,EAAMu7D,iBAAiBgE,OAAQ7pD,MAAO/iB,IAASjR,QAa9D09E,gBAAiB,SAAUlG,EAAYsG,GACrC,GACIQ,GADArpE,EAAK/iB,KAEL0qF,EAAapF,EAAWl5D,MAAMi+D,aAG9BgC,EAAc/iF,EAAEsiF,GAAe1nF,KAAK,SAAUimF,EAAQ7wB,GAExD,MADA8yB,GAAa9yB,EACW,KAAjB6wB,EAAOprE,QAGZutE,GAAoBztF,EAAEm1C,cAAcq4C,EAEpCC,KACFV,EAAcz2E,OAAOi3E,EAAY,GACjCR,EAAcC,SACZtoF,IAAK,GAAKmiF,EAAcE,SAASjnE,iBACjCI,MAAO2mE,EAAcE,QACrBvqD,aAAc10B,EAAE,mBAChBiB,KAAM89E,EAAcE,QACpBvvB,WAAYtzC,EAAG2oE,SAAShG,EAAcE,QAAS8E,GAC/Cj4B,QAAS,qBAEXm5B,EAAcC,SACZtoF,IAAK,GAAKmiF,EAAcC,OAAOhnE,iBAC/BI,MAAO2mE,EAAcC,MACrBtqD,aAAc10B,EAAE,gBAChBiB,KAAM89E,EAAcC,MACpBtvB,WAAYtzC,EAAG2oE,SAAShG,EAAcC,MAAO+E,KAIjD,IAAIj4B,GAAY65B,EAAwC,GAArB,kBASnC,OARAV,GAAcC,SACZtoF,IAAK,GAAKmiF,EAAc3vE,KAAK4I,iBAC7BI,MAAO2mE,EAAc3vE,IACrBslB,aAAc10B,EAAE,cAChBiB,KAAM89E,EAAc3vE,IACpBsgD,WAAYq0B,EACZj4B,QAASA,IAEJ1vC,GAYTgpE,YAAa,SAAUzG,EAAYiH,GACjC,GAAIxpE,GAAK/iB,IAST,IANIslF,EAAWl5D,MAAMi+D,gBAAiB,IACpC/E,EAAWl5D,MAAM67D,mBAAqB3+E,EAAEkjF,QAAQlH,EAAWl5D,MAAM67D,mBAAoB3+E,EAAEmjF,UAAUnH,EAAWl5D,MAAM67D,oBAChHnmD,MAAO4jD,EAAc3vE,QAIC,OAAtBw2E,EAAajoE,KAAe,CAC1Bhb,EAAEijF,EAAarB,IAAIS,OAAQ7pD,MAAO4jD,EAAc3vE,MAAOjI,SACrDxE,EAAEg8E,EAAWl5D,MAAM67D,oBAAoBttD,OAAO,SAAUwvD,GAAU,MAAOA,GAAOroD,QAAU4jD,EAAc3vE,MAAOjI,OAAS,EAE1Hw3E,EAAWl5D,MAAMi+D,cAAe,GAEhCkC,EAAarB,GAAK,KAClBqB,EAAajoE,KAAO,OACpBghE,EAAWl5D,MAAMu7D,mBACjBrC,EAAWl5D,MAAM67D,sBACjB3C,EAAWgC,QAAQrzE,IAAI,IACvBqxE,EAAWl5D,MAAMi+D,cAAe,GAIpC,IAAIqC,GAAuBpjF,EAAEijF,EAAarB,IAAIvwD,OAAO,SAAUpzB,GAC7D,MAAOA,GAAE+c,OAASohE,EAAcC,OAASp+E,EAAE+c,OAASohE,EAAcE,SAGhC,KAAhC8G,EAAqB5+E,SACvBy+E,EAAarB,GAAK5hF,EAAEqjF,MAAMJ,EAAarB,IACpC5uE,IAAI,SAAU/U,EAAG+xD,GAChB,MAAI/xD,GAAE+c,OAASohE,EAAcC,OAASp+E,EAAE+c,OAASohE,EAAcE,QAAgB,KACxEr+E,IAERkjF,UACA1rE,SAIP,MAAOgE,OAKVxd,GAAGunB,WAAWm4D,UAAUE,YAAYC,UAAUE;CC7OjD,SAAgC35D,GAC9B,YAGA,IAAIihE,GAAW,iCAUXC,EAAclhE,EAAOkhE,YAAcnrE,WAAWjgB,QAChDyR,UAAW,cACXg0E,WAAY,KACZjzD,kBAAmB,GACnB7H,OACEo8D,OAAQ,KACRzpE,MAAO,MAGTiV,YAAa,KACbszD,QAAS,KAET/mF,KAAM,SAAU0zB,EAAmBjzB,GACjC,GAAI+hB,GAAK/iB,IACT+iB,GAAGe,SACHf,EAAGqJ,SACHvtB,EAAE4C,OAAOshB,EAAGqJ,MAAOprB,GACnB+hB,EAAGmkE,WAAaz1E,mBAChBsR,EAAGkR,kBAAoBA,EACvBlR,EAAGiR,YAAcn1B,EAAEo1B,GACnBlR,EAAG6kE,WAULA,QAAS,WACP,GAAI7kE,GAAK/iB,IACMuF,IAAGynB,UAAUnpB,OAAO+oF,GACjCrpF,GAAIwf,EAAGmkE,WACP/gB,MAAS,cACT2mB,SAAwC,aAA7B/pE,EAAGqJ,MAAMo8D,OAAOuE,WAC1Bx7E,KAAK,SAAU3N,GAChBmf,EAAGiR,YAAYpwB,KAAKA,GACpBmf,EAAGglE,gBACHhlE,EAAGilE,iBAWPD,cAAe,WACb,GAAIhlE,GAAK/iB,IACT+iB,GAAGukE,QAAUzoF,EAAE,cAAekkB,EAAGkR,mBAGjClR,EAAGiqE,mBAULhF,YAAa,WACX,GAAIjlE,GAAK/iB,IACT+iB,GAAGukE,QAAQxmF,GAAG,qBAAsBjC,EAAEiI,MAAMic,EAAGkqE,aAAclqE,IAG7DA,EAAGukE,QAAQxmF,GAAG,sBAAuB,SAAUsD,GAC7C,GAAIgK,GAAMhK,EAAE+lD,OAAS/lD,EAAEo+C,OACvB,IAAY,KAARp0C,EAAY,CACd,GAAI4F,GAAM+O,EAAGukE,QACT91E,EAAI1B,cAAckE,EACtBA,GAAIzF,WAAW,UAAWiD,GAC1BwC,EAAIrU,KAAK,UAAW6R,GACpBwC,EAAIs/B,SACJvwB,EAAG8b,UAIP,IAAIquD,GAAQnqE,EAAGukE,QAAQ3nF,KAAK,8BAC5B,KAAKutF,EAAO,CAEV,GAAIC,GAAiBpqE,EAAGukE,QAAQ/4E,WAAW,SAAU,cACjD6+E,EAAgB,WACdD,GAAgBA,IACpBpqE,EAAGlB,KAAKgrE,EAAY/qE,MAAMurE,KAAMtqE,GAElCA,GAAGukE,QAAQ/4E,WAAW,SAAU,aAAc6+E,GAC9CrqE,EAAGukE,QAAQ3nF,KAAK,+BAA+B,KAWnDstF,aAAc,WACZ,GAAIlqE,GAAK/iB,KACLq7B,EAAetY,EAAGukE,QAAQrzE,KACxBonB,GACJtY,EAAGqJ,MAAMrN,MAAQlgB,EAAEwkB,OAAOxT,UAAUwrB,IAAetd,WAAW,KAE9DgF,EAAGqJ,MAAMrN,MAAQ,GAEnBgE,EAAGlB,KAAKgrE,EAAY/qE,MAAMyoE,cAAexnE,EAAG0W,aAU9CmxD,YAAa,SAAUC,GACrB,GAAI9nE,GAAK/iB,IACTnB,GAAE4C,OAAOshB,EAAGqJ,MAAOy+D,GACnB9nE,EAAGiqE,kBACHjqE,EAAG8b,SAULA,MAAO,WACL,GAAK7+B,KAAKsnF,QAAQx5E,OAClB,IACE9N,KAAKsnF,QAAQ/4E,WAAW,QACxB,MAAOnK,MAWX4oF,gBAAiB,WACf,GAAIjqE,GAAK/iB,KACL+e,EAAQ,EACZ,IAAMgE,EAAGqJ,MAAMrN,MAAO,CACpB,GAAIuuE,GAA2C,aAA7BvqE,EAAGqJ,MAAMo8D,OAAOuE,SAA0Bn+E,eAAiBP,UAC7E0Q,GAAQuuE,EAAW74E,KAAK0L,QAAQ4C,EAAGqJ,MAAMrN,QAE3CgE,EAAGukE,QAAQrzE,IAAI8K,IAUjB0a,SAAU,WACR,GAAI1W,GAAK/iB,KACL+e,GACFuF,KAAQ,QACR2mE,KAAQ,GACRC,GAAM,KACNC,MAASpoE,EAAGqJ,MAAMrN,MAKpB,OAFAgE,GAAGlB,KAAKgrE,EAAY/qE,MAAMyrE,UAAWxqE,EAAIhE,GAElCA,KAKT+C,OACEyrE,UAAW,WACXhD,cAAe,SACf8C,KAAM,WAGT/oF,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYC;AC1M9C,cACA,SAAWz5D,GASTA,EAAO6hE,aAAe9rE,WAAWjgB,QAC/B8B,GAAI,KACJkqF,YAAa,KAEbz5D,YAAa,KACbszD,QAAS,KACToG,QAAS,KACTp1D,KAAM,KACNq1D,UAAW,KAEXC,OAAQ,KACRC,cAAe,KACfxX,MAAO,KAGP91E,KAAM,SAAUsf,GACd,GAAIkD,GAAK/iB,IAETpB,aAAYkD,UAEZihB,EAAGe,OAAOjE,GACVkD,EAAG0qE,YAAc5uF,EAAE0nB,WACnBxD,EAAGxf,GAAKkO,mBACRsR,EAAG4qE,UAAY9tE,EAAKiuE,KACpB/qE,EAAG2qE,QAAU7tE,EAAK2oE,OAClBzlE,EAAGuV,KAAOzY,EAAKhZ,KAGfkc,EAAGgrE,OAASluE,EAAKmuE,cACjBjrE,EAAG6qE,OAAS7qE,EAAGuV,KAAKvV,EAAG2qE,QAAQnqF,KAEb,OAAdwf,EAAG6qE,QAAmBtkF,EAAE2kF,YAAYlrE,EAAG6qE,WACzC7qE,EAAG6qE,OAAS,IAEd7qE,EAAG8qE,cAAgB9qE,EAAGuV,KAAKvV,EAAG2qE,QAAQQ,QACb,OAArBnrE,EAAG8qE,eAA0BvkF,EAAE2kF,YAAYlrE,EAAG8qE,kBAChD9qE,EAAG8qE,cAAgB,IAGrB9qE,EAAGiR,YAAcn1B,EAAEghB,EAAKk7C,WACxBh4C,EAAGszD,MAAQx3E,EAAE4C,UAAWshB,EAAG2qE,QAAQ3zD,WAEnChX,EAAGlf,SAAS0N,KAAK,WACfwR,EAAGorE,cAAchsE,KAAK,SAAU,SAAU/d,EAAGmD,EAAG8uB,GAC9C,GAAIwsC,GAAO9/C,EAAG6qE,OACV7+D,EAAUsH,EAAOtX,KAErB8jD,GAAiB,OAATA,EAAiB,GAAKA,EAC9B9zC,EAAuB,OAAZA,EAAoB,GAAKA,EAEpB,UAAZhM,EAAGnb,MAAgC,YAAZmb,EAAGnb,MAC5Bi7D,GAAQA,EACR9zC,GAAWA,IAEX8zC,EAAO,GAAKA,EACZ9zC,EAAU,GAAKA,GAGb8zC,GAAQ9zC,GACVhM,EAAGqrE,YAAYrrE,EAAGuV,KAAMjC,QAYhCxyB,OAAQ,WACN,GAAIkf,GAAK/iB,KAELwc,EAAI6gE,MAAMC,QAAQ,4GAatB,OAZAv6D,GAAGiR,YAAYpwB,KAAK4Y,EAAE3Y,QACpBN,GAAIwf,EAAGxf,GACPwb,MAAOgE,EAAGsrE,wBAGZtrE,EAAGukE,QAAUzoF,EAAE,IAAMkkB,EAAGxf,IAGnBgC,GAAGC,IAAIid,WACVM,EAAGurE,oBAGEvrE,EAAG0qE,YAAY3lE,WAQxBumE,mBAAoB,WAClB,MAAOruF,MAAK6tF,eAUdS,kBAAmB,WACjB,GAAIvrE,GAAK/iB,KAKLuuF,EAAW,SAAUnqF,KAGrBoqF,EAAW,SAAUpqF,GAAKA,EAAEqqF,4BAE5BC,EAAoB,SAAUh2D,GAChC,GAAIi2D,GAAQj2D,EAAOi2D,OACnB,OAAQA,GAAMC,IAAMD,EAAMvkE,QAAUukE,EAAM7gF,QAAU6gF,EAAM7gF,QAGxD+gF,EAAU,SAAUn2D,GACtB,QAASA,EAAOzkB,MAGlB8O,GAAGukE,QAAQnlE,KAAK,cAAe,SAAU/d,GACvC,GAAIgK,GAAMhK,EAAEo+C,QACR9pB,EAAS75B,EAAEmB,MACXud,EAAI1e,EAAEiwF,GAAGtsC,OAEb,IAAIp0C,IAAQmP,EAAEwxE,MAAO,CACnB,GAAIC,GAAqBN,EAAkBh2D,EAC3CpyB,YAAW,WACL0oF,EACFt2D,EAAOu2D,MAAM,GAEbv2D,EAAOnC,QAAQC,UAEhB,KACHpyB,EAAEqqF,2BAYJ,GATIrgF,IAAQmP,EAAE2xE,SACZx2D,EAAOnC,QAAQC,SACfpyB,EAAEqqF,4BAGArgF,IAAQmP,EAAE4xE,MAAQ/gF,IAAQmP,EAAE6xE,IAC9BrsE,EAAGssE,iBAAiBjrF,KAGjBgK,IAAQmP,EAAE+xE,MAAQlhF,IAAQmP,EAAEgyE,OAAWnrF,EAAEorF,UAAaprF,EAAEo7D,QAAWp7D,EAAEqrF,SAAYrrF,EAAEqkF,SACtF,GAAIiG,EAAkBh2D,KAAYm2D,EAAQn2D,GACxC61D,EAASnqF,OACJ,CACL,GAAIs0B,EAAOu2D,UAAYv2D,EAAOzkB,MAAMnG,QAAUM,IAAQmP,EAAEgyE,MACtD,MAAOhB,GAASnqF,EAElB,IAAuB,IAAnBs0B,EAAOu2D,SAAiB7gF,IAAQmP,EAAE+xE,KACpC,MAAOf,GAASnqF,EAElBoqF,GAASpqF,MAGZmyB,QAEHjwB,WAAW,WACTyc,EAAGukE,QAAQqH,MAAM,EAAG5rE,EAAGukE,QAAQrzE,MAAMnG,WAKzCuhF,iBAAkB,SAAUjrF,GAC1B,GAAIgK,GAAMhK,EAAEo+C,QACRjlC,EAAI1e,EAAEiwF,GAAGtsC,OAETp0C,KAAQmP,EAAE4xE,KAGZnvF,KAAKsnF,QAAQzmF,IAAI,wBAAwB6vD,OAGzC1wD,KAAKsnF,QAAQ52B,OAIftsD,EAAEpB,kBAQJuzB,MAAO,WACLv2B,KAAKsnF,QAAQ/wD,SASf43D,YAAa,WACX,GAAIprE,GAAK/iB,IACT,IAAM+iB,EAAG2sE,SAAU,MAAO3sE,GAAG2sE,QAE7B,IAAIC,IACFnc,SAAUzwD,EAAG4qE,UAAUiC,QAAQ31D,SAASlL,SAGtCpvB,GACF40B,UAAWxR,EAAGxf,IACd83B,aAAc,GACdw0D,YAAY,EACZnnB,WAAW,EACXonB,YAAY,EACZ/wE,MAAO,GACPgxE,OAAQhtE,EAAGuV,KAAK/0B,GAChBysF,cAAejtE,EAAG4qE,UAAUiC,QAAQ31D,SAAS+1D,cAC7CC,eAAgBltE,EAAG2qE,QAAQuC,eAG7B,OAAOltE,GAAG2sE,SAAW,GAAInqF,IAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWquC,KAAK3wC,EAAG2qE,QAAQnqF,GAAI5D,EAAMgwF,IASrFO,eAAgB,WACd,GAAIntE,GAAK/iB,KACLopC,EAAWrmB,EAAGotE,gBAElB,OAAI/mD,GAASrqB,OAASgE,EAAG6qE,SACvB7qE,EAAG6qE,OAASxkD,EAASrqB,OACd,IAWXqxE,WAAY,SAAUr5D,EAAKs5D,GACzB,GAAIttE,GAAK/iB,IAET+iB,GAAGqrE,YAAYr3D,EAAKs5D,IAItBjC,YAAa,SAAUr3D,EAAKs5D,GAC1B,GAAIttE,GAAK/iB,IACT+2B,GAAIhU,EAAG2qE,QAAQnqF,IAAM8sF,EAAQtxE,MAC7BgY,EAAIhU,EAAG2qE,QAAQQ,OAASmC,EAAQh1D,cASlCi1D,UAAW,aASXH,eAAgB,WACd,GAAIptE,GAAK/iB,KACLgwD,EAAUjtC,EAAGorE,cACbpvE,EAAQixC,EAAQv2B,UACpB,QAAS1a,MAAOA,EAAOsc,aAActc,IASvCwxE,SAAU,WACR,OAASC,OAAO,EAAMv/E,IAAK,OAS7Bw/E,QAAS,WACP,GAAI1tE,GAAK/iB,IACT+iB,GAAGqrE,YAAYrrE,EAAGuV,KAAMvV,EAAGotE,kBAC3BptE,EAAGiR,YAAYymC,SASjBqP,QAAS,WAEP,MADA9pE,MAAKmuF,cAAcrkB,UACZ9pE,MAST+pE,OAAQ,WAEN,MADA/pE,MAAKmuF,cAAcpkB,SACZ/pE,MAST0wF,gBAAiB,SAAUtzD,EAAUuzD,GAEnC,MADA3wF,MAAKmuF,cAAcuC,gBAAgBtzD,EAAUuzD,GACtC3wF,MAWT4wF,WAAY,WACV,GAAI7tE,GAAK/iB,KACL6wF,EAAe9tE,EAAG4qE,UAAUiC,QAAQ70D,UACxC,OAAO81D,GAAaC,QAAQ/tE,EAAG2qE,QAAQnqF,QAK1Ce,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYE;AC/W9C,cACA,SAAW15D,GAQTA,EAAOolE,WAAaplE,EAAO6hE,aAAa/rF,YAEvC6C,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYE;ACX9C,cACA,SAAW15D,GAQTA,EAAOqlE,WAAarlE,EAAO6hE,aAAa/rF,QACtCwvF,UAAW,KACXvB,SAAU,KAEVnvF,KAAM,SAAUsf,GACd,GAAIkD,GAAK/iB,IACT+iB,GAAGe,OAAOjE,IASZhc,OAAQ,WACN,GAAIkf,GAAK/iB,IAkBT,OAfA+iB,GAAGszD,MAAM9yE,GAAKwf,EAAGxf,GAEjBwf,EAAGszD,MAAM6a,YAAcnuE,EAAG6qE,OAC1B7qE,EAAGszD,MAAM8a,cAAgBpuE,EAAG8qE,cAE5B9qE,EAAGkuE,UAAY,GAAIpmE,WAAUiC,WAAWxD,MAAMjE,WAAW+rE,KAEzDruE,EAAGkuE,UAAUI,YAAYtuE,EAAGszD,OAAO9kE,KAAK,SAAU3N,GAChDmf,EAAGiR,YAAYpwB,KAAK,kCAAoCA,EAAO,UAC/Dmf,EAAGiR,YAAY9vB,KAAK,eAAexE,SAAS,YAE5CqjB,EAAGukE,QAAUzoF,EAAE,IAAMkkB,EAAGxf,IACxBwf,EAAGurE,oBACHvrE,EAAG0qE,YAAY3lE,YAEV/E,EAAG0qE,aAIZa,kBAAmB,WACjBtuF,KAAK8jB,SAEL9jB,KAAKsnF,QAAQnlE,KAAK,cAAe,SAAU/d,GACzC,GAAIgK,GAAMhK,EAAEo+C,QACRjlC,EAAI1e,EAAEiwF,GAAGtsC,OAERp0C,KAAQmP,EAAE4xE,MAAQ/gF,IAAQmP,EAAE6xE,KAAOhrF,EAAEo7D,QACxCp7D,EAAEqqF,8BAKRY,iBAAkB,aASlBlB,YAAa,WACX,GAAIprE,GAAK/iB,IACT,IAAM+iB,EAAG2sE,SAAU,MAAO3sE,GAAG2sE,QAC7B,IAAIC,GAAgB5sE,EAAG4qE,UAAUiC,QAAQ31D,SAASlL,OAClD,OAAOhM,GAAG2sE,SAAW,GAAInqF,IAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW+rE,KAAKruE,EAAG2qE,QAAQnqF,GAAIwf,EAAGxf,GAAIosF,IAStFO,eAAgB,WACd,GAAIntE,GAAK/iB,KACLq2B,EAAStT,EAAGotE,gBAEhB,OAAIptE,GAAG6qE,SAAWv3D,EAAOtX,QACvBgE,EAAG6qE,OAASv3D,EAAOtX,OACZ,IAWX0xE,QAAS,WACP,GAAI1tE,GAAK/iB,IACT+iB,GAAGukE,QAAQrd,oBACXlnD,EAAGe,UAULqsE,eAAgB,WACd,GAAIptE,GAAK/iB,KACLgwD,EAAUjtC,EAAGorE,aACjB,QACEpvE,MAASixC,EAAQv2B,WACjB4B,aAAgB20B,EAAQ0Z,oBAK5B4nB,YAAa,WACX,GAAIC,GAAUvxF,KAAKmuF,aACnBoD,GAAQD,YAAYvxE,MAAMwxE,EAAS1jF,YAGrC2jF,SAAU,WACR,GAAID,GAAUvxF,KAAKmuF,aACnBoD,GAAQC,SAASzxE,MAAMwxE,EAAS1jF,eAMnCvJ,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYE;ACvI9C,cACA,SAAW15D,GACT,GAAIihE,GAAW,+BAQfjhE,GAAO8lE,WAAa9lE,EAAO6hE,aAAa/rF,QAStCoC,OAAQ,WACN,GAAIkf,GAAK/iB,KAELL,IAyBJ,OAxBAA,GAAKmtF,SAAoC,aAAxB/pE,EAAG2qE,QAAQX,SAC5BptF,EAAK4D,GAAKwf,EAAGxf,GAEY,gBAAdwf,GAAG6qE,OACZjuF,EAAKof,MAAQ1Q,WAAW0U,EAAG6qE,QAE3BjuF,EAAKof,MAAQgE,EAAG6qE,OAGlBroF,GAAGynB,UAAUnpB,OAAO+oF,EAAUjtF,GAAM4R,KAAK,SAAU3N,GACjDmf,EAAGiR,YAAYpwB,KAAK,kCAAoCA,EAAO,UAC/Dmf,EAAGiR,YAAY9vB,KAAK,eAAexE,SAAS,YAC5CqjB,EAAGukE,QAAUzoF,EAAE,IAAMkkB,EAAGxf,IAExBwf,EAAG2uE,aAGEnsF,GAAGC,IAAIid,WACVM,EAAGurE,oBAGLvrE,EAAG0qE,YAAY3lE,YAGV/E,EAAG0qE,YAAYtlE,WASxBupE,WAAY,WACV,GAAI3uE,GAAK/iB,KAEL0uF,EAAoB,SAAUh2D,GAChC,GAAIi2D,GAAQj2D,EAAOi2D,OACnB,SAAIA,EAAMC,IAAMD,EAAMvkE,QAAUukE,EAAM7gF,SAAU6gF,EAAM7gF,SAOpD+gF,EAAU,SAAUn2D,GACtB,QAASA,EAAOzkB,MAIlB8O,GAAGukE,QAAQxmF,GAAG,sBAAuB,SAAUsD,GAM7C,QAASutF,KACP,GAAIngF,GAAI1B,cAAckE,EACtBA,GAAIzF,WAAW,UAAWiD,GAC1BwC,EAAIrU,KAAK,UAAW6R,GAIpBuR,EAAG8b,QAZL,GAAI7qB,GAAM+O,EAAGukE,QACT/pE,EAAI1e,EAAEiwF,GAAGtsC,QAETp0C,EAAMhK,EAAE+lD,OAAS/lD,EAAEo+C,OAoBvB,IAPY,KAARp0C,IACGsgF,EAAkB16E,IAAQ66E,EAAQ76E,IACrC29E,IAKAvjF,IAAQmP,EAAE+xE,MAAQlrF,EAAEo+C,UAAYjlC,EAAEgyE,MAAO,CAC3C,GAAIv7E,EAAIi7E,UAAYj7E,EAAIC,MAAMnG,QAAUM,IAAQmP,EAAEgyE,MAChD,MAAOoC,IAET,IAAoB,IAAhB39E,EAAIi7E,SAAiB7gF,IAAQmP,EAAE+xE,KACjC,MAAOqC,KAKX,GAAIvjF,IAAQmP,EAAE4xE,MAAQ/gF,IAAQmP,EAAE6xE,GAC9B,MAAOuC,IAIT,KAAa,KAARvjF,GAAsB,MAARA,IAAgBhK,EAAEqkF,QAAS,CAC5C,GAAI1nD,GAAM,GAAItsB,KACdT,GAAIzF,WAAW,UAAWwyB,GAC1B/sB,EAAIrU,KAAK,UAAWohC,GACpB/sB,EAAIo0C,QAAQ,UACZrlC,EAAG8b,YAYTA,MAAO,WACL,GAAK7+B,KAAKsnF,QAAQx5E,OAClB,IACE9N,KAAKsnF,QAAQ/4E,WAAW,QACxB,MAAOnK,MAUX+rF,eAAgB,WACd,GAAIptE,GAAK/iB,KACLgwD,EAAUjtC,EAAGorE,cACbpvE,EAAQixC,EAAQv2B,UACpB,QAAS1a,MAAOA,EAAOsc,aAActc,IAQvC0xE,QAAS,WACP,GAAI1tE,GAAK/iB,IACT+iB,GAAG8b,QACH9b,EAAGe,UASLqqE,YAAa,WACX,GAAIprE,GAAK/iB,IACT,IAAM+iB,EAAG2sE,SAAU,MAAO3sE,GAAG2sE,QAC7B,IAAIC,GAAgB5sE,EAAG4qE,UAAUiC,QAAQ31D,SAASlL,OAClD,OAAOhM,GAAG2sE,SAAW,GAAInqF,IAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW5Q,KAAKsO,EAAG2qE,QAAQnqF,GAAIwf,EAAGxf,GAAIosF,OAIvFrrF,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYE;AC/K9C,cACA,SAAW15D,GAQTA,EAAOimE,cAAgBjmE,EAAO6hE,aAAa/rF,QACzClB,KAAM,SAAUsf,GACd,GAAIkD,GAAK/iB,IACT+iB,GAAGnb,KAAO,UACVmb,EAAGe,OAAOjE,IASZhc,OAAQ,WACN,GAAIkf,GAAK/iB,IACT+iB,GAAGe,QACH,IAAI+tE,GAAgB9uE,EAAG6tE,YACvB,KAAKiB,EAAc5pF,aAAc,CAC/B,GAAIigE,GAAMrpE,EAAE4C,UAAW5C,EAAE4B,GAAGqxF,YAAY9wF,UAAY+wF,KAAM,IAAKC,MAAM,GACrEjvE,GAAGukE,QAAQwK,YAAY,OAAQ5pB,GAEjC,MAAOnlD,GAAG0qE,aAQZY,mBAAoB,WAClB,MAAOruF,MAAK4tF,QASduC,eAAgB,WACd,GAAIptE,GAAK/iB,KACL6xF,EAAgB9uE,EAAG6tE,aACnB5gC,EAAUjtC,EAAGorE,cACbpvE,EAAQixC,EAAQv2B,UAKpB,OAJKo4D,GAAc5pF,cAEjB8a,EAAGukE,QAAQwK,YAAY,WAEhB/yE,MAAOA,EAAOsc,aAActY,EAAGukE,QAAQrzE,QASlDw8E,QAAS,WACP,GAAI1tE,GAAK/iB,KACL8xF,EAAc/uE,EAAGukE,QAAQ3nF,KAAK,cACP,iBAAhBmyF,IAGT/uE,EAAGukE,QAAQl/B,QAAQ,wBAErBrlC,EAAGe,aAKNxf,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYE;AC/E9C,cACA,SAAW15D,GASTA,EAAOsmE,YAActmE,EAAO6hE,aAAa/rF,QACvClB,KAAM,SAAUsf,GACd,GAAIkD,GAAK/iB,IACT+iB,GAAGnb,KAAO,QACVmb,EAAGe,OAAOjE,IASZhc,OAAQ,WACN,GAAIkf,GAAK/iB,IACT+iB,GAAGe,QACH,IAAI+tE,GAAgB9uE,EAAG6tE,YACvB,KAAKiB,EAAc5pF,aAAc,CAC/B,GAAIigE,GAAMrpE,EAAE4C,UAAW5C,EAAE4B,GAAGqxF,YAAY9wF,SACpC+hB,GAAG2qE,QAAQwE,YACbhqB,GAAQ6pB,KAAM,GAAKhvE,EAAG2qE,QAAQwE,UAAWF,MAAM,IAEjDjvE,EAAGukE,QAAQwK,YAAY,OAAQ5pB,GAEjC,MAAOnlD,GAAG0qE,aAQZY,mBAAoB,WAClB,MAAOruF,MAAK4tF,QASduC,eAAgB,WACd,GAAIptE,GAAK/iB,KACL6xF,EAAgB9uE,EAAG6tE,aACnB5gC,EAAUjtC,EAAGorE,cACbpvE,EAAQixC,EAAQv2B,UAKpB,OAJKo4D,GAAc5pF,cAEjB8a,EAAGukE,QAAQwK,YAAY,WAEhB/yE,MAAOA,EAAOsc,aAActY,EAAGukE,QAAQrzE,QASlDw8E,QAAS,WACP,GAAI1tE,GAAK/iB,KACL8xF,EAAc/uE,EAAGukE,QAAQ3nF,KAAK,cACP,iBAAhBmyF,IAGT/uE,EAAGukE,QAAQl/B,QAAQ,wBAErBrlC,EAAGe,aAMNxf,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYE;ACpF9C,cACA,SAAW15D,GAQTA,EAAOwmE,uBAAyBxmE,EAAO6hE,aAAa/rF,QAClDwvF,UAAW,KACXvB,SAAU,KAGVnvF,KAAM,SAAUsf,GACd,GAAIkD,GAAK/iB,IACT+iB,GAAGe,OAAOjE,IASZhc,OAAQ,WACN,GAAIkf,GAAK/iB,IAET+iB,GAAGszD,MAAM9yE,GAAKwf,EAAGxf,GACjBwf,EAAGszD,MAAM+b,aAAervE,EAAG8qE,cAC3B9qE,EAAGszD,MAAMgc,iBAAmBtvE,EAAG6qE,OAC/B7qE,EAAGszD,MAAMic,iBAAmBvvE,EAAG6qE,OAG/B7qE,EAAGszD,MAAM9+C,iBAAmB,KAC5BxU,EAAGszD,MAAM5+C,iBAAmB,IAG5B,IAAIwC,GAAWp7B,EAAEsoB,UAAUpE,EAAGszD,MAAMp8C,SAGpCA,GAAS/xB,SAAY,GAAK6a,EAAGszD,MAAMic,kBAAsB,EAEzD,IAAIj4D,GAAex7B,EAAEsoB,UAAU8S,EAASI,aA6BxC,OA5BIA,KACFA,EAAak4D,gBAAkBxvE,EAAGuV,KAAK/0B,GACvC02B,EAASI,aAAex7B,EAAEwkB,OAAOgX,IAEnCtX,EAAGszD,MAAMp8C,SAAWp7B,EAAEwkB,OAAO4W,GAE7BlX,EAAGkuE,UAAYluE,EAAGyvE,kBACdzvE,EAAGkuE,UACLluE,EAAGkuE,UAAUI,YAAYtuE,EAAGszD,OAAO9kE,KAAK,SAAU3N,GAChDmf,EAAGiR,YAAYpwB,KAAK,uDAAyDA,EAAO,UACpFmf,EAAGiR,YAAY9vB,KAAK,eAAexE,SAAS,YAE5CqjB,EAAGorE,cAAchsE,KAAK,SAAU,SAAU/d,EAAGmD,EAAG8uB,GAC9CtT,EAAGqrE,YAAYrrE,EAAGuV,KAAMjC,KAG1BtT,EAAGukE,QAAUzoF,EAAE,IAAMkkB,EAAGxf,IAGnBgC,GAAGC,IAAIid,WACVM,EAAGurE,oBAGLvrE,EAAG0qE,YAAY3lE,YAGjB/E,EAAG0qE,YAAYvlE,SAEVnF,EAAG0qE,aAQZ+E,gBAAiB,WACf,MAAO,OASTlE,kBAAmB,WACjB,GAAIvrE,GAAK/iB,KACLud,EAAI1e,EAAEiwF,GAAGtsC,QACTiwC,EAAiB1vE,EAAGiR,YAAY9vB,KAAK,WAErCwqF,EAAoB,SAAUh2D,GAAU,MAAO3V,GAAG2vE,aAElDC,EAAa,WAAc,OAAQ5vE,EAAGorE,cAAc10D,YACpD80D,EAAW,SAAUnqF,KAErBwuF,EAAsB,SAAUxuF,GAAKA,EAAEqqF,4BAEvCoE,EAAiB,SAAUzkF,GAC7B,GAAI0kF,GAAQ1mF,OAAO2mF,MAAM,UACzBD,GAAMrK,SAAU,EAChBqK,EAAM3oC,MAAQ/7C,EACd2U,EAAGukE,QAAQl/B,QAAQ0qC,IAGjBE,EAAgB,WAClBjwE,EAAGukE,QAAQ52B,OACX3tC,EAAGwT,QACHk8D,EAAel8D,SAGb08D,EAAe,WACjBlwE,EAAGmwE,UACHnwE,EAAGukE,QAAQ/wD,QAIbk8D,GAAe3xF,GAAG,cAAe,SAAUsD,GACzC,GAAIgK,GAAMhK,EAAE+lD,KACR/7C,KAAQmP,EAAEwxE,QACRL,KAAuBiE,OACzBM,IACAL,EAAoBxuF,MAM1BquF,EAAe3xF,GAAG,cAAe,SAAUsD,GAEzC,GAAKsqF,IAAL,CACA,GAAItgF,GAAMhK,EAAE+lD,KACR/7C,KAAQmP,EAAE41E,WAAa/kF,IAAQmP,EAAE61E,QAC9BrwE,EAAGorE,cAAclmF,cACpB8a,EAAGorE,cAAcr0D,OAAM,EAI3B,IAAIu5D,IAAe91E,EAAE+xE,KAAM/xE,EAAEgyE,MAAOhyE,EAAE4xE,KAAM5xE,EAAE+1E,QAAS/1E,EAAE6xE,GAAI7xE,EAAEg2E,IAAKh2E,EAAE2xE,OAAQ3xE,EAAEi2E,MAAOj2E,EAAEk2E,QAASl2E,EAAEm2E,UAAWn2E,EAAEoG,IAAKpG,EAAEo2E,UAAWp2E,EAAEwxE,MACjIsE,GAAYjoF,QAAQgD,MAAS,GAAOhK,EAAEorF,UAAaprF,EAAEqrF,SAAYrrF,EAAEqkF,UAGhErkF,EAAEo7D,QAAWz8C,EAAGorE,cAAclmF,cACjC8a,EAAGorE,cAAcr0D,QAGnBm5D,IACAJ,EAAezkF,OAEhBmoB,QAAQC,SAGXzT,EAAGukE,QAAQnlE,KAAK,cAAe,SAAU/d,GACvC,GAAIgK,GAAMhK,EAAE+lD,KACR/7C,KAAQmP,EAAEwxE,QACZiE,IACAJ,EAAoBxuF,IAGlBA,EAAEo+C,UAAYjlC,EAAE+xE,MAAQlrF,EAAEo+C,UAAYjlC,EAAEgyE,OAE1ChB,EAASnqF,KAQb2e,EAAGukE,QAAQxmF,GAAG,YAAa,WACzBiiB,EAAGmwE,YAIDP,IACFM,IAEAD,KAUJz8D,MAAO,WACLv2B,KAAK4zF,2BAA2Bl0F,SAAS,iBAI3CgzF,UAAW,WACT,MAAO1yF,MAAK4zF,2BAA2Bn0F,SAAS,iBAQlDyzF,QAAS,WACPlzF,KAAK4zF,2BAA2Bt0F,YAAY,iBAU9Cs0F,yBAA0B,WACxB,MAAO5zF,MAAKg0B,YAAY9vB,KAAK,sBAU/BiqF,YAAa,WACX,GAAIprE,GAAK/iB,IACT,IAAM+iB,EAAG2sE,SAAU,MAAO3sE,GAAG2sE,QAC7B,IAAIC,GAAgB5sE,EAAG4qE,UAAUiC,QAAQ31D,SAASlL,OAClD,OAAOhM,GAAG2sE,SAAW3sE,EAAG8wE,eAAelE,IAQzCkE,eAAgB,SAAUlE,GACxB,MAAO,OASTO,eAAgB,WACd,GAAIntE,GAAK/iB,KACLq2B,EAAStT,EAAGotE,gBAIhB,OAAIptE,GAAG6qE,QAAUv3D,EAAOtX,QACtBgE,EAAG6qE,OAASv3D,EAAOtX,OACZ,IAYXqxE,WAAY,SAAUr5D,EAAKs5D,GACzB,GAAIttE,GAAK/iB,IACT+iB,GAAGqrE,YAAYr3D,EAAKs5D,IAUtBF,eAAgB,WAEd,GAAIptE,GAAK/iB,KACLgwD,EAAUjtC,EAAGorE,aAEjB,QACEpvE,MAASixC,EAAQv2B,WACjB4B,aAAgB20B,EAAQ0Z,oBAU5B+mB,QAAS,WACP,GAAI1tE,GAAK/iB,IACLnB,GAAE,iBAAiBkmC,GAAG,YAAYj3B,QACpCiV,EAAGukE,QAAQnqB,gBAEbp6C,EAAGe,aAMNxf,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYE;ACrT9C,cACA,SAAW15D,GAQTA,EAAOmoE,gBAAkBnoE,EAAOwmE,uBAAuB1wF,QACrDwvF,UAAW,KACXvB,SAAU,KAOV8C,gBAAiB,WACf,MAAO,IAAI3nE,WAAUiC,WAAWxD,MAAMjE,WAAW0hD,iBAQnD8sB,eAAgB,SAAUlE,GACxB,GAAI5sE,GAAK/iB,IACT,OAAO,IAAIuF,IAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW0uE,UAAUhxE,EAAG2qE,QAAQnqF,GAAIwf,EAAGxf,GAAIosF,IAS7ElsB,cAAe,SAAUC,GACvB1jE,KAAKmuF,cAAc1qB,cAAcC,IASnC6b,UAAW,SAAU5kD,EAAQq5D,GAC3Bh0F,KAAKmuF,cAAc5O,UAAU5kD,EAAQq5D,IASvCn2B,UAAW,SAAUljC,EAAQq5D,GAC3Bh0F,KAAKmuF,cAActwB,UAAUljC,EAAQq5D,IASvCC,iBAAkB,SAAU16C,GAC1Bv5C,KAAKmuF,cAAc8F,iBAAiB16C,IAStC26C,8BAA+B,SAAUC,GACvCn0F,KAAKmuF,cAAc+F,8BAA8BC,IASnDC,iCAAkC,SAAUD,GAC1Cn0F,KAAKmuF,cAAciG,iCAAiCD,IAStDE,wBAAyB,WACvBr0F,KAAKmuF,cAAckG,8BAMtB/vF,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYE;ACzG9C,cACA,SAAW15D,GAQTA,EAAO2oE,eAAiB3oE,EAAOwmE,uBAAuB1wF,QACpDwvF,UAAW,KACXvB,SAAU,KAMV8C,gBAAiB,WACf,MAAO,IAAI3nE,WAAUiC,WAAWxD,MAAMjE,WAAWkvE,gBAOnDV,eAAgB,SAAUlE,GACxB,GAAI5sE,GAAK/iB,IACT,OAAO,IAAIuF,IAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW4K,SAASlN,EAAG2qE,QAAQnqF,GAAIwf,EAAGxf,GAAIosF,OAM7ErrF,OAAOiB,GAAGunB,WAAWm4D,UAAUE,YAAYE;ACjC9C,cACA,SAAwB15D,GAStBA,EAAO6oE,cAAgBjvF,GAAG+1B,OAAO75B,QAC/BwI,KAAM,gBAGNwqF,MAAO,KACPC,YAAY,EAGZn0F,KAAM,SAAUo0F,GACd30F,KAAK00F,WAAaC,GAWpBliE,SAAU,SAAUq7D,GAClB,GAAI/qE,GAAK/iB,IAMT,OALA+iB,GAAG0xE,MAAQ3G,EAEX/qE,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+yE,iBAAkB9xE,EAAG+xE,kBAAmB/xE,GAC3EA,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMizE,YAAal2F,EAAEiI,MAAMic,EAAGiyE,cAAejyE,IAC1EA,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMmzE,UAAWp2F,EAAEiI,MAAMic,EAAGmyE,YAAanyE,KAEpEoyE,cAAiBpyE,EAAGqyE,UAexBN,kBAAmB,SAAU7gE,EAAmBohE,EAAUvE,EAASwE,GACjE,GAAIvyE,GAAK/iB,MACJ+iB,EAAG2xE,YAYVM,cAAe,SAAUO,GACvB,GAAIC,GAAiD,MAA9BD,EAAahyF,GAAGi5B,OAAO,EAC9C+4D,GAAaE,UAAYD,GAW3BN,YAAa,SAAUQ,GACrB11F,KAAK21F,cACL31F,KAAK41F,mBAWPA,gBAAiB,WACf,GAAI7yE,GAAK/iB,IACJ+iB,GAAG2xE,YACN3xE,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+zE,kBAAmB,WACpD9yE,EAAG0xE,MAAMU,mBAYfC,QAAS,WACP,GAAItH,GAAO9tF,KAEP81F,EAAiBxsF,EAAEwkF,EAAK1hE,MAAM2pE,MAAMz5E,IAAI,SAAU05E,GACpD,OACEC,SAAUD,EAASn9C,KACnBq9C,QAASF,EAASG,QA4BtB,IAxBArI,EAAKA,KAAKsI,eAAeN,GAEzBxsF,EAAEwsF,GAAgB/1F,KAAK,SAAU2tF,GAC/B,GAAIlF,GAASl/E,EAAEwkF,EAAKuI,UAAU5J,WAAYlpF,GAAImqF,EAAQuI,UACtD,IAAKzN,EAAL,CAEA,GAAI8N,GAAW,SAAUC,EAAIC,GAC3B,GAAIzgB,GAAKwgB,EAAG/N,EAAO0F,OACflY,EAAKwgB,EAAGhO,EAAO0F,OACftmF,EAAOuQ,sBAAsBqwE,EAAO5gF,KAOxC,OALa,UAATA,GAA6B,YAATA,GAA+B,iBAATA,IAC5CmuE,EAAKwgB,EAAG/N,EAAOjlF,IACfyyE,EAAKwgB,EAAGhO,EAAOjlF,KAGVgC,GAAGswE,MAAMC,YAAYC,EAAIC,EAAIpuE,GAGtCkmF,GAAKA,KAAK2I,cAAc/I,EAAQuI,SAAUvI,EAAQwI,SAClDpI,EAAKuH,SAAShsD,KAAKitD,EAAU5I,EAAQwI,YAInB,OAAhBpI,EAAKz1D,OAAiB,CAExB,IAAK,GADDq+D,GAAU5I,EAAKz1D,OAAOD,KAAKnB,UACtB1vB,EAAI,EAAGA,EAAImvF,EAAQ5oF,OAAQvG,IAAK,CACvC,GAAIwvB,GAAM2/D,EAAQnvF,EAClB,IAAIwvB,EAAI4/D,OAAQ,CACd,GAAIC,GAAU9I,EAAKuH,SAASlpF,YAAY4qB,EAAIxzB,GACxCqzF,KACFA,EAAQC,KAAO,MAKrB/I,EAAKuH,SAASyB,SAAS,QAAQ,GAGjChJ,EAAKA,KAAKiJ,aACVjJ,EAAKA,KAAKjqF,UASZ8xF,YAAa,WACX,GAAI5yE,GAAK/iB,IAET+iB,GAAG0xE,MAAM3G,KAAKkJ,OAAOC,UAAU,SAAU7yF,EAAGyb,GAK1C,GAJAkD,EAAG0xE,MAAM7J,aACPmL,OAASl9C,KAAMh5B,EAAKq3E,QAAQ3zF,GAAI4yF,MAAOt2E,EAAKq2E,YAG1CnzE,EAAG2xE,WACL3xE,EAAG0xE,MAAM0C,iBACJ,CAEL,GAAIb,GAAW,SAAUC,EAAIC,GAC3B,GAAIzgB,GAAKwgB,EAAG12E,EAAKq3E,QAAQhJ,OACrBlY,EAAKwgB,EAAG32E,EAAKq3E,QAAQhJ,OACrBtmF,EAAOuQ,sBAAsB0H,EAAKq3E,QAAQtvF,KAO9C,OAJa,UAATA,GAA6B,YAATA,IACtBmuE,EAAKwgB,EAAG12E,EAAKq3E,QAAQ3zF,IACrByyE,EAAKwgB,EAAG32E,EAAKq3E,QAAQ3zF,KAEhBgC,GAAGswE,MAAMC,YAAYC,EAAIC,EAAIpuE,GAGtCmb,GAAG0xE,MAAMY,SAAShsD,KAAKitD,EAAUz2E,EAAKq2E,gBAO7C3wF,GAAGunB,WAAWm4D,UAAUE;ACxM3B,cACA,SAAyBx5D,GAavBA,EAAOyrE,eAAiB7xF,GAAG+1B,OAAO75B,QAChCwI,KAAM,iBACNwqF,MAAO,KACP4C,aAAc,KAEdC,2BAA4B,KAU5B7kE,SAAU,SAAUq7D,GAClB,GAAI/qE,GAAK/iB,IACT+iB,GAAGe,SACHf,EAAG0xE,MAAQ3G,EAEX/qE,EAAGu0E,2BAA6B,GAAIC,OAAMC,KAAKC,yBAE/C,IAAIzhD,GAAIzwC,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,KAQvB,OAPAgsE,GAAK3rE,KAAK6zB,EAAE6+C,iBAAkBh2F,EAAEiI,MAAMic,EAAG+xE,kBAAmB/xE,IAC5D+qE,EAAK3rE,KAAK6zB,EAAEi/C,UAAWp2F,EAAEiI,MAAMic,EAAGmyE,YAAanyE,IAC/C+qE,EAAK3rE,KAAK6zB,EAAE++C,YAAal2F,EAAEiI,MAAMic,EAAGiyE,cAAejyE,IACnD+qE,EAAK3rE,KAAK6zB,EAAE0hD,+BAAgC74F,EAAEiI,MAAMic,EAAG40E,8BAA+B50E,IACtF+qE,EAAK3rE,KAAK6zB,EAAE4hD,gCAAiC/4F,EAAEiI,MAAMic,EAAG80E,+BAAgC90E,IACxF+qE,EAAK3rE,KAAK6zB,EAAE6/C,kBAAmBh3F,EAAEiI,MAAMic,EAAG+0E,mBAAoB/0E,KAG5Dg1E,mBAAsBh1E,EAAGi1E,6BACzBC,mBAAsBl1E,EAAGm1E,6BACzBC,eAAkBp1E,EAAGq1E,2BAWzBT,8BAA+B,SAAU7G,GACvC,GAAI/tE,GAAK/iB,IACT+iB,GAAGs1E,uBAAuBvH,IAU5B+G,+BAAgC,SAAU/G,GACxC,GAAI/tE,GAAK/iB,IACT+iB,GAAGu1E,uBAAuBxH,IAU5BkH,6BAA8B,SAAUO,GACtC,GAAIx1E,GAAK/iB,KACLw4F,EAAWlvF,EAAEyZ,EAAGqJ,MAAMqsE,cAAcn8E,IAAI,SAAUksE,GACpD,GAAI+P,EAAUntF,QAAQo9E,EAAO3vC,SAAU,EAAI,CACzC,GAAI9C,GAAW,IAAMhzB,EAAG+qE,KAAK4K,SAAWlQ,EAAO3vC,IAI/C,OAHA9C,GAAWA,EAASh4B,WAAW,IAAK,OACpClf,EAAEk3C,GAAUrF,SACZ3tB,EAAGsyE,SAASsD,cAAcnQ,EAAO3vC,MAC1B,KAEP,MAAO2vC,IAMX,OAFAzlE,GAAG6nE,aAAc6N,aAAcnvF,EAAEkvF,GAAU/N,YAC3C1nE,EAAGo0E,aACIp0E,GAUTiyE,cAAe,SAAUO,GACvB,GAAIC,GAAiD,MAA9BD,EAAahyF,GAAGi5B,OAAO,EACxB,UAAtB+4D,EAAa3tF,IAC8B,WAAtB2tF,EAAa3tF,IAElC2tF,GAAaqD,eAAkBpD,EAAkB,eAAiB,GAE7DA,IACHD,EAAuB,UACrBsD,OAAQtD,EAAahyF,GACrBu1F,UAAW,SAAU/7E,GACnB,MAAOw4E,GAAatrF,KAAO,KAAO8S,EAAEqb,KAAK,GAAGm9D,EAAarH,QAE3DoI,SAAU,SAAUC,EAAIC,GACtB,GAAI3tB,GAAY0sB,EAAaiD,SAAStC,QAAU,GAAI,EAEhDngB,EAAKwgB,EAAGn+D,KAAK,GAAGm9D,EAAarH,OAC7BlY,EAAKwgB,EAAGp+D,KAAK,GAAGm9D,EAAarH,MAEjC,OAAOrlB,GAAYtjE,GAAGswE,MAAMC,YAAYC,EAAIC,EAAIuf,EAAa3tF,OAE/DgjE,WAAW,EACXsrB,SAAS,KAafpB,kBAAmB,SAAU7gE,EAAmB8kE,EAAgBjI,EAASkI,GAGvE,MAFAA,GAAsC,wBAAI,EAC1CD,EAA0C,0BAAI/4F,KAAKs3F,2BAC5Ct3F,MAYTk1F,YAAa,SAAUQ,GACrB,GAAI3yE,GAAK/iB,IAuDT,OAtDAuiB,KAAIozB,MAAM,OAAQ,4BAGlB5yB,EAAG0xE,MAAM3G,KAAKt7D,eAAexyB,KAAKs3F,4BAGlCv0E,EAAG0xE,MAAM3G,KAAKmL,mBAAmBhC,UAAU,WACzC10E,IAAIozB,MAAM,OAAQ,mDAClB,IAAI6iD,GAAWz1E,EAAGm2E,eACdC,EAAc7vF,EAAEkvF,GAAUY,MAAM,OAEpC72E,KAAIozB,MAAM,OAAQ,6BASbrsC,EAAE+vF,QAAQF,EAAap2E,EAAGs0E,gBAC7Bt0E,EAAG0xE,MAAM7J,aAAc6N,aAAcD,IACrCz1E,EAAG0xE,MAAMY,SAASiE,oBAClBv2E,EAAG0xE,MAAM0C,cAGXp0E,EAAGs0E,aAAe8B,IAIpBp2E,EAAG0xE,MAAM3G,KAAKyL,UAAUtC,UAAU,SAAU5zF,EAAO1D,GACjD4iB,IAAIozB,MAAM,OAAQ,yBAClB,IAAI6jD,GAAU75F,EAAK6oF,OACfyN,EAAWuD,EAAQt1F,KAAK,QAAQa,KAAK,OACzCge,GAAG0xE,MAAMY,SAASsD,cAAc1C,EAAU,KAAMuD,EAChD,IAAIlgC,GAAQz6D,EAAE,gDAAiDkkB,EAAG0xE,MAAMxgE,mBAAmBqlC,MAAMkgC,EACjGz2E,GAAG0xE,MAAMgF,WAAWxD,EAAU38B,KAIhCv2C,EAAG0xE,MAAM3G,KAAK4L,YAAYzC,UAAU,SAAU7yF,EAAGyb,GAC/C0C,IAAIozB,MAAM,OAAQ,2BAClB,IAAIgkD,GAAe52E,EAAG0xE,MAAMroE,MAAMqsE,aAC9BmB,EAAWtwF,EAAEqwF,GAAclN,WAAY5zC,KAAMh5B,EAAKo2E,UACtD2D,GAASC,UAAYh6E,EAAKq2E,QAE1BnzE,EAAG0xE,MAAM7J,aAAc6N,aAAckB,IAAgB,GACrD52E,EAAG0xE,MAAM0C,eAGXp0E,EAAG+2E,mBACH/2E,EAAGg3E,qBACHh3E,EAAGs0E,aAAe/tF,EAAEyZ,EAAGm2E,gBAAgBE,MAAM,QAEtCr2E,GAWT+2E,iBAAkB,WAChBv3E,IAAIozB,MAAM,OAAQ,qBAClB,IAAI5yB,GAAK/iB,IAWT,IANA+iB,EAAG0xE,MAAM0D,eAAep1E,EAAG0xE,MAAMroE,MAAM4tE,qBAKvCj3E,EAAG0xE,MAAMY,SAAS4E,QAAQl3E,EAAG0xE,MAAM3G,MAC/B/qE,EAAG0xE,MAAMroE,MAAMqsE,aAAc,CAG/B,GAAIyB,GAAW5wF,EAAEA,EAAEyZ,EAAG0xE,MAAMroE,MAAMqsE,cAAcn8E,IAAI,SAAUksE,GAC5D,GAAI2R,GAAa7wF,EAAEyZ,EAAG0xE,MAAM4B,UAAU5J,WAAYlpF,GAAMilF,EAAO3vC,MAC/D,OAAMshD,GAAmB3R,EACb,QACViC,UAEAqG,EAAUxnF,EAAE4wF,GAAU59E,IAAI,SAAUksE,GACtC,GAAI2R,GAAa7wF,EAAEyZ,EAAG0xE,MAAM4B,UAAU5J,WAAYlpF,GAAMilF,EAAO3vC,MAG/D,OADAshD,GAAW3B,SAAStC,QAAU1N,EAAOqR,UAC9BM,GAGTp3E,GAAG0xE,MAAMY,SAAS+E,sBAAsBtJ,GAa1C,MAPAxnF,GAAEyZ,EAAG0xE,MAAMroE,MAAMqsE,cAAc14F,KAAK,SAAUyoF,EAAQnR,GACpD/tE,EAAEk/E,EAAO6R,QAAQt6F,KAAK,SAAU4sF,GAC9B5pE,EAAG0xE,MAAMY,SAASiF,oBAAoBjjB,EAAOsV,GAAO,OAIxD5pE,EAAGw3E,yBACIx3E,GAWTg3E,mBAAoB,WAClB,GAAIh3E,GAAK/iB,IAKT,OAJA+iB,GAAG0xE,MAAMY,SAASmF,wBAA0B,SAAUC,EAAaC,GAEjE,MADA33E,GAAG0xE,MAAMwD,mBAAmBwC,EAAaC,GAClC33E,EAAG0xE,MAAM0C,cAEXp0E,GAWTw3E,uBAAwB,WACtBh4E,IAAIozB,MAAM,OAAQ,uBAClB,IAAI5yB,GAAK/iB,IA4CT,OA1CAnB,GAAE,kBAAkB42F,UAClBkF,YAAa53E,EAAG0xE,MAAMxgE,kBACtB2mE,YAAa,aACbC,OAAQ,OACRC,UAAW,UACXC,SAAU,GACVp2F,OAAQ,mCACRi8D,YAAa,kEACbo6B,sBAAsB,EACtBz1D,KAAM,SAAUliC,EAAOmiF,GACrBziE,EAAG0xE,MAAMY,SAAS4F,cAClBl4E,EAAG0xE,MAAMY,SAAS6F,sBAEpBC,QAAS,SAAU93F,EAAOyrF,GAGxB,GAAIA,EAAGjoF,KAAKpH,SAAS,gBAAiB,CACpCZ,EAAEiwF,EAAGsM,QAAQ3F,SAAS,SACtB,IAAI4F,GAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KAE3B,YADAswD,GAAMh4D,YAAY18B,EAAE,8CAItBoc,EAAG0xE,MAAM7J,aAAc0Q,UAAa,GAEpC,IAAI9B,GAAU36F,EAAEiwF,EAAGjoF,MACfovF,EAAWuD,EAAQt1F,KAAK,QAAQa,KAAK,QACrCu0D,EAAQz6D,EAAE,yCAA0CkkB,EAAG0xE,MAAMxgE,mBAAmBqlC,MAAMkgC,GAGtF+B,EAAiBjyF,EAAEyZ,EAAG0xE,MAAMroE,MAAM2pE,MAAMtJ,WAAY5zC,KAAMo9C,IAC1DzN,EAASl/E,EAAEyZ,EAAG0xE,MAAM4B,UAAU5J,WAAYlpF,GAAI0yF,GAClDzN,GAAOgQ,SAAStC,SAAYqF,GAAkBA,EAAepF,MAE7DpzE,EAAG0xE,MAAMY,SAASmG,kBAAkB38F,IAAKiwF,EAAGjoF,KAAMyyD,GAClDv2C,EAAG0xE,MAAMY,SAASoG,cAAcjC,EAASz2E,EAAG0xE,MAAM4B,UAElDmD,EAAQ91F,KAAMzC,MAAS,SACvB8hB,EAAG0xE,MAAMiH,WAAWzF,MAIjBj2F,MAWTk5F,aAAc,WACZ,GAAIn2E,GAAK/iB,KAELs1B,EAAShsB,EAAEyZ,EAAG0xE,MAAMY,SAASsG,eAAer/E,IAAI,SAAUs/E,GAC5D,OACE/iD,KAAM+iD,EAAI/C,OACVgB,UAAW+B,EAAI1F,QACfmE,YAKJ,OADAt3E,GAAG84E,mBAAmBvmE,EAAOxnB,QACtBwnB,GAWTumE,mBAAoB,SAAUC,GAC5B,GAAI/4E,GAAK/iB,IAMT,OALI87F,GAAc,EAChBj9F,EAAE,qBAAsBkkB,EAAG0xE,MAAMxgE,mBAAmB3zB,OAEpDzB,EAAE,qBAAsBkkB,EAAG0xE,MAAMxgE,mBAAmBhyB,OAE/CjC,MAgBTk4F,6BAA8B,SAAUuC,EAAasB,GACnDx5E,IAAIozB,MAAM,OAAQ,2BAA6B8kD,EAC/C,IAAI13E,GAAK/iB,KACLq2B,EAASokE,EAAYxrF,MAAM,OAC3BmQ,EAAYiX,EAAOvoB,OAAS,EAE5BkuF,EAAkBj5E,EAAGqJ,MAAMqsE,YAC/B,IAAIsD,EACFC,EAAgB58E,GAAWi7E,OAAO9mF,KAAKknF,OAClC,CACL,GAAInhC,GAAQ0iC,EAAgB58E,GAAWi7E,OAAOjvF,QAAQqvF,EACtDuB,GAAgB58E,GAAWi7E,OAAOllF,OAAOmkD,EAAO,GAOlD,MAJAv2C,GAAG6nE,aACD6N,aAAcuD,EACdC,yBAA4BF,EAAyB,cAAdtB,IACtC,GACI13E,GAWT+0E,mBAAoB,WAKlB,MAHA93F,MAAKy0F,MAAM7J,aACTqR,yBAA0B,gBAErBj8F,MAYTo4F,yBAA0B,SAAU8D,GAClC35E,IAAIozB,MAAM,OAAQ,wBAA0BumD,EAC5C,IAAIn5E,GAAK/iB,KACLm8F,EAAWt9F,EAAE,qBAAsBkkB,EAAGkR,mBACtCmoE,EAAWv9F,EAAE,iBAAkBkkB,EAAGkR,kBAyBtC,OAvBAkoE,GAAS10F,KAAKd,EAAE,sDACZoc,EAAGqJ,MAAMqsE,aAAa3qF,OACxBquF,EAAS77F,OAET67F,EAASl6F,OAGPi6F,GACFE,EAASn6F,OAET8gB,EAAG+qE,KAAKuO,YACNC,gBAAgB,EAChBC,iBAAkBH,EAASz1B,gBAE7B5jD,EAAG+qE,KAAK0O,iBACRz5E,EAAG6nE,aAAcoP,qBAAqB,IAAQ,KAE9CoC,EAAS97F,OAETyiB,EAAG+qE,KAAKuO,YAAaC,gBAAgB,IACrCv5E,EAAG+qE,KAAK0O,iBACRz5E,EAAG6nE,aAAcoP,qBAAqB,IAAS,IAE1Cj3E,GAYTs1E,uBAAwB,SAAUoE,GAChC,GAAI15E,GAAK/iB,IAST,OAPAsJ,GAAEyZ,EAAG0xE,MAAMroE,MAAMqsE,cAAc14F,KAAK,SAAU28F,GAC5C,GAAIlU,GAASl/E,EAAEyZ,EAAG0xE,MAAM4B,UAAUnyF,KAAK,SAAU03F,GAC/C,MAAOA,GAAIr4F,KAAOm5F,EAAU7jD,MAE9B4jD,GAAqBlpF,KAAKi1E,KAGrBzlE,GAYTu1E,uBAAwB,SAAUmE,GAChC,GAAI15E,GAAK/iB,KACL28F,IAoBJ,OAlBArzF,GAAEyZ,EAAG0xE,MAAMroE,MAAMqsE,cAAc14F,KAAK,SAAU28F,GAG5C,GAAIpjC,GAAQhwD,EAAEmzF,GAAsBtQ,UAAU,SAAUyQ,GACtD,MAAOA,GAAcr5F,KAAOm5F,EAAU7jD,MAEpCygB,MAAU,EAEZmjC,EAAqBtnF,OAAOmkD,EAAO,GAGnCqjC,EAAkBppF,KAAKmpF,EAAU7jD,QAKrC91B,EAAG0xE,MAAMsD,mBAAmB4E,GAErB55E,MAKVxd,GAAGunB,WAAWm4D,UAAUE;ACthB3B,cACA,SAAuBx5D,GAYrBA,EAAOkxE,aAAet3F,GAAG+1B,OAAO75B,QAC9BwI,KAAM,eAEN6yF,UAAW,EACXC,SAAU,IAEVtI,MAAO,KACPuI,QAAS,KACTC,gBAAiB,KACjBC,kBAAmB,KAGnB38F,KAAM,WACJP,KAAK8jB,UAYP2O,SAAU,SAAUq7D,GAClB,GAAI/qE,GAAK/iB,IAST,OARA+iB,GAAGe,SAEHf,EAAG0xE,MAAQ3G,EAEXA,EAAK3rE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMq7E,aAAct+F,EAAEiI,MAAMic,EAAGq6E,sBAAuBr6E,IAC/E+qE,EAAK3rE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+zE,kBAAmBh3F,EAAEiI,MAAMic,EAAGs6E,qBAAsBt6E,IACnF+qE,EAAK3rE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMmzE,UAAWp2F,EAAEiI,MAAMic,EAAGmyE,YAAanyE,KAGhEu6E,aAAgBz+F,EAAEiI,MAAMic,EAAGw6E,uBAAwBx6E,KAYvDmyE,YAAa,SAAUQ,GACrB,GAAI3yE,GAAK/iB,IAgET,OA9DA+iB,GAAGy6E,YAAYjsF,KAAK,WAGlBwR,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM27E,YAAa,SAAUnkC,EAAO9R,EAAc4hC,GAE7ErmE,EAAG26E,kBAAkBnsF,KAAK,WAExB+nD,EAAQA,GAAS,IACjBA,GAASA,EAET9R,GAAgBA,EAEZA,EAAezkC,EAAGg6E,WAAah6E,EAAG0xE,MAAMroE,MAAMqsE,aAAa3qF,QAAoB,IAAVwrD,GACvEv2C,EAAG46E,eAAen2C,GAGpBzkC,EAAG+5E,UAAYxjC,EAED,IAAVA,GAAe9R,GAAgBzkC,EAAGg6E,SACpCh6E,EAAGk6E,gBAAgBW,SAASt9F,OAE5ByiB,EAAGk6E,gBAAgBW,SAAS37F,OAG1Bq3D,EAAQ,EAEVv2C,EAAGk6E,gBAAgBr7D,KAAKgsC,IAAI7qD,EAAGk6E,gBAAgBp7F,OAAOkD,KAAK,gBAAiB,SAE5Ege,EAAGk6E,gBAAgBr7D,KAAKgsC,IAAI7qD,EAAGk6E,gBAAgBp7F,OAAOkD,KAAK,gBAAiB,OAG9E,IAAI84F,GAAevkC,EAAQv2C,EAAGg6E,SAAY,EACtCe,GAAaxkC,EAAQ,GAAKv2C,EAAGg6E,QAE5Bz2B,OAAM9e,KAELA,GAAgBzkC,EAAGg6E,UACrBe,EAAYD,EAAcr2C,EAAe,EACzCzkC,EAAGk6E,gBAAgBt7D,KAAKisC,IAAI7qD,EAAGk6E,gBAAgBp6B,MAAM99D,KAAK,gBAAiB,SAE3Ege,EAAGk6E,gBAAgBt7D,KAAKisC,IAAI7qD,EAAGk6E,gBAAgBp6B,MAAM99D,KAAK,gBAAiB,SAI/E,IAAIg5F,GAAmBv2C,EAAe,EAAMq2C,EAAc,MAAQC,EAAcxkC,EAAQ9R,CACxFzkC,GAAGk6E,gBAAgB7gC,YAAY30D,KAAKs2F,GAGhCv2C,EAAezkC,EAAGg6E,UAEpB3T,EAAQpkB,UAMdjiD,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMk8E,YAAa,WAC9Cn/F,EAAE,kBAAmBkkB,EAAG0xE,MAAMxgE,mBAAmBpvB,UAAU,OAKxDke,GAWTq6E,sBAAuB,WACrB,GAAIr6E,GAAK/iB,KAGLi+F,EAASl7E,EAAG0xE,MAAMxgE,kBAClBzP,EAAM,GAAIjf,IAAGkf,IACby5E,EAAiBr/F,EAAEsoB,UAAU2tD,mBAAmBtwD,EAAIuwD,eAAe,oBAAsB,KAe7F,OAdImpB,GAAe9yF,QAAQ6yF,MAAY,IAErC14F,GAAGmnB,MAAMmuB,QAAQ,kBAAoBojD,EAAQ,GAE7CC,EAAe3qF,KAAK0qF,GACpBz5E,EAAIwwD,eAAe,iBAAkBO,mBAAmB12E,EAAEwkB,OAAO66E,KACjE55F,OAAO6sB,SAASrpB,KAAO0c,EAAIpB,YAI7BL,EAAG0xE,MAAM7J,aACP0Q,WAAY/1F,GAAGmnB,MAAMsvB,QAAQ,kBAAoBiiD,IAAW,IAGvDl7E,GAWTs6E,qBAAsB,WACpB,GAAIt6E,GAAK/iB,KAGLi+F,EAASl7E,EAAG0xE,MAAMxgE,iBAGtB,OAFA1uB,IAAGmnB,MAAMmuB,QAAQ,kBAAoBojD,EAAQl7E,EAAG0xE,MAAMroE,MAAMkvE,WAErDv4E,GAUTw6E,uBAAwB,WACtBv9F,KAAK09F,mBAYPF,UAAW,WACT,GAAIz6E,GAAK/iB,KACLm+F,EAAiBt/F,EAAEkkB,EAAG0xE,MAAMxgE,kBAOhC,OALIlR,GAAG0xE,MAAMroE,MAAMkvE,YAAWv4E,EAAG+5E,WAAa/5E,EAAG0xE,MAAMroE,MAAMkvE,WACzDv4E,EAAG0xE,MAAMroE,MAAMgyE,OAAMr7E,EAAGg6E,UAAYh6E,EAAG0xE,MAAMroE,MAAMgyE,MACvDr7E,EAAGi6E,QAAUn+F,EAAE,8CACfs/F,EAAen/F,OAAO+jB,EAAGi6E,SAElBj6E,EAAG26E,mBAWZA,gBAAiB,WACf,GAAI36E,GAAK/iB,KACLosB,EAAQrJ,EAAG0xE,MAAMroE,MAEjBiyE,EAAW,SAAU14B,GACvB,GAAIA,GAAS5iD,EAAGg6E,SAAU,MAAO,uBAG/BxgB,GACFn5E,KAAM,+BACNk7F,OAAQ,gCACRx3D,MAAO,mCAGLy3D,EAAgBnyE,EAAMoyE,gBAAmB3lD,KAAQ,GAAI8xC,aAAgB,GAAI8T,YAAe,GAAItf,WAAa,GACzGuf,EAAuB37E,EAAG+5E,UAAY/5E,EAAGg6E,SAAY,EAAMh6E,EAAG+5E,UAAY/5E,EAAGg6E,SAAY,EAAK,OAAUh6E,EAAG+5E,UAAY,GAAK/5E,EAAGg6E,SAAY,OAASh6E,EAAGg6E,SACvJnd,EAAa/gF,EAAE2V,KAAK+pF,EAAc1lD,MAElCl5C,EAAO4F,GAAG0nB,KAAK2uD,SACjBv3D,GAAI,mBACJ8hD,MAAS,uBACTw4B,oBAAqD,KAA/BJ,EAAc5T,aACpCiU,kBAAmBhf,EAAW3jE,MAAM,IACpC4iF,sBAAuBjf,EACvBh4B,iBAAkB22C,EAAc5T,aAChCmU,WAAYP,EAAcE,YAC1BM,gBAAiBR,EAAcS,UAC/BC,oBAAqBP,EACrBQ,YAAan8E,EAAG+5E,UAAY,EAC5BxB,UAAWv4E,EAAG+5E,UACdqC,UACItmD,KAAM,GAAIumD,SAAUf,EAAS,MAC7BxlD,KAAM,GAAIumD,SAAUf,EAAS,MAC7BxlD,KAAM,GAAIumD,SAAUf,EAAS,MAC7BxlD,KAAM,IAAKumD,SAAUf,EAAS,OAElCgB,eAAe,EACfC,cAAc,EACdC,cAAc,EACdC,cAAc,GAIhB,OAAOj6F,IAAG0nB,KAAKppB,OAAO,wBAAyBlE,GAAM,GAAO,EAAO48E,GAAUhrE,KAAK,SAAUkuF,GAE1F18E,EAAGi6E,QAAQp5F,KAAK67F,GAEhB18E,EAAG0xE,MAAM3G,KAAKuO,YACZqD,cAAc,EACdC,eAAgB58E,EAAGi6E,QAAQr2B,gBAG7B5jD,EAAG0xE,MAAM3G,KAAK0O,iBAEdz5E,EAAGilE,cACHjlE,EAAG68E,kBAaP5X,YAAa,WACX,GAAIjlE,GAAK/iB,IAgBT,OAfA+iB,GAAGk6E,iBACD4C,iBAAkBhhG,EAAE,oBAAqBkkB,EAAGi6E,SAC5C8C,kBAAmBjhG,EAAE,qBAAsBkkB,EAAGi6E,SAC9CY,SAAU/+F,EAAE,kBAAmBkkB,EAAGi6E,SAClCr7D,KAAM9iC,EAAE,gBAAiBkkB,EAAGi6E,SAC5Bp7D,KAAM/iC,EAAE,gBAAiBkkB,EAAGi6E,SAC5Bn7F,MAAOhD,EAAE,iBAAkBkkB,EAAGi6E,SAC9Bn6B,KAAMhkE,EAAE,gBAAiBkkB,EAAGi6E,SAC5BD,SAAUl+F,EAAE,sBAAuBkkB,EAAGi6E,SACtC5gC,YAAav9D,EAAE,mBAAoBkkB,EAAGi6E,UAGxCj6E,EAAGg9E,oBACHh9E,EAAGi9E,mBAEIj9E,GAKTg9E,kBAAmB,WACjB,GAAIh9E,GAAK/iB,IAYT,OATA+iB,GAAGk6E,gBAAgB4C,iBAAiB58F,MAAM,WACxCqB,OAAO27F,QAAQC,gBAIjBn9E,EAAGk6E,gBAAgB6C,kBAAkB78F,MAAM,WACzCqB,OAAO27F,QAAQH,kBAAkBjhG,EAAEmB,MAAM+kC,GAAG,eAGvChiB,GAITi9E,iBAAkB,WAChB,GAAIj9E,GAAK/iB,KAELiI,EAAa,SAAUvG,GAGzB,MAFAA,GAAK7C,EAAE6C,GAE0B,SAA7BA,EAAGqD,KAAK,kBAIVo7F,EAAa,SAAUz+F,GACzBA,EAAK7C,EAAE6C,GACPA,EAAGqD,KAAK,gBAAiB,QAEzBge,EAAGq9E,WAAW7uF,KAAK,WACjBwR,EAAG0xE,MAAM5yE,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMk8E,YAAaj7E,EAAG+5E,WACnDp7F,EAAGqD,KAAK,gBAAiB,WAuC7B,OAnCAge,GAAGk6E,gBAAgBt7D,KAAK1+B,MAAM,WACxBgF,EAAWjI,QACf+iB,EAAG+5E,WAAa,EAChBqD,EAAWngG,SAGb+iB,EAAGk6E,gBAAgBr7D,KAAK3+B,MAAM,WACxBgF,EAAWjI,QACf+iB,EAAG+5E,WAAa,EACZ/5E,EAAG+5E,UAAY,IAAG/5E,EAAGu2C,MAAQ,GACjC6mC,EAAWngG,SAGb+iB,EAAGk6E,gBAAgBp7F,MAAMoB,MAAM,WACzBgF,EAAWjI,QACf+iB,EAAG+5E,UAAY,EACfqD,EAAWngG,SAGb+iB,EAAGk6E,gBAAgBp6B,KAAK5/D,MAAM,WACxBgF,EAAWjI,QACf+iB,EAAG+5E,WAAY,EACfqD,EAAWngG,SAGb+iB,EAAGk6E,gBAAgBF,SAASzpD,OAAO,WACbvwB,EAAGg6E,SACHh6E,EAAG+5E,SAEvB/5E,GAAGg6E,SAAWl+F,EAAEmB,MAAMiU,MACtB8O,EAAG+5E,UAAY,EACfqD,EAAWngG,MACX+iB,EAAG0xE,MAAM5yE,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMu+E,kBAAmBt9E,EAAGg6E,YAGpDh6E,GAUT68E,aAAc,WACZ,GAAI78E,GAAK/iB,IAMT,OALAnB,GAAE,YAAakkB,EAAGu9E,QACf18F,KAAK+C,EAAE,uBACPjH,SAAS,UACTqF,KAAK,QAAS4B,EAAE,6BAChB5D,IAAI,QAASlE,EAAEiI,MAAMic,EAAGw9E,8BAA+Bx9E,IACnDA,GAWTw9E,8BAA+B,WAC7B,GAAIx9E,GAAK/iB,KACLwgG,EAAY3hG,EAAE,YAAakkB,EAAGu9E,QAAQhhG,YAAY,UAElD0vB,EAAUnwB,EAAE,kBAAmBkkB,EAAGu9E,QAClCG,EAAmBn6F,WAAW,WAChCk6F,EAAUlgG,OACV0uB,EAAQ/sB,QACP,KAEC04B,EAAS5X,EAAG0xE,MAAMroE,MAAMs0E,kBAAoB,GAC5CnC,EAAgBx7E,EAAG0xE,MAAMroE,MAAMoyE,aAmBnC,OAlBID,IACEA,EAAcS,YACXrkE,EAG8B,KAA7B4jE,EAAcoC,aAChBhmE,EAAS,IAAMA,EAAS,QAAU4jE,EAAcoC,WAAa,KAH/DhmE,EAAS4jE,EAAcoC,YAS7B59E,EAAG0xE,MAAMmM,YAAYta,WAAW3rD,EAAQ5X,EAAG0xE,MAAMroE,MAAMy0E,2BAA2BtvF,KAAK,SAAUnK,GAC/FnB,aAAaw6F,GACbzxE,EAAQ1uB,OAERyiB,EAAG46E,eAAev2F,KAEb2b,GAIT46E,eAAgB,SAAUmD,GACxB,GAAI/9E,GAAK/iB,KACLwgG,EAAY3hG,EAAE,YAAakkB,EAAGu9E,QAAQhhG,YAAY,SAEtDkhG,GACG58F,KAAK+C,EAAE,gBAAiBm6F,IACxB/7F,KAAK,QAAS4B,EAAE,wBAChB1E,QAQLm+F,SAAU,WACR,GAAIr9E,GAAK/iB,KACLqmF,GACFiV,UAAWv4E,EAAG+5E,UACdsB,KAAMr7E,EAAGg6E,SAEX,OAAOh6E,GAAG0xE,MAAM0C,WAAW9Q,OAK9B9gF,GAAGunB,WAAWm4D,UAAUE;CCrd3B,SAAyBx5D,GACvB,YAUAA,GAAOo1E,eAAiBx7F,GAAG+1B,OAAO75B,QAChCwI,KAAM,iBAGNwqF,MAAO,KAEPuM,kBAAmB,KAYnBvuE,SAAU,SAAUq7D,GAClB,GAAI/qE,GAAK/iB,IAcT,OAbA+iB,GAAG0xE,MAAQ3G,EAGX/qE,EAAGi+E,kBAAoB,GAAIzJ,OAAM0J,sBAC/BhL,SAAU,YACV50F,SAAU,yBACV6/F,QAASv6F,EAAE,cACXiyF,eAAgB,wBAChB33F,MAAO,KAGT8hB,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+yE,iBAAkBh2F,EAAEiI,MAAMic,EAAG+xE,kBAAmB/xE,IACnFA,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMmzE,UAAWp2F,EAAEiI,MAAMic,EAAGmyE,YAAanyE,QAexE+xE,kBAAmB,SAAU7gE,EAAmBohE,EAAUvE,EAAS72D,GACjE,GACIknE,GAAqBnhG,KAAKghG,kBAAkBI,sBAC5C5Y,EAASl/E,EAAEmjF,UAAUqE,GAAWvtF,GAAI49F,EAAmB59F,IAC3D1E,GAAE4C,OAAO+mF,EAAQ2Y,IAWnBjM,YAAa,WACX,GAAInyE,GAAK/iB,IACTA,MAAKy0F,MAAM3G,KAAKuT,kBAAkB,GAAI9J,OAAM+J,mBAAoBC,iBAAiB,KACjFvhG,KAAKy0F,MAAM3G,KAAKt7D,eAAexyB,KAAKghG,mBAEpChhG,KAAKy0F,MAAMY,SAASmM,kBAAkBz+E,EAAG0xE,MAAM3G,MAAM,GAGrD/qE,EAAG0xE,MAAM3G,KAAK2T,sBAAsBxK,UAAU,SAAU7yF,EAAGyb,GACzDkD,EAAG0xE,MAAM5yE,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM4/E,yBAIrC3+E,EAAG0xE,MAAM3G,KAAK1jF,QAAQ6sF,UAAU,SAAU7yF,EAAGyb,GAG3C,IAAIkD,EAAG0xE,MAAMY,SAASr5C,QAAQn8B,EAAKkX,KAAK4qE,aAAxC,CAEA5+E,EAAG0xE,MAAM3G,KAAK8T,oBAAoBC,mBAAmBz9F,GAAG,EAExD,IAAI1C,GAAK7C,EAAEuF,EAAE+B,QAAQvE,QAAQ,eAAesC,KAAK,YACjDxC,GAAG0mD,QAAQ,yBAMhB7iD,GAAGunB,WAAWm4D,UAAUE;CCpG3B,SAA4Bx5D,GAC1B,YAWAA,GAAOm2E,kBAAoBv8F,GAAG+1B,OAAO75B,QACnCwI,KAAM,oBAGN83F,uBACAC,iBAAkB,KAClBC,aAAc,KACdxN,MAAO,KACPyN,MAAO,KAEP3hG,KAAM,SAAUsf,EAAMsiF,GACpB,GAAIp/E,GAAK/iB,IACTA,MAAK8jB,SACDq+E,IAAUp/E,EAAGm/E,MAAQC,GACpBtiF,EAAKuiF,KAGRpiG,KAAK+hG,oBAAsBliF,EAF3B7f,KAAKgiG,iBAAmBniF,GAe5B4S,SAAU,SAAUq7D,GAClB,GAAI/qE,GAAK/iB,IAGT,OAFA+iB,GAAG0xE,MAAQ3G,GAGTuU,gBAAmBxjG,EAAEiI,MAAMic,EAAGu/E,0BAA2Bv/E,KAa7Du/E,0BAA2B,SAAU5gG,EAAIvC,GACvC,GAAI4jB,GAAK/iB,KAELsd,EAAIne,EAAGurD,OAASvrD,EAAGmiE,QACnBptD,EAAI/U,EAAGwrD,OAASxrD,EAAGojG,OAWvB,OATIviG,MAAK+hG,oBAAoBK,KAC3Br/E,EAAGy/E,uBAAuBllF,EAAEpJ,EAAE/U,EAAGuC,GAEjCqhB,EAAG0/E,qBAAqBnlF,EAAEpJ,EAAE/U,GAI1BA,EAAG6D,gBAAgB7D,EAAG6D,iBAC1B7D,EAAGuF,cAAe,GACX,GAaT89F,uBAAwB,SAAUllF,EAAGpJ,EAAG/U,EAAIuC,GAC1C,GACI+jF,GAAM5mF,EAAE6C,EACZ+jF,GAAI1gF,KAAK,OAAQ,YACjB0lD,gBAAgBg7B,EAAKzlF,KAAK+hG,oBAAsB5iG,GAAOiE,KAAQka,EAAG7a,IAAOyR,QAa3EuuF,qBAAsB,SAAUnlF,EAAGpJ,EAAG/U,GACpC,GAAI4jB,GAAK/iB,IACTuF,IAAG4mB,KAAK5a,KAAK,WACXwR,EAAGi/E,iBAAiB/H,QAAQl3E,EAAG0xE,OAC/B1xE,EAAGi/E,iBAAiBU,QAAQ3/E,EAAGm/E,OAC/Bn/E,EAAGk/E,aAAe,GAAI18F,IAAGygB,IAAI++D,MAAM4d,gBAAgB,OAAQ5/E,EAAGi/E,iBAAiBY,cAAczjG,IAC3F0D,OAAU,WACRkgB,EAAG8/E,6CAA6C1jG,GAAIO,SAAS,gBAE/DE,OAAU,WACRmjB,EAAG8/E,6CAA6C1jG,MAGpD4jB,EAAGk/E,aAAa/+F,OAAOoa,EAAGpJ,EAAG/U,GAC7B4jB,EAAGi/E,iBAAiBc,uBAAuB//E,EAAGk/E,aAAc9iG,EAAI4jB,EAAG0xE,UAYvEoO,6CAA8C,SAAU1jG,GACtD,GAAIgH,GAAShH,EAAGgH,QAAUhH,EAAG4jG,WACzBC,EAAOnkG,EAAEsH,GAAQvE,QAAQ,gBAE7B,OADAohG,GAAKvvF,SAAS60B,SAAS,gBAAgBhpC,YAAY,eAC5C0jG,MAKVz9F,GAAGunB,WAAWm4D,UAAUE;CC5I3B,SAA6Bx5D,GAC3B,YAUAA,GAAOs3E,mBAAqB19F,GAAG+1B,OAAO75B,QACpCwI,KAAM,qBAGNwqF,MAAO,KAEPyO,UAAW,KAEX3iG,KAAM,SAAU05B,GACdj6B,KAAK8jB,SACL9jB,KAAKkjG,UAAYrkG,EAAE4C,UAAWw4B,IAYhCxH,SAAU,SAAUq7D,GAClB,GAAI/qE,GAAK/iB,IAaT,OAZA+iB,GAAG0xE,MAAQ3G,EAEX/qE,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMizE,YAAal2F,EAAEiI,MAAMic,EAAGiyE,cAAejyE,IAE1EA,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMmzE,UAAWp2F,EAAEiI,MAAMic,EAAGmyE,YAAanyE,IACtEA,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+zE,kBAAmBh3F,EAAEiI,MAAMic,EAAGogF,uBAAwBpgF,IAGpFA,EAAGmgF,UAAkC,wBACxCrkG,EAAEyF,QAAQxD,GAAG,YAAajC,EAAEiI,MAAMic,EAAGqgF,iBAAkBrgF,KAIvDsgF,sBAAyBxkG,EAAEiI,MAAMic,EAAGugF,gCAAiCvgF,KAWzEiyE,cAAe,SAAUO,GACvB,GAAIxyE,GAAK/iB,KACLw1F,EAAiD,MAA9BD,EAAahyF,GAAGi5B,OAAO,EAC9C+4D,GAAagO,WAAa/N,EAEtBzyE,EAAG0xE,MAAMroE,OAASrJ,EAAG0xE,MAAMroE,MAAoB,cAAKrJ,EAAG0xE,MAAMroE,MAAoB,aAAEmpE,EAAahyF,IAAM,IACxGgyF,EAAat0F,MAAQ8hB,EAAG0xE,MAAMroE,MAAoB,aAAEmpE,EAAahyF,MAUrE2xF,YAAa,WACX,GAAInyE,GAAK/iB,IAIL+iB,GAAGygF,wBACLzgF,EAAG0gF,sBAAsB1gF,EAAG0xE,MAAMroE,MAAMs3E,2BAE1C3gF,EAAG0xE,MAAM3G,KAAK6V,iBAAiB1M,UAAU,WACvCl0E,EAAG0gF,sBAAsB1gF,EAAG0xE,MAAMroE,MAAMs3E,8BAU5CF,qBAAsB,WACpB,GAAIvgF,IAAS,EACT2gF,EAAe5jG,KAAKy0F,MAAMroE,MAAoB,YAclD,OAZIhgB,QAAO4nC,cAAc4vD,GACvB3gF,GAAS,EAETpkB,EAAEkB,KAAK6jG,EAAc,SAAUx1F,EAAK2Q,GAElC,GAAIA,KAAU,EAEZ,MADAkE,IAAS,GACF,IAKNA,GASTkgF,uBAAwB,WAClBnjG,KAAKy0F,MAAMroE,MAAMs3E,6BAA8B,GACjD1jG,KAAKsjG,iCAAgC,IAUzCF,iBAAkB,WAChBpjG,KAAKy0F,MAAM3G,KAAK+V,eAChB7jG,KAAKmjG,uBAAuBtjG,KAAKG,OAUnCsjG,gCAAiC,SAAUnkB,GACzC,GAAIp8D,GAAK/iB,IAGT+iB,GAAG0xE,MAAM3G,KAAKuO,YACZyH,gBAAiB3kB,IAGfA,GAEFp8D,EAAG0xE,MAAM3G,KAAKiW,kBAGhBhhF,EAAG0gF,sBAAsBtkB,IAU3BskB,sBAAuB,SAAUC,GAI/B,IAAK,GAHD3gF,GAAK/iB,KACL4jG,KACA9S,EAAU/tE,EAAG0xE,MAAM3G,KAAKkW,aACnBz8F,EAAI,EAAGA,EAAIupF,EAAQhjF,OAAQvG,IAIlCq8F,EAAa9S,EAAQvpF,GAAGhE,MAAQutF,EAAQvpF,GAAGtG,KAI7C8hB,GAAG0xE,MAAM7J,aACP8Y,0BAA2BA,EAC3BO,aAAcL,IACb,OAINr+F,GAAGunB,WAAWm4D,UAAUE;CCzL3B,SAA0Bx5D,GACxB,YAEA,IAAIu4E,GAAwB,GACxBxe,EAAgB/5D,EAAOy5D,UAAUE,WAAWI,cAC5CG,EAAqBl6D,EAAOy5D,UAAUE,WAAWO,mBAajDse,EAAkBx4E,EAAOw4E,gBAAkB5+F,GAAG+1B,OAAO75B,QAEvDwI,KAAM,kBACNm6F,kBAAmB,GACnBC,uBAAwB,KAExB5P,MAAO,KACPrP,aACAkf,6BAA8B,cAC9BC,eAAgB,mBAChBC,qBAAsB,mBACtBC,yBAA0B,aAC1BC,oBAAqB,iBAGrBnkG,KAAM,SAAU8jG,GACd,GAAIthF,GAAK/iB,IACT+iB,GAAGe,SACHf,EAAGqiE,aACGif,EAAwBthF,EAAGshF,uBAAyBA,EACrD9+F,GAAGqL,MAAM,0CAYhB6hB,SAAU,SAAUq7D,GAClB,GAAI/qE,GAAK/iB,IAGT,OAFA+iB,GAAG0xE,MAAQ3G,EACX/qE,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMmzE,UAAW1vF,GAAGurB,IAAIjyB,EAAEiI,MAAMic,EAAGmyE,YAAanyE,MAE3E4hF,gBAAiB5hF,EAAG6hF,4BACpBC,aAAchmG,EAAEiI,MAAMic,EAAG+hF,uBAAwB/hF,GACjDgiF,qBAAsBlmG,EAAEiI,MAAMic,EAAGiiF,sBAAuBjiF,KAY5D6hF,4BAA6B,SAAU1I,GACrC,GAAIn5E,GAAK/iB,IACTuiB,KAAIozB,MAAM,OAAQ,yBAA2BumD,EAE7C,IAAIvS,GAAQ9qF,EAAEkkB,EAAGyhF,qBAAsBzhF,EAAGuhF,6BAa1C,OAXIpI,IACFvS,EAAM1nF,OACN8gB,EAAG+qE,KAAKmX,wBAAuB,GAC/BliF,EAAG+qE,KAAK0O,iBACRz5E,EAAG6nE,aAAcsa,sBAAsB,IAAQ,KAE/Cvb,EAAMrpF,OACNyiB,EAAG+qE,KAAKmX,wBAAuB,GAC/BliF,EAAG+qE,KAAK0O,iBACRz5E,EAAG6nE,aAAcsa,sBAAsB,IAAS,IAE3CniF,GAWTmyE,YAAa,WACX,GAAInyE,GAAK/iB,KAGLmlG,EAAKpiF,EAAG0xE,MAAMroE,MAAMoyE,aAgCxB,OA/BAz7E,GAAGqiF,0BAEHriF,EAAG0xE,MAAM7J,aAAc4T,cAAe2G,MACnCpiF,EAAG0xE,MAAM6I,cAAiBv6E,EAAG0xE,MAAM6I,eAEtCv6E,EAAG0xE,MAAMkQ,gBAAgB5hF,EAAG0xE,MAAMroE,MAAM84E,sBAGxCrmG,EAAEqG,UAAUmgG,QAAQ,SAAUjhG,GAC5B,GAAI22D,GAAYl8D,EAAEkkB,EAAGwhF,gBAAgB32B,IAAI7qD,EAAG2hF,qBAAqB92B,IAAI7qD,EAAG0hF,yBACnE1pC,GAAUh2B,GAAG3gC,EAAE+B,SAA8C,IAAnC40D,EAAUuqC,IAAIlhG,EAAE+B,QAAQ2H,QAAgB1J,EAAE+B,QAAUtH,EAAE,QAAQsL,IAAI,IAC/Fb,EAAEyZ,EAAGqiE,WAAWrlF,KAAK,SAAUiwD,GAC7B,GAAIu1C,GAAU1mG,EAAEuF,EAAE+B,OACZo/F,GAAQxgG,KAAK,MACbwgG,EAAQxgG,KAAK,QAAUirD,EAAQk3B,YAAYl3B,EAAQnxB,QAEvDmxB,EAAQnxB,YAQhB9b,EAAGZ,KAAKgiF,EAAgBriF,MAAM0jF,cAAe,SAAU7qE,EAAQ8qE,GAC7Dn8F,EAAEyZ,EAAGqiE,WAAWrlF,KAAK,SAAUiwD,GAC7BA,EAAQ5jC,MAAMq5E,WAAa1iF,EAAG2iF,qBAAqB/qE,EAAQq1B,EAAQ5jC,MAAMo8D,OAAOjlF,QAIpFwf,EAAG0xE,MAAM3G,KAAK6X,wBAAwB1O,UAAUp4F,EAAEiI,MAAMic,EAAG6iF,cAAe7iF,IACnEA,GAWT6iF,cAAe,SAAUviG,EAAO1D,GAC9B,GAAIojB,GAAK/iB,KACL6lG,EAAqB,SAAU71C,GACjC1mD,EAAEA,EAAEyZ,EAAGqiE,WAAWzqD,OAAO,SAAUpd,GACjC,MAAOyyC,GAAQk3B,aAAe3pE,EAAE2pE,cAC9BnnF,KAAK,SAAUwd,GACjBA,EAAEshB,WAIF2pD,EAAS7oF,EAAK6oF,OAEdztB,GADOp7D,EAAKmuF,KACAnuF,EAAKu5C,MACjB4sD,EAAgB/iF,EAAG0xE,MAAMroE,MAAMoyE,cAAcuH,aACjD,QAAQvd,EAAO5gF,MACb,IAAK,UACL,IAAK,eACL,IAAK,QACL,IAAK,SACL,IAAK,OACL,IAAK,WACL,IAAK,YACH,GAAIo+F,GAAar6E,EAAOy5D,UAAUE,WAAW2B,kBACzCgf,EAAkBH,EAAiBA,EAActd,EAAOjlF,IAAM,KAE9D2kF,EAAO,EAAiB+d,EAAahb,KAAO,GAC5CtD,EAAqBse,GAAqC,MAArBA,EAAa3hF,KAAgB2hF,EAAa/a,MAC/EjD,EAAwBge,GAAqC,WAArBA,EAAa3hF,KAAqB2hF,EAAa/a,MACvFb,IAAiBpC,EAAmBn6E,OAEpCw3E,EAAa,GAAI0gB,GAAWjrC,EAAW,GAAIh4C,GAAGshF,uBAAuBthF,EAAG0xE,MAAMx6D,SAASisE,iCACzF1d,OAAQA,EACR2d,cAAe3d,EAAOjlF,GACtBwmF,KAAMma,EACN/a,KAAM,EACNt/E,KAAM,EACN47F,WAAY1iF,EAAG2iF,qBAAqBI,EAAetd,EAAOjlF,IAC1D2kF,KAAMA,EACNP,gBAAiBA,EACjBM,mBAAoBA,EACpBoC,aAAcA,EACdh4D,SAAU,GAAI1G,GAAOy5D,UAAUE,WAAWwG,sBAI5CxG,GAAWnjE,KAAK6jF,EAAWlkF,MAAM2nE,iBAAkB5qF,EAAEiI,MAAM++F,EAAoB9iF,IAC/EuiE,EAAWnjE,KAAK6jF,EAAWlkF,MAAMyoE,cAAe,SAAUxrE,GAASgE,EAAGqjF,0BAA0B5d,EAAQzpE,KACxGgE,EAAGqiE,UAAU7xE,KAAK+xE,EAClB,MAEF,KAAK,OACH,GAAI0gB,GAAar6E,EAAOy5D,UAAUE,WAAW2B,kBACzCgf,EAAkBH,EAAiBA,EAActd,EAAOjlF,IAAM,KAE9D2kF,EAAO,EAAiB+d,EAAahb,KAAO,GAC5CtD,EAAqBse,GAAqC,MAArBA,EAAa3hF,KAAgB2hF,EAAa/a,MAC/EjD,EAAwBge,GAAqC,WAArBA,EAAa3hF,KAAqB2hF,EAAa/a,MACvFb,IAAiBpC,EAAmBn6E,OAEpCw3E,EAAa,GAAI0gB,GAAWjrC,EAAW,GAAIh4C,GAAGshF,uBAAuBthF,EAAG0xE,MAAMx6D,SAASisE,iCACzF1d,OAAQA,EACR2d,cAAe3d,EAAOjlF,GACtBwmF,KAAMma,EACN/a,KAAM,EACNt/E,KAAM,EACN47F,WAAY1iF,EAAG2iF,qBAAqBI,EAAetd,EAAOjlF,IAC1D2kF,KAAMA,EACNP,gBAAiBA,EACjBM,mBAAoBA,EACpBoC,aAAcA,EACdh4D,SACE,GAAI1G,GAAOy5D,UAAUE,WAAWgG,iBAChC,GAAI3/D,GAAOy5D,UAAUE,WAAWwG,sBAKpCxG,GAAWnjE,KAAK6jF,EAAWlkF,MAAM2nE,iBAAkB5qF,EAAEiI,MAAM++F,EAAoB9iF,IAC/EuiE,EAAWnjE,KAAK6jF,EAAWlkF,MAAMyoE,cAAe,SAAUxrE,GAASgE,EAAGqjF,0BAA0B5d,EAAQzpE,KACxGgE,EAAGqiE,UAAU7xE,KAAK+xE,EAElB,MACF,KAAK,QACHzmF,EAAEk8D,GAAW/7D,OAAO,aACpB,MACF,SACEH,EAAEwnG,OAEN,MAAOtjF,IAUTqjF,0BAA2B,SAAU5d,EAAQzpE,GAC3C,GAAIgE,GAAK/iB,IACTuiB,KAAIozB,MAAM,OAAQ,kBAElB,IAAIwvD,GAAKpiF,EAAG0xE,MAAMroE,MAAMoyE,cACpB8H,EAA6B,KAATnB,EAAG9gF,EACO,OAAT8gF,EAAG9gF,EA+C5B,OA7CA8gF,GAAGY,cAAcvd,EAAOjlF,IAAMwb,EAC9BgE,EAAGqiF,0BAEHD,EAAGoB,YAAa,EAEM,KAAlBpB,EAAGxE,YACL9hG,EAAE4C,OAAO0jG,GACP9gF,GAAI,KACJw0B,KAAM,GACNktD,yBAIKhjF,GAAG0xE,MAAMroE,MAAMo6E,aAAa,GAE/BvG,SAAWA,QAAQC,aAAaD,QAAQC,gBAE5CiF,EAAG9gF,GAAK,IACH8gF,EAAGtsD,MAASytD,IACfnB,EAAGtsD,KAAO91B,EAAG0jF,sBAIf1jF,EAAG0xE,MAAMroE,MAAMo6E,aAAarB,EAAG9gF,IAAM8gF,EAAGtsD,KAGxCssD,EAAGnG,WAAY,GAIbiB,SAAWA,QAAQyG,mBAAmBzG,QAAQyG,oBAElD3jF,EAAG0xE,MAAM7J,aACP4T,cAAe2G,EACf7J,UAAW,IAGbv4E,EAAGlB,KAAKsiF,EAAgBriF,MAAM0jF,cAAeL,EAAGY,cAAeZ,EAAGxE,YAE5D59E,EAAG0xE,MAAM6I,cAAcv6E,EAAG0xE,MAAM6I,eAGtCv6E,EAAG0xE,MAAM3G,KAAK6Y,oBAEd5jF,EAAG0xE,MAAM0C,aACFp0E,GAWT+hF,uBAAwB,WACtB,GAAI/hF,GAAK/iB,IACT+iB,GAAGqiF,0BACHriF,EAAG6jF,wBAWLxB,wBAAyB,WACvB,GAAIriF,GAAK/iB,KACLmlG,EAAKpiF,EAAG0xE,MAAMroE,MAAMoyE,aACxB3/F,GAAE4C,OAAO0jG,GACPY,cAAehjF,EAAG8jF,qBAAqB1B,EAAGY,eAC1CpF,WAAY59E,EAAG+jF,gBAAgB3B,EAAGY,eAClCpb,aAAc5nE,EAAGgkF,2BAA2B5B,EAAGY,eAAe,GAC9DtH,YAAa17E,EAAGgkF,2BAA2B5B,EAAGY,kBAYlDc,qBAAsB,SAAUlsE,GAC9B,GAAI5X,GAAK/iB,KACLgnG,EAAgB19F,EAAEyZ,EAAG0xE,MAAM4B,UAAU+C,MAAM,KAM/C,OALA9vF,GAAEqxB,GAAQ56B,KAAK,SAAU+c,EAAG7S,GACtB+8F,EAAc57F,QAAQnB,MAAU,SAC3B0wB,GAAO1wB,KAGX0wB,GAUT8rE,mBAAoB,WAClB,GAAIQ,GAAUjnG,KAAKy0F,MAAMroE,MAAMo6E,aAC3BU,EAAc59F,EAAEA,EAAEA,EAAE29F,GAASE,QAAQ7qF,IAAI,SAAUW,GACrD,OAAQA,KACNvX,KACJ,OAAOiB,GAAE,qBAAuB,IAAMjE,KAAKgD,IAAIwhG,EAAc,EAAG,IAWlEH,2BAA4B,SAAUpsE,EAAQysE,GAC5C,GAAIrkF,GAAK/iB,IACTonG,KAAcA,CAEd,IAAI3B,GAAan8F,EAAEqxB,GAAQre,IAAI,SAAU+qF,EAAWC,GAClD,GAAI7B,GAAa,GAEbjd,EAASl/E,EAAEyZ,EAAG0xE,MAAM4B,UAAUnyF,KAAK,SAAU03F,GAC/C,MAAOA,GAAIr4F,IAAM+jG,IAGfC,EAAa/e,EAAOv+E,IAExB,QAAQo9F,EAAU/iF,MAChB,IAAK,UACHmhF,EAAan8F,EAAE+9F,EAAUnc,IAAI5uE,IAAI,SAAU6tE,GACzC,MAAIA,GAAO7lE,MAAQ6lE,EAAO7lE,OAASohE,EAAcC,MAAc4hB,EAAaC,EAASC,MAAM9gG,EAAE,QAAUA,EAAE,gBACrGwjF,EAAO7lE,MAAQ6lE,EAAO7lE,OAASohE,EAAcE,QAAgB2hB,EAAaC,EAASC,MAAM9gG,EAAE,QAAUA,EAAE,mBACpG4gG,EAAaC,EAASC,MAAM9gG,EAAE,QAAU9H,EAAE2V,KAAK21E,EAAOQ,gBAC5D14E,KAAKu1F,EAASC,MAAM9gG,EAAE,cACzB,MAEF,KAAK,KACH8+F,EAAan8F,EAAE+9F,EAAUnc,IAAI5uE,IAAI,SAAU6tE,GACzC,MAAIA,GAAO7lE,MAAQ6lE,EAAO7lE,OAASohE,EAAcC,MAAc4hB,EAAaC,EAASC,MAAM,KAAO9gG,EAAE,gBAChGwjF,EAAO7lE,MAAQ6lE,EAAO7lE,OAASohE,EAAcE,QAAgB2hB,EAAaC,EAASC,MAAM,KAAO9gG,EAAE,mBAC/F4gG,EAAaC,EAASC,MAAM,KAAO5oG,EAAE2V,KAAK21E,EAAOQ,gBACvD14E,KAAKu1F,EAASC,MAAM9gG,EAAE,cACzB,MACF,KAAK,OACC0gG,EAAUpc,OAAMwa,EAAa8B,EAAaC,EAASC,MAAM9gG,EAAE,oBAAsB0gG,EAAUpc,KAC/F,MACF,KAAK,QACH,GAAoB,SAAhBzC,EAAO5gF,MACT,GAAMy/F,EAAUlc,MAAO,CACrB,GAAI35E,GAAIiD,KAAK0L,QAAQknF,EAAUlc,MAC/B,KAAK7kB,MAAM90D,EAAEwvB,WAAY,CAEvB,GAAIssD,GAAkC,aAApB9E,EAAOuE,SAA0Bn+E,eAAiBP,UACpEo3F,GAAa8B,EAAaC,EAASC,MAAM,KAAOna,EAAW97E,SAI3D61F,GAAUlc,QACZsa,EAAa8B,EAAaC,EAASC,MAAM,KAAOJ,EAAUlc,OAQlE,MAFAsa,GAAa2B,EAAY3B,EAAWxpF,MAAM8G,EAAGqhF,mBAAqBqB,EAC5DA,IAAYA,EAAa+B,EAAS16F,MAAM24F,IACvCA,GAIT,OADAA,GAAan8F,EAAEm8F,GAAYhb,UAAUx4E,KAAKu1F,EAASC,MAAM9gG,EAAE,iBAY7DmgG,gBAAiB,SAAUnsE,GACzB,GAAI5X,GAAK/iB,KAELylG,EAAan8F,EAAEqxB,GAAQre,IAAI,SAAU+qF,EAAWC,GAClD,GAAI7B,GAAa,KAEbjd,EAASl/E,EAAEyZ,EAAG0xE,MAAM4B,UAAUnyF,KAAK,SAAU03F,GAC/C,MAAOA,GAAIr4F,IAAM+jG,IAGfI,EAAgB,SAAUvd,EAAQjrD,GACpC,GAAIirD,EAAO7lE,MAAQ6lE,EAAO7lE,OAASuhE,EAAmBC,UAAW,CAC/D,GAAI6hB,GAAY,GAAIlzF,KAEpB,OADAkzF,GAAUC,QAAQD,EAAU1yF,UAAY,GACjCwwF,EAAa1iF,EAAG8kF,0BAA0BP,EAAcK,GAGjE,GAAIxd,EAAO7lE,MAAQ6lE,EAAO7lE,OAASuhE,EAAmBE,MAAO,MAAO0f,GAAa1iF,EAAG8kF,0BAA0BP,EAAc,GAAI7yF,MAChI,IAAI01E,EAAO7lE,MAAQ6lE,EAAO7lE,OAASuhE,EAAmBG,SAAU,CAC9D,GAAI8hB,GAAW,GAAIrzF,KAEnB,OADAqzF,GAASF,QAAQE,EAAS7yF,UAAY,GAC/BwwF,EAAa1iF,EAAG8kF,0BAA0BP,EAAcQ,GAGjE,GAAI3d,EAAO7lE,MAAQ6lE,EAAO7lE,OAASuhE,EAAmBI,UAAW,CAC/D,GAAI8hB,GAAO,GAAItzF,MACX2L,EAAM2nF,EAAKC,QAGf,OAFAC,GAAW,GAAIxzF,MAAKszF,EAAK/yF,cAAe+yF,EAAKhzF,WAAYgzF,EAAK9yF,WAAoB,GAAPmL,GAAW,EAAK,GAAKA,GAChG8nF,EAAU,GAAIzzF,MAAKszF,EAAK/yF,cAAe+yF,EAAKhzF,WAAYgzF,EAAK9yF,WAAoB,GAAPmL,EAAW,EAAI,GAAKA,GACvFqlF,EAAa1iF,EAAGolF,2BAA2Bb,EAAcW,EAAUC,GAG5E,GAAI/d,EAAO7lE,MAAQ6lE,EAAO7lE,OAASuhE,EAAmBK,WAAY,CAChE,GAAI6hB,GAAO,GAAItzF,MACXwzF,EAAW,GAAIxzF,MAAKszF,EAAK/yF,cAAe+yF,EAAKhzF,WAAY,GACzDmzF,EAAU,GAAIzzF,MAAKszF,EAAK/yF,cAAe+yF,EAAKhzF,WAAa,EAAG,EAChE,OAAO0wF,GAAa1iF,EAAGolF,2BAA2Bb,EAAcW,EAAUC,GAG5E,GAAI/d,EAAO7lE,MAAQ6lE,EAAO7lE,OAASuhE,EAAmBM,UAAW,CAC/D,GAAI4hB,GAAO,GAAItzF,MACXwzF,EAAW,GAAIxzF,MAAKszF,EAAK/yF,cAAe,EAAG,GAC3CkzF,EAAU,GAAIzzF,MAAKszF,EAAK/yF,cAAe,GAAI,GAC/C,OAAOywF,GAAa1iF,EAAGolF,2BAA2Bb,EAAcW,EAAUC,IAI9E,QAAQb,EAAU/iF,MAChB,IAAK,UACH,IAAK+iF,EAAUnc,GAAGp9E,OAAQ,MAAO,KACjC23F,GAAa,IAAM+B,EAAS16F,MAAMxD,EAAE+9F,EAAUnc,IAAI5uE,IAAI,SAAU6tE,GAC9D,GAAIA,EAAO7lE,MAAQ6lE,EAAO7lE,OAASohE,EAAcC,MAAO,MAAO6hB,GAASY,MAAMd,GAAgB,SAC9F,IAAInd,EAAO7lE,MAAQ6lE,EAAO7lE,OAASohE,EAAcE,QAAS,MAAO4hB,GAASY,MAAMd,GAAgB,UAEhG,IAAIe,GAAaX,EAAcvd,EAC/B,IAAIke,EAAY,MAAOA,EAEvB,IAAIC,GAA2B,WAAhB9f,EAAO5gF,KAAoB,UAAY,GACtD,OAAO4/F,GAASY,MAAMd,GAAgB,IAAMgB,EAAU,KAAOne,EAAOroD,MAAQ,MAC3E7vB,KAAK,OACR,MAEF,KAAK,KACHwzF,EAAan8F,EAAE+9F,EAAUnc,IAAI5uE,IAAI,SAAU6tE,GACzC,GAAIA,EAAO7lE,MAAQ6lE,EAAO7lE,OAASohE,EAAcC,MAAO,MAAO6hB,GAASY,MAAMd,GAAgB,SAC9F,IAAInd,EAAO7lE,MAAQ6lE,EAAO7lE,OAASohE,EAAcE,QAAS,MAAO4hB,GAASY,MAAMd,GAAgB,UAEhG,IAAIe,GAAaX,EAAcvd,EAC/B,IAAIke,EAAY,MAAOA,EAEvB,IAAoB,SAAhB7f,EAAO5gF,KAAiB,CAC1B,GAAI2gG,GAAWxlF,EAAGylF,4BAA4BlB,EAAcnd,EAAOroD,MAAO0mD,EAAOuE,SAEjF,OADMwb,KAAU9C,EAAa8C,GACtB9C,EAGT,GAAI6C,GAA2B,WAAhB9f,EAAO5gF,KAAoB,UAAY,GACtD,OAAO4/F,GAASY,MAAMd,GAAgB,IAAMgB,EAAU,KAAOne,EAAOroD,MAAQ,MAC3E7vB,KAAK,MACR,MAEF,KAAK,OAEH,GAAI8M,GAAQsoF,EAAUpc,KAAKltE,WAAW,IAAK,OAAOA,WAAW,IAAK,OAE9D0qF,EAAwBnB,CAC5B,QAAQ9e,EAAO5gF,MACb,IAAK,YACL,IAAK,WACL,IAAK,OACH6gG,EAAwBjgB,EAAO0F,KAC/B,MACF,KAAK,QACHnvE,EAAQA,EAAMhB,WAAW,IAAK,KAKlC,GAFIspF,EAAUpc,OAAMwa,EAAa+B,EAASY,MAAMK,GAAyB,WAAa1pF,EAAQ,MAE1E,SAAhBypE,EAAO5gF,MAAqBy/F,EAAUpc,KAAM,CAC9C,GAAIsd,GAAWxlF,EAAGylF,4BAA4BlB,EAAcD,EAAUpc,KAAMzC,EAAOuE,SAC7Ewb,KAAU9C,EAAa8C,GAE/B,KACF,KAAK,QACH,GAAoB,SAAhB/f,EAAO5gF,MAAqBy/F,EAAUlc,MAAO,CAE7C,GAAI35E,GAAIiD,KAAK0L,QAAQknF,EAAUlc,MAC/B,KAAK7kB,MAAM90D,EAAEwvB,WAAY,CACzB,GAAIunE,GAAWxlF,EAAGylF,4BAA4BlB,EAAc91F,EAAGg3E,EAAOuE,SAChEwb,KAAU9C,EAAa8C,QAG3BlB,GAAUlc,QACZsa,EAAa+B,EAASY,MAAMd,GAAgB,MAAQD,EAAUlc,OAMtE,MAAOqc,GAAS16F,MAAM24F,IAIxB,OADAA,GAAan8F,EAAEm8F,GAAYhb,UAAUx4E,KAAK,QAM5Cu2F,4BAA6B,SAAUlB,EAAcoB,EAAW3b,GAC9D,GAAIhqE,GAAK/iB,KACLwR,EAA0B,gBAAdk3F,GAAyB30F,cAAc20F,GAAaA,CAEpE,IAAKl3F,KACDA,EAAEwD,cAAgB,MAEtB,MAAKsxD,OAAM90D,EAAEwvB,WAAb,OACmB,aAAb+rD,EACK,IAAMya,EAASY,MAAMd,GAAgB,QAAU14F,eAAe4C,EAAG,qBAAuB,OACxFg2F,EAASY,MAAMd,GAAgB,OAAS14F,eAAe,GAAI6F,MAAKjD,EAAEwvB,UAAY,KAAQ,qBAAuB,KAE7Gje,EAAG8kF,0BAA0BP,EAAc91F,IAOxDq2F,0BAA2B,SAAUP,EAAc91F,GACjD,MAAOxR,MAAKmoG,2BAA2Bb,EAAc91F,EAAGA,IAK1D22F,2BAA4B,SAAUb,EAAc91F,EAAGm3F,GACrD,GAAIlD,GAAa,IAAM+B,EAASY,MAAMd,GAAgB,QAAUj5F,WAAWmD,EAAG,YAAc,eAE5F,OADAi0F,IAAc+B,EAASY,MAAMd,GAAgB,OAASj5F,WAAW,GAAIoG,MAAKk0F,EAAG3nE,UAAY,OAAe,YAAc,eAKxH0kE,qBAAsB,SAAU/qE,EAAQs7D,GACtC,GAAIlzE,GAAK/iB,KACLu+F,EAAgBj1F,EAAEqxB,GAAQpxB,cACvBg1F,GAActI,EACrB,IAAI2S,GAAoB7lF,EAAG+jF,gBAAgBvI,GAEvCsK,EAAK9lF,EAAG0xE,MAAMroE,MAAMs0E,gBACxB,OAAImI,GACED,EACK,IAAMC,EAAK,QAAUD,EAAoB,IAEzCC,EAGFD,GASX5D,sBAAuB,WACrB,GAEIjmF,GAFAgE,EAAK/iB,KACLqlB,IAuEJ,OArEA/b,GAAEyZ,EAAGqiE,WAAWrlF,KAAK,SAAUiwD,GAC7B,GAAIs3C,GAAet3C,EAAQ5jC,MAAM+5E,cAE7B3d,EAASl/E,EAAEyZ,EAAG0xE,MAAM4B,UAAUnyF,KAAK,SAAU03F,GAC/C,MAAOA,GAAIr4F,IAAM+jG,GAInB,IAA0B,sBAAtBt3C,EAAQ98C,UAAmC,CAG7C,GAFA6L,EAAQixC,EAAQv2B,WAEG,OAAf1a,EAAMuF,KAAe,CACvB,GAAI6lE,GAASprE,EAAMmsE,GAAG,EAEtB,KAAKf,EAAQ,MAEb,IAAIv1E,GAAQ,GAAIH,KAEhB,QAAQ01E,EAAOroD,OACb,IAAK4jD,GAAcC,MACnB,IAAKD,GAAcE,QACnB,IAAKF,GAAc3vE,IACjB,MAEF,KAAK8vE,GAAmBC,UAGtB,MAFAlxE,GAAMgzF,QAAQhzF,EAAMK,UAAY,QAChCoQ,EAAWiiF,GAAgB14F,eAAegG,GAG5C,KAAKixE,GAAmBE,MAEtB,YADA1gE,EAAWiiF,GAAgB14F,eAAegG,GAG5C,KAAKixE,GAAmBG,SAGtB,MAFApxE,GAAMgzF,QAAQhzF,EAAMK,UAAY,QAChCoQ,EAAWiiF,GAAgB14F,eAAegG,IAK9C,OAAQ4zE,EAAO5gF,MACb,IAAK,SACHyd,EAAWiiF,GAAgBnd,EAAOQ,YAClC,MACF,KAAK,OACH,GAAIn5E,GAAIuC,cAAco2E,EAAOroD,MAC7B,KAAKtwB,EAAG,MACR,IAAIA,EAAEwD,cAAgB,KAAM,MAE5BqQ,GAAWiiF,GAAgB14F,eAAe4C,EAC1C,MACF,SACE6T,EAAWiiF,GAAgBnd,EAAOroD,OAIxC,IAAmB,UAAf/iB,EAAMuF,MAAmC,SAAfvF,EAAMuF,OACd,SAAhBkkE,EAAO5gF,KAAiB,CAC1B,GAAI0G,GAAOyQ,EAAMosE,OAASpsE,EAAMksE,KAE5Bz5E,EAAIuC,cAAc,GAAKzF,EAC3B,KAAKkD,EAAG,MACR,IAAIA,EAAEwD,cAAgB,KAAM,MAC5BqQ,GAAWiiF,GAAgB14F,eAAe4C,OAM3C3S,EAAEwkB,OAAOgC,IAGlBuhF,qBAAsB,WACpB,GAAI7jF,GAAK/iB,KACLmlG,EAAKpiF,EAAG0xE,MAAMroE,MAAMoyE,cACpBsH,EAAgBX,EAAGY,aACvBz8F,GAAEyZ,EAAGqiE,WAAWrlF,KAAK,SAAUwd,GAC7B,GAAIirE,GAASjrE,EAAE6O,MAAMo8D,MACrB,QAAQjrE,EAAErK,WACR,IAAK,oBAEH,GAAI+yF,GAAkBH,EAAiBA,EAActd,EAAOjlF,IAAM,KAE9D2kF,EAAO,EAAiB+d,EAAahb,KAAO,GAC5CtD,EAAqBse,GAAqC,MAArBA,EAAa3hF,KAAgB2hF,EAAa/a,MAC/EjD,EAAwBge,GAAqC,WAArBA,EAAa3hF,KAAqB2hF,EAAa/a,MACvFb,IAAiBpC,EAAmBn6E,MAExCyP,GAAEqtE,aACAzB,KAAM,EACNt/E,KAAM,EACN47F,WAAY1iF,EAAG2iF,qBAAqBI,EAAetd,EAAOjlF,IAC1D2kF,KAAMA,EACND,mBAAoBA,EACpBoC,aAAcA,EACd1C,gBAAiBA,GAEnB,MACF,KAAK,cACH,GAAImhB,GAAchD,GAAiBA,EAActd,EAAOjlF,IAAOuiG,EAActd,EAAOjlF,IAAI4nF,MAAQ,EAChG5tE,GAAEqtE,aACA7rE,MAAO+pF,UAQjBhnF,OACE0jF,cAAe,kBAQfgC,GACF16F,MAAO,SAAUa,GACf,MAAKA,GACE,IAAMA,EAAM,IADFA,GAGnBy6F,MAAO,SAAUz6F,GACf,MAAKA,GACE,IAAMA,EAAM,IADFA,GAGnB85F,MAAO,SAAU95F,GACf,MAAKA,GACE,IAAMA,EAAM,IADFA,KAKpBpI,GAAGunB,WAAWm4D,UAAUE;CCxvB3B,SAAmCx5D,GAKjC,GAAIo9E,IACFC,IAAK,EACLC,KAAM,EACN7V,OAAQ,KAOR8V,MAAOviG,EAAE,qBACTwiG,cAAe,SAAWxiG,EAAE,sBAQ9BglB,GAAOy9E,mBAAqB1nF,WAAWjgB,QACrC4nG,eAAgB,KAChB5U,MAAO,KACPyN,MAAO,KACPoH,aAAc,EACdC,uBAAuB,EAEvBhpG,KAAM,SAAUipG,GACd,GAAIzmF,GAAK/iB,IACT+iB,GAAG0mF,SAAWD,EAEdzmF,EAAGumF,aAAe,EAClBvmF,EAAGwmF,uBAAwB,GAK7BtP,QAAS,SAAUnM,GACjB9tF,KAAKy0F,MAAQ3G,GAGf4U,QAAS,SAAUh2F,GACjB1M,KAAKkiG,MAAQx1F,GAOfk2F,cAAe,SAAUv/F,GACvB,GAAI0f,GAAK/iB,KACL63B,EAAQ9U,EAAG2mF,mBAAmBrmG,GAC9BsmG,EAAkB3pG,KAAKy0F,MAAMp8D,OAAOpwB,aAEpCpB,EAAO,SAAUtD,EAAIqmG,EAAOxhG,EAAMyhG,GACpC,OACE5/F,KAAQ1G,EACRqmG,MAASjjG,EAAEijG,GACXxhG,KAAQA,EACRT,iBAAmB,EACnBK,SAAqB6hG,GAGzB,QACIhjG,EAAKkiG,EAAKC,IAAK,MAAO,iBAAkBjmF,EAAG+mF,iBAAmBH,GAC9D9iG,EAAKkiG,EAAKE,KAAM,OAAQ,eAAgBpxE,IAAU9U,EAAGgnF,YAAYlyE,IAAU8xE,GAC3E9iG,EAAKkiG,EAAK3V,OAAQ,SAAU,aAAcv7D,GAAS8xE,KASzD7G,uBAAwB,SAAUniG,EAAMxB,EAAI2uF,GAC1C,GAAI/qE,GAAK/iB,IACT+iB,GAAG0xE,MAAQ3G,EAEX/qE,EAAGumF,aAAevmF,EAAGinF,wBAAwB7qG,GAC7C4jB,EAAGwmF,uBAAwB,CAE3B,IAAInzE,GAAQrT,EAAG0xE,MAAMp8D,MAErBjC,GAAMjU,KAAK,SAAU,SAAU4U,GAC7B,GAAIhU,EAAGwmF,sBAAuB,CAC5BhnF,IAAIqQ,KAAK,aAAc,+BACvB,IAAIk7D,GAAO13D,EAAMq+D,MACbwV,EAASnc,EAAKA,KAAKoc,eACjBD,IAEJA,EAAOlc,SAETznF,WAAW,WAETwnF,EAAKA,KAAKqc,cAAcrc,EAAKA,KAAKsc,gBAAkB,EAAGrnF,EAAGumF,cAC1Dxb,EAAKA,KAAKuc,iBACVtnF,EAAGwmF,uBAAwB,GAC1B,QAIP5oG,EAAKwhB,KAAK,aAAc,SAAUtb,EAAMlG,EAAM0C,GAC5C,GAAIw0B,GAAQ9U,EAAG2mF,mBAAmBrmG,EAElC,QAAQwD,EAAKoD,MACX,IAAK8+F,GAAKC,IACRjmF,EAAGunF,QACH,MACF,KAAKvB,GAAKE,KACR,IAAKpxE,EAAO,MACZ9U,GAAGwnF,QAAQ1yE,EACX,MACF,KAAKkxE,GAAK3V,OACR,IAAKv7D,EAAO,MACZ9U,GAAGynF,UAAU3yE,OAWrByyE,OAAQ,WACFtqG,KAAK8pG,iBACP9pG,KAAKy0F,MAAMp8D,OAAOiyE,UAUtBC,QAAS,SAAUhnG,GAUjB,IAAK,GARDwzB,GAAKqB,EAAMqyE,EADX1nF,EAAK/iB,KAGL0qG,EAAY3nF,EAAG0xE,MAAMp8D,OACrBgrD,EAAYqnB,EAAUrnB,UACtBsnB,EAAY5nF,EAAGm/E,MAAMlvE,QAAQqwD,GAAWunB,YAAY3zE,UAGpDy/D,EAAUgU,EAAUtyE,KAAKnB,UACpB1vB,EAAI,EAAGA,EAAImvF,EAAQ5oF,OAAQvG,IAClCwvB,EAAM2/D,EAAQnvF,GACVwvB,EAAIi9C,UAAYj9C,EAAI8zE,aACtB9zE,EAAI2Z,QAaR,KAAK,GAPDo6D,GAAsBJ,EAAU5Z,QAChCia,EAAiCD,EAAoB7zE,UAAUkjB,KAAK,SAAUquC,GAChF,OAAQA,EAAOwiB,kBAIb3lF,KACK7I,EAAI,EAAGA,EAAImuF,EAAU78F,OAAQ0O,IACpC4b,EAAOuyE,EAAUnuF,GAAG4b,KACpBrB,EAAMqB,EAAK70B,GACPwzB,IACF0zE,EAAW1zE,EAAI1R,WAAW4R,UAG1Bp4B,EAAE4C,OAAO4jB,EAAY/b,EAAEqjF,MAAM8d,GAC1B9vE,OAAO,SAAUzD,GAChB,GAAI26D,GAAgBiZ,EAAoB5zE,EAAIjtB,KAC5C,QAAQitB,EAAI+zE,YAAcpZ,EAAcmZ,iBAAmBnZ,EAAcnpB,cAE1EpsD,IAAI,SAAUzV,GACb,OAAQA,EAAKoD,MACX8U,MAAOlY,EAAK4yB,WACZ4B,aAAcx0B,EAAK6iE,kBACnB9L,mBAAmB,MAEpB9nB,SAAS/2B,SAwBlB,OAnByB,KAArB4rF,EAAU78F,QAAiBi9F,EAW7B/qG,KAAKy0F,MAAMp8D,OAAO6yE,gBAAgB3nG,EAAI8hB,EAAY,SAAU0R,GAC1D0zE,EAAW1zE,EAAI1R,WAAW4R,UAC1B3tB,EAAEmhG,GAAU1qG,KAAK,SAAUm3B,GACzBA,EAAIi0E,YAZRnrG,KAAKy0F,MAAMp8D,OAAOiyE,OAAOjlF,EAAY,SAAU0R,GAC7C0zE,EAAW1zE,EAAI1R,WAAW4R,UAC1B3tB,EAAEmhG,GAAU1qG,KAAK,SAAUm3B,GACzBA,EAAIi0E,YAcHnrG,MASTwqG,UAAW,SAAU3yE,GAEnB,MADA73B,MAAKy0F,MAAMp8D,OAAOmyE,UAAU3yE,GACrB73B,MAUT0pG,mBAAoB,SAAUrmG,GAC5B,GAAI8C,GAAS9C,EAAM8C,QAAU9C,EAAM0/F,WAC/BC,EAAOnkG,EAAEsH,GAAQvE,QAAQ,iBACzBi2B,EAAQmrE,EAAKj+F,KAAK,KACtB,OAAO8yB,IAUTmyE,wBAAyB,SAAU3mG,GACjC,GACI+nG,GADAjlG,EAAStH,EAAEwE,EAAM8C,QAAU9C,EAAM0/F,WAOrC,OAJEqI,GADEjlG,EAAO1G,SAAS,cACV0G,EAEAA,EAAOvE,QAAQ,qBAElBwpG,EAAM9xC,SASfywC,YAAa,SAAUlyE,GACrB,GAAId,GAAM/2B,KAAKy0F,MAAMp8D,OAAOD,KAAKP,EACjC,SAAId,EAAIs0E,uBAcVvB,cAAe,WACb,GAAI1zE,GAAQp2B,KAAKy0F,MAAMp8D,OACnBD,EAAOhC,EAAMgC,KAAKnB,SAEtB,IAAImB,EAAKtqB,OAAQ,CACf,GAAIw9F,GAAUlzE,EAAKA,EAAKtqB,OAAS,EACjC,SAAIw9F,EAAQD,sBAMZ,OAAO,MAMZ/mG,OAAOiB,GAAGunB,WAAWm4D,UAAUE;CCxSlC,SAAyBx5D,GACvB,YASAA,GAAO4/E,WAAahmG,GAAG+1B,OAAO75B,QAC5BwI,KAAM,aACNuhG,SAAU,KAEV/W,MAAO,KACPgX,gBAAiB,KACjBC,YAAa,KACbC,iBAUAl5E,SAAU,SAAUq7D,GAElB,GAAI/qE,GAAK/iB,IAST,OARA+iB,GAAG2oF,aAAe,eAAgB,cAAe,iBAAkB,aAAc,cAAe,kBAChG3oF,EAAG0xE,MAAQ3G,EACX/qE,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+yE,iBAAkB9xE,EAAG+xE,kBAAmB/xE,GAC3EA,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMmzE,UAAWlyE,EAAGmyE,YAAanyE,GAC9DA,EAAG0xE,MAAMtyE,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMizE,YAAahyE,EAAGiyE,cAAejyE,GAClEA,EAAG4oF,iBAEHppF,IAAIqQ,KAAK,OAAQ,8BAenBkiE,kBAAmB,SAAU7gE,EAAmBohE,EAAUvE,EAASwE,GAEjEA,EAAesW,sBAAuB,EACtCtW,EAAeuW,UAAW,EAC1BvW,EAAewW,UAAW,GAW5B5W,YAAa,SAAUpH,GACrB,GAAI/qE,GAAK/iB,IAqCT,IAlCKuF,GAAGC,IAAIid,WAIVM,EAAG0oF,gBAAkB,GAAIlU,OAAMwU,mBAC/Bje,EAAKuT,kBAAkBt+E,EAAG0oF,mBAJ1B1oF,EAAG0oF,gBAAkB,GAAIlU,OAAMyU,mBAC/Ble,EAAKuT,kBAAkBt+E,EAAG0oF,kBAM5B3d,EAAKme,aAAahV,UAAU,SAAU7yF,EAAGyb,GACvC,GAAIkX,GAAMlX,EAAW,KAEjBixE,GADSjxE,EAAW,KACViuE,EAAKkW,cACfxb,EAASsI,EAAQjxE,EAAKqsF,KAC1BnpF,GAAG0xE,MAAM5yE,KAAK,kBAAmB2mE,EAAOjlF,GAAIwzB,EAAIxzB,GAAIwzB,EAAIyxD,EAAOjlF,IAAKwzB,EAAIyxD,EAAO0F,UAGjFJ,EAAKqe,aAAalV,UAAU,SAAU7yF,EAAGyb,GACvC,GAAIkX,GAAMlX,EAAW,KAEjBixE,GADSjxE,EAAW,KACViuE,EAAKkW,cACfxb,EAASsI,EAAQjxE,EAAKqsF,MACtBjC,EAASpqF,EAAKoqF,MAClBlnF,GAAG0xE,MAAM5yE,KAAK,aAAc2mE,EAAOjlF,GAAIwzB,EAAIxzB,GAAIwzB,EAAIyxD,EAAOjlF,IAAKwzB,EAAIyxD,EAAO0F,OAAQ+b,KAGpFnc,EAAKse,0BAA0BnV,UAAU,SAAU7yF,EAAGyb,GACpDkD,EAAG0xE,MAAM5yE,KAAK,gBAAiBzd,EAAGyb,KAGpCiuE,EAAKue,YAAYpV,UAAU,SAAU93F,EAAImtG,GACvCvpF,EAAG0xE,MAAM5yE,KAAK,YAAayqF,MAIxB/mG,GAAGC,IAAIid,UAAW,CAKrB,GAAI8pF,GACAC,GAA+B,CAEnC1e,GAAK2e,UAAUxV,UAAU,SAAU7yF,EAAGyb,GACpC,GAAIzR,GAAMhK,EAAEo+C,QACRpsB,EAAQrT,EAAG0xE,MAAMp8D,MACrB,IAAKjC,IAASA,EAAMnuB,aAApB,CACA,GAAImwB,GAAOhC,EAAMgC,KAAKnB,UAClBq0E,EAAUlzE,EAAKA,EAAKtqB,OAAS,EACjCy+F,IAAkB1sF,EAAKkX,IAAM,EAAGlX,EAAKqsF,KACrC,IAAIpe,GAAO/qE,EAAG0xE,MAAM3G,IAGhB/qE,GAAG4oF,cAAcvgG,QAAQ,SAAW2X,EAAG0xE,MAAMx6D,SAASyyE,YAAa,IAErEt2E,EAAMjU,KAAKiU,EAAa,MAAEtU,MAAM6qF,UAAW,SAAU51E,GACnDxU,IAAIqQ,KAAK,aAAc,6BAEvB,IAAIq3E,GAASnc,EAAKoc,eACZD,IACJA,EAAOlc,SAETwe,EAAe,GAAKze,EAAKsc,gBAAkB,EAC3Ctc,EAAKqc,cAAcoC,EAAe,GAAIA,EAAe,IACrDze,EAAKuc,iBAGLmC,GAA+B,IAGjCzpF,EAAG4oF,cAAcp4F,KAAK,SAAWwP,EAAG0xE,MAAMx6D,SAASyyE,UAIjD3pF,EAAG4oF,cAAcvgG,QAAQ,YAAc2X,EAAG0xE,MAAMx6D,SAASyyE,YAAa,IACxEt2E,EAAMjU,KAAK,YAAa,SAAU4U,GAChCxU,IAAIqQ,KAAK,aAAc,iCACvBtsB,WAAW,WACTimG,EAAe,GAAKze,EAAKsc,gBAAkB,EAC3Ctc,EAAKqc,cAAcoC,EAAe,GAAIA,EAAe,IACrDze,EAAKuc,iBAGLmC,GAA+B,GAC9B,OAELzpF,EAAG4oF,cAAcp4F,KAAK,YAAcwP,EAAG0xE,MAAMx6D,SAASyyE,UAIpD3pF,EAAG4oF,cAAcvgG,QAAQ,eAAiB2X,EAAG0xE,MAAMx6D,SAASyyE,YAAa,IAC3Et2E,EAAMjU,KAAKiU,EAAa,MAAEtU,MAAM8qF,cAAe,SAAU71E,GACvDxU,IAAIqQ,KAAK,aAAc,oCACnB45E,IACF1e,EAAKqc,cAAcoC,EAAe,GAAIA,EAAe,IACrDze,EAAKuc,iBACLmC,GAA+B,KAGnCzpF,EAAG4oF,cAAcp4F,KAAK,eAAiBwP,EAAG0xE,MAAMx6D,SAASyyE,UAGvDt+F,IAAQvP,EAAEiwF,GAAGtsC,QAAQ2sC,MACnBtvE,EAAKkX,IAAM,GAAK+2D,EAAKsc,iBACnBkB,EAAQD,uBACVj1E,EAAMk0E,SAKRl8F,IAAQvP,EAAEiwF,GAAGtsC,QAAQ4sC,IACnBvvE,EAAKkX,IAAM,GAAK+2D,EAAKsc,kBAClBkB,EAAQD,uBACXC,EAAQ56D,aAUlB3tB,EAAG0xE,MAAMY,SAASwX,aAAa5V,UAAU,SAAU7yF,EAAGyC,GAEpD,GAAIyyD,GAAQv2C,EAAG0xE,MAAMY,SAASyX,WAAWjmG,EAAKtD,GAC9CuqF,GAAKif,eAAezzC,GAAO,KAO7B/zD,GAAGkpB,YAAYld,KAAK,WAClB1S,EAAEqG,UAAUpE,GAAG,qBAAsBjC,EAAEiI,MAAMic,EAAGiqF,kBAAmBjqF,OASvEiqF,kBAAmB,SAAU5oG,GAC3B,GAAI2e,GAAK/iB,KAELitG,EAAqB,SAAU9mG,GACjC,GAAI8c,KAAW3Z,EAAEyZ,EAAG2oF,aAAaxnG,KAAK,SAAU+4B,GAC9C,MAAOp+B,GAAEsH,GAAQ6wC,YAAY/Z,GAAInvB,QAEnC,OAAOmV,IAGL83C,EAAYl8D,EAAEkkB,EAAG0xE,MAAMxgE,mBACvB9tB,EAAS/B,EAAE+B,MAWf,IARIA,EAAOC,0BACTD,EAASA,EAAOC,wBAGhBD,EAASA,EAAOuN,WAAWA,YAIxBqnD,EAAUh2B,GAAG5+B,IAA4C,IAAjC40D,EAAUuqC,IAAIn/F,GAAQ2H,QAAiBm/F,EAAmB9mG,IAAY8mG,EAAmB/nG,SAASgoG,eAyBxH,CAGL,GAAIruG,EAAEsH,GAAQ1G,SAAS,UAAYZ,EAAE,kBAAkBymG,IAAIzmG,EAAEsH,IAAS2H,QAAUjP,EAAE,sBAAsBymG,IAAIzmG,EAAEsH,IAAS2H,OACrH,MAKFxJ,QAAO6oG,uBAAwB,EAG/B5qF,IAAIqQ,KAAK,aAAc,8BACvB,IAAIwD,GAAQrT,EAAG0xE,MAAMp8D,QACjBjC,GAAUA,EAAMnuB,cAAiBmuB,EAAMgC,KAAK8C,SAAS9E,EAAMk0E,SAE/DvnF,EAAG2vE,WAAY,MAzC8H,CAG7InwE,IAAIqQ,KAAK,aAAc,8BAGvBtuB,OAAO6oG,sBAAwB7oG,OAAO6oG,wBAAyB,CAE/D,IAAI/2E,GAAQrT,EAAG0xE,MAAMp8D,MACrB,KAAKjC,IAAUA,EAAMgC,KAAM,MAE3BrV,GAAG0xE,MAAM3G,KAAKsf,aACdrqF,EAAG0xE,MAAM3G,KAAKuf,kBACdtqF,EAAG0xE,MAAM3G,KAAK6Y,mBAEd,IAAIvuE,GAAOhC,EAAMgC,KAAKnB,UAClBq0E,EAAUlzE,EAAKA,EAAKtqB,OAAS,EACb,KAAhBsqB,EAAKtqB,QAAgBw9F,IAAYA,EAAQD,uBAC3CC,EAAQ56D,SAGV3tB,EAAG0xE,MAAM3G,KAAKqc,cAAc,MAC5BpnF,EAAG0xE,MAAM3G,KAAK6Y,oBAEd5jF,EAAG2vE,WAAY,EAuBjBzsF,aAAa3B,OAAOgpG,0BACpBhpG,OAAOgpG,yBAA2BhnG,WAAW,WAC3C,GAAIinG,EAGFA,GADEjpG,OAAO6oG,sBACQ,OAEAtuG,EAAE,cAAciP,OAAS,aAAe,SAE3DM,IAAIo/F,SAASD,GAEbjpG,OAAO6oG,uBAAwB,GAC9B,KAULnY,cAAe,SAAUO,GACvB,QAASA,EAAa3tF,MACpB,IAAKsP,gBAAeK,OAClBg+E,EAAa0U,OAAS,SAAUpqF,GAC9B,MAAO,IAAI8L,GAAO05D,SAASmI,aAAa3tE,GAE1C,MAEF,KAAK3I,gBAAeM,KAClB+9E,EAAa0U,OAAS,SAAUpqF,GAC9B,MAAO,IAAI8L,GAAO05D,SAAS0L,WAAWlxE,GAExC,MAEF,KAAK3I,gBAAef,UAClBo/E,EAAa0U,OAAS,SAAUpqF,GAC9B,MAAO,IAAI8L,GAAO05D,SAASyO,gBAAgBj0E,GAE7C,MAEF,KAAK3I,gBAAeI,KAClBi+E,EAAa0U,OAAS,SAAUpqF,GAC9B,MAAO,IAAI8L,GAAO05D,SAAS2L,WAAWnxE,GAExC,MAEF,KAAK3I,gBAAeE,KAClBm+E,EAAa0U,OAAS,SAAUpqF,GAC9B,MAAO,IAAI8L,GAAO05D,SAASoM,WAAW5xE,GAExC,MAEF,KAAK3I,gBAAeQ,cACpB,IAAKR,gBAAeO,QAClB89E,EAAa0U,OAAS,SAAUpqF,GAC9B,MAAO,IAAI8L,GAAO05D,SAASuM,cAAc/xE,GAE3C,MAEF,KAAK3I,gBAAeG,MAClBk+E,EAAa0U,OAAS,SAAUpqF,GAC9B,MAAO,IAAI8L,GAAO05D,SAAS4M,YAAYpyE,GAEzC,MAEF,KAAK3I,gBAAeS,SAClB49E,EAAa0U,OAAS,SAAUpqF,GAC9B,MAAO,IAAI8L,GAAO05D,SAASiP,eAAez0E,SAQnDta,GAAGunB,WAAWm4D,UAAUE;CCvW3B,SAAyBx5D,GACvB,YAEA,IAAI8hF,GAAW,MAiBf9hF,GAAOmB,WAAWm4D,UAAU2P,KAAOlzE,WAAWjgB,QAAQkqB,EAAOuB,OAAO8E,cAClEqkE,YACAp8D,SAAU,KACV7N,MAAO,KACP6H,kBAAmB,KACnBy5E,YAAa,KACbC,gBAAiB,KACjBt1E,OAAQ,KAMRuoE,YAAa,KAGbrgG,KAAM,SAAU0zB,EAAmB25E,EAAY9c,EAAS72D,GACtD,GAAIlX,GAAK/iB,IAETuiB,KAAIqQ,KAAK,OAAQ,uBACjB7P,EAAGkX,UACD4zE,qBAAsB,KAStBC,aAAc,KACdz7E,QAAS,MAGNu7E,GAAYroG,GAAGqL,MAAMjK,EAAE,wBAE5Boc,EAAGe,OAAOmQ,EAAmB25E,EAAY9c,GACzC/tE,EAAGszE,YAEHx3F,EAAE4C,OAAOshB,EAAGkX,SAAUA,GACtBlX,EAAGkR,kBAAoBA,EACvBlR,EAAG69E,YAAcgN,EAGjB7qF,EAAG69E,YAAYra,YAAY30D,OAAO,SAAUxF,GAC1CrJ,EAAGqJ,MAAQA,MACXrJ,EAAGszE,SAAWtzE,EAAGgrF,mBAAmBjd,GAG/B/tE,EAAGqJ,MAAM4hF,gBAAoD,GAAlCjrF,EAAGqJ,MAAM4hF,eAAelgG,QACtDiV,EAAG6nE,aACDojB,eAAgB1kG,EAAEyZ,EAAGkrF,qBAAqB3xF,IAAI,SAAUs/E,GAAO,MAAOA,GAAIr4F,OAK9Ewf,EAAGlB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMq7E,cAE7Bp6E,EAAGmrF,gBAAgBj6E,MAUvBk6E,SAAU,SAAU/3E,GAClBp2B,KAAKq4B,OAASjC,GAShB2E,SAAU,WACR,MAAO/6B,MAAKq4B,QAUd2rE,WAAY,WACV,MAAOhkG,MAAKq2F,UAYd+X,WAAY,SAAUC,GACpB,GAAItrF,GAAK/iB,IACTuiB,KAAIqQ,KAAK,OAAQ,oBAEjB7P,EAAGszE,SAAWgY,CAEd,IAAIC,GAAqBvrF,EAAGkrF,mBAI5B,OAHAlrF,GAAG+qE,KAAKsgB,WAAWE,GACnBvrF,EAAGsyE,SAAS+Y,WAAWE,GAEhBvrF,GAUTkrF,kBAAmB,WACjB,MAAO3kG,GAAEA,EAAEtJ,KAAKq2F,UAAU17D,OAAO,SAAU6tD,GACzC,MAAOA,GAAO+lB,WACZC,OAAO,SAAUhmB,GACnB,MAAOA,GAAOlvB,SAYlB40C,gBAAiB,WACf,GAAInrF,GAAK/iB,KAGLwB,GAEFitG,gBAAiB,GACjBC,UAAW,GACXC,wBAAwB,EACxBC,sBAAsB,EAGtBC,oBAA0C,qBAArBtpG,GAAGuE,cAG1BiZ,GAAGsyE,SAAW,GAAIkC,OAAMC,KAAKsX,QAE7B,IAAIC,GAAahsF,EAAGkrF,mBA8BpB,OA7BAlrF,GAAGlB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+yE,iBAAkB9xE,EAAGkR,kBAAmBlR,EAAGsyE,SAAU0Z,EAAYvtG,GAG1FuhB,EAAGkX,SAAS4zE,uBACd9qF,EAAGsyE,SAAoC,0BAAItyE,EAAGkX,SAAS4zE,sBAEzD9qF,EAAG+qE,KAAO,GAAIyJ,OAAM3C,KAAK7xE,EAAGkR,kBAAmBlR,EAAGsyE,SAAU0Z,EAAYvtG,GACxEuhB,EAAG+qE,KAAK8B,QAAU7sE,EAElBA,EAAGlB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMmzE,UAAWlyE,EAAG+qE,MAE3C/qE,EAAGsyE,SAAS2Z,kBAAkB/X,UAAU,SAAU7yF,EAAGyb,GACnDkD,EAAG+qE,KAAKmhB,iBACRlsF,EAAG+qE,KAAKjqF,WAGVkf,EAAGsyE,SAAS6Z,cAAcjY,UAAU,SAAU7yF,EAAGyb,GAC/CkD,EAAG+qE,KAAKqhB,eAAetvF,EAAKuY,MAC5BrV,EAAG+qE,KAAKjqF,WAKVkf,EAAG+qE,KAAKmL,mBAAmBhC,UAAU,SAAU93F,EAAI2xF,GAC7CA,GAAWA,EAAQkd,gBAAgBjrF,EAAG6nE,aAAcojB,eAAgBld,EAAQkd,iBAAkB,KAGpGjrF,EAAG+qE,KAAKvtF,OACRwiB,EAAGo0E,aACIp0E,GAaT6nE,YAAa,SAAUx+D,EAAOgjF,GAC5B,GAAIrsF,GAAK/iB,IAETuiB,KAAIqQ,KAAK,OAAQ,iBAEjB,IAAIy8E,GAAYtsF,EAAGqJ,MACfy+D,EAAWhsF,EAAE4C,UAAWshB,EAAGqJ,MAAOA,EAoBtC,OAlBArJ,GAAGqJ,MAAQy+D,EAGPhsF,EAAEwkB,OAAOwnE,KAAchsF,EAAEwkB,OAAOgsF,IAAcD,KAAc,GAC9DnpG,aAAa8c,EAAG4qF,iBAChB5qF,EAAG4qF,gBAAkBrnG,WAAW,WAC9Byc,EAAG69E,YAAYpa,UAAUzjE,EAAGqJ,MAAOgjF,GAAW79F,KAAK,WACjDgR,IAAIqQ,KAAK,OAAQ,oCAChB7K,KAAK,SAAUiJ,GAChBzO,IAAIgO,MAAM,OAAQ,qBAAuBS,MAE1C,KAEHzO,IAAIozB,MAAM,OAAQ,gBAAkB92C,EAAEwkB,OAAON,EAAGqJ,SAEhD7J,IAAIozB,MAAM,OAAQ,qBAGb5yB,GAWTo0E,WAAY,SAAU31F,GACpB,GAAIuhB,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,WACXrgB,EAAarH,EAAEkkB,EAAGkR,mBAClBq7E,EAAY,MAwChB,OAvCA/sF,KAAIqQ,KAAK,OAAQ,kBAEjBrtB,GAAGmE,GAAGslB,SAAWzpB,GAAGmE,GAAGslB,QAAQ/sB,OAE/BT,EAAUA,MAEVyE,aAAa8c,EAAG2qF,aAChB3qF,EAAG2qF,YAAcpnG,WAAW,WAC1B,GAAIipG,GAASjpG,WAAW,WAAcJ,EAAWspG,OAAOF,EAAW,KAAQ,KAEvEjpB,EAAcxnF,EAAE4C,UAAWshB,EAAGqJ,MAAO5qB,EACzCuhB,GAAG6nE,YAAYvE,GAEf9jE,IAAIqQ,KAAK,OAAQ,6BACjB7P,EAAGlB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM2tF,mBAAoBppB,GACjDtjE,EAAG69E,YAAY78E,KAAKsiE,GAAa90E,KAAK,SAAU5R,GAE9C,GAAIm9F,GAAYn9F,EAAK27F,UACjBlS,EAAUzpF,EAAK+vG,IAGnB3sF,GAAG6nE,aAAc0Q,UAAWwB,IAE5B/5E,EAAGlB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM27E,YAAaX,EAAa1T,EAAUA,EAAQt7E,OAAS,EAAGs7E,GAErFrmE,EAAGsyE,SAASsa,SAASvmB,GACrBrmE,EAAG+qE,KAAKiJ,aACRh0E,EAAGsyE,SAASua,YAEZ7sF,EAAGlB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+zE,kBAAmBl2F,GAChDsjB,EAAO6E,QAAQnoB,KACdiyB,OAAO,WACR3rB,aAAaspG,GACbrpG,EAAWspG,OAAOF,EAAW,GAC7B/pG,GAAGmE,GAAGslB,SAAWzpB,GAAGmE,GAAGslB,QAAQ1uB,UAGhC,KAEI2iB,GAYT8qF,mBAAoB,SAAU8B,GAC5B,GAAI9sF,GAAK/iB,KACL8vG,EAAkB,EAElBhf,EAAUxnF,EAAEumG,GAAYvzF,IAAI,SAAUksE,GACxC,GAAIgN,GAA6C,MAA1BhN,EAAO3vC,KAAKrc,OAAO,GAEtCqzD,EAAarH,EAAOunB,cAAe,GAA8B,SAAtBvnB,EAAOunB,WAElD1uG,EAAYm0F,EAAkB,WAAa,EAC3ChN,GAAOwnB,WAAaF,IAAiBzuG,GAAY,oBAErD,IAAI4uG,IACFhmG,MAAO4lF,EAAa4d,EAAW,IAAMjlB,EAAO10B,QAC5CvwD,GAAIilF,EAAO3vC,KACXq1C,MAAO1F,EAAO0nB,MACd7uG,SAAUA,EACVo0F,UAAU,EACV8Y,QAAS/lB,EAAO2nB,aAAc,GAA6B,SAArB3nB,EAAO2nB,UAC7C5M,WAAW,EACXtiG,OAAQunF,EAAO4nB,MACf92C,MAAOkvB,EAAO6nB,MACd98C,KAAMi1B,EAAO8nB,KACb1oG,KAAM4gF,EAAOlkE,KACbyoE,SAAUvE,EAAO+nB,SACjB1gB,WAAYA,EACZI,eAAgBzH,EAAOgoB,kBAAmB,GAAkC,SAA1BhoB,EAAOgoB,eACzD1gB,WAAYtH,EAAOioB,cAAe,GAA8B,SAAtBjoB,EAAOioB,WACjD12E,UAAWyuD,EAAOlxD,UAClB46D,UAAW1J,EAAOkoB,UA0BpB,OAtBIloB,GAAOlkE,MAAQpN,eAAeE,MAAQ7R,GAAGC,IAAIid,YAC/CwtF,EAAyB,SAAI,IAG3BltF,EAAGqJ,MAAM4hF,iBAAmB1nC,MAAMvjD,EAAGqJ,MAAM4hF,eAAe5iG,QAAQo9E,EAAO3vC,QAA+B,qBAArBtzC,GAAGuE,gBACxFmmG,EAAsB,MAAIltF,EAAGqJ,MAAM4hF,eAAe5iG,QAAQo9E,EAAO3vC,OAI/D91B,EAAGkX,SAAS6zE,eACdmC,EAA0B,UAAIltF,EAAGkX,SAAS6zE,cAGxC/qF,EAAGkX,SAAS02E,kBACdV,EAAgC,gBAAIltF,EAAGkX,SAAS02E,iBAG9C5tF,EAAGkX,SAASgwE,SACdgG,EAAuB,OAAIltF,EAAGkX,SAASgwE,QAGzClnF,EAAGlB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMizE,YAAakb,GACnCA,GAGT,OAAOnf,IAIT8f,uBAAwB,SAAU9f,GAChC,MAAOxnF,GAAEwnF,GAASn2D,OAAO,SAAU6tD,GACjC,MAAqB,gBAAbA,EAAOjlF,IACM,aAAbilF,EAAOjlF,IACM,iBAAbilF,EAAOjlF,MAWnBstG,oBAAqB,WACnB,GAAI9tF,GAAK/iB,KACL8wF,EAAU/tE,EAAG6tF,uBAAuBtnG,EAAEtJ,KAAKq2F,UAAU9sF,QAEzD,OADAvJ,MAAK6hB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMgvF,uBAAwBhgB,GAChDA,GAeTigB,2BAA4B,WAC1B,GAAIhuF,GAAK/iB,KACL8wF,EAAU/tE,EAAG6tF,uBAAuB5wG,KAAKiuG,oBAE7C,OADAjuG,MAAK6hB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM41E,+BAAgC5G,GACxDA,GAITkgB,4BAA6B,SAAU3C,GACrCruG,KAAK6hB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM81E,gCAAiCyW,GAChEruG,KAAKixG,kBAAkB5C,IAYzB4C,kBAAmB,SAAU5C,GAC3B,GAAItrF,GAAK/iB,IACTuiB,KAAIqQ,KAAK,OAAQ,4BACjB5yB,KAAK6hB,KAAKtc,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAMovF,oBAAqB7C,GAEpDA,EAAatrF,EAAG6tF,uBAAuBvC,EACvC,IAAI8C,GAAa7nG,EAAE+kG,GAAY/xF,IAAI,SAAUiB,GAAK,MAAOA,GAAEha,IAE3Dwf,GAAGszE,SAAW/sF,EAAEyZ,EAAGszE,UAAU/5E,IAAI,SAAUksE,GACzC,GAAIgN,GAA2C,MAAxBhN,EAAOjlF,GAAGi5B,OAAO,GACpC88B,EAAQ63C,EAAW/lG,QAAQo9E,EAAOjlF,GAUtC,OATI+1D,MAAU,GAAMk8B,GAClBhN,EAAO+lB,SAAU,EACjB/lB,EAAOlvB,MAAQA,IAEfkvB,EAAO+lB,SAAU,EACQ,qBAArBhpG,GAAGuE,gBACL0+E,EAAOlvB,MAAQ,IAGZkvB,GAGT,IAAI4oB,GAAiBruF,EAAGkrF,mBAUxB,OAPAlrF,GAAGsyE,SAAS+Y,WAAWgD,GACvBruF,EAAG+qE,KAAKsgB,WAAWgD,GAEnBruF,EAAGo0E,YACD6W,eAAgB1kG,EAAE8nG,GAAgBhY,MAAM,UACxCiY,gBAAiB5/F,qBAEZsR,GAST24E,WAAY,SAAUn4F,GACpBgf,IAAIozB,MAAM,OAAQ,kBAAoBpyC,EACtC,IAAIwf,GAAK/iB,KACL8wF,EAAU/tE,EAAGkrF,oBACbI,EAAa/kG,EAAEwnF,GAASn2D,OAAO,SAAUihE,GAC3C,MAAOr4F,KAAOq4F,EAAIr4F,IAIpB,OADAwf,GAAGkuF,kBAAkB5C,GACdtrF,GAST02E,WAAY,SAAUl2F,EAAI+tG,GACxB/uF,IAAIozB,MAAM,OAAQ,kBAAoBpyC,GACtCgf,IAAIozB,MAAM,OAAQ,uBAAyB27D,EAC3C,IAAIvuF,GAAK/iB,KAELuxG,GADUxuF,EAAGszE,SACAtzE,EAAGkrF,qBAEhBuD,EAAYloG,EAAEyZ,EAAGszE,UAAUnyF,KAAK,SAAU03F,GAC5C,MAAOr4F,IAAMq4F,EAAIr4F,IAOnB,OAJIiuG,KACFD,EAAWp8F,OAAOm8F,GAAa,EAAG,EAAGE,GACrCzuF,EAAGkuF,kBAAkBM,IAEhBxuF,GAQT0uF,uBAAwB,WACtB,MAA6D,gBAA9ClsG,IAAGmE,GAAG8C,QAAQ0mB,QAAQw+E,qBAAoCnsG,GAAGmE,GAAG8C,QAAQ0mB,QAAQw+E,oBAAoBr7C,gBAMrHv0C,OAOEC,WAAY,YAWZ8yE,iBAAkB,iBAQlBI,UAAW,WAQXwa,mBAAoB,mBAUpBhS,YAAa,aAQb5H,kBAAmB,kBAQnBib,uBAAwB,sBAQxBpZ,+BAAgC,6BAQhCwZ,oBAAqB,oBAQrBtZ,gCAAiC,8BAQjCoG,YAAa,aAQbqC,kBAAmB,kBAQnBqB,sBAAuB,sBAQvB3M,YAAa,aAOboI,aAAc,kBAIjB74F,OAAOiB;ACtoBV,cA6CA,SAAWomB,GAET,GAAIhC,GAAajI,WAAWjgB,QAC1BlB,KAAM,SAAU05B,GAEdj6B,KAAK2xG,sBACL3xG,KAAKuD,IAAK,GAAIkR,OAAOusB,UACrBhhC,KAAK8jB,OAAOmW,GAEZj6B,KAAK4xG,kBAED/yG,EAAEuzB,cAAc6H,IAClBp7B,EAAE4C,OAAOzB,KAAMi6B,IAOnB/mB,UAAW,aACX2+F,YAAa,GACb1iF,WAAY,KACZ5rB,GAAI,IACJouG,sBACA/nF,MAAOjjB,EAAE,gBACT/C,KAAM+C,EAAE,6BACRkrC,OAAQlrC,EAAE,MACVy6C,WAAYz6C,EAAE,UACdmrG,UAAWnrG,EAAE,SACb7D,GAAI,aACJ6B,OAAQ,aACRX,OAAQ,OACR/C,MAAO,OACP4lE,SAAU,IACV08B,WAAW,EACXwO,OAAO,EACPC,SAAS,EACT3vD,OAAQ,aACR/c,QAAS,aACT6b,gBAAgB,EAChBrP,oBAAoB,EACpBmgE,eAAe,EACfC,SAAU,aACVC,YAAY,EACZC,eACAC,UAAW,KACXC,WAAW,EAOXV,gBAAiB,WACf,GAAI7uF,GAAK/iB,IACT+iB,GAAGqvF,aACDG,MAAS,SAAUnuG,GACbA,GAAKvF,EAAEuF,EAAE+B,QAAQ4+B,GAAG,8BACxBlmC,EAAE,oBAAsBkkB,EAAGxf,IAAIN,WAarCuvG,WAAY,SAAUC,GACpBzyG,KAAK0yG,SAAS/rG,EAAE,eAEhB,IAAIo5C,GAAc,2CASlB,OANEA,GADE0yD,EACY/kG,OAAOqyC,EAAa,2BAA4B0yD,GAEhD/kG,OAAOqyC,EAAa,8BAA+B,IAEnE//C,KAAK6pB,QAAQk2B,GAEN//C,MAWT4tC,qBAAsB,WAGpB,MAFA5tC,MAAKmhD,gBAAiB,EACtBnhD,KAAK8xC,oBAAqB,EACnB9xC,MAUT6uC,kBAAmB,WAKjB,MAJI7uC,MAAKm7E,WACPt8E,EAAE,mBAAqBmB,KAAKuD,IAAIkQ,SAASA,SAASvP,KAAK,6BAA6BwsC,SAEpF1wC,KAAKmiB,KAAKniB,KAAY,MAAE8hB,MAAM6wF,WAAY3yG,KAAK6uC,mBAC1C7uC,MAWT4yG,iBAAkB,WAEhB,MADA5yG,MAAK8xC,oBAAqB,EACnB9xC,MAYT6yG,SAAU,SAAU5xG,GAClB,GAAI8hB,GAAK/iB,IAKT,OAJA+iB,GAAG9hB,MAAQA,EACP8hB,EAAGsvF,WACLtvF,EAAGsvF,UAAU1lG,OAAO,SAAU,QAAS1L,GAElC8hB,GAaT+vF,UAAW,SAAU9uG,GACnB,GAAI+e,GAAK/iB,IAKT,OAJA+iB,GAAG/e,OAASA,EACR+e,EAAGsvF,WACLtvF,EAAGsvF,UAAU1lG,OAAO,SAAU,SAAU3I,GAEnC+e,GAYT2vF,SAAU,SAAU9oF,GAGlB,MAFA5pB,MAAK4pB,MAAQA,EACT5pB,KAAKm7E,YAAYt8E,EAAE,mBAAqBmB,KAAKuD,IAAI3B,QAAQ,cAAcsC,KAAK,oBAAoBN,KAAKgmB,GAClG5pB,MAWTm7E,SAAU,WACR,MAAQt8E,GAAE,mBAAqBmB,KAAKuD,IAAU,OAAI,GAUpDu2B,MAAO,WACL95B,KAAK6pB,QAAQ,KAWfA,QAAS,SAAUjmB,GAIjB,MAHA5D,MAAK4D,KAAOA,EACR5D,KAAKm7E,YAAYt8E,EAAE,mBAAqBmB,KAAKuD,IAAIK,KAAK5D,KAAK4D,MAC/D5D,KAAK+yG,iBACE/yG,MAQTgzG,eAAgB,WACd,GAAIjwF,GAAK/iB,IAET,KAAK,GAAIizG,KAAWlwF,GAAGqvF,YACrBhkG,IAAI6kG,EAASlwF,EAAGmvF,SAAUnvF,EAAGqvF,YAAYa,GAG3C7kG,KAAIo/F,SAASzqF,EAAGmvF,WAWlBxvD,aAAc,SAAUwwD,GAKtB,MAJMA,KACJr0G,EAAE,IAAMq0G,EAAW,IAAMlzG,KAAKuD,IAAIwB,KAAK,YAAY,GAAOzF,YAAY,YACtET,EAAE,IAAMq0G,GAAUnuG,KAAK,YAAY,GAAOzF,YAAY,aAEjDU,MAWTy/C,cAAe,SAAUyzD,GAKvB,MAJMA,KACJr0G,EAAE,IAAMq0G,EAAW,IAAMlzG,KAAKuD,IAAIwB,KAAK,YAAY,GAAMrF,SAAS,YAClEb,EAAE,IAAMq0G,GAAUnuG,KAAK,YAAY,GAAMrF,SAAS,aAE7CM,MAWTmzG,aAAc,SAAUD,EAAUtlG,GAChC,GAAImV,GAAK/iB,KAEL4M,EAAStD,EAAEmjF,UAAU1pE,EAAG4uF,oBAAsBpuG,GAAI2vG,GAClDtmG,IACFtD,EAAEvJ,KAAKuJ,EAAE69F,KAAKv5F,GAAS,SAAUQ,GAC/BxB,EAAOwB,GAAOR,EAAOQ,MAW3BglG,cAAe,WACb,GAAIrwF,GAAK/iB,IACT+iB,GAAG28B,SAAS/yC,OAAO,SAAU,UAAWoW,EAAG4uF,qBAU7C0B,cAAe,SAAUH,EAAUhlC,GACjC,GAAInrD,GAAK/iB,IACT+iB,GAAGowF,aAAaD,GAAY5tD,OAASguD,QAASplC,EAAWqlC,UAAW,QACpExwF,EAAGqwF,iBAULI,iBAAkB,SAAUN,GAC1B,GAAInwF,GAAK/iB,IACT+iB,GAAGowF,aAAaD,GAAY5tD,OAASguD,QAAS,KAAMC,UAAW,QAC/DxwF,EAAGqwF,iBAWLK,sBAAuB,SAAUP,EAAUxpB,GACzC,GAAI3mE,GAAK/iB,KACL4M,EAAStD,EAAEmjF,UAAU1pE,EAAG4uF,oBAAsBpuG,GAAI2vG,GAClDtmG,KACFA,EAAO8mG,aAAe9mG,EAAOnF,KACzBiiF,IACF98E,EAAOnF,KAAOiiF,GAChB3mE,EAAGswF,cAAcH,EAAU,mBAE3BnwF,EAAG08B,cAAcyzD,KAWrBS,uBAAwB,SAAUT,GAChC,GAAInwF,GAAK/iB,KACL4M,EAAStD,EAAEmjF,UAAU1pE,EAAG4uF,oBAAsBpuG,GAAI2vG,GAClDtmG,KACEA,EAAOgnG,cACThnG,EAAOnF,KAAOmF,EAAO8mG,cACvB3wF,EAAGywF,iBAAiBN,GACpBnwF,EAAG2/B,aAAawwD,KAYpBW,YAAa,SAAUC,GACrB,GAAIC,GAAM/zG,KAAK0/C,QACf,IAAIq0D,GAAOA,EAAIjmG,OAAS,EAAG,CACzB,GAAIpM,EAEFA,GADEoyG,KAAgB,EACbC,EAEAA,EAAItgG,SAASvP,KAAK,uBAEgB,IAArCxC,EAAGwC,KAAK,kBAAkB4J,QAC5BpM,EAAG1C,OAAO,6MAGd,MAAOgB,OAITg0G,KAAM,SAAU52E,GAEd,MADAp9B,MAAK8C,GAAKyC,GAAGurB,IAAIsM,GACVp9B,MAGTi0G,SAAU,SAAU72E,GAElB,MADAp9B,MAAK2E,OAASY,GAAGurB,IAAIsM,GACdp9B,MASTiC,KAAM,WACJ,GAAI8gB,GAAK/iB,IAKT,IAFAnB,EAAE,kBAAkByB,OAEhByiB,EAAGovF,YAActzG,EAAE,sBAAwBkkB,EAAGxf,IAAIuK,OAAS,EAAG,MAAOiV,EAGzE,KAAK,GADDmxF,MACK3sG,EAAI,EAAGA,EAAIwb,EAAG4uF,mBAAmB7jG,OAAQvG,IAChD2sG,EAAgB3gG,KAAKwP,EAAG4uF,mBAAmBpqG,GAAGhE,KACD4b,SAAzC4D,EAAG4uF,mBAAmBpqG,GAAG4sG,aAA+BpxF,EAAG4uF,mBAAmBpqG,GAAG4sG,eACnFpxF,EAAG4uF,mBAAmBpqG,GAAGtE,MAAQ8f,EAAG4uF,mBAAmBpqG,GAAGtE,MAAM0d,SAAS,WACvE,GAAIvZ,GAAMpH,KAAK4gB,eACf,OAAIxZ,MAAQ,EAAgBA,GAC5BvI,EAAEmB,MAAM2M,OAAO,SACf9N,EAAEmB,MAAM0wC,SACDtpC,KAET2b,EAAG4uF,mBAAmBpqG,GAAG,aAAewb,EAAG4uF,mBAAmBpqG,GAAGhE,GAIjEwf,GAAGo+B,gBACD+yD,EAAgB9oG,QAAQ,mBAAqB2X,EAAGxf,OAAQ,GAC1Dwf,EAAG4uF,mBAAmBp+F,MACpBhQ,GAAI,mBAAqBwf,EAAGxf,GAC5BkE,KAAMsb,EAAG8uB,OACT5uC,MAAO,WAAkB8f,EAAGjgB,GAAG9C,SAAU,IAAmBnB,EAAEmB,MAAM2M,OAAO,SAAU9N,EAAEmB,MAAM0wC,WAC7Fy1B,MAAS,UACTiuC,YAAa,aAGfrxF,EAAG+uB,oBACDoiE,EAAgB9oG,QAAQ,uBAAyB2X,EAAGxf,OAAQ,GAC9Dwf,EAAG4uF,mBAAmBp+F,MACpBhQ,GAAI,uBAAyBwf,EAAGxf,GAChCkE,KAAMsb,EAAGq+B,WACTn+C,MAAO,WAAkB8f,EAAGpe,OAAO3E,SAAU,IAAmBnB,EAAEmB,MAAM2M,OAAO,SAAU9N,EAAEmB,MAAM0wC,WACjG0jE,YAAa,iBASnBrxF,EAAGjgB,GAAKigB,EAAGjgB,GAAG6d,SACZ,WAEE,MADAoC,GAAGlB,KAAK,MACD7hB,KAAK4gB,kBAIZmC,EAAGpe,SACLoe,EAAGpe,OAASoe,EAAGpe,OAAOgc,SACtB,WAEE,MADAoC,GAAGlB,KAAK,UACD7hB,KAAK4gB,mBAIhB/hB,EAAE,sBAAwBkkB,EAAGxf,IAAIkQ,OAAO,OAAOi9B,SAE/C3tB,EAAG28B,SAAW7gD,EAAE,SAAW+E,KAAM,2BAA6Bmf,EAAGxf,GAAK,sCAAwCwf,EAAGk+B,SAAW,IAAe,IAAM,KAAOl+B,EAAGnf,KAAO,UAElK,IAAIywG,GAA6B,KAC7BC,EAAoB,EAgFxB,OA/EAvxF,GAAGsvF,UAAYtvF,EAAG28B,SAAS/yC,QACzBnC,OAAQ,IACRof,MAAO7G,EAAG6G,MACV25E,UAAWxgF,EAAGwgF,UACdv/F,OAAQ+e,EAAG/e,OACX/C,MAAO8hB,EAAG9hB,MACV8wG,MAAOhvF,EAAGgvF,MACVF,YAAa9uF,EAAG8uF,YAChBC,UAAW/uF,EAAG+uF,UACdnyE,KAAM,WAKJ,GAHA20E,EAAoBhwG,OAAsB,cAC1C+vG,EAA6B/vG,OAAOiwG,eAEnB,QAAbxxF,EAAG/e,QACD+e,EAAG28B,SAAS17C,SAAgC,GAArBnF,EAAEyF,QAAQN,SAAgB,CACnD,GAAIwwG,GAAgB9xG,KAAK+xG,MAAM,GAAMxoG,eACrC8W,GAAG28B,SAAS/yC,OAAO,SAAU,SAAU6nG,GACvCzxF,EAAGuvF,WAAY,EAInBvvF,EAAGoM,WAAa,GAAI5pB,IAAGygB,IAAIod,IAAIhU,cAAerM,EAAGxf,IACjDwf,EAAGiwF,iBACH9gG,gBACA6Q,EAAGlB,KAAK,QACRkB,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM6wF,WAAY5vF,GAClCA,EAAGs/B,QAAQt/B,EAAGs/B,SAClBqyD,mBAAmB3xF,EAAG9hB,MACtB,IAAIiyB,GAAUnQ,EAAG28B,SAAS/d,MAC1BgzE,qBAAoBzhF,GACpBnQ,EAAG28B,SAASx7C,KAAK,sBAAsBR,IAAI,WAAY,QACvDqf,EAAG28B,SAASh8C,IAAI,YAAaqf,EAAG8jD,UAChC9jD,EAAGgwF,iBACHl0G,EAAEyF,QAAQxD,GAAG,uBAAwB,WACnCiiB,EAAGgwF,oBAGP6B,UAAU,EACVC,YAAa,SAAUxxG,GACrB,MAAI0f,GAAGlB,KAAKkB,EAAU,MAAEjB,MAAMgzF,aAAc/xF,MAAQ,IAChD1f,EAAMm/C,UAAY3jD,EAAEiwF,GAAGtsC,QAAQ0sC,QAC7BnsE,EAAGkvF,eACLlvF,EAAGZ,KAAKY,EAAU,MAAEjB,MAAMizF,YAAa,SAAU1xG,GAE/C0f,EAAGsvF,UAAU1lG,OAAO,aAGhBoW,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAMkzF,uBAAwBjyF,MAAQ,GAPpE,SAUF8b,MAAO,WACLhgC,EAAEyF,QAAQzD,IAAI,wBACVkiB,EAAGuiB,SAASviB,EAAGuiB,UAEnBpzB,gBACA6Q,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAMizF,YAAahyF,GACvC3U,IAAIo/F,SAAS,UAETlpG,OAAOiwG,iBACTjwG,OAAsB,cAAIgwG,EAC1BhwG,OAAOiwG,eAAiBF,IAG5BnhF,QAASnQ,EAAG4uF,mBACZM,cAAelvF,EAAGkvF,gBAGpBlvF,EAAG8wF,cACH9wF,EAAGkyF,wBAEHlyF,EAAGlB,KAAK,eAERkB,EAAGsvF,UAAU5+F,SAASvP,KAAK,6BAA6BrD,IAAI,SAASC,GAAG,QAAS,WAC3EiiB,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAMozF,sBAAuBnyF,MAAQ,GAC3DA,EAAG8b,UAIA9b,GAITgwF,eAAgB,WACd,GAAIoC,GAAUt2G,EAAE,mBAAqBmB,KAAKuD,IAAIkQ,QAC9C0hG,GAAQ1hG,SAAStO,UACf+tD,GAAI,gBACJC,GAAI,gBACJiiD,GAAI9wG,UAUR2wG,sBAAuB,WAErB,GAAII,GAAwBr1G,KAAKqyG,UAAUzwG,QAAQ,cAAclC,SAAS,oBAAsBM,KAAKkT,WAAWnO,KAAK,kBAAmB,cACxIswG,GAAsBnxG,KAAK,uBAAuBxE,SAAS,cAC3D21G,EAAsBnxG,KAAK,6BAA6Ba,KAAK,YAAa,aAC1EswG,EAAsBnxG,KAAK,kBAAkBa,KAAK,YAAa,YAC/DswG,EAAsBnxG,KAAK,sBAAsBxE,SAAS,gBAC1D21G,EAAsBnxG,KAAK,yBAAyBxE,SAAS,iBAS/Dm/B,MAAO,WAQL,MAPM7+B,MAAKqyG,YAITryG,KAAKqyG,UAAU1lG,OAAO,SACtB3M,KAAKqyG,UAAU1lG,OAAO,YAEjB3M,QAMT8hB,OASEgzF,aAAc,cASdE,uBAAwB,cASxBE,sBAAuB,aASvBH,YAAa,QASbpC,WAAY,OAQZ2C,kBAAmB,KAQnBC,sBAAuB,WAI3B5pF,GAAOhC,WAAaA,GACnBrlB,OAAOumB,UAAUiC,WAAWhH;ACrsB/B,cAiDA,SAAW6F,GACT,GAAI6pF,GAAkB7pF,EAAOhC,WAAWloB,QAEtCmoB,MAAOjjB,EAAE,6BACT1F,MAAO,IACP+C,OAAQ,IACRyxG,oBAAqB9uG,EAAE,0BACvB+uG,mBAAoB/uG,EAAE,+BACtB4hE,kBAAmB5hE,EAAE,gCACrBgvG,8BAA+BhvG,EAAE,yBAEjCuM,UAAW,kBAEXqrD,YAAY,EACZq3C,kBAAmB,qBACnBC,wBAAyB,6BACzBC,oBAAoB,EAEpBC,MAAO,GACPC,qBAAsB,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,IAC7CC,aACAC,qBAAsB,KACtBC,qBAAsB,KACtBC,iBAAkB,KAClBC,iBAAiB,EACjBC,WAAY,KAGZ/1G,KAAM,SAAUg2G,EAAgBC,EAAmBC,GACjD,GAAIC,GAAW12G,IAgJf,OA9IKu2G,IAAgB1rF,UAAUja,MAAM,oDACrC5Q,KAAKu2G,eAAiBA,EACtBv2G,KAAKk7D,cAAgBs7C,MAErBx2G,KAAK8jB,OAAO2yF,GAIZz2G,KAAKi2G,UAAUU,WAAa,SAAUtzG,GACpCqzG,EAASC,WAAW32G,OAKtBA,KAAKi2G,UAAUW,aAAe,SAAUvzG,GACtCqzG,EAASE,aAAa52G,OAKxBA,KAAKi2G,UAAUY,WAAa,SAAUxzG,GACpC,IAAKqzG,EAASn4C,WAAY,CACxB,GAAI13D,GAAOhI,EAAEmB,MACTuD,EAAKsD,EAAK9B,KAAK,MACfmpF,EAAQrnF,EAAK9B,KAAK,SAClBkF,EAAOpD,EAAK3C,KAAK,0BAA0BuD,OAE3CqvG,GACFvzG,GAAIA,EACJ0G,KAAM,GAAKA,EACXikF,MAAO,GAAKA,EAGdwoB,GAASK,yBAAyBD,IAClCJ,EAAS70F,KAAK,aAAci1F,KAMhC92G,KAAKi2G,UAAUe,qBAAuB,SAAU3zG,GAE9C,GADArD,KAAKm2G,qBAAuBt3G,EAAE,gBAC1BA,EAAEw6D,QAAQh2D,EAAMm/C,QAASk0D,EAASV,sBAAuB,GAE3D,GAAqB,GAAjB3yG,EAAMm/C,QAAc,CACtB3jD,EAAEmB,MAAM0wD,MACR,IAAIwS,GAAYljE,KAAKm2G,qBAAqBjyG,KAAK,yBAI/C,OAHIg/D,GAAUzjE,SAAS,SAASyjE,EAAUxjE,SAAS,QAEnDM,KAAKm2G,qBAAqBtxG,UAAU,IAC7B,OAGJ,CACL,GAAI+7D,GAAc5gE,KAAKm2G,qBAAqBjyG,KAAK,sBAE7C4iE,EAAOjoE,EAAEmB,MAAMiU,KACnBjU,MAAKm2G,qBAAqBjyG,KAAK,YAAYjC,OAAOq0B,IAAI,cAAgBwwC,EAAO,MAAMxmE,OAEjB,IAA9DN,KAAKm2G,qBAAqBjyG,KAAK,oBAAoB4J,OACrD8yD,EAAYthE,YAAY,UAExBshE,EAAYlhE,SAAS,YAQ3BM,KAAKi2G,UAAUgB,oBAAsB,SAAUjlC,GAC7ChyE,KAAKm2G,qBAAuBt3G,EAAE,eAC9B,IAAIozE,GAAcykC,EAASP,qBAAqBjyG,KAAK,wBACrD,IAAI+tE,EAAYnkE,OAAQ,CAEtB,GAAIokE,EACAF,IACFE,EAAWD,EAAY/tE,KAAK,kDAAkDrC,QACtD,IAApBqwE,EAASpkE,SACXokE,EAAWwkC,EAASQ,qBAAqBjlC,EAAaD,IAEpDE,EAAStuE,SAAWquE,EAAYx+D,SAAS7P,SAC3CsuE,EAAWD,IAIbC,EAAWwkC,EAASQ,qBAAqBjlC,EAAaD,GAEpDE,EAASpkE,SACXmkE,EAAYxyE,SAAS,QAAUi3G,EAASE,aAAa3kC,GAAeykC,EAASS,aAAallC,GAC1FC,EAASzyE,SAAS,QAAUi3G,EAASC,WAAWzkC,GAAYnvD,GAAGq0F,WAAWllC,GAC1EwkC,EAASW,yBAAyBnlC,EAAUF,QAG3C,CACH,GAAIhoB,EAEAgoB,IACFhoB,EAAQ0sD,EAASP,qBAAqBjyG,KAAK,kDAAkDrC,QAC7FmoD,EAAMvqD,SAAS,QAAUi3G,EAASC,WAAW3sD,GAAS0sD,EAASU,WAAWptD,GAC1E0sD,EAASY,YAAYzyG,UAAU,KAG/BmlD,EAAQ0sD,EAASP,qBAAqBjyG,KAAK,gDAAgD2+D,OAC3F7Y,EAAMvqD,SAAS,QAAUi3G,EAASC,WAAW3sD,GAAS0sD,EAASU,WAAWptD,GAC1E0sD,EAASY,YAAYzyG,UAAU,QAMrC7E,KAAKi2G,UAAUsB,mBAAqB,aAIpCv3G,KAAKi2G,UAAUuB,kBAAoB,aAInCx3G,KAAKi2G,UAAUwB,eAAiB,WAC9Bz3G,KAAKk2G,qBAAuBr3G,EAAE,8BAA8BqF,KAAK,QACjE,IAAIwzG,GAAahB,EAASP,qBAAqBjyG,KAAK,cAAca,KAAK,KACvE,IAAI2yG,EAAY,CACd,GAAIC,GAAkBjB,EAASR,qBAAqBhyG,KAAK,SAAWwzG,EAAa,KAAKxzG,KAAK,oBAC3FwyG,GAASkB,iCAAiCD,KAS9C33G,KAAK8C,GAAK9C,KAAK8C,GAAG6d,SAChB,WACE+1F,EAAS70F,KAAK,KAAM60F,EAASx7C,eACzBl7D,KAAK81G,oBAAoBY,EAAS70F,KAAK,iBAAkB60F,EAASx7C,eACtEl7D,KAAK4gB,cAAc81F,EAASx7C,iBAKzBl7D,MAQT0zB,SAAU,WACR1zB,KAAK63G,6BACL73G,KAAK83G,6BAQPlkF,UAAW,WACT5zB,KAAKk2G,qBAAuBr3G,EAAE,8BAA8BqF,KAAK,SACjElE,KAAKm2G,qBAAuBt3G,EAAE,gBAC9BmB,KAAK+3G,cAAgBl5G,EAAE,gBACvBmB,KAAKg4G,cAELh4G,KAAKi4G,yCACLj4G,KAAKk4G,gCAQPL,2BAA4B,WAE1B,IAAK,GADDM,GAAgB,GACX5wG,EAAI,EAAG2V,EAAIld,KAAKu2G,eAAezoG,OAAQvG,EAAI2V,EAAG3V,IACrDvH,KAAKu2G,eAAehvG,GAAiB,aAAIvH,KAAK41G,kBAC9C51G,KAAKu2G,eAAehvG,GAAQ,IAAIvH,KAAKu2G,eAAehvG,GAAQ,KAAK,IACjE4wG,GAAiBzqG,OAAOpB,GAAGK,OAAOW,cAAetN,KAAKu2G,eAAehvG,GAEvE,IAAI6wG,GAAiBp4G,KAAKu+D,WAAa,WAAa,GAChD85C,EAAS9yG,GAAGC,IAAIuoB,GAAG9jB,KAAKiY,aAC5BliB,MAAK+1G,MAAQroG,OAAOpB,GAAGK,OAAOU,oBAC5BirG,YAAaF,EACbxO,MAAO5pG,KAAKy1G,oBACZ8C,QAAS5xG,EAAE,QACX6xG,cAAe,GACf74G,KAAMw4G,EACNM,oBAAqBz4G,KAAK21G,8BAC1B+C,SAAsB,QAAXL,GAA8B,WAAVA,EAAuB,kBAAoB,MAU9EJ,uCAAwC,WAEtC,IAAK,GADDU,GAAW34G,KAAKk7D,cACX3zD,EAAI,EAAGmK,EAAMinG,EAAS7qG,OAAQvG,EAAImK,EAAKnK,IAC9CvH,KAAK44G,YAAYD,EAASpxG,GAAGhE,IAAI,IASrCu0G,0BAA2B,WAGzB,IAAK,GAFDK,GAAgB,GAEX5wG,EAAI,EAAG2V,EAAIld,KAAKk7D,cAAcptD,OAAQvG,EAAI2V,EAAG3V,IAAK,CACzD,GAAIW,GAAWlI,KAAK64G,oBAAoB74G,KAAKk7D,cAAc3zD,GAC3D4wG,IAAiBjwG,EAGnB,GAAI4wG,GAAgB94G,KAAKu+D,WAAa,SAAW,GAC7Cw6C,GAAkB/4G,KAAKq2G,iBAAmBr2G,KAAKu+D,WAAa,SAAW,EAE3Ev+D,MAAK+1G,OAASroG,OAAOpB,GAAGK,OAAOQ,mBAC7By8F,MAAO5pG,KAAK01G,mBACZsD,iBAAkB,GAClB/uG,KAAMtD,EAAE,QACRhH,KAAMw4G,EACNc,eAAgBH,EAChBI,gBAAiBH,EACjBI,YAAa,GACbC,WAAY,wBAUhBP,oBAAqB,SAAUhyG,GAM7B,MALAA,GAAqB,eAAI7G,KAAKu+D,WAAa,SAAW,GACtD13D,EAAmB,aAAIF,EAAE,UACzBE,EAAU,IAAIA,EAAU,KAAK,IAC7BA,EAAsB,gBAAI,SAC1BA,EAAW,KAAIsX,WAAWtX,EAAW,MAC9B6G,OAAOpB,GAAGK,OAAOS,aAAcvG,IAQxCmxG,YAAa,WACXh4G,KAAKq5G,2BACLr5G,KAAKs5G,gCACLt5G,KAAKu5G,yBAELv5G,KAAKmiB,KAAK,aAAc,WACtBniB,KAAK81G,oBAAqB,IAE5B91G,KAAKmiB,KAAK,eAAgB,WACxBniB,KAAK81G,oBAAqB,IAG5B91G,KAAKw5G,oBAQPA,iBAAkB,aAQlBD,uBAAwB,WACtB,GAAI7C,GAAW12G,IAEfA,MAAK+3G,cAAc51F,KAAK,iBAAkBu0F,EAAST,UAAUe,sBACzDzxG,GAAGC,IAAIC,aAAezF,KAAK+3G,cAAc51F,KAAK,SAAUu0F,EAAST,UAAUe,sBAC1C,QAAjCzxG,GAAGC,IAAIuoB,GAAG9jB,KAAKiY,eACjBliB,KAAK+3G,cAAcrnD,OAErB1wD,KAAKy5G,sBASPH,8BAA+B,SAAUlR,EAAOsR,GAC9C,GAAIhD,GAAW12G,KAIXuB,EAAQ1C,KAEZ0C,GAAQvB,KAAKm2G,qBAAqBjyG,KAAK,YAElClE,KAAKu+D,aACRh9D,EAAMT,GAAG,+BAAgC41G,EAAST,UAAUY,YAEvDh4G,EAAEwB,MAASkF,GAAGC,IAAIC,aACrBlE,EAAM0J,MAAMjL,KAAKi2G,UAAUU,WAAY32G,KAAKi2G,UAAUW,gBAU5D+C,gBAAiB,WACf,GAAIC,KAEJ,IAAK55G,KAAKu+D,WAIRq7C,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,QAJxB,CACpB,GAAIC,GAAWx0G,GAAGC,IAAIgoB,WAAa,OAAS,MAC5CosF,GAAKrmG,MAAOymG,OAAUD,EAAUF,UAAY,EAAMC,WAAa,IASjE,MAJAF,GAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,QAASF,WAAa,KAEzD95G,KAAKu+D,YAAcv+D,KAAKq2G,gBAAiBuD,EAAKrmG,MAAOsmG,UAAY,EAAOG,OAAU,IAAKF,WAAa,IACpGF,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,IAC1CF,GAOTP,yBAA0B,WACxB,GAAIO,GAAO55G,KAAK25G,iBAWhB,IAVA35G,KAAKs2G,WAAat2G,KAAKk2G,qBAAqB+D,WAC1CC,SAAal6G,KAAKk2G,qBAAqBziG,SAASzP,SAAW,GAAM,KACjEm2G,YAAc,EACdC,cAAgB,EAChBC,WAAa,EACbP,WAAa,EACbQ,WAAeC,aAAgB5zG,EAAE,UACjC6zG,UAAaZ,IAGXr0G,GAAGC,IAAIC,aAAe5G,EAAEwB,KAAM,CAChC,GAAIo6G,GAAa,GACjBz6G,MAAKk2G,qBAAqBj1G,MAAMw5G,GAChC57G,EAAE,+BAA+BoC,MAAMw5G,GAAYnyE,SAAS,SAASrnC,MAAMw5G,OAG3E57G,GAAE,+BAA+BoC,MAAM,QAAQqnC,SAAS,SAASrnC,MAAM,OAGzE,IAAIy1G,GAAW12G,IACfA,MAAKk2G,qBAAqBhyG,KAAK,MAAMnE,KAAK,WAAc22G,EAASgE,8BAA8B16G,SAQjG06G,8BAA+B,SAAU3jF,GACvCA,EAAMl4B,EAAEk4B,EACR,IAAI2/E,GAAW12G,IAEVnB,GAAEwB,MAASkF,GAAGC,IAAIC,aACrBsxB,EAAI9rB,MACA,WAAcyrG,EAASR,qBAAqBhyG,KAAK,MAAMoyB,IAAIt2B,MAAMooD,QAAQ,YAAavpD,EAAEmB,MAAMN,SAAS,SACvG,WAAcb,EAAEmB,MAAMV,YAAY,UAExCy3B,EAAI7yB,KAAK,qBAAqBpD,GAAG,+BAAgCd,KAAM,SAAUoE,GAC/EA,EAAEzE,KAAKi4G,iCAAiC53G,SAY5C43G,iCAAkC,SAAU/wG,GAE1C,IAAK7G,KAAKu+D,WAAY,CACpB,GAAIxnC,GAAMl4B,EAAEgI,GAAM4M,SAASA,SAEvBlQ,EAAKwzB,EAAIhyB,KAAK,MAEd41G,EAAM36G,KAAK46G,qBAAqBr3G,EAEhCo3G,MAAQ,GACV36G,KAAKk7D,cAAc/lD,OAAOwlG,EAAK,GAGjC36G,KAAK6hB,KAAK,eAAgBte,GAE1BvD,KAAKs2G,WAAWuE,YAAY9jF,EAAI,IAChC/2B,KAAK44G,YAAYr1G,GAAI,GACrBvD,KAAKk4G,+BACLl4G,KAAK86G,kCAYTF,qBAAsB,SAAUr3G,GAC9B,MAAOuzC,uBAAsB92C,KAAKk7D,cAAe,KAAM33D,IASzDw3G,sBAAuB,SAAUx3G,GAC/B,MAAOvD,MAAKu2G,eAAez/D,sBAAsB92C,KAAKu2G,eAAe,KAAMhzG,KAW7Eq1G,YAAa,SAAUr1G,EAAIwsE,GACzB,GAAIxsE,EAAI,CACN,GAEIy3G,GAFAn0G,EAAO7G,KAAKm2G,qBAAqBjyG,KAAK,aAAeX,EAAK,MAC1D6E,EAAOvB,EAAK3C,KAAK,+BAGnB82G,GADEh7G,KAAKi7G,SACMp0G,EAAKpH,SAAS,YAAeO,KAAKk7G,sBAAwBl7G,KAAKm7G,wBAGhEn7G,KAAK41G,kBAEf7lC,GACFlpE,EAAKnH,SAAS,YACVM,KAAKi7G,UACP7yG,EAAK9I,YAAYU,KAAKm7G,yBAAyB77G,YAAYU,KAAKk7G,uBAChEF,EAAYh7G,KAAKo7G,+BAEjBJ,EAAYh7G,KAAK61G,yBAInBhvG,EAAKvH,YAAY,YAEnB8I,EAAKrD,KAAK,aAAc,IAAMi2G,KAUlCF,8BAA+B,WAC7B,GAAIO,GAAQr7G,KAAKk2G,qBAAqB5tE,SAAS,SAASpkC,KAAK,KAExC,KAAjBm3G,EAAMvtG,QACJutG,EAAMx5G,QAAQymC,SAAS,MAAM7oC,SAAS,qBACxCO,KAAKy/C,cAAc,oBAczB67D,gCAAiC,SAAUvkF,GACzCA,EAAMl4B,EAAEk4B,GACHl4B,EAAEwB,MAASkF,GAAGC,IAAIC,YAMrBsxB,EAAI7yB,KAAK,qBAAqBR,IAAI,aAAc,WALhDqzB,EAAI9rB,MACA,WAAcpM,EAAEmB,MAAMN,SAAS,QAAQwE,KAAK,qBAAqBR,IAAI,aAAc,YACnF,WAAc7E,EAAEmB,MAAMV,YAAY,QAAQ4E,KAAK,qBAAqBR,IAAI,aAAc,YAK5FqzB,EAAI7yB,KAAK,qBAAqBpD,GAAG,+BAAgCd,KAAM,SAAUoE,GAC/EA,EAAEzE,KAAK47G,wBAAwBv7G,SAOnCgzG,eAAgB,aAOhBkF,6BAA8B,WAC5B,GAAIv2G,GAAI3B,KAAKk2G,qBAAqBziG,QAC9BzT,MAAKk2G,qBAAqBlyG,SAAWrC,EAAEqC,SACzCrC,EAAEjC,SAAS,mBAEXiC,EAAErC,YAAY,oBAYlBu3G,WAAY,SAAUhwG,GAIrB,MAHC7G,MAAKk7D,cAAc3nD,KAAK1M,GAEzB7G,KAAK44G,YAAY/xG,EAAKtD,IAAI,GACnBvD,MAIR22G,WAAY,SAAU9vG,GACpBhI,EAAEgI,GAAMnH,SAAS,QAAQwE,KAAK,wBAAwB5E,YAAY,WAGpEs3G,aAAc,SAAU/vG,GACtBhI,EAAEgI,GAAMvH,YAAY,QAAQ4E,KAAK,wBAAwBxE,SAAS,WAOpEq3G,wBAAyB,SAAUx1G,GAG/B,IAAK,GAFDm1G,GAAW12G,KACX4D,EAAO,GACF2D,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAC5BvH,KAAK46G,qBAAqBr5G,EAAMgG,GAAGhE,OAAQ,IAC/ChC,EAAMgG,GAAG0C,KAAOkU,WAAW5c,EAAMgG,GAAG0C,MACpCrG,GAAQ5D,KAAK64G,oBAAoBt3G,EAAMgG,IACvCvH,KAAK62G,WAAWt1G,EAAMgG,IAExB,IAAM3D,EAAM,CACV5D,KAAKk2G,qBAAqBhyG,KAAK,uBAAuBuP,SAASi9B,SAC/D1wC,KAAK0iD,aAAa,kBAGlB,IAAIouC,GAAUltF,EAAKqL,MAAM,gBACzBjP,MAAKs2G,WAAWkF,WAAW1qB,EAAQ,GAAK,QAAS,OAASA,EAAQ,GAAK,QAAS,OAASA,EAAQ,IAEjG,IAAI2qB,GAAU58G,EAAE,8BAA8BqF,KAAK,MAAMoyB,IAAI,UAAUusC,OAAOnjE,SAAS,yBAAyBqF,KAAK,KAAMxD,EAAM,GAAGgC,GACpImzG,GAASgE,8BAA8Be,GAEvCz7G,KAAKk2G,qBAAqBt0G,QAAQ,sBAAsBsC,KAAK,+BAA+BokC,SAAS,SAASrnC,MAAM,QAEpHjB,KAAKk4G,+BACLl4G,KAAKk2G,qBAAqBziG,SAAS5O,UAAU,OAQnD40G,mBAAoB,WAClB,IAAKz5G,KAAKu+D,WAAY,CAClB,GAAIm4C,GAAW12G,KACX+yE,EAAQ,aACZ3kE,KAAI,OAAQ2kE,EAAO,WAA4D,MAA9C2jC,GAAST,UAAUgB,qBAAoB,IAAc,IACtF7oG,IAAI,KAAM2kE,EAAO,WAA6D,MAA/C2jC,GAAST,UAAUgB,qBAAoB,IAAe,IACrF7oG,IAAI,QAAS2kE,EAAO,WAAuD,MAAzC2jC,GAAST,UAAUsB,sBAA6B,IAClFnpG,IAAI,OAAQ2kE,EAAO,WAAsD,MAAxC2jC,GAAST,UAAUuB,qBAA4B,IAChFppG,IAAI,SAAU2kE,EAAO,WAAmD,MAArC2jC,GAAST,UAAUwB,kBAAyB,IAC/ErpG,IAAI,YAAa2kE,EAAO,WAEtB,MADAzsE,YAAW,WAAcowG,EAASqB,cAAcxhF,SAAY,MACrD,GAET,IAAIwf,GAAW,YAEf3nC,KAAI,QAAS2kE,EAAO,WAClB,GAAI/oB,GAAQ0sD,EAASP,qBAAqBjyG,KAAK6xC,GAAUl0C,OACzD,IAAImoD,EAAMl8C,OAAQ,CAChB,GAAIjH,GAAO6vG,EAASqE,sBAAsB/wD,EAAMjlD,KAAK,MAGrD,OAFA2xG,GAASK,yBAAyBlwG,IAClC6vG,EAAS70F,KAAK,aAAchb,IACrB,KAGXuH,IAAIo/F,SAASz6B,KAKnBmkC,qBAAsB,SAAUrwG,EAAMmrE,GACpC,GAAIE,EACJ,IAAIF,EACFE,EAAWrrE,EAAK86B,KAAK,qBACG,IAApBuwC,EAASpkE,SAKTokE,EAJGrrE,EAAK4M,OAAO,gBAAgB3F,OAIpBjH,EAHA7G,KAAKk3G,qBAAqBrwG,EAAKjF,QAAQ,qBAAsBowE,QAOzE,CACHE,EAAWrrE,EAAK+6B,KAAK,oBACrB,IAAI2wC,IAAU,CAcd,IAbwB,IAApBL,EAASpkE,SACNjH,EAAK4M,OAAO,gBAAgB3F,QAQ/BokE,EAAWrrE,EACX0rE,GAAU,IARVL,EAAWrrE,EAAKjF,QAAQ,qBACxB2wE,GAAU,EACc,IAApBL,EAASpkE,SACXokE,EAAWlyE,KAAKk3G,qBAAqBrwG,EAAKjF,QAAQ,qBAAsBowE,MAQ1EO,EAAS,CACX,GAAIC,GAAUN,EAAShuE,KAAK,gDAAgD2+D,MACxE2P,GAAQ1kE,SACVokE,EAAWM,IAOjB,OAHIN,EAASpkE,QAAWokE,EAASzyE,SAAS,SAAYyyE,EAASzyE,SAAS,iBACtEyyE,EAAWrrE,GAENqrE,GAITmlC,yBAA0B,SAAUxwG,EAAMmrE,GACxC,GAAI0kC,GAAW12G,IACf,IAAI02G,EAASgF,sBAAwBhF,EAASP,qBAAqBnyG,SAAU,CAC3E,GAIIuD,GAJAo0G,EAAa,GACb33G,EAAS,EACT2uE,EAAY9rE,EAAK9B,KAAK,MACtBxD,EAAQm1G,EAASP,qBAAqBjyG,KAAK,2CAG/C,IAAI8tE,EAAM,CACR,IAAKzqE,EAAIhG,EAAMuM,OAAS,EAAGvG,GAAK,EAAGA,IACjC,GAAI1I,EAAE0C,EAAMgG,IAAIxC,KAAK,OAAS4tE,EAAW,CACvC3uE,IAAWuD,EAAI,GAAKo0G,CACpB,OAGAjF,EAASP,qBAAqBnyG,SAAWA,EAAS,IACpD0yG,EAASP,qBAAqBtxG,UAAU6xG,EAASP,qBAAqBtxG,YAAc82G,OAGnF,CACH,IAAKp0G,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAC5B,GAAI1I,EAAE0C,EAAMgG,IAAIxC,KAAK,OAAS4tE,EAAW,CACvC3uE,IAAWuD,EAAI,GAAKo0G,CACpB,OAGA33G,EAAS0yG,EAASP,qBAAqBtxG,YAAc,IACvD6xG,EAASP,qBAAqBtxG,UAAU6xG,EAASP,qBAAqBtxG,YAAc82G,MAO5FD,oBAAqB,WAGnB,IAAK,GAFD13G,GAAS,EACTzC,EAAQvB,KAAKm2G,qBAAqB7tE,WAC7B/gC,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAChCvD,GAAUnF,EAAE0C,EAAMgG,IAAIvD,QAExB,OAAOA,IAIT/B,KAAM,WAKJ,MAJAjC,MAAK0zB,WACL1zB,KAAK4D,KAAO5D,KAAK+1G,MACjB/1G,KAAK8jB,SACL9jB,KAAK4zB,YACE5zB,OAaXoM,QAAOwvG,KAAK,KAAKC,SAAW,SAAUh/F,EAAGtV,EAAGyI,GAC1C,GAAI8rG,GAAQ9rG,EAAE,GAAGe,cAAc9B,MAAM,KACjC8sG,EAAU,CACd,IAAID,EAAMhuG,OAAS,GAAI,OAAO,CAE9B,KAAK,GAAIoO,GAAI,EAAGA,EAAI4/F,EAAMhuG,OAAQoO,IAEhC,GADI9P,OAAOyQ,GAAGpV,OAAOsJ,cAAc3F,QAAQ0wG,EAAM5/F,KAAO,IAAG6/F,GAAW,GAClEA,GAAWD,EAAMhuG,OAAQ,OAAO,CAGtC,OAAOiuG,IAAWD,EAAMhuG,QAI1B6d,EAAO6pF,gBAAkBA,GACxBlxG,OAAOumB,UAAUiC,WAAWhH;ACxzB/B,cA4BA,SAAW6F,GAmYT,QAASqwF,GAAoB5yB,GAC3B,GAAI6yB,GAAkB9qF,SAAS+qF,OAAsD/qF,SAAS+qF,OAArD/qF,SAASgrF,SAAW,KAAOhrF,SAASwkD,IAC7ErxE,QAAOmP,OAAO2oG,aACZC,YAAa,sBACbnhD,cAAekuB,GACd6yB,GAIL,QAASK,GAAwBj1D,EAAe8iC,EAAQhxD,GACtD,OACE51B,GAAI4mF,EAAW,GACflgF,KAAMkgF,EAAa,KACnB51B,KAAM41B,EAAa,KACnB9iC,cAAeA,EACfluB,sBAAuBA,GAjZ3B,GAAIojF,GAAyB,IAEzBC,EAAoB,GACpBC,EAA4B,GAE5BC,EAAsB/wF,EAAOhC,WAAWloB,QAC1CyR,UAAW,sBACXlP,OAAQ8P,2BAA6ByoG,EAAyBC,EAC9Dv7G,MAAO4S,0BAA4B2oG,EACnCr7D,gBAAgB,EAGhB5gD,KAAM,SAAU05B,GACd,GAAIlX,GAAK/iB,IACT+iB,GAAGe,OAAOmW,GACVlX,EAAGkX,SAAWA,EAEVlX,EAAGkX,SAAS0iF,iBACd55F,EAAG6G,MAAQ7G,EAAGkX,SAAS0iF,iBAEvB55F,EAAG65F,6BAGL,IAAIC,GAAe95F,EAAG+5F,wBAAwB/5F,EAAGkX,SAASsf,cAAex2B,EAAGkX,SAASsB,QAASxY,EAAGkX,SAASiF,KACxGnc,EAAGkX,SAASqtB,iBAAkBvkC,EAAGkX,SAAS8iF,YAAah6F,EAAGkX,SAASm3E,eAAgBruF,EAAGkX,SAAS+iF,YAC/Fj6F,EAAGkX,SAASI,aAActX,EAAGkX,SAASgjF,iBAaxC,OAZAl6F,GAAGnf,KAAO,gBAAkBi5G,EAAe,2DAE3C95F,EAAGm6F,4BAEHn6F,EAAGo6F,0BAEHp6F,EAAGq6F,oBAECr6F,EAAGkX,SAASiF,MAAQxkB,qBAAqBE,QAC3CmI,EAAGs6F,yBAGEt6F,GAIT65F,4BAA6B,WAC3B,GAAI75F,GAAK/iB,KACLs9G,EAAcv6F,EAAGg6F,YAAep2G,EAAE,4CAA8C,IAAMoc,EAAGg6F,YAAY5+F,aAAe,IAAO,EAC3H4E,GAAGw6F,iBACLx6F,EAAG2vF,SAAShlG,OAAO/G,EAAE,sDAAwD22G,EAAav6F,EAAGw6F,iBAAiBp/F,gBAG9G4E,EAAG2vF,SAAS/rG,EAAE,+BAAiC22G,GAC/CzyF,UAAUkC,SAASuuD,UAAU2E,oBAAoBl9D,EAAGkX,SAASsf,eAAehoC,KAAK,SAAU4nC,GACzFp2B,EAAG2vF,SAAShlG,OAAO/G,EAAE,sDAAwD22G,EAAankE,EAAQh7B,mBAMxG2+F,wBAAyB,SAAU1nE,EAAU7Z,EAASiiF,EAAW7iF,EAAQ8iF,EAAY3sB,EAASksB,EAAa3iF,EAAc4iF,GACvH,GAAIrD,GAAO9oB,CAEP8oB,IACFA,EAAK/tB,QAAQ,YAGf,IAAIrnE,GAAMjf,GAAGsgB,GAAG69C,WAAWtuB,GAAUlxB,OAUrC,OATAM,GAAIG,SAAS,UAAW4W,EAAW,SAAWA,EAAW,SACrDiiF,GAAWh5F,EAAIG,SAAS,YAAa64F,GACrC7iF,GAAQnW,EAAIG,SAAS,SAAUgW,GAC/B8iF,GAAYj5F,EAAIG,SAAS,aAAc84F,GACvC7D,GAAMp1F,EAAIG,SAAS,UAAWi1F,EAAK3nG,KAAK,MACxC+qG,GAAax4F,EAAIG,SAAS,cAAe,KACzC0V,GAAc7V,EAAIG,SAAS,eAAgB0V,GAC3C4iF,GAAkBz4F,EAAIG,SAAS,mBAAoB4wD,mBAAmB0nC,IAEnEz4F,EAAIpB,YAGb85F,0BAA2B,WACzB,GAAIn6F,GAAK/iB,IACT+iB,GAAGZ,KAAKY,EAAU,MAAEjB,MAAM6wF,WAAY,WACpC,GAAI+K,GAAU36F,EAAG28B,SAASx7C,KAAK,UAAUwhD,GAAG,EAC5Cg4D,GAAQ58G,GAAG,OAAQ,WACjB,GAAI68G,GAAeD,EAAQvzG,IAAI,GAAGyzG,eAClC/+G,GAAE8+G,EAAan3G,MAAM9G,SAAS,8BAMpCy9G,wBAAyB,WACvB,GAAIp6F,GAAK/iB,KACL4L,EAAK/M,EAAEyF,QAAQrD,QACf2lE,EAAK/nE,EAAEyF,QAAQN,SAGf65G,EAAcjyG,GAAM,EAAI6wG,EAA4B,IACpDoB,GAAchqG,0BAChBkP,EAAG8vF,SAASgL,GAEZ96F,EAAG8vF,SAASjnG,EAAK4wG,EAEnB,IAAIsB,GAAel3C,EAAK41C,CACpBsB,GAAehqG,2BACjBiP,EAAG+vF,UAAUgL,GAEb/6F,EAAG+vF,UAAUlsC,EAAK41C,IAItBY,kBAAmB,WACjB,GAAIr6F,GAAK/iB,IACTnB,GAAEyF,QACCxD,GAAG,8BAA+B,SAAUsD,GAC3C2e,EAAGg7F,qBAAqB35G,KAEzBtD,GAAG,gCAAiC,WACnCiiB,EAAGo6F,0BACHp6F,EAAGgwF,mBAIPhwF,EAAGZ,KAAKY,EAAU,MAAEjB,MAAM6wF,WAAY,WACpC,GAAI+K,GAAU36F,EAAG28B,SAASx7C,KAAK,UAAUwhD,GAAG,EAC5Cg4D,GAAQ58G,GAAG,OAAQ,WACjB48G,EAAQt1D,QAAQ,iBAIpBrlC,EAAGZ,KAAKY,EAAU,MAAEjB,MAAMizF,YAAa,WACrCl2G,EAAEyF,QACCzD,IAAI,+BACJA,IAAI,mCAGLkiB,EAAGkX,SAASiF,OAASxkB,qBAAqBC,MAC5CoI,EAAGZ,KAAKY,EAAU,MAAEjB,MAAM6wF,WAAY,WAEpC,GAAI+K,GAAU36F,EAAG28B,SAASx7C,KAAK,UAAUwhD,GAAG,EAE5Cg4D,GAAQ58G,GAAG,OAAQ,WAGjBiiB,EAAGi7F,qBAAqBj7F,EAAGkX,SAASsf,eAChCx2B,EAAGkX,SAASiF,MAAQxkB,qBAAqBE,OAC3CmI,EAAGk7F,oCAAoCl7F,EAAGkX,SAASsf,eAEnDx2B,EAAGm7F,oCAAoCn7F,EAAGkX,SAASsf,oBAO7D8jE,uBAAwB,WACtB,GAAIt6F,GAAK/iB,IAEL+iB,GAAGkX,SAASiF,OAASxkB,qBAAqBC,MAC5CoI,EAAGZ,KAAKY,EAAU,MAAEjB,MAAM6wF,WAAY,WAEpC,GAAI+K,GAAU36F,EAAG28B,SAASx7C,KAAK,UAAUwhD,GAAG,EAG5Cg4D,GAAQ58G,GAAG,OAAQ,WACjB,GAAI68G,GAAeD,EAAQvzG,IAAI,GAAGg0G,aAElCt/G,GAAEiwB,KAAK6uF,EAAan0G,KAAKskF,KAAKswB,eAAez1F,KAAK,WAEhDg1F,EAAaU,6BAA+B,SAAUl/G,EAAIuC,GACxD,GAAI48G,GAAQz/G,EAAE6C,GAAIE,QAAQ,cAAc8jD,GAAG,GAAG/lD,KAAK,SAC/C4+G,EAAcZ,EAAan0G,KAAKskF,KAAKxS,UAAU+Z,SAASlpF,YAAYmyG,GACpEE,EAAez7F,EAAG07F,iBAAiBF,EACvCZ,GAAa9yF,UAAUiC,WAAWhH,QAAQ42F,oBAAoBgC,eAAe37F,EAAGkX,SAASsf,cAAe+kE,EAAOE,GAQjH,KAAK,GAJD1wB,GAAO6vB,EAAan0G,KAAKskF,KAAKxS,UAC9BwV,EAAUhD,EAAKkW,aACf2a,EAAgB7tB,EAAQhjF,OACxB8wG,EAA0B,EACrBr3G,EAAI,EAAGA,EAAIo3G,EAAep3G,IAAK,CACtC,GAAIiuF,GAA8C,KAA3B1E,EAAQvpF,GAAGhE,GAAGi5B,OAAO,EACxCg5D,GACFopB,EAA0B9tB,EAAQvpF,GAAG+xD,MAAQ,EAEtCw3B,EAAQvpF,GAAG+xD,OAAQ,IAC1Bw3B,EAAQvpF,GAAG+xD,OAAS,GAIxB,GAAIulD,IACFx9G,SAAU,WACVy3F,UAAW,WACT,MAAO,sNAEHnyF,EAAE,kBAAoB,QAE5BiyF,eAAgB,eAChBr1F,GAAI,gBACJ+1D,MAAOslD,EACP30G,KAAM,SACNikF,MAAO,KACPqV,WAAW,EACX9N,UAAU,EACV8Y,SAAS,EACTttG,MAAqC,GAA7B0F,EAAE,kBAAkBmH,OAAc,GAE5CgjF,GAAQv9E,KAAKsrG,GACb/wB,EAAKsgB,WAAWtd,UAQ1B2tB,iBAAkB,SAAU1nF,GAC1B,GAAIhU,GAAK/iB,KACLw+G,IACJ,IAAIz7F,EAAGkX,SAASgjF,iBAAkB,CAEhC,GAAI6B,GAAe/7F,EAAGkX,SAASgjF,iBAAiBhvG,MAAM,GAAG,GAAIgB,MAAM,KAAKqN,IAAI,SAAUyiG,GACpF,MAAOA,GAAM9vG,MAAM,KAAK,IAE1B6vG,GAAatrG,QAAQ,SAAUwrG,GAC7BR,EAAaQ,IACXjoF,EAAIioF,GACJjoF,EAAI,SAAWioF,EAAiB,SAChCjoF,EAAI,SAAWioF,EAAiB,eAKtC,MAAOR,IAITT,qBAAsB,SAAU35G,GAC9B,GAAI2e,GAAK/iB,KACLL,EAAOyE,EAAE66G,cAAct/G,KACvBs8G,EAAkB9qF,SAAS+qF,OAAsD/qF,SAAS+qF,OAArD/qF,SAASgrF,SAAW,KAAOhrF,SAASwkD,IAC7E,OAAIvxE,GAAE66G,cAAc/C,QAAUD,GAC5B35F,QAAQC,IAAI,kEAAoEne,EAAE66G,cAAc/C,SACzF,QAEe,uBAApBv8G,EAAK08G,cACPt5F,EAAGlB,KAAK,SAAUliB,EAAKu7D,eACvBn4C,EAAG8b,WAMPm/E,qBAAsB,SAAU32D,GAC9B,GAAItkC,GAAK/iB,KACL29G,EAAe56F,EAAG28B,SAASx7C,KAAK,UAAUiG,IAAI,GAAGg0G,aACrDt/G,GAAEiwB,KAAK6uF,EAAap4G,GAAGgpB,aAAa5F,KAAK,WACvC,GAAIu2F,GAAiB,+BAEhBvB,GAAap4G,GAAGmE,GAAG8C,QAAQ8oB,OAAO4pF,KACrCA,EAAiB,IAEnBvB,EAAap4G,GAAGmE,GAAG8C,QAAQ8oB,OAAO6pF,OAAO,yBAA0BD,GACnEvB,EAAap4G,GAAGmE,GAAG8C,QAAQ8oB,OAA+B,uBAAE8pF,cAC1Dn1G,KAAM,gBACNxC,KAAMd,EAAE,kBACRyB,KAAM,YACN84F,QAASv6F,EAAE,2BACXK,SAAU,WACR,GAAI2gF,GAAkBg2B,EAAap4G,GAAGmE,GAAG8pB,WAAW6lB,kBACpD,IAAIt2B,EAAGkX,SAASiF,OAASxkB,qBAAqBE,QAAqC,IAA3B+sE,EAAgB75E,OAAc,CACpF,GAAIwwG,GAAQ32B,EAAgB,GAAGpkF,GAC3Bg7G,EAAcZ,EAAan0G,KAAKskF,KAAKxS,UAAU+Z,SAASlpF,YAAYmyG,GACpEE,EAAez7F,EAAG07F,iBAAiBF,EACvCZ,GAAa9yF,UAAUiC,WAAWhH,QAAQ42F,oBAAoBgC,eAAer3D,EAAei3D,EAAOE,OAEnGb,GAAa9yF,UAAUiC,WAAWhH,QAAQ42F,oBAAoB2C,yBAAyBh4D,EAAesgC,SAQhHs2B,oCAAqC,SAAU52D,GAC7C,GAAItkC,GAAK/iB,IACTnB,GAAEiwB,KAAKvpB,GAAGmpB,gBAAgB/F,KAAK,WAC7B,GAAIg1F,GAAe56F,EAAG28B,SAASx7C,KAAK,UAAUiG,IAAI,GAAGg0G,aACrDR,GAAap4G,GAAGmE,GAAG8pB,WAAWrR,KAAK,WAAY,SAAUinE,GACvD,GAAI/4C,GAAMstE,EAAap4G,GAAGmE,GAAG8C,QAAQ8oB,OAA+B,uBAAEgqF,aAA4B,aAC3E,KAAnBl2B,EAAQt7E,OACVuiC,EAAI05B,SAEJ15B,EAAIy5B,eAOZo0C,oCAAqC,SAAU72D,GAC7C,GAAItkC,GAAK/iB,IACTnB,GAAEiwB,KAAKvpB,GAAGmpB,gBAAgB/F,KAAK,WAC7B,GAAIg1F,GAAe56F,EAAG28B,SAASx7C,KAAK,UAAUiG,IAAI,GAAGg0G,aACrDR,GAAap4G,GAAGmE,GAAG8pB,WAAWrR,KAAK,WAAY,SAAUinE,GACvD,GAAI/4C,GAAMstE,EAAap4G,GAAGmE,GAAG8C,QAAQ8oB,OAA+B,uBAAEgqF,aAA4B,aAC9Fl2B,GAAQt7E,OAAS,EACnBuiC,EAAIy5B,UAEJz5B,EAAI05B,gBAuBZw1C,cAAe,SAAUtlF,GACvB,GAAIjR,GAAMnqB,EAAE0nB,WACR5Z,EAAS,GAAIke,WAAUiC,WAAWhH,QAAQ42F,oBAAoBziF,EASlE,OARAttB,GAAOwV,KAAK,SAAU,SAAUxiB,GAC9BqpB,EAAIlB,QAAQnoB,KAEdgN,EAAOwV,KAAK,QAAS,SAAUxiB,GAE7BqpB,EAAId,WAENvb,EAAO1K,QAELu9G,cAAe,SAAUC,GACvBz2F,EAAIzX,KAAKkuG,IAEXC,gBAAiB,SAAUD,GACzBz2F,EAAIjB,KAAK03F,MAafJ,yBAA0B,SAAUh4D,EAAes4D,GACjD,GAAIv2B,GAAUu2B,GAAep6G,GAAGmE,GAAG8pB,WAAW6lB,mBAC1CumE,EAAmBx2B,EAAQ9sE,IAAI,SAAU6tE,GAC3C,MAAOmyB,GAAwBj1D,EAAe8iC,IAEhD6xB,GAAoB4D,IAWtBlB,eAAgB,SAAUr3D,EAAei3D,EAAOnlF,GAC9C,GAAIgxD,GAAS5kF,GAAGmE,GAAG8pB,WAAWwlB,WAAWslE,EACzCn0B,GAASmyB,EAAwBj1D,EAAe8iC,EAAQhxD,GACxD6iF,GAAqB7xB,MA0BzBx+D,GAAO+wF,oBAAsBA,GAC5Bp4G,OAAOumB,UAAUiC,WAAWhH;ACnb/B,cAWA,SAAW6F,GACT,GAAIk0F,GAAsBl0F,EAAO6pF,gBAAgB/zG,QAC/ClB,KAAM,SAAUg2G,EAAgBC,EAAmBC,GAEjDz2G,KAAKq2G,iBAAkB,EACvBr2G,KAAK8jB,OAAOyyF,EAAgBC,EAAmBC,IASjDuB,YAAa,WACXh4G,KAAK8jB,SAEL9jB,KAAKmiB,KAAK,iBAAkB,WAC1BniB,KAAK81G,oBAAqB,KAY9B6D,gBAAiB,WACf,GAAIC,KAyBJ,OAxBIr0G,IAAGC,IAAIgoB,WACJxtB,KAAKu+D,YAQRq7C,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,IAC5CF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,OAAQF,WAAa,IAC7DF,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,MAN5CF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,KAAMF,WAAa,IAC3DF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,MAAOF,WAAa,IAC5DF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,MAAOF,WAAa,KAOzD95G,KAAKu+D,YAKRq7C,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,IAC5CF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,QAASF,WAAa,IAC9DF,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,MAN5CF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,OAAQF,WAAa,IAC7DF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,QAASF,WAAa,IAC9DF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,OAAQF,WAAa,KAO1DF,GAUTf,oBAAqB,SAAUhyG,GAS7B,GAPAA,EAAqB,eAAI7G,KAAKu+D,WAAa,SAAW,GACtD13D,EAAmB,aAAIF,EAAE,UACzBE,EAAsB,gBAAI7G,KAAKu+D,WAAa,SAAW,GACvD13D,EAAU,IAAIA,EAAU,KAAK,KAIxBtB,GAAGC,IAAIC,cAAgB5G,EAAEwB,KAAM,GAAImH,GAAa,QAGrD,OAFAX,GAAa,OAAI6G,OAAOpB,GAAGK,OAAOa,gBAAkBsyG,UAAat4G,IAE1DkG,OAAOpB,GAAGK,OAAOS,aAAcvG,IASxC6zG,8BAA+B,SAAUqF,GACvC//G,KAAK8jB,OAAOi8F,EACZ,IAEI/c,GAAOnkG,EAAEkhH,EACRlhH,GAAEwB,MAASkF,GAAGC,IAAIC,aACrBu9F,EAAK/3F,MACD,WACEpM,EAAEmB,MAAMkE,KAAK,WAAW5E,YAAY,UACpCT,EAAEmB,MAAMkE,KAAK,aAAa5E,YAAY,WAExC,WACET,EAAEmB,MAAMkE,KAAK,WAAWxE,SAAS,UACjCb,EAAEmB,MAAMkE,KAAK,aAAaxE,SAAS,YAK3CsjG,EAAK9+F,KAAK,WAAWrD,IAAI,gCAAgCC,GAAG,+BAAgCd,KAAM,SAAUoE,GAC1GA,EAAEzE,KAAKqgH,UAAUhgH,KAAM,KACfnB,GAAEmB,QAEZgjG,EAAK9+F,KAAK,aAAarD,IAAI,gCAAgCC,GAAG,+BAAgCd,KAAM,SAAUoE,GAC5GA,EAAEzE,KAAKqgH,UAAUhgH,KAAM,WAU3BggH,UAAW,SAAUC,EAAcp3C,GACjC,GAAIq3C,GAKAh3C,EAJA85B,EAAOhjG,KAAKk2G,qBAAqBhyG,KAAK+7G,GAAcxsG,SAASA,SAE7DlQ,EAAKy/F,EAAKj+F,KAAK,MACfu0D,EAAQt5D,KAAK46G,qBAAqBr3G,EAGlC+1D,GAAQ,GAAkB,MAAbuP,IACfq3C,EAAQld,EAAKphE,OACbs+E,EAAMzvE,OAAOuyD,GAEb18F,WAAW,WACT08F,EAAK56C,QAAQ,cACZ,IAEH8gB,EAAMlpE,KAAKk7D,cAAc5B,EAAQ,GACjCt5D,KAAKk7D,cAAc5B,EAAQ,GAAKt5D,KAAKk7D,cAAc5B,GACnDt5D,KAAKk7D,cAAc5B,GAAS4P,EAC5BlpE,KAAK6hB,KAAK,mBAGRy3C,EAAQt5D,KAAKk7D,cAAcptD,OAAO,GAAkB,QAAb+6D,IACzCq3C,EAAQld,EAAKrhE,OACbu+E,EAAMh8D,MAAM8+C,GACZ18F,WAAW,WACT08F,EAAK56C,QAAQ,cACZ,IAEH8gB,EAAMlpE,KAAKk7D,cAAc5B,EAAQ,GACjCt5D,KAAKk7D,cAAc5B,EAAQ,GAAKt5D,KAAKk7D,cAAc5B,GACnDt5D,KAAKk7D,cAAc5B,GAAS4P,EAC5BlpE,KAAK6hB,KAAK,qBAOhB8J,GAAOk0F,oBAAsBA,GAC5Bv7G,OAAOumB,UAAUiC,WAAWhH;AC3K/B,cAYA,SAAW6F,GACT,GAAIw0F,GAAwBx0F,EAAO6pF,gBAAgB/zG,QACjDlB,KAAM,SAAUg2G,EAAgBC,EAAmBC,GAEjDz2G,KAAKq2G,iBAAkB,EACvBr2G,KAAK8jB,OAAOyyF,EAAgBC,EAAmBC,IASjDuB,YAAa,WACXh4G,KAAK8jB,SAEL9jB,KAAKmiB,KAAK,iBAAkB,WAC1BniB,KAAK81G,oBAAqB,KAY9B6D,gBAAiB,WACf,GAAIC,KA0BJ,OAzBIr0G,IAAGC,IAAIgoB,WACJxtB,KAAKu+D,YASRq7C,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,IAC5CF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,OAAQF,WAAa,IAC7DF,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,MAN5CF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,KAAMF,WAAa,IAC3DF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,MAAOF,WAAa,IAC5DF,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,KAOzC95G,KAAKu+D,YAKRq7C,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,IAC5CF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,QAASF,WAAa,IAC9DF,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,MAN5CF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,OAAQF,WAAa,IAC7DF,EAAKrmG,MAAOsmG,UAAY,EAAMG,OAAU,QAASF,WAAa,IAC9DF,EAAKrmG,MAAOsmG,UAAY,EAAOC,WAAa,KAOzCF,GAWTJ,iBAAkB,WAChB,GAAIz2F,GAAK/iB,IACTnB,GAAEqG,UAAUoxB,IAAI,wBAAwBnU,KAAK,QAAS,SAAU/d,GAC9DvF,EAAE,4BAA4BS,YAAY,YAG5CT,EAAE,YAAYiC,GAAG,QAAS,SAAUsD,GAClCA,EAAEhF,iBACF,IAAIghH,GAAavhH,EAAE,kCACfuhH,GAAWtyG,OAAS,EACtBiV,EAAGi9F,UAAUI,EAAY,MAEzBvhH,EAAE,wCAAwCa,SAAS,YAGvDb,EAAE,cAAciC,GAAG,QAAS,SAAUsD,GACpCA,EAAEhF,iBACF,IAAIghH,GAAavhH,EAAE,kCACfuhH,GAAWtyG,OAAS,EACtBiV,EAAGi9F,UAAUI,EAAY,QAEzBvhH,EAAE,wCAAwCa,SAAS,aAYzDo4G,0BAA2B,WAGzB,IAAK,GAFDK,GAAgB,GAEX5wG,EAAI,EAAG2V,EAAIld,KAAKk7D,cAAcptD,OAAQvG,EAAI2V,EAAG3V,IAAK,CACzD,GAAIW,GAAWlI,KAAK64G,oBAAoB74G,KAAKk7D,cAAc3zD,GAC3D4wG,IAAiBjwG,EAGnB,GAAI4wG,GAAgB94G,KAAKu+D,WAAa,SAAW,GAC7Cw6C,GAAkB/4G,KAAKq2G,iBAAmBr2G,KAAKu+D,WAAa,SAAW,EAE3Ev+D,MAAK+1G,OAASroG,OAAOpB,GAAGK,OAAOQ,mBAC7By8F,MAAO5pG,KAAK01G,mBACZsD,iBAAkB,uBAClB/uG,KAAMtD,EAAE,QACRhH,KAAMw4G,EACNc,eAAgBH,EAChBI,gBAAiBH,EACjBI,YAAa,GACbC,WAAY,uBAEdp5G,KAAK+1G,OAASzpG,GAAGK,OAAOc,aAU1BorG,oBAAqB,SAAUhyG,GAa7B,MAZAA,GAAiB,WAAI,GACrBA,EAAqB,eAAI7G,KAAKu+D,WAAa,SAAW,GACtD13D,EAAmB,aAAIF,EAAE,UACzBE,EAAuB,iBAAI,iCAC3BA,EAAsB,iBAAI7G,KAAKu+D,WAALv+D,UAC1B6G,EAAU,IAAIA,EAAU,KAAK,IAOtB6G,OAAOpB,GAAGK,OAAOS,aAAcvG,IASxC6zG,8BAA+B,SAAUqF,GACvC//G,KAAK8jB,OAAOi8F,EACZ,IAEI/c,GAAOnkG,EAAEkhH,EACRlhH,GAAEwB,MAASkF,GAAGC,IAAIC,aACrBu9F,EAAK/3F,MACD,WACEpM,EAAEmB,MAAMkE,KAAK,WAAW5E,YAAY,UACpCT,EAAEmB,MAAMkE,KAAK,aAAa5E,YAAY,WAExC,WACET,EAAEmB,MAAMkE,KAAK,WAAWxE,SAAS,UACjCb,EAAEmB,MAAMkE,KAAK,aAAaxE,SAAS,YAK3CsjG,EAAKliG,GAAG,QAASd,KAAM,SAAUoE,GAC/BA,EAAEhF,kBACFP,EAAE,4BAA4By3B,IAAIt2B,MAAMV,YAAY,UACpDT,EAAEmB,MAAMN,SAAS,aAUrBsgH,UAAW,SAAUhd,EAAMn6B,GACzB,GAAIq3C,GAIAh3C,EAFA3lE,EAAKy/F,EAAKj+F,KAAK,MACfu0D,EAAQt5D,KAAK46G,qBAAqBr3G,EAGlC+1D,GAAQ,GAAkB,MAAbuP,IACfq3C,EAAQld,EAAKphE,OACbs+E,EAAMzvE,OAAOuyD,GAEb18F,WAAW,WACT08F,EAAK56C,QAAQ,cACZ,IAEH8gB,EAAMlpE,KAAKk7D,cAAc5B,EAAQ,GACjCt5D,KAAKk7D,cAAc5B,EAAQ,GAAKt5D,KAAKk7D,cAAc5B,GACnDt5D,KAAKk7D,cAAc5B,GAAS4P,EAC5BlpE,KAAK6hB,KAAK,mBAGRy3C,EAAQt5D,KAAKk7D,cAAcptD,OAAS,GAAmB,SAAd+6D,IAC3Cq3C,EAAQld,EAAKrhE,OACbu+E,EAAMh8D,MAAM8+C,GACZ18F,WAAW,WACT08F,EAAK56C,QAAQ,cACZ,IAEH8gB,EAAMlpE,KAAKk7D,cAAc5B,EAAQ,GACjCt5D,KAAKk7D,cAAc5B,EAAQ,GAAKt5D,KAAKk7D,cAAc5B,GACnDt5D,KAAKk7D,cAAc5B,GAAS4P,EAC5BlpE,KAAK6hB,KAAK,qBAOhB8J,GAAOw0F,sBAAwBA,GAC9B77G,OAAOumB,UAAUiC,WAAWhH;AC5O/B,cAUA,SAAW6F,GAET,GAAIsc,GAAatc,EAAOhC,WAAWloB,QACjCyR,UAAW,aACXw6B,SAAU,GACVC,eAAgB,GAChB/jB,MAAO,GAEPy2F,eAAgB,GAChBC,iBAAmB/vF,MAAS,WAAYqC,KAAQ,UAAW2tF,SAAY,UAAW5tF,QAAW,cAE7F3uB,OAAQ,OACRw8G,WAAY,KAEZjgH,KAAM,SAAU05B,GACdj6B,KAAK2xG,sBACL3xG,KAAK8jB,OAAOmW,GACRp7B,EAAEuzB,cAAc6H,IAClBp7B,EAAE4C,OAAOzB,KAAMi6B,IAcnB4T,UAAW,SAAUqlE,EAAUuN,EAAYC,GAOzC,MANA1gH,MAAK2xG,mBAAmBp+F,MAEpBhQ,GAAI2vG,EACJzrG,KAAMg5G,EACNx9G,MAASy9G,EAAcA,EAAc,eAElC1gH,MAWT2gH,SAAU,SAAUC,GAIlB,MAHA5gH,MAAK2xG,sBACL3xG,KAAK8C,GAAO89G,EAAaA,EAAa,aACtC5gH,KAAK2E,OAAS,KACP3E,MAYT6/C,aAAc,SAAUghE,EAAaC,GAGnC,MAFA9gH,MAAK6xC,OAASlrC,EAAE,OAChB3G,KAAKohD,WAAaz6C,EAAE,MACb3G,KAAKkoC,gBAAgB24E,EAAaC,IAY3C54E,gBAAiB,SAAU04E,EAAYG,GAMrC,MALA/gH,MAAKghH,qBACLhhH,KAAK8C,GAAO89G,EAAaA,EAAa,aACtC5gH,KAAK2E,OAAWo8G,EAAiBA,EAAiB,aAClD/gH,KAAK8xC,oBAAqB,EAC1B9xC,KAAKmhD,gBAAiB,EACfnhD,MAcT8uC,UAAW,SAAUpB,EAAUC,EAAgB/jB,EAAO0b,GAIpD,MAHK1b,KAAOA,EAAQjjB,EAAE,UACtB3G,KAAK6xC,OAASlrC,EAAE,SAChB3G,KAAKiC,KAAKyrC,EAAUC,EAAgB/jB,EAAO,QAAS,KAAM0b,GACnDtlC,MAcTihH,SAAU,SAAUvzE,EAAUC,EAAgB/jB,EAAO0b,GAInD,MAHK1b,KAAOA,EAAQjjB,EAAE,SACtB3G,KAAK6xC,OAASlrC,EAAE,SAChB3G,KAAKiC,KAAKyrC,EAAUC,EAAgB/jB,EAAO,OAAQ,KAAM0b,GAClDtlC,MAcTuoC,aAAc,SAAUmF,EAAUC,EAAgB/jB,EAAO0b,GAGvD,MAFK1b,KAAOA,EAAQjjB,EAAE,iBACtB3G,KAAKiC,KAAKyrC,EAAUC,EAAgB/jB,EAAO,WAAY,KAAM0b,GACtDtlC,MAcTqjC,YAAa,SAAUqK,EAAUC,EAAgB/jB,EAAO0b,GAGtD,MAFK1b,KAAOA,EAAQjjB,EAAE,YACtB3G,KAAKiC,KAAKyrC,EAAUC,EAAgB/jB,EAAO,UAAW,KAAM0b,GACrDtlC,MAgBTiC,KAAM,SAAUyrC,EAAUC,EAAgB/jB,EAAOxhB,EAAM84G,EAAiB57E,GACtE,GAAIviB,GAAK/iB,IACT,OAAiB,QAAb0tC,EAA0B3qB,GAC9BA,EAAGo+F,YAAYzzE,GACf3qB,EAAGq+F,kBAAkBzzE,GACf/jB,IAAO7G,EAAG6G,MAAQA,GAClBxhB,IAAM2a,EAAGs9F,eAAiBj4G,GAChC2a,EAAGs+F,kBAAkBH,GACf57E,IAASviB,EAAGuiB,QAAUA,GAC5BviB,EAAG8G,QAAQ9G,EAAGu+F,YAKdv+F,EAAGs/B,OAAS,WACVt/B,EAAG28B,SAAS99C,QAAQ,oBAAoBlC,UAAY0I,EAAOA,EAAO,IAAM,UAE1E2a,EAAGe,SAEIf,IAWTo+F,YAAa,SAAUzzE,GACrB,GAAMA,EAAU,CACd,GAAI6zE,GAAgB7zE,EAAStiC,QAAQ,IACjCm2G,KAAiB,IAGnBvhH,KAAKohH,kBAAkB1zE,EAAS54B,UAAUysG,EAAgB,EAAG7zE,EAAS5/B,QAAQuR,yBAC9EquB,EAAWA,EAAS54B,UAAU,EAAGysG,IAEnCvhH,KAAK0tC,SAAWA,EAEZ1tC,KAAKm7E,YAAcn7E,KAAK0/C,UAC1B1/C,KAAK0/C,SAASx7C,KAAK,oBAAoBN,KAAK8pC,GAGhD,MAAO1tC,OAWTohH,kBAAmB,SAAUzzE,GAO3B,OANMA,GAA2C,gBAAlBA,MAC7B3tC,KAAK2tC,eAAkB,GAAKA,EACxB3tC,KAAKm7E,YAAcn7E,KAAK0/C,UAC1B1/C,KAAK0/C,SAASx7C,KAAK,eAAeN,KAAK+pC,IAGpC3tC,MASTqhH,kBAAmB,SAAUnO,GAC3B,GAAMA,GAAclzG,KAAK2xG,oBAAsB3xG,KAAK2xG,mBAAmB7jG,OACrE,IAAK,GAAIuiC,KAAOrwC,MAAK2xG,mBACnB,GAAI3xG,KAAK2xG,mBAAmBthE,GAAK9sC,IAAM2vG,EAAU,CAC/ClzG,KAAK2xG,mBAAmBthE,GAAY,MAAI,SACxC,OAIN,MAAOrwC,OAQTwhH,sBAAuB,WACrB,GAAIC,GAAiD,IAAlCzhH,KAAKghH,kBAAkBlzG,UAAkB9N,KAAK8C,GAC7D8vG,IAAqB5yG,KAAK2E,OAC1Bs1B,GACFr2B,KAAM5D,KAAKshH,WACX13F,MAAO5pB,KAAK4pB,MACZ+nF,mBAAoB3xG,KAAKghH,kBACzB7/D,eAAgBsgE,EAChB3vE,mBAAoB8gE,EAOtB,OALM5yG,MAAKslC,UAASrL,EAAkB,QAAIj6B,KAAKslC,SACzCtlC,KAAK8C,KAAIm3B,EAAa,GAAIj6B,KAAK8C,IAC/B9C,KAAK2E,SAAQs1B,EAAiB,OAAIj6B,KAAK2E,QACvC3E,KAAK6xC,SAAQ5X,EAAiB,OAAIj6B,KAAK6xC,QACvC7xC,KAAKohD,aAAYnnB,EAAqB,WAAIj6B,KAAKohD,YAC9CnnB,GAQTqnF,SAAU,WACR,GAAIl5G,GAASpI,KAAKqgH,eAAiB,6FAA+FrgH,KAAKsgH,gBAAgBtgH,KAAKqgH,gBAAkB,iBAAmB,GAC7LqB,EAAe,2DAA6Dt5G,EAAO,0CAA4CpI,KAAK0tC,SAAW,eAC/Ii0E,EAAqB,2BAA6B3hH,KAAK2tC,eAAiB,SACxE/pC,EAAO,0BAA4B89G,EAAeC,EAAqB,QAC3E,OAAO/9G,KAKX+nB,GAAOsc,WAAaA,GACnB3jC,OAAOumB,UAAUiC,WAAWhH;AClT/B,cA2CA,SAAW6F,GACT,GAAIi2F,GAAiBj2F,EAAOhC,WAAWloB,QACrCmoB,MAAOjjB,EAAE,6BACT1F,MAAO,IACP+C,OAAQ,OACRkP,UAAW,iBACXgsB,KAAM,SACN2iF,SAAU,KACV9L,MAAO,GACPE,aACAC,qBAAsB,KACtBC,qBAAsB,KACtBC,iBAAkB,KAClBC,iBAAiB,EACjBC,WAAY,KACZxkE,oBAAoB,EAGpBvxC,KAAM,SAAU05B,GAId,MADAj6B,MAAK8jB,OAAOmW,GACLj6B,MAQT0zB,SAAU,WAIR,GAAI3Q,GAAK/iB,IACTA,MAAK8C,GAAK9C,KAAK8C,GAAG6d,SAChB,WACE,GACImhG,IADMp/G,KAAKC,MAAsB,IAAhBD,KAAKqP,UAAkBmN,WAC9B6D,EAAG8+F,UACbE,EAAch/F,EAAGi/F,YAAYF,EAEjC,OAAIC,IAAeE,cAAcH,EAAQ59G,KAAK,2BAA2B,GAAI49G,EAAQniH,KAAK,WACxFmiH,EAAQ59G,KAAK,QAAQ24B,UACd,GAECklF,EAAL,QACHD,EAAQniH,KAAK,SAASgH,EAAE,oCACjB,MAWfitB,UAAW,WACT,GAAI7Q,GAAK/iB,KACL8hH,EAAU9hH,KAAK6hH,QACnBC,GAAQniH,KAAK,UAAW,SAAUyH,GAChC,GAAIod,GAAM,GAAIjf,IAAGkf,IAAIrd,GAEjB7D,EAAKihB,EAAIwX,SAAS,MAClB7X,EAAO,GAAI5e,IAAG6e,KAAK7gB,EAAI6M,YAAYC,UACvC8T,GAAK6vD,OAAQ,EACbjxD,EAAGlB,KAAK,SAAUsC,GAClBpB,EAAG8b,UAEFl/B,KAAK,QAAS,SAAUyH,GACzB2b,EAAGoM,WAAWltB,KAAKmF,GACnB2b,EAAGlB,KAAK,QAASza,KAGnB2b,EAAGm/F,6BAA6BJ,GAEhC/+F,EAAGlB,KAAK,WAIVqgG,6BAA8B,WAC5B,GAAIn/F,GAAK/iB,IACT+iB,GAAG8+F,SAAS39G,KAAK,yBAAyBovC,OAAO,WAC3CvwB,EAAG8+F,SAAS39G,KAAK,oBAAoB6gC,GAAG,aAC1ClmC,EAAE,uBAAuBorC,WAAW,YACpC3jC,WAAW,WACTzH,EAAE,sBAAsBwoE,aACxBxoE,EAAE,2BAA2Bq/D,eAC5B,IACHr/D,EAAE,+BAA+BS,YAAY,kBAC7CT,EAAE,qBAAqBa,SAAS,oBAEhCb,EAAE,uBAAuBkG,KAAK,WAAY,YAC1CuB,WAAW,WACTzH,EAAE,sBAAsBq/D,cACxBr/D,EAAE,2BAA2BwoE,cAC5B,IACHxoE,EAAE,+BAA+Ba,SAAS,kBAC1Cb,EAAE,qBAAqBS,YAAY,qBAEpC8oD,QAAQ,UACPvpD,EAAEwB,OAASkF,GAAGC,IAAIC,aACpBsd,EAAG8+F,SAAS39G,KAAK,oBAAoBa,KAAK,WAAY,aAK1Di9G,YAAa,SAAUF,GACrB,IAAKA,EAAQ59G,KAAK,sBAAsB+P,MAAO,OAAO,CACtD,KAAK6tG,EAAQ59G,KAAK,2BAA2B+P,MAAO,OAAO,CAC3D,IAAiB,QAAbjU,KAAKk/B,KAAgB,OAAO,CAChC,IAAIrgC,EAAE,wBAAwBkmC,GAAG,aAC/B,IAAK+8E,EAAQ59G,KAAK,wBAAwB+P,MAAO,OAAO,MACnD,CACL,IAAK6tG,EAAQ59G,KAAK,oBAAoB+P,MAAO,OAAO,CACpD,KAAK6tG,EAAQ59G,KAAK,sBAAsB+P,MAAO,OAAO,EAExD,OAAO,GAQT+jG,YAAa,WACXh4G,KAAKq5G,2BACLr5G,KAAKs5G,gCACLt5G,KAAKu5G,yBAELv5G,KAAKmiB,KAAK,aAAc,WACtBniB,KAAK81G,oBAAqB,IAE5B91G,KAAKmiB,KAAK,eAAgB,WACxBniB,KAAK81G,oBAAqB,IAG5B91G,KAAKw5G,oBAIPv3G,KAAM,SAAUkgH,GACdA,EAAWA,GAAYniH,KAAKk/B,IAC5B,IAAInc,GAAK/iB,IACT+iB,GAAG2Q,UACH,IAAI9J,EAEJ,QAAQu4F,GACN,IAAK,WACHv4F,EAAQjjB,EAAE,gCACV,MACF,KAAK,OACHijB,EAAQjjB,EAAE,4BACV,MACF,KAAK,SACHijB,EAAQjjB,EAAE,kBACV,MACF,KAAK,OACHijB,EAAQjjB,EAAE,gBACV,MACF,SACEijB,EAAQjjB,EAAE,mBAIdoc,EAAG8uB,OAAqB,QAAZswE,EAAqBx7G,EAAE,QAAUA,EAAE,UAG/Coc,EAAGe,SACHf,EAAGyvF,YAEH,IAAI4P,GAAYrmF,cAAc,KACzBqmF,KAAWA,EAAYC,kBAC5B,IAAI1iH,IACF2iH,KAAMH,EACN70E,SAAU80E,EAYZ,OATA78G,IAAG8L,IAAIxR,KAAK,4BAA8B+gD,YAAa,eAAgBtkB,OAAQz9B,EAAEwkB,OAAO1jB,KAAS4R,KAAK,SAAU5R,GAC9GojB,EAAG2vF,SAAS9oF,GACZ7G,EAAG8G,QAAQ,0BAA4BlqB,EAAKiE,KAAO,UACnDmf,EAAG8+F,SAAWhjH,EAAE,iBAChBkkB,EAAG6Q,YACH2uF,6BACCx6F,KAAK,WACNhF,EAAG8b,UAEE7+B,OASXiH,UAASlF,UAAU4e,SAAW,SAAUlB,GACtC,GAAImB,GAAgB5gB,IACpB,OAAO,YAEL,MADAA,MAAK4gB,cAAgBA,EACdnB,EAAKM,MAAM/f,KAAM6N,aAK5B8d,EAAOi2F,eAAiBA,GACvBt9G,OAAOumB,UAAUiC,WAAWhH;AC1P/B,cACA,SAAW6F,GAET,GAAIihE,IACF41B,OAAQ,mCAaNv8F,EAAa0F,EAAO3F,IAAIF,QAAQ6D,WAAWloB,QAAQkqB,EAAOuB,OAAOqG,YACnErgB,UAAW,aACXwxB,MAAO,KACPzjC,MAAO,IACP+C,OAAQ,OACR6tG,YAAa,8BACbv9E,WAAY,gBACZq9E,mBAAoB,KAEpB8Q,mBAAoB,KACpB1uF,eAAgB,KAChB0B,iBAAkB,KAClBitF,gBAAiB,KACjB7tF,0BAA2B,YAG3Bt0B,KAAM,SAAU05B,EAAUyK,GACxB,GAAI3hB,GAAK/iB,IAqBT,OApBK0kC,IAAOn/B,GAAGqL,MAAMjK,EAAE,qDACvBoc,EAAG2hB,MAAQA,EACX3hB,EAAG0/F,sBAEH1/F,EAAG2Q,WAEH3Q,EAAG2/F,iBACDpnD,QAAS,MAGXv4C,EAAGgR,eAAiBl1B,EAAE0nB,WACtBxD,EAAG0S,iBAAmB52B,EAAE0nB,WAExBxD,EAAGe,OAAOmW,GAEVlX,EAAGxf,GAAKwf,EAAG2hB,MAAMvb,WACjBpG,EAAG6Q,YACH7Q,EAAG4/F,aAEH5/F,EAAGZ,KAAKY,EAAU,MAAEjB,MAAMizF,YAAal2G,EAAEiI,MAAMic,EAAG6/F,YAAa7/F,IACxD/iB,MAKTw0B,gBAAiB,WACf,GAAIzR,GAAK/iB,IACT+iB,GAAGyQ,WAAa,GAAI7H,GAAO3F,IAAI8N,SAASN,WAAWqvF,WAAW9/F,EAAGkR,oBAQnEhyB,KAAM,WACJ,GAAI8gB,GAAK/iB,KACL8iH,EAAW//F,EAAGe,MAOlB,OALAf,GAAGggG,cAAcxxG,KAAK,WACpBuxG,EAAS/iG,MAAMgD,GACfA,EAAGigG,eAGEjgG,GAUT4/F,WAAY,WACV,GAAI5/F,GAAK/iB,IACT,OAAKqzE,iBAILtwD,EAAG2/F,gBAAkBp8G,WAAW,WAC9Bf,GAAG8L,IAAIxR,KAAKkjB,EAAGuR,WAAa,cAC1BnL,WAAYpG,EAAGxf,KACdquB,OAAO,WACR7O,EAAG4/F,gBAEJtvC,gBACItwD,OAVLR,KAAIkS,KAAK,cAAe,oDAoB5BsB,eAAgB,WACd,GAAIhT,GAAK/iB,IACT,OAAOnB,GAAEwkB,QACP8F,WAAcpG,EAAGxf,MAWrB0yB,eAAgB,WACd,MAAO,IAITgtF,mBAAoB,SAAUh5G,EAAMi5G,GAClCljH,KAAKyiH,mBAAmBx4G,GAAQi5G,GAIlCC,qBAAsB,SAAUl5G,SACvBjK,MAAKyiH,mBAAmBx4G,IAUjCoqB,aAAc,WACZ,GAAItR,GAAK/iB,IACT,OAAOnB,GAAEsoB,UAAUpE,EAAG2hB,MAAgB,WAUxC7O,UAAW,WACT,GAAI9S,GAAK/iB,IACT,OAAO+iB,GAAG6S,OAUZmtF,YAAa,WACX,GAAIhgG,GAAK/iB,IACT+iB,GAAGkR,kBAAoB,sBAAwBlR,EAAGxf,GAClDwf,EAAG4uF,sBACH5uF,EAAGo+B,gBAAiB,CAEpB,IAAI/0B,GAAQvtB,EAAE0nB,UAOd,OANAxD,GAAG9hB,QAAU8hB,EAAG2hB,MAAM0rE,OAASrtF,EAAG9hB,OAAS,GAI3C8hB,EAAG6G,MAAQ7G,EAAG2hB,MAAMovB,SAAW/wC,EAAG6G,MAE7B7G,EAAG2hB,MAAgB,UAMxB3hB,EAAG/e,OAAS+e,EAAG2hB,MAAM0+E,QAAUrgG,EAAG/e,OAClC+e,EAAG9hB,OAAS,GAEZsE,GAAGynB,UAAUnpB,OAAO+oF,EAAS41B,QAC3Bp/G,KAAM2f,EAAG2hB,MAAgB,SACzBoC,MAAO/jB,EAAG2hB,MAAgB,WACzBnzB,KAAK,SAAU3N,GAChBmf,EAAGnf,KAAOA,EACVwoB,EAAMtE,YAGDsE,IAhBLrJ,EAAGnf,KAAOmf,EAAG2hB,MAAgB,SAC7BtY,EAAMtE,UACCsE,IAyBX42F,WAAY,WACV,GAAIjgG,GAAK/iB,IAOT,OANA+iB,GAAGgR,eAAejM,UAClB/E,EAAGsgG,aACHtgG,EAAGugG,eAEGvgG,EAAG2hB,MAAgB,UAAG3hB,EAAGwgG,YAC/BxgG,EAAGygG,eACIzgG,GAUTsgG,WAAY,WACV,GAAItgG,GAAK/iB,KACLyjH,EAAgB1gG,EAAGtW,QAAQ0mB,KAAK8D,UAAUkjB,KAAK,SAAUntC,GAC3D,QAAKy2G,IAAiBz2G,EAAI07D,eACxB17D,EAAI02G,SAAShkH,SAAS,aACf,IAKX,OADK+jH,IAAe1gG,EAAGsvF,UAAUnuG,KAAK,mBAAmBxE,SAAS,YAC7Di1G,qBAKL91G,EAAE,aAAaU,SACfo1G,sBACO5xF,OANLR,KAAIkS,KAAK,cAAe,yDAgB5B6uF,aAAc,WACZ,GAAIvgG,GAAK/iB,IACT,IAAI+iB,EAAG2hB,OAAS3hB,EAAG2hB,MAAMzkB,eAAe,WAAY,CAClD,GAAI6nB,GAAUjpC,EAAEsoB,UAAUpE,EAAG2hB,MAAMi/E,SAC/BzwF,EAAUnQ,EAAGrW,KAAK6nB,SAASrB,QAAQ+D,UACnChE,EAAQlQ,EAAGrW,KAAK6nB,SAAStB,MAAMgE,SACnClU,GAAG6gG,iBAAiB1wF,EAAS4U,GAC7B/kB,EAAG6gG,iBAAiB3wF,EAAO6U,GAC3B/kB,EAAGZ,KAAKY,EAAU,MAAEjB,MAAMozF,sBAAuB,WAE/C,MADAnyF,GAAG8gG,sBAAsBtpG,cAAcE,SAChC,IACN0H,KAAKY,EAAU,MAAEjB,MAAMkzF,uBAAwB,WAEhD,MADAjyF,GAAG8gG,sBAAsBtpG,cAAcE,SAChC,IAGX,MAAOsI,IAaT6gG,iBAAkB,SAAUriH,EAAOumC,GACjC,GAAI/kB,GAAK/iB,IA8BT,OA7BAsJ,GAAE/H,GAAOxB,KAAK,SAAU8G,GACtB,GAAIkD,GAAST,EAAEw+B,GAAS2kD,WAAY5zC,KAAMhyC,EAAKge,YAC3C9a,KACFlD,EAAKsb,KAAK,QAAS,WAGjB,IAAKpY,EAAOwC,YAAYu3G,uBAAyBj9G,EAAKge,aAAetK,cAAcC,GAEjF,MAAOuI,GAAGghG,cAAc95G,KAAMpD,EAAKge,aAAetK,cAAcE,OAAS,EAAI0E,OAG/E,IAAI2+C,GAAUj/D,EAAEiI,MAAMic,EAAG8gG,sBAAuB9gG,EAC5CA,GAAGlB,KAAKoE,EAAWnE,MAAMkiG,cAAen9G,EAAKge,WAAY9a,EAAQgZ,MAAQ,GAG7E+6C,EAAQj3D,EAAKge,cAGVhe,EAAKo9G,YAAYp9G,EAAKq9G,SAASn6G,EAAOwC,YAAYunD,SACvDjtD,EAAKs9G,WAAWp6G,EAAOwC,YAAY+jG,MAC9BvmG,EAAOwC,YAAYyyF,WACtBn4F,EAAKijE,UAEF//D,EAAOwC,YAAY4jG,WACtBtpG,EAAKvG,UAKJyiB,GAaT8gG,sBAAuB,SAAU55G,GAC/B,GAAI8Y,GAAK/iB,IAET,IADA+iB,EAAGrW,KAAK03G,yBACJrhG,EAAGlB,KAAKoE,EAAWnE,MAAMkiG,cAAe/5G,EAAM8Y,MAAQ,EAAO,MAAOA,EAGxE,IAAI9Y,IAASsQ,cAAcE,OAEzB,MADAsI,GAAGghG,cAAc95G,EAAM,GAChB8Y,CAGT,IAAIshG,GAAWthG,EAAG6S,KAClB,KAAK,GAAI0uF,KAAYD,GAAU,CAC7B,GAAIv2B,GAAOu2B,EAASC,GAAUx2B,KAC1Boe,EAAOpe,EAAKy2B,eACZrY,IACFpe,EAAKsf,aAoCT,MAhCA7nG,IAAG8L,IAAIxR,KAAKkjB,EAAGuR,WAAa,kBAC1BkwF,iBAAkBzhG,EAAGxf,GACrBqjB,WAAY3c,EACZi6E,IAAKnhE,EAAGrW,KAAK+3G,qBAAqB1hG,EAAGrW,MACrCy3E,IAAKtlF,EAAEwkB,OAAON,EAAGrW,KAAKg4G,eACrB,KAAM,MAAM,GAAMnzG,KAAK,SAAU0V,GAClC,GAAIC,GAAmBroB,EAAEsoB,UAAUF,EAGnCG,YAGA,IAAIC,GAAUH,EAAiBI,QAC3BC,EAAsBL,EAAiBM,kCAC3CzE,GAAGrW,KAAKgb,uBAAuBL,EAASE,EAGxC,IAAItE,GAASiE,EAAiBe,MAC9BlF,GAAGghG,cAAc95G,EAAMgZ,KAEtB8E,KAAK,SAAUiJ,EAAK/J,GAIrB,GAHAlE,EAAGrW,KAAKi4G,gBAAgB3kH,MAAM,EAAM,KAAM+iB,EAAGiQ,QAASjQ,EAAGoM,YAGrDlI,GAAYA,EAASgB,OAAQ,CAC/B,GAAItoB,GAAOd,EAAEsoB,UAAUF,EAASgB,QAE5BZ,EAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC/BzE,GAAGrW,KAAKgb,uBAAuBL,EAASE,MAGrCxE,GAYTghG,cAAe,SAAU95G,EAAMgZ,GAC7B,GAAIF,GAAK/iB,KACL4kH,EAAgB7hG,EAAGlB,KAAKoE,EAAWnE,MAAMoE,aAAcjc,EAAMgZ,EAAQF,MAAQ,CASjF,OAHKE,IAAoB,GAAVA,IAAiB2hG,GAC9B7hG,EAAG8b,QAEE9b,GAUTwgG,UAAW,WACT,GAAIxgG,GAAK/iB,IACT+iB,GAAGtW,QAAQo4G,eAAetsG,YAAYE,SACtC,IAAIqsG,GAAQ/hG,EAAGsvF,UAAUnuG,KAAK,4BAG1B6gH,EAAmBlmH,EAAE,sBAAsBc,KAAK,OAuBpD,OAtBAmlH,GAAMnqF,OAAO,kBAAoBoqF,EAAmB,KAAK9iH,OACzD8gB,EAAGsvF,UAAUnuG,KAAK,aAAaoyB,IAAI,SAASx1B,GAAG,QAAS,WACtD,GAAIspC,GAAUvrC,EAAEmB,MAAML,KAAK,OAG3BojB,GAAGtW,QAAQoV,KAAKkB,EAAGtW,QAAe,MAAEqV,MAAM00B,kBAAmBzzB,EAAGtW,QAAQ0mB,KAAKiX,IAE7E06E,EAAQ/hG,EAAGsvF,UAAUnuG,KAAK,4BAC1B6e,EAAGsvF,UAAUnuG,KAAK,sBAAsB5E,YAAY,YACpDT,EAAEmB,MAAMN,SAAS,YACjBolH,EAAMxkH,OACNwkH,EAAMnqF,OAAO,mBAAqByP,EAAU,MAAMnoC,OAGlD8gB,EAAGtW,QAAQoV,KAAKkB,EAAGtW,QAAe,MAAEqV,MAAM80B,iBAAkB7zB,EAAGtW,QAAQ0mB,KAAKiX,MAGzErnB,EAAGuvF,WACNvvF,EAAG28B,SAAS/yC,OAAO,SAAU,SAAU,QAEzCoW,EAAGsvF,UAAUnuG,KAAK,gCAAgCoyB,IAAI,iBAAiBz0B,QAAQ00B,QAAQC,SACvF33B,EAAE,aAAaU,SACRwjB,GAUTygG,aAAc,WACZ,GAAIzgG,GAAK/iB,KACLglH,EAAen6F,UAAUiC,WAAWgH,SAASd,QAAQiyF,oBAErDC,EAAoBv5F,EAAOmB,WAAWhH,QAAQq/F,uBAC9CC,GACFC,WAActiG,EAAG2hB,MAAMmU,KACvB1vB,WAAcpG,EAAG2hB,MAAMvb,YAGrBm8F,EAAsB,GAAIN,GAAajiG,EAAGiR,YAAY+hB,SAAW,wBAC1BmvE,EACAE,EACA7/G,GAAGunB,WAAWm4D,UAAUE,YAAYikB,mBAAoBrmF,EACnGuiG,GAAoBnjG,KAAK6iG,EAAaljG,MAAMyjG,SAAU,SAAUC,GAC9DziG,EAAG6S,MAAQ4vF,EAAaC,cACxBD,EAAaE,cAAcn0G,KAAK,WAC9BwR,EAAG0S,iBAAiB3N,cAIxBjpB,EAAEiwB,KAAK/L,EAAG0Q,OAAO/mB,KAAMqW,EAAG0Q,OAAOE,QAAQhL,KAAK,WACvC5F,EAAGrW,KAAK+a,YAGb1E,EAAG8T,wBAGH9T,EAAGrW,KAAKyV,KAAK,cAAe,WAC1B,IAAK,GAAIyV,KAAa7U,GAAGrW,KAAK6nB,SAASZ,OAAQ,CAC7C,GAAIyC,GAAQrT,EAAGrW,KAAK6nB,SAASZ,OAAOiE,GAChCQ,EAAOhC,EAAMgC,KAAKnB,UAClBq0E,EAAUlzE,EAAKA,EAAKtqB,OAAS,EAE7BsqB,GAAKtqB,QAAUw9F,IAAYA,EAAQD,wBAA0BC,EAAQqa,SACvEvvF,EAAMo0E,UAAUc,EAAQxzE,YAAY,UAY9C8tF,oBAAqB,WACnB,MAAO5lH,MAAK0kC,MAAM0+E,QAWpBR,YAAa,WACX,GAAI7/F,GAAK/iB,IAaT,OAZAsG,YAAW,WACTL,aAAajG,KAAK0iH,iBAClBp5G,EAAEyZ,EAAG6S,OAAO71B,KAAK,SAAU+tF,EAAM7jF,GAC/BhE,aAAa6nF,EAAK4f,eAEpBpkG,EAAEyZ,EAAG0/F,oBAAoB1iH,KAAK,SAAUmjH,EAAWj5G,GACjDi5G,EAAUj+C,UAEZ1/D,GAAG8L,IAAIxR,KAAKkjB,EAAGuR,WAAa,eAC1BnL,WAAYpG,EAAGxf,MAEhB,KACIwf,GAYTwC,oBAAqB,SAAUC,EAAYC,GACzC,GAAIjU,GAAI3S,EAAE0nB,WACNxD,EAAK/iB,KACL+pB,EAAa/b,MAAMjM,UAAUkM,MAAMpO,KAAKgO,UAAW,EAuBvD,OArBAtI,IAAGykB,cAAczE,oBAAoB,uCACnCvlB,KAAKuD,GAAI,GAAIiiB,EAAYuE,GAAYxY,KAAK,SAAUnK,GAClD,GAAIigB,GAAUjgB,EAAIkgB,QACdC,EAAsBngB,EAAIogB,kCAC1BzE,GAAGrW,MAAQqW,EAAGrW,KAAK+a,WAAW1E,EAAGrW,KAAKgb,uBAAuBL,EAASE,GAE1E/V,EAAEsW,QAAQ1gB,EAAI6iB,gBACblC,KAAK,SAAUC,EAAc5gB,GAC9B,GAAIA,EAAK,CACP,GAAIA,EAAI6gB,OAAQ,CACd,GAAItoB,GAAOyH,EAAI6gB,OACXZ,EAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC3BzE,GAAGrW,MAAQqW,EAAGrW,KAAK+a,WAAW1E,EAAGrW,KAAKgb,uBAAuBL,EAASE,GAE5E/V,EAAE0W,OAAO9gB,EAAIse,WAEblU,GAAE0W,OAAOF,KAIRxW,EAAE2W,WAUX+B,kBAAmB,SAAU1E,GAC3B,MAAOjgB,IAAGykB,cAAcE,kBAAkB,2CAA4ClqB,KAAKuD,GAAIiiB,MAOjG1D,MAAOjjB,EAAE4C,QAUPuiH,cAAe,eAUf99F,aAAc,eACbyF,EAAOmB,WAAWhH,QAAQ6D,WAAW7H,QAK1C6J,GAAOmB,WAAWhH,QAAQG,WAAaA,GACtC3hB,OAAOumB;AClmBV,cACA,SAA2Cc,GASzC,GAAIw5F,GAAyB5/G,GAAGygB,IAAIi/D,UAAUmB,iBAAiB3kF,QAC7DokH,SAAU,KACV3jB,MAAO,KACP3hG,KAAM,SAASulH,EAAcp5G,GAC3B,GAAIqW,GAAK/iB,IACT+iB,GAAGm/E,MAAQx1F,EACXqW,EAAGe,OAAOgiG,GAGV/iG,EAAGgjG,YAAcD,EAAaT,WAC9BtiG,EAAGijG,qBAAuBF,EAAaG,oBACvCljG,EAAG8iG,SAAWC,EAAapZ,QAE3B3pF,EAAG/hB,YACHnC,EAAE4C,OAAOshB,EAAG/hB,SAAU8kH,IAWxBI,WAAY,SAAU7/B,GACpB,MAAOrmF,MAAK0mF,eAAeL,IAW7BtiE,KAAM,SAAUsiE,GACd,GAAItjE,GAAK/iB,KACLijB,EAAS,GAAIpkB,GAAE0nB,SAEf28F,EAAY39G,GAAG8L,IAAIxR,KAAK,+BAAgCkjB,EAAGmjG,WAAW7/B,GAc1E,OAbAtjE,GAAGm/E,MAAM+gB,mBAAmB,OAASlgG,EAAG8iG,SAAU3C,GAClDA,EAAU3xG,KAAK,SAAU5R,GACvBsjB,EAAO6E,SAAU4nF,KAAM7wG,EAAEsoB,UAAUxnB,OAClCooB,KAAK,SAAU3jB,GAChBmB,GAAG2mB,MAAM,WACP,GAAI4c,GAA2B,OAAf1kC,EAAE2kC,SAAoBC,OAAO5kC,EAAE2kC,UAAY5pB,MAC3D5Z,IAAGmE,GAAGylB,WAAWltB,KAAKmC,EAAG+a,OAAW2pB,KAEtC7lB,EAAO6E,SAAU4nF,YAChB99E,OAAO,WACR7O,EAAGm/E,MAAMihB,qBAAqB,OAASpgG,EAAG8iG,YAGrC5iG,EAAOkF,WAUhBo+D,UAAW,WACT,GAAIxjE,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,WAEX4/F,EAAStnH,EAAE,IAAMkkB,EAAG8iG,UACpBlmH,EAAOwmH,EAAOxmH,KAAK,QAIvB,OAHIA,IAAQA,EAAiB,kBAAUA,GAAiB,WACxDsjB,EAAO6E,QAAQnoB,GAERsjB,EAAOkF,WAWhBq+D,UAAW,SAAUH,GACnB,GAAItjE,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,UACftgB,cAAa8c,EAAGqjG,iBAChB,IAAIlD,GAAY39G,GAAGmnB,MAAM0tD,YAAYv/B,QAAQ93B,EAAGsjG,WAAYtjG,EAAGmjG,WAAW7/B,GAW1E,OAVAtjE,GAAGm/E,MAAM+gB,mBAAmB,YAAclgG,EAAG8iG,SAAU3C,GACvDngG,EAAGqjG,iBAAmB9/G,WAAW,WAC/B48G,EAAU3xG,KAAK,WACb0R,EAAO6E,YACNC,KAAK,WACN9E,EAAOiF,WACN0J,OAAO,WACR7O,EAAGm/E,MAAMihB,qBAAqB,YAAcpgG,EAAG8iG,aAEhD,KACI5iG,EAAOkF,WAWhBk+F,SAAU,WACR,GAAItjG,GAAK/iB,IAET,OAAOnB,GAAEwkB,QAAQN,EAAGgjG,YAAa,GAAI,GAAKhjG,EAAGijG,uBAAuBjoG,WAAW,IAAK,MAQxF4N,GAAOw5F,uBAAyBA,GAG/B7gH,OAAOumB,UAAUiC,WAAWhH;ACvI/B,cAEA,SAAW6F,GAYT,GAAI26F,GAAqB36F,EAAO1F,WAAWxkB,QACzCyR,UAAW,qBACXjS,MAAO,MACP2oB,MAAOjjB,EAAE,yBAETpG,KAAM,SAAU05B,EAAUyK,GACnBA,GAAOn/B,GAAGqL,MAAMjK,EAAE,oDAEvB,IAAIoc,GAAK/iB,IAeT,OAdA+iB,GAAG2hB,MAAQA,EACX3hB,EAAGwjG,iBAAmBhsF,KAAKC,MAAMkK,EAAM8hF,UAAUtvF,IAEjDnU,EAAGo+B,gBAAiB,EACpBp+B,EAAG+uB,oBAAqB,EAExB/uB,EAAG0/F,sBACH1/F,EAAG2Q,WACH3Q,EAAGgR,eAAiBl1B,EAAE0nB,WACtBxD,EAAG0S,iBAAmB52B,EAAE0nB,WACxBxD,EAAG6Q,YAEH7Q,EAAG6uF,kBAEI5xG,MAST+iH,YAAa,WACX,GAAI/5F,GAAMnqB,EAAE0nB,WACRxD,EAAK/iB,IAUT,OAPA+iB,GAAG2hB,MAAM+hF,SAAW/4G,OAAO,sDAAuDqV,EAAG2hB,MAAM+hF,UAE3F1jG,EAAGe,SAASvS,KAAK,WACfwR,EAAGo+B,gBAAiB,EACpBn4B,EAAIlB,YAGCkB,GAST09F,aAAc,WACZ,GAAIrhG,GAAarlB,KAAK0M,KAAK2Y,UAC3B/gB,QAAO4yB,IAAM7R,CACb,IAAIshG,IAAU,CAEd,KAAK,GAAI18G,KAAQob,GAAY,CAC3B,GAAI0U,GAAY1U,EAAWpb,EACvB8vB,GAAU81D,YAAc91D,EAAU81D,eAAiB91D,EAAUN,aAC/DM,EAAUysC,YACVmgD,GAAU,GASd,MALKA,KACH3mH,KAAKmvB,WAAW2f,UAAUnoC,EAAE,mCAC5BpB,GAAGqL,MAAMjK,EAAE,oCAGN3G,OAIX2rB,GAAO26F,mBAAqBA,GAC3BhiH,OAAOumB,UAAUiC,WAAWhH;AC1F/B,cAEA,SAAW8gG,GAET,GAAIC,GAAwB,oCAYxBC,EAAcplG,WAAWjgB,QAG3BlB,KAAM,SAAUgD,EAAI02B,GAClB,GAAIlX,GAAK/iB,IAET+iB,GAAGxf,GAAKA,EACRwf,EAAGkX,SAAWA,EACVp7B,EAAEuzB,cAAc6H,IAClBp7B,EAAE4C,OAAOzB,KAAMi6B,GAEjBlX,EAAGgkG,QAAUloH,EAAE0nB,WAEfxD,EAAGikG,eAGLA,YAAa,WACX,GAAIjkG,GAAK/iB,KAELinH,EAAsB1hH,GAAGynB,UAAUnpB,OAAOgjH,EAAuBhoH,EAAE4C,QACrE8B,GAAIwf,EAAGxf,GACPqmB,MAAO,GACPs9F,oBAAoB,EACpBC,WAAW,EACXC,iBAAiB,EACjBC,cAAe,GACfC,WAAW,EACXC,QAAQ,EACRC,YAAa7gH,EAAE,YACdoc,EAAGkX,UAGNp7B,GAAEiwB,KAAKm4F,GAAqB11G,KAAK,SAAU3N,GACzCmf,EAAG28B,SAAW7gD,EAAE+E,GAEhBmf,EAAG0kG,QAAU1kG,EAAG28B,SAASx7C,KAAK,+BAC9B6e,EAAG2kG,iBAAmB3kG,EAAG28B,SAASx7C,KAAK,0CACvC6e,EAAG4kG,YAAc5kG,EAAG28B,SAASx7C,KAAK,oCAClC6e,EAAG6kG,cAAgB7kG,EAAG28B,SAASx7C,KAAK,+BACpC6e,EAAGsvF,UAAYtvF,EAAG6kG,cAAc1jH,KAAK,0BACrC6e,EAAG8kG,UAAY9kG,EAAG28B,SAASx7C,KAAK,0BAChC6e,EAAG+kG,cAAgB/kG,EAAG8kG,UAAU3jH,KAAK,+BAErC6e,EAAGilE,cAE2B,IAA1BnpF,EAAE,IAAMkkB,EAAGxf,IAAIuK,SACjBiV,EAAG28B,SAAShgD,SAAS,uBACrBqjB,EAAG28B,SAASqP,SAAS,SAGvBhsC,EAAGgkG,QAAQj/F,aAKfkgE,YAAa,WACX,GAAIjlE,GAAK/iB,IAET+iB,GAAG2kG,iBAAiB5mH,GAAG,QAAS,WAC9BiiB,EAAGglG,cAAchlG,EAAGilG,eAAe,KAErCjlG,EAAG4kG,YAAY7mH,GAAG,QAAS,WACzB,MAAIiiB,GAAGlB,KAAKkB,EAAU,MAAEjB,MAAMgzF,aAAc/xF,MAAQ,IACpDA,EAAGziB,WACHyiB,GAAGlB,KAAKkB,EAAU,MAAEjB,MAAMizF,YAAahyF,OAS3C9gB,KAAM,WACJ,GAAI8gB,GAAK/iB,IACTnB,GAAEiwB,KAAK/L,EAAGgkG,SAASx1G,KAAK,WACtBwR,EAAG28B,SAASpgD,YAAY,0BAS5BgB,KAAM,WACJ,GAAIyiB,GAAK/iB,IACTnB,GAAEiwB,KAAK/L,EAAGgkG,SAASx1G,KAAK,WAEtBwR,EAAGglG,cAAa,GAChBhlG,EAAG28B,SAAShgD,SAAS,0BAUzBgzG,SAAU,SAAUuV,GAClB,GAAIllG,GAAK/iB,IACTnB,GAAEiwB,KAAK/L,EAAGgkG,SAASx1G,KAAK,WACtBwR,EAAG0kG,QAAQhgH,KAAKwgH,MAUpBC,eAAgB,SAAUC,GACxB,GAAIplG,GAAK/iB,IACTnB,GAAEiwB,KAAK/L,EAAGgkG,SAASx1G,KAAK,WACtBwR,EAAG0kG,QAAQ7jH,KAAKukH,MAWpBC,iBAAkB,SAAUf,EAAejqF,GACzC,GAAIra,GAAK/iB,IACTnB,GAAEiwB,KAAK/L,EAAGgkG,SAASx1G,KAAK,WACtBwR,EAAG8kG,UAAUvnH,OACbyiB,EAAGsvF,UAAUzuG,KAAKyjH,GAClBtkG,EAAGsvF,UAAUpwG,OACTm7B,GAAUA,OAWlBirF,WAAY,SAAUvnE,EAAS1jB,GAC7Bp9B,KAAKooH,iBAAiB,8CAAgDtnE,EAAU,SAAU1jB,IAS5FkrF,WAAY,SAAU7gH,GACpB,GAAIsb,GAAK/iB,IACTnB,GAAEiwB,KAAK/L,EAAGgkG,SAASx1G,KAAK,WAClB9J,GACFsb,EAAG+kG,cAAcrgH,KAAKA,GAExBsb,EAAGsvF,UAAU/xG,OACbyiB,EAAG8kG,UAAU5lH,UAUjB+lH,YAAa,WACX,GAAIjlG,GAAK/iB,IACT,OAAO+iB,GAAG28B,SAASjgD,SAAS,2BAS9B8oH,eAAgB,WACd,GAAIxlG,GAAK/iB,IACT,OAAkE,MAA3DuF,GAAGmnB,MAAMsvB,QAAQ,eAAiBj5B,EAAGxf,GAAK,cAUnDwkH,aAAc,SAAUC,EAAaxhC,GACnC,GAAIzjE,GAAK/iB,IACTnB,GAAEiwB,KAAK/L,EAAGgkG,SAASx1G,KAAK,WAClBy2G,GAEFjlG,EAAG28B,SAAShgD,SAAS,0BACrBqjB,EAAG6kG,cAAcloH,SAAS,wCAC1BqjB,EAAG8kG,UAAUvnH,OACbyiB,EAAG2kG,iBAAiBpoH,YAAY,qDAGhCyjB,EAAG28B,SAASpgD,YAAY,0BACxByjB,EAAG6kG,cAActoH,YAAY,wCAC7ByjB,EAAG2kG,iBAAiBhoH,SAAS,mDAE7BqjB,EAAGsvF,UAAUmW,YACXC,YAAa,UACbC,YAAa,MACbC,aAAc,IACdC,aAAc,QACdC,mBAAoB,IACpBC,aAAehiF,MAAO,GACtBiiF,kBAAkB,EAClBC,UAAW,aAKbxiC,GACFjhF,GAAGmnB,MAAMmuB,QAAQ,eAAiB93B,EAAGxf,GAAK,YAAaykH,EAAc,IAAM,QAG/ElmG,OAUEgzF,aAAc,cASdC,YAAa,UAKjB6R,GAAgB95F,WAAWhH,QAAQghG,YAAcA,GAEhDxiH,OAAOumB;AC5QV,cA8DA,SAAWc,GACT,GAAIg3E,GAAkBjhF,WAAWjgB,QAE/ByR,UAAW,kBACX3R,SACA04B,YACAgvF,YAAa,GACbC,aAAc,GACdC,aAAa,EACbC,MAAO,KAEP7oH,KAAM,SAAU0/G,EAAcoJ,EAAe5S,GAC3Cl0F,IAAIqQ,KAAK,eAAgB,yBAA2BqtF,EAGpDjgH,MAAKuB,MAAW8nH,EAAiBA,KACjCrpH,KAAKi6B,UAAaqvF,WAAYtpH,KAAKipH,YAAaM,YAAavpH,KAAKipH,aAC7DpqH,EAAEm1C,cAAcyiE,IAAe53G,EAAE4C,OAAOzB,KAAKi6B,SAAUw8E,GAE5Dz2G,KAAK8jB,OAAOm8F,GACZjgH,KAAK0jH,SAAW7kH,EAAEohH,GACdjgH,KAAK0jH,SAAS51G,QAAU,GAAGvI,GAAGqL,MAAM,6BAA8BqvG,IAIxEuJ,gBAAiB,WAGf,IAAK,GAFDzmG,GAAK/iB,KAEAuH,EAAI,EAAGA,EAAIwb,EAAGxhB,MAAMuM,SAAUvG,EACrCwb,EAAGxhB,MAAMgG,GAAGE,KAAO0W,WAAW4E,EAAGxhB,MAAMgG,GAAGqiG,OAAO3tF,MAAM,KAAO8G,EAAGxhB,MAAMgG,GAAGE,KAC1Esb,EAAGxhB,MAAMgG,GAAGc,MAAQ0a,EAAGxhB,MAAMgG,GAAGa,KAChC2a,EAAGxhB,MAAMgG,GAAGoB,WAAaoa,EAAGxhB,MAAMgG,GAAGmB,UACjCqa,EAAGxhB,MAAMgG,GAAGW,WAAa6a,EAAGxhB,MAAMgG,GAAGc,QACvC0a,EAAGxhB,MAAMgG,GAAGc,MAAQ,+BAEtB0a,EAAGxhB,MAAMgG,GAAG6C,QAAa2Y,EAAGxhB,MAAMgG,GAAG6C,QAAW2Y,EAAGxhB,MAAMgG,GAAG6C,QAAU,SAAUvD,EAAMlG,EAAM0C,GAAS0f,EAAGlB,KAAK,aAAchb,EAAMlG,EAAM0C,GAGzI,OADArD,MAAKopH,MAAQ,GAAIxqH,aAAYoB,KAAKuB,MAAOvB,KAAKi6B,UACvCj6B,MAgBTypH,QAAS,SAAUx/G,EAAM2/F,EAAO8f,EAAUC,EAAqBC,EAAc/f,EAAclZ,GACzF,GAAK3wF,KAAKmpH,YAaR,MAAO5jH,IAAGqL,MAAM,iCAFhB,OATA5Q,MAAKuB,MAAMgS,MACTtJ,KAAQA,EACR2/F,MAASzrF,WAAWyrF,GAAO3tF,MAAM,IACjC5T,MAASqhH,EACT/hH,gBAAoBgiH,IAAuB,EAC3CzhH,SAAa0hH,IAAgB,EAC7B5hH,SAAa6hG,IAAgB,EAC7B0O,QAAY5nB,GAAe,KAEtB3wF,MAYX6pH,gBAAiB,WACf,MAAO7pH,MAAKuB,MAAMu1C,sBAAsB92C,KAAKuB,MAAO,YAAY,KAYlEuoH,gBAAiB,SAAU7/G,EAAMosD,EAAYqzD,EAAUK,GACrD,GAAIhnG,GAAK/iB,IAETq2D,GAAcA,KAAe,CAE7B,IAAIxvD,GAAOkc,EAAGxhB,MAAMu1C,sBAAsB/zB,EAAGxhB,MAAO,OAAQ0I,GAW5D,OAVApD,GAAKqB,SAAWmuD,EAChBxvD,EAAKuB,KAAOkB,EAAE2kF,YAAYy7B,GAAY7iH,EAAKuB,KAAOshH,EAClD7iH,EAAKwB,MAAQxB,EAAKuB,KACdiuD,IACGxvD,EAAKwB,MAEC0hH,IACTljH,EAAKsC,aAAe4gH,GAFpBljH,EAAKwB,MAAQ,+BAKV0a,GAWTlf,OAAQ,SAAUmmH,GAChB,GAAIjnG,GAAK/iB,IACT,OAAM+iB,GAAGomG,cAAgBa,EAAczkH,GAAGqL,MAAM,mCAChD5Q,KAAKwpH,kBACLxpH,KAAKmpH,aAAc,EACnBnpH,KAAK0jH,SAAShjH,YAAYV,KAAKopH,OACxBppH,OAWTiC,KAAM,SAAUC,GAGd,MAFAlC,MAAKwpH,kBACLxpH,KAAKopH,MAAMnnH,KAAK,KAAM,KAAMC,GACrBlC,MAaTkD,OAAQ,SAAUoa,EAAGpJ,EAAGhS,GAGtB,MAFAlC,MAAKwpH,kBACLxpH,KAAKopH,MAAMlmH,QAASE,KAAMka,EAAG7a,IAAKyR,GAAK,KAAM,KAAMhS,GAC5ClC,OAMX2rB,GAAOg3E,gBAAkBA,GACxBr+F,OAAOumB,UAAUiC,WAAWi4D;AC/N/B,cA+BA,SAAWp5D,GACT,GAAIs+F,GAAuBt+F,EAAOg3E,gBAAgBlhG,QAChDlB,KAAM,SAAUilF,EAAS6jC,EAAe5S,EAAcyT,GACpD,GAAInnG,GAAK/iB,IACT+iB,GAAGe,OAAO0hE,EAAS6jC,EAAe5S,GAClC1zF,EAAGonG,UAAYD,GAAiB,wBAIlCh3G,UAAW,uBACXi3G,UAAW,uBACXC,MAAO,KASPvmH,OAAQ,SAAUmmH,GAChB,GACIziH,GADAwb,EAAK/iB,IAET,IAAM+iB,EAAGomG,cAAgBa,EAAO,MAAOzkH,IAAGqL,MAAM,iCAGhD/R,GAAE,IAAMkkB,EAAGonG,WAAWz5E,QAGtB,IAAI9sC,GAAO,YAAcmf,EAAGonG,UAAY,gEAAmEpnG,EAAGkX,SAASowF,cAAgBtnG,EAAGkX,SAASowF,gBAAiB,EAAsB,WAAf,cAA6B,IACxM,KAAK9iH,EAAI,EAAGA,EAAIwb,EAAGxhB,MAAMuM,OAAQvG,IAC/B3D,GAAQ,mBAAqBmf,EAAGxhB,MAAMgG,GAAG0C,KAAO,YAAc8Y,EAAGxhB,MAAMgG,GAAGE,KAAO,+CAAiDsb,EAAGxhB,MAAMgG,GAAGW,SAAW,WAAa,IAAM,KAC5KtE,GAAQ,8CAAgDmf,EAAGxhB,MAAMgG,GAAGc,MAAQ,WAC5EzE,GAAQ,QAEVA,IAAQ,SACRmf,EAAGqnG,MAAQvrH,EAAE+E,EAGb,IAAI0mH,GAAUvnG,EAAGqnG,MAAMlmH,KAAK,QAC5B,KAAKqD,EAAI,EAAGA,EAAIwb,EAAGxhB,MAAMuM,OAAQvG,IAAK,CACpC,GAAI6C,GAAU,SAAWvD,GACvB,MAAO,YACLkc,EAAGqnG,MAAMlmH,KAAK,aAAa5E,YAAY,YACvCT,EAAEmB,MAAMN,SAAS,YACjBqjB,EAAGlB,KAAK,aAAchb,KAEvBkc,EAAGxhB,MAAMgG,GACZ+iH,GAAQ5kE,GAAGn+C,GACRzG,GAAG,oBAAqBsJ,GAI7B,MAFA2Y,GAAGomG,aAAc,EAEVpmG,GAST9gB,KAAM,WACJ,GAAI8gB,GAAK/iB,IAC4B,KAAjCnB,EAAE,IAAMkkB,EAAGonG,WAAWr8G,QACxBjP,EAAE,QAAQG,OAAO+jB,EAAGqnG,MAEtB,IAAIG,GAAaxnG,EAAG2gG,SAASvjH,QAO7B,OANA4iB,GAAGqnG,MAAM1mH,KACPyB,SAAY,WACZ/B,KAAQV,KAAK+xG,MAAM8V,EAAWnnH,MAC9BX,IAAOC,KAAK+xG,MAAM8V,EAAW9nH,OAE/BsgB,EAAGqnG,MAAMnoH,OACF8gB,GAWTynG,OAAQ,SAAUzvD,EAAW0vD,GAC3B,GAAI1nG,GAAK/iB,IAOT,OANIyqH,MAAU,EACZ5rH,EAAEk8D,GAAWjS,QAAQ/lC,EAAGqnG,OAExBvrH,EAAEk8D,GAAW/7D,OAAO+jB,EAAGqnG,OAEzBrnG,EAAGqnG,MAAMnoH,OACF8gB,GASTziB,KAAM,WAEJ,MADAN,MAAKoqH,MAAM9pH,OACJyiB,KAMX4I,GAAOs+F,qBAAuBA,GAC7B3lH,OAAOumB,UAAUiC,WAAWi4D;AC9I/B,cAuEA,SAAWp5D,GACT,GAAIpC,GAAc7H,WAAWjgB,QAAQ8D,GAAG2nB,OAAO8E,cAC7C9e,UAAW,cACX3P,GAAI,GACJhC,SACAmpH,iBACAC,cAAe,MACfC,OAAQ,IACR7U,MAAO,GACP8U,YAAatyG,YAAYC,WACzBsyG,YACAC,QAAS,IACTC,QAASx1G,YAAYC,KACrBw1G,SAAUt1G,QAAQC,UAClBs1G,iBACAC,mBAAmB,EAGnB5qH,KAAM,SAAUgD,GACTA,GAAIgC,GAAGqL,MAAM,mDAAoD,MACtE5Q,KAAK8jB,OAAOvgB,GACZvD,KAAKuD,GAAKA,EAGVvD,KAAKuB,SACLvB,KAAK0qH,iBACL1qH,KAAK8qH,YACL9qH,KAAKkrH,kBAcPrG,eAAgB,SAAU/2F,GACxB,GAAI/K,GAAK/iB,IACJsmE,OAAMx4C,GAIT9tB,KAAK6qH,YAAc/8F,EAHC,IAAhBA,EAAmB/K,EAAG8nG,YAAc,aACnC9nG,EAAG8nG,YAAc,UAKxB,IAAIO,GAAQvsH,EAAE,IAAMmB,KAAKuD,GAKzB,OAJI6nH,GAAMt9G,OAAS,IACjBs9G,EAAMlnH,KAAK,oBAAoB5E,YAAYyjB,EAAG8nG,aAAanrH,SAASqjB,EAAG8nG,aACvEO,EAAMlnH,KAAK,qBAAqB+lC,WAAW,UAEtCjqC,MAaTy5B,SAAU,SAAUxvB,EAAMohH,GACnBxsH,EAAE,IAAMmB,KAAKuD,IAAIuK,QAAQvI,GAAGqL,MAAM,8CAEvC,IAAI06G,GAAOA,IAAQ,CACnBrhH,GAAOA,EAAKiY,aACZ,IAAIta,GAAO,GACPmX,EAAQ,GACRwsG,EAAS1sH,EAAE,IAAMoL,EAKrB,QAHwBrC,EAApBqC,IAAQjK,MAAKuB,MAAcvB,KAAKuB,MAAM0I,GAAMrC,KACpC,cAGV,IAAK,OACH2jH,EAAS1sH,EAAE,IAAMoL,EAAO,UACxB8U,EAAQwsG,EAAO3nH,MACf,MACF,KAAK,YACHmb,EAAQwsG,EAAO3nH,MACf,MACF,KAAK,QACHmb,EAAQwsG,EAAOrnH,KAAK,eAAiB+F,EAAO,cAAcgK,KAC1D,MACF,KAAK,QACL,IAAK,OACH8K,EAAQwsG,EAAOt3G,KACf,MACF,KAAK,SACH8K,EAAQwsG,EAAOt3G,KACf,MACF,KAAK,kBACL,IAAK,cACH8K,EAAQlgB,EAAE,WAAaoL,GAAMgK,KAC7B,MACF,KAAK,SAEE8K,EADAusG,EACQC,EAAOt3G,MADDpV,EAAE,WAAaoL,GAAMgK,KAExC,MACF,KAAK,OACH,GAAIu3G,GAAe3sH,EAAE,IAAMoL,EAAO,OAAOtK,KAAK,uBAC9Cof,GAAQysG,EAAa/xF,WACR,MAAT1a,IAAeA,EAAQ,GAC3B,MACF,KAAK,aACH,MAAO8rC,eAAc5gD,GAAMiwD,UAE7B,KAAK,aACHn7C,EAAQ,EACR,MACF,KAAK,WACHA,EAAQwsG,EAAOxmF,GAAG,WAClB,MACF,SACEhmB,EAAQwsG,EAAOt3G,MAGnB,MAAO8K,IAoBTsa,SAAU,SAAUpvB,EAAM8U,EAAOsc,EAAcgwF,GAE7CphH,EAAOA,EAAKiY,aACZ,IAAIta,GAAO,GACP2jH,EAAS1sH,EAAE,IAAMoL,EAKrB,QAHwBrC,EAApBqC,IAAQjK,MAAKuB,MAAcvB,KAAKuB,MAAM0I,GAAMrC,KACpC,cAGV,IAAK,QACH,GAAI6jH,GAAUF,EAAOrnH,KAAK,eAAiB+F,EAAO,KAClDwhH,GAAQ9wF,OAAO,WAAa5b,EAAQ,MAAMstB,KAAK,WAAW,EAC1D,MACF,KAAK,kBACL,IAAK,cACH9mC,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWqmG,0BAA0BC,gBAAgBJ,EAAQxsG,EAAOsc,EACzF,MACF,KAAK,OACH/0B,WAAW,WACT,GAAIklH,GAAe3sH,EAAE,IAAMoL,EAAO,OAAOtK,KAAK,uBAC9C6rH,GAAanyF,SAASta,EAAOsc,IAC5B,GACH,MACF,KAAK,aACH,KACF,KAAK,OACHkwF,EAAS1sH,EAAE,IAAMoL,EAAO,UACxBshH,EAAO3nH,KAAK+C,EAAEoY,GACd,MACF,KAAK,YACHwsG,EAAO3nH,KAAKmb,EACZ,MACF,KAAK,aACH,GAAI2kC,GAAOmH,cAAc5gD,GACrBgpB,IAEJ,KAAK,GAAI1rB,KAAKwX,GACZkU,EAAM1f,MACJ8Q,GAAMtF,EAAMxX,GAAGhE,GACf47B,KAAQjvB,mBAAmB6O,EAAMxX,GAAGK,MACpC2xC,cAAiBx6B,EAAMxX,GAAGkxC,UAG9BiL,GAAKyS,OAASljC,EACdywB,EAAKmV,YACL,MACF,KAAK,OACkB,gBAAV95C,KACTA,EAAQ1Q,WAAW0Q,IAErBwsG,EAAOt3G,IAAI8K,EACX,MACF,KAAK,WACGA,EAAOwsG,EAAOxmH,KAAK,UAAW,WAC/BwmH,EAAOthF,WAAW,UACvB,MACF,SACEshF,EAAOt3G,IAAI8K,GAGf,MAAO/e,OAST4rH,gBAAiB,SAAUroH,GACrBvD,KAAKuB,MAAMgC,IAAKgC,GAAGqL,MAAM,+CAW/B84D,gBAAiB,SAAUz/D,GACzB,GAAIrC,GAAO,EACXqC,GAAOA,EAAKiY,aACZ,IAAInD,GAAQ,GACRwsG,EAAS1sH,EAAE,IAAMoL,EAIrB,QAFwBrC,EAApBqC,IAAQjK,MAAKuB,MAAcvB,KAAKuB,MAAM0I,GAAMrC,KACpC,cAEV,IAAK,OACH2jH,EAAS1sH,EAAE,IAAMoL,EAAO,UACxBshH,EAAO3nH,KAAK+C,EAAEoY,GACd,MACF,KAAK,YACHA,EAAQwsG,EAAO3nH,MACf,MACF,KAAK,OACH,GAAI4nH,GAAe3sH,EAAE,IAAMoL,EAAO,OAAOtK,KAAK,uBAC9Cof,GAAQysG,EAAa9hD,iBACrB,MACF,KAAK,cACL,IAAK,kBACH,GAAIrzC,KACJx3B,GAAE,IAAMoL,EAAO,cAAc/F,KAAK,gBAAgBokC,SAAS,QAAQvoC,KAAK,WACtEs2B,EAAO9iB,KAAK1U,EAAEmB,MAAM+E,KAAK,gBAE3Bga,EAAQsX,EAAOpkB,KAAK,IACpB,MACF,KAAK,aACH8M,EAAQ,EACR,MACF,KAAK,aACHxZ,GAAGqL,MAAM,yBACT,MACF,SACEmO,EAAQwsG,EAAOt3G,MAGnB,MAAO8K,IAcT8sG,UAAW,WACT,MAAO7rH,MAAK4qH,QAadkB,UAAW,WAAc,MAAO9rH,MAAK6rH,UAAU9rG,MAAM/f,KAAM6N,YAU3Dk+G,aAAc,SAAUxoH,GAKtB,MAJKA,IAAIgC,GAAGqL,MAAM,mDAAoD,QACtE5Q,KAAK4rH,gBAAgBroH,GACrB1E,EAAE,IAAMoL,KAAKiY,cAAgB,cAAcwuB,SAC3C1wC,KAAKuB,MAAMgC,IAAQA,GAAMA,GAClBvD,MAWTgsH,QAAS,SAAU/hH,GACjB,GAAI8Y,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACda,GAAGgpG,aAAaxoH,EAEhB,IAAIuc,IACF28D,SAAU,gCACV7uE,QACErK,GAAMA,EACNkE,KAAQd,EAAEsD,IAGZgiH,YAAa,SAAUroH,GACrBmf,EAAGmpG,SAASjiH,EAAM1G,GAAI,EAAO,OAAQK,EAAM,OAK/C,OADAmf,GAAGmoG,cAAc33G,KAAKuM,GACf9f,MAQTmsH,UAAW,SAAUviB,EAAOwiB,GAC1B,MAAIA,IAASA,EAAkB,YAAe,KAAVxiB,EAC3B,IAEF,IAaTyiB,SAAU,SAAUpiH,EAAMqiH,EAAeC,EAAmBC,EAAUC,GACpE,GAAI1pG,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACda,GAAGgpG,aAAaxoH,GAChBipH,EAAWA,GAAY,QACvBF,EAAgBA,GAAiB,GACjCG,EAAmBA,GAAoB,EAEvC,IAAI7iB,GAAQjjG,EAAEsD,GACV6V,GACF28D,SAAU,iCACV7uE,QACErK,GAAMA,EACNuqB,YAAe/K,EAAG8nG,YAClB6B,SAAY3pG,EAAGopG,UAAUviB,EAAO2iB,GAChC3iB,MAAoB,KAAVA,EAAe,GAAKA,EAAQ,IACtChiG,KAAqB,SAAZ4kH,EAAuB,OAASA,EACzC9mH,IAAO4mH,EACPvtG,MAAS0tG,GAEXR,YAAa,SAAUroH,GACrBmf,EAAGmpG,SAASjiH,EAAM1G,GAAI,EAAOipH,EAAU5oH,EAAM2oH,IAKjD,OADAxpG,GAAGmoG,cAAc33G,KAAKuM,GACf9f,MAYT2sH,aAAc,SAAU1iH,EAAMsiH,GAC5B,MAAOvsH,MAAKqsH,SAASpiH,EAAM,KAAMsiH,EAAmB,SAYtDK,eAAgB,SAAU3iH,EAAM8U,GAC9B,GAAIgE,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACda,GAAGgpG,aAAaxoH,EAEhB,IAAIuc,IACF28D,SAAU,kCACV7uE,QACErK,GAAMA,EACNwb,MAASA,GAEXktG,YAAa,SAAUroH,GACrBmf,EAAGmpG,SAASjiH,EAAM1G,GAAI,EAAO,aAAcK,EAAM,OAKrD,OADAmf,GAAGmoG,cAAc33G,KAAKuM,GACf9f,MAYT6sH,QAAS,SAAU5iH,EAAMsiH,GACvB,GAAIxpG,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACda,GAAGgpG,aAAaxoH,EAEhB,IAAIuc,IACF28D,SAAU,gCACV7uE,QACErK,GAAMA,GAER0oH,YAAa,SAAUroH,GACrBA,EAAOmf,EAAG+pG,aAAavpH,EAAIK,EAAM2oH,GACjCxpG,EAAGmpG,SAASjiH,EAAM1G,GAAI,EAAO,OAAQK,EAAM2oH,IAK/C,OADAxpG,GAAGmoG,cAAc33G,KAAKuM,GACf9f,MAaT+sH,YAAa,SAAU9iH,EAAM+iH,EAAkBT,GAC7C,GAAIxpG,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACda,GAAGgpG,aAAaxoH,EAEhB,IAAIqmG,GAAQjjG,EAAEsD,GACV6V,GACF28D,SAAU,oCACV7uE,QACErK,GAAMA,EACNuqB,YAAe/K,EAAG8nG,YAClB6B,SAAY3pG,EAAGopG,UAAUviB,EAAO2iB,GAChC3iB,MAAoB,KAAVA,EAAe,GAAKA,EAAQ,IACtC7qF,MAASiuG,GAEXf,YAAa,SAAUroH,GACrBmf,EAAGmpG,SAASjiH,EAAM1G,GAAI,EAAO,WAAYK,EAAM2oH,IAKnD,OADAxpG,GAAGmoG,cAAc33G,KAAKuM,GACf9f,MAgBTitH,aAAc,SAAUhjH,EAAM+iH,EAAkBE,EAAeX,GAC7D,GAAIxpG,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACda,GAAGgpG,aAAaxoH,GAEhB2pH,EAAgBA,GAAiB,MACjCA,GAAgC,IAEhC,IAAItjB,GAAQjjG,EAAEsD,GACV6V,GACF28D,SAAU,qCACV7uE,QACErK,GAAMA,EACN4pH,UAAaD,EACbp/F,YAAe/K,EAAG8nG,YAClB6B,SAAY3pG,EAAGopG,UAAUviB,EAAO2iB,GAChC3iB,MAAoB,KAAVA,EAAe,GAAKA,EAAQ,IACtC7qF,MAASiuG,GAEXf,YAAa,SAAUroH,GACrBmf,EAAGmpG,SAASjiH,EAAM1G,GAAI,EAAO,YAAaK,EAAM2oH,IAKpD,OADAxpG,GAAGmoG,cAAc33G,KAAKuM,GACf9f,MAYTotH,YAAa,WACX,MAAOptH,MAAK+sH,YAAYhtG,MAAM/f,KAAM6N,YAatCw/G,UAAW,SAAUpjH,EAAMzI,EAAS+qH,GAClC,GAAIxpG,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACda,GAAGgpG,aAAaxoH,EAGhB,IAAI+pH,KACJ,KAAK,GAAIjhF,KAAQ7qC,GACXA,EAAQye,eAAeosB,IACzBihF,EAAiB/5G,MACfnF,IAAOi+B,EACPttB,MAASpY,EAAEnF,EAAQ6qC,KAKzB,IAAIu9D,GAAQjjG,EAAEsD,GACV6V,GACF28D,SAAU,kCACV7uE,QACErK,GAAMA,EACNuqB,YAAe/K,EAAG8nG,YAClB6B,SAAY3pG,EAAGopG,UAAUviB,EAAO2iB,GAChC3iB,MAAoB,KAAVA,EAAe,GAAKA,EAAQ,IACtCpoG,QAAW8rH,GAEbrB,YAAa,SAAUroH,GACrBmf,EAAGmpG,SAASjiH,EAAM1G,GAAI,EAAO,SAAUK,EAAM2oH,IAKjD,OADAxpG,GAAGmoG,cAAc33G,KAAKuM,GACf9f,MAcTutH,gBAAiB,SAAUtjH,EAAMzI,EAAS+qH,EAAmBS,GAC3D,GAAIjqG,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACda,GAAGgpG,aAAaxoH,GAChBypH,EAAmBA,GAAoB,IAEvC,IAAIM,KACJ,KAAK,GAAIjhF,KAAQ7qC,GACXA,EAAQye,eAAeosB,IACzBihF,EAAiB/5G,MACfnF,IAAOi+B,EACPttB,MAASpY,EAAEnF,EAAQ6qC,IACnByD,QAAWk9E,GAAoB3gF,EAAO,oBAAsB,IAKlE,IAAIu9D,GAAQjjG,EAAEsD,GACV6V,GACF28D,SAAU,iCACV7uE,QACErK,GAAMA,EACNuqB,YAAe/K,EAAG8nG,YAClB6B,SAAY3pG,EAAGopG,UAAUviB,EAAO2iB,GAChC3iB,MAAoB,KAAVA,EAAe,GAAKA,EAAQ,IACtCpoG,QAAW8rH,GAEbrB,YAAa,SAAUroH,GACrBmf,EAAGmpG,SAASjiH,EAAM1G,GAAI,EAAO,QAASK,EAAM2oH,IAKhD,OADAxpG,GAAGmoG,cAAc33G,KAAKuM,GACf9f,MAiBTwtH,mBAAoB,SAAUvjH,EAAMo9C,EAAeomE,EAAaC,EAAmBC,EAAYpB,GAC7F,GAAIxpG,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACdliB,MAAK+rH,aAAaxoH,EAElB,IAAIqqH,IACFvmE,cAAiBA,EACjB65C,QAAWusB,EACXI,cAAiBH,EACjB/yF,OAAUgzF,EAIZ,OADA5qG,GAAGmpG,SAASjiH,EAAM1G,GAAI,EAAM,kBAAmB,GAAIgpH,EAAmBqB,GAC/D5tH,MA0BTwpB,cAAe,SAAUvf,EAAMrC,EAAMkmH,EAAWC,EAAYC,EAAmBzB,GAC7E,GAAIxpG,GAAK/iB,KAELuD,EAAK0G,EAAKiY,aACdliB,MAAK+rH,aAAaxoH,EAElB,IAAIqqH,IACFK,YAAermH,EACfyuB,OAAUy3F,EACVI,OAAUH,EACV1mE,cAAiB2mE,EAInB,OADAjrG,GAAGmpG,SAASjiH,EAAM1G,GAAI,EAAM,aAAc,GAAIgpH,EAAmBqB,GAC1D5tH,MAkBTmuH,eAAgB,SAAUlkH,EAAMmkH,EAAgBX,EAAaC,EAAmBC,EAAYU,EAAmB9B,GAC7G,GAAIxpG,GAAK/iB,KAELuD,EAAK0G,EAAKiY,aACdliB,MAAK+rH,aAAaxoH,EAElB,IAAIqqH,IACFQ,eAAkBA,EAClBltB,QAAWusB,EACXI,cAAiBH,EACjB/yF,OAAUgzF,EACVW,cAAiBD,EAInB,OADAtrG,GAAGmpG,SAASjiH,EAAM1G,GAAI,EAAM,cAAe,GAAIgpH,EAAmBqB,GAC3D5tH,MAgBTuuH,QAAS,SAAUtkH,EAAMosB,EAAQm4F,EAAmBC,EAAoBC,EAAcnC,GACpF,GAAIxpG,GAAK/iB,KAELuD,EAAK0G,EAAKiY,aACdliB,MAAK+rH,aAAaxoH,EAClB,IAAIqqH,IACFv3F,OAAUA,EACVs4F,cAAiBF,EACjBG,eAAkBH,EAClB5iB,SAAY6iB,EAId,OADA3rG,GAAGmpG,SAASjiH,EAAM1G,GAAI,EAAM,OAAQ,GAAIgpH,EAAmBqB,GACpD5tH,MASTksH,SAAU,SAAUjiH,EAAM1G,EAAIsrH,EAAgBjnH,EAAMhE,EAAMkrH,EAAelB,GACvE5tH,KAAKuB,MAAMgC,IACTA,GAAMA,EACN0G,KAAQA,EACR4kH,eAAkBA,EAClBjnH,KAAQA,EACRknH,cAAiBA,EACjBnvH,KAAQiE,GAGNgqH,GACF/uH,EAAE4C,OAAOzB,KAAKuB,MAAMgC,GAAKqqH,IAa7BmB,eAAgB,SAAU9kH,EAAMrG,EAAM2oH,EAAmBC,GACvD,GAAIzpG,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACda,GAAGgpG,aAAaxoH,EAChB,IAAIqE,GAAU4kH,EAAYA,EAAW,SACjC3lH,EAAOkc,EAAG+pG,aAAavpH,EAAIK,EAAM2oH,EAGrC,OADAxpG,GAAGmpG,SAASjiH,EAAM1G,GAAI,EAAOqE,EAAMf,EAAM0lH,GAClCvsH,MAaT8sH,aAAc,SAAUvpH,EAAIyrH,EAAczC,GACxC,GAAI3iB,GAAQjjG,EAAEpD,EAAGwN,eACbnN,EAAO,YAAcL,EAAK,sCAAwCvD,KAAK6qH,YAAc,IASzF,OARAjnH,IAAQ8J,OAAO,gHACbnK,GAAMA,EACNqmG,MAAoB,KAAVA,EAAe,GAAKA,EAAQ,IACtC8iB,SAAY1sH,KAAKmsH,UAAUviB,EAAO2iB,KAGpC3oH,GAAQ,kCAAoCorH,EAAe,SAC3DprH,GAAQ,UAeVqrH,YAAa,SAAUhlH,EAAMilH,EAAe3C,GAC1C,GAAIxpG,GAAK/iB,KACLuD,EAAK0G,EAAKiY,aACdliB,MAAK+rH,aAAaxoH,EAElB,IAAIqmG,GAAQjjG,EAAEsD,GACV6V,GACF28D,SAAY,oCACZ7uE,QACErK,GAAMA,EACNqmG,MAASA,EACT8iB,SAAY3pG,EAAGopG,UAAUviB,EAAO2iB,GAChC7jE,UAAawmE,KAAkB,EAAO,oBAAsB,GAC5DphG,YAAe9tB,KAAK6qH,aAEtBoB,YAAe,SAAUroH,GACvBmf,EAAGmpG,SAASjiH,EAAM1G,GAAI,EAAO,WAAYK,EAAM2oH,IAKnD,OADAxpG,GAAGmoG,cAAc33G,KAAKuM,GACf9f,MASTmvH,aAAc,SAAUtoH,GACtB,GAAIkY,GAAQ/e,KAAKy5B,SAAS5yB,EAAS,KAAM7G,KAAK0pE,gBAAgB7iE,EAAS,GAGvE,OAFoB,mBAATkY,KAAsBA,EAAQ/e,KAAKy5B,SAAS5yB,EAAS,IAAG,IAC/C,mBAATkY,KAAsBA,EAAQ,IACvB,eAAdlY,EAAKe,KACHmX,EAAMkU,OAASlU,EAAMkU,MAAMnlB,OAAS,EAC/B,YAEA,GAEJiR,GAiCTqwG,kBAAmB,SAAUnlH,EAAMsgD,EAAS8kE,GAI1C,MAHArvH,MAAKsvH,YAAYrlH,MACjBjK,KAAKsvH,YAAYrlH,GAAMsgD,QAAUA,EACjCvqD,KAAKsvH,YAAYrlH,GAAMsmB,MAAQ8+F,EACxBrvH,MAST2mH,QAAS,WACP,GAAI5jG,GAAK/iB,IACTA,MAAK0qH,iBAEL7rH,EAAEkB,KAAKgjB,EAAGxhB,MAAO,SAAU6M,EAAKvH,GAC9B,GAAIA,EAAoB,cAAG,CACzB,GAAIulH,GAAQvlH,EAAoB,aAGhCkc,GAAGwsG,aAAa1oH,GAChBA,EAAK0pB,MAAQ,GACb1xB,EAAE,IAAMgI,EAAS,GAAI,aAAajD,KAAK,IAGnCwoH,EAAMv8B,YACJ9sE,EAAGusG,YAAwB,WAAW,QAAEvsG,EAAGosG,aAAatoH,OAAW,IACrEA,EAAK0pB,MAAQxN,EAAGusG,YAAwB,WAAS,OAAK3oH,EAAE,SACxDoc,EAAGysG,eAAe3oH,GAOtB,KAAK,GAAI4oH,KAAY1sG,GAAGusG,YAClBlD,EAAMqD,KAAc5oH,EAAK0pB,OAAmC,KAA1BxN,EAAGosG,aAAatoH,IAChDkc,EAAGusG,YAAYG,GAAmB,QAAE1sG,EAAGosG,aAAatoH,GAAOkc,EAAG2mD,gBAAgB7iE,EAAKtD,IAAK6oH,EAAMqD,OAAe,IAC/G5oH,EAAK0pB,MAAQxN,EAAGusG,YAAYG,GAAiB,OAAK9oH,EAAE,SACpDoc,EAAGysG,eAAe3oH,MAM5B,IAAI6oH,EAgCJ,OA9BA7wH,GAAEkB,KAAKC,KAAK0qH,cAAe,SAAUpxD,EAAOzyD,GAC1C,GAAI8oH,GAAU5sG,EAAG6sG,gBAAgB/oH,GAAMnH,SAAS,YAC3CgwH,KAAWA,EAAYC,EAAQjsH,IAAI,mBACxC,IAAI8iE,GAAY,SAMhB,IAJAmpD,EAAQ/tD,SAAUuf,gBAAiB3a,GAAa,IAAK,WACnDmpD,EAAQ/tD,SAAUuf,gBAAiBuuC,GAAa,OAG1B,UAApB3sG,EAAG4nG,cAA2B,CAChC,GAAIkF,GAAaniH,OAAO,mDAAoD7G,EAAK0pB,MACjF1xB,GAAE6O,OAAO,gBAAiB7G,EAAS,KAAIjD,KAAKisH,GAG9C,GAAwB,OAApB9sG,EAAG4nG,cAAwB,CAC7B,GAAIjpH,GAAKiuH,CACQ,oBAAb9oH,EAAKe,OAA2BlG,EAAKA,EAAGglE,SAAS,sBACrDhlE,EAAG2zC,MACD7xC,OAASivD,QAAS,yDAClB3R,SAAWr5C,KAAMZ,EAAK0pB,OACtBD,QACEzsB,OAAQ,SAAUR,EAAO+vD,GACvB9sD,WAAW,WAAc5E,EAAG2zC,KAAK,YAAe,cAQtDr1C,KAAK0qH,cAAc58G,OAAS,IAalC8hH,gBAAiB,SAAU/oH,GACzB,GAAI2+E,GAAU,KACVzvC,EAAWl3C,EAAE,IAAMgI,EAAS,GAChC,QAAQA,EAAW,MACjB,IAAK,SACH2+E,EAAUzvC,EAASn0C,QAAQ,QAAQsC,KAAK,aACxC,MACF,KAAK,kBACL,IAAK,cACHshF,EAAUzvC,EAASn0C,QAAQ,QAAQsC,KAAK,aACxC,MACF,KAAK,aACHshF,EAAUzvC,EAAS7xC,KAAK,uBACxB,MACF,KAAK,OACHshF,EAAU3mF,EAAE,IAAMgI,EAAS,GAAI,MAC/B,MACF,SACE2+E,EAAUzvC,EAGd,MAAOyvC,IAWTgqC,eAAgB,SAAU3oH,GACfA,EAAS,EAClB7G,MAAK0qH,cAAcn3G,KAAK1M,IAU1B0oH,aAAc,SAAU1oH,GACbA,EAAS,EAClB7G,MAAK4vH,gBAAgB/oH,GAAMvH,YAAY,cASzCwwH,UAAW,SAAUvsH,EAAI0f,EAAQspG,GAC/B,GAAIxpG,GAAK/iB,KACL4D,EAAOqf,EAAOrf,KAAO,WAAaqf,EAAOo+B,OAAS,WACtDt+B,GAAGxhB,MAAMgC,GAAI5D,KAAOojB,EAAG+pG,aAAavpH,EAAIK,EAAM2oH,IAYhDwD,UAAW,SAAUvrG,GACnB,GAAIzB,GAAK/iB,IAGT,OAFA+iB,GAAGooG,mBAAoB,EACvBpoG,EAAGgoG,QAAUvmG,EACNzB,GAYTitG,UAAW,SAAUC,GACnB,GAAIltG,GAAK/iB,IAGT,OAFA+iB,GAAGooG,mBAAoB,EACvBpoG,EAAGioG,QAAUiF,EACNltG,GAYTmtG,WAAY,SAAUC,GACpB,GAAIptG,GAAK/iB,IAGT,OAFA+iB,GAAGooG,mBAAoB,EACvBpoG,EAAGkoG,SAAWkF,EACPptG,GAWT8Z,OAAQ,WAEN,MADAh+B,GAAE,IAAMmB,KAAKuD,GAAK,SAASs5B,SACpB78B,MAUT6D,OAAQ,WACN,GAAIkf,GAAK/iB,IAET,OADA+iB,GAAG6kE,SAAQ,GACJ7kE,EAAGgzF,OAWZ1kB,YAAa,WACX,MAAOrxF,MAAK4nF,SAAQ,IAUtBA,QAAS,SAAUwoC,GACjB,GAAIrtG,GAAK/iB,KACLqwH,EAAkBxxH,EAAE0nB,UACxBxD,GAAGutG,OAGH,KAAK,GADDn5E,MACK5vC,EAAI,EAAGA,EAAIwb,EAAGmoG,cAAcp9G,OAAQvG,IAAK,CAChD,GAAIgW,GAAIwF,EAAGmoG,cAAc3jH,EACzB4vC,GAAU5jC,KAAKhO,GAAGynB,UAAUnpB,OAAO0Z,EAAEk/D,SAAUl/D,EAAE3P,QAAQ,EAAOwiH,GAAM7+G,KAAKgM,EAAE0uG,cA8B/E,MA1BAptH,GAAEiwB,KAAK/O,MAAMgD,EAAIo0B,GAAWxuB,KAAK,WAM/B5F,EAAGwtG,YACH,IAAIC,GAAmB,WACrBztG,EAAG0tG,YAAYL,GAAM7+G,KAAK,WACxB8+G,EAAgBvoG,QAAQ/H,MAAM/f,KAAM6N,aACnC0iB,MAAM,WACP8/F,EAAgBnoG,OAAOnI,MAAM/f,KAAM6N,aAIvC,IAAIkV,EAAG+nG,SAASh9G,OAAQ,CACtB,GAAI8sD,GAAS,EAAS,YAAc,OACpCr1D,IAAG8L,IAAI0oB,UAAU6gC,GAAQ73C,EAAG+nG,UAAUv5G,KAAK,SAAU0R,GACnDF,EAAG2tG,oBAAoBztG,GACvButG,UAGFA,OAIGH,GASTK,oBAAqB,SAAUztG,GAC7B,GAAIF,GAAK/iB,IACT,KAAK,GAAIuD,KAAMwf,GAAG+nG,SAAU,CAC1B,GAAIvsC,GAAUx7D,EAAG+nG,SAASvnH,GACtB0G,EAAOs0E,EAAQh7E,EACG,mBAAXg7E,KACXh5E,GAAGmnB,MAAMgqD,UAAU,SAAW3mE,QAAQwqB,KAAKG,UAAU6jD,IAAWt7D,EAAOhZ,IACvE8Y,EAAG+sG,UAAU7lH,EAAMgZ,EAAOhZ,GAAOs0E,EAAQuwC,kBAU7CyB,WAAY,WACV,GAAIxtG,GAAK/iB,IACT+iB,GAAG+nG,WAMH,KAAK,GAAIvjH,KAAKwb,GAAGxhB,MAAO,CACtB,GAAIg9E,GAAUv+E,KAAKuB,MAAMgG,EACzB,IAAIg3E,EAAwB,eAAG,CAC7B,GAAIt0E,GAAOs0E,EAAQh7E,GACf65E,EAAS73E,GAAGmnB,MAAMiqD,UAAU,SAAW5mE,QAAQwqB,KAAKG,UAAU6jD,IAC7DnB,GAGHr6D,EAAG+sG,UAAU7lH,EAAMmzE,EAAQmB,EAAQuwC,eAFnC/rG,EAAG+nG,SAASv3G,KAAKvT,KAAKuB,MAAMgG,OAcpCkpH,YAAa,SAAUL,GACrB,GAAIrtG,GAAK/iB,KAEL8gD,EAAU,EACd,KAAK,GAAIv9C,KAAMvD,MAAKuB,MAClBu/C,GAAW9gD,KAAKuB,MAAMgC,GAAU,IAGlC,IAAIiZ,GAAIjX,GAAGynB,UAAUnpB,OAAO,uCAC1BN,GAAMwf,EAAGxf,GACTwG,OAAUgZ,EAAGgoG,QACbnwD,OAAU73C,EAAGioG,QACbmF,QAAWptG,EAAGkoG,SACdn9F,YAAe/K,EAAG8nG,YAClBR,aAAkC,cAAlBtnG,EAAG8nG,YACnB/pE,QAAWA,EACXqqE,kBAAqBpoG,EAAGooG,oBACvB,EAAOiF,GAAM7+G,KAAK,SAAU3N,GAC7Bmf,EAAGgzF,MAAQnyG,GAGb,OAAO4Y,IAUT8zG,MAAO,WAGL,MAFAzxH,GAAE,IAAMmB,KAAKuD,IAAImtC,SACjB1wC,KAAK+1G,MAAQ,GACN/1G,MAYT8pE,QAAS,SAAU7/D,GACjBA,EAAOA,EAAKiY,aACZ,IAIIta,IAJS/I,EAAE,IAAMoL,GAIV,GAIX,QAHwBrC,EAApBqC,IAAQjK,MAAKuB,MAAcvB,KAAKuB,MAAM0I,GAAMrC,KACpC,cAGV,IAAK,QAGH,KACF,KAAK,kBACL,IAAK,cAEH,KACF,KAAK,OAEH,GAAI+oH,GAAc,GAAIprH,IAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW+rE,KAAKnnF,EAAMA,EACjE0mH,GAAY7mD,SACZ,MACF,KAAK,aACH,KACF,KAAK,OAGH,KACF,KAAK,YAEH,KACF,KAAK,aAaH,KACF,KAAK,OAEH,KACF,KAAK,YAQP,MAAO9pE,OAYTglB,UAAW,SAAUpd,GAEnB,OAAQA,GACN,IAAKyS,eAAc1B,KACjB,MAAO3Y,MAAK4wH,oBAEd,KAAKv2G,eAAcC,KACnB,QACE,MAAOta,MAAK6wH,0BAQlBA,sBAAuB,WACrB,GAKI5mH,GALAyC,GACFmtC,OAAQ,cACRx0B,cAIF,KAAKpb,IAAQjK,MAAKuB,MAChB,GAAI1C,EAAEuzB,cAAcpyB,KAAKuB,MAAM0I,IAC7B,IACE,GAA6B,QAAzBjK,KAAKuB,MAAM0I,GAAMrC,KAAgB,QACrC8E,GAAK2Y,WAAWpb,IAASjK,KAAKy5B,SAASxvB,GAAOjK,KAAK0pE,gBAAgBz/D,IACnE,MAAO7F,IAGb,MAAOsI,IAKTkkH,mBAAoB,WAClB,GAAI7tG,GAAK/iB,KACLijB,GACFoB,GAAItB,EAAGxf,GACPogH,QAAS,KACT7vD,QAAS,KACTg9D,MAAO,EACPC,OAAQ,KAWV9tG,GAAOujG,SAAW3nH,EAAEwkB,OAAO2tG,SAG3B,IAAIC,IACFzuD,MAAS,SACT0uD,gBAAmB,YACnBC,YAAe,YACf7iH,KAAQ,OACR8iH,KAAQ,QAGNjqB,EAAO79F,EAAEtJ,KAAKuB,OAAO63F,MAAM,QAC3B7kE,EAAWjrB,EAAEtJ,KAAKuB,OAAO63F,MAAM,MAC/B/iE,EAAS/sB,EAAEtJ,KAAKuB,OAAO+a,IAAI,SAAU4a,GACvC,OACEnY,MAAOgE,EAAG0W,SAASvC,EAAIjtB,MACvBoxB,aAActY,EAAG2mD,gBAAgBxyC,EAAIjtB,MACrCy+D,WAAW,EACXmnB,WAAY34D,EAAI43F,eAAiB53F,EAAI43F,cAAcj/B,WACnDjoF,KAAMqpH,EAAS/5F,EAAItvB,MACnB2sB,UAAW2C,EAAI3zB,MAMnB,OAFA5D,MAAKu3B,IAAM5tB,EAAEwsC,OAAOqxD,EAAM9wE,GAC1B12B,KAAK0xH,UAAY/nH,EAAEirB,EAAU4yE,GACtBlkF,GAWTquG,YAAa,SAAU5kH,GACrB,IAAKzC,OAAQyC,GAAK2Y,WAChB,GAAIxmB,EAAEuzB,cAAcpyB,KAAKuB,MAAM0I,OAC7B,IACE,GAA6B,QAAzBjK,KAAKuB,MAAM0I,MAAMrC,KAAgB,QACrC,KAAK8E,EAAK2Y,WAAWpb,MAAM8U,MAAO,QAClC/e,MAAKq5B,SAASpvB,KAAMyC,EAAK2Y,WAAWpb,MAAM,IAC1CjK,KAAKuxH,gBAAgBtnH,KAAKob,WAAY3Y,EAAKzC,MAAM,IACjD,MAAO7F,IAGb,MAAOpE,QAMX2rB,GAAOpC,YAAcA,GACpBjlB,OAAOumB,UAAUiC,WAAWxD;ACphD/B,cACA,SAAWqC,GACTA,EAAO2jG,aAELz/B,YACEtlC,QAAW,SAAUxrC,EAAO2jD,GAC1B,QAAK7jE,EAAE2V,KAAKuK,IAGdwR,MAAS5pB,EAAE,+BAIb6qH,QACEjnE,QAAW,SAAUxrC,EAAO2jD,GAC1B,QAAK5yD,cAAciP,IAGrBwR,MAAS5pB,EAAE,qCAIb8qH,SACElnE,QAAW,SAAUxrC,EAAO2jD,GAC1B,OAAI4D,MAAMvnD,IAAmB,IAATjR,QAGtByiB,MAAS5pB,EAAE,4CAIb+qH,UACEnnE,QAAW,SAAUxrC,EAAO2jD,GAC1B,OAAI4D,MAAMvnD,IAGZwR,MAAS5pB,EAAE,6CAIbgrH,SACEpnE,QAAW,SAAUxrC,EAAO2jD,GAC1B,QAAKkvD,EAAc7yG,IAGrBwR,MAAS5pB,EAAE,kDAIbkrH,KACEtnE,QAAW,SAAUxrC,EAAO2jD,EAASovD,GACnC,QAAI/yG,EAAQ+yG,IAGdvhG,MAAS5pB,EAAE,2CAIbjB,KACE6kD,QAAW,SAAUxrC,EAAO2jD,EAASovD,GACnC,QAAI/yG,EAAQ+yG,IAGdvhG,MAAS5pB,EAAE,2CAKf,IAAIirH,GAAgB,SAAUG,GAC5B,GAAIz8C,GAAK,2JACT,OAAOA,GAAGjqC,KAAK0mF,KAGhBztH,OAAOumB,UAAUiC,WAAWxD,MAAMC,YAAYxnB;ACzEjD,cACA,SAAW4pB,GAET,GAAIihE,GAAW,6CAmCX2H,EAAiB7yE,WAAWjgB,QAC9BlB,KAAM,SAAUgD,EAAIkqH,EAAaC,GAC/B1tH,KAAK8jB,OAAOvgB,GACPA,IAED1E,EAAEuzB,cAAc7uB,GAClB1E,EAAE4C,OAAOzB,KAAMuD,IAEfvD,KAAKuD,GAAKA,EACVvD,KAAKkhG,QAAYusB,EAAcA,EAAc,GAC7CztH,KAAK6tH,cAAkBH,EAAoBA,EAAoB,iBAKnEx6G,UAAW,iBACX3P,GAAI,GACJ29F,QAAS,GACT2sB,cAAe,cACfjqH,KAAM,GAQNC,OAAQ,WACN,GAAIof,GAAS,GACT+uG,GACF3tG,GAAMrkB,KAAKuD,GAAG2e,cACd+vG,QAAWjyH,KAAKkhG,QAChBgxB,cAAiBlyH,KAAK6tH,cAYxB,OATA53E,iBAAgB,iCAAkC+7E,EAAY,SAAU/qG,GAClEA,EAASsW,QACXta,EAASgE,EAASgB,OAAOrkB,KAEtB65B,YAAYxW,EAASgB,UAG5BjoB,KAAK6hB,KAAK,UACV7hB,KAAK4D,KAAOqf,EACLA,GASTouE,YAAa,SAAUrV,GAMrB,GAAIj5D,GAAK/iB,KAELijB,GADO+4D,GAAYj5D,EAAGovG,UACbtzH,EAAE0nB,WASf,OARKy1D,IAAUz2E,GAAGqL,MAAM,6BAExBrL,GAAGynB,UAAUnpB,OAAO+oF,EAAU5Q,GAAUzqE,KAAK,SAAU3N,GACrDmf,EAAGnf,KAAOA,EACVqf,EAAO6E,QAAQ/E,EAAGnf,MAClBmf,EAAGlB,KAAK,YAGHoB,IAKX0I,GAAO4oE,eAAiBA,GACvBjwF,OAAOumB,UAAUiC,WAAWxD,MAAMjE;AClHrC,cAsCA,SAAWsG,GAET,GAAIymG,GAAc1wG,WAAWjgB,QAC3BlB,KAAM,SAAUgD,EAAI6qH,EAAgBX,EAAaC,EAAmBC,EAAYU,GAEzE9qH,GAAIgC,GAAGqL,MAAM,oDAElB5Q,KAAK8jB,OAAOvgB,GACR1E,EAAEuzB,cAAc7uB,GAClB1E,EAAE4C,OAAOzB,KAAMuD,IAEV6qH,GAAgB7oH,GAAGqL,MAAM,oDAC9B5Q,KAAKuD,GAAKA,EACVvD,KAAKouH,eAAmBA,EAAiBA,EAAiB,MAC1DpuH,KAAKkhG,QAAYusB,EAAcA,EAAc,GAC7CztH,KAAK6tH,cAAkBH,EAAoBA,EAAoB,eAC/D1tH,KAAK26B,OAAWgzF,EAAaA,EAAa,GAC1C3tH,KAAKsuH,gBAAkBD,GAAoBA,IAK/Cn7G,UAAW,cACX3P,GAAI,GACJ6qH,eAAgB,GAChBltB,QAAS,GACT2sB,cAAe,eACflzF,OAAQ,GACR2zF,eAAe,EACf1qH,KAAM,GAQNC,OAAQ,WACN,GAAIof,GAAS,GACT+uG,GACF3tG,GAAMrkB,KAAKuD,GAAG2e,cACdmwG,SAAYryH,KAAKouH,eACjB6D,QAAWjyH,KAAKkhG,QAChBgxB,cAAiBlyH,KAAK6tH,cACtByE,OAAUtyH,KAAK26B,OACf43F,cAAiBvyH,KAAKsuH,cAYxB,OATAr4E,iBAAgB,qCAAsC+7E,EAAY,SAAU/qG,GACtEA,EAASsW,QACXta,EAASgE,EAASgB,OAAOrkB,KAEtB65B,YAAYxW,EAASgB,UAG5BjoB,KAAK6hB,KAAK,UACV7hB,KAAK4D,KAAOqf,EACLA,IAKX0I,GAAOymG,YAAcA,GACpB9tH,OAAOumB,UAAUiC,WAAWxD,MAAMjE;ACrGrC,cACA,SAAWsG,GACT,GAAIihE,GAAW,gCAuCXwE,EAAO1vE,WAAWjgB,QACpBlB,KAAM,SAAUgD,EAAI8yB,EAAQm4F,EAAmBC,EAAoBC,GAC5DnrH,IAELvD,KAAK8jB,OAAOvgB,GACR1E,EAAEuzB,cAAc7uB,GAClB1E,EAAE4C,OAAOzB,KAAMuD,IAEV8yB,GAAQ9wB,GAAGqL,MAAM,oDACtB5Q,KAAKuD,GAAKA,EACVvD,KAAKq2B,OAASA,EAEdr2B,KAAK2uH,cAAkBH,EAAoBA,KAC3CxuH,KAAK4uH,eAAmBH,EAAqBA,KAC7CzuH,KAAK6rG,WAAa6iB,GAGhB1uH,KAAK6rG,YAAa,IACpB7rG,KAAKq2B,OAAO,IAAQ,MAKxBnjB,UAAW,OACX3P,GAAI,GACJ8yB,QAASkoB,EAAK53C,EAAE,UAChBgoH,iBACAC,kBACA/iB,UAAU,EASVhoG,OAAQ,WACN,GAAIof,GAAS,GAET+uG,GACF3tG,GAAMrkB,KAAKuD,GAAG2e,cACdi0C,OAAUn2D,KAAKq2B,OACfm8F,cAAiBxyH,KAAK2uH,cACtB8D,eAAkBzyH,KAAK4uH,eACvB8D,SAAY1yH,KAAK6rG,SAYnB,OATA51D,iBAAgB,uBAAwB+7E,EAAY,SAAU/qG,GACxDA,EAASsW,QACXta,EAASgE,EAASgB,OAAOrkB,KAEtB65B,YAAYxW,EAASgB,UAG5BjoB,KAAK6hB,KAAK,UACV7hB,KAAK4D,KAAOqf,EACLA,GAWTouE,YAAa,SAAUrV,GAMrB,GAAIj5D,GAAK/iB,KAELijB,GADO+4D,GAAYj5D,EAAGovG,UACbtzH,EAAE0nB,WASf,OARKy1D,IAAUz2E,GAAGqL,MAAM,6BAExBrL,GAAGynB,UAAUnpB,OAAO+oF,EAAU5Q,GAAUzqE,KAAK,SAAU3N,GACrDmf,EAAGnf,KAAOA,EACVqf,EAAO6E,QAAQ/E,EAAGnf,MAClBmf,EAAGlB,KAAK,YAGHoB,IAIX0I,GAAOylE,KAAOA,GACb9sF,OAAOumB,UAAUiC,WAAWxD,MAAMjE;ACnIrC,cACA,SAAWsG,GAET,GAAIihE,GAAW,8CAyCX7lB,EAAkBrlD,WAAWjgB,QAC/BlB,KAAM,SAAUgD,EAAI8jD,EAAeomE,EAAaC,EAAmBC,GACjE3tH,KAAK8jB,OAAOvgB,GACPA,IAED1E,EAAEuzB,cAAc7uB,GAClB1E,EAAE4C,OAAOzB,KAAMuD,IAEV8jD,GAAe9hD,GAAGqL,MAAM,oDAC7B5Q,KAAKuD,GAAKA,EACVvD,KAAKqnD,cAAkBA,EAAgBA,EAAgB,MACvDrnD,KAAKkhG,QAAYusB,EAAcA,EAAc,GAC7CztH,KAAK6tH,cAAkBH,EAAoBA,EAAoB,eAC/D1tH,KAAK26B,OAAWgzF,EAAaA,EAAa,MAK9Cz6G,UAAW,kBACX3P,GAAI,GACJ8jD,cAAe,GACf65C,QAAS,GACT2sB,cAAe,eACflzF,OAAQ,GACR/2B,KAAM,GAQNC,OAAQ,WACN,GAAIof,GAAS,GACT+uG,GACF3tG,GAAMrkB,KAAKuD,GAAG2e,cACdqC,cAAiBvkB,KAAKqnD,cACtB4qE,QAAWjyH,KAAKkhG,QAChBgxB,cAAiBlyH,KAAK6tH,cACtByE,OAAUtyH,KAAK26B,OAYjB,OATAsb,iBAAgB,kCAAmC+7E,EAAY,SAAU/qG,GACnEA,EAASsW,QACXta,EAASgE,EAASgB,OAAOrkB,KAEtB65B,YAAYxW,EAASgB,UAG5BjoB,KAAK6hB,KAAK,UACV7hB,KAAK4D,KAAOqf,EACLA,GAUTouE,YAAa,SAAUrV,GAMrB,GAAIj5D,GAAK/iB,KAELijB,GADO+4D,GAAYj5D,EAAGovG,UACbtzH,EAAE0nB,WASf,OARKy1D,IAAUz2E,GAAGqL,MAAM,6BAExBrL,GAAGynB,UAAUnpB,OAAO+oF,EAAU5Q,GAAUzqE,KAAK,SAAU3N,GACrDmf,EAAGnf,KAAOA,EACVqf,EAAO6E,QAAQ/E,EAAGnf,MAClBmf,EAAGlB,KAAK,YAGHoB,IAKX0I,GAAOo7C,gBAAkBA,GACxBziE,OAAOumB,UAAUiC,WAAWxD,MAAMjE;AChIrC,cAYA,SAAWsG,GACT,GAAIgnG,GAAkBjxG,WAAWjgB,QAO/BlB,KAAM,SAAU0/G,GACdjgH,KAAK8jB,OAAOm8F,GACZjgH,KAAK0jH,SAAW7kH,EAAEohH,GAClBjgH,KAAKiK,KAAOjK,KAAK0jH,SAAS3+G,KAAK,SAIjCmO,UAAW,kBACXjJ,KAAM,GACN8rC,SAAU,GAGV2tE,YAEAkP,iBAEAC,wBAAyB,kBASzBC,SAAU,WACR,OAAQ9yH,KAAK0jH,SAAS3+E,GAAG,aAU3Bo6C,UAAW,WACT,OAAQn/E,KAAK0jH,SAASjkH,SAAS,aAWjC42D,WAAY,WACV,MAAOr2D,MAAK0jH,SAASjkH,SAAS,aAUhCwC,KAAM,WAGJ,MAFAjC,MAAK0jH,SAASzhH,OACdjC,KAAK6hB,KAAK,QACH7hB,MAUTM,KAAM,WAGJ,MAFAN,MAAK0jH,SAASpjH,OACdN,KAAK6hB,KAAK,QACH7hB,MAWTkkH,SAAU,SAAUz8G,GAGlB,MAFAzH,MAAK0jH,SAASx/G,KAAK,QAAQuD,KAAKA,GAChCzH,KAAK6hB,KAAK,UACH7hB,MAUTikH,SAAU,WACR,MAAOjkH,MAAK0jH,SAASx/G,KAAK,QAAQuD,QAapC08G,WAAY,SAAU18G,GACpB,GAAIsb,GAAK/iB,KACL4pG,EAAQ7mF,EAAGkhG,WACX1L,EAAU9wG,CAOd,OALI8wG,KAAY3O,IACd2O,EAAU3O,EAAQ,KAAO2O,GAE3Bx1F,EAAG2gG,SAAS3+G,KAAK,QAASwzG,GAC1Bx1F,EAAGlB,KAAK,UACDkB,GAWTgwG,WAAY,WACV,MAAO/yH,MAAK0jH,SAAS3+G,KAAK,UAuB5BiuH,QAAS,SAAU5hG,GAEjB,GAAIA,EAAKhmB,QAAQ,QAAS,EAAI,CAE5B,GAAI6nH,GAAWjzH,KAAK0jH,SAASx/G,KAAK,MAElC,IAAuB,GAAnB+uH,EAASnlH,OAAa,CACxBmlH,EAASviF,QACT,IAAIxqC,GAAalG,KAAK0jH,SAASx/G,KAAK,OAAOrC,OAC3CqE,GAAW4iD,QAAQ,WAGjB13B,EAAKhmB,QAAQ,oBAAqB,IACpCgmB,EAAOA,EAAKtc,UAAUsc,EAAKhmB,QAAQ,MAAQ,IAG7CpL,KAAK0jH,SAASx/G,KAAK,KAAKrC,QAAQvC,cAAcI,SAAS0xB,OAEpD,CACH,GAAI8hG,GAAclzH,KAAK0jH,SAASx/G,KAAK,KAAKrC,OAC1C,IAA2B,IAAvBqxH,EAAYplH,OAAc,CAC5B,GAAI5H,GAAalG,KAAK0jH,SAASx/G,KAAK,OAAOrC,OAC3CqxH,GAAYxiF,SACZxqC,EAAW4iD,QAAQ,2FAA6F13B,EAAO,sBAEpH,CACH,GAAI+hG,GAAcnzH,KAAK0jH,SAASx/G,KAAK,OAAOrC,OAC5CsxH,GAAYpuH,KAAK,aAAc,IAAMqsB,IAKzC,MADApxB,MAAK6hB,KAAK,UACH7hB,MAUTozH,QAAS,WAEP,GAAIH,GAAWjzH,KAAK0jH,SAASx/G,KAAK,MAElC,OAAwB,KAApB+uH,EAASnlH,OACJmlH,EAAS3qF,SAAS,OAAOvjC,KAAK,cAAcoX,OAAO,GAErDnc,KAAK0jH,SAASx/G,KAAK,KAAKrC,QAAQkD,KAAK,UAoB9C9B,MAAO,SAAUowH,GAQf,MANIx0H,GAAE8jB,WAAW0wG,IACfrzH,KAAKszH,qBAAqBtzH,KAAK0jH,UAC/B1jH,KAAKwiB,OAAO,SAASL,KAAK,QAASkxG,IAEnCrzH,KAAK0jH,SAASzgH,QAETjD,MAITuzH,eAAgB,WACd,GAAKvzH,KAAKwzH,aACV,MAAO,IAAKvsH,UAASjH,KAAKwzH,cAAe3zH,KAAKG,KAAK0jH,SAASv5G,IAAI,KAOlEspH,cAAe,SAAUpwH,GACvB,GAAIzC,GAAYyC,EAAM1D,KAAKiB,UACvBqJ,EAAO5G,EAAM1D,KAAK+zH,WAClBluC,EAAUniF,EAAM1D,KAAK+2G,SACrBid,EAAwBtwH,EAAM1D,KAAKg0H,qBAEnCnuC,GAAQ3jE,KAAKjhB,EAAWqJ,EAAM0pH,MAA2B,GAAuB,UAAd/yH,GACpE4kF,EAAQ+tC,eAAe1zH,KAAK2lF,IAgBhCrjE,KAAM,SAAU9e,EAAO+5B,GACrB,GAAIs5E,GAAW12G,IAWf,OAVc,UAAVqD,GAAmBrD,KAAK4zH,qBAE5B5zH,KAAK8jB,OAAOzgB,EAAO+5B,GAEnBp9B,KAAK0jH,SAASlhG,OAAOnf,EAAOrD,KAAK6zH,cAAc1xG,KAAK9e,GAClDqzG,SAAYA,EACZ91G,UAAayC,EACbqwH,WAAchd,EAASzsG,KACvB0pH,sBAAyB90H,EAAEiI,MAAM4vG,EAAS6c,eAAgB7c,IACzD12G,KAAKyzH,eACDzzH,MAUTszH,qBAAsB,SAAUQ,GAE9BA,EAAQ7pF,WAAW,WACnB6pF,EAAQznF,KAAK,UAAW,MAExBynF,EAAQjzH,IAAI,UAWdipE,QAAS,WAOP,MANI9pE,MAAKm/E,cACPn/E,KAAK+zH,eACL/zH,KAAK0jH,SAASlhG,OAAO,SACrBxiB,KAAK0jH,SAAShkH,SAAS,YAAYJ,YAAY,SAC/CU,KAAK6hB,KAAK,YAEL7hB,MAUT+pE,OAAQ,WAMN,MALK/pE,MAAKm/E,cACRn/E,KAAK0jH,SAASpkH,YAAY,YAC1BU,KAAKg0H,iBACLh0H,KAAK6hB,KAAK,WAEL7hB,MAWT+zH,aAAc,WAKZ,MAJA/zH,MAAK4zH,qBACL5zH,KAAK4yH,cAAgB5yH,KAAK4hB,QAE1B5hB,KAAK4hB,WACE5hB,MAST4zH,mBAAoB,WACd5zH,KAAK0jH,SAAS7sE,QAAQ,YACI,OAAxBtxC,GAAGC,IAAI4M,QAAQnI,MAA0C,MAAzB1E,GAAGC,IAAI4M,QAAQ+iD,QACjDn1D,KAAKwzH,aAAexzH,KAAK0jH,SAAS3+G,KAAK,WACvC/E,KAAK0jH,SAASz5E,WAAW,aAc/B+pF,eAAgB,WAEd,GADAh0H,KAAKi0H,uBACDp1G,OAAOsoF,KAAKnnG,KAAK4yH,eAAe9kH,OAAS,EAAG,CAC9C9N,KAAK4hB,QAAU5hB,KAAK4yH,cACpB5yH,KAAK4yH,gBAEL,IAAIlc,GAAW12G,IACf,KAAK,GAAIqD,KAASrD,MAAK4hB,QACjB5hB,KAAK4hB,QAAQ3B,eAAe5c,IAC9BrD,KAAK0jH,SAASvhG,KAAK9e,EAAO,WACxBqzG,EAAS70F,KAAKxe,EAAOqzG,EAASzsG,QAMtC,MAAOjK,OAUTi0H,qBAAsB,WACM,KAAtBj0H,KAAKwzH,cACPxzH,KAAK0jH,SAAS3+G,KAAK,UAAW/E,KAAKwzH,gBAMzC7nG,GAAOgnG,gBAAkBA,GAExBruH,OAAOumB,UAAUiC,WAAWgH;AC/a/B,cAcA,SAAWnI,GAET,GAAIuoG,GAAiB,qBACjBC,EAAgB,oBAGhBC,EAAgC,EAGhCC,EAAqB,EAGrBC,EAAkB,EAGlBC,EAAqB,EAErBl/F,EAAgB1J,EAAOmB,WAAWgH,SAAS6+F,gBAAgBlxH,QAC7DlB,KAAM,SAAU0/G,GACdjgH,KAAK8jB,OAAOm8F,GACZjgH,KAAK+1C,SAAWroC,OAAO1N,KAAK6yH,wBAAyBqB,EAAgBl0H,KAAKiK,MAC1EjK,KAAKqoC,UAAYroC,KAAK0jH,SAAS9hH,QAAQuyH,GAAepvH,KAAK,QAC3D/E,KAAKw0H,QAAUx0H,KAAK0jH,SAAS9hH,QAAQuyH,GAKhCn0H,KAAK0jH,SAAS/jH,KAAK,SACtBK,KAAK0jH,SAAS/jH,KAAK,OAAQK,KAAK0jH,SAASx/G,KAAK,KAAKa,KAAK,UAEtD/E,KAAKy0H,WACPz0H,KAAK00H,kBAIP10H,KAAK20H,cAAgB30H,KAAK0jH,SAAS/jH,KAAK,gBACxCK,KAAK40H,aAAe50H,KAAK0jH,SAAS/jH,KAAK,cACvC,IAAIk1H,GAAc70H,KAAK0jH,SAAS/jH,KAAK,cACjCk1H,KACF70H,KAAK80H,aAAeD,GAItB70H,KAAK+0H,cAAgB/0H,KAAK0jH,SAAS/jH,KAAK,gBACxCK,KAAKg1H,MAAQh1H,KAAK0jH,SAAS/jH,KAAK,SAIlCuT,UAAW,gBACXm1B,UAAW,GACX4sF,aAAa,EACbT,QAAS,KACThB,aAAc,GACd0B,cAAc,EACdP,cAAe,KACfC,aAAc,KACdG,cAAe,GACfC,MAAO,GACPF,aAAc,KAMdK,WAAY,SAAUC,EAAWC,EAAYjzB,EAAMkzB,GACjD,GAAMF,EACJp1H,KAAK0jH,SAASx/G,KAAK,KAAK5E,cAAcI,SAAS01H,OAE/C,IAAMC,EAAY,CAChB,GAAIE,GAAUF,EAAWpmH,MAAM,KAAK,EAChCsmH,GAAQnqH,QAAQ,IAAMg3F,MAAU,GAClCmzB,EAAUA,EAAQrnH,QAAQ,IAAMk0F,EAAM,IAAMkzB,GAC5CC,GAAW,QAEXA,GAAW,IAAMD,EAAK,OAExBt1H,KAAK0jH,SAASx/G,KAAK,KAAK5E,cAAcI,SAAS61H,KAUrDb,gBAAiB,WACf,GAAIc,GAAkBx1H,KAAK0jH,SAAS/jH,KAAK,aACrC81H,EAAkBz1H,KAAK0jH,SAAS/jH,KAAK,OACzCK,MAAKm1H,WAAWK,EAAiBC,EAAiB,KAAM,OAQ1DC,gBAAiB,WACf,GAAIF,GAAkBx1H,KAAK0jH,SAAS/jH,KAAK,aACrC81H,EAAkBz1H,KAAK0jH,SAAS/jH,KAAK,OACzCK,MAAKm1H,WAAWM,EAAiBD,EAAiB,KAAM,OAU1DG,aAAc,SAAUn8B,GACtB,GAAIz2E,GAAK/iB,IAKT,OAJA+iB,GAAG2gG,SAASpkH,YAAY,gBAAgBI,SAAS,sBACjDqjB,EAAG2xG,kBACH71H,EAAEkkB,EAAG2gG,UAAUzlD,UAAUu7B,GACzBz2E,EAAGmyG,cAAe,EACXnyG,GAUT6yG,gBAAiB,SAAUp8B,GACzB,GAAIz2E,GAAK/iB,IAKT,OAJA+iB,GAAG2gG,SAASpkH,YAAY,sBAAsBI,SAAS,gBACvDqjB,EAAG2yG,kBACH72H,EAAEkkB,EAAG2gG,UAAU/vG,aAAa6lF,GAC5Bz2E,EAAGmyG,cAAe,EACXnyG,GAUT8yG,gBAAiB,WACf,GAAI9yG,GAAK/iB,KACL81H,EAAoB/yG,EAAGyxG,QAAQtwH,KAAK,iBAAiB4J,OACrDioH,EAAsB,wBACtBC,EAAejzG,EAAG2gG,SAASuS,QAAQF,EACvC,KAAKhzG,EAAG0xG,YAAcqB,EAAoB,GAAKE,EAAaloH,OAAS,GAAI,CACvE,GAAIiV,EAAGyxG,QAAQtwH,KAAK,mBAAmB4J,OAAS,GAAKkoH,EAAaloH,OAAS,GACzE,GAAIkoH,EAAa9xH,KAAK,uBAAuB4J,OAAS,EAEpDiV,EAAG4yG,aAAaK,OAEhB,IAAIF,EAAoB,GAAK/yG,EAAG2gG,SAAS9hF,OAAOmD,GAAG,iBAAkB,CAGnE,GAAIy0D,GAAU36F,EAAE,qCAChB26F,GAAQ7lF,aAAaqiH,GACrBjzG,EAAG4yG,aAAan8B,QAGf,CAGL,GAAIA,GAAU36F,EAAE,qCAChBkkB,GAAGyxG,QAAQx1H,OAAOw6F,GAClBz2E,EAAG4yG,aAAan8B,GAElBrnF,OAAO4Q,EAAGyxG,QAAQ,IAEpB,MAAOzxG,IAQTmzG,gBAAiB,WACf,GAAInzG,GAAK/iB,IAOT,OANI+iB,GAAG0xG,YACL1xG,EAAGozG,SAAWpzG,EAAG2gG,SAASjwG,OAAO,mBACjCsP,EAAG6yG,gBAAgB7yG,EAAGozG,UAC4B,GAA9CpzG,EAAGozG,SAASjyH,KAAK,mBAAmB4J,QAAaiV,EAAGozG,SAASzlF,SACjEv+B,OAAO4Q,EAAGyxG,QAAQ,KAEbzxG,GAWTqzG,UAAW,SAAUC,GACnB,OAAQA,GACN,IAAKhhH,QAAOE,MACV,MAAOvV,MAAK61H,iBACd,KAAKxgH,QAAOC,MACV,MAAOtV,MAAKk2H,oBAUlBI,gBAAiB,WACf,MAAOt2H,MAAK20H,eASd4B,eAAgB,WACd,MAAOv2H,MAAK40H,cASd4B,iCAAkC,WAChC,GAAIzzG,GAAK/iB,IACT,SAAI+iB,EAAG+xG,cACE2B,QAAQ1zG,EAAG+xG,aAAeV,IAWrCsC,sBAAuB,WACrB,GAAI3zG,GAAK/iB,IACT,QAAI+iB,EAAG+xG,cACE2B,QAAQ1zG,EAAG+xG,aAAeT,IAWrCsC,mBAAoB,WAClB,GAAI5zG,GAAK/iB,IACT,QAAI+iB,EAAG+xG,cACE2B,QAAQ1zG,EAAG+xG,aAAeR,IAWrCsC,sBAAuB,WACrB,GAAI7zG,GAAK/iB,IACT,QAAI+iB,EAAG+xG,cACE2B,QAAQ1zG,EAAG+xG,aAAeP,IAarC/9F,OAAQ,WAEN,MADAx2B,MAAK0jH,SAAShkH,SAAS,YAChBM,MAWT62H,SAAU,WAER,MADA72H,MAAK0jH,SAASpkH,YAAY,YACnBU,MAWTq2D,WAAY,WACV,MAAOr2D,MAAK0jH,SAASjkH,SAAS,aAWhCg1H,QAAS,WACP,MAAOz0H,MAAK0jH,SAASjkH,SAAS,uBAUhCqN,MAAO,WAEL,MADA9M,MAAKqoC,UAAYroC,KAAK0jH,SAAS9hH,QAAQuyH,GAAepvH,KAAK,QACpD4mB,EAAOoD,QAAQviB,QAAQ8oB,OAAOt1B,KAAKqoC,YAI5CplC,MAAO,SAAUowH,GAKf,MAJIx0H,GAAE8jB,WAAW0wG,IACfrzH,KAAKwiB,OAAO,SAEdxiB,KAAK8jB,OAAOuvG,GACLrzH,MAITmiB,KAAM,SAAU9e,EAAO+5B,GAMrB,MALAp9B,MAAK8jB,OAAOzgB,EAAO+5B,GACfp9B,KAAKi1H,aAAwB,SAAT5xH,IACtBrD,KAAK0jH,SAASz5E,WAAW,WACzBjqC,KAAK0jH,SAASr3E,KAAK,UAAW,OAEzBrsC,MAWTM,KAAM,WACJ,GAAIyiB,GAAK/iB,IAKT,OAJA+iB,GAAGe,SACuD,IAAtDf,EAAGyxG,QAAQtwH,KAAK,2BAA2B4J,QAC7CiV,EAAGjW,QAAQgqH,oBAEN/zG,GAWT9gB,KAAM,WACJ,GAAI8gB,GAAK/iB,IAKT,OAJA+iB,GAAGe,SACCf,EAAGyxG,QAAQtwH,KAAK,2BAA2B4J,OAAS,GACtDiV,EAAGjW,QAAQiqH,oBAEN/2H,MAUT8pE,QAAS,WACP,GAAI/mD,GAAK/iB,IACT+iB,GAAGe,SACHf,EAAGi0G,kBAULjtD,OAAQ,WACN,GAAIhnD,GAAK/iB,IACT+iB,GAAGe,SACHf,EAAGi0G,kBAYLC,SAAU,SAAU1jE,EAAM2jE,GACxB,GAAIn0G,GAAK/iB,IACT+iB,GAAGiyG,MAAQzhE,EACXxwC,EAAGgyG,cAAgBmC,EACnBn0G,EAAGi0G,kBAWLA,eAAgB,WACd,GAAIj0G,GAAK/iB,MACJ+iB,EAAGo8D,aAAep8D,EAAGgyG,cACxBhyG,EAAGohG,WAAWphG,EAAGgyG,eAEbhyG,EAAGiyG,MACLjyG,EAAGohG,WAAWphG,EAAGiyG,OAEjBjyG,EAAGohG,WAAWphG,EAAGkhG,cAMzBt4F,GAAOmB,WAAWgH,SAAStnB,QAAQ6oB,cAAgBA,GAClD/wB,OAAOumB;AC5dV,YAWA,IAAIssG,kBAEFC,qBAAsB,EAEtBC,sBAAuB,EAEvBC,SAAU,EAEVC,KAAM,IAeR,SAAW5rG,GACT,GAAI6rG,GAA4B,qBAC5BrD,EAAgB,oBAChBsD,EAAoB,wBACpBC,EAAsB,2BACtBC,EAA0B,uCAC1BC,EAAsB,yBACtBC,EAAqBh5H,EAAE24H,GACvBM,EAA2B,wBAC3BC,EAAsB,sBAG1BpsG,GAAO2tC,MAAQ,GAEf,IAAI9jC,GAAe7J,EAAOmB,WAAWgH,SAAS6+F,gBAAgBlxH,QAC5DlB,KAAM,SAAU0/G,GACdjgH,KAAK8jB,OAAOm8F,GACZjgH,KAAK+1C,SAAWroC,OAAO1N,KAAK6yH,wBAAyBsB,EAAen0H,KAAKiK,MACzEjK,KAAKg4H,OAASrsG,EAAO2tC,OAAS,EAC9Bt5D,KAAKi4H,SAAWj4H,KAAK0jH,SAAS3+G,KAAK,aAKrCkzH,SAAU,KACVC,cAAc,EACdF,OAAQ,EACR9kH,UAAW,eAUXksG,aAAc,SAAUsU,EAAYyE,GAClC,GAAIC,GAAYzsG,EAAOoD,QAAQviB,QAAQ0mB,QAAQisF,OAAOn/G,KAAKiK,KAAMypH,EAAYyE,EAC7E,OAAOC,IAUT93H,KAAM,WAGJ,MAFAN,MAAK8jB,SACL9jB,KAAK82H,oBACE92H,MAUTiC,KAAM,WAGJ,MAFAjC,MAAK8jB,SACL9jB,KAAK+2H,oBACE/2H,MAYTkkH,SAAU,SAAUz8G,GAGlB,MAFAzH,MAAK0jH,SAASp7E,SAASovF,GAAqBxzH,KAAK,QAAQuD,KAAKA,GAC9DzH,KAAK6hB,KAAK,UACH7hB,MAWTikH,SAAU,WACR,MAAOjkH,MAAK0jH,SAASp7E,SAASovF,GAAqBxzH,KAAK,QAAQuD,QASlE4wH,SAAU,WACR,IAAKr4H,KAAK06F,cAAe,CAEvB,GAAI33E,GAAK/iB,KACLs4H,EAAoB,eACpBC,EAAqB,qBAEzBV,GAAmB3zH,KAAKq0H,EAAqB,YAAYj4H,MACzD,IAAIiB,GAAQvB,KAAK0jH,SAASp7E,SAASqvF,GAAyBh9F,OAAO,YAC/D69F,EAAgBj3H,EAAM2C,KAAK6zH,GAC3BU,EAAal3H,EAAM2C,KAAK0zH,EAE5B,MAAIr2H,EAAMuM,OAAS2qH,EAAW3qH,OAAS,GAA8B,IAAzB0qH,EAAc1qH,QA4BxD,MAAO9N,KA3BP,IAAI04H,GAAiB14H,KAAK0jH,SAASp7E,SAASovF,EAC5CgB,GAAeh1H,IAAI,UAAW40H,GAAmB91G,OAAO,SAASL,KAAK,QAAS,SAAUw2G,GACvFA,EAAIv5H,iBACJ,IAAIc,GAAOrB,EAAEmB,MAAMi2H,QAAQsC,EAC3B,IAA2B,QAAvBr4H,EAAKwD,IAAI,WACXxD,EAAKI,WACA,CACL,GAAIs4H,GAAW/5H,EAAEqG,UAAUjE,OAC3BpC,GAAE05H,GAAoBj4H,OACtBJ,EAAK+B,MACL,IAAI42H,GAAa91G,EAAG2gG,SAASx/G,KAAK,2BAA2BR,IAAI,OAAQ,IACrEo1H,EAAWD,EAAW53H,OACtB63H,GAAYF,EAAWC,EAAW1zH,WAAW/B,MAAOy1H,EAAWn1H,IAAI,OAAQk1H,EAAWE,MAI9FJ,EAAezC,QAAQ0B,GAAyB1sH,MAAM,WAAcpM,EAAEmB,MAAMN,SAAS,UAAa,WAAcb,EAAEmB,MAAMV,YAAY,WAEpIU,KAAK0jH,SAAS1kH,OAAO0O,OAAOpB,GAAGE,QAAQO,eAAgB/M,KAAKg4H,OAAQh4H,KAAK0jH,SAAShgH,IAAI,SAEtF,IAAIq1H,GAAYl6H,EAAE,YAAcmB,KAAKg4H,OACrCz2H,GAAMwtD,SAASgqE,GACf5mH,OAAO4mH,EAAU,IAEjB/4H,KAAKk4H,cAAe,EACpBl4H,KAAK6hB,KAAK,YAKZ7hB,KAAKg5H,eAAen6H,EAAE,oBACtB0C,EAAM0J,MAAM,WAAcpM,EAAEmB,MAAMN,SAAS,UAAa,WAAcb,EAAEmB,MAAMV,YAAY,WAE5F,MAAOU,OAUTg5H,eAAgB,SAAUC,GACxB,GAAIC,GAAS,SAAUpF,GACrBA,EAAQtxG,OAAO,kBAAkBL,KAAK,iBAAkB,WACtD82G,EAAO34H,SAIXgG,YAAW,WACT,GAAI6yH,GAAgBt6H,EAAE,UAAUsgD,WAAWh1C,IAAI,GAC3CivH,EAASv6H,EAAEs6H,EACfD,GAAOE,IACN,KAEHF,EAAOr6H,EAAE,QAET,IAAImH,EAUJ,OATAizH,GACGp4H,IAAI,uBAAuBA,IAAI,uBAC/BC,GAAG,sBAAuB,WAAkBkF,GAAUC,aAAaD,KACnElF,GAAG,sBAAuB,WACzBkF,EAAWM,WACN,WACE2yH,EAAO34H,QACN,OAELN,MAWTq5H,oBAAqB,WACnB,GAAI7/B,GAAUx5F,KAAK0jH,SAASx/G,KAAK,sBAAsBoyB,IAAI,aAAausC,MACxE,IAAI22B,EAAQ1rF,OAAS,EAAG,CACtB,GAAIwrH,IAAgB,CACpB9/B,GAAQt1F,KAAK0zH,EAAsB,UAAU73H,KAAK,SAAUwH,EAAGV,GAC7D,GAAuB,GAAnBhI,EAAEmB,MAAMiB,QAAc,MAAOq4H,IAAgB,IAGnD9/B,EAAQ95F,SAAS,YACZ45H,GAAe9/B,EAAQ95F,SAAS,WAKvC,MADA85F,GAAUx5F,KAAK0jH,SAASx/G,KAAK,sBAAsBoyB,IAAI,aAAausC,OAC9C,GAAlB22B,EAAQ1rF,QASdyrH,cAAe,WACb,GAAIv5H,KAAK0jH,SAASp7E,SAAS,iBAAiBhS,IAAI,WAAWxoB,OAAS,EAAuD,MAAlD9N,MAAKw5H,KAAKrC,gBAAgBE,wBAA+B,CAClI,IAAIr3H,KAAK0jH,SAASp7E,SAAS,mBAAmBhS,IAAI,aAAaxoB,OAAS,EAAsD,MAAjD9N,MAAKw5H,KAAKrC,gBAAgBC,uBAA8B,CACrI,KAAKp3H,KAAK06F,cAAe,CACvB,KAAO16F,KAAK0jH,SAASp7E,SAAS,4BAA4Bx6B,OAAS,GAAK9N,KAAKy5H,OAAOtC,gBAAgBC,qBACpG,MAAOp3H,KAAK0jH,SAASx/G,KAAK,0BAA0B4J,OAAS,GAAK9N,KAAKy5H,OAAOtC,gBAAgBE,sBAE9F,OADAr3H,MAAKw5H,KAAKrC,gBAAgBG,WACnB,EAET,OAAO,GAGToC,aAAc,WACZ,GAAI15H,KAAK06F,cAAe,CAEtB,IADA16F,KAAKy5H,OAAOtC,gBAAgBG,UACrBt3H,KAAK0jH,SAASp7E,SAAS,iBAAiBhS,IAAI,WAAWxoB,OAAS,GAAK9N,KAAKw5H,KAAKrC,gBAAgBE,sBACtG,MAAOr3H,KAAK0jH,SAASp7E,SAAS,mBAAmBhS,IAAI,aAAaxoB,OAAS,GAAK9N,KAAKw5H,KAAKrC,gBAAgBC,qBAC1G,QAAO,EAET,MAAIp3H,MAAK0jH,SAASp7E,SAAS,4BAA4Bx6B,OAAS,GAAK9N,KAAKy5H,OAAOtC,gBAAgBC,uBAA8B,GAC3Hp3H,KAAK0jH,SAASx/G,KAAK,0BAA0B4J,OAAS,IAAK9N,KAAKy5H,OAAOtC,gBAAgBE,wBAA+B,IAQ5HsC,qBAAsB,WACpB,GAAIngC,GAAUx5F,KAAK0jH,SAASx/G,KAAK,+BAA+B2+D,MAChE,OAAI22B,GAAQ1rF,OAAS,IACnB0rF,EAAQl6F,YAAY,YAGtBk6F,EAAUx5F,KAAK0jH,SAASx/G,KAAK,+BAA+B2+D,OACtC,GAAlB22B,EAAQ1rF,SASd8rH,qBAAsB,WACpB,GAAIC,GAAgB75H,KAAK0jH,SAASx/G,KAAK,oBAAoBoyB,IAAI,UAC/D,IAA4B,GAAxBujG,EAAc/rH,OAAa,OAAO,CACtC,IAEIvG,GAFA2rB,EAAUlzB,KAAKs/G,aAGfpkF,EAAQ3zB,EAAKsyH,EAAc/rH,OAAS,EAAI+rH,EAAc/rH,OAAS,EAAI,CACvE,KAAKvG,EAAI,EAAGA,GAAK2zB,EAAO3zB,IAAK,CAC3B,GAAIqjC,GAAU/rC,EAAEg7H,EAAcA,EAAc/rH,OAASvG,EAAI,IACrDmsH,EAAa9oF,EAAQ7lC,KAAK,OAM9B,IALImuB,EAAQjT,eAAeyzG,IACU,mBAAxBxgG,GAAQwgG,IACjBxgG,EAAQwgG,GAAY0C,UAAU/gH,OAAOE,OAEzCq1B,EAAQlrC,SAAS,UACbkrC,EAAQhJ,OAAOmD,GAAG,mBAAoB,MAI5C,MADA80F,GAAgB75H,KAAK0jH,SAASx/G,KAAK,iBAAiBoyB,IAAI,WAC5B,GAAxBujG,EAAc/rH,QAQpBgsH,qBAAsB,WACpB,GAGIvyH,GAHAwyH,EAAgB/5H,KAAK0jH,SAASx/G,KAAK,6BACnCgvB,EAAUlzB,KAAKs/G,aAGfpkF,EAAQ3zB,EAAKwyH,EAAcjsH,OAAS,EAAIisH,EAAcjsH,OAAS,EAAI,CACvE,KAAKvG,EAAGA,GAAI,EAAIA,IAAK,CAEnB,GAAIqjC,GAAU/rC,EAAEk7H,EAAc7+F,EAAQ3zB,IAClCyyH,EAAY9mG,EAAQ0X,EAAQ7lC,KAAK,QACZ,oBAAdi1H,IACTA,EAAU5D,UAAU/gH,OAAOC,OAC7Bs1B,EAAQtrC,YAAY,UAKtB,MADAy6H,GAAgB/5H,KAAK0jH,SAASx/G,KAAK,8BACP,GAAxB61H,EAAcjsH,QAapB0rH,KAAM,SAAUS,GACd,OAAQA,GACN,IAAK9C,iBAAgBC,qBACnB,MAAOp3H,MAAKq5H,qBAEd,KAAKlC,iBAAgBE,sBACnB,MAAOr3H,MAAK45H,sBAEd,KAAKzC,iBAAgBG,SAEnB,MADAt3H,MAAKq4H,YACE,CAET,KAAKlB,iBAAgBI,KACnB,MAAOv3H,MAAKu5H,eAEd,SACE,MAAOv5H,MAAKu5H,kBAalBE,OAAQ,SAAUQ,GAChB,OAAQA,GACN,IAAK9C,iBAAgBC,qBACnB,MAAOp3H,MAAK25H,sBAEd,KAAKxC,iBAAgBE,sBACnB,MAAOr3H,MAAK85H,sBAEd,KAAK3C,iBAAgBG,SAEnB,MADAt3H,MAAK0yE,UACE,CAET,KAAKykD,iBAAgBI,KACnB,MAAOv3H,MAAK05H,cAEd,SACE,MAAO15H,MAAK05H,iBAalBQ,WAAY,SAAUj5H,GACpB,GAAIjB,KAAKm6H,WAAal5H,EAAO,CAE3B,IADA,GAAIskC,IAAO,EACJA,GAAQvlC,KAAKm6H,WAAal5H,GAC/BskC,EAAOvlC,KAAKw5H,KAAKrC,gBAAgBE,sBAInC,KADA9xF,GAAO,EACAA,GAAQvlC,KAAKm6H,WAAal5H,GAC/BskC,EAAOvlC,KAAKw5H,KAAKrC,gBAAgBC,qBAGnC,OADIp3H,MAAKm6H,WAAal5H,GAAOjB,KAAKw5H,KAAKrC,gBAAgBG,UAChDt3H,KAAKm6H,WAAal5H,EAE3B,OAAO,GAUTyxE,OAAQ,WACN,GAAI1yE,KAAK06F,cAAe,CACtB,GAAIq+B,GAAY/4H,KAAK0jH,SAASx/G,KAAK,YAAclE,KAAKg4H,QAClDz2H,EAAQw3H,EAAUzwF,SAASqvF,EAC/Bp2H,GAAMwtD,SAAS/uD,KAAK0jH,UACpBvxG,OAAOnS,KAAK0jH,SAAS,IACrBqV,EAAUroF,SAEV1wC,KAAK0jH,SAASp7E,SAAS,yBAAyB5kC,IAAI,UAAW,QAE/DgvC,uBACA,IAAI0nF,GAAc74H,EAAM2C,KAAK,sBAC7B3C,GAAMqsE,IAAIwsD,GAAanvH,MAAM,WACtBpM,EAAEmB,MAAMP,SAAS,aACpBZ,EAAEmB,MAAMN,SAAS,UAElB,WACIb,EAAEmB,MAAMP,SAAS,aACpBZ,EAAEmB,MAAMV,YAAY,WAGxBU,KAAKk4H,cAAe,EACpBl4H,KAAK6hB,KAAK,UAEZ,MAAO7hB,OAUT06F,YAAa,WACX,MAAO16F,MAAKk4H,cAWdiC,SAAU,WACR,MAAOn6H,MAAK0jH,SAASziH,SAWvBgC,MAAO,SAAUowH,GACf,GAAIgH,GAAUr6H,KAAK0jH,SAASp7E,SAASovF,EASrC,OAPI13H,MAAK06F,cACH77F,EAAE8jB,WAAW0wG,IACfrzH,KAAKszH,qBAAqB+G,GAC1Br6H,KAAKmiB,KAAK,QAASkxG,GACnBrzH,KAAKq6H,QAAQl4G,KAAK,QAAS,WAAcu0F,SAAS70F,KAAK,YAClDw4G,EAAQp3H,QACV0oB,EAAO/a,MAAM,oCACb5Q,MAUTs/G,WAAY,WACV,GAAIv8F,GAAK/iB,KACLkzB,EAAUvH,EAAOoD,QAAQviB,QAAQ0mB,QAAQ+D,UACzCqjG,KACAC,EAAWjxH,EAAE4pB,GAASyH,OAAO,SAAU/tB,GACzC,MAAOA,GAAOy7B,YAActlB,EAAG9Y,MAEjC,KAAK,GAAIypH,KAAc6G,GACrBD,EAAgBC,EAAS7G,GAAYzpH,MAAQswH,EAAS7G,EAExD,OAAO,IAAInuH,IAAGmvB,WAAW4lG,IAY3BE,gBAAiB,SAAUC,GACzB,GAAI13G,GAAK/iB,KACL06H,EAAgB33G,EAAG2gG,SAASp7E,SAAS,IAAMwvF,EAS/C,OAR4B,IAAxB4C,EAAc5sH,SAIhB4sH,EAAgB77H,EAAE,0BAClBkkB,EAAG2gG,SAAS56D,QAAQ4xE,IAEtBA,EAAcp7H,cAAcI,SAASo4H,EAA2B,IAAM2C,GAC/Dz6H,MAWT82H,kBAAmB,WAEjB,MADA92H,MAAK0jH,SAAS/hF,KAAK81F,GAAmBn3H,OAC/BN,MAWT+2H,kBAAmB,WAEjB,MADA/2H,MAAK0jH,SAAS/hF,KAAK81F,GAAmBx1H,OAC/BjC,OAKX2rB,GAAOmB,WAAWgH,SAAStnB,QAAQgpB,aAAeA,GACjDlxB,OAAOumB;CC/jBT,SAA+Bc,GAK9B,GAAI6rG,GAA4B,qBAC5BrD,EAAgB,oBAChBD,EAAiB,qBACjByG,EAAyB,kBASzBvlG,EAAUzJ,EAAO+I,WAAWjzB,QAG9Bm5H,wBAGAC,yBAGAC,wCAMAv6H,KAAM,SAAUozE,GACd,GAAI5wD,GAAK/iB,IACT+iB,GAAGe,OAAO6vD,GAGV5wD,EAAG2wD,KAAKlgE,QAAQ,SAAU3M,GAExB,GAAIk0H,GAAel0H,EAAKyvH,kBACpBpjG,EAAU,IACV6nG,KACF7nG,EAAUnQ,EAAG63G,qBAAqBG,GAC9B7nG,EACFA,EAAQ3f,KAAK1M,GAEbkc,EAAG63G,qBAAqBG,IAAiBl0H,GAK7C,IAAIm0H,GAAcn0H,EAAK0vH,gBACnByE,KACF9nG,EAAUnQ,EAAG83G,sBAAsBG,GAC/B9nG,EACFA,EAAQ3f,KAAK1M,GAEbkc,EAAG83G,sBAAsBG,IAAgBn0H,IAKzCA,EAAK2vH,oCACPzzG,EAAG+3G,qCAAqCvnH,KAAK1M,KAIjDkc,EAAGk4G,oBAAsBp8H,EAAE24H,GAC3Bz0G,EAAGm4G,eAAiBn4G,EAAGk4G,oBAAoB/2H,KAAKgwH,IAgBlD/U,OAAQ,SAAUgc,EAAezH,EAAYyE,GAC3C,GAAIp1G,GAAK/iB,IACL6N,WAAUC,OAAS,GAAG6d,EAAO/a,MAAM,mDACvC,IAAI6jH,GAAU0D,IAAkB,EAC5BluH,EAAO,GACPxC,EAAOd,EAAE,cACToD,EAAS,+DACT3B,EAAOqsH,EAAU,iBAAmB,iBACpCvzB,EAAUz5F,CAEW,iBAAdisH,IAETzpH,EAAOypH,EAAWzpH,KAClBxC,EAAOisH,EAAWjsH,KAClBsC,EAAS2pH,EAAW3pH,OACpB3B,EAAOsrH,EAAWtrH,KAClB84F,EAAUwyB,EAAWxyB,SAAWwyB,EAAWnb,SACb,gBAAdmb,GAChBzpH,EAAOypH,EACF/nG,EAAO/a,MAAM,4CAEpB,IAAIwqH,GAAuB1tH,OAAOitH,EAAwBxG,EAAegH,GACrEE,EAAat4G,EAAGk4G,oBAAoB/2H,KAAKk3H,EAE7C,IAAIC,EAAWvtH,OAAS,EAAG,CACzB,GAAIwtH,GAAwB5tH,OAAOitH,EAAwBlG,EAAU,yBAA2B,mBAAoBxqH,GAChHsxH,EAAkBx4G,EAAGk4G,oBAAoB/2H,KAAKo3H,EAC9CC,GAAgBztH,OAAS,GAAG6d,EAAO/a,MAAM,8CAA+C3G,GAExF0hB,EAAOoD,QAAQviB,QAAQ8oB,OAAO6lG,GAAezgC,gBAAe2gC,EAAaA,EAAWn3H,KAAK,mBAE7F,IAEIgC,GAFAs1H,EAAc/G,EAAU,oCAAsC,6BAIlE,IAAIA,EAAS,CAGX,GAAIj7B,GAAU7tE,EAAOoD,QAAQviB,QAAQ8oB,OAAO6lG,GAAezX,SAASx/G,KAAK,uBACzE,IAAsB,GAAlBs1F,EAAQ1rF,QAA6D,GAA9C0rF,EAAQt1F,KAAK,uBAAuB4J,OAAa,CAC1E,GAAI0rF,GAAU36F,EAAE,qCAChBw8H,GAAWr8H,OAAOw6F,GAGpBtzF,EAAaszF,MAEbtzF,GAAam1H,CAKf,IAAII,GAAsC,SAApBrzH,EAAK+T,QAAO,GAAkB7P,GAAGE,QAAQI,OAASN,GAAGE,QAAQK,SACnF3G,GAAWlH,OAAO0O,OAAO+tH,EAAevtH,QAAQ,WAAY,MAAOjE,EAAMxC,EAAMsC,EAAQ3B,EAAMozH,EAAat6B,GAE1G,IAAIt0F,GAAS,GAAI+e,GAAOmB,WAAWgH,SAAStnB,QAAQ6oB,cAAcimG,EAkBlE,OAjBA1uH,GAAOqoH,aAAc,EACrBlyG,EAAG6wD,WAAW3pE,EAAM2C,GAEpB2uH,EAAkBx4G,EAAGk4G,oBAAoB/2H,KAAKo3H,GAC9CC,EAAgBtwH,MACd,WACEpM,EAAEmB,MAAMN,SAAS,UAEnB,WACEb,EAAEmB,MAAMV,YAAY,WAIpBo0H,EAAqB,UACvB3wG,EAAG9Y,GAAMkY,KAAK,QAASuxG,EAAqB,UAGvC3wG,EAAG9Y,GACL0hB,EAAO/a,MAAM,6CAA8CuqH,IAWpEzqF,OAAQ,SAAUgjF,GAChB,GAAI3wG,GAAK/iB,IAIT,cAHO+iB,GAAG2wG,GACV3wG,EAAGk4G,oBAAoB/2H,KAAKwJ,OAAOitH,EAAwBzG,EAAgBR,IAAahjF,SAEjF3tB,GAWT0E,QAAS,SAAUisG,GACjB,GAAIgI,GAAiB78H,EAAE6O,OAAOitH,EAAwBzG,EAAgBR,GACtE,OAAOgI,GAAe5tH,OAAS,GAUjC6tH,uBAAwB,SAAU92G,GAChC,GAAIqO,GAAUlzB,KAAK46H,qBAAqB/1G,EAAW3C,cACnD,OAAOgR,GAAUA,MAUnB0oG,wBAAyB,SAAUZ,GACjC,GAAI9nG,GAAUlzB,KAAK66H,sBAAsBG,EACzC,OAAO9nG,GAAUA,MASnB2oG,uCAAwC,WACtC,MAAO77H,MAAK86H,uCAIhBnvG,GAAOmB,WAAWgH,SAAStnB,QAAQ4oB,QAAUA,GAE5C9wB,OAAOumB;CClOV,SAA8Bc,GAK5B,GAAI6rG,GAA4B,qBAC5BrD,EAAgB,oBAChBD,EAAiB,qBACjByG,EAAyB,kBAUzBplG,EAAS5J,EAAO+I,WAAWjzB,QAK7BlB,KAAM,SAAUozE,GACd,GAAI5wD,GAAK/iB,IACT+iB,GAAGe,OAAO6vD,GAEV5wD,EAAGk4G,oBAAsBp8H,EAAE24H,GAC3Bz0G,EAAGm4G,eAAiBn4G,EAAGk4G,oBAAoB/2H,KAAKgwH,IAclD/U,OAAQ,SAAUgc,EAAeW,GAC/B,GAAI/4G,GAAK/iB,KACL+7H,EAAWh5G,EAAGk4G,oBAAoB3yF,SAAS,QAAQzmC,QAEnDoI,EAAO,GAEP2/F,GADOjjG,EAAE,aACDA,EAAE,cACVyB,EAAO,oBAEiB,iBAAjB+yH,IAETlxH,EAAOkxH,EAAclxH,KACrB2/F,EAAQuxB,EAAcvxB,MACtBxhG,EAAO+yH,EAAc71E,OACY,gBAAjB61E,GAChBlxH,EAAOkxH,EAEPxvG,EAAO/a,MAAM,2CAGf,IAAIorH,GAAiBn9H,EAAE6O,OAAOitH,EAAwBxG,EAAelqH,GAGrE,IAFI+xH,EAAeluH,OAAS,GAAG6d,EAAO/a,MAAM,6CAA8C3G,GAEjD,gBAA9B6xH,GACT,GAAmC,KAA/BA,EAAmC,CACrCC,EAASjzE,QAAQp7C,OAAOrB,gBAAgBG,QAAQM,MAAO7C,EAAM2/F,EAAOxhG,GACpE,IAAIwK,GAAampH,EAASzzF,WAAWod,GAAG,EAEpC9yC,GAAWnT,SAAS,sBACtBs8H,EAAS73H,KAAK,UAAY+F,EAAO,MAAMi6C,MAAMtxC,OAE1C,CACL,GAAIqpH,GAAeF,EAAS73H,KAAK,UAAY43H,EAA6B,KACtEG,GAAanuH,OACfiuH,EAAS73H,KAAK,UAAY43H,EAA6B,MAAM53E,MAAMx2C,OAAOrB,gBAAgBG,QAAQM,MAAO7C,EAAM2/F,EAAOxhG,IAEtHujB,EAAO/a,MAAM,kDAIjBmrH,GAAS/8H,OAAO0O,OAAOrB,gBAAgBG,QAAQM,MAAO7C,EAAM2/F,EAAOxhG,GAGrE,OADA2a,GAAG6wD,WAAW3pE,EAAM,GAAI0hB,GAAOmB,WAAWgH,SAAStnB,QAAQgpB,aAAa9nB,OAAOitH,EAAwBxG,EAAelqH,KAC/G8Y,EAAG9Y,IAWZwd,QAAS,SAAU0zG,GACjB,GAAIe,GAAgBr9H,EAAE6O,OAAOitH,EAAwBxG,EAAegH,GACpE,OAAOe,GAAcpuH,OAAS,IAKlC6d,GAAOmB,WAAWgH,SAAStnB,QAAQ+oB,OAASA,GAE3CjxB,OAAOumB;AC1GV,cAYA,SAAWc,GAKT,GAAIwwG,GAA4B,uBAC5BC,EAAc,eACdC,EAAsB,oBAUtBnnG,GAHqBr2B,EAAEs9H,GAGjBtxG,UAAUiC,WAAWgH,SAAS6+F,gBAAgBlxH,QACtD+xE,SAAU,KACVg2B,QAAS,GAETjpG,KAAM,SAAU0/G,EAAcqc,GAC5B,GAAIv5G,GAAK/iB,IACT+iB,GAAGywD,SAAW8oD,EAAYvtG,QAEtBhM,EAAGywD,UAAYzwD,EAAGywD,SAAS/mE,QAC7BsW,EAAG2gG,SAAW3gG,EAAGywD,SAAS/mE,QAAQ8vH,UAAUr4H,KAAK+7G,GAEjDl9F,EAAG2gG,SAAW7kH,EAAEohH,GAGlBl9F,EAAGe,OAAOf,EAAG2gG,UACb3gG,EAAGgzB,SAAWroC,OAAOqV,EAAG8vG,wBAAyBuJ,EAAar5G,EAAG9Y,MACjE8Y,EAAGymF,QAAUzmF,EAAG2gG,SAAS/jH,KAAK,QAG9BojB,EAAGZ,KAAK,SAAU,SAAU/d,GAC1B,GAAI2e,EAAGywD,UAAYzwD,EAAGywD,SAAS/mE,QAAS,CACtC,GAAI+vH,GAAUz5G,EAAGywD,SAAS/mE,OAC1B+vH,GAAQ3X,eAAe2X,EAAQtuG,aAAe3V,YAAYE,SAAWF,YAAYC,gBAMvFtF,UAAW,MACX+hH,aAAa,EAUbprG,QAAS,SAAUjmB,GACjB,GAA4B,YAAxB+nB,EAAO7hB,cACT,GAAI9J,KAAK0jH,SAASjkH,SAAS,gBAAkBO,KAAKi1H,YAChD,GAAiB,QAAbj1H,KAAKiK,KACPpL,EAAE,sBAAsB+E,KAAKA,OACxB,CACL,GAAIL,GAAKvD,KAAK0jH,SAAS3+G,KAAK,MACxB8jD,EAAMtlD,EAAG4Y,OAAO5Y,EAAGuK,OAAS,EAChCjP,GAAE,iBAAmBgqD,GAAKjlD,KAAKA,OAGjC/E,GAAE6O,OAAO2uH,EAAqBr8H,KAAKiK,OAAOrG,KAAKA,OAGjD,IAAI5D,KAAKwzE,UAAwC,YAA5BxzE,KAAKwzE,SAAStgE,UACjC,OAAQlT,KAAKiK,MACX,IAAK,UACHpL,EAAE,yCAAyC+E,KAAKA,EAChD,MACF,SACE/E,EAAE,WAAWypC,SAAS,IAAMtoC,KAAKiK,MAAMrG,KAAKA,GAIpD,MAAO5D,OAITiD,MAAO,SAAUowH,GACXx0H,EAAE8jB,WAAW0wG,IACfrzH,KAAKwiB,OAAO,SAEdxiB,KAAK8jB,OAAOuvG,IASd/yH,KAAM,WAGJ,MAFAN,MAAK8jB,SACD9jB,KAAK0jH,SAASjkH,SAAS,SAASO,KAAK0jH,SAASpkH,YAAY,QAAQsiC,KAAK,OAAOliC,SAAS,QACpFM,MASTiC,KAAM,WAGJ,MAFAjC,MAAK8jB,SACD9jB,KAAK0jH,SAAS9hF,OAAOniC,SAAS,SAASO,KAAK0jH,SAAShkH,SAAS,QAAQkiC,KAAK,OAAOtiC,YAAY,QAC3FU,MAUT+pE,OAAQ,WACN,GAAIhnD,GAAK/iB,IAKT,OAJA+iB,GAAGe,SACEf,EAAGkyG,aAAalyG,EAAG2gG,SAASvhG,KAAK,QAAS,WAC3CY,EAAGywD,SAAS/mE,QAAQ0mB,KAAKspG,qBAAqB15G,EAAIA,EAAG9Y,KAAM8Y,EAAGgzB,YAE3DhzB,GAST2lD,UAAW,WACT,MAAO1oE,MAAK0jH,SAAS3+E,GAAG,eAK5BpZ,GAAOmB,WAAWgH,SAASrnB,QAAQyoB,IAAMA,GACxC5wB,OAAOumB;AC5JV,cAEA,SAAWc,GAQT,GAAIsJ,GAAOtJ,EAAO+I,WAAWjzB,QAC3Bi7H,aAAc,eACd7J,wBAAyB,kBACzB8J,qBAAsB,oBACtBC,qBAAsB,mBACtBC,UAAW,WACXC,yBAAyB,EACzBtpD,SAAU,KAEVjzE,KAAM,SAAUozE,EAAUwoD,EAA2BG,GACnD,GAAIv5G,GAAK/iB,IAaT,IAZA+iB,EAAGe,OAAO6vD,GACV5wD,EAAGywD,SAAW8oD,EACdv5G,EAAGg6G,oBAAsBl+H,EAAEs9H,GAC3Bp5G,EAAGi6G,cAAgBj6G,EAAGg6G,oBAAoB74H,KAAK,cAE/C6e,EAAGk6G,WAAap+H,EAAE,4BAClBkkB,EAAGm6G,WAAar+H,EAAE,aAClBkkB,EAAGo6G,YAAct+H,EAAE,eACnBkkB,EAAGw5G,UAAY19H,EAAE,wBACjBkkB,EAAGq6G,2BAGCr6G,EAAGywD,UAAYzwD,EAAGywD,SAAS/mE,QAAS,CACtC,GAAI4wH,GAAiBt6G,EAAGywD,SAAS/mE,OACjC4wH,GAAel7G,KAAKk7G,EAAsB,MAAEv7G,MAAM80B,iBAAkB,WAClE7zB,EAAGu6G,gCAWTF,yBAA0B,WACxB,GAAIr6G,GAAK/iB,IACT+iB,GAAGm4G,eAAiBn4G,EAAGg6G,oBAAoB56G,KAAK,QAAS,WACvDY,EAAGu6G,8BAELv6G,EAAGu6G,6BAOLA,0BAA2B,WACzB,GAAIv6G,GAAK/iB,IACT+iB,GAAGw6G,cAAgBx6G,EAAGg6G,oBAAoB74H,KAAK6e,EAAG25G,aAAe,aAC5D35G,EAAGw6G,cAAczvH,SACpBiV,EAAGw6G,cAAgBx6G,EAAGg6G,oBAAoB74H,KAAK6e,EAAG25G,aAAe,UACnE,IAAIzyH,GAAO8Y,EAAGw6G,cAAcx4H,KAAK,SAAWge,EAAGw6G,cAAc59H,KAAK,OAClEojB,GAAGgM,QAAUhM,EAAG9Y,IAelBk1G,OAAQ,SAAU/0E,GAChB,GAAIrnB,GAAK/iB,KAELiK,EAAO,GACP2/F,EAAQjjG,EAAE,WACVyB,EAAO,iBACP84F,EAAU0I,CAEQ,iBAAXx/D,IACTngC,EAAOmgC,EAAQngC,MAAQmgC,EAAQ7mC,GAC/BqmG,EAAQx/D,EAAQw/D,OAASx/D,EAAQ3iC,KACjCW,EAAOgiC,EAAQhiC,MAAQA,EACvB84F,EAAU92D,EAAQ82D,SAAW92D,EAAQmuE,SACV,gBAAXnuE,GAChBngC,EAAOmgC,EACFze,EAAO/a,MAAM,0CAEpBmS,EAAGy6G,oBAAsB9vH,OAAOqV,EAAG8vG,wBAAyB9vG,EAAG25G,aAAczyH,GAC7E8Y,EAAG06G,cAAgB16G,EAAGg6G,oBAAoB74H,KAAK6e,EAAGy6G,qBAE9Cz6G,EAAG06G,cAAc3vH,OAAS,GAC5B6d,EAAO/a,MAAM,2CAA4C3G,EAG3D,IAAIwyE,GAAW/uE,OAAOrB,gBAAgBI,QAAQO,IAAK/C,EAAM2/F,EAAOxhG,EAAM2a,EAAG85G,UAAW37B,EAEhFn+E,GAAGi6G,cAAc94H,KAAK,SAAS4J,OACjCiV,EAAGo6G,YAAYn+H,OAAOy9E,GAEtB15D,EAAGi6G,cAAch+H,OAAOy9E,GAG1B15D,EAAGg6G,oBAAoB74H,KAAK6e,EAAGy6G,qBAAqB99H,SAAS,QACxDkiC,OAAOtiC,YAAY,QAExBU,KAAK09H,aAAazzH,EAGlB,IAAI+C,GAAM,GAAI2e,GAAOmB,WAAWgH,SAASrnB,QAAQyoB,IAAInS,EAAGy6G,oBAAqBz6G,EAAGywD,SAYhF,OATAxmE,GAAImV,KAAK,QAAS,WAAcY,EAAG05G,qBAAqBz8H,KAAMiK,EAAM8Y,EAAGy6G,uBACvExwH,EAAIioH,aAAc,EAElBjoH,EAAI6c,QAAQnc,OAAOrB,gBAAgBK,KAAKQ,QAASvG,EAAE,WAAYA,EAAE,8BAA+BA,EAAE,uBAClGoc,EAAG6wD,WAAW3pE,EAAM+C,GAEhBo9B,EAAkB,UACpBp9B,EAAImV,KAAK,QAASioB,EAAkB,UAE/Bp9B,GAWT2wH,iBAAkB,SAAUvzF,GAC1B,GAAIrnB,GAAK/iB,IACT+iB,GAAGywD,SAAS/mE,QAAQ0mB,KAAKpE,QAAQ9rB,MAAM,SAAUmnC,GAC/C,GAAIwzF,GAAqBlwH,OAAOqV,EAAG8vG,wBAAyB9vG,EAAG25G,aAActyF,EAC7ErnB,GAAG86G,aAAazzF,EAASwzF,MAS7BnB,qBAAsB,SAAUj3C,EAASv7E,EAAM2zH,GAC7C,GAAI76G,GAAK/iB,IACI,aAATiK,GAA+B,QAATA,GAAgB8Y,EAAG86G,aAAa5zH,EAAM2zH,IAYlEC,aAAc,SAAUzzF,EAAS0zF,GAC/B,GAAI/6G,GAAK/iB,IACT+iB,GAAGk6G,WAAW/4H,KAAK6e,EAAG65G,sBAAsBt8H,OAC5CzB,EAAEkkB,EAAG25G,cAAcp9H,YAAY,YAC/ByjB,EAAGg6G,oBAAoB74H,KAAK45H,GAAmBp+H,SAAS,YAC1B,eAA1BqjB,EAAGywD,SAAStgE,YACd5O,OAAO6sB,SAASkkD,KAAOjrC,GAEzBrnB,EAAGk6G,WAAW/4H,KAAKwJ,OAAOqV,EAAG45G,qBAAsBvyF,IAAUnoC,QAa/Dy7H,aAAc,SAAUzzH,GAEtB,GAAI8Y,GAAK/iB,IACT,IAAI+iB,EAAGywD,SAAS/mE,QAAQ0mB,KAAKlT,eAAe,WAAY,CACtD,GAAI89G,GAAiBh7G,EAAGywD,SAAS/mE,QAAQ0mB,KAAKpE,QAAQ9kB,IAE1B,IAAxB8Y,EAAGk6G,WAAWnvH,SAChBiV,EAAGi7G,wBAAyB,EACiB,IAAzCj7G,EAAGm6G,WAAW50F,SAAS,OAAOx6B,OAEhCiV,EAAGm6G,WAAW50F,SAAS,OAAO5oC,SAAS,iBAGvCqjB,EAAGm6G,WAAWe,UAAU,yBAA2BF,EAAiB,2BACpEh7G,EAAGm6G,WAAWe,UAAU,gCAI5Bl7G,EAAGk6G,WAAap+H,EAAE,4BAGuB,GAArCA,EAAEkkB,EAAG65G,sBAAsB9uH,SAC7BiV,EAAGk6G,WAAWgB,UAAU,yBAA2BF,EAAiB,2BAEpE/9H,KAAK29H,iBAAiBI,IAGnBh7G,EAAGywD,SAAS/mE,QAAQ0mB,KAAKpE,QAAQ20F,SAASjkH,SAAS,eACtDO,KAAK29H,iBAAiBI,EAExB,IAAIthD,GAAW/uE,OAAOrB,gBAAgBK,KAAKM,IAAK/C,EAChD8Y,GAAGk6G,WAAWj+H,OAAOy9E,GACjB15D,EAAGi7G,wBAAwBj7G,EAAGk6G,WAAW/4H,KAAKwJ,OAAOqV,EAAG45G,qBAAsB1yH,IAAOvK,SAAS,mBAYtG+nB,QAAS,SAAU2iB,GACjB,GAAIrnB,GAAK/iB,KAEL+1C,EAAWroC,OAAOqV,EAAG8vG,wBAAyB9vG,EAAG25G,aAActyF,EAEnE,OADArnB,GAAG06G,cAAgB16G,EAAGg6G,oBAAoB74H,KAAK6xC,GACxChzB,EAAG06G,cAAc3vH,OAAS,IAKrC6d,GAAOmB,WAAWgH,SAASrnB,QAAQwoB,KAAOA,GAEzC3wB,OAAOumB;ACrPV,cAEC,SAAWc,GAET,GASKmJ,GAAgBnJ,EAAOmB,WAAWgH,SAASrnB,QAAQwoB,KAAKxzB,QAE1Di7H,aAAc,kCACd7J,wBAAyB,kBAOzB4J,qBAAsB,SAAUj3C,EAASv7E,EAAM2zH,GAC7C,GAAI76G,GAAK/iB,KAELs5D,EAAQz6D,EAAEkkB,EAAG25G,cAAcpjE,MAAMksB,EAEjClhF,QAAO45H,WAAa5kE,EACjBv2C,EAAGywD,SAAS/mE,QAAQiuF,cACpB33E,EAAGywD,SAAS/mE,QAAQimE,SADe3vD,EAAGywD,SAAS/mE,QAAQ4rH,YAI5D/zH,OAAO45H,UAAY5kE,EACnBv2C,EAAGywD,SAAS/mE,QAAQimE,UAET,YAATzoE,GAA+B,QAATA,GAAgBk0H,aAAal0H,EAAMjK,OAW/DynB,QAAS,SAAU2iB,GACjB,GAAIrnB,GAAK/iB,KAEL+1C,EAAWroC,OAAOitH,uBAAwB53G,EAAG25G,aAActyF,EAE/D,OADArnB,GAAG06G,cAAgB16G,EAAGg6G,oBAAoB74H,KAAK6xC,GACxChzB,EAAG06G,cAAc3vH,OAAS,GAQnCqxG,OAAQ,SAAU/0E,MAIpBze,GAAOmB,WAAWgH,SAASrnB,QAAQqoB,cAAgBA,GAEpDxwB,OAAOumB;CCjEV,SAAqBc,GAEnB,GAOIywG,GAAc,eAwBdpnG,EAAUtT,WAAWjgB,QACvBuyB,YAAa,KACbw/C,SAAU,KAGVjzE,KAAM,SAAU0zB,EAAmBlF,GACjC,GAAIhM,GAAK/iB,IACT+iB,GAAGywD,SAAWzkD,EACdhM,EAAGw5G,UAAY19H,EAAEo1B,GACjBlR,EAAGo6G,YAAcp6G,EAAGw5G,UAAUr4H,KAAK,eACnC6e,EAAGe,SAOHf,EAAGZ,KAAKY,EAAU,MAAEjB,MAAM80B,iBAAkB,WAC1CttC,EAAEyZ,EAAGywD,SAAS39C,aAAa91B,KAAK,SAAU+tF,GACxCA,EAAKA,KAAK+V,eAGV/V,EAAKA,KAAKuf,uBAehB+wB,mBAAoBzyG,EAAOmF,IAAI,WAC7B,GAAI/N,GAAK/iB,IACT,OAAI+iB,GAAGw5G,UAAUzuH,OAAS,GACjB9N,KAAKq+H,SAAS,aAAc37H,KAAKmvH,IAAIhmH,cAAekX,EAAGw5G,UAAUt7H,YAc5Eq9H,iBAAkB3yG,EAAOmF,IAAI,WAC3B,GAAI/N,GAAK/iB,IACT,OAAI+iB,GAAGw5G,UAAUzuH,OAAS,GACjB9N,KAAKq+H,SAAS,cAAet7G,EAAGywD,SAASoyC,yBAgBpD2Y,gBAAiB,SAAUC,GACzB,GAAIz7G,GAAK/iB,KACLy+H,EAAc,CAOlB,OALA17G,GAAGw5G,UAAUr4H,KAAK,cAAcA,KAAKk4H,GAAar8H,KAAK,WACrD0+H,GAAe5/H,EAAE4B,GAAG+9H,GAAU3+H,KAAKhB,EAAEmB,OAAO,KAGzCA,KAAKkuB,eAAcuwG,GAAe5/H,EAAE,SAASoC,SAC3Cw9H,GAcTC,gBAAiB,SAAUF,GACzB,GAAIz7G,GAAK/iB,KACLmzB,EAAOpQ,EAAGw5G,UAAUr4H,KAAK,cAAcA,KAAKk4H,EAChD,OAAOv9H,GAAE4B,GAAG+9H,GAAU3+H,KAAKszB,EAAKmD,IAAI,SAASusC,QAAQ,IAcvDw7D,SAAU1yG,EAAOmF,IAAI,SAAU0tG,EAAUG,GACvC,GAAI57G,GAAK/iB,IAgCT,OA/BA+iB,GAAGywD,SAAS//C,OAAON,KAAK5hB,KAAK,WAC3B,GAAIktH,GAAc17G,EAAGw7G,gBAAgBC,GAEjCI,EAAQ77G,EAAGw5G,UAAUr4H,KAAK,YAE1BqhC,GAAO,CACX,IAAIo5F,EAAgBF,EAAa,CAC/B,GAAII,GAAW,CAQf,KAPI97G,EAAGmL,eACL2wG,EAAWhgI,EAAE4B,GAAG+9H,GAAU3+H,KAAK++H,GAAO,GAClC77G,EAAGo6G,YAAYj5H,KAAKk4H,GAAatuH,OAAS,GAAK8wH,EAAM9wH,OAAS,IAChE+wH,EAAW,IAIRt5F,GAASo5F,EAAgBF,EAAcI,GAC5Ct5F,EAAOxiB,EAAGs1G,WACVuG,EAAQ77G,EAAGw5G,UAAUr4H,KAAK,YAC1Bu6H,EAAc17G,EAAGw7G,gBAAgBC,GAC7Bz7G,EAAGmL,cAAgB0wG,EAAM39H,QAAU,IAAK49H,EAAW,OAKzD,KAFA,GAAIC,GAAW/7G,EAAG27G,gBAAgBF,GAC9BK,EAAWhgI,EAAE4B,GAAG+9H,GAAU3+H,KAAK++H,GAAO,GACnCr5F,GAASo5F,EAAgBF,EAAcK,GAC5Cv5F,EAAOxiB,EAAG2vD,SACVosD,EAAW/7G,EAAG27G,gBAAgBF,GAC9BC,EAAc17G,EAAGw7G,gBAAgBC,KAIhCz7G,IAaTg8G,gBAAiBpzG,EAAOmF,IAAI,SAAUkuG,GACpC,GAAIj8G,GAAK/iB,KACLi/H,EAAWl8G,EAAGo6G,YAAYj5H,KAAKk4H,EAAc,UAC7C8C,EAASD,EAASt/H,KAAK,SAGvBu/H,GAAQrgI,EAAE,IAAMqgI,GAAQh7E,MAAM+6E,GAC7Bl8G,EAAGw5G,UAAUr4H,KAAKk4H,EAAc,UAAU3rF,OAAOwuF,EAGtD,IAAIE,GAAWp8G,EAAGo6G,YAAYj5H,KAAKk4H,EACX,KAApB+C,EAASrxH,QACXiV,EAAGg8G,iBAGL,IAAIE,GAAWl8G,EAAGo6G,YAAYj5H,KAAKk4H,EAAc,SACjD,OAAuB,IAAnB6C,EAASnxH,SACL9N,KAAKmzB,KAAW,OAEpBpQ,EAAGoQ,KAAW,KAAEuwF,SAAShzE,eAClB3tB,GAAGoQ,KAAW,OAEhB,KAgBXisG,kBAAmBzzG,EAAOmF,IAAI,WAC5B,GAAI/N,GAAK/iB,IAEJ+iB,GAAGoQ,KAAW,KAsCjBnzB,KAAKmzB,KAAW,KAAElxB,QApClB8gB,EAAGoQ,KAAKgsF,OAAO,QACZ+E,SAASv9G,EAAE,cACXw9G,WAAWx9G,EAAE,eACbqsH,QAAQ,0BACR/vH,MAAMpE,EAAEwnG,MAEXtjF,EAAGoQ,KAAW,KAAEuwF,SAASzgH,MAAM,SAAUmB,GACvCA,EAAEhF,kBACF2jB,EAAGo6G,YAAYkC,YAAY,SAE3B,IAAIC,GAAcv8G,EAAGw5G,SACrB,IAAI+C,EAAY7/H,SAAS,cAAe,CACtC,GAAI2D,GAAOvE,EAAEmB,MAAMG,SAASiD,KACxBm8H,EAAiBx8G,EAAGo6G,YAAYl8H,OAEhCmC,GAAOm8H,EAAiB1zH,gBAC1BzI,EAAOyI,cAAgB0zH,EAAiB,IAE1Cx8G,EAAGo6G,YAAYz5H,KAAMN,KAAQA,QACxB,CACL,GAAIX,GAAM5D,EAAEmB,MAAMmF,WAAW1C,IACzBW,EAAO2f,EAAGoQ,KAAW,KAAEuwF,SAASriD,aAEhCpgE,EAAQ,EACR6jH,EAAQ/hG,EAAGo6G,YAAYj5H,KAAKk4H,EAEhCtX,GAAMjiD,OAAOn/D,KAAM87H,YAAe,IAClC1a,EAAM/kH,KAAK,WACTkB,GAASpC,EAAEmB,MAAMqhE,YAAW,KAE9Bt+C,EAAGo6G,YAAYz5H,KAAMjB,IAAOA,EAAKxB,MAASA,EAAOmC,KAAQA,IAE3DvE,EAAE,aAAaU,WAOnB,IAAIq/H,GAAQ77G,EAAGw5G,UAAUr4H,KAAKlE,KAAKmzB,KAAW,KAAE4iB,UAAUr2C,SAAS,QAC/D+/H,EAAUb,EAAMh9F,KAAKw6F,EACzB,SAAIqD,EAAQ3xH,OAAS,OAEjB2xH,EAAQhgI,SAAS,cACnBggI,EAAUA,EAAQ79F,KAAKw6F,GACnBqD,EAAQ3xH,OAAS,MAGvB2xH,EAAQ9/H,KAAK,SAAU8/H,EAAQ79F,OAAO78B,KAAK,OAC3Cge,EAAGo6G,YAAYr0E,QAAQ22E,IAEhB,MAWT/sD,OAAQ/mD,EAAOmF,IAAI,WACjB,MAAO9wB,MAAK++H,oBAWd1G,SAAU1sG,EAAOmF,IAAI,WACnB,MAAO9wB,MAAKo/H,sBAWd1kC,YAAa,WAEX,OAAQ77F,EAAE,mBAAmBkmC,GAAG,aAmBlC8/E,eAAgB,SAAU/2F,GACxB,GAAI/K,GAAK/iB,IAuCT,OArCI8tB,IAAevV,YAAYC,YAC7BuK,EAAGw5G,UAAUj9H,YAAY,YAAYI,SAAS,cAC9Cb,EAAE,iBAAiBa,SAAS,aAC5BqjB,EAAGw5G,UAAUr4H,KAAKk4H,EAAc,MAAMr8H,KAAK,WACzC,GAAI2/H,GAAY7gI,EAAEmB,MAAML,KAAK,YAC7Bd,GAAEmB,MAAMV,cAAcI,SAASggI,KAGjC1/H,KAAKo+H,uBAELr7G,EAAGw5G,UAAU78H,SAAS,YAAYJ,YAAY,cAE9CT,EAAE,iBAAiBS,YAAY,aAC/ByjB,EAAGw5G,UAAUr4H,KAAKk4H,EAAc,MAAMr8H,KAAK,WACzC,GAAIqI,GAAOvJ,EAAEmB,MAAML,KAAK,OACxBd,GAAEmB,MAAMV,cAAcI,SAAS0I,KAGjCpI,KAAKs+H,mBACLt+H,KAAK2/H,2BAIP9gI,EAAE,QAAQgC,IAAI,cAAcC,GAAG,aAAc,WAC3CiiB,EAAGo6G,YAAYz9H,SAAS,YAI1Bb,EAAEyF,QAAQ6d,KAAK,YAAa,WAC1BY,EAAGo6G,YAAYz9H,SAAS,UACpBqjB,EAAGw5G,UAAU98H,SAAS,cACxBsjB,EAAGq7G,qBAEHr7G,EAAGu7G,qBAIAt+H,MAWTkuB,WAAY,WAEV,OAAQrvB,EAAE,gBAAgBY,SAAS,eAWrCkgI,wBAAyB,WACvB,GACIL,GAAczgI,EAAE,gBAChB+gI,EAAe/gI,EAAE,gBAErB+gI,GAAanvF,OAAO6uF,GAIiB,mBAA1B,sBAAuCO,yBAIpD/9G,OAQE00B,kBAAmB,kBAUnBI,iBAAkB,mBAMtBrxC,IAAGygB,IAAI8N,SAASrnB,QAAQuoB,QAAUA,GAEjC1wB,OAAOiB;CC7bV,SAAqBomB,GAEnB,GAOIywG,GAAc,eAwBdxnG,EAAmBrvB,GAAGygB,IAAI8N,SAASrnB,QAAQuoB,QAAQvzB,QACrDuyB,YAAa,KACbw/C,SAAU,KAWV4qD,mBAAoBzyG,EAAOmF,IAAI,WAC7B,OAAO,IAYTwtG,iBAAkB3yG,EAAOmF,IAAI,WAC3B,OAAO,IAcTytG,gBAAiB,SAAUC,GACzB,GAAIz7G,GAAK/iB,KACLy+H,EAAc,CAOlB,OALA17G,GAAGw5G,UAAUr4H,KAAK,cAAcA,KAAKk4H,GAAar8H,KAAK,WACrD0+H,GAAe5/H,EAAE4B,GAAG+9H,GAAU3+H,KAAKhB,EAAEmB,OAAO,KAGzCA,KAAKkuB,eAAcuwG,GAAe5/H,EAAE,SAASoC,SAC3Cw9H,GAcTC,gBAAiB,SAAUF,GACzB,GAAIz7G,GAAK/iB,KACLmzB,EAAOpQ,EAAGw5G,UAAUr4H,KAAK,cAAcA,KAAKk4H,EAChD,OAAOv9H,GAAE4B,GAAG+9H,GAAU3+H,KAAKszB,EAAKmD,IAAI,SAASusC,QAAQ,IAWvD6P,OAAQ/mD,EAAOmF,IAAI,WACjB,GAAIgvG,GAAYjhI,EAAE,+BACdkhI,EAAiBlhI,EAAE,gBACnBmhI,EAAiBnhI,EAAE,mBACnBohI,EAAuBphI,EAAE,0BACzBqhI,EAAyBrhI,EAAE,iCAC3B+gI,EAAe/gI,EAAE,gBAYrB,OAVAkhI,GAAezgI,YAAY,yBAC3BsgI,EAAatgI,YAAY,yBAEzB2gI,EAAqB3/H,OACrB4/H,EAAuB5/H,OAEvB0/H,EAAe/9H,OACf69H,EAAU79H,OAEVpD,EAAE4yB,OAAO,mBAAoB,KAAOmmB,QAAS,MACtC53C,OAWTq4H,SAAU1sG,EAAOmF,IAAI,WACnB,GAAIgvG,GAAYjhI,EAAE,+BACdkhI,EAAiBlhI,EAAE,gBACnBmhI,EAAiBnhI,EAAE,mBACnBohI,EAAuBphI,EAAE,0BACzBqhI,EAAyBrhI,EAAE,iCAC3B+gI,EAAe/gI,EAAE,gBAYrB,OAVAkhI,GAAergI,SAAS,yBACxBkgI,EAAalgI,SAAS,yBAEtBsgI,EAAe1/H,OACfw/H,EAAUx/H,OAEV2/H,EAAqBh+H,OACrBi+H,EAAuBj+H,OAEvBpD,EAAE4yB,OAAO,mBAAoB,KAAOmmB,QAAS,MACtC53C,OAWT06F,YAAa,WAEX,OAAQ77F,EAAE,mBAAmBkmC,GAAG,aAmBlC8/E,eAAgB,SAAU/2F,GACxB,GAAI/K,GAAK/iB,IAwCT,OAtCI8tB,IAAevV,YAAYC,YAC7BuK,EAAGw5G,UAAUj9H,YAAY,YAAYI,SAAS,cAC9Cb,EAAE,iBAAiBa,SAAS,aAC5BqjB,EAAGw5G,UAAUr4H,KAAKk4H,EAAc,MAAMr8H,KAAK,WACzC,GAAI2/H,GAAY7gI,EAAEmB,MAAML,KAAK,YAC7Bd,GAAEmB,MAAMV,cAAcI,SAASggI,KAGjC1/H,KAAKo+H,qBACLp+H,KAAKmgI,qCAELp9G,EAAGw5G,UAAU78H,SAAS,YAAYJ,YAAY,cAE9CT,EAAE,iBAAiBS,YAAY,aAC/ByjB,EAAGw5G,UAAUr4H,KAAKk4H,EAAc,MAAMr8H,KAAK,WACzC,GAAIqI,GAAOvJ,EAAEmB,MAAML,KAAK,OACxBd,GAAEmB,MAAMV,cAAcI,SAAS0I,KAGjCpI,KAAKs+H,mBACLt+H,KAAK2/H,2BAIP9gI,EAAE,QAAQgC,IAAI,cAAcC,GAAG,aAAc,WAC3CiiB,EAAGo6G,YAAYz9H,SAAS,YAI1Bb,EAAEyF,QAAQ6d,KAAK,YAAa,WAC1BY,EAAGo6G,YAAYz9H,SAAS,UACpBqjB,EAAGw5G,UAAU98H,SAAS,cACxBsjB,EAAGq7G,qBAEHr7G,EAAGu7G,qBAIAt+H,MAWTkuB,WAAY,WAEV,OAAQrvB,EAAE,gBAAgBY,SAAS,eAUrC0gI,iCAAkC,WAChC,GAAIp9G,GAAK/iB,KACLmkC,EAAOpI,cAAc,QAAQ7Z,aACjC,KAAa,SAATiiB,GAA4B,KAATA,IACnBphB,EAAGw5G,UAAU98H,SAAS,cAAe,CACvC,GAAI2gI,GAAiBvhI,EAAE,mBACnBwhI,EAAcD,EAAel8H,KAAK,mBAClCo7H,EAAczgI,EAAE,eACpB,IAAIwhI,EAAYvyH,OAAS,EAAG,CAE1BsyH,EAAel8H,KAAK,SAASusC,OAAO6uF,EAEpC,IAAIgB,GAAkB71H,SAAS41H,EAAYp/H,QAAS,GACpDq+H,GAAY57H,KAAMzC,MAAS,OAAQu+H,YAAec,EAAkB,IAE/B,mBAA1B,sBAAuCT,yBAaxDF,wBAAyB,WACvB,GACIL,GAAczgI,EAAE,gBAChB+gI,EAAe/gI,EAAE,gBAErB+gI,GAAanvF,OAAO6uF,GAEpBA,EAAY57H,KAAMzC,MAAS,GAAIu+H,YAAe,KAET,mBAA1B,sBAAuCK,wBAKtDt6H,IAAGygB,IAAI8N,SAASrnB,QAAQmoB,iBAAmBA,GAE1CtwB,OAAOiB;AC3SV,cAWA,SAAWomB,GAET,GAAIvH,GAAOuH,EAAOmB,WAAWgH,SAAS6+F,gBAAgBlxH,QAEpDlB,KAAM,SAAU0/G,GACdjgH,KAAK8jB,OAAOm8F,GACZjgH,KAAKiK,KAAOjK,KAAK0jH,SAAS3+G,KAAK,MAC/B/E,KAAK+1C,SAAW,IAAM/1C,KAAKiK,KAC3BjK,KAAK6kB,WAAa7kB,KAAK0jH,SAAS/jH,KAAK,gBAGvCuT,UAAW,OAYXjQ,MAAO,SAAUowH,GACf,GAAItwG,GAAK/iB,IACT,IAAInB,EAAE8jB,WAAW0wG,GAAe,CAC9B,GAAIS,GAAU/wG,EAAG2gG,QACjB3gG,GAAGe,OAAO,WACHgwG,EAAQr0H,SAAS,aAAa4zH,MAErCS,EAAQp0H,SAAS,UAEnB,MAAOqjB,IAWTZ,KAAM,SAAU9e,EAAO+5B,GACrB,GAAIra,GAAK/iB,IACT,IAAInB,EAAE8jB,WAAWya,GAAW,CAC1B,GAAI02F,GAAU/wG,EAAG2gG,QACjB3gG,GAAGe,OAAOzgB,EAAO,WACVywH,EAAQr0H,SAAS,aAAa29B,MAErC02F,EAAQp0H,SAAS,UAEnB,MAAOqjB,IAWT+mD,QAAS,WAKP,MAJI9pE,MAAKm/E,cACPn/E,KAAK8jB,SACL9jB,KAAK0jH,SAAShkH,SAAS,aAElBM,MAWT+pE,OAAQ,WAKN,MAJK/pE,MAAKm/E,cACRn/E,KAAK8jB,SACL9jB,KAAK0jH,SAASpkH,YAAY,aAErBU,MAWTikH,SAAU,WACR,MAAOjkH,MAAK0jH,SAASj8G,QAYvBy8G,SAAU,SAASz8G,GAEjB,MADAzH,MAAK0jH,SAASj8G,KAAKA,GACZzH,MAQTgzH,QAAS,SAAU5hG,GAEjB,MADAzF,GAAO/a,MAAM,0BACN5Q,MAQTozH,QAAS,SAAUhiG,GAEjB,MADAzF,GAAO/a,MAAM,0BACN5Q,MASTiC,KAAM,WAGJ,MAFAjC,MAAK0jH,SAAShgH,IAAI,aAAc,WAChC1D,KAAK6hB,KAAK,QACH7hB,MAUTM,KAAM,WAGJ,MAFAN,MAAK0jH,SAAShgH,IAAI,aAAc,UAChC1D,KAAK6hB,KAAK,QACH7hB,OAKX2rB,GAAOmB,WAAWgH,SAASpnB,KAAK0X,KAAOA,GACtC9f,OAAOumB;AC5KV,cAYA,SAAWc,GAET,GAAIgJ,GAAShJ,EAAOmB,WAAWgH,SAAS6+F,gBAAgBlxH,QAEtDlB,KAAM,SAAU0/G,GACdjgH,KAAK8jB,OAAOm8F,GACZjgH,KAAKiK,KAAOjK,KAAK0jH,SAAS3+G,KAAK,gBAAkB/E,KAAK0jH,SAAS3+G,KAAK,MACpE/E,KAAK6kB,WAAa7kB,KAAK0jH,SAAS/jH,KAAK,eACrCK,KAAK+1C,SAAW,IAAM/1C,KAAKiK,MAG7BiJ,UAAW,SAYXjQ,MAAO,SAAUowH,GACf,GAAItwG,GAAK/iB,IAKT,OAJA+iB,GAAGe,OAAOuvG,GACNx0H,EAAE8jB,WAAW0wG,IACfrzH,KAAK0jH,SAAShkH,SAAS,iBAAiBJ,YAAY,YAE/CU,MASTyzH,cAAe,SAAUpwH,GACvB,GAAIzC,GAAYyC,EAAM1D,KAAKiB,UACvBqJ,EAAO5G,EAAM1D,KAAKklB,WAClB2gE,EAAUniF,EAAM1D,KAAK+2G,SACrBid,EAAwBtwH,EAAM1D,KAAKg0H,qBACnCnuC,GAAQ3jE,KAAKjhB,EAAWqJ,EAAM0pH,MAA2B,GAAuB,UAAd/yH,GACpE4kF,EAAQ+tC,eAAe1zH,KAAK2lF,IAWhCrjE,KAAM,SAAU9e,EAAO+5B,GACrB,GAAIs5E,GAAW12G,IAaf,OAZAA,MAAK8jB,OAAOzgB,EAAO+5B,GAGnBp9B,KAAK0jH,SAASlhG,OAAOnf,EAAOrD,KAAK6zH,cAAc1xG,KAAK9e,GAClDqzG,SAAYA,EACZ91G,UAAayC,EACbqwH,WAAchd,EAASzsG,KACvB4a,WAAc6xF,EAASgN,SAAS/jH,KAAK,eACrCg0H,sBAAyB90H,EAAEiI,MAAM4vG,EAAS6c,eAAgB7c,IACzD12G,KAAKyzH,eAERzzH,KAAK0jH,SAAShkH,SAAS,iBAAiBJ,YAAY,YAC7CU,MAYT8pE,QAAS,WACP,GAAI9pE,KAAKm/E,YAIP,MAHAn/E,MAAK8jB,SACL9jB,KAAK0jH,SAASpkH,YAAY,iBAC1BU,KAAK0jH,SAAS3+G,KAAK,WAAY,YACxB/E,MAYX+pE,OAAQ,WACN,IAAK/pE,KAAKm/E,YAIR,MAHAn/E,MAAK8jB,SACL9jB,KAAK0jH,SAAShkH,SAAS,iBACvBM,KAAK0jH,SAASz5E,WAAW,YAClBjqC,MAYXikH,SAAU,WACR,MAAOjkH,MAAK0jH,SAASzvG,OAYvBiwG,SAAU,SAAUz8G,GAElB,MADAzH,MAAK0jH,SAASzvG,IAAIxM,GACXzH,MAQTgzH,QAAS,SAAU5hG,GAEjB,MADAzF,GAAO/a,MAAM,0BACN5Q,MAOTozH,QAAS,SAAUhiG,GAEjB,MADAzF,GAAO/a,MAAM,0BACN5Q,OAIX2rB,GAAOmB,WAAWgH,SAASpnB,KAAKioB,OAASA,GACxCrwB,OAAOumB;ACtKV,cAWA,SAAWc,GAET,GAAI40G,GAAa7+G,WAAWjgB,QAE1ByR,UAAW,aACX+gB,kBAAmB,kBAEnBoiD,SACAmqD,gBACAC,SAAU,KAGVlgI,KAAM,SAAU4nB,GACdnoB,KAAK8jB,SACL9jB,KAAKygI,SAAWt4G,GAQlBu4G,cAAe,SAAUC,EAAav0G,GACpCpsB,KAAKq2E,MAAQjqD,EACbpsB,KAAKwgI,aAAeG,EACpB3gI,KAAKi0B,kBAAoB,IAAM0sG,EAE3B3gI,KAAKygI,UAAUzgI,KAAKygI,SAAS34G,WASnC+B,QAAS,SAAUjmB,GAEjB,MADA/E,GAAEmB,KAAKi0B,mBAAmBrwB,KAAKA,GACxB5D,MAST4gI,WAAY,SAAUC,GACpB,GAAI99G,GAAK/iB,IAET,KAAK6gI,EAAU,OAAO,CAEtB,IAAIr8G,GAAMzB,EAAG+9G,gBAAgBD,GACzBE,EAAWhlG,cAAc,SACzBilG,EAAWH,EAASzyH,IAGpBge,GACFxkB,KAAM,WACNsmC,SAAU2yF,EAASt9H,GACnB6tB,KAAMyvG,EAASzyH,IACfwb,MAAOi3G,EAAS1nF,QAChB8nF,SAAUJ,EAASK,eACnBC,aAAcN,EAASO,cACvBjhG,YAAa0gG,EAAS1gG,YAExB56B,IAAG8nB,QAAQmsD,UAAUptD,EAAOy0G,EAAS1nF,QAAS30B,GAC9CzB,EAAGs+G,eAAeR,EAElB,IAAI3nF,GAAOn2B,EAAGu+G,UAAUv+G,EAAGszD,MAAO,SAAUn6D,GAAK,MAAOA,GAAE9N,MAAQyyH,EAASzyH,KAgB3E,OAfI8qC,GAAK5Q,UAAY4Q,EAAK5Q,SAASx6B,OAAS,EACtCizH,IAAaC,EAEfj+G,EAAGw+G,UAAWnzH,IAAK8qC,EAAK9qC,MAExB2U,EAAGy+G,YAAapzH,IAAK8qC,EAAK9qC,MAG5B2U,EAAG0+G,UAAWrzH,IAAK8qC,EAAK9qC,KAAO,WAC7B2U,EAAGw+G,UAAWnzH,IAAK8qC,EAAK9qC,QAI5B2U,EAAG6kE,QAAQ7kE,EAAGszD,QAEP,GAQTgrD,eAAgB,SAAUnoF,GACxB,GAAIn2B,GAAK/iB,IAMT,OALA+iB,GAAG2+G,UAAU3+G,EAAGszD,MAAO,SAAUn6D,GAE/B,MADAA,GAAEhU,SAAYgU,EAAE9N,MAAQ8qC,EAAK9qC,IACtB8N,IAGF6G,GAST4+G,iBAAkB,SAAUC,EAAOC,GACjC,GAAI9+G,GAAK/iB,KACLk5C,EAAOn2B,EAAGu+G,UAAUv+G,EAAGszD,MAAO,SAAUn6D,GAAK,MAAOA,GAAE9N,MAAQwzH,GAClE,KAAK1oF,EAAM,CAET,GAAI4oF,GAAc/lG,cAAc,SAC5BglG,EAAWa,EAAM9sH,UAAU8sH,EAAMx2H,QAAQ,KAAO,EAAGw2H,EAAM9zH,OAC7D,OAAIizH,KAAae,GAAyF,OAA1E/+G,EAAGu+G,UAAUv+G,EAAGszD,MAAO,SAAUn6D,GAAK,MAAOA,GAAE9N,MAAQ0zH,MACrF/+G,EAAG0+G,UAAWrzH,IAAK0zH,GAAe,WAChC/+G,EAAGy+G,YAAapzH,IAAK0zH,IACrB/+G,EAAG4+G,iBAAiBC,EAAOC,MAEtB,GAYX,MAPIA,GACF9+G,EAAG69G,WAAW1nF,GAGdn2B,EAAGs+G,eAAenoF,GACf0uC,QAAQ7kE,EAAGszD,QAET,GAST0rD,qBAAsB,SAAU7zF,EAAU8zF,GACxC,GAAIj/G,GAAK/iB,KAELisE,EAAQlpD,EAAGk/G,WAAWl/G,EAAGszD,MAAO,SAAUn6D,GAC5C,MAAOA,GAAE3Y,IAAM2qC,GAAYhyB,EAAEgmH,YAG3Bj2D,GAAMn+D,OAAS,GACjBvI,GAAG8L,IAAIxR,KAAK,kCAAoCytC,SAAYY,EAAUi0F,mBAAsB,IAAsB5wH,KAAK,SAAU2pB,GAC/Hr8B,EAAEkB,KAAKksE,EAAO,SAAU1kE,EAAG2xC,GACzBA,EAAKkpF,YAAclnG,IAGrBnY,EAAG6kE,QAAQ7kE,EAAGszD,OACdnxE,SAAS0kB,MAAQqiD,EAAM,GAAG9yB,SAAWje,EAAQ,EAAI,KAAOA,EAAQ,IAAM,OAY5EmnG,YAAa,SAAUC,EAAYllG,GACjC,GAAIra,GAAK/iB,IACTo9B,GAAWA,GAAYv+B,EAAEwnG,IAEzB,IAAIntD,GAAOn2B,EAAGu+G,UAAUv+G,EAAGszD,MAAO,SAAUn6D,GAAK,MAAOA,GAAE9N,MAAQk0H,GAElEv/G,GAAG0+G,SAASvoF,EAAM,WAChBn2B,EAAG6kE,QAAQ7kE,EAAGszD,OACdj5C,OAUJukB,OAAQ,SAAUvkB,GAChB,GAAIra,GAAK/iB,KACLuD,EAAKgC,GAAGmE,GAAGswC,QACX4nF,EAAQ7lG,cAAc,QAE1B/7B,MAAKyhI,UAAWl+H,GAAIA,EAAI6K,IAAKwzH,GAAS,WACpC7+G,EAAG6kE,QAAQ7kE,EAAGszD,OACVj5C,GAAUA,OAUlBid,iBAAkB,SAAUnM,EAAU9Q,GACpC,GAAIra,GAAK/iB,KAELisE,EAAQlpD,EAAGk/G,WAAWl/G,EAAGszD,MAAO,SAAUn6D,GAC5C,MAAOA,GAAE3Y,IAAM2qC,GAGb+9B,IAASA,EAAMn+D,OAAS,GAC1BiV,EAAGw/G,gBAAgBt2D,EAAM,IAAI16D,KAAK,SAAU+2B,GAC1C2jC,EAAMz4D,QAAQ,SAAU0lC,GACtBA,EAAK5Q,SAAW/N,KAAKC,MAAM8N,KAG7BvlB,EAAG6kE,QAAQ7kE,EAAGszD,OACVj5C,GAAUA,OAapB6f,sBAAuB,SAAU/O,EAAU9Q,GACzC,GAAIra,GAAK/iB,KACLisE,EAAQlpD,EAAGy/G,qBAAqBz/G,EAAGszD,MAAOnoC,EAC1C+9B,GAAMn+D,OAAS,EACjBm+D,EAAMz4D,QAAQ,SAAU0lC,GACtBn2B,EAAGs3B,iBAAiBnB,EAAK31C,GAAI65B,KAG/Bra,EAAG4+B,UAUP8gF,qBAAsB,WACpB,GAAIvpF,GAAOl5C,KAAKshI,UAAUthI,KAAKq2E,MAAO,SAAUn6D,GAAK,MAAOA,GAAEhU,UAC9D,OAAOgxC,IAAQA,EAAKC,SAUtBupF,qBAAsB,SAAUn/H,EAAI0G,GAClCjK,KAAK0hI,UAAU1hI,KAAKq2E,MAAO,SAAUn6D,GAGnC,MAFIA,GAAE3Y,IAAMA,IACV21C,KAAKC,QAAUlvC,GACViS,IAET6G,GAAG6kE,QAAQ7kE,GAAGszD,QAShBssD,iBAAkB,SAAUp/H,GAC1B,GAAIwf,GAAK/iB,KACLisE,EAAQlpD,EAAGk/G,WAAWl/G,EAAGszD,MAAO,SAAUn6D,GAC5C,MAAOA,GAAE3Y,IAAMA,GAGb0oE,IAASA,EAAMn+D,OAAS,GAC1BvI,GAAG8L,IAAIxR,KAAK,wBAA0BytC,SAAU/pC,IAAMgO,KAAK,SAAUtH,GACnEgiE,EAAMz4D,QAAQ,SAAU0lC,GACtBA,EAAKC,QAAUlvC,IAEjB8Y,EAAG6kE,QAAQ7kE,EAAGszD,UAWpBusD,cAAe,SAAU32D,EAAO42D,GAC9B,IAAK,GAAIt7H,GAAI,EAAGA,EAAI0kE,EAAMn+D,OAAQvG,IAAK,CACrC,GAAIs7H,EAAU52D,EAAM1kE,IAClB,OAAQ0kE,EAAM1kE,GAEd,IAAI0kE,EAAM1kE,GAAG+gC,UAAY2jC,EAAM1kE,GAAG+gC,SAASx6B,OAAS,EAAG,CACrD,GAAIg1H,GAAY9iI,KAAK4iI,cAAc32D,EAAM1kE,GAAG+gC,SAAUu6F,EACtD,IAAIC,GAAaA,EAAUh1H,OAAS,EAElC,MADAg1H,GAAUvvH,KAAK04D,EAAM1kE,IACdu7H,GAKf,MAAO,OAOTxB,UAAW,SAAUr1D,EAAO42D,GAC1B,GAAI5/G,GAASjjB,KAAKiiI,WAAWh2D,EAAO42D,EACpC,OAAQ5/G,IAAUA,EAAOnV,OAAS,EAAKmV,EAAO,GAAK,MAOrDg/G,WAAY,SAAUh2D,EAAO42D,GAE3B,IAAK,GADD5/G,MACK1b,EAAI,EAAGA,EAAI0kE,EAAMn+D,OAAQvG,IAChC,GAAIs7H,EAAU52D,EAAM1kE,IAClB0b,EAAO1P,KAAK04D,EAAM1kE,QAElB,IAAI0kE,EAAM1kE,GAAG+gC,UAAY2jC,EAAM1kE,GAAG+gC,SAASx6B,OAAS,EAAG,CACrD,GAAIi1H,GAAa/iI,KAAK4iI,cAAc32D,EAAM1kE,GAAG+gC,SAAUu6F,EACnDE,IAAcA,EAAWj1H,OAAS,IACpCmV,EAASA,EAAOjD,OAAO+iH,EAAW,KAK1C,MAAO9/G,IAUTu/G,qBAAsB,SAAUv2D,EAAO/9B,GACrC,GAAInrB,GAAK/iB,KACLijB,IAkBJ,OAjBAgpD,GAAMz4D,QAAQ,SAAU3M,GACtB,GAAIA,EAAKyhC,UAAYzhC,EAAKyhC,SAASx6B,OAAS,EAAG,CAC7C,GAAIk1H,GAAgBn8H,EAAKyhC,SAAS3N,OAAO,SAAUze,GAAK,MAAOA,GAAE3Y,IAAM2qC,GACnE80F,GAAcl1H,OAAS,GACzBmV,EAAO1P,KAAK1M,EAGd,IAAIk8H,GAAahgH,EAAGy/G,qBAAqB37H,EAAKyhC,SAAU4F,EACpD60F,GAAWj1H,OAAS,GACtBi1H,EAAWvvH,QAAQ,SAAU0I,GACtB+G,EAAOk3B,KAAK,SAAUz4C,GAAM,MAAOA,GAAG6B,KAAO2Y,EAAE3Y,MAClD0f,EAAO1P,KAAK2I,QAMf+G,GASTy+G,UAAW,SAAUz1D,EAAOg3D,GAC1B,IAAK,GAAI17H,GAAI,EAAGA,EAAI0kE,EAAMn+D,OAAQvG,IAChC0kE,EAAM1kE,GAAK07H,EAAWh3D,EAAM1kE,IACxB0kE,EAAM1kE,GAAG+gC,UAAY2jC,EAAM1kE,GAAG+gC,SAASx6B,OAAS,GAClD9N,KAAK0hI,UAAUz1D,EAAM1kE,GAAG+gC,SAAU26F,EAItC,OAAOh3D,IAQT2b,QAAS,SAAUx7D,GACjB82G,SAASr/H,OACPs/H,MAAMv2G,cAAcw2G,UAAU7C,YAAc5gI,KAAMysB,EAAOi3G,WAAaC,WAAYr+E,UAAWx1B,UAAWy1B,aACxGhgD,SAASq+H,eAAevjI,KAAKwgI,gBASjCiB,SAAU,SAAUZ,EAAUn7F,EAAW89F,GACvC,GAAIzgH,GAAK/iB,IACT,IAAI+iB,EAAGszD,MAAO,CACZ,GAAIn9B,GAAOn2B,EAAGu+G,UAAUv+G,EAAGszD,MAAO,SAAUn6D,GAC1C,MAAOA,GAAE9N,MAAQyyH,EAASzyH,KAGxB8qC,IACFn2B,EAAGw/G,gBAAgBrpF,GAAM3nC,KAAK,SAAUnK,GACtC,GAAIA,EAAK,CACP,GAAIkhC,GAAW/N,KAAKC,MAAMpzB,EAC1B8xC,GAAKuqF,YAAen7F,EAASx6B,OAAS,EACtCorC,EAAK5Q,SAAWA,EAEZ5C,GAAWA,IACVwT,EAAKuqF,aAAa1gH,EAAG6kE,QAAQ7kE,EAAGszD,UAEtCtuD,KAAK,SAAUiJ,GAChBzO,IAAIgO,MAAM,cAAeS,GACrBwyG,GAAQA,EAAOxyG,OAY3BuxG,gBAAiB,SAAUrpF,GACzB,GAAIwqF,GAAe1jI,KAAKshI,UAAUthI,KAAKq2E,MAAO,SAAUn6D,GAAK,MAAOA,GAAEhU,UACtE,OAAO3C,IAAG8L,IAAIxR,KAAK,6BACjBytC,SAAU4L,EAAK31C,GACfogI,WAAYzqF,EAAK9qC,IACjBw1H,iBAAkBF,EAAeA,EAAat1H,IAAM,MAQxDozH,WAAY,SAAUtoF,GACpBl5C,KAAK0hI,UAAU1hI,KAAKq2E,MAAO,SAAUn6D,GAUnC,MATIA,GAAE9N,MAAQ8qC,EAAK9qC,KACjB8N,EAAE2nH,UAAY3nH,EAAE2nH,SAChBt+H,GAAG8L,IAAIxR,KAAK,+BACVikI,UAAW5nH,EAAE2nH,SACbF,WAAYzqF,EAAK9qC,KAChB,GAAI,IAAI,GAAM,IACR8qC,EAAK9qC,IAAIhD,QAAQ8Q,EAAE9N,QAAS,IACrC8N,EAAE2nH,UAAW,GAER3nH,IAETlc,KAAK4nF,QAAQ5nF,KAAKq2E,QAOpBkrD,SAAU,SAAUroF,GAClBl5C,KAAK0hI,UAAU1hI,KAAKq2E,MAAO,SAAUn6D,GAUnC,MATIA,GAAE9N,MAAQ8qC,EAAK9qC,KACjB8N,EAAE2nH,UAAW,EACbt+H,GAAG8L,IAAIxR,KAAK,+BACVikI,UAAW5nH,EAAE2nH,SACbF,WAAYzqF,EAAK9qC,KAChB,GAAI,IAAI,GAAM,IACR8qC,EAAK9qC,IAAIhD,QAAQ8Q,EAAE9N,QAAS,IACrC8N,EAAE2nH,UAAW,GAER3nH,IAETlc,KAAK4nF,QAAQ5nF,KAAKq2E,QAQpByqD,gBAAiB,SAAU5nF,GACzB,GAAI10B,GAAM,GAAIjf,IAAGkf,IAAI,gBASrB,OARAD,GACGG,SAAS,MAAOsgC,WAChBtgC,SAAS,MAAOugC,WAChBvgC,SAAS,KAAMu0B,EAAK31C,IAEnB21C,EAAK9qC,KAAKoW,EAAIG,SAAS,QAASu0B,EAAK9qC,KACrC8qC,EAAK6qF,UAAUv/G,EAAIG,SAAS,WAAYu0B,EAAK6qF,UAE1Cv/G,EAAIpB,aAKfuI,GAAOmB,WAAWgH,SAASsmB,WAAWmmF,WAAaA,GAElDj8H,OAAOumB;ACzgBV,cAeA,SAAWc,GACT,GAAIyD,GAAa1N,WAAWjgB,QAC1Bi+C,SAAU,KACVskF,UAAW,EACXC,iBAAiB,EACjB1jI,KAAM,SAAUk2G,EAAcytB,GAC5BlkI,KAAK8jB,OAAO2yF,GACZz2G,KAAKgkI,UAAYE,EACbA,IAAclkI,KAAKikI,iBAAkB,GACrCplI,EAAEuzB,cAAcqkF,IAClB53G,EAAE4C,OAAOzB,KAAMy2G,IAKnBvjG,UAAW,aAWXmwB,YAAa,SAAUpyB,EAAKkzH,GAE1B,MADAnkI,MAAKiC,KAAKgP,EAAKkzH,EAAa9qH,aAAaC,SAClCtZ,MAYT8uC,UAAW,SAAU79B,EAAKkzH,GAExB,MADAnkI,MAAKiC,KAAKgP,EAAKkzH,EAAa9qH,aAAaE,OAClCvZ,MAcTihH,SAAU,SAAUhwG,EAAKkzH,GAEvB,MADAnkI,MAAKiC,KAAKgP,EAAKkzH,EAAa9qH,aAAaG,MAClCxZ,MAYTokI,aAAc,SAAUC,EAAU5zG,EAAS0zG,EAAaG,GAGtD,MAFAtkI,MAAKgkI,UAAYK,EACjBrkI,KAAKikI,iBAAkB,EAChBjkI,KAAKiC,KAAKwuB,EAAS0zG,EAAaG,IAIzCC,eAAgB,WACd,IAAIvkI,KAAKikI,gBAAT,CAEAjkI,KAAKgkI,UAAY,IAEjB,IAAI7uB,GAAUt2G,EAAE,sBAAsBgkE,MACtC,IAAKsyC,EAAQrnG,OAAb,CACA,GAAI02H,GAAiBrvB,EAAQ7sE,UACzBk8F,GAAe12H,SACjB9N,KAAKgkI,UAAYQ,EAAez/H,KAAK,MACP,mBAAnB/E,MAAKgkI,YACdhkI,KAAKgkI,UAAYhkI,KAAKgkI,UAAU91H,QAAQ,kBAAmB,SAcjEjM,KAAM,SAAUwuB,EAAS0zG,EAAaG,GACpC,GAAIG,GACAnhF,EACAtwB,EAAUmxG,GAAe,GACzBphH,EAAK/iB,IAET+iB,GAAGwhH,iBAECvkI,KAAKgkI,UACPhkI,KAAK0/C,SAAW7gD,EAAE,mBAAqBmB,KAAKgkI,WAE5ChkI,KAAK0/C,SAAW7gD,IAGlBylI,EAAmBh+D,MAAMg+D,GAAqCjrH,aAAaE,MAA/B+qH,CAE5C,KACE,GAAIzlD,GAAahgF,EAAEsoB,UAAUsJ,EAC7BA,GAAUouD,EAAWnG,QACrB,MAAOt0E,IAIT,GADApE,KAAKM,OACCzB,EAAE2V,KAAKic,GAAU,CACrBA,EAAUA,EAAQ/R,eAAeX,WAAW,SAAe,KAEvDumH,IAAoBjrH,aAAaE,QAAO+pC,GAAU,GAClDghF,IAAoBjrH,aAAaC,SAAWgrH,IAAoBjrH,aAAaE,OAAS+qH,IAAoBjrH,aAAaG,MACzHjU,GAAGqL,MAAM,6BAIT6zH,EADEnhF,EACOzkD,EAAE,UAAUgD,QAEZhD,EAAE,UAAUgD,QAInB4iI,EAAO32H,OAAS,IAClB22H,EAAS5lI,EAAE4lI,EAAOA,EAAO32H,OAAS,IAGpC,IAAIyzG,GAAgB9wF,EAAQrlB,QAAQ,IAChCm2G,KAAiB,IACnBvuF,EAAUvC,EAAQ3b,UAAUysG,EAAgB,EAAG9wF,EAAQ3iB,QAAQuR,wBAC/DoR,EAAUA,EAAQ3b,UAAU,EAAGysG,GAGjC,IAAI3zG,GAASrI,GAAG0nB,KAAK2uD,SACrBhuE,GAAOhG,KAAO07C,EAAU,MAAQ,MAEhC11C,EAAO82H,UAAYphF,EAAU,QAAU,YACnCghF,GAAmBjrH,aAAaG,OAAM5L,EAAO82H,UAAY,QAE7D92H,EAAO+2H,UAAarhF,EAAU,gBAAkB,GAChD11C,EAAO6iB,QAAUA,EACjB7iB,EAAOolB,QAAUA,CAEjB,IAAI9sB,EAEJX,IAAG0nB,KAAKppB,OAAO,qCAAsC+J,GAAQ2D,KAAK,SAAU3N,GAC1E,GAAImf,EAAG28B,SAAS5xC,OACd5H,EAAa6c,EAAG28B,SAASx7C,KAAK,wBACxB6e,EAAG28B,SAASx7C,KAAK,wBAAwB4J,QAC7C5H,EAAWwqC,SAEb3tB,EAAG28B,SAASoJ,QAAQllD,GACpBsC,EAAa6c,EAAG28B,SAASx7C,KAAK,wBAAwBR,KAAMkhI,gBAAiB,aACxE,CACL,GAAIC,GAAgBhmI,EAAE,+CAA+CiP,MACrE5H,GAAa2+H,EAAgBhmI,EAAE,+CAAiDA,EAAE,yBAAyB4U,SAEtGvN,EAAW4H,QAKd5H,EAAWhC,KAAK,mBAAmBR,IAAI,UAAW,QAClDwC,EAAWxG,SAAS,yBACpBwG,EAAWhC,KAAK,aAAaN,KAAKA,KANlCsC,EAAarH,EAAE,iBACfqH,EAAW4iD,QAAQllD,GACnB/E,EAAE,wBAAwBimI,KAAK,oDAQnC5+H,EAAWhC,KAAK,gBAAgBpD,GAAG,QAAS,WAC1CiiB,EAAGziB,WAIT,MAAON,OAWTM,KAAM,WAEJ,MADAqrB,GAAOyD,WAAWttB,UACX9B,OAKX2rB,GAAOyD,WAAaA,EASpBzD,EAAOyD,WAAWttB,QAAU,WAC1BjD,EAAE,kBAAkB+uE,IAAI,oBAAoBttE,OAC5CzB,EAAE,+BAA+B6xC,SACjC7xC,EAAE,0BAA0Ba,SAAS,8BAA8BJ,YAAY,2BAKhFgF,OAAOumB,UAAUiC,WAAWmC;AChP/B,cAYA,SAAWtD,GAET,GAAIuD,GAAUxN,WAAWjgB,QAEvBsjI,SAAU,GACVC,MAAO,GAEPzkI,KAAM,SAASwkI,GACb/kI,KAAK+kI,SAAWA,GAAYlmI,EAAE,YAWhComI,OAAQ,WACN,GAAIliH,GAAK/iB,IAGT,OAFA+iB,GAAGgiH,SAASrlI,SAAS,mBAEdqjB,GAYTmiH,YAAa,SAAUC,GACrB,GAAIpiH,GAAK/iB,IAIT,OAHAmlI,GAAYA,GAAa,IACrBpiH,EAAGiiH,OAAO/+H,aAAa8c,EAAGiiH,OAC9BjiH,EAAGiiH,MAAQ1+H,WAAW,WAAcyc,EAAGkiH,UAAYE,GAC5CpiH,GAUTqiH,MAAO,WACL,GAAIriH,GAAK/iB,IAET,OADA+iB,GAAGgiH,SAASzlI,YAAY,mBACjByjB,GAWT9gB,KAAM,WAIJ,MAH6B,KAAzBjC,KAAK+kI,SAASj3H,SAAc9N,KAAK+kI,SAAWlmI,EAAE,YAElDmB,KAAKilI,SACEjlI,MAYTokI,aAAc,SAAUe,GACtB,GAAIx4H,GAAS9N,EAAE,2CACf8N,GAAO3N,OAAO,0CACd,IAAIqmI,GAAmBxmI,EAAE,oBAKzB,OAJAmB,MAAK+kI,SAAWM,EAEdF,EAAYnlI,KAAKklI,YAAYC,GAAanlI,KAAKiC,OAE1CjC,MAcTM,KAAM,SAAUglI,EAAaH,EAAW9R,GAEtC,GADIrzH,KAAKglI,OAAO/+H,aAAajG,KAAKglI,OAC9BM,EAAa,CACf,GAAIjqC,GAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KAC3BswD,GAAMp5F,KAAKqjI,EAAa,UAAW,KAAMH,GAM3C,MAJItmI,GAAE8jB,WAAW0wG,IACf/sH,WAAW,WAAc+sH,KAAmBzgE,OAE9C5yD,KAAKolI,QACEplI,OAMX2rB,GAAOuD,QAAUA,GAEhB5qB,OAAOumB,UAAUiC,WAAWmC;ACpI/B,cAGA,SAAWtD,GAQT,GAAI45G,IAUFC,iBAAkB,SAAUztG,EAAS0tG,EAASC,EAAcC,GAC1D,GAAIC,EAEJ,IAAIF,EACF,GAAIE,GAAMrgI,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW2/D,aAE1C,IAAI4gD,GAAMrgI,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,UAGjC,QAAQogH,EAAQ79H,MACd,IAAK,SACL,IAAK,OACH,MAAO,IAAIg+H,GAAIlyE,KAAK37B,EAAS0tG,EAASzlI,KAAM2lI,EAC9C,KAAK,OACH,MAAO,IAAIC,GAAIx0C,KAAKr5D,EAAS0tG,EAASzlI,KAAM2lI,EAC9C,KAAK,OACH,MAAO,IAAIC,GAAInxH,KAAKsjB,EAAS0tG,EAASzlI,KAAM2lI,EAC9C,KAAK,UACL,IAAK,eACL,IAAK,QACH,MAAO,IAAIC,GAAIC,QAAQ9tG,EAAS0tG,EAASzlI,KAAM2lI,EACjD,KAAK,YACH,MAAO,IAAIC,GAAI7xC,UAAUh8D,EAAS0tG,EAASzlI,KAAM2lI,EACnD,KAAK,WACH,MAAO,IAAIC,GAAI31G,SAAS8H,EAAS0tG,EAASzlI,KAAM2lI,EAClD,KAAK,QACH,MAAO,IAAIC,GAAIE,MAAM/tG,EAAS0tG,EAASzlI,KAAM2lI,EAC/C,KAAK,WACH,MAAO,IAAIC,GAAIG,SAAShuG,EAAS0tG,EAASzlI,KAAM2lI,EAClD,KAAK,aACH,MAAO,IAAIC,GAAI/iB,WAAW9qF,EAAS0tG,EAASzlI,KAAM2lI,EACpD,SACE,MAAO,IAAIC,GAAII,cAAcjuG,EAAS0tG,EAASzlI,KAAM2lI,KAa3DM,qBAAsB,SAAUC,GAC9B,GAAInjH,GAAK/iB,IAEL+iB,GAAG9a,cACL8a,EAAG+mD,SAML,IAAIq8D,GAAsBtnI,EAAE0nB,UACxBxD,GAAGqjH,gBAAgBrjH,EAAGqjH,eAAe7yH,KAAK4yH,EAE9C,KAAK,GAAIpuG,KAAWmuG,GACdnjH,EAAGsC,WAAW0S,GAASsuG,eACzB,SAAWC,EAAUpvG,GAEnB,GAAIqvG,GAAmB1nI,EAAE0nB,UACrBxD,GAAGqjH,gBAAgBrjH,EAAGqjH,eAAe7yH,KAAKgzH,GAE9C1nI,EAAEiwB,KAAKoI,EAAI/K,MAAMxD,KAAK,WACpBuO,EAAImC,SAAS6sG,EAASI,GAAUvnH,MAAOmnH,EAASI,GAAUjrG,cAAc,GAAOmrG,eAAeC,YAAa,EAC3GF,EAAiBz+G,aAGlBiQ,EAAShV,EAAGsC,WAAW0S,GAW9B,OAPA4G,sBACAL,mBAEAz/B,EAAE,eAAey0C,OAAO,WAAcz0C,EAAEmB,MAAM+E,KAAK,QAASlG,EAAEmB,MAAMiU,SAEpEkyH,EAAoBr+G,UAEb9nB,MAUTwmI,aAAc,SAAUN,GACtB,IAAK,GAAInuG,KAAWmuG,GACdlmI,KAAKqlB,WAAW0S,GAASsuG,cAC3BrmI,KAAKqlB,WAAW0S,GAASyuG,cAG7B,OAAOxmI,OAYT0mI,SAAU,WACR,GAAI1vG,GAAOh3B,KAAKqlB,WAAW4R,SAI3B,OAHAD,GAAKxjB,QAAQ,SAAUumB,GACrBA,EAAU+vC,YAEL9pE,MAYT2mI,QAAS,WACP,GAAI3vG,GAAOh3B,KAAKqlB,WAAW4R,UACvB2vG,EAAc5mI,KAAK6mI,YACvB,IAAID,EAAa,CACf,GAAI91C,GAAU81C,EAAY91C,OAC1B95D,GAAKxjB,QAAQ,SAAUumB,GACrB,GAAIhC,GAAUgC,EAAU9vB,KACpB4nF,EAAgBf,EAAQ/4D,EACvB85D,GAAc5pF,cACjB8xB,EAAUgwC,eAId/yC,GAAKxjB,QAAQ,SAAUumB,GACrBA,EAAUgwC,UAGd,OAAO/pE,OAaT8mI,uBAAwB,WACtB,GAAI9vG,GAAOh3B,KAAKqlB,WAAW4R,UACvB2vG,EAAc5mI,KAAK6mI,YACvB,IAAID,EAAa,CACf,GAAI91C,GAAU81C,EAAY91C,OAC1B95D,GAAKxjB,QAAQ,SAAUumB,GACrB,GAAIhC,GAAUgC,EAAU9vB,KACpB4nF,EAAgBf,EAAQ/4D,EACxB85D,GAAc5pF,cAChB8xB,EAAU+vC,gBAId9yC,GAAKxjB,QAAQ,SAAUumB,GACjBA,EAAU9xB,cAAc8xB,EAAUgwC,UAG1C,OAAO/pE,OAYT+mI,wBAAyB,SAAU5c,GAEjC,IAAK,GADDnzF,GAAOh3B,KAAKqlB,WAAW4R,UAClB+vG,EAAO,EAAGA,EAAOhwG,EAAKlpB,OAAQk5H,IAErC,IAAK,GADD9vG,GAAMF,EAAKgwG,GACNz/H,EAAI,EAAGA,EAAI2vB,EAAI+vG,YAAYn5H,OAAQvG,IAC1C,GAAI4iH,IAAcjzF,EAAI+vG,YAAY1/H,GAChC,MAAO2vB,EAIb,OAAO,OAWT2zE,UAAW,WAET,IAAK,GADD7zE,GAAOh3B,KAAKqlB,WAAW4R,UAClB+vG,EAAO,EAAGA,EAAOhwG,EAAKlpB,OAAQk5H,IACrC,GAAIhwG,EAAKgwG,GAAMn8B,YACb,OAAO,CAGX,QAAO,GAKXl/E,GAAO45G,gBAAkBA,GACxBjhI,OAAOumB,UAAUqC;AChPpB,cAUA,SAAWvB,GAET,GAAIu7G,GAAsBv7G,EAAO+I,WAAWjzB,QAC1CyR,UAAW,sBASXi0H,aAAc,WAGZ,IAAK,GAFDC,MACApwG,EAAOh3B,KAAKi3B,UACP+vG,EAAO,EAAGA,EAAOhwG,EAAKlpB,OAAQk5H,IACrCI,EAAWpwG,EAAKgwG,GAAM/8H,MAAQ+sB,EAAKgwG,GAAMvtG,UAE3C,OAAO2tG,KAMXz7G,GAAOmB,WAAWgH,SAASpnB,KAAKw6H,oBAAsBA,GACrD5iI,OAAOumB;ACnCV,cAYA,SAAWc,GAET,GAAI07G,GAAgB3lH,WAAWjgB,QAAQkqB,EAAOuB,OAAOq4G,kBACnDryH,UAAW,gBAEX2zH,aAAc,KACdjvD,aAAa,EACb0vD,YAAa,KAEb/mI,KAAM,SAAU0/G,EAAc2mB,GAC5B,GAAI7jH,GAAK/iB,IACT+iB,GAAGe,OAAOm8F,GACVl9F,EAAG2gG,SAAW7kH,EAAEohH,GAChBl9F,EAAG8jH,aAAeD,EAClB7jH,EAAG60D,YAAcgvD,EAAY3+H,cAS/BA,WAAY,WACV,MAAOjI,MAAK43E,aAWd9N,QAAS,WAIP,MAHA9pE,MAAK0mI,WACL1mI,KAAK43E,aAAc,EACnB53E,KAAK6hB,KAAK,WACH7hB,MAUT+pE,OAAQ,WAIN,MAHA/pE,MAAK2mI,UACL3mI,KAAK43E,aAAc,EACnB53E,KAAK6hB,KAAK,UACH7hB,MAUTM,KAAM,WACJ,GAAIyiB,GAAK/iB,IAIT,OAHAsJ,GAAEyZ,EAAGsC,WAAW4R,WAAWl3B,KAAK,SAAUm3B,GACxCA,EAAI52B,SAECN,MAUTiC,KAAM,WAEJ,MAAOjC,OAUTunI,cAAe,SAAUxvG,EAASyvG,GAChC,MAAO,GAAKxnI,KAAK6mI,aAAaxjD,UAAY,IAAMmkD,EAAY,IAAMzvG,GAUpEgD,SAAU,WACR,MAAO/6B,MAAK6mI,eAMhBl7G,GAAOmB,WAAWgH,SAASpnB,KAAK26H,cAAgBA,GAC/C/iI,OAAOumB;ACzHV,cAWA,SAAWc,GAKT,GAAI87G,IACFv+B,MAAOviG,EAAE,qBACTwiG,cAAe,SAAWxiG,EAAE,sBAG1B+gI,EAAW/7G,EAAOmB,WAAWgH,SAASpnB,KAAK26H,cAAc5lI,QAC3DyR,UAAW,WAEXy0H,OAAQ,KACRhxC,QAAQ,EACRixC,QAAQ,EACRviH,cAGA8G,KAAM,KAENi6G,eAAgB,KAEhB7lI,KAAM,SAAU0/G,EAAc2nB,EAAQhxC,EAAS5iB,EAAO4yD,EAAa94C,GACjE,GAAI/qE,GAAK/iB,IACT+iB,GAAGe,OAAOm8F,EAAc2mB,GAExB7jH,EAAGoJ,KAAOttB,EAAE0nB,WACZxD,EAAGqjH,iBAEH,IAAIyB,GAAYjxC,EAAQkxC,eAAeL,EAAWv+B,MAClDnmF,GAAG9Y,KAAO49H,EAAYA,EAAU9oH,MAAQ6oH,EACxC7kH,EAAG6kH,OAASC,GAAaA,EAAU9oH,OAAS6oH,EAE5C7kH,EAAGxf,GAAKwf,EAAG4kH,QAAU/wC,EAAQrzF,GAC7Bwf,EAAG4zE,OAAS3iB,EAEZjxD,EAAGsC,WAAa,GAAIsG,GAAOmB,WAAWgH,SAASpnB,KAAKw6H,mBACpD,IAAIzB,GAAU7uC,EAAQkxC,cAEtB,KAAK,GAAI/vG,KAAW0tG,GAClB,GAAgB,UAAZ1tG,EAAJ,CAEA,GAAIb,GAAMnU,EAAGyiH,iBAAiBztG,EAAS0tG,EAAQ1tG,IAAU,EAAM+1D,EAC/D52D,GAAIwC,SAAW3W,EAAGwkH,cAAcxvG,EAAShV,EAAG4kH,QAC5CzwG,EAAIy/D,OAAS3iB,EAETjxD,EAAG9a,cACLivB,EAAI4yC,UAGN5yC,EAAI/U,KAAK+U,EAAW,MAAEpV,MAAM0B,OAAQ,WAClCT,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM0B,UAG5BT,EAAGsC,WAAWuuD,WAAW77C,EAASb,GAEpCnU,EAAGukH,YAAczoI,EAAE,aAAekkB,EAAG9Y,KAAO,MAG5CpL,EAAEiwB,KAAK/O,MAAM,KAAMgD,EAAGqjH,gBAAgBz9G,KAAK,WACzC5F,EAAGoJ,KAAKrE,aAWZksD,MAAO,WACL,MAAOh0E,MAAK22F,QAWd7+D,SAAU,WACR,MAAO93B,MAAK2nI,QAUdI,iBAAkB,WAQhB,IAAK,GAPDhlH,GAAK/iB,KAEL+2B,GADMhU,EAAG8jH,aAAanjB,SAChB3gG,EAAG2gG,UACT7rF,EAAQ9U,EAAG4kH,OAEXvgI,KACA4vB,EAAOh3B,KAAKqlB,WAAW4R,UAClB+vG,EAAO,EAAGA,EAAOhwG,EAAKlpB,OAAQk5H,IAAQ,CAC7C,GAAI9vG,GAAMF,EAAKgwG,IACX9vG,EAAI2zE,aAAe3zE,EAAI88C,SAA+B,SAAnB98C,EAAIm/C,MAAMzuE,MAAmBsvB,EAAI24D,cAAgB34D,EAAImvG,gBAC1Fj/H,EAAI2b,EAAGwkH,cAAcrwG,EAAIjtB,KAAM4tB,IAAUX,EAAIuC,YAKjD,GAAI1C,EAAIp3B,KAAK,oBAAqB,CAEhC,GAAIqoI,MACAC,EAAWlxG,EAAIp3B,KAAK,mBACxB,KAAK,GAAIuoI,KAAeD,GACtB,GAAIC,EAAY98H,QAAQ,QAAS,EAAI,CACnC,GAAI+8H,GAAeD,EAAYj5H,MAAM,IACT,KAAxBk5H,EAAar6H,SACfk6H,EAAYjlH,EAAGwkH,cAAcY,EAAa,GAAItwG,IAAUowG,EAASC,IAIvErpI,EAAE4C,OAAO2F,EAAK4gI,GAGhB,MAAO5gI,IAWTspC,OAAQ,WAEN,MADA1wC,MAAK6mI,aAAar8B,UAAUxqG,KAAK2nI,QAC1B3nI,MAUT8pE,QAAS,WAGP,MAFA9pE,MAAK8jB,SACL9jB,KAAK0jH,SAASx/G,KAAK,oBAAoB5D,OAChCN,MAUT+pE,OAAQ,WAGN,MAFA/pE,MAAK8jB,SACL9jB,KAAK0jH,SAASx/G,KAAK,oBAAoBjC,OAChCjC,MAWTooI,cAAe,WACb,MAAOpoI,MAAKqlB,YAWdgmF,oBAAqB,WACnB,GAAIr0E,GAAOh3B,KAAKqlB,WAAW4R,SAC3B,OAAOD,GAAKmjB,KAAK,SAAUjjB,GACzB,GAAImxG,GAASnxG,EAAIuC,UACjB,QAAQvC,EAAI+zE,YAAgC,mBAAXo9B,IAAqC,KAAXA,GAA4B,OAAXA,OAM9EvmH,OAQE0B,OAAQ,WAKdmI,GAAOmB,WAAWgH,SAASpnB,KAAKg7H,SAAWA,GAC1CpjI,OAAOumB;AC/NV,cAWA,SAAWc,GAET,GAAI28G,GAAc5mH,WAAWjgB,QAC3ByR,UAAW,cAEX6kB,QAAS,GACT8uG,aAAc,KACdjvD,YAAa,KACbuxC,YAAa,KACbof,WAAY,KACZC,UAAW,KACXC,cAAe,KACfhgH,OAAQ,KACR+gF,QAAS,GAETjpG,KAAM,SAAUw3B,EAAS6uG,EAAa/9E,GACpC,GAAI9lC,GAAK/iB,IACT+iB,GAAGe,SACHf,EAAG9Y,KAAO8tB,EACVhV,EAAGgV,QAAUA,EACbhV,EAAG8jH,aAAeD,EAClB7jH,EAAG0F,OAASogC,CAGZ,IAAI1xB,GAAwBpU,EAAG8jH,aAAazvG,kBAAkBrU,EAAGgV,QAEjEhV,GAAGymF,QAAUryE,EAAsBu1E,QAGnC3pF,EAAG60D,YAAczgD,EAAsBs5E,WACvC1tF,EAAGwlH,WAAapxG,EAAsBg5E,UACtCptF,EAAGylH,UAAYrxG,EAAsBuxG,SACrC3lH,EAAGomG,YAAchyF,EAAsBwxG,WACvC5lH,EAAG0lH,cAAgBtxG,EAAsByxG,cAU3C59B,cAAe,WACb,MAAOhrG,MAAKyoI,eAUdI,cAAe,SAAS9pH,GACtB/e,KAAKyoI,cAAgB1pH,GASvB9W,WAAY,WACV,MAAOjI,MAAK43E,aASdlP,UAAW,WACT,MAAO1oE,MAAKuoI,YASdt9B,SAAU,WACR,MAAOjrG,MAAKwoI,WASdnC,WAAY,WACV,MAAOrmI,MAAKmpH,aASdr/C,QAAS,WACP,GAAI/mD,GAAK/iB,KACLo4B,EAAOrV,EAAG8jH,aAAazuG,KAAKnB,SAKhC,OAJAmB,GAAK5kB,QAAQ,SAAUs1H,GACrBA,EAAWzjH,WAAWtC,EAAGgV,SAAS+xC,YAEpC/mD,EAAG60D,aAAc,EACV70D,GASTgnD,OAAQ,WACN,GAAIhnD,GAAK/iB,KACLo4B,EAAOrV,EAAG8jH,aAAazuG,KAAKnB,SAKhC,OAJAmB,GAAK5kB,QAAQ,SAAUs1H,GACrBA,EAAWzjH,WAAWtC,EAAGgV,SAASgyC,WAEpChnD,EAAG60D,aAAc,EACV70D,GASTziB,KAAM,WAKJ,MAJIN,MAAKmpH,cACPnpH,KAAK6mI,aAAapyC,MAAMiH,WAAW17F,KAAK+3B,SACxC/3B,KAAKuoI,YAAa,GAEbvoI,MASTiC,KAAM,WACJ,GAAI8gB,GAAK/iB,IACT,IAAI+iB,EAAGomG,YAAa,CAClB,GAAI7vD,GAAQ,EACRyvE,EAAahmH,EAAG8jH,aAAapyC,KACjCs0C,GAAW1yC,SAASl8C,KAAK,SAAU03C,GACjC,MAAIA,GAActuF,KAAOwf,EAAGgV,UAC1BuhC,EAAQu4B,EAAcv4B,OACf,KAIXyvE,EAAWtvC,WAAW12E,EAAGgV,QAASuhC,GAClCv2C,EAAGwlH,YAAa,EAElB,MAAOxlH,IASTgY,SAAU,WACR,MAAO/6B,MAAK6mI,eAIhBl7G,GAAOmB,WAAWgH,SAASpnB,KAAK47H,YAAcA,GAC7ChkI,OAAOumB;AC/LV,cAkCA,SAAWc,GAMT,GAAIq9G,IACFC,QAAS,EACTC,WAAY,GAOVzB,GACFv+B,MAAOviG,EAAE,qBACTwiG,cAAe,SAAWxiG,EAAE,sBAS1BwiI,EAAoBt+G,UAAU6J,WAAWjzB,QAC3CyR,UAAW,oBAQX2zH,aAAc,KACdxwD,MAAO,KACPowD,YAAY,EAEZlmI,KAAM,SAAU6oI,EAAUxC,EAAa94C,GACrC,GAAI/qE,GAAK/iB,IACT+iB,GAAGe,SACHf,EAAG8jH,aAAeD,EAClB7jH,EAAGszD,MAAQ+yD,CACX,IAAIvgF,GAAM,CACV,KAAK,GAAI9wB,KAAWqxG,GAClBrmH,EAAG6wD,WAAW77C,EAAShV,EAAGsmH,mBAAmBtxG,EAAS,KAAM8wB,IAC5DA,KAWJwgF,mBAAoB,SAAUtxG,EAAS9vB,EAAY4gD,GACjD,GAAIygF,GAAS,GAAIz+G,WAAUiC,WAAWgH,SAASpnB,KAAK47H,YAAYvwG,EAAS/3B,KAAK6mI,aAAch+E,EAI5F,OAHI5gD,IACFqhI,EAAOx/D,UAEFw/D,GAUTr7B,kBAAmB,WACjB,MAAOjuG,MAAK0zE,KAAK/4C,OAAO,SAAU6tD,GAChC,MAAOA,GAAO9f,eAYhB6gE,EAAiB1+G,UAAU6J,WAAWjzB,QACxCyR,UAAW,iBAQX2zH,aAAc,KACd16G,KAAM,KAGN5rB,KAAM,SAAUipI,EAAU5C,EAAa94C,GACrC,GAAI/qE,GAAK/iB,IACT+iB,GAAGe,SACHf,EAAG0xE,MAAQ3G,EACX/qE,EAAG8jH,aAAeD,EAElB7jH,EAAGoJ,KAAOttB,EAAE0nB,UACZ,IAAIkjH,KAEJ,KAAK,GAAI5xG,KAAS2xG,GAAU,CAC1B,GAAIV,GAAa/lH,EAAG2mH,QAAQ7xG,EAAO2xG,EAAS3xG,IAAQ,EACpD4xG,GAASl2H,KAAKu1H,EAAW38G,MAG3BttB,EAAEiwB,KAAK/O,MAAM,KAAM0pH,GAAU9gH,KAAK,WAChC5F,EAAGoJ,KAAKrE,aAYZ4hH,QAAS,SAAU5lD,EAAO8S,EAAS5iB,GACjC,GAAIjxD,GAAK/iB,KACL2pI,EAAsB5mH,EAAG8jH,aAAa9wF,SACtChf,EAAM,GAAIlM,WAAUiC,WAAWgH,SAASpnB,KAAKg7H,SAASiC,EAAsB,KAAO7lD,EAAOA,EAAO8S,EAAS5iB,EAAOjxD,EAAG8jH,aAAc9jH,EAAG0xE,MAEzI,OADA1xE,GAAG6wD,WAAWkQ,EAAO/sD,GACdA,GAUT6yG,WAAY,SAAU9lD,GACpB9jF,KAAK6zE,cAAciQ,IAUrB0mB,UAAW,SAAUo9B,GAEnB,MADA5nI,MAAK6mI,aAAar8B,UAAUo9B,GACrB5nI,QAuBPk2B,EAAQxU,WAAWjgB,QACrByR,UAAW,QAEXuhF,MAAO,KACPo1C,KAAM,EACNjyD,aAAa,EACbkyD,aAAc,KACdC,oBACAC,wBAEA3mD,WAAW,EACX4mD,WAAY,GACZ7xG,KAAM,KACN04D,QAAS,KACTo5C,cAAe,KACf7zD,MAAO,KACP8zD,qBAAsB,KACtBh+G,KAAM,KAENmI,WAAY,iBAEZ81G,YAAa,KACbC,YAAa,KAGb9pI,KAAM,SAAU0/G,EAAcryG,GAC5B,GAAImV,GAAK/iB,IAET+iB,GAAGoJ,KAAOttB,EAAE0nB,WAEZxD,EAAG+mH,aAAel8H,EAAOmhB,QAAQriB,KAEjCqW,EAAGuR,WAAa1mB,EAAO0mB,YAAc,iBACrCvR,EAAGqnH,YAAcx8H,EAAOkoB,YAAcj3B,EAAEwkB,QAAO,GAAI9d,IAAG6e,MAAOqC,eAE7D1D,EAAGsnH,YAAcz8H,EAAOooB,WACnBjT,EAAGsnH,aAAkC,KAAnBtnH,EAAGsnH,cACxBtnH,EAAGsnH,YAAc9kI,GAAGmE,GAAG4gI,oBAGzBvnH,EAAGonH,sBACD7/B,QAAU,EACVC,SAAW,EACXC,WAAa,GAGV58F,EAAO+nB,WACZ5S,EAAGe,OAAOlW,EAAO+nB,UACjB5S,EAAGszD,MAAQzoE,EAAO+nB,SAGlB5S,EAAG2gG,SAAW7kH,EAAEohH,GAEhBl9F,EAAGmnH,cAAgBnnH,EAAG2gG,SAAS9hH,QAAQ,iBAAiBjC,KAAK,WAE7DojB,EAAG9Y,KAAO8Y,EAAG2gG,SAAS3+G,KAAK,MAE3Bge,EAAG0xE,MAAQ7mF,EAAOgoB,MAAM7S,EAAG9Y,MAC3B8Y,EAAG0xE,MAAM0Z,SAASnuG,MAElB+iB,EAAGgzB,SAAW,IAAMhzB,EAAG9Y,KAEvB8Y,EAAGsgE,WAAatgE,EAAG2gG,SAAS/jH,KAAK,uBAEjCojB,EAAGknH,WAAa,GAAKlnH,EAAGsgE,UACxBtgE,EAAG60D,YAAc53E,KAAKq2E,MAAMk0D,YAAcxnH,EAAG2gG,SAAS/jH,KAAK,YAC3DojB,EAAG8mH,KAAO,EAGV9mH,EAAGynH,eACHznH,EAAG0nH,YAEH5rI,EAAEiwB,KAAK/L,EAAGqV,KAAKjM,MAAMxD,KAAK,WAExB,GAAI+hH,GAAY3nH,EAAGqV,KAAKnB,SACxByzG,GAAUl3H,QAAQ,SAAUujB,GAC1BA,EAAI5U,KAAK4U,EAAW,MAAEjV,MAAM0B,OAAQ,WAClCT,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM0B,YAI9BT,EAAGoJ,KAAKrE,cAKZ0iH,aAAc,WACZ,GAAIznH,GAAK/iB,IACT+iB,GAAGgnH,iBAAmBhnH,EAAG4nH,qBACzB5nH,EAAGinH,wBAGHjnH,EAAGgnH,iBAAiBv2H,QAAQ,SAAUq+E,GACpC,GAAI95D,GAAU85D,EAAch5C,IAC5B91B,GAAGinH,qBAAqBjyG,IACtB6yG,UAAW,SAAW7yG,EACtB2wC,UAAWmpB,EAAcse,UACzBrgB,WAAY+B,EAAc4e,WAC1B7oG,KAAMuQ,sBAAsB05E,EAAcvtE,MAC1CurE,WAAYgC,EAAcke,WAC1B9f,eAAgB4B,EAAc2e,eAC9BvF,SAAUpZ,EAAc62C,YAI5B3lH,EAAG+tE,QAAU,GAAIq4C,GAAkBpmH,EAAGinH,qBAAsBjnH,EAAIA,EAAG0xE,QAGrEg2C,UAAW,WACT,GAAI1nH,GAAK/iB,KACLo4B,EAAOrV,EAAG0xE,MAAMY,SAASr8C,eACzBwwF,EAAWzmH,EAAG8nH,cAAczyG,EAChCrV,GAAGqV,KAAO,GAAImxG,GAAeC,EAAUzmH,EAAIA,EAAG0xE,OAC9C1xE,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM8qF,cAAe7pF,IAI3C+nH,cAAe,SAAUvnI,EAAIwnI,GAC3B,GAAIhoH,GAAK/iB,KACL+2B,EAAMztB,EAAEyZ,EAAG+tE,SAASk6C,UAAU,SAAU/2H,EAAK7F,GAAO,MAAO,IAG/D,OAFI28H,IAASlsI,EAAE4C,OAAOs1B,EAAKg0G,GAC3Bh0G,EAAIxzB,GAAKA,EACFwzB,GAST8zG,cAAe,SAAUzyG,GAIvB,IAAK,GAHDrV,GAAK/iB,KACLirI,KAEK1jI,EAAI,EAAGA,EAAI6wB,EAAKtqB,OAAQvG,IAAK,CACpC,GAAIswB,GAAQO,EAAK7wB,GAAO,EACxBwb,GAAGgnH,iBAAiBv2H,QAAQ,SAAU03H,GACpC,GAAIC,GAAsBD,EAAeryF,KAErCuyF,EAAqBroH,EAAGinH,qBAAqBmB,GAC7Ct5C,EAAgB9uE,EAAG+tE,QAAQq6C,GAC3BE,GACFt7C,OAAQl4D,EACR+yG,UAAWQ,EAAmBR,UAC9B7rH,MAAOqZ,EAAK7wB,GAAG4jI,GACf9vG,aAAcjD,EAAK7wB,GAAG6jI,EAAmBR,WACzCliE,UAAWmpB,EAAcnpB,YACzBonB,WAAY+B,EAAc5pF,cAAgB8a,EAAG9a,aAC7CL,KAAMwjI,EAAmBxjI,KACzBioF,WAAYu7C,EAAmBv7C,WAC/BI,eAAgBm7C,EAAmBn7C,eACnCgb,SAAUmgC,EAAmBngC,SAG1BggC,GAAapzG,KAChBozG,EAAapzG,IACXt0B,GAAIs0B,EACJiwG,oBAGJmD,EAAapzG,GAAuB,eAAEszG,GAAuBE,IAIjE,MAAOJ,IAST59B,gBAAiB,WACf,GAAItqF,GAAK/iB,KACL8tF,EAAO/qE,EAAG0xE,MAAM3G,KAChBw9C,EAAax9C,EAAKy2B,eAClB+mB,IACFx9C,EAAKuf,mBAWTxC,UAAW,WACT,GAAI7qG,KAAKymI,cAAe,EAAM,OAAO,CAErC,KAAK,GADDruG,GAAOp4B,KAAKo4B,KAAKnB,UACZ1vB,EAAI,EAAGA,EAAI6wB,EAAKtqB,OAAQvG,IAC/B,GAAI6wB,EAAK7wB,GAAGsjG,YACV,OAAO,CAGX,QAAO,GAUT5iG,WAAY,WACV,MAAOjI,MAAK43E,aASd+yD,mBAAoB,WAClB,MAAO3qI,MAAK0jH,SAAS/jH,KAAK,YAW5By3B,kBAAmB,SAAUmwE,GAC3B,GAAIA,EAAY,CACd,GAAIgkC,GAAkBvrI,KAAK2qI,qBACvBO,EAAiBK,EAAgB5wG,OAAO,SAAU9zB,GACpD,MAAOA,GAAKgyC,OAAS0uD,GAEvB,IAAI2jC,EAAep9H,OAAS,EAAG,MAAOo9H,GAAe,KAWzD5qI,KAAM,WAGJ,MAFAN,MAAK0jH,SAAShgH,IAAI,aAAc,UAChC1D,KAAK6hB,KAAK,QACH7hB,MAUTiC,KAAM,WAGJ,MAFAjC,MAAK0jH,SAAShgH,IAAI,aAAc,WAChC1D,KAAK6hB,KAAK,QACH7hB,MAUT+pE,OAAQ,WAGN,IAAK,GAFDhnD,GAAK/iB,KACLo4B,EAAOrV,EAAGqV,KAAKnB,UACV1vB,EAAI,EAAGA,EAAI6wB,EAAKtqB,OAAQvG,IAC/B6wB,EAAK7wB,GAAGwiE,QAIV,OAFAhnD,GAAG60D,aAAc,EACjB70D,EAAGlB,KAAK,UACDkB,GAUT+mD,QAAS,WAGP,IAAK,GAFD/mD,GAAK/iB,KACLo4B,EAAOrV,EAAGqV,KAAKnB,UACV1vB,EAAI,EAAGA,EAAI6wB,EAAKtqB,OAAQvG,IAC/B6wB,EAAK7wB,GAAGuiE,SAIV,OAFA/mD,GAAG60D,aAAc,EACjB70D,EAAGlB,KAAK,WACDkB,GAaTihF,WAAY,WACV,MAAOhkG,MAAK8wF,SAQd06C,aAAc,SAAUC,EAAOC,GAC7B,GAAI3oH,GAAK/iB,KACLq1F,EAAWtyE,EAAG0xE,MAAMY,SACpBt+D,EAAMs+D,EAASlpF,YAAYs/H,EAC/B,KAAK10G,EAAK,MAAO/2B,KAEjB+2B,GAAIxzB,GAAKmoI,EACT1rI,KAAKo4B,KAAKy7C,cAAc43D,GACxBp2C,EAASs2C,WAAWF,GACpBp2C,EAASo0B,QAAQ1yF,EACjB,IAAIyyG,GAAWzmH,EAAG8nH,eAAe9zG,GAEjC,OADA/2B,MAAKo4B,KAAKsxG,QAAQgC,EAAOlC,EAASkC,IAAQ,GACnC1rI,MAcT4rI,QAAS,WAIP,IAAK,GAHD7oH,GAAK/iB,KACL6rI,KACAzzG,EAAOrV,EAAGqV,KAAKnB,UACV60G,EAAO,EAAGA,EAAO1zG,EAAKtqB,OAAQg+H,IACrCD,EAAiBzzG,EAAK0zG,GAAM7hI,MAAQmuB,EAAK0zG,EAK3C,OAHAD,GAAwB,MAAI,WAC1B,MAAO9oH,GAAGqV,KAAK8C,SAEV2wG,GAITE,iBAAkB,SAAUC,EAA0BC,EAAqB/vD,GACzE,GAAIn5D,GAAK/iB,IACT+iB,GAAG8mH,MAAQ,CAEX,IAAIqC,GAAenpH,EAAGopH,oBAElBlpH,EAASpkB,EAAE0nB,UAEf,IAAIylH,EACFjpH,EAAGonH,qBAA6B,QAAI,EAEpCpnH,EAAGqpH,aAAa,kBACd7oD,IAAKxgE,EAAGqnH,YACRtiF,WAAYmkF,MACZzoD,KAAMzgE,EAAGsnH,YACT5mD,UAAW1gE,EAAGsgE,UACdr6C,OAAQkjG,GACPhwD,GAAU3qE,KAAK,SAAU5R,GACb,KAATA,IACFA,EAAOd,EAAEsoB,UAAUxnB,GAEnBsjB,EAAO6E,QAAQnoB,MAEhBooB,KAAK,SAAUC,EAAcf,GAE9B,GAAIA,GAAYA,EAASgB,OAAQ,CAC/B,GAAItoB,GAAOd,EAAEsoB,UAAUF,EAASgB,OAChChF,GAAOiF,OAAOvoB,MAEfiyB,OAAO,WACR7O,EAAGonH,qBAA6B,QAAI,QAEjC,CAGL,GAAIpzG,GAAMhU,EAAG+tE,QAAQ75D,UAClB0D,OAAO,SAAUihE,GAAO,OAAQA,EAAIqP,aACpCohC,OAAO,SAAUzqG,EAAMmmE,GAAgC,MAAxBnmE,GAAKmmE,EAAK99F,MAAQ,KAAa23B,MAMjE,IAJA7K,EAAIxzB,GAAKwf,EAAG8mH,KACZ9yG,EAAI0wG,EAAWv+B,OAASnyE,EAAI0wG,EAAWt+B,eAAiB+iC,EAGlDD,EACJ,IAAK,GAAIl0G,KAAWk0G,GAAqB,CACvC,GAAIK,GAAWL,EAAoBl0G,EAC9BzuB,GAAE2kF,YAAYl3D,EAAIgB,MACrBhB,EAAIgB,GAAWu0G,EAASvtH,MACxBgY,EAAI,SAAWgB,GAAWu0G,EAASjxG,cAKzCtY,EAAG+mH,aAAaplB,aAAanxG,MAC3Bg5H,QAASvD,EAAQC,QACjBuD,QAASzpH,EAAGsgE,UACZh/D,GAAItB,EAAG8mH,OAGT5mH,EAAO6E,SAAU2kH,QAAS11G,IAE5B,MAAO9T,IAQTkpH,kBAAmB,WACjB,GAAIppH,GAAK/iB,KACL0sI,EAAa,EAEbr3C,EAAWtyE,EAAG0xE,MAAMY,SACpBs3C,EAAgBt3C,EAASr8C,cAE7B,IAAI2zF,EAAc7+H,OAChB,GAAI4+H,GAAapjI,EAAEqjI,GAAehgD,QAAQrwE,IAAI,SAAUtK,GACtD,OAAQA,EAAEy1H,EAAWv+B,SACpBxjG,MAAMqZ,OAGX,QAAQ2tH,EAAa,GAgBvBpiC,OAAQ,SAAU2hC,EAAqB5Y,EAAcn3C,GACnD,GAAIn5D,GAAK/iB,IAET,OAAI+iB,GAAGonH,qBAA6B,OAAUpnH,GAE9CA,EAAGgpH,iBAAiBhpH,EAAG0xE,MAAMx6D,SAAS+xG,yBAA0BC,EAAqB/vD,GAAU3qE,KAAK,SAAU5R,GAC5G,GAAIo3B,GAAMp3B,EAAK8sI,QACXplH,EAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC/BzE,GAAG6pH,wBAAwB71G,EAAK1P,EAASE,EAAqB,SAAUslH,GAEtE,GAAI/hC,GAAsB/nF,EAAG+tE,QAAQ75D,SACrC6zE,GAAoBt3F,QAAQ,SAAUg1E,GACpC,GAAIzwD,GAAUywD,EAAOzwD,QACjB+0G,EAAmBD,EAASxnH,WAAW0S,EACtCywD,GAAOwiB,kBACV8hC,EAAiBzzG,SAAS,IAAK,KAAK,GACpCyzG,EAAiBC,gBAEbd,GAAuBA,EAAoBl0G,IAAYk0G,EAAoBl0G,GAAS6lC,mBACxFkvE,EAAiB3hC,UAKrB0hC,EAAS/F,yBAELjoI,EAAE8jB,WAAW0wG,IAAeA,EAAawZ,OAE9C9kH,KAAK,SAAUpoB,GAChB,GAAI0nB,GAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC/BzE,GAAGlB,KAAK,eAAgB,KAAMwF,EAAStE,EAAIwE,KAGtCxE,IAkBTmoF,gBAAiB,SAAU8hC,EAAaf,EAAqB5Y,EAAcn3C,GACzE,GAAIn5D,GAAK/iB,IAET,IAAI+iB,EAAGonH,qBAA8B,QAAG,MAAOpnH,EAE/C,IAAIE,GAASpkB,EAAE0nB,WACX2lH,EAAenpH,EAAGopH,mBAoCtB,OAlCAppH,GAAGonH,qBAA8B,SAAI,EAErCpnH,EAAGqpH,aAAa,gBACd7oD,IAAKxgE,EAAGqnH,YACR5mD,KAAMzgE,EAAGsnH,YACT5mD,UAAW1gE,EAAGsgE,UACdO,YAAaopD,EACbhkG,OAAQkjG,EACRpkF,WAAYmkF,OACX/vD,GAAU3qE,KAAK,SAAU5R,GAC1BA,EAAOd,EAAEsoB,UAAUxnB,GACnBsjB,EAAO6E,QAAQnoB,KACdooB,KAAK,SAAUC,EAAcf,GAE9B,GAAIA,GAAYA,EAASgB,OAAQ,CAC/B,GAAItoB,GAAOd,EAAEsoB,UAAUF,EAASgB,OAChChF,GAAOiF,OAAOvoB,MAEfiyB,OAAO,WACR7O,EAAGonH,qBAA8B,SAAI,IAIvClnH,EAAO1R,KAAK,SAAU5R,GACpB,GAAIo3B,GAAMp3B,EAAK8sI,QACXplH,EAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC/BzE,GAAG6pH,wBAAwB71G,EAAK1P,EAASE,EAAqB8rG,KAC7DtrG,KAAK,SAAUpoB,GAChB,GAAI0nB,GAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC/BzE,GAAGlB,KAAK,eAAgB,KAAMwF,EAAStE,EAAIwE,KAGtCxE,GAIT6pH,wBAAyB,SAAU71G,EAAK1P,EAASE,EAAqB8rG,GACpE,GAAItwG,GAAK/iB,KACLq1F,EAAWtyE,EAAG0xE,MAAMY,QAExBA,GAASo0B,QAAQ1yF,GACjBs+D,EAASnmC,UACTn4B,EAAMhU,EAAG+nH,cAAc/zG,EAAIxzB,GAAIwzB,EAE/B,IAAIyyG,GAAWzmH,EAAG8nH,eAAe9zG,GAUjC,OATAhU,GAAGqV,KAAKsxG,QAAQ3yG,EAAIxzB,GAAIimI,EAASzyG,EAAIxzB,KAAK,GAEtC1E,EAAE8jB,WAAW0wG,IAAeA,EAAatwG,EAAGqV,KAAKrB,EAAIxzB,KAEzDwf,EAAG0jH,YAAa,EAChB1jH,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM6qF,UAAW5pF,EAAGqV,KAAKrB,EAAIxzB,IAAKwf,GACtDA,EAAGlB,KAAK,SAAUkB,EAAGqV,KAAKrB,EAAIxzB,IAAKwf,GACnCA,EAAGlB,KAAK,eAAgBkB,EAAGqV,KAAKrB,EAAIxzB,IAAK8jB,EAAStE,EAAIwE,GAE/CxE,GAITkqH,gBAAiB,SAAUnpD,EAAOkoD,EAA0B9vD,GAC1D,GAAIn5D,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,UAEf,IAAIylH,EACFjpH,EAAGonH,qBAAgC,WAAI,EAEvCpnH,EAAGqpH,aAAa,kBACd7oD,IAAKxgE,EAAGqnH,YACR5mD,KAAMzgE,EAAGsnH,YACT5mD,UAAW1gE,EAAGsgE,UACdU,MAAOD,GACN5H,GAAU3qE,KAAK,SAAU5R,GACtBA,IAAMA,EAAOd,EAAEsoB,UAAUxnB,IAC7BsjB,EAAO6E,QAAQg8D,EAAOnkF,KACrBooB,KAAK,SAAUC,EAAcf,GAE9B,GAAIA,GAAYA,EAASgB,OAAQ,CAC/B,GAAItoB,GAAOd,EAAEsoB,UAAUF,EAASgB,OAChChF,GAAOiF,OAAO47D,EAAOnkF,MAEtBiyB,OAAO,WACR7O,EAAGonH,qBAAgC,WAAI,QAEpC,CACL,GAAI+C,GAAWnqH,EAAG+mH,aAAaplB,aAC3ByoB,EAAkB7jI,EAAE4jI,GAAUzgD,WAAYpoE,GAAMy/D,EAAOyoD,QAAWvD,EAAQC,QAASuD,SAAUzpH,EAAGsgE,WAEhG8pD,GAEFpqH,EAAG+mH,aAAaplB,aAAep7G,EAAE4jI,GAAUvyG,OAAO,SAAUpS,GAC1D,MAAOA,GAAIlE,KAAOy/D,IAIpB/gE,EAAG+mH,aAAaplB,aAAanxG,MAC3Bg5H,QAASvD,EAAQE,WACjBsD,QAASzpH,EAAGsgE,UACZh/D,GAAIy/D,IAGR7gE,EAAO6E,QAAQg8D,MAGjB,MAAO7gE,IAeTunF,UAAW,SAAU3yE,EAAOqkD,GAC1B,GAAIn5D,GAAK/iB,IAET,IAAI+iB,EAAGonH,qBAAgC,UACrC,MAAOpnH,EAGT,IAAKujD,MAAMzuC,GAqBTtyB,GAAGqL,MAAM,wDArBQ,CAEjB,GAAIykF,GAAWtyE,EAAG0xE,MAAMY,SACpBt+D,EAAMs+D,EAASlpF,YAAY0rB,EAC/B9U,GAAGkqH,iBAAiBp1G,EAAO9U,EAAG0xE,MAAMx6D,SAAS+xG,yBAA0B9vD,GAAU3qE,KAAK,SAAUhO,EAAI5D,GAClG,GAAI0nB,GAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAE/B6tE,GAASs2C,WAAW9zG,GACpB9U,EAAGqV,KAAKwxG,WAAW/xG,GACnB9U,EAAG0jH,YAAa,EAChB1jH,EAAGlB,KAAK,YAAagW,EAAOd,GAC5BhU,EAAGlB,KAAK,SAAUkV,EAAKhU,GACvBA,EAAGlB,KAAK,eAAgBkV,EAAK1P,EAAStE,EAAIwE,KACzCQ,KAAK,SAAUxkB,EAAI5D,GACpB,GAAI0nB,GAAU1nB,EAAK2nB,QACfC,EAAsB5nB,EAAK6nB,kCAC/BzE,GAAGlB,KAAK,eAAgBkV,EAAK1P,EAAStE,EAAIwE,KAM9C,MAAOxE,IAYTgkH,wBAAyB,SAAU5c,GACjC5nG,IAAIoQ,QAAQ,YAAa,mEAEzB,KAAK,GADD+jE,GAAU12F,KAAKo4B,KAAKnB,UACf60G,EAAO,EAAGA,EAAOp1C,EAAQ5oF,OAAQg+H,IAGxC,IAAK,GAFD/0G,GAAM2/D,EAAQo1C,GACd90G,EAAOD,EAAI1R,WAAW4R,UACjB+vG,EAAO,EAAGA,EAAOhwG,EAAKlpB,OAAQk5H,IAErC,IAAK,GADD9vG,GAAMF,EAAKgwG,GACNhqH,EAAI,EAAGA,EAAIka,EAAI+vG,YAAYn5H,OAAQkP,IAC1C,GAAImtG,IAAcjzF,EAAI+vG,YAAYjqH,GAChC,MAAOka,EAKf,OAAO,OAWT0C,WAAY,SAAU/B,GACpB,MAAO73B,MAAKo4B,KAAKP,IAWnBs/D,WAAY,WACV,GAAIp0E,GAAK/iB,IAET,OADAuiB,KAAIkS,KAAK,QAAS,0GACXz0B,KAAKy0F,MAAM0C,aAAa5lF,KAAK,WAClCwR,EAAG0nH,eASP2B,aAAc,SAAUriI,EAAQ6D,EAAQsuE,GACtC,GAAIthB,GAASr1D,GAAG8L,IAAIxR,IAIpB,OAHIq8E,MAAa,IACfthB,EAASr1D,GAAG8L,IAAIC,UAEXspD,EAAO56D,KAAKs0B,WAAa,IAAMvqB,EAAQ6D,IAYhDymF,wBAAyB,SAAUhvE,GAejC,QAAS+nH,GAAoBr2G,GAC3B,IAAK,GAAI/Z,GAAI,EAAGA,EAAIqwH,EAASv/H,OAAQkP,IAAK,CACxC,GAAIka,GAAMH,EAAI1R,WAAWgoH,EAASrwH,GAC9Bka,IACFA,EAAIm9D,2BAZV,IAAK,GANDtxE,GAAK/iB,KAELqtI,EAAmC,gBAAjB,IAA6BhoH,GAAcA,EAG7D+S,EAAOrV,EAAGqV,KAAKnB,UACV1vB,EAAI,EAAGA,EAAI6wB,EAAKtqB,OAAQvG,IAC/B6lI,EAAoBh1G,EAAK7wB,GAgB3B,OAbAwb,GAAGZ,KAAKY,EAAU,MAAEjB,MAAM6qF,UAAW,SAAUp0E,GAC7C60G,EAAoB70G,KAYfxV,KAITjB,OAeE6qF,UAAW,SAUXC,cAAe,eAUfppF,OAAQ,WAKZmI,GAAOuK,MAAQA,GACd5xB,OAAOumB,UAAUiC,WAAWgH,SAASpnB;ACtgCxC,cAuDA,SAAWif,GAET,GAAI2hH,IACFC,iBAAkB,EAClBC,kBAAmB,EACnBC,kBAAmB,EACnBC,mBAAoB,EACpBC,oBAAqB,EACrBC,8BAA+B,EAC/BC,cAAe,EACfC,qBAAsB,GAGpBC,GACFC,MAAO,EACPC,UAAW,EACX16C,IAAK,GACL26C,UAAW,GACXC,YAAa,GACbC,yBAA0B,KAGxBh6G,EAAO1S,WAAWjgB,QAAQkqB,EAAOuB,OAAOq4G,kBAC1C8I,WAAY,KACZ76D,SAAU,KACV86D,oBAEA/tI,KAAM,SAAUZ,EAAM0uI,EAAY/R,GAChC,GAAIv5G,GAAK/iB,IAWT,IAVAuiB,IAAIqQ,KAAK,OAAQ,qBAEjB7P,EAAGoJ,KAAOttB,EAAE0nB,WACZxD,EAAGqjH,kBAEHrjH,EAAGywD,SAAW8oD,EACdv5G,EAAGurH,oBAEHtuI,KAAKquI,WAAaA,EAClBtrH,EAAGsC,WAAa,GAAIsG,GAAOmB,WAAWgH,SAASpnB,KAAKw6H,qBAC/CvnI,EAGH,WADAojB,GAAGoJ,KAAKrE,SAGV/E,GAAGe,OAAOnkB,GAEVojB,EAAGszD,MAAQ12E,EAEXojB,EAAG2hG,gBACH1kH,KAAK43E,YAAc70D,EAAGszD,MAAMk0D,WAC5BxnH,EAAGwrH,kBAEExrH,EAAGszD,MAAMm4D,cAGZzrH,EAAGyjH,aAAazjH,EAAGszD,MAAMn/C,KAFzBnU,EAAGkjH,qBAAqBljH,EAAGszD,MAAMn/C,KAInCnU,EAAG0rH,kBAEH,IAAIppH,GAAatC,EAAGsC,WAAW4R,SAC/B5R,GAAW7R,QAAQ,SAAU0jB,GAC3BA,EAAI/U,KAAK+U,EAAW,MAAEpV,MAAM0B,OAAQ,SAAU9hB,EAAIvC,EAAIsmI,GACpD1iH,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM0B,OAAQ9hB,EAAIvC,EAAIsmI,OAI9C1iH,EAAGywD,SAAS//C,OAAOE,OAAOpiB,KAAK,WAC7B,GAAI7E,GAAUqW,EAAGywD,SAAYzwD,EAAGywD,SAAS9mE,KAAOif,EAAOoD,QAAQriB,KAC3DinB,EAASjnB,EAAK6nB,SAASZ,MAE3BrqB,GAAEqqB,GAAQngB,QAAQ,SAAU4iB,GAC1BA,EAAMjU,KAAKiU,EAAa,MAAEtU,MAAM0B,OAAQ,WACtCT,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM0B,cAMhC3kB,EAAEiwB,KAAK/O,MAAM,KAAMgD,EAAGqjH,gBAAgBz9G,KAAK,WACzC5F,EAAGoJ,KAAKrE,UACRvF,IAAIqQ,KAAK,OAAQ,2CAMrB1f,UAAW,OAUXmS,cAOAq/F,gBAOAruC,MAAO,KAOPuB,aAAa,EAGbzrD,KAAM,KAENi6G,eAAgB,KAShBmI,gBAAiB,WACf,IAAK,GAAIx2G,KAAW/3B,MAAKq2E,MAAMn/C,IAC7Bl3B,KAAKqlB,WAAWuuD,WAAW77C,EAAS/3B,KAAKwlI,iBAAiBztG,EAAS/3B,KAAKq2E,MAAMn/C,IAAIa,IAEpF,OAAO/3B,OAYT0uI,mCAAoC,SAAU30G,EAAWv4B,GACvD,GAAIyhB,EAgBJ,OAZIA,GAFuB,GAAvB8W,EAAU40G,YAAmBntI,EAAQmN,YAAcnN,EAAQotI,gBACzD70G,EAAU80G,aACHjgI,eAAemrB,EAAU9kB,UAAWzT,EAAQotI,gBAE5CvgI,WAAW0rB,EAAU9kB,UAAWzT,EAAQmN,YAG1CorB,EAAUN,WAGhBj4B,EAAQyjB,YACXhC,GAAUA,EAAQ8W,EAAU2vC,oBAGvBzmD,GAqBT+B,UAAW,SAAU8pH,GACnB,GAAIttI,GAAUstI,IACZ7pH,WAAW,EACX8pH,cAAc,EACd5pH,eAAe,EACfxW,WAAY,GACZigI,eAAgB,GAChBxpH,gCAAgC,GAG9B4R,EAAOh3B,KAAKqlB,WAAW4R,UACvBhU,IACJA,GAAO+P,WACP/P,EAAOoC,aACP,KAAK,GAAI9d,GAAI,EAAGA,EAAIyvB,EAAKlpB,OAAQvG,IAG/B,GAFA0b,EAAOoC,WAAW2R,EAAKzvB,GAAG0C,MAAQjK,KAAK0uI,mCAAmC13G,EAAKzvB,GAAI/F,GAE/EA,EAAQ4jB,+BAAgC,CAC1C,GAAI4pH,GAAah4G,EAAKzvB,GAAGgtB,SAAS,EAClC,IAA0B,mBAAfy6G,GAA4B,CACrC,GAAIC,GAAoBD,EAAWrvI,KAAK,0BACxC,IAA2D,mBAA/CqvI,GAAWrvI,KAAK,4BAA+CqvI,EAAWrvI,KAAK,2BAA2Bs8D,YAAa,CAEjI,GAAIizE,GAAejsH,EAAOoC,WAAW2R,EAAKzvB,GAAG0C,KAK7C,IAJIpL,EAAEswI,QAAQD,KACZA,EAAeA,EAAa,IAGxBA,EAAc,CAClB,GAAI7rD,GAAY4rD,EAAkBG,YAC9BC,EAAoBH,EAAajgI,MAAM,IAC3CgU,GAAO+P,QAAQqwD,KACf,KAAK,GAAIrmE,GAAI,EAAGA,EAAIqyH,EAAkBvhI,OAAQkP,IAAK,CACjD,GAAIqa,GAAUg4G,EAAkBryH,GAAG/N,MAAM,KACrCqgI,EAAgBL,EAAkB30G,wCAEtCrX,GAAO+P,QAAQqwD,GAAWrmE,KAC1B,IAAI+a,GAAUu3G,EAAcj4G,EAAQ,IAAIptB,IACpC8tB,KACF9U,EAAO+P,QAAQqwD,GAAWrmE,GAAG+a,GAAWV,EAAQ,QAS9DpU,EAAO0Q,SACP,IAAIA,GAAS3zB,KAAKu0B,SAASZ,MAC3B,KAAK,GAAIyC,KAASzC,GAAQ,CACxB,GAAI0vD,GAAY1vD,EAAOyC,GAAOitD,SAC9BpgE,GAAO0Q,OAAOyC,MACdnT,EAAO+P,QAAQqwD,KAEf,KAAK,GADDjrD,GAAOzE,EAAOyC,GAAOgC,KAAKnB,UACrB1vB,EAAI,EAAGA,EAAI6wB,EAAKtqB,OAAQvG,IAAK,CACpC,GAAIwvB,GAAMqB,EAAK7wB,GACXgoI,EAAgBx4G,EAAIxzB,EACpB/B,GAAQutI,eACVQ,EAAgBx4G,EAAI9sB,MAEtBgZ,EAAO0Q,OAAOyC,GAAOm5G,MACrBtsH,EAAO+P,QAAQqwD,GAAWksD,KAE1B,KAAK,GADDv4G,GAAOD,EAAI1R,WAAW4R,UACjBha,EAAI,EAAGA,EAAI+Z,EAAKlpB,OAAQmP,IAAK,CACpC,GAAIia,GAAMF,EAAK/Z,GACX8B,EAAQ/e,KAAK0uI,mCAAmCx3G,EAAK11B,EACzDyhB,GAAO0Q,OAAOyC,GAAOm5G,GAAer4G,EAAIjtB,MAAQ8U,EAChDkE,EAAO+P,QAAQqwD,GAAWksD,GAAer4G,EAAIjtB,MAAQ8U,IAS3D,MAJIvd,GAAQ2jB,qBACHlC,GAAe,OAGjBA,GAUTG,SAAU,WACR,MAAOvkB,GAAEwkB,OAAOrjB,KAAKglB,cAqBvBssG,YAAa,SAAU3xH,GACrB,GAAIq3B,GAAOr3B,EAAK0lB,UAChB,KAAK,GAAInJ,KAAK8a,GACZh3B,KAAKqlB,WAAWnJ,GAAGmd,SAASrC,EAAK9a,GAAG,IAAIq1G,gBAAgBv6F,EAAK9a,GAAG,GAGlE,IAAIyX,GAASh0B,EAAKg0B,MAClB,KAAK,GAAIyC,KAASzC,GAChB,IAAK,GAAIkE,KAASlE,GAAOyC,GAAOgC,KAC9B,IAAK,GAAIlB,KAAOvD,GAAOyE,KAAKP,GAAQ,CAClC,GAAId,GAAMpD,EAAOyC,GAAOgC,KAAKP,EAC7B73B,MAAKu0B,SAASZ,OAAOyC,GAAOgC,KAAKP,GAAOxS,WAAW6R,GAAKmC,SAAStC,EAAIG,GAAK,IAAIq6F,gBAAgBx6F,EAAIG,GAAK,IAK7G,MAAOl3B,OAYTyuI,iBAAkB,WAChB,GAAI1rH,GAAK/iB,IACT,IAAK+iB,EAAGywD,SAsCR,MApCAlqE,GAAEvJ,KAAKgjB,EAAGsC,WAAW4R,UAAW,SAAUC,GACxCnU,EAAGysH,0BAA0Bt4G,KAG/BnU,EAAGywD,SAAS//C,OAAOE,OAAOpiB,KAAK,WAC7B,GAAIoiB,GAAS5Q,EAAGwR,SAASZ,MACzB,KAAK,GAAIiE,KAAajE,GAAQ,CAC5B,GAAIyC,GAAQzC,EAAOiE,GAEf63G,EAAY,SAAU14G,GACxBztB,EAAEvJ,KAAKg3B,EAAI1R,WAAW4R,UAAW,SAAUC,GACzCnU,EAAGysH,0BAA0Bt4G,MAI7Bw4G,EAAc,WAChBpmI,EAAEvJ,KAAKq2B,EAAMgC,KAAKnB,UAAW,SAAUF,GACrC04G,EAAU14G,KAIdX,GACGjU,KAAKiU,EAAa,MAAEtU,MAAM8qF,cAAe,SAAUx2E,GAClDs5G,EAAYt5G,KAEbjU,KAAKiU,EAAa,MAAEtU,MAAM6qF,UAAW,SAAU51E,GAC9C04G,EAAU14G,KAEX5U,KAAK,eAAgB,SAAU4U,EAAK1P,EAAS+O,EAAO7O,GAC/CwP,IAAKA,EAAI4uF,SAAU,GACvB5iG,EAAG2E,uBAAuBL,EAASE,KAEvCmoH,OAIG3sH,GAYTysH,0BAA2B,SAAUt4G,GACnC,GAAInU,GAAK/iB,KACL2vF,EAAgB5sE,EAAGywD,QAsDvB,OApDIt8C,GAAI+4D,gBACN/4D,EAAI/U,KAAK,SAAU,SAAUnQ,EAAG7S,EAAIQ,GAClC,GAAIu3B,EAAIy4G,wBAAyB,MAAO5sH,EAIxC,IAHAmU,EAAI04G,eAGA/wI,EAAEswI,QAAQxvI,GAAO,CACnB,GAAI02B,GAAS/sB,EAAE3J,GAAM2c,IAAI,SAAUrI,GACjC,MAAOA,GAAI8K,QACV9M,KAAK,IACRtS,IACEof,MAAOsX,GAIXpwB,aAAa8c,EAAGurH,iBAAiBp3G,EAAIwC,WAGrC3W,EAAGurH,iBAAiBp3G,EAAIwC,UAAYpzB,WAAW,WAC7Cf,GAAG8L,IAAIxR,KAAKkjB,EAAGsrH,WAAa,sBAC1B9qD,IAAKoM,EAAc55D,iBACnBytD,KAASmM,EAAc26C,iBAAoB36C,EAAc26C,mBAAqB,GAC9EuF,cAAe34G,EAAIwC,SACnBo2G,eAAgBnwI,EAAKof,QACpBxN,KAAK,SAAU0V,GAEhBiQ,EAAI61G,cAEJ,IAAIgD,GAAOlxI,EAAEsoB,UAAUF,GAEnBI,EAAU0oH,EAAKzoH,QACfC,EAAsBwoH,EAAKvoH,kCAE/BzE,GAAG2E,uBAAuBL,EAASE,GAEnC2P,EAAI61G,iBACHhlH,KAAK,SAAUC,EAAcf,GAG9B,GAAIA,GAAYA,EAASgB,OAAQ,CAC/B,GAAIhF,GAASpkB,EAAEsoB,UAAUF,EAASgB,QAC9BZ,EAAUpE,EAAOqE,QACjBC,EAAsBtE,EAAOuE,kCACjCzE,GAAG2E,uBAAuBL,EAASE,MAEpCqK,OAAO,WACRsF,EAAI84G,kBAEL,OAIAjtH,GA6BT2E,uBAAwB,SAAUL,EAASE,GACzC,GAAIxE,GAAK/iB,IACT,OAAKqnB,IACLtE,EAAGktH,uBAAuB5oH,GAC1BtE,EAAGmtH,kCAAkC3oH,GACrCxE,EAAGotH,uBAAuB9oH,GAC1BtE,EAAGqtH,qBAAqB/oH,GACxBtE,EAAGstH,yBAAyBhpH,GAC5BtE,EAAGutH,oBAAoBjpH,GACvBtE,EAAGwtH,yBAAyBlpH,GACrBtE,GARcA,GAkBvBwtH,yBAA0B,SAAUlpH,GAClC,GAAItE,GAAK/iB,KACL+uB,EAAUhM,EAAGywD,SAGbg9D,KACAx9G,IAEJ1pB,GAAE+d,GAAStnB,KAAK,SAAUuzC,GACpBA,EAAOhvB,OAASgpH,EAAYQ,uBAC9B0C,EAAWj9H,KAAK+/B,GACZA,EAAOk5F,UACTx5G,EAAQsgB,EAAOk5F,UAAW,MAQhC3tH,OAAOsoF,KAAKn0E,GAASxf,QAAQ,SAAUw8E,GACrC,GAAIxrF,GAASuqB,EAAQiE,QAAQg9D,GACzBr8D,EAASnvB,EAAOomG,YAAY3zE,SAChCtD,GAAOngB,QAAQ,SAAU4iB,GACvBA,EAAMi3E,sBAINtqF,EAAG8nF,aAAe2lC,EAAW1iI,OAC/BiV,EAAG8gB,KAAK,WACN9gB,EAAG0tH,yBAAyBD,KAC3B,GAEHztH,EAAG0tH,yBAAyBD,IAUhCC,yBAA0B,SAAUD,GAClC,GAAIztH,GAAK/iB,KACL+uB,EAAUhM,EAAGywD,QAEjBlqE,GAAEknI,GAAYzwI,KAAK,SAAUuzC,GAC3B,GAAIvZ,GACA22G,EAAqBp9F,EAAOq9F,YAAcr9F,EAAOs9F,WAErD,IAAIt9F,EAAOk5F,QAAS,CAClB,GAAIhoI,GAASuqB,EAAQiE,QAAQsgB,EAAOk5F,QACpC,IAAIhoI,EAAQ,CACV,GAAI8uC,EAAOywC,MAAO,CAChB,GACI8sD,GACAz6G,GAFU5xB,EAAOssI,aAETtsI,EAAOu2B,WACf3E,KACFy6G,EAAgBz6G,EAAMwD,WAAW0Z,EAAOywC,OACpC8sD,IACF92G,EAAY82G,EAAcxrH,WAAWiuB,EAAOuF,QAMlD,GAAIllB,GAASnvB,EAAOomG,YAAY3zE,SAChCtD,GAAOngB,QAAQ,SAAU4iB,GACvB,GAAIoyD,GAASpyD,EAAM06D,QAAQx9C,EAAOuF,KAC9B2vC,KACFA,EAAOqgD,cAAcv1F,EAAOq9F,YACxBD,EACFloD,EAAOze,SAEPye,EAAO1e,kBAOf/vC,GAAYhX,EAAGsC,WAAWiuB,EAAOuF,MAC7B63F,EACF32G,EAAUgwC,SAEVhwC,EAAU+vC,SAIV/vC,KAImB,MAAjBuZ,EAAOxR,OAA0C,MAAzB/H,EAAUN,aACpCM,EAAUV,SAASia,EAAOxR,MAAOwR,EAAOq3C,cAAc,GACtD5wD,EAAUgzG,oBAYlBuD,oBAAqB,SAAUjpH,GAC7B,GAAI7a,GAAUxM,KAAKwzE,SAAShnE,OAE5B,IAAIA,EAAS,CACX,GAAIukI,GAAgBznI,EAAE+d,GAASsT,OAAO,SAAU2Y,GAC9C,MAAOA,GAAOhvB,OAASgpH,EAAYO,eAGrCvkI,GAAEynI,GAAehxI,KAAK,SAAUuzC,GAE9B,GAAIpgB,GAAU1mB,EAAQ0mB,QAAQyoG,uBAAuBroF,EAAOuF,KAE5D3lB,GAAQ1f,QAAQ,SAAU5G,GAEpB0mC,EAAO0rD,UACTpyF,EAAOm9D,SAEPn9D,EAAOk9D,UAILx2B,EAAO68D,UACTvjG,EAAO3K,OAEP2K,EAAOtM,OAILgzC,EAAO09F,UACTpkI,EAAO4pB,SAEP5pB,EAAOiqH,WAITjqH,EAAOqqH,SAAS3jF,EAAOg9D,KAAMh9D,EAAO29F,oBAa5CZ,yBAA0B,SAAUhpH,GAClC,GAAI0H,GAAU/uB,KAAKwzE,SACf09D,EAAiB5nI,EAAE+d,GAASsT,OAAO,SAAU2Y,GAC/C,MAAOA,GAAOhvB,OAASgpH,EAAYK,qBAAuBr6F,EAAOhvB,OAASgpH,EAAYM,gCAEpFz6G,EAAOpE,EAAQtiB,QAAQ0mB,KAAK8D,SAEhC3tB,GAAE4nI,GAAgBnxI,KAAK,SAAUuzC,GAC/B,GAAI69F,GACAC,EAAmB99F,EAAO0rD,SAE9B,IAAI1rD,EAAOhvB,OAASgpH,EAAYM,8BAC9BwD,IAAqB99F,EAAOm9D,WAE5B0gC,EAAiBpiH,EAAQriB,KAAK2Y,WAAWiuB,EAAOu8F,eAC3CsB,GACH7nI,EAAEylB,EAAQriB,KAAK6nB,SAASZ,QAAQwmB,KAAK,SAAU/jB,GAC7C,GAAI06D,GAAU16D,EAAM06D,QAAQ75D,SAO5B,OANA65D,GAAQ32C,KAAK,SAAUquC,GAIrB,MAHIA,GAAOghB,UAAYl2D,EAAOuF,OAC5Bs4F,EAAiB3oD,GAEZ2oD,IAEFA,QAIX,QAAQ79F,EAAO+9F,aACb,IAAKtD,GAAaC,MAChBmD,EAAiBpiH,EAAQriB,KAAK6nB,SAASZ,OAAO2f,EAAOuF,KACrD,MACF,KAAKk1F,GAAax6C,IAChB,GAAI+9C,GAAen+G,EAAKwH,OAAO,SAAUj5B,GACvC,MAAOA,GAAG8nG,UAAYl2D,EAAOuF,MAE3By4F,GAAaxjI,OAAS,IACxBqjI,EAAiBG,EAAa,GAG9BF,GAAmB,EAErB,MACF,KAAKrD,GAAaG,UAEhBiD,EAAiBpiH,EAAQriB,KAAK6nB,SAAStB,MAAMqgB,EAAOuF,MAChDvF,EAAO0rD,WAAamyC,EAAeztB,SAASjkH,SAAS,cACvD6zC,EAAO0rD,WAAY,EACrB,MACF,KAAK+uC,GAAaI,YAEhB,GAAIp2G,GAAUl5B,EAAE,YAAcy0C,EAAOuF,KAAO,KAAKviB,IAAI,mBAAmB32B,KAAK,gBACzEo4B,KACFo5G,EAAiBpiH,EAAQriB,KAAK2Y,WAAW0S,GAE3C,MACF,SASE,MANAo5G,GAAiBtyI,EAAE,YAAcy0C,EAAOuF,KAAO,UAC3CvF,EAAO68D,UACTghC,EAAeztI,IAAI,aAAc,WAEjCytI,EAAeztI,IAAI,aAAc,WAMrCytI,IACEC,EACFD,EAAepnE,SAEfonE,EAAernE,UAGbx2B,EAAO68D,UACTghC,EAAelvI,OAEfkvI,EAAe7wI,WAYvB2vI,uBAAwB,SAAU5oH,GAChC,GAAItE,GAAK/iB,KACL2vF,EAAgB5sE,EAAGywD,SAEnB+9D,EAAoBjoI,EAAE+d,GAASsT,OAAO,SAAUzD,GAClD,MAAOA,GAAI5S,OAASgpH,EAAYC,kBAuBlC,OApBAjkI,GAAEioI,GAAmBxxI,KAAK,SAAUm3B,GAClC,GAAIA,EAAIs1G,QAAS,CACf,IAAK78C,EAAc38D,QAAQkE,EAAIs1G,SAAU,MAEzCljI,GAAEvJ,KAAK4vF,EAAc38D,QAAQkE,EAAIs1G,SAAS5hC,YAAY3zE,UAAW,SAAUb,GACzE,GAAIW,GAAMX,EAAMgC,KAAKlB,EAAI6sD,MACzB,IAAIhtD,GAAOA,EAAI1R,WAAW6R,EAAI2hB,MAAO,CACnC,GAAI9e,GAAYhD,EAAI1R,WAAW6R,EAAI2hB,KACnC9e,GAAUV,SAASnC,EAAI4K,MAAO5K,EAAIyzD,cAAc,GAChD5wD,EAAUgzG,sBAGT,CACL,IAAKhqH,EAAGsC,WAAWoC,QAAQyP,EAAI2hB,MAAO,MAEtC,IAAI9e,GAAYhX,EAAGsC,WAAW6R,EAAI2hB,KAClC9e,GAAUV,SAASnC,EAAI4K,MAAO5K,EAAIyzD,cAAc,GAChD5wD,EAAUgzG,kBAGPhqH,GASTmtH,kCAAmC,SAAU3oH,GAC3C,GAAIxE,GAAK/iB,IAET,IAAKunB,EAEL,IAAKwQ,UAAWxQ,GACd,GAAIxE,EAAGsC,WAAWoC,QAAQsQ,UAAYhV,EAAGsC,WAAW0S,SAASy5G,cAAe,CAC1E,GAAIt6G,GAAMnU,EAAGsC,WAAW0S,SACpB42F,EAAgBpnG,EAAoBwQ,SAAS05G,MAC7Ct4E,EAAM5xC,EAAoBwQ,SAAS25G,MAEvC,IAAIx6G,EAAIs6G,gBAAiB,CAGvB7iB,EAAgBpnG,EAAoBwQ,SAAS05G,MAAMxiI,MAAM,KACzDkqD,EAAM5xC,EAAoBwQ,SAAS25G,OAAOziI,MAAM,IAEhD,IAAIonB,KACJ8iC,GAAI3lD,QAAQ,SAAUjQ,EAAIgE,GACxB,GAEImxC,GAFA6nB,EAAUh9D,EAAG0L,MAAM,IAGvB,IAAIsxD,EAAQzyD,QAAU,EACpB4qC,EAAU6nB,EAAQ,GAClBh9D,EAAKg9D,EAAQ,OACR,CACL,GAAI/E,GAAWtkC,EAAIkD,eAEnB,KAAKse,IAAW8iB,GAAU,MAG5BnlC,EAAO9iB,MACLitD,UAAW9nB,EACXn1C,GAAIA,EACJ0G,KAAM0kH,EAAcpnH,OAKxB2vB,EAAI2mC,UAAUxnC,GAAQ,OAGtBa,GAAImC,SAAS8/B,EAAKw1D,GAAe,EAEnCz3F,GAAI61G,iBAaVoD,uBAAwB,SAAU9oH,GAChC,GAAItE,GAAK/iB,IACW+iB,GAAGywD,QAwDvB,OArDAlqE,GAAE+d,GAASslE,QAAQhyD,OAAO,SAAUzD,GAClC,MAAOA,GAAI5S,OAASgpH,EAAYI,qBAC/B3tI,KAAK,SAAUm3B,GAEhB,IAAIA,EAAIs1G,QAAR,CA8BE,GAAImF,GAAS5uH,EAAGsC,WAAW6R,EAAI2hB,MAAMpf,WACjCm4G,GAAY,CAEhB7uH,GAAGsC,WAAW6R,EAAI2hB,MAAMy4C,cAEnBvuE,EAAGsC,WAAW6R,EAAI2hB,MAAMg3C,cAC3B9sE,EAAGsC,WAAW6R,EAAI2hB,MAAM24C,SAAS,GAAI,IAGvCloF,EAAEvJ,KAAKm3B,EAAI26G,MAAO,SAAUhrI,GACtB8qI,GAAU9qI,EAAKwd,KAAIutH,GAAY,GACnC7uH,EAAGsC,WAAW6R,EAAI2hB,MAAM24C,SAAS3qF,EAAKwd,GAAIxd,EAAKirI,eAG7CF,GACF7uH,EAAGsC,WAAW6R,EAAI2hB,MAAMxf,SAAS,GAAI,IAAI,MAIxCtW,GASTqtH,qBAAsB,SAAU/oH,GAC9B,GAAItE,GAAK/iB,KACL2vF,EAAgB5sE,EAAGywD,SAInBu+D,EAAkBzoI,EAAE+d,GAASslE,QAAQhyD,OAAO,SAAUzD,GACxD,MAAOA,GAAI5S,KAAO,GAAK4S,EAAI5S,KAAO,GAAqB,IAAhB4S,EAAIs1G,UAC1CpzC,MAAM,WAAW44C,OAAOjzH,OAe3B,OAbIgzH,GAAgBjkI,QAClBiV,EAAG8gB,KAAK,WACNv6B,EAAEyoI,GAAiBhyI,KAAK,SAAUkyI,GAC5BtiD,EAAc38D,QAAQi/G,IACxB3oI,EAAEvJ,KAAK4vF,EAAc38D,QAAQi/G,GAAcrnC,YAAY3zE,UAAW,SAAUb,GAC1EA,EAAM+gE,mBAIX,EAAOh4E,QACR+yH,+BAA+B,IAG5BnvH,GAWT0E,QAAS,WACP,QAASznB,KAAKq2E,OAWhBpuE,WAAY,WACV,MAAOjI,MAAK43E,aAWd9N,QAAS,WACP,GAAI/mD,GAAK/iB,IAST,OARAnB,GAAEiwB,KAAKvpB,GAAGipB,iBAAkBjpB,GAAGiqB,SAAUjqB,GAAGkpB,aAAa9F,KAAK,WAE5D,GADA5F,EAAG2jH,WACC3jH,EAAGwR,SACL,IAAK,GAAIqD,KAAa7U,GAAGwR,SAASZ,OAChC5Q,EAAGwR,SAASZ,OAAOiE,GAAWkyC,SAElC/mD,GAAG60D,aAAc,IAEZ53E,MAWT+pE,OAAQ,WACN,GAAIhnD,GAAK/iB,IACT+iB,GAAG4jH,SACH,KAAK,GAAI/uG,KAAa7U,GAAGwR,SAASZ,OAChC5Q,EAAGwR,SAASZ,OAAOiE,GAAWmyC,QAGhC,OADAhnD,GAAG60D,aAAc,EACV70D,GAWT8nF,UAAW,WAGT,IAAK,GAFD9nF,GAAK/iB,KACLg3B,EAAOjU,EAAGsC,WAAW4R,UAChB+vG,EAAO,EAAGA,EAAOhwG,EAAKlpB,OAAQk5H,IACrC,GAAIhwG,EAAKgwG,GAAMn8B,YACb,OAAO,CAIX,IAAIl3E,GAAS5Q,EAAGwR,SAASZ,MACzB,KAAK,GAAIiE,KAAajE,GAEpB,IAAK,GADDyE,GAAOzE,EAAOiE,GAAWQ,KAAKnB,UACzB1vB,EAAI,EAAGA,EAAI6wB,EAAKtqB,OAAQvG,IAC/B,GAAI6wB,EAAK7wB,GAAGsjG,YACV,OAAO,CAIb,QAAO,GAeTsnC,qBAAsB,SAAUC,EAASp/G,GAEvC,GACIjQ,GAAK/iB,IAET,IAAKoyI,EAAL,CAKA,IAAK,GAFDp7G,GAAOo7G,EAAQnjI,MAAM,MAEhB1H,EAAI,EAAGA,EAAIyvB,EAAKlpB,OAAQvG,IAAK,CACpC,GAAIwyB,EACJ,IAAI/C,EAAKzvB,GAAG6D,QAAQ,QAAS,EAO3B,IAAK,GAND+8H,GAAenxG,EAAKzvB,GAAG0H,MAAM,KAC7Bo0E,GAAa8kD,EAAa,GAC1BtwG,GAASswG,EAAa,GACtBpwG,EAAUowG,EAAa,GAEvBx0G,EAASX,EAAQqwD,GAAWunB,YAAY3zE,UACnCza,EAAI,EAAGA,EAAImX,EAAO7lB,OAAQ0O,IAAK,CACtC,GAAI4Z,GAAQzC,EAAOnX,GACfua,EAAMX,EAAMgC,KAAKP,EAChBd,KAELgD,EAAYhD,EAAI1R,WAAW0S,GACtBgC,GAELA,EAAUysC,iBAEP,CAEL,GADAzsC,EAAYhX,EAAGsC,WAAW2R,EAAKzvB,KAC1BwyB,EAAW,QAEhBA,GAAUysC,aAGd,MAAOxmE,QAYTokH,uBAAwB,WAEtB,MADAvlH,GAAE,iBAAiBqF,KAAK,cAAc5E,YAAY,aAC3CU,MAiBT6jC,KAAM,SAAUzG,EAAU4mD,EAAgBC,EAAiBziF,GACzD,MAAOxB,MAAKqkC,cAAcjH,EAAU4mD,EAAgB,GAAIz+E,IAAG6e,KAAK6/D,EAAiB7zE,YAAYE,QAAS9O,IAgBxG6iC,cAAe,SAAUjH,EAAU4mD,EAAgB//C,EAAoBziC,GACrE,MAAOxB,MAAKkyC,cAAc9U,EAAU4mD,EAAgB//C,EAAoBplC,EAAE4C,QACxE0wC,eAAe,GACd3wC,KAYL0wC,cAAe,SAAU9U,EAAU4mD,EAAgB//C,EAAoBziC,GACrE,GAAIuhB,GAAK/iB,IAUT,IATA+iB,EAAGlB,KAAK,eAERrgB,EAAUA,MAEVA,EAAQ2wC,cAAiB3wC,EAAQ2wC,iBAAkB,EACnD3wC,EAAQ0wI,8BAAiC1wI,EAAQ0wI,iCAAkC,EAEnFnvH,EAAGqhG,yBAECrhG,EAAG9a,aAEL,MADIm1B,IAAUA,GAAS,GAChBra,CAOT,IAJAihE,IAAmBA,GAIdz+E,GAAGioB,WAAY,CAClB,GAAI62F,GAAW9+G,GAAGmE,GAAGmsB,WACrB,KAAK,GAAIyuF,KAAYD,GAAU,CAC7B,GAAIv2B,GAAOu2B,EAASC,GAAUx2B,KAC1Boe,EAAOpe,EAAKy2B,eACZrY,IACFpe,EAAKsf,cAKX,GAAI1gG,GAAUqW,EAAGywD,SAAYzwD,EAAGywD,SAAS9mE,KAAOif,EAAOoD,QAAQriB,KAC3D/M,GACF4jF,IAAK1kF,EAAEwkB,OAAON,EAAGszD,MAAM94B,KACvBimC,KAAMj+E,GAAGmE,GAAG4gI,mBACZpmD,IAAKnhE,EAAG0hG,qBAAqB/3G,GAC7By3E,IAAKtlF,EAAEwkB,OAAON,EAAG2hG,cACjBtgC,eAAgBJ,EAChBM,mBAAoBrgD,EAItB,OAFAlhB,GAAGH,QAAQ,OAAQG,EAAGsvH,UAAW1yI,EAAMy9B,EAAU57B,GAE1CuhB,GAIT0hG,qBAAsB,SAAU/3G,GAK9B,IAAK,GAJDtF,MAGA4vB,EAAOtqB,EAAK2Y,WAAW4R,UAClB+vG,EAAO,EAAGA,EAAOhwG,EAAKlpB,OAAQk5H,IAAQ,CAC7C,GAAI9vG,GAAMF,EAAKgwG,IACX9vG,EAAI2zE,aAAe3zE,EAAI88C,SAA+B,SAAnB98C,EAAIm/C,MAAMzuE,MAAmBsvB,EAAI24D,cAAgB34D,EAAImvG,gBAC1Fj/H,EAAI8vB,EAAIjtB,MAAQitB,EAAIuC,YAKxB,GAAI/sB,EAAK6nB,SAAU,CACjB,GAAIZ,GAASjnB,EAAK6nB,SAASZ,MAC3B,KAAK,GAAIiE,KAAajE,GAEpB,IAAK,GADDyE,GAAOzE,EAAOiE,GAAWQ,KAAKnB,UACzB1vB,EAAI,EAAGA,EAAI6wB,EAAKtqB,OAAQvG,IAC/B1I,EAAE4C,OAAO2F,EAAKgxB,EAAK7wB,GAAGwgI,oBAI5B,MAAOlpI,GAAEwkB,OAAOjc,IAYlBirI,UAAW,SAAU1yI,EAAMy9B,EAAU57B,GACnC,GAAIuhB,GAAK/iB,IAETuF,IAAG8L,IAAIxR,KAAKG,KAAKquI,WAAa,kBAC5B9qD,IAAK5jF,EAAK4jF,IACVC,KAAM7jF,EAAK6jF,KACXU,IAAKvkF,EAAKukF,IACVC,IAAKxkF,EAAKwkF,IACVC,eAAgBzkF,EAAKykF,eACrBE,mBAAuB3kF,EAAK2kF,oBAAsB3kF,EAAK2kF,mBAAmB/gF,GAAK5D,EAAK2kF,mBAAmB79D,cAAgB,MACtH,KAAM,MAAM,GAAMlV,KAAK,SAAU0R,EAAQ7b,GACtC7B,GAAGygB,IAAIod,IAAIhU,aAAe5tB,EAAQ0wI,+BACpC3sI,GAAGygB,IAAIod,IAAIhU,WAAWttB,UAEpBnC,EAAKykF,iBACPzlD,qBACAL,oBAGFvb,EAAGuvH,YAAYrvH,EAAQF,EAAGywD,SAASxgD,SAC/Bn0B,EAAE8jB,WAAWya,IAAWA,GAAS,EAAMh2B,EAAI8kC,SAC/C1O,mBACCzV,KAAK,SAAUpoB,GAChB,GAAIyH,GAAMpH,KAENmvB,GADU5pB,GAAGmE,GAAGspB,QACHztB,GAAGmE,GAAGylB,WACvBpM,GAAG4hG,gBAAgBv9G,EAAK5F,EAAQ2wC,cAAe/U,EAAUzR,EAAOoD,QAAQiE,QAAS7D,MAKrFw1F,gBAAiB,SAAUv9G,EAAK+qC,EAAe/U,EAAUpK,EAAS7D,GAChE,GAAIpM,GAAK/iB,KACL8oC,EAA6B,OAAjB1hC,EAAI2hC,SAAoBC,OAAO5hC,EAAI2hC,UAAY5pB,MAG/D,IAFA4D,EAAGuvH,YAAYlrI,EAAI6gB,OAAQ+K,GAEvBmf,EAAe,CACjB,GAAIogG,GAAS,GAAIr0H,QAAO,WACxB,IAAIq0H,EAAOlnG,KAAKjkC,EAAIse,OAAQ,CAC1B,GAAIsL,GAAMnyB,EAAEsoB,UAAU/f,EAAIse,OAEtB8sH,EAAMxhH,EAAIP,OAETlrB,IAAGioB,WAGNyD,UAAUvjB,OAAO/G,EAAE,aAAc6rI,IAAM,GAFvCrjH,EAAWltB,KAAKyL,OAAO/G,EAAE,aAAc6rI,GAAMrzH,OAAW2pB,GAK1D/lB,EAAGovH,qBAAqBnhH,EAAIgG,KAAMhE,OAE7BztB,IAAGioB,WAGNyD,UAAUvjB,OAAO/G,EAAE,aAAcS,EAAIse,QAAQ,GAF7CyJ,EAAWltB,KAAKyL,OAAO/G,EAAE,aAAcS,EAAIse,OAAQvG,OAAW2pB,GAMhEjqC,EAAE8jB,WAAWya,IAAWA,GAAS,EAAOh2B,EAAI8kC,SAChD1O,kBAWF80G,YAAa,SAAUlrI,EAAK4rB,GAC1B,GAAIjQ,GAAK/iB,IACT,IAAY,KAARoH,GAAsB,OAARA,EAAc,CAC9B,GAAI6gB,GAASppB,EAAEsoB,UAAU/f,EACzB,IAAI6gB,EAAQ,CAGV,IAAK,GAFDwqH,GAAexqH,EAAqB,iBAE/B1gB,EAAI,EAAGA,EAAIkrI,EAAa3kI,OAAQvG,IAAK,CAC5C,GAAIM,GAAMhJ,EAAE,sBAAwB4zI,EAAalrI,GAAGilI,QAAU,QAC9D3tI,GAAE,OAAS4zI,EAAalrI,GAAGyhC,OAAQnhC,GAAKlI,KAAK,KAAM8yI,EAAalrI,GAAG8c,IAIrE,IAAK,GADDquH,GAAYzqH,EAAuB,mBAC9B1gB,EAAI,EAAGA,EAAImrI,EAAU5kI,OAAQvG,IAAK,CACzC,GAAIwvB,GAAM27G,EAAUnrI,GAChBorI,EAAU57G,EAAI,GACd67G,EAAS77G,EAAI,GACb87G,EAAS97G,EAAI,GAEbpD,EAASX,EAAQ2/G,GAAS/nC,YAAY3zE,UAEtCb,EAAQ9sB,EAAEqqB,GAAQzvB,KAAK,SAAUkyB,GACnC,QAASA,EAAMgC,KAAKw6G,IAGtBx8G,GAAMo1G,aAAaoH,EAAQC,GAE3Bz8G,EAAMgC,KAAKy6G,GAAQl8C,QAAS,CAE5B,IAAI3/D,GAAOZ,EAAMgC,KAAKy6G,GAAQxtH,WAAW4R,SACzC3tB,GAAE0tB,GAAMj3B,KAAK,SAAUiS,GAAKA,EAAE2kF,QAAS,IAEvC5zE,EAAG2hG,aAAep7G,EAAEyZ,EAAG2hG,cAAc/pF,OAAO,SAAUpS,GACpD,MAAOA,GAAIlE,IAAMuuH,GAAUrqH,EAAIikH,SAAWmG,MAKlD,MAAO3yI,SAIT8hB,OAQE0B,OAAQ,WAKZmI,GAAOmB,WAAWgH,SAASpnB,KAAK0nB,KAAOA,GACtC9vB,OAAOumB;ACj2CV,cAcA,SAAWc,GAET,GAAImnH,GAAWjoH,UAAUiC,WAAWgH,SAAS6+F,gBAAgBlxH,QAAQkqB,EAAOuB,OAAO6mD,YACjFxzE,KAAM,SAAU0/G,EAAc8yB,EAAapzI,GACzC,GAAIojB,GAAK/iB,IAET+iB,GAAGe,OAAOm8F,GACVl9F,EAAG2gG,SAAW7kH,EAAEohH,GAEX8yB,EAaHl0I,EAAE4C,OAAOshB,EAAIpjB,IAZbojB,EAAGxf,GAAKwf,EAAG2gG,SAAS3+G,KAAK,MACzBge,EAAG9Y,KAAO8Y,EAAG2gG,SAASx/G,KAAK,eAAeuD,OAE1Csb,EAAGqb,KAAOrb,EAAG2gG,SAAS3+G,KAAK,QAAQgM,cAEnB,QAAZgS,EAAGqb,OACLrb,EAAGnb,KAAOiJ,uBAAuBkS,EAAGqb,OAEtCrb,EAAGw2B,cAAgBx2B,EAAGskC,cAAgBtkC,EAAG2gG,SAAS3+G,KAAK,YACvDge,EAAGszC,WAAatzC,EAAG2gG,SAASx/G,KAAK,eAAe6gC,GAAG,aAMrDhiB,EAAGiwH,kBAIL9/H,UAAW,WACX3P,GAAI,KACJ0G,KAAM,KACNm0B,KAAM,KACNx2B,KAAM,KACN2xC,cAAe,KACf8N,cAAe,KACfgP,YAAY,EAQZ28E,eAAgB,WACd,GAAIjwH,GAAK/iB,IAWT,OATA+iB,GAAG2gG,SAASx/G,KAAK,aAAarD,IAAI,iCAAiCC,GAAG,gCAAiC,WACrGjC,EAAE,QAAQupD,QAAQ,kBAEdvpD,EAAEmB,MAAM+kC,GAAG,YACbpZ,EAAOoD,QAAQyE,WAAW3R,KAAK,aAAckB,GAE7C4I,EAAOoD,QAAQyE,WAAW3R,KAAK,eAAgBkB,KAG5CA,GAWTkwH,aAAc,WAGZ,MAFAjzI,MAAK0jH,SAASx/G,KAAK,yCAAyCjC,OAErDjC,MAQTM,KAAM,WAEJ,MADAN,MAAK0jH,SAASpjH,OACPN,MAUTiC,KAAM,WAEJ,MADAjC,MAAK0jH,SAASzhH,OACPjC,OAMX2rB,GAAOmB,WAAWgH,SAASN,WAAWs/G,SAAWA,GAChDxuI,OAAOumB;ACjHV,cAcA,SAAWc,GAET,GAAIunH,GAAqBroH,UAAUiC,WAAWgH,SAASN,WAAWs/G,SAASrxI,QAKzE0xI,kBAAmB,WAEjB,MADAnzI,MAAK0jH,SAASpkH,YAAY,UACnBU,MAMTozI,eAAgB,WAEd,MADApzI,MAAK0jH,SAAShkH,SAAS,UAChBM,MAMTqzI,SAAU,WACR,MAAOrzI,MAAK0jH,SAASjkH,SAAS,YAIlCksB,GAAOmB,WAAWgH,SAASN,WAAW0/G,mBAAqBA,GAC1D5uI,OAAOumB;AC3CV,cAiCA,SAAWc,GAGT,GAAIk3F,GAAanhG,WAAWjgB,QAC1ByR,UAAW,aAEX3S,KAAM,SAAU0zB,GACdj0B,KAAK8jB,OAAOmQ,GAEZj0B,KAAKi0B,kBAAoBA,EAAoB,mBAC7Cj0B,KAAKszI,gBAAkBz0I,EAAEmB,KAAKi0B,mBAE9Bj0B,KAAKgzI,iBACLhzI,KAAKuzI,WAELvzI,KAAKg5C,YAIP/kB,kBAAmB,GACnBu/G,eAAgB,QAChB73F,gBAAgB,EAChB83F,UACAH,gBAAiB,KACjBpY,eAAgB,KAChBwY,UAAU,EASV7pH,QAAS,SAAUjmB,GAEjB,MADA5D,MAAKszI,gBAAgB1vI,KAAK,iCAAmCA,EAAO,UAC7D5D,MAWTg5C,SAAU,WACR,GAAIj2B,GAAK/iB,KACLuB,IAEJwhB,GAAGm4G,eAAiBn4G,EAAGuwH,gBAAgBpvI,KAAK6e,EAAGywH,gBAC3CzwH,EAAG2wH,WAAU3wH,EAAGm4G,eAAiBn4G,EAAG4wH,yBAAyB5wH,EAAGm4G,gBAEpE,KAAK,GAAI3zH,GAAI,EAAG2V,EAAI6F,EAAGm4G,eAAeptH,OAAQvG,EAAI2V,EAAG3V,IAAK,CACxD,GAAIg2C,GACAq2F,EAAe7wH,EAAGm4G,eAAe3zH,GACjCovB,EAAgB93B,EAAE+0I,EAEpBr2F,GADE5mB,EAAcl3B,SAAS,aAAek3B,EAAcl3B,SAAS,WACzD,GAAIksB,GAAOmB,WAAWgH,SAASN,WAAW0/G,mBAAmBU,EAAc7wH,EAAG2wH,UAE9E,GAAI/nH,GAAOmB,WAAWgH,SAASN,WAAWs/G,SAASc,EAAc7wH,EAAG2wH,UAExEn2F,EAAIh6C,KAAIhC,EAAMg8C,EAAIh6C,IAAMg6C,GAI9B,MADAx6B,GAAG0wH,OAASlyI,EACLA,GAITsyI,mBAAoB,WAClB,QAAStuI,GAAGmE,GAAG8pB,YAAcjuB,GAAGmE,GAAG8pB,WAAWmoB,gBAShDm4F,iBAAkB,SAAUC,GAC1B,GAAIhxH,GAAK/iB,KACLuB,EAAQwhB,EAAGuwH,gBAAgBpvI,KAAK6e,EAAGywH,eAEhB,MAAnBO,IAAuBxyI,EAAQA,EAAMo5B,OAAOo5G,GAAgBp5G,OAAO,qBACnE5X,EAAG2wH,WAAUnyI,EAAQwhB,EAAG4wH,yBAAyBpyI,GAGrD,KAAK,GADDyyI,MACKzsI,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAAK,CACrC,GAAIuvG,GAAU/zF,EAAGkxH,oBAAoB1yI,EAAMmkD,GAAGn+C,GACxCuvG,IAASk9B,EAAczgI,KAAKujG,GAGpC,MAAOk9B,IAITE,YAAa,SAAUjhH,EAAOkhH,GAC5B,GAAIp+F,GACAq+F,EAA0BD,KAAuB,CACrDt1I,GAAEkB,KAAKkzB,EAAO,SAAU3pB,EAAG4T,GACzB64B,EAAWroC,OAAO,mBAAoBwP,EAAE3Z,IACpC0vB,GAASA,EAAM,IAAMA,EAAM,GAAGrrB,MAAQqrB,EAAM,GAAGrrB,OAASwI,YAAYM,MACtEqlC,EAAW,eAGb,IAAIs+F,GAAWn3H,EAAEkhB,KAAOlhB,EAAEkhB,KAAKlc,cAAgBhS,mBAAmBgN,EAAEtV,MAAMsa,aAC1ErjB,GAAEk3C,GAAUh2C,KAAK,WACf,GAAIgjB,GAAKlkB,EAAEmB,MACPs0I,EAAcvxH,EAAGhe,KAAK,QAAQmd,aAE9BoyH,IAAeD,GAAwB,OAAZA,IACV,OAAfC,GAAuC,QAAfA,GAAwC,OAAfA,IAAsBF,GAAiB,GAC5FrxH,EAAG2tB,cAKL0jG,GACF7uI,GAAGmE,GAAG0wC,WAAWuH,OAAO,WACtBz8C,SAAS0kB,MAAQrkB,GAAGmE,GAAG0wC,WAAWqoF,0BAUxCppF,iBAAkB,WAChB,MAAOr5C,MAAK8zI,iBAAiB,cAQ/BS,UAAW,WAOT,MANAv0I,MAAK27C,gBAAiB,EAClBp2C,GAAGmE,GAAG8pB,WAAWghH,kBACnBx0I,KAAK27C,gBAAiB,GAExB37C,KAAKy0I,4BAA4B,mBAAmB,GACpDj3G,eAAe72B,EAAE,kBAAmBpB,GAAGmE,GAAG8pB,WAAW6lB,mBAAmBvrC,SACjE9N,MAST00I,eAAgB,SAAUnxI,GAExB,MADAvD,MAAKy0I,4BAA4B,IAAMlxI,EAAK,SAAS,GAC9CvD,MAST62G,WAAY,SAAU1yF,GAEpB,MADAnkB,MAAK00I,eAAevwH,EAAK5gB,IAClBvD,MAST20I,YAAa,WAGX,MAFA30I,MAAK27C,gBAAiB,EACtB37C,KAAKy0I,4BAA4B,aAAa,GACvCz0I,MAUT40I,UAAW,WAIT,MAHK/1I,GAAE,WAAWwtC,KAAK,WAClBrsC,KAAKu0I,YAD2Bv0I,KAAK20I,cAE1C91I,EAAE,aAAaU,SACRS,MAUT60I,gBAAiB,WACf,GAAIC,GAAsB90I,KAAKk7H,eAAevgG,OAAO,aAAa7sB,MAIlE,OAFA9N,MAAK27C,eAA0C,IAAxBm5F,EACvB90I,KAAKy0I,4BAA4B,GAAI,UAC9Bz0I,MAUTy0I,4BAA6B,SAAUV,EAAgBrrF,GACrD,GAAI3lC,GAAK/iB,KACLuB,EAAQwhB,EAAGuwH,gBAAgBpvI,KAAK6e,EAAGywH,eAEhB,MAAnBO,IAAuBxyI,EAAQA,EAAMo5B,OAAOo5G,IAE5ChxH,EAAG2wH,WAAUnyI,EAAQwhB,EAAG4wH,yBAAyBpyI,GAErD,KAAK,GAAIgG,GAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAAK,CACrC,GAAIwtI,GAAWxzI,EAAMmkD,GAAGn+C,GACpB2hD,EAAM6rF,EAAS7wI,KAAK,cACN,YAAdwkD,EACFQ,EAAInkD,KAAK,UAAWmkD,EAAInkB,GAAG,aAE3BmkB,EAAInkD,KAAK,UAAW2jD,GAEtBP,WAAWe,GACX6rF,EAASx1I,SAEXopD,yBACA5lC,EAAGlB,KAAK,WAAYkB,EAAGkxH,oBAAoB1yI,EAAMshE,QAAS9/C,EAAG+wH,iBAAiB,eAWhFP,SAAU,WACR,MAAOvzI,MAAK0zI,SAAW1zI,KAAKszI,iBAAmBtzI,KAAKszI,gBAAgBvuI,KAAK,UAAY/E,KAAKszI,gBAAgBvuI,KAAK,SAASqG,QAAQ,gBAAiB,GAWnJ4nI,eAAgB,WACd,GAAIjwH,GAAK/iB,IAiBT,OAhBAA,MAAKmiB,KAAK,cAAe,WACvBY,EAAGiyH,oBAGLh1I,KAAKmiB,KAAK,aAAc,SAAUtb,GAChCA,EAAK6hD,WAAY,EACjB3lC,EAAGkyH,gBAAgBpuI,KAGrB7G,KAAKmiB,KAAK,eAAgB,SAAUtb,GAClCA,EAAK6hD,WAAY,EACjB3lC,EAAG44B,gBAAiB,EACpB54B,EAAGkyH,gBAAgBpuI,KAGrB2C,KAAK4jD,SAASC,KAAK6nF,8BACZl1I,MAWTg1I,gBAAiB,WACf,GAAIjyH,GAAK/iB,IACT+iB,GAAGuwH,gBAAkBz0I,EAAEkkB,EAAGkR,kBAC1B,IAAI1yB,GAAQwhB,EAAGi2B,UAEf,OADAj2B,GAAGlB,KAAK,WAAYkB,EAAG+wH,iBAAiB,aAAcvyI,GAC/CA,GAWT0zI,gBAAiB,SAAUpuI,GAEzB,MADA7G,MAAK6hB,KAAK,WAAYhb,EAAM7G,KAAK8zI,iBAAiB,cAC3C9zI,MAUTi0I,oBAAqB,SAAUngB,GAC7B,GAAIvwH,GAAKvD,KAAK0zI,SAAW5f,EAAQn0H,KAAK,SAAWm0H,EAAQ/uH,KAAK,KAC9D,OAAO/E,MAAKyzI,OAAOlwI,IASrBowI,yBAA0B,SAAUpyI,GAClC,MAAOA,GAAM+0B,IAAI,oBAAoBA,IAAI,iBAAiBA,IAAI,uBAKlE3K,GAAO3F,IAAI8N,SAASN,WAAWqvF,WAAaA,GAE3Cv+G,OAAOumB;ACpXV,cAUA,SAAWc,GAET,GAAIwpH,GAAaxpH,EAAO3F,IAAI8N,SAASN,WAAWqvF,WAAWphH,QACzD2qB,MAAO,KACP7rB,KAAM,WACJ,GAAIwiB,GAAK/iB,IACT+iB,GAAGe,OAAO/D,MAAMgD,EAAIlV,WACpBkV,EAAGqJ,OACDgpH,gBAAiB,GACjBC,qBAAsB,KACtBC,iBAAkB,KAClBjsG,KAAM,KACNksG,WAAW,EACXf,cAAe,OAInBgB,oBAAqB,SAAUvrI,GAE7B,MADAjK,MAAKosB,MAAMkpH,iBAAmBrrI,EACvBjK,MAETg9C,oBAAqB,WACnB,MAAOh9C,MAAKosB,MAAMkpH,kBAEpBG,wBAAyB,WACvB,OAAQz1I,KAAKosB,MAAMkpH,kBAGrBI,QAAS,SAAUzrI,EAAMsrI,GAQvB,MAPIjsI,GAAEqsI,SAAS1rI,IACbjK,KAAKosB,MAAMid,KAAOp/B,EAAKA,KACvBjK,KAAKosB,MAAMmpH,UAAYtrI,EAAKsrI,YAE5Bv1I,KAAKosB,MAAMid,KAAOp/B,EAClBjK,KAAKosB,MAAMmpH,UAAYA,GAElBv1I,MAET41I,QAAS,WACP,OACE3rI,KAAMjK,KAAKosB,MAAMid,KACjBksG,UAAWv1I,KAAKosB,MAAMmpH,YAI1BzuF,cAAe,SAAU4hD,EAAWmtC,GAGlC,MAFA71I,MAAKosB,MAAMgpH,gBAAkB1sC,EAC7B1oG,KAAKosB,MAAMipH,qBAAuBQ,EAC3B71I,MAET48C,cAAe,WACb,MAAO58C,MAAKosB,MAAMgpH,iBAEpBt4F,wBAAyB,WACvB,MAAO98C,MAAKosB,MAAMipH,sBAMpBtpH,OAAQ,WACN,GAMI+pH,GANA/yH,EAAK/iB,KACLwR,EAAI3S,EAAE0nB,WAEN65G,EAAiBvhI,EAAE,mBACnBk3I,EAAkBl3I,EAAE,mBAItBi3I,GADEj3I,EAAE4qD,aACe22E,EAAejgI,SAASsC,IAAMszI,EAAgB51I,SAASsC,IAEvD29H,EAAev7H,WAEpC,IAAImxI,GAAeD,EAAgBztG,SAAS,gBAGxC2tG,EAAa7mF,iBAAmB4mF,EAAan0I,QAAQ8kE,cACrDuvE,EAA4B,IAAfD,EAAoB,EAAIvzI,KAAKitD,MAAOmmF,EAAmB1V,EAAep8H,UAAYiyI,GAE/FE,EAAkB5wI,GAAGmE,GAAGswC,OAe5B,OAbAj3B,GAAGqzH,uBACDppG,SAAUmpG,EACVE,WAAY,EACZC,gBAAiBJ,EACjBK,gBAAgB,EAChBC,aAAa,EACbC,kBAAmB,WAEjBrW,EAAev7H,UAAUixI,GACzBtkI,EAAEsW,aAICtW,EAAE2W,WAMXuuH,kBAAmB,SAAU1pG,GAC3B,GAAIx7B,GAAI3S,EAAE0nB,UAcV,OAbAvmB,MAAKo2I,uBACHppG,SAAUA,EACVqpG,WAAY,EACZC,gBAAiB,EACjBC,gBAAgB,EAChBC,aAAa,EACbC,kBAAmB,WAEjB53I,EAAE,mBAAmBgG,UAAU,GAC/B2M,EAAEsW,aAICtW,EAAE2W,WAIXiuH,sBAAuB,SAAUxoI,GAC/B,GAGI8hD,GACAinF,EAJA5zH,EAAK/iB,KACL+1I,EAAkBl3I,EAAE,mBAIpB+O,GAAO0oI,iBAAmB1oI,EAAO0oI,gBAAkB,GACrDK,EAAc/oI,EAAO0oI,gBAAkBlnF,iBAEvCM,EAAW9hD,EAAO0oI,gBAAkB,IAEpCK,EAAcvnF,iBACdM,EAAW9hD,EAAOyoI,WAAa,GAGjC9wI,GAAGmE,GAAG2a,GAAKzW,EAAOo/B,SAClB+oG,EAAgBp2I,KAAK,WAAY+vD,GAEjC3sC,EAAGisC,UAAUphD,EAAOo/B,SAAUp/B,EAAOyoI,WAAYM,EAAa/oI,EAAO2oI,eAAgB3oI,EAAO4oI,aAAajlI,KAAK,SAAU3N,GACtH,IAAKi4B,kBAAkBj4B,GAAO,CAiB5B,GAfAmyI,EAAgBnyI,KAAKA,GAEjB/E,EAAE8jB,WAAW/U,EAAO6oI,oBACtB7oI,EAAO6oI,kBAAkB52I,KAAKkjB,GAIJ,OAAxBxd,GAAGC,IAAI4M,QAAQnI,MAA0C,OAAzB1E,GAAGC,IAAI4M,QAAQ+iD,OACjDt2D,EAAEkB,KAAKg2I,EAAgB7xI,KAAK,gBAAiB,WAC3C,GAAI0yI,GAAU/3I,EAAEmB,MAAM+E,KAAK,UAC3BlG,GAAEmB,MAAM+E,KAAK,UAAW6xI,EAAU,OAItCb,EAAgBztG,WAAWzmC,QAAQnC,SAAS,SACW,GAAnDq2I,EAAgBztG,SAAS,gBAAgBx6B,OAAa,CACxD,GAAI+oI,GAAelwI,EAAE,UACjBiH,EAAO2oI,gBAAkBxzH,EAAGi6B,uBAAyBj6B,EAAG65B,mBAC1Di6F,EAAelwI,EAAE,sBAEnBovI,EAAgB/2I,OAAO,wMAA0M63I,EAAe,sBAElP1tF,eAAe4sF,GAAiB,GAC5BnoI,EAAO2oI,eACT5sF,2BAA2B5mC,EAAGqJ,MAAMgpH,gBAAiBryH,EAAGqJ,MAAMipH,sBAE9D1rF,6BAGF5mC,EAAG6nE,kBAMT57B,UAAW,SAAUhiB,EAAUqpG,EAAYS,EAAiBC,EAAoBC,GAC9E,GAAIj0H,GAAK/iB,KACLgpB,EAAMnqB,EAAE0nB,WAERwvH,EAAkBl3I,EAAE,oBACpBo4I,EAAM,EACNlB,GAAgBp2I,KAAK,SACvBs3I,EAAMlB,EAAgBp2I,KAAK,OAG7B,IAAIu3I,IACF35H,EAAGw4H,EAAgBp2I,KAAK,aACxB4D,GAAIypC,EACJnjC,KAAMwsI,EACNM,YAAaG,IAAmB,EAChCK,KAAM5hE,mBAAmBwgE,EAAgBhxI,KAAK,OAC9CkyI,IAAKA,EAGHF,MAAuB,GACzBl4I,EAAE4C,OAAOy1I,GACP3vF,YAAaxkC,EAAGqJ,MAAMgpH,gBACtBgC,UAAWr0H,EAAGqJ,MAAMipH,qBACpBC,iBAAkBvyH,EAAGqJ,MAAMkpH,mBAI3B0B,KAAoB,GACtBn4I,EAAE4C,OAAOy1I,GACP7tG,MAAOtmB,EAAGqJ,MAAMmpH,UAAY,GAAK,KAAOxyH,EAAGqJ,MAAMid,MAIrD,IAAIguG,GAAqB,GAAI9xI,IAAGkf,IAAI0M,SAASlkB,OAAOkP,OAAO,GAqB3D,OApBAk7H,GAAmBl7G,YAAY,QAC/Bk7G,EAAmBl7G,YAAY,MAC/Bk7G,EAAmBl7G,YAAY,SAE/BkB,iBACAx+B,EAAEqhC,MACAt4B,KAAM,MACNw4B,SAAU,OACV5b,IAAK,mBAAqB6yH,EAAmBj0H,WAAa,IAAMvkB,EAAEszB,MAAM+kH,GACxExqH,OAAO,EACP2T,QAAS,SAAUj5B,GACjBo2B,eAAe,GAAI,GACnBxU,EAAIlB,QAAQ1gB,IAEdmpB,MAAO,SAAUS,GACfwM,eAAe,GAAI,GACnBxU,EAAId,OAAO8I,MAIRhI,EAAIb,WAObyiE,YAAa,SAAUx+D,GACrB,GAAIrJ,GAAK/iB,IACLosB,IAAOvtB,EAAE4C,OAAOshB,EAAGqJ,MAAOA,GAG9BrJ,EAAGlB,KAAK,eACRkB,EAAGlB,KAAK,mBAGRkB,EAAG44B,gBAAiB,GAOtB27F,iBAAkB,SAASv4H,GACzB/e,KAAKosB,MAAMooH,cAAgBz1H,GAQ7By1H,cAAe,WACb,QAASx0I,KAAKosB,MAAMooH,gBAIxB7oH,GAAO3F,IAAI8N,SAASN,WAAW2hH,WAAaA,GAE3C7wI,OAAOumB;ACtRV,cAUA,SAAWc,GAET,GAAI4rH,GAAe5rH,EAAO3F,IAAI8N,SAASN,WAAWqvF,WAAWphH,QAC3DyR,UAAW,eAEX3S,KAAM,SAAU0zB,GACd,GAAIlR,GAAK/iB,IACT+iB,GAAG0wH,UACH1wH,EAAGy0H,kBACHz0H,EAAGe,OAAOmQ,IAKZwjH,SAAU,WACR,GAAI10H,GAAK/iB,IACT+iB,GAAG0xE,MAAQjrF,KAAKskF,KAAKxS,UACrBv4D,EAAG20H,WAAa30H,EAAG0xE,MAAM3G,KACzB/qE,EAAG40H,mBAAqB50H,EAAG0xE,MAAMY,UAWnCr8C,SAAU,WACR,MAAOh5C,MAAKyzI,QAWduB,gBAAiB,WACf,GAAIjyH,GAAK/iB,IACT+iB,GAAG00H,UACH,IAAIjO,GAAWzmH,EAAG20H,WAAWvlB,UAAUn5E,UAwBvC,OAvBAj2B,GAAG0wH,UACHnqI,EAAEkgI,GAAUzpI,KAAK,SAAU62F,GACzB,IAAKtwB,MAAMswB,EAAQrzF,IAAK,CACtB,GAAIq0I,IACFr0I,IAAKqzF,EAAQrzF,GACb0G,KAAM2sF,EAAQihD,OACdtjF,KAAMqiC,EAAQkhD,OACd15G,KAAM,MACNx2B,KAAMiJ,uBAAuB,OAC7B0oC,cAAex2B,EAAG0xE,MAAMroE,MAAM5F,cAC9B6gC,cAAetkC,EAAG0xE,MAAMroE,MAAM5F,cAC9B6vC,YAAY,GAEV4pD,EAAe,IAAMrpB,EAAQrzF,GAC7BymD,EAAQnrD,EAAEohH,EACVj2D,GAAMvqD,SAAS,aAAeuqD,EAAMvqD,SAAS,WAC/CsjB,EAAG0wH,QAAQ78C,EAAQrzF,IAAM,GAAIooB,GAAOmB,WAAWgH,SAASN,WAAW0/G,mBAAmBjzB,GAAc,EAAM23B,GAE1G70H,EAAG0wH,QAAQ78C,EAAQrzF,IAAM,GAAIooB,GAAOmB,WAAWgH,SAASN,WAAWs/G,SAAS7yB,GAAc,EAAM23B,MAItG70H,EAAGlB,KAAK,WAAYkB,EAAGs2B,mBAAoBt2B,EAAG0wH,QACvC1wH,EAAG0wH,QASZp6F,iBAAkB,WAChB,GAAIt2B,GAAK/iB,IACT+iB,GAAG00H,UACH,IAAIM,GAAiBh1H,EAAG40H,mBAAmBK,oBAIvCC,IASJ,OARA3uI,GAAEyuI,GAAgBh4I,KAAK,SAAUm4I,GAC/B,GAAwB,mBAAbA,GAA0B,CACnC,GAAIrgH,IAASqgH,CACbD,GAAqBpgH,GAAS9U,EAAG0wH,OAAO57G,IAAU9U,EAAGy0H,eAAe3/G,MAGxE9U,EAAGy0H,eAAiBS,EAEb3uI,EAAE2tB,QAAQlU,EAAGy0H,iBAWtBvC,gBAAiB,SAAUpuI,GAEzB,MADA7G,MAAK6hB,KAAK,WAAYhb,EAAM7G,KAAKq5C,oBAC1Br5C,MASTu0I,UAAW,WACT,GAAIxxH,GAAK/iB,IACT+iB,GAAG44B,gBAAiB,EAEpB54B,EAAG00H,UACH,IAAIjO,GAAWzmH,EAAG20H,WAAWvlB,UAAUn5E,WACnCm/F,EAAkB7uI,EAAEqlF,MAAM66C,EAAS17H,OAKvC,OAJAiV,GAAG20H,WAAW/wC,gBAAgBwxC,GAE9Bp1H,EAAGq1H,oBAAoB,QAEhBr1H,GAST4xH,YAAa,WACX,GAAI5xH,GAAK/iB,IAQT,OAPA+iB,GAAG44B,gBAAiB,EAEpB54B,EAAG00H,WACH10H,EAAG20H,WAAW/wC,oBAEd5jF,EAAGq1H,oBAAoB,MAEhBr1H,GAST2xH,eAAgB,SAAUnxI,GACxB,GAAIwf,GAAK/iB,IAET+iB,GAAG00H,UACH,IAAIU,GAAkBp1H,EAAG20H,WAAWW,iBAMpC,OALAF,GAAgB5kI,KAAKwP,EAAG20H,WAAWvlB,UAAUrlB,YAAYvpG,IACzDwf,EAAG20H,WAAW/wC,gBAAgBwxC,GAE9Bp1H,EAAGq1H,oBAAoBr1H,EAAG0wH,QAAQlwI,IAE3Bwf,GAUT8xH,gBAAiB,WACf,GAAI9xH,GAAK/iB,IAET+iB,GAAG00H,UAEH,IAAIU,GAAkBp1H,EAAG20H,WAAWW,kBAEhC7O,EAAWzmH,EAAG20H,WAAWvlB,UAAUn5E,WACnCs/F,EAAchvI,EAAEqlF,MAAM66C,EAAS17H,QAE/ByqI,EAAqBjvI,EAAEw3B,WAAWw3G,EAAaH,EAKnD,OAJAp1H,GAAG20H,WAAW/wC,gBAAgB4xC,GAE9Bx1H,EAAGq1H,oBAAoB,QAEhBr1H,GAITq1H,oBAAqB,SAAUvxI,GAC7B,GAAIkc,GAAK/iB,IAET2oD,yBACA,IAAIzgD,GAAW6a,EAAGs2B,sBAClB,IAAa,SAATxyC,EAAiB,CACnB,GAAI2xI,GAAe,IACftwI,GAAS4F,OAAS,IACpB0qI,EAAetwI,EAASA,EAAS4F,OAAS,IAE5CiV,EAAGlB,KAAK,WAAY22H,EAActwI,OAElC6a,GAAGlB,KAAK,WAAYhb,EAAMqB,IAU9B4rI,iBAAkB,SAAUC,GAC1B,GAAuB,cAAnBA,EACF,MAAO/zI,MAAKq5C,kBAEd,MAAM,IAAI3zB,OAAM,oBAMpBiG,GAAO3F,IAAI8N,SAASN,WAAW+jH,aAAeA,GAE7CjzI,OAAOumB;AC5OV,cACA,SAAWc,GAeT,GAAIq6G,GAAgBtkH,WAAWjgB,QAC7ByR,UAAW,gBAEXjJ,KAAM,GACNyvB,SAAU,GACVu2D,gBAAgB,EAEhBg3C,eACA1yG,YACAkkH,wBAAwB,EACxB9hD,QAAQ,EACR8vC,YAAY,EACZ7uD,YAAa,KACbvB,MAAO,KACPuZ,QAAS,KACT8oD,mBAAoB,GACpBvsH,KAAM,KAENwsH,iBAAkB,KAGlBp4I,KAAM,SAAU4lG,EAAexmG,EAAMi5I,GAInC,GAHA54I,KAAKmsB,KAAOttB,EAAE0nB,WACdvmB,KAAK24I,qBAEA95I,EAAEuzB,cAAczyB,GAAO,CAC1B,GAAIo2C,GAAWp2C,CACfA,IACE40B,UAAWwhB,GACX1a,aAAc,GACdw0D,YAAY,EACZw2C,YAAY,EACZv2C,YAAY,EACZmb,UAAU,EACVlsF,MAAO,IAMX,MAFA/e,MAAK4vF,QAAUgpD,EAEM,gBAAV,GAGF54I,KAAK8jB,OAAOqiF,IAFnBnmG,KAAKq2E,MAAQ12E,EAKfK,KAAKiwF,eAAiBtwF,EAAKswF,eAC3BjwF,KAAKiK,KAAOk8F,EACZnmG,KAAK05B,SAAWysE,EAEZnmG,KAAKq2E,MAAM0Z,QAAU/vF,KAAKq2E,MAAM2Z,gBAClChwF,KAAK05B,SAAWhsB,OAAO,cAAe1N,KAAKq2E,MAAM2Z,cAAehwF,KAAKq2E,MAAM0Z,OAAQ/vF,KAAK05B,WAG1F15B,KAAKinI,YAAcjnI,KAAKq2E,MAAM9hD,aAC9Bv0B,KAAK64I,MAAQl5I,EAAKiI,KAClB5H,KAAK04I,mBAAqB/4I,EAAKu/E,cAE/Bl/E,KAAKu0B,SAAWv0B,KAAKy4B,eACrBz4B,KAAK8jB,OAAO9jB,KAAKu0B,UAAU,GAC3Bv0B,KAAKgoF,cACLhoF,KAAK84I,2BACL94I,KAAKymI,YAAa,MAClBzmI,MAAK+4I,oBAOPA,gBAAiB,WACf,GAAIh2H,GAAK/iB,IAETnB,GAAEiwB,KAAK/O,MAAM,KAAMgD,EAAG41H,kBAAkBhwH,KAAK,WAC3C5F,EAAGoJ,KAAKrE,aAWZgxH,yBAA0B,WACxB,GAAI/1H,GAAK/iB,IAET,OADA+iB,GAAGZ,KAAK,SAAUY,EAAGi2H,YAAaj2H,GAC3BA,GAUT4sH,sBAAuB,WACrB,MAAO3vI,MAAKy4I,wBASdQ,kBAAmB,WACjB,MAAOj5I,MAAK04I,oBAUdztC,SAAU,WACR,MAAOjrG,MAAKq2E,MAAM40B,UAWpBkZ,WAAY,SAAUplG,GAEpB,MADAlgB,GAAE,iBAAmBmB,KAAKiK,KAAO,MAAMorC,KAAK,SAAU,eAAgBt2B,GAC/D/e,MAWT+yH,WAAY,WACV,GAAIxa,GAAU15G,EAAE,iBAAmBmB,KAAKiK,KAAO,MAAMorC,KAAK,SAAU,eACpE,OAAS/rC,GAAEqwB,SAAS4+E,GAAiBA,EAAL,IAWlC2gC,mBAAoB,WAElB,MADAl5I,MAAKy4I,wBAAyB,EACvBz4I,MAWTm5I,kBAAmB,WAEjB,MADAn5I,MAAKy4I,wBAAyB,EACvBz4I,MAWT2uI,QAAS,WACP,MAAOt2H,yBAAwBrY,KAAK64I,QAAU74I,KAAK64I,OAOrD7kE,MAAO,WACL,MAAOh0E,MAAK22F,QAWdi5C,aAAc,WAEZ,IAAK,GADD7sH,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,EAC3BwxB,GAAStlB,SAASzU,OAAO,+DAE3B,MAAO+jB,IAWTitH,aAAc,WAEZ,IAAK,GADDjtH,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,EAC3BwxB,GAAStlB,SAASvP,KAAK,mBAAmBwsC,SAE5C,MAAO3tB,IAWTilE,YAAa,WACX,GAA6B,IAAzBhoF,KAAKu0B,SAASzmB,OAAc,MAAO9N,KAEvC,IAAI+iB,GAAK/iB,IAKT,OAJAsJ,GAAEyZ,EAAGwR,UAAUx0B,KAAK,SAAUg5B,GAC5BhW,EAAGq2H,mBAAmBrgH,KAGjBhW,GASTq2H,mBAAoB,SAAUrgH,GAC5B,GAAIhW,GAAK/iB,KACLq5I,EAAct2H,EAAG2W,QAErBX,GAASl4B,IAAI,wBAAwBC,GAAG,uBAAwB,SAAU3B,GACxE,GAAI4f,GAAQgE,EAAG0W,SAAS56B,EAAEmB,OACtBq7B,EAAetY,EAAG2mD,gBAAgB7qE,EAAEmB,MACxC+iB,GAAGu2H,YAAYD,EAAat6H,EAAOsc,EAAcl8B,MASrDm6I,YAAa,SAAUD,EAAat6H,EAAOsc,EAAck+G,GACvD,GAAIx2H,GAAK/iB,IACT+iB,GAAG0jH,YAAa,EAChB1jH,EAAGlB,KAAK,SAAU7hB,KAAMu5I,GAAUtvI,KAAMovI,EAAat6H,MAAOA,EAAOsc,aAAcA,KAUnF5C,aAAc,WACZ,GAAI1V,GAAK/iB,KACLoH,IAEJ,IAA6B,GAAzB2b,EAAGkkH,YAAYn5H,QAAoC,IAArBiV,EAAGkkH,YAAY,GAAU,QAE3D,KAAK,GAAI1/H,GAAI,EAAGA,EAAIwb,EAAGkkH,YAAYn5H,OAAQvG,IAAK,CAC9C,GAAIhE,GAAKwf,EAAGkkH,YAAY1/H,GACpBwxB,EAAWl6B,EAAE,IAAM0E,EACvB6D,GAAImM,KAAKwlB,GAEX,MAAO3xB,IAWT68G,SAAU,WACR,GAA6B,IAAzBjkH,KAAKu0B,SAASzmB,OAAc,MAAO,KACvC,IAAI0rI,GAASx5I,KAAKy5I,oBAAoBz5I,KAAKu0B,SAAS,GACpD,OAAOilH,GAAO/xI,QAYhBy8G,SAAU,SAAUz8G,GAClB,GAA6B,IAAzBzH,KAAKu0B,SAASzmB,OAAc,MAAO9N,KACvC,KAAK,GAAIuH,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAC7C,GAAIiyI,GAASx5I,KAAKy5I,oBAAoBz5I,KAAKu0B,SAAS,GACpDilH,GAAO/xI,KAAKA,GAEd,MAAOzH,OAYTy5I,oBAAqB,SAAU1gH,GAC7B,GAAI2gH,GAAK3gH,EAASn3B,QAAQ,uBAAuBggC,KAAK,kBACtD,OAAI83G,GAAG5rI,OAAe4rI,EACf3gH,EAASn3B,QAAQ,MAAM8jD,GAAG,GAAGxhD,KAAK,qCAW3Cu1B,SAAU,SAAUkgH,GAClB,GAAI56H,EACJ,IAAI/e,KAAKq2E,OAASr2E,KAAKq2E,MAAMgwD,cAAe,EAAO,MAAOrmI,MAAKq2E,MAAMt3D,KACrE,IAAIxb,EAIJ,OAHIo2I,KAAcp2I,EAAKo2I,EAAa50I,KAAK,OACzCga,EAAQ/e,KAAK45I,iBAAiBr2I,GAAMvD,KAAKinI,YAAY,KAavDv+D,UAAW,WACT,MAAI1oE,MAAKu0B,SAASzmB,OAAS,GACqB,YAAvC9N,KAAKu0B,SAAS,GAAG7wB,IAAI,eAahC2iI,WAAY,WACV,MAAOrmI,MAAKq2E,MAAMgwD,YAWpBx7B,UAAW,WACT,MAAO7qG,MAAKymI,YAWdmT,iBAAkB,SAAUC,GAC1B,GAAI9gH,GAAWl6B,EAAE,SAAWg7I,EAC5B,OAAI9gH,GAASp5B,KAAK,aACTo5B,EAASp5B,KAAK,aAAasU,MAE7B8kB,EAAS9kB,OAWlBy1D,gBAAiB,SAAUiwE,GACzB,GAAI35I,KAAKq2E,OAASr2E,KAAKq2E,MAAMgwD,cAAe,EAAO,MAAOrmI,MAAKq2E,MAAMh7C,YACrE,IAA6B,IAAzBr7B,KAAKu0B,SAASzmB,OAAlB,CAEA,GAAIutB,GAAe,EACRs+G,IAAgB35I,KAAKu0B,SAAS,EAGzC,OADA8G,GAAer7B,KAAKy5B,SAASkgH,KAgB/BG,oBAAqB,SAAU/6H,EAAOg7H,EAAkBvwE,GAItD,MAHAxpE,MAAKq2E,MAAMt3D,MAAQA,EACfg7H,IAAkB/5I,KAAKq2E,MAAMh7C,aAAe0+G,GAChD/5I,KAAKymI,YAAa,EACXzmI,MAcTq5B,SAAU,SAAUta,EAAOg7H,EAAkBvwE,GAE3C,GAAIlgE,EAAE2kF,YAAYlvE,GAAQ,MAAO/e,KAIjC,IAHI+5I,GAA4C,MAAxBA,EAAiB,KAAYA,EAAmBA,EAAiB7rI,QAAQ,MAEjGs7D,EAAyBA,KAA0B,EACtB,IAAzBxpE,KAAKu0B,SAASzmB,OAAc,MAAO9N,MAAK85I,oBAAoB/6H,EAAOg7H,EAAkBvwE,EAIzF,KAAK,GADDzwC,GADA9kB,EAAM8lI,GAAoBh7H,EAErBxX,EAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IACxCwxB,EAAW/4B,KAAKu0B,SAAShtB,GACzBwxB,EAAS9kB,IAAIA,GACT8lI,EACFhhH,EAASh0B,KAAK,QAASg1I,GAEvBhhH,EAASkR,WAAW,SAElBu/B,GAAyBzwC,EAASua,QAIxC,OADAtzC,MAAKymI,YAAa,EACXzmI,MAYTuxH,gBAAiB,SAAUxyG,GAEzB,MADA/e,MAAKq5B,SAASr5B,KAAKy5B,WAAY1a,GACxB/e,MAWT8pE,QAAS,WACP,GAAI/mD,GAAK/iB,IAIT,OAHAnB,GAAEkkB,EAAGwR,UAAUx0B,KAAK,SAAUu5D,GAC5Bv2C,EAAGi3H,gBAAgBn7I,EAAEmB,SAEhB+iB,GAWTgnD,OAAQ,WACN,GAAIhnD,GAAK/iB,IAIT,OAHAnB,GAAEmB,KAAKu0B,UAAUx0B,KAAK,SAAUu5D,GAC9Bv2C,EAAGk3H,eAAep7I,EAAEmB,SAEfA,MAWTiI,WAAY,WACV,GAAIA,IAAa,CAIjB,OAHApJ,GAAEmB,KAAKu0B,UAAUx0B,KAAK,SAAUu5D,GAC9BrxD,EAAapJ,EAAEmB,MAAMP,SAAS,kBAEzBwI,GAWT+xI,gBAAiB,SAAUjhH,GAEzB,MADAA,GAASh0B,KAAK,WAAY,YAAYrF,SAAS,gBAAgBqF,KAAK,YAAY,GACzE/E,MAWTi6I,eAAgB,SAAUlhH,GAExB,MADAA,GAASkR,WAAW,YAAY3qC,YAAY,gBAAgB2qC,WAAW,YAChEjqC,MAWTM,KAAM,WACJ,GAA6B,IAAzBN,KAAKu0B,SAASzmB,OAAc,MAAO9N,KACvC,KAAK,GAAIuH,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAC7C,GAAIwxB,GAAW/4B,KAAKu0B,SAAShtB,GAAG3F,QAAQ,0BACxCm3B,GAAS60C,IAAI70C,EAAS6I,KAAK,oBAAoBl+B,IAAI,aAAc,UAEnE,MAAO1D,OAWTiC,KAAM,WACJ,GAA6B,IAAzBjC,KAAKu0B,SAASzmB,OAAc,MAAO9N,KACvC,KAAK,GAAIuH,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAC7C,GAAIwxB,GAAW/4B,KAAKu0B,SAAShtB,GAAG3F,QAAQ,0BACxCm3B,GAAS60C,IAAI70C,EAAS6I,KAAK,oBAAoBl+B,IAAI,aAAc,WAEnE,MAAO1D,OAYT85B,MAAO,SAAUogH,GAEf,MADAl6I,MAAKq5B,SAAS,GAAI,GAAI6gH,GACfl6I,MAeT0wF,gBAAiB,SAAUtzD,EAAUuzD,GACnCA,EAAoBA,CACpB,IAAI5tE,GAAK/iB,IACT,IAA6B,IAAzBA,KAAKu0B,SAASzmB,OAAc,MAAO9N,KAIvC,KAAK,GAAIuH,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAC7C,GAAI4yI,GAAOn6I,KAAKu0B,SAAShtB,GACrBmvG,EAAWyjC,EAAKx6I,KAAK,0BAEzB,IAAI+2G,EAAU,CAEZ,GAAI0jC,GAAWD,EAAKv4I,QAAQ,qBAAqB+/B,KAAK,YACtDy4G,GAAS53H,SACT43H,EAASn3I,MAAM,WACb,GAAIo3I,IACFpwI,KAAQ8Y,EAAG9Y,KACX8U,MAASgE,EAAG0W,WACZ4B,aAAgBtY,EAAG2mD,kBAErBtsC,GAASi9G,SAEN,CACL,GAAIF,GAAOn6I,KAAKu0B,SAAShtB,GAAGkM,OAAO,YACnC,IAAI0mI,EAAKrsI,OAAS,EAAG,CAEnB,GAAIwsI,GAAYt6I,KAAKu0B,SAAShtB,EAC9B+yI,GAAUh7I,YAAY,oBAEtB66I,EAAKrxF,QAAQp7C,OAAO,4FAA6FijF,IACjHwpD,EAAK7xG,SAAS,aAAarlC,MAAM,WAC/B,GAAIo3I,IACFpwI,KAAQ8Y,EAAG9Y,KACX8U,MAASgE,EAAG0W,WACZ4B,aAAgBtY,EAAG2mD,kBAErBtsC,GAASi9G,SAENxvH,WAAUja,MAAM,+CAa7B41H,aAAc,WACZ,GAAIzjH,GAAK/iB,IAMT,OALI+iB,GAAGwR,SAASzmB,OAAS,GACvBiV,EAAGZ,KAAK,SAAU,SAAUoZ,EAASp8B,EAAIQ,GACvCojB,EAAGsW,SAAS15B,EAAKof,MAAOpf,EAAK07B,cAAc,KAGxCr7B,MAYT6vF,WAAY,WACV,MAAO7vF,MAAKq2E,MAAMwZ,YAcpBrpB,UAAW,SAAU+zE,EAAWC,GAuC9B,IAAK,GAtCDz3H,GAAK/iB,KACLy6I,EAAQD,GAAa,IAErBE,EAAQ,SAAU5mB,GACpB,GAAIpE,GAAYoE,EAAQpwH,IAAI,mBACxBi3I,EAAa7mB,EAAQpwH,IAAI,eAEzB8iE,EAAY,SAEhB,IAAI+zE,EAAW,CACb,GAAIK,GAAiB,SAAUC,EAAKC,GAElCD,EAAM7+H,OAAO6+H,GAAK3sI,QAAQ,cAAe,IACrC2sI,EAAI/sI,OAAS,IACf+sI,EAAMA,EAAI,GAAKA,EAAI,GAAKA,EAAI,GAAKA,EAAI,GAAKA,EAAI,GAAKA,EAAI,IAEzDC,EAAMA,GAAO,CAGb,IAAev9H,GAAGhW,EAAdwzI,EAAM,GACV,KAAKxzI,EAAI,EAAGA,EAAI,EAAGA,IACjBgW,EAAI9S,SAASowI,EAAI1+H,OAAW,EAAJ5U,EAAO,GAAI,IACnCgW,EAAI7a,KAAK+xG,MAAM/xG,KAAKmvH,IAAInvH,KAAKgD,IAAI,EAAG6X,EAAKA,EAAIu9H,GAAO,MAAM57H,SAAS,IACnE67H,IAAQ,KAAOx9H,GAAGpB,OAAOoB,EAAEzP,OAE7B,OAAOitI,GAETjnB,GAAQlyD,SAAUuf,gBAAiBy5D,EAAeL,EAAW,IAAKS,YAAaT,GAAaE,EAAO,WACjG57I,EAAEmB,MAAM4hE,SAAUuf,gBAAiBuuC,EAAWsrB,YAAaL,GAAcF,SAG3E3mB,GAAQp0H,SAAS,aAAakiE,SAAUuf,gBAAiB3a,GAAa,IAAK,WACzE3nE,EAAEmB,MAAM4hE,SAAUuf,gBAAiBuuC,GAAa+qB,IAGpD,OAAO3mB,IAGA92G,EAAI,EAAGA,EAAI+F,EAAGkkH,YAAYn5H,OAAQkP,KACzC,SAAWs8C,GACT,GAAI2hF,GAAcl4H,EAAGkkH,YAAY3tE,EACjC,IAAK2hF,EAAL,CAEA,GAAIx1D,GAAM1iE,EAAGm4H,yBAAyBD,EAClCx1D,IACFi1D,EAAMj1D,KAEPzoE,EAEL,OAAO+F,IAWTi2H,YAAa,WAGX,IAAK,GAFDj2H,GAAK/iB,KAEAgd,EAAI,EAAGA,EAAI+F,EAAGkkH,YAAYn5H,OAAQkP,IAAK,CAC9C,GAAIi+H,GAAcl4H,EAAGkkH,YAAYjqH,EACjC,IAAKi+H,EAAL,CAEA,GAAIx1D,GAAM1iE,EAAGm4H,yBAAyBD,EAClCx1D,IACFA,EAAInmF,YAAY,aACboE,IAAI,iBAAkB,IACtBA,IAAI,oBAAqB,IACzBA,IAAI,kBAAmB,IACvBA,IAAI,mBAAoB,KAI/B,MAAOqf,IAQTm4H,yBAA0B,SAAUD,GAClC,GAAIE,GAAWt8I,EAAE,IAAMo8I,GAAa/2I,KAAK,iBACzC,IAAIi3I,EAASrtI,OAAS,EAEpB,MAAOqtI,EAEP,IAA4B,mBAAjB,GAA8B,CAEvC,GAAIC,GAASv8I,EAAE,IAAMo8I,EACrB,IAAIG,EAAOttI,OAAS,EAAG,CACrB,GAAIutI,GAAYD,EAAO3nI,SAASA,SAASA,SAASvP,KAAK,wBACvD,OAAIm3I,GAAUvtI,OAAS,EACdutI,EAEAD,OAGN,CAEL,GAAIE,GAAUz8I,EAAE,aAAem4B,KAAKzvB,GAAK,KACzC,IAAI+zI,EAAQxtI,OAAS,EACnB,MAAOwtI,GAAQp3I,KAAK,mBAI1B,MAAO,OAWTinG,MAAO,WAEL,MADAnrG,MAAKymI,YAAa,EACXzmI,MAWT+sI,aAAc,WAEZ,MADA/sI,MAAKymI,YAAa,EACXzmI,MAaTojB,SAAU,WACR,GAAIL,GAAK/iB,IACT,OAAOnB,GAAEwkB,QACPpZ,KAAM8Y,EAAG9Y,KACTyvB,SAAU3W,EAAG2W,SACb3a,MAAOgE,EAAG0W,WACV4B,aAActY,EAAG2mD,qBAWrB5uC,OAAQ,WACN,GAAI/D,GAAM,IACV,IAAqC,mBAA1B/2B,MAAK4vF,QAAQ70D,SAA0B,CAChD,GAAI3E,GAAQp2B,KAAK4vF,QAAQ70D,UACJ,oBAAV3E,KACTW,EAAMX,EAAMgC,KAAKp4B,KAAK4vF,QAAQrsF,KAIlC,MAAOwzB,MAcTjV,OACEy5H,aAAc,SAUd/3H,OAAQ,WAIZmI,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW2gH,cAAgBA,GACtD1hI;ACn7BH,cAYA,SAAWqnB,GAMT,GAAI6vH,GAAwB,SAAUziH,EAAUqE,GAC1CrE,EAASp5B,KAAK,2BAChBy9B,IAEArE,EAAS5W,KAAK,OAAQ,WACpBib,OAKFsuF,EAA4B//F,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW2gH,cAAcvkI,QACnFyR,UAAW,4BAUXulB,aAAc,WACZ,GAAI1V,GAAK/iB,KACLoH,IAEJ,IAA6B,GAAzB2b,EAAGkkH,YAAYn5H,QAAoC,IAArBiV,EAAGkkH,YAAY,GAAU,QAE3D,KAAK,GAAI1/H,GAAI,EAAGA,EAAIwb,EAAGkkH,YAAYn5H,OAAQvG,IAAK,CAC9C,GAAIhE,GAAKwf,EAAGkkH,YAAY1/H,GACpBwxB,EAAWl6B,EAAE,SAAW0E,EAC5B6D,GAAImM,KAAKwlB,GAGX,MAAO3xB,IAYTwoI,aAAc,WAEZ,IAAK,GADD7sH,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,GACvBrB,EAAa6yB,EAASn3B,QAAQ,uBAClCsE,GAAWhC,KAAK,aAAa5D,OAC7B4F,EAAWlH,OAAO,+DAEpB,MAAO+jB,IAWTitH,aAAc,WAEZ,IAAK,GADDjtH,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,GACvBrB,EAAa6yB,EAASn3B,QAAQ,uBAClCsE,GAAWhC,KAAK,aAAajC,OAC7BiE,EAAWhC,KAAK,mBAAmBwsC,SAErC,MAAO3tB,IAUT2mD,gBAAiB,SAAUiwE,GACzB,GAAI35I,KAAKq2E,OAASr2E,KAAKq2E,MAAMgwD,cAAe,EAAO,MAAOrmI,MAAKq2E,MAAMh7C,YACrE,IAA6B,IAAzBr7B,KAAKu0B,SAASzmB,OAAlB,CACA,GAAI2tI,GAAiB9B,GAAgB35I,KAAKu0B,SAAS,GAAGqN,KAAK,QACvDlJ,EAAS14B,KAAKu0B,SAAS,EAC3B,IAAImE,EAAOj5B,SAAS,cAA2C,SAA3Bi5B,EAAO/4B,KAAK,YAC9C,MAAO+4B,GAAOzkB,KAEd,IAAIoiB,KAIJ,OAHAolH,GAAe75I,QAAQ,gBAAgB0mC,SAAS,QAAQvoC,KAAK,WAC3Ds2B,EAAO9iB,KAAK1U,EAAEmB,MAAM+E,KAAK,gBAEpBsxB,EAAOpkB,KAAK,OAevBonB,SAAU,SAAUta,EAAOg7H,EAAkBvwE,EAAuBkyE,GAClE,GAAI34H,GAAK/iB,IAGT,OAFAwpE,GAAyBA,KAA0B,EAExB,IAAvBzmD,EAAGwR,SAASzmB,OAAqBiV,EAAG+2H,oBAAoB/6H,EAAOg7H,EAAkBvwE,IAErF3qE,EAAEkB,KAAKgjB,EAAGwR,SAAU,WAClBhvB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWqmG,0BAA0BC,gBAAgB3rH,KAAM+e,EAAOg7H,EAAkBvwE,EAAuBkyE,KAGlI17I,KAAKymI,YAAa,EACXzmI,OAWT45I,iBAAkB,SAAUC,GAC1B,GAAI96H,GAEA48H,EAAU98I,EAAE,WAAag7I,GAEzBnhH,EAAS14B,KAAKu0B,SAAS,EAW3B,OARIxV,GAFA2Z,EAAOj5B,SAAS,cACa,SAA3Bi5B,EAAO/4B,KAAK,YACN,IAAM+4B,EAAOzkB,MAKf0nI,EAAQ1nI,MAGV8K,GAAmB,MAAVA,EAAiBA,EAAQ,IAW5C9W,WAAY,WACV,GAAIA,IAAa,CAIjB,OAHApJ,GAAEmB,KAAKu0B,UAAUx0B,KAAK,SAAUu5D,GACG,aAA7Bz6D,EAAEmB,MAAM+E,KAAK,cAA4BkD,GAAa,KAErDA,GAYT+xI,gBAAiB,SAAUjhH,GAEzB,MADAyiH,GAAsBziH,EAAU,WAAcA,EAASmlC,gBAChDl+D,MAYTi6I,eAAgB,SAAUlhH,GAExB,MADAyiH,GAAsBziH,EAAU,WAAcA,EAASsuC,eAChDrnE,MAaTgoF,YAAa,WACX,GAAIjlE,GAAK/iB,IAET,IAA2B,IAAvB+iB,EAAGwR,SAASzmB,OAAc,CAC5B,GAAI8tI,GAAc/8I,EAAE0nB,UAGpB,OAFAxD,GAAG41H,iBAAiBplI,KAAKqoI,GACzBA,EAAY9zH,UACL/E,EAOT,MAJAlkB,GAAEkB,KAAKgjB,EAAGwR,SAAU,WAClBxR,EAAGq2H,mBAAmBp5I,QAGjB+iB,GAGTq2H,mBAAoB,SAAUrgH,GAC5B,GAAIhW,GAAK/iB,KAEL47I,EAAc/8I,EAAE0nB,UAiEpB,OAhEAxD,GAAG41H,iBAAiBplI,KAAKqoI,GAEzBJ,EAAsBziH,EAAU,WAE9B,GAAIJ,GAAKI,EAASp5B,KAAK,2BACnB05I,EAAct2H,EAAG2W,QACff,KACAA,EAAGsjC,YACLljC,EAASkuC,YAAY,SAAU9nE,EAAI08I,EAAal8I,GAC9C,GAAIyH,KACJ,IAAIzH,EAAM,CACHd,EAAEswI,QAAQxvI,KACbA,GAAQA,GAEV,KAAK,GAAI4H,GAAI,EAAGA,EAAI5H,EAAKmO,OAAQvG,IAC/BH,EAAImM,MAAOtJ,KAAMovI,EAAat6H,MAAOpf,EAAK4H,GAAGi5D,UAAY,IAAM7gE,EAAK4H,GAAGhE,GAAI83B,aAAc17B,EAAK4H,GAAG0C,OAMrG,MAHA8Y,GAAG0jH,YAAa,EAChB1jH,EAAGlB,KAAK,SAAUkX,EAAU55B,EAAIiI,GAChC7B,GAAGmE,GAAGgD,KAAKmV,KAAK,SAAUkX,EAAU55B,EAAIiI,GACjCpH,OAIT+4B,EAAS9V,OAAO,SAAU9jB,EAAIQ,GAChB,MAARA,IACFA,GAAQ,KAAM,KAAM,KAAM,OAE5BojB,EAAG0jH,YAAa,EAChB1jH,EAAGlB,KAAK,SAAUkX,EAAU55B,GAAM8K,KAAMovI,EAAat6H,MAAOpf,EAAK,GAAI07B,aAAc17B,EAAK,KACxFojB,EAAGlB,KAAK,yBAA0BkX,EAAU55B,GAAM8K,KAAMovI,EAAat6H,MAAOpf,EAAK,GAAI07B,aAAc17B,EAAK,GAAIw5B,sBAAuBt6B,EAAEsoB,UAAUxnB,EAAK,MAAO,GAC3J4F,GAAGmE,GAAGgD,KAAKmV,KAAK,SAAUkX,EAAU55B,GAAM8K,KAAMovI,EAAat6H,MAAOpf,EAAK,GAAI07B,aAAc17B,EAAK,OAG/Fg5B,EAAGujC,WACNnjC,EACGj4B,GAAG,SAAU,SAAU3B,GACtB,GAAI4f,GAAQga,EAAS9kB,KACrB8O,GAAG0jH,YAAa,EAChB1jH,EAAGlB,KAAK,SAAUkX,EAAU55B,GAAM8K,KAAMovI,EAAat6H,MAAO,IAAMA,EAAOsc,aAActc,IACvFxZ,GAAGmE,GAAGgD,KAAKmV,KAAK,SAAUkX,EAAU55B,GAAM8K,KAAMovI,EAAat6H,MAAO,IAAMA,EAAOsc,aAActc,MAEhGje,GAAG,sBAAuB,SAAU3B,EAAIQ,GAC3B,MAARA,IACFA,GAAQ,KAAM,KAAM,KAAM,MAE5B,IAAIof,GAAQpf,EAAK,GACb07B,EAAe17B,EAAK,EACxBojB,GAAG0jH,YAAa,EAChB1jH,EAAGlB,KAAK,SAAUkX,EAAU55B,GAAM8K,KAAMovI,EAAat6H,MAAOA,EAAOsc,aAAcA,IACjF91B,GAAGmE,GAAGgD,KAAKmV,KAAK,SAAUkX,EAAU55B,GAAM8K,KAAMovI,EAAat6H,MAAOA,EAAOsc,aAAcA,OAOjGtC,EAASj4B,GAAG,SAAU,SAAU3B,GAC9B4jB,EAAG0jH,YAAa,IAGlBmV,EAAY9zH,YAEP/E,GAWTyuH,cAAe,WACb,OAAO,IAQX9lB,GAA0BC,gBAAkB,SAAU5yF,EAAUha,EAAOg7H,EAAkBvwE,EAAuBkyE,GAC9G,GAAIn4I,GAAKw1B,EAASh0B,KAAK,MACnB+2I,EAAQj9I,EAAE,WAAa0E,EAC3B,IAAIu4I,EAAMhuI,OAAS,EAAG,CAIpB,GAFAirB,EAASh0B,KAAK,QAASg1I,GAElBl7I,EAAE,QAAQY,SAAS,UAmBtBs5B,EAAS9kB,IAAI8lI,OAlBb,IAAIh7H,EAAO,CAGT,GAAIsX,IAAU,GAAKtX,GAAO9P,MAAM,KAC5B0/G,GAAiB,GAAKorB,GAAkB9qI,MAAM,IAClDusI,GAAsBziH,EAAU,WAC9BA,EAAS8b,OACT,KAAK,GAAIttC,GAAI,EAAGA,EAAI8uB,EAAOvoB,OAAQvG,IAAK,CACtC,GAAIw0I,GAAsBL,EAA0BnhH,KAAKG,UAAUghH,GAA2B,IAC9F3iH,GAASqb,UAAU,GAAK/d,EAAO9uB,IAAK,GAAKonH,EAAcpnH,IAAI4W,aAAcwwG,EAAcpnH,GAAIw0I,GAAsBvyE,UAIrHgyE,GAAsBziH,EAAU,WAC9BA,EAASqb,UAAU,GAAI,GAAI,GAAI,MAAOo1B,IAM5CzwC,GAASiuC,aAAY,KAIzBr7C,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWqmG,0BAA4BA,GAClEpnH;ACxWH,cAYA,SAAWqnB,GAET,GAAIooE,GAAYpoE,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWqmG,0BAA0BjqH,QAC/EyR,UAAW,YASXqsE,UAAW,SAAU5kD,EAAQq5D,GAC3B,GAA6B,IAAzBh0F,KAAKu0B,SAASzmB,OAAlB,CACA,IAAK,GAAIvG,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAC7C,GAAIwxB,GAAW/4B,KAAKu0B,SAAShtB,EACxBysF,GAGHj7D,EAASp5B,KAAK,2BAA2B67D,SAASw4B,GAAqB,OAAIr5D,EAF3E5B,EAASp5B,KAAK,SAAUg7B,GAK5B,MAAO36B,QAYTg8I,UAAW,SAAU30F,GACnB,GAA6B,IAAzBrnD,KAAKu0B,SAASzmB,OAAc,MAAO,KAGvC,KAAK,GADD6sB,GAAS,KACJpzB,EAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAC7C,GAAIwxB,GAAW/4B,KAAKu0B,SAAShtB,GACzB00I,EAAYljH,EAASp5B,KAAK,0BAI9B,OAHI0nD,IAAiB40F,GAAaA,EAAUzgF,SAASnU,KACnD1sB,EAASshH,EAAUzgF,SAASnU,GAAuB,QAE9C1sB,GAAU5B,EAASp5B,KAAK,YAYnCy6B,cAAe,WACb,GAAIrB,EACJ,IAA6B,IAAzB/4B,KAAKu0B,SAASzmB,OAAc,MAAO9N,KACvC,KAAK,GAAIuH,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAExC,MADAwxB,GAAW/4B,KAAKu0B,SAAShtB,GAClBwxB,EAASp5B,KAAK,2BAA2B67D,UAapDiI,cAAe,SAAUC,GACvB,GAAI3qC,EACJ,IAA6B,IAAzB/4B,KAAKu0B,SAASzmB,OAAc,MAAO9N,KACvC,KAAK,GAAIuH,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IACxCwxB,EAAW/4B,KAAKu0B,SAAShtB,GACzBwxB,EAASp5B,KAAK,2BAA2B8jE,cAAcC,EAEzD,OAAO1jE,OAaT8jE,cAAe,SAAUJ,GACvB,GAA6B,IAAzB1jE,KAAKu0B,SAASzmB,OAAc,MAAO9N,KACvC,KAAK,GAAIuH,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAC7C,GAAIwxB,GAAW/4B,KAAKu0B,SAAShtB,EAC7BwxB,GAASp5B,KAAK,2BAA2BmkE,cAAcJ,GAEzD,MAAO1jE,OAcT69D,UAAW,SAAUN,EAAWK,GAC9B,GAAI76C,GAAK/iB,IACT,OAA2B,KAAvB+iB,EAAGwR,SAASzmB,OAAqBiV,GACrCA,EAAGm5H,mBAAmB3+E,EAAWK,GAEjC76C,EAAGo5H,iBAAiB5+E,GAAWhsD,KAAK,SAAU6qI,GAC5Cr5H,EAAGm5H,mBAAmBE,GAAkB,KAG1Cr5H,EAAG0jH,YAAa,EACT1jH,IAaTm5H,mBAAoB,SAAU3+E,EAAWK,GAEvC,IAAK,GADD76C,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,EAC3BwxB,GAASp5B,KAAK,2BAA2Bk+D,UAAUN,EAAWK,KAalEu+E,iBAAkB,SAAU5+E,GAC1B,GAAI/rD,GAAI3S,EAAE0nB,UAEV,IAAIg3C,EAAUzvD,OAAQ,CAEpB,GAAIuuI,GAAuB9+E,EAAU5iC,OAAO,SAAU9zB,GACpD,OAAQA,EAAKoD,MAAQpD,EAAKtD,IAG5B,IAAI84I,EAAqBvuI,OAAQ,CAC/B,GAAIqrD,KACJkjF,GAAqB7oI,QAAQ,SAAU3M,GACrCsyD,EAAI5lD,KAAK1M,EAAKtD,MAIhBgC,GAAG8L,IAAIiqE,UAAUsD,yBAAyBzlB,GAAK5nD,KAAK,SAAUnK,GAE5Dm2D,EAAU/pD,QAAQ,SAAU3M,IACrBA,EAAKoD,MAAQ7C,EAAIP,EAAKtD,MACzBsD,EAAKoD,KAAO7C,EAAIP,EAAKtD,IAAI0G,QAI7BuH,EAAEsW,QAAQy1C,SAGZ/rD,GAAEsW,QAAQy1C,OAGZ/rD,GAAEsW,QAAQy1C,EAIZ,OAAO/rD,GAAE2W,WAWXm4C,UAAW,WACT,GAA6B,IAAzBtgE,KAAKu0B,SAASzmB,OAAc,MAAO9N,KACvC,KAAK,GAAIuH,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAC7C,GAAIwxB,GAAW/4B,KAAKu0B,SAAShtB,EAC7B,OAAOwxB,GAASp5B,KAAK,2BAA2B2gE,cAepDg8E,UAAW,SAAU/+E,EAAWK,GAC9B,GAAI76C,GAAK/iB,KACLu8I,EAAgBx5H,EAAGu9C,WAOvB,OANAv9C,GAAGy5H,WAAWD,EAAeh/E,EAAWK,GAExC76C,EAAGo5H,iBAAiB5+E,GAAWhsD,KAAK,SAAU6qI,GAC5Cr5H,EAAGy5H,WAAWD,EAAeH,GAAkB,KAG1Cr5H,GAcTy5H,WAAY,SAAUD,EAAeh/E,EAAWK,GAC9C,GAAI76C,GAAK/iB,KACLy8I,EAAYF,EAAcv8H,OAAOu9C,EAAU5iC,OAAO,SAAUm8E,GAC9D,GAAItyD,IAAS,CAOb,OANA+3F,GAAc/oI,QAAQ,SAAUy+D,GAC9B,GAAIA,EAAY1uE,IAAMuzG,EAAQvzG,GAE5B,MADAihD,IAAS,GACF,IAGJA,IAGT,OADAzhC,GAAG86C,UAAU4+E,EAAW7+E,GACjB76C,GAaTkxE,iBAAkB,SAAU16C,GAC1B,GAA6B,IAAzBv5C,KAAKu0B,SAASzmB,OAAc,MAAO9N,KACvC,KAAK,GAAIuH,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAC7C,GAAIwxB,GAAW/4B,KAAKu0B,SAAShtB,EAC7BwxB,GAASp5B,KAAK,2BAA2B28D,kBAAoB/iB,EAE/D,MAAOv5C,OAWT08I,gBAAiB,WAEf,MADA18I,MAAKyjE,kBACEzjE,MAYTk0F,8BAA+B,SAAUC,GACvC,GAAIwoD,GAAU38I,KAAKo6B,gBAEfwiH,EAAU/9I,EAAE4C,QACdo7I,eAAmB/oF,QAAWntD,EAAE,+CAAgDu/D,cAAgB,EAAM42E,0BAA4B,EAAOxqB,OAAUn+B,IAClJwoD,EAGH,OADA38I,MAAKyjE,cAAcm5E,GACZ58I,MAWTo0F,iCAAkC,WAChC,GAAIuoD,GAAU38I,KAAKo6B,eAGnB,cAFOuiH,GAAuB,cAC9B38I,KAAKyjE,cAAck5E,GACZ38I,MAWTq0F,wBAAyB,WAEvB,IAAK,GADDtxE,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,GACvBrB,EAAa6yB,EAASn3B,QAAQ,wBAC9Bw4I,EAAWl0I,EAAWhC,KAAK,YAC/Bk2I,GAAS53H,OAAO,oBAAoBL,KAAK,mBAAoB,SAAU/d,GACrEA,EAAEhF,iBACF,IAAIioD,GAAgB,EAEpB,KAAK,GAAItoC,KAASgE,GAAGqX,gBAAiB,CACpCitB,EAAgBtoC,CAChB,OAEF,GAAImgB,GAAOnc,EAAG9a,aAAeyS,qBAAqBC,KAC/CoI,EAAGyuH,gBAAkB92H,qBAAqBG,MAAQH,qBAAqBE,MAC1EiQ,WAAUiC,WAAWhH,QAAQ42F,oBAAoB6C,eAC/ChmE,cAAe8N,EACfnoB,KAAMA,EACNooB,iBAAkBvkC,EAAGi5H,UAAU30F,GAC/B01D,YAAahkF,EAAS9kB,MACtBomB,aAActX,EAAGsX,eACjB4iF,iBAAkBl6F,EAAGk6F,qBACpBuC,cAAc,SAAUv8F,GACzB,GAAIic,GAAQxkB,qBAAqBG,MAAO,CACtC,GAAIkiI,GAAgB95H,EAAO3G,IAAI,SAAU0gI,GACvC,OACEx8E,UAAWnZ,EACX9jD,GAAIy5I,EAAMz5I,GACV0G,KAAM+yI,EAAM/yI,OAGhB8Y,GAAGu5H,UAAUS,OACJ79G,IAAQxkB,qBAAqBE,QACtCmI,EAAGsW,SAASpW,EAAO,GAAG1f,GAAI0f,EAAO,GAAGhZ,MAAM,EAAMgZ,EAAO,GAAGkW,2BAKlE,MAAOpW,IAWTyuH,cAAe,WACb,GAA6B,IAAzBxxI,KAAKu0B,SAASzmB,OAAc,OAAO,CACvC,KAAK,GAAIvG,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IACxC,MAAOvH,MAAKu0B,SAAShtB,GAAG5H,KAAK,2BAA2Bs8D,aAa5D5hC,aAAc,WACZ,GAA6B,IAAzBr6B,KAAKu0B,SAASzmB,OAAc,MAAO,KACvC,KAAK,GAAIvG,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IACxC,MAAOvH,MAAKu0B,SAAShtB,GAAG5H,KAAK,2BAA2B06B,cAa5D4iF,iBAAkB,WAChB,GAA6B,IAAzBj9G,KAAKu0B,SAASzmB,OAAc,MAAO,KACvC,KAAK,GAAIvG,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IACxC,MAAOvH,MAAKu0B,SAAShtB,GAAG5H,KAAK,2BAA2Bi5B,YAAYC,aAcxEQ,SAAU,SAAUta,EAAOg7H,EAAkBvwE,EAAuBkyE,GAClE,GAAI34H,GAAK/iB,IAGT,IAFA+iB,EAAGe,OAAO/E,EAAOg7H,EAAkBvwE,EAAuBkyE,IAErD3B,IAAqBh3H,EAAGktE,gBACvBlxE,EAAO,CACT,GAAIk+H,GAAel6H,EAAGe,OAElB4/C,EAAa3gD,EAAGqX,gBAChBmf,EAAgB16B,OAAOsoF,KAAKzjC,GAAY,EAC5C3gD,GAAGo5H,mBAAoB37E,UAAWjnB,EAAeh2C,GAAIwb,EAAO9U,KAAM,MAAOsH,KAAK,SAAU6qI,GACtFa,EAAal9H,MAAMgD,GAAKhE,EAAOq9H,EAAiB,GAAGnyI,MAAM,GAAO,MAKtE,MAAO8Y,KAMX4I,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW0uE,UAAYA,GAClDzvF;ACldH,cAYA,SAAWqnB,GAET,GAAIsE,GAAWtE,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWqmG,0BAA0BjqH,QAC9EyR,UAAW,WASXs+H,cAAe,WACb,OAAO,GAaTn4G,SAAU,SAAUta,EAAOg7H,EAAkBvwE,EAAuBkyE,GAClE,GAAI34H,GAAK/iB,KACLi9I,EAAel6H,EAAGe,MAatB,OAZAf,GAAGe,OAAO/E,EAAOg7H,EAAkBvwE,EAAuBkyE,GAErD3B,GAAqBh3H,EAAGktE,gBACvBlxE,GACFxZ,GAAG8L,IAAInM,SAASy9E,aAAa5jE,IAAQxN,KAAK,SAAUnK,GAClD61I,EAAal9H,MAAMgD,GAAKhE,EAAO3X,GAAK,GAAO,MAC1C2gB,KAAK,SAAU0I,GAChBwsH,EAAal9H,MAAMgD,GAAKhE,EAAO0R,GAAS,GAAO,MAK9C1N,IAKX4I,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW4K,SAAWA,GACjD3rB;AC3DH,cAYA,SAAWqnB,GAET,GAAI+nC,GAAO/nC,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW2gH,cAAcvkI,QAC9DyR,UAAW,OASXumB,SAAU,SAAUkgH,GAClB,GAAI35I,KAAKq2E,OAASr2E,KAAKq2E,MAAMgwD,cAAe,EAAO,MAAOrmI,MAAKq2E,MAAMt3D,KAErE,IAAIga,GAAW4gH,GAAgB35I,KAAKu0B,SAAS,EAC7C,OAA4C,gBAAjCwE,GAASp5B,KAAK,eAChBo5B,EAAS+4D,YAAY,OAErB/4D,EAAS9kB,MAAgB8kB,EAAS9kB,MAAhB,MAW7By1D,gBAAiB,SAAUiwE,GACzB,MAAO35I,MAAKy5B,SAASkgH,IAevBtgH,SAAU,SAAUta,EAAOg7H,EAAkBvwE,GAC3CA,EAAyBA,KAA0B,CACnD,IACIzwC,GADAha,EAAQg7H,GAAoBh7H,CAGhC,IAA6B,IAAzB/e,KAAKu0B,SAASzmB,OAAc,MAAO9N,MAAK85I,oBAAoB/6H,EAAOg7H,EAAkBvwE,EAEzF,KAAK,GAAIjiE,GAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IACxCwxB,EAAW/4B,KAAKu0B,SAAShtB,GACzBwxB,EAAS9kB,IAAI8K,GACTyqD,GAAyBzwC,EAASua,SACjCva,EAASgM,GAAG,aAAahM,EAASh0B,KAAK,QAASga,EAIvD,OADA/e,MAAKymI,YAAa,EACXzmI,MAaTuxH,gBAAiB,SAAUxyG,GAEzB,MADA/e,MAAKq5B,SAASta,GACP/e,MAaTy4B,aAAc,WACZ,GAEIM,GAFAhW,EAAK/iB,KACLoH,IAGJ,IAA6B,GAAzB2b,EAAGkkH,YAAYn5H,QAAoC,IAArBiV,EAAGkkH,YAAY,GAAU,QAE3D,KAAK,GAAI1/H,GAAI,EAAGA,EAAIwb,EAAGkkH,YAAYn5H,OAAQvG,IAAK,CAC9C,GAAIhE,GAAKwf,EAAGkkH,YAAY1/H,EACxBwxB,GAAWl6B,EAAE,SAAW0E,EAAK,aAAeA,GAC5C6D,EAAImM,KAAKwlB,GAEX,MAAO3xB,KAMXukB,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWquC,KAAOA,GAC7CpvD;ACxHH,cAYA,SAAWqnB,GAIT,GAAI6vH,GAAwB,SAAUziH,EAAUqE,GAC1CrE,EAASt5B,SAAS,UACpB29B,IAEArE,EAAS5W,KAAK,OAAQ,WACpBib,OAKF3oB,EAAOkX,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWquC,KAAKjyD,QACrDyR,UAAW,OAQXkmI,mBAAoB,SAAUrgH,GAC5B,GAAIhW,GAAK/iB,KACL47I,EAAc/8I,EAAE0nB,UACpBxD,GAAG41H,iBAAiBplI,KAAKqoI,GAEzB74H,EAAGe,OAAOiV,GAEVyiH,EAAsBziH,EAAU,WAC9B6iH,EAAY9zH,aAYhB8nH,aAAc,WAEZ,IAAK,GADD7sH,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,GACvBrB,EAAa6yB,EAAStlB,QAC1BvN,GAAWhC,KAAK,aAAa5D,OAC7B4F,EAAWlH,OAAO,+DAEpB,MAAO+jB,IAWTitH,aAAc,WAEZ,IAAK,GADDjtH,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,GACvBrB,EAAa6yB,EAAStlB,QAC1BvN,GAAWhC,KAAK,aAAajC,OAC7BiE,EAAWhC,KAAK,mBAAmBwsC,SAErC,MAAO3tB,IAcTsW,SAAU,SAAUta,EAAOg7H,EAAkBvwE,GAM3C,MALqB,gBAAVzqD,GACTA,EAAQ1Q,WAAW0Q,GACD,OAAVA,IAAmB,GAAKA,GAAO3T,QAAQ,QAAS,IACxD2T,EAAQ,GAAItK,GAAKsK,IAEZ/e,KAAK8jB,OAAO/E,EAAOg7H,EAAkBvwE,IAW9Cv0D,QAAS,WACP,GAAI8J,GAAQ/e,KAAKy5B,UACjB,OAAI1a,GAAclP,UAAU7P,KAAKy5B,YAC1B,MAaTugH,gBAAiB,SAAUjhH,GACzB/4B,KAAK8jB,OAAOiV,EACZ,IAAI3wB,GAAO2wB,EAAS2tC,SAAS,YAI7B,OAHIt+D,GAAK0F,QACP1F,EAAKrD,KAAK,WAAY,YAAYrF,SAAS,qBAEtCM,MAYTi6I,eAAgB,SAAUlhH,GACxB/4B,KAAK8jB,OAAOiV,EACZ,IAAI3wB,GAAO2wB,EAAS2tC,SAAS,YAI7B,OAHIt+D,GAAK0F,QACP1F,EAAK6hC,WAAW,YAAY3qC,YAAY,qBAEnCU,MAWT6uI,WAAY,WACV,GAAI9rH,GAAK/iB,IACT,IAAI+iB,EAAGwR,SAASzmB,OAAS,EAAG,CAC1B,GAAIirB,GAAWhW,EAAGwR,SAAS,EAC3B,OAAO,GAAKwE,EAAS2tC,SAAS,mBAAmB3hE,KAAK,aAAgB,OAEtE,MAAQge,GAAGszD,OAAiC,aAAxBtzD,EAAGszD,MAAM1nE,aAOnCgd,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW5Q,KAAOA,GAC7CnQ;AClLH,cAWA,SAAWqnB,GAET,GAAIylE,GAAOzlE,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW2gH,cAAcvkI,QAC9DyR,UAAW,OAUX08H,aAAc,WAEZ,IAAK,GADD7sH,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,GACvB21I,EAAan6H,EAAGo6H,YAAYpkH,GAC5B7yB,EAAa6yB,EAAStlB,QAC1BvN,GAAWhC,KAAK,aAAa5D,OAC7B4F,EAAWlH,OAAO,kDAAoDk+I,EAAa,gCAAkC,IAAM,YAE7H,MAAOn6H,IAWTitH,aAAc,WAEZ,IAAK,GADDjtH,GAAK/iB,KACAuH,EAAI,EAAGA,EAAIwb,EAAGwR,SAASzmB,OAAQvG,IAAK,CAC3C,GAAIwxB,GAAWhW,EAAGwR,SAAShtB,GACvBrB,EAAa6yB,EAAStlB,QAC1BvN,GAAWhC,KAAK,aAAajC,OAC7BiE,EAAWhC,KAAK,mBAAmBwsC,SAErC,MAAO3tB,IAITo6H,YAAa,SAAUpkH,GACrB,MAAOA,GAASjrB,SAAWirB,EAASgM,GAAG,eAGzCtM,aAAc,WACZ,GAAI1V,GAAK/iB,KACLoH,IAEJ,IAA6B,GAAzB2b,EAAGkkH,YAAYn5H,QAAoC,IAArBiV,EAAGkkH,YAAY,GAAU,QAC3D,KAAK,GAAI1/H,GAAI,EAAGA,EAAIwb,EAAGkkH,YAAYn5H,OAAQvG,IAAK,CAC9C,GAAIhE,GAAKwf,EAAGkkH,YAAY1/H,GACpBwxB,EAAWl6B,EAAE,SAAW0E,EAAK,cAAgBA,EAC1B,IAAnBw1B,EAASjrB,SACXirB,EAAWl6B,EAAE,IAAM0E,EAAK,UACD,GAAnBw1B,EAASjrB,SACXirB,EAAWl6B,EAAE,IAAM0E,KAGvB6D,EAAImM,KAAKwlB,GAEX,MAAO3xB,IAUTwyI,iBAAkB,SAAUC,GAC1B,GACI9gH,GADAhW,EAAK/iB,IAST,OAPA+4B,GAAWl6B,EAAE,SAAWg7I,EAAY3rI,QAAQ,MAAO,IAAIA,QAAQ,WAAY,IAAM,UAC1D,GAAnB6qB,EAASjrB,SACXirB,EAAWl6B,EAAE,UAAYg7I,EAAY3rI,QAAQ,MAAO,IAAIA,QAAQ,WAAY,KACvE6U,EAAGo6H,YAAYpkH,KAClBA,EAAWl6B,EAAE,aAAeg7I,EAAY3rI,QAAQ,MAAO,OAGlD6qB,EAAS9kB,MAAgB8kB,EAAS9kB,MAAhB,MAU7By1D,gBAAiB,SAAUiwE,GACzB,GAAI35I,KAAKq2E,MAAMgwD,cAAe,EAAO,MAAOrmI,MAAKq2E,MAAMh7C,YACvD,IAA6B,IAAzBr7B,KAAKu0B,SAASzmB,OAAlB,CACA,GAAI4rI,GAAKC,GAAgB35I,KAAKu0B,SAAS,EACvC,OAAOmlH,GAAGzlI,QAIZmpI,YAAa,SAAUrkH,GACrB,MAAOA,GAASt5B,SAAS,aAc3B45B,SAAU,SAAUta,EAAOg7H,EAAkBvwE,GAC3C,GAAIzmD,GAAK/iB,IACT,IAAIsJ,EAAE2kF,YAAYlvE,GAAQ,MAAO/e,KAGjC,IAFAwpE,EAAyBA,KAA0B,EAExB,IAAvBzmD,EAAGwR,SAASzmB,OAAc,MAAOiV,GAAG+2H,oBAAoB/6H,EAAOg7H,EAAkBvwE,EAGrF,KAAK,GADDzwC,GACKxxB,EAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAExC,GADAwxB,EAAW/4B,KAAKu0B,SAAShtB,GACrBwb,EAAGo6H,YAAYpkH,GAAW,CAC5BA,EAAS9kB,IAAI8K,EAEb,IAAIs+H,GAAWt6H,EAAGu6H,oBAAoBvkH,EAEqB,oBAA/CA,GAASn3B,QAAQ,QAAQjC,KAAK,cAAkCof,GAASga,EAASn3B,QAAQ,QAAQjC,KAAK,aAAaiyD,IAAMyrF,EAASt4I,KAAK,UAAW,WAAWsnC,KAAK,WAAW,GACrLgxG,EAASpzG,WAAW,WAAWoC,KAAK,WAAW,GACpDtpB,EAAG0jH,YAAa,EAIpB,GAAIptG,GAAW,SAAU22B,EAASjxC,EAAOg7H,EAAkBvwE,GACzD,GAAI+zE,GAAavtF,EAAQrwD,KAAK,uBAC1B49I,IACFA,EAAWlkH,SAASta,EAAOg7H,EAAkBvwE,GAsBjD,OAlBAlgE,GAAEyZ,EAAGwR,UAAUx0B,KAAK,SAAUg5B,GACvBhW,EAAGo6H,YAAYpkH,KACdA,EAASp5B,KAAK,wBAChB05B,EAASN,EAAUha,EAAOg7H,EAAkBvwE,GAE5CzwC,EAAS5W,KAAK,OAAQ,WACpBkX,EAASN,EAAUha,EAAOg7H,EAAkBvwE,KAG5CuwE,EACFhhH,EAASh0B,KAAK,QAASg1I,GAEvBhhH,EAASkR,WAAW,SAEtBlnB,EAAG0jH,YAAa,KAIbzmI,MAWTwmI,aAAc,WACZ,GAAIzjH,GAAK/iB,IAMT,OALI+iB,GAAGwR,SAASzmB,OAAS,GACvBiV,EAAGZ,KAAK,SAAU,SAAUoZ,EAASp8B,EAAIQ,GACvCojB,EAAGsW,SAAS15B,EAAKof,MAAOI,QAAW,KAGhCnf,MAYTs9I,oBAAqB,SAAUvkH,GAC7B,GAAIykH,GAAkBzkH,EAASke,QAAQ,OACvC,OAAOumG,GAAgBt5I,KAAK,yBAY9B81I,gBAAiB,SAAUjhH,GACzB,GAAIhW,GAAK/iB,IAMT,IALA+4B,EAASr5B,SAAS,gBAAgBqF,KAAK,YAAY,GACnDg0B,EAAS4I,KAAK,aAAajiC,SAAS,yBAChCqjB,EAAGq6H,YAAYrkH,IACjBA,EAASsT,KAAK,YAAY,GAExBtpB,EAAGo6H,YAAYpkH,GAAW,CAC5B,GAAIskH,GAAWt6H,EAAGu6H,oBAAoBvkH,EAClCskH,GAASvvI,OAAS,GACpBuvI,EAASt4I,KAAK,YAAY,GAG9B,MAAOge,IAYTk3H,eAAgB,SAAUlhH,GACxB,GAAIhW,GAAK/iB,IAMT,IALA+4B,EAASz5B,YAAY,gBAAgB2qC,WAAW,YAChDlR,EAAS4I,KAAK,aAAariC,YAAY,yBACnCyjB,EAAGq6H,YAAYrkH,IACjBA,EAASsT,KAAK,YAAY,GAExBtpB,EAAGo6H,YAAYpkH,GAAW,CAC5B,GAAIskH,GAAWt6H,EAAGu6H,oBAAoBvkH,EAClCskH,GAASvvI,OAAS,GACpBuvI,EAASt4I,KAAK,YAAY,GAG9B,MAAOge,IAOTilE,YAAa,WACX,GAAIjlE,GAAK/iB,IAET,IAA2B,IAAvB+iB,EAAGwR,SAASzmB,OAAc,CAC5B,GAAI8tI,GAAc/8I,EAAE0nB,UAGpB,OAFAxD,GAAG41H,iBAAiBplI,KAAKqoI,GACzBA,EAAY9zH,UACL/E,EAyBT,MAtBAzZ,GAAEyZ,EAAGwR,UAAUx0B,KAAK,SAAUg5B,GAC5B,GAAI6iH,GAAc/8I,EAAE0nB,UAGpB,OAFAxD,GAAG41H,iBAAiBplI,KAAKqoI,GAErB74H,EAAGo6H,YAAYpkH,IACjBA,EAAWhW,EAAGu6H,oBAAoBvkH,GAClChW,EAAGq2H,mBAAmBrgH,GAAU,OAChC6iH,GAAY9zH,gBAIViR,EAASp5B,KAAK,yBAChBojB,EAAGq2H,mBAAmBrgH,GACtB6iH,EAAY9zH,WAEZiR,EAAS5W,KAAK,OAAQ,WACpBY,EAAGq2H,mBAAmBrgH,GACtB6iH,EAAY9zH,eAKX/E,GASTq2H,mBAAoB,SAAUrgH,EAAU0kH,GACtC,GAAI16H,GAAK/iB,KACLq5I,EAAct2H,EAAG2W,SACjB94B,EAAY,sBACZ68I,IAAuC,OAAxBl4I,GAAGC,IAAI4M,QAAQnI,OAChCrJ,EAAY,uBAGdm4B,EAASl4B,IAAID,GAAWE,GAAGF,EAAW,SAAUzB,GAC9C,GAAI4f,GAAQgE,EAAG0W,SAAS56B,EAAEmB,OACtBq7B,EAAetY,EAAG2mD,gBAAgB7qE,EAAEmB,MACxC+iB,GAAGu2H,YAAYD,EAAat6H,EAAOsc,EAAcl8B,MAQrDu+I,oBAAqB,SAAU3kH,EAAU6hC,EAAQ/6C,GAC/C,GACI62F,GAAW39E,EAASp5B,KAAK,uBACzB+2G,GACFA,EAAS97C,GAAQ76C,MAAM22F,EAAU72F,GAEjCkZ,EAAS5W,KAAK,OAAQ,WACpBu0F,EAAW39E,EAASp5B,KAAK,wBACzB+2G,EAAS97C,GAAQ76C,MAAM22F,EAAU72F,MAavCyxE,YAAa,WACX,GAAIvuE,GAAK/iB,IAQT,OAPAsJ,GAAEyZ,EAAGwR,UAAUx0B,KAAK,SAAUg5B,GACxBhW,EAAGo6H,YAAYpkH,GACjBA,EAASn3B,QAAQ,QAAQjC,KAAK,gBAE9BojB,EAAG26H,oBAAoB3kH,EAAU,4BAG9BhW,GAcTyuE,SAAU,SAAUzyE,EAAOsc,EAAcsiH,GACvC,GAAI56H,GAAK/iB,KACL6G,GAAQkY,EAAOsc,EAAcA,EAAald,aAAcw/H,EAY5D,OAXAr0I,GAAEyZ,EAAGwR,UAAUx0B,KAAK,SAAUg5B,GACxBhW,EAAGo6H,YAAYpkH,GACZA,EAASn3B,QAAQ,QAAQjC,KAAK,aAAkB,IAGnDo5B,EAASn3B,QAAQ,QAAQjC,KAAK,aAAiB,GAAIof,EAFnDga,EAASn3B,QAAQ,QAAQjC,KAAK,aAAkB,IAAIof,EAKtDgE,EAAG26H,oBAAoB3kH,EAAU,uBAAwBlyB,MAGtDkc,GAYT66H,YAAa,SAAU7+H,GAIrB,MAHAzV,GAAEyZ,GAAGwR,UAAUx0B,KAAK,SAAUg5B,GAC5BhW,GAAG26H,oBAAoB3kH,EAAU,0BAA2Bha,MAEvDgE,KAKX4I,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW+rE,KAAOA,GAC7C9sF;ACpZH,cAYA,SAAWqnB,GAKT,GAAI6vH,GAAwB,SAAUziH,EAAUqE,GAC1CrE,EAASt5B,SAAS,UACpB29B,IAEArE,EAAS5W,KAAK,OAAQ,WACpBib,OAKFyoG,EAAUl6G,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWquC,KAAKjyD,QACxDyR,UAAW,UAOXkmI,mBAAoB,SAAUrgH,GAC5B,GAAIhW,GAAK/iB,KACL47I,EAAc/8I,EAAE0nB,UACpBxD,GAAG41H,iBAAiBplI,KAAKqoI,GAEzB74H,EAAGe,OAAOiV,GAEVyiH,EAAsBziH,EAAU,WAC9B6iH,EAAY9zH,aAKhB2R,SAAU,SAAUkgH,GAClB,GAAI35I,KAAKq2E,OAASr2E,KAAKq2E,MAAMgwD,cAAe,EAAO,MAAOrmI,MAAKq2E,MAAMt3D,KACrE,IAAIga,GAAW4gH,GAAgB35I,KAAKu0B,SAAS,GACzCspH,EAAgB9kH,EAAS9kB,KAC7B,OAA4C,gBAAjC8kB,GAASp5B,KAAK,gBAAiD,MAAlBk+I,EAC/C9kH,EAAS+4D,YAAY,OAErB+rD,EAAwBA,EAAP,MAG5BxkH,SAAU,SAAUta,EAAOg7H,EAAkBvwE,GAE3C,GAAIlgE,EAAE2kF,YAAYlvE,GAAQ,MAAO/e,KAGjC,IAFAwpE,EAAyBA,KAA0B,EAEtB,IAAzBxpE,KAAKu0B,SAASzmB,OAAc,MAAO9N,MAAK85I,oBAAoB/6H,EAAOg7H,EAAkBvwE,EAEzFzqD,IAASA,EAAM,IAAI7Q,QAAQ,IAAK,IAKhC,KAAK,GADD6qB,GAFA9kB,EAAMiiE,WAAWn3D,GAGZxX,EAAI,EAAGA,EAAIvH,KAAKu0B,SAASzmB,OAAQvG,IAAK,CAG7C,GAFAwxB,EAAW/4B,KAAKu0B,SAAShtB,GAEX,MAAVwX,EACFga,EAAS9kB,IAAI,SACR,CACL,GAAe,KAAV8K,GAAgBzV,EAAEw0I,OAAO/+H,IAAUunD,MAAMryD,GAAO,CACnD8kB,EAAS9kB,IAAI,IACb8kB,EAASkR,WAAW,QACpB,UAG0C,gBAAjClR,GAASp5B,KAAK,eACvBo5B,EAAS+4D,YAAY,MAAO79E,GAE5B8kB,EAAS9kB,IAAIA,GAIb8lI,EACFhhH,EAASh0B,KAAK,QAASg1I,GAEvBhhH,EAASkR,WAAW,SAElBu/B,GAAyBzwC,EAASua,SAIxC,MADAtzC,MAAKymI,YAAa,EACXzmI,OAKX2rB,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWwgH,QAAUA,GAChDvhI;ACxGH,cAYA,SAAWqnB,GAOT,GAAIm6G,GAAQn6G,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW2gH,cAAcvkI,QAC/DyR,UAAW,QAUXulB,aAAc,WACZ,GAAI1V,GAAK/iB,KACLoH,IAEJ,IAA6B,GAAzB2b,EAAGkkH,YAAYn5H,QAAoC,IAArBiV,EAAGkkH,YAAY,GAAU,QAE3D,KAAK,GAAI1/H,GAAI,EAAGA,EAAIwb,EAAGkkH,YAAYn5H,OAAQvG,IAAK,CAC9C,GAAIhE,GAAKwf,EAAGkkH,YAAY1/H,GACpBwuC,EAAW,UAAYxyC,EAAK,kBAChCwyC,GAAWA,EAASh4B,WAAW,IAAK,IACpC,IAAIgb,GAAWl6B,EAAEk3C,EACjB3uC,GAAImM,KAAKwlB,GAEX,MAAO3xB,IAYTwoI,aAAc,WACZ,GAAI7sH,GAAK/iB,IACT,OAAO+iB,IAWTitH,aAAc,WACZ,GAAIjtH,GAAK/iB,IACT,OAAO+iB,IAUT2mD,gBAAiB,SAAUiwE,GACzB,GAAI35I,KAAKq2E,OAASr2E,KAAKq2E,MAAMgwD,cAAe,EAAO,MAAOrmI,MAAKq2E,MAAMh7C,YACrE,IAA6B,IAAzBr7B,KAAKu0B,SAASzmB,OAClB,MAAOjP,GAAEmB,KAAKu0B,SAAS,IAAIoG,OAAO,YAAYgH,KAAK,SAASl6B,QAe9D4xB,SAAU,SAAUta,EAAOg7H,EAAkBvwE,GAC3C,GAAIzmD,GAAK/iB,IAGT,OAFAwpE,GAAyBA,KAA0B,EAEtB,IAAzBxpE,KAAKu0B,SAASzmB,OAAqB9N,KAAK85I,oBAAoB/6H,EAAOg7H,EAAkBvwE,IAEzF3qE,EAAEkB,KAAKgjB,EAAGwR,SAAU,WAClB,GAAIwE,GAAWl6B,EAAEmB,MAAM26B,OAAO,WAC5B,MAAO97B,GAAEmB,MAAMiU,MAAMiO,gBAAkBnD,EAAMG,WAAWgD,eAE1D6W,GAASsT,KAAK,WAAW,KAI3BrsC,KAAKymI,YAAa,EACXzmI,OAQTuxH,gBAAiB,SAAUl2F,EAAcmuC,GACvC,MAAOxpE,OAWT45I,iBAAkB,SAAUC,GAC1B,GAA6B,IAAzB75I,KAAKu0B,SAASzmB,OAClB,MAAwD,SAAjDjP,EAAEmB,KAAKu0B,SAAS,IAAIoG,OAAO,YAAY1mB,OAQhDy8E,gBAAiB,WACf,MAAO1wF,QAIX2rB,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWygH,MAAQA,GAC9CxhI;ACrJH,cAYA,SAAWqnB,GAOT,GAAIo6G,GAAWp6G,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW2gH,cAAcvkI,QAClEyR,UAAW,WAUXulB,aAAc,WACZ,GAAI1V,GAAK/iB,KACLoH,IAEJ,IAA6B,GAAzB2b,EAAGkkH,YAAYn5H,QAAoC,IAArBiV,EAAGkkH,YAAY,GAAU,QAE3D,KAAK,GAAI1/H,GAAI,EAAGA,EAAIwb,EAAGkkH,YAAYn5H,OAAQvG,IAAK,CAC9C,GAAIhE,GAAKwf,EAAGkkH,YAAY1/H,GACpBwuC,EAAW,QAAUxyC,EAAK,KAC1Bw1B,EAAWl6B,EAAEk3C,EACjB3uC,GAAImM,KAAKwlB,GAEX,MAAO3xB,IAYTwoI,aAAc,WACZ,GAAI7sH,GAAK/iB,IACT,OAAO+iB,IAWTitH,aAAc,WACZ,GAAIjtH,GAAK/iB,IACT,OAAO+iB,IAWT2mD,gBAAiB,SAAUiwE,GACzB,MAAO,IAcTtgH,SAAU,SAAUta,EAAOg7H,EAAkBvwE,GAC3C,GAAIzmD,GAAK/iB,IAGT,OAFAwpE,GAAyBA,KAA0B,EAEtB,IAAzBxpE,KAAKu0B,SAASzmB,OAAqB9N,KAAK85I,oBAAoB/6H,EAAOg7H,EAAkBvwE,IAEzF3qE,EAAEkB,KAAKgjB,EAAGwR,SAAU,WAClB11B,EAAEmB,MAAMqsC,KAAK,UAAWttB,KAG1B/e,KAAKymI,YAAa,EACXzmI,OAQTuxH,gBAAiB,SAAUl2F,EAAcmuC,GAEvC,MAAOxpE,OAWT45I,iBAAkB,SAAUC,GAC1B,GAA6B,IAAzB75I,KAAKu0B,SAASzmB,OAClB,MAAOjP,GAAEmB,KAAKu0B,SAAS,IAAIwQ,GAAG,aAWhCm/E,SAAU,SAAUz8G,GAClB,MAAOzH,OAYTy5I,oBAAqB,SAAU1gH,GAC7B,GAAI2gH,GAAK3gH,EAASn3B,QAAQ,uBAAuBggC,KAAK,kBACtD,OAAI83G,GAAG5rI,OAAe4rI,EACtBA,EAAK3gH,EAASn3B,QAAQ,UASxB8uF,gBAAiB,WACf,MAAO1wF,QAMX2rB,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW0gH,SAAWA,GACjDzhI;AC7KH,cAYA,SAAWqnB,GAIT,GAAIk3F,GAAal3F,EAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW2gH,cAAcvkI,QACpEyR,UAAW,aAUXulB,aAAc,WACZ,GAAI1V,GAAK/iB,KACLoH,IAEJ,IAA6B,GAAzB2b,EAAGkkH,YAAYn5H,QAAoC,IAArBiV,EAAGkkH,YAAY,GAAU,QAE3D,KAAK,GAAI1/H,GAAI,EAAGA,EAAIwb,EAAGkkH,YAAYn5H,OAAQvG,IAAK,CAC9C,GAAIhE,GAAKwf,EAAGkkH,YAAY1/H,GACpBwxB,EAAWl6B,EAAE,IAAM0E,EAAK,QAC5B6D,GAAImM,KAAKwlB,GAEX,MAAO3xB,IASTkyI,YAAa,SAAUD,EAAat6H,EAAOsc,EAAck+G,GACvD,GAAIx2H,GAAK/iB,IACT+iB,GAAG0jH,YAAa,EAChB1jH,EAAGlB,KAAK,SAAU7hB,KAAMu5I,GAAUtvI,KAAMovI,EAAat6H,MAAOgE,EAAG0W,WAAY4B,aAAc,OACrFr7B,KAAK4vF,SAAW5vF,KAAK4vF,QAAQljF,MAAM1M,KAAK4vF,QAAQljF,KAAKmV,KAAK,SAAU7hB,KAAMu5I,GAAUtvI,KAAMovI,EAAat6H,MAAOgE,EAAG0W,WAAY4B,aAAcA,KAWjJu0G,aAAc,WACZ,GAAI7sH,GAAK/iB,IACT,OAAO+iB,IAWTitH,aAAc,WACZ,GAAIjtH,GAAK/iB,IACT,OAAO+iB,IAWT2mD,gBAAiB,SAAUiwE,KAa3BoE,iBAAkB,WAChB,MAAO/9I,MAAK45I,iBAAiB55I,KAAKinI,YAAY,GAAI,qBAapD5tG,SAAU,SAAUta,EAAOg7H,EAAkBvwE,GAC3C,GAAIzmD,GAAK/iB,IACT,KAAIsJ,EAAE2kF,YAAYlvE,GAclB,MAbAyqD,GAAyBA,KAA0B,EAE9ClgE,EAAE6lI,QAAQpwH,KAAQA,GAASA,IAChCzV,EAAEvJ,KAAKgjB,EAAGkkH,YAAa,SAAUh9H,GAC/B,GAAIy5C,GAAOmH,cAAc5gD,GACrBgpB,EAAQ3pB,EAAEyV,GAAOzC,IAAI,SAAU6H,GACjC,MAAOA,GAAKsC,eAEdi9B,GAAKyS,OAASljC,EACdywB,EAAKmV,eAGP74D,KAAKymI,YAAa,EACXzmI,MAYTy5I,oBAAqB,SAAU1gH,GAC7B,GAAI2gH,GAAK3gH,EAASn3B,QAAQ,uBAAuBggC,KAAK,kBACtD,OAAI83G,GAAG5rI,OAAe4rI,EACf3gH,EAASn3B,QAAQ,MAAM8jD,GAAG,GAAGxhD,KAAK,qCAW3C01I,iBAAkB,SAAUC,EAAaj/E,GACvCA,EAAUA,GAAU,UAEpB,IACI33C,GAAS4nC,cAAcgvF,GAAaj/E,IAExC,OAAI33C,GAAOgQ,MACF3pB,EAAE2Z,EAAOgQ,OAAO3W,IAAI,SAAU6H,GACnC,GAAI65H,GAAU,GAAIz4I,IAAG6e,QACrB,OAAO45H,GAAQ9pE,cAAc/vD,KAGxB,MAYXlc,WAAY,WACV,MAAO4iD,eAAc7qD,KAAKinI,YAAY,IAAIjwE,UAY5CgjF,gBAAiB,SAAUjhH,GAIzB,MAHAzvB,GAAEvJ,KAAKC,KAAKinI,YAAa,SAAUh9H,GACjC4gD,cAAc5gD,GAAM8sD,YAEf/2D,MAYTi6I,eAAgB,SAAUlhH,GAIxB,MAHAzvB,GAAEvJ,KAAKC,KAAKinI,YAAa,SAAUh9H,GACjC4gD,cAAc5gD,GAAMgtD,WAEfj3D,MAaTgoF,YAAa,WACX,GAAIjlE,GAAK/iB,IACT,OAA2B,KAAvB+iB,EAAGwR,SAASzmB,OAAqB9N,MACrCnB,EAAEkB,KAAKgjB,EAAGwR,SAAU,WAClBxR,EAAGq2H,mBAAmBv6I,EAAEmB,MAAM4B,QAAQ,qBAEjCmhB,KAKX4I,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAWw9F,WAAaA,GACnDv+G;AC/OH,cACA,SAAWqnB,GAgBT,GAAIsyH,IACFC,YAAY,EAEZzpD,MAAO,KACP0pD,QAAS,KACTC,SAAU,KACV7V,YAAY,EACZ8V,YAAa,KACbC,YAAa,KACbC,cAAe,KACfC,eAAgB,KAChBC,gBAAiB,KACjBC,WAAY,KACZC,+BAAgC,KAChCC,yBAA0B,KAG1Br+I,KAAM,SAAU4lG,EAAexmG,EAAMi5I,EAAYjT,GAE/C,GAAI5iH,GAAK/iB,IACT+iB,GAAG27H,cACH37H,EAAGe,OAAOqiF,EAAexmG,EAAMi5I,GAC/B71H,EAAG60D,YAAcj4E,EAAKmwF,WAEtB/sE,EAAGq7H,YACHr7H,EAAGu7H,eACHv7H,EAAGs7H,eAEC1+I,EAAKo6B,YACPhX,EAAGu7H,YAAc3+I,EAAKo6B,UAAUyhC,UAGlCz4C,EAAG0xE,MAAQkxC,EACX5iH,EAAG87H,mBASLC,gBAAiB,SAAU70C,GAGzB,MAFAjqG,MAAKu0B,SAAWv0B,KAAKy4B,aAAawxE,GAClCjqG,KAAKgoF,cACEhoF,MAST6+I,gBAAiB,WACf,GAAI97H,GAAK/iB,IACT+iB,GAAG27H,WAAW37H,EAAG9Y,MAAQ8Y,EAAG0W,WAE5Bz5B,KAAKy0F,MAAMtyE,KAAK,kBAAmB,SAAUgkF,EAAetuE,EAAO9Y,EAAOsc,GAExE,GAAI8qE,IAAkBpjF,EAAG9Y,MAAQ4tB,GAAS9U,EAAGszD,MAAM0Z,OAAQ,CACzD,GAAIltB,GAAO9/C,EAAG27H,WAAW37H,EAAG9Y,MACxB8kB,EAAUhQ,CACd8jD,GAAiB,OAATA,EAAiB,GAAKA,EAC9B9zC,EAAuB,OAAZA,EAAoB,GAAKA,EAEnB,UAAbhM,EAAG81H,OAAkC,YAAb91H,EAAG81H,OAC7Bh2E,GAAQA,EACR9zC,GAAWA,IAEX8zC,EAAO,GAAKA,EACZ9zC,EAAU,GAAKA,GAGb8zC,GAAQ9zC,IACVhM,EAAG27H,WAAW37H,EAAG9Y,MAAQ8U,EACzBgE,EAAGu2H,YAAYnzC,EAAepnF,EAAOsc,OAK3Cr7B,KAAKy0F,MAAMtyE,KAAK,aAAc,SAAUgkF,EAAetuE,EAAO9Y,EAAOsc,EAAc4uE,GACjF,GAAI9D,IAAkBpjF,EAAG9Y,MAAQ4tB,GAAS9U,EAAGszD,MAAM0Z,OAAQ,CAUzD,GATAhtE,EAAGm7H,YAAa,EAEZn7H,EAAG9a,aACLgiG,EAAOngC,UAEPmgC,EAAOlgC,SAGLhnD,EAAGo7H,SAASl0C,EAAO1qB,UAAUx8D,EAAGo7H,UAC/B70I,EAAE87D,QAAQriD,EAAGq7H,UAChB,IAAK,GAAIW,KAAWh8H,GAAGq7H,SACrBn0C,EAAO+0C,WAAWj8H,EAAGq7H,SAASW,GAAUA,EAIxCh8H,GAAGk8H,YACLh1C,EAAO3Y,cAGJhoF,EAAE87D,QAAQriD,EAAGs7H,cAChB/0I,EAAEvJ,KAAKgjB,EAAGs7H,YAAa,SAAU7gI,GAC/BysF,EAAOzY,SAASh0E,EAAE,GAAIA,EAAE,GAAIA,EAAE,MAI7BlU,EAAE87D,QAAQriD,EAAGu7H,cACZr0C,EAAOxmC,eAAewmC,EAAOxmC,cAAc1gD,EAAGu7H,aAGhDv7H,EAAGy7H,gBACDv0C,EAAOxmC,eAAewmC,EAAOhW,iBAAiBlxE,EAAGy7H,gBAGnDz7H,EAAG47H,gCACL10C,EAAO/V,8BAA8BnxE,EAAG07H,iBAGtC17H,EAAG67H,0BACL30C,EAAO5V,0BAGJ/qF,EAAE87D,QAAQriD,EAAGw7H,gBAChBt0C,EAAOvZ,gBAAgB3tE,EAAGw7H,cAAcnhH,SAAUra,EAAGw7H,cAAchmC,SAGrEx1F,EAAG+7H,gBAAgB70C,GAEnBlnF,EAAGlB,KAAK,kBAAkB,MAI9B7hB,KAAKy0F,MAAMtyE,KAAK,gBAAiB,WAE3BY,EAAGm7H,aACLn7H,EAAGm7H,YAAa,EAChBn7H,EAAGlB,KAAK,kBAAkB,OAQhC4W,aAAc,SAAUwxE,GACtB,GAAIlnF,GAAK/iB,IACT,IAAIiqG,EAAQ,CACV,GAAI7iG,KAKJ,OAJA2b,GAAGkkH,eACHlkH,EAAGkkH,YAAY1zH,KAAK02F,EAAO1mG,IAC3B6D,EAAImM,KAAK1U,EAAE,SAAWorG,EAAO1mG,KAC7BvD,KAAKu0B,SAAWntB,EACTA,EAEP,MAAOpH,MAAKu0B,UAKhBkF,SAAU,WACR,GAAI1W,GAAK/iB,IACT,IAAI+iB,EAAGm7H,WACL,MAAOn7H,GAAGe,QAEZ,IAAIiT,GAAMhU,EAAG0xE,MAAMY,SAASlpF,YAAY4W,EAAGszD,MAAM0Z,OACjD,OAAOh5D,GAAIhU,EAAG9Y,OAIhBy/D,gBAAiB,WACf,GAAI3mD,GAAK/iB,IACT,IAAI+iB,EAAGm7H,WACL,MAAOn7H,GAAGe,QAEZ,IAAIiT,GAAMhU,EAAG0xE,MAAMY,SAASlpF,YAAY4W,EAAGszD,MAAM0Z,OACjD,OAAOh5D,GAAIhU,EAAGszD,MAAMu0D,YAItBvxG,SAAU,SAAUta,EAAOg7H,EAAkBvwE,GAC3C,GAAIzmD,GAAK/iB,IAEL+5I,IAA4C,MAAxBA,EAAiB,KAAYA,EAAmBA,EAAiB7rI,QAAQ,MACjGs7D,EAAyBA,KAA0B,CAEnD,IAAI01E,GAAen8H,EAAG0xE,MAAM3G,KAAKqxD,gBAAgBC,UAEjD,IAAIr8H,EAAGm7H,WACL,MAAOn7H,GAAGe,OAAO/E,EAAOg7H,EAAkBvwE,EACjB,eAAhBzmD,EAAG7P,WAAuC,OAAV6L,IAAmB,GAAKA,GAAO3T,QAAQ,QAAS,IAGvF2T,EADEgE,EAAG8rH,aACGjgI,eAAe,GAAI6F,MAAKsK,IAExB1Q,WAAW,GAAIoG,MAAKsK,IAIhC,IAAIgY,GAAMhU,EAAG0xE,MAAMY,SAASlpF,YAAY4W,EAAGszD,MAAM0Z,OAqBjD,OApBAh5D,GAAIhU,EAAG9Y,MAAQ8U,EAIVzV,EAAE2kF,YAAY8rD,GAOjBhjH,EAAIhU,EAAGszD,MAAMu0D,WAAa7rH,GANN,iBAAhBgE,EAAG7P,WAAuD,UAAvBxE,oBAAmCpF,EAAEw0I,OAAO/D,KACjFA,GAAoB,GAAKA,GAAkB7rI,QAAQ,IAAK,MAG1D6oB,EAAIhU,EAAGszD,MAAMu0D,WAAamP,GAK5Bh3H,EAAG0xE,MAAMY,SAASgqD,WAAWt8H,EAAGszD,MAAM0Z,OAAQh5D,GAC1CyyC,GACFzmD,EAAGu2H,YAAYv2H,EAAG2W,SAAU3a,EAAOg7H,GAGjCmF,GAAcn8H,EAAG0xE,MAAM3G,KAAKuc,iBACzBrqG,MAWT8pE,QAAS,WACP,GAAI/mD,GAAK/iB,IAKT,OAJI+iB,GAAGm7H,YACLn7H,EAAGe,SAELf,EAAG60D,aAAc,EACV53E,MAWT+pE,OAAQ,WACN,GAAIhnD,GAAK/iB,IAKT,OAJI+iB,GAAGm7H,YACLn7H,EAAGe,SAELf,EAAG60D,aAAc,EACV53E,MAWTM,KAAM,WACJiiB,IAAIoQ,QAAQ,YAAa,4EACzB,IAAI5P,GAAK/iB,IACT+iB,GAAGwlH,YAAa,CAChB,IAAI+W,MACAC,EAAUx8H,EAAG0xE,MAAMY,SAASyX,WAAW/pF,EAAGszD,MAAM0Z,OAKpD,OAJAuvD,GAAUC,MACVD,EAAUC,GAASx8H,EAAG9Y,MAAQ,cAE9B8Y,EAAG0xE,MAAM3G,KAAK0xD,iBAAiBD,EAAUx8H,EAAG9Y,KAAMq1I,GAC3Cv8H,GAYT9gB,KAAM,WACJsgB,IAAIoQ,QAAQ,YAAa,4EACzB,IAAI5P,GAAK/iB,IACT+iB,GAAGwlH,YAAa,CAChB,IAAI+W,MACAC,EAAUx8H,EAAG0xE,MAAMY,SAASyX,WAAW/pF,EAAGszD,MAAM0Z,OAIpD,OAHAuvD,GAAUC,MACVD,EAAUC,GAASx8H,EAAG9Y,MAAQ,GAC9B8Y,EAAG0xE,MAAM3G,KAAK0xD,iBAAiBD,EAAUx8H,EAAG9Y,KAAMq1I,GAC3Cv8H,GAWT2lD,UAAW,WAET,MADAnmD,KAAIoQ,QAAQ,YAAa,6EAClB3yB,KAAKuoI,YAWdtgI,WAAY,WAGV,MAAOjI,MAAK43E,aAed8Y,gBAAiB,SAAUtzD,EAAUuzD,GACnC,GAAI5tE,GAAK/iB,IAST,OARA+iB,GAAGw7H,eACDnhH,SAAUA,EACVm7E,QAAS5nB,GAGP5tE,EAAGm7H,YACLn7H,EAAGe,OAAOsZ,EAAUuzD,GAEf5tE,GAaTyjD,UAAW,SAAU+zE,EAAWC,GAC9B,GAAIz3H,GAAK/iB,IAET,OADA+iB,GAAG0xE,MAAMY,SAASoqD,cAAc18H,EAAGszD,MAAM0Z,OAAQhtE,EAAG9Y,KAAMuwI,EAAWD,GAC9Dx3H,GAKX4I,GAAOpmB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y,WAAW2/D,SAASi5D,cAAgBA,GAC/D35I;ACpYH,cAWA,SAAWqnB,GAET,GAAIq6G,GAAgBr6G,EAAOq6G,cAAcvkI,QAAQkqB,EAAOq5D,SAASi5D,gBAC/D/qI,UAAW,uBAGbyY,GAAOq5D,SAASghD,cAAgBA,GAC/B1hI,OAAOiB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y;AClB/B,cAUA,SAAWsG,GAET,GAAIooE,GAAYpoE,EAAOooE,UAAUtyF,QAAQkqB,EAAOq5D,SAASi5D,gBACvD/qI,UAAW,kBAUXqsE,UAAW,SAAU5kD,EAAQq5D,GAC3B,GAAIjxE,GAAK/iB,IAQT,OAPA+iB,GAAGo7H,QAAUxjH,EAET5X,EAAGm7H,YACLn7H,EAAGe,OAAO6W,EAAQq5D,GAGhBA,IAAajxE,EAAGq7H,SAASpqD,GAAer5D,GACrC36B,MAWTo6B,cAAe,WACb,GAAIrX,GAAK/iB,IACT,OAAI+iB,GAAGm7H,WACEn7H,EAAGe,SAEL9jB,KAAKs+I,aAad76E,cAAe,SAAUC,GACvB,GAAI3gD,GAAK/iB,IAKT,OAJA+iB,GAAGu7H,YAAc56E,EACb3gD,EAAGm7H,YACLn7H,EAAGe,OAAO4/C,GAEL3gD,GAaT+gD,cAAe,SAAUJ,GACvB,GAAI3gD,GAAK/iB,IAKT,OAJAnB,GAAE4C,OAAOshB,EAAGu7H,YAAa56E,GACrB3gD,EAAGm7H,YACLn7H,EAAGe,OAAO4/C,GAEL3gD,GAYTkxE,iBAAkB,SAAU16C,GAC1B,GAAIx2B,GAAK/iB,IAKT,OAJA+iB,GAAGy7H,eAAiBjlG,EAChBx2B,EAAGm7H,YACLn7H,EAAGe,OAAOy1B,GAELx2B,GAYTmxE,8BAA+B,SAAUC,GACvC,GAAIpxE,GAAK/iB,IAMT,OALA+iB,GAAG47H,gCAAiC,EACpC57H,EAAG07H,gBAAkBtqD,EACjBpxE,EAAGm7H,YACLn7H,EAAGe,OAAOqwE,GAELpxE,GAYTqxE,iCAAkC,WAChC7xE,IAAIoQ,QAAQ,YAAa,mEACzB,IAAI5P,GAAK/iB,IAMT,OALA+iB,GAAG47H,gCAAiC,EACpC57H,EAAG07H,gBAAkB,KACjB17H,EAAGm7H,YACLn7H,EAAGe,SAEEf,GAcT86C,UAAW,SAAUN,EAAWK,GAE9B,MADAr4D,IAAGqL,MAAM,6BACF5Q,MAaTsgE,UAAW,WACT/6D,GAAGqL,MAAM,8BAeX0rI,UAAW,SAAU/+E,EAAWK,GAE9B,MADAr4D,IAAGqL,MAAM,6BACF5Q,MAWTq0F,wBAAyB,WACvB,GAAItxE,GAAK/iB,IAKT,OAJA+iB,GAAG67H,0BAA2B,EAC1B77H,EAAGm7H,YACLn7H,EAAGe,SAEEf,IAIX4I,GAAOq5D,SAAS+O,UAAYA,GAC3BzvF,OAAOiB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y;ACpN/B,cAUA,SAAWsG,GAET,GAAIsE,GAAWtE,EAAOsE,SAASxuB,QAAQkqB,EAAOq5D,SAASi5D,gBACrD/qI,UAAW,kBAIbyY,GAAOq5D,SAAS/0D,SAAWA,GAC1B3rB,OAAOiB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y;AClB/B,cAUA,SAAWsG,GAET,GAAI+nC,GAAO/nC,EAAO+nC,KAAKjyD,QAAQkqB,EAAOq5D,SAASi5D,gBAC7C/qI,UAAW,cAGbyY,GAAOq5D,SAAStxB,KAAOA,GACtBpvD,OAAOiB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y;ACjB/B,cAWA,SAAWsG,GAET,GAAIlX,GAAOkX,EAAOlX,KAAKhT,QAAQkqB,EAAOq5D,SAASi5D,gBAC7C/qI,UAAW,aASX27H,WAAY,WACV,GAAI9rH,GAAK/iB,IACT,IAAI+iB,EAAGm7H,WACL,MAAOn7H,GAAGe,QAEZ,IAAI81F,GAAO72F,EAAG0xE,MAAM4B,SAChBqpD,EAASp2I,EAAEswG,GAAMntB,WAAYlpF,GAAMwf,EAAG9Y,MAC1C,SAAIy1I,GACyB,aAApBA,EAAO3yD,WAQpBphE,GAAOq5D,SAASvwE,KAAOA,GACtBnQ,OAAOiB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y;ACxC/B,cAWA,SAAWsG,GAET,GAAIylE,GAAOzlE,EAAOylE,KAAK3vF,QAAQkqB,EAAOq5D,SAASi5D,gBAC7C/qI,UAAW,aAWXo+E,YAAa,SAAS/3C,GACpB,GAAIx2B,GAAK/iB,IAOT,OANA+iB,GAAGk8H,YAAa,EAChBl8H,EAAGs7H,eAECt7H,EAAGm7H,YACLn7H,EAAGe,OAAOy1B,GAELx2B,GAGTyuE,SAAU,SAAUzyE,EAAOsc,EAAcsiH,GACvC,GAAI56H,GAAK/iB,IAMT,OALA+iB,GAAGs7H,YAAY9qI,MAAMwL,EAAOsc,EAAcsiH,IAEtC56H,EAAGm7H,YACLn7H,EAAGe,OAAO/E,EAAOsc,EAAcsiH,GAE1B56H,IAKX4I,GAAOq5D,SAASoM,KAAOA,GACtB9sF,OAAOiB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y;ACjD/B,cAWA,SAAWsG,GAET,GAAIk6G,GAAUl6G,EAAOk6G,QAAQpkI,QAAQkqB,EAAOq5D,SAASi5D,gBACnD/qI,UAAW,iBAGbyY,GAAOq5D,SAAS6gD,QAAUA,GACzBvhI,OAAOiB,GAAGygB,IAAI8N,SAASpnB,KAAK2Y;AClB/B,cAWA,SAAWsG,GAET,GAAIwI,GAASzS,WAAWjgB,QACtBk+I,UAAW,KACXC,SAAU,KACVpsE,SAAU,KAEVjzE,KAAM,SAAU0/G,EAAcn7F,GAC5B9kB,KAAK8jB,OAAOm8F,GACRn7F,IAAY9kB,KAAKwzE,SAAW1uD,EAAWiK,SAE3C/uB,KAAK0jH,SAAW7kH,EAAEohH,GAClBjgH,KAAKiK,KAAOjK,KAAK0jH,SAAS/jH,KAAK,uBAC/BK,KAAK43B,UAAY53B,KAAK0jH,SAAS3+G,KAAK,MACpC/E,KAAK4/I,SAAW/gJ,EAAE,qBAAqB87B,OAAO,+BAAiC36B,KAAKiK,KAAO,MAG7FiJ,UAAW,SASX2sI,SAAU,SAASjoH,GAEjB,MADA53B,MAAK2/I,UAAY/nH,EACV53B,MASThB,OAAQ,WACN,GAAI44B,GAAY53B,KAAK2/I,WAAa3/I,KAAK43B,SAEvC,OADA53B,MAAKwzE,SAAS9mE,KAAK6nB,SAASZ,OAAOiE,GAAW0yE,SACvCtqG,MAST8wI,WAAY,WACV,GAAIl5G,GAAY53B,KAAK2/I,WAAa3/I,KAAK43B,SACvC,OAAO53B,MAAKwzE,SAAS9mE,KAAK6nB,SAASZ,OAAOiE,GAAWg0G,WAWvD7wG,SAAU,SAAU+kH,GAClB,GAAIloH,GAAYkoH,GAAiB9/I,KAAK2/I,WAAa3/I,KAAK43B,SACxD,OAAO53B,MAAKwzE,SAAS9mE,KAAK6nB,SAASZ,OAAOiE,IAU5CgzE,UAAW,WACT,GAAI7nF,GAAK/iB,KACL2zB,EAAS,GAAIpuB,IAAGmvB,UAQpB,OANA71B,GAAEmB,KAAK4/I,UAAU7/I,KAAK,SAAU2B,GAC9B,GAAIuI,GAAOpL,EAAEmB,MAAM+E,KAAK,MACpBqxB,EAAQrT,EAAGywD,SAAS9mE,KAAK6nB,SAASZ,OAAO1pB,EACxB,oBAAVmsB,IACTzC,EAAOigD,WAAW3pE,EAAMmsB,KAErBzC,IAIXhI,GAAOwI,OAASA,GACf7vB,OAAOumB,UAAUiC,WAAWgH,SAASd;ACpGxC,cAEA,SAAWrH,GAKT,GAAIi7D,IACFm5D,KAAM,oCACNC,eAAgB,gDAOdC,GACFC,QAAS,UACTC,eAAgB,sBAChBC,uBAAwB,uBACxBC,kBAAmB,mBAajBp7B,EAAsBvjG,WAAWjgB,QACnCgkH,cAAe,KAEf66B,iBAAkB,KAClBC,IAAK,KACLC,UAAW,KACXC,YAAa,KACbC,WAAY,KACZC,mBAAoB,KACpBz+C,MAAO,KAEP3hG,KAAM,SAAUqgJ,EAAiB17B,EAAmBE,EAAqBy7B,EAAkB9xH,GACzF,GAAIhM,GAAK/iB,IACT+iB,GAAGe,OAAO88H,GACV79H,EAAGywD,SAAWzkD,EAEdhM,EAAGmiG,kBAAoBA,EACvBniG,EAAGqiG,oBAAsBA,EAEzBriG,EAAG89H,iBAAmBA,CACtB,IAAI7zH,MACAjJ,EAAOxe,GAAGynB,UAAUjJ,IAExBllB,GAAEiwB,KACA/K,EAAK6iE,EAAUm5D,MACfh8H,EAAK6iE,EAAUo5D,iBACfzuI,KAAK,SAAU26F,EAAM40C,GACrB9zH,EAAU+zH,WAAa70C,EACvBl/E,EAAUg0H,kBAAoBF,EAE9B/9H,EAAG0iG,iBACH1iG,EAAG29H,WAAa1zH,EAChBjK,EAAGw9H,IAAMh7I,GAAGygB,IAAIi/D,UAChBliE,EAAGu9H,iBAAmBM,EAEtB79H,EAAGy9H,UAAY3hJ,EAAEkkB,EAAGu9H,kBAEpBv9H,EAAGk+H,gBACHl+H,EAAGm+H,2BACH56I,WAAW,WACTyc,EAAGlB,KAAKojG,EAAoBnjG,MAAMyjG,SAAUxiG,IAC3C,OAWPm+H,yBAA0B,WACxB,GAAIn+H,GAAK/iB,KACLmhJ,GAA8B,CAuHlC,OArHAp+H,GAAGy9H,UAAUzgJ,KAAK,WAChB,GAAIomH,GAAStnH,EAAEmB,MAEXwpG,EAAU2c,EAAOphH,KAAK,MACtB+rF,EAAU/tE,EAAGq+H,mBACbpxD,GAAiBm2B,EAAOxmH,KAAKsgJ,EAAUE,gBACvCkB,EAAkBl7B,EAAOxmH,KAAKsgJ,EAAUI,mBAExCiB,EAAyBn7B,EAAOxmH,KAAKsgJ,EAAUG,wBAC/ClsG,EAAe,GAAInxB,GAAGmiG,kBAAkBrmH,EAAE4C,UAAWshB,EAAGqiG,qBAC1Da,oBAAqBj2B,EACrB0c,QAASlD,IACPzmF,EAAGywD,SAEPsd,GAAUA,EAAQ9wE,OAAOmmG,EAAOxmH,KAAKsgJ,EAAUC,SAC/C,IAAIqB,MACA14F,EAAM,CACVhqC,QAAOsoF,KAAKrW,GAASznD,KAAK,SAAUxsB,EAAGY,GACrC,MAAOqzE,GAAQj0E,GAAGwzF,MAAQvf,EAAQrzE,GAAG4yF,QACpC78F,QAAQ,SAAU8lD,GACnBioF,EAAc14F,KAASioC,EAAQx3B,IAGjC,IAqBIw0B,GArBA0zD,EAAkB,SAAUC,EAAWC,EAAY3iI,EAAO4iI,EAAWC,GACvE,GAAIznH,GAAU,EACVwnH,GAAU/5I,MAAQsP,eAAef,WAAawrI,EAAU5nH,YAC1DI,EAAUwnH,EAAU5nH,UAAUwf,cAEhC,IAAIrf,GAAW0nH,EAAYr+I,EAC3B,QAAQo+I,EAAUp+I,IAChB,IAAK,eACH,MAAOwf,GAAG8+H,mBAAmBh+I,QAASy1D,MAAOkwC,EAAStvE,SAAUA,GAClE,SACE,GAAI4nH,GAAUF,EAAYD,EAAUp+I,GACpC,OAAOwf,GAAG09H,YAAY58I,QACpBk+I,WAAaD,GAAuB,MAAZA,KAAqB3nH,EAC7C52B,GAAIu+I,EACJ/iI,MAAOA,EACPob,QAASA,EACT6nH,oBAAqBr7I,EAAE,iBAO3BknG,EAAuB,SAAU4zC,EAAW9hJ,GAC9C,GAAIo3B,GAAMp3B,EAAKq8C,QAAQylG,EACvB,IAAI1qH,GAAOA,EAAI4qE,gBAAiB,EAC9B,OACEsgD,WAAY,OACZC,YACE3+I,GAAMwzB,EAAIxzB,GACV66B,KAAQ,MACRgX,SAAY7vC,GAAGmE,GAAG0jE,mBAClB+0E,aAAcprH,EAAIxzB,GAClB6+I,YAAe,SAAU/+I,GACvByqF,EAAKuU,gBAAgBriG,KAAMqD,IAE7BJ,MAAS,SAAUI,GACbA,EAAM8C,QAAUtH,EAAEwE,EAAM8C,QAAQ4+B,GAAG,gBACrC+oD,EAAKuU,gBAAgBriG,KAAMqD,MASvCyqF,GAAO,GAAI/qE,GAAGw9H,IAAI3rD,KAAKuxB,EAAQjyE,EAAcqtG,GAC3ClvH,QAAStP,EAAGs/H,qBAAqB74C,GACjCqE,qBAAsBA,EACtBC,aAAc0zC,EACdxV,yBAA0BsV,EAC1B50C,QAASlD,EACTxZ,cAAeA,EACfjhE,QAAShM,EAAGywD,WAGdsa,EAAKuV,sBAAsBg+C,GAGvBt+H,EAAG89H,kBACL16B,EAAOjiH,KAAK,mBAAmBpD,GAAG,cAAe,SAAU3B,GACzD2uF,EAAKuU,gBAAgBriG,KAAMb,KAI/B4jB,EAAG0iG,cAAcjc,GAAW1b,EAE5B/qE,EAAGywD,SAASrnD,KAAK5a,KAAK,WACpB,IAAK4vI,EAA6B,CAChCA,GAA8B,CAC9B,IAAI10I,GAAUsW,EAAGywD,SAAS/mE,OAK1BA,GAAQ0V,KAAK1V,EAAe,MAAEqV,MAAM00B,kBAAmB,WACrD,GAAIunF,GAAiBtxH,EAAQ0mB,KAAKpE,QAAQ9kB,IAC1CX,GAAEA,EAAEyZ,EAAGywD,SAAS9mE,KAAK6nB,SAASZ,QAAQgH,OAAO,SAAUvE,GACrD,MAAOA,GAAMy0E,aAAez0E,EAAM8zG,gBAAkBnM,KAClDh+H,KAAK,SAAUq2B,GACjB,GAAIpD,GAAUjQ,EAAGywD,SAASxgD,QAAQoD,EAAMitD,UACxCtgE,GAAGywD,SAAS9mE,KAAKm3B,KAAK,WACpBv6B,EAAE0pB,EAAQ43E,YAAY3zE,WAAWl3B,KAAK,SAAUq2B,GAC9CA,EAAM+gE,aACN/gE,EAAMqwG,YAAa,MAEpB,YAON1jH,GAST2iG,YAAa,WACX,GAAI3iG,GAAK/iB,KACLsiJ,EAAgBzjJ,EAAE0nB,UAGtB,IAAI1nB,EAAEm1C,cAAcjxB,EAAG0iG,eAErB,MADA68B,GAAcx6H,UACPw6H,CAGT,IAAI7uH,KACJ,KAAK,GAAIw2G,KAAclnH,GAAG0iG,cAAe,CACvC,GAAIr5F,GAAQvtB,EAAE0nB,UACdkN,GAAOlgB,KAAK6Y,GACZ,SAAWA,GACTrJ,EAAG0iG,cAAcwkB,GAAY9nH,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+zE,kBAAmB,SAAUl2F,GAClFysB,EAAMtE,aAEPsE,GAML,MAHAvtB,GAAEiwB,KAAK/O,MAAMlhB,EAAG40B,GAAQliB,KAAK,WAC3B+wI,EAAcx6H,YAETw6H,GAGTlB,iBAAkB,WAChB,GAAItwD,KAaJ,OAZIvrF,IAAGC,IAAIid,WACTquE,EAAQv9E,MACNugD,QAAS,SACTo8C,MAAO,eACPr3D,KAAM,eACNs3D,WAAW,EACXvoG,KAAMsP,eAAeC,MACrBi5F,MAAO,GACPC,MAAO,IAIJvf,GAUTmwD,cAAe,WACb,GAAIl+H,GAAK/iB,IACT+iB,GAAG09H,YAAc19H,EAAG29H,WAAWK,WAC/Bh+H,EAAG8+H,mBAAqB9+H,EAAG29H,WAAWM,mBASxCqB,qBAAsB,SAAU74C,GAC9B,GAAIzmF,GAAK/iB,KACLqyB,GACF,GAAItP,GAAGw9H,IAAIp7D,YAAYomB,WACvB,GAAIxoF,GAAGw9H,IAAIp7D,YAAYqP,cACvB,GAAIzxE,GAAGw9H,IAAIp7D,YAAY8d,oBAMrBs/C,wBAA0B,IAG9B,IAAIx/H,EAAG89H,iBAAkB,CACvB,GAAIlgJ,GAAO,GAAIoiB,GAAG89H,iBAAiBr3C,EACnCn3E,GAAQ9e,KAAK,GAAIwP,GAAGw9H,IAAIp7D,YAAY2c,kBAAkBnhG,EAAMoiB,EAAGywD,WAEjE,MAAOnhD,MAIPvQ,OACEyjG,SAAU,aAKhB55F,GAAOs5F,oBAAsBA,GAC5B3gH,OAAOumB,UAAUiC,WAAWgH,SAASd;ACnTxC,cAcA,SAAWrH,GACT,GAAIof,GAAQrpB,WAAWjgB,QAErBlB,KAAM,SAAUk2G,GACdz2G,KAAK8jB,OAAO2yF,GAER53G,EAAEuzB,cAAcqkF,IAClB53G,EAAE4C,OAAOzB,KAAMy2G,GAGjB53G,EAAEw8F,MAAMmnD,OAAOC,MAAQziJ,KAAKyiJ,OAG9BvvI,UAAW,QACXuvI,MAAO,QACPl/I,GAAI,KAWJm/I,YAAa,SAAUzxI,EAAK0xI,EAAYC,GAEtC,MADA5iJ,MAAKiC,KAAKgP,EAAK,OAAQ0xI,EAAYC,GAC5B5iJ,MAaTirC,YAAa,SAAUh6B,EAAK0xI,EAAYC,GAGtC,MADA5iJ,MAAKiC,KAAKgP,EAAK,UAAW0xI,EAAYC,GAC/B5iJ,MAaTqjC,YAAa,SAAUpyB,EAAK0xI,EAAYC,GAEtC,MADA5iJ,MAAKiC,KAAKgP,EAAK,UAAW0xI,EAAYC,GAC/B5iJ,MAaT8uC,UAAW,SAAU79B,EAAK0xI,EAAYC,GAEpC,MADA5iJ,MAAKiC,KAAKgP,EAAK,QAAS0xI,EAAYC,GAC7B5iJ,MAcTiC,KAAM,SAAUgP,EAAKrJ,EAAM+6I,EAAYC,GACrC,GAAIh7I,GAAOA,GAAQ,UACfi7I,EAASF,GAAc,QACvBG,EAAWF,GAAgB,GAE/B,OADA5iJ,MAAKuD,GAAK1E,EAAEw8F,MAAMpqF,GAAO4xI,OAAQA,EAAQj7I,KAAMA,EAAMk7I,SAAUA,IACxD9iJ,MAWTM,KAAM,WAGJ,MAFIN,MAAKuD,GAAI1E,EAAE,IAAImB,KAAKuD,IAAImtC,SACvB/kB,EAAOof,MAAMjpC,UACX9B,OAIX2rB,GAAOof,MAAQA,EASfpf,EAAOof,MAAMjpC,QAAU,WACrBjD,EAAE,sBAAsB6xC,WAGzBpsC,OAAOumB,UAAUiC,WAAWmC;AC1I/B,cAEA,SAAWtD,GAET,GAAIywG,GAAc,kCACd2mB,EAAuB,iBAQvBhuH,EAAelK,UAAUiC,WAAWgH,SAAS6+F,gBAAgBlxH,QAC/D+nG,QAAS,GAGTjpG,KAAM,SAAU0/G,EAAcqc,GAC5B,GAAIv5G,GAAK/iB,IACT+iB,GAAG2gG,SAAW7kH,EAAEohH,GAChBl9F,EAAGe,OAAOf,EAAG2gG,UAEb3gG,EAAGgzB,SAAWroC,OAAOqV,EAAG8vG,wBAAyBuJ,EAAar5G,EAAG9Y,MACjE8Y,EAAGymF,QAAUzmF,EAAG2gG,SAAS/jH,KAAK,QAE9BojB,EAAGigI,cAAgBjgI,EAAG2gG,SAASx/G,KAAK6+I,IAoBtC9/I,MAAO,SAAUowH,GAQf,MANIx0H,GAAE8jB,WAAW0wG,IACfrzH,KAAKszH,qBAAqBtzH,KAAKgjJ,eAC/BhjJ,KAAKwiB,OAAO,SAASL,KAAK,QAASkxG,IAEnCrzH,KAAKgjJ,cAAc//I,QAEdjD,OAOX2rB,GAAOmB,WAAWgH,SAASrnB,QAAQsoB,aAAeA,GAEjDzwB,OAAOumB;AC7DV,cAEA,SAAWc,GAET,GAAIs3H,GAA2B,+BAC3BC,EAAsB,sBACtBC,EAAqB,uBAOrBhuH,EAAUzT,WAAWjgB,QAEvBlB,KAAM,SAAUZ,GACd,GAAIojB,GAAK/iB,IACT+iB,GAAGe,OAAOnkB,GACVojB,EAAGqgI,mBAGLA,gBAAiB,WAEf,GAAIC,GAA4BxkJ,EAAEokJ,GAC9BK,EAAsBzkJ,EAAEskJ,EAE5BE,GAA0BviJ,GAAG,QAAS,WACpC,GAAIyiJ,GAAW1kJ,EAAEmB,MAAM0mE,SAASw8E,EAChCK,GAASthJ,QAGX,IAAI+D,GACAu9I,EAAWF,EAA0B38E,SAASw8E,EAG9CI,GAAoBx1I,OAAS,GAAKy1I,EAAStiJ,QAAUpC,EAAEqG,UAAUjE,QAAUqiJ,EAAoBnjJ,SAASiD,MAC1GmgJ,EAAS7jJ,SAAS,kCAGpB4jJ,EACGziJ,IAAI,cAAcA,IAAI,cACtBC,GAAG,aAAc,WAAkBkF,GAAUC,aAAaD,KAC1DlF,GAAG,aAAc,WAChBkF,EAAWM,WACL,WACGi9I,EAASjjJ,QACT,SAKjBqrB,GAAOmB,WAAWgH,SAAStnB,QAAQ2oB,QAAUA,GAE5C7wB,OAAOiB;ACtDV,cAUA,SAAWomB,GACT,GAAI63H,GAAe9hI,WAAWjgB,QAE5BgiJ,UAQAljJ,KAAM,SAAUmkC,GACd1kC,KAAKyjJ,OAAS/+G,GAUhBouF,SAAU,WACR,MAAO9yH,MAAKyjJ,OAAOl8B,QAUrBpoC,UAAW,WACT,OAAQn/E,KAAKyjJ,OAAOz7I,UAatB/F,KAAM,WAGJ,MAFAjC,MAAKyjJ,OAAOl8B,QAAS,EACrBvnH,KAAK0jJ,uBACE1jJ,MAUTM,KAAM,WAGJ,MAFAN,MAAKyjJ,OAAOl8B,QAAS,EACrBvnH,KAAK0jJ,uBACE1jJ,MAWT8pE,QAAS,WAGP,MAFA9pE,MAAKyjJ,OAAOz7I,UAAW,EACvBhI,KAAK0jJ,uBACE1jJ,MAUT+pE,OAAQ,WAGN,MAFA/pE,MAAKyjJ,OAAOz7I,UAAW,EACvBhI,KAAK0jJ,uBACE1jJ,MAWTkkH,SAAU,SAAUz8G,GAGlB,MAFAzH,MAAKyjJ,OAAOh8I,KAAOA,EACnBzH,KAAK0jJ,uBACE1jJ,MAUTikH,SAAU,WACR,MAAOjkH,MAAKyjJ,OAAOh8I,MAarB08G,WAAY,SAAU18G,GAGpB,MAFAzH,MAAKyjJ,OAAOlrC,QAAU9wG,EACtBzH,KAAK0jJ,uBACE1jJ,MAWT+yH,WAAY,WACV,MAAO/yH,MAAKyjJ,OAAOlrC,SAmBrBya,QAAS,SAAU5hG,GAGjB,MAFApxB,MAAKyjJ,OAAOr7I,KAAOgpB,EACnBpxB,KAAK0jJ,uBACE1jJ,MAUTozH,QAAS,WACP,MAAOpzH,MAAKyjJ,OAAOr7I,MAWrBnF,MAAO,SAASm6B,GAQd,MANIA,KACFp9B,KAAKyjJ,OAAOz8I,SAAWo2B,EACvBp9B,KAAK0jJ,wBAIA1jJ,MAQT0jJ,qBAAsB,WACpB1jJ,KAAK6hB,KAAK7hB,KAAY,MAAE8hB,MAAM43D,iBAO9B53D,OAIE43D,aAAc,gBAIpB/tD,GAAO63H,aAAeA,GAErBl/I,OAAOumB,UAAUiC;ACvOpB,cAWA,SAAWnB,GACT,GAAIg4H,GAAcjiI,WAAWjgB,QAE3BgiJ,UACAvwH,WAQA3yB,KAAM,SAAUmkC,GACd,GAAI3hB,GAAK/iB,IACT+iB,GAAG0gI,OAAS/+G,EACZA,EAAMlxB,QAAQ,SAASowI,GACrB7gI,EAAG8gI,YAAYD,MAWnBC,YAAa,SAAUD,GACrB,GAAI7gI,GAAK/iB,KACL4M,EAAS,GAAI+e,GAAO63H,aAAaI,EAKrC,OAJA7gI,GAAGmQ,QAAQ0wH,EAAargJ,IAAMqJ,EAC9BA,EAAOuV,KAAKvV,EAAc,MAAEkV,MAAM43D,aAAc,WAC9C32D,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM43D,gBAErB9sE,GAsBTwyG,aAAc,SAAU0kC,EAAal2I,GACnC,GAAImV,GAAK/iB,IACJ8jJ,IAAsC,gBAAhBA,IAA0Bj5H,UAAUja,MAAM,4CAErE,KAAK,GAAIrJ,GAAI,EAAGmK,EAAMqR,EAAG0gI,OAAO31I,OAAQvG,EAAImK,EAAKnK,IAC3Cwb,EAAG0gI,OAAOl8I,GAAGhE,IAAMugJ,GAAaj5H,UAAUja,MAAM,8CAA+CkzI,EAOrG,OALsB,gBAAXl2I,KAAqBA,MAEhCA,EAAOrK,GAAKugJ,EACZ/gI,EAAG0gI,OAAOlwI,KAAK3F,GACfmV,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM43D,cACnB32D,EAAG8gI,YAAYj2I,IAWxBm2I,aAAc,SAAUD,GAEtB,IAAK,GADD/gI,GAAK/iB,KACAuH,EAAI,EAAGmK,EAAMqR,EAAG0gI,OAAO31I,OAAQvG,EAAImK,EAAKnK,IAC/C,GAAIwb,EAAG0gI,OAAOl8I,GAAGhE,IAAMugJ,EAAa,OAC3B/gI,GAAGmQ,QAAQnQ,EAAG0gI,OAAOl8I,GAAGhE,IAC/Bwf,EAAG0gI,OAAOtuI,OAAO5N,EAAG,GACpBwb,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM43D,aAC1B,OAGJ,MAAO32D,MAQTjB,OAME43D,aAAc,gBAIlB/tD,GAAOg4H,YAAcA,GAEpBr/I,OAAOumB,UAAUiC;ACxHpB,cAWA,SAAWnB,GACT,GAAIq4H,GAAStiI,WAAWjgB,QAEtB++H,aAAc,GACdijB,UAUAljJ,KAAM,SAAUogI,EAAaj8F,EAAOu/G,GAClC,GAAIlhI,GAAK/iB,IACT+iB,GAAGy9G,aAAeG,EAClB59G,EAAG0gI,OAAS/+G,EACZu/G,EAAazwI,QAAQ,SAASsiC,GAC5BA,EAAO3zB,KAAK2zB,EAAc,MAAEh0B,MAAM43D,aAAc,WAC9C32D,EAAG6kE,eASTA,QAAS,WACP,GAAI7kE,GAAK/iB,IACTkjI,UAASr/H,OACPs/H,MAAMv2G,cAAcs3H,eAAgBnhI,EAAG0gI,QACvCv+I,SAASq+H,eAAexgH,EAAGy9G,iBAMjC70G,GAAOq4H,OAASA,GAEf1/I,OAAOumB,UAAUiC;CClDpB,SAAqBnB,GAcnB,GAAIw4H,GAAUziI,WAAWjgB,QAAQkqB,EAAOuB,OAAOqG,YAiB7Cic,KAAM,KACNlb,WAAY,iBACZL,kBAAmB,cACnB/gB,UAAW,UAEXuiB,iBAAkB,KAClB1B,eAAgB,KAChBc,0BAA2B,eAE3Bt0B,KAAM,SAAUo1B,GACd,GAAI5S,GAAK/iB,IAET+iB,GAAG2Q,WACH3Q,EAAGe,SACHf,EAAGgR,eAAiBl1B,EAAE0nB,WAEtB1nB,EAAE,YAAYqtB,MAAMnJ,EAAGgR,eAAejM,SAEtC/E,EAAG0S,iBAAmBlwB,GAAGopB,iBAEzB9vB,EAAEiwB,KAAKnD,EAAOkD,eAAetd,KAAK,SAAUi+B,GAC1CzsB,EAAGysB,QACHzsB,EAAGysB,KAAKnrB,GAAKmrB,EAAKnrB,GAClBtB,EAAGysB,KAAK9V,SAAW8V,EAAK40G,SACxBrhI,EAAGysB,KAAK60G,MAAQ70G,EAAKquC,MACrB96D,EAAGysB,KAAKvlC,KAAOulC,EAAKqJ,KACpB91B,EAAGysB,KAAK80G,aAAe90G,EAAK+0G,aAC5BxhI,EAAGysB,KAAKg1G,mBAAqBh1G,EAAKi1G,mBAClC94H,EAAOiD,aAAa9G,YAGtB/E,EAAG6Q,YAEH/0B,EAAEiwB,KAAK/L,EAAG0Q,OAAOT,SAASrK,KAAK,WAC7BpjB,GAAGkpB,YAAY3G,YAGjBjpB,EAAEiwB,KAAK/L,EAAG0Q,OAAOE,OAAQ5Q,EAAG0Q,OAAOR,MAAOlQ,EAAG0Q,OAAOP,QAASnQ,EAAG0Q,OAAO/mB,MAAMic,KAAK,WAChFpjB,GAAGiqB,SAAS1H,UACZviB,GAAGipB,iBAAiB1G,YAGtBjpB,EAAEiwB,KAAK/L,EAAG0Q,OAAOJ,eAAgBtQ,EAAG0Q,OAAOH,eAAe3K,KAAK,WAC7DpjB,GAAGgpB,YAAYzG,YAGjBjpB,EAAEiwB,KAAK/L,EAAG0Q,OAAON,MAAMxK,KAAK,WAC1BpjB,GAAG8oB,YAAYvG,YAGjBjpB,EAAEiwB,KAAK/L,EAAG0Q,OAAOD,YAAY7K,KAAK,WAChCpjB,GAAGmpB,eAAe5G,YAGpB/E,EAAGq3B,WAAa,GAAIzuB,GAAOmB,WAAWgH,SAASsmB,WAAWmmF,WAAWh7H,GAAG+pB,iBAK1EkF,gBAAiB,WACf,GAAIzR,GAAK/iB,KACL6zB,EAAKlI,EAAO3F,IAAI8N,SAChB4wH,EAA+B,qBAArBn/I,GAAGuE,aACb46I,GACF3hI,EAAGyQ,WAAa,GAAIK,GAAGL,WAAW+jH,aAAax0H,EAAGkR,mBAElDlR,EAAGyQ,WAAa,GAAIK,GAAGL,WAAW2hH,WAAWpyH,EAAGkR,oBAKpD8B,eAAgB,WACd,GAAI5R,GAAO,GAAI5e,IAAG6e,IAClB,OAAID,GAAKvc,KACA/I,EAAEwkB,OAAOc,EAAKsC,eAEd,IAKXwP,eAAgB,WACd,MAAO1wB,IAAGmE,GAAG4gI,oBAGfj2G,aAAc,WACZ,MAAO/vB,QAAOqxB,UAGhBE,UAAW,WACT,MAAOrsB,MAAKskF,KAAK96D,SAOnB2xH,WAAY,SAAU7uG,GACpB,MAA0B,mBAAXA,IAAqC,cAAXA,IAA2B,GAUtEkE,MAAO,WACL,GAAIj3B,GAAK/iB,IAET,IAAM+iB,EAAGsB,GAAI,MAAOtB,GAAGsB,EACvB,IAAIugI,GAAQA,EAAQn6I,SAASsxB,cAAc,MAAO,GAClD,OAAKuqC,OAAMs+E,GAIJ,MAHL7hI,EAAGsB,GAAKugI,EACDA,IAaXx3E,iBAAkB,WAChB,GAAIrqD,GAAK/iB,IACT,IAAI+iB,EAAG4hI,WAAW5hI,EAAGwB,eAAgB,MAAOxB,GAAGwB,aAC/C,IAAIw6H,GAAU8F,SAAS9oH,cAAc,YACrC,OAAIhZ,GAAG4hI,WAAW5F,IAAYh8H,EAAGwB,cAAgBw6H,EAAgBA,IAE/DA,EAAU8F,SAAShmJ,EAAE,YAAYoV,OAC7B8O,EAAG4hI,WAAW5F,IAAYh8H,EAAGwB,cAAgBw6H,EAAgBA,GAE5D,OAUTzU,iBAAkB,WAChB,GAAIvnH,GAAK/iB,IACT,IAAI+iB,EAAG4hI,WAAW5hI,EAAG4D,eAAgB,MAAO5D,GAAG4D,aAC/C,IAAIm+H,GAAU/oH,cAAc,UAC5B,OAAIhZ,GAAG4hI,WAAWG,IAAY/hI,EAAG4D,cAAgBm+H,EAAgBA,GAC1D,MAWTC,QAAS,WACP,GAAIhiI,GAAK/iB,IACT,IAAuB,mBAAZ+iB,GAAGuB,MAAoC,OAAZvB,EAAGuB,KAAe,CACtD,GAAI1c,GAAOmb,EAAGuB,KACV0gI,GAAezmG,EAAG,MAAOC,EAAG,OAAQymG,EAAG,OAAQC,EAAG,MAAOC,EAAG,MAChE,OAAOH,GAAWp9I,IAAS,KAE3B,OAAQ+jB,EAAO7hB,eACb,IAAK,WACL,IAAK,SACH,MAAO,KACT,KAAK,MACH,MAAO,MACT,KAAK,MACH,MAAO,KACT,KAAK,OACH,MAAO,MACT,SACE,MAAO,QAmBfsqE,cAAe,WACb,GAAIrxD,GAAK/iB,IACT,OAAO6Q,wBAAuBkS,EAAGgiI,YAYnCK,gBAAiB,SAAU1gH,GACzB1kC,KAAKqlJ,YAAc,GAAI9/I,IAAGunB,WAAW62H,YAAYj/G,IAanD4gH,WAAY,SAAU3kB,EAAaj8F,GACjC1kC,KAAKolJ,gBAAgB1gH,EAAM6gH,iBAC3BvlJ,KAAKwlJ,OAAS,GAAIjgJ,IAAGunB,WAAWk3H,OAAOrjB,EAAaj8F,GAAQ1kC,KAAKqlJ,eAInEz/B,oBAAqB,WACnB,MAAO35G,gBAAiBpN,EAAEmB,KAAK60B,2BAA2B10B,SAASsC,MAIvEkpB,GAAOoD,QAAUpD,EAAOjiB,GAAK,GAAIy6I,IAEhC7/I,OAAOiB;AClRV,cAoCA,SAAWomB,QACT,GAAI85H,QAAS/jI,WAAWjgB,QACtByR,UAAW,SACXjJ,KAAM,GACNua,IAAK,KACLkhI,0BAA0B,EAC1BC,gCAEAplJ,KAAM,WACJP,KAAK8jB,SACL9jB,KAAKiK,KAAO3F,OAAO2F,KACnBjK,KAAKwkB,IAAM,GAAIjf,IAAGkf,IAClBzkB,KAAK0lJ,0BAA2B,EAChC1lJ,KAAK2lJ,iCAYPxjI,KAAM,SAAUlY,EAAMwV,GACpB,GAAIsD,GAAK/iB,KACL4lJ,EAAc37I,EAAKiY,aASvB,OARoB,gBAAhB0jI,EACF7iI,EAAG8iI,mBAAmB57I,EAAMwV,GACH,eAAhBmmI,EAET7iI,EAAG+iI,kBAAkB77I,EAAMwV,GAE3BsD,EAAGe,OAAO7Z,EAAMwV,GAEXsD,GAWT8iI,mBAAoB,SAAU57I,EAAMwV,GAClC,GAAIsD,GAAK/iB,IAkCT,OAjCAsE,QAAOiwG,eAAiB,SAAUnwG,GAChC,IAAI2e,EAAG2iI,yBACP,IACEthJ,EAAIA,GAAKE,OAAOjB,KAEhB,IAAI4N,GAAM,EAKV,IAJIpS,EAAE8jB,WAAWlD,KACfxO,EAAMwO,KAGJxO,GAAOA,KAAQ,EAejB,MAbA8R,GAAG2iI,0BAA2B,EAC9Bp/I,WAAW,WAAcyc,EAAG2iI,0BAA2B,GAAU,IAE7DthJ,IACFA,EAAEQ,YAAcqM,GAGlB3K,WAAW,WACTA,WAAW,WACTk3B,kBACC,MACF,GAEIvsB,EAGX,MAAOgsB,GACL1a,IAAIoQ,QAAQ,SAAUsK,KAInBla,GAWT+iI,kBAAmB,SAAU77I,EAAMwV,GACjC,GAAIsD,GAAK/iB,KACLujC,EAASxgB,EAAGgjI,kBAShB,OARIxiH,KAAWA,EAAOyiH,OAEhBziH,EAAO1Y,WAAW0Y,EAAO1Y,UAAUkE,QAAQzqB,OAAO2hJ,yBAAyB3hJ,OAAQi/B,EAAO/jB,cAAcC,IAE5Gnb,OAAOw7B,SAAW,WAChB/c,EAAGmjI,oBAAoB5hJ,OAAQmb,IAG5BsD,GAWTP,OAAQ,SAAUvY,GAChB,GAAI27I,GAAc37I,EAAKiY,aACH,iBAAhB0jI,EACF5lJ,KAAKmmJ,qBAAqBl8I,GACD,eAAhB27I,EACT5lJ,KAAKomJ,oBAAoBn8I,GAEzBjK,KAAK8jB,OAAO7Z,IAahBk8I,qBAAsB,SAAUl8I,EAAMwV,GACpCnb,OAAOiwG,eAAiB,MAY1B6xC,oBAAqB,SAAUn8I,GAC7B,GAAIs5B,GAASvjC,KAAK+lJ,kBACdxiH,KAAWA,EAAOyiH,OACpBziH,EAAO1Y,UAAUkE,QAAQzqB,OAAO+hJ,0CAA0C/hJ,OAAO2F,MAEjF3F,OAAOw7B,SAAW,MAYtBimH,iBAAkB,WAChB,IACE,GAAIzhJ,OAAOi/B,OAET,MAAIj/B,QAAOi/B,OAAOpS,SAASrpB,KAAKoa,cAAc9W,QAAQ,8BAA+B,GAAM9G,OAAOi/B,OAAO+iH,aAEhGhiJ,OAAOi/B,OAAO9vB,OAGdnP,OAAOi/B,OAGlB,MAAOn/B,GACPme,IAAIoQ,QAAQ,SAAUvuB,GAExB,MAAO,OAWT6hJ,yBAA0B,SAAUM,EAAaC,GAC/C,GAAIzjI,GAAK/iB,KACLymJ,EAAkBF,EAAYt8I,IAUlC,OATA8Y,GAAGsjI,0CAA0CI,GAC7C1jI,EAAG4iI,6BAA6Bc,GAAmBngJ,WAAW,WACxDigJ,EAAYP,QACdjjI,EAAGsjI,0CAA0CI,GAC7C1jI,EAAGmjI,oBAAoBK,EAAaC,IAEpCzjI,EAAGkjI,yBAAyBM,EAAaC,IAE1C,MACIzjI,GAWTsjI,0CAA2C,SAAUp8I,GACnD,GAAI8Y,GAAK/iB,IACT,IAAM+iB,EAAG4iI,6BAA6B17I,GAAO,CAC3C,IACEhE,aAAa8c,EAAG4iI,6BAA6B17I,IAC7C,MAAO7F,IACT,UACS2e,GAAG4iI,6BAA6B17I,GACvC,MAAO7F,KAEX,MAAO2e,IAWTmjI,oBAAqB,SAAUK,YAAaC,aAC1C,GAAIzjI,IAAK/iB,IAkBT,OAjBAsG,YAAW,WACLigJ,YAAYP,SACV1hJ,OAAOo/B,yBACgB,qBAArBn+B,GAAGuE,eAAwCxF,OAAOkF,KAAKskF,KAAKxS,WAAah3E,OAAOkF,KAAKskF,KAAKxS,UAAU6b,WACtG7yF,OAAOkF,KAAKskF,KAAKxS,UAAU6b,aAE3Bp0E,GAAG2jI,yBAGH7nJ,EAAE8jB,WAAW6jI,aACfA,YAAYzmI,MAAMzb,QAASA,SAG3BytD,KAAKy0F,eAGR,IACIzjI,IAST8b,MAAO,WACSt5B,GAAGC,IAAI4M,OAChB9N,QAAOi/B,QAAUj/B,OAAOi/B,OAAOh+B,IAAO1G,EAAEwB,KAC3CiE,OAAOu6B,QAEP1N,SAASrpB,KAAO,kBAUpBikB,OAAQ,WACNznB,OAAO6sB,SAASpF,UASlB46H,aAAc,WACZriJ,OAAO6sB,SAAW,IASpBkqD,UAAW,WACT,IACE/2E,OAAO6sB,SAASrpB,KAAO,wBAA0BytE,mBAAmBjxE,OAAO6sB,SAASE,SAAW/sB,OAAO6sB,SAASlkB,QAC/G,MAAO7I,GACPme,IAAIoQ,QAAQ,SAAUvuB,KAW1BkuC,eAAgB,WACd,GAAyB,aAArB/sC,GAAGuE,cAA8B,CACnC,GAAI88I,GAAc/nJ,EAAE,eAChBgoJ,EAAoBhoJ,EAAE,uBAEtBu2I,EAAkB,EAKtB,IAJIwR,EAAY94I,OAAS,GAA0B,IAArB84I,EAAY3yI,QACxCmhI,EAAkBwR,EAAY3yI,OAGR,KAApBmhI,GAA2ByR,EAAkB/4I,OAAS,GAA4D,KAAvD+4I,EAAkBlnJ,KAAK,4BACpF2G,WAAW,WACTogD,kBAAkBogG,SAAU1R,EAAiBv2I,EAAE,6CAA6CoV,QAC3F,KACH1O,GAAGmE,GAAG0wC,WAAWuH,aACZ,CACL,GAAI+B,GAAO7kD,EAAE,6BACb,IAAI6kD,EAAK51C,OAAQ,CACf,GACIjJ,GADAvB,EAAWogD,EAAK9hD,QAAQ,kBAG1BiD,GADEhG,EAAE4qD,aACQnmD,EAASnD,SAASsC,IAAMihD,EAAKvjD,SAASsC,IAEtCa,EAASuB,WAEvB,IAAIq2B,GAAQr8B,EAAE,gBAAiB6kD,GAAM51C,MACrCjP,GAAE4yB,OAAO,aAAcyJ,GACvBr8B,EAAE4yB,OAAO,cAAe5sB,GAE1BP,OAAO6sB,SAASpF,UAGpB,MAAO/rB,OAUT+mJ,qBAAsB,WACpB,IACE,GAAIr7I,GAAIpH,MACQ,OAAZoH,EAAE63B,QAAkB73B,EAAE63B,OAAOpS,SAASrpB,KAAKoa,cAAcjV,OAAO,eAAiB,GAA2B,MAAtBvB,EAAE63B,OAAO1Y,WACjGnf,EAAE63B,OAAO1Y,UAAUkE,QAAQzqB,OAAOguC,iBAEpC,MAAOluC,GACPme,IAAIoQ,QAAQ,SAAUvuB,GAExB,MAAOpE,OAWTgnJ,iBAAkB,WAChB,IACE,GAAIt7I,GAAIpH,MACQ,OAAZoH,EAAE63B,QAAkB73B,EAAE63B,OAAO/5B,KAAKskF,KAAKxS,WAAa5vE,EAAE63B,OAAO/5B,KAAKskF,KAAKxS,UAAU6b,YACnFzrF,EAAE63B,OAAO/5B,KAAKskF,KAAKxS,UAAU6b,aAE/B,MAAO/yF,GACPme,IAAIoQ,QAAQ,SAAUvuB,GAExB,MAAOpE,OAWTsjC,0BAA2B,WACzB,IACE,GAAI2jH,GAAK3iJ,OAAOi/B,MAChB,IAAU,MAAN0jH,EAAY,CACd,GAAIC,IAAc,CACZD,IAAQA,EAAGxoH,eAAmBwoH,EAAGppH,gBACrCqpH,EAAeD,EAAGxoH,eAAiBwoH,EAAGppH,iBAExCopH,EAAGvjH,wBAA0BwjH,GAAeD,EAAG91H,SAASrpB,KAAKoa,cAAcjV,OAAO,eAAiB,GAIvG,MAAO7I,GACLme,IAAIoQ,QAAQ,SAAUvuB,GAExB,MAAOpE,OAUT0mJ,sBAAuB,WAMrB,MALyB,aAArBnhJ,GAAGuE,eACDvE,GAAGmE,GAAG8pB,YACRjuB,GAAGmE,GAAG8pB,WAAWzH,SAGd/rB,MAUTmnJ,4BAA6B,WAC3B,IACE,GAAIz7I,GAAIpH,MACQ,OAAZoH,EAAE63B,QAAkB73B,EAAE63B,OAAOpS,SAASrpB,KAAKoa,cAAcjV,OAAO,eAAiB,GAA2B,MAAtBvB,EAAE63B,OAAO1Y,WACjGnf,EAAE63B,OAAO1Y,UAAUkE,QAAQzqB,OAAOoiJ,wBAEpC,MAAOtiJ,GACPme,IAAIoQ,QAAQ,SAAUvuB,GAExB,MAAOpE,QAIX2rB,QAAOrnB,OAAS,GAAImhJ,SACnBnhJ,OAAOumB,UAAUkE;ACtepB,cAYA,SAAWpD,GACT9sB,EAAE,YAAYqtB,MAAM,WAClB,GAAIviB,IAEFstE,eAAe,EAEfC,aAAc,GAEdU,aAAa,EAEbwvE,iBACE,oBACA,oBACA,iBACA,oBACA,iBACA,iBACA,cACA,UACA,mBACA,kCACA,sCACA,yCACA,qDACA,gCACA,cACA,qBACA,OACA,mBACA,SACA,oBACA,oBACA,kBACA,uBACA,WAAY,WACZ,0BACA,YAAa,uBACb,kBACA,UAAW,sBAEbC,eACE,iBACA,sBAWJ19I,GAAWogE,OAAS,WAElB,MADA/pE,MAAK43E,aAAc,EACZ53E,MAUT2J,EAAWmgE,QAAU,WAEnB,MADA9pE,MAAK43E,aAAc,EACZ53E,MAUT2J,EAAW1B,WAAa,WACtB,MAAOjI,MAAK43E,aAmBdjuE,EAAWC,MAAQ,SAAU09I,EAAaC,GACxC,GAAIvnJ,KAAK43E,YAAa,MAAO53E,KAC7B,IAAyB,UAArBuF,GAAGuE,cAAP,CACA,GAAI8D,GAAS5N,KAAKwnJ,WAAWF,EAAaC,EAC1C,IAAK35I,GAAWA,EAAO65I,OAAvB,CACA,GAAIznJ,KAAKi3E,cACP1xE,GAAG8L,IAAIxR,KAAK,8BAA+B+N,OACtC,CACL,GAAIiqE,GAAQtyE,GAAGmnB,MAAMiqD,UAAU,iBAC/BkB,GAAMtkE,KAAK3F,GACXrI,GAAGmnB,MAAMgqD,UAAU,aAAcmB,GAC7BA,EAAM/pE,OAAS9N,KAAKk3E,cAAcl3E,KAAK0nJ,aAE7C,MAAO1nJ,SAQT2J,EAAW69I,WAAa,SAAUF,EAAaC,GAC7CA,EAAmBA,GAAoBD,CACvC,IAAIK,GAAOh8H,EAAOoD,QAAQplB,WACtBiE,GAAWyqE,KAAQ,GAAI5jE,MAE3B,IAAI6yI,EAAYM,QAAS,CACvB,GAAIC,GAAgBF,EAAKG,mBAAmBR,GAAa,EAEzD15I,GAAO23D,KAAOhgE,GAAGuE,cACjB8D,EAAO65I,OAASI,EAAc99I,OAC9B6D,EAAOm6I,KAAQF,EAAcG,MAAMl6I,OAAS,EAAI+5I,EAAcG,MAAM,GAAK,GACzEp6I,EAAOq6I,OAASN,EAAKO,mBAAmBX,OAExC35I,GAAO23D,KAAO+hF,EAAYz9I,KAC1B+D,EAAO65I,OAASH,EAAYv9I,OAC5B6D,EAAOm6I,KAAOT,EAAYp9I,KAC1B0D,EAAOq6I,OAASN,EAAKO,mBAAmBZ,EAAYnhJ,OAGtD,IAAqB,IAAjByH,EAAO65I,QAAgB5oJ,EAAEw6D,QAAQzrD,EAAO65I,OAAQznJ,KAAKonJ,oBAAqB,GAC3D,IAAfx5I,EAAOm6I,MAAclpJ,EAAEw6D,QAAQzrD,EAAOm6I,KAAM/nJ,KAAKqnJ,kBAAmB,EAMxE,MAAOz5I,IAWTjE,EAAW+9I,WAAa,WACtB,GAAI1nJ,KAAK43E,YAAa,MAAO53E,KAG7B,IAAI63E,GAAQtyE,GAAGmnB,MAAMiqD,UAAU,aAI/B,OAHApxE,IAAG8L,IAAIxR,KAAK,oCAAsCk4E,MAASF,IAAStmE,KAAK,SAAU8uB,GAC7EA,GAAS96B,GAAGmnB,MAAMgqD,UAAU,mBAE3B12E,MAYT2J,EAAWm+I,mBAAqB,SAAU3hJ,EAAQgiJ,GAShD,IARA,GAAIplI,GAAK/iB,KACLijB,GACFlZ,OAAQ,GACRi+I,UAEE//I,EAAa,GAEb8/F,EAAO5hG,EACJ4hG,GAAM,CAEX,GAAIA,EAAK70F,UAAW,CAClB,GAAIA,GAAY60F,EAAK70F,UAAUC,SAAW40F,EAAK70F,SAE/C,IAAIA,GAAkC,gBAAdA,IAA0BA,EAAU9H,QAAQ,YAAa,IAC/E6X,EAAO+kI,MAAMz0I,KAAKwP,EAAGqlI,oBAAoBrgD,EAAMogD,IAE3CA,GAAiB,MAAOllI,GAKX,IAAjBA,EAAOlZ,SACLmJ,GAAaA,EAAUgP,cAAc9W,QAAQ,eAAgB,IAAInD,EAAa,eAC9E8/F,EAAKj1F,eACHi1F,EAAKj1F,aAAa,mBACpBmQ,EAAOlZ,OAASg+F,EAAKj1F,aAAa,mBAAqB7K,EAEnD8/F,EAAKj1F,aAAa,QACpBmQ,EAAOlZ,OAASg+F,EAAKj1F,aAAa,QAAU7K,EAExC8/F,EAAKj1F,aAAa,aACpBmQ,EAAOlZ,OAASg+F,EAAKj1F,aAAa,aAAe7K,EAE7C8/F,EAAKj1F,aAAa,QACpBmQ,EAAOlZ,OAASg+F,EAAKj1F,aAAa,MAAQ7K,KAKtD8/F,EAAOA,EAAKr0F,WAGd,MAAOuP,IAQTtZ,EAAWy+I,oBAAsB,SAAUC,EAAaF,GACtD,GAAIG,GACAC,CACJD,GAASD,EAAYn1I,UAAUjE,MAAM,IACrC,KAAK,GAAIe,GAAI,EAAGA,EAAIs4I,EAAOx6I,OAAQkC,IAEjC,GADAu4I,EAAQD,EAAOt4I,GACXu4I,EAAMn9I,QAAQ,YAAa,EAC/B,MAAOm9I,GAAMr6I,QAAQ,QAAS,KAWlCvE,EAAWu+I,mBAAqB,SAAUZ,GACxC,GAAIK,GAAOh8H,EAAOoD,QAAQplB,WACtB6+I,EAAiBb,EAAKG,mBAAmBR,EAC7C,QAASkB,EAAez+I,QAAQiW,OAAOwoI,EAAeR,OAAQ/1I,KAAK,MAGrE0Z,EAAOoD,QAAQplB,WAAaA,KAG7BrF,OAAOumB;ACzQV,cAEA,SAAWc,GAETA,EAAO1C,UAAUy6C,cAGjB/3C,EAAO1C,UAAUw/H,WAGjB98H,EAAO1C,UAAUy/H,WAGjB/8H,EAAO1C,UAAU0/H,WAGjBh9H,EAAO1C,UAAU2/H,SAGjBj9H,EAAO1C,UAAU4/H,QAGjBl9H,EAAO1C,UAAU6/H,UAAYn9H,EAAO1C,UAAU8/H,cAG9Cp9H,EAAO1C,UAAUnD,YAIhBxhB,OAAOumB;AC7BV,cACA,SAAWc,GAWT,GAAIq9H,GAActnI,WAAWjgB,QAE3ByR,UAAW,cACXitB,YAAa/vB,YAAYO,QAGzBpQ,KAAM,SAAU4/B,GACVA,EAAc,GAChB56B,GAAGqL,MAAM,mDAAoD,eAE/D5Q,KAAKmgC,YAAcA,EACnBngC,KAAK8jB,OAAOqc,IAcd8oH,cAAe,SAAU1lJ,EAAI2lJ,GAC3B,GAAInmI,GAAK/iB,IACTkpJ,GAAkBA,EAA8BA,EAAbxwI,MAAMC,IACzC,IAEIsK,GAFAkmI,EAAYtqJ,EAAE0nB,UASlB,OANAhhB,IAAG8L,IAAIxR,KAAK,gCAAkCwxE,WAAYtuD,EAAGod,YAAa9b,GAAI9gB,EAAIijB,cAAezD,EAAGw2B,eAAiB,GAAI+oE,KAAM4mC,IAAiB33I,KAAK,SAAUmzB,GAC7JzhB,EAASF,EAAGqmI,aAAa1kH,EAAOwkH,GAChCC,EAAUrhI,QAAQ7E,KACjB8E,KAAK,SAAUiJ,GAChBm4H,EAAUjhI,OAAO8I,KAEZm4H,GAWTC,aAAc,SAAU1kH,EAAOwkH,GAC7B,GAAIjmI,EACJ,IAAIimI,GAAiBxwI,MAAMI,KAAM,CAC/B,GAAIqL,GAAO,GAAI5e,IAAG6e,KAAKsgB,EAAMrgB,GAAIrkB,KAAKmgC,YAAangC,KAAKu5C,eAAiB,KACzEp1B,GAAK6vD,QAAWtvC,EAAMhgB,MACtBzB,EAASkB,MAETlB,GAAS,GAAIY,iBAAgB6gB,EAE/B,OAAOzhB,IAITomI,WAAY,SAAS9lJ,GACnB,MAAOvD,MAAKipJ,cAAc1lJ,EAAI,KAKlCooB,GAAOq9H,YAAcA,GAEpB1kJ,OAAOumB,UAAU5B;ACjFpB,cAEA,SAAW0C,GAyBT,GAAI29H,GAAmB39H,EAAO1C,UAAU+/H,YAAYvnJ,QAChDyR,UAAW,mBACXqmC,cAAe,GAGfpZ,YAAa/vB,YAAYK,iBAGzBlQ,KAAM,SAAUg5C,GACTA,GACHh0C,GAAGqL,MAAM,mDAAoD,iBAG/D5Q,KAAKu5C,cAAgBA,EACrBv5C,KAAK8jB,OAAO9jB,KAAKmgC,cAanBopH,cAAe,SAAUhmJ,EAAI2lJ,GAC3B,MAAOlpJ,MAAKipJ,cAAc1lJ,EAAI2lJ,IAchChlI,MAAO,WACL,MAAO,IAAI3e,IAAGkf,IAAI,8BAAgCwgC,UAAY,QAAUC,UAAY,6BAA+BllD,KAAKu5C,cAAgB,kBAc1I5Z,KAAM,WAEJ,MADA3/B,MAAKkkB,QAAQyb,OACN3/B,MAcTwpJ,YAAa,SAASvvH,GACpB,GAAIlX,GAAK/iB,KACLypJ,EAAc5qJ,EAAE4C,UAAWw4B,GAC7Bsf,cAAex2B,EAAGw2B,eAGpB,OADA1uB,WAAUiC,WAAWhH,QAAQ42F,oBAAoB6C,cAAckqC,GACxDzpJ,MA4BT0pJ,aAAc,SAAUC,EAAqBC,EAAeC,EAAeX,GACzE,GAAInmI,GAAK/iB,KACLmpJ,EAAYtqJ,EAAE0nB,UAClB2iI,GAAkBA,EAA8BA,EAAbxwI,MAAMC,IAEzC,IAEImxI,GACAvlF,IAoCJ,OAlCI1lE,GAAEuzB,cAAcu3H,IAClBplF,EAAQolF,EAEJA,EAAoB1pI,eAAe,qBACrCskD,EAAMwlF,QAAUlrJ,EAAEwkB,OAAOsmI,EAAoBK,kBAG3CL,EAAoB1pI,eAAe,eACrCskD,EAAMulF,UAAYjrJ,EAAEwkB,OAAOsmI,EAAoBG,YAG7CH,EAAoB1pI,eAAe,gBACrCskD,EAAMl/C,WAAaxmB,EAAEwkB,OAAOsmI,EAAoBtkI,aAG9CskI,EAAoB1pI,eAAe,YACrCskD,EAAM0lF,OAASN,EAAoBM,OAAO7mI,cAI5CmhD,EAAMwlF,QAAUJ,EAChBplF,EAAM2lF,UAAYN,EAClBrlF,EAAMulF,UAAYA,GAGpBvkJ,GAAG8L,IAAIxR,KAAK,6CACV2mB,cAAexmB,KAAKu5C,cACpBjd,OAAQioC,EACR+9C,KAAM4mC,IACL33I,KAAK,SAAUmzB,GAChBykH,EAAUrhI,QAAQ/E,EAAGqmI,aAAa1kH,EAAOwkH,MACxCnhI,KAAK,SAASwI,GACf44H,EAAUjhI,OAAOqI,KAEZ44H,IAKbx9H,GAAO1C,UAAUy6C,WAAa,SAAUnqB,GACtC,MAAO,IAAI+vG,GAAiB/vG,KAI7Bj1C,OAAOumB;AC5LV,cAEA,SAAWc,GAWT,GAAIw+H,GAASzoI,WAAWjgB,QACtByR,UAAW,iBAEXitB,YAAa/vB,YAAYgG,OACzBnM,KAAM,GACN8f,cAEAxpB,KAAM,SAAU4/E,GACTA,GACH56E,GAAGqL,MAAM,mDAAoD,cAG/D5Q,KAAKmgF,WAAaA,EAClBngF,KAAK8jB,OAAO9jB,KAAKmgC,cAmBnBiqH,QAAS,SAAU3kI,GACjB,GAAI1C,GAAK/iB,IACT+iB,GAAGgH,WAAatE,KAGhB,IAAI4kI,GAAqB,SAAU3lH,GACjC,GAAI4lH,KAEJ,QADAA,EAAaC,yBAA2B,EAAU7lH,EAAMxxB,UAAU,GAC1Do3I,EAAaC,0BACnB,IAAK,OACH1rJ,EAAE4C,OAAO6oJ,GACP/mJ,GAAImhC,EAAMnhC,GACVqE,KAAM88B,EAAM98B,KACZ2xC,cAAe7U,EAAM6U,eAAiB,IAExC,MACF,KAAK,aACH,GAAI5sC,GAASoW,EAAGgH,UAChBlrB,GAAE4C,OAAO6oJ,EAAc39I,EAAOD,KAAKsY,WACjCC,WAAW,EACX8pH,cAAc,EACd5pH,eAAe,EACfC,gCAAgC,IAElC,MACF,SACEklI,EAAe5lH,EAEnB,MAAO4lH,GAGT,IAAIvnI,EAAGgH,YAA0C,eAA5BhH,EAAGgH,WAAW7W,UAA4B,CAE7D,GAAIvG,GAASoW,EAAGgH,WACZhF,EAAiBslI,EAAmB19I,EACxC,OAAOpH,IAAGwnB,SAASwuD,OAAO8E,sBAAsBt9D,EAAGo9D,WAAYp7D,GAKjE,GAAIylI,GAAgBlhJ,EAAE0hI,UAAUjoH,EAAGgH,WAAY,SAAUhL,GACvD,MAAOsrI,GAAmBtrI,IAG5B,OAAOxZ,IAAGwnB,SAASwuD,OAAO2E,IAAIn9D,EAAGo9D,WAAYqqE,IAiB/CC,qBAAsB,SAAU7kI,GAC9B,GAAI7C,GAAK/iB,KACLgpB,EAAMnqB,EAAE0nB,UAkBZ,OAjBIX,GAEFrgB,GAAGsgB,GAAGC,QAAQC,gBAAgBH,EAAYlN,MAAMC,MAAMpH,KAAK,SAAU5E,GACnEA,EAAO1K,OACP0K,EAAOwV,KAAK5c,GAAGygB,IAAIF,QAAQG,WAAWnE,MAAMoE,aAAc,SAAUC,EAAkBlD,GAChFkD,IAAqB5L,cAAcC,IACrCuI,EAAGqnI,QAAQz9I,GAAQgc,KAAK,SAAUvhB,GAChC4hB,EAAIlB,QAAQ1gB,SAMpB2b,EAAGqnI,UAAUzhI,KAAK,SAAUvhB,GAC1B4hB,EAAIlB,QAAQ1gB,KAGT4hB,EAAIb,YAKfwD,GAAO1C,UAAUw/H,QAAU,SAAUtoE,GACnC,MAAO,IAAIgqE,GAAOhqE,KAKnB77E,OAAOumB;ACzIV,cAEA,SAAWc,GAWT,GAAI++H,GAASnlJ,GAAGsgB,GAAGmjI,YAAYvnJ,QAC7ByR,UAAW,gBACXitB,YAAa/vB,YAAYiG,OACzBwuE,WAAY,GAEZtkF,KAAM,SAAUskF,GACTA,GACHt/E,GAAGqL,MAAM,mDAAoD,cAE/D5Q,KAAK6kF,WAAaA,GAWpB8lE,SAAU,SAAUh+I,EAAQi+I,GAC1B,GAAI7nI,GAAK/iB,IAEL4qJ,KACFj+I,EAAO0Y,WAAWwlI,mCAAqCD,EAAoBrnJ,GAC3EoJ,EAAO0Y,WAAWylI,+BAAiCF,EAAoBrxG,cAGzE,IAAI4vG,GAAYtqJ,EAAE0nB,UAuDlB,OArDAxD,GAAGlB,KAAKkB,EAAU,MAAEjB,MAAMipI,iBAAkBhoI,GAE5Cxd,GAAG8L,IAAIxR,KAAK,yBAA2BmrJ,WAAYjoI,EAAG8hE,WAAYh+D,eAAgBla,IAAU4E,KAAK,SAAU05I,GACzG,GAAIC,IACFC,SAAU,WACR,GAAI3mI,GAAM,GAAIjf,IAAGkf,IAAI,iBACrBD,GAAIG,SAAS,aAAc,WAC3BH,EAAIG,SAAS,KAAMsmI,GACnBzmI,EAAIG,SAAS,OAAQ5B,EAAG8hE,YACxBrgE,EAAImb,QAGNyrH,YAAa,WACTzlH,aAAa5kB,gBAAgBC,uBAAwB,SAAU4kB,GAC/D,GAAI4kH,IACFjnJ,GAAI0nJ,EACJjlH,MAAOJ,EACPylH,WAAY,aACZC,aAAc,UACdC,IAAKrmJ,SAASisB,SAASwkD,KACvB61E,OAAuC,SAA9BtmJ,SAASisB,SAASgrF,SAAsB,IAAM,IACvDlyG,KAAM8Y,EAAG8hE,WAEXt/E,IAAGkoB,MAAMoY,gBAAgB,eAAgB,aAAc2kH,GAAeziI,KAAK,SAAUd,GACnFyW,UAAUzW,EAASwJ,cAKzBkP,KAAM,WACJ,GAAI54B,GAAO/G,IACPuF,IAAGkoB,MAAM6jB,cACX/rC,GAAGkoB,MAAMkE,kBAAkB,cAAcC,OAAO,SAAUC,GAEpDA,EACF9qB,EAAKqkJ,cAELrkJ,EAAKokJ,aAITpkJ,EAAKokJ,YAKXhC,GAAUrhI,QAAQojI,KACjBnjI,KAAK,SAAUkV,GACXA,IAAIA,EAAKt2B,EAAE,kCAEhBwiJ,EAAUjhI,OAAO+U,KAGZksH,GAiBTiB,QAAS,SAAUtlI,GACjB,MAAO9kB,MAAK2qJ,SAAS3qJ,KAAKwnJ,WAAW1iI,KAqBvC2mI,kBAAmB,SAAUC,EAAiB5mI,GAC5C,MAAM4mI,IAC8B,QAA7BA,EAAgBx4I,WAChBw4I,EAAgB9jJ,OAASwI,YAAYK,iBAEnCzQ,KAAK2qJ,SAAS3qJ,KAAKwnJ,WAAW1iI,GAAa4mI,OAElDnmJ,IAAGqL,MAAM,0BAA2B86I,IAkBxCjB,qBAAsB,SAAU7kI,EAAY+lI,GAC1C,GAAI5oI,GAAK/iB,KACLgpB,EAAMnqB,EAAE0nB,UAUZ,OATAxD,GAAG6oI,YAAYhmI,EAAY+lI,GAAap6I,KAAK,SAAU5E,GACrDoW,EAAGqnI,QAAQz9I,GAAQ4E,KAAK,SAAUs6I,GAChC7iI,EAAIlB,QAAQ+jI,KACX9jI,KAAK,SAAUwI,GAChBvH,EAAId,OAAOqI,OAEZxI,KAAK,WACNiB,EAAId,OAAO3N,cAAcE,UAEpBuO,EAAIb,WAqBb2jI,+BAAgC,SAAUJ,EAAiB9lI,EAAY+lI,GACrE,GAAI5oI,GAAK/iB,KACLgpB,EAAMnqB,EAAE0nB,UAUZ,OATAxD,GAAG6oI,YAAYhmI,EAAY+lI,GAAap6I,KAAK,SAAU5E,GACrDoW,EAAG0oI,kBAAkBC,EAAiB/+I,GAAQ4E,KAAK,SAAUs6I,GAC3D7iI,EAAIlB,QAAQ+jI,KACX9jI,KAAK,SAAUwI,GAChBvH,EAAId,OAAOqI,OAEZxI,KAAK,WACNiB,EAAId,OAAO3N,cAAcE,UAEpBuO,EAAIb,WAWbyjI,YAAa,SAAUhmI,EAAY+lI,GACjC,GAAI3iI,GAAMnqB,EAAE0nB,WACRxD,EAAK/iB,IAsBT,OApBI4lB,GAEFrgB,GAAGsgB,GAAGC,QAAQC,gBAAgBH,EAAYlN,MAAMC,MAAMpH,KAAK,SAAU5E,GAC/Dg/I,KAAgB,IAClBh/I,EAAOolG,OAAQ,GAEjBplG,EAAO1K,OACP0K,EAAO+lG,SAAS/rG,EAAE,0BAElBgG,EAAOwV,KAAK5c,GAAGygB,IAAIF,QAAQG,WAAWnE,MAAMoE,aAAc,SAAUC,EAAkBlD,GAChFkD,IAAqB5L,cAAcC,GACrCwO,EAAIlB,QAAQnb,GAEZoW,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAMiqI,qBAAsBhpI,OAKtDiG,EAAIlB,QAAQ,MAEPkB,EAAIb,WAWb6jI,sBAAuB,SAAUL,GAC/B,GAAI5oI,GAAK/iB,KACLgpB,EAAMnqB,EAAE0nB,UAYZ,OAVAxD,GAAGkpI,aAAa,KAAMN,GAAap6I,KAAK,SAAU5E,GAChDoW,EAAG4nI,SAASh+I,GAAQ4E,KAAK,SAAUs6I,GACjC7iI,EAAIlB,QAAQ+jI,KACX9jI,KAAK,SAAUkV,GAChBjU,EAAId,OAAO+U,OAEZlV,KAAK,SAAUkV,GAChBjU,EAAId,OAAO+U,KAGNjU,EAAIb,WAYb+jI,gCAAiC,SAAUR,EAAiBC,GAC1D,GAAMD,GAC6B,SAA9BA,EAAgBx4I,WAChBw4I,EAAgB9jJ,OAASwI,YAAYK,iBAAkB,CAE1D,GAAIsS,GAAK/iB,KACLgpB,EAAMnqB,EAAE0nB,UAYZ,OAVAxD,GAAGkpI,aAAaP,EAAiBC,GAAap6I,KAAK,SAAU5E,GAC3DoW,EAAG4nI,SAASh+I,EAAQ++I,GAAiBn6I,KAAK,SAAUs6I,GAClD7iI,EAAIlB,QAAQ+jI,KACX9jI,KAAK,SAAUkV,GAChBjU,EAAId,OAAO+U,OAEZlV,KAAK,SAAUkV,GAChBjU,EAAId,OAAO+U,KAGNjU,EAAIb,UAGX,MADA5iB,IAAGqL,MAAM,0BAA2B86I,GAC7B,MASXO,aAAc,SAAUrB,EAAqBe,GAC3C,GAAI3iI,GAAMnqB,EAAE0nB,WACRxD,EAAK/iB,IAoBT,OAlBAuF,IAAG8L,IAAIxR,KAAK,oCAAsCmrJ,WAAYjoI,EAAG8hE,aAActzE,KAAK,SAAUnK,GACxFA,GAAOA,EAAI0G,OAAS,EACtBiV,EAAG6oI,YAAYxkJ,EAAKukJ,GAAap6I,KAAK,SAAU5E,GAC9Cqc,EAAIlB,QAAQ/E,EAAGykI,WAAW76I,MACzBob,KAAK,SAAUkV,GAChBjU,EAAId,OAAO+U,KAGbla,EAAGopI,oBAAoBvB,EAAqBe,GAAap6I,KAAK,SAAU5E,GACtEqc,EAAIlB,QAAQ/E,EAAGykI,WAAW76I,MACzBob,KAAK,SAAUkV,GAChBjU,EAAId,OAAO+U,OAGdlV,KAAK,SAAUkV,GAChBjU,EAAId,OAAO+U,KAGNjU,EAAIb,WAQbgkI,oBAAqB,SAAUvB,EAAqBe,GAClD,GAAI3iI,GAAMnqB,EAAE0nB,WACRxD,EAAK/iB,KACL4N,GAAW3D,KAAMjK,KAAK6kF,WA4C1B,OA1CI+lE,KACFh9I,EAAOrK,GAAKqnJ,EAAoBrnJ,GAChCqK,EAAO8qC,QAAUkyG,EAAoBrxG,eAIvCh0C,GAAG8L,IAAIxR,KAAK,4BACV+gD,YAAa,gBACbtkB,OAAQz9B,EAAEwkB,OAAOzV,KAChB2D,KAAK,SAAUnK,GAGhB,GAAIvI,EAAEuI,EAAIxD,MAAMM,KAAK,4BAA4B4J,OAAS,EAAG,CAC3D,GAAInB,GAAS,GAAIpH,IAAGunB,WAAWhH,QAAQwgG,uBACrCG,SAAUr/G,EAAIxD,KAId4iH,SAAUp/G,EAAIi6C,OAAOvsC,UAAU1N,EAAIi6C,OAAOj2C,QAAQ,aAAe,IAG/DugJ,MAAgB,IAClBh/I,EAAOolG,OAAQ,GAGjBplG,EAAOwV,KAAKxV,EAAc,MAAEmV,MAAMwzF,kBAAmB,WACnD3oG,EAAO+5G,eACP19F,EAAIlB,QAAQnb,KAGdA,EAAOwV,KAAKxV,EAAc,MAAEmV,MAAMyzF,sBAAuB,WACvDxyF,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAMiqI,qBAAsBhpI,KAGlDpW,EAAO1K,WAEP+mB,GAAIlB,QAAQ,QAEbC,KAAK,SAAU3gB,GAChB4hB,EAAId,OAAO9gB,KAGN4hB,EAAIb,WAQbq/H,WAAY,SAAU55I,GACpB,GAAIw+I,IAAkBz4H,UAAYtO,cAAgB2N,WAElD,IAAIplB,EACF,GAAyB,eAArBA,EAAOsF,WAAmD,uBAArBtF,EAAOsF,UAE9Ck5I,EAAgBx+I,EAAOlB,KAAKsY,WAC1BC,WAAW,EACX8pH,cAAc,EACd5pH,eAAe,EACfC,gCAAgC,QAGlC,KAAK,GAAI+M,KAASvkB,GAChBw+I,EAAc/mI,WAAW8M,GAASvkB,EAAOukB,EAK/C,OAAOi6H,MAGTtqI,OAMEipI,iBAAkB,kBAOlBgB,qBAAsB,uBAM1BpgI,GAAO1C,UAAUy/H,QAAU,SAAU7jE,GACnC,MAAO,IAAI6lE,GAAO7lE,IAGpBl5D,EAAO1C,UAAUy/H,QAAQ2D,gBAAkB,SAAUxnE,GAEnD,MADAt/E,IAAGqL,MAAM,mBACF/R,EAAE0nB,WAKVjiB,OAAOumB;AC5bV,cAEA,SAAWc,GAYT,GAAI2gI,GAAiB3gI,EAAO1C,UAAU+/H,YAAYvnJ,QAChDyR,UAAW,iBAEXitB,YAAa/vB,YAAYE,OAEzB/P,KAAM,WACJP,KAAK8jB,OAAO9jB,KAAKmgC,cAYnBmxB,aAAc,SAASpjB,GACrB,OAASo4B,MAAMp4B,KAAcA,GAAYq+G,eAAiBr+G,GAAYs+G,gBAAkBt+G,GAAYm0E,mBAAqBn0E,GAAYu+G,iBAcvIC,gBAAiB,SAAUC,GACzB,OAAQA,GACN,IAAKhzI,aAAYC,MACf,MAAO2yI,cAET,KAAK5yI,aAAYE,OACf,MAAO2yI,eAET,KAAK7yI,aAAYG,UACf,MAAOuoG,kBAET,KAAK1oG,aAAYI,cACf,MAAO0yI,eAET,SACE,MAAO,QAsBbG,cAAe,SAAUrpJ,EAAI2lJ,GAC3B,MAAOlpJ,MAAKipJ,cAAc1lJ,EAAI2lJ,IA4BhC2D,aAAc,SAAU1sH,EAAa2sH,EAAU5D,GAC7C,GAAInmI,GAAK/iB,KACLmpJ,EAAYtqJ,EAAE0nB,UAClB2iI,GAAkBA,EAA8BA,EAAbxwI,MAAMC,IAEzC,IAAI4rD,KA8BJ,OA5BI1lE,GAAEuzB,cAAc+N,IAClBokC,EAAQpkC,EAEJA,EAAYlgB,eAAe,gBAC7BskD,EAAMl/C,WAAaxmB,EAAEwkB,OAAO8c,EAAY9a,aAGtC8a,EAAYlgB,eAAe,YAC7BskD,EAAM0lF,OAAS9pH,EAAY8pH,OAAO7mI,cAIhC+c,EAAc,GAChB56B,GAAGqL,MAAM,oDAEX2zD,EAAMpkC,YAAcA,EACpBokC,EAAMt6D,KAAO6iJ,GAAY,MAG3BvnJ,GAAG8L,IAAIxR,KAAK,6CACVy8B,OAAQioC,EACR+9C,KAAM4mC,IACL33I,KAAK,SAAUmzB,GAChBykH,EAAUrhI,QAAQ/E,EAAGqmI,aAAa1kH,EAAOwkH,MACxCnhI,KAAK,SAAUwI,GAChB44H,EAAUjhI,OAAOqI,KAGZ44H,IAKXx9H,GAAO1C,UAAU0/H,QAAU,GAAI2D,IAG9BhoJ,OAAOumB;AC5JV,cACA,SAAWc,GA6BT,GAAIohI,GAAephI,EAAO1C,UAAU+/H,YAAYvnJ,QAC9CyR,UAAW,eACXitB,YAAa/vB,YAAYG,KAGzBhQ,KAAM,WACJP,KAAK8jB,OAAO9jB,KAAKmgC,cAanB6sH,YAAa,SAAUzpJ,EAAI2lJ,GACzB,MAAOlpJ,MAAKipJ,cAAc1lJ,EAAI2lJ,IAyDhC+D,WAAY,SAAUrU,EAAYsQ,GAChC,GAEIgE,GAFAnqI,EAAK/iB,KACL4N,IAEJgrI,GAAaA,GAAc,CAE3B,IAAIuQ,GAAYtqJ,EAAE0nB,UAElB,IADA2iI,EAAkBA,EAA8BA,EAAbxwI,MAAMC,KACrC9Z,EAAEuzB,cAAcwmH,IAUlB,GATAhrI,EAASgrI,EACLA,EAAW34H,eAAe,YAC5BrS,EAAO6F,OAASmlI,EAAWnlI,OAAO2P,YAGhCw1H,EAAW34H,eAAe,cAC5BrS,EAAOu/I,SAAWtuJ,EAAEwkB,OAAOu1H,EAAWuU,WAGpCvU,EAAW34H,eAAe,eAAgB,CAC5C,IAAK,GAAI1Y,GAAI,EAAGA,EAAIqxI,EAAW72D,YAAYj0E,OAAQvG,IACjDqxI,EAAW72D,YAAYx6E,GAAKqxI,EAAW72D,YAAYx6E,GAAGkf,aAExD7Y,GAAOm0E,YAAcljF,EAAEwkB,OAAOu1H,EAAW72D,kBAGjB,gBAAf62D,KAA4BtyE,MAAMsyE,IAAeA,EAAa,EACvEsU,EAAa,GAAI3nJ,IAAG6e,KAAKw0H,EAAY71H,EAAGod,aACT,gBAAfy4G,IAAoD,SAAzBA,EAAW1lI,UACtDg6I,EAAatU,EACkB,gBAAfA,IAA6BA,EAAW1lI,WAExD3N,GAAGqL,MAAM,6BAGLs8I,IACJt/I,EAAO6F,OAASy5I,EAAW9pI,WAS/B,OALA7d,IAAG8L,IAAIxR,KAAK,2CAA6Cy8B,OAAQ1uB,EAAQ00G,KAAM4mC,IAAiB33I,KAAK,SAAUmzB,GAC7GykH,EAAUrhI,QAAQ/E,EAAGqmI,aAAa1kH,EAAOwkH,MACxCnhI,KAAK,SAAUwI,GAChB44H,EAAUjhI,OAAOqI,KAEZ44H,IAOXx9H,GAAO1C,UAAU2/H,MAAQ,GAAImE,IAG5BzoJ,OAAOumB;ACjKV,cAEA,SAAWc,GAWT,GAAIyhI,GAAczhI,EAAO1C,UAAU+/H,YAAYvnJ,QAC7CyR,UAAW,cAETitB,YAAa/vB,YAAYI,IAEzBjQ,KAAM,WACJP,KAAK8jB,OAAO9jB,KAAKmgC,eAOvBxU,GAAO1C,UAAU4/H,KAAO,GAAIuE,IAG3B9oJ,OAAOumB;AC7BV,cAEA,SAAWc,GAsBT,GAAI0hI,GAAiB9nJ,GAAGsgB,GAAGmjI,YAAYvnJ,QACrCyR,UAAW,iBAYX+1I,cAAe,SAAU1lJ,EAAI2lJ,GAE3B,MADI5iF,OAAM/iE,IAAKgC,GAAGqL,MAAM,kDAAmDrN,GACpEvD,KAAKstJ,aAAa,KAAM/pJ,EAAI2lJ,IAarCnjI,gBAAiB,SAAU9b,EAAMi/I,GAE/B,MADK5/I,GAAEqwB,SAAS1vB,IAAO1E,GAAGqL,MAAM,kDAAmD3G,GAC5EjK,KAAKstJ,aAAa,OAAQrjJ,EAAMi/I,IAazChgI,sBAAuB,SAAUg+D,EAAYgiE,GAC3C,MAAOlpJ,MAAKstJ,aAAa,aAAcpmE,EAAYgiE,IAarDqE,cAAe,SAAUhqJ,EAAI2lJ,GAC3B,MAAOlpJ,MAAKipJ,cAAclpI,MAAM/f,KAAM6N,YAaxC2/I,gBAAiB,SAAUvjJ,EAAMi/I,GAC/B,MAAOlpJ,MAAK+lB,gBAAgBhG,MAAM/f,KAAM6N,YAc1C4/I,sBAAuB,SAAUvmE,EAAYgiE,GAC3C,MAAOlpJ,MAAKkpB,sBAAsBnJ,MAAM/f,KAAM6N,YAahDu7I,aAAc,SAAU1kH,EAAOwkH,GAC7B,GAEIjmI,EACJ,IAAIimI,IAAkBxwI,MAAMI,KAAM,CAChC,GAAIqL,GAAO,GAAI5e,IAAG6e,KAAKsgB,EAAMrgB,GAAIrkB,KAAKmgC,YAAangC,KAAKu5C,eAAiB,KACzEp1B,GAAK6vD,QAAWtvC,EAAMhgB,MACtBzB,EAASkB,MAETlB,GAAS,GAAI1d,IAAGygB,IAAIF,QAAQG,cAAeye,EAE7C,OAAOzhB,IAcTqqI,aAAc,SAAUI,EAAUC,EAAWzE,GAC3C,GAAInmI,GAAK/iB,IACTkpJ,GAAkBA,EAA8BA,EAAbxwI,MAAMC,IAEzC,IAEIsK,GAFAkmI,EAAYtqJ,EAAE0nB,WAGdg+C,GAAU8M,WAAYtuD,EAAGod,YAAa3Z,cAAezD,EAAGw2B,eAAiB,GAAI+oE,KAAM4mC,EASvF,OARA3kF,GAAMmpF,GAAYC,EAElBpoJ,GAAG8L,IAAIxR,KAAK,2BAA6B6tJ,EAAUnpF,GAAOhzD,KAAK,SAAUmzB,GACvEzhB,EAASF,EAAGqmI,aAAa1kH,EAAOwkH,GAChCC,EAAUrhI,QAAQ7E,KACjB8E,KAAK,SAAUiJ,GAChBm4H,EAAUjhI,OAAO8I,KAEZm4H,IAQXx9H,GAAO1C,UAAUnD,QAAU,GAAIunI,GAAej9I,YAAYsG,SAEzDpS,OAAOumB;AC/KV,cAGA,SAAWc,GAWT,GAAIiiI,GAAoBjiI,EAAO1C,UAAU+/H,YAAYvnJ,QACnDyR,UAAW,oBAEXitB,YAAa/vB,YAAYC,UAGzB9P,KAAM,WACJP,KAAK8jB,OAAO9jB,KAAKmgC,cAsBnB0tH,gBAAiB,SAAUtqJ,EAAI2lJ,GAC7B,MAAOlpJ,MAAKipJ,cAAc1lJ,EAAI2lJ,IAkChC4E,sBAAuB,SAAUC,EAAUC,EAAUC,EAAc/E,GACjE,GAAInmI,GAAK/iB,KACL4N,KACAu7I,EAAYtqJ,EAAE0nB,UA+BlB,OA9BA2iI,GAAkBA,EAA8BA,EAAbxwI,MAAMC,KAErC9Z,EAAEuzB,cAAc27H,IAClBngJ,EAASmgJ,EAELA,EAAS9tI,eAAe,gBAC1BrS,EAAOyX,WAAaxmB,EAAEwkB,OAAO0qI,EAAS1oI,aAEpC0oI,EAAS9tI,eAAe,YAC1BrS,EAAOq8I,OAAS8D,EAAS9D,OAAO7mI,cAG9BvV,UAAUC,OAAS,GACrBvI,GAAGqL,MAAM,oDAEXhD,GACEmgJ,SAAUA,EACVC,SAAUA,EACVC,aAAcA,IAIlB1oJ,GAAG8L,IAAIxR,KAAK,4DACVy8B,OAAQ1uB,EACR00G,KAAM4mC,IACL33I,KAAK,SAAUmzB,GAChBykH,EAAUrhI,QAAQ/E,EAAGqmI,aAAa1kH,EAAOwkH,MACxCnhI,KAAK,SAAUwI,GAChB44H,EAAUjhI,OAAOqI,KAEZ44H,IAOXx9H,GAAO1C,UAAU8/H,WAAa,GAAI6E,IAGjCtpJ,OAAOumB;AC1HV,cAQA,SAAWc,GAYT,GAAIuiI,GAAkBxsI,WAAWjgB,QAC/B0sJ,sBAEA5tJ,KAAM,WACJ1B,EAAE4C,OAAOzB,KAAMouJ,yBACfpuJ,KAAKmuJ,mBAAqBE,2BAY5BC,mBAAoB,SAAUC,EAAQtkJ,GACpC,GAAIo5H,GAAYrjI,KAAKmuJ,mBAAmBI,EACxC,OAAIlrB,GACKA,EAAUp5H,GACZ,OAIX0hB,GAAO03G,UAAY,GAAI6qB,IACtB5pJ,OAAOumB,UAAUsC;AC9CpB,cACA,SAAWxB,GAOT,GAAI6iI,GAAmB7sI,MAAMlgB,QAC3ByR,UAAW,mBAEX3S,KAAM,SAAUwe,EAAOnX,EAAMklJ,GAI3B,MAHA9sJ,MAAK+e,MAAQA,EACb/e,KAAK4H,KAAOA,EACZ5H,KAAKiK,KAAO6iJ,GAAY,GACjB9sJ,OAIX2rB,GAAO6iI,iBAAmBA,GACzBlqJ,OAAOumB,UAAUb;ACpBpB,cACA,SAAW2B,GAoHT,QAAS8iI,GAA2BC,GAClC,OAAQA,GACN,IAAKt+I,aAAYC,UACf,MAAOyK,cAAanD,QACtB,KAAKvH,aAAYE,OACf,MAAOwK,cAAaxK,MACtB,KAAKF,aAAYG,KACf,MAAOuK,cAAavK,IACtB,KAAKH,aAAYI,IACf,MAAOsK,cAAatK,GACtB,KAAKJ,aAAYK,iBACf,MAAOqK,cAAarK,gBACtB,SACE,MAAO,OASb,QAASk+I,GAAwC/mJ,GAC/C,OAAQA,GACN,IAAKkT,cAAarD,QAChB,MAAOqD,cAAaK,kBACtB,KAAKL,cAAaF,OAChB,MAAOE,cAAaM,iBACtB,KAAKN,cAAavD,OAChB,MAAOuD,cAAaO,iBACtB,KAAKP,cAAaC,QAChB,MAAOD,cAAaQ,kBACtB,KAAKR,cAAaE,UAChB,MAAOF,cAAaS,oBACtB,KAAKT,cAAavK,KAChB,MAAOuK,cAAaU,eACtB,KAAKV,cAAatK,IAChB,MAAOsK,cAAaW,cACtB,KAAKX,cAAaxK,OAChB,MAAOwK,cAAaY,iBACtB,KAAKZ,cAAanD,SAChB,MAAOmD,cAAaa,mBACtB,KAAKb,cAAarK,iBAChB,MAAOqK,cAAac,2BACtB,KAAKd,cAAaxE,KAChB,MAAOwE,cAAae,eACtB,KAAKf,cAAaG,WAChB,MAAOH,cAAagB,qBACtB,KAAKhB,cAAaI,UAChB,MAAOJ,cAAaiB,oBACtB,SACE,MAAO,OA/Jb,GAAI6yI,GAA0BjtI,MAAMlgB,QAClCyR,UAAW,0BAOX27I,yBAAwB,SAAUC,GAChC,aAAeA,IACb,IAAK,SACH,MAAO9uJ,MAAK+uJ,iCAAiCD,EAC/C,KAAK,UACH,MAAO9uJ,MAAKgvJ,kCAAkCF,EAChD,KAAK,SACH,MAAO9uJ,MAAKivJ,iCAAiCH,EAC/C,KAAK,SACH,MAAO9uJ,MAAKkvJ,iCAAiCJ,EAC/C,SACE,KAAM,IAAIppI,OAAM,gCAStBqpI,mCAAkC,SAAUtmI,GAC1C,MAAO,IAAIkD,GAAO6iI,iBAAiB/lI,EAAQ3N,aAAaF,OAAQ,KAQlEo0I,oCAAmC,SAAUG,GAC3C,MAAO,IAAIxjI,GAAO6iI,iBAAiBW,EAASr0I,aAAaC,QAAS,KAQpEq0I,iCAAgC,SAAU9gJ,GACxC,MAAO,IAAIqd,GAAO6iI,iBAAiBlgJ,EAAMwM,aAAaE,UAAW,KAQnEi0I,mCAAkC,SAAU5yI,GAE1C,GAAIi5D,GAAK,GAAIp3D,QAAO,mBAChBwzG,EAAWp8C,EAAGjqC,KAAKhvB,EACvB,IAAIq1G,EACF,MAAO1xH,MAAK+uJ,iCAAiC74E,WAAW75D,GAI1D,IAAI/N,GAAOyF,cAAcsI,EACzB,OAAa,QAAT/N,EACKtO,KAAKovJ,+BAA+B9gJ,GAGtC,GAAIqd,GAAO6iI,iBAAiBnyI,EAAQvB,aAAavD,OAAQ,KAQlE23I,mCAAkC,SAAU3xG,GAC1C,GAAIx6B,GAAK/iB,IAET,IAAIu9C,YAAe9oC,MACjB,MAAOzU,MAAKovJ,+BAA+B7xG,EAG7C,IAAIA,YAAeh4C,IAAG6e,KAAM,CAC1B,GAAIirI,GAAgBZ,EAA2BlxG,EAAI31C,KACnD,OAAO,IAAI+jB,GAAO6iI,iBAAiBjxG,EAAIh6C,GAAI8rJ,EAAe,IAG5D,GAAI9xG,YAAevvC,OAAO,CACxB,GAAIshJ,GAAoB/xG,EAAIjhC,IAAI,SAAUzV,GACxC,MAAOkc,GAAG8rI,uBAAuBhoJ,KAE/B0oJ,EAAiBD,EAAkBhzI,IAAI,SAAUzV,GACnD,MAAOA,GAAKkY,OAEd,OAAO,IAAI4M,GAAO6iI,iBAAiBe,EAAgBZ,EAAwCW,EAAkB,GAAG1nJ,MAAO,IAGzH,MAAO,QAuEX+jB,GAAO6jI,wBAA0B,GAAIZ,IACpCtqJ,OAAOumB,UAAUb;ACpLpB,cACA,SAAW2B,GA8ET,QAAS8jI,GAAYlyG,GACnB,MAAuB,gBAARA,IAAoBA,EAAImyG,QAAyB,sCAAfnyG,EAAImyG,OAQvD,QAASC,GAAiBpyG,GACxB,MAAQA,aAAevvC,QAASuvC,EAAI,IAAMkyG,EAAYlyG,EAAI,IAQ5D,QAASi0E,GAAOj0E,GACd,MAAuB,gBAARA,IAA6C,IAAzBA,EAAInyC,QAAQ,SAQjD,QAASwkJ,GAAYryG,GACnB,MAAQA,aAAevvC,QAASuvC,EAAI,IAAMi0E,EAAOj0E,EAAI,IAQvD,QAASsyG,GAAkBC,GAEzB,GAAoB,MAAhBA,EAAsB,CACxB,GAAIL,EAAYK,GACd,OAAO,GAAKvqJ,IAAG6e,MAAQ8vD,cAAc47E,EAChC,IAAIH,EAAiBG,GAAe,CACzC,GAAIC,GAAYD,EAAaxzI,IAAI,SAAUzV,GACzC,OAAO,GAAKtB,IAAG6e,MAAQ8vD,cAAcrtE,IAEvC,OAAOkpJ,GAGT,GAAIv+B,EAAOs+B,GACT,MAAOjgJ,WAAUigJ,EACZ,IAAIF,EAAYE,GAAe,CACpC,GAAIE,GAAYF,EAAaxzI,IAAI,SAAUzV,GACzC,MAAOgJ,WAAUhJ,IAEnB,OAAOmpJ,IAIX,MAAOF,GA7HTnkI,EAAOpG,oBAAsB,SAAU0qI,EAASC,EAAU1kI,EAAUhG,EAAYuE,GAC9E,GAAIomI,GAAUxkI,EAAO6jI,wBACjBF,EAAoBvlI,EAAWzN,IAAI,SAAUwyI,GAC/C,MAAIA,aAAqBnjI,GAAO6iI,iBACvBM,EAEAqB,EAAQtB,uBAAuBC,KAItCt9I,EAAI3S,EAAE0nB,UAsBV,OAlBAhhB,IAAG8L,IAAIxR,KAAKowJ,GACVG,WAAcF,YAAoB3qJ,IAAG6e,KAAO8rI,EAASzpI,cAAgB,KACrEypI,SAAYA,YAAoB3qJ,IAAG6e,KAAO8rI,EAAS3sJ,GAAK2sJ,EACxD1qI,WAAcA,EACd6qI,iBAAoBf,EACpB9jI,SAAYA,IACXja,KAAK,SAAUnK,GAEhBA,EAAI6iB,aAAe4lI,EAAkBzoJ,EAAI6iB,cAGzC7C,YAEA5V,EAAEsW,QAAQ1gB,KACT2gB,KAAK,SAAU0I,EAASrpB,GACzBoK,EAAE0W,OAAOuI,EAASrpB,KAGboK,EAAE2W,WAYXwD,EAAOzB,kBAAoB,SAAU+lI,EAASC,EAAU1qI,GACtD,GAAIhU,GAAI3S,EAAE0nB,UAcV,OAVAhhB,IAAG8L,IAAIxR,KAAKowJ,GACVG,WAAcF,YAAoB3qJ,IAAG6e,KAAO8rI,EAASzpI,cAAgB,KACrEypI,SAAYA,YAAoB3qJ,IAAG6e,KAAO8rI,EAAS3sJ,GAAK2sJ,EACxD1qI,WAAcA,IACbjU,KAAK,SAAUnK,GACdoK,EAAEsW,QAAQ1gB,KACX2gB,KAAK,SAAS3gB,GACfoK,EAAE0W,OAAO9gB,KAGJoK,EAAE2W,YAqEV7jB,OAAOumB,UAAUb;AC5IpB,cACA,SAAW2B,GAOTA,EAAOniB,SAENlF;ACgLH,QAASgsJ,IAAGC,GACV,MAAOA,GAAS,KAOlB,QAAS1kJ,eACP,MAAOvH,QAAOgsD,YAAcprD,SAAS+oB,gBAAgBuiI,YAOvD,QAASvkJ,gBACP,MAAO3H,QAAOQ,aAAeI,SAAS+oB,gBAAgBwiI,aAqexD,QAASxlG,eAAcylG,GACrB,GAAIC,GAAmB,IAAbD,EAAkB,IAAMA,EAAY,GAC1C1lG,GAAmB,aAAe2lG,EAAI,aAAeA,EAIzD,OAHI,cAAgBzrJ,YAClB8lD,GAAmB,aAAe2lG,EAAI,WAAaA,IAE9C3lG,EAGT,QAASpY,mBACP,IAAI/zC,EAAEwB,KAAN,CACA,GAAI2qD,GAAkBC,cAAc,qBACpCpsD,GAAE,sCACCsjB,KAAK6oC,EAAgB,GAAI,WAAcnsD,EAAEmB,MAAMs2B,IAAI,aAAa52B,SAAS,WACzEyiB,KAAK6oC,EAAgB,GAAI,WAAcnsD,EAAEmB,MAAMs2B,IAAI,aAAah3B,YAAY,WAC/Eq1G,uBAGF,QAASA,qBAAoBxtG,GAC3B,IAAItI,EAAEwB,KAAN,CACA,GACIkd,GACA2V,EAFA83B,EAAkBC,cAAc,gBAKlC1tC,GADEpW,EACEA,EAGAtI,EAAE,QAERq0B,EAAU3V,EAAErZ,KAAK,qEAGbiD,GACF+rB,EAAQy4C,QAAQ,SAAUxsE,GACxB,GAAkB,IAAdA,EAAGqjD,SAA+B,IAAdrjD,EAAGqjD,QAGzB,MAFArjD,GAAG6D,iBACH7D,EAAGC,mBACI,IAERqjD,MAAM,SAAUtjD,GACC,IAAdA,EAAGqjD,SAA+B,IAAdrjD,EAAGqjD,SACzB3jD,EAAEmB,MAAMiD,UAIdiwB,EACG1Q,OAAOwoC,EAAgB,IAAI7oC,KAAK6oC,EAAgB,GAAI,WAAcnsD,EAAEmB,MAAMs2B,IAAI,aAAa52B,SAAS,WACpG8iB,OAAOwoC,EAAgB,IAAI7oC,KAAK6oC,EAAgB,GAAI,WAAcnsD,EAAEmB,MAAMs2B,IAAI,aAAah3B,YAAY,WACvGkjB,OAAO,2BAA2BL,KAAK,0BAA2B,WAActjB,EAAEmB,MAAMs2B,IAAI,aAAa52B,SAAS,YAClH8iB,OAAO,4BAA4BL,KAAK,2BAA4B,WAActjB,EAAEmB,MAAMs2B,IAAI,aAAah3B,YAAY,aAM5H,QAASsxJ,aAAYC,GACnB,GAAI,kBAAkBxlH,KAAKla,SAASE,UAClC,GAAIjqB,GAAMvI,EAAE,SAASiP,OAAS,MAE9B,IAAI1G,GAAMvI,EAAE,8BAA8BiP,OAAS,CAErD,QAAI1G,IACEypJ,GAAiBA,KACd,GAMX,QAASC,aACP,MAAOF,aAAY,WACjB,GAAI1nG,GAAMrqD,EAAE,UAC8B,QAAtC0G,GAAGC,IAAI4M,QAAQnI,KAAKiY,cACtBgnC,EAAInkD,KAAK,WAAYmkD,EAAInkB,GAAG,aAAa9hC,QAAQ8B,KAAK,WAAYmkD,EAAInkB,GAAG,aAEzEmkB,EAAInkD,KAAK,WAAYmkD,EAAInkB,GAAG,aAAauO,WAK/C,QAASy9G,qBAGP,QAASC,KACP,GAAIC,GAAWpyJ,EAAE,0BAA0BgD,OAI3C,OAHuB,IAAnBovJ,EAASnjJ,SACXmjJ,EAAWpyJ,EAAE,oBAERoyJ,EAGT,QAASC,GAAmBC,EAAeC,GACzCjmG,uBAAwB,CAExB,IAAI8lG,GAAWD,IACXK,EAAaJ,EAASjtJ,SAEtBstJ,EAAUzyJ,EAAE,eACZ8iC,EAAO,IACX,IAAsB,GAAlB2vH,EAAQxjJ,OACVwjJ,EAAU,KACNF,EACGR,gBACHjvH,EAAO9iC,EAAE,gBAGR8iC,EAAO9iC,EAAE,mBAEd,IAAIsyJ,EACF,GAAKC,EAeE,CAELzvH,EAAO2vH,CACP,IAAIC,EACJ,GACEA,GAAU5vH,EAENvzB,IAAI0hB,OACN0hI,EAAaD,GAEf5vH,EAAOA,EAAKA,KAAK,eACVA,EAAK7zB,OAAS,GAAK6zB,EAAKx8B,WAAW1C,IAAM4uJ,GAAe1vH,EAAKx8B,WAAW1C,IAAMk/B,EAAK39B,SAAYqtJ,EAErF,IAAf1vH,EAAK7zB,SACP6zB,EAAO4vH,OA7BQ,CAEjB5vH,EAAO2vH,CACP,GAEE,IADA3vH,EAAOA,EAAKA,OACRA,EAAK7zB,OAAS,GAAK6zB,EAAKliC,SAAS,cAAgBkiC,EAAKoD,GAAG,YAAa,CACxE,GAAI0sH,GAAU9vH,EAAKz9B,KAAK,cACpButJ,GAAQ3jJ,OAAS,IAAG6zB,EAAO8vH,SAE1B9vH,EAAK7zB,OAAS,IAAM6zB,EAAKliC,SAAS,QAGvC2O,KAAI0hB,OACN0hI,EAAaF,OAoBjB,IAAKF,EAcE,CAELzvH,EAAO2vH,CACP,IAAIC,EACJ,GACEA,GAAU5vH,EAENvzB,IAAI0hB,OACN0hI,EAAaD,GAEf5vH,EAAOA,EAAKC,KAAK,eACVD,EAAK7zB,OAAS,GAAK6zB,EAAKx8B,WAAW1C,IAAM,EAE/B,IAAfk/B,EAAK7zB,SACP6zB,EAAO4vH,OA5BQ,CAEjB5vH,EAAO2vH,CACP,GAEE,IADA3vH,EAAOA,EAAKC,OACO,GAAfD,EAAK7zB,QAAewjJ,EAAQ1vJ,QAAQ,oBAAoBkM,OAAS,EAAG,CACtE,GAAI2jJ,GAAUH,EAAQ1vJ,QAAQ,oBAAoBggC,MAC9C6vH,GAAQ3jJ,OAAS,IAAG6zB,EAAO8vH,SAE1B9vH,EAAK7zB,OAAS,IAAM6zB,EAAKliC,SAAS,QAEvC2O,KAAI0hB,OACN0hI,EAAaF,GAqBrB,GAAI3vH,GAAQA,EAAK7zB,OAAS,EAAG,CACvBwjJ,GAAWA,EAAQxjJ,OAAS,GAAGwjJ,EAAQlpG,QAAQ,aAAa,IAAOA,QAAQ,eAAe,IAC9FzmB,EAAKjiC,SAAS,SAAS0oD,QAAQ,cAAc,IAAOA,QAAQ,eAAe,IAG3ExpD,YAAY0B,MAGZ,IAAIoxJ,GAAWhvJ,KAAKitD,KAAKhuB,EAAKx8B,WAAW1C,KACrCkvJ,EAAShwH,EAAK39B,UAAY,IAG1B0tJ,IAAY,GACdT,EAASpsJ,UAAUosJ,EAASpsJ,YAAc6sJ,GAAYN,EAAgBO,EAASN,EAAc,KAG3FK,EAAWL,GAAeK,EAAWC,EAAUN,IACjDJ,EAASpsJ,UAAUosJ,EAASpsJ,YAAc6sJ,GAAYN,EAAe,EAAKO,EAASN,QAK/D,IAAf1vH,EAAK7zB,QAAeqjJ,GAAeF,EAASpsJ,UAAUosJ,EAASpsJ,YAAc,KAGxF,QAAS2sJ,GAAaI,GACpB,GAAIN,GAAaM,EAAWA,EAAU/yJ,EAAE,eACpCqqD,EAAMooG,EAAQptJ,KAAK,YACnBglD,GAAIp7C,OAAS,GACfo7C,EAAIjmD,QAIR,QAAS4uJ,KACP1mG,uBAAwB,CACxB,IAAImmG,GAAUzyJ,EAAE,eACZ4e,EAAI6zI,EAAQptJ,KAAK,wBACjBuZ,IAAKA,EAAE3P,OAAS,GAClB2P,EAAExa,QAIN,QAAS6uJ,KACP,GAAIR,GAAUzyJ,EAAE,cAChB,IAAIyyJ,EAAQxjJ,OAAS,GACiC,GAAhDjP,EAAE,iBAAiB87B,OAAO,YAAY7sB,OAAa,CACrD,GAAIikJ,GAAWT,EAAQptJ,KAAK,kBAC5B,IAAI6tJ,EAASjkJ,OAAS,EACpBikJ,EAAS9uJ,YACJ,CAEL,GAAIgqD,GAAgBqkG,EAAQhpH,SAAS,WAAWpkC,KAAK,YACzB,IAAxB+oD,EAAcn/C,SAEhBm/C,EAAgBqkG,EAAQhpH,SAAS,WAAWpkC,KAAK,MAEnD+oD,EAAchqD,UAMtB,QAAS+uJ,GAAuBC,EAAoBC,EAAwBC,GAC1E,GAAIr1I,GAAI,WACN,GAAIw0I,GAAUzyJ,EAAE,eACZuzJ,GAAmB,CACnBd,GAAQxjJ,OAAS,IACnBskJ,EAAmBd,EAAQ7xJ,SAAS,YAC/B2yJ,GAAkBZ,EAAaF,IAGX,gBAAvBW,GAAwD,mBAATnkE,QACjDmkE,EAAqB,eAGvB,IAAII,EAE0B,aAA1B9sJ,GAAGgpB,YAAYnC,UACjBimI,EAAU9sJ,GAAGmE,GAAG8C,QAAQ0mB,QAAQ++H,IAG7BI,IACHA,EAAUxzJ,EAAEqzJ,IAIRG,GACJ/rJ,WAAW,WACT+rJ,EAAQpvJ,SACP,IAGDquJ,EAAQxjJ,OAAS,IAAMskJ,GACzBZ,EAAaF,GAGjB,OAA6BnyI,UAAzBgzI,GAAsCA,EACjCvB,YAAY9zI,GAEZA,IAIX,QAASw1I,KAEP,GAAIhB,GAAUzyJ,EAAE,cAChB,IAAIyyJ,EAAQxjJ,OAAS,EAAG,CACtB,GAAIykJ,GAAcjB,EAAQptJ,KAAK,0BAC/B,IAAIquJ,EAAYzkJ,OAAS,EAAG,CAE1B,GAAI0O,GAAI+1I,EAAYxtJ,KAAK,SACpByX,IAAU,IAALA,IAASA,EAAI,SACvBlY,OAAOq7B,KAAK4yH,EAAYxtJ,KAAK,QAASyX,OACjC,CAEL,GAAI2iB,GAAOmyH,EAAQvsJ,KAAK,OAExBytJ,iBAAiBjvJ,IAAK+tJ,EAAQvsJ,KAAK,MAAOq5B,KAAMe,GAAQ,eAK9D,QAASszH,KACP,GAAIpiH,GAAMxxC,EAAE,mBACRwxC,GAAIviC,OAAS,GACfuiC,EAAIptC,QA3NR,IAAIpE,EAAEwB,KAAN,CA+NA,GAAIqyJ,GAAe,SAAUC,EAAYC,EAAU7/E,EAAOxoB,GACxDn8C,IAAIwkJ,EAAU7/E,EAAO,WACnB,IAAKxtE,GAAGmE,GAAGC,WAAW1B,aAAc,CAClC,GAAIqpJ,GAAUzyJ,EAAE,8BAEZ2K,MAAKC,oBACPlE,GAAGmE,GAAGC,WAAWC,OACfC,KAAMtE,GAAGuE,cACTC,OAAQ4oJ,EACRzoJ,KAAM,mBACN/D,OAASmrJ,EAAQxjJ,OAAS,EAAIwjJ,EAAQnnJ,IAAI,GAAK,OAIrD,MAAOogD,QAIPwoB,EAAQ,QACZ2/E,GAAa,aAAc,mBAAoB3/E,EAAO,WAA+C,MAAjCm+E,IAAmB,GAAM,IAAe,IAC5GwB,EAAa,aAAc,eAAgB3/E,EAAO,WAAgD,MAAlCm+E,IAAmB,GAAO,IAAe,IACzGwB,EAAa,aAAc,2BAA4B3/E,EAAO,WAA8C,MAAhCm+E,IAAmB,GAAM,IAAc,IACnHwB,EAAa,aAAc,uBAAwB3/E,EAAO,WAA+C,MAAjCm+E,IAAmB,GAAO,IAAc,IAChHwB,EAAa,aAAc,QAAS3/E,EAAO,WAA8B,MAAhBy+E,MAAuB,IAChFkB,EAAa,aAAc,cAAe3/E,EAAO,WAA4B,MAAd8+E,MAAqB,IACpFa,EAAa,OAAQ,QAAS3/E,EAAO,WAAsC,MAAxB++E,MAA+B,IAClFY,EAAa,YAAa,SAAU3/E,EAAO,WAAiD,MAAnCxtE,IAAGwpB,QAAQyE,WAAW+gH,aAAoB,IACnGme,EAAa,YAAa,SAAU3/E,EAAO,WAAc,MAAOi/E,GAAuB,YAAa,eACpGU,EAAa,aAAc,SAAU3/E,EAAO,WAAc,MAAOi/E,GAAuB,aAAc,cAAc,KACpHU,EAAa,WAAY,SAAU3/E,EAAO,WAAc,MAAOi/E,GAAuB,WAAY,YAAY,KAE9GU,EAAa,cAAe,MAAO3/E,EAAO,WAChB,oBAApBxtE,GAAGuE,cAAqCoyC,cACvC22G,0BAEPH,EAAa,WAAY,aAAc3/E,EAAO,WAA0B,MAAZu/E,MAAmB,IAC/EI,EAAa,WAAY,SAAU3/E,EAAO,WAA0B,MAAZ0/E,MAAmB,IAAU,GAGrFC,EAAa,aAAc,2BAA4B3/E,EAAO,WAA+C,MAAjCm+E,IAAmB,GAAM,IAAe,IACpHwB,EAAa,aAAc,uBAAwB3/E,EAAO,WAAgD,MAAlCm+E,IAAmB,GAAO,IAAe,IACjHwB,EAAa,aAAc,mCAAoC3/E,EAAO,WAA8C,MAAhCm+E,IAAmB,GAAM,IAAc,IAC3HwB,EAAa,aAAc,+BAAgC3/E,EAAO,WAA+C,MAAjCm+E,IAAmB,GAAO,IAAc,IACxHwB,EAAa,aAAc,YAAa3/E,EAAO,WAA8B,MAAhBy+E,MAAuB,IACpFkB,EAAa,aAAc,sBAAuB3/E,EAAO,WAA4B,MAAd8+E,MAAqB,IAC5Fa,EAAa,OAAQ,YAAa3/E,EAAO,WAAsC,MAAxB++E,MAA+B,IACtFY,EAAa,YAAa,aAAc3/E,EAAO,WAAc,MAAO+9E,eACpE4B,EAAa,YAAa,aAAc3/E,EAAO,WAAc,MAAOi/E,GAAuB,YAAa,eACxGU,EAAa,aAAc,aAAc3/E,EAAO,WAAc,MAAOi/E,GAAuB,aAAc,cAAc,KACxHU,EAAa,WAAY,aAAc3/E,EAAO,WAAc,MAAOi/E,GAAuB,WAAY,YAAY,KAClHU,EAAa,cAAe,UAAW3/E,EAAO,WAAc,MAAOi/E,GAAuB,cAAe,iBACzGU,EAAa,WAAY,iBAAkB3/E,EAAO,WAA0B,MAAZu/E,MAAmB,IACnFI,EAAa,WAAY,aAAc3/E,EAAO,WAA0B,MAAZ0/E,MAAmB,IAC/ErkJ,IAAIo/F,SAASz6B,GAEbl0E,EAAE,QAAQsjB,KAAK,0BAA2B,WAAcgpC,uBAAwB,KAMlF,QAAS2nG,uBACPr2H,SAAS,mBAAmB,GAG9B,QAAS6N,gBAAer5B,EAAKw7B,GAC3BD,mBAAmBC,EACnB,KAE4C,UAAtClnC,GAAGC,IAAI4M,QAAQnI,KAAKiY,eACtB0pB,SAASa,GAEX7N,cACA,MAAO3B,IACT,OAAO,EAGT,QAAS81H,iBAAgB9hJ,EAAKqxB,GAC5BD,oBAAoBC,EACpB,KAE4C,UAAtC/8B,GAAGC,IAAI4M,QAAQnI,KAAKiY,eACtBqgB,SAASD,GAEX1D,cACA,MAAO3B,IACT,OAAO,EAET,QAAS+1H,gBAAe/hJ,EAAK4uB,GAC3BD,mBAAmBC,EACnB,KAE4C,UAAtCt6B,GAAGC,IAAI4M,QAAQnI,KAAKiY,eACtB6d,QAAQF,GAEVjB,cACA,MAAO3B,IACT,OAAO,EAET,QAASg2H,mBAAkBC,EAASC,GAclC,MAbAllH,kBAAiBilH,EAAS,WACP,MAAbC,GACFriH,sBAAsBqiH,EACxB,KAC4C,UAAtC5tJ,GAAGC,IAAI4M,QAAQnI,KAAKiY,eACtB6uB,WAAWoiH,GAEb7uJ,OAAOu6B,QACP,MAAOz6B,GACP+sB,SAASrpB,KAAO,QAIb,EAKT,QAASsrJ,sCAAqCh2H,GACxCi2H,qBAAqBptJ,aAAaotJ,qBACtCA,oBAAsB/sJ,WAAW82B,EAAU,KAG7C,QAASk2H,gBACP,GAAIC,GAAM10J,EAAE,qBACZ,OAAO00J,GAAIzlJ,OAAS,EAKtB,QAASuvB,gBAAepsB,EAAKuiJ,EAASC,GACpC50J,EAAEiwB,KAAKvpB,GAAGipB,kBAAkBjd,KAAK,WAC/B,GAAIyd,GAAUzpB,GAAGmE,GAAGslB,OAcpB,OAbIykI,GACED,EACFxkI,EAAQo1G,eAERp1G,EAAQo1G,aAAa,KAGnBovB,EACFxkI,EAAQ/sB,OAER+sB,EAAQk2G,YAAY,KAGjBl2G,IAKX,QAAS+sB,sBAAqB9qC,EAAK2hD,EAAOnzC,EAAMg0I,GAC9CL,qCAAqC,WACtB,MAATxgG,IAAeA,EAAQ,KAC3Bp1B,eAAevsB,EAAK2hD,EAAOnzC,EAAMg0I,KAKrC,QAASj2H,gBAAevsB,EAAK2hD,EAAOnzC,EAAMg0I,GACxC50J,EAAEiwB,KAAKvpB,GAAGipB,kBAAkBjd,KAAK,WAC/BhM,GAAGmE,GAAGslB,QAAQ1uB,KAAK2Q,EAAK2hD,EAAOnzC,KAQnC,QAASi0I,eACPj3H,SAAS,aAAa,GAExB,QAASk3H,uBACPl3H,SAAS,IAAI,EAAMR,iBAAiB33B,OAAO6sB,SAASrpB,KAAM,OAAQ,SAIpE,QAAS8rJ,mBAAkBx1H,GACzB,OAAQA,EAAK,GAAGrtB,eACd,IAAK,IAAK,MAAO,SACjB,KAAK,IAAK,MAAO,YACjB,KAAK,IAAK,MAAO,SACjB,KAAK,IAAK,MAAO,UACjB,KAAK,IAAK,MAAO,gBAEnB,MAAO,GAGT,QAAS8iJ,UAAS1vI,GAChB,GAAI2vI,EAKJ,OAHEA,GAAWF,kBADTzvI,EAAKG,KACsBH,EAAKG,KAELH,EAAKgb,MAC7B,UAAY40H,gBAAkB,IAAMD,EAAW,QAAU7uG,WAA+B,IAAjB9gC,EAAKs0B,SAAkB,aAAeu7G,YAAY7vI,EAAKs0B,UAAY,IAAM,OAASt0B,EAAKE,GAAK,OAI5K,QAAS2vI,aAAYC,GAEnB,IAAK,GADDC,GAAK,GAAI32I,EAAI,EACRhW,EAAI,EAAGA,EAAI0sJ,EAAGnmJ,OAAQvG,IAC7BgW,EAAI02I,EAAGhkJ,WAAW1I,GACdgW,EAAI,IACFA,EAAI,OACG,MAALA,EACFA,EAAI,KACU,MAALA,IACTA,EAAI,MAEN22I,GAAM,KAAO32I,EAAI,KAAK2B,SAAS,KAGjCg1I,GAAM,IAAM32I,EAAE2B,SAAS,GAG3B,OAAOg1I,GAGT,QAASC,oBAAmBlhI,GAC1B,MAAOp0B,GAAEyd,IAAI2W,EAAO4gI,UAAU5hJ,KAAK,IAGrC,QAASmrC,eAAcl1C,GACrB,GAAI+qB,MACAmkC,IAqBJ,OAnBwB,mBAAblvD,KACTA,EAAWrJ,EAAE,kBAAkB87B,OAAO,YACf,GAAnBzyB,EAAS4F,SACX5F,EAAWrJ,EAAE,iBAIjBqJ,EAASnI,KAAK,WACZ,GAAI8G,GAAOhI,EAAEmB,MACTuD,EAAKsD,EAAKlH,KAAK,SAAWkH,EAAKlH,KAAK,SAAWkH,EAAK9B,KAAK,MACzDqwC,EAAWvuC,EAAK9B,KAAK,YACrBq5B,EAAOv3B,EAAK9B,KAAK,QAAQgM,aAEb,OAAZqkC,IAAkBA,EAAW,GAEjC,IAAIjxB,IAASE,GAAI9gB,EAAI47B,KAAMf,EAAMqa,SAAUrD,EAAUmG,KAAM10C,EAAK3C,KAAK,kBAAkBuD,OACvFwrB,GAAM1f,KAAK4Q,GACXizC,EAAM7jD,KAAKsgJ,SAAS1vI,OAEbizC,MAAOA,EAAMnlD,KAAK,IAAKghB,MAAOA,GAGzC,QAASmhI,YACPv1J,EAAE,SAASqF,KAAK,MAAMnE,KAAK,WACzBlB,EAAEmB,MAAMN,SAAS,mBAOrB,QAAS20J,WAAUC,GACjB,GAAInsJ,GAAKtJ,EAAE,kBACXsJ,GAAG4D,WAAW5D,EAAG4D,aAAgB,GAAKuoJ,GACtCC,cAAgBjuJ,WAAW,aAAeguJ,EAAO,IAAK,IAExD,QAASE,eAEH31J,EAAEwB,OACNxB,EAAE,qBAAqBoM,MAAM,WAAmBpM,EAAEmB,MAAMP,SAAS,aAAeZ,EAAEmB,MAAMN,SAAS,SAAc,WAAcb,EAAEmB,MAAMV,YAAY,UACjJurB,UAAUqB,MAAM,WACVqhC,wBAA0B1iC,UAAUkE,QAAQviB,QAAQ0mB,QAAQjT,eAAe,gBAC7E4K,UAAUkE,QAAQviB,QAAQ0mB,QAAQuhI,YAAYxyJ,UAMpD,QAAS+uD,mBAAkBtvD,EAAIgzJ,GACzB71J,EAAE6C,GAAIjC,SAAS,aAAei1J,EAChC71J,EAAE6C,GAAIpC,YAAY,YAElBT,EAAE6C,GAAIhC,SAAS,YAGnB,QAASqxD,uBAAsBrvD,GAC7B7C,EAAE6C,GAAI+R,SAASvP,KAAK,OAAOnE,KAAK,WAAcixD,kBAAkBhxD,MAAM,KAIxE,QAAS20J,YAAWC,GAClB,MAAOprJ,MAAK4jD,SAASC,KAAK4/F,WAAW2H,GAIvC,QAASC,gBACP,MAAOrrJ,MAAK4jD,SAASC,KAAKw/F,eAG5B,QAASiI,gBACP,GAAI1yC,GAAYrmF,cAAc,KACb,KAAbqmF,IAAiBA,EAAYoqC,gBACjCloJ,OAAOq7B,KAAK,+BAAiCyiF,EAAW,gBAG1D,QAAS2yC,oBAAmB3yC,GAC1B,GAAIA,GAAYrmF,cAAc,KACb,KAAbqmF,IAAiBA,EAAYC,mBACjC2yC,kBAAkB,WAAY5yC,GAGhC,QAAS6yC,gBAAe7yC,GACtB,GAAIA,GAAYrmF,cAAc,KACb,KAAbqmF,IAAiBA,EAAYC,mBACjC2yC,kBAAkB,OAAQ5yC,GAI5B,QAAS8yC,0BAAyB9yC,GAChC,GAAIA,GAAYrmF,cAAc,KACb,KAAbqmF,IAAiBA,EAAYC,mBACjC2yC,kBAAkB,SAAU5yC,GAK9B,QAAS+yC,cAAan2E,EAAUo2E,EAASh4H,GACvC73B,GAAGkoB,MAAMkE,kBAAkB,aAAaC,OAAO,SAAUC,GACnDA,EACFroB,KAAKwxC,UAAUiB,wBAAwB1qC,KAAK,SAAU0hB,GAChDA,EAAMnlB,OAAS,GAAqB,gBAATmlB,GAC7B1tB,GAAG8L,IAAIxR,KAAK,sCAAwCw1J,QAAUhxI,GAAI26D,EAAU7/C,KAAM,MAAOsZ,SAAU28G,GAAWt7G,MAAO7mB,IAClHoN,QAAQ,SAAUj5B,GAEN,GAAPA,GAAUo2B,eAAe72B,EAAE,qBAAsB,KAE9B,mBAAZy2B,GACTA,IAEOh2B,EAAM,GACbvI,EAAE,cAAcg+B,WAGrB9U,KAAK,SAAUwI,GACd,GAAIuY,GAA+B,OAAnBvY,EAAMwY,SAAoBC,OAAOzY,EAAMwY,UAAY5pB,MACnE5Z,IAAGmE,GAAGylB,WAAWltB,KAAKsuB,EAAOpR,OAAW2pB,KAGnB,GAAhB7V,EAAMnlB,QACb0vB,eAAe72B,EAAE,qBAAsB,OAExCohB,KAAK,SAAUwI,GAChBmN,UAAUnN,KAIS,IAAjBurB,cACFC,qBAAqBD,cAAe,MAEb,mBAAZ1e,IACTC,eAAe12B,EAAE,eAEnB9H,EAAEqhC,MACAt4B,KAAM,OACNw4B,SAAU,OACVD,YAAa,kCACb3b,IAAK,6BACL7kB,KAAM,gBAAkBq/E,EAAW,uBAAyBo2E,EAAU,KACtE1oI,OAAO,EACP2T,QAAS,SAAUj5B,GACZy0B,kBAAkBz0B,KACD,GAAhBA,EAAIoK,EAAEyW,OACe,mBAAZmV,GACTA,IAEAv+B,EAAE,cAAcg+B,SAEK,mBAAZO,IACTI,eAAe72B,EAAE,qBAAsB,YAUzD,QAAS2uJ,kBAAiBt2E,EAAUo2E,EAASh4H,GAC3C,GAAIP,GAA+B,mBAAdsf,YAA4B,GAAKA,UAClB,oBAAZpC,UAA0B,GAAKA,QAEvD,IAAqB,IAAjB+B,cACFC,qBAAqBD,cAAe,SAC/B,CACL,GAAI9pC,GACA43C,EAAS/qD,EAAE,WACX02J,EAAY3rG,EAAO97C,OAAS,GAAK87C,EAAO7kB,GAAG,cAAgB6kB,EAAOnqD,SAAS,YAO7EuS,GANGujJ,IAMIlxI,GAAM,EAAG8a,KAAQ,QALJ,mBAAT2a,OACLsD,gBAAgBnqB,MAEhB6mB,MAMJ9nC,EAAElE,OAAS,EACbmgC,kBACExmC,KAAMd,EAAE,uBAAwBqL,EAAElE,QAClChL,GAAI,WACFu6B,eAAe12B,EAAE,iBACjBorB,YAAY,kCAAoC+nB,MAAO9nC,EAAGgtE,SAAU,EAAYx4D,cAAe4uI,GAAW,SAAUhuJ,GAC9GA,EAAIm2B,SACNn2B,EAAMA,EAAI6gB,OACC,GAAP7gB,GACwB,mBAAd+0C,aAA8B,KACjB,mBAAZ/e,GACTA,IAEAv+B,EAAE,cAAcg+B,UAIK,mBAAdsf,aAA2B3e,eAAe72B,EAAE,yBAA0B,MAGnF62B,eAAep2B,EAAIse,MAAO,QAIhC/gB,OAAQ,KACR1D,MAAO,SAGT86C,qBAAqBp1C,EAAE,wBAAyB,MAQtD,QAAS6uJ,YAAW9zJ,GAClB,GAAIiwE,GAAO9yE,EAAE,QACbA,GAAE,qBAAqByB,OACvBzB,EAAE,0BAA0BoD,OAC5BpD,EAAE,WAAWyB,OACbzB,EAAE,YAAYyB,OACdzB,EAAE,eAAeyB,OACjBqxE,EAAK1vE,OACLpD,EAAE,YAAYyB,OAEdwwD,eAAepvD,GAEf7C,EAAE,mBAAmBU,SACrBV,EAAE,mBAAmBU,SAEvB,QAAS4+H,cAAal0H,EAAMvI,GAC1B7C,EAAE,0BAA0ByB,OAC5BzB,EAAE,qBAAqBoD,OAEvB8uD,sBAAsBrvD,GACtBsvD,kBAAkBtvD,GAClB7C,EAAE,WAAWoD,OACbwzJ,WAAWxrJ,EAAMpL,EAAE,YACnBA,EAAE,SAASyB,OACXzB,EAAE,mBAAmBU,SAEvB,QAASm2J,WAAUh0J,GACjBy8H,aAAa,aAAcz8H,GAC3B7C,EAAE,mBAAmBU,SAEvB,QAASo2J,YAAWj0J,GAClBy8H,aAAa,mBAAoBz8H,GACjC7C,EAAE,mBAAmBU,SAEvB,QAASq2J,YAAWl0J,GAClBy8H,aAAa,cAAez8H,GAC5B7C,EAAE,mBAAmBU,SAEvB,QAASs2J,eAAcn0J,GACrBy8H,aAAa,iBAAkBz8H,GAC/B7C,EAAE,mBAAmBU,SAGvB,QAASu2J,kBAAiBv4G,GACxBA,EAAIjV,WAAWhoC,OACqB,IAAhCi9C,EAAIr5C,KAAK,YAAY4J,QACvByvC,EAAIuL,QAAQ,sFAAwFniD,EAAE,eAAiB,aAEzH42C,EAAIr5C,KAAK,YAAYjC,OAGvB,QAASwzJ,YAAWM,EAAYx4G,GACI,GAA9B1+C,EAAE,IAAMk3J,GAAYjoJ,QACtBgoJ,iBAAiBv4G,GACjB1+C,EAAEqhC,MACAt4B,KAAM,MACNw4B,SAAU,OACV5b,IAAK,iCAAmCuxI,EACxCrpI,OAAO,EACP2T,QAAS,SAAUj5B,GACZy0B,kBAAkBz0B,KACrBm2C,EAAIjV,WAAWhoC,OAEfi9C,EAAIv+C,OAAOoI,GACXvI,EAAE,YAAYyB,OACdzB,EAAE,YAAYU,SACdV,EAAE,mBAAmBU,SACrBy2J,4BAA4BD,IAEX,gBAAfA,GACFtmH,+BAA+B,GAAI,+BAKzC5wC,EAAE,WAAWypC,WAAWhoC,OACxBzB,EAAE,IAAMk3J,GAAY9zJ,OACpB+zJ,4BAA4BD,IAKhC,QAASC,6BAA4BD,GACnCzvJ,WAAW,WACT,GAA2B,gBAAhB,GAA0B,CACnC,GAAI2vJ,GAAUp3J,EAAE,IAAMk3J,GAClBG,EAAYjqJ,eAAiBpN,EAAE,WAAWmF,SAAWnF,EAAE,sBAAsBmF,SAAkD,EAAvCiyJ,EAAQ/xJ,KAAK,eAAeF,SAAyD,EAA1CiyJ,EAAQ/xJ,KAAK,kBAAkBF,SAAe,GACjLmyJ,EAAmBF,EAAQ/xJ,KAAK,qBAChCkyJ,EAAsBH,EAAQ/xJ,KAAK,yBACnCmyJ,EAA2BD,EAAoBpyJ,SAC/CsyJ,EAAwBH,EAAiBnyJ,UACxCsyJ,EAAwBJ,GAAeE,EAAoBpyJ,SAAWsyJ,IACzEH,EAAiBzyJ,KAAMM,OAAQkyJ,EAAWK,eAAgB,QAASC,gBAAiB,OAAQpxJ,SAAY,SAAUqxJ,aAAc,WAE9HJ,GAA4BA,EAA2BH,GACzDC,EAAiBzyJ,KAAMM,OAAQoyJ,EAAoBpyJ,SAAUoB,SAAY,aAG5E,IAGL,QAASsxJ,eACP,GAAIC,GAAW93J,EAAE,yBAAyB4U,SAAS1O,KAAK,KACxCoa,SAAZw3I,IACFX,4BAA4BW,GACX,gBAAbA,GACFlnH,+BAA+B,GAAI,2BAKzC,QAASmnH,eAAc3sJ,EAAMo/B,GAC3B,GAAIvsB,GAAIje,EAAE,cACN2lB,EAAM1H,EAAE/X,KAAK,SACjBs4B,gBAAe12B,EAAE,cACjB6d,EAAMyX,iBAAiBzX,EAAK,aAAcva,GAC1Cua,EAAMyX,iBAAiBzX,EAAK,OAAQ,UACpCA,EAAM0X,iBAAiB1X,EAAK,QAChB,eAARva,IACFua,EAAMyX,iBAAiBzX,EAAK,OAAQ,UAEpCA,EADI6kB,EACEpN,iBAAiBzX,EAAK,OAAQ6kB,GAE9BnN,iBAAiB1X,EAAK,QAE9BA,EAAM0X,iBAAiB1X,EAAK,OAC5BA,EAAM0X,iBAAiB1X,EAAK,WAC5BA,EAAM0X,iBAAiB1X,EAAK,YAC5B1H,EAAE/X,KAAK,SAAUyf,GACjB1H,EAAE+f,SAUJ,QAASg6H,iBAAgBC,EAAYxgG,GACnC,OAAQA,GACN,IAAK,OACHygG,8BAA8BD,EAAY,sBAAuB,sBACjE,MACF,KAAK,MACHC,8BAA8BD,EAAY,wBAAyB,wBACrE,KAAK,OACHC,8BAA8BD,EAAY,yBAA0B,yBACtE,KAAK,MACHC,8BAA8BD,EAAY,wBAAyB,wBACnE,MACF,KAAK,MACHr6H,SAAS,0DAA4Dq6H,EAAa,SAAS,IAajG,QAASC,+BAA8BD,EAAYE,EAAoBC,GAErEp4J,EAAEiwB,KAAKvpB,GAAGqpB,cAAcjG,KAAK,WAC3B9pB,EAAE,IAAMm4J,GAAoB5iH,UAAU8iH,UAAUC,eAAeC,eAAiB,IAAM7xJ,GAAGwpB,QAAQygB,KAAKnrB,GAAI9e,GAAGwpB,QAAQygB,KAAK9V,SAAUn0B,GAAGwpB,QAAQygB,KAAK9V,WAAW,EAG/J,IAAI29H,IAAW,GAAK5iJ,OAAQusB,UAAY,QACpCs2H,EAAW,GAAI7iJ,MAAK4iJ,EAExBx4J,GAAE,WAAWqF,KAAK,aAAe+yJ,EAAuB,KAAKhjJ,IAAI5F,WAAWipJ,IAE5EV,cAAcE,EAAY,eAI9B,QAASS,gBAAe71J,GACtBqvD,sBAAsBrvD,GACtBsvD,kBAAkBtvD,GAElBo0J,iBAAiBj3J,EAAE,YAEnBA,EAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,mCACL7kB,KAAM,KACN0gC,QAAS,SAAUj5B,GACjB,IAAKy0B,kBAAkBz0B,IACjBA,EAAIoK,EAAE+rB,QAAS,CACjB,GAAI0mC,GAAO78D,EAAIoK,EAAEyW,MACjBppB,GAAE,WAAW47D,QACbgiB,SAAS,gBAAiB,WAAa+6E,WAAc7wJ,EAAE,cAAe8wJ,QAAW9wJ,EAAE,aAAcs9D,KAAQA,WAMjHplE,EAAE,SAASyB,OACXzB,EAAE,4BAA4B6E,IAAI,WAAY,WAGhD,QAASg0J,WAAUC,EAAQ1tJ,GACzB,IAAK,GAAI1C,GAAI,EAAG2zB,EAAQy8H,EAAO7pJ,OAAQvG,EAAI2zB,EAAO3zB,IAChD,GAAIowJ,EAAOpwJ,GAAG0C,MAAQA,EAAM,MAAO0tJ,GAAOpwJ,GAAGwX,MAIjD,QAAS64I,sBAAqBz9H,EAASspB,EAAY/hD,GACjD,GAAIurD,GAAgB,WAElB,GAAIzoC,GAAM,4BAA8B2V,EAAU,gCAAkCspB,CACpF,IAAI/hD,GAAM7C,EAAE6C,GAAI/B,KAAK,MAAO,CAC1B,GAAIs9B,GAAKp+B,EAAE6C,GAAI/B,KAAK,KACpB6kB,GAAM4X,WAAW,yBAA2B93B,OAAO6sB,SAASlkB,OAAQuX,GACpEA,EAAM0X,iBAAiB1X,EAAK,WACM,KAA9BA,EAAIgY,OAAOhY,EAAI1W,OAAS,KAC1B0W,EAAMA,EAAIrI,OAAO,EAAGqI,EAAI1W,OAAS,IAC/BmvB,EAAG46H,UACLrzI,GAAO,YAAc+wD,mBAAmBt4C,EAAG46H,UAEzC56H,EAAGtC,SACLnW,GAAO,WAAa+wD,mBAAmBt4C,EAAGtC,SAExCsC,EAAGkc,UACL30B,GAAO,YAAcyY,EAAGkc,SAE1B70C,OAAOq7B,KAAKnb,OAEZiY,UAASjY,EAEX,QAAO,GAGLszI,EAAWj5J,EAAE6C,GAAI/B,KAAK,KAC1B,KAAKm4J,EAEH,MADA7qG,MACO,CAGT,IAAI8qG,GAAWD,EAASC,QAExB,IAAMA,EAAU,CACd,GAAIhuJ,GAAS,GAAI9C,UAAS8wJ,EAE1B,IADAD,EAASnkC,sBAAwB1mE,EAC7BljD,EAAOlK,KAAKi4J,MAAc,EAAO,OAAO,EAI9C,MADA7qG,MACO,EAGT,QAAS+qG,iBAAgB/iH,EAASxhC,GAChCwkJ,uBAAuBhjH,EAASxhC,GAGlC,QAASwkJ,wBAAuBhjH,EAASxhC,EAAQykJ,EAASL,EAASM,EAAqBpO,EAASn8I,GAC/F,GAAIwqJ,GAAc,EAElB,IAAc,MAAV3kJ,EACF,GAAIlO,GAAGmE,GAAGgD,KAAK+a,UAAW,CACxB,GAAI4wI,GAAY9yJ,GAAGmE,GAAGgD,KAAKq6H,wBAAwBtzH,EACnD,IAAkB,OAAd4kJ,EACF,IAAK,GAAIzgI,KAAaryB,IAAGmE,GAAGgD,KAAK6nB,SAASZ,OACxC0kI,EAAY9yJ,GAAGmE,GAAGgD,KAAK6nB,SAASZ,OAAOiE,GAAWmvG,wBAAwBtzH,EAG5D,QAAd4kJ,IACFD,EAAc,WAAaC,EAAU3+H,cAGvC0+H,GAAc,WAAa3kJ,CAGT,oBAAXykJ,KACTA,EAAU,MAES,mBAAVtqJ,KACTA,EAAS,KAEX,IACIu2B,IADSpI,cAAc,UAChB87H,GAAW97H,cAAc,WAIpC,IAFAsB,eAAe12B,EAAE,gBAAgB,GAE7B2xJ,aAAarjH,GAAU,CAEzB,GAAIsjH,GAAQC,gBACZ,IAAID,EAAMzqJ,OAAS,EAAG,CACpB,GAAIpB,GAAO+rJ,wBAAwBF,GAC/B5rJ,EAAS,GAAIpH,IAAGunB,WAAWhH,QAAQ6D,UACvChd,GAAOid,MAAQjjB,EAAE,aACjBgG,EAAO/I,KAAO8I,EAAK7I,SACnB8I,EAAOmlC,oBAAqB,EAC5BnlC,EAAO7J,GAAK,WACVu6B,eAAe12B,EAAE,gBAAgB,GACjC+xJ,aAAahsJ,EAAK+sB,SAAS,gBAC3Bk/H,iBAAiB1jH,EAASijH,EAAS/zH,EAAMi0H,EAAaG,EAAOJ,EAAqBpO,EAASn8I,IAE7FjB,EAAO1K,WAEa,IAAhBs2J,EAAMzqJ,QACR4qJ,aAAaH,EAAM,GAAGl0I,IAExBs0I,iBAAiB1jH,EAASijH,EAAS/zH,EAAMi0H,EAAaG,EAAOJ,EAAqBpO,EAASn8I,OAG7F+qJ,kBAAiB1jH,EAASijH,EAAS/zH,EAAMi0H,EAAa,KAAMD,EAAqBpO,EAASn8I,GAI9F,QAAS6qJ,yBAAwBF,GAI/B,IAAK,GAHDK,GAAKrzJ,GAAGunB,WACRpgB,EAAO,GAAIksJ,GAAGtvI,MAAMC,YAAY,qBAChCsvI,KACKtxJ,EAAI,EAAGA,EAAIgxJ,EAAMzqJ,OAAQvG,IAChCsxJ,EAAeN,EAAMhxJ,GAAG8c,IAAMk0I,EAAMhxJ,GAAGsxC,KAAK3qC,QAAQ,KAAM,SAG5D,OADAxB,GAAK6hH,QAAQ,cAAesqC,GACrBnsJ,EAGT,QAAS4rJ,cAAarjH,GACpB,GAAI6jH,IAAa,CAIjB,OAHA7iH,iBAAgB,gCAAkC1xB,cAAe0wB,GAAW,SAAU7tC,GACpF0xJ,EAAa1xJ,IAER0xJ,EAGT,QAASN,kBACP,GAAID,GAAQ,IAIZ,OAHAtiH,iBAAgB,kCAAoC,SAAU7uC,GAC5DmxJ,EAAQnxJ,IAEHmxJ,EAGT,QAASG,cAAaK,GACpB9iH,gBAAgB,4BAA8B+iH,UAAWD,IAG3D,QAASJ,kBAAiB1jH,EAASijH,EAAS/zH,EAAMi0H,EAAaG,EAAOJ,EAAqBpO,EAASn8I,GAC3E,mBAAZm8I,KACTA,EAAU,MAGU,mBAAXn8I,KACTA,EAAS,MAGXqoC,gBAAgB,qDAAuD1xB,cAAe0wB,EAASgkH,oBAAqBf,EAASgB,oBAAqBnP,EAASoP,WAAYvrJ,GAAU,SAAUxG,GACzL,GAAIA,EAAIm2B,QAAS,CACF,MAATg7H,GAAiBA,EAAMzqJ,OAAS,GAClCmoC,gBAAgB,gCAElB,IAAI6O,GAAQ19C,EAAI6gB,MACZkwI,IAAqBA,EAAoBrzG,EAE7C,IAAIs0G,GAAc,EAElB,IAAyB,qBAArB7zJ,GAAGuE,cAAsC,CAC3C,GAAIuvJ,GAAiBx6J,EAAE,uBAAuBc,KAAK,cAC/C05J,KACFD,EAAc,UAAYtkH,UAAUukH,IAIxC/0J,OAAOq7B,KAAK,uBAAyBslB,UAAY,QAAUC,UAAY,aAAepQ,UAAUG,GAAW,OAAS6P,EAAQ,YAAc3gB,EAAOi1H,EAAchB,EAAa,MAAQtzG,GACpLtnB,qBACK,CACL,GAAIsL,GAA6B,OAAjB1hC,EAAI2hC,SAAoBC,OAAO5hC,EAAI2hC,UAAY5pB,MAC/D5Z,IAAGmE,GAAGylB,WAAWltB,KAAKmF,EAAIse,MAAOvG,OAAW2pB,GAC5CtL,oBAQN,QAAS87H,eAAc/7G,EAAKg8G,EAAOxtI,GACjC,GAAI5jB,EAIFA,GAHG4jB,EAGEltB,EAAE0+C,GAFF1+C,EAAE0+C,GAAK9pC,SAASA,QAGvB,IAAIuwC,GACAw1G,EACAj2J,EAAK4E,EAAGpD,KAAK,MACbq5B,EAAOj2B,EAAGpD,KAAK,QACfk/C,EAAU97C,EAAGw5B,OAAOliC,SAAS,YACjC,KAAKwkD,IACH97C,EAAG+7C,MAAM,WAAa3gD,EAAK,WAAa66B,EAAO,mDAE3Cj2B,EAAGmgC,WAAWx6B,OAAS,EAAK,gBAAkB3F,EAAGmgC,WAAWx6B,OAAS,GAAK,SAAW,IACvF,0BACEyrJ,GAASpxJ,EAAG1I,SAAS,WAAW,CAClC,GAAIg6J,GAAQtxJ,EAAGw5B,MACf83H,GAAM/5J,SAAS,UAInB,GADAskD,EAAQ77C,EAAGw5B,OACPqiB,EAAMjf,GAAG,aAAekf,GAAWl4B,EAAQ,CAC7C,GAAI2tI,GAAS/yJ,EAAE,cAUf,IATAq9C,EAAM/hD,OACDs3J,IACHv1G,EAAMtgD,IAAI,aAAc,UACxBsgD,EAAMtgD,IAAI,iBAAkB,WAG9B81J,EAAQ36J,EAAEmlD,EAAM1b,WAAW,IAC3BkxH,EAAM51J,KAAK,6FAA+F81J,EAAS,WACnHC,cAAcH,EAAOj2J,EAAI66B,EAAM,gBAC1Bm7H,EAAO,CACV,GAAI3sG,GAAM/tD,EAAE0+C,GAAKjV,WAAWpkC,KAAK,MACjCrF,GAAE+tD,GAAK7nD,KAAK,MAAO,mCAErBoD,EAAGzI,SAAS,mBACP,CACL,IAAK65J,EAAO,CACV,GAAI3sG,GAAM/tD,EAAE0+C,GAAKjV,WAAWpkC,KAAK,MACjCrF,GAAE+tD,GAAK7nD,KAAK,MAAO,qCAErBi/C,EAAM1jD,OACN6H,EAAG7I,YAAY,eAEjB6I,EAAGpD,KAAK,gBAAiB,KAG3B,QAAS60J,kBAAiBr8G,GACxB+7G,cAAc/7G,GAAK,GAErB,QAASo8G,eAAcp8G,EAAKh6C,EAAI66B,EAAM+F,GACpCtlC,EAAEqhC,MACAt4B,KAAM,MACNw4B,SAAU,OACV5b,IAAK,kCAAoCjhB,EAAK,SAAW66B,EAAO,SAAW+F,EAC3EzX,OAAO,EACP2T,QAAS,SAAUj5B,GACjB,IAAKy0B,kBAAkBz0B,GAAM,CAC3B,GAAI1F,GAAK67C,EAAI9pC,SAASmuB,MAClBlgC,GAAGjC,SAAS,YACdiC,EAAGpC,YAAY,UACfu6J,yBAAwB,IAE1Bt8G,EAAI35C,KAAKwD,OAKjB,QAAS0yJ,aAAYv8G,EAAKpZ,GACxB,GAAI41H,GAAKl7J,EAAE0+C,GAAK37C,QAAQ,oBAAoB6R,SACxCtL,EAAK4xJ,EAAGtmJ,QACZkmJ,eAAcI,EAAI5xJ,EAAGpD,KAAK,MAAOoD,EAAGpD,KAAK,QAASo/B,GAEpD,QAAS61H,qBAAoBt4J,GAC3B,GAAIyG,GAAKtJ,EAAE6C,GAAIE,QAAQ,cAEnBuG,GAAG1I,SAAS,YACd0I,EAAG7I,YAAY,UAEfgH,WAAW,WACTuzJ,yBAAwB,IACvB,MAWP,QAASA,yBAAwBroJ,GAE/BjM,GAAGmE,GAAG0wC,WAAW2nF,qBAAqBx8H,GAAGmE,GAAG2a,IAAI,GAKlD,QAAS41I,QAAOz1I,EAAKva,EAAMiwJ,EAAaj5J,EAAO+C,GAC7C,IACE,GAAIk2J,EAAa,CACf,GAAI92J,IAAQkB,OAAO61J,OAAOC,WAAan5J,GAAS,EAC5CwB,GAAO6B,OAAO61J,OAAOE,YAAcr2J,GAAU,EAC7Cs2J,EAAQ,QAAUl3J,EAAO,UAAYX,EAAM,YAAcxB,EAAQ,aAAe+C,EAAS,KAC7Fu2J,SAAUj2J,OAAOq7B,KAAKnb,EAAKva,EAAMqwJ,EAAQ,0FAGzCC,SAAUj2J,OAAOq7B,KAAKnb,EAAKva,EAAM,qFAEpB,OAAXswJ,QAAmBA,QAAQhkI,QACxBikI,MAAMC,UACb,MAAOr2J,GAAKo2J,MAAMp2J,EAAEqsB,SACtB,OAAO,EAOT,QAASiqI,cACPj+H,SAAS,gCAAgC,GAE3C,QAASk+H,YACPl+H,SAAS,8BAA8B,GAMzC,QAASm+H,aACPj8H,qBACAS,eAAc,GAGhB,QAASy7H,mBACPl8H,qBACAS,eAAc,GAGhB,QAAS07H,mBAEP,GADAn8H,qBACI,mBAAsB,cAAgC,GAAfo8H,YAAkB,CACjC,GAAtBl8J,EAAE,UAAUiP,QACdjP,EAAE,QAAQG,OAAO,yBAEnB,IAAIiS,GAAM+pJ,eAAeC,QAErBC,EAAUr8J,EAAE,UACb+E,KAAKqN,GACLtE,QACC42F,WAAW,EACXwO,OAAO,EACP6C,UAAU,EACV3zG,MAAO,IACP2oB,MAAOjjB,EAAE,gBACTusB,UAGIzrB,KAAMd,EAAE,WAAY1D,MAAO,WAAcu8B,oBAAoB,GAAI3gC,EAAEmB,MAAM2M,OAAO,YAGhFlF,KAAMd,EAAE,eAAgB1D,MAAO,WAAcu8B,oBAAoB,GAAI3gC,EAAEmB,MAAM2M,OAAO,YAGpFlF,KAAMd,EAAE,QAAS1D,MAAO,WAAcu8B,oBAAoB,GAAI3gC,EAAEmB,MAAM2M,OAAO,YAG7ElF,KAAMd,EAAE,UAAW1D,MAAO,WAAcpE,EAAEmB,MAAM2M,OAAO,aAI/D+nG,oBAAmB,KACnBC,oBAAoBumD,EAAQv5H,YAE5BnC,qBAAoB,MAIxB,QAAS27H,0BACP,GAAIz5J,GAAK7C,EAAE,sCACNA,GAAEwB,MAAqB,GAAbqB,EAAGoM,QAChBpM,EAAG60B,QAQP,QAAS6kI,kBAAiB15J,GACxB+/B,aAAa//B,EAAI,OAAQ,YAE3B,QAAS25J,iBAAgB35J,GACvB+/B,aAAa//B,EAAI,MAAO,YAK1B,QAAS45J,uBACPl5H,wBAAwB,WACtBxD,gBAGJ,QAAS28H,2BACP,GAAI75J,GAAK7C,EAAE,8BACNA,GAAEwB,MAAqB,GAAbqB,EAAGoM,QAChBpM,EAAG60B,QAQP,QAASilI,uBAAsB95J,EAAI+5J,GACjC,GAAIzuJ,GAAMnO,EAAE,cAAgB48J,EACV,IAAdzuJ,EAAIc,OACN2uB,SAAS,UAAYg/H,GAAK,IAE1B58J,EAAE,sBAAsBS,YAAY,8BACpCT,EAAE,kBAAkByB,OAEpBzB,EAAE6C,GAAIhC,SAAS,8BACfsN,EAAI/K,QAIR,QAASy5J,8BAA6BD,GACpCh/H,SAAS,UAAYg/H,GAAK,GAG5B,QAASE,sBAAqBtrH,GAC5B,MAAOxxC,GAAEwxC,GAAK5wC,SAAS,YAGzB,QAASm8J,uBACP,MAAO/8J,GAAE,kBAAkBc,KAAK,UAGlC,QAASk8J,qBACP,MAAOt2J,IAAGmE,GAAG0jE,mBAGf,QAAS0uF,qBACP,MAAOv2J,IAAGmE,GAAG4gI,mBAGf,QAASyxB,yBACP,MAAOx2J,IAAGmE,GAAGswC,QAGf,QAASgiH,gBAAe3rH,EAAK4rH,EAAiBC,GAC5C,QAASC,KACP,GAAIl5I,GAAS,EAab,OAZAgzB,iBAAgB,8BACd1xB,cAAiBhf,GAAGmE,GAAG0jE,mBACvBxlB,iBAAoB,IAAMjhD,EAAE,SAAW,OAASpB,GAAGmE,GAAGswC,QACtD6N,YAAe,GACfC,YAAenhD,EAAE,YACjBohD,aAAgB,EAChBC,gBAAmB,EACnBC,UAAa,EACbC,cAAiB,GAChB,SAAU9gD,GACX6b,EAAS7b,EAAI6gB,OAAO,GAAG6/B,WAAW,GAAGhmB,QAEhC7e,EAGT,IAAK04I,qBAAqBtrH,GAExB,GAAI6rH,EACF32J,GAAGmE,GAAGgD,KAAKm3B,KAAK,SAAU/gC,GACpBA,GAAMm5J,GAAiBA,MAC1B,OACE,CACL5+H,eAAe12B,EAAE,mBACjB9H,EAAE,QAAQupD,QAAQ,eAClB,IAAIg0G,GAAWC,UAAUA,UAAUtgI,cAAc,YAG7CnvB,EAAS,GAAIrH,IAAGygB,IAAI8N,SAAStnB,QAAQ6oB,cAAcgb,EACvDzjC,GAAOk9D,UAEPvkE,GAAGmE,GAAGgD,KAAKm3B,KAAK,SAAU/gC,GAIxB,GAHA8J,EAAOm9D,SAEPvsC,iBACI16B,EAAI,CACN,GAAMwB,OAAOi/B,OACX,GAAM64H,EAAU,CACd,GAAInyJ,GAAOkyJ,GACX73J,QAAOi/B,OAAOr+B,SAASo3J,oBAAoBF,EAAU72J,GAAGmE,GAAGswC,QAAS/vC,OAEpE3F,QAAOi/B,OAAOG,wBAAyB,CAIvCu4H,GACFA,KAGAt9H,qBACAr6B,OAAO6sB,SAASpF,aAGnB,IAgCT,QAASwwI,wBAAuBlsH,EAAK0O,GACnCi9G,eAAe3rH,EAAK,WACd0O,GAAiBA,IAErBz4C,WAAW,WACT,GAAI81J,GAAWC,UAAUA,UAAUtgI,cAAc,WACjD,KAAIz3B,OAAOi/B,QAAuB,MAAZ64H,GAAiC,KAAbA,EASxC72J,GAAGmE,GAAGpF,OAAOu6B,YARb,KACEt5B,GAAGmE,GAAGpF,OAAO6iJ,8BACb5hJ,GAAGmE,GAAGpF,OAAOke,OAAO,eACpBle,OAAOu6B,QACP,MAAOz6B,GACPke,QAAQiO,MAAM1xB,EAAEwkB,OAAOjf,MAK1B,OAIP,QAASo4J,6CAA4Cp/H,GACnD6Y,gBAAgB,qDAAuDhB,QAASp2C,EAAE,YAAYoV,MAAO6wC,MAAO/oB,cAAc,OAAS,SAAU30B,GACvIA,EAAIm2B,SACFH,GAAUA,MAKpB,QAASq/H,qCAAoC51J,EAAMlG,GACjD,GAAIe,GAAKf,EAAK0B,YACV4yC,EAAUvzC,EAAG/B,KAAK,WAClBmlD,EAAQpjD,EAAG/B,KAAK,QACpBkH,GAAKiB,KAAO,uBAAyBm9C,UAAY,QAAUC,UAAY,aAAejQ,EAAU,OAAS6P,EACzGj+C,EAAKV,OAAS,MAAQ8uC,EAAU6P,EAGlC,QAAS43G,qCAAoC71J,EAAMlG,GACjD,GAAIe,GAAKf,EAAK0B,YACV4yC,EAAUvzC,EAAG/B,KAAK,WAClBmlD,EAAQpjD,EAAG/B,KAAK,QACpBkH,GAAKuD,QAAU,WACbuyJ,qBAAqB1nH,EAAS6P,IAKlC,QAAS83G,uCAAsC/1J,EAAMlG,GACnD,GAAIe,GAAKf,EAAK0B,YACV4yC,EAAUvzC,EAAG/B,KAAK,WAClBmlD,EAAQpjD,EAAG/B,KAAK,QAEpBkH,GAAKuD,QAAU,WACbyyJ,6BAA6B5nH,EAAS6P,IAO1C,QAAS+3G,8BAA6B5nH,EAAS6P,GAC7C7P,EAAUA,GAAW1vC,GAAGmE,GAAG0jE,mBAE3Bn/B,kBACExmC,KAAMd,EAAE,yBACRkrC,OAAQlrC,EAAE,OACVy6C,WAAYz6C,EAAE,MACd7D,GAAI,WACFyC,GAAG8L,IAAIiqE,UAAUwD,aAAa7pC,EAAS6P,GAAOzkB,QAAQ,WACpD72B,KAAKskF,KAAKxS,UAAU6b,aACpB7wF,WAAW,WACTf,GAAGmE,GAAG8pB,WAAW3R,KAAK,oBACrB,UAgBX,QAASi7I,sCAAqC5iI,EAAUC,GAEtD8T,kBACExmC,KAAMd,EAAE,yBACRkrC,OAAQlrC,EAAE,OACVy6C,WAAYz6C,EAAE,MACd7D,GAAI,WACF,GAAIukD,GAAgBltB,GAAW50B,GAAGwpB,QAAQq+C,kBAC1C7nE,IAAG8L,IAAIiqE,UAAUwD,aAAaz3B,EAAentB,GAAUmG,QAAQ,WAGpC,qBAArB96B,GAAGuE,eACLN,KAAKskF,KAAKxS,UAAU6b,aACpB3tF,KAAKskF,KAAKxS,UAAUwS,KAAKuqD,sBAErB/zI,OAAOi/B,QAAUj/B,OAAOi/B,OAAO/5B,KAAKskF,KAAKxS,UAAUwS,MACrDxpF,OAAOi/B,OAAO/5B,KAAKskF,KAAKxS,UAAU6b,aAClC7yF,OAAOi/B,OAAO/5B,KAAKskF,KAAKxS,UAAUwS,KAAKuqD,sBAEvC15G,qBACAp5B,GAAGmE,GAAGpF,OAAO6iJ,8BAA8BH,oBAE7CzhJ,GAAGmE,GAAGpF,OAAOu6B,cAUvB,QAASg0H,yBACP,GAAItxJ,GAAQgE,GAAGmE,GAAG8pB,WAAW6lB,kBAC7B,IAAI93C,EAAMuM,OAAS,EAAG,CACpB,GAAIivJ,GAAyC,IAAjBx7J,EAAMuM,OAAgBnH,EAAE,yBAA2BA,EAAE,kCACjFsnC,mBACExmC,KAAMs1J,EACNlrH,OAAQlrC,EAAE,OACVy6C,WAAYz6C,EAAE,MACd7D,GAAI,WACF,GAAIq0C,KACJ51C,GAAMiS,QAAQ,SAAU3M,GACtBswC,EAAU5jC,KAAKhO,GAAG8L,IAAIiqE,UAAUwD,aAAaj4E,EAAKwgD,cAAexgD,EAAKtD,OAIxE1E,EAAEiwB,KAAK/O,MAAMlhB,EAAGs4C,GAAWvlB,OAAO,WAChCpoB,KAAKskF,KAAKxS,UAAU6b,aACpB3tF,KAAKskF,KAAKxS,UAAUwS,KAAKuqD,6BAM/B76G,gBAAe72B,EAAE,wBAAyB,KAI9C,QAASg2J,sBAAqB1nH,EAAS6P,EAAO1nB,GAC5CC,eAAe12B,EAAE,oBACjBsvC,gBAAgB,8BAAgC1xB,cAAe0wB,EAAS+nH,eAAgBl4G,GAAS,SAAU19C,GACzG,GAAIA,EAAIm2B,QAAS,CACI,MAAfn2B,EAAI8kC,SAAkC,IAAf9kC,EAAI8kC,SAC7Bjb,UAAU7pB,EAAI8kC,SAAS,GAEzB1O,eAAe72B,EAAE,4BAA6B,IAC9C,IAAIw9B,GAAOpI,cAAc,UAEzBz3B,QAAOq7B,KAAK,uBAAyBslB,UAAY,QAAUC,UAAY,aAAepQ,UAAUG,GAAW,OAAS7tC,EAAI6gB,OAAS,YAAckc,EAAM,MAAQ/8B,EAAI6gB,YAC5J,CACL,GAAI6gB,GAA6B,OAAjB1hC,EAAI2hC,SAAoBC,OAAO5hC,EAAI2hC,UAAY5pB,MAC/D5Z,IAAGmE,GAAGylB,WAAWltB,KAAKmF,EAAIse,MAAOvG,OAAW2pB,GAC5CtL,eAAe,GAAI,KAEpB,WAAcA,eAAe,GAAI,KAGtC,QAASy/H,oCAAmCn4G,GAC1C,GAAI7P,GAAUp2C,EAAE,YAAYoV,KAC5B0oJ,sBAAqB1nH,EAAS6P,GAGhC,QAASo4G,qBAAoB9H,EAAStwG,GACpCxgD,OAAOw7B,SAAW,WAAcq9H,WAAW/H,EAAStwG,IAGtD,QAASs4G,uBAAsBnsJ,EAAKmkJ,EAAStwG,GAC3Co4G,oBAAoB9H,EAAStwG,EAC7B,KAG4C,UAAtCv/C,GAAGC,IAAI4M,QAAQnI,KAAKiY,eACtBi7I,WAAW/H,EAAStwG,GAEtBlmB,cAEA,MAAO3B,IACT,OAAO,EAET,QAASkgI,YAAW/H,EAAStwG,GAC3B,GAAI3zC,GACA8uB,EAAWvE,YAAYvK,SAASrpB,MAAM,EAa1C,OAZAjJ,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK,6BAA+Byb,EACpCtgC,KAAM,qBAAuBy1J,EAAU,iBAAmBtwG,EAAQ,KAClEr4B,OAAO,EACP4T,QAAS,SAAUj5B,GACjB+J,EAAI/J,EAAIoK,KAGZqqB,kBAAkB1qB,GACXA,EAQT,QAASksJ,uBAAsBpsJ,EAAK+7B,GAClCD,0BAA0BC,EAC1B,KAG4C,UAAtCznC,GAAGC,IAAI4M,QAAQnI,KAAKiY,eACtB+qB,WAAWD,GAEbpO,cAGF,MAAO3B,IACP,OAAO,EAKT,QAASqgI,kBACPz+J,EAAEqG,UAAUpE,GAAG,QAAS,mCAAoC,WAC1DjC,EAAE,kBAAkBqF,KAAK,UAAU5E,YAAY,WAInD,QAASwsB,WAAUpqB,EAAIguB,EAAK6tI,GAC1BA,EAAgBA,IAAiB,CACjC,IAAIC,GAAkB,EAEsB,YAAxCzhI,cAAc,QAAQ7Z,gBACxBs7I,EAAkB,4BAEf3+J,EAAE6C,GAAIjC,SAAS,cAAe89J,GAAe9gI,SAAS+gI,EAAkB,OAAS9tI,GAGxF,QAAShrB,cAAarB,GACpBA,EAAMqB,cAAe,EAAUrB,EAAMjE,iBAAiBiE,EAAMjE,kBAQ9D,QAASqtD,6BAA4B5lD,EAAM02C,GACzC,GAAIiP,GAAY,EAWhB,OAV6B,mBAAlB3lD,GAAK2lD,YACdA,EAAY3lD,EAAK2lD,WAAa3lD,EAAK2lD,UAAUphD,QAAQ,OAAQ,EAAK,IAAM,KACxEohD,GAAa,OAASvH,UAEN,OAAZ1H,EAAInf,OAAeouB,GAAa,aAAejP,EAAI7E,SACvC,OAAZ6E,EAAInf,OAAeouB,GAAa,UAAYjP,EAAIh6C,GAAK,IAAMw4B,cAAc,UAC5D,OAAZwhB,EAAInf,MAA6B,QAAZmf,EAAInf,MAAoBrC,cAAc,UAAWywB,GAAa,WAAajnD,GAAGmE,GAAGswC,SAC3GwS,GAAa,OAASjP,EAAIh6C,GAC1BipD,GAAa,QAAUtH,WAElBsH,EAGT,QAASlC,eAAcmzG,EAAUnnG,GAE/B,GAAIrK,GAAOV,oBAAoB+K,EAC/B,IAAIrK,GAAQA,EAAK1qD,MAAMuM,OAAS,EAAG,CACjC,GAAe,aAAXwoD,EAAwB,MAAOonG,iBAAgBD,EAAUnnG,EAG7D,KAFA,GACIzvD,GADA4hB,EAAS,EAENwjC,EAAK1qD,MAAMknB,GAAQxI,eAAe,aAAa,CACpD,GAAI,GAAKhZ,UAAS,UAAYglD,EAAK1qD,MAAMknB,GAAkB,SAAI,SAAW,CACxE5hB,EAAOolD,EAAK1qD,MAAMknB,EAClB,OAEGA,IAEP5hB,EAAOolD,EAAK1qD,MAAMknB,GAClBk1I,YAAY92J,EAAM42J,GAEpB,OAAO,EAGT,QAASC,iBAAgBD,EAAUnnG,GACjC,GAAIrK,GAAOV,oBAAoB+K,EAC/B,IAAIrK,GAAQA,EAAK1qD,MAAMuM,OAAS,EAAG,CAEjC,IAAK,GADDm/C,GACK1lD,EAAI,EAAGA,EAAI0kD,EAAK1qD,MAAMuM,OAAQvG,IAAK,CAK1C,GAAIq2J,GAAuBrsH,oBACvBssH,GAAyBt4J,GAAGkoB,MAAM6jB,aAKtC,IAJIusH,GAAkD,YAAxBD,IAC5BA,EAAuB,WAGrB3xG,EAAK1qD,MAAMgG,GAAGhE,GAAG2e,eAAiB07I,EAAsB,CAC1D3wG,EAAgBhB,EAAK1qD,MAAMgG,EAC3B,QAIJo2J,YAAY1wG,EAAewwG,GAE7B,OAAO,EAGT,QAASE,aAAY92J,EAAM42J,GACzB,GAAI32J,GAAQilD,qBAAqBltD,EAAE4+J,GAAU77J,QAAQ,eAErD,IAA6B,mBAAlBiF,GAAK2lD,UAA0B,CACxCA,UAAYC,4BAA4B5lD,EAAMC,EAC9C,IAAIo4B,GAAOnD,cAAc,QACrB+hI,EAA+B,YAApBv4J,GAAGuE,gBAAwC,UAARo1B,GAA4B,YAARA,EACtE56B,QAAOq7B,KAAK6sB,UAAgC,QAApB3lD,EAAKgmD,aAAyBixG,GAAgC,YAApBv4J,GAAGuE,cAA+BhD,EAAMs3B,KAAOt3B,EAAMvD,GAAM,SAI/H,GAAqB,aAAjBsD,EAAKG,SAAyB,CAChC,GAAI8V,GAAI,GAAI7V,UAAS,2BAA4BJ,EAAKG,SACtD8V,GAAEjd,KAAKiH,EAAOjI,EAAE4+J,KAMpB,QAASM,+BAA8BppI,GACrCqpI,6BAA6BrpI,EAAQ,GAEvC,QAASspI,+BAA8BtpI,GACrCqpI,6BAA6BrpI,EAAQ,GAEvC,QAASupI,gCAA+BvpI,GACtCqpI,6BAA6BrpI,EAAQ,GAEvC,QAASqpI,8BAA6BrpI,EAAQwpI,GAC5CC,YAAc,GAAIpwJ,OAAM,GACxBowJ,YAAY,IAAM,iBAAkB,qBAAsB,yBAA0B,2BACpFA,YAAY,IAAM,mBAAoB,uBAAwB,2BAA4B,4BAC1F,IAAI/tH,GAAMxxC,EAAE81B,EACZ,KAAK3X,EAAI,EAAGA,EAAIohJ,YAAYtwJ,OAAQkP,IAClC,GAAIqzB,EAAIviC,OAAS,GAAKuiC,EAAI,GAAGn9B,UAAU9H,QAAQgzJ,YAAYphJ,GAAG,MAAO,EAAI,CACvEqhJ,4BAA4BhuH,GAAK3wC,SAAS0+J,YAAYphJ,GAAGmhJ,GACzD,QAIN,QAASE,6BAA4BhuH,GACnC,MAAOA,GAAI/wC,YAAY,SAAUg6D,EAAO7G,GACtC,GAAI6rG,GAAM,GAAIpgJ,QAAO,YAAa,KAC9B69F,EAAUtpD,EAAQ8rG,MAAMD,EAC5B,OAAQviD,GAAQ9pG,KAAK,OAGzB,QAASusJ,YAAW98J,EAAI+8J,GACtB/8J,EAAGwR,UAAYurJ,EAEjB,QAASC,wBAAuB/pI,GAC9B,GAAI0b,GAAMxxC,EAAE81B,EACZ,IAAI0b,EAAIviC,OAAS,EAAG,CACduiC,EAAI,GAAGn9B,UAAU9H,QAAQ,sBAAuB,EAClDizJ,4BAA4BhuH,GAAK3wC,SAAS,sBAE1C2+J,4BAA4BhuH,GAAK3wC,SAAS,uBAE5C,IAAI6D,GAAKoxB,EAAOpxB,GACZ1B,EAAQ0B,EAAG6H,QAAQ,IACvBvM,GAAE,qBAAuB0E,EAAG4Y,OAAOta,EAAO0B,EAAGuK,OAASjM,GAAS,MAAMd,UAGzE,QAAS49J,0BAAyBhqI,GAChC,GAAI0b,GAAMxxC,EAAE81B,GACRiqI,EAAWvuH,EAAIzuC,QAAQ,aACvBqxH,EAAW5iF,EAAInsC,KAAK,QAED,GAAnB+uH,EAASnlH,QAAeuiC,EAAI5wC,SAAS,kBAAoB4wC,EAAI5wC,SAAS,mBACjD,GAAnBwzH,EAASnlH,OACXuiC,EAAIgvF,YAAY,gBAAgBA,YAAY,iBAER,YAAhCpM,EAASluH,KAAK,cAChBkuH,EAASluH,KAAK,aAAc,aAE5BkuH,EAASluH,KAAK,aAAc;AAGhC65J,EAASt2H,SAAS,OAAOvoC,KAAK,WAC5B,GAAIgjB,GAAKlkB,EAAEmB,KAEc,SAArB+iB,EAAGrf,IAAI,WACT7E,EAAEkkB,GAAIpjB,KAAK,aAAcojB,EAAGrf,IAAI,YAAYA,IAAI,UAAW,QAEtD7E,EAAEkkB,GAAIpjB,KAAK,cACXojB,EAAGrf,IAAI,UAAW7E,EAAEkkB,GAAIpjB,KAAK,eADHojB,EAAGrf,IAAI,UAAW,YAsuBzD,QAASqoD,sBAAqB5jD,GAC5B,GAAIo1C,GAAM1+C,EAAEsJ,GACRuwC,EAA0C,mBAAxB6E,GAAIx4C,KAAK,YAA6B,GAAKw4C,EAAIx4C,KAAK,WAC1E,QAASxB,GAAIg6C,EAAI59C,KAAK,SAAW49C,EAAI59C,KAAK,SAAW49C,EAAIx4C,KAAK,MAAOq5B,KAAMmf,EAAIx4C,KAAK,QAAQmd,cAAew2B,QAASA,EAASvwC,GAAIo1C,GAGnI,QAASshH,kBAAiBthH,EAAK/7C,GAC7B,GAAIqI,GAAO+pJ,kBAAkBr2G,EAAInf,MAE7Bg7H,EAAc,EAElB,IAAyB,qBAArB7zJ,GAAGuE,cAAsC,CAC3C,GAAIuvJ,GAAiBx6J,EAAE,uBAAuBc,KAAK,cAC/C05J,KACFD,EAAc,UAAYtkH,UAAUukH,IAIxC,GAAI70I,GAAM3a,EAAO,SAAWo7C,UAC1B,QAAUC,UACV,OAAS3H,EAAIh6C,IACA,OAAZg6C,EAAInf,KAAgB,aAAe,KACnCmf,EAAI7E,QAAU,aAAe5D,UAAUyI,EAAI7E,UACzC6E,EAAIs6G,QAAU,YAAc/iH,UAAUyI,EAAIs6G,SAAW,IAAM,IAC9DuB,GACC53J,EAAU,IAAMA,EAAU,GAC7B,OAAOgjB,GAIT,QAASguI,gBAAej1G,EAAK/7C,GAC3B8C,OAAOq7B,KAAKk/H,iBAAiBthH,EAAK/7C,GAAU+7C,EAAInf,KAAOmf,EAAIh6C,IAI7D,QAASu7J,YAAWvhH,GAClB,GACIwhH,GADA/0G,EAAQzM,EAAIp1C,EAGhB,IAAKo1C,EAAIrE,MAAU8Q,IAASA,EAAMvqD,SAAS,QAUzCs/J,EAAgBxhH,EAAIrE,KAAK9qC,QAV0B,CAEnD,GAAI4wJ,GAAajjI,cAAc,SAC3BmD,EAAOnD,cAAc,OACzBgjI,GAAgBxhH,EAAIh6C,GAAK,IACN,KAAfy7J,GAA8B,aAAT9/H,GAAgC,WAATA,IAC9C6/H,GAAiBC,GAQrB,GAAIp9B,GAAQ,EACU,MAAlBm9B,IACFn9B,EAAQ,UAAYm9B,EAEtB,IAAIv6I,GAAM,sBAAwBygC,UAAY,QAAUC,UAAY,OAAS3H,EAAIh6C,EAEjF,IAAyB,aAArBgC,GAAGuE,eAAqD,WAArBvE,GAAGuE,eAGxC,GAFA0a,GAAOo9G,GAEFr8H,GAAGmE,GAAG0wC,WAAWunF,mBAAqBp8H,GAAGmE,GAAG0wC,WAAWunF,iBAAiBo9B,GAAe,GAAO,CACjG,GAAIE,GAAcj1G,EAAM9lD,KAAK,eAAeuD,OAExC2kB,GACFxkB,KAAM,WACNsmC,SAAUqP,EAAIh6C,GACdqmB,MAAOq1I,EACP7tI,KAAM2tI,EACN99B,UAAU,EACVE,cAAc,EAGhB57H,IAAG8nB,QAAQmsD,UAAUptD,EAAO6yI,EAAaz6I,QAG3ClgB,QAAOq7B,KAAKnb,EAAK,UAKrB,QAAS06I,kBAAiB3hH,EAAK4hH,EAAWC,GACnCvgK,EAAEswI,QAAQ5xF,KACbA,GAAOA,GAET,IAAI8hH,GAAS9pF,mBAAmB12E,EAAEwkB,OAAOxkB,EAAEyd,IAAIihC,EAAK,SAAU7gC,GAAK,MAAOA,GAAEg8B,UAAYh8B,EAAEnZ,GAAImZ,EAAE0hB,KAAM1hB,EAAEg8B,YAAch8B,EAAEnZ,GAAImZ,EAAE0hB,WAC1H21E,EAAMzvG,OAAOq7B,KAAK,iBAAmBslB,UAAY,QAAUC,UAAY,QAAUm6G,EAAS,0BAA4BtjI,cAAc,MAAQ,cAAgBw5C,mBAAmB4pF,GACnL,IAAIC,EAAS,CAEX,GAAIE,GAAa,WACfzgK,EAAE,8CAA+Ck1G,EAAI7uG,UAAU+O,IAAImrJ,GAASh3G,QAAQ,WAGlFh2C,EAAU7M,GAAGC,IAAI4M,QAAQnI,KAAKiY,aAClB,WAAZ9P,GAAmC,OAAZA,EACzBvT,EAAEk1G,EAAI7uG,UAAUgnB,MAAM,WACpB5lB,WAAWg5J,EAAY,OAIzBvrD,EAAIwrD,OAASD,GAMnB,QAASE,mBAAkBjiH,GACzB,GAAI/4B,GAAM,oBAA2B+4B,EAAIh6C,GAAK,YAAcg6C,EAAInf,MAAQmf,EAAI7E,QAAU,YAAc6E,EAAI7E,QAAU,GAC9G,mBAAkBrN,KAAKla,SAASE,UAClCoL,SAASjY,GAAK,GAEdlgB,OAAOq7B,KAAK,iBAAmBnb,GAKnC,QAASi7I,qBAAoBliH,GAC3B,GAAImiH,GAAYniH,EAAInf,KAAKlc,aACzB,IAAkB,SAAdw9I,GAAsC,QAAdA,EAE1BlN,eAAej1G,EAAK,0BACf,CAEL,GAAI/4B,GAAM,0BAAiC+4B,EAAIh6C,GAAK,YAAcg6C,EAAInf,MAAQmf,EAAI7E,QAAU,YAAc6E,EAAI7E,QAAU,GACpH,mBAAkBrN,KAAKla,SAASE,UAClCoL,SAASjY,GAAK,GAEdlgB,OAAOq7B,KAAK,iBAAmBnb,IAMrC,QAASm7I,aAAYpiH,GACnBzC,UAAUyC,GAAK,GAIjB,QAASqiH,eAAcriH,EAAKsiH,EAA0BziI,EAAUnsB,GAC9D,GAAI9I,GAAKo1C,EAAIp1C,EACI,oBAANA,KACTA,EAAKtJ,EAAEghK,GAA0Bj+J,QAAQ,SAE3C,IAAIk+J,GAAS33J,EAAGvG,QAAQ,iBACxB,IAAIk+J,EAAOhyJ,OACX,CACE,GAAIvK,GAAKu8J,EAAO/6J,KAAK,KAGrB8lD,eAActnD,GAAIg2D,WAAWhc,EAAKngB,EAAUnsB,OAEpB,aAApB1L,GAAGuE,cACLwrJ,iBAAiB,GAAK/vJ,GAAGwpB,QAAQirB,QAASz0C,GAAGwpB,QAAQq+C,oBAE7B,aAApB7nE,GAAGuE,cACLwrJ,iBAAiB,GAAK/vJ,GAAGwpB,QAAQirB,QAASz0C,GAAGwpB,QAAQq+C,oBAErDlxB,YAAY,KAAO73B,GAAIk5B,EAAIh6C,GAAI47B,KAAMoe,EAAInf,KAAMqa,SAAU8E,EAAI7E,SAAW,MAOhF,QAASqnH,mBAIP,MAHsC,IAAlClhK,EAAE,sBAAsBiP,QAC1BjP,EAAE,QAAQG,OAAO,0PAEZH,EAAE,sBAAsB,GAIjC,QAASmhK,kBAAiBvgJ,GACxB,MAAO,YACL,IACE,MAAOA,GAAKM,MAAM/f,KAAM6N,WACxB,MAAOovB,GACPO,eAAe72B,EAAE,YAA0B,gBAANs2B,GAAiBA,EAAGxM,QAAUwM,EAAG/d,YAAa,OAMzF,QAAS+gJ,gBAAeC,EAAUhjG,GAChC,QAASvb,KACP5vB,YAAY,+BAAiCouI,IAAKD,GAAY,SAAU94J,GAClEA,EAAIm2B,SACNj3B,WAAWq7C,EAAQub,KAGzB52D,WAAWq7C,EAAQub,GAIrB,QAASkjG,sBAAqBC,EAAYnjG,GACxC,QAASvb,KACP5vB,YAAY,sCAAwCuuI,SAAUD,GAAc,SAAUj5J,GAChFA,EAAIm2B,SACNj3B,WAAWq7C,EAAQub,KAIzB52D,WAAWq7C,EAAQub,GAOrB,QAASqjG,eAAc7nH,GACN,MAAXA,IACFA,EAAU75C,EAAE,YAAYoV,OAEX,MAAXykC,GAA8B,IAAXA,GACrBp0C,OAAOq7B,KAAK,sBAAwBslB,UAAY,QAAUC,UAAY,6BAA+BpQ,UAAU4D,GAAW,gBAAiB,UAM/I,QAAS8nH,cAAavvJ,EAAKwvJ,GACzB,GAAI97E,GAAO,SAAUl0D,GACU,GAAzB5xB,EAAE,aAAaiP,QAEjBmgC,kBAAmBxmC,KAAMgpB,EAASxvB,MAAO,IAAK+C,OAAQ,QAAU,WAC9DuB,GAAGgsB,WAILhsB,IAAGkoB,MAAMiE,uBACXnsB,GAAGkoB,MAAMkE,kBAAkB,cAAcpgB,KAAK,SAAU+/B,GAClDA,GACF/rC,GAAGkoB,MAAMoY,gBAAgB,wBAAyB,iBAAkBt0B,KAAK,SAAU0V,GAC7EA,EAAShE,SACXhS,EAAMtK,EAAE,iDAIbirB,OAAO,WACR+yD,EAAK1zE,KAGP0zE,EAAK1zE,GAKT,QAASsgB,UACP1yB,EAAE,QAAQG,OAAO,sHACjBH,EAAE4yB,OAAO,OAAQ,MAEjBjoB,KAAKikB,MAAMikB,YAAYngC,KAAK,SAAU+gB,GACpCzH,UAAU4C,MAAMoY,gBAAgB,wBAAyB,iBAAkBt0B,KAAK,SAAU0V,GACpFA,EAAShE,SACXpkB,EAAE4yB,OAAO,QAAS,MAClB5yB,EAAE4yB,OAAO,iBAAkB,MAC3BM,YAAY,+BAAiC,WAAcztB,OAAO6sB,SAAW,oBAGhFpJ,KAAK,WAEN8C,UAAU4C,MAAMqE,aAGhBjzB,EAAE,YAAYoV,IAAI,WAClBpV,EAAE,aAAag+B,WAKnB,QAAS6jI,WAAUC,GACjB,OAAO,EAiCT,QAASC,4CACH/hK,EAAE,2BAA2BkmC,GAAG,aAAelmC,EAAE,wBAAwBkmC,GAAG,YAE9ElmC,EAAE,6DAA6DkG,KAAK,WAAY,YAAY48B,KAAK,SAASjiC,SAAS,kBAGnHb,EAAE,6DAA6DkG,KAAK,YAAY,GAAO48B,KAAK,SAASriC,YAAY,kBAIrH,QAASuhK,gDAA+CC,GAClDjiK,EAAEiiK,GAAO/7H,GAAG,YACdv7B,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChDsuI,6CACC74I,KAAK,WACNg5I,yBAA2B,WACzBl2I,UAAU4C,MAAM8X,OAChB1a,UAAU4C,MAAMrD,WAKpB22I,yBAA2B,KAM/B,QAASC,0BAAyBp3I,EAAOpF,GACzB,KAAVoF,GAAwB,KAARpF,IAClBy8I,oBACEx5J,KAAMmiB,EACNxf,QAAS,WACP9F,OAAOq7B,KAAKnb,MAMpB,QAAS08I,qBAAoBC,GAEvB33J,KAAK4jD,SAASC,KAAK/E,iBAAmB9+C,KAAK4jD,SAASC,KAAK+zG,0BAC3DviK,EAAE,0BAA0ByB,OAC5BzB,EAAE,qBAAqBoD,SAEvBpD,EAAE,qBAAqByB,OACvBzB,EAAE,0BAA0BoD,QAsDhC,QAASw7B,aAAYh2B,EAAMmiB,EAAO9mB,EAAI29G,EAAYx/G,EAAOqkC,EAASq1C,GAChE/wD,EAAQA,GAAS,EACjB,IAAIy3I,GAAS,KACTpnI,GACFrQ,MAAOA,EACP25E,WAAW,EACXwO,OAAO,EACP6C,UAAU,EACV1hF,UAEIzrB,KAAMg5G,GAAc95G,EAAE,MACtB1D,MAAO,WAAcpE,EAAEmB,MAAM2M,OAAO,SAAc00J,GAAQA,OAG9DpgK,MAAOA,GAAS,IAChB49B,MAAO,WAAkByG,GAASA,IAAWg8H,qBAE3CziK,GAAEuzB,cAActvB,GAClBjE,EAAE4C,OAAOw4B,EAAUn3B,GAEnBu+J,EAASv+J,CAGX,IAAIy+J,GAAU,GAAIrzF,EAAY,EAC1ByM,MAAY,IACd4mF,EAAU,iBACVrzF,EAAY,QAEVyM,KAAY,IACd4mF,EAAU,qBACVrzF,EAAY,OAGd,IAAIszF,EAEFA,GADc,KAAZD,EACQ,eAAiBA,EAAU,4DAA8DrzF,EAAY,yFAA2FzmE,EAAO,aAEvMA,CAGZ,IAAIL,GAAMvI,EAAE,WAAa+E,KAAM49J,IAAW70J,OAAOstB,EACjDy6E,oBAAmBz6E,EAASh5B,OAC5B0zG,oBAAoBvtG,EAAIu6B,QAK1B,QAASjE,WAAUj2B,EAAMg6J,EAASxgK,EAAOqkC,GACvC,GAAI0C,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UAC9BD,GAAK/mC,MAAUA,EAAQA,EAAQ,IAC/B+mC,EAAK24E,SAAS8gD,GACdz5H,EAAK8G,UAAUrnC,EAAM,KAAMd,EAAE,SAAU2+B,GAWzC,QAAS6d,aAAY17C,EAAMg6J,EAASxgK,EAAOqkC,GACzC,GAAI0C,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UAC9BD,GAAK/mC,MAAUA,EAAQA,EAAQ,IAC/B+mC,EAAK24E,SAAS8gD,GACdz5H,EAAK3E,YAAY57B,EAAM,KAAMd,EAAE,WAAY,KAAM2+B,GAenD,QAASiB,UAAS9+B,EAAMmiB,EAAO3oB,EAAO+C,EAAQshC,GAC5C,GAAI0C,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UAC1BhnC,KAAO+mC,EAAK/mC,MAAQA,GACpB+C,IAAQgkC,EAAKhkC,OAASA,GAC1BgkC,EAAKi5E,SAASx5G,EAAM,KAAMmiB,EAAO0b,GASnC,QAASsM,eAAcnqC,EAAM3E,EAAI6B,GAC/B,GAAIs1B,IACFrQ,MAAOjjB,EAAE,gBACTc,KAAM,GACNoqC,OAAQlrC,EAAE,OACVy6C,WAAYz6C,EAAE,MACd7D,GAAI,aACJ6B,OAAQ,aACR4+F,WAAW,EACXwO,OAAO,EACPC,SAAS,EACT3vD,OAAQ,aACRlB,gBAAgB,EAChBrP,oBAAoB,EAElBjzC,GAAEuzB,cAAc3qB,GAClB5I,EAAE4C,OAAOw4B,EAAUxyB,GAEnBwyB,EAASxyB,KAAOA,EAEd3E,IAAIm3B,EAASn3B,GAAKA,GAClB6B,IAAQs1B,EAASt1B,OAASA,EAE9B,IAAIgtG,KACA13E,GAASknB,gBACXwwD,EAAmBp+F,MACjB9L,KAAMwyB,EAAS4X,OACf5uC,MAAO,WAAkBg3B,EAASn3B,GAAG9C,SAAU,IAAoBnB,EAAEmB,MAAM2M,OAAO,SAAU9N,EAAEmB,MAAM0wC,WACpGy1B,MAAS,YAGTlsC,EAAS6X,oBACX6/D,EAAmBp+F,MACjB9L,KAAMwyB,EAASmnB,WACfn+C,MAAO,WAAkBg3B,EAASt1B,OAAO3E,SAAU,IAAoBnB,EAAEmB,MAAM2M,OAAO,SAAU9N,EAAEmB,MAAM0wC,YAK5G,IAAItpC,GAAMvI,EAAE,WAAa+E,KAAMq2B,EAASxyB,OAAQkF,QAC9CnC,OAAQ,IACRof,MAAOqQ,EAASrQ,MAChB25E,UAAWtpE,EAASspE,UACpBv/F,OAAQi2B,EAASj2B,OACjB/C,MAAOg5B,EAASh5B,MAChB8wG,MAAO93E,EAAS83E,MAChBpyE,KAAM,WACJvxB,IAAIo/F,SAAS,WACbt7F,gBACI+nB,EAASooB,QAAQpoB,EAASooB,UAEhCuyD,UAAU,EACV/1E,MAAO,WAAczwB,IAAIo/F,SAAS,UAAevzE,EAAS4E,OAAO5E,EAAS4E,QAASyiI,qBACnFpuI,QAASy+E,GAEX+C,oBAAmBz6E,EAASh5B,MAC5B,IAAIiyB,GAAU9rB,EAAIu6B,MACd1H,GAAS+3E,SACX5qG,EAAIxF,QAAQ,cAAcsC,KAAK,gCAAgCu+C,MAAM,SAAUtjD,GAC3D,IAAdA,EAAGqjD,SAA+B,IAAdrjD,EAAGqjD,SACzB3jD,EAAEmB,MAAMiD,UAId0xG,oBAAoBzhF,GACpBwuI,qBAAqBt6J,GASvB,QAAS6mC,kBAAiBxmC,EAAM3E,EAAI6B,GAClC,GAAIs1B,IACFxyB,KAAM,GACN3E,GAAIA,EACJ6B,OAAQA,EACRk6B,MAAO,aACP59B,MAAO,GACP+C,OAAQ,GAENnF,GAAEuzB,cAAc3qB,GAClB5I,EAAE4C,OAAOw4B,EAAUxyB,GAEnBwyB,EAASxyB,KAAOA,CAElB,IAAIugC,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UAC1BhO,GAASh5B,QAAO+mC,EAAK/mC,MAAQg5B,EAASh5B,OACtCg5B,EAASj2B,SAAQgkC,EAAKhkC,OAASi2B,EAASj2B,QAC5CgkC,EAAK1C,QAAUrL,EAAS4E,MACxBmJ,EAAK6X,aAAa5lB,EAASn3B,GAAIm3B,EAASt1B,QACxCqjC,EAAKO,aAAatO,EAASxyB,MAI7B,QAASk6J,YAAW/9J,EAAMd,EAAI6B,GAC5B,GAAIs1B,IACFxyB,KAAM7D,EACNd,GAAIA,EACJ6B,OAAQA,EACR1D,MAAO,IAELpC,GAAEuzB,cAAcxuB,KACdA,EAAKA,OACPA,EAAK6D,KAAO7D,EAAKA,WACVA,GAAKA,MAEd/E,EAAE4C,OAAOw4B,EAAUr2B,IAErBguC,cAAc3X,GAIhB,QAAS2nI,qBACP,GAAIC,GAAOhjK,EAAE,yBACb,IAAIgjK,EAAK/zJ,OAAQ,CACf,GAAI3G,GAAOtI,EAAE,OACbgjK,GAAK79J,OAAOmD,EAAKnD,SAAW69J,EAAK18J,WAAW1C,IAAM,KAMtD,QAASq/J,kBAAiBC,EAAUj1E,EAAUhiC,EAAU7wB,GACtD,GAAuB,gBAAZ8nI,GACT,GAAIC,GAAOnjK,EAAE,IAAMkjK,OAEnB,IAAIC,GAAOnjK,EAAEkjK,EAIfljK,GAAE0P,WAAW0zJ,YAAYpjK,EAAE0P,WAAWE,SAASC,qBAC/C7P,EAAEiQ,WAAWmzJ,YAAYpjK,EAAEiQ,WAAWL,SAASC,oBAE/C,IAAIwzJ,IAAY,CAGhBjoI,GAAWp7B,EAAE4C,QACX0gK,WAAY,SAAU3/F,EAAO4/F,GAC3B,GAAI5wJ,GAAIwwJ,EAAKj9J,KAAK,YAAc,OAAS,MACzCuB,YAAW,WACTzH,EAAE,sBAAsB6E,IAAI,UAAW8N,IACtC,KAEL6wJ,SAAU,SAAU7wJ,EAAGjD,EAAY+zJ,GACjC,GAAI9/F,GAASj0D,EAAWi0D,OAASj0D,EAAWg0J,MAExCz1E,IACFxmF,WACE,WACEzH,EAAE,8BAA8BsjB,KAAK,QAAS,WAAcqgD,EAAMj0D,WAAW,WAC5E,GAIH/E,KAAKC,oBACPlE,GAAGmE,GAAGC,WAAWC,OACfC,KAAMtE,GAAGuE,cACTC,OAAQ,aACRG,KAAO4iF,EAAW,iBAAmB,aACrC3mF,OAAqC,mBAArBoI,GAAWi0D,MAAwBj0D,EAAWi0D,MAAMr4D,IAAI,GAAK,KAG7EtL,EAAE8jB,WAAWmoC,IACfA,EAAS/qC,MAAM/f,KAAM6N,WAEnBy0J,KAAsB,GAAqC,mBAArB/zJ,GAAWi0D,OACnDA,EAAMpa,QAAQ,WAKlB9iB,QAAS,SAAUk9H,EAAUJ,GACtBF,IACHA,GAAY,EAGZO,aAAaL,EAAK5/F,OAClB0/F,GAAY,KAIfjoI,GAEC6yD,GACF7yD,EAAWp7B,EAAE4C,QACXihK,OAAQ,SACRC,iBAAiB,EACjBliD,WAAY,IACXxmF,GAEH+nI,EAAKY,eAAe3oI,KAEpBA,EAAWp7B,EAAE4C,QACXihK,OAAQ,SACRG,iBAAiB,GAChB5oI,GACH+nI,EAAKzzJ,WAAW0rB,IAGlB+nI,EAAKlhK,GAAG,+BAAgC,WACjCkhK,EAAKviK,SAAS,iBAAoBuiK,EAAKzzJ,WAAW,UAAUw2B,GAAG,aAAa09H,aAAaT,KAC7FlhK,GAAG,kCAAmC,SAAU3B,GACjD,GAAIiP,GAAMjP,EAAGgrD,OAAShrD,EAAGqjD,OAEb,MAARp0C,IACFq0J,aAAa5jK,EAAEmB,OAEfgiK,EAAK55G,QAAQ,aAIjB45G,EAAKtiK,SAAS,UAAU0oD,QAAQ,QAGlC,QAASq6G,cAAazuJ,GACpB,QAAS4zF,GAAQt5F,GACf0F,EAAIzF,WAAW,UAAWD,GAC1B0F,EAAIrU,KAAK,UAAW2O,GAGtB,GAAIkD,GAAI1B,cAAckE,EACtB4zF,GAAQp2F,GAIV,QAAS4D,WAAU0tJ,EAAS5zJ,GAC1B,GAAIvD,IAAI,EACJqE,GAAI,EACJ7B,GAAI,EACJU,EAAOi0J,EAAQ,GAAG7zJ,MAAM,KACxB8zJ,EAAwB,GAAlBD,EAAQh1J,OAAcg1J,EAAQ,GAAK,GAEzCxtF,EAAK,GAAIp3D,QAAO,6BAqBpB,OAnBAvS,GAAIlB,SAASoE,EAAKK,EAAW9D,QAAQ,MAAO,IAC5C4E,EAAIvF,SAASoE,EAAKK,EAAW9D,QAAQ,MAAO,IAC5C+C,EAAI1D,SAASoE,EAAKK,EAAW9D,QAAQ,MAAO,IAGvCkqE,EAAGjqC,KAAK03H,KACXA,EAAK,MAEPp3J,EAAKA,GAAK,GAAKA,GAAK,GAAKA,EAAI,EAC7BqE,EAAKA,GAAK,GAAKA,GAAK,GAAKA,EAAI,EAC7B7B,EAAKA,GAAK,GAAKA,GAAK,GAAKA,EAAI,EAEzB40J,GAA0B,MAApBA,EAAG7gJ,eAA8B,IAALvW,IACpCA,EAAI,GAEFo3J,GAA0B,MAApBA,EAAG7gJ,eAA8B,IAALvW,IACpCA,GAAK,KAGCA,EAAGqE,EAAG7B,GAIhB,QAAS60J,aAAYR,EAAUJ,GAC7B,GACIa,GACAzxJ,EAAG0xJ,EAFH3/J,EAAK6+J,EAAK5/F,MAAMz9D,KAAK,KAGrBxB,GAAG6H,QAAQ,OAAS,GAAK63J,EAAO1/J,EAAIA,EAAKA,EAAG4Y,OAAO,EAAG5Y,EAAG6H,QAAQ,QAC9D63J,EAAO1/J,EAAK,KACnBiO,EAAI3S,EAAE,IAAM0E,GAAIgL,WAAW,WAC3B20J,EAAMrkK,EAAE,IAAMokK,GAAM10J,WAAW,WACpB,MAAP20J,GAAoB,MAAL1xJ,GACb0xJ,EAAIliI,UAAYxvB,EAAEwvB,WAEpBvD,YAAY92B,EAAE,gBAAiBA,EAAE,WAAY,WAAc9H,EAAE,IAAM0E,GAAIgzB,SAAY,KAAM,KAAM,MAAM,GAc3G,QAASoc,2BACP9zC,EAAEiwB,KAAKvpB,GAAGgpB,YAAahpB,GAAG8oB,aAAa1F,KAAK,WAC1Cnf,KAAK4jD,SAASC,KAAK81G,sBAYvB,QAASx/H,6BAA4BvG,GACnC,GAAI4K,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UAC9BD,GACG6F,UAAU,iBAAkBlnC,EAAE,mBAAoB,WACjD81B,SAAS,6BAA6B,KAEvCoR,UAAU,cAAelnC,EAAE,kBAAmB,WACzCy2B,GAAUA,MACbikF,kBAAkB,kBACvBr5E,EAAK8J,oBAAqB,EAC1B9J,EAAKmZ,gBAAiB,EACtBnZ,EAAK3E,YAAY18B,EAAE,wBAEnB+tG,mBAAmB,KAGrB,QAAS0uD,0BACP,GAAIxwI,GAAO,EACX/zB,GAAE,uBAAuBqF,KAAK,QAAQnE,KAAK,WACzC6yB,IAA0B,MAAjB5yB,KAAKqjK,SAAmB,KAAO,IAAMxkK,EAAEmB,MAAMyH,OAAS,OAEjE+B,KAAKwxC,UAAUsoH,oBAAoB1wI,GAqDrC,QAAS2wI,iBAAgBt5J,EAAMzI,GA4B7B,QAASgiK,GAAoBj5G,GAC3B,MAAO,YACL,GAAIpc,IAAY,CAChB,KACEs1H,GAAkB,EACdl5G,OAAc,IAChBpc,GAAY,GACd,MAAO7kC,IACL6kC,GACFtvC,EAAEmB,MAAM2M,OAAO,UAOrB,QAAS+1I,GAAYghB,EAAQC,GACtB5vD,EAAIhvE,GAAG,aAAyB,MAAV2+H,GAA4B,IAAVA,GAC3C3vD,EAAIpnG,OAAO,QACF,OAAPX,IACFA,EAAK+nG,EAAI/vG,UAEW,mBAAX0/J,IAAqC,OAAXA,GAA8B,KAAXA,GACtD3vD,EAAI7vG,KAAK,wBAAwB5D,OACjCyzG,EAAI/vG,OAAOgI,KAEX+nG,EAAI7vG,KAAK,wBAAwBwsC,SACjB,UAAZizH,EACF5vD,EAAIjrD,QAAQ86G,iBAAiBF,IACR,SAAZC,EACT5vD,EAAIjrD,QAAQ9H,gBAAgB0iH,IAE5B3vD,EAAIjrD,QAAQ+6G,mBAAmBH,IAElB,WAAXC,IAAsBA,EAAU,aACpC5vD,EAAI7vG,KAAK,wBAAwB5E,YAAY,kBAAkBA,YAAY,sBAAsBA,YAAY,iBAAiBI,SAAS,YAAcikK,GAAS1hK,OAC9J8xG,EAAIrwG,IAAI,SAAUsI,EAAK+nG,EAAI7vG,KAAK,wBAAwByiE,cAAgB,KAM5E,QAAS73B,GAAU40H,GACjBI,EAAoBJ,EAAS,QAAU,GACvChhB,EAAYghB,EAAQ,SAGtB,QAASrgI,GAAY0gI,GAEM,UAArBD,IAEJA,EAAoBC,EAAU,UAAY,GAC1CrhB,EAAYqhB,EAAS,YAGvB,QAASC,GAAgBC,GAEE,UAArBH,GAAqD,YAArBA,IAEpCA,EAAoBG,EAAU,OAAS,GACvCvhB,EAAYuhB,EAAS,SAvFvB,GAAIR,IAAkB,EAClBS,EAAwB,WAE1B,GADAhyJ,iBACKuxJ,EAEH,MADAA,IAAkB,EACXxpI,EAASt1B,UAKhBs1B,GACFrQ,MAAO,GACPhc,OAAQ,KACRikC,OAAQlrC,EAAE,MACVy6C,WAAYz6C,EAAE,UACd7D,GAAI,aACJ6B,OAAQ,aACRw/J,KAAM,aACNljK,MAAO,IACP+C,OAAQ,OACRu/F,WAAW,EACXp+F,SAAU,UACVyvG,UAAU,EACV/1E,MAAOqlI,GAkBLl4J,EAAK,KA0BL83J,EAAmB,EAuBvBjlK,GAAE4C,OAAOw4B,EAAUz4B,GAEnB3C,EAAE,oBAAoB6xC,QACtB,IAAIqjE,GAAMl1G,EAAE,wGACRqtB,GAAQ,EAERk4I,EAAmD,mBAAzBnqI,GAASoqI,aAA+BpqI,EAASoqI,eAAgB,CAwF/F,OArFAxlK,GAAE,WACAk1G,EAAIpnG,QACFnC,OAAQ,IACRof,MAAOqQ,EAASrQ,MAChB25E,UAAWtpE,EAASspE,UACpBtiG,MAAOg5B,EAASh5B,MAChB+C,OAAQi2B,EAASj2B,OACjBk9C,UAAWx+C,KAAKC,MAA2B,IAArB9D,EAAEyF,QAAQN,UAChC+tG,OAAO,EACP6C,SAAU36E,EAAS26E,SACnB/1E,MAAO,WAAkB5E,EAAS4E,OAAO5E,EAAS4E,QAASzwB,IAAIo/F,SAAS,WACxEsE,UAAWnrG,EAAE,SACb29J,UAAW,WACTpyJ,iBAEFiyJ,KAAMlqI,EAASkqI,KACfjxI,QAAUkxI,IAEN38J,KAAMwyB,EAAS4X,OACf5uC,MAAOugK,EAAoBvpI,EAASn3B,IACpCqjE,MAAS,UACTiuC,YAAa,aAGb3sG,KAAMwyB,EAASmnB,WACfn+C,MAAOugK,EAAoBvpI,EAASt1B,QACpCyvG,YAAa,sBAGhBz0G,KAAK,QAASmvC,GAAWnvC,KAAK,OAAQqkK,GAAiBrkK,KAAK,UAAW0jC,GAAa1jC,KAAK,aAAc,WACxGd,EAAE,iBAAiB8iC,OAAOz9B,KAAK,oBAAoBvE,KAAK,YAAYmqE,YACnEnqE,KAAK,YAAa,WACnBd,EAAE,iBAAiB8iC,OAAOz9B,KAAK,oBAAoB5E,YAAY,gBAAgBK,KAAK,YAAYoqE,WAElG2qC,mBAAmBz6E,EAASh5B,MAG5B,IAAIo0G,GAAwBtB,EAAInyG,QAAQ,aACxCyzG,GAAsBnxG,KAAK,uBAAuBxE,SAAS,cAC3D21G,EAAsBnxG,KAAK,6BAA6Ba,KAAK,YAAa,aAC1EswG,EAAsBnxG,KAAK,sBAAsBxE,SAAS,gBAC1D21G,EAAsBnxG,KAAK,yBAAyBxE,SAAS,gBAGjD,kBAARuK,GAAgD,QAApB1E,GAAGuE,eAAyBsE,IAAIo/F,SAAS,iBAE3EmH,oBAAoBZ,EAAIpyE,QAExBsU,gBAAgB,4BAA8B2K,YAAa32C,EAAMqyB,OAAQz9B,EAAEwkB,OAAO4W,EAASrsB,SAAW,SAAUxG,GAC9G,GAAIA,EAAIm2B,QAAS,CACfn2B,EAAMA,EAAI6gB,MACV,IAAIotF,GAAwBtB,EAAInyG,QAAQ,aAgBxC,IAbAyzG,EAAsB31G,SAAS,oBAAsBuK,GAAMlF,KAAK,kBAAmB,eAEnFgvG,EAAInwG,KAAKwD,EAAIxD,MAEb89J,qBAAqB3tD,GACrBsB,EAAsBnxG,KAAK,kBAAkBa,KAAK,YAAa,YAG3DgvG,EAAIt0G,SAAS,sBAAsBs0G,EAAIpnG,OAAO,SAAU,YAAcumD,GAAI,gBAAiBC,GAAI,gBAAiBiiD,GAAI9wG,SAE3G,SAAT2F,GACF8pG,EAAIrwG,IAAI,WAAY,UAElB0D,EAAIi6C,OAAQ,CACd,GAAIvkC,GAAI,GAAI7V,UAASG,EAAIi6C,QACrBkjH,EAAMvkK,IACVsG,YAAW,WACTwW,EAAEiD,MAAMwkJ,IACP,IAELr4I,GAAQ,MAER6nF,GAAIt5C,QACJ3rB,EAAU1nC,EAAIse,OACd7mB,EAAE,WACAk1G,EAAIp0G,KAAK,iBAGTs6B,GAASuqI,WAAWvqI,EAASuqI,aAChC,SAAUxzI,GAAO8d,EAAU9d,KAEvB+iF,EAIT,QAAS2tD,sBAAqB3tD,EAAKD,GACjC,GAAIC,GAAOA,EAAIjmG,OAAS,EAAG,CACzB,GAAIpM,EAEFA,GADEoyG,KAAgB,EACbC,EAEAA,EAAItgG,SAASvP,KAAK,uBAEe,GAApCxC,EAAGwC,KAAK,kBAAkB4J,QAC5BpM,EAAG1C,OAAO,8MAUhB,QAASylK,eAAcC,EAAQ3hF,EAAW4hF,EAAUC,EAAYC,EAAWC,EAAOC,GAChF,GAAI7lI,GAAOylI,EAAYC,EAAa,UAAY,WAAeA,EAAa,SAAW,OACnFpgJ,EAAM,GACNwgJ,GAAc,CAEN,SAAR9lI,GAoBF8lI,GAAc,EACdxgJ,EAAMygJ,kBAAkBP,EAAQ3hF,IAIhCv+D,EAAM9W,OAAO,mIACT6mD,KAAMtP,UAAWv1B,IAAKw1B,UAAWggH,OAAQR,EAAQS,QAASpiF,EAAWqiF,QAAS,SAAWlmI,EAAMmmI,cAAe,cAAgBR,EAAWC,MAAO,UAAYA,EAAOC,uBAAwB,qBAAuBA,IAWpNJ,IAAaC,GACft+J,WAAW,WACTm3B,YAAY92B,EAAE,uBAAwBA,EAAE,6BAA8B,KAAM,KAAM,IAAK,MAAM,IAC5F,KAGLg4B,qBAEK9/B,EAAM,MAAK,GACVmmK,GAAa3nI,eAAe12B,EAAE,gBAAgB,GAClDrC,OAAOq7B,KAAKnb,EAAK,OAASkgJ,GACtBM,GAAaxnI,eAAe,GAAI,KAEpCl3B,WAAW,WACLq+J,GAAgC,OAApBp/J,GAAGuE,eAAiE,eAAvCiyB,cAAc,QAAQ7Z,eACjE4jC,qBAED,KACH30B,SAASrpB,KAAO0c,GAKpB,QAASygJ,mBAAkB1hK,EAAIo6C,GAC7B,GAAI2nH,GAAgB,uBAA4BzmK,EAAE,QAAQoC,SAAW,GACrE,OAAOyM,QAAO,kFACV7D,KAAMy7J,EAAgB,kBAAoB,MAAO/wG,KAAMtP,UAAWv1B,IAAKw1B,UAAWggH,OAAQ3hK,EAAI4hK,QAASxnH,IAQ7G,QAAS4nH,YAAWhiK,EAAIiiK,EAAUziF,EAAW0iF,EAAUC,EAAQC,GAK7DpiK,EAAKA,GAAMw4B,cAAc,KACzB,IAAI6pI,IAAYJ,CAEhB,IADKziF,IAAWA,EAAY,IACvB6iF,EAAU,CACb,GAAIC,IAAiB,CAoCrB,IAlCA5vH,gBAAgB,qCAAuCzR,OAAQjhC,GAAM,SAAU6D,GAC7E,IAAKA,EAAIm2B,SAAWn2B,EAAIse,MAAO,CAC7BmgJ,GAAiB,CACjB,IAAI/8H,GAA6B,OAAjB1hC,EAAI2hC,SAAoBC,OAAO5hC,EAAI2hC,UAAY5pB,MAE/D,YADA5Z,IAAGmE,GAAGylB,WAAWltB,KAAKmF,EAAIse,MAAOvG,OAAW2pB,GAI9C,GAAI1hC,EAAIm2B,SAAWn2B,EAAI6gB,OAAQ,CAE7B,IAAKw9I,GAA0B,GAAdr+J,EAAI6gB,OAKnB,YAJI09I,IACFA,IACAE,GAAiB,GAIjBF,GAAeA,IACdlB,cAAclhK,EAAI,WAAYkiK,GAA0B,GAAdr+J,EAAI6gB,OAAa29I,GAChEC,GAAiB,EASdF,IACHlB,cAAclhK,EAAI,WAAYkiK,GAA0B,GAAdr+J,EAAI6gB,OAAa29I,GAC3DC,GAAiB,MAIhBA,EACH,OAGJ,GAAIrrJ,GAAKkrJ,EAASA,EAAS,WACzB,GAAII,GAAcjnK,EAAE,iBAChBknK,EAAwBD,EAAY5hK,KAAK,+BACzC6+E,EAAYgjF,EAAsB9xJ,KACtC,IAAI2xJ,EACF,GAAIR,GAAsD,GAA5CU,EAAY5hK,KAAK,iBAAiB4J,WAEhD,IAAIs3J,IAAWK,GAAsD,KAA1CM,EAAsBpmK,KAAK,WAExD,IAAIklK,GAAYiB,EAAY5hK,KAAK,sBAAsB+P,MAEnD6wJ,EAAsE,GAA9DgB,EAAY5hK,KAAK,mCAAmC4J,OAC5Di3J,GAAyB,CACzBD,KACFC,EAAyBe,EAAY5hK,KAAK,kDAAkDmoC,KAAK,YAE/F02C,GAAW0hF,cAAclhK,EAAIw/E,EAAWqiF,EAASQ,EAAUf,EAAWC,EAAOC,GAGnFxB,iBAAgB,UACd35I,MAAOg8I,EAAWj/J,EAAE,2BAA8B8+J,EAAW9+J,EAAE,QAAUA,EAAE,WAC3EkrC,OAAQ+zH,EAAWj/J,EAAE,MAAS8+J,EAAW9+J,EAAE,MAAQA,EAAE,QACrD69J,UAAW,WACT9uH,8BAA8B,UAC9BtnC,IAAIo/F,SAAS,aACb,IAAIw4D,GAAsB,GAAIn7I,WAAUiC,WAAWgH,SAASpnB,KAAK2Y,WAAW+rE,KAAK,iBAAkB,iBACnG40E,GAAoBl8F,UACpBm8F,mBAAmBpmK,KAAKhB,EAAE,6CAE1B,IAAIqnK,GAAoCrnK,EAAE,kDACtCsnK,EAAetnK,EAAE,0BAErBsnK,GAAarlK,GAAG,SAAU,WACnBjC,EAAEmB,MAAMqsC,KAAK,YACZ65H,EAAkC75H,KAAK,YACzC65H,EAAkC75H,KAAK,WAAW,KAExD65H,EAAkCplK,GAAG,SAAU,WACzCjC,EAAEmB,MAAMqsC,KAAK,aACV85H,EAAa95H,KAAK,YACrB85H,EAAa95H,KAAK,WAAW,OAIrCxN,MAAO,WACLyiI,oBACAlzJ,IAAIo/F,SAAS,WAEf1qG,GAAI0X,EACJ5M,QAAU42B,OAAQjhC,EAAI6iK,SAAUR,EAAUl6H,UAAWq3C,EAAWu/B,KAAMmjD,EAAW,OAAS,OAAQY,UAAUV,EAA8BW,qBAAqB,EAAMC,WAAW,KAI9KX,EACF/mK,EAAE,iBAAiBc,KAAK,aAAc,WACpCd,EAAE,iBAAiBc,KAAK,WAAWgH,EAAE,kDAE7B8+J,EAKV5mK,EAAE,iBAAiBc,KAAK,aAAcd,EAAEwnG,MAJxCxnG,EAAE,iBAAiBc,KAAK,aAAc,WACpCd,EAAE,iBAAiBc,KAAK,WAAWgH,EAAE,0BAO3C,QAAS6/J,WAAUnjK,EAAO3B,GACH,IAAjB2B,EAAMm/C,SAAgC,IAAfn/C,EAAM8mD,QAC3BzoD,EAAGouC,QACLpuC,EAAGouC,SAAU,EAGbpuC,EAAGouC,SAAU,GAgDnB,QAAS22H,sBAAqB3gI,EAAOwZ,EAAepa,EAAUE,GAC5D,GAAIK,GAAWP,EACXM,EAAQM,EACR4gI,EAAYpnH,EAAgBA,EAAgB,IAGhD/5C,IAAGkoB,MAAMkE,kBAAkB,cAAcpgB,KAAK,SAAUogB,GACtD,GAAIA,GAAqB8T,EAAW,EAApC,CACE,GAAIX,GAAU,SAAUvU,GAASmN,UAAUnN,EAAO,KAAM,MACpDuC,EAAasS,CACjB,QAAQK,EAAW,IACjB,IAAK,IAEHN,uBAAuBK,EAAOC,EAAU3S,EAAY,GAClD,SAAUuS,GAAiBshI,cAAcnhI,EAAO,SAAUkhI,EAAQ,KAAM,GAAIrhI,IAC5EP,EACF,MACF,KAAK,IAEHE,6BAA6B,GAAI,SAAUC,GACzC0hI,cAAcnhI,EAAO,SAAUkhI,EAAQ,KAAMzhI,IAE/C,MACF,KAAK,IAEHD,6BAA6B,GAAI,SAAUC,GACzCE,uBAAuBK,EAAOC,EAAU3S,EAAYmS,EAClD,SAAUI,GAAiBshI,cAAcnhI,EAAO,SAAUkhI,EAAQ,KAAMzhI,EAAUI,IAClFP,UAMV6hI,eAAcnhI,EAAO,SAAUkhI,KAC9B3+I,KAAK,WACN4+I,cAAcnhI,EAAO,SAAUkhI,KAYnC,QAASE,YAAWrjK,EAAI27B,EAAM6jD,EAAW3lD,GACvC,GAAIypI,GAAgB,QACpB,IAAIhoK,EAAEwB,OAASkF,GAAGC,IAAIC,YAEpB,WADAi4B,WAAU/2B,EAAE,qBAAsB,KAAM,IAG1CpD,GAAKA,GAAMw4B,cAAc,MACzBmD,EAAOA,GAAQ,SACV6jD,IAAWA,EAAY,EAC5B,IAAI9oD,GAAW6sI,sBAAsB5nI,EACrCqkI,iBAAgB,SAAU1kK,EAAE4C,OAAOw4B,GACjCuqI,UAAW,WACT9uH,8BAA8BmxH,IAEhC/jK,GAAI,WACF,GAAIgjK,GAAcjnK,EAAE,gBACpBA,GAAEinK,EAAYn5J,OAAO,SAAU,YAAY5M,KAAK,WAAkBC,KAAKyH,MAAQd,EAAE,YAAWogK,aAAe/mK,OAE3G,IAAIgnK,GAAgB/kD,cAAc6jD,EAAY5hK,KAAK,sBAAsB,GAAI4hK,EAAYnmK,KAAK,SAsB9F,OApBIs6B,GAASgtI,YAC0B,mBAA1BF,cAAaG,WACtBH,aAAaG,WAAY,EACrBF,GACFlB,EAAY5hK,KAAK,QAAQ24B,UAGnBkqI,aAAaG,YACrBH,aAAaG,WAAY,EACrBjlD,cAAcpjH,EAAE,yCAAyC,GAAIA,EAAE,iBAAiBc,KAAK,WACvFmmK,EAAY5hK,KAAK,QAAQ24B,UAKzBolF,cAAcpjH,EAAE,yCAAyC,GAAIA,EAAE,iBAAiBc,KAAK,WACvFmmK,EAAY5hK,KAAK,QAAQ24B,UAItB,GAETjvB,QAAU42B,OAAQjhC,EAAI4jK,YAAajoI,EAAMwM,UAAWq3C,MAEtDlkF,EAAE,iBAAiBc,KAAK,UAAW,WACjCd,EAAE,iBAAiB8N,OAAO,SAC1BovC,qBAAqBqrH,YAAa,IAAMhqI,GACnCA,GAAwC,mBAArB0oB,oBACtBA,sBAIN,QAASuhH,wBACP,GAAIvhI,GAAQ/J,cAAc,MACtBurI,EAAO,SAAUC,GACnBZ,cAAc7gI,EAAO,SAAU,KAAM,KAAM,KAAMyhI,IAG/C9hI,EAAWlgC,GAAG0qB,SAASiV,QAEvBO,GAAW,EACbj8B,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChD,GAAIwS,GAAU,SAAUvU,GAASmN,UAAUnN,EAAO,KAAM,MACpDuC,EAAavtB,GAAG0qB,SAASmV,UAC7B,QAAQK,EAAW,IACjB,IAAK,IACH5a,UAAU4C,MAAM+5I,KAAKC,wBAAwB3hI,EAAOL,EAAU3S,EAAY,GAAIw0I,EAAMxiI,EACpF,MACF,KAAK,IACL,IAAK,IACHE,6BAA6B,GAAI,SAAUC,GAAYpa,UAAU4C,MAAMi6I,KAAKD,wBAAwB3hI,EAAOL,EAAU3S,EAAYmS,EAAUqiI,EAAMxiI,QAGpJ/c,KAAK,WACN4+I,cAAc7gI,KAGhB6gI,cAAc7gI,GAIlB,QAAS6gI,eAAc7gI,EAAOw8E,EAAMhjE,EAAeqoH,EAAU1iI,EAAUI,GACrE,GAAIxmC,EAAEwB,OAASkF,GAAGC,IAAIC,aAAyB,WAAT68G,EAEpC,WADA5kF,WAAU/2B,EAAE,qBAAsB,KAAM,IAG1C27G,GAASA,EAAOA,EAAO,SACvBhjE,EAAkBA,EAAgBA,EAAgB,GAElD,IAAIsoH,GAAeviI,EAAgBA,EAAgB,GAC/CwZ,EAAS5Z,EAAWA,EAAW,EAEnClT,aAAY,4BACV6uB,YAAa,SAAUtkB,OAAQz9B,EAAEwkB,QAC/BmhB,OAAQsB,EACRqhI,YAAa7kD,EACb52E,UAAW4T,EACXuoH,WAAYD,EACZE,KAAMjpH,KAEP,SAAUz3C,GACX,GAAIA,EAAIm2B,QAAS,CACf,GAAItD,GAAW6sI,sBAAsBxkD,GACjC31G,EAAS,GAAIpH,IAAGunB,WAAWhH,QAAQ6D,UAuDvC,IAtDAhd,EAAOid,MAAQqQ,EAASrQ,MACxBjd,EAAOw0C,gBAAiB,EACxBx0C,EAAOmlC,oBAAqB,EAC5BnlC,EAAOkd,QAAQhrB,EAAE,2BAA2B6E,IAAI,WAAY,UAAUE,KAAKwD,EAAI6gB,OAAOrkB,MAAM,GAAGo8C,WAC/FrzC,EAAO1L,MAAQ,IACf0L,EAAO24B,QAAU,WAEiB,mBAArBwgB,oBAAkCA,qBAG/Cn5C,EAAOglG,mBAAmBp+F,MACxBhQ,GAAI,kBACJ4iE,MAAS,UACT1+D,KAAMwyB,EAAS4X,OACf5uC,MAAO,WAGL,MAFA0J,GAAO8yC,cAAc,mBACrBpiB,eAAe,IAAI,GAAM,GAClB0qI,gBAAgB9tI,EAASgtI,cAElC9yD,aAAa,IAEfxnG,EAAO01C,OAAS,WACdxjD,EAAE,yBACAc,KAAK,kBAAkB,GACvBA,KAAK,UAAW,WACdgN,EAAOkyB,QACPkd,qBAAqB9hB,EAASmtI,YAAa,IAAMO,GAC5CA,GAAwC,mBAArB7hH,oBACtBA,sBAEJnmD,KAAK,QAAS,SAAU4wB,GACtB,GAAIwjF,GAAMl1G,EAAE,wBACN0xB,KACJwjF,EAAIp0G,KAAK,kBAAkB,GAC3BgN,EAAO+1C,aAAa,mBACpBslH,oBAAoBj0D,EAAKxjF,EAAO,UAElCiN,eAAe,GAAI,EAAG,MAAM,KAE9B79B,KAAK,UAAW,SAAUgzB,GACxB,GAAIohF,GAAMl1G,EAAE,wBACN8zB,KACJohF,EAAIp0G,KAAK,kBAAkB,GAC3BgN,EAAO+1C,aAAa,mBACpBslH,oBAAoBj0D,EAAKphF,EAAS,YAEpC6K,eAAe,GAAI,EAAG,MAAM,KAE9B79B,KAAK,aAAc,WAAcgN,EAAO8yC,cAAc,qBACtD9/C,KAAK,YAAa,WAAcgN,EAAO+1C,aAAa,sBAExD/1C,EAAO1K,OACPyzC,8BAA8Bzb,EAAS4sI,eAEnCz/J,EAAI6gB,OAAOo5B,OAAQ,CACrB,GAAIvkC,GAAI,GAAI7V,UAASG,EAAI6gB,OAAOo5B,OAChC/6C,YAAW,WACTwW,EAAEiD,MAAMzb,SACP,SAIC8C,GAAIse,OACRgY,UAAUt2B,EAAIse,MAAO,KAAM,OAMnC,QAASohJ,uBAAsB5nI,GAC7B,GAAItV,GAAOioB,EAAQu1H,EAAapjK,EAAQijK,EAAaJ,CACrD,QAAQ3nI,GACN,IAAK,SACHtV,EAAQjjB,EAAE,oBACVkrC,EAASlrC,EAAE,UACXygK,EAAczgK,EAAE,4BAChB3C,EAAS,IACTijK,GAAc,EACdJ,EAAgB,QAChB,MACF,KAAK,SACHj9I,EAAQjjB,EAAE,4BACVkrC,EAASlrC,EAAE,eACXygK,EAAczgK,EAAE,oCAChB3C,EAAS,IACT6iK,EAAgB,QAChB,MACF,KAAK,sBACHj9I,EAAQjjB,EAAE,oBACVkrC,EAASlrC,EAAE,eACXygK,EAAczgK,EAAE,4BAChB3C,EAAS,IACT6iK,EAAgB,QAChB,MACF,KAAK,SACHj9I,EAAQjjB,EAAE,4BACVkrC,EAASlrC,EAAE,kBACXygK,EAAczgK,EAAE,oCAChB3C,EAAS,IACT6iK,EAAgB,kBAChB,MACF,SACE,KAAM,IAAInhJ,OAAM,gBAEpB,GAAIuU,IACFrQ,MAASA,EACTioB,OAAUA,EACVu1H,YAAeA,EACfpjK,OAAUA,EACVijK,YAAeA,EACfJ,cAAiBA,EAEnB,OAAO5sI,GAGT,QAAS+tI,qBAAoBj0D,EAAK2vD,EAAQC,GAClCD,GACJA,EAASA,EAAOx1J,QAAQ,OAAQ,QAChC6lG,EAAI7vG,KAAK,wBAAwBwsC,SACjCqjE,EAAIjrD,SAAoB,SAAX66G,EAAqBC,iBAAmBC,oBAAoBH,KAIzE3vD,EAAI7vG,KAAK,wBAAwB5D,OAIrC,QAASynK,iBAAgBE,GACvB,GAAInC,GAAcjnK,EAAE,iBAChBqpK,EAAqBjmD,cAAc6jD,EAAY5hK,KAAK,sBAAsB,GAAI4hK,EAAYnmK,KAAK,UAC/FwoK,EAA2BC,gCAC3BC,EAAevC,EAAY5hK,KAAK,kBAAkBA,KAAK,oBAAoB+P,KAE/E,IAAqB,KAAhBo0J,GAA0BF,EAqBzBF,GACGnC,EAAYnmK,KAAK,mBAAqBuoK,IACzCpC,EAAYnmK,KAAK,kBAAkB,GACnCmmK,EAAY5hK,KAAK,QAAQ24B,UAGvBqrI,GACFpC,EAAY5hK,KAAK,QAAQ24B,aA5B2B,CAExD,GAAIlwB,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,UAChCt7B,GAAOihC,uBACPjhC,EAAOkhC,UAAU,YAAalnC,EAAE,OAAQ,WAEtCm/J,EAAY5hK,KAAK,0BAA0B+P,IAAI,QAC/C6xJ,EAAY5hK,KAAK,QAAQ24B,WAE3BlwB,EAAOkhC,UAAU,WAAYlnC,EAAE,MAAO,WAAcgG,EAAOkyB,QAASrB,iBAAkB3+B,EAAE,oBAAoBS,YAAY,YAAY2qC,WAAW,aAC/I,IAAIq+H,EACJ,IAAkC,mBAAvB/iK,IAAGwpB,QAAQw5I,SAAyB,CAC7C,GAAIC,GAAe1C,EAAY5hK,KAAK,+BAA+B+P,MAC/Dw0J,EAAU5pK,EAAE,IAAM2pK,EACtBF,GAAWG,EAAQ1jK,KAAK,sBAExBujK,GAAW/iK,GAAGwpB,QAAQw5I,QAGxB57J,GAAO1K,KAAK0E,EAAE,wCAAyC+G,OAAO/G,EAAE,+CAAiD43C,EAAK+pH,IAAa3hK,EAAE,gBAAiB,aAiB1J,QAASyhK,iCACP,GAAIhhK,IAAM,CACV,IAAsD,mBAA3C7B,IAAGwpB,QAAQ25I,4BACfnjK,GAAGwpB,QAAQ25I,+BAAgC,GAAWnjK,GAAGwpB,QAAQ45I,oBAAsB,IAC1FvhK,GAAM,OAEH,CACL,GAAIohK,GAAe3pK,EAAE,iBAAiBqF,KAAK,+BAA+B+P,MACtEw0J,EAAU5pK,EAAE,IAAM2pK,EACgC,WAAjDC,EAAQ1jK,KAAK,iCAA+F,KAA9C0jK,EAAQ1jK,KAAK,gCAC9EqC,GAAM,GAGV,MAAOA,GAIT,QAASghK,iCACP,GAAIhhK,IAAM,CACV,IAAsD,mBAA3C7B,IAAGwpB,QAAQ25I,4BACfnjK,GAAGwpB,QAAQ25I,+BAAgC,GAAWnjK,GAAGwpB,QAAQ45I,oBAAsB,IAC1FvhK,GAAM,OAEH,CACL,GAAIohK,GAAe3pK,EAAE,iBAAiBqF,KAAK,+BAA+B+P,MACtEw0J,EAAU5pK,EAAE,IAAM2pK,EAC+B,WAAjDC,EAAQ1jK,KAAK,iCAEfQ,GAAG8L,IAAIC,SAAS,8CAAgDwyB,WAAY0kI,IAAgBj3J,KAAK,SAAU0R,GACzG7b,GAAO6b,IAIb,MAAO7b,GAGT,QAASwhK,yBACP,GAAI9C,GAAcjnK,EAAE,iBAChBgqK,EAAiB/C,EAAY5hK,KAAK,iBAClC4kK,EAAYhD,EAAY5hK,KAAK,WAC7B6kK,EAAY,WACd,GAAIjI,GAAQjiK,EAAEmB,KACV8gK,GAAM/7H,GAAG,cACmB,KAA1B+7H,EAAMnhK,KAAK,aAAsBmhK,EAAMrtJ,SAASvP,KAAK,mCAAmC4J,OAAS,GACnG+6J,EAAenpK,SAAS,kBACxBopK,EAAU/jK,KAAK,WAAY,YAAYklC,WAAW,aAGlD4+H,EAAevpK,YAAY,kBAC3BwpK,EAAU7+H,WAAW,YAAYllC,KAAK,WAAW,IAGZ,QAAnC+7J,EAAMnhK,KAAK,sBACbmmK,EAAYnmK,KAAK,WAAWgH,EAAE,iDAAkDm6J,EAAM7sJ,MAAO6sJ,EAAMnhK,KAAK,sBACxGmmK,EAAYnmK,KAAK,gBACjBkpK,EAAenpK,SAAS,kBAAkB4oC,WAAWvjC,KAAK,WAAY,YAAYklC,WAAW,aAE7F67H,EAAY5hK,KAAK,wBAAwB5D,OACzCwlK,EAAYnmK,KAAK,gBAEnBmmK,EAAY5hK,KAAK,gBAAgB+P,IAAI6sJ,EAAMnhK,KAAK,WAGhDqpK,EAASlD,EAAY5hK,KAAK,uBAAuBovC,OAAOy1H,EAC5DA,GAAUlpK,KAAKmpK,EAAOruI,OAAO,aAK/B,QAASsuI,UAAS1lK,EAAIo6C,GAChBp4C,GAAGkoB,MAAM6jB,eACX/tC,EAAKA,GAAMw4B,cAAc,MAEzBvyB,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChDixI,gBAAgB,QACd35I,MAAOjjB,EAAE,kBACT69J,UAAW,WACT9uH,8BAA8B,OAC9B,IAAIwzH,GAAYrqK,EAAE,gBACZ8+C,IACJurH,EAAUhlK,KAAK,2BAA6By5C,EAAgB,KAAK16C,QAEnEmL,IAAIo/F,SAAS,aAEb,IAAI27D,GAAmBD,EAAUhlK,KAAK,wBAClCklK,EAAiBF,EAAUhlK,KAAK,kBAEL,IAA3BilK,EAAiBr7J,SAEnBq7J,EAAiB11J,SAASnT,OAC1B8oK,EAAe31J,SAASA,SAASnT,SAGrCwC,GAAI,WACF,GAAIynD,GAAU1rD,EAAE,iBAAiBc,KAAK,KACtC,IAAI4qD,EAAS,MAAOA,MAEtB5lD,OAAQ,WACN,GAAI4lD,GAAU1rD,EAAE,iBAAiBc,KAAK,SACtC,IAAI4qD,EAAS,MAAOA,MAEtB38C,QAAU42B,OAAQjhC,EAAI8lK,UAAU,GAChCrlK,OAAQ,OACRmgK,KAAM,WAActlK,EAAE,iBAAiB4U,SAAS/P,IAAI,SAAU,SAC9Dm7B,MAAO,WACL,GAAI0rB,GAAU1rD,EAAE,iBAAiBc,KAAK,QACtC,OAAI4qD,GAAgBA,KACpB+2G,wBACAlzJ,KAAIo/F,SAAS,YAEfroG,UAAW,SAAW8G,eAAiB,EAAK,SAE7C8b,KAAK,WACN2V,UAAU/2B,EAAE,+BAGd4/B,SAAS5/B,EAAE,kCAKf,QAAS2iK,uBAAsBhlI,EAAQilI,GAgBrC,QAASC,GAAqBC,GAC5B,GAAIN,EAAiBr7J,OAAS,IAAMq7J,EAAiBpkI,GAAG,YAAa,CACnEokI,EAAiB11J,SAASxR,OAC1BmnK,EAAe31J,SAASA,SAASxR,MAEjC,IAAIynK,GAAa,GACbC,EAAY51D,EAAI/vG,SAAW4lK,EAAwBC,EAAsBH,CAEzED,GACF11D,EAAInyC,SACF59D,OAAQ2lK,GACP,IAAK,WACN9qK,EAAE,mBAAmB03B,WAGvBw9E,EAAI/vG,OAAO2lK,GACX9qK,EAAE,mBAAmB03B,UAM3B,QAASuzI,GAAqBL,GAC5B,GAAgC,GAA3BN,EAAiBr7J,QAAiBq7J,EAAiB11J,SAASsxB,GAAG,YAAc,CAChF,GAAI4kI,GAAY51D,EAAI/vG,SAAW4lK,EAAwBC,CAEnDJ,GACF11D,EAAInyC,SACF59D,OAAQ2lK,GACP,IAAK,WACNR,EAAiB11J,SAASnT,OAC1B8oK,EAAe31J,SAASA,SAASnT,OACjC8oK,EAAen1J,IAAI,OAGrB8/F,EAAI/vG,OAAO2lK,GACXR,EAAiB11J,SAASnT,OAC1B8oK,EAAe31J,SAASA,SAASnT,OACjC8oK,EAAen1J,IAAI,MAwBzB,QAAS81J,KACP,MAAOh2D,GAAI7vG,KAAK,+BAA+B+P,MAGjD,QAAS+1J,KACP,MAAOj2D,GAAI7vG,KAAK,mBAAmB6gC,GAAG,YAGxC,QAASklI,KACP,MAAOl2D,GAAI7vG,KAAK,oBAAoB6gC,GAAG,YAGzC,QAASmlI,KACP,GAAIhhG,GAAM6qC,EAAI7vG,KAAK,kCAAkC+P,MAAMhF,MAAM,MACjE,QACE1L,GAAI2lE,EAAI,GACRihG,UAAWjhG,EAAI,GACf52C,OAAQ42C,EAAI,GACZkhG,eAAgBlhG,EAAI,IAIxB,QAASmhG,KACP,MAAOxrK,GAAE2V,KAAKu/F,EAAI7vG,KAAK,qBAAqB+P,OAG9C,QAASq2J,GAAoBtkG,GAC3B+tC,EAAI7vG,KAAK,yBAAyB+P,IAAI,QAAU+xD,EAAM/zD,KAAK,MAI7D,QAASs4J,GAAwBxnF,GAE/B,GAAI/5D,GAAMnqB,EAAE0nB,WACRikJ,GAAgBC,KAAK,EAAOC,KAAK,GACjCC,EAAW,KAKf,OAJIX,OACFW,EAAW,OAGTpB,GACFx3I,YAAY,+DAAiEyS,OAAQF,EAAQsmI,oBAAqBJ,EAAYG,IAAa,SAAUvjK,GACnJA,EAAMvI,EAAE2V,KAAKpN,EAAI+U,OAAO,IACxB6M,EAAIlB,QAAiB,KAAR1gB,KAAkBA,EAAI6H,MAAM,OACxC,WACD+Z,EAAId,WAECc,IAG4B,YAAjC6hJ,EAAQ9nF,GAAW4nF,GACrB3hJ,EAAIlB,UAGJiK,YAAY,2CAA6CyS,OAAQF,EAAQwmI,WAAY/nF,EAAW6nF,oBAAqBJ,EAAYG,IAAa,SAAUvjK,GACtJA,EAAMvI,EAAE2V,KAAKpN,EAAI+U,OAAO,IACxB0uJ,EAAQ9nF,GAAW4nF,GAAqB,KAARvjK,KAAkBA,EAAI6H,MAAM,KAC5D+Z,EAAIlB,WACH,WACDkB,EAAId,WAIDc,GAIT,QAAS+hJ,GAAUhoF,GACjB,MAAIwmF,IACEU,KACFM,IAEKxnF,IAGTioF,EAAkB/oK,YACb4oK,EAAQ5qJ,eAAe8iE,IAoB1BkoF,IACAD,EAAkB1qK,SApBlBuqK,EAAQ9nF,IAAe0nF,IAAK,UAAWC,IAAK,UAAW/qK,KAAM,WAEzDsqK,KACFM,EAAwBxnF,GAI1BhxD,YAAY,gCAAkCyS,OAAQF,EAAQwmI,WAAY/nF,GAAa,SAAU37E,GAC3FA,EAAIse,MACNmlJ,EAAQ9nF,GAAWxyD,MAAQnpB,EAAIse,OAE/BmlJ,EAAQ9nF,GAAWpjF,MAASurK,iBAAkB9jK,EAAI+jK,iBAAkBC,WAAYhkK,EAAIikK,WACpFC,EAAWlkK,EAAImkK,SACfC,EAAUpkK,EAAI+3B,MAEhB8rI,IACAD,EAAkB1qK,YASxB,QAASmrK,KACP3B,GAAqB,GACrBkB,EAAkB/oK,MAClB,IAAIypK,GAAUxB,GACTyB,GAAS1rJ,eAAeyrJ,EAAQE,MASnCX,IACAD,EAAkB1qK,SATlBqrK,EAASD,EAAQnoK,IAAM,UACvBwuB,YAAY,yCAA2C85I,cAAeH,EAAQvB,WAAa,SAAU/iK,GACnGukK,EAASD,EAAQnoK,KAAQitF,MAAOppF,EAAI6gB,QACpCgjJ,IACAD,EAAkB1qK,UAUxB,QAAS2qK,KACP,GAAIloF,GAAYgnF,IACZj+G,EAAM++G,EAAQ9nF,GACdxyD,EAAQ,KACRu7I,EAAc9B,IACd+B,EAAe9B,GACnB,IAAIn+G,EACF,IACE,GAAIA,EAAIv7B,MACN,KAAM,IAAI7K,OAAMomC,EAAIv7B,MACtB,IAAIw7I,EAAc,CAEhB,GAAID,EAAa,CACf,GAAe,WAAXhgH,EAAI4+G,IACN,KAAM,IAAIhlJ,OAAM,UAClB,KAAKomC,EAAI4+G,IAAI58J,OACX,KAAM,IAAI4X,OAAM,KAAO/e,EAAE,sEAC3B2jK,GAAoBx+G,EAAI4+G,KAG1B,IAAKoB,EAAa,CAChB,GAAe,WAAXhgH,EAAI2+G,IACN,KAAM,IAAI/kJ,OAAM,UAClB,KAAKomC,EAAI2+G,IAAI38J,OACX,KAAM,IAAI4X,OAAM,KAAO/e,EAAE,+DAC3B2jK,GAAoBx+G,EAAI2+G,MAG5B,GAAgB,WAAZ3+G,EAAInsD,KAoCN,KAAM,IAAI+lB,OAAM,UAlChB,IAAIomJ,IAAgBhgH,EAAInsD,KAAKurK,iBAC3B,KAAM,IAAIxlJ,OAAM,KAAO/e,EAAE,8BAA+B6kK,EAAQ3yH,MAGlE,IAEImzH,GAAaC,EAFbP,EAAUxB,IACVgC,EAAU,IA2Bd,IAzBIH,GAEFC,EAAcntK,EAAE2V,KAAKu/F,EAAI7vG,KAAK,qBAAqB+P,OACnDg4J,EAAcptK,EAAE2V,KAAKu/F,EAAI7vG,KAAK,cAAc+P,QAG5C+3J,EAAcV,EAEhBzsK,EAAEkB,KAAK+rD,EAAInsD,KAAKyrK,WAAY,WAC1B,GAAIe,GAAOnsK,IACX,IAAI8rK,IAAsC,KAAtBK,EAAKC,gBACvBD,EAAKE,QAAUL,GACfG,EAAK/mI,YAAcsmI,EAAQp5I,QAC3B65I,EAAKN,eAAiBH,EAAQvB,UAS9B,MARI2B,KAAgBC,EAClBG,GAAWvlK,EAAE,0CAA2Co8E,GAChD+oF,GAAgBC,EAEjBD,GAAeC,EACtBG,GAAWvlK,EAAE,kDAAmDo8E,EAAWkpF,IACnEH,GAAeC,IACvBG,GAAWvlK,EAAE,qCAAsCo8E,EAAWkpF,IAJ9DC,GAAWvlK,EAAE,6BAA8Bo8E,IAKtC,IAGI,MAAXmpF,EAAiB,KAAM,IAAIxmJ,OAAMwmJ,GAIvC,MAAOjvI,GACP1M,EAAQ0M,EAAGxM,QAGf,GAAIi7I,GAAUxB,IACVoC,EAAOX,EAASD,EAAQnoK,GAM5B,QALKgtB,GAAS+7I,GAAgB,WAARA,IACfA,EAAK97E,QACRjgE,EAAQ5pB,EAAE,mCAAoC+kK,EAAQnoK,MAG5C,OAAVgtB,GACW,WAATA,IACyB,GAAvBA,EAAMnlB,QAAQ,MAChB2oG,EAAIp0G,KAAK,WAAW4wB,EAAMpU,OAAO,IACE,GAA1BoU,EAAMnlB,QAAQ,SACvB2oG,EAAIp0G,KAAK,QAAQ4wB,EAAMzb,UAAU,IAEjCi/F,EAAIp0G,KAAK,SAAS4wB,IAGtBwjF,EAAIp0G,KAAK,iBACF,IAEFo0G,EAAI7vG,KAAK,qBAAqB4J,QAAQimG,EAAIp0G,KAAK,SAAS,MAC7Do0G,EAAIp0G,KAAK,gBACF,GA6DX,QAAS4sK,KACP,GAAqC,QAAjCx4D,EAAI7vG,KAAK,eAAe+P,MAAiB,CAC3C,GAAI2mD,GAAS2uG,EAAa,qBAAuB,WACjDx3I,aAAY,mBAAqB6oC,GAAUp2B,OAAQF,KAjWvD,GAAIyvE,GAAMl1G,EAAE,iBACRgsK,KACAc,KACAL,EAAW,KACXE,EAAU,KAGVrC,EAAmBp1D,EAAI7vG,KAAK,wBAC5BklK,EAAiBr1D,EAAI7vG,KAAK,mBAE1B0lK,EAAwBT,EAAiB11J,SAASzP,SAClD6lK,EAAsBT,EAAe31J,SAASA,SAASzP,SA8CvDgnK,GACFwB,YAAa,KACbC,gBAAiB5tK,EAAE,mBACnB6tK,mBAAoB,EACpBzqK,KAAM,WACJjC,KAAKwsK,YAAcjnK,GAAGmE,GAAGslB,QAAQo1G,eACjCpkI,KAAKysK,gBAAgBxqK,OACrBjC,KAAK0sK,oBAAsB,GAE7BpsK,KAAM,WACJN,KAAK0sK,oBAAsB,EACK,IAA5B1sK,KAAK0sK,qBACP1sK,KAAKwsK,YAAYlsK,OACjBN,KAAKysK,gBAAgBnsK,SAgO3ByzG,GAAIp0G,KAAK,kBAAmBsrK,GAC5Bl3D,EAAIp0G,KAAK,aAAc8rK,GAGvB13D,EAAI7vG,KAAK,oBAAoBovC,OAAO,WAClC,GAAIz0C,EAAEmB,MAAM+kC,GAAG,YAAa,CAG1BimI,EAAkB/oK,MAClB,IAAI8gF,GAAYgnF,GAChBQ,GAAwBxnF,GAAWnxD,OAAO,SAAU+6I,GAClD,GAAIC,GAAgB/B,EAAQ9nF,GAAc8nF,EAAQ9nF,GAAWinF,IAAmB,MAAQ,OAAS2C,CAC7FC,IAAgBA,EAAa9+J,QAA0B,WAAhB8+J,GACzC/tK,EAAE,cAAcwoE,aACZkiG,GACFx1D,EAAIp0G,KAAK,eACT2qK,EAAoBsC,IAEpB3B,MAGFl3D,EAAIp0G,KAAK,SAASgH,EAAE,uEACpBotG,EAAIp0G,KAAK,iBAEXqrK,EAAkB1qK,aAIpBzB,GAAE,cAAcq/D,cAChB+sG,MAKJl3D,EAAI7vG,KAAK,mBAAmBovC,OAAO,WACjC,GAAI22H,IAAmB,CACrB,GAAIlnF,GAAYgnF,GAChBiB,GAAkB/oK,OAClBsoK,EAAwBxnF,GAAWnxD,OAAO;AACxCq5I,IACAD,EAAkB1qK,aAGpB2qK,OAKJl3D,EAAI7vG,KAAK,uBAAuBovC,OAAO,WACjCz0C,EAAEmB,MAAM+kC,GAAG,aACbgmI,EAAUlsK,EAAEmB,MAAMiU,SAEnBq/B,SAEHm4H,IAUA13D,EAAIp0G,KAAK,KAAM,SAAUktK,GASvB,QAASC,GAAoBC,GAG3B,GAAIA,EAAOlB,eAAiBS,EAAK/oK,GAC/B,KAAM,IAAImiB,OAAM/e,EAAE,4EAElB,IAAIo8E,GAAYgnF,GAEhBh4I,aAAY,oCAAsCyS,OAAQF,EAAQwmI,WAAY/nF,EAAWiqF,UAAU,GAASloC,EAAK,SAAU19H,GACzH,IAAIA,EAAIm2B,QAuBN,KAAM,IAAI7X,OAAMte,EAAIse,MAAMxX,QAAQ,MAAO,KAtBzC,IAAIvO,GAAOyH,EAAI6gB,OAEXglJ,EAAaC,EAAGC,KAAKJ,EAAQptK,EAAMytK,QAEvCr7I,aAAY,gCACVyS,OAAQF,EACRwmI,WAAY/nF,EACZsqF,QAASJ,EACTK,mBAAoBhB,EAAKh6I,OACzBi7I,QAASx5D,EAAI7vG,KAAK,iBAAiB+P,MACnCu5J,gBAAiBxD,IACjByD,cAAexD,IACfyD,UAAWrD,KACVvlC,EAAK,SAAU19H,GAEhB,GADKmiK,GAAYgD,KACZnlK,EAAIm2B,QACP,KAAM,IAAI7X,OAAMte,EAAIse,MAAMxX,QAAQ,MAAO,KAEzCmyB,WAaZ,QAASstI,KACP,GAAIlmK,GAAOd,EAAE,wEACX,cACAA,EAAE,sCACF,oEACFirC,gBACEnqC,KAAMA,EACNmiB,MAAO,GACPioB,OAAQlrC,EAAE,UACV1F,MAAO,IACP6B,GAAIgiI,EAAK,WACP7/F,EAAWpmC,EAAE,oBAAoBoV,MAC5B8/F,EAAI7vG,KAAK,gBAAgB4J,QAC5BjP,EAAE,8IAA8IkwD,SAASglD,GAE3JztG,WAAW,WACTytG,EAAI7vG,KAAK,gBAAgBjB,SACxB,MAEL0B,OAAQ,WACNojB,EAAK,SAMX,QAAS6lJ,GAAaC,EAAUC,GAC9BA,EAAYA,GAAa7oI,CACzB,KACE,GAAI8nI,GAASG,EAAGa,uBAAuBzB,EAAKh6I,OAAQu7I,EAAUC,GAC9D,MAAO7wI,GACP,KAAIA,GAAGxM,QAAQrlB,QAAQ,qCAAsC,EACrD,GAAIsa,OAAM/e,EAAE,6EACTs2B,EAAGxM,QAAQrlB,QAAQ,gCAAiC,EACvD,GAAIsa,OAAM/e,EAAE,qBAEZs2B,EAGV6vI,EAAoBC,GAKtB,QAAS1sI,GAAQ2tI,GACf,GAAIlC,GAAc9B,GAGbT,KACHx1D,EAAIpnG,OAAO,SACXovC,qBAAqBp1C,EAAE,0BAA2B,MAG5B,OAApBpB,GAAGuE,gBACsC,eAAvCiyB,cAAc,QAAQ7Z,cACxB5b,WAAW,WAAcw/C,qBAAwB,KAEjDxhD,OAAO6sB,SAASpF,UAKpBkiJ,EAAcjE,KAEVT,GACF0E,EAAcnC,EAAakC,GAI/B,QAASC,GAAcnC,EAAaoC,GAClC,GAAIrnK,GAAOhI,EAAE,QAAUqvK,GAAU5pI,GAGjC,IAFA/hB,IAAIqQ,KAAK,mBAAoB,+BAAiCs7I,GAE1DrnK,EAAKiH,OAAQ,CACf,GAAIqgK,GAAiBtnK,EAAK3C,KAAK,YAC/B,IAA4B,GAAxBiqK,EAAcrgK,QAAgBg+J,GAA+D,eAAhDqC,EAAcjqK,KAAK,OAAOa,KAAK,cAAiC,CAC/GopK,EAAcz9H,QACd,IAAI09H,GAAU,mKAC2DtC,EAAc,MAAQ,UAAY,gCAE3GjlK,GAAK3C,KAAK,uCAAuClF,OAAOovK,KAM9D,QAASrmJ,GAAKiJ,GACZ,GAAM+iF,EAAIp0G,KAAK,SACbo0G,EAAIp0G,KAAK,SAASqxB,GAClB+iF,EAAIp0G,KAAK,mBACJ,CACL,GAAI6R,GAAI,GAAIjM,IAAGygB,IAAIF,QAAQmiB,UAC3Bz2B,GAAEs9B,UAAU9d,IAKhB,QAASq9I,GAAuBvrF,EAAO1xC,EAAYhU,GAEjD,GAAIkxI,GAAYv6D,EAAIp0G,KAAK,gBACrB2uK,GACFlxI,IAEA73B,GAAG8L,IAAIxR,KAAK,wCAA0C2kC,OAAQs+C,EAAOgoF,WAAY15H,IAAc7/B,KAAK,SAAUnK,GACtGA,EACJg2B,IAGAmxI,EAAkB,WAChBx6D,EAAIp0G,KAAK,iBAAiB,GAC1By9B,QAGHrV,KAAK,WACNqV,MAKN,QAASmxI,GAAkBC,GACzB,GAAIC,GAAgB,GAAIlpK,IAAGygB,IAAIF,QAAQmiB,UACvCwmI,GAAc5uH,aAAa2uH,EAE3B,IAAI9gI,GAAW/mC,EAAE,yBACbgnC,EAAiBhnC,EAAE,4BACnBijB,EAAQjjB,EAAE,gBACVyB,EAAO,MACXqmK,GAAcxsK,KAAKyrC,EAAUC,EAAgB/jB,EAAOxhB,GAKtD,QAAS08H,GAAKrlH,GACZ,MAAO,YACL,IAEE,MADAA,GAAKM,MAAM/f,KAAM6N,YACV,EACP,MAAOovB,GACP,GAAIhsB,GAAMgsB,EAAGxM,OAKb,OAJIxf,GAAI7F,QAAQ,wBAAyB,IACvC6F,EAAMtK,EAAE,0BAEVohB,EAAK9W,IACE,IAMb,QAASy9J,KACPnpK,GAAG8L,IAAIxR,KAAK,uCAAyCq6E,UAAW,kBAAmBC,WAAY6vF,IAAmB,UAAY,KAEhI,QAAS2E,GAAoBp+I,EAAO4xB,EAAS2gC,GAC3C,MAAOp1E,QAAO,4DACZ/G,EAAE,YACFw7C,EACA5xB,EACA,GAAKhrB,IAAG6e,KAAK0+D,EAAO1yE,YAAYC,WAAY6T,QAAQd,YA7MxDsrJ,GAEA,IAAIxB,GACAZ,EA0CArnI,CA4CJ8uE,GAAIp0G,KAAK,eAAgBmlI,EAAK8oC,GAuH9B,IAAIzB,GAAO,SAAUrpF,EAAO1xC,EAAY+Q,GACtCA,GAAW,GAAKA,GAAShkC,YAEzB,IAAI8uJ,GAAapuK,EAAE0nB,UAGnB,IADAwtF,EAAIp0G,KAAK,gBACL4pK,GACF,GAAIU,MAAsBI,IACxB,MAAO4C,GAAW/kJ,OAAOvhB,EAAE,2DAG7B,IAAIsjK,MAAsBI,IACxB,KAAM,IAAI3kJ,OAAO/e,EAAE,sDAKvB,KAAKyqC,EAAa,EAAG,CACnB,GAAIm4H,EACF,MAAO0D,GAAW/kJ,OAAOymJ,EAAoBhoK,EAAE,mDAAoDw7C,EAAS2gC,GAE5G,MAAM,IAAIp9D,OAAMhY,OAAO/G,EAAE,6BAA8Bw7C,IAkE3D,MA9DAmqH,GAAOpC,IAEP1gK,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChD,GAAIs8I,GAAiB,SAAUxnK,GAC7B,GAAIA,EAAIi5B,QACNA,EAAQyiD,GACRvgE,IAAIqQ,KAAK,mBAAoB,gCAAkCuvB,GAC/D8qH,EAAWnlJ,cACN,CACL,GAAM1gB,EAAIqpB,SAA2B,qBAAfrpB,EAAI6b,OAGxB,MAFAumJ,IAAqB,OACrBz1D,GAAIp0G,KAAK,cAKX,IADA4iB,IAAIqQ,KAAK,mBAAoB,+BAAiCuvB,IACzD/6C,EAAIqpB,QAAS,MAClBw8I,GAAW/kJ,OAAOymJ,EAAoBvnK,EAAIqpB,QAAQpR,wBAAyB8iC,EAAS2gC,IAE/EymF,GACGniK,EAAIqpB,SAA2B,6BAAhBrpB,EAAIqpB,SAAwC1I,EAAKphB,EAAES,EAAIqpB,UAG3E84I,GAAYgD,KAEfsC,EAAc9E,GAElBxkK,IAAG8L,IAAIC,SAAS,qCAAuCw9J,OAAQhsF,GAASx+C,IAAU/yB,KAAK,SAAUw9J,GAC/FlkJ,UAAU4C,MAAMi6I,KAAKsH,aAAalsF,GAASx+C,EACzC8M,GAAcy9H,EACdvC,EAAKnC,UACLmC,EAAKh6I,OACLyhF,EAAI7vG,KAAK,iBAAiB+P,MAC1B+1J,IACAC,IACAI,IACAuE,EACAG,EACAzC,EAAKlC,eACLr2D,EAAI7vG,KAAK,mBAAmB+P,WAE/B8T,KAAK,WACNmlJ,EAAKnN,iBACL,KAEE,GAAIgN,GAASG,EAAG+B,0BAA0B3C,EAAKh6I,OAAQg6I,EAAKnC,UAC5D2C,GAAoBC,GACpB,MAAO9vI,GACP,GAAIA,EAAGxU,SAAU,WAEf,KAAM,IAAI/C,OAAM/e,EAAE,wBAGpB,IAAIs2B,EAAGxM,QAAQrlB,QAAQ,qCAAsC,EAI3D,KAAM6xB,EAFN0wI,QAOCV,EAMT,IAAI1D,EAAY,CACd,GAAI2F,GAAkBnF,IAClBoF,GAAa,EAEbC,EAAe,SAAUC,GAC3B,GAAIC,KACJ,KAAK,GAAIxsF,KAASusF,GAChBC,EAAY/7J,KAAK44J,EAAKrpF,EAAOusF,EAASvsF,GAAO,GAAIusF,EAASvsF,GAAO,IAGnEwsF,GAAcA,EAAYtvJ,OAAO6sJ,GAEjChuK,EAAEq4C,YAAYn3B,MAAMlhB,EAAGywK,GAAa/9J,KAAK,WACvCg7J,IACAx4D,EAAIpnG,OAAO,UACX,GAAKpH,IAAGygB,IAAIod,IAAI2H,OAAO9oC,KAAK0E,EAAE,+BAC9B9H,EAAE,iBAAiB6xC,WAClB3oB,KAAK,WACNgsF,EAAIpnG,OAAO,SACX9N,EAAE,iBAAiB6xC,QACnB,IAAI7wB,GAAO7R,MAAMjM,UAAUkM,MAAMpO,KAAKgO,UAClB,KAAhBgS,EAAK/R,SACP+R,EAAO7R,MAAMjM,UAAUkM,MAAMpO,KAAKggB,EAAK,IAGzC,IAAIlT,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,YAAahnC,MAAO,MAChD+xB,EAAU,GAAIztB,IAAGygB,IAAIsD,MAAMC,YAAY,iBAC3CyJ,GAAQ6xF,eAAetsG,YAAYE,UACnCua,EAAQi6F,aAAa,6CAA8C,OAASptG,EAAK5N,KAAK,IAAM,SAE5F+gB,EAAQq+D,cAAc9/E,KAAK,SAAU5R,GACnCgN,EAAOmiC,UAAUnoC,EAAE,oCAAqChH,OAK9D,QAAQuvK,GACN,IAAK,cACHC,GAAa,CACf,KAAK,OACH5pK,GAAG8L,IAAIxR,KAAK,iDAAmD2kC,OAAQF,EAAQirI,WAAYJ,IAAc59J,KAAK,SAAU89J,GACtHD,EAAaC,KACZ9+I,MAAM,SAAUA,GACjBwjF,EAAIpnG,OAAO,SACXya,WACA,IAAIza,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,YAAahnC,MAAO,KACpD0L,GAAOmiC,UAAUve,IAEnB,MACF,KAAK,MACHhrB,GAAG8L,IAAIxR,KAAK,iDAAmD2kC,OAAQF,EAAQirI,WAAYJ,IAAc59J,KAAK,SAAU89J,GACtH,GAAIG,KACJ,KAAK1sF,QAASusF,GACRA,EAASvsF,OAAO,GAAK,GACvB0sF,EAAqBj8J,KAAKuvE,MAI9B,IAAI2sF,GAAc5wK,EAAE0nB,UAGpB,IAAIipJ,EAAqB1hK,OAAQ,CAE/B,GAAIi8J,GAA2B,SAAU50D,GACvC,MAAOA,GAAQjxG,KAAK,+BAA+B+P,OAGjDy7J,EAAkB,WACpB,GAAI5sF,GAAQ0sF,EAAqB1/I,OACjC,KAAKgzD,EAEH,WADA2sF,GAAY3nJ,QAAQunJ,EAItB,IAAI1iK,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQ6D,UAChChd,GAAO6lG,aACP7lG,EAAO+lG,SAAS/rG,EAAE,mBAClBgG,EAAO1L,MAAQ,IACf0L,EAAOw0C,gBAAiB,EACxBx0C,EAAOmlC,oBAAqB,EAC5BnlC,EAAO1K,OAEP0K,EAAO7J,GAAK,WACV,GAAI06C,GAAUusH,EAAyBlrK,EAAE,mBAAqB8N,EAAOpJ,IACrE8rK,GAASvsF,GAAO,GAAKtlC,EACrBkyH,KAGF/iK,EAAOhI,OAAS,iBAEP0qK,GAASvsF,GAChB4sF,KAGFnqK,GAAG8L,IAAIxR,KAAK,yCAA2C2kC,OAAQs+C,EAAOysF,YAAY,IAASh+J,KAAK,SAAU3N,GACxG+I,EAAOkd,QAAQljB,EAAE,yCAA0C,GAAK0oK,EAASvsF,GAAO,IAAI3kE,cAAgB,aAAeva,KAIvH8rK,SAEAD,GAAY3nJ,QAAQunJ,EAGtBI,GAAYl+J,KAAK,SAAU89J,GACzBD,EAAaC,OAEd9+I,MAAM,SAAUA,GACjBwjF,EAAIpnG,OAAO,SACXya,WACA,IAAIza,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,YAAahnC,MAAO,KACpD0L,GAAOmiC,UAAUve,UAMvB89I,GAAuB/pI,EAAQylI,IAA4BjlC,EAAKqnC,GAGlE,QAAO,IAGTp4D,EAAIp0G,KAAK,QAAS,WAChB4sK,MAGFx4D,EAAIp0G,KAAK,gBAIX,QAASgwK,YAEP,MAAIpqK,IAAGmE,GAAGw7B,SAAW,MACnBxH,WAAU/2B,EAAE,2CAA4C,KAAM,SAGhEquJ,mBAAkB,OAAQzvJ,GAAGsgB,GAAG8iI,QAAQ+D,gBAAgB/yI,YAAYG,WAAYvU,GAAGmE,GAAG2a,IASxF,QAAS2wI,mBAAkB91H,EAAMkjF,EAAWwtD,EAAWvvI,EAASknI,GAuB9D,QAASvlD,GAAY6tD,GACnB,IAAKA,EAAa3rK,KAAK,sBAAsB+P,MAAO,OAAO,CAC3D,KAAK47J,EAAa3rK,KAAK,2BAA2B+P,MAAO,OAAO,CAChE,IAAY,QAARirB,EAAgB,OAAO,CAC3B,IAAIrgC,EAAE,wBAAwBkmC,GAAG,aAC/B,IAAK8qI,EAAa3rK,KAAK,wBAAwB+P,MAAO,OAAO,MACxD,CACL,IAAK47J,EAAa3rK,KAAK,oBAAoB+P,MAAO,OAAO,CACzD,KAAK47J,EAAa3rK,KAAK,sBAAsB+P,MAAO,OAAO,EAE7D,OAAO,EAhCT,GAAItU,IAAS2iH,KAAMpjF,EAAMoO,SAAU80E,EAC/BwtD,KACFjwK,EAAKo6C,SAAW61H,EAElB,IAAIhmJ,EACJ,QAAQsV,EAAKhd,eACX,IAAK,WACH0H,EAAQjjB,EAAE,gCACV,MACF,KAAK,OACHijB,EAAQjjB,EAAE,4BACV,MACF,KAAK,SACHijB,EAAQjjB,EAAE,kBACV,MACF,KAAK,OACHijB,EAAQjjB,EAAE,iBAGd,GACImpK,GADAC,EAAMrtK,KAAKC,MAAsB,IAAhBD,KAAKqP,UAAkBmN,UAgB5CqkJ,iBAAgB,gBACd35I,MAAOA,EACPioB,OAAgB,QAAR3S,EAAiBv4B,EAAE,QAAUA,EAAE,UACvC69J,UAAW,WAET3lK,EAAE,wBAAwBgC,IAAI,iBAAiBC,GAAG,gBAAiB,WACjE40C,8BAA8B,YAGhC72C,EAAE,oBAAoBgC,IAAI,iBAAiBC,GAAG,gBAAiB,WAC7D40C,8BAA8B,oBAGhC72C,EAAE,sBAAsBoV,IAAIszJ,GAE1B7xH,8BADU,QAARxW,EAC4B,SAEA,WAInB,SAATA,GAA4B,aAATA,GACrBrgC,EAAE,kCAAkCS,YAAY,mBAGlD8O,IAAIo/F,SAAS,eAEf1qG,GAAI,WACF,GAAIgjK,GAAcjnK,EAAE,iBAChBmxK,EAAYhuD,EAAY8jD,EAC5B,IAAIkK,GAAa/tD,cAAc6jD,EAAY5hK,KAAK,2BAA2B,GAAI4hK,EAAYnmK,KAAK,UAAW,CAEzG,GAAIswK,GAAa,GAAI1qK,IAAGkf,IAAI,mBAC5BwrJ,GAAWtrJ,SAAS,UAAWhe,EAAE,0BACjCmpK,EAAQG,EAAWtwI,KAAK,MAAQowI,GAKhCjK,EAAY5hK,KAAK,QAAQ24B,aAEjBmzI,IACRlK,EAAYnmK,KAAK,SAASgH,EAAE,kCAE9B,QAAO,GAETk4B,MAAO,WACLv4B,WAAW,WACT,GAAIw/J,GAAcjnK,EAAE,gBACdinK,IACJA,EAAYp1H,UAEb,KAEL/rC,OAAQ,WACF2gC,SAASA,WAEf13B,OAAQjO,GAGV,IAAImmK,GAAcjnK,EAAE,gBACpBinK,GAAYnmK,KAAK,UAAW,SAAUyH,GACpC0+J,EAAYn5J,OAAO,SACf0zB,GAASA,EAAQtE,cAAc,KAAM30B,IACzC9C,OAAOq7B,KAAKv4B,EAAK,MAAQ2oK,KACxBpwK,KAAK,OAAQ,SAAUyH,GACxB0+J,EAAYnmK,KAAK,SAASyH,GAC1B0oK,EAAMjxI,UAIV,QAASqxI,gCACPrxK,EAAE,uCAAuCy0C,OAAO,WAC1Cz0C,EAAE,kCAAkCkmC,GAAG,aACzClmC,EAAE,uBAAuBorC,WAAW,YACpC3jC,WAAW,WACTzH,EAAE,sBAAsBwoE,aACxBxoE,EAAE,2BAA2Bq/D,eAC5B,IACHr/D,EAAE,+BAA+BS,YAAY,kBAC7CT,EAAE,qBAAqBa,SAAS,oBAEhCb,EAAE,uBAAuBkG,KAAK,WAAY,YAC1CuB,WAAW,WACTzH,EAAE,sBAAsBq/D,cACxBr/D,EAAE,2BAA2BwoE,cAC5B,IACHxoE,EAAE,+BAA+Ba,SAAS,kBAC1Cb,EAAE,qBAAqBS,YAAY,qBAEpC8oD,QAAQ,UACPvpD,EAAEwB,OAASkF,GAAGC,IAAIC,aACpB5G,EAAE,kCAAkCkG,KAAK,WAAY,YAyLzD,QAASorK,aAAYn/I,GACnByM,YAAYzM,EAAKrqB,EAAE,iCAAkC,KAAM,KAAM,KAAM,MAAM,GAmB/E,QAASypK,sBAAqBC,EAAOC,GACnC,GAAIh7F,GAAK,GAAIp3D,QAAO,eAAgB,MAChClO,EAAIslE,EAAG31D,KAAK0wJ,EAAMp8J,MACtByb,KAAY,MAAL1f,EAAYA,EAAE,GAAK,EAC1B,IAAI5I,GAAMklC,YAAY5c,IACtB7wB,GAAE,IAAMyxK,GAAQl8H,UAAU,GAAKhtC,EAAImpK,OAAQ,GAAKz7H,UAAU1tC,EAAI6C,MAAO,GAAK7C,EAAI6C,UAIhF,QAASumK,YAAWlzJ,EAAGpJ,EAAG2hC,GAGxB,MAFAv4B,GAAIxN,cAAcwN,GAClBpJ,EAAIpE,cAAcoE,GACX2hC,GAAQv4B,EAAIpJ,EAAK,EAAMoJ,EAAIpJ,GAAK,EAAK,GAkE9C,QAASmpC,eAAcwL,EAAKphD,GAC1B,GAAI0gB,GAAUtpB,EAAE0nB,UAOhB,OANA0nB,mBACExmC,KAAM5I,EAAE2V,KAAK/M,IAASohD,EAAM,EAAIliD,EAAE,uBAAwBkiD,GAAOliD,EAAE,yBAAyBuH,QAAQ,KAAM,QAC1GpL,GAAIjE,EAAEiI,MAAMqhB,EAAQL,QAASK,GAC7BxjB,OAAQ9F,EAAEiI,MAAMqhB,EAAQD,OAAQC,GAChClnB,MAAO,SAEFknB,EAMT,QAAS85F,eAAcz/C,EAAO19B,GAC5B,IACE,GAAIhoB,GACA2zJ,CAEJ,MAAIjuG,GAASA,EAAMkuG,OAASluG,EAAMkuG,MAAM5iK,OAAS,GAI/C,OAAO,CAET,IALEgP,EAAI0lD,EAAMkuG,MAAM,GAChBD,EAAO3zJ,EAAE2zJ,MAAQ3zJ,EAAE6zJ,SAIF,gBAARF,IAAoBA,EAAOG,iBAEpC,MADI9rI,IAASA,EAAQn+B,EAAE,iBAAkBiqK,oBAClC,EAET,MAAOxsK,GACPke,QAAQC,IAAIne,EAAEqsB,SAEhB,OAAO,EAGT,QAASogJ,eAAc5mK,EAAM6mK,GAC3BxsK,OAAOq7B,KAAKjyB,OAAO,kGACfqjK,IAAKh1I,cAAc,OAAQrM,IAAKqM,cAAc,OAAQ9xB,KAAMA,EAAMk6B,KAAM2sI,KAG9E,QAASE,eAAc/mK,GACrB3F,OAAOq7B,KAAKjyB,OAAO,4BAA8BzD,KAAMA,KAIzD,QAASgnK,mBAEP,GAAIv+I,IACFm+I,cAAe,SAAU5mK,EAAM6mK,GAC7B,MAAOruK,KAAIouK,cAAc5mK,EAAM6mK,IAGjCE,cAAe,SAAU/mK,GACvB,MAAOxH,KAAIuuK,cAAc/mK,IAG3BinK,UAAW,SAAU38G,GACnBjwD,OAAOq7B,KAAK,kBAAoBslB,UAAY,QAAUC,UAAY,yBAA2BqwB,mBAAmBhhB,KAIlH48G,6BAA8B,SAAU7nK,EAAG1B,EAAMqC,GAC/C,MAAY,UAARrC,MACFnF,KAAIqiF,iBAAiB76E,OAGvBxH,KAAIg7B,YAAY92B,EAAE,uBAGpByqK,aAAa,GAGXC,EAASxyK,EAAE,sBAEf,IAAIwyK,EAAOvjK,OAAQ,CAEjB,GAAI8xH,GAAe/gI,EAAE,gBACrB+gI,GAAalgI,SAAS,mBAGtB,IAAI4xK,GAAmBzyK,EAAE,oBAGzB,IAFAyyK,EAAiB5xK,SAAS,+BAE+B,GAArD2xK,EAAOtsK,KAAK,OAAOqG,QAAQ,uBAC7B,MAEF,IAAImmK,GAAaF,EAAO,GAAGlzD,eAAiBkzD,EAAO,GAAGzzD,gBAAgB4zD,YACtED,GAAWhS,OAAS,WAClB1gK,EAAE4C,OAAO8vK,EAAY7+I,GACrB7T,OAAOC,eAAeyyJ,EAAY,YAAcpnK,IAAK,WAAc1H,IAAIg7B,YAAY92B,EAAE,yBAGrF8qK,wBAAwB5yK,EAAE,0BAMhC,QAAS4yK,yBAAwBr4C,GAC/BA,EAAOt4H,GAAG,OAAQ,WAChB,GAAI4wK,GAAa,iBACbC,EAAiB9yK,EAAEmB,MAAMm/C,WACzByyH,EAAaD,EAAeztK,KAAK,OAGrC0tK,GAAW5yK,OAAOH,EAAE,WAChBgzK,IAAK,aAAc/pK,KAAM,kBAAmBF,KAAM,cAGtD+pK,EAAeztK,KAAK,0BAA0BnE,KAAK,WACjDlB,EAAEmB,MAAM+E,KAAK,MAAO2sK,EAAa,kBACjC7yK,EAAEmB,MAAMiB,MAAM,MAEhB0wK,EAAeztK,KAAK,0BAA0BnE,KAAK,WACjDlB,EAAEmB,MAAM+E,KAAK,MAAO2sK,EAAa,kBACjC7yK,EAAEmB,MAAMiB,MAAM,MAEhB0wK,EAAeztK,KAAK,0BAA0BnE,KAAK,WACjDlB,EAAEmB,MAAM+E,KAAK,MAAO2sK,EAAa,4BACjC7yK,EAAEmB,MAAMiB,MAAM,MAIhB0wK,EAAeztK,KAAK,YAAYnE,KAAK,WACnClB,EAAEmB,MAAM+E,KAAK,MAAO2sK,EAAa,gBAKvC,QAASI,0BACP,GAAuB,IAAnBC,gBAAuB,CACzB,GAAInlH,GAAM/tD,EAAE,aAAekzK,gBAAkB,2BAC7CnlH,GAAIzqC,KAAK,OAAQ,cAEd4sC,SAASlwD,EAAE,sCAIlB,QAASg0C,iBACkB,mBAAdm/H,YAA2C,SAAdA,WAAwBA,YAC9DnzK,EAAE,SAASkB,KAAK,WAEdlB,EAAEmB,MAAMyT,SAAS1O,KAAK,QAAS,IAC/BuwC,0BAA0Bz2C,EAAEmB,SAKlC,QAASiyK,uBACP,GAAI9yG,GAAQtgE,EAAE,WAAW6mD,GAAG,EACc,QAAtCngD,GAAGC,IAAI4M,QAAQnI,KAAKiY,gBACO,WAAzBi9C,EAAMp6D,KAAK,WAAyBo6D,EAAMl1B,WAAW,WACpDk1B,EAAMp6D,KAAK,UAAW,YAE7Bo6D,EAAMl8D,QAIR,QAASivK,kBACP,GAAIl+J,GAAMnV,EAAE,qBACZ,IAAkB,GAAdmV,EAAIlG,OAAa,CAGnB,GAFAkG,EAAMnV,EAAE,8BAEY,IAAhB0G,GAAGmE,GAAGy5E,OAAenvE,EAAIvU,SAAS,gBAAiB,MACvDwuC,mBACExmC,KAAMd,EAAE,4BACR1F,MAAO,KACN,WACDkxK,iBAAiBp2I,cAAc,MAAO,EAAG,WACvCl9B,EAAE4yB,OAAO,cAAe,aAI5Bzd,GAAIo+J,6BAKR,QAASC,sBACP,GAAIC,GAAezzK,EAAE,0BAA0B+C,QAAQ,qBAAqB+/B,KAAK,mBACjF2wI,GAAarvK,QAGf,QAASsvK,kBAAiBt/I,EAAOu/I,GAC/B3zK,EAAE,WACA,GAAI4zK,qBAAsB,CAExB,GAAIC,IAAqB,CAWzB,IATKF,IACHA,EAAM3zK,EAAE,SAASqF,KAAK,YAEtBwuK,EAA2C,aAArBntK,GAAGuE,eAI3B0oK,EAAI3xK,IAAI,SAASnB,SAAS,UAAUqF,KAAK,QAAS4B,EAAE,SAEtC,OAAVssB,EAEEy/I,EAEFF,EAAIztK,KAAK,QAAS4B,EAAE,UAAU7F,GAAG,QAAS,WACxCwD,OAAOq7B,KAAK,4BAA6B,cAG3C6yI,EAAI1xK,GAAG,gBAAiB,kBAKrB,CACL,GAAI6xK,GACAC,IACJ,KAAKD,IAAW1/I,GAAO,CACrB,GAAIhwB,GAAQ,SAAW4vK,GACrB,MAAO,YAAcvuK,OAAOq7B,KAAKkzI,KAChCF,EACHC,GAAWr/J,MAAO9L,KAAMwrB,EAAM0/I,GAAUvoK,QAASnH,IAanD,GAXI2vK,EAAW9kK,OAAS,IACtB8kK,EAAWA,EAAW9kK,OAAS,GAAGpG,WAAY,GAG5CgrK,GAE+B,mBAAtBzR,qBAAuCA,oBAChD2R,EAAWr/J,KAAK0tJ,oBAIM,IAAtB2R,EAAW9kK,OACb0kK,EAAI1xK,GAAG,gBAAiB,WACtBwD,OAAOq7B,KAAKgzI,SAET,CACL,GAAIhyK,GAAO,GAAI/B,aAAYg0K,GAAc3xK,MAAO,OAAQE,QAAU,KAClEtC,GAAE2zK,GAAK9xK,YAAYC,EAAM,sBASnC,QAAS+0C,+BAA8Bo9H,EAAW/+D,GAEhD,GAAI0+D,qBAAsB,CACnB1+D,IACHA,EAAMl1G,EAAE,cAAc87B,OAAO,YAE/B,IAAI63I,GAAMz+D,EAAI7vG,KAAK,iBACbI,QAAkC,2BAAGiuK,iBAAiBjuK,OAAkC,0BAAEwuK,GAAYN,GAC5GA,EAAIvwK,QAKR,QAAS8wK,+BAA8BC,GAChC1uK,OAAkC,4BAAGA,OAAkC,8BAC5EA,OAAkC,0BAAIzF,EAAE4C,OAAO6C,OAAkC,0BAAG0uK,GAGtF,QAASt+D,oBAAmBmJ,GAE1B,GAAI58G,GAAQ,CACR48G,KAAa58G,EAAQ48G,GACrBh/G,EAAEwB,MAAQxB,EAAE,iBAAiBgkE,OAAOn/D,IAAI,OAAQhB,KAAKgD,KAAK7G,EAAEqG,UAAUjE,QAAUA,GAAS,EAAG,IAAIyC,IAAI,MAAO,KAGjH,QAAS49J,qBACPziK,EAAE,QAAQqF,KAAK,sBAAsBy2B,OAAO,kBAAkB2N,WAAWoI,SAG3E,QAASuiI,eAAcC,GACrB,GAAIC,GAAiB,IACrB,IAA2C,WAAvCp3I,cAAc,QAAQ7Z,eAAsD,GAAxB3c,GAAG0qB,SAASiV,SAAe,CACjF,GAAIkuI,GAAcv0K,EAAE,kBAAkBqF,KAAK,mBAAmB+P,KAC9Dk/J,GAAmBC,EAAcA,EAAYt+J,UAAU,EAAGs+J,EAAYhoK,QAAQ,MAAQ,KAIpF8nK,KAAc,IAAOA,GAAY,GAErCG,eAAgB9vK,GAAIsnB,UAAUoF,SAAS5L,IAAM6uJ,EAAWC,GAG1D,QAASE,eAAczxH,EAAK0xH,EAAMvtI,GAIhC,QAASwtI,KACP,GAAIC,EAAK1lK,OAAS,EAAG,CACnB0lK,EAAKtvK,KAAK,kCAAkCwsC,QAC5C,IAAI+iI,GAAWD,EAAKtvK,KAAK,0BACzBuvK,GAAS1uK,KAAK,QAAS,8BAEvBlG,GAAEiwB,KAAKvpB,GAAGipB,kBAAkBjd,KAAK,WAC/BhM,GAAGmE,GAAGslB,QAAQ1uB,SAKpB,QAASozK,KACP,GAAIF,EAAK1lK,OAAS,EAAG,CACnB,GAAI6lK,GAAc90K,EAAE,qIAChB40K,EAAWD,EAAKtvK,KAAK,0BACzBuvK,GAAS1uK,KAAK,QAAS0uK,EAAS1uK,KAAK,SAAW,oCAChDyuK,EAAKtvK,KAAK,uCAAuCwhD,GAAG,GAAG1mD,OAAO20K,OAE9D90K,GAAEiwB,KAAKvpB,GAAGipB,kBAAkBjd,KAAK,WACN,WAArBhM,GAAGuE,cACLvE,GAAGmE,GAAGslB,QAAQo1G,eAEd7+H,GAAGmE,GAAGslB,QAAQ/sB,QAIpBqE,YAAWitK,EAAgC,KA9B7C,GAAIC,GAAO30K,EAAE,IAAM+iD,EAAIr+C,GAiCvBmwK,KAEAlqK,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChDzH,UAAU4C,MAAMi6I,KAAKkM,0BAA0BhyH,EAAIr+C,IAAIquB,OAAO,SAAU+uB,GAClEA,EAAY7yC,OAAS,GACvBylK,IACAM,mBAAmBjyH,EAAIr+C,GAAI,SAAUuwK,GACnCC,uBAAuBD,EAAQnzH,EAAa2yH,MAG9C/N,WAAW3jH,EAAIr+C,IAAI,EAAMwiC,GAAUutI,EAAM,WACvC,GAAIU,GAAmBn1K,EAAE,6CACrBkkF,EAAYixF,EAAiB//J,MAC7BggK,EAAyD,KAArCD,EAAiBr0K,KAAK,WAC1Cs0K,GACElxF,GACFpxC,gBAAgBiQ,EAAIr+C,GAAIw/E,EAAWuwF,GAIrCY,eAAeF,EAAiBr0K,KAAK,cAAc6R,EAAGowC,EAAIr+C,GAAIw/E,IAG/D,WACDpxC,gBAAgBiQ,EAAIr+C,GAAI,UAAW+vK,SAKxCvrJ,KAAK,WAENxF,IAAIgO,MAAM,oEAId,QAAS4jJ,oBAAmB32H,EAAS42H,GACnC,GAAIruI,GAAUsuI,iBAAiB72H,GAC3BhY,EAAQO,EAAQuuI,UAGpBzpJ,WAAU4C,MAAMi6I,KAAKkM,0BAA0BpuI,GAAO5T,OAAO,SAAU+uB,GACrE,MAAIA,GAAY7yC,OAAS,MACvB+lK,oBAAmBruI,EACjB,SAAUsuI,GACRC,uBAAuBD,EAAQnzH,EAAayzH,SAKlDziI,iBAAgB5L,EAAQuuI,WAAYvuI,EAAQwuI,oBAAoBvrI,OAAQorI,KAI5E,QAASziI,iBAAgBnN,EAAQu+C,EAAWuwF,GAC1CO,mBAAmBrvI,EAAQ,SAAUod,GACnCp4C,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChD,GAAI4wF,GAAYowD,EAAO,GAAe,CACpB,aAAdvwF,IAAyBA,EAAYnhC,EAAI4yH,SAAS5yH,EAAI4yH,SAAS1mK,OAAS,GAAGk7B,QAC3EsqI,EACFr9H,gBAAgB,8CAAgDzR,OAAUod,EAAIv9B,GAAIowJ,OAAU1xF,EAAWsjF,UAAY,GAAS,SAAUj/J,GAC7G,UAAnBA,EAAIglC,YAAwC,KAAdhlC,EAAIse,MAEpCwuJ,eAAe9sK,EAAIse,MAAQte,EAAIse,MAAQte,EAAI8kC,QAAS0V,EAAIv9B,GAAI0+D,GAG5D2xF,wBAAwBxxD,EAAWthE,EAAKmhC,EAAWuwF,IAEpD,MAGHoB,wBAAwBxxD,EAAWthE,EAAKmhC,EAAWuwF,KAGpDvrJ,KAAK,WACNxF,IAAIgO,MAAM,sEAKhB,QAAS2jJ,gBAAezjJ,EAASltB,EAAIw/E,GACnC,GAEI69B,GAFA90D,EAAQi3B,EAAYA,EAAY,EAChC+9E,EAAQjiK,EAAE,oDAEViiK,GAAMhzJ,OAAS,GACjBg+C,EAAMg1G,EAAM7sJ,MACZ2sG,EAAa,WAAcjvE,gBAAgBpuC,EAAIuoD,GAAK,KAGpD80D,EAAa,WAAcjvE,gBAAgBpuC,EAAIuoD,GAAK,IAGtDvmD,GAAG8L,IAAIxR,KAAK,gDAAkD2kC,OAAQjhC,EAAIkxK,OAAsB,YAAd1xF,EAA0B,EAAIj3B,IAC7GzrB,QAAQ,SAAUs0I,GACjB,GAAI3sI,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UAC9BD,GAAK6F,UAAU,eAAgBlnC,EAAE,2BAA4Bi6G,GAC7D54E,EAAK6F,UAAU,UAAWlnC,EAAE,mBAAoB,WAC9C02B,eAAe12B,EAAE,gBAAgB,GACjCrC,OAAOq7B,KAAKslI,kBAAkB1hK,EAAIuoD,GAAM,OAASvoD,GACjDi6B,eAAe,GAAI,KAErBwK,EAAK6F,UAAU,SAAUlnC,EAAE,WAC3BqhC,EAAK8J,oBAAqB,EAC1B9J,EAAKmZ,gBAAiB,EACtBnZ,EAAKq5E,kBAAkB,gBACvBr5E,EAAK/mC,MAAQ,IACb+mC,EAAKi5E,SAASxwF,GACTkkJ,GAAoB3sI,EAAKw4E,WAAW/gE,cAAc,aAY7D,QAASm1H,iBAAgBrxK,EAAIw/E,GAC3B9sC,gBAAgB,gDAAkDzR,OAAQjhC,EAAIkxK,OAAqB,WAAb1xF,EAAyB,EAAIA,GACjG,SAAU37E,GACR,GAAIytK,GAAgBnnK,OAAO,qFACnB6mD,KAAMtP,UAAWv1B,IAAKw1B,UAAWggH,OAAQ3hK,EAAI4hK,QAASpiF,EAAWqiF,QAAS,gBAClF,IAAIh+J,EAAIm2B,QAAS,CACf,GAAIu3I,GAAkB1tK,EAAI6gB,MACtB6sJ,IAAoBj2K,EAAM,MAC5Bw+B,eAAe12B,EAAE,gBAAgB,GACjCrC,OAAOq7B,KAAKslI,kBAAkB1hK,EAAIw/E,GAAY,OAASx/E,GACvDi6B,eAAe,GAAI,IAGnBrM,SAASrpB,KAAO+sK,MAIlB1jJ,UAASrpB,KAAO+sK,GAGpB,SAAU7jJ,GACR,GAAI8X,GAA6B,OAAjB9X,EAAI+X,SAAoBC,OAAOhY,EAAI+X,UAAY5pB,MAC/D5Z,IAAGmE,GAAGylB,WAAWltB,KAAK+uB,EAAIT,MAAOpR,OAAW2pB,KAIlE,QAAS4rI,yBAAwBK,EAAWnzH,EAAKmhC,EAAWuwF,GAC1D,GAAI0B,GAAU,SAAU/vI,GACtBU,aAAaovI,EAAW,SAAUnvI,GAChC,IACEvI,eAAe12B,EAAE,gBACjB,IAAIiH,GAASqnK,mCAAmCrzH,EAAKmhC,EAAWn9C,EAAO0tI,EAClD,IAAhB1xH,EAAI1c,UAAiC,GAAhB0c,EAAI1c,WAAoBD,IAAUr3B,EAAiB,SAAIq3B,GACjFpa,UAAU4C,MAAMoY,gBAAgB,eAAgB,aAAcj4B,GAAQma,KAAK,SAAUd,GAC3D,4BAApBA,EAASwJ,SAEgB,mBAAhBlrB,IAAGmE,GAAG+jB,OACfloB,GAAGmE,GAAG+jB,MAAMynJ,mBAEdR,wBAAwBK,EAAWnzH,EAAKmhC,EAAWuwF,KAEnD51I,UAAUzW,EAASwJ,SACC,MAAhB7iB,EAAOwmK,MAET7uK,GAAG8L,IAAIxR,KAAK,+BACVikC,WAAY8d,EACZtC,cAAeyjC,EACfl4C,eAAe,KAIrBvoB,QAAQC,IAAI0E,KAGhB,MAAOgW,GACL3a,QAAQC,IAAI0a,GAGdO,eAAe,GAAI,MAClBokB,EAAIv9B,GAAI0+D,GAGQ,IAAhBnhC,EAAI1c,UAAmC,GAAhB0c,EAAI1c,SAC9BF,6BAA6B4c,EAAKozH,GAElCA,EAAQ,MAIZ,QAASnB,oBAAmBruI,EAAOpI,GAKjC73B,GAAG8L,IAAIxR,KAAK,gCAAkC2kC,OAAQgB,IAASj0B,KAAK,SAAUnK,GACxEg2B,GAAUA,EAASh2B,KAK3B,QAASu+B,cAAaovI,EAAWI,GAC/B,GAAItnK,UAAUC,QAAU,GAAKD,UAAUC,QAAU,EAAG,CAElD,IAAK,GADD+pD,IAAck9G,UAAaA,GACtBxtK,EAAI,EAAGA,EAAIsG,UAAUC,OAAQvG,IACpCswD,EAAU,SAAWtwD,EAAI,IAAMsG,UAAUtG,EAE3ChC,IAAG8L,IAAIxR,KAAK,6BAA+BgO,UAAUC,OAAS,GAAI+pD,GAAWtmD,KAAK,SAAUnK,GACtF+tK,GAAsBA,EAAqB/tK,MAKrD,QAAS6tK,oCAAmCrzH,EAAK7b,EAASC,EAAO2+H,GAE/D,IAAK,GADDyQ,IAAW,EACN7tK,EAAI,EAAGA,EAAIq6C,EAAI4yH,SAAS1mK,OAAQvG,IACvC,GAAIq6C,EAAI4yH,SAASjtK,GAAGyhC,QAAUjD,EAAS,CAAEqvI,EAAW7tK,CAAG,OAGzD,OACE61B,SAAU,kBACV75B,GAAIq+C,EAAIv9B,GACRpa,KAAM23C,EAAIyzH,WACVvpH,IAAK/lB,EACLrW,IAAMkyB,EAAI4yH,SAASY,GAAYxzH,EAAI4yH,SAASY,GAAUE,OAAO1pJ,UAAY/sB,EAAE,IAAM+iD,EAAIv9B,GAAK,IAAM0hB,GAASpmC,KAAK,WAAWisB,UACzHq+E,OAASroD,EAAI4yH,SAASY,GAAYxzH,EAAI4yH,SAASY,GAAUE,OAAOC,WAAa12K,EAAE,IAAM+iD,EAAIv9B,GAAK,IAAM0hB,GAASpmC,KAAK,WAAW41K,WAC7HtvI,WAAY2b,EAAI1c,SAChBswI,YAAc5zH,EAAI4yH,SAASY,GAAYxzH,EAAI4yH,SAASY,GAAUE,OAAOG,mBAAqB52K,EAAE,IAAM+iD,EAAIv9B,GAAK,IAAM0hB,GAASpmC,KAAK,WAAW81K,mBAC1IlqB,IAAKrmJ,SAASisB,SAASwkD,KACvBy+F,KAAOzP,EAAYA,EAAW,IAAM,IAAqC,GAA7B9lK,EAAE,iBAAiBiP,OAAc,IAAM,IACnFo4B,qBAAsB0b,EAAIxc,WAG1BQ,MAAOI,EACPwlH,OAAuC,SAA9BtmJ,SAASisB,SAASgrF,SAAsB,IAAM,IACvDznG,QAAShG,mBACTqiK,IAAK9rH,WAIT,QAASywH,8BAA6B9zH,EAAK7b,EAASC,EAAO2+H,GAEzD,IAAK,GADDyQ,IAAW,EACN7tK,EAAI,EAAGA,EAAIq6C,EAAI4yH,SAAS1mK,OAAQvG,IACvC,GAAIq6C,EAAI4yH,SAASjtK,GAAGyhC,QAAUjD,EAAS,CAAEqvI,EAAW7tK,CAAG,OAEzD,MAAO,OAASq6C,EAAIv9B,GAClB,SAAWu9B,EAAIyzH,WACf,QAAUtvI,EACV,SAAW6b,EAAI4yH,SAASY,GAAYxzH,EAAI4yH,SAASY,GAAUE,OAAO1pJ,UAAY/sB,EAAE,IAAM+iD,EAAIv9B,GAAK,IAAM0hB,GAASpmC,KAAK,WAAWisB,WAC9H,YAAcg2B,EAAI4yH,SAASY,GAAYxzH,EAAI4yH,SAASY,GAAUE,OAAOC,WAAa12K,EAAE,IAAM+iD,EAAIv9B,GAAK,IAAM0hB,GAASpmC,KAAK,WAAW41K,YAClI,iBAAmB3zH,EAAI4yH,SAASY,GAAYxzH,EAAI4yH,SAASY,GAAUE,OAAOG,mBAAqB52K,EAAE,IAAM+iD,EAAIv9B,GAAK,IAAM0hB,GAASpmC,KAAK,WAAW81K,oBAC/I,QAAUvwK,SAASisB,SAASwkD,KAC5B,UAAYgvF,EAAYA,EAAW,IAAM,IAAqC,GAA7B9lK,EAAE,iBAAiBiP,OAAc,IAAM,KACxF,gDAEYk4B,EACZ,YAA4C,SAA9B9gC,SAASisB,SAASgrF,SAAsB,IAAM,KAC5D,YAAcztG,mBACd,QAAUu2C,UAGd,QAAS0wH,iBAAgBh2K,GACnBA,EAAKmD,GACP06B,eAAe79B,EAAK8wB,QAAS,MAE7B+M,eAAe79B,EAAK8wB,QAAS,MA0BjC,QAASmlJ,wBACPrzJ,IAAIqQ,KAAK,QAAS,sBAClB/H,UAAU4C,MAAMqE,aAGlB,QAAS+jJ,mCAAkCxlI,GACzC,OACExtC,OAAQ,WACNhE,EAAEwxC,GAAK3wC,SAAS,gBAElBE,OAAQ,WACNf,EAAE,sBAAsBqF,KAAK,gBAAgB5E,YAAY,iBAa/D,QAASw2K,iBAAgBvyK,EAAIuoD,EAAKsoH,GAChCf,eAAgB9vK,GAAIA,GAAM6wK,EAAMtoH,GAKlC,QAASiqH,oBAAmBl0I,GAC1BhjC,EAAE,WACAA,EAAE,wBAAwBqF,KAAK,KAAKnE,KAAK,WACvC,GAAI4K,GAAQ9L,EAAEmB,MACV8H,EAAO6C,EAAM5F,KAAK,QAClB0Y,EAAI3V,EAAKy2J,MAAMyX,iBACR,QAANv4J,GAAgBA,EAAE3P,OAAS,GAC9BnD,EAAM5F,KAAK,OAAQ,mBAAqB0Y,EAAE,GAAK,WAAaokB,OAtxNpE,GAAItf,KAAMsI,UAAUgrD,MAAMtzD,GAI1B1jB,GAAE,YAAYqtB,MAAM,WAKlB,OAJA3J,IAAIqQ,KAAK,cAAc,GAAIrtB,IAAGkf,KAAMrB,YACpC5Z,KAAKysK,UAAU11K,OACfiJ,KAAKikB,MAAMyoJ,qBAEH3wK,GAAGuE,eACT,IAAK,QACH4oC,uBACA,MAEF,KAAK,WACHlpC,KAAKikB,MAAMltB,OAEXiJ,KAAKg8I,OAAO19G,QACVquI,gBACAC,mBAEF5sK,KAAKi4C,OACH40H,uBACAC,wBACAC,qBACAC,oBACF9f,cAEAltJ,KAAKgqB,WAAWijJ,SAASl2K,OACzBiJ,KAAK4jD,SAAS55B,WAAWkjJ,qBACzBltK,KAAK44I,YAAYu0B,yBACjB,MAEF,KAAK,YACHntK,KAAKiD,QACHmqK,WAEFptK,KAAKgqB,WAAWijJ,SAASl2K,OACzBiJ,KAAKqtK,MAAMC,iCAAiC,cAAe,uBAC3D,MAEF,KAAK,MACH5wH,yBAEA18C,KAAKgqB,WAAWijJ,SAASl2K,OACzBiJ,KAAKutK,YAAYC,oBAAoB,sCACrC,MAEF,KAAK,OACH9wH,yBAEA18C,KAAKgqB,WAAWijJ,SAASl2K,OACzBiJ,KAAKo/I,MACFquB,gCACAD,qBACH,MAEF,KAAK,SACHxtK,KAAKgqB,WAAWijJ,SAASl2K,MACzB,MAEF,KAAK,MACHiJ,KAAKiD,QACHmqK,WAEFptK,KAAKgqB,WAAWijJ,SAASl2K,OACzBiJ,KAAKs/I,UAAUkuB,qBACf,MAEF,KAAK,WACHxtK,KAAKywB,SACHi9I,sBACAC,8BACAC,2BACAC,oBACAC,uBACAC,4BAEF,MAEF,KAAK,mBACHhyK,GAAGmE,GAAGpF,OAAO6d,KAAK,cAAe,WAC/B,GAAI2rE,GAAOvoF,GAAGmE,GAAG8pB,WAAWihE,KACR,oBAAT3G,IACTvoF,GAAG8L,IAAIC,SAAS,sCACdkV,cAAejhB,GAAGmE,GAAG6a,cACrBizJ,gBAAiBjyK,GAAGmE,GAAG8pB,WAAWihE,MAAMroE,MAAMilF,mBAIpD,MAEF,KAAK,SACH/sG,OAAOwyK,qCAQbjsJ,UAAUqB,MAAM,WACV3mB,GAAGC,IAAIwoB,SACHzoB,GAAGC,IAAI4M,QAAQnI,KAAKiY,cAAc9W,QAAQ,aAAc,GACxDX,SAASlF,GAAGC,IAAI4M,QAAQorC,UAAY,GAC1C3+C,EAAE,2CAA2C6E,IAAI,cAAe,YAWpE7E,EAAEyF,QAAQxD,GAAG,oBAAqB,SAAUuC,GAC1Co0K,yBACAnxK,WAAW,WACTi8G,4BACC,OASFzhH,GAAG,SAAU,WACZ42K,qBAAqB74K,EAAEmB,SAWxBc,GAAG,YAAa,WACO,YAAlByE,GAAGuE,aACLo3J,oBAAoB58J,OAAOqzK,WAE7BnuK,KAAK4jD,SAASC,KAAK81G,oBACnB5gD,6BAMJ13F,UAAUqB,MAAM,WACd,GAAI1iB,KAAKC,mBAAoB,CAC3BlE,GAAGmE,GAAGC,WAAWogE,QACjB,IAAInpE,GAA8C,QAAjC2E,GAAGC,IAAIuoB,GAAG9jB,KAAKiY,eAA4D,YAAjC3c,GAAGC,IAAIuoB,GAAG9jB,KAAKiY,cAA8B,aAAe,WACvHrjB,GAAEqG,UAAUpE,GAAGF,EAAY,QAAS,SAAUyC,GAC5CkC,GAAGmE,GAAGC,WAAWC,MAAMvG,EAAM8C,YAUnC,IAAIyxK,kBAAmB,EACnBC,SACA9c,YAAc,EACdj/G,cAAgB,GAEhBg8H,eAAiB,KACjBC,gBAAkB,EAClBC,UAAW,EAEXC,yBAA2B,eAC3BC,4BAA8B,KAC9BC,kCAAoC,WACpCC,iBAAmBv5K,EAAE,QAAQY,SAAS,UAAY,IAAM,IACxD44K,kBAAoB,GA2BxB/zK,QAAOg0K,gBAAkBz5K,EAAEyF,QAAQrD,QAMnC,WACE,GAAIsG,GAAIrC,SAAS0nB,cAAc,IAC/BrlB,GAAE/D,MAAMvC,MAAQ,OAEhBsG,EAAE/D,MAAMQ,OAASssJ,GAAG,IAEpB,IAAI5zI,GAAIxX,SAAS0nB,cAAc,MAC/BlQ,GAAElZ,MAAM2B,SAAW,WACnBuX,EAAElZ,MAAMf,IAAM6tJ,GAAG,GACjB5zI,EAAElZ,MAAMJ,KAAOktJ,GAAG,GAClB5zI,EAAElZ,MAAMgE,WAAa,SACrBkV,EAAElZ,MAAMvC,MAAQqvJ,GAAG,KACnB5zI,EAAElZ,MAAMQ,OAASssJ,GAAG,KACpB5zI,EAAElZ,MAAM4B,SAAW,SACnBsX,EAAEpJ,YAAY/L,GAEdrC,SAASsB,KAAK8M,YAAYoJ,EAC1B,IAAI2zC,GAAK9oD,EAAEgxK,YAETC,EAAKjxK,EAAEknD,YACT/xC,GAAElZ,MAAM4B,SAAW,QACnB,IAAImrD,GAAKhpD,EAAEgxK,YACPE,EAAKlxK,EAAEknD,YACP4B,IAAME,IAAIA,EAAK7zC,EAAE8zI,aACjBgoB,GAAMC,IAAIA,EAAK/7J,EAAE8zI,aAErBtrJ,SAASsB,KAAKoN,YAAY8I,GAM1BpY,OAAO6rD,eAAiBE,EAAKE,EAK7BjsD,OAAOo0K,gBAAkBF,EAAKC,KAIhC,SAAW9sJ,GAqDT,QAASgtJ,KAoCP,QAASC,KAKHrzK,GAAGC,IAAIid,WAmBT5jB,EAAE,+BAA+B6E,KAAMzC,MAAS,SAYpD,QAAS43K,KACP,GAAIC,GAAQj6K,EAAE,uBACVk6K,EAAQ,gFAEZD,GAAM/zK,KAAK,UAAWg0K,GAYxB,QAASC,KACP,GAAIC,GAAWC,EACXJ,EAAQj6K,EAAE,sBACVi6K,KACFG,EAAY,6EAEZH,EAAM/zK,KAAK,UAAWk0K,GAEtB/zK,SAASsB,KAAKV,iBAAiB,eAAgB,WAC7CozK,EAAa,2DAEbJ,EAAM/zK,KAAK,UAAWm0K,KACrB,IAnGP,GAAyB,UAArB3zK,GAAGuE,cAAP,CAEA,OAAQvE,GAAGC,IAAIuoB,GAAG9jB,MAChB,IAAK,MACH+uK,GACA,MACF,KAAK,UACHH,GACA,MACF,SACED,IAGA/sK,cAAgBusK,kBAClBe,GAA0B,EAC1Bt6K,EAAE,QAAQ6E,KAAM+yJ,aAAc,cAE9B0iB,GAA0B,EAC1Bt6K,EAAE,QAAQkN,WAAW,GAAGrI,KAAM+yJ,aAAc,YAG1CxqJ,EAAeosK,kBACjBx5K,EAAE,QAAQ6E,KAAM01K,aAAc,YAE9Bv6K,EAAE,QAAQgG,UAAU,GAAGnB,KAAM01K,aAAc,YAqF/C,QAASC,KACP,GAAIl1I,GAAOpI,cAAc,QAAQ7Z,aACjC,IAAa,YAATiiB,GAA+B,KAATA,EAA1B,CAEA,GAAIjF,GAAOnD,cAAc,QAAQ7Z,aACpB,SAATgd,GACFrgC,EAAE,mBAAmB6E,KAAM01K,aAAc,UAG3C,IAAIE,GAAoBz6K,EAAE,oBAC1B,IAAIy6K,EAAkBxrK,OAAS,EAAG,CAChC,GAAIyrK,GAAe16K,EAAEyF,QAAQN,SAAWs1K,EAAkBn5K,SAASsC,GACnE62K,GAAkBt1K,OAAOu1K,KAa7B,QAASC,KACP,GAAIC,GAAaC,EAAM/yG,cAAgB,EACnCgzG,EAAez7I,EAAah6B,KAAK,wBAAwBF,SACzD41K,EAAeH,EAAaE,EAAeE,EAC3Cv6C,EAAczgI,EAAE,gBAChBi7K,EAAoB,CACpBx6C,GAAY7/H,SAAS,gBACvBq6K,EAAoBx6C,EAAYt7H,UAElCk6B,EAAal6B,OAAOy1K,EAAaK,EAEjC,IAAIC,GAAel7K,EAAE,+BACjBm7K,EAAW97I,EAAah6B,KAAK,qBACjC,IAAI61K,EAAajsK,OAAS,EACxBksK,EAASh2K,OAAO41K,EAAeG,EAAa/1K,SAAW81K,OAClD,CACL,GAAIl6C,GAAe/gI,EAAE,iBACjBo7K,EAAWp7K,EAAE,wBACjBm7K,GAASh2K,OAAO47H,EAAa57H,SAAWi2K,EAASj2K,SAAW61K,IAWhE,QAASK,KAEP,OAAQ30K,GAAGuE,eAET,IAAK,MACL,IAAK,OAiBH,GAV2C,QAAvCiyB,cAAc,QAAQ7Z,eACxBk+G,EAAe18H,IAAI,aAAc,UAS/By2K,EAAuB,CACzB,GAAIC,GAAYv7K,EAAE,aACdyhI,EAAkB85C,EAAUn5K,QAAUy4K,EAAMz4K,OAChDi9B,GAAaj9B,MAAMq/H,GACnBo5C,EAAMh2K,IAAI,eAAgB48H,EAC1B,IAAIhB,GAAczgI,EAAE,eAChBygI,GAAY7/H,SAAS,eACvB6/H,EAAY57H,IAAI,eAAgB48H,GAGpC+5C,kBAAkBj6C,EAClB,MAEF,KAAK,WAK4B,aAA3B76H,GAAG8oB,YAAYjC,UACZvgB,cAAgBusK,mBAAqBv5K,EAAE4yB,OAAO,qBAAwD,KAAhC5yB,EAAE4yB,OAAO,oBAClFlsB,GAAGwpB,QAAQtiB,QAAQ4rH,WAEdx5H,EAAE4yB,OAAO,qBAAuD,KAAhC5yB,EAAE4yB,OAAO,qBAC5ClsB,GAAGwpB,QAAQtiB,QAAQimE,WAa/B,QAAS4nG,KACP,IACE,MAAOh2K,QAAOyC,OAASzC,OAAO7B,IAC9B,MAAO2B,GACP,OAAO,GAaX,QAASm2K,KAEP,GAAItuK,GAAepN,EAAEyF,QAAQN,UACxBs2K,KAAeruK,EAAeosK,oBACjCpsK,EAAepN,EAAEqG,UAAUlB,SAG7B,IAAIs7H,GAAczgI,EAAE,eAChBygI,GAAYxxH,OAAS,IAAMwxH,EAAY7/H,SAAS,eAClD6/H,EAAYt7H,OAAOiI,EAAeqzH,EAAYn/H,SAASsC,IAGzD,IAAIm9H,GAAe/gI,EAAE,gBACrB,IAAI+gI,EAAa9xH,OAAS,EAAG,CAC3B,GAAI0sK,GAAqB37K,EAAE,YAAYmF,QACvC47H,GAAa57H,OAAOiI,EAAe2zH,EAAaz/H,SAASsC,IACzD,IAAI29H,GAAiBvhI,EAAE,kBAGE,SAArB0G,GAAGuE,eAAgD,cAArBvE,GAAGuE,eAAsD,WAArBvE,GAAGuE,eACvEs2H,EAAep8H,OAAO47H,EAAa57H,SAAWw2K,GAEvB,SAArBj1K,GAAGuE,eAAiD,QAArBvE,GAAGuE,eAEE,GAAjCjL,EAAE,qBAAqBiP,QAC1BsyH,EAAep8H,OAAO47H,EAAa57H,SAAWw2K,EAIlD,IAAIC,GAAgB57K,EAAE,iBAItB,IAHI47K,EAAc3sK,OAAS,GACzBsyH,EAAep8H,OAAO47H,EAAa57H,SAAWw2K,GAE5C37K,EAAE,oBAAoBiP,OAAS,EAAG,CACpC,GAAI4sK,GAAgB77K,EAAE,oBAAoBmF,SAAW,CACrD47H,GAAal8H,IAAI,iBAAkBg3K,GACnC96C,EAAa57H,OAAOiI,EAAe2zH,EAAaz/H,SAASsC,IAAMi4K,EAAgBF,IAInF,GAAIG,GAAe97K,EAAE,sBACjB87K,GAAa7sK,OAAS,IACxB8xH,EAAa57H,OAAOiI,EAAe2zH,EAAaz/H,SAASsC,IAAMi4K,EAAgB,GAE/EC,EAAa32K,OAAOiI,EAAe0uK,EAAax6K,SAASsC,IAAM,IAUnE,QAASm4K,KACP,GAAwB,oBAApBr1K,GAAGuE,cAAP,CAEA,GAAIs2H,GAAiBvhI,EAAE,mBACnB+gI,EAAe/gI,EAAE,iBACjBg8K,EAAaj7C,EAAa57H,QAC9B62K,IAAc,EACdz6C,EAAep8H,OAAO62K,EAAaj7C,EAAa17H,KAAK,YAAYF,UACjEo8H,EAAeh4E,QAAQ,mBAhWzB,GAEEg4E,GACAliG,EACAi8I,EACAT,EACAztK,EANE4tK,EAA0B,EAC5BV,GAA0B,CAa5BxtJ,GAAO+mB,sBAAwB,SAAUvzC,EAAI27K,GAW3C,OAVA7uK,EAAe0f,EAAO1f,eAEtB0sK,IACAv4C,EAAiBvhI,EAAE,mBACnBq/B,EAAekiG,EAAel8H,KAAK,mBACnCi2K,EAAwBj8I,EAAa6G,GAAG,YACxC20I,EAAQt5C,EAAel8H,KAAK,YAE5Bq2K,IAEQh1K,GAAGuE,eACT,IAAK,MACL,IAAK,kBACHuvK,GACA,MAEF,KAAK,MACL,IAAK,OACHG,IAMJoB,IACAV,IAEAr7K,EAAE,QAAQupD,QAAQ,6BA0TnB9jD,QAKH,WAEE,GAAIy2K,GAAW,KACXC,EAAY,IAGhB12K,QAAOmuC,8BAAgC,SAAUtzC,GAC/C,GAAIuM,GAAIG,cACJF,EAAIM,cACJ8uK,IAAYrvK,GAAKsvK,GAAarvK,IAChC+mC,sBAAsBvzC,GACtB47K,EAAWrvK,EACXsvK,EAAYrvK,IAUhBrH,OAAOi+G,yBAA2B,WAChC,GAAIpN,GAAUt2G,EAAE,qBACZs2G,GAAQrnG,OAAS,GAAGqnG,EAAQxoG,OAAO,SAAU,WAAY,WAW/DrI,OAAOmzK,uBAAyB,WAC9B,GAAuB,QAAnBlyK,GAAGC,IAAIuoB,GAAG9jB,KAAd,CACA,GAAIgxK,GAAWp8K,EAAE,qBACjBo8K,GAASv3K,KAAMzC,MAAS,OAAQ+C,OAAUnF,EAAEqG,UAAUlB,aAcxDM,OAAOozK,qBAAuB,SAAU51D,GAStC,MARIA,GAAQo5D,UAAUj1K,aAAa67G,EAAQo5D,UAC3Cp5D,EAAQo5D,SAAW50K,WAAW,WACxBw7G,EAAQ7gH,SAAWqD,OAAOg0K,iBAAmBx2D,EAAQ99G,UAAYM,OAAO62K,mBAC1E72K,OAAOg0K,gBAAkBx2D,EAAQ7gH,QACjCqD,OAAO62K,iBAAmBr5D,EAAQ99G,SAClC89G,EAAQ15D,QAAQ,eAEjB,KACI05D,KAQX,IAAI32D,wBAAwB,EAwaxBkoG,oBAAsB,KA2ItBkB,cAo3BA+H,oBAAsBh4J,OAAOY,SAASo3J,oBAAsB,SAAUvkI,EAAShZ,EAAOsc,GACxF,GAAKtD,EAEL,GAAIxyB,GAAGmE,GAAGgD,KAAK+a,UAAW,CAExB,GAAIyP,GAAM3xB,GAAGmE,GAAGgD,KAAK2Y,WAAW0S,EAEhC,IADKb,IAAKA,EAAM3xB,GAAGmE,GAAGgD,KAAKq6H,wBAAwBhvG,KAC9Cb,EAAK,CACR,GAAIvD,GAASpuB,GAAGmE,GAAGgD,KAAK6nB,SAASZ,MACjC,KAAK1pB,OAAQ0pB,GACX,IAAK90B,EAAE8jB,WAAWgR,EAAO1pB,QAAU0pB,EAAO1pB,MAAMiJ,YAC9CgkB,EAAMvD,EAAO1pB,MAAM88H,wBAAwBhvG,IAClC,MAKXb,GACFA,EAAImC,SAASta,EAAOsc,OAItBx8B,GAAE,IAAMk5B,GAASqc,UAAU,GAAKr1B,EAAO,GAAKsc,EAAc,GAAKA,OAC/D60B,sBA6ZAzF,gBAAkB,SAAU/oD,EAAIF,EAASe,EAAQ64K,GACnD92K,OAAOkF,KAAK44I,YAAYngJ,KAAKP,EAAIF,EAASe,EAAQ64K,IAIhDC,WAEJ,WAIE,GAAIC,IAAoB,CAExBD,WAAY,SAAUl1I,GACpB,MAAO,IAAIo1I,gBAAep1I,IAG5Bo1I,eAAiB,SAAUp1I,GACzBtnC,EAAE4C,OAAOzB,KAAMmmC,EACf,IAAIq1I,GAAUx7K,KAAKigB,eAAe,MAAQjgB,KAAKmI,GAAGjE,KAAK,gBAAkB,EAErEs3K,GAAQ1tK,SACV9N,KAAKiK,KAAOuxK,EAAQ53K,SAGxB23K,eAAex5K,WACb05K,QAAS,WAGP,QAASnU,GAAKC,GACZ,GAAInlD,GAAYrmF,cAAc,KACb,KAAbqmF,IAAiBA,EAAYC,mBAGjC2yC,kBAAkB,OAAQ5yC,EAAWzgC,EAAU,KAAM4lF,GAPvD,GAAI5lF,GAAW3hF,KAAKuD,GAWhBkiC,EAAWzlC,KAAKmI,GAAGpD,KAAK,WAC5B,OAAI0gC,GAAW,MACb/H,WAAU/2B,EAAE,2CAA4C,KAAM,SAIhE2gK,MAGF58H,WAAY,WACV,GAAI4wI,EACF,OAAO,CAEPA,IAAoB,CACtB,IAAIv4J,GAAK/iB,KACLmI,EAAKnI,KAAKigB,eAAe,MAAQjgB,KAAKmI,GAAK,GAC3C5E,EAAKvD,KAAKuD,GACV6wK,EAAOp0K,KAAKigB,eAAe,cAAiC,KAAjBjgB,KAAK07K,YAA4C,KAAvBvzK,EAAGpD,KAAK,YACjFs4B,gBAAe+2I,EAAOztK,EAAE,gBAAkBA,EAAE,kBAC5C,IAAIsc,IAAS,CA+Bb,OA7BApkB,GAAEqhC,MACAt4B,KAAM,OACNu4B,YAAa,kCACbC,SAAU,OACV5b,IAAK4vJ,EAAO,sBAAwB,wBACpCz0K,KAAM,eAAiB4D,EAAK,yBAC5BkpB,OAAO,EACPC,OAAO,EACP2T,QAAS,SAAUj5B,GAEjB,GADAA,EAAMA,EAAIoK,GACNqqB,kBAAkBz0B,GACtB,MAAIA,GAAIm2B,SACFxa,EAAG9C,eAAe,MACpB9X,EAAGpD,KAAK,WAAYqvK,EAAO,IAAM,KAEjCv1K,EAAE,aAAaoV,IAAImgK,EAAO,IAAM,KAClC52I,eAAe,GAAI,IACZ,IAIPA,eAAe,GAAI,GACnBvM,UAAU7pB,EAAIse,OACdzC,GAAS,GAEJ,MAIJA,GAIT04J,mBAAoB,WAClB,OAAS3zK,SAA2C,KAAjChI,KAAKmI,GAAGpD,KAAK,iBAAyB0C,KAAMzH,KAAK47K,sBAGtEA,kBAAmB,WACjB,MAAmC,KAA5B57K,KAAKmI,GAAGpD,KAAK,YAAqB,cAAgB,aAG3D82K,eAAgB,SAAUz+I,GACxB,QAAS0+I,KACP97K,KAAK+7K,qBAAuB/7K,KAAKmI,GAAGxI,KAAK,wBACpCK,KAAK+7K,sBACR/7K,KAAKg8K,wBAAwBh8K,KAAKi8K,0BACpC7+I,EAASv9B,KAAKG,MAGhBA,KAAKqvK,SAAWrvK,KAAKmI,GAAGxI,KAAK,YACxBK,KAAKqvK,SAQRyM,EAAOj8K,KAAKG,OAPZA,KAAKmI,GAAGzI,SAAS;AACjBM,KAAKk8K,YAAY,WACfl8K,KAAKmI,GAAG7I,YAAY,eACpBU,KAAKmI,GAAGxI,KAAK,WAAYK,KAAKqvK,UAC9ByM,EAAOj8K,KAAKG,UAOlBm8K,eAAgB,SAAU/+I,GACxBp9B,KAAKmI,GAAGxI,KAAK,YAAY,GACzBK,KAAK67K,eAAe,WAAkBz+I,GAAUA,EAASv9B,KAAKG,SAGhEo8K,eAAgB,SAAUz7K,EAAMy8B,GAC9B,GAAIra,GAAK/iB,IAcT,IAXAnB,EAAE4C,OAAOd,EAAKwL,YAAY,eACxB1E,KAAM,sBACNW,KAAM,mDACNpB,SAAU,oCAEZnI,EAAE4C,OAAOd,EAAKwL,YAAY,eACxB1E,KAAM,gBACNW,KAAM,iDACNpB,SAAU,+BAGyB,mBAA1Bq1K,uBAAuC,CAChD,GAAI90K,GAAI1I,EAAEw6D,QAAQ14D,EAAKwL,YAAY,iBAAkBxL,EAAKY,MACtDgG,KAAK,GAAO5G,EAAKwL,YAAY,UAC/BxL,EAAKwL,YAAY,iBAAiBzE,WAAY,EAC9C/G,EAAKY,MAAM4T,OAAO5N,EAAI,EAAG,GACvBhE,GAAI,OACJkE,KAAM,OACNW,KAAM,2BACNgC,QAAS,WACP2Y,EAAGu5J,eAEL50K,WAAW,KAIjB01B,KA6EFm3I,kBAAmB,WACjB,MAAOv0K,MAAKu8K,mBAAmBv8K,KAAK+7K,uBAGtCC,wBAAyB,SAAUnzH,GACjC,GAAI9lC,GAAK/iB,IACT+iB,GAAGg5J,qBAAuBlzH,EAC1B9lC,EAAG5a,GAAGxI,KAAK,uBAAwBkpD,IAErC2zH,oBAAqB,SAAU1wH,GAC7B,GAAI2wH,GAAU,oEACd,OAAI3wH,GAAI4wH,SACChvK,OAAO+uK,EAAS,uCAAwC91K,EAAE,iBAE1D,IAGXu1K,YAAa,SAAU9+I,GACrB,GAAI75B,GAAKvD,KAAKuD,GACVkD,EAAQzG,IACZ+xB,aAAY,kCAAoCyS,OAAQjhC,EAAIo5K,iBAAiB,GAAQ,SAAUv1K,GACzFA,EAAIm2B,UACN92B,EAAM4oK,SAAWjoK,EAAI6gB,OAAOusJ,SAC5B/tK,EAAM4oK,SAAShmI,KAAK,SAAU/rB,EAAGpJ,GAAK,MAAOA,GAAE80B,OAAS1rB,EAAE0rB,SACtD5L,GAAUA,EAASv9B,KAAK4G,OAKlCw1K,uBAAwB,WACtB,GAAInwH,GAAM9rD,KAAKqvK,SAASphK,OASxB,OARA69C,GAAIziB,KAAK,SAAU/rB,EAAGpJ,GACpB,GAAIoJ,EAAEs/J,WAAa1oK,EAAE0oK,UAAW,CAC9B,GAAI3kD,IAAY,EAAG,EAAG,EACtB,OAAOA,GAAS36G,EAAEs/J,WAAa3kD,EAAS/jH,EAAE0oK,WAE1C,MAAO1oK,GAAE80B,OAAS1rB,EAAE0rB,SAGpB8iB,EAAIh+C,OAAS,EAAUg+C,EAAI,GAAG9iB,QAC3B,GAGTuzI,mBAAoB,SAAU1zH,GAC5B,MAAOhqD,GAAEu6D,KAAKp5D,KAAKqvK,SAAU,SAAUvjH,GAAO,MAAOA,GAAI9iB,QAAU6f,IAAQ,IAG7Eg0H,SAAU,WACR,GAAI95J,GAAK/iB,KACLwR,EAAI3S,EAAE0nB,UAEVsE,WAAU4C,MAAMkE,kBAAkB,cAAcpgB,KAAK,SAAU+/B,GAC7D,GAAIwrI,GAAmB,CACvBv3K,IAAGkoB,MAAMi6I,KAAKkM,0BAA0B7wJ,EAAGxf,IAAIgO,KAAK,SAAUovC,GAC5Dm8H,EAAmBn8H,EAAY7yC,OAC3BgvK,EAAmB,GACrBjJ,mBAAmB9wJ,EAAGxf,GAAI,SAAUuwK,GAClCC,uBAAuBD,EAAQnzH,GAAa,OAKlDnvC,EAAEsW,SAASwpB,GAAmC,GAApBwrI,KACzB/0J,KAAK,WACNvW,EAAEsW,SAAQ,KAGZtW,EAAED,KAAK,SAAUwrK,GACXA,GAAexX,WAAWxiJ,EAAGxf,IAAI,EAAM,GAAG,MAIlDy5K,SAAU,WACR3J,cAAcrzK,MAAM,IAGtBi9K,aAAc,WACZ5J,cAAcrzK,MAAM,IAGtBsrC,OAAQ,WACNi6H,WAAWvlK,KAAKuD,IAAI,GACpBvD,KAAKmI,GAAGxI,KAAK,YAAY,IAG3Bu9K,OAAQ,WACN,GAAIp3I,GAAQ9lC,KAAKuD,GACb+jK,EAAO,SAAUC,GACnBZ,cAAc7gI,EAAO,SAAU,KAAM,KAAM,KAAMyhI,IAG/C9hI,EAAWzlC,KAAKmI,GAAGpD,KAAK,YACxB+tB,EAAa9yB,KAAKmI,GAAGpD,KAAK,gBAC1B0gC,IAAYh7B,SAASg7B,GAAY,EACnCj8B,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChD,GAAIwS,GAAU,SAAUvU,GAASmN,UAAUnN,EAAO,KAAM,KACxD,QAAQkV,GACN,IAAK,IACH5a,UAAU4C,MAAMi6I,KAAKD,wBAAwB3hI,EAAOL,EAAU3S,EAAY,GAAIw0I,EAAMxiI,EACpF,MACF,KAAK,IACL,IAAK,IACHE,6BAA6B,GAAI,SAAUC,GAAYpa,UAAU4C,MAAMi6I,KAAKD,wBAAwB3hI,EAAOL,EAAU3S,EAAYmS,EAAUqiI,EAAMxiI,QAGpJ/c,KAAK,WACN4+I,cAAc7gI,KAGhB6gI,cAAc7gI,IAIlBq3I,cAAe,WACbxW,cAAc3mK,KAAKuD,GAAI,wBAGzB65K,kBAAmB,WACjBp9K,KAAK67K,eAAe,WAIhB,QAASwB,KACPhgJ,eAAeyuB,EAAI4wH,SAAW/1K,EAAE,kBAAoBA,EAAE,iBACtDorB,YAAY,qCAAuCyS,OAAQzhB,EAAGxf,GAAIkxK,OAAQ3oH,EAAI9iB,QAC5E,SAAU5hC,GACJA,EAAI8kC,SAAW9kC,EAAIse,MACrB8X,eAAep2B,EAAI8kC,SAAW9kC,EAAIse,MAAO,KAEzC8X,iBACFza,EAAGo5J,mBAXX,GAAIp5J,GAAK/iB,KACL8rD,EAAM9rD,KAAKu0K,mBACXzoH,GAAIwxH,mBAYDxxH,EAAI4wH,SAGPW,IAFApvI,iBAAiBtnC,EAAE,wBAAyBmlD,EAAI9iB,OAAQjmB,EAAG9Y,MAAOozK,GAIpEthI,qBAAqB+P,EAAIyxH,0BAA2B,QAK1DjB,YAAa,WACXt8K,KAAK67K,eAAe,WAClB,GAAI94J,GAAK/iB,KACL8rD,EAAM9rD,KAAKu0K,mBACftmI,kBAAiBtnC,EAAE,wBAAyBmlD,EAAI9iB,OAAQjmB,EAAG9Y,MAAO,WAChE8Y,EAAGy6J,aAAa1xH,EAAKuwH,sBAAuB,WAAc7+I,iBAAkBza,EAAGo5J,wBAKrFqB,aAAc,SAAU1xH,EAAKwgH,EAAMlvI,GACjC,GAAI32B,GAAQzG,IAEZq9B,gBAAe12B,EAAE,iBACjBq5J,iBAAiB,WACf,GAAIkN,GAAKnN,iBACT,KACE,GAAI0d,GAAUvQ,EAAG+B,0BAA0B3C,EAAKh6I,OAAQg6I,EAAK/oK,IAC7D,MAAOa,GACP,GAAIA,EAAEqsB,QAAQrlB,QAAQ,qCAAsC,EAG1D,KAAMhH,EAFNq5K,GAAU,KAKd,GAAe,MAAXA,EACF,KAAM92K,GAAE,uEACVorB,aAAY,oCAAsCyS,OAAQ/9B,EAAMlD,GAAIunK,WAAYh/G,EAAI9iB,OAAQgkI,UAAU,GAAShN,iBAAiB,SAAU54J,GACxI,IAAIA,EAAIm2B,QAoBN,KAAMn2B,GAAIse,KAnBV,IAAI/lB,GAAOyH,EAAI6gB,OACXglJ,EAAaC,EAAGC,KAAKsQ,EAAS99K,EAClCoyB,aAAY,gCACVyS,OAAQ/9B,EAAMlD,GACdunK,WAAYh/G,EAAI9iB,OAChBqkI,QAASJ,EACTK,mBAAoBhB,EAAKh6I,OACzBi7I,QAAS,GACTC,iBAAiB,EACjBC,eAAe,EACfC,UAAW,IACV1N,iBAAiB,SAAU54J,GAC5B,IAAKA,EAAIm2B,QAAS,KAAMn2B,GAAIse,KAE1B8X,kBACIJ,GAAUA,eAU1BsgJ,cAAe,WACb,GAAIj4I,GAAWzlC,KAAKmI,GAAGpD,KAAK,YACxBygC,EAAQxlC,KAAKuD,GACbuvB,EAAa9yB,KAAKmI,GAAGpD,KAAK,gBAC9B0hK,sBAAqBjhI,EAAO,KAAMC,EAAU3S,OAQlD,IAAIuhJ,mBAEJ,WACEA,iBAAmB,SAAUluI,GAC3B,MAAO,IAAIw3I,uBAAsBx3I,IAGnCw3I,sBAAwB,SAAUx3I,GAChCtnC,EAAE4C,OAAOzB,KAAMmmC,IAGjBw3I,sBAAsB57K,WACpBuyK,SAAU,WACR,OAAQt0K,KAAKuD,GAAG0L,MAAM,KAAK,IAG7BslK,kBAAmB,WACjB,MAAOv0K,MAAKmI,GAAGxI,KAAK,YAGtBy8K,eAAgB,SAAUz7K,EAAMy8B,GAC9B,GACI0uB,GAAM9rD,KAAKu0K,mBACXzoH,GAAI4wH,UACN79K,EAAE4C,OAAOd,EAAKwL,YAAY,eACxB1E,KAAM,sBACNW,KAAM,mDACNpB,SAAU,2CAEZnI,EAAE4C,OAAOd,EAAKwL,YAAY,kBACxB1E,KAAM,2BACNW,KAAM,yBAGRvJ,EAAE4C,OAAOd,EAAKwL,YAAY,eACxB1E,KAAM,gBACNW,KAAM,iDACNpB,SAAU,yCAEZnI,EAAE4C,OAAOd,EAAKwL,YAAY,kBACxB1E,KAAM,yBACNW,KAAM,sBAGVg1B,KAGFy/I,SAAU,WACR,GAAI/wH,GAAM9rD,KAAKu0K,mBAGf9P,eAAczkK,KAAKs0K,WAAYxoH,EAAI9iB,QAAQ,GAAO,IAGpD40I,cAAe,WACb,GAAI9xH,GAAM9rD,KAAKu0K,mBACf5N,eAAc3mK,KAAKs0K,WAAY,SAAUxoH,EAAI9iB,SAI/CyrH,YAAa,WAIX,GAAI3oG,GAAM9rD,KAAKu0K,oBACXxxJ,EAAK/iB,IACTsG,YAAW,WACTyc,EAAGo5J,kBACF,KACH1X,cAAczkK,KAAKs0K,WAAYxoH,EAAI9iB,QAAQ,GAAM,IAGnDo0I,kBAAmB,WAGjB,QAASC,KACPhgJ,eAAeyuB,EAAI4wH,SAAW/1K,EAAE,kBAAoBA,EAAE,iBACtDorB,YAAY,wCAA0CyS,OAAQzhB,EAAGuxJ,WAAYG,OAAQ3oH,EAAI9iB,QACvF,SAAU5hC,GACFA,EAAI8kC,QACRjb,UAAU7pB,EAAI8kC,SAAS,GAEd9kC,EAAIse,MACbuL,UAAU7pB,EAAIse,OAAO,GAErB3C,EAAGo5J,iBAEL3+I,eAAe,GAAI,KAdzB,GAAIza,GAAK/iB,KACL8rD,EAAM/oC,EAAGwxJ,mBAgBRzoH,GAAI4wH,SAGPW,IAFApvI,iBAAiBtnC,EAAE,qCAAsCmlD,EAAI9iB,QAASq0I,IAM1EQ,UAAW,WACT,GAAIrgI,GAAUx9C,KAAKu0K,oBACf9uI,EAAWlgC,GAAG0qB,SAASiV,SACvBpS,EAAavtB,GAAG0qB,SAASmV,UAC7BqhI,sBAAqBzmK,KAAKs0K,WAAY92H,EAAQxU,OAAQvD,EAAU3S,IAGlEwY,OAAQ,WACN,GAAIwgB,GAAM9rD,KAAKu0K,mBACfhP,YAAWvlK,KAAKs0K,YAAY,EAAOxoH,EAAI9iB,SAGzCk0I,OAAQ,WAEN,GAAIpxH,GAAM9rD,KAAKu0K,mBACf5N,eAAc3mK,KAAKs0K,WAAY,SAAUxoH,EAAI9iB,SAG/CmkI,KAAM,WACJlE,SAASjpK,KAAKs0K,WAAYt0K,KAAKu0K,oBAAoBvrI,SAGrD80I,OAAQ,WACN,GAAI/6J,GAAK/iB,IACT,IAAwB,OAApBuF,GAAGuE,gBAA2BvE,GAAGwpB,QAAQgvJ,UAE3C,WADArgJ,WAAU/2B,EAAE,2BAA4B,KAAM,IAGhD,IAAImlD,GAAM/oC,EAAGwxJ,mBAETzoH,GAAI4wH,YAAa,EACnBv5H,YAAYx8C,EAAE,iCAAkCmlD,EAAI9iB,OAAQzjC,GAAG0qB,SAASolJ,WAAYvpH,EAAIkyH,OAAOC,aAAcrvK,eAAe,GAAI6F,MAAKq3C,EAAIkyH,OAAOE,aAEhJjwI,iBAAiBvgC,OAAO/G,EAAE,2BAA6B43C,EAAKuN,EAAI9iB,SAAW,WACzE3L,eAAe12B,EAAE,qBACjBorB,YAAY,iCAAmCyS,OAAQzhB,EAAGuxJ,WAAYG,OAAQ3oH,EAAI9iB,QAAU,SAAU5hC,GACpG,GAAIA,EAAIm2B,QACNwe,qBAAqBp1C,EAAE,4BACvBoc,EAAGo5J,qBACE,CACL3+I,eAAe,GAAI,EACnB,IAAIsL,GAA6B,OAAjB1hC,EAAI2hC,SAAoBC,OAAO5hC,EAAI2hC,UAAY5pB,MAC/D5Z,IAAGmE,GAAGylB,WAAWltB,KAAKmF,EAAImpB,MAAOpR,OAAW2pB,SAStDq1I,SAAU,SAAU/xJ,GAClB,GAAIrJ,GAAK/iB,KACL8rD,EAAM/oC,EAAGwxJ,mBAEb,OAAIhvK,IAAG0qB,SAASqjJ,KAAKoJ,WAAan3K,GAAG0qB,SAASqjJ,KAAK8K,iBACjDntJ,WAAUtqB,EAAE,uBAAwBpB,GAAG0qB,SAASqjJ,KAAK2K,aAAcrvK,eAAe,GAAI6F,MAAKlP,GAAG0qB,SAASqjJ,KAAK4K,cAI9G7gJ,qBACA93B,IAAGwnB,SAAS7nB,SAASs4C,QAAQ0lC,SAASngE,EAAGuxJ,WAAYxoH,EAAI9iB,OAAQ5c,GAAO7a,KAAK,WAC3EwR,EAAGo5J,iBACHp5J,EAAGs7J,0BAA0BvyH,EAAI9iB,OAAQ5c,GACzCoR,mBACCzV,KAAK,WACNyV,qBAKJ6gJ,0BAA2B,SAAUx1H,EAAKz8B,GAC3B,GAATA,GACF7mB,GAAGwpB,QAAQ45I,qBAAuB,EAClCpjK,GAAGwpB,QAAQylJ,SAAS3rH,EAAM,GAAGy1H,iBAAmBlyJ,GAEK,GAAjD7mB,GAAGwpB,QAAQylJ,SAAS3rH,EAAM,GAAGy1H,mBAC/B/4K,GAAGwpB,QAAQylJ,SAAS3rH,EAAM,GAAGy1H,iBAAmBlyJ,EAChD7mB,GAAGwpB,QAAQ45I,qBAAuB,IAMxC4V,WAAY,WACV,GAAIx7J,GAAK/iB,KACL8rD,EAAM/oC,EAAGwxJ,mBAGb,IAAIhvK,GAAG0qB,SAAS8tJ,aAAc,EAE5B,WADA9sJ,WAAUtqB,EAAE,4BAA4B,EAK1C,IAAIpB,GAAG0qB,SAASqjJ,KAAKoJ,WAAan3K,GAAG0qB,SAASqjJ,KAAK8K,aAEjD,WADAntJ,WAAUtqB,EAAE,uBAAwBpB,GAAG0qB,SAASqjJ,KAAK2K,aAAcrvK,eAAe,GAAI6F,MAAKlP,GAAG0qB,SAASqjJ,KAAK4K,aAAa,EAI3H,IAAIphK,GAAI,GAAIvX,IAAGunB,WAAWxD,MAAMC,YAAY,mBAC5CzM,GAAE+nG,eAAe,YACjB/nG,EAAEuvG,SAAS,OACX,IAAI76G,GAAI,GAAIjM,IAAGunB,WAAWhH,QAAQ6D,UAClCnY,GAAEoY,MAAQjjB,EAAE,eACZ6K,EAAE2vC,gBAAiB,EACnB3vC,EAAEsgC,oBAAqB,EACvBtgC,EAAE1O,GAAK,WACLu6B,iBACA93B,GAAGwnB,SAAS7nB,SAASs4C,QAAQqlC,QAAQ9/D,EAAGuxJ,WAAYxoH,EAAI9iB,OAAQlsB,EAAE2c,SAAS,SAASloB,KAAK,WACvFwR,EAAGo5J,iBACH3+I,eAAe72B,EAAE,4BAA6B,OAC7CohB,KAAK,WACNyV,oBAGJhsB,EAAE2Q,KAAK,SAAU,WAEfrF,EAAEuc,SAAS,OAAQtW,EAAG5a,GAAGjE,KAAK,iBAAiBuD,UAEjD+J,EAAEqY,QAAQ/M,EAAEjZ,UACZ2N,EAAEvP,QAGJk6K,eAAgB,WACkB,mBAArBr2H,oBAAkCA,wBASnD,IAAI91B,MAEJ,WAEEA,IAAM,SAAUmW,GACd,MAAO,IAAIq4I,UAASr4I,IAGtBq4I,SAAW,SAAUr4I,GACnBtnC,EAAE4C,OAAOzB,KAAMmmC,IAGjBq4I,SAASz8K,WACP08K,mBAAoB,WAClB,OACEh3K,KAAMzH,KAAKmI,GAAG1I,SAAS,UAAY,oBAAsB,sBACzD2I,KAAMpI,KAAKmI,GAAG1I,SAAS,UAAY,cAAgB,kBAIvDi/K,WAAY,SAAUv6J,GACpB,GAAI1d,GAAQzG,KACRmI,EAAK1B,EAAM0B,EACE,oBAANA,KACTA,EAAKtJ,EAAEslB,GAAMviB,QAAQ,UACJ,mBAARuiB,KACTA,EAAOhc,EAAGjE,KAAK,6BAGjB,IAAIy6K,GAASx2K,EAAG1I,SAAS,SACzB49B,gBAAe12B,EAAE,gBACjBorB,YAAY,wBAA0BiO,MAAOv5B,EAAMlD,GAAIq7K,OAAQD,GAAU,SAAUv3K,GAC7EA,EAAIm2B,SACFohJ,GACFx2K,EAAG7I,YAAY,UACfu6J,yBAAwB,GACpB11I,GAAMtlB,EAAEslB,GAAM1c,KAAKd,EAAE,0BAEzBwB,EAAGzI,SAAS,UACZm6J,wBAAwB,GACpB11I,GAAMtlB,EAAEslB,GAAM1c,KAAKd,EAAE,uBAE3B62B,kBAEAA,eAAe72B,EAAE,YAAaS,EAAIse,OAAQ,QAKhDynJ,KAAM,iBA4RV,SAAWxhJ,GACT,GAAIkzJ,MAEAC,EAAkB,SAAUC,GAC9B,GAAIC,GAAUngL,EAAEkgL,GAAsB9qK,KAGtC,OAFApV,GAAE0P,WAAW0zJ,YAAYpjK,EAAE0P,WAAWE,SAASuwK,IAC/CngL,EAAEiQ,WAAWmzJ,YAAYpjK,EAAE0P,WAAWE,SAASuwK,IACxCA,EAGTH,GAAiBI,WAAa,SAAUF,GACtC,GAAIC,GAAUF,EAAgBC,EAE9BlgL,GAAEiwB,KAAKvpB,GAAG+oB,WAAW/c,KAAK,WAAcsZ,UAAU4C,MAAMyxJ,YAAYF,EAAQ/vK,MAAM,KAAK,MAE9D,GAArBpQ,EAAE,SAASiP,QACbjP,EAAE,cAAcG,OAAO,gDAEzBy9B,SAAS,QAAUuiJ,GAAS,IAG9BH,EAAiBM,cAAgB,SAAUJ,GACzC,GAAIC,GAAUF,EAAgBC,EAC9BlgL,GAAE4yB,OAAO,OAAQutJ,IAInBrzJ,EAAOkzJ,iBAAmBA,GACzBv6K,OA4BH,IAAIy8J,2BAwBJ,WACE,GAAIqe,GAAY,EACZC,EAAiB,EACjBC,GAAiB,EAWjBC,GATev/K,KAAK+oD,aAAe,WAErC,MAAOq2H,IAGep/K,KAAKw/K,kBAAoB,WAC/C,MAAOH,IAGWr/K,KAAKu/K,cAAgB,SAAUrkJ,EAAOorD,EAAYm5F,GACpEL,EAAYlkJ,EACZmkJ,EAAiB/4F,EACjBg5F,EAAiBG,EAUQ,qBAArBl6K,GAAGuE,cAAsCjL,EAAE,aAAa+E,KAAK,IAAMs3B,EAAQ,KAC1Er8B,EAAE,aAAa+E,KAAK+C,EAAE,gBAAiBu0B,KAGxBl7B,MAAKsvD,gBAAkB,WAC3CiwH,EAAcH,EAAWC,EAAgBC,IAGrBt/K,KAAK0/K,gBAAkB,SAAUC,GACpC,SAAbP,IACFA,EAAY30K,SAAS20K,EAAW,IAAMO,GAEvB,SAAbP,IACFC,EAAiB50K,SAAS40K,EAAgB,IAAMM,GAElDJ,EAAcH,EAAWC,EAAgBC,OA2Y7CzgL,EAAEqG,UAAUid,KAAK,QAAS,SAAUzgB,EAAIvC,GACtC,GAAIygL,IAAa/gL,EAAE6C,EAAGyE,QAAQ1G,SAAS,yBAAkF,GAAvDZ,EAAE6C,EAAGyE,QAAQsN,OAAO,yBAAyB3F,MAEvF,IAApB8pK,kBAAyBgI,IAAYhI,iBAAiBt3K,OAAQs3K,iBAAmB,KA2BvF,WAEE,QAASiI,GAAKlc,GACZ,MAAO,4CAA8CA,EAAU,wJAIjE,QAASmc,GAAkB7uK,EAAKrJ,GAC9B,GAAI8lC,GAAWz8B,EACX8uK,EAAa,GACbx+D,EAAgBtwG,EAAI7F,QAAQ,IAC5Bm2G,KAAiB,IACnB7zE,EAAWz8B,EAAI6D,UAAU,EAAGysG,GAC5Bw+D,EAAc9uK,EAAI6D,UAAUysG,EAAgB,EAAGtwG,EAAInD,QAASuR,yBAEzDzX,IAAMA,EAAO,GAClB,IAAIo4K,GAAc,EAKlB,OAJAA,IAAe,uCAAyCp4K,EAAO,KAC/Do4K,GAAe,kDAAoDtyI,EAAW,SAC9EsyI,GAAe,oCAAsCD,EAAa,SAClEC,GAAe,SAKjBhgL,KAAK6jK,mBAAqB,SAAU5yJ,GAClC,GAAI7J,GAAMvI,EAAEghL,EAAK,aAGjB,OAFAz4K,GAAIpI,OAAO8gL,EAAkB7uK,EAAK,QAE3B7J,GAGTpH,KAAK4jK,iBAAmB,SAAU3yJ,GAChC,GAAI7J,GAAMvI,EAAEghL,EAAK,SAGjB,OAFAz4K,GAAIpI,OAAO8gL,EAAkB7uK,EAAK,QAE3B7J,GAGTpH,KAAKghD,gBAAkB,SAAU/vC,GAC/B,GAAI7J,GAAMvI,EAAEghL,EAAK,QAGjB,OAFAz4K,GAAIpI,OAAO8gL,EAAkB7uK,EAAK,SAASq3B,WAAWzmC,QAAQkD,KAAK,QAAS,sBAErEqC,KAiaX,IAAI6+J,oBAAqB,WACvB,GAAInF,GAAQjiK,EAAEmB,KACd,IAAI8gK,EAAM/7H,GAAG,YAAa,CACxB,GAAIgtE,GAAQlzG,EAAE,iBACVu1K,EAAOriE,EAAM7tG,KAAK,SAClB+7K,EAAaluE,EAAM7tG,KAAK,cAE5B,IAAI48J,EAAMnhK,KAAK,eAAgB,CAC7B,GAAIqmK,GAAsB,GAAIn7I,WAAUiC,WAAWgH,SAASpnB,KAAK2Y,WAAW+rE,KAAK,iBAAkB,iBACnG40E,GAAoB10E,cACpB00E,EAAoBx0E,SAAS7qF,EAAE,MAAOA,EAAE,OACxCq/J,EAAoB3sI,SAAS1yB,EAAE,OAE/BpB,GAAGwnB,SAASltB,KAAK,gDACbqgL,WAAYpf,EAAMnhK,KAAK,eAAgBmrK,WAAYhK,EAAM7sJ,QAC3DosB,QAAQ,SAAUj5B,GAChB,GAAI+4K,GAA2B/4K,CAC/BkC,GAAEvJ,KAAKogL,EAA0B,SAAU3jK,GACrCA,GAAK7V,EAAE,OACTq/J,EAAoBx0E,SAASh1E,EAAGA,KAGhC2jK,EAAyBryK,QAAU,GAAKqyK,EAAyB,KAAOx5K,EAAE,MAC5Eq/J,EAAoBl8F,UAEpBk8F,EAAoBj8F,WAKE,KAA1B+2F,EAAMnhK,KAAK,aACby0K,EAAKrvK,KAAK,WAAY,YAAYklC,WAAW,WACzCg2I,EAAWl7I,GAAG,aAAagtE,EAAMpyG,KAAK,WAAWmhK,EAAMnhK,KAAK,cAAc6R,KAE9E4iK,EAAKnqI,WAAW,YAChB8nE,EAAMpyG,KAAK,WAAW,MACjBsgL,EAAWl7I,GAAG,aACjBgtE,EAAMpyG,KAAK,mBA62CnB,WA2IE,QAASygL,GAAkBC,GACzB,MAAIA,GAAWziE,gBAAwByiE,EAAWziE,gBAC9CyiE,EAAWliE,cAAsBkiE,EAAWliE,cAAcj5G,SACvDm7K,EAAWn7K,SA5IpB,GAAIo7K,GACAC,EAiJAC,GArHmBxgL,KAAK8kF,iBAAmB,SAAUD,EAAYthF,EAAIm1C,EAAS+nI,GAEhF,GAAI9zK,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQ6D,UAChChd,GAAOw0C,gBAAiB,EACxBx0C,EAAO1L,MAAQ,OACf0L,EAAO3I,OAAS,OAChB2I,EAAOslG,eAAgB,EAGvBtlG,EAAOglG,mBAAmBp+F,MACxBhQ,GAAI,eACJkE,KAAM,GACNxE,MAAOy9G,YAAc,WAAc,OAAO,GAC1C/+F,MAAO,wBAGT,IAAIkqI,GAAStmJ,GAAG0jB,UAAUy/H,QAAQ7jE,GAE9B67F,EAAkB,wBAClBv8J,EAAO,EAEP5gB,IAAMm1C,IACRv0B,EAAO,GAAI5e,IAAG6e,KAAK7gB,EAAI6M,YAAYK,iBAAkBioC,GACrDgoI,EAAkB,mCAGpB70B,EAAO1pI,KAAK0pI,EAAc,MAAE/pI,MAAMipI,iBAAkB,WAClDp+I,EAAO6lG,WAAW7rG,EAAE,gCACpBgG,EAAO+lG,SAAShlG,OAAO/G,EAAE,sBAAuB85K,GAAqB57F,IACrEl4E,EAAO1K,OACP0K,EAAOkiC,sBAGTg9G,EAAO60B,GAAiBv8J,GAAMyN,OAAO,WACnCjlB,EAAOkyB,UACNttB,KAAK,SAAUnK,GAChBA,EAAIu4B,SACH5X,KAAK,SAAUiJ,GAEhB5J,YACAsW,UAAU1M,MAKShxB,KAAK2gL,iBAAmB,SAAU/yK,EAAQgzK,GAG/D,QAASC,GAAgB52K,GACvB,GAAIyqC,GAAQ,MAAQzqC,EAChB7C,EAAMvI,EAAE,IAAM61C,EAAQ,mBAO1B,OANKttC,GAAI0G,SACP1G,EAAMvI,EAAE,cAAgB61C,GACnBttC,EAAI0G,SACP1G,EAAMvI,EAAE,eAAiB61C,EAAQ,qBAAuBA,EAAQ,QAG7DttC,EAIT,QAAS05K,GAAc72K,GACrB,GAAI+lD,GAAU6wH,EAAgB52K,EAC9B,IAAI+lD,EAAQrwD,KAAK,aACf,MAAOqwD,GAAQrwD,KAAK,aAAasU,KAEnC,IAAIszG,GAAS1oH,EAAE,cAAgBoL,EAI/B,OAHIs9G,GAAOz5G,SACTkiD,EAAUu3D,GAELv3D,EAAQ/7C,MAxBjBssK,EAA4BK,CA4B5B,IAAI7sE,GAAMusE,EAAQ3gL,KAAK,KAAM,WAC3B,GAAIA,MACAqxB,GAAM,CAWV,IAVAnyB,EAAEkB,KAAK6N,EAAQ,SAAUtE,EAAG6oB,GAC1B,GAAIle,GAAM6sK,EAAc3uJ,EAAMloB,KAC9B,QAAKgK,GAAOke,EAAM4uJ,UAChB/vJ,EAAMrqB,EAAE,mCACD,QAEPhH,EAAKwyB,EAAMloB,MAAQgK,KAIiB,mBAA7BssK,GAA0C,CACnD,GAAIS,GAAeT,GACnB5gL,GAAOd,EAAE4C,OAAO9B,EAAMqhL,GAKxB,MAAIhwJ,IACF+iF,EAAIp0G,KAAK,SAASqxB,IACX,OAEPwvJ,GAAWzsE,EAAIp0G,KAAK,UAAWA,IAGnCo0G,GAAI7vG,KAAK,uBAAuBa,KAAK,WAAY,MACjDgvG,EAAIpnG,OAAO,QACXonG,EAAI7vG,KAAK,uBAAuB+lC,WAAW,WAC3C,IAAIt+B,GAAIjJ,KAAKmvH,IAAI,IAAKhzH,EAAE,eAAgBk1G,GAAK/vG,SAAW,EACxD+vG,GAAIrwG,IAAI,SAAUiI,IAYH3L,KAAKwgL,WAAa,SAAU30B,EAAQj+I,GACnD/O,EAAE,kBAAkB6xC,QAEpB,IAAIlsB,GAAM9W,OAAO,8BAA+B7O,EAAEszB,MAAM05H,GAAShtJ,EAAEszB,MAAMvkB,GACzE,KAAK/O,EAAEwB,OAAQkF,GAAGC,IAAIC,aAAiBw7K,UAWlC,CACH,GAAIC,GAASriL,EAAE,wEAAwEkwD,SAAS,OAChGqxH,GAAkBvhL,EAAE,SAAUqiL,GAAQ,IAAI/vJ,SAASjjB,QAAQsW,OAJ3DlgB,QAAOq7B,KAAKnb,EAAK,WASSxkB,MAAKmhL,wBAA0B,SAAUt1B,GACjEy0B,IACFA,EAAQ5vI,SACR4vI,EAAU,MAEZE,EAAW30B,UAUf,WACE,GAAIu1B,GAAW,KACXv4H,EAAM,CAEVvkD,QAAO00E,SAAW,SAAU/nE,GACrBmwK,IACHA,EAAWviL,EAAE,eAAiB6E,KAAO29K,UAAW,UAAWl8K,SAAU,QAAS1C,IAAK,OAAQqkC,MAAO,OAAQxhC,QAAS,OAAQg8K,QAAS,GAAK7mD,MAAO,MAAOt5C,gBAAiB,WAAapyB,SAASlwD,EAAE,UAElMuiL,EAASt4H,QAAQ,QAAWD,KAAS,KAAO53C,EAAM,cAuBlD7E,OAAO3L,GAAG8gL,eACZn1K,OAAO3L,GAAG8gL,aAAaC,MAAM,cAAgB,SAAUlkK,EAAGpJ,GACxD,MAAOs8J,YAAWlzJ,EAAGpJ,GAAG,IAE1B9H,OAAO3L,GAAG8gL,aAAaC,MAAM,eAAiB,SAAUlkK,EAAGpJ,GACzD,MAAOs8J,YAAWlzJ,EAAGpJ,EAAG,KAI5B,SAAWyX,GACT,GAAI81J,GAEAC,EAAsB,IAE1B/1J,GAAOg2J,iBAAmB,SAAUC,GAClC,GAAI/5K,GAAMhJ,EAAE+iL,GAAe19K,KAAK,QAChC,IAAI2D,EAAIiG,OAAQ,CACd,GAAI+zK,GAAe,6GACfC,EAAa,0GACjBj6K,GAAI3D,KAAK,MAAM4kD,QAAQ+4H,EAAeC,EAEtC,IAAIC,IAAS,CACbljL,GAAE,QAAQiC,GAAG,0BAA2B,WACtC,IAAKihL,EAAQ,CAEXN,EAAgB5iL,EAAE,kBAIlB,KAAK,GAFDmjL,GAASn6K,EAAI3D,KAAK,MAAM4J,OACxB1G,KACKG,EAAI,EAAGA,EAAIy6K,IAAUz6K,EAC5BH,EAAImM,KAAK,KACXnM,GAAI,IAAO66K,MAAO,UAElBP,EAAsB75K,EAAIoyG,WACxBI,WAAW,EACXG,UAAWpzG,EACX86K,SAAU,OACVhoE,SAAWunE,EAAcz9K,SAAW,GACpCm+K,YAAa,EAAG,SAChB7nE,WAAaC,aAAgB5zG,EAAE,YAGjCg9C,UAAU97C,EAAI3D,KAAK,OACnB69K,GAAS,OAOjBljL,EAAEyF,QAAQ6d,KAAK,YAAa,WAEpBs/J,GACJA,EAAcv9K,KAAK,0BAA0BF,OAAOy9K,EAAcz9K,SAAW,IAEzE09K,GAEJA,EAAoBU,uBAEtB1rB,iBAEDpyJ,QAmlBHzF,EAAE4B,GAAGo2C,QAAU,SAAU5sC,GACvB,MAA2BkV,UAApBnf,KAAK+E,KAAKkF,IASnBpL,EAAE4B,GAAGlB,OAAS,WACZ,GAAIwjB,GAAKlkB,EAAEmB,KAGX,OAFAsG,YAAW,WAAcyc,EAAGrf,KAAM2+K,QAAW,qBAAwB,IACrE/7K,WAAW,WAAcyc,EAAGrf,KAAM2+K,QAAW,UAAa,KACnDxjL,EAAEmB,OAoBXnB,EAAE,WAC0B,aAArB0G,GAAGuE,eAAqD,qBAArBvE,GAAGuE,eAAiE,OAAxBvE,GAAGC,IAAI4M,QAAQnI,MAEjGpL,EAAE,mBAAmBqF,KAAK,eAAe0pE,IAAI,WAAW7oE,KAAK,WAAW,IAQ5E,IAAIixK,kBAAmB;CC7wNvB,SAAWsM,GAuGT,QAASpM,KAEHqM,KACFC,IAKJ,QAASD,KACP,GAAIh9K,GAAGkoB,MAAMg1J,wBAAyB,CACpC,GAAIC,GAAWn9K,GAAGmnB,MAAMsvB,QAAQ,4BAEhC,OADAz2C,IAAGmnB,MAAMmuB,QAAQ,4BAA6B,MAC3B,KAAZ6nI,EAGT,OAAO,EAGT,QAASF,KACP,GAAInnF,GAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KAC3BswD,GAAMqnD,YAAY/7I,EAAE,mCAAmC,GAEvD9H,EAAE,wBAAwBoE,MAAM,WAC9BqB,OAAOq7B,KAAK,iBAAkB,cAKlC,QAASsf,GAAO0jI,EAAa7vJ,EAAYllB,GAIvC,QAAS2wE,GAAQokG,EAAa7vJ,EAAYllB,GACxCrI,GAAGkoB,MAAMoY,gBAAgB88I,EAAa7vJ,EAAYllB,GAAQ2D,KAAK,SAAUnK,GACvE4hB,EAAIlB,QAAQ1gB,KACX2gB,KAAK,SAAU3gB,GAChB4hB,EAAId,OAAO9gB,KAPf,GAAI4hB,GAAMnqB,EAAE0nB,UA6BZ,OAlBAhhB,IAAGkoB,MAAMm1J,kBAAkB,GAAGrxK,KAAK,WAEjCgtE,EAAQokG,EAAa7vJ,EAAYllB,KAChCma,KAAK,SAAU86J,GAChB,GAAIA,EACFtgK,IAAIqQ,KAAK,QAAS,sBAElBxI,QACK,CAEL,GAAIzd,GAAS,GAAI21K,GAAW70J,MAAMq1J,kBAClCn2K,GAAOo2K,YAAc,WACnBxkG,EAAQokG,EAAa7vJ,EAAYllB,IAEnCjB,EAAO1K,UAIJ+mB,EAAIb,UAKb,QAASupB,GAAU5e,GAQjB,QAASkwJ,KACPz9K,GAAGkoB,MAAMkE,kBAAkBmB,GAAYvhB,KAAK,SAAU+/B,GACpDA,EAActoB,EAAIlB,QAAQm7J,GAAaj6J,EAAId,WAC1CH,KAAK,SAAUiJ,GAEhBkyJ,MAIJ,QAASA,KACP,GAAIv2K,GAAS,GAAI21K,GAAW70J,MAAMq1J,kBAClCn2K,GAAOo2K,YAAc,WACnBx9K,GAAGkoB,MAAMkE,kBAAkBmB,GAAYvhB,KAAK,SAAU+/B,GACpDA,EAActoB,EAAIlB,QAAQm7J,GAAaj6J,EAAId,WAC1CH,KAAK,SAAUiJ,GAChBhI,EAAId,OAAO8I,MAGfrkB,EAAO1K,OAzBT,GAAI+mB,GAAMnqB,EAAE0nB,WACR08J,GACFhkI,OAAQ,SAAU2b,EAAQhtD,GACxB,MAAOqxC,GAAO2b,EAAQ9nC,EAAYllB,KAyBlCu1K,EAAgBtkL,EAAE0nB,UAoCtB,OAnCAhhB,IAAGkoB,MAAMm1J,oBAAoBrxK,KAAK,SAAU6xK,GAErC79K,GAAGkoB,MAAMiE,uBAQTyxJ,EAAcr7J,QAAQs7J,GAPzB79K,GAAGkoB,MAAM41J,eAAe9xK,KAAK,WAC3BgR,IAAIqQ,KAAK,QAAS,iCAClBrtB,GAAGkoB,MAAM61J,uBAAsB,GAC/BH,EAAcr7J,QAAQs7J,KACrBr7J,KAAK,WACNo7J,EAAcj7J,QAAO,OAGxBH,KAAK,SAAU86J,GAChBM,EAAcj7J,OAAO26J,KAIvBM,EAAc5xK,KAAK,SAAU6xK,GACvBA,IAEF7gK,IAAIqQ,KAAK,QAAS,oBAClBowJ,OAEDj7J,KAAK,SAAU86J,GACZA,GACFtgK,IAAIqQ,KAAK,QAAS,sBAElBxI,IAAQ7Y,KAAK,WACXyxK,OAIFE,MAIGl6J,EAAIb,UAIb,QAASo7J,KACP,GAAIv6J,GAAMnqB,EAAE0nB,UAEZhE,KAAIqQ,KAAK,QAAS,kCACHrtB,IAAGkoB,MAAMrD,QAAQ7Y,KAAK,SAAUiyK,GACzCA,GACFjhK,IAAIqQ,KAAK,QAAS,kBAClB5J,EAAIlB,YAEJvF,IAAIqQ,KAAK,QAAS,6CAClB5J,EAAId,OAAOvhB,EAAE,gEAEdohB,KAAK,SAAUiJ,GAEhBzO,IAAIqQ,KAAK,QAAS,mCAAqC5B,EAEvD,IAAIvpB,GAAe,aAARupB,EAAqB,GAAKrqB,EAAE,2BACvCqiB,GAAId,OAAOzgB,IAGb,OAAOuhB,GAAIb,UAIb,QAASs7J,KAMP,QAASC,KACP74J,UAAU4C,MAAMk2J,QAAQC,oBAAoBryK,KAAK,SAAUw+H,GACrDA,EAAK1vG,UACPxhC,EAAEwE,MAAM+kD,QAAQk6H,EAAW70J,MAAM3L,MAAM+hK,YAAa9zC,EAAK9sH,QACtC,KAAf8sH,EAAK9sH,QACPpkB,EAAEwE,MAAM+kD,QAAQk6H,EAAW70J,MAAM3L,MAAMgiK,eAAgB/zC,EAAK9sH,QAE5D1d,GAAGkoB,MAAMs2J,UAAUxyK,KAAK,WACtByyK,IAAezyK,KAAK,WAClByX,EAAIlB,QAAQioH,EAAK9sH,aAGZ8sH,EAAK9sH,UAAW,GAGzBV,IAAIqQ,KAAK,QAAS,gCAClB5J,EAAIlB,WAEJxhB,WAAWo9K,EAAkBO,MAGhCl8J,KAAK,SAAUiJ,GAChBkzJ,GAAY,EACZ3hK,IAAIqQ,KAAK,QAAS,wCAA0CsxJ,GACxDA,EAAW,GACbrlL,EAAEwE,MAAM+kD,QAAQk6H,EAAW70J,MAAM3L,MAAMqiK,iBAAkBnzJ,EAAI/N,QAC7D+F,EAAId,OAAO8I,EAAIP,UAEfnqB,WAAWo9K,EAAkBO,KAjCnC,GAAIj7J,GAAMnqB,EAAE0nB,WACR09J,EAAuB,IACvBC,EAAW,CA2Cf,OAPAr5J,WAAU4C,MAAMk2J,QAAQS,eAAe7yK,KAAK,WAC1C1S,EAAEwE,MAAM+kD,QAAQk6H,EAAW70J,MAAM3L,MAAMuiK,iBACvC/9K,WAAWo9K,EAAkBO,KAC5Bl8J,KAAK,WACNiB,EAAIlB,YAGCkB,EAAIb,UAIb,QAAS67J,KACP,GAAIh7J,GAAMnqB,EAAE0nB,UAYZ,OAVAhE,KAAIqQ,KAAK,QAAS,oCAClBrtB,GAAGkoB,MAAM41J,eAAe9xK,KAAK,WAC3BgR,IAAIqQ,KAAK,QAAS,iCAClBrtB,GAAGkoB,MAAM61J,uBAAsB,GAC/Bt6J,EAAIlB,YACHC,KAAK,SAAUiJ,GAChBzO,IAAIqQ,KAAK,QAAS,yBAClB5J,EAAId,OAAO8I,KAGNhI,EAAIb,UAIb,QAASm8J,KACP,GAAIt7J,GAAMnqB,EAAE0nB,UASZ,OARyB,aAArBhhB,GAAGuE,gBAELw4K,EAAW7gI,OAAO8iI,sBAAsBjkL,OAExCgiL,EAAW7gI,OAAOC,sBAAsBnhD,QAE1CyoB,EAAIlB,UAEGkB,EAAIb,UAIb,QAASiC,KACP,MAAOm5J,KACJ56J,KAAKq7J,GACLr7J,KAAK86J,GACL96J,KAAK27J,GAGV,QAASE,KACPjiK,IAAIqQ,KAAK,QAAS,yBAClBrtB,GAAGkoB,MAAM+2J,cAGX,QAASr5B,GAASs5B,GAChB,GAAIz7J,GAAMnqB,EAAE0nB,WAER4H,EAAW5oB,GAAGC,IAAI2oB,QACtB,IAAiB,UAAbA,EAAsB,CAExB,GAAIu2J,IACFnhL,GAAI,MACJkE,KAAMd,EAAE,mCACR1D,MAAO,WACLsC,GAAGkoB,MAAM09H,SAAS,aAClBniI,EAAIlB,YAGJ68J,GACFphL,GAAI,MACJkE,KAAMd,EAAE,mCACR1D,MAAO,WACLsC,GAAGkoB,MAAM09H,SAAS,aAClBniI,EAAIlB,YAIJnb,EAAS,GAAIke,WAAUiC,WAAWhH,QAAQ6D,YAC5CC,MAAOjjB,EAAE,kDACTw6C,gBAAgB,EAChBrP,oBAAoB,EACpB7wC,MAAO,SAET0L,GAAOkd,QAAQljB,EAAE,6CACjBgG,EAAOglG,mBAAmBp+F,KAAKmxK,GAC/B/3K,EAAOglG,mBAAmBp+F,KAAKoxK,GAC/Bh4K,EAAO1K,WAIPsD,IAAGkoB,MAAM09H,WACTniI,EAAIlB,SAGN,OAAOkB,GAAIb,UAGb,QAASy8J,KACP,MAAOr/K,IAAGkoB,MAAMm3J,aAGlB,QAAS96G,KACPvkE,GAAGkoB,MAAMq8C,UACTtgE,KAAKywB,SAAS4qJ,+BAA+BjzJ,OAAO,WAElDrsB,GAAGmnB,MAAMmuB,QAAQ,4BAA6B,KAC9Cv2C,OAAO6sB,SAASpF,WAIpB,QAAS5J,GAAK9e,EAAOknD,GAEfjhD,EAAEw7K,SAASx7K,EAAE+sB,OAAOisJ,EAAW70J,MAAM3L,OAAQze,IAC/CxE,EAAEqG,UAAUpE,GAAGuC,EAAOknD,GAI1B,QAAS/nC,GAAOnf,EAAOknD,GAEjBjhD,EAAEw7K,SAASx7K,EAAE+sB,OAAOisJ,EAAW70J,MAAM3L,OAAQze,IAC/CxE,EAAEqG,UAAUrE,IAAIwC,EAAOknD,GA3Z3B+3H,EAAW70J,QAGX,IAAIs3J,GAAyB,WAI3B,MAHAxiK,KAAIqQ,KAAK,QAAS,qCAGbrtB,GAAGkoB,MAAMu3J,mBAAsBz/K,GAAGkoB,MAAMg1J,wBAMxCl9K,GAAGkoB,MAAM6jB,cAKV2zI,kBACF1iK,IAAIqQ,KAAK,QAAS,sCAQpBrtB,IAAGkoB,MAAMm1J,kBAAkB,GAAGrxK,KAAK,SAAU6xK,GACvCA,IAEF7gK,IAAIqQ,KAAK,QAAS,oBAGlB0vJ,EAAW70J,MAAMy3J,eAAe,WAC9B5C,EAAW7gI,OAAO8iI,sBAAsBtiL,SAG1C+hL,IACKr7J,KAAK86J,GACL96J,KAAK27J,MAEXv8J,KAAK,SAAU86J,GACZA,GACFtgK,IAAIqQ,KAAK,QAAS,sBAElBxI,KAGA7H,IAAIqQ,KAAK,QAAS,+BA1BpBrQ,KAAIqQ,KAAK,QAAS,uCARlBrQ,KAAIqQ,KAAK,QAAS,uCANlBppB,KAAKikB,MAAMq8C,cACXvnD,KAAIqQ,KAAK,QAAS,yCA0ZtB0vJ,GAAW70J,OAET3L,OACEuiK,gBAAiB,sBACjBR,YAAa,kBACbC,eAAgB,qBAChBK,iBAAkB,uBAQpB5jL,KAAMwkL,EAON7O,mBAAoBA,EAQpBj3H,OAAQA,EAQR70B,MAAOA,EAOPo6J,YAAaA,EAQbr5B,SAAUA,EAOVrhF,QAASA,EAaTp4B,UAAWA,EAOXvvB,KAAMA,EAONK,OAAQA,EAOR0iK,eAAgB,SAAU36H,GACxB+3H,EAAW70J,MAAMtL,KAAKmgK,EAAW70J,MAAM3L,MAAMuiK,gBAAiB95H,IAQhE46H,WAAY,SAAU56H,GACpB+3H,EAAW70J,MAAMtL,KAAKmgK,EAAW70J,MAAM3L,MAAM+hK,YAAat5H,IAQ5D66H,cAAe,SAAU76H,GACvB+3H,EAAW70J,MAAMtL,KAAKmgK,EAAW70J,MAAM3L,MAAMgiK,eAAgBv5H,IAQ/D86H,eAAgB,SAAU96H,GACxB+3H,EAAW70J,MAAMtL,KAAKmgK,EAAW70J,MAAM3L,MAAMqiK,iBAAkB55H,IASjEq6H,WAAYA,IAGbtgL,OAAOkF;AC/iBV,cAEA,SAAWmiB,GACT,GAAI25J,IACFC,UAAW,wBACXC,cAAe,4BACf/qK,OAAQ,wBAMNgrK,EAAyB,IAEzBC,EAAgB,IAEhB5C,EAAqBv9K,GAAGygB,IAAIF,QAAQ6D,WAAWloB,QACjDyR,UAAW,qBACX0W,MAAOjjB,EAAE,kBACT+mC,SAAU/mC,EAAE,8BACZgnC,eAAgBhnC,EAAE,iCAClBo8K,YAAa,KACb4C,qBAAsB,KACtBC,yBAA0B,KAC1BC,YAAa,KAQbtlL,KAAM,SAAU05B,GACd,GAAIlX,GAAK/iB,IACT+iB,GAAGe,OAAOjlB,EAAE4C,UAAWw4B,GAAY6X,oBAAoB,EAAMqP,gBAAgB,KAE7Ep+B,EAAGZ,KAAKY,EAAU,MAAEjB,MAAMizF,YAAa,WACrCvrG,KAAKikB,MAAM+2J,cACXzhK,EAAG+iK,4BAUP7jL,KAAM,WACJ,GAAI8gB,GAAK/iB,IAWT,OAVA+iB,GAAGgjK,eACHhjK,EAAG8G,QAAQ9G,EAAGu+F,YAEdv+F,EAAGe,SACHf,EAAGijK,oBACHjjK,EAAGkjK,sBAGHvwI,8BAA8B,qBAAsB3yB,EAAG28B,SAAS99C,QAAQ,eAEjEmhB,GAQTmjK,UAAW,WACT,GAAInjK,GAAK/iB,IACT+iB,GAAG0wF,sBAAsB6xE,EAAQC,UAAW5+K,EAAE,mBAC9Coc,EAAGojK,wBAGH38K,KAAKikB,MAAMrD,MAAMs7J,GAAen0K,KAAK,WACnCgR,IAAIqQ,KAAK,QAAS,iCACd7P,EAAGggK,aACLhgK,EAAGggK,cACLhgK,EAAG8b,UACF9W,KAAK,SAAUiJ,GAChBjO,EAAGoM,WAAW2f,UAAU9d,EAAIP,WAC3BmB,OAAO,WACR7O,EAAG+iK,4BASPM,cAAe,WACb58K,KAAKikB,MAAMq8C,WAQbq8G,sBAAuB,WACrB,GAAIpjK,GAAK/iB,IAET+iB,GAAG4iK,qBAAuBr/K,WAAW,WACjCyc,EAAGoM,WAAWkU,YAAY18B,EAAE,6BAE9B8+K,GAGF1iK,EAAG6iK,yBAA2Bt/K,WAAW,WACrCkD,KAAKikB,MAAM+2J,cACXzhK,EAAGoM,WAAW2f,UAAUnoC,EAAE,+BAC1Boc,EAAGgjK,eACHhjK,EAAGqwF,iBAELsyE,IAQJI,uBAAwB,WACtB,GAAI/iK,GAAK/iB,IACTiG,cAAa8c,EAAG4iK,sBAChB1/K,aAAa8c,EAAG6iK,0BAChBrjK,IAAIqQ,KAAK,QAAS,uCAQpBmzJ,aAAc,WACZ,GAAIhjK,GAAK/iB,IACT+iB,GAAG4uF,sBACH5uF,EAAG4uF,mBAAmBp+F,MACpBhQ,GAAI+hL,EAAQC,UACZ99K,KAAMd,EAAE,kBACR1D,MAAO,WAEL,MADA8f,GAAGmjK,aACI,GAET//G,MAAS,YAEXpjD,EAAG4uF,mBAAmBp+F,MACpBhQ,GAAI+hL,EAAQE,cACZ/9K,KAAMd,EAAE,0BACR1D,MAAO,WACL8f,EAAGqjK,mBAGF98K,EAAEmjF,UAAU1pE,EAAG4uF,oBAAsBpuG,GAAI+hL,EAAQ7qK,OAASsI,EAAGxf,MAChEwf,EAAG4uF,mBAAmBp+F,MACpBhQ,GAAI+hL,EAAQ7qK,OAASsI,EAAGxf,GACxBkE,KAAMsb,EAAGq+B,WACTn+C,MAAO,WAA0B,MAAZ8f,GAAG8b,SAAgB,GACxCu1E,YAAa,kBAUnB4xE,kBAAmB,WACjB,GAAIjjK,GAAK/iB,IACT+iB,GAAG28B,SAASx7C,KAAK,+BAA+BjB,MAAM,SAAUI,GAS9D,MARAkf,KAAIqQ,KAAK,QAAS,wBAClBppB,KAAKikB,MAAM09H,SAASnrJ,MAAMuR,KAAK,SAAU4c,GACvCpL,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAMukK,eAAgBl4J,KACzCpG,KAAK,WACNhF,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAMukK,eAAgB,QAG5ChjL,EAAML,kBACC,KAQXs+G,SAAU,WACR,GAAII,GAAe,2BAA6B1hH,KAAK0tC,SAAW,SAC5Di0E,EAAqB,2BAA6B3hH,KAAK2tC,eAAiB,SACxE/pC,EAAO,0BAA4B89G,EAAeC,EAAqB,QAC3E,OAAO/9G,IAITqiL,oBAAqB,WACnB,GAAIljK,GAAK/iB,IACTwJ,MAAKikB,MAAMy3J,eAAe,WAAcniK,EAAGujK,oBAC3C98K,KAAKikB,MAAM03J,WAAW,SAAUoB,GAAYxjK,EAAGyjK,YAAYD,KAC3D/8K,KAAKikB,MAAM23J,cAAc,WAAcriK,EAAG0jK,mBAC1Cj9K,KAAKikB,MAAM43J,eAAe,WAActiK,EAAG2jK,oBAE3CnkK,IAAIqQ,KAAK,QAAS,2CAIpB0zJ,gBAAiB,WASf,QAAS93I,KACP,GAAIsR,GAAe,cACfnzC,EAAS,GAAIpH,IAAGygB,IAAIF,QAAQ6D,UAMhC,OALAhd,GAAOihC,uBACPjhC,EAAOkiC,oBACPliC,EAAOid,MAAQjjB,EAAE,kBACjBgG,EAAOkd,QAAQnc,OAAO,qBAAuBoyC,EAAe,yFAA0Fn5C,EAAE,4BAEjJgG,EAhBT,GAAIoW,GAAK/iB,IACTuiB,KAAIqQ,KAAK,QAAS,uCAElB7P,EAAG8iK,YAAcr3I,IACjBzrB,EAAG8iK,YAAY5jL,OAEf8gB,EAAG+iK,0BAcLU,YAAa,SAAUD,GACrBhkK,IAAIqQ,KAAK,QAAS,0BAA4B2zJ,IAGhDE,eAAgB,WACd,GAAI1jK,GAAK/iB,IACL+iB,GAAG8iK,aACL9iK,EAAG8iK,YAAYhnJ,QAEjB9b,EAAGojK,wBAEHpjK,EAAG4jK,yBAGLD,gBAAiB,WACf,GAAI3jK,GAAK/iB,IACL+iB,GAAG8iK,aACL9iK,EAAG8iK,YAAYhnJ,QACjB9b,EAAGoM,WAAW2f,UAAUnoC,EAAE,8BAC1Boc,EAAG4wF,uBAAuB2xE,EAAQC,WAClCxiK,EAAG+iK,0BAGLa,sBAAuB,WAErBn9K,KAAKikB,MAAMjL,OAAOhZ,KAAKikB,MAAM3L,MAAMuiK,iBACnC76K,KAAKikB,MAAMjL,OAAOhZ,KAAKikB,MAAM3L,MAAM+hK,aACnCr6K,KAAKikB,MAAMjL,OAAOhZ,KAAKikB,MAAM3L,MAAMgiK,gBACnCt6K,KAAKikB,MAAMjL,OAAOhZ,KAAKikB,MAAM3L,MAAMqiK,qBAIrCriK,MAAOjjB,EAAE4C,QAEPmlL,YAAa,QAGbP,eAAgB,YACf9gL,GAAGygB,IAAIF,QAAQ6D,WAAW7H,QAG/B6J,GAAOm3J,mBAAqBA,GAC3Bx+K,OAAOkF,KAAKikB;CC9Qf,SAAW9B,GAOTA,EAAO65H,UAQP75H,EAAO65H,OAAO19G,YAGbxjC,OAAOkF;AClBV,cAEA,SAAWmiB,GAETA,EAAOk7J,OACPl7J,EAAOm7J,OAUPn7J,EAAOo7J,gBAAkB,WAmBvB,MAlBIloL,GAAEm1C,cAAcroB,EAAOm7J,OACzBn7J,EAAOm7J,IAAIthC,OAAS3mJ,EAAE,WACtB8sB,EAAOm7J,IAAIl0J,KAAO/zB,EAAE,SACpB8sB,EAAOm7J,IAAIh/I,QAAUjpC,EAAE,YACvB8sB,EAAOm7J,IAAI3tI,QAAUt6C,EAAE,uBAGrBA,EAAEm1C,cAAcroB,EAAOk7J,OACzBl7J,EAAOk7J,IAAIj0J,KAAOjH,EAAOm7J,IAAIl0J,KAAK3xB,QAClC0qB,EAAOk7J,IAAI/+I,QAAUnc,EAAOm7J,IAAIh/I,QAAQ7mC,QACxC0qB,EAAOk7J,IAAI1tI,QAAUxtB,EAAOm7J,IAAI3tI,QAAQz1C,IAAI,gBAK9CioB,EAAOm7J,IAAI3tI,QAAQz1C,IAAI,cAAe7E,EAAE,mBAAmBwiE,YAAW,IAEtE11C,EAAOq7J,cACAr7J,GAOTA,EAAOq7J,YAAc,WACnB,GAAIp6K,GAAS+e,EAAOm7J,IAAIh/I,QAAQ5jC,KAAK,qBACrC0I,GACC9L,GAAG,qBAAsB,WACxB,GAAImmL,GAAWpoL,EAAEmB,MAAM+E,KAAK,SAASmJ,QAAQ,UAAW,IAAIe,MAAM,IAClEpQ,GAAEmB,MAAM+E,KAAK,QAASkiL,EAAS,GAAK,WAAaA,EAAS,MAE3DnmL,GAAG,qBAAsB,WACxB,GAAImmL,GAAWpoL,EAAEmB,MAAM+E,KAAK,SAASmJ,QAAQ,UAAW,GACxDrP,GAAEmB,MAAM+E,KAAK,QAASkiL,KAGxBpoL,EAAE,aAAaiC,GAAG,qBAAsB,WACtC,GAAImmL,GAAWpoL,EAAEmB,MAAMsoC,SAAS,KAAKvjC,KAAK,SAASmJ,QAAQ,UAAW,IAAIe,MAAM,IAChFpQ,GAAEmB,MAAMsoC,SAAS,KAAKvjC,KAAK,QAASkiL,EAAS,GAAK,WAAaA,EAAS,MAEzEnmL,GAAG,qBAAsB,WACxB,GAAImmL,GAAWpoL,EAAEmB,MAAMsoC,SAAS,KAAKvjC,KAAK,SAASmJ,QAAQ,UAAW,GACtErP,GAAEmB,MAAMsoC,SAAS,KAAKvjC,KAAK,QAASkiL,MAWxCt7J,EAAOwqJ,cAAgB5wK,GAAGsrB,kBAAkB,WAC1C,GAAIq2J,GAASroL,EAAE,uBAMf,OALKqoL,GAAOznL,SAAS,WACnBynL,EAAOpmL,GAAG,QAAS,WACjBwD,OAAOq7B,KAAK,4BAA6B,cAGtChU,IAUTA,EAAOyqJ,iBAAmB7wK,GAAGsrB,kBAAkB,WAI7C,MAHAhyB,GAAE,2BAA2BiC,GAAG,QAAS,WACvCwD,OAAOq7B,KAAK,iBAAkB,cAEzBhU,IAUTA,EAAOw7J,oBAAsB,SAAUC,EAAcC,EAAQC,GAc3D,MAbAzoL,GAAE,WACA,GAAI0oL,GAAY1oL,EAAE,YAClB0oL,GAAU5nL,KAAK,aAAey1C,SAAYgyI,EAAc7jL,GAAM8jL,GAC9D,IAAIliL,IACFgB,OAAQohL,EACRv0H,QACEC,OAAO,EACP31C,GAAG,IACHpJ,EAAG,KAGPohC,2BAA0BiyI,EAAWpiL,KAEhCwmB,IAIRrnB,OAAOkF,KAAKg8I,OAAO19G;ACvHtB,cAEA,SAAWnc,GAOTA,EAAOlf,YAENnI,OAAOkF,MAGV,SAAWmiB,GACTA,EAAOywG,YAAc,eACrBzwG,EAAO3e,IAAM,EAEb2e,EAAOirJ,SAAW,WAChB,GAAIpyJ,GAAM,GAAIjf,IAAGkf,IACb0f,EAAO3f,EAAIwX,SAAS,QAAQ9Z,aAIhC,QAHIrjB,EAAE,iBAAiBiP,QAAmB,QAARq2B,GAAmBA,GACnD36B,KAAKiD,QAAQwlC,YAERtmB,GAGTA,EAAOsmB,UAAY,SAAUjlC,GAE3B,GACIw6K,GADAzkK,EAAK4I,CAET,IAAI3e,EACF+V,EAAG/V,IAAMA,EACTw6K,GAAW,MACN,CACL,GAAIpgL,GAAM,WAAWuY,KAAKwR,SAASkkD,KAC/BjuE,KACF2b,EAAG/V,IAAMvC,SAASrD,EAAI,GAAI,KAC5BogL,GAAW,EAGb,GAAIhjK,GAAM,GAAIjf,IAAGkf,IACb8xB,EAAKhxC,GAAGmE,GAAG+C,OAQf,MAPKsW,EAAG/V,KAAO+V,EAAG/V,KAAO,GAAyC,GAAnCnO,EAAE,aAAekkB,EAAG/V,KAAKc,QAA2D,GAA5CjP,EAAE,sBAAwBkkB,EAAG/V,KAAKc,SACvGyoC,EAAGpjB,KAAK8D,UAAUzjB,QAAQ,SAAUxG,EAAKssD,IAClCv2C,EAAG/V,KAAOA,EAAI07D,cACjB3lD,EAAG/V,IAAMssD,EAAQ,KAInBkuH,GAAYhjK,EAAIwX,SAAS,SAAiD,QAAtCxX,EAAIwX,SAAS,QAAQ9Z,eAAiE,OAAtCsC,EAAIwX,SAAS,QAAQ9Z,cAAwB,CACnI,GAAIqa,GAASH,WAAWjL,SAASrpB,KAAM,YACvCy0B,IAAU,OAASxZ,EAAG/V,GACtB,KAEE1I,OAAO6sB,SAASrpB,KAAOy0B,EACvB,MAAOjzB,SACJ,CACLzK,EAAE,2BAA2ByB,MAC7B,IAAImnL,GAAgB5oL,EAAE,gBACtB,IAAI4oL,EAAc35K,OAChB25K,EAAcvjL,KAAK,MAAM5E,YAAY,cACrCT,EAAE,aAAekkB,EAAG/V,IAAKy6K,GAAe/nL,SAAS,kBAC5C,CAEL,GAAIgoL,EAEFA,GADE3kK,EAAG/V,IAAM,EACInO,EAAE,+BAAiCkkB,EAAG/V,KAEtCnO,EAAE,0BAGnB,IAAIurC,GAAUs9I,EAAa3iL,KAAK,OAG5BwxC,IAAIA,EAAG10B,KAAK00B,EAAU,MAAEz0B,MAAM00B,kBAAmBD,EAAGpjB,KAAKiX,GAE7D,IAAIu9I,GAAW9oL,EAAE,YACjB8oL,GAASroL,YAAY,YACrBooL,EAAahoL,SAAS,YACtB4E,OAAO6sB,SAASkkD,KAAO,MAAQtyD,EAAG/V,IAG9BupC,GAAIA,EAAG10B,KAAK00B,EAAU,MAAEz0B,MAAM80B,iBAAkBL,EAAGpjB,KAAKiX,IAG9DvrC,EAAE,2BAA6BurC,GAASnoC,OAC1B,GAAV8gB,EAAG/V,KAAUnO,EAAE,gCAAgCoD,OAIrD,GAAI2lL,GAAW/oL,EAAE,uDACjB,IAAI+oL,EAAS95K,OAAS,EACpB,IAAK,GAAIvG,GAAI,EAAGA,EAAIqgL,EAAS95K,OAAQvG,IACnC1I,EAAE+oL,EAASrgL,IAAI0yG,YAAY4tE,QAI/B,OAAOl8J,IAUTA,EAAO0+F,aAAe,WACpB,MAAOxrH,GAAEyF,QAAQrD,QAAUpC,EAAEyF,QAAQN,UASvC2nB,EAAOm8J,qBAAuB,SAAUC,GACtC,GAAI19D,GAAe1+F,EAAO0+F,cACtB09D,MAAiB,IAAM19D,GAAgBA,GAC3CxrH,EAAE4yB,OAAO,eAAgB44F,EAAe,IAAM,MAShD1+F,EAAOq8J,cAAgB,WACrBziL,GAAG8oB,YAAY9c,KAAK,WAClBhM,GAAGwpB,QAAQtiB,QAAQo4G,eAAetsG,YAAYC,eAUlDmT,EAAOs8J,YAAc,WACnB1iL,GAAG8oB,YAAY9c,KAAK,WAClBhM,GAAGwpB,QAAQtiB,QAAQo4G,eAAetsG,YAAYE,cAIjDnU,OAAOkF,KAAKiD;CCpJf,SAAWkf,GAOTA,EAAOyhC,YAQPzhC,EAAOyhC,SAASC,QAQhB1hC,EAAOyhC,SAAS55B,cAQhB7H,EAAOyhC,SAASkuB,aAQhB3vD,EAAOyhC,SAAS1B,QAGfpnD,OAAOkF;AC1CV,cAEA,SAAWmiB,GAET,GAAIu8J,GAAsB,EAO1Bv8J,GAAO+qJ,mBAAqBnxK,GAAGurB,IAAI,WAmFjC,QAASq3J,GAAe/6K,GACtBg7K,EAASzoL,KAAK,2BAA4ByN,EAAanD,MAGvDX,EAAE++K,GAAmBtoL,KAAK,SAAU8G,GAClCA,EAAKqB,SAAYrB,EAAKoD,OAASmD,EAAanD,OAE9CX,EAAEwjE,GAAW/sE,KAAK,SAAUuoL,GAC1BC,EAASz+D,gBAAgBw+D,EAASr+K,KAAMq+K,EAASr+K,MAAQmD,EAAanD,OAGxE,IAAIu+K,GAAa,WAAap7K,EAAanD,OAASi+K,EAAsB,MAAQ,MAAQ,KAC1FE,GAASlkL,KAAK,OAAOa,KAAK,aAAcyjL,GACxCC,EAAkBhhL,KAAKd,EAAEyG,EAAaw8F,QAEtCj+E,EAAO6pH,oBAAoBpoI,EAAanD,MAEpCT,KAAKC,oBAEPlE,GAAGmE,GAAGC,WAAWC,OACfC,KAAMtE,GAAGuE,cACTC,OAAQ,sBACRG,KAAM,cACN/D,OAAQiiL,EAASj+K,IAAI,KAzG3B,GAAIxC,GACA+gL,EAAe,sBACfN,EAAWvpL,EAAE6pL,EACjB,IAAKN,EAASt6K,OAAd,CAEA,GAAI26K,GAAoBL,EAASlkL,KAAK,oCAElCykL,EAAaP,EAASzoL,KAAK,qBAC3BipL,EAAqBR,EAASzoL,KAAK,2BAGvCd,GAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7BhM,GAAGmE,GAAG8pB,WAAWgiH,oBAAoBozC,IAIvC,IAAI/hC,GAAoBv9I,EAAEq/K,GAAYhuJ,OAAO,SAAU9zB,GACrD,OAAQA,EAAKgiL,WAGXC,EAAWx/K,EAAEq/K,GAAYhuJ,OAAO,SAAU9zB,GAC5C,MAAOA,GAAKgiL,WAIV/7G,EAAYxjE,EAAEu9I,GAAmBvqI,IAAI,SAAUzV,GACjD,OACEoD,KAAMpD,EAAKgyC,KACX+wD,MAAO/iG,EAAK6sD,KACZ6kD,QAAS5xG,EAAEE,EAAKkiL,SAChB3gL,KAAMvB,EAAKmiL,KACXrhL,gBAAiBA,EACjBO,SAAWrB,EAAKgyC,OAAS+vI,IAI7B97G,GAAUA,EAAUh/D,OAAS,GAAGnG,iBAAkB,EAElDmlE,EAAUv5D,MACRtJ,KAAQi+K,EACRt+E,MAASjjG,EAAE,wBACXuB,UAAY0gL,GAAsBA,IAAuBV,GAI3D,IAAIG,GAAoB/+K,EAAEw/K,GAAUxsK,IAAI,SAAUzV,GAChD,OACEoD,KAAMpD,EAAKgyC,KACXpxC,KAAMd,EAAEE,EAAK6sD,MACb6kD,QAAS5xG,EAAEE,EAAKkiL,SAChBn/E,MAAO/iG,EAAK6sD,KACZrrD,MAAOxB,EAAKmiL,KACZ9gL,SAAWrB,EAAKgyC,OAAS+vI,KAIzBL,EAAW,GAAIhjL,IAAGunB,WAAWi4D,MAAM4d,gBAAgB+lF,EAAc57G,GACnE7rE,MAAO,IACPG,QAAQ,IAoDV,OAlDAmnL,GAAS1kL,SAELwkL,EAAkBv6K,OAAS,IAC7By6K,EAASn/D,MAAMvmH,OAAS,WAEtB,GAAIomL,GAAe,GAAIp+J,WAAUiC,WAAWi4D,MAAMklC,qBAAqBy+D,EAAcL,EACrFY,GAAaplL,SAEbolL,EAAa7+D,MAAM1mH,KACjBzC,MAAS,QACT2jI,gBAAiB,SAEnBqkD,EAAaz+D,OAAO3rH,EAAE,8BAA8B,GACpDoqL,EAAa9mK,KAAK,aAAc,SAAU/U,GACxC+6K,EAAe/6K,GACfxO,YAAY0B,WAKlBioL,EAASpmK,KAAK,aAAcgmK,GA8BrBx8J,KAGTA,EAAO6pH,oBAAsB,SAAUz2H,GACrCxZ,GAAGmE,GAAG8pB,WAAWgiH,oBAAoBz2H,GAAOgN,UAQ9CJ,EAAOu9J,aAAe3jL,GAAGurB,IAAI,SAAUvtB,EAAI5D,GAgDzC,QAASwpL,GAAqBtiL,GAC5B,MACSusH,GADLvsH,EAAKwiC,OAAS+/I,EACDviL,EAAKwiL,mBAAqBC,EAE1BziL,EAAKwiC,OAASigJ,GAGjC,QAASl2D,GAAQm2D,GACf,MAAQA,GAAQ,GAAK,UAavB,QAASC,GAAgBC,GACnBjgL,KAAKC,oBAEPlE,GAAGmE,GAAGC,WAAWC,OACfC,KAAMtE,GAAGuE,cACTC,OAAQ,UACRG,KAAM,cACN/D,OAAQtH,EAAE,gBAIdyK,EAAEwjE,GAAW/sE,KAAK,SAAUuoL,GACtB,GAAkBA,EAASr+K,MAAQgoE,EAAYhoE,MAEjDq+K,EAASj/I,KAAQi/I,EAASj/I,OAASigJ,EAAMI,EAAOJ,EAChDr3G,EAAcq2G,GAEV,GAAkBA,EAASr+K,MAAQw/K,EAAYx/K,MAEjDq+K,EAASj/I,KAAOi/I,EAASe,iBACzBp3G,EAAcq2G,GAGdA,EAASj/I,KAAO+/I,EAGpB1oL,EAAYopH,gBAAgBw+D,EAASr+K,MAAM,GAC3Cq+K,EAASlgL,KAAO,GAChBkgL,EAASjgL,MAAQ,GACjBigL,EAASn/K,aAAe,GACxBm/K,EAASp/K,kBAAoBigL,EAAqBb,KAE/Cr2G,IAELvxE,EAAYopH,gBAAgB73C,EAAYhoE,MAAM,EAAM,UAAWmpH,EAAQnhD,EAAY5oC,OAASigJ,IAE5FK,EAAUliL,KAAKwqE,EAAY23B,OAEvB33B,EAAY5oC,OAASigJ,EAAKM,EAAU7kL,KAAK,QAAS,mCACjD6kL,EAAU7kL,KAAK,QAAS,2EAE7B8kL,EAAkB53G,GAClB1sE,GAAGmE,GAAG8pB,WAAWzH,UAGnB,QAAS89J,GAAkB53G,GACzB,GAAKA,EAAL,CAEA,GAAIuW,GAASvW,EAAYhoE,KACrBs/K,EAASt3G,EAAY5oC,OAASigJ,CAClC/jL,IAAGmE,GAAG8pB,WAAWkiH,QAAQltD,EAAQ+gG,IAtHnC,GAII7oL,GAJA4oL,EAAM,EACNI,GAAO,EACPN,EAAM,EAGNO,EAAY9qL,EAAE,IAAM0E,GACpBqmL,EAAYD,EAAU/nJ,OACtBqwC,EAAc,IAGlB,IAAIpzE,EAAEm1C,cAAcr0C,GAElB,MADAgqL,GAAUl2K,SAASnT,QACZ,CAGT,IAAIwsE,KACJjuE,GAAEkB,KAAKJ,EAAM,WACX,GAAIi4I,GAAW53I,KACX8pL,EAAW,SAEfh9G,GAAUv5D,MACRtJ,KAAM2tI,EAAS3tI,KACf2/F,MAAOguC,EAASz+F,QAChB/wC,KAAOwvI,EAASvuG,OAAS+/I,EAAM,GAAKU,EACpC3gL,aAAeyuI,EAASvuG,OAAS+/I,EAAM,GAAKh2D,EAAQwkB,EAASvuG,OAASigJ,GACtEphL,SAAW0vI,EAASvuG,OAAS+/I,EAC7B//I,KAAMuuG,EAASvuG,KACfggJ,iBAAkBzxC,EAASyxC,iBAC3B3gL,UAAWohL,EACX5gL,kBAAmBigL,EAAqBvxC,KAGtCA,EAASvuG,OAAS+/I,IAAKn3G,EAAcnF,EAAUA,EAAUh/D,OAAS,MAIxEjP,EAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7Bs4K,EAAkB53G,KAqBpBvxE,EAAc,GAAI6E,IAAGunB,WAAWi4D,MAAM4d,gBAAgB,IAAMp/F,EAAIupE,GAChEpsE,EAAYmD,SACZnD,EAAYyhB,KAAK,aAAc,SAAUtb,GACvC2iL,EAAgB3iL,KAElB+iL,EAAU3mL,MAAM,WAEdumL,EAAgBv3G,QAwDnB3tE,OAAOkF,KAAK4jD,SAAS55B;AChQxB,cAEA,SAAW7H,GACTA,EAAOo+J,aAAe,EAOtBp+J,EAAOq+J,YAAc,WACnB,OAAO,GAAKzkL,IAAGkf,KAAOuX,SAAS,WAQjCrQ,EAAOs+J,mBAAqB,SAAUC,KAStCv+J,EAAOw+J,mBAAqB5kL,GAAGurB,IAAI,WACjC,GAAI3M,GAAO,GAAI5e,IAAG6e,KACdu2B,EAAWhvB,EAAOq+J,aAEtB,IAAIzkL,GAAGioB,WAIL,MAHAjoB,IAAG8L,IAAIxR,KAAK,6BAA+Bi6C,OAAQ31B,EAAKsC,eAAgBszB,SAAUY,EAAUV,WAAY,WAAY1oC,KAAK,SAAUnK,GACjI4rJ,eAAeztJ,GAAGmE,GAAGswC,SAEhBh6C,IAGT,IAAIq7F,GAAQ,GAAI91F,IAAGygB,IAAIiJ,cAAc8b,KA0BrC,OAxBAsS,eAAc,EAAG12C,EAAE,mCAAmC4K,KAAK,WACzDhM,GAAG8L,IAAIxR,KAAK,6BAA+Bi6C,OAAQ31B,EAAKsC,eAAgBszB,SAAUY,EAAUV,WAAY,WAAY1oC,KAAK,SAAUnK,GACjI,GAAW,GAAPA,EAAU,CACZ,GAAIm8B,GAASj/B,OAAOi/B,MAChBA,IAC8B,aAA5BA,EAAOh+B,GAAGuE,gBACZy5B,EAAOh+B,GAAGmE,GAAG8pB,WAAWzH,SAASxa,KAAK,WAChCgyB,EAAOh+B,GAAGmE,GAAG0wC,YACf7W,EAAOh+B,GAAGmE,GAAG0wC,WAAW6C,sBAAsB1Z,EAAOh+B,GAAGmE,GAAGswC,WAE/DzW,EAAO2Z,aAAar+C,EAAE,uBAAwBA,EAAE,YAChD0kC,EAAO4Z,uBACPk+C,EAAMp5F,KAAK0E,EAAE,gBAAiBS,IAC9Bm8B,EAAO2W,+BAIXmhD,GAAMp5F,KAAK0E,EAAE,sBAGfpB,IAAGmE,GAAGpF,OAAOu6B,MAAM7+B,UAIhBA,OAQT2rB,EAAOkhI,aAAe,WACpB,GAAI7/G,GAAWznC,GAAGmE,GAAGswC,SAAWqoE,kBAC5B+nE,EAAY,GAAK7kL,IAAGkf,IAAI,oBAAqBkb,MAGjD,OAAqC,QAAjCp6B,GAAGC,IAAIuoB,GAAG9jB,KAAKiY,eACjB,GAAK3c,IAAGkf,IAAI,gBAAiBE,SAAS,OAAQ,OAAOA,SAAS,OAAQqoB,GAAUynC,OAAO21G,GAChFz+J,IAITpmB,GAAGsgB,GAAG8iI,QAAQkE,cACZw9B,cAAiBr9I,IAChBz7B,KAAK,SAAUkqE,GAChBA,EAAOv3D,QAAQS,SAAS,SAAUqoB,GAAUynC,OAAO21G,KAClDriK,KAAK,WACNqiK,EAAUvrJ,UAELlT,IAQTA,EAAOshI,WAAa,SAAU2H,GAkC5B,QAAS01B,GAAYvoG,GACnB,GAAIwoG,GAAU,GAAKhlL,IAAGkf,IAAI,oBAAqBE,SAAS,UAAWhe,EAAE,qBAAqBg5B,MAG1F,OAAqC,QAAjCp6B,GAAGC,IAAIuoB,GAAG9jB,KAAKiY,cACb6/D,EAAYj0E,QACdi0E,EAAcljF,EAAEyd,IAAI4xC,qBAAsB,SAAU3xC,GAAK,OAAS8H,GAAI9H,EAAEhZ,GAAI47B,KAAM5iB,EAAE6hB,KAAMqa,SAAUl8B,EAAEm8B,eACtGnzC,IAAG8L,IAAIC,SAAS,wCAA0C0wE,YAAaD,IAAexwE,KAAK,SAAUhO,GACnG,GAAKgC,IAAGkf,IAAI,iCAAkCE,SAAS,KAAMphB,GAAIkxE,OAAO81G,UAI5E,IAAKhlL,IAAGkf,IAAI,cAAeE,SAAS,OAAQ,OAAOA,SAAS,SAAUqoB,GAAUynC,OAAO81G,OAKzFhlL,IAAGsgB,GAAG+iI,MAAMqE,YACVlrE,YAAaA,IACZxwE,KAAK,SAAUmZ,GAChBA,EAAKxG,QAAQS,SAAS,SAAUqoB,GAAUynC,OAAO81G,KAChDxiK,KAAK,WACNwiK,EAAQ1rJ,UAvDZ,GAAImO,GAAWznC,GAAGmE,GAAGswC,SAAWwyG,cAEhC,IAAIoI,KAA2B,EAE7B,WADA01B,MAIF,IAAIE,IAAU,EACVC,EAAQ5rL,EAAE,6BAEV68C,iCAAkC+uI,EAAM38K,OAGX,kBAA3B28K,EAAM9qL,KAAK,cAEb6qL,GAAU,EACVjlL,GAAG8L,IAAIxR,KAAK,mCAAqCytC,SAAUN,IAAYz7B,KAAK,SAAU0hB,GACpFA,EAAQp0B,EAAEyd,IAAI2W,EAAO,SAAUyR,GAAS,OAAO,GAAKn/B,IAAG6e,MAAQ8vD,cAAcxvC,KAC7E4lJ,EAAYr3J,MAKd1tB,GAAGmE,GAAGylB,WAAW2f,UAAUnoC,EAAE,4DAG/B2jL,EAAYzrL,EAAEyd,IAAI4xC,qBAAsB,SAAU3xC,GAAK,MAAO,IAAIhX,IAAG6e,KAAK7H,EAAEhZ,GAAIsN,uBAAuB0L,EAAE6hB,MAAO7hB,EAAEm8B,aAmDtH/sB,EAAOprB,KAAO,SAAU2yB,GACtBr0B,EAAEiwB,KAAKvpB,GAAGgpB,aAAahd,KAAK,WAC1B,IAAK,GAAI3E,KAAUsmB,GACjBA,EAAQtmB,GAAQmT,MAAMxa,GAAGwpB,QAAQviB,QAAQ0mB,QAAQtmB,OAYvD+e,EAAOotJ,MAAQ,SAAUtlJ,GACvBnqB,EAAEvJ,KAAKwF,GAAGmE,GAAG8C,QAAQ0mB,QAAQ+D,UAAW,SAAUrqB,GAChD,GAAI3E,GAAYouD,EACZzrB,EAAUh+B,EAAO82G,SACjBt3F,EAAQ9iB,EAAEpF,KAAKuvB,EAAQ,SAAU/xB,GAAM,MAAOA,GAAGuI,OAAS2C,EAAO3C,MACjEmiB,KACFnkB,EAAamkB,EAAMnkB,WACnBouD,EAAajqC,EAAMiqC,YAEK,mBAAfpuD,KACTA,EAAa2iC,EAAQjrC,KAAK,aACF,mBAAf02D,KACTA,EAAazrB,EAAQjrC,KAAK,aAE5BsI,EAAa2E,EAAOk9D,UAAYl9D,EAAOm9D,SACvC1T,EAAazpD,EAAO4pB,SAAW5pB,EAAOiqH,cAU1ClrG,EAAO++J,mBAAqB,SAAU3uD,GACpC,GAAI4uD,GAAW,EACXzsJ,EAAer/B,EAAE,kBAErB,IAAyB,aAArB0G,GAAGuE,cAA8B,CAEnC,GAAIw1H,GAAczgI,EAAE,eACM,IAAtBygI,EAAYxxH,SACd68K,GAAYrrD,EAAYr+H,SAM5B,MAH2B,IAAvBi9B,EAAapwB,SACf68K,GAAYzsJ,EAAaj9B,SAEpBpC,EAAEyF,QAAQrD,QAAU,GAAK0pL,GAUlCh/J,EAAOi/J,gBAAkB,SAAU7uD,GAKjC,MAJApwG,GAAOo+J,aAAe,EACtBhuD,EAAS73H,KAAK,sCAAsCnE,KAAK,WACvD4rB,EAAOo+J,cAAgBlrL,EAAEmB,MAAMqhE,YAAW,KAErC11C,EAAOo+J,cAShBp+J,EAAOw3I,kBAAoB,WACzB,GAAIr2J,GACAivH,EAAWl9H,EAAE,sBACbkrL,EAAep+J,EAAOi/J,gBAAgB7uD,GACtC8uD,EAAkBl/J,EAAO++J,mBAAmB3uD,GAC5C+uD,EAAUjsL,EAAE,iBAAkBk9H,EAQlC,IALA+uD,EAAQzhJ,KAAK,SAAUxsB,EAAGY,GAExB,MAAQhT,UAASoS,EAAE/J,aAAa,aAAek2B,OAAO+hJ,kBAAoBtgL,SAASgT,EAAE3K,aAAa,aAAek2B,OAAO+hJ,oBAGtHD,EAAQh9K,OAAS,GAAgC,aAA3BvI,GAAGgpB,YAAYnC,QAAwB,CAC/D,GAAIy+J,EAAkBd,EAEpB,IAAK,GAAIxiL,GAAI,EAAGA,EAAIujL,EAAQh9K,OAAQvG,IAAK,CACvCuF,EAAQvH,GAAGmE,GAAG8C,QAAQ8oB,OAAOw1J,EAAQplI,GAAGn+C,GAAGxC,KAAK,QAChD,IAAIwgC,IAAO,CACX,GACEA,GAAOz4B,EAAM0sH,KAAKrC,gBAAgBI,MAClCszD,EAAkBl/J,EAAO++J,mBAAmB3uD,GAC5CguD,EAAep+J,EAAOi/J,gBAAgB7uD,SAC/Bx2F,GAAQslJ,EAAkBd,OAEhC,CAEL,GAAIxiL,GAAIujL,EAAQh9K,OAAS,CACzB,KAAKvG,EAAGA,GAAK,EAAGA,IAAK,CACnBuF,EAAQvH,GAAGmE,GAAG8C,QAAQ8oB,OAAOw1J,EAAQplI,GAAGn+C,GAAGxC,KAAK,QAChD,IAAIwgC,IAAO,CACX,GAIE,KAHAA,EAAOz4B,EAAM2sH,OAAOtC,gBAAgBI,MACpCszD,EAAkBl/J,EAAO++J,mBAAmB3uD,GAC5CguD,EAAep+J,EAAOi/J,gBAAgB7uD,GAC/B8uD,EAAkBd,GAAc,CACrCj9K,EAAM0sH,KAAKrC,gBAAgBI,KAC3B,aAEKhyF,GAAQslJ,EAAkBd,IAGvCr3I,0BAUJ/mB,EAAOq/J,0BAA4B,SAAUd,EAAUhvJ,GAarD,MAZAr8B,GAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7BhM,GAAGwpB,QAAQyE,WACRrR,KAAK,WAAY,SAAU0gD,EAAMooH,GAC5BA,EAASn9K,SAAWotB,EAAOgvJ,EAASngH,SACnCmgH,EAASpgH,YAEf3nD,KAAK,WAAY,SAAU+4C,EAAe+vH,GACrC/vH,EAAcptD,SAAWotB,EAAOgvJ,EAASngH,SACxCmgH,EAASpgH,cAIbn+C,GASTA,EAAOu/J,4BAA8B,SAAUhB,EAAUhvJ,GAYvD,MAXAr8B,GAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7BhM,GAAGwpB,QAAQyE,WACRrR,KAAK,WAAY,SAAU0gD,EAAMooH,GAC5BA,EAASn9K,OAASotB,EAAOgvJ,EAASngH,SACjCmgH,EAASpgH,YAEf3nD,KAAK,WAAY,SAAU+4C,EAAe+vH,GACrC/vH,EAAcptD,OAASotB,EAAOgvJ,EAASngH,SACtCmgH,EAASpgH,cAGbn+C,GAUTA,EAAOupH,4BAA8B,WACnC,GAAIi2C,GAAYtsL,EAAE,UAClBA,GAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7BhM,GAAGwpB,QAAQyE,WAAWrR,KAAK,WAAY,SAAU0gD,EAAMooH,GACjDA,EAASn9K,OAAS,EAAGq9K,EAAU9+I,KAAK,WAAW,GAC9C8+I,EAAU9+I,KAAK,WAAW,QAWrC1gB,EAAOy/J,yBAA2B,SAAUhuJ,GAC1C,GAAI77B,GAAQgE,GAAGmE,GAAG8pB,WAAW6lB,kBAC7B,IAAI93C,EAAMuM,OAAS,EAAG,CACpB,GAAIjH,GAAOtF,EAAM,EACb1C,GAAE8jB,WAAWya,IAAWA,EAASv9B,KAAKG,MAAQuD,GAAIsD,EAAKtD,GAAI66B,KAAMv3B,EAAKu3B,KAAMsa,QAAS7xC,EAAKwgD,kBAUlG17B,EAAO0/J,qBAAuB,SAAUjuJ,GAEtC,GAAIgB,GAAO74B,GAAGmE,GAAGq7I,SACX3mH,IAAQv/B,EAAE8jB,WAAWya,IACzBA,EAASv9B,KAAKG,MACZuD,GAAIgC,GAAGmE,GAAGswC,QACV5b,KAAMA,EACNsa,QAASnzC,GAAGmE,GAAG0jE,sBAWrBzhD,EAAO2/J,oBAAsB,SAAUpB,GAqBrC,MApB2B,sCAAvBA,EAAS7hJ,WACXxpC,EAAEiwB,KAAKvpB,GAAGgpB,aAAahd,KAAK,WAC1B,GAAI2tB,GAAOnD,cAAc,QAAQ7Z,aACjC,IAAY,UAARgd,EAAkB,CACpB,GACImJ,GADAyuH,EAAa/6H,cAAc,cAAc7Z,aAE7C,QAAQ40I,GACN,IAAK,UAAWzuH,EAAY,qCAAuC,MACnE,KAAK,UAAWA,EAAY,gCAAkC,MAC9D,KAAK,WAAYA,EAAY,iCAAmC,MAChE,SAASA,EAAY,yCAGvBA,GADiB,kBAARnJ,EACG,kCAEA,mCAEd35B,IAAGwpB,QAAQviB,QAAQ8oB,OAAOi2J,kCAAkCrnE,SAASv9G,EAAE0hC,MAGpE1c,EAAOq/J,0BAA0Bd,EAAU,IAUpDv+J,EAAO6/J,eAAiB,WAEtB,MADAhiL,MAAK4jD,SAASC,KAAK+9H,yBAAyB54B,gBACrC7mI,GASTA,EAAO8/J,WAAa,WAclB,MAbAjiL,MAAK4jD,SAASC,KAAK+9H,yBAAyB,SAAUtkL,GACpD,OAAQA,EAAMs3B,KAAKlc,eACjB,IAAK,OACHpb,EAAMqB,GAAKtJ,EAAE,IAAMiI,EAAMvD,IACzB83K,UAAUv0K,GAAO20K,SACjB,MACF,KAAK,MACH9e,qBAAqB71J,EAAM4xC,QAAS5xC,EAAMvD,GAC1C,MACF,SACEm6B,UAAU/2B,EAAE,8BAGXglB,GASTA,EAAO+/J,8BAAgC,SAAUxB,GAkB/C,MAjBArrL,GAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7BhM,GAAGwpB,QAAQyE,WAAWrR,KAAK,WAAY,SAAU0gD,EAAMooH,GAC7B,IAApBA,EAASn9K,OACXtE,KAAK4jD,SAASC,KAAK+9H,yBAAyB,SAAUtkL,GACpD,GAAI6kL,GAAc7kL,EAAMs3B,KAAKlc,aAET,UAAhBypK,GAA0C,QAAhBA,EAC5BzB,EAASngH,SAETmgH,EAASpgH,YAIbogH,EAASpgH,cAIRn+C,GASTA,EAAOigK,kBAAoB,WAIzB,MAHApiL,MAAK4jD,SAASC,KAAK+9H,yBAAyB,SAAUtkL,GACpD0rJ,eAAe1rJ,EAAO,4BAEjB6kB,GASTA,EAAOkgK,oBAAsB,WAW3B,MAVAriL,MAAK4jD,SAASC,KAAK+9H,yBAAyB,SAAUtkL,GACpD,GAAI44J,GAAY54J,EAAMs3B,KAAKlc,aACT,UAAdw9I,GAAsC,QAAdA,EAE1BlN,eAAe1rJ,EAAO,sBAGtB24J,oBAAoB34J,KAGjB6kB,GASTA,EAAOmgK,kBAAoB,WAWzB,MAVAtiL,MAAK4jD,SAASC,KAAK+9H,yBAAyB,SAAUtkL,GACpD,GAAI44J,GAAY54J,EAAMs3B,KAAKlc,aACT,UAAdw9I,EAEFlN,eAAe1rJ,EAAO,wBAGtB04J,kBAAkB14J,KAGf6kB,GASTA,EAAOogK,mBAAqB,WAI1B,MAHAviL,MAAK4jD,SAASC,KAAK+9H,yBAAyB,SAAUtkL,GACpD0rJ,eAAe1rJ,EAAO,yBAEjB6kB,GASTA,EAAOogK,mBAAqB,WAI1B,MAHAviL,MAAK4jD,SAASC,KAAK+9H,yBAAyB,SAAUtkL,GACpD0rJ,eAAe1rJ,EAAO,yBAEjB6kB,GASTA,EAAOqgK,iBAAmB,SAAUllL,GAIlC,MAHAxC,QAAOiB,GAAGwnB,SAASrC,KAAKo3D,4BAA6Bz9D,GAAMvd,EAAMvD,GAAI47B,KAAQr4B,EAAMs3B,KAAMqa,SAAY3xC,EAAM4xC,WAAYrY,QAAQ,SAAUj5B,GACvI9C,OAAOq7B,KAAK,oCAAsCv4B,EAAK,OAASA,KAE3DukB,GASTA,EAAOsgK,kBAAoB,SAAUnlL,GACnC,GAAkB,OAAdA,EAAMs3B,KAAe,CACvB,GAAI8tJ,GAAmB,EAIrBA,GAHGrtL,EAAEm1C,cAAczuC,GAAGqqB,KAGH,oBAAsB9oB,EAAMvD,GAF5B,qBAAuBgC,GAAGqqB,IAAIb,QAAQ9kB,KAAO,OAASnD,EAAMvD,GAGjFe,OAAOq7B,KAAKusJ,GAEd,MAAOvgK,IASTA,EAAO28B,aAAe,WACpB,GAAIppB,GAAOnD,cAAc,QAAQ7Z,aACjC,OAAgB,UAARgd,GAA6B,aAATA,GAAgC,mBAATA,GAAqC,eAARA,GAQlFvT,EAAOy1I,uBAAyB,WAC9B,GAAIliI,GAAOnD,cAAc,QAAQ7Z,aACjC,OAAiB,aAATgd,GAAgC,mBAATA,EASjC,IAAIitJ,GAAsC,WACxC,GAAkC,aAA9B5mL,GAAGmpB,eAAetC,SAA4B7mB,GAAGmE,GAAG8pB,WAEtD,IAAK,GADDjyB,GAAQgE,GAAGwpB,QAAQyE,WAAW6lB,mBACzB9xC,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAChC,GAAIhG,EAAMgG,GAAGm8G,SAAS9hH,QAAQ,cAAckM,OAAS,EACnD,OAAO,CAIb,QAAO,EAST6d,GAAOygK,2BAA6B,SAAUlC,GAU5C,MATArrL,GAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7BhM,GAAGwpB,QAAQyE,WAAWrR,KAAK,WAAY,SAAU0gD,EAAMooH,IAChDt/J,EAAO28B,gBAAkB2iI,EAASn9K,OAAS,IAAMq+K,IACpDjC,EAASngH,SAETmgH,EAASpgH,cAIRn+C,GASTA,EAAO0gK,kCAAoC,SAAUnC,GAKnD,MAJA3kL,IAAGwpB,QAAQyE,WAAWrR,KAAK,WAAY,WACrC3Y,KAAK4jD,SAASC,KAAKi/H,oBAAoBtsL,OACtCkqL,GACH1gL,KAAK4jD,SAASC,KAAKi/H,oBAAoBpC,GAChCv+J,GASTA,EAAO2gK,oBAAsB,SAAUpC,GACrC,GAAIpsB,GAAWnyI,EAAO28B,eAClBikI,EAAkE,SAA9C1tL,EAAE,kCAAkCoV,KAM5D,OALI6pJ,IAAYyuB,EACdrC,EAASpgH,UAETogH,EAASngH,SAEJp+C,GASTA,EAAO6gK,iBAAmB,SAAUtC,GAClC,GAAI3mL,GAAKgC,GAAGwpB,QAAQirB,OAQpB,OANwB,OAApBz0C,GAAGuE,cACL8xC,WAAW,YAAa,GAAKr4C,GACA,aAApBgC,GAAGuE,eACZqrJ,aAAa,GAAK5xJ,EAAIgC,GAAGwpB,QAAQq+C,oBAG5BzhD,GASTA,EAAO8gK,kBAAoB,SAAUvC,GACnC,GAAI3mL,GAAKgC,GAAGwpB,QAAQirB,OAQpB,OANwB,OAApBz0C,GAAGuE,cACLoyC,YAAY,cAAgB34C,GACC,aAApBgC,GAAGuE,eACZwrJ,iBAAiB,GAAK/xJ,EAAIgC,GAAGwpB,QAAQq+C,oBAGhCzhD,GASTA,EAAO+gK,2BAA6B,SAAUxC,GAM5C,MALwB,QAApB3kL,GAAGmE,GAAGq7I,WAAuBx/I,GAAGmE,GAAGijL,aAAehzK,YAAYM,UAChEiwK,EAASpgH,UAETogH,EAASngH,SAEJp+C,GASTA,EAAOihK,gBAAkB,WACvB,GAAI9c,GACAnjK,EAAS,GAAIpH,IAAGygB,IAAIF,QAAQ87F,cAwBhC,OAvBAj1G,GAAOwV,KAAK,SAAU,SAAUxiB,GAE9Bd,EAAE,iBAAiB4I,KAAKd,EAAE,cAC1B9H,EAAE,kBAAkB4I,KAAK5I,EAAE,uBAAuB4I,OAAOwU,MAAM,OAEjEtP,EAAOwV,KAAK,KAAM,SAAUxiB,GAC1B,GAAIswK,GAAa,GAAI1qK,IAAGkf,IAAI,mBAC5BwrJ,GAAWtrJ,SAAS,UAAWhe,EAAE,yBACjC,IAAIopK,GAAMrtK,KAAKC,MAAsB,IAAhBD,KAAKqP,UAAkBmN,UAC5C4wJ,GAAQG,EAAWtwI,KAAK,MAAQowI,KAElCpjK,EAAOwV,KAAK,SAAU,SAAUjd,GAC9B,GAAI2nL,GAAS3nL,EAASgf,OACtB2oK,GAAOloK,SAAS,OAAQ,OACxBkoK,EAAOloK,SAAS,OAAQpf,GAAGmE,GAAG2a,IAC9BwoK,EAAOloK,SAAS,SAAUpf,GAAGuE,eAC7B+iL,EAAOp4G,OAAOq7F,KAEhBnjK,EAAOwV,KAAK,QAAS,SAAUsO,GAC7Bq/I,EAAMjxI,UAERlyB,EAAO1K,OAEA0pB,GASTA,EAAOmhK,iCAAmC,SAAU5C,EAAUtiL,GAoB5D,MAnBA/I,GAAEiwB,KAAKvpB,GAAGmpB,gBAAgBnd,KAAK,WAC7BhM,GAAGwpB,QAAQyE,WACRrR,KAAK,WAAY,SAAU0gD,EAAMooH,GAChC,GAAI8B,GAAU9B,EAAStwJ,OAAO,SAAU5b,GAAS,MAAOA,GAAMqf,OAASx2B,GACnEmlL,GAAQj/K,OAAS,GAAKi/K,EAAQj/K,SAAWm9K,EAASn9K,OACpDo8K,EAASngH,SAGTmgH,EAASpgH,YAEZ3nD,KAAK,WAAY,SAAU+4C,EAAe+vH,GACzC,GAAI8B,GAAU7xH,EAAcvgC,OAAO,SAAU5b,GAAS,MAAOA,GAAMqf,OAASx2B,GACxEmlL,GAAQj/K,OAAS,GAAKi/K,EAAQj/K,SAAWm9K,EAASn9K,OACpDo8K,EAASngH,SAGTmgH,EAASpgH,cAGVn+C,IAIRrnB,OAAOkF,KAAK4jD,SAASC;AChyBxB,cAEA,SAAW1hC,GAET,GAAIqhK,IAAqB,MAAO,SAAU,SAAU,QAAS,OAAQ,SAAU,YAAa,SAExFC,EAAsB,UAMtBC,EAA4B,SAAU7qG,EAAY8qG,GACpD,MAAkB,SAAd9qG,GAAyB8qG,KAAoB,EAAa,YAClD,KAAO9qG,GAcjB/B,EAAgB,SAAU+B,EAAY+qG,EAAYC,EAAqBC,GAEzE1uL,YAAY0B,OAERgtL,EACFC,EAAkBlrG,EAAY/9E,OAAOiB,GAAGmE,GAAG8pB,WAAW6lB,mBAAoBg0I,GAG1E1hK,EAAO0/J,qBAAqB,SAAU9tI,GACpCj5C,OAAOiB,GAAGwnB,SAASg7C,OAAOuY,cAAc/iC,EAAK8kC,GAAYhiD,QAAQ,WAC3DgtJ,GAAqBA,EAAoB9vI,EAAK8kC,QAMtDkrG,EAAoB,SAAUlrG,EAAY9gF,EAAO8rL,GAEnD,GAAI/oL,OAAOiB,GAAGwpB,QAAQyE,WAAWmoB,eAE/B,GAA8B,KAA1B5f,cAAc,QAAgB,CAEhC,GAAIiR,GAAWznC,GAAGwpB,QAAQirB,OAE1B11C,QAAOiB,GAAGwnB,SAAS0uD,OAAO2G,uBAAuBp1C,EAAUq1C,GAAYhiD,QAAQ,WAE7E,IAAK,GADD9+B,GAAQ+C,OAAOiB,GAAGmE,GAAG8pB,WAAW6lB,mBAC3B9xC,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAAK,CACrC,GAAIV,GAAOtF,EAAMgG,EAEe,SAA5BV,EAAKu3B,KAAKrtB,eACRs8K,GAAqBA,GAAsB9pL,GAAIsD,EAAKtD,GAAI66B,KAAMv3B,EAAKu3B,MAAQikD,UAKrF3kD,WAAU/2B,EAAE,gEAId,KAAK,GAAIY,GAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAAK,CACrC,GAAIg2C,IAAQh6C,GAAIhC,EAAMgG,GAAGhE,GAAI66B,KAAM78B,EAAMgG,GAAG62B,KAE5C,IAA+B,QAA3Bmf,EAAInf,KAAKrtB,cAAyB,CACpC,GAAIy8K,GAAW,SAAWjwI,GACxB,MAAO,YACD8vI,GAAqBA,EAAoB9vI,EAAK8kC,KAEnD9kC,EACHj5C,QAAOiB,GAAGwnB,SAASg7C,OAAOuY,cAAc/iC,EAAK8kC,GAAYhiD,QAAQmtJ,KAWzE7hK,GAAO8hK,mBAAqB,SAAUlwI,EAAK8kC,GAEzC,GAAIqrG,GAAW7uL,EAAE,IAAM0+C,EAAIh6C,IAAIW,KAAK,gBAYpC,OAXIwpL,GAAS5/K,OAAS,GACpB4/K,EAASpuL,YAAY,SAAUg6D,EAAO7G,GACpC,GAAI6rG,GAAM,GAAIpgJ,QAAO,OAAQ,KACzB69F,EAAUtpD,EAAQ8rG,MAAMD,EAC5B,OAAMviD,GACIA,EAAQ9pG,KAAK,KAEd,KAERvS,SAAS,KAAO2iF,GAEd12D,EAIT,IAAIgiK,GAAwB,SAAUzD,EAAUmD,EAAqBC,GACnE,GAAIM,GAAiBC,mBACrBD,GAAe3sL,MAAQ,IACvB2sL,EAAexsL,OAAS,GACxBvC,EAAEkB,KAAK6tL,EAAersL,MAAO,WAC3B,GAAI8gF,GAAariF,KAAKuD,EACtBvD,MAAKiK,KAAO,YACZjK,KAAKoK,QAAU,WAAck2E,EAAc+B,EAAY6nG,EAAUmD,EAAqBC,MAExFM,EAAersL,MAAMqsL,EAAersL,MAAMuM,OAAS,GAAGnG,iBAAkB,EACxE9I,EAAE4C,OAAOmsL,EAAgB/X,kCAAkCqU,IAC3D0D,EAAe3rL,KAAKioL,GAStBv+J,GAAOmiK,sBAAwB,SAAU5D,EAAUmD,GAEjD,MADAM,GAAsBzD,EAAUmD,GAAqB,GAC9C1hK,GASTA,EAAOoiK,6BAA+B,SAAU7D,EAAUmD,GAExD,MADAM,GAAsBzD,EAAUmD,GAAqB,GAC9C1hK,EAKT,IAAIqiK,GAAkB,SAAUC,GAC9B,GAAIP,GAAWO,EAAO/pL,KAAK,gBAC3B,IAAIwpL,EAAS5/K,OAAS,EAAG,CAEvB,GAAIiuG,GAAUkxE,EAAoBttK,KAAK+tK,EAAS3oL,KAAK,SACrD,IAAMg3G,GAAWA,EAAQjuG,OAAS,EAChC,MAAOiuG,GAAQ,GAGnB,MAAO,MAQTpwF,GAAOuiK,0BAA4B,SAAUhE,GAuC3C,MAtCArrL,GAAEiwB,KAAKxqB,OAAOiB,GAAGmpB,gBAAgBnd,KAAK,WACpCjN,OAAOiB,GAAGwpB,QAAQyE,WAAWrR,KAAK,WAAY,SAAU0gD,EAAMooH,GAC5D,GAAIA,EAASn9K,OAAS,EAIpB,GAHAo8K,EAASngH,SAGLzlE,OAAOiB,GAAGwpB,QAAQyE,WAAWmoB,eAE/BuuI,EAASl3D,QAAQk6D,EAA0B,UAEb,KAA1BnxJ,cAAc,SAChBmuJ,EAASpgH,cAEN,CAOL,IAAK,GAJDvoE,GAAQ+C,OAAOiB,GAAGmE,GAAG8pB,WAAW6lB,mBAGhC80I,GAA2B,EACtB5mL,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAChC,GAAoC,QAAhChG,EAAM,GAAG68B,KAAKrtB,cAAyB,CACzCo9K,GAA2B,CAC3B,OAGJ,GAAIA,EAGF,MAFAjE,GAASpgH,UACTogH,EAASl3D,QAAQk6D,EAA0B,UACpCvhK,MAIXu+J,GAASpgH,UACTogH,EAASl3D,QAAQk6D,EAA0B,cAI1CvhK,EAKT,IAAIyiK,GAAwB,SAAU7sL,GAEpC,IAAK,GADD8gF,GAAa,KACR96E,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAAK,CACrC,GAAI8mL,GAAeL,EAAgBnvL,EAAE,IAAM0C,EAAMgG,GAAGhE,IACpD,IAAM8qL,IACe,OAAfhsG,IAAqBA,EAAagsG,GAClChsG,IAAegsG,GAAc,CAC/BhsG,EAAa,OACb,QAKN,MADmB,QAAfA,IAAqBA,EAAa,SAC/BA,EAST12D,GAAO2iK,gCAAkC,SAAUC,EAAaC,EAAYr/H,EAAMisH,GAChF,GAAI75K,EAEFA,GADE1C,EAAEswI,QAAQhgF,GACJA,GAECA,EAOX,KAAK,GAJDs/H,GAAcL,EAAsB7sL,GAGpCmtL,KACKnnL,EAAI,EAAGA,EAAIylL,EAAkBl/K,OAAQvG,IAAK,CACjD,GAAIE,GAAOd,EAAE,iBAAmB,KAAQA,EAAE,eAAiBqmL,EAAkBzlL,GAAGwJ,eAAemR,aAC/FwsK,GAAUn7K,MACRtJ,KAAM+iL,EAAkBzlL,GACxBE,KAAMA,EACNY,MAAO6kL,EAA0BF,EAAkBzlL,IAAI,GACvDonL,cAAe3B,EAAkBzlL,GACjCW,SAAW8kL,EAAkBzlL,KAAOknL,IAMxC,GAAIG,GAAS,aACTjuL,EAAO,GAAI2D,QAAOumB,UAAUiC,WAAWi4D,MAAMklC,qBAAqBukE,EAAYE,KAAeE,EAAQxT,EAEzGz6K,GAAKkD,SACLlD,EAAKwhB,KAAK,aAAc,SAAUtb,GAE5B2C,KAAKC,oBAEPlE,GAAGmE,GAAGC,WAAWC,OACfC,KAAMtE,GAAGuE,cACTC,QAASxI,EAAMuM,OAAS,EAAI,OAAS,IAAM,YAC3C5D,KAAM,uBACN/D,OAAS5E,EAAMuM,OAAS,EAAI,OAAUstK,EAAgB75K,EAAM,GAAG4G,GAAGgC,IAAI,GAAKqkL,EAAWrkL,IAAI,IAI9F,IAAIk4E,GAAax7E,EAAKoD,IACtBsjL,GAAkBlrG,EAAY9gF,EAAO,SAAUg8C,EAAK8kC,GAClD12D,EAAO8hK,mBAAmBlwI,EAAK8kC,KAEjCzjF,YAAY0B,QAKd,IAAIuuL,GAAYN,EAAY1rL,MAU5B,OARA0rL,GAAYntL,QAAS,GACrBmtL,EAAY1rL,OAAS,WACfhE,EAAE8jB,WAAWksK,IAAYA,IAC7BluL,EAAKypH,MAAM1mH,KAAMkhI,gBAAiB,SAClCjkI,EAAK6pH,OAAO3rH,EAAE,8BAA8B,IAIvC8B,IAIR2D,OAAOkF,KAAK4jD,SAASC;CClSxB,SAAkC1hC,GAChC,YA2DA,SAASmjK,GAAiBC,GAGxB,GAAIC,IACFC,QAAS,IACTC,SAAU,IACVC,QAAS,IACTC,OAAQ,KAINC,GACFC,MAAO,IACPC,QAAS,IACTC,KAAM,IACNJ,OAAQ,KAINziL,GAAS,GAAKpH,IAAGygB,IAAIF,QAAQ6D,YAC9BipF,mBACAJ,aACAvwG,OAICyK,GAGF2Y,cAGAgsE,YAAa,WACX,GAAIo+F,GAAc,GAAI5kK,WAAUiC,WAAWxD,MAAMjE,WAAW+rE,KACxDs+F,GACFnsL,GAAI,4BACJosL,SAAU,4BACVt5J,OAAQx3B,EAAEwkB,SACPgsK,EAAsBC,MAAO3oL,EAAE,SAAUA,EAAE,WAC3C0oL,EAAsBE,QAAS5oL,EAAE,WAAYA,EAAE,aAC/C0oL,EAAsBG,KAAM7oL,EAAE,QAASA,EAAE,WAE5CwqF,cAAexqF,EAAE,SACjBuqF,YAAam+F,EAAsBC,MACnCM,WAAY,GACZ9/F,YAAY,GAGV+/F,EAAe,GAAIhlK,WAAUiC,WAAWxD,MAAMjE,WAAW+rE,KACzD0+F,GACFvsL,GAAI,6BACJosL,SAAU,6BACVt5J,OAAQx3B,EAAEwkB,SACPgsK,EAAsBC,MAAO3oL,EAAE,SAAUA,EAAE,WAC3C0oL,EAAsBE,QAAS5oL,EAAE,WAAYA,EAAE,aAC/C0oL,EAAsBG,KAAM7oL,EAAE,QAASA,EAAE,WAE5CwqF,cAAexqF,EAAE,SACjBuqF,YAAam+F,EAAsBC,MACnCM,WAAY,GACZ9/F,YAAY,GAGVigG,EAAWlxL,EAAE0nB,WACbypK,EAAe,oEACnBD,GAASjoK,QAAQkoK,EAEjB,IAAIC,IACF1sL,GAAI,0BACJwb,MAAO,GACP+tE,UAAU,GAERojG,GACF3sL,GAAI,wBACJwb,MAAO,GACP+tE,UAAU,EAGZ,OAAOjuF,GAAEiwB,KACP2gK,EAAYp+F,YAAYq+F,GACxBG,EAAax+F,YAAYy+F,GACzBC,EACAxqL,GAAGynB,UAAUnpB,OAAO,gCAAiCosL,GACrD1qL,GAAGynB,UAAUnpB,OAAO,gCAAiCqsL,IACrDvnK,KAAK,SAAUwnK,EAAiBC,EAAkBJ,EAAcK,EAAeC,GAC/E,MAAO/qL,IAAGynB,UAAUnpB,OAAO,yCACzB0sL,iBAAkB5pL,EAAE,WACpBwpL,gBAAiBA,EACjBK,kBAAmB7pL,EAAE,YACrBypL,iBAAkBA,EAClBK,cAAe9pL,EAAE,QACjB+pL,iBAAkB/pL,EAAE,QACpBqpL,aAAcA,EACdW,YAAahqL,EAAE,UACfiqL,eAAgBjqL,EAAE,QAClB0pL,cAAeA,EACfQ,aAAclqL,EAAE,MAChB2pL,YAAaA,OAMnB/vL,KAAM,SAAU6qH,GACd,GAAIroG,GAAK/iB,IACT+iB,GAAGqoG,MAAQA,EAEXA,EAAMlnH,KAAK,gCAAgC4tF,YAAY,QAAUC,KAAM,IAAKC,MAAM,IAElFjvE,EAAGsC,YACD8+H,QAAW,GAAIt5H,WAAUiC,WAAWgH,SAASpnB,KAAK2Y,WAAW+rE,KAAK,UAAW,6BAC7E0/F,SAAY,GAAIjmK,WAAUiC,WAAWgH,SAASpnB,KAAK2Y,WAAW+rE,KAAK,WAAY,8BAC/E2/F,SAAY,GAAIlmK,WAAUiC,WAAWgH,SAASpnB,KAAK2Y,WAAWwgH,QAAQ,WAAY,0BAClFmrD,UAAa,GAAInmK,WAAUiC,WAAWgH,SAASpnB,KAAK2Y,WAAW5Q,KAAK,YAAa,2BACjFw8K,QAAW,GAAIpmK,WAAUiC,WAAWgH,SAASpnB,KAAK2Y,WAAW5Q,KAAK,UAAW,yBAI/E,KAAK,GAAIsjB,KAAWhV,GAAGsC,WACrBtC,EAAGsC,WAAW0S,GAAS+xC,SAGzBshD,GAAMlnH,KAAK,iCAAiCjB,MAAM,WAChD8f,EAAGmuK,QAAQryL,EAAEmB,MAAMiU,UAKvBi9K,QAAS,SAAUtpL,GACjB,GAAImb,GAAK/iB,IACT,KAAK,GAAI+3B,KAAWhV,GAAGsC,WACrBtC,EAAGsC,WAAW0S,GAAS+xC,SAMzB,QAHA/mD,EAAGqoG,MAAMlnH,KAAK,iCAAiCmoC,KAAK,WAAW,GAC/DtpB,EAAGqoG,MAAMlnH,KAAK,eAAiB0D,EAAO,KAAKykC,KAAK,WAAW,GAEnDzkC,GACN,IAAK,WACHmb,EAAGsC,WAAWyrK,SAAS/mH,QACvB,MACF,KAAK,UACHhnD,EAAGsC,WAAW0rK,SAAShnH,QACvB,MACF,KAAK,SACHhnD,EAAGsC,WAAW2rK,UAAUjnH,SACxBhnD,EAAGsC,WAAW4rK,QAAQlnH,QACtB,MACF,KAAK,UACL,QACEhnD,EAAGsC,WAAW8+H,QAAQp6E,WAM5B4kE,QAAS,WACP,MAAO3uI,MAAKorH,MAAMlnH,KAAK,iCAAiCy2B,OAAO,YAAY1mB,OAI7EolB,SAAU,SAAUtB,EAAShZ,GAC3B/e,KAAKqlB,WAAW0S,GAASsB,SAASta,IAGpC0a,SAAU,SAAU1B,GAClB,MAAO/3B,MAAKqlB,WAAW0S,GAAS0B,YAGlCktF,QAAS,WACP,OAAO,GAKX9nH,GAAEiwB,KAAKpiB,EAAK2kF,cAAe9rF,GAAG8L,IAAIxR,KAAK,mCAAmC0R,KAAK,SAAS3N,EAAMutL,GAC5F,GAAIA,GAASA,EAAO,EAEpBxkL,GAAO+lG,SAAS/rG,EAAE,uBAClBgG,EAAOkd,QAAQjmB,GAEf8I,EAAKnM,KAAKoM,EAAO0lG,UAGjB,IAAIzqG,GAAOupL,EAAOC,UAClB,QAAQ,GAAKxpL,GACb,IAAKonL,GAAoBE,SACvBxiL,EAAKwkL,QAAQ,YACbxkL,EAAK2sB,SAAS,WAAY,GAAK83J,EAAOE,aACtC,MAEF,KAAKrC,GAAoBG,QACvBziL,EAAKwkL,QAAQ,WACbxkL,EAAK2sB,SAAS,WAAY83J,EAAOE,aACjC,MAEF,KAAKrC,GAAoBI,OACvB1iL,EAAKwkL,QAAQ,UACbxkL,EAAK2sB,SAAS,YAAa83J,EAAOG,OAAOC,SAAS,IAClD7kL,EAAK2sB,SAAS,UAAW83J,EAAOG,OAAOC,SAAS,GAChD,MAEF,KAAKvC,GAAoBC,QACzB,QACEviL,EAAKwkL,QAAQ,WACbxkL,EAAK2sB,SAAS,UAAW,GAAK83J,EAAOE,cAEvC37I,8BAA8B,mBAGhC/oC,EAAO7J,GAAK,WACV,GAAI4J,EAAKi6G,aAAc,EAAO,OAAO,CAErC,IAAI/+G,GAAM4pL,EAAMC,EAAO7iG,EAEnB8iG,EAAWhlL,EAAKiiI,SACpB,QAAQ+iD,GACN,IAAK,WACH9pL,EAAOonL,EAAoBE,SAC3BsC,EAAO9kL,EAAK+sB,SAAS,WACrB,MACF,KAAK,UACH7xB,EAAOonL,EAAoBG,QAC3BqC,EAAO9kL,EAAK+sB,SAAS,YACf+3J,GAAkB,IAARA,GAAwB,KAARA,IAC9BA,EAAO,GACLA,EAAO,MACTA,EAAO,KACLA,EAAO,IACTA,EAAO,EACT,MACF,KAAK,SACH5pL,EAAOonL,EAAoBI,OAC3BqC,EAAQ/kL,EAAK+sB,SAAS,aACtBm1D,EAAMliF,EAAK+sB,SAAS,UACpB,MACF,KAAK,UACL,QACE7xB,EAAOonL,EAAoBC,QAC3BuC,EAAO9kL,EAAK+sB,SAAS,WAGzB,GAAIk4J,EAwBJ,OAtBEA,GADE/pL,IAASonL,EAAoBI,OACL7pL,GAAG8L,IAAIxR,KAAK,kCACpC+xL,YAAaH,EACbI,UAAWjjG,IAGarpF,GAAG8L,IAAIxR,KAAK,wCACpCiyL,mBAAoBlqL,EACpBmqL,qBAAsBP,IAI1BG,EAAwBpgL,KAAK,WACvB1S,EAAE8jB,WAAWosK,IAEfvlL,KAAKskF,KAAKxS,UAAUwS,KAAK6Y,oBAEzBooF,EAAYpiL,KAEZgyB,qBACAr6B,OAAO6sB,SAASpF,aAGb,GAUX,QAAS2lF,GAAoBrhE,EAAK0+I,EAAa3vG,GAC7CvgF,EAAEwxC,GAAKgvF,YAAY,WACnB,IAAIlgD,GAAYtgF,EAAEwxC,GAAK5wC,SAAS,YAC5B0xB,EAAW5rB,GAAGuE,aAClBioB,aAAY,qCACVklC,OAAQkoB,EACR6yG,SAAU7gK,EACVkuD,iBAAkBD,GAAwB,IACzC,SAAUh4E,GAEXo2B,eAAe,GAAI,GACfp2B,EAAIm2B,QACF1+B,EAAE8jB,WAAWosK,IAEfvlL,KAAKskF,KAAKxS,UAAUwS,KAAK6Y,oBAEzBooF,MAEApwJ,qBACAr6B,OAAO6sB,SAASpF,UAGlBkF,UAAU7pB,EAAIse,OAAO,KA9V3BiG,EAAOsmK,8BAAgC,SAAU5hJ,EAAK0+I,EAAa3vG,EAAsB8yG,GACvF,GAAI3wL,MACA4wL,EAAiCD,IAAsC,EAEvEE,EAEmC,SAFTvzL,EAAE,sBAC7BqF,KAAK,QACLvE,KAAK,2BACJ02D,EAAahmB,EAAIgmB,cAAgB+7H,CACjCA,IACF/hJ,EAAIqzE,SAAShkH,SAAS,YAExB6B,EAAMgS,MACJtJ,KAAM,SACN2/F,MAAOjjG,EAAE,yBACT4xG,QAAS5xG,EAAE,4BACXyB,KAAM,kBACNF,SAAUmuD,EACVhvD,SAAU,SAAUR,GAClBA,EAAKqB,SAAWmoC,EAAIgmB,cAAgB+7H,GAEtCpqL,SAAUoqL,IAEZ7wL,EAAMgS,MACJtJ,KAAM,SACN2/F,MAAOjjG,EAAE,yBACT4xG,QAAS5xG,EAAE,8BACXyB,KAAM,cACNJ,SAAUmqL,GAEZ,IAAIl4J,IACF74B,OAAQ,GAEVvC,GAAE4C,OAAOw4B,EAAU47I,kCAAkCxlI,EAAIqzE,UACzD,IAAI2uE,GAAK,GAAI9sL,IAAGunB,WAAWi4D,MAAM4d,gBAAgBtyD,EAAI0F,SAAUx0C,EAAO04B,EACtEo4J,GAAGxuL,SACHwuL,EAAGlwK,KAAK,aAAc,SAAUtb,GAC9B,OAAQA,EAAKoD,MACX,IAAK,SACHynG,EAAoB7yG,EAAEwxC,EAAI0F,UAAWg5I,EAAa3vG,EAClD,MACF,KAAK,SACH0vG,EAAiBC,QA4TxBzqL,OAAOkF,KAAK4jD,SAASC;CC7WxB,SAAkC1hC,GAChC,YA0NA,SAAS2mK,KACP,GAAIC,GAAc1zL,EAAE,uBAChB26C,EAAa+4I,EAAY5yL,KAAK,eAC9BqpB,EAAMnqB,EAAE0nB,WAER44D,EAAY55E,GAAGmE,GAAG8C,QAAQ0mB,QAA6B,oBAAEmjC,YACzD8oB,GACF55E,GAAG8L,IAAIxR,KAAK,kCAAkC0R,KAAK,SAAU4/K,GAC3D,GAAIqB,GAAcrB,EAAOG,OAAOC,SAAS,GACrCkB,EAAYtB,EAAOG,OAAOC,SAAS,EAClCiB,IAAgBC,EAGnBzpK,EAAIlB,QAAQ0xB,EAAa,KAAOg5I,EAAc,MAAQC,GAFtDzpK,EAAIlB,QAAQ0xB,KAMhBxwB,EAAIlB,QAAQ0xB,GAGdxwB,EAAI4I,OAAO,SAAUunB,GACnBj0C,SAAS0kB,MAAQuvB,EACjBo5I,EAAY9qL,KAAK0xC,KAzOrBxtB,EAAO+mK,mBAAqB,SAAUxI,GAOpC,MANArrL,GAAE,WACA,GAAI2K,KAAKskF,KAAKxS,WAAa9xE,KAAKskF,KAAKxS,UAAUlvD,MAAO,CACpD,GAAIlkB,GAAWsB,KAAKskF,KAAKxS,UAAUlvD,MAAM84E,oBACrCh9F,IAAUgiL,EAAS1zJ,YAGpB7K,GAGTA,EAAOgnK,kBAAoB,SAAUjxL,GACnC,GAAIkpC,GAAU/rC,EAAE6C,EAChB,KAAIkpC,EAAQnrC,SAAS,YAArB,CAEA,GAAI0/E,GAAYv0C,EAAQnrC,SAAS,WAC7B0/E,GACFv0C,EAAQtrC,YAAY,YAEpBsrC,EAAQlrC,SAAS,YAGnB8J,KAAKskF,KAAKxS,UAAUqpB,iBAAiBxlB,KAGvCxzD,EAAOinK,2BAA6B,SAAU1I,GAC5C,GAAI90B,GAAU7vJ,GAAGmE,GAAG0jE,mBAChBylH,EAAUttL,GAAGmE,GAAG4gI,kBAIpB,OAHA/kI,IAAG8L,IAAIxR,KAAK,yCAA2C2mB,cAAe4uI,EAASzuI,cAAeksK,IAAWthL,KAAK,SAAUuhL,GAClHA,GAAS5I,EAAS1zJ,WAEjB7K,GAGTA,EAAOonK,0BAA4B,SAAU1iJ,GAC3C,GAAI8uC,GAAYtgF,EAAEwxC,GAAK5wC,SAAS,WAC3B0/E,GAGH55E,GAAGmE,GAAG8C,QAAQ0mB,QAAQmd,EAAIv9B,aAAa,SAAS+jH,WAFhDtxH,GAAGmE,GAAG8C,QAAQ0mB,QAAQmd,EAAIv9B,aAAa,SAAS0jB,QAIlD,IAAI4+H,GAAU7vJ,GAAGmE,GAAG0jE,mBAChBylH,EAAUttL,GAAGmE,GAAG4gI,kBACpB/kI,IAAG8L,IAAIxR,KAAK,yCAA2Cy/E,SAAUH,EAAW34D,cAAe4uI,EAASzuI,cAAeksK,IACnHrpL,KAAKskF,KAAKxS,UAAU6b,cAQtBxrE,EAAOqnK,kBAAoB,SAAU9I,GAOnC,MANArrL,GAAE,WACA,GAAI2K,KAAKskF,KAAKxS,WAAa9xE,KAAKskF,KAAKxS,UAAUlvD,MAAO,CACpD,GAAIlkB,GAAWsB,KAAKskF,KAAKxS,UAAUlvD,MAAM4tE,mBACrC9xF,IAAUgiL,EAAS1zJ,YAGpB7K,GAGTA,EAAOsnK,iBAAmB,SAAUvxL,GAClC,GAAIkpC,GAAU/rC,EAAE6C,EAChB,KAAIkpC,EAAQnrC,SAAS,YAArB,CAEA,GAAI0/E,GAAYv0C,EAAQnrC,SAAS,WAC7B0/E,GACFv0C,EAAQtrC,YAAY,YAEpBsrC,EAAQlrC,SAAS,YAGnB8J,KAAKskF,KAAKxS,UAAU6c,gBAAgBhZ,KAGtCxzD,EAAO03E,sBAAwB,SAAU3hG,GACvC,GAAIkpC,GAAU/rC,EAAE6C,EAChB,KAAIkpC,EAAQnrC,SAAS,YAArB,CAEA,GAAI0/E,GAAYv0C,EAAQnrC,SAAS,WAC7B0/E,GACFv0C,EAAQtrC,YAAY,YAEpBsrC,EAAQlrC,SAAS,YAGnB8J,KAAKskF,KAAKxS,UAAU+nB,uBAAuBlkB,KAM7CxzD,EAAOunK,qBAAuB,WAC5B,GAAIpiG,GAAUtnF,KAAKskF,KAAKxS,UAAUu1B,sBAE9BO,EAAiB5nG,KAAKskF,KAAKxS,UAAUy1B,6BAGrCpkG,EAAS,GAAIke,WAAUiC,WAAWhH,QAAQq6F,sBAAsBrvB,EAASsgB,GAAgBjvF,KAAK,iBAAkB,SAAUgxK,GAI5H3pL,KAAKskF,KAAKxS,UAAU01B,4BAA4BmiF,IAGlDxmL,GAAOid,MAAQjjB,EAAE,wBACjBgG,EAAO47D,kBAAoB5hE,EAAE,0BAC7BgG,EAAO8oG,oBAAsB9uG,EAAE,oBAC/BgG,EAAO+oG,mBAAqB/uG,EAAE,yBAC9BgG,EAAOmlC,oBAAqB,EAC5BnlC,EAAO1K,OAEPyzC,8BAA8B,mBAahC/pB,EAAOynK,sBAAwB,SAAUlJ,GACvC,GAAImJ,GAA0D,SAA7Cx0L,EAAE,iCAAiCoV,KAMpD,OALIo/K,GACF7pL,KAAK4jD,SAASC,KAAK69H,4BAA4BhB,EAAU,GAEzDA,EAASpgH,UAEJn+C,GASTA,EAAO2nK,oBAAsB,SAAUpJ,GACrC,GAAImJ,GAAwD,SAA3Cx0L,EAAE,+BAA+BoV,KAMlD,OALIo/K,GACF7pL,KAAK4jD,SAASC,KAAK69H,4BAA4BhB,EAAU,GAEzDA,EAASpgH,UAEJn+C,GASTA,EAAO4nK,aAAe,WACK,qBAArBhuL,GAAGuE,eACL+oJ,yBAUJlnI,EAAO6nK,wBAA0B,SAAUnjJ,GACnC4vD,QAAQnzB,YACZmzB,QAAQwzF,2BAA6BpjJ,EAAI0F,SACzCkqD,QAAQyzF,oBAAoBrjJ,EAAI0F,SAAUkqD,QAAQnzB,aAUtDnhD,EAAOgoK,sBAAwB,WACvB1zF,QAAQwzF,6BAC8C,IAAtDjqL,KAAKskF,KAAKxS,UAAUlvD,MAAMoyE,cAAcmC,WAC1C9hG,EAAEohG,QAAQwzF,4BAA4Bn0L,YAAY,YAElDT,EAAEohG,QAAQwzF,4BAA4B/zL,SAAS,cAYrDisB,EAAOioK,kBAAoB,SAAUjnL,GACnCnD,KAAKskF,KAAKxS,UAAU6b,aAChB3tF,KAAKskF,KAAKxS,UAAUgiB,cACtB9zF,KAAKskF,KAAKxS,UAAUgiB,eAGtBg1F,IAEI3lL,GAAQA,EAAOkyB,SAoCrBlT,EAAOwmK,+BAAiC,WAItC,MAAOxmK,GAAOkoK,sBAAsB3xK,cAAc9W,QAAQ,YAAa,GASzEugB,EAAOkoK,oBAAsB,WAC3B,MAAOrqL,MAAKskF,KAAKgmG,uBASnBnoK,EAAOooK,cAAgB,SAAU1jJ,GAC/B9qC,GAAG8L,IAAIxR,KAAK,wCACVy8B,OAAQz9B,EAAEwkB,OAAO7Z,KAAKskF,KAAKxS,UAAUlvD,SACpC7a,KAAK,SAAU05I,GA2BhB,QAASE,KACP,GAAI3mI,GAAM,GAAIjf,IAAGkf,IAAI,iBACrBD,GAAIG,SAAS,aAAc,WAC3BH,EAAIG,SAAS,KAAMsmI,GACnBzmI,EAAIG,SAAS,OAAQpf,GAAGmE,GAAG6a,eAC3BC,EAAImb,OA/BFp6B,GAAGkoB,MAAM6jB,cACX/rC,GAAGkoB,MAAMkE,kBAAkB,cAAcpgB,KAAK,SAAUogB,GAClDA,GAAqBpsB,GAAGkoB,MAAMiE,uBAC9BiU,aAAa5kB,gBAAgBC,uBAAwB,SAAU4kB,GAC/D,GAAI4kH,IACFjnJ,GAAI0nJ,EACJjlH,MAAOJ,EACPylH,WAAY,aACZC,aAAc,UACdC,IAAKrmJ,SAASisB,SAASwkD,KACvB1rE,KAAM1E,GAAGmE,GAAG6a,cAEdhf,IAAGkoB,MAAMoY,gBAAgB,eAAgB,aAAc2kH,GAAeziI,KAAK,SAAUd,GACnFyW,UAAUzW,EAASwJ,aAIvB06H,MAEDpjI,KAAK,WACNojI,MAGFA,MAUDpjI,KAAK,SAAU3gB,GAChB,GAAI0hC,GAA6B,OAAjB1hC,EAAI2hC,SAAoBC,OAAO5hC,EAAI2hC,UAAY5pB,MAC/D5Z,IAAGmE,GAAGylB,WAAWltB,KAAKmF,EAAIse,MAAOvG,OAAW2pB,OAQ/CxkC,OAAOkF,KAAK4jD,SAASkuB;ACjUxB,cAEA,SAAW3vD,GA+CT,QAASqoK,GAA8BC,GACrC,GAAIC,EAEFA,GADE3uL,GAAGioB,WACS3uB,EAAE,aAEFA,EAAE,+BAA+B87B,OAAO,WAExD,IAAIw5J,GAAaD,EAAYjgL,KAE7B,OAAO1O,IAAG8L,IAAIxR,KAAK,2CACjBmgC,MAAOz6B,GAAGmE,GAAG2a,GACb+vK,kBAAmBH,EACnBI,WAAY,EAAeF,EAAa,KACvC5iL,KAAK,SAAUS,GAChBkiL,EAAYjgL,IAAIjC,EAAEsiL,iBAKtB,QAASC,GAAe7yL,GACtBi9B,qBACA9/B,EAAE,iBAAiBoV,IAAIvS,EAAG6B,IAE1BsnB,UAAUmF,IAAIpN,QAAQ,cAAe,WAAc6Z,SAAS,iCAAiC,KAI/F,QAAS+3J,GAAY9yL,GACnBi9B,qBACA9/B,EAAE,iBAAiBoV,IAAIvS,EAAG6B,IAE1BsnB,UAAUmF,IAAIpN,QAAQ,cAAe,WACR,IAAvBmZ,cAAc,MAChBU,SAAS,gCAAgC,EAAMP,iBAAiBr9B,EAAE,cAAckG,KAAK,UAAW,OAEhG03B,SAAS,gCAAgC,KA0C/C,QAASg4J,KACP91J,qBACA9T,UAAUmF,IAAIpN,QAAQ,cAAe,WACR,IAAvBmZ,cAAc,MAChBU,SAAS,gCAAgC,EAAMP,iBAAiBr9B,EAAE,cAAckG,KAAK,UAAW,OAEhG03B,SAAS,gCAAgC,KAM/C,QAASi4J,KACP/1J,qBAEA9T,UAAUmF,IAAIpN,QAAQ,cAAe,WAAc6Z,SAAS,mCAAmC,KAoCjG,QAASk4J,KACP,GAAInnK,GAAW3uB,EAAE,QAAQY,SAAS,SAClC,IAAI+tB,EAAU,CACZ,GAAIxd,GAAInR,EAAE,mBACVmR,GAAE9L,KAAK,MAAMu2D,QAAQ72D,KAAKgxL,qBAC1B5kL,EAAE/N,QA7KN0pB,EAAOkpK,kBAAoB,WACzB,GAAIjoL,GAAS/N,EAAE,qBACXi2L,EAAWj2L,EAAE,aAAc+N,EAC/BkoL,GAAS5wI,MAAM,sIACft3C,EAAOq9B,WAAW,UAIlB,KAAK,GAFD2oI,MACAmiB,EAAUH,oBACLrtL,EAAI,EAAGA,EAAIwtL,EAAQjnL,SAAUvG,EACpCqrK,EAAWr/J,MACT9L,KAAMstL,EAAQxtL,GAAGytL,YACjB5qL,QAAS,SAAW6qL,GAClB,MAAO,YACLtpK,EAAOspK,cAAcA,KAEtBF,EAAQxtL,KAGf,IAAI2tL,GAAqBrf,kCAAkCjpK,GACvDjM,EAAO,GAAI/B,aAAYg0K,GACzBzxK,OAAQ,EACRC,OAAQ,GACRH,MAAO,OACPI,SAAU,wBACVwB,OAAQ,WACN,MAAI+J,GAAOnN,SAAS,aAClBb,YAAY0B,QACL,OAET40L,GAAmBryL,UAErBjD,OAAQ,WACNs1L,EAAmBt1L,WAGvBgN,GAAOlM,YAAYC,IAoDrBgrB,EAAOwpK,QAAU,SAAU9xL,GACpB+xL,YAOCC,iBAEFV,EAAqBtxL,GAErB4qC,iBAAiBtnC,EAAE,uBAAwB,WAEzCqtL,EAA8B,IAAIziL,KAAK,SAAUS,GAC3CA,EAAEsjL,iBAEJb,IAGAC,QAjBRzmJ,iBAAiBtnC,EAAE,uBAAwB,WACzCg4B,qBACAlC,SAAS,+BAA+B,MAiD9C9Q,EAAOspK,cAAgB,SAAUA,GAC/BhnJ,iBAAiBtnC,EAAE,6BAA8BsuL,EAAcD,aAAc,WAC3EhB,EAA8BiB,EAAcp8I,MAAMtnC,KAAK,SAAUS,GAC3DA,EAAEsjL,iBACJd,GAAcjxL,GAAI0xL,EAAc5kF,QAEhCkkF,GAAiBhxL,GAAI0xL,EAAc5kF,aAY3C1kF,EAAO4pK,sBAAwB,SAAUC,GACvC7pK,EAAOspK,eACLp8I,KAAMh6C,EAAE22L,GAAU/tL,OAClB4oG,MAAOmlF,EAASjyL,OAoBnBe,OAAOkF,KAAK4jD,SAAS1B;AC/LxB,cAEA,SAAW//B,GAOTA,EAAO81B,WACNn9C,OAAOkF,MAGV,SAAWmiB,GACT,GAAI8pK,EAQJ9pK,GAAO2qJ,sBAAwB/wK,GAAGsrB,kBAAkB,WAWlD,QAAS6kK,GAAWC,GAClB,GAAInxK,GAAM,GAAIjf,IAAGkf,IACbw6I,EAAc36J,OAAOY,SAAS0kB,MAC9BgsK,GAAY,EACZh0D,EAAQp9G,EAAIwX,SAAS,QAEzB,QAAQ25J,GACN,IAAK,QACHnxK,EAAI2X,YAAY,SAChBy5J,GAAY,CACZ,MACF,SACEpxK,EAAIG,SAAS,QAAS,KAI1B,GAAIyH,IACFxkB,KAAM,WACNsmC,SAAU3oC,GAAGmE,GAAGswC,QAChB5oB,KAAMwwG,EACNh4G,MAAOtlB,OAAOY,SAAS0kB,MACvBq3G,SAAU20D,EACVz0D,cAAc,EAEhB57H,IAAG8nB,QAAQmsD,UAAUptD,EAAO6yI,EAAaz6I,EAAIpB,YAlC/C,GAAIyyK,GAAch3L,EAAE,iBAChBiuE,EAAY+oH,EAAYl2L,KAAK,OACjC,IAAIk2L,EAAY/nL,OAAS,EAAG,CAC1B,GAAInN,GAAO,GAAI4E,IAAGygB,IAAI++D,MAAM4d,gBAAgB,gBAAiB71B,EAC7DnsE,GAAKkD,SACLlD,EAAKwhB,KAAK,aAAc,SAAUtb,GAChC6uL,EAAW7uL,EAAKoD,QA+BpB,MAAO0hB,KAWTA,EAAO4qJ,mBAAqBhxK,GAAGsrB,kBAAkB,WAC/C,GAAIklB,GAAW,mBACf,IAAIl3C,EAAEk3C,GAAUjoC,OAAS,EAAG,CAE1B,GAAIvM,MACAkuB,IAEJ,KAAK,GAAIxlB,KAAQ1E,IAAGsnB,WACL,YAAT5iB,IACFwlB,EAAYlqB,GAAGsnB,WAAW5iB,GAC1B1I,EAAMgS,MACJtJ,KAAQwlB,EAAUxlB,KAClB2/F,MAASn6E,EAAU7F,MACnBxhB,KAAQ,gBAAkBqnB,EAAUrnB,OAK1C,IAAI6xB,IACFh5B,MAAO,KAGLN,EAAO,GAAI4E,IAAGygB,IAAI++D,MAAM4d,gBAAgB5sD,EAAUx0C,EAAO04B,EAC7Dt5B,GAAKkD,SACLlD,EAAKwhB,KAAK,aAAc,SAAUtb,GAChCtB,GAAGqqB,IAAI/oB,EAAKoD,MAAM4hB,iBAGtB,MAAOF,KAUTA,EAAO0qJ,qBAAuB9wK,GAAGsrB,kBAAkB,WA4CjD,QAASilK,KACP,GAAIC,GAAkBl3L,EAAE,oBAAoBoC,QACxC+0L,EAAgBn3L,EAAE,gCAAgCwiE,YACjD40H,KACHA,EAAep3L,EAAE,mBAAmBwiE,aAEtC,IAAI60H,GAAsBr3L,EAAE,qBAAqBwiE,YAEjDxiE,GAAE,kCAAkCwiE,WAAW00H,EAAkBC,EAAgBC,EAAeC,GAIlG,QAASC,KACP,GAAIr5K,GAAIs5K,EAAYniL,KAGpB,IAAI6I,GAAKw4C,KAAM,CACb,GAAIsJ,GAAQ//D,EAAE,6CAA6CoV,KAC3DhO,cAAawvL,GACbA,EAAyBnvL,WAAW,WAClCogD,kBAAkBogG,SAAUhqI,EAAG8hD,GAC/B//D,EAAE,WAAWkG,KAAK,WAAW,IAC5B,KACHuwD,KAAOx4C,GAKX,QAASu5K,KACPx3L,EAAE,yBAAyBoD,OAC3BpD,EAAE,0BAA0BoD,OAC5BpD,EAAE,kCAAkC6E,IAAI,QAAS,IAInD,QAAS4yL,GAAqBjzL,GAC5B,GAAIkxD,GAAOlxD,EAAM8mD,KACjB,QAAQoK,GAEN,IAAK11D,GAAEiwF,GAAGtsC,QAAQusC,MAEhB,MADA1rF,GAAML,kBACC,CAET,KAAKnE,GAAEiwF,GAAGtsC,QAAQ0sC,OAQhB,MAPA7rF,GAAML,iBACFozL,EAAYrxJ,GAAG,UACjBwxJ,EAAYnuI,QAAQ,cAEpBguI,EAAYniL,IAAI,IAChBmiL,EAAYhuI,QAAQ,UAEf,CACT,SACE,OAAO,GAKb,QAASouI,GAAmBnzL,GACtB+yL,EAAYniL,MAAOsiL,EAAY72L,SAAS,mCACvC62L,EAAYj3L,YAAY,mCAvG/B,GAEI22L,GAFAG,EAAcv3L,EAAE,eAChB03L,EAAcH,EAAY3iL,SAAS60B,SAAS,6BAuChD,OAlCAiuJ,GAAYr3L,UAAU,SAAUmE,GAC9BA,EAAML,iBACNuzL,EAAYj3L,YAAY,mCACxB82L,EAAYniL,IAAI,IAChBkiL,MAGF/vI,gBACAiwI,IAGAx3L,EAAEyF,QAAQxD,GAAG,YAAa,WACpBs1L,EAAYniL,OACd6hL,MAKJM,EAAYnzL,MAAM,WACXmzL,EAAYniL,QACfpV,EAAE,yBAAyByB,OAC3BzB,EAAE,0BAA0ByB,OAE5Bw1L,OAED3zK,KAAK,OAAQ,WACTi0K,EAAYniL,OAAOoiL,MACvBl0K,KAAK,aAAc,WACpBg0K,MACCh0K,KAAK,UAAW,SAAU9e,GAC3B,MAAOizL,GAAqBjzL,KAC3B8e,KAAK,QAAS,SAAU9e,GACzB,MAAOmzL,GAAmBnzL,KAErBsoB,IA0ETA,EAAO6qJ,kBAAoBjxK,GAAGsrB,kBAAkB,WAqB9C,QAAS4lK,KACHjtL,KAAK4jD,SAASC,KAAK/E,eACrBouI,EAAoBp2L,OAEpBo2L,EAAoBz0L,OAxBxB,GAAI00L,GAAiB93L,EAAE,mBACnB63L,EAAsBC,EAAezyL,KAAK,yBAG9CuyL,KAEAE,EAAe71L,GAAG,oBAAqB,SAAUsD,GAQ/C,MAPAA,GAAEpB,iBACFoB,EAAEhF,kBACGoK,KAAK4jD,SAASC,KAAK/E,iBACtBzpD,EAAEmB,MAAM+E,KAAK,OAAQ,eACrBlG,EAAEmB,MAAM+E,KAAK,KAAMQ,GAAGmE,GAAG2a,IACzBomC,gBAAgB5rD,EAAEmB,UAAaoD,KAAQgB,EAAEsmD,MAAOjoD,IAAO2B,EAAEumD,QAAS,KAE7D,IAITplD,GAAG8nB,QAAQlL,KAAK5c,GAAG8nB,QAAQvL,MAAM43D,aAAc+8G,MAYhDnyL,OAAOkF,KAAKi4C;AC/Pf,cAEA,SAAWm1I,GAET,GAGIC,GAAwBtxL,GAAGunB,WAAWhH,QAAQghG,YAAYrlH,QAG5DlB,KAAM,SAAUsf,GACd,GAAIkD,GAAK/iB,IACT+iB,GAAGe,OAAO,yBACRojG,oBAAoB,EACpBE,iBAAiB,EACjBD,WAAW,EACXI,QAAQ,EACR39F,MAAOjjB,EAAE,wBACT6gH,YAAa7gH,EAAE,wBAGjBoc,EAAGZ,KAAKY,EAAU,MAAEjB,MAAMizF,YAAa,WACrCxvG,GAAGmnB,MAAMmuB,QAAQ,sCAAuC,OAI1D93B,EAAGkjK,uBAGLj/D,YAAa,WACX,GAAIjkG,GAAK/iB,IAET+iB,GAAGe,UAiBL7hB,KAAM,WAEJjC,KAAK8jB,UAGPgzK,QAAS,WACP,GAAI/zK,GAAK/iB,IAGT+iB,GAAGglG,cAAa,GAChBhlG,EAAG2vF,SAAS/rG,EAAE,wBAEd4b,IAAIqQ,KAAK,QAAS,mCAClBppB,KAAKikB,MAAMrD,QAAQ7Y,KAAK,WACtBgR,IAAIqQ,KAAK,QAAS,iBAClB7P,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAM8kK,eACzB7+J,KAAK,SAAUiJ,GAChBjO,EAAGglG,cAAa,GAChBhlG,EAAG2vF,SAAS/rG,EAAE,yBACdoc,EAAGslG,WAAWr3F,MAIlB+lK,WAAY,WACV,GAAIh0K,GAAK/iB,IACTuiB,KAAIqQ,KAAK,QAAS,wBAClBrtB,GAAGkoB,MAAM09H,WAAW55I,KAAK,SAAU4c,GACjCpL,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAMukK,eAAgBl4J,KACzCpG,KAAK,WACNhF,EAAGlB,KAAKkB,EAAU,MAAEjB,MAAMukK,eAAgB,SAK9CJ,oBAAqB,WACnB,GAAIljK,GAAK/iB,IACTwJ,MAAKikB,MAAMy3J,eAAe,WAAcniK,EAAGujK,oBAC3C98K,KAAKikB,MAAM03J,WAAW,SAAUoB,GAAYxjK,EAAGyjK,YAAYD,KAC3D/8K,KAAKikB,MAAM23J,cAAc,WAAcriK,EAAG0jK,mBAC1Cj9K,KAAKikB,MAAM43J,eAAe,WAActiK,EAAG2jK,oBAE3CnkK,IAAIqQ,KAAK,QAAS,2CAIpB0zJ,gBAAiB,WACf,GAAIvjK,GAAK/iB,IACT+iB,GAAG9gB,OACH8gB,EAAGglG,cAAa,GAChBxlG,IAAIqQ,KAAK,QAAS,uCAClB7P,EAAG2vF,SAAS/rG,EAAE,yBACdoc,EAAGulG,WAAW3hH,EAAE,4BAGlB6/K,YAAa,SAAUD,GACrBhkK,IAAIqQ,KAAK,QAAS,0BAA4B2zJ,IAGhDE,eAAgB,WACd,GAAI1jK,GAAK/iB,IACT+iB,GAAGglG,cAAa,GAChBhlG,EAAGziB,QAGLomL,gBAAiB,WACf,GAAI3jK,GAAK/iB,IAET+iB,GAAGglG,cAAa,GAChBhlG,EAAG2vF,SAAS/rG,EAAE,yBACdoc,EAAGslG,WAAW1hH,EAAE,+BAGlBggL,sBAAuB,WAErBn9K,KAAKikB,MAAMjL,OAAOhZ,KAAKikB,MAAM3L,MAAMuiK,iBACnC76K,KAAKikB,MAAMjL,OAAOhZ,KAAKikB,MAAM3L,MAAM+hK,aACnCr6K,KAAKikB,MAAMjL,OAAOhZ,KAAKikB,MAAM3L,MAAMgiK,gBACnCt6K,KAAKikB,MAAMjL,OAAOhZ,KAAKikB,MAAM3L,MAAMqiK,qBAIrCriK,MAAOjjB,EAAE4C,QAEPmlL,YAAa,QAGbP,eAAgB,YACf9gL,GAAGygB,IAAIF,QAAQghG,YAAYhlG,SAS5ByiK,EAAwB,GAAIsS,EAChCD,GAAarS,sBAAwBA,GAEpCjgL,OAAOkF,KAAKi4C;ACpJf,cAEA,SAAWm1I,GAET,GAEII,GAAiB,yEACjBC,EAAmB,gEAEnBC,EAAwB3xL,GAAGunB,WAAWhH,QAAQghG,YAAYrlH,QAG5DlB,KAAM,SAAUsf,GACd,GAAIkD,GAAK/iB,IAET+iB,GAAGe,OAAO,yBACR8F,MAAOjjB,EAAE,0BACTugH,oBAAoB,EACpBC,WAAW,EACXC,iBAAiB,EACjBE,WAAW,EACXC,QAAQ,EACRC,YAAa7gH,EAAE,mCAGjBoc,EAAGglG,cAAa,GAChBhlG,EAAGo0K,6BACHp0K,EAAGq0K,8BAA8B,IAInCA,8BAA+B,SAAUC,GACvC,GAAIt0K,GAAK/iB,IACTsG,YAAW,WACTyc,EAAGo0K,6BACHp0K,EAAGq0K,8BAA8BC,IAChB,IAAhBA,IAILF,2BAA4B,WAC1B,GAAIp0K,GAAK/iB,IAETuF,IAAGkoB,MAAMi6I,KAAK4vB,qBAAqB/lL,KAAK,SAAUqxE,GAEhD,GAAI/jF,EAAEwkB,OAAOu/D,IAAS/jF,EAAEwkB,OAAON,EAAGw0K,WAAY,CAC5C,GAAIr8J,GAAQ0nD,EAAK90E,MACbotB,IAEGnY,EAAGwlG,mBAAoBxlG,EAAGilG,eAC7BjlG,EAAGglG,cAAcz+G,EAAE6wC,KAAKyoC,EAAM,SAAS40G,GAAO,OAAQA,EAAIC,gBAG5D10K,EAAG20K,oCAAoC90G,GAAMrxE,KAAK,SAAUuvC,EAASgM,GACnE,GAAI6qI,GAAYjqL,OAAOspL,GAAkBptK,MAAOjjB,EAAE,0BAA2Bu0B,MAAOA,GACpFnY,GAAGmlG,eAAeyvE,EAElB,IAAIC,GAAiBlqL,OAAOupL,GAAoBn2I,QAASA,GACzD/9B,GAAGqlG,iBAAiBwvE,EAAgB,WAClC,GAAI9qI,EAAI,CACN,GAAIhwC,GAAI,GAAI7V,UAAS6lD,EACrBxmD,YAAW,WACTwW,EAAEiD,MAAMzb,OAGR,IAAIuzL,GAAoB90K,EAAGsvF,UAAUnuG,KAAK,uBACtCiE,EAAK0vL,EAAkBvvJ,SAAS,kBACpCngC,GAAGqa,OAAO,0BAEVra,EAAGjE,KAAK,2BAA2BrD,IAAI,qBACtC,OAGPkiB,EAAGw0K,UAAY30G,IACd76D,KAAK,SAAS0I,GACf1N,EAAGslG,WAAW1hH,EAAE,0CAChBoc,EAAGw0K,UAAY,OACd3lK,OAAO,WACR7O,EAAG9gB,UAGL8gB,EAAGziB,UAGNynB,KAAK,WACNhF,EAAGziB,OACHyiB,EAAGslG,WAAW,IACdtlG,EAAGw0K,UAAY,QAKnBG,oCAAqC,SAAU90G,GAC7C,GAAI55D,GAAMnqB,EAAE0nB,UAqBZ,OAnBIq8D,GAAK90E,OAAS,EAChBikB,YAAY,4BACV6uB,YAAa,sBACbtkB,OAAQz9B,EAAEwkB,QACRw9B,UAAahiD,EAAEwkB,OAAOu/D,MAEvB,SAASx7E,GACNA,EAAIm2B,SAAWn2B,EAAI6gB,OAAOrkB,KAC5BolB,EAAIlB,QAAQ1gB,EAAI6gB,OAAOrkB,KAAMwD,EAAI6gB,OAAOo5B,QAExCr4B,EAAIlB,QAAQnhB,EAAE,uBAAwB,OAEvC,SAAS8pB,GACVzH,EAAId,OAAOuI,KAGbzH,EAAIlB,QAAQnhB,EAAE,uBAAwB,MAGjCqiB,IASX4tK,GAAal1I,sBAAwB,WACnC,GAAIA,GAAwB,IAE5B,QAMEnhD,KAAM,WACJmhD,EAAwB,GAAIw1I,IAQ9Bv1I,OAAQ,WACFD,GACFA,EAAsBy1I,mCAK7B7yL,OAAOkF,KAAKi4C;ACpJf,cAEA,SAAW91B,GAETA,EAAOmsK,UACLC,UAAW,0DACXC,YAAa,KASbC,qBAAsB,SAAUtrC,EAAYx8I,GAC1C,IAAKw8I,EAAY,OAAO,CAExB,IAAIurC,IACF15I,GAAM,EAAG,GACTymG,GAAM,EAAG,GACTC,GAAM,EAAG,GACTizC,GAAM,EAAG,EAAG,EAAG,EAAG,EAAG,GAEvB,OAAOD,GAAavrC,GAAYvhJ,QAAQ+E,MAAgB,GAU1DioL,iBAAkB,SAAU/0L,EAAOyrF,GACjC,GAAIglC,GAAUj1H,EAAE,cACZwE,GAAMolF,SACRj/E,KAAKsuL,SAASO,kBAAmB,EACjCvkE,EAAQp0H,SAAS,gBAGjB8J,KAAKsuL,SAASO,kBAAmB,EACjCvkE,EAAQx0H,YAAY,gBAWxBg5L,cAAe,SAAUxkE,GACvB,MAAOA,GAAQ5vH,KAAK,KAAKa,KAAK,MAAMmJ,QAAQ,IAAI,KAUlDqqL,oBAAqB,SAAUh1L,GAC7B,MAAIgC,IAAGsgB,GAAG8iI,QAAQr3F,aAAa/tD,GAAYA,EACpC1E,EAAE,KAAO0E,GAAI3B,QAAQ,MAAMC,QAAQD,QAAQ,gBAAgBC,QAAQqC,KAAK,kBAAkBA,KAAK,KAAKa,KAAK,MAAMmJ,QAAQ,IAAK,KAUrIsqL,iBAAkB,SAAUC,GAC1B,GAAI11K,GAAK/iB,KACLizB,IASJ,OANEA,GAFEwlK,EAAQ1zJ,GAAG,SAEJ,GAAIx/B,IAAG6e,KAAKrB,EAAGu1K,cAAcG,GAAUroL,YAAYE,SAIpD/K,GAAGmE,GAAG8pB,WAAW6lB,oBAY7B94C,KAAM,WACJ,GAAIwiB,GAAK/iB,IACTuiB,KAAIqQ,KAAK,YAAa,iBAEtB7P,EAAGi1K,YAAcn5L,EAAEkkB,EAAGg1K,WAAWzhK,IAAI,cAErC,IAAI2D,IACFy+J,OAAQ,SAAUD,GAChB,GAAIE,IAAQ,EACRC,EAAY/5L,EAAEmB,KAGlB,IAAKy4L,EAAQ1zJ,GAAG,aAAgB0zJ,EAAQ1zJ,GAAG,gBAA3C,CAEA,GAAI9R,GAAQlQ,EAAGy1K,iBAAiBC,GAC5BI,EAAe91K,EAAGqxD,cAAcwkH,EAKpC,IAAIC,IAAiBzoL,YAAYE,OAE/B,IAAK,GADDq8I,GAAa5pI,EAAG+1K,cAAcj6L,EAAEmB,OAC3BuH,EAAI,EAAGA,EAAI0rB,EAAMnlB,UACxB6qL,EAAQ51K,EAAGk1K,qBAAqBtrC,EAAY15H,EAAM1rB,GAAGK,OADrBL,KASpC,GAAIsxL,IAAiBzoL,YAAYC,UAC/B,IAAK,GAAI9I,GAAI,EAAGA,EAAI0rB,EAAMnlB,UACxB6qL,EAAQ1lK,EAAM1rB,GAAGK,OAASwI,YAAYC,WADN9I,KAapC,MAJIsxL,KAAiBzoL,YAAYG,MAAQsoL,GAAgBzoL,YAAYI,MACnEmoL,GAAQ,GAGHA,IAETI,WAAY,cACZj+F,UAAW,UACXk+F,KAAM,SAAU31L,EAAOyrF,GACrB,GAAI77D,GAAQlQ,EAAGy1K,iBAAiB35L,EAAEiwF,EAAGmqG,YACjCC,EAAuBr6L,EAAEiwF,EAAGmqG,WAAWl0J,GAAG,OAE9C,OADAhiB,GAAGo2K,WAAWlmK,EAAOp0B,EAAEmB,MAAOk5L,IACvB,GAIX,OADAn2K,GAAGi1K,YAAYD,UAAU99J,GAAUv6B,SAAS,eACrCqjB,GAWTq2K,mBAAoB,WAClB,GAAIr2K,GAAK/iB,IAUT,OATAnB,GAAEqG,UAAUu9C,MAAM,SAAUr+C,GACV,KAAZA,EAAE+lD,OAA8B,KAAd/lD,EAAEo+C,UACtBz/B,EAAGs2K,oBAAqB,EACxBx6L,EAAE,0BAA0Bo6L,WAAYK,QAAU,IAAQlxI,QAAQ,WAClE9hD,WAAW,WACTyc,EAAGs2K,oBAAqB,GACvB,QAGAt2K,GAWTw2K,YAAa,SAAUtmK,EAAO4uD,EAAQhmC,EAAU+8I,GAC9C,GAAI71K,GAAK/iB,KACLu6H,IACJ,IAAI1+E,IAAazrC,YAAYE,OAE3B,IAAK,GADDq8I,GAAa5pI,EAAG+1K,cAAcF,GACzBrxL,EAAI,EAAGA,EAAI0rB,EAAMnlB,OAAQvG,IAC5Bwb,EAAGk1K,qBAAqBtrC,EAAY15H,EAAM1rB,GAAGK,OAASi6E,GAAU5uD,EAAM1rB,GAAGhE,IAC3Eg3H,EAAShnH,KAAK0f,EAAM1rB,GAK1B,IAAIs0C,IAAazrC,YAAYC,UAC3B,IAAK,GAAI9I,GAAI,EAAGA,EAAI0rB,EAAMnlB,OAAQvG,IAC5B0rB,EAAM1rB,GAAGK,OAASwI,YAAYC,WAAWkqH,EAAShnH,KAAK0f,EAAM1rB,GAQrE,OAJIs0C,KAAazrC,YAAYG,MAAQsrC,IAAazrC,YAAYI,MAC5D+pH,EAAWtnG,GAGNsnG,GAaTi/D,cAAe,SAAU1lE,GACvB,MAAIA,GAAQ/uF,GAAG,QACN+uF,EAAQ5vH,KAAK,KAAKa,KAAK,QAAQma,WAAWf,cAEzC,GAAG21G,EAAQ5vH,KAAK,kBAAkBvE,KAAK,UAAUwe,cAU7Ds7K,gBAAiB,WAEf,IAAK,GADDxmK,GAAQ1tB,GAAGmE,GAAG8pB,WAAW6lB,mBACpB9xC,EAAI,EAAGA,EAAE0rB,EAAMnlB,OAAQvG,IAC5BhC,GAAGmE,GAAG8pB,WAAWqjF,WAAW5jF,EAAM1rB,IAClCjB,WAAW,WACTqiD,0BACC,IAGP,OAAO3oD,OAWTm5L,WAAY,SAAUlmK,EAAO2lK,EAAWM,GACtC,GACIr3G,GACAhmC,EACA0+E,EAHAx3G,EAAK/iB,IAKT,KAAI+iB,EAAGs2K,mBAAP,CAEyBx3G,EAArB+2G,EAAU7zJ,GAAG,OAAiB6zJ,EAAU7zL,KAAK,MACnCge,EAAGu1K,cAAcM,GAE/B/8I,EAAW94B,EAAGqxD,cAAcwkH,GAG1Br+D,EADEh1H,GAAGmE,GAAG8pB,WAAWqgH,sBACP,GAAItuI,IAAG6e,KAAK7e,GAAGmE,GAAGswC,QAAS5pC,YAAYM,MAExCqS,EAAGw2K,YAAYtmK,EAAO4uD,EAAQhmC,EAAU+8I,EAGrD,IAAI9wJ,KA0BJ,OAzBAA,GAAQ13B,YAAYE,SAClBiwG,SAAY55G,EAAE,yBAA0Boc,EAAGy2K,cAAcZ,IACzD7uL,OAAU,WACRgZ,EAAG22K,UAAUn/D,EAAU14C,EAAQhmC,EAAU+8I,EAAWM,KAIxDpxJ,EAAQ13B,YAAYC,YAClBkwG,SAAY55G,EAAE,6BAA8Boc,EAAGy2K,cAAcZ,IAC7D7uL,OAAU,WACRgZ,EAAG42K,UAAUp/D,EAAU14C,EAAQhmC,EAAU+8I,KAI7C9wJ,EAAQ13B,YAAYG,OAClBgwG,SAAY55G,EAAE,yBAA0Boc,EAAGy2K,cAAcZ,IACzD7uL,OAAU,WACRgZ,EAAG62K,aAAar/D,EAAU14C,EAAQhmC,EAAU+8I,KAIhD9wJ,EAAQ13B,YAAYI,KAAOs3B,EAAQ13B,YAAYG,MAC/Cu3B,EAAQ13B,YAAYI,KAAKoZ,MAAQjjB,EAAE,wBAAyBoc,EAAGy2K,cAAcZ,IAGzE71K,EAAGs1K,kBACLvwJ,EAAQ13B,YAAYE,QAAQvG,SACrBgZ,IAIT+kB,EAAQ+T,GAAU9xC,SAEXgZ,KAcT22K,UAAW,SAAUzmK,EAAO4uD,EAAQhmC,EAAU+8I,EAAWM,GAgCvD,QAASW,KACPt0L,GAAGmE,GAAG0wC,WAAWuH,SAEjB5+B,EAAG02K,kBACH9wI,yBAnCF,GAEIg5B,GACA/mC,EAHA73B,EAAK/iB,KAKL85L,EAAKv0L,GAAGmE,GAAG8pB,WACX6nE,EAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KAE3B,IAAqB,IAAjB9X,EAAMnlB,OAER,MADAutF,GAAMp5F,KAAK0E,EAAE,sBACNoc,CAgBT,IAbIm2K,GAGFv3G,EAAW5+D,EAAGw1K,oBAAoBtlK,EAAM,GAAG1vB,IAC3Cq3C,EAAaxqC,YAAYE,SAIzBqxE,EAAWp8E,GAAGmE,GAAGswC,QACjBY,EAAar1C,GAAGmE,GAAG0qE,kBAIhB8kH,GAAwB3zL,GAAGmE,GAAGswC,SAAW6nC,EAE5C,MADAwZ,GAAMp5F,KAAK0E,EAAE,uBACNoc,CAUT,IAAIg3K,EAiCJ,OAhCAx0L,IAAG8L,IAAIqqE,QAAQkG,WAAW3uD,EAAO4uD,EAAQhmC,GAAUtqC,KAAK,SAAU2pB,GAEhE,GADA6+J,EAAc7+J,EACVnY,EAAGs1K,kBAAwD,YAApC,GAAK9yL,IAAGkf,KAAOuX,SAAS,QAC7Cd,EAAQ,EACVmgE,EAAMp5F,KAAK0E,EAAE,eAAgBu0B,IAE7BmgE,EAAMp5F,KAAK0E,EAAE,sBAEfkzL,QACK,CACL,GAAI5mK,EAAMnlB,OAAS,GAAc,GAATotB,EAGtB,MAFAmgE,GAAMp5F,KAAK0E,EAAE,0BACbkzL,IAGFt0L,IAAG8L,IAAIqqE,QAAQgG,YAAYzuD,EAAO0uD,EAAU/mC,GAAYrpC,KAAK,SAAU2pB,GACjEA,EAAQ,GACV4+J,EAAG5lD,YAAYjhH,GAAO,GACtB6mK,EAAGj4K,KAAK,eACRi4K,EAAGj4K,KAAK,WAAY,KAAMi4K,EAAGzgJ,oBAC7BgiD,EAAMp5F,KAAK0E,EAAE,cAAeu0B,KAExB6+J,EAAc,EAChB1+F,EAAMp5F,KAAK0E,EAAE,eAAgBozL,IAE7B1+F,EAAMp5F,KAAK0E,EAAE,sBAGjBkzL,SAIC92K,GAcT42K,UAAW,SAAU1mK,EAAO4uD,EAAQhmC,EAAU+8I,GAC5C,GAAI71K,GAAK/iB,IACT,IAAqB,IAAjBizB,EAAMnlB,OAAc,CACtB,GAAIutF,GAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KAC3BswD,GAAMp5F,KAAK0E,EAAE,sBAkBf,MAfApB,IAAG8L,IAAIqqE,QAAQkG,WAAW3uD,EAAO4uD,EAAQhmC,GAAUtqC,KAAK,SAAU2pB,GAChE,IAAK,GAAI3zB,GAAI,EAAGA,EAAI0rB,EAAMnlB,OAAQvG,IAChC0rB,EAAM1rB,GAAG0rI,cAEX2lD,GAAU10L,KAAK,yCAAyCjC,MACxD,IAAIo5F,GAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KACvB7P,GAAQ,EACVmgE,EAAMp5F,KAAK0E,EAAE,cAAeu0B,IAE5BmgE,EAAMp5F,KAAK0E,EAAE,sBAEfoc,EAAG02K,kBACH9wI,2BAGK3oD,MAcT45L,aAAc,SAAU3mK,EAAO4uD,EAAQhmC,EAAU+8I,GAC/C,GAAI71K,GAAK/iB,IACT,IAAqB,IAAjBizB,EAAMnlB,OAAc,CACtB,GAAIutF,GAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KAC3BswD,GAAMp5F,KAAK0E,EAAE,wBAaf,MAVApB,IAAG8L,IAAIqqE,QAAQkG,WAAW3uD,EAAO4uD,EAAQhmC,GAAUtqC,KAAK,SAAU2pB,GAChE,GAAImgE,GAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KACvB7P,GAAQ,EACVmgE,EAAMp5F,KAAK0E,EAAE,iBAAkBu0B,IAE/BmgE,EAAMp5F,KAAK0E,EAAE,wBAEfoc,EAAG02K,kBACH9wI,2BAEK5lC,GAWTqxD,cAAe,SAAU0/C,GACvB,MAAIA,GAAQr0H,SAAS,YAAoB2Q,YAAYC,UACjDyjH,EAAQr0H,SAAS,WAAmB2Q,YAAYK,iBAChDqjH,EAAQr0H,SAAS,YAAoB2Q,YAAYG,KACjDujH,EAAQr0H,SAAS,WAAmB2Q,YAAYI,IAChDsjH,EAAQr0H,SAAS,WAAmB2Q,YAAYE,OAApD,QAWFwoL,cAAe,SAAUhlE,GACvB,MAAIA,GAAQr0H,SAAS,iBAAyBga,oBAAoBpJ,UAC9DyjH,EAAQr0H,SAAS,WAAmBga,oBAAoBjJ,IACxDsjH,EAAQr0H,SAAS,YAAoBga,oBAAoBlJ,KACzDujH,EAAQr0H,SAAS,WAAmBga,oBAAoB/I,IAA5D,UAKHpM,OAAOkF;CClfV,SAAWmiB,GAOTA,EAAO6H,eAGNlvB,OAAOkF,MAGV,SAAWmiB,GAQTA,EAAOquK,cAAgB,SAAUz4L,GAC/B,GAAI0xB,GAAQ3pB,EAAEgT,IAAI/a,EAAO,SAAUsF,GACjC,GAAIozL,GAAYpzL,EAAK4f,aAGrB,OADAwzK,GAAgB,KAAIpzL,EAAKoD,KAClBgwL,GAET,OAAOtuK,GAAO0rC,UAAUpkC,IAS1BtH,EAAO0rC,UAAY,SAAUpkC,GAC3B,GAAIinK,IACFpxC,aACAF,SACAC,QAGF,IAAI51H,EACF,IAAK,GAAI1rB,GAAI,EAAGA,EAAI0rB,EAAMnlB,OAAQvG,IAChC,OAAQ0rB,EAAM1rB,GAAG43B,KAAKjd,eACpB,IAAK,OACHg4K,EAAYpxC,UAAUv1I,KAAK0f,EAAM1rB,GACjC,MACF,KAAK,OACH2yL,EAAYtxC,MAAMr1I,KAAK0f,EAAM1rB,GAC7B,MACF,KAAK,MACH2yL,EAAYrxC,KAAKt1I,KAAK0f,EAAM1rB,IAMpC4yL,EAAgBD,GAQlB,IAAIC,GAAkB,SAAUD,GAmB9B,QAASE,KACP72B,gBAAgB,iBACd35I,MAAOjjB,EAAE,kBACT69J,UAAW,WACT,GAAIqL,GAAehxK,EAAE,gBACrB62C,+BAA8B,QAC9Bm6H,EAAa3rK,KAAK,2BAA2BjB,QAC7CmL,IAAIo/F,SAAS,eACT0sF,EAAYtxC,MAAM96I,QAAUosL,EAAYrxC,KAAK/6I,SAC/C+hK,EAAalwK,KAAK,WAAWgH,EAAE,6CAEjC,IAAIwiK,GAAmB0G,EAAa3rK,KAAK,wBACrCklK,EAAiByG,EAAa3rK,KAAK,kBAEvC,IAA+B,GAA3BilK,EAAiBr7J,OAAa,CAChC,GAAI87J,GAAwBT,EAAiB11J,SAASzP,SAClD6lK,EAAsBT,EAAe31J,SAASA,SAASzP,SACvD2lK,EAAYkG,EAAa7rK,SAAW4lK,EAAwBC,CAChEV,GAAiB11J,SAASnT,OAC1B8oK,EAAe31J,SAASA,SAASnT,OACjCuvK,EAAa7rK,OAAO2lK,KAGxB7mK,GAAI,WACF,GAAIynD,GAAU1rD,EAAE,iBAAiBc,KAAK,MAClCq7D,EAAUq/H,GACd,IAAI9vI,EAAS,MAAOA,GAAQyQ,IAE9Br2D,OAAQ,WACN,GAAI4lD,GAAU1rD,EAAE,iBAAiBc,KAAK,SACtC,IAAI4qD,EAAS,MAAOA,MAEtB38C,QACEksC,MAAOxwC,EAAEgT,IAAI49K,EAAYpxC,UAAW,SAAUmxC,GAC5C,MAAOp7L,GAAE4C,UAAWw4L,GAAahwL,KAAQ,SAE3Co/J,UAAU,GAEZrlK,OAAQ,OACRmgK,KAAM,WAActlK,EAAE,iBAAiB4U,SAAS/P,IAAI,SAAU,SAC9D4hC,QAAS,WAAcg8H,oBAAqBlzJ,IAAIo/F,SAAS,WACzDroG,UAAW,SAAW8G,eAAiB,EAAK,OAWhD,QAASouL,KAEP,IAAK,GADDr/H,MACKzzD,EAAI,EAAGA,EAAI2yL,EAAYtxC,MAAM96I,OAAQvG,IAC5CyzD,EAAQznD,KAAK+mL,SAASJ,EAAYtxC,MAAMrhJ,GAAG8c,GAAI61K,EAAYtxC,MAAMrhJ,GAAG0C,MAAM,GAE5E,KAAK,GAAI1C,GAAI,EAAGA,EAAI2yL,EAAYrxC,KAAK/6I,OAAQvG,IAC3CyzD,EAAQznD,KAAKgnL,QAAQL,EAAYrxC,KAAKthJ,GAAG8c,GAAI61K,EAAYrxC,KAAKthJ,GAAG0C,MAAM,GAGzE,OAAO+wD,GAST,QAASw/H,KACP,GAAIx/H,GAAUq/H,GAEdx7L,GAAEq4C,YAAYn3B,MAAMlhB,EAAGm8D,GAASzpD,KAAK,WAC/B1D,UAAUC,SACZ,GAAKvI,IAAGygB,IAAIod,IAAI2H,OAAO9oC,KAAK0E,EAAE,iCAE/BohB,KAAK,SAAUwI,GAChB,GAAI1iB,UAAUC,OAAQ,CACpB,GAAI+R,GAAO7R,MAAMjM,UAAUkM,MAAMpO,KAAKgO,WAClClB,EAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,YAAahnC,MAAO,MAEhD+xB,EAAU,GAAIztB,IAAGygB,IAAIsD,MAAMC,YAAY,iBAC3CyJ,GAAQ6xF,eAAetsG,YAAYE,UACnCua,EAAQi6F,aAAa,6CAA8C,OAASptG,EAAK5N,KAAK,IAAM,SAE5F+gB,EAAQq+D,cAAc9/E,KAAK,SAAU5R,GACnCgN,EAAOmiC,UAAUnoC,EAAE,oCAAqChH,QAQhE,QAAS86L,KACP,GAAIzpK,GAAMrqB,EAAE,2BACRgG,EAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,YAC9BhnC,MAAO,IACPkgD,gBAAgB,EAChBrP,oBAAoB,GAEtBnlC,GAAOwV,KAAK5c,GAAGygB,IAAIF,QAAQ6D,WAAW7H,MAAM6wF,WAAY,WACtDhmG,EAAO8yC,cAAc,qBAEvB9yC,EAAO1K,KAAK,GAAI,GAAI0E,EAAE,mBACtBqhK,oBAAoBr7J,EAAO+yC,SAAU1uB,EAAK,SAI5C,MAhIAxnB,MAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAC5C4nK,EAAYpxC,UAAUh7I,OACxBssL,IACSF,EAAYtxC,MAAM96I,QAAUosL,EAAYrxC,KAAK/6I,OACtD0sL,KAEA,GAAKj1L,IAAGygB,IAAIod,IAAI2H,OAAO23G,YAAY/7I,EAAE,yBAEtCohB,KAAK,WACN0yK,MAuHK9uK,IAIRrnB,OAAOkF,KAAKgqB;ACzMf,cAEA,SAAW7H,GAMTA,EAAO8qJ,UACLwiB,UAAW,QACXyB,WAAY,KACZrC,kBAAkB,EAClBgB,oBAAoB,EASpB94L,KAAM,WACJ,GAAIwiB,GAAK/iB,IACT,OAAIuF,IAAGC,IAAIid,cACTF,KAAIqQ,KAAK,YAAa,8CAGxBrQ,IAAIqQ,KAAK,YAAa,2CAEtB7P,EAAG43K,iBAEH53K,EAAG63K,YACFC,YACAzC,uBAED7yL,IAAGmpB,eAAend,KAAK,WACrBhM,GAAGmE,GAAG8pB,WAAWrR,KAAK,cAAe,WACnCY,EAAG43K,iBACAvC,mBACAwC,YACAC,kBAYTF,eAAgB,WACd,GAAI53K,GAAK/iB,IAET,OADA+iB,GAAG23K,WAAa77L,EAAEkkB,EAAGk2K,WAAW3iK,IAAI,eAC7BvT,GAWTq1K,iBAAkB,WAEhB,MADAp4L,MAAK06L,WAAWv4K,KAAK,eAAgB3Y,KAAKsuL,SAASM,kBAC5Cp4L,MAeT46L,UAAW,WACT,GAAI73K,GAAK/iB,KACL86L,EAA4B,EAE5B7gK,GACFy/H,OAAQ,WACN,GAEIqhC,GAFAjnE,EAAUj1H,EAAEmB,KAGX8zH,GAAQr0H,SAAS,aAAa8F,GAAGmE,GAAG8pB,WAAWkhH,eAAe5gB,EAAQ/uH,KAAK,MAEhF,IAAIm2B,GAAQ31B,GAAGmE,GAAG8pB,WAAW6lB,mBAAmBvrC,MACnC,IAATotB,GAAY44F,EAAQp0H,SAAS,YAEjCq7L,EAAwBl8L,EAAE,iCAC1B,KAAK,GAAI0I,GAAI,EAAGA,EAAI2zB,GAAS3zB,EAAIuzL,EAA2BvzL,IAC1DwzL,EAAsBjyI,QAAQ,+CAIhC,OAFAiyI,GAAsB/7L,OAAOH,EAAEmB,MAAMuJ,QAAQ7J,SAAS,cAE/Cq7L,GAGTzB,OAAQ,UAER0B,UAAY53L,KAAM,GAAIX,IAAK,IAC3Bo4F,OAAQ,WACRE,SAAU,GACVp2F,OAAQ,eAIV,OADAoe,GAAG23K,WAAWzB,UAAUh/J,GAAUv6B,SAAS,eACpCqjB,GAUT83K,UAAW,WAET,MADArxL,MAAKsuL,SAASv3L,OACPP,QAKVsE,OAAOkF,KAAKgqB;CCnIf,SAAW7H,GAOTA,EAAOsvK,WAEPtvK,EAAOsvK,QAAQC,mBAAqB,SAAUC,EAAU1rK,GACtD,QAAIlqB,GAAGmE,GAAG4rK,SACJ7lJ,EACM0rK,EAAS/vL,QAAQqkB,MAAe,EAEhC0rK,EAAS/vL,QAAQ7F,GAAGmE,GAAG4rK,OAAO1pJ,cAAe,IAc3DD,EAAOsvK,QAAQG,qBAAuB,SAAUC,GAC9C,GAAIF,IAAY,MAAO,MAAO,OAAQ,MAAO,MAAO,OAAQ,OAAQ,MACpE,OAAOxvK,GAAOsvK,QAAQC,mBAAmBC,EAAUE,IAUrD1vK,EAAOsvK,QAAQK,eAAiB,SAAUD,GACxC,GAAIF,IAAY,MAAO,OAAQ,MAAO,MAAO,MAC7C,OAAOxvK,GAAOsvK,QAAQC,mBAAmBC,EAAUE,IAUrD1vK,EAAOsvK,QAAQM,cAAgB,SAAUF,GACvC,GAAIF,IAAY,MAAO,MAAO,MAC9B,OAAOxvK,GAAOsvK,QAAQC,mBAAmBC,EAAUE,IAYrD1vK,EAAOsvK,QAAQO,aAAe,SAAU77L,GAStC,QAAS87L,GAASxxL,GAChB,MAAOpL,GAAE6+G,EAAQx5G,KAAK,cAAgB+F,EAAO,KAAKE,IAAI,GAAGg0G,cAAcj5G,UAGzE,QAASw2L,KACPD,EAAS,WAAWv3L,KAAK,KAAKse,OAAO,cAAcL,KAAK,aAAc,WAEpE,MADA7d,QAAOq7B,KAAK9gC,EAAEmB,MAAM+E,KAAK,UAClB,IAbX,GAFAge,GAAK4I,EACL5I,GAAGszD,MAAQ12E,GAAQ6J,KAAKyxL,QAAQroK,KAC3B7P,GAAGszD,MAAR,CACA,GAAI5mD,GAAY1M,GAAGszD,MAAMslH,YAAY54K,GAAGszD,MAAMulH,YAAYr4L,IAAI68B,QAC9D,IAAKzU,EAAOsvK,QAAQM,cAAc9rK,GAAlC,CAEA,GAAIiuF,GAAU7+G,EAAE,UAAUsgD,UAa1Bs8I,GAAS,UAAUv3L,KAAK,KAAKie,KAAK,aAAc,WAC9C7b,WAAW,WAAco1L,KAAsB,UAanD/vK,EAAOsvK,QAAQY,oBAAsB,SAAUl8L,GAG7C,GAFAojB,GAAK4I,EACL5I,GAAGszD,MAAQ12E,GAAQ6J,KAAKyxL,QAAQroK,KAC3B7P,GAAGszD,MAAR,CACA,GAAI5mD,GAAY1M,GAAGszD,MAAMslH,YAAY54K,GAAGszD,MAAMulH,YAAYr4L,IAAI68B,QAC9D,IAAKzU,EAAOsvK,QAAQK,eAAe7rK,GAAnC,CAEA,GAAI2pG,GAASv6H,EAAE,qBACX20K,EAAOp6C,EAAOj6E,UAEA,SAAd1vB,GACF+jJ,EAAKtvK,KAAK,QACP+5H,UAAU,6CAGfu1C,EAAKtvK,KAAK,QAAQokC,SAAS,OACxBwzJ,QAAQ,6BACRA,QAAQ,8BAEX,IAAIC,GAAYvoB,EAAKtvK,KAAK,aAEtB83L,GAAY,CAChBxoB,GAAKtvK,KAAK,2BAA2BnE,KAAK,SAAU2B,GAClD,GAAIu6L,GAAYp9L,EAAEmB,MAAMkE,KAAK,gBAEzB+3L,GAAUnuL,QACP0lK,EAAKtvK,KAAK,WAAW4J,SACxBiuL,EAAU/8L,OAAO,2BACjB+8L,EAAU/8L,OAAO,8BAEnB+8L,EAAUr4L,IAAI,QAAS,KAEvBq4L,EAAUr4L,IAAI,QAAS,SAGpB7E,EAAEwB,KAeDxB,EAAEmB,MAAMkE,KAAK,mBAAmBjD,QAAUpC,EAAEmB,MAAMiB,SACpD86L,EAAUr4L,IAAI,QAAS,UACvB8vK,EAAKtvK,KAAK,eAAeR,IAAI,QAAS,UACtC7E,EAAEmB,MAAM0D,IAAI,QAAS,UACrB7E,EAAEmB,MAAMkE,KAAK,mBAAmBjD,MAAM,OACtC+6L,GAAY,GAGPA,GAMHD,EAAUr4L,IAAI,QAAS,UACvB8vK,EAAKtvK,KAAK,eAAeR,IAAI,QAAS,UACtC7E,EAAEmB,MAAM0D,IAAI,QAAS,YAPrBq4L,EAAUr4L,IAAI,QAAS,SACvB8vK,EAAKtvK,KAAK,eAAeR,IAAI,QAAS,SACtC7E,EAAEmB,MAAM0D,IAAI,QAAS,SACrBs4L,GAAY,GA1BZn9L,EAAEmB,MAAMkE,KAAK,mBAAmBjD,QAAUpC,EAAEmB,MAAMiB,SAEpD86L,EAAUr4L,IAAI,QAAS,UACvB8vK,EAAKtvK,KAAK,eAAeR,IAAI,QAAS,UACtC7E,EAAEmB,MAAM0D,IAAI,QAAS,UACrBs4L,GAAY,GAERA,IACFD,EAAUr4L,IAAI,QAAS,UACvB8vK,EAAKtvK,KAAK,eAAeR,IAAI,QAAS,UACtC7E,EAAEmB,MAAM0D,IAAI,QAAS,WA0B3B4C,WAAW,WACL21L,EAAUnuL,QACZmuL,EAAUl8L,KAAK,SAAU2B,GAQvB,QAASw6L,GAAUz2G,GACjBA,EAAIx6E,MAAM,WACRuoK,EAAKtvK,KAAK,YAAY5E,YAAY,WAClC68L,EAASz8L,SAAS,UAElB,IAAI08L,GAAkBD,EAASj4L,KAAK,iBAAiBa,KAAK,OACtDq3L,KACFA,EAAkBA,EAAgBtnL,UAAU,IAC9C0+J,EAAKtvK,KAAK,UAAYk4L,EAAkB,KAAK18L,SAAS,aAf1D,GAAI28L,GAAoBx9L,EAAEmB,MAAM+E,KAAK,QACjCo3L,EAAW3oB,EAAKtvK,KAAKm4L,GACrBp7L,EAAQ,OAERpC,GAAEwB,OACJY,EAAQ,SAcVi7L,EAAUr9L,EAAEmB,OAEZm8L,EAAW3oB,EAAKtvK,KAAKm4L,GAAmB34L,KACtCyB,SAAU,WACVlE,MAAOA,EACPq7L,OAAQ,iBACR7hE,MAAO,OACPn1H,QAAS,OACTD,WAAY,OACZk3L,aAAc,OACdC,8BAA+B,YAGjCN,EAAUC,GACVD,EAAU1oB,EAAKtvK,KAAK,uBAAyBm4L,EAAkBnuL,QAAQ,SAAU,YAAc,MAE3FrP,EAAEwB,MACJiG,WAAW,WACTktK,EAAKtvK,KAAK,UAAYm4L,EAAoB,KAAKl6K,KAAK,mBAAoB,SAAU/d,GAChFovK,EAAKtvK,KAAK,YAAY5E,YAAY,WAClCk0K,EAAKtvK,KAAKm4L,GAAmB38L,SAAS,UAEtC,IAAI+C,KAAQ+wK,EAAKtvK,KAAKm4L,GAAmBl8L,SAASsC,IAAMg6L,OAAO,GAAGn4L,OAAOo4L,WAAWxoL,GAChF9Q,GAAQowK,EAAKtvK,KAAKm4L,GAAmBl8L,SAASiD,IAClDq5L,QAAO,GAAGn4L,OAAOo4L,WAAWC,SAASv5L,EAAMX,KAE7C+wK,EAAKtvK,KAAKm4L,GAAmBl6K,KAAK,mBAAoB,SAAU/d,GAC9DovK,EAAKtvK,KAAK,YAAY5E,YAAY,WAClCT,EAAEmB,MAAMN,SAAS,cAElB,OAKTisB,EAAOsvK,QAAQ2B,cAAcX,IAC5B,OAIL31L,WAAW,WACTktK,EAAKtvK,KAAK,WAAWF,OAAO+3L,EAAU/3L,SAAW,KAChD,QAIL2nB,EAAOsvK,QAAQ2B,cAAgB,SAAUX,GACvC,GAAI7iE,GAASv6H,EAAE,qBACX20K,EAAOp6C,EAAOj6E,WAEd09I,EAAiBrpB,EAAKtvK,KAAK,UAC/B,IAAI24L,EAAe/uL,OAAS,EAAG,CAC7B,GAAI1K,GAAOy5L,EAAe18L,SAASiD,IACnCA,IAASvE,EAAEwB,MAAY,GAAL,GAGpB47L,EAAUl8L,KAAK,WACb,GAAIs8L,GAAoBx9L,EAAEmB,MAAM+E,KAAK,QACjCtC,EAAM5D,EAAEmB,MAAMG,SAASsC,GAE3B+wK,GAAKtvK,KAAKm4L,GAAmB34L,KAC3ByB,SAAU,WACV1C,IAAKA,EACLW,KAAMA,EAAO,WAKlBkB,OAAOkF,MAGV3K,EAAEyF,QAAQxD,GAAG,SAAU,WAErB,GAAyB,OAApByE,GAAGuE,eAA4E,WAAhD,GAAKvE,IAAGkf,IAAI0M,SAASrpB,MAAOk0B,SAAS,QAAuB,CAC9F,GAAIo9F,GAASv6H,EAAE,qBACX20K,EAAOp6C,EAAOj6E,UACdq0H,GAAKtvK,KAAK,WAAW4J,OAAS,GAChCxH,WAAW,WACT,GAAIktK,EAAKtvK,KAAK,WAAW4J,OAAS,EAAG,CACnC,GAAI1K,GAAOowK,EAAKtvK,KAAK,WAAW/D,SAASiD,IACpCvE,GAAEwB,KAGL+C,GAAQ,GAFRA,GAAQ,GAIVowK,EAAKtvK,KAAK,2BAA2BnE,KAAK,SAAU2B,GAClD,GAAIu6L,GAAYp9L,EAAEmB,MAAMkE,KAAK,gBAE7B+3L,GAAUl8L,KAAK,SAAU2B,GACvB,GAAI26L,GAAoBx9L,EAAEmB,MAAM+E,KAAK,OACrCyuK,GAAKtvK,KAAKm4L,GAAmB34L,KAC3BN,KAAMA,EAAO,aAMpB;ACpST,cAEA,SAAWuoB,GAOT,GAAImxK,IACFxjI,MAAO,EACPyjI,YAAa,IAAK,IAAK,IAAK,KAE5Bp7J,KAAM,WAGJ,MAFA3hC,MAAKs5D,QACLt5D,KAAKg9L,SACEh9L,KAAK+8L,WAAW/8L,KAAKs5D,QAG9B13B,KAAM,WAGJ,MAFA5hC,MAAKs5D,QACLt5D,KAAKg9L,SACEh9L,KAAK+8L,WAAW/8L,KAAKs5D,QAG9B0jI,OAAQ,WACFh9L,KAAKs5D,MAAQt5D,KAAK+8L,WAAWjvL,OAAS,IAAG9N,KAAKs5D,MAAQ,GACtDt5D,KAAKs5D,MAAQ,IAAGt5D,KAAKs5D,MAAQt5D,KAAK+8L,WAAWjvL,OAAS,IAa9D6d,GAAOsxK,WACLC,QAAS,KACTC,OAAQ,KACRC,MAAO,KACPC,MAAO,KACPhnH,MAAO,KACPinH,QAAS,KACTC,WAAY,KACZC,YAAa,KACbC,eAAgB,EAChBC,QAAS,KACTC,OAAQ,KACRC,MAAO,KACPC,aAAc,KACdC,uBAAwB,KASxBv9L,KAAM,SAAUZ,GACd,GAAIojB,GAAK/iB,IAET,IADA+iB,EAAGszD,MAAQ12E,GAAQ6J,KAAKyxL,QAAQroK,KAC3B7P,EAAGszD,OAEH1qD,EAAOyvK,qBAAqBr4K,EAAGszD,MAAMslH,YAAY54K,EAAGszD,MAAMulH,YAAYr4L,IAAI68B,UAa/E,MAXArd,GAAG06K,eAAiB,EACpBl7K,IAAIqQ,KAAK,UAAW,2CAEpB7P,EAAG66K,MAAgC,OAAxBr4L,GAAGC,IAAI4M,QAAQnI,KAC1B8Y,EAAGm6K,QAAUr+L,EAAE,qBACfkkB,EAAGo6K,OAASp6K,EAAGm6K,QAAQzpL,OAAO,OAC9BsP,EAAGy6K,YAAcz6K,EAAGo6K,OAAOn5L,SAC3B+e,EAAGq6K,MAAQr6K,EAAGm6K,QAAQ/9I,WACtBp8B,EAAG86K,aAAeh/L,EAAE,sBAEpBkkB,EAAGg7K,WACI/9L,MAUT+9L,SAAU,WACRx7K,IAAIqQ,KAAK,UAAW,oCACpB,IAAI7P,GAAK/iB,IAWT,OATA+iB,GAAGs6K,MAAQ3vL,OAAO,cAAeqV,EAAGszD,MAAM2nH,kBAAmBj7K,EAAGszD,MAAM4nH,aAAa16L,GAAI,OAEvFwf,EAAGm7K,oBAAoB3sL,KAAK,SAAU0rL,GACpCA,EACGkB,uBACAC,yBACAC,cAAc,KAGZt7K,GAcTm7K,kBAAmB,WACjB,GAAI1sL,GAAI3S,EAAE0nB,WAGNxD,EAAK/iB,IAmBT,OAlBA+iB,GAAGu6K,QAAUv6K,EAAGq6K,MAAMl5L,KAAK,aAAaa,KAAK,KAAM,UAAUpF,KAAK,aAAc,KAAKmlI,KAAK,6CAC1FviH,IAAIqQ,KAAK,UAAW,yBAEpB7P,EAAG46K,OAAS56K,EAAGu6K,QAAQr8L,QACvB8hB,EAAG26K,QAAU36K,EAAGu6K,QAAQt5L,SAExB+e,EAAGu6K,QAAQ7pL,OAAO,gBAAgBxS,MAAM8hB,EAAG46K,QAAQ35L,OAAO+e,EAAG26K,SAEzD36K,EAAG66K,MACLt3L,WAAW,WACTyc,EAAG46K,OAAS56K,EAAGu6K,QAAQr8L,QACvB8hB,EAAG26K,QAAU36K,EAAGu6K,QAAQt5L,SACxBwN,EAAEsW,QAAQ/E,IACT,KAEHvR,EAAEsW,QAAQ/E,GAGLvR,EAAE2W,WAWXg2K,qBAAsB,WAUpB,IATA,GAAIp7K,GAAK/iB,KAEL6J,GACFtG,GAAIwf,EAAG06K,eACPx8L,MAAO8hB,EAAG46K,OACV35L,OAAQ+e,EAAG26K,QACXv3J,IAAK,IAGApjB,EAAG06K,gBAAkB16K,EAAGszD,MAAM4nH,aAAaK,WAAW,CAG3D,GAAIliI,GAAcv9D,EAAE4C,UAAWoI,GAC7BtG,GAAIwf,EAAG06K,gBAGTl4L,IAAGynB,UAAUnpB,OAAO,sCAAuCu4D,GAAa7qD,KAAK,SAAU3N,GACrFmf,EAAGq6K,MAAMl5L,KAAK,QAAQlF,OAAO4E,KAE/Bmf,EAAG06K,iBAEL,MAAO16K,IAUTq7K,uBAAwB,WACtB,GAAIr7K,GAAK/iB,KACLu+L,EAAQ1/L,EAAEkkB,EAAGm6K,QAAQ/yL,IAAI,GAAGg0G,cAUhC,OARAogF,GAAMz9L,GAAG,mBAAoB,WAG3BmF,aAAa8c,EAAG+6K,wBAChB/6K,EAAG+6K,uBAAyBx3L,WAAW,WACrCyc,EAAGy7K,qBACF,OAEEz7K,GAUTy7K,kBAAmB,WACjB,GAAIz7K,GAAK/iB,KACLy+L,EAAQ5/L,EAAEkkB,EAAGm6K,QAAQ/yL,IAAI,GAAGg0G,cAAcj5G,SAASw5L,iBAAiC,GAAhB37K,EAAG47K,WAAmB,EAAI,EAAK57K,EAAGy6K,aAE1Gz6K,GAAGq6K,MAAMl5L,KAAK,gBAAgB5E,YAAY,WAC1Cm/L,EAAMhrL,OAAO,gBAAgB/T,SAAS,UACtC,IAAI6D,GAAKk7L,EAAM9+L,KAAK,aAQpB,OANI4D,KAAO+iE,MAAM/iE,KACfwf,EAAG86K,aAAa5pL,IAAI1Q,GACpBwf,EAAGk8C,SAAS17D,GACZwf,EAAGs7K,cAAc96L,IAGZwf,GAWTk8C,SAAU,SAAU2/H,GAElB,GAAI77K,GAAK/iB,KACLy+L,EAAQ17K,EAAGq6K,MAAMl5L,KAAK,SAAW06L,GAEjCC,EAAa,WACfJ,EAAMhrL,SAAS/T,SAAS,uBACxB++L,EAAM15L,KAAK,MAAOge,EAAG+7K,cAAcF,IAAU77L,IAAI,OAAQ,WACvDlE,EAAEmB,MAAMV,YAAY,aACpBT,EAAEmB,MAAMyT,SAASnU,YAAY,yBAC5BS,KAAK,WAIFC,KAAK++L,UAAUlgM,EAAEmB,MAAM+jB,SAI1B06K,GAAM15L,KAAK,SACVQ,GAAGC,IAAIw5L,OAAOt6J,OAA+C,SAAtCn/B,GAAGC,IAAIw5L,OAAOt6J,MAAMxiB,cAC7C5b,WAAW,WACTu4L,MAGFA,MAaNI,YAAa,SAAUp2H,GACrB,GAAI9lD,GAAK/iB,IAET+iB,GAAGw6K,WAAa10H,CAChB,IAAI41H,GAAQ17K,EAAGq6K,MAAMl5L,KAAK,MAG1B,IAAIu6L,EAAMhrL,SAAShU,SAAS,eAAgB,CAC1C,GAAIy/L,GAAen8K,EAAGq6K,MAAMl5L,KAAK,eAIjC,QAHAg7L,EACG5/L,YAAY,WACZI,SAASmpE,GACJA,GACN,IAAK,IACL,IAAK,IACHq2H,EAAax7L,KAAMy7L,OAAU,aAC7B,MACF,KAAK,IACL,IAAK,IACH,GAAIC,GAAoB18L,KAAK28L,IAAIt8K,EAAG46K,OAAS56K,EAAG26K,QAChDwB,GAAax7L,KAAMy7L,OAAUC,EAAoB,GAAK,YACtDF,EAAavkK,OAAO,YAAYj3B,KAAM47L,aAAcF,EAAkB,EAAI,GAAK,YAInFX,GACGn/L,YAAY,WACZI,SAASmpE,GACRhqE,EAAE,kBAAkBY,SAAS,aAC/BZ,EAAE,kBAAkBoE,QAAQA,OAGhCqD,YAAW,WAAcyc,EAAGy7K,qBAAwB,IAUtDe,SAAU,WAER,MADAv/L,MAAKi/L,YAAYnC,EAAWn7J,QACrB3hC,MAUTw/L,UAAW,WAET,MADAx/L,MAAKi/L,YAAYnC,EAAWl7J,QACrB5hC,MAWTq+L,cAAe,SAAUO,EAASa,EAAYC,GAC5C,GAAI38K,GAAK/iB,IAGT,IADA4+L,GAAWA,EACP77K,EAAGu6K,QAAQt5L,SAEb,IAAK,GADD27L,GAAiBj9L,KAAKitD,KAAK5sC,EAAGy6K,YAAcz6K,EAAGu6K,QAAQt5L,SAAW,GAC7DuD,EAAIq3L,EAASr3L,GAAKq3L,EAAUe,EAAgBp4L,IAC/Ck4L,EAAY18K,EAAG68K,WAAWr4L,EAAGm4L,GAC5B38K,EAAGk8C,SAAS13D,EAGrB,OAAOwb,IAWT+7K,cAAe,SAAUF,GACvB,MAAOlxL,QAAO1N,KAAKq9L,MAAOuB,IAW5BiB,WAAY,SAAUjB,GACpBr8K,IAAIqQ,KAAK,UAAW,oBAAsBgsK,EAE1C,IAAI77K,GAAK/iB,IAKT,IAJA4+L,GAAWA,EAEPA,EAAU77K,EAAGszD,MAAM4nH,aAAaK,YAAWM,EAAU77K,EAAGszD,MAAM4nH,aAAaK,WAE3E/4L,GAAGC,IAAIw5L,OAAOt6J,OAA+C,SAAtCn/B,GAAGC,IAAIw5L,OAAOt6J,MAAMxiB,cAA0B,CACvE,GAAIk3G,GAASv6H,EAAEkkB,EAAGm6K,QAAQ/yL,IAAI,GAAGg0G,eAC7B17G,IAAQsgB,EAAGq6K,MAAMl5L,KAAK,SAAW06L,GAASz+L,SAASsC,IAAMg6L,OAAO,GAAGn4L,OAAOo4L,WAAWxoL,EACzFuoL,QAAO,GAAGn4L,OAAOo4L,WAAWC,SAAS,EAAGl6L,GACxC22H,EAAOhxE,QAAQ,cAEfrlC,GAAGq6K,MAAMv4L,UAAUke,EAAGq6K,MAAMl5L,KAAK,SAAW06L,GAASz+L,SAASsC,MAYlEq9L,SAAU,SAAU1xL,GAClBmU,IAAIqQ,KAAK,UAAW,iBAAmBxkB,EAEvC,IAAI2U,GAAK/iB,IAIT+iB,GAAGm6K,QAAUr+L,EAAE,qBACfkkB,EAAGq6K,MAAQr6K,EAAGm6K,QAAQ/9I,WACtBp8B,EAAGu6K,QAAUv6K,EAAGq6K,MAAMl5L,KAAK,aAE3B6e,EAAGo6K,OAASp6K,EAAGm6K,QAAQzpL,OAAO,OAC9BsP,EAAGy6K,YAAcz6K,EAAGo6K,OAAOn5L,SAC3B+e,EAAG47K,WAAa57K,EAAGo6K,OAAOl8L,OAE1B,IAAI8+L,GAAWh9K,EAAGq6K,MAAMl5L,KAAK,mBAEzB87L,EAASj9K,EAAGq6K,MAAMl5L,KAAK,oBAAoB0pE,IAAImyH,GAO/CE,EAAY,SAAU7xL,GACxB4xL,EAAOt8L,KACLM,OAAS+e,EAAGu6K,QAAQv4L,KAAK,cAAgB,EAAS,KAClD9D,MAAQ8hB,EAAGu6K,QAAQv4L,KAAK,aAAe,EAAS,OAIpD,QAAQqJ,GACN,IAAK,IAEH,GAAIA,IAAO2U,EAAG47K,WAAa,IAAI57K,EAAGu6K,QAAQv4L,KAAK,YAC/Ck7L,GAAU7xL,EACV,MACF,KAAK,IACH,GAAIA,GAAM2U,EAAGy6K,YAAcz6K,EAAGu6K,QAAQv4L,KAAK,aAC3Ck7L,GAAU7xL,EACV,MACF,KAAK,IACH,GAAIA,GAAO1L,KAAKmvH,IAAI9uG,EAAG47K,WAAa57K,EAAGu6K,QAAQv4L,KAAK,aAAcge,EAAGy6K,YAAcz6K,EAAGu6K,QAAQv4L,KAAK,cACnGk7L,GAAU7xL,EACV,MACF,SACEA,GAAOA,EAEL6xL,EADmB,KAAjBl9K,EAAGw6K,YAAsC,KAAjBx6K,EAAGw6K,WACnBnvL,EAAM,IAENA,EAAM,KAUtB,MANA2U,GAAG46K,OAAS56K,EAAGu6K,QAAQr8L,QACvB8hB,EAAG26K,QAAU36K,EAAGu6K,QAAQt5L,SAExBsC,WAAW,WACTyc,EAAGy7K,qBACF,GACIz7K,KAKVze,OAAOkF,KAAKyxL;AC5cf,cAEA,SAAWtvK,GAMTA,EAAOy2H,gBACN99I,OAAOkF,MAGV,SAAWmiB,GAgDT,QAASu0K,GAA8BhlI,EAAeilI,EAAY3+L,EAASe,EAAQ64K,GACjF,GAAIglB,GAAQ92L,EAAEqjF,MAAMzxB,GAAek+B,MAAM,QAAQ44C,OAAOjzH,QACpDshL,EAAW,OAASD,EAAMnuL,KAAK,IAE/BquL,EAAkBC,EAAwBH,EAC9C,IAA+B,IAA3BE,EAAgBxyL,OAApB,CAEA0yL,EAA8BF,EAAiBplI,EAE/C,IAAIv6D,GAAO8/L,EAA6BJ,EAAUC,GAAmBr/L,MAAO,KAC5E,IAAKN,EAAL,CAEA+/L,EAAkB//L,GAAQ46B,QAAS2/B,GAEnC,IAAIylI,GAAer3L,EAAEs3L,MAAM1lI,EAAe,SAAUr0D,GAAQ,MAAOA,GAAK68G,SAASx/G,KAAK,cAAc4J,OAAS,GACzG6yL,IAEFr8L,OAAOkF,KAAK4jD,SAASC,KAAKihI,gCAAgC3tL,EAAMw/L,EAAYjlI,EAAekgH,GAE7FylB,EAAwBlgM,EAAMw/L,EAAY59L,KAI5C,QAASi+L,GAA8BF,EAAiBplI,GACtD,GAAI4lI,GAAqBx3L,EAAEzH,MAAMyH,EAAEqxB,OAAO2lK,EAAiB,SAAUz5L,GAAQ,MAAmB,eAAZA,EAAKtD,KAEzF,IAAIu9L,EAAoB,CACtB,GAAIj4C,GAAOv/I,EAAEqxB,OAAOugC,EAAe,SAAUr0D,GAAQ,MAAOA,GAAKe,OAASwI,YAAYI,KAClFq4I,GAAK/6I,OAAS,IACwD,IAApExE,EAAEqxB,OAAOkuH,EAAM,SAAUn9F,GAAO,MAAOA,GAAI2nF,aAAcvlI,OAC3DgzL,EAAmBr5L,KAAO,sBAE1Bq5L,EAAmBr5L,KAAO,sBAOlC,QAAS88E,GAAM/iF,GACb,GAAIb,GAAO8/L,EAA6Bj/L,EAAQ2O,WAkBhD,OAjBIxP,KAEFogM,EAAW,gBAAiBpgM,GAC5BogM,EAAW,UAAWpgM,GAClBa,EAAQu3D,aACVioI,EAAY,aAAcrgM,GAE1BogM,EAAW,aAAcpgM,IAG7BsgM,EAAetgM,EAAMa,EAAQ0/L,aAE7BR,EAAkB//L,GAChB46B,QAAS/5B,EAAQsF,MACjBlH,OAAQ4B,EAAQ5B,SAGXe,EAIT,QAASwgM,GAA4B5jJ,EAAK/7C,EAASe,EAAQ64K,GACzD,GAGIt0K,GAHApF,EAAK7C,EAAE0+C,GACP6jJ,EAAW1/L,EAAGE,QAAQ,eACtBuG,EAAKi5L,EAAStzL,OAAS,EAAIszL,EAAW1/L,EAGtC2/L,IAkBJ,IAhBI7/L,GAA4B,mBAAjBA,EAAQ4gG,MACrBt7F,GAAUvD,GAAI4E,EAAGxI,KAAK,SAAUy+B,KAAM,MAAOsa,QAASmjH,oBAAqB37J,KAAMwB,EAAIyG,GAAIA,GACzFk5L,EAAYlxL,WAAa,wBAEzBrJ,EAAQilD,qBAAqB5jD,GAE/BtJ,EAAE4C,OAAOqF,EAAOtF,GAEhB6/L,EAAYv6L,MAAQA,EACfu6L,EAAYlxL,aACfkxL,EAAYlxL,WAAaq7C,EAAW1kD,EAAMs3B,KAAKlc,eAEd,gBAA7Bpb,EAAMs3B,KAAKlc,gBACbpb,EAAMs3B,KAAO,QAGc,oBAA3BijK,EAAYlxL,YAA+D,yBAA3BkxL,EAAYlxL,WAQ9D,IAAK,GAPD4uI,GAAU8c,oBACV/W,EAAUgX,oBACVwlC,GACFD,EAAYlxL,WAAa,IAAM4uI,EAC/BsiD,EAAYlxL,WAAa,IAAM20I,EAC/Bu8C,EAAYlxL,WAAa,IAAM4uI,EAAU,IAAM+F,GAExCv9I,EAAI,EAAGg6L,EAAiBD,EAAYxzL,OAAQvG,EAAIg6L,EAAgBh6L,IACnEi6L,oBAAoBF,EAAY/5L,MAClC85L,EAAYlxL,WAAamxL,EAAY/5L,GAc3C,IAVAT,EAAMc,KAAOy5L,EAAYlxL,WAEzBkxL,EAAYtoI,gBAAkB5wD,EAAG1I,SAAS,kBAA0C,SAArB8F,GAAGuE,eAAsD,SAA1BiyB,cAAc,SAExG0lK,EAAWxhL,eAAe,sBAC5BohL,EAAYH,YAAuC,aAAxB3vJ,qBAA8D,YAAxBA,oBAC7D,UACCkc,0BAA4B,cAAgB,gBAG/Cg0I,EAAWxhL,eAAe,aAC5B,OAAQsxB,qBACN,IAAK,WACH8vJ,EAAYH,YAAc,MAC1B,MACF,KAAK,UACHG,EAAYH,YAAc,SAC1B,MACF,KAAK,OACHG,EAAYH,YAAc,aAC1B,MACF,KAAK,eACHG,EAAYH,YAAc,eAUhC,IAJIO,EAAWxhL,eAAe,SAAWwhL,EAAWxhL,eAAe,QAAUwhL,EAAWxhL,eAAe,aACrGohL,EAAYH,YAAc,IAGvBx/L,EAAGjC,SAAS,mBAwCfb,YAAY0B,WAxCuB,CACnC1B,YAAY0B,OACZ+gM,EAAYzhM,OAAS,WACnB,GAAI8hM,GAAc7iM,EAAE,OACpB6iM,GAAYx9L,KAAK,oBAAoB5E,YAAY,mBACjDoiM,EAAYx9L,KAAK,gBAAgB5E,YAAY,gBAG1C87K,GACH15K,EAAGhC,SAAS,mBAEdyI,EAAGzI,SAAS,cAEZ,IAAIiB,GAAO4jF,EAAM88G,GAEbV,EAAex4L,EAAGjE,KAAK,cAAc4J,OAAS,CAClB,eAA3BuzL,EAAYlxL,YAAyD,SAA3BkxL,EAAYlxL,YACzB,QAA3BkxL,EAAYlxL,YAAmD,WAA3BkxL,EAAYlxL,aAChDwwL,GAELr8L,OAAOkF,KAAK4jD,SAASC,KAAKihI,gCAAgC3tL,EAAMe,EAAIoF,EAAOs0K,GAG7E90K,WAAW,WACT,OAAQ+6L,EAAYlxL,YAClB,IAAK,YACHkrK,UAAUv0K,GAAOs1K,eAAez7K,EAAM,WAAckgM,EAAwBlgM,EAAMe,EAAIa,IACtF,MACF,KAAK,mBACH8xK,iBAAiBvtK,GAAOs1K,eAAez7K,EAAM,WAAckgM,EAAwBlgM,EAAMe,EAAIa,IAC7F,MACF,KAAK,uBACHo/L,EAAyBhhM,EAAMe,EAAIa,EACnC,MACF,SACEs+L,EAAwBlgM,EAAMe,EAAIa,KAErC,KAOP,QAASq/L,GAAsB1oJ,EAAM13C,EAASe,GAC5C,GAAI+zD,GAAwB,oBAAdpd,EAAK9a,KAA6B,GAAK,MAEjDijK,IAGJ,IAFAA,EAAYlxL,WAAaq7C,EAAW8K,GAEhCA,EAAS,CACX+qI,EAAYv6L,MAAQtF,EACpB6/L,EAAYH,YAAc,GAE1BtiM,YAAY0B,MACZ,IAAIK,GAAO4jF,EAAM88G,EACjBR,GAAwBlgM,EAAM,KAAM4B,IAKxC,QAASk+L,GAA6BnqI,EAAS/0D,EAAO04B,GACpD,IAAKwnK,EAAWxhL,eAAeq2C,GAAU,CACvC,GAAIwW,GAAYvrE,EACZsgM,EAAe5nK,KAEnB,KAAK6yC,EAAW,CACd,GAAI7yC,GAAWunK,oBAAoBlrI,EACnC,KAAKr8B,EAAU,MAAO,KACtB6yC,GAAY7yC,EAAS14B,MAAM0M,MAAM,GAG7BkjB,SAASrpB,KAAKoa,cAAc9W,QAAQ,mBAAoB,IAC1D0hE,EAAYg1H,EAAeh1H,EAAW,YAGxC+0H,EAAe5nK,EAASA,SAG1BwnK,EAAWnrI,GAAW,GAAI13D,aAAYkuE,EAAW+0H,GAenD,MAZIJ,GAAWxhL,eAAe,cAC5B8hL,EAAkB,aAEhBN,EAAWxhL,eAAe,qBAC5B8hL,EAAkB,oBAEhBN,EAAWxhL,eAAe,SAC5B8hL,EAAkB,QAEhBN,EAAWxhL,eAAe,QAC5B8hL,EAAkB,OAEbN,EAAWnrI,GAIpB,QAASoqI,GAAkB//L,EAAMqhM,GAC/BrhM,EAAKoG,KAAOi7L,EAAMzmK,QAClB56B,EAAKf,OAAS,WACRf,EAAE8jB,WAAWq/K,EAAMpiM,SAASoiM,EAAMpiM,SAExC,IAAIqiM,GAAWthM,EAAKwL,YAAY,WAChC,IAAI81L,EAAU,CACZ,GAAIC,EACJD,GAAS56L,SAAW,WAAc66L,EAAKliM,MACvCW,EAAKkC,OAAS,WACRhE,EAAE8jB,WAAWq/K,EAAMn/L,SAASm/L,EAAMn/L,WAM5C,QAAS09L,GAAwBH,GAC/B,GAAIE,MACA6B,IAmCJ,OAjCA74L,GAAEvJ,KAAKqgM,EAAO,SAAUx4L,GACtB,GAAIy4L,EACJ,QAAQz4L,GACN,IAAKwI,aAAYC,UAAWgwL,EAAW,eAAiB,MACxD,KAAKjwL,aAAYE,OAAQ+vL,EAAW,YAAc,MAClD,KAAKjwL,aAAYG,KAAM8vL,EAAW,UAAY,MAC9C,KAAKjwL,aAAYI,IAAK6vL,EAAW,SAAW,MAC5C,KAAKjwL,aAAYK,iBAAkB4vL,EAAW,qBAAuB,MACrE,SAAS,OAGX,GAAIpmK,GAAWunK,oBAAoBnB,EACnC,IAAKpmK,EAAL,CACA,GAAImoK,GAAenoK,EAAS14B,MAAM0M,MAAM,GAEpCo0L,KACAC,IAEJh5L,GAAEvJ,KAAKqiM,EAAc,SAAUnwH,GAII,IAA7BkwH,EAAkBr0L,QAAgBq0L,EAAkB/2L,QAAQ6mE,EAAY1uE,OAAQ,IAClF8+L,EAAmB9uL,KAAK0+D,GACxBqwH,EAAqB/uL,KAAK0+D,EAAY1uE,OAK1C+8L,EAAkB+B,EAClBF,EAAoBG,KAGfhC,EAIT,QAASiC,GAAqCpC,GACvCA,EAAW1gM,SAAS,UACvB0gM,EAAaA,EAAWv+L,QAAQ,eAElC,IAAI4gM,GAAYrC,EAAWp7L,KAAK,MAE5Bm2D,EAAgB31D,GAAGmE,GAAG8pB,WAAW6lB,mBACjCopJ,EAAan5L,EAAE8kD,IAAI8M,EAAe,SAAU9tD,GAC9C,MAAOA,GAAa7J,KAAOi/L,GAGxBC,KAEHl9L,GAAGmE,GAAG8pB,WAAWmhH,cAEjBpvI,GAAGmE,GAAG8pB,WAAWqjF,YAAatzG,GAAIi/L,KAItC,QAAS3B,GAAwBlgM,EAAMe,EAAIa,GACzCmgM,EAAmB/hM,EAAMe,GACpBa,EACA5B,EAAKuC,OAAOX,EAAQ,KAAM,MADlB5B,EAAKsB,KAAKP,GAIzB,QAASghM,GAAmB/hM,EAAMe,GAChC,GAAI4mL,IACC9+K,KAAK44I,YAAYugD,sBAAsBjhM,IAAO8H,KAAK4jD,SAASC,KAAK/E,iBACpEggI,EAAW3nL,EAAKwL,YAAY,WACxBm8K,IACFA,EAAStgL,UAAW,QACbsgL,GAASthL,UAElBshL,EAAW3nL,EAAKwL,YAAY,cACxBm8K,IACFA,EAAStgL,UAAW,QACbsgL,GAASthL,WAGF,gBAAdrG,EAAKiH,MAA8D,IAApC/I,EAAE,uBAAuBiP,SAC1Dw6K,EAAW3nL,EAAKwL,YAAY,aAC5Bm8K,EAAStgL,UAAW,QACbsgL,GAASthL,UAIpB,QAAS26L,GAAyBhhM,EAAMe,EAAIa,GAC1C,GAAI+lL,EACAsa,yBACFta,EAAW3nL,EAAKwL,YAAY,UACxBm8K,IACFA,EAAStgL,UAAW,QACbsgL,GAASthL,UAGlBshL,EAAW3nL,EAAKwL,YAAY,QACxBm8K,IACFA,EAAStgL,UAAW,QACbsgL,GAASthL,WAGfzE,EAA4B5B,EAAKuC,OAAOX,EAAQ,KAAM,MAA9C5B,EAAKsB,KAAKP,GAIzB,QAASogM,GAAevgM,EAAOgC,GAE7B,IAAK,GADDs/L,MACKt7L,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAE5BhG,EAAMgG,GAAGhE,IAAMA,EACjBs/L,EAAStvL,KAAKhS,EAAMgG,IAGhBhG,EAAMgG,GAAGG,WAAaH,EAAI,IAC5BhG,EAAMgG,EAAI,GAAGG,WAAY,EAI/B,OAAOm7L,GAGT,QAASd,GAAkBzrI,GACzB,GAAIr8B,GAAWunK,oBAAoBlrI,GAE/BwsI,EAAeC,EAAoB9oK,EACd,cAArB10B,GAAGuE,gBACLg5L,EAAehB,EAAegB,EAAc,YAE9CrB,EAAWnrI,GAAW,GAAI13D,aAAYkkM,EAAc7oK,EAASA,UAG/D,QAAS8oK,GAAoB9oK,GAC3B,GAAI6oK,GAAe7oK,EAAS14B,KAQ5B,OANIgE,IAAGkoB,MAAMxlB,eACX66L,EAAehB,EAAegB,EAAc,eAC5CA,EAAehB,EAAegB,EAAc,iBACxCjkM,EAAEwB,MAAQkF,GAAGC,IAAIC,eAAeq9L,EAAehB,EAAegB,EAAc,UAG3EA,EAGT,QAAS9B,GAAYh0H,EAAQrsE,GAC3B,GAAI2nL,GAAW3nL,EAAKwL,YAAY6gE,EAC5Bs7G,KACFA,EAAStgL,UAAW,GAIxB,QAAS+4L,GAAW/zH,EAAQrsE,GAC1B,GAAI2nL,GAAW3nL,EAAKwL,YAAY6gE,EAC5Bs7G,KACFA,EAAStgL,UAAW,GAGxB,QAASi5L,GAAetgM,EAAMqsE,GAC5B,GAAIs7G,GAAat7G,EAASrsE,EAAKwL,YAAY6gE,GAAUrsE,EAAKY,MAAM,EAC1D+mL,KACJA,EAAkB,SAAI,GApc1B,GAAImZ,MACAj2I,GACFC,KAAQ,YACR/gC,KAAQ,OACRghC,IAAO,MACPC,IAAO,SACPC,IAAO,kBACPC,IAAO,eACPC,IAAO,mBACPk3I,IAAO,SACPhpI,IAAO,cACPipI,UAAa,YACbC,YAAe,gBAYjBv3K,GAAO1pB,KAAO,SAAUs7C,EAAK/7C,EAASe,EAAQ64K,GAC5C,GAAI79H,YAAenxC,SAAUmxC,YAAetE,aAAa,CACvD,GAAI1zC,GAAGmE,IAAMnE,GAAGmE,GAAG8pB,WAAY,CAC7B,GAAI2sK,GAAathM,EAAE0+C,EAEf69H,IACFmnB,EAAqCpC,EAGvC,IAAIjlI,GAAgB31D,GAAGmE,GAAG8pB,WAAW6lB,kBACrC,IAAI6hB,EAAcptD,OAAS,EAGzB,WAFAoyL,GAA8BhlI,EAAeilI,EAAY3+L,EAASe,EAAQ64K,GAK9E+lB,EAA4B5jJ,EAAK/7C,EAASe,EAAQ64K,OAElDwmB,GAAsBrkJ,EAAK/7C,EAASe,IAsaxCopB,EAAOg3K,sBAAwB,SAAUjhM,GACvC,MAAQA,IAAMA,EAAGE,QAAQ,SAASkM,OAAS,GAU7C6d,EAAOw3K,uBAAyB,SAAUx3I,GAExC,GAAIA,YAAev/C,SAAUu/C,YAAe1S,aAAa,CACvD,GAAImqJ,GAAOz3I,EAAIxjD,GAAG1I,SAAS,QAAUksD,EAAIxjD,GAAKwjD,EAAIxjD,GAAGmgC,UACrD,QAAStgC,SAAUo7L,EAAK3jM,SAAS,wBAEjC,MAAQksD,GAAI1rC,eAAe,YAAgBjY,UAAW2jD,EAAI03I,aAQ9D13K,EAAO23K,mBAAqB,WAC1B,OACEt7L,SAAUwB,KAAK4jD,SAASC,KAAK/E,iBAWjC38B,EAAO43K,2BAA6B,SAAU53I,GAG5C,GAAI3jD,GACAR,EAAmC,aAArBjC,GAAGuE,cAAgC,SAAW,EAChE,IAAI6hD,YAAev/C,SAAUu/C,YAAe1S,aAAa,CACvD,GAAImqJ,GAAOz3I,EAAIxjD,GAAG1I,SAAS,QAAUksD,EAAIxjD,GAAKwjD,EAAIxjD,GAAGmgC,UACrDtgC,GAAWwB,KAAK4jD,SAASC,KAAK/E,kBAAoB86I,EAAK3jM,SAAS,kBAAoB2jM,EAAK3jM,SAAS,YAAc2jM,EAAK3jM,SAAS,aAAe2jM,EAAK3jM,SAAS,gBACtJ,CACL,IAAIksD,EAAI1rC,eAAe,YAClB,OAASzY,WAAYA,EADUQ,IAAY2jD,EAAI63I,SAItD,OACEx7L,SAAUA,EACVR,WAAYA,IAWhBmkB,EAAO83K,sBAAwB,SAAU93I,EAAKvuB,EAAUnsB,GACtD,GAAI0a,EAAOg3K,sBAAsBh3I,EAAIxjD,IAAK,CACxC,GAAIu7L,GAAgB/3I,EAAIxjD,GAAGvG,QAAQ,YAAY6R,QAE/C,KAAKiwL,EAAcjkM,SAAS,iBAAkB,CAC5C,GAAIkkM,GAAiBD,EAAcp7J,SAAS,QAAQpkC,KAAK,KAAKa,KAAK,MAAM+P,UAAU,EACnFonC,aAAY,KAAO73B,GAAIsnC,EAAIpoD,GAAI47B,KAAM,MAAOsZ,SAAU,MAAO,EAAOkrJ,GAAgB,EAAM,WACxFp+L,GAAGmE,GAAG0wC,WAAW6C,sBAAsB0O,EAAIpoD,MAC1C,QAGLq8J,eAAcj0G,EAAK,KAAMvuB,EAAUnsB,IAWvC0a,EAAOi4K,mBAAqB,SAAUj4I,GACpC,GAAIvuB,GAAW,KACXnsB,EAAM,EACe,cAArB1L,GAAGuE,gBACLszB,EAAW,SAAUjZ,GACnB7f,OAAOkF,KAAKywB,SAAS4pK,mBAAmB1/K,EAAKE,IAAI,IAEnDpT,EAAMtK,EAAE,mBAGVglB,EAAO83K,sBAAsB93I,EAAKvuB,EAAUnsB,IAU9C0a,EAAOm4K,8BAAgC,SAAUn4I,GAC/C,MAAQA,GAAI1rC,eAAe,cAAkBjY,UAAW2jD,EAAIo4I,eAU9Dp4K,EAAOq4K,sCAAwC,SAAUr4I,GAEvD,GAAIA,YAAev/C,SAAUu/C,YAAe1S,aAAa,CACvD,GAAImqJ,GAAOz3I,EAAIxjD,GAAG1I,SAAS,QAAUksD,EAAIxjD,GAAKwjD,EAAIxjD,GAAGmgC,UACrD,QAAStgC,SAAUo7L,EAAK3jM,SAAS,wBAEjC,MAAQksD,GAAI1rC,eAAe,YAAgBjY,UAAW2jD,EAAIs4I,aAW9Dt4K,EAAOu4K,wBAA0B,WAE/B,GAAIC,GAAsBtlM,EAAE,yBACxBoJ,GAAa,CAEjB,IAAIk8L,EAAoBr2L,OAAS,EAAG,CAClC,GAAIs2L,GAAgBD,EAAoBjgM,KAAK,kBAEzCkgM,GAAct2L,OAAS,IACzB7F,EAAam8L,EAAc3kM,SAAS,aAGxC,OACEuI,SAAUC,IAUd0jB,EAAOgrJ,wBAA0B,WAC/B,GAAIv2C,GAAiBvhI,EAAE,kBACvBuhI,GAAer7H,KAAK,OAAQ,OAC5Bq7H,EAAej+G,KAAK,cAAe,SAAU/d,GAI3C,MAHAA,GAAEpB,iBACFoB,EAAEhF,kBACFqrD,gBAAgB5rD,EAAEmB,UAAaoD,KAAQgB,EAAEsmD,MAAOjoD,IAAO2B,EAAEumD,QAAS,IAC3D,KAWXh/B,EAAO04K,iBAAmB,WACxB,GAAIC,GAAoB/+L,GAAGmE,GAAG8pB,WAAWghH,gBACrC+vD,EAAkBh/L,GAAGwpB,QAAQirB,OAEjCz0C,IAAGwnB,SAASltB,KAAK,yCACfytC,SAAUi3J,EACVC,YAAaF,IACZjkK,QAAQ,SAAUpd,GACnB1d,GAAGmE,GAAG8pB,WAAW8jH,kBAAkBgtD,GACnC/+L,GAAGmE,GAAG8pB,WAAWkjH,kBAAkB6tD,MAWvC54K,EAAO84K,yBAA2B,WAChC,GAAIjwD,GAAgBjvI,GAAGmE,GAAG8pB,WAAWghH,eACrC,QACEtsI,SAAUssI,EACVnsI,MAAOmsI,EAAgB,8BAAgC,MAK1DlwI,OAAOkF,KAAK44I;AC5oBf,QAASsiD,0BAEwB,WAA3B7lM,EAAE4yB,OAAO,gBACX5yB,EAAE4yB,OAAO,aAAc,MAAQL,KAAM,MACrCvyB,EAAE4yB,OAAO,aAAc,MAAQL,KAAM,UAOzC,QAASuzK,WAAUxmH,EAAcX,EAAUY,EAAWC,EAAcC,EAAYsmH,EAAwBC,EAAqBC,GAC3H,GAAItzK,GAAajsB,GAAGioB,WAChBu3K,GAAY,GAAKx/L,IAAGkf,KAAOuX,SAAS,aAEpCgpK,EAAY,WACdz/L,GAAGwnB,SAASyuD,cAAc0C,UAAUC,EAAcX,EAAUY,EAAWC,EAAcC,EACjF,SAAUl3E,GACR,OAAQA,EAAI6gB,QACV,IAAKg9K,qBAAoBC,uBAEnBN,GACFA,EAAuBx9L,EAAI8kC,QAC7B,MAEF,KAAK+4J,qBAAoBE,mBAEnBN,GACFA,EAAoBz9L,EAAI8kC,QAC1B,MAEF,SAEE5nC,OAAO6sB,SAASrpB,KAAqB,IAAbi9L,EAAmBK,cAAgBL,IAE9D,SAAU39L,GAEP09L,GACFA,EAAkB19L,EAAIse,SAI5By4D,IAAgBknH,mBAAmBpW,QAErC3qL,OAAO6sB,SAASrpB,KAAqB,IAAbi9L,EAAmBK,cAAgBL,EAEvDvzK,EACFwzK,IAEAz/L,GAAG+oB,UAAU/c,KAAK,WAChByzL,MASR,QAASM,oBAAmBnnH,EAAcX,EAAUt7B,EAAau7B,EAAaC,EAAiBC,EAAc5+B,EAAiB+lJ,GACxHv/L,GAAGwnB,SAASyuD,cAAcx4B,eAAew6B,EAAUt7B,EAAau7B,EAAaC,EAAiBC,EAC9F,SAAUv2E,GACJ23C,GACFA,EAAgB33C,EAAI8kC,UACrB,SAAU9kC,GACP09L,GACFA,EAAkB19L,EAAIse,SAzFhC2/K,oBACEE,QAAS,UACTC,IAAK,MACLC,OAAQ,SACRxW,QAAS,WAUXgW,qBACEnuL,KAAM,EACNouL,uBAAwB,EACxBC,mBAAoB;ACxBtB,cAEA,SAAWx5K,GAMTA,EAAOorJ,gBACNzyK,OAAOkF,MAEV,SAAWmiB,GAKTA,EAAOqrJ,oBAAsB,SAAU0uB,GACrC,GAAIC,IAAe,QAGfC,GAAyB,CAC7B/mM,GAAE6mM,GAAkB3iM,IAAI,WAAY,WAClCyG,KAAKqtK,MAAMgvB,0BAA0BF,GAChCC,IACHp8L,KAAKqtK,MAAMivB,kCACXF,GAAyB,IAI7B,IAAI7jH,GAAcljF,EAAE,iBACpBkjF,GAAYzuC,OAAO,WACjB9pC,KAAKqtK,MAAMgvB,0BAA0BF,GAChCC,IACHp8L,KAAKqtK,MAAMivB,kCACXF,GAAyB,KAI7B7jH,EAAYjhF,GAAG,cAAe,WAC5B,GAAIoyB,GAAU3tB,GAAGmE,GAAG8C,QAAQ0mB,QAAQ2oG,yCAChC3gE,EAAgB31D,GAAGmE,GAAG8pB,WAAW6lB,kBACjC6hB,GAAcptD,OAChBolB,EAAQ1f,QAAQ,SAAU5G,GAExB,OAAQrH,GAAGmE,GAAGy5E,OACZ,IAAKxsE,YAAWE,QAChB,IAAKF,YAAWI,WAChB,IAAKJ,YAAWM,UACVrK,EAAOgqH,yBACThqH,EAAOm9D,QAET,MACF,KAAKpzD,YAAWG,KACVlK,EAAO+pH,sBACT/pH,EAAOm9D,QAET,MACF,KAAKpzD,YAAWK,QACVpK,EAAO8pH,yBACT9pH,EAAOm9D,YAMf72C,EAAQ1f,QAAQ,SAAU5G,GACxBA,EAAOk9D,gBAMdxlE,OAAOkF,KAAKutK;ACxEf,cAEA,SAAWprJ,GAMTA,EAAOi9H,UACNtkJ,OAAOkF,MAEV,SAAWmiB,GAMTA,EAAOsrJ,8BAAgC,WACrC,GAAI8uB,GAASlnM,EAAE,qBACO,KAAlBknM,EAAOj4L,SAETi4L,EAASlnM,EAAE,+BAEbknM,EAASA,EAAO9uJ,QAAQ,uBAExB,IAAI+uJ,GAAmBD,EAAO7hM,KAAK,wBAE/B+hM,EAAuBpnM,EAAE,sDAAwD8H,EAAE,oCAAsC,SAa7H,OAZAs/L,GAAqBnlM,GAAG,QAAS,WAC/BolM,wBAIFF,EAAiB9hM,KAAK,KAAKwsC,SAG3Bs1J,EACGhnM,OAAOinM,GACPhkM,OAEI0pB,GAOTA,EAAOqrJ,oBAAsB,WAC3B,IAAKzxK,GAAGmE,GAAGgb,MAAO,CAChB,GAAI2O,GAAiB9tB,GAAGmE,GAAG8C,QAAQ0mB,QAC/BizK,IAAiB9yK,EAAe5L,QAAQ,gBAAkB4L,EAAe+yK,WAAW/vI,aACxF,IAAI8vI,EAAc,CAChB7hM,OAAOkF,KAAKutK,YAAYC,oBAAoB,8BAE5C,IAAIqvB,IAAsB,cAAe,cACrCC,GAAqB,OACzBD,GAAmB7yL,QAAQ,SAAUkgH,GACnC,GAAI6yE,GAAgBlzK,EAAeqgG,EAC/B6yE,IACFA,EAAcpkL,KAAK,QAAS,WAC1B3Y,KAAKqtK,MAAMgvB,0BAA0BS,OAK3CznM,EAAE,yBAAyBqF,KAAK,SAASnB,IAAI,kBAAkB,WAC7DyG,KAAKqtK,MAAMgvB,0BAA0BS,MAK3C,MAAO36K,KAGRrnB,OAAOkF,KAAKo/I;CCzEf,SAAWj9H,GAOTA,EAAO66K,UACNliM,OAAOkF;ACTV,cACA,SAAWmiB,GAET,GACI86K,GACAC,EACAC,EACFC,EACAC,EAKAC,EACAC,EACAC,EACAC,EACAxiE,EACAyiE,EACAC,EAhBEC,EAAiB,CAwBrBz7K,GAAO04H,OAEL9jJ,KAAM,WACJo0G,sBACA+vF,yBACAniL,IAAIozB,MAAM,QAAQ,4BAElB31C,KAAKqnM,kBACLrnM,KAAKsnM,iBACLtnM,KAAKunM,oBACLvnM,KAAKwnM,+BAA+B3oM,EAAE,kBACtC0jB,IAAIozB,MAAM,QAAS,0BAOrB0xJ,gBAAiB,WACf,GAAIhjD,GAAQxlJ,EAAE,gBACd,KACqB,IAAfwlJ,EAAMpwI,MACRpV,EAAE,oBAAoB03B,QAEtB8tH,EAAM9tH,QAER,MAAO0G,MAUXqqK,eAAgB,WAGdN,EAAgBnoM,EAAE,sBAClBooM,EAAapoM,EAAE,iBAIf8nM,EAAS9nM,EAAE,iBACX+nM,EAAY/nM,EAAE,oBACdgoM,EAAShoM,EAAE,iBACXioM,EAAuBjoM,EAAE,iBACzBkoM,EAAcloM,EAAE,aAChBsoM,EAA6BtoM,EAAE,8BAC/B4lI,EAAS5lI,EAAE,gBACXqoM,EAAkBroM,EAAE,qBAQtB0oM,kBAAmB,WACoE,IAAjFN,EAAW/iM,KAAK,iBAAmBmhM,mBAAmBE,QAAU,MAAMz3L,SACxE64L,EAAOxkL,KAAK,iBAAkBniB,KAAKynM,iBAC/BliM,GAAGC,IAAIC,aAAakhM,EAAOxkL,KAAK,SAAUniB,KAAKynM,mBAOvDC,uBAAwB,SAAUhmM,GAChC,IAAI7C,EAAE6C,GAAIjC,SAAS,YAAnB,CAEA,GAAIuE,GAAS,GACbnF,GAAE,qBAAqByB,KAAK,QAE5BzB,EAAE,8BAA8B6E,KAAM8D,WAAY,YAAao6D,SAC3D59D,OAAQA,EAAQs9K,QAAS,IACzBx+B,SAAU,WACdjkJ,EAAE,oBAAoB+iE,SAClB59D,OAAQ,EAAGm7L,OAAQ,EAAI7d,QAAS,IAChCx+B,SAAU,aAMhB6kD,WAAY,SAAUtkM,GACpB,IACE,GAAIukM,GAA0D,YAAvC/oM,EAAE,iBAAiBkG,KAAK,YAC3C2jF,EAAYrlF,EAAW,MAAIA,EAAM8mD,MAAQ7lD,OAAOjB,MAAMm/C,OAC1D,IAAgB,IAAZkmC,EAMF,MALIk/G,GACF1iM,SAASq+H,eAAe,wBAAwBqT,UAEhD1xI,SAASq+H,eAAe,eAAeqT,WAElC,EAET,MAAOxyI,MAMXojM,+BAAgC,SAAU9lM,GACxC,GAAIkG,GAAOlG,EAAGuS,KACdwyL,GAAmB7+L,CAEnB,IAAIigM,GAAcC,kBAAkBrB,EACpC,IAAIoB,EAAa,CACf,GAAIE,GAAaF,EAAY,yDACzBG,EAAgBH,EAAY,6DAC5BI,EAAaJ,EAAY,0DACzBK,EAAerpM,EAAE,iBAAiBoV,KAGlC8zL,IACFlpM,EAAE,aAAaoD,OACfpD,EAAE,iBAAiBoV,IAAIi0L,GACvBrpM,EAAE,eAAe4I,KAAKsgM,EAAW5uJ,UAEjCt6C,EAAE,aAAayB,OAGb0nM,GACFnpM,EAAE,gBAAgBoD,OAElBpD,EAAE,kBAAkB4I,KAAKugM,EAAc7uJ,UAEvCt6C,EAAE,gBAAgByB,OAGhB2nM,GACFppM,EAAE,oBAAoBoD,OACtBpD,EAAE,sBAAsBoV,IAAIg0L,EAAWlpL,OACvClgB,EAAE,sBAAsB4I,KAAKwgM,EAAW9uJ,SACxCutJ,EAAeuB,EAAWlpL,MAE1BlgB,EAAE,aAAaoD,OACfpD,EAAE,iBAAiBoV,IAAIg0L,EAAWlpL,OAClClgB,EAAE,eAAe4I,KAAKwgM,EAAW9uJ,WAEjCt6C,EAAE,aAAayB,OACfzB,EAAE,oBAAoByB,QAGxBzB,EAAE,iBAAiBkG,KAAK,YAAY,GACpClG,EAAE,oBAAoBkG,KAAK,YAAY,GACvClG,EAAE,iBAAiBkG,KAAK,YAAY,OAC/B,CACLlG,EAAE,iBAAiBkG,KAAK,YAAY,GACpClG,EAAE,oBAAoBkG,KAAK,YAAY,GACvClG,EAAE,iBAAiBkG,KAAK,YAAY,EAEpC,IAAIojM,GAAwBtpM,EAAE,0BAA0BoV,KAC3B,KAAzBk0L,IACFtpM,EAAE,iBAAiBoV,IAAIk0L,GACvBnoM,KAAKooM,mBAAmBzhM,EAAE,qDAAsD0S,aAAaG,OAI7FitL,GAAoBpB,mBAAmBG,KACzC3mM,EAAE,uBAAuBoD,OACzBpD,EAAE,uBAAuBS,YAAY,YAErCT,EAAE,uBAAuByB,OACzBzB,EAAE,uBAAuBa,SAAS,YAOtC2oM,iBAAkB,SAAUp3L,GAC1BpS,EAAE,WACA,IAAMA,EAAE,UAAU03B,QAAW,MAAO0G,IAEV,GAAtBp+B,EAAE,UAAUiP,QACdjP,EAAE,kBAAkBG,OAAO,yBAEfH,GAAE,UACH+E,KAAKqN,GACLtE,QACC42F,WAAW,EACXwO,OAAO,EACP6C,UAAU,EACVhrF,MAAOjjB,EAAE,QACT1F,MAAO,IACPiyB,UAGIzrB,KAAMd,EAAE,MACR1D,MAAO,WACLqB,OAAO6sB,SAASpF,gBAMtC6mB,mBAMF01J,0BAA2B,SAAUC,EAAUC,EAAYv3L,GACzD,GAAI8R,GAAK/iB,IASTnB,GAAEqG,UAAUgnB,MAAM,WAChB,IAAMrtB,EAAE,UAAU03B,QAAW,MAAO0G,IAEV,GAAtBp+B,EAAE,UAAUiP,QACdjP,EAAE,kBAAkBG,OAAO,yBAEfH,GAAE,UACH+E,KAAKqN,GACLtE,QACC42F,WAAW,EACXwO,OAAO,EACP6C,UAAU,EACVhrF,MAAOjjB,EAAE,QACT1F,MAAO,IACPiyB,UAGIzrB,KAAMd,EAAE,MACR1D,MAAO,WACL,GAAgB,SAAZslM,GAAqC,QAAdC,EAAsB,CAC/C3pM,EAAE,cAAckG,KAAK,YAAY,EACjC,IAAI0jM,GAAY5pM,EAAE,cAAcqF,KAAK,uBACrCukM,GAAUvkM,KAAK,UAAUa,KAAK,YAAY,GAC1C0jM,EAAU3/I,QAAQ,wEAClBjqD,EAAE,oBAAoBoV,IAAIpV,EAAE,uBAAuBoV,OACnD8O,EAAGm7D,YACHn7D,EAAG2lL,oBAEa,SAAZH,GAAqC,SAAdC,IACzB3pM,EAAE,oBAAoBoV,IAAI,IAC1BpV,EAAE,uBAAuBoV,IAAI,IAC7BpV,EAAE,2BAA2BoV,IAAI,IACjC8O,EAAG2lL,iBAEL7pM,EAAEmB,MAAM2M,OAAO,gBAOvCimC,mBAkCF60J,gBAAiB,WACf,GAAIkB,GAAa,SAAUlhM,EAAMC,GAC/B,GACAkhM,GACAprH,EACAqrH,EAHIC,GAAY,CAYhB,OAPIrhM,GAAK2D,QAAQ1D,MAAe,IAC9BkhM,EAAmBnhM,EAAKwH,MAAMvH,GAC9B81E,EAAWorH,EAAiB,GAC5BC,EAASD,EAAiB,GAC1BE,GAAY,IAIZA,UAAaA,EACbtrH,SAAYA,EACZqrH,OAAUA,GAId,IAAIpC,GAAoBpB,mBAAmBE,QAAS,CAClD,GAAI/nH,GAAW3+E,EAAEmB,MAAMiU,MACnB80L,GAAc,KAElB,KAAK,GAAIrhM,KAAaqhM,GAAY,CAChC,GAAIC,GAAaL,EAAWnrH,EAAUurH,EAAWrhM,GAC7CshM,GAAWF,WACb9B,EAAc/yL,IAAI+0L,EAAWH,QAC7BhC,EAAO5yL,IAAI+0L,EAAWH,SAGlB7B,EAAcv/L,QAAUo/L,EAAO5yL,QACjC+yL,EAAc/yL,IAAIyyL,GAClBG,EAAO5yL,IAAIyyL,OAYrB0B,mBAAoB,SAAUn3L,EAAKrJ,GACZ,GAAjB68H,EAAO32H,SACT22H,EAAS5lI,EAAE,+CACXqoM,EAAgBloM,OAAOylI,IAGrBxzH,GACFwzH,EAAO7gI,KAAKqN,GAAKhP,OACb2F,GAAQyR,aAAaG,KACvBirH,EAAO/kI,SAAS,kCAEhB+kI,EAAOnlI,YAAY,mCAGrBmlI,EAAOnkI,OAAOmH,KAAK,KASvBwhM,mBAAoB,WAClBjpM,KAAKooM,mBAAmB,KAQ1Bc,uBAAwB,SAAUV,GAehC,MAdArB,GAA2B7mM,OAC3BwmM,EAAqBxnM,YAAY,UACjCynM,EAAYrnM,SAAS,UAErBknM,EAAU3yL,IAAI,IACdpV,EAAE,oBAAoByB,OACtBqmM,EAAO5hM,KAAK,YAAY,GACxB4hM,EAAO5hM,KAAK,YAAY,GAAMrF,SAAS,+BAKvCb,EAAE,iBAAiBoV,IAAIu0L,GACvB3pM,EAAE,gBAAgByB,QACX,GASTooM,cAAe,WAQb,MAPAvB,GAA2BllM,OAC3BjC,KAAKipM,qBACLlC,EAAYzwK,IAAI,WAAWh3B,YAAY,UACvCwnM,EAAqBpnM,SAAS,UAC9BinM,EAAO5hM,KAAK,YAAY,GAAOzF,YAAY,+BAC3CqnM,EAAO5hM,KAAK,YAAY,GACxB6hM,EAAUnzL,SAASxR,QACZ,GAGT+gD,eAAgB,WACd,GAAIjgC,GAAK/iB,IAkCT,OAjCAnB,GAAE,yBAAyBkG,KAAK,YAAY,GAAMrF,SAAS,YAE3D4lM,mBAAmBzmM,EAAE,iBAAiBoV,MACpCpV,EAAE,iBAAiBoV,MACnBpV,EAAE,oBAAoBoV,MACtBpV,EAAE,uBAAuBoV,MACzBpV,EAAE,2BAA2BoV,MAC7BpV,EAAE,iBAAiBoV,MACnB,SAAUwc,GACR5xB,EAAE,yBAAyBorC,WAAW,YAAY3qC,YAAY,YAC9DyjB,EAAGkmL,qBACHlmL,EAAGulL,0BAA0B,QAASzpM,EAAE,iBAAiBoV,MAAOwc,IAC/D,SAAUA,GACX5xB,EAAE,yBAAyBorC,WAAW,YAAY3qC,YAAY,YAC9DyjB,EAAGqlL,mBAAmB33K,MAmBnB,GAGTytD,UAAW,WACT,GAAIn7D,GAAK/iB,IACTiG,cAAamhM,GACbvoM,EAAE,gBAAgBkG,KAAK,YAAY,GAAMrF,SAAS,YAClD0nM,EAAiB9gM,WAAWtG,KAAKmpM,SAAU,IAE3C,IAAI/qH,GAAYv/E,EAAE,iBAAiBoV,KAsBnC,OArBiB,IAAbmqE,IACFA,EAAYv/E,EAAE,sBAAsB4I,QAEtCk9L,UAAU9lM,EAAE,iBAAiBoV,MAAOpV,EAAE,iBAAiBoV,MAAOmqE,EAAWv/E,EAAE,oBAAoBoV,MAA8C,GAAtCpV,EAAE,0BAA0BiP,OACjI,SAAU2iB,GACRxqB,aAAamhM,GACbrkL,EAAGqmL,WACHvqM,EAAE,gBAAgBorC,WAAW,YAAY3qC,YAAY,YACrDyjB,EAAGmmL,uBAAuB,QAC1BnmL,EAAGulL,0BAA0B,OAAQ,OAAQ73K,IAC5C,SAAUA,GACXxqB,aAAamhM,GACbrkL,EAAGqmL,WACHvqM,EAAE,gBAAgBorC,WAAW,YAAY3qC,YAAY,YACrDyjB,EAAGslL,iBAAiB53K,IACnB,SAAUA,GACXxqB,aAAamhM,GACbrkL,EAAGqmL,WACHvqM,EAAE,gBAAgBorC,WAAW,YAAY3qC,YAAY,YACrDyjB,EAAGqlL,mBAAmB33K,MAEnB,GAGT04K,SAAU,WACR,GAAIE,GAAYxqM,EAAE,cAClBwqM,GAAUnlM,KAAK,iCAAiCa,KAAK,YAAY,GAAMrF,SAAS,YAChF2pM,EAAUnlM,KAAK,qBAAqB5D,OACpCzB,EAAE,kBAAkBa,SAAS,YAC7B2pM,EAAUrqM,OAAO,gCAAkC2H,EAAE,eAAiB,iEACtE0iM,EAAUnlM,KAAK,eAAejC,QAGhCmnM,SAAU,WACR,GAAIC,GAAYxqM,EAAE,cAClBwqM,GAAUnlM,KAAK,eAAe5D,OAAOowC,SACrC24J,EAAUnlM,KAAK,sBAAsBjC,OACrCpD,EAAE,kBAAkBS,YAAY,YAChC+pM,EAAUnlM,KAAK,iCAAiC+lC,WAAW,YAAY3qC,YAAY,eAGtFgF,OAAOkF,KAAKg9L;ACpgBf,cACA,SAAW76K,GAETA,EAAO29K,UACLh2D,gBAAiB,KACjBi2D,kBAAmB,KACnBC,UAAW,KAOXjpM,KAAM,WACJ,GAAIwiB,GAAK/iB,IAGTw0J,eACA0M,sBACA+P,kBACA3sK,OAAO2F,KAAO,WAGd8Y,EAAG0mL,kBAGHlkM,GAAG8nB,QAAQlL,KAAK5c,GAAG8nB,QAAQvL,MAAM43D,aAAc,SAAUttD,GACnDA,GAAwB,aAAfA,EAAMxkB,MAAuBwkB,EAAM8hB,SAC9CnrB,EAAG2mL,WAAWt9K,GAGd9nB,OAAO6sB,SAASpF,WAIpBhJ,EAAGuwH,gBAAkBz0I,EAAE,2CACvBkkB,EAAGwmL,kBAAoB1qM,EAAE,YACzBkkB,EAAGymL,UAAY3qM,EAAE,qCAEjBkkB,EAAG4mL,wBACH5mL,EAAG6mL,yBASLF,WAAY,SAAUjuH,GAwEpB,QAASouH,GAAMpqL,GACb,GAAI3C,GAAI,GAAI7V,UAASwY,EACrBnZ,YAAW,WACTwW,EAAEiD,MAAMzb,SACP,IA3EL,GAAIye,GAAK/iB,IAET+iB,GAAGuwH,gBAAgB74E,QACnB13C,EAAG6sH,eAEHrqI,GAAG8L,IAAIxR,KAAK,8BACViqM,SAAYruH,EAAOvtC,SACnB67J,YAAetuH,EAAOwlD,SACtB+oE,cAAiBvuH,EAAO0lD,eACvB5vH,KAAK,SAAUuvC,GAChBv7C,GAAGmE,GAAG2a,GAAKo3D,EAAOvtC,SAGlBnrB,EAAGwmL,kBAAkB3lM,KAAKk9C,EAAQwxE,QAC9BxxE,EAAQmpJ,UACVJ,EAAM/oJ,EAAQmpJ,UAChBzgM,KAAKi4C,OACF40H,uBACAC,wBACH9sK,KAAK4jD,SAAS55B,WAAWkjJ,qBAGzB3zJ,EAAGuwH,gBAAgB1vI,KAAKk9C,EAAQopJ,MAC5BppJ,EAAQqpJ,QACVN,EAAM/oJ,EAAQqpJ,QAChBpnL,EAAGitH,eAGCv0D,EAAOrqD,MACT7rB,GAAGmE,GAAG0wC,WAAWunF,iBAAiBlmD,EAAOrqD,MAG3C7rB,GAAGmE,GAAG0wC,WAAW2nF,qBAAqBtmD,EAAOvtC,UAAU,GAGvDnrB,EAAG2vF,SAASj3B,EAAO7xD,MAGnB,IAAIg2G,GAAe/gI,EAAE,iBACjBurM,EAAmB,kBACvB,IAAI3uH,EAAOwlD,SAAU,CACnB,GAAIopE,GAAcxrM,EAAE,sBACpB4yK,yBAAwB44B,GACxBzqE,EAAalgI,SAAS0qM,OAEtBxqE,GAAatgI,YAAY8qM,EAIA,SAAvB3uH,EAAOt7C,aACT56B,GAAGmE,GAAG8C,QAAQ0mB,QAAmB,UAAE5yB,OACnCiF,GAAGmE,GAAG8C,QAAQ0mB,QAAoB,WAAEjxB,QACJ,cAAvBw5E,EAAOt7C,aAEhB56B,GAAGmE,GAAG8C,QAAQ0mB,QAAoB,WAAE5yB,OACpCiF,GAAGmE,GAAG8C,QAAQ0mB,QAAmB,UAAEjxB,QACH,mBAAvBw5E,EAAOt7C,aAA2D,SAAvBs7C,EAAOt7C,aAE3D56B,GAAGmE,GAAG8C,QAAQ0mB,QAAoB,WAAE5yB,OACpCiF,GAAGmE,GAAG8C,QAAQ0mB,QAAmB,UAAE5yB,SAEnCiF,GAAGmE,GAAG8C,QAAQ0mB,QAAoB,WAAEjxB,OACpCsD,GAAGmE,GAAG8C,QAAQ0mB,QAAmB,UAAEjxB,QAIrCywC,0BACC3qB,KAAK,SAAU9W,GAChB1L,GAAGmE,GAAGylB,WAAW2f,UAAU79B,MAkB/ByhG,SAAU,SAAU9oF,GAClBtlB,OAAOY,SAAS0kB,MAAQA,CACxB,IAAIq1I,GAAcpgK,EAAE,wBACpBogK,GAAYx3J,KAAKmiB,GACjBq1I,EAAYl6J,KAAK,QAAS6kB,IAS5B0gL,SAAU,SAAU1gL,GAClB,MAAO/qB,GAAE,yBAAyB4I,QASpC8iM,YAAa,WACX,GAAIxnL,GAAK/iB,KACLuD,EAAKgC,GAAGmE,GAAGswC,OACfj3B,GAAG6sH,eACHrqI,GAAGmE,GAAG8pB,WAAWzH,SAASxa,KAAK,WAC7BhM,GAAGmE,GAAG0wC,WAAW6C,sBAAsB15C,GACvCgC,GAAGmE,GAAG0wC,WAAW2nF,qBAAqBx+H,GAAI,GAC1Cwf,EAAGitH,kBAQPy5D,gBAAiB,WAEf,IAAKp8K,QAAQjB,OAAS+E,SAASrpB,KAAKoa,cAAcjV,OAAO,eAAiB,EAAG,CAC3E,GAAImzH,GAAiBvhI,EAAE,2CACnB0E,EAAKgC,GAAGmE,GAAGswC,QACXpwB,EAAQ5pB,KAAKsqM,WAEbrpE,EAA8D,IAAnDb,EAAel8H,KAAK,oBAAoB4J,OAEnDqzH,EAAeF,GAAgD,IAApCpiI,EAAE,YAAYypC,WAAWx6B,OACpD0W,EAAM,GAAIjf,IAAGkf,IACbm9G,EAAQp9G,EAAIwX,SAAS,QAEzBz2B,IAAG8nB,QAAQusD,cACThyE,KAAM,WACNsmC,SAAU3qC,EACVqmB,MAAOA,EACPwH,KAAMwwG,EACNX,SAAUA,EACVE,aAAcA,GACbv3G,EAAOpF,EAAIpB,cAQlBonL,mBAAoB,SAAUzrL,GAE5B,GAAIjC,GAAIje,EAAE,cACN2lB,EAAM1H,EAAE/X,KAAK,SAEjBs4B,gBAAe12B,EAAE,cAEjB6d,EAAMyX,iBAAiBzX,EAAK,aAAc,aAC1CA,EAAMyX,iBAAiBzX,EAAK,OAAQ,UACpCA,EAAM0X,iBAAiB1X,EAAK,QAC5BA,EAAMyX,iBAAiBzX,EAAK,QAASzF,GACrCyF,EAAMyX,iBAAiBzX,EAAK,OAAQ,SACpCA,EAAM0X,iBAAiB1X,EAAK,OAC5BA,EAAM0X,iBAAiB1X,EAAK,WAC5BA,EAAM0X,iBAAiB1X,EAAK,YAE5B1H,EAAE/X,KAAK,SAAUyf,GACjB1H,EAAE+f,UAOJ4tK,mBAAoB,WAClB5rM,EAAEiwB,KAAKvpB,GAAG8oB,aAAa1F,KAAK,WAC1BpjB,GAAGmE,GAAG+C,QAAQ4rH,cAOlBqyE,iBAAkB,WAChB7rM,EAAEiwB,KAAKvpB,GAAG8oB,aAAa1F,KAAK,WAC1BpjB,GAAGmE,GAAG+C,QAAQimE,YAQlBk9D,aAAc,WACZ,GAAI7sH,GAAK/iB,IACT+iB,GAAGuwH,gBAAgBhzI,OACnByiB,EAAGymL,UAAUvnM,QAOf+tI,aAAc,WACZ,GAAIjtH,GAAK/iB,IACT+iB,GAAGuwH,gBAAgBrxI,OACnB8gB,EAAGymL,UAAUlpM,QAOfspM,sBAAuB,WACrB,GAAI7mL,GAAK/iB,IACTnB,GAAE,yDAAyDoE,MAAM,WAC/D8f,EAAG2nL,sBAQPf,sBAAuB,WACrB9qM,EAAE,mBAAmB2pH,YACnBC,YAAa,UACbC,YAAa,MACbC,aAAc,IACdC,aAAc,QACdC,mBAAoB,IACpBC,aAAehiF,MAAO,MAQ1B6jK,sBAAuB,WAGrB,QAASC,KACP/rM,EAAE,sBAAsBsjB,KAAK,QAAS,WACpC,GAAI0oL,GAA2BhsM,EAAE,sBAC7BisM,EAAmB,WACnBvG,EAAkBh/L,GAAGwpB,QAAQirB,QAC7BsqJ,GAAqBuG,EAAyBprM,SAASqrM,EAE3DvlM,IAAGwnB,SAASltB,KAAK,yCACfytC,SAAUi3J,EACVC,WAAYF,IACXjkK,QAAQ,SAAUpd,GACfqhL,GACFuG,EAAyBnrM,SAASorM,GAClCvlM,GAAGmE,GAAG8pB,WAAW8jH,kBAAiB,KAElCuzD,EAAyBvrM,YAAYwrM,GACrCvlM,GAAGmE,GAAG8pB,WAAW8jH,kBAAiB,IAEpC/xI,GAAGmE,GAAG8pB,WAAWkjH,kBAAkB6tD,OAKzCqG,IAEArlM,GAAGwpB,QAAQyE,WACRrR,KAAK,WAAY,SAAU+4C,EAAe+vH,GAEzC,GAAI4f,GAA2BhsM,EAAE,sBAC7BisM,EAAmB,UAEnB35K,UAASrpB,KAAKoa,cAAcjV,OAAO,eAAiB,GACtD29L,IACIrlM,GAAGmE,GAAG8pB,WAAWghH,gBACnBq2D,EAAyBnrM,SAASorM,GAElCD,EAAyBvrM,YAAYwrM,KAEvCD,EAAyBvqM,OACzBuqM,EAAyBjpK,OAAOthC,WASxCyqM,0BAA2B,WACzB,GAAIF,GAA2BhsM,EAAE,sBAC7BisM,EAAmB,UAEnB35K,UAASrpB,KAAKoa,cAAcjV,OAAO,eAAiB,EAClD1H,GAAGmE,GAAG8pB,WAAWghH,gBACnBq2D,EAAyBnrM,SAASorM,GAElCD,EAAyBvrM,YAAYwrM,IAEvCD,EAAyBvqM,OACzBuqM,EAAyBjpK,OAAOthC,WAIrCgE,OAAOkF,KAAKg9L;ACrWf,cAEA,SAAW76K,GAMTA,EAAOm9H,cACNxkJ,OAAOkF,MAEV,SAAWmiB,GAwTT,QAASq/K,KACP,GAAIx5L,GAAI3S,EAAE0nB,WACN8P,GAAW40K,GAAItkM,EAAE,MAcrB,OAZApB,IAAG8L,IAAIxR,KAAK,8CAAgD,KAAM,MAAM,GAAM,GAAM0R,KAAK,SAAU4uK,GAEjG72K,EAAEvJ,KAAKogL,EAA0B,SAAU+qB,GACzC70K,EAAO60K,GAA2BA,IAGpC15L,EAAEsW,QAAQuO,GAAQ,KAEjBtO,KAAK,WACNvW,EAAEsW,QAAQuO,GAAQ,KAGb7kB,EAjUTma,EAAOw/K,WAAa,SAAUriD,GAC5BvjJ,GAAGmE,GAAGslB,QAAQk2G,YAAY,KAC1B8lE,IAA+Bz5L,KAAK,SAAU65L,EAAsBC,GAClE,GAAIC,IAAyBD,EAEzBE,EAAc,GACdC,EAAqB,GACrB7mC,GAAW,CAIf,IAFA7b,EAAYjqJ,EAAEswI,QAAQ2Z,GAAaA,EAAYvjJ,GAAGmE,GAAG8pB,WAAW6lB,mBAE5DyvG,EAAUh7I,OAAS,EACrB,GAA2B,gBAAhBg7I,GAAU,GAAgB,CACnC,GAAI2iD,GACFniM,EAAEqxB,OAAOmuH,EAAW,SAAUjiJ,GAAQ,MAAOA,GAAKe,MAAQwI,YAAYC,WACxEy4I,GAAYx/I,EAAEgT,IAAImvL,EAAmB,SAAU5kM,GAAQ,OAAStD,GAAIsD,EAAKtD,GAAI0G,KAAMpD,EAAKoD,QACxFshM,EAAcE,EAAkB39L,OAAS,EAAI29L,EAAkB,GAAGxhM,KAAO,OAAS,OAC7E,IAA2B,gBAAhB6+I,GAAU,GAC1B,KAAMniJ,GAAE,mDAKZ,IAAwB,GAApBmiJ,EAAUh7I,OAGZ,WADAutK,WAAUvyB,EAAU,IAAIx9G,QAI1B,IAAIogK,IACF7qJ,UAAWv3C,EAAEgT,IAAIwsI,EAAW,SAAU0uC,GACpC,OAAStX,WAAYsX,EAAIj0L,GAAI+7C,cAAe,OAAQg0H,MAAM,KAE5Dq4B,gBAAgB,EAChBC,WAAW,GAGTC,EAAuB,MACvBC,EAAoB,MACpBC,EAAoB,OACpBC,EAAc,GAAIzmM,IAAGygB,IAAIsD,MAAMC,YAAY,aAE/CyiL,GAAY3/E,SAAS,mCAAoC,KAAM,KAAM,KAAMk/E,GAE3ES,EAAYz9E,QAAQ,kCAAmC68E,GAEvDY,EAAYz+E,gBAAgB,uBAC1B1qD,KAAQ,2BACRopI,WAAc,kCACdC,IAAO,2BACN,KAAM,QACTF,EAAYz+E,gBAAgB,oBAC1B6mD,KAAQ,uBACR+3B,OAAU,+BACVD,IAAO,wBACN,KAAM,UAETF,EAAY/8E,YAAY,sCAAsC,GAC9D+8E,EAAY/8E,YAAY,wCAAwC,EAEhE,IAAItiH,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQ6D,UAChChd,GAAOkd,QAAQmiL,EAAYnoM,UAC3B8I,EAAOid,MAAQjjB,EAAE,qBACjBgG,EAAOw0C,gBAAiB,EACxBx0C,EAAOmlC,oBAAqB,EAE5B1jC,IAAIo/F,SAAS,eAEb7gG,EAAOwV,KAAK,SAAU,WAChBmpL,GACFU,EAAYliI,QAAQ,mCAEtBjrE,EAAE,YAAY03B,SAIhB,IAAI61K,GAAmB,SAAUhlM,GAC/B,GAAIuF,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,WAC5BokK,EAAwB/iM,EAAEqxB,OAAOvzB,EAAI6gB,OAAOqkL,0BAA2B,SAAU96L,GAAK,OAAQA,EAAE+rB,UAEhGo7C,EAAWrvE,EAAEgT,IAAI+vL,EAAuB,SAAUE,GACpD,GAAIC,GAAkBljM,EAAEzH,MAAMyH,EAAEqxB,OAAOmuH,EAAW,SAAUt3I,GAAK,MAAOA,GAAEjO,IAAMgpM,EAAUrsB,aAC1F,OAAOxyK,QAAO,4DACZ/G,EAAE,aACD,GAAK6lM,EAAgBviM,MAAMkU,aAC5BouL,EAAUtkL,OACV,GAAK1iB,IAAG6e,KAAKooL,EAAgBjpM,GAAI6M,YAAYC,WAAY6T,QAAQd,aAGrE,IAAIipL,EAAsBv+L,QAAU,EAC9B1G,EAAIm2B,SACN5wB,EAAOs0G,SAASt6G,EAAE,iCAEf,CACL,GAAIqsB,GAAU,GAAIztB,IAAGygB,IAAIsD,MAAMC,YAAY,gBAC3CyJ,GAAQ6xF,eAAetsG,YAAYE,UACnCua,EAAQi6F,aAAa,6DAA8D,OAASt0C,EAAS1mE,KAAK,IAAM,SAChH+gB,EAAQq+D,cAAc9/E,KAAK,SAAU5R,IAC9ByH,EAAIm2B,SAAWn2B,EAAI8kC,QACtBv/B,EAAOmiC,UAAUnoC,EAAE,qBAAsBhH,GAEzCgN,EAAOs0G,SAASt6G,EAAE,4BAA6BhH,OAOnD8sM,EAAkB,SAAUf,EAAgBH,EAAaC,GAC3DjmM,GAAGwnB,SAASltB,KAAK,2CACf6sM,SAAUhB,EACViB,YAAapB,EACbqB,mBAAoBpB,GACnB,KAAM,MAAM,GAAM,GAClBnrK,QAAQ,SAAUj5B,EAAKylM,GACtBT,EAAiBS,GAEZA,EAAK3gK,SACR5nC,OAAOq7B,KAAK,wCAA0Cv4B,EAAI6gB,UAC3DsI,MAAM,SAAUnpB,EAAKylM,GAClBA,GAAQA,EAAK5kL,QACfmkL,EAAiBS,IAEfA,EAAK5kL,OAAOsV,SAAWj0B,EAAE8kD,IAAIy+I,EAAK5kL,OAAOqkL,0BAA2B,SAAUt6L,GAAK,MAAOA,GAAEurB,YAC9Fj5B,OAAOq7B,KAAK,wCAA0CktK,EAAK5kL,OAAOA,UAK1Etb,GAAO7J,GAAK,WACVyoM,EAAcS,EAAYvyK,SAAS,oCACnC+xK,EAAqBQ,EAAYvyK,SAAS,mCAC1CkrI,EAAWqnC,EAAYvyK,SAAS,oBAEhCiyK,EAAeE,UAAYI,EAAYvyK,SAAS,sCAChDiyK,EAAeoB,4BAA8Bd,EAAYvyK,SAAS,uCAElE,IAAIszK,GAAkBf,EAAYvyK,SAAS,sBAE3C,IAAIszK,GAAmBlB,GAAwBlnC,GAAYmnC,EAAmB,CAC5E,GAAIiB,GAAmBlB,EAAsB,CAC3C,GAAI5xK,GAAW3wB,EAAEgT,IAAIovL,EAAe7qJ,UAAW,SAAU1yC,GACvD,OACE+xK,WAAY/xK,EAAE+xK,WACd5gI,cAAeytJ,EACfz5B,KAAM3O,GAAYonC,IAGtBxmM,IAAGwnB,SAASzb,SAAS,uCACnB07L,2BAA4B/yK,IAE3BoG,QAAQ,SAAUj5B,GACjB,IAAK,GAAI4K,GAAI,EAAGA,EAAI5K,EAAI0G,OAAQkE,IAC9B,IAAK,GAAIR,GAAI,EAAGA,EAAIk6L,EAAe7qJ,UAAU/yC,OAAQ0D,IAC/Ck6L,EAAe7qJ,UAAUrvC,GAAG0uK,YAAc94K,EAAI4K,GAAGkuK,aACnDwrB,EAAe7qJ,UAAUrvC,GAAG8tC,cAAgBl4C,EAAI4K,GAAGstC,iBAM1D/uB,MAAM,SAAUnpB,GAAOs2B,UAAUt2B,SAEpCskM,GAAe7qJ,UAAYv3C,EAAEgT,IAAIovL,EAAe7qJ,UAAW,SAAUosJ,GACnE,OACE/sB,WAAY+sB,EAAW/sB,WACvB5gI,cAAe,EACfg0H,KAAM25B,EAAW35B,OA2EvB,KAAK,GAnED45B,GAA2B,SAAU1V,EAAK2V,GAC5C,GAAIpoI,GAAWlmE,EAAE0nB,WACbmgJ,EAASp9J,EAAEqxB,OAAO+wK,EAAe7qJ,UAAW,SAAUusJ,GAAW,MAAO5V,GAAIj0L,IAAM6pM,EAAQltB,aAAc,GAAG5gI,aA4C/G,OA1CAikH,iBAAgB,UACd35I,MAAOlc,OAAO,WAAY/G,EAAE,2BAA4B6wL,EAAIvtL,MAC5D4nC,OAAQlrC,EAAE,UACV69J,UAAW,WACT9uH,8BAA8B,UAC9BtnC,IAAIo/F,SAAS,eAEf3uE,MAAO,WACLyiI,oBACAlzJ,IAAIo/F,SAAS,WAEf1qG,GAAI,WACF,GAGIuqM,GAHAt7F,EAAQlzG,EAAE,iBACVyuM,EAAcv7F,EAAM7tG,KAAK,+BACzBs5C,EAAU8vJ,EAAYr5L,KAU1B,OANEo5L,GADEE,EACgD,GAAtCx7F,EAAM7tG,KAAK,iBAAiB4J,OAE5B62J,IAAaonC,EAE3BhnI,EAASj9C,SAAUo4J,WAAYsX,EAAIj0L,GAAI+7C,cAAe9B,EAAS81H,KAAM+5B,IAE9DF,GAETxoM,OAAQ,WAGN,MAFAogE,GAASj9C,QAAQ0vK,EAAIj0L,IAEd4pM,GAETv/L,QACE42B,OAAQgzJ,EAAIj0L,GACZ6iK,SAAUmnC,EACV7hK,UAAWg7H,EACXpkD,KAAM,OACN+jD,UAAU,EACVC,qBAAqB,EACrBC,WAAW,KAIRxhG,EAAS58C,WAGdolL,EAAU5oC,GAAYmnC,EACtB0B,EAAkBN,EAAyBpkD,EAAU,GAAyB,IAArBA,EAAUh7I,QAEnE2/L,EAAuB,SAAUC,GACnC,IAAK,GAAIl8L,GAAI,EAAGA,EAAIk6L,EAAe7qJ,UAAU/yC,OAAQ0D,IACnD,GAAIk6L,EAAe7qJ,UAAUrvC,GAAG0uK,YAAcwtB,EAAYxtB,WAAY,CACpEwrB,EAAe7qJ,UAAUrvC,GAAG8tC,cAAgBouJ,EAAYpuJ,cACxDosJ,EAAe7qJ,UAAUrvC,GAAG8hK,KAAOo6B,EAAYp6B,IAC/C,SAIFq6B,EAA8B,SAAU7qH,GAC1C4oH,EAAe7qJ,UAAYv3C,EAAE4e,OAAOwjL,EAAe7qJ,UAAW,SAAU22I,GACtE,MAAOA,GAAItX,YAAcp9F,KAIpB7lE,EAAI,EAAGA,EAAI6rI,EAAUh7I,OAAQmP,KACpC,SAAWu6K,EAAK2V,GACdK,EAAkBA,EAAgB7kL,KAAK,SAAU+kL,GAM/C,MALIpkM,GAAEqsI,SAAS+3D,GACbD,EAAqBC,GAErBC,EAA4BD,GAEvBR,EAAyB1V,EAAK2V,MAEtCrkD,EAAU7rI,GAAI6rI,EAAUh7I,SAAWmP,EAAI,EAG5CuwL,GAAgB7kL,KAAK,SAAU+kL,GACzBpkM,EAAEqsI,SAAS+3D,GACbD,EAAqBC,GAErBC,EAA4BD,GAE9BjB,EAAgBf,EAAgBH,EAAaC,SAI/CE,GAAe7qJ,UAAYv3C,EAAEgT,IAAIovL,EAAe7qJ,UAAW,SAAU5mB,GAGnE,MAFAA,GAASq5I,KAAO3O,IAAaonC,EAC7B9xK,EAASqlB,cAAgBytJ,EAClB9yK,IAETwyK,EAAgBf,EAAgBH,EAAaC,IAIjD7+L,EAAO1K,OAEPsD,GAAGwnB,SAASltB,KAAK,6BACf+tM,aAAc,uBACbvtK,QAAQ,SAAUj5B,GACnB,GAAIymM,IACFviK,OAAQ/Q,KAAKC,MAAMpzB,GAErB2rK,+BAA8B86B,GAC9Bn4J,8BAA8B,WAIhC,IAAIwwH,GAAoCrnK,EAAE,yCACtCsnK,EAAetnK,EAAE,sCACrBsnK,GAAarlK,GAAG,SAAU,WACnBjC,EAAEmB,MAAMqsC,KAAK,YACZ65H,EAAkC75H,KAAK,YACzC65H,EAAkC75H,KAAK,WAAW,KAExD65H,EAAkCplK,GAAG,SAAU,WACzCjC,EAAEmB,MAAMqsC,KAAK,aACV85H,EAAa95H,KAAK,YACrB85H,EAAa95H,KAAK,WAAW,MAGnC9mC,GAAGmE,GAAGslB,QAAQ1uB,UA4BlBqrB,EAAOqrJ,oBAAsB,WAC3B,GAAI2uB,IAAe,OAAQ,gBAGvBC,GAAyB,CAC7B,IAAIrgM,GAAGmE,GAAGgD,MAAQnH,GAAGmE,GAAGgD,KAAK+a,UAC3Bje,KAAKqtK,MAAMC,gCAAgC6uB,OAE3C,QAAQpgM,GAAGmE,GAAG+C,QAAQ0mB,KAAKpE,QAAQ9kB,MACjC,IAAK,cACHpL,EAAE,mBAAmBqF,KAAK,uBAAuBoyB,IAAI,oBAAoBgd,OAAO,WAC9E9pC,KAAKqtK,MAAMgvB,0BAA0BF,GAChCC,IACHp8L,KAAKqtK,MAAMivB,kCACXF,GAAyB,IAG7B,MACF,KAAK,aACH/mM,EAAE,oBAAoBqF,KAAK,wBAAwBovC,OAAO,WACxDz0C,EAAE,WAAWupD,QAAQ,kBAEvBvpD,EAAE,WAAWiC,GAAG,eAAgB,WAC9B0I,KAAKqtK,MAAMgvB,0BAA0BF,GAChCC,IACHp8L,KAAKqtK,MAAMivB,kCACXF,GAAyB,QAQpCthM,OAAOkF,KAAKs/I;AC5Xf,cAEA,SAAWn9H,GAMTA,EAAOk9H,SACNvkJ,OAAOkF,MAEV,SAAWmiB,GAMTA,EAAOmiL,iBAAmB,SAAUvsM,GAClC,GAAIsnJ,GAAOv/I,EAAEqxB,OAAOp5B,EAAO,SAAU6C,GAAK,MAAOA,GAAEwD,OAASwI,YAAYI,MACpEu9L,EAASzkM,EAAEgT,IAAIusI,EAAM,SAAUzkJ,GAAK,MAAOA,GAAEb,KAC7CyqM,EAAa1kM,EAAEqxB,OAAOkuH,EAAM,SAAUn9F,GAAO,MAAOA,GAAI2nF,aACxD46D,EAAaD,EAAWlgM,OAAS,CAErCvI,IAAGwnB,SAASltB,KAAK,4BAA8BquM,UAAWH,EAAQrvB,WAAYuvB,IAAc5tK,QAAQ,SAAUj5B,GAC5G,GAAI8zB,IAAS8yK,EAAWlgM,MAEnBmgM,KACH/yK,EAAQ2tH,EAAK/6I,QAGfjP,EAAEkB,KAAK8oJ,EAAM,SAAUthJ,EAAGmkD,GACpBuiJ,EACFviJ,EAAIynF,oBAEJznF,EAAI0nF,mBAIRymB,wBAAwB3+H,KACvB3K,MAAM,SAAUnpB,IACjB,GAAK7B,IAAGygB,IAAIF,QAAQmiB,YAAc6G,UAAU1nC,OAG/C9C,OAAOkF,KAAKq/I;AC3Cf,cAEA,SAAWl9H,GACT,GAAIwiL,IAQFr2J,UAAW,WAET,MADA93C,MAAK6lC,gBAAgB,OAAQ,IAAMuoK,UAAa9pM,OAAO+pM,iBAAmB,KACnEruM,MAUTqjL,aAAc,WACZ,GAAItgK,GAAK/iB,KACLwR,EAAI3S,EAAE0nB,UACVhE,KAAIqQ,KAAK,QAAS,mCAClB,IACIhlB,IACF0gM,aAAgB5/L,mBAAmBO,MAAM,KAAK,GAC9CuvE,SAAY+vH,OAAO11J,KACnB21J,eAAkBphC,QAClBqhC,OAAUxpJ,UACVypJ,UAA4C,SAA9BxpM,SAASisB,SAASgrF,SAAsB,IAAM,IAC5DwyF,KAAQzpM,SAASisB,SAASwkD,KAC1Bi5H,cAAiB76C,gBACjB7gF,kBAAkD,mBAAtBA,mBAAoCA,kBAAoB,IACpF09F,iBAAoBi+B,uBACpBC,yBAA4B,GAC5BC,eAA8C,MAA3BlwM,EAAE4yB,OAAO,eAAyB,GAAK5yB,EAAE4yB,OAAO,eAkBrE,OAfAlsB,IAAG8L,IAAIxR,KAAK,8BAAgCk1K,UAAWh0J,gBAAgBM,mBAAoB9P,KAAK,SAAUq0B,GACxGh4B,EAAiC,yBAAIg4B,EAGrC7iB,EAAG8iB,gBAAgB,eAAgB,GAAIj4B,GAAQ2D,KAAK,SAAUnK,GAC5DoK,EAAEsW,QAAQ1gB,KACT2gB,KAAK,SAAU3gB,GACVA,GACJmb,IAAIgO,MAAM,QAAS,mCAAqCnpB,EAAIqpB,SAE9Djf,EAAE0W,OAAO9gB,OAKNoK,EAAE2W,WAUX2J,WAAY,WACV,GACI7K,IADQjnB,KAAKgvM,OACF,IACXphM,IASJ,OANA5N,MAAK6lC,gBAAgB,aAAc,GAAIj4B,GAAQma,KAAK,SAAU3gB,GACtDA,GACJmb,IAAIgO,MAAM,QAAS,iCAAmCnpB,EAAIqpB,WAIvDxJ,GAWTi4J,YAAa,SAAU+vB,GAErB,MADAjvM,MAAK6lC,gBAAgB,cAAe,IAAMqpK,SAAYD,IAC/CjvM,MAKXsE,QAAO6pM,aAAeA,GACrB7pM,OAAOumB;AClGV,cASA,SAAWc,GACT,GAAIwjL,GAAQztL,WAAWjgB,QAAQ0sM,eAC7BiB,qBAGA7uM,KAAM,WACJP,KAAKovM,sBAUPnnM,WAAY,WACV,GAAIonM,GAAkB9pM,GAAGmnB,MAAMsvB,QAAQ,mBAEvC,OADAn9C,GAAE4yB,OAAO,kBAAmB49K,GAAmBz3J,QAAS,OAC7B,MAApBy3J,GAWTvlI,QAAS,WAIP,MAHAvnD,KAAIoQ,QAAQ,QAAS,8BACrBptB,GAAGmnB,MAAMmuB,QAAQ,mBAAoB,KACrCh8C,EAAE4yB,OAAO,kBAAmB,KAAOmmB,QAAS,OACrC53C,MAWT+pE,OAAQ,WAIN,MAHAxnD,KAAIqQ,KAAK,QAAS,6BAClBrtB,GAAGmnB,MAAMmuB,QAAQ,mBAAoB,KACrCh8C,EAAE4yB,OAAO,kBAAmB,KAAOmmB,QAAS,OACrC53C,MAWTglL,gBAAiB,WACf,MAAgD,QAAzCz/K,GAAGmnB,MAAMsvB,QAAQ,qBAe1B1K,YAAa,WACX,MAAOtxC,MAAKyiL,0BAA4BziL,KAAKiI,cAe/Cw6K,sBAAuB,WACrB,GAAI6sB,GAAQ/pM,GAAGC,IAAI+pM,GAAGrtL,cAAcjV,OAAO,QAAU,EACjDuiM,EAAkC,eAAnBjqM,GAAGC,IAAIuoB,GAAG9jB,IAC7B,SAAQ1E,GAAGC,IAAIC,aAAgBF,GAAGC,IAAIwoB,SAAYshL,GAAUE,IAY9D99K,qBAAsB,WACpB,MAAiD,MAA1C7yB,EAAE4yB,OAAO,8BAYlB6xJ,sBAAuB,SAAUvkK,GAG/B,MAFAwD,KAAIqQ,KAAK,QAAS,wDAA0D7T,GAC5ElgB,EAAE4yB,OAAO,4BAA6B1S,EAAQ,IAAM,KAC7C/e,MAWTyvM,WAAY,WACVltL,IAAIozB,MAAM,QAAS,2CACnBpzB,IAAIozB,MAAM,QAAS,uBAAyBsvI,kBAC5C1iK,IAAIozB,MAAM,QAAS,eAAiBpwC,GAAGkoB,MAAMxlB,cAC7Csa,IAAIozB,MAAM,QAAS,yBAA2BpwC,GAAGkoB,MAAMiE,wBACvDnP,IAAIozB,MAAM,QAAS,2CAgBrBhkB,kBAAmB,SAAUmB,GAC3B,GAAIthB,GAAI3S,EAAE0nB,WAENxD,EAAK/iB,KACL4N,GACF3D,KAAQ6oB,EAGV,OAAgD,mBAArC/P,GAAGqsL,kBAAkBt8K,IAC9BthB,EAAEsW,QAAQ/E,EAAGqsL,kBAAkBt8K,IACxBthB,EAAE2W,YAIPpF,EAAGuuB,cACLvuB,EAAG8iB,gBAAgB,oBAAqB,GAAIj4B,GACzC2D,KAAK,SAAU0V,GACd,GAAIyoL,GAAqC,SAApBzoL,EAAShE,MAC9BF,GAAGqsL,kBAAkBt8K,GAAc48K,EACnCl+L,EAAEsW,QAAQ4nL,KAEX3nL,KAAK,SAAUd,GACdlE,EAAGqsL,kBAAkBt8K,IAAc,EACnCthB,EAAE0W,QAAO,MAGbnF,EAAGqsL,kBAAkBt8K,IAAc,EACnCthB,EAAE0W,QAAO,IAGJ1W,EAAE2W,YAqBX0d,gBAAiB,SAAU88I,EAAa7vJ,EAAYllB,EAAQgrB,GAC1D,GAAI7V,GAAK/iB,KAELwR,EAAI3S,EAAE0nB,UAiBV,OAfAhE,KAAIqQ,KAAK,QAAS,6BAA+B+vJ,EAAc,gBAE3D5/J,EAAG9a,eACLsa,IAAIqQ,KAAK,QAAS,kBAClBphB,EAAE0W,QAASuI,QAAS,KAAM4P,SAAS,KAGrC1U,EAAO8B,MAAMkiL,UAAU9pK,gBAAgB88I,EAAa7vJ,EAAYllB,EAAQgrB,GAAahH,OAAO,SAAUg+K,GACpGrtL,IAAIqQ,KAAK,QAAS,yCAA2C+vJ,EAAc,MAAO9jL,EAAEwkB,OAAOusL,MAC1Fr+L,KAAK,SAAUq+L,GAChBp+L,EAAEsW,QAAQ8nL,KACT7nL,KAAK,SAAU6nL,GAChBp+L,EAAE0W,OAAO0nL,KAGJp+L,EAAE2W,WAWX0nL,oBAAqB,WACnB,GAAI9sL,GAAK/iB,IA6CT,OA3CM+iB,GAAG+sL,4BAA4B7pM,aAAa8c,EAAG+sL,4BACrD/sL,EAAG+sL,2BAA6BxpM,WAAW,WAEzC,GAAIypM,IAA0B,EAE1BC,EAAwB,WACrBD,IACHxqM,GAAGkoB,MAAMq8C,UACTxlE,OAAO6sB,SAASpF,WAIhBva,EAAI,GAAIjM,IAAGygB,IAAIF,QAAQmiB,UAC3Bz2B,GAAEjO,GAAK,WAEPiO,EAAEvQ,MAAQ,IACVuQ,EAAE02B,gBAAgB,WAkBhB,MAjBA12B,GAAEiuC,cAAc,mBAChBjuC,EAAE2d,WAAWkU,YAAY18B,EAAE,wBAC3B9H,EAAE,YAAYqF,KAAK,QAAQR,KAAM2B,WAAc,8BAE/CsmB,EAAO8B,MAAMkiL,UAAUM,aAAa,KAAO1+L,KAAK,WAC9CgR,IAAIqQ,KAAK,QAAS,8BAElBm9K,GAA0B,EAC1Bv+L,EAAEqtB,UACD9W,KAAK,SAAUwuC,GAChBh0C,IAAIqQ,KAAK,QAAS,gCAElBphB,EAAEkxC,aAAa,mBAEflxC,EAAE2d,WAAWltB,KAAK0E,EAAE,gCAGf,GACNqpM,GACHx+L,EAAEqgC,OAASlrC,EAAE,cACb6K,EAAE4vC,WAAaz6C,EAAE,0BACjB6K,EAAEvP,KAAK0E,EAAE,gCAAiCA,EAAE,gDAAiDA,EAAE,SAAU,QAAS,KAAMqpM,GAExHztL,IAAIqQ,KAAK,QAAS,6BAEjB,KACI5yB,MAIT8vM,2BAA4B,KAU5BI,wCAAyC,WACvC,GACI1+L,GAAI,GAAIjM,IAAGygB,IAAIF,QAAQmiB,UAC3Bz2B,GAAEjO,GAAK,sBACPiO,EAAE4pE,kBAAmB,EACrB5pE,EAAEqgC,OAASlrC,EAAE,0BACb6K,EAAEvP,KAAK0E,EAAE,4CAA6CA,EAAE,4DAA6DA,EAAE,SAAU,QAAS,KAAM,WAC9IpB,GAAGkoB,MAAMq8C,UACTxlE,OAAO6sB,SAASpF,WAElBxJ,IAAIqQ,KAAK,QAAS,iDAUpBu9K,kBAAmB,WAMjB,MAJA5tL,KAAIqQ,KAAK,QAAS,6CAClBrtB,GAAGkoB,MAAMrD,OAAM,GAAM7Y,KAAK,SAAmB6+L,GAC3CC,oBAEKrwM,MAYToqB,MAAO,SAAUglF,GAEf,MADApvG,MAAKovM,qBACEzjL,EAAO8B,MAAMkiL,UAAUvlL,MAAMglF,IAWtC7pE,KAAM,WAGJ,MAFAvlC,MAAKovM,qBACLzjL,EAAO8B,MAAMkiL,UAAUpqK,OAChB5Z,EAAO8B,OAUhBs2J,QAAS,WAEP,MADA/jL,MAAKovM,qBACEzjL,EAAO8B,MAAMkiL,UAAU5rB,WAWhCS,YAAa,WAGX,MAFAxkL,MAAKovM,qBACLzjL,EAAO8B,MAAMkiL,UAAUnrB,cAChBxkL,MASTmrJ,SAAU,SAAUmlD,GAClB,GAAItnL,GAAMnqB,EAAE0nB,UAEZ,KAAK+pL,EAAa,CAChB,GAAIniL,GAAW5oB,GAAGC,IAAI2oB,SAClBJ,EAAKxoB,GAAGC,IAAIuoB,GAAG9jB,KAAKiY,aAIpBouL,GAFa,UAAbniL,EACS,SAAPJ,GAAwB,WAAPA,GAA0B,WAAPA,EACxBI,EAAW,OAEXA,EAAW,OAGbA,EAWlB,MAPIoiL,kBAAiBD,IACnBhsM,OAAOq7B,KAAK,kCAAoC4wK,iBAAiBD,IACjEtnL,EAAIlB,QAAQwoL,IAEZtnL,EAAId,SAGCc,GAWT45J,kBAAmB,SAAU4tB,GAE3B,MADAA,GAAyC,oBAAlBA,GAAiCA,EAAgB,EACjExwM,KAAKywM,uBAAuB5xM,EAAE0nB,WAAY,EAAGiqL,IAItDC,uBAAwB,SAAUznL,EAAK0nL,EAAcC,GACnD,GAAI5tL,GAAK/iB,IAuBT,OArBA+iB,GAAG8iB,gBAAgB,+BAAgC,IAAMuoK,UAAa9pM,OAAO+pM,iBAAmB,KAAM98L,KAAK,SAAUq/L,GACvF,eAAxBA,EAAa3tL,QACfV,IAAIqQ,KAAK,QAAS,4CAClB5J,EAAIlB,SAAQ,IACqB,kBAAxB8oL,EAAa3tL,SACtBV,IAAIqQ,KAAK,QAAS,0CAClB5J,EAAIlB,SAAQ,GACZviB,GAAGkoB,MAAMyiL,6CAEVnoL,KAAK,SAAU6oL,GACY,2BAAxBA,EAAa3tL,OACf+F,EAAId,QAAO,GAEPwoL,EAAeC,EACjB5tL,EAAG0tL,uBAAuBznL,EAAK0nL,EAAe,GAE9C1nL,EAAId,WAKHc,GASTksJ,iBAAkB,WAChBl1K,KAAKovM,sBAQPxqB,WAAY,WACV,GAAI7hK,GAAK/iB,KACLwR,EAAI3S,EAAE0nB,WAEN3Y,GACF8gM,UAA6C,UAA/BxpM,SAASisB,SAASgrF,SAAuB,IAAM,IAC7DwyF,KAAQzpM,SAASisB,SAASwkD,KAC1Bo5H,eAA8C,MAA3BlwM,EAAE4yB,OAAO,eAAyB,GAAK5yB,EAAE4yB,OAAO,eAkBrE,OAdAlsB,IAAG8L,IAAIxR,KAAK,8BAAgCk1K,UAAWh0J,gBAAgBU,cAAelQ,KAAK,SAAUq0B,GACjGh4B,EAAc,MAAIg4B,EAElB7iB,EAAG8iB,gBAAgB,UAAW,GAAIj4B,GAAQ2D,KAAK,SAAU0V,GACnDA,EAASoZ,WAAY,EACnB7uB,EAAEsW,QAAQb,GAEVzV,EAAE0W,OAAOjB,KAEdc,KAAK,SAAUd,GACdzV,EAAE0W,OAAOjB,OAIVzV,EAAE2W,YAIbwD,GAAO8B,MAAQ,GAAI0hL,GACnBxjL,EAAO8B,MAAM0hL,MAAQA,GACpB7qM,OAAOumB;AC9fV,cAQA,SAAWc,GACT,GAAIgkL,IACFkB,UAAWhyM,EAAE0nB,WAQbuqL,SAAU,WACR,MAAOnlL,GAAO8B,MAAMkiL,UAAUoB,MAYhCC,aAAc,SAAU5hG,GACtB,MAAOpvG,MAAK8wM,YAWd1mL,MAAO,SAAUglF,GAEf,MADA7sF,KAAIqQ,KAAK,QAAS,4BACX5yB,KAAKgxM,aAAa5hG,GAAWhlF,SAItC6lL,aAAc,SAAU30I,GACtB,MAAOt7D,MAAKgxM,eAAef,aAAa30I,IAG1CkpH,YAAa,WAEX,MADAxkL,MAAKgxM,eAAexsB,cACbxkL,MAITulC,KAAM,WAEJ,MADAvlC,MAAKgxM,eAAezrK,OACbvlC,MAIT+jL,QAAS,WACP,MAAO/jL,MAAKgxM,eAAejtB,WAiB7Bl+I,gBAAiB,SAAU88I,EAAa7vJ,EAAYllB,EAAQgrB,GAC1D,MAAO54B,MAAKgxM,eAAenrK,gBAAgB88I,EAAa7vJ,EAAYllB,EAAQgrB,IAKhFjN,GAAO8B,MAAMkiL,UAAYA,EACzB9wM,EAAEiwB,KAAK6gL,EAAUkB,WAAWloL,KAAK,WAC/BpjB,GAAG+oB,UAAUxG,aAGdxjB,OAAOumB;AC9FV,cAQA,SAAWc,GACT,GAAIslL,GAAgBvvL,WAAWjgB,QAC7ByR,UAAW,gBACXjJ,KAAM,OAENinM,aAAa,EAEb3wM,KAAM,WACJP,KAAK8jB,UAgBPjkB,KAAM,SAAU8iL,EAAa7vJ,EAAYllB,KAWzCm2K,QAAS,WAEP,MADA/jL,MAAKkxM,aAAc,EACZlxM,MAWToqB,MAAO,WAEL,MADApqB,MAAKkxM,aAAc,EACZlxM,MAWTiwM,aAAc,SAAU30I,GACtB,GAAIv4C,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,WAEX4qL,EAAY,EACe,oBAApB9C,mBACT8C,EAAY9C,iBAGd/yI,EAAUA,GAAW,GAErB,IAAI81I,GAAYvyM,EAAEkiC,MACdswK,EAA+B,WAEjC,GAAItuL,EAAGmuL,YAEL,MADAjuL,GAAOiF,OAAO,YACPjF,CAIT,IAAImJ,GAAQnJ,EAAOmJ,OACnB,IAAc,aAAVA,GAAkC,aAAVA,EAI5B,MAAIvtB,GAAEkiC,MAAQqwK,EAAY91I,GACxBr4C,EAAOiF,OAAO,WACPjF,IAGT3c,WAAW,WACT,GAAIsH,IACFgtD,OAAQ,+BACRwzI,UAAW+C,EAEbpuL,GAAGuuL,MAAM1jM,GAAQ2D,KAAK,SAAUimL,EAAK58H,EAAQuY,GAC3C,GAAIlsD,GAAWksD,EAAI2H,aACf80H,EAAU/wM,EAAEsoB,UAAUF,EAoB1B,OAlBI2oL,GAAQvvK,WAAY,EACC,eAAnBuvK,EAAQ3sL,QACVV,IAAIqQ,KAAK,QAAS,4CAClB3P,EAAO6E,SAAQ,IACa,kBAAnB8nL,EAAQ3sL,SACjBV,IAAIqQ,KAAK,QAAS,0CAClB3P,EAAO6E,SAAQ,GACfviB,GAAGkoB,MAAMyiL,2CAGW,4BAAlBN,EAAQ3sL,OAEVA,EAAOiF,OAAO,YAEdmpL,IAIGpuL,IACN8E,KAAK,WACNspL,OAED,KAEIpuL,GAOT,OAJA3c,YAAW,WACT+qM,KACC,KAEIpuL,GAiBT4iB,gBAAiB,SAAU88I,EAAa7vJ,EAAYllB,EAAQgrB,GAC1D,GAEIpnB,GAAI3S,EAAE0nB,WAEN4qL,EAAY,EACe,oBAApB9C,mBACT8C,EAAY9C,gBACYlvL,QAApBvR,EAAOwgM,YAAwBxgM,EAAkB,UAAIujM,GAAa,IAIxE,KAAK,GAAIl0L,KAAKrP,GACZA,EAAOqP,GAAK,GAAKrP,EAAOqP,EAmD1B,OAhDAjd,MAAKH,KAAK8iL,EAAa7vJ,EAAYllB,EAAQgrB,GAAarnB,KAAK,SAAU0V,GACrE,GAAI2oL,EAEJ,KAAK3oL,EAEH,WADAzV,GAAE0W,QAASuI,QAAS,eAAgB4P,SAAS,GAG/C,IAAiB,OAAbpZ,EAEF,WADAzV,GAAEsW,SAAU2I,QAAS,KAAM4P,SAAS,GAItC,IAAiB,SAAbpZ,EAEF,WADAzV,GAAEsW,SAAU7E,OAAQ,OAAQod,SAAS,GAIvC,IAAiB,UAAbpZ,EAEF,WADAzV,GAAEsW,SAAU7E,OAAQ,QAASod,SAAS,GAIxC,IAAiB,SAAbpZ,EAEF,WADAzV,GAAEsW,SAAU2I,QAAS,OAAQ4P,SAAS,GAGxC,KACEuvK,EAAU/wM,EAAEsoB,UAAUF,EACtB,KACE2oL,EAAQ3sL,OAASpkB,EAAEsoB,UAAUyoL,EAAQ3sL,OAAO/U,QAAQ,KAAM,MAC1D,MAAO5E,IAEJsmM,EAAQvvK,SACX7uB,EAAE0W,OAAO0nL,GACXp+L,EAAEsW,QAAQ8nL,GACV,MAAOxrM,GACPme,IAAIgO,MAAMnsB,EAAEqsB,SACR5xB,EAAEuzB,cAAcw9K,IAAY,WAAaA,GAC3ClyK,UAAUkyK,EAAQn/K,SAElBiN,UAAUzW,GAEZzV,EAAE0W,OAAO,SAEVH,KAAK,SAAUd,GAChBzV,EAAE0W,QAASuI,QAAS,2BAA4B4P,SAAS,MAGpD7uB,EAAE2W,WASXq8J,YAAa,WACXxkL,KAAKkxM,aAAc,IAIvBvlL,GAAO8B,MAAMkiL,UAAUsB,cAAgBA,GAEtC3sM,OAAOumB;AC5OV,cAQA,SAAWc,GACT,GAAIolL,GAAOplL,EAAO8B,MAAMkiL,UAAUsB,cAAcxvM,QAC9CyR,UAAW,OACXjJ,KAAM,OAGN1J,KAAM,WACJP,KAAK8jB,UAaPsG,MAAO,WACL,GAAIrH,GAAK/iB,IAGT,OAFA+iB,GAAGe,SAEIf,EAAGwuL,KAAKxuL,EAAGyuL,kBAcpBztB,QAAS,WACP,GAAIhhK,GAAK/iB,IAET,OADA+iB,GAAGe,SACIf,EAAGwuL,KAAK,WAAaxuL,EAAGyuL,kBAUjCA,cAAe,WACb,MAA+B,mBAApBnD,iBACFA,gBAEF,IAQTkD,KAAM,SAAUp/K,GACd,GAAIpP,GAAK/iB,IACT+iB,GAAGe,SACHvB,IAAIqQ,KAAK,QAAS,0BAElB,IAAI6+K,GAAM,aAAet/K,CAGzB,IAFA5P,IAAIqQ,KAAK,QAAS,wBAA0B6+K,GAEH,WAArClsM,GAAGC,IAAIksM,OAAOznM,KAAKiY,cACrBliB,KAAK2xM,eAAeF,OAEpB,QAAQlsM,GAAGC,IAAI4M,QAAQnI,KAAKiY,eAC1B,IAAK,UACHliB,KAAK4xM,gBAAgBH,EACrB,MACF,SACEzxM,KAAK6xM,cAAcJ,GAKzB,MAAO1uL,GAAGktL,gBAYZ1qK,KAAM,WACJ,MAAOvlC,OAWT8xM,kBAAmB,WAEjB,MAAiC,WAA7BxtM,OAAO6sB,SAASgrF,UAA+D,SAAtC52G,GAAGC,IAAI4M,QAAQnI,KAAKiY,cACxD,yBAEA,yBAUXovL,MAAO,SAAU1jM,GACf,GAAImV,GAAK/iB,IACT,OAAOnB,GAAEqhC,MACPo7B,QAAS,IACT1zD,KAAM,MACN4c,IAAKzB,EAAG+uL,oBACRnyM,KAAMiO,EACN8e,OAAO,KAkBX7sB,KAAM,SAAU8iL,EAAa7vJ,EAAYllB,EAAQmkM,GAE/C,GAAIvgM,GAAI3S,EAAE0nB,WAENxD,EAAK/iB,IAET4N,GAAOgtD,OAAS+nH,EAChB/0K,EAAO0kB,OAASQ,CAEhB,IAAIk/K,GAAmBnzM,EAAE4C,UAAWswM,GAClCnqM,KAAM,MACN4c,IAAKzB,EAAG+uL,oBACRrlL,OAAO,EACPC,OAAO,EACP/sB,KAAMiO,GAYR,OATA/O,GAAEqhC,KAAK8xK,GAAkBzgM,KAAK,SAAUnK,GACtC,GAAI6qM,GAAW7qM,CACfmb,KAAIqQ,KAAK,QAAS,sCAAwC+vJ,EAAc,aAAcsvB,GACtFzgM,EAAEsW,QAAQmqL,KACTlqL,KAAK,SAAUiJ,GAChBzO,IAAIqQ,KAAK,QAAS,qCAAuC+vJ,EAAc,UAAW3xJ,GAClFxf,EAAE0W,OAAO,SAGJ1W,EAAE2W,WAWXypL,gBAAiB,SAAUptL,GACzB,GAEI+5K,GAAQr5L,SAAS0nB,cAAc,SACnC2xK,GAAM/6L,MAAMk/D,QAAU,OACtB67H,EAAQr5L,SAASsB,KAAK8M,YAAYirL,EAElC,KACEA,EAAMpgF,cAAchtF,SAAW3M,EAC/B,MAAOpgB,IAIT,MADAc,UAASsB,KAAKoN,YAAY2qL,GACnBv+L,MAaT2xM,eAAgB,SAAUntL,GAIxBle,WAAW,WACThC,OAAO6sB,SAAW3M,GACjB,MAULqtL,cAAe,SAAUrtL,GACvB,GAEI+5K,GAAQr5L,SAAS0nB,cAAc,SACnC2xK,GAAM/6L,MAAMk/D,QAAU,OACtB67H,EAAQr5L,SAASsB,KAAK8M,YAAYirL,GAClCA,EAAMpgF,cAAchtF,SAAW3M,EAC/Ble,WAAW,WACT,IAGsC,aAAhCi4L,EAAMpgF,cAAchtF,UACtBtyB,EAAEwnG,OAEJ,MAAOjiG,IAITc,SAASsB,KAAKoN,YAAY2qL,IACzB,MAKH2T,EAAO,GAAInB,EACfplL,GAAO8B,MAAMkiL,UAAUoB,KAAOmB,EAE9BvmL,EAAO8B,MAAMkiL,UAAUkB,UAAU/oL,WAChCxjB,OAAOumB;ACvQV,cAQA,SAAWc,GACT,GAAIg4J,IAQFS,aAAc,WAEZ,GAAI5yK,GAAI3S,EAAE0nB,WAEN3Y,GACF8gM,UAA6C,UAA/BxpM,SAASisB,SAASgrF,SAAuB,IAAM,IAC7DwyF,KAAQzpM,SAASisB,SAASwkD,KAC1Bo5H,eAA8C,MAA3BlwM,EAAE4yB,OAAO,eAAyB,GAAK5yB,EAAE4yB,OAAO,eAkBrE,OAdAlsB,IAAG8L,IAAIC,SAAS,8BAAgCyjK,UAAWh0J,gBAAgBG,eAAgB3P,KAAK,SAAUnK,GACtGwG,EAAc,MAAIxG,IAGtBukB,EAAOka,gBAAgB,eAAgB,GAAIj4B,GAAQ2D,KAAK,SAAS0V,GACvC,QAApBA,EAAShE,OACXzR,EAAEsW,UAEFtW,EAAE0W,WAEHH,KAAK,SAASd,GACfzV,EAAE0W,WAGG1W,EAAE2W,WAWXy7J,kBAAmB,WACjB,MAAOj4J,GAAOka,gBAAgB,oBAAqB,QAKvDla,GAAOg4J,QAAUA,GAChBr/K,OAAOumB,UAAU4C;AC5DpB,cAQA,SAAW9B,GAET,GAAI+7I,IAQFyqC,yBAA0B,WAcxB,MAZAxmL,GAAOgG,kBAAkB,cAAcC,OAAO,SAAUC,GAClDA,GACFlG,EAAOka,gBAAgB,2BAA4B,iBAAkBt0B,KAAK,SAAU0V,GAClF,GAAI05B,GAAc15B,EAAShE,MACvB09B,GAAY7yC,OAAS,GACvB4yC,sBAAsB7hD,EAAEwkB,OAAOs9B,MAEhC54B,KAAK,SAAUd,GAChByW,UAAUzW,EAASwJ,aAIlB9E,GAUT2rK,mBAAoB,WAClB,GAAItuK,GAAMnqB,EAAE0nB,UAgBZ,OAfAoF,GAAOgG,kBAAkB,cAAcpgB,KAAK,SAAU+/B,GAChDA,EACF3lB,EAAOka,gBAAgB,uBAAwB,iBAAkBt0B,KAAK,SAAU0V,GAC9E,GAAI27D,GAAO37D,EAAShE,MACpB+F,GAAIlB,QAAQ86D,KACX76D,KAAK,SAASd,GACf+B,EAAId,OAAOjB,EAASwJ,WAGtBzH,EAAId,WAELH,KAAK,WACNiB,EAAId,WAGCc,GAWT4qJ,0BAA2B,SAAUpuI,GACnC,GAAIh0B,GAAI3S,EAAE0nB,UAwBV,OArBAoF,GAAOgG,kBAAkB,cACtBC,OAAO,SAAUC,GACZA,EACFlG,EAAOka,gBAAgB,2BAA4B,iBAAkBt0B,KAAK,SAAS0V,GAC/E,GAAI05B,GAAgB15B,EAAShE,OAASgE,EAAShE,UAC3C7b,IACJ,IAAIu5C,EAAY7yC,OAAS,EACvB,IAAK,GAAIvG,GAAI,EAAGA,EAAIo5C,EAAY7yC,OAAQvG,IAClCo5C,EAAYp5C,GAAG8c,IAAMmhB,GACvBp+B,EAAImM,KAAKotC,EAAYp5C,GAI3BiK,GAAEsW,QAAQ1gB,KACX2gB,KAAK,SAASd,GACfzV,EAAE0W,aAGJ1W,EAAE0W,aAGD1W,EAAE2W,WAoBX6mJ,aAAc,SAAUxpI,EAAOmY,EAAey0J,EAAet/K,EAAYu/K,EAASC,EAAiBC,EAAiBC,EAAoBC,EAAkB1jC,EAAgB2jC,EAAeC,GACvL,GAAI5vL,GAAK/iB,KACLwR,EAAI3S,EAAE0nB,UAeV,OAdAof,cAAa5kB,gBAAgBI,cAAgBJ,gBAAgBC,uBAAwB,SAAU4kB,GAC7F,GAAI4kH,IACF1mH,WAAc0B,EACdotK,gBAAmBj1J,EACnB3X,MAASJ,EACTitK,eAAkB9jC,EAClB+jC,cAAyC,mBAAjBJ,GAA+B,KAAOA,EAC9DK,aAAuC,mBAAhBJ,GAA8B,KAAOA,EAE9D5vL,GAAGiwL,YAAY,sBAAuBxoD,EAAe4nD,EAAet/K,EAAYu/K,EAASC,EAAiBC,EAAiBC,EAAoBC,GAC5IlhM,KAAK,SAAUnK,GACdoK,EAAEsW,QAAQ1gB,MAEbo+B,EAAOmY,GACHnsC,EAAE2W,WAmBX8qL,QAAS,SAAUC,EAAOd,EAAet/K,EAAYu/K,EAASC,EAAiBC,EAAiBC,EAAoBC,EAAkBC,EAAeC,GACnJ,GAAI5vL,GAAK/iB,KACLwR,EAAI3S,EAAE0nB,UAeV,OAdAof,cAAa5kB,gBAAgBK,UAAYL,gBAAgBC,uBAAwB,SAAU4kB,GACzF,GAAI4kH,IACFxqH,MAASkzK,EACTltK,MAASJ,EACTktK,cAAyC,mBAAjBJ,GAA+B,KAAOA,EAC9DK,aAAuC,mBAAhBJ,IAA+C,MAAhBA,EAAuB,GAAKA,EAEpF5vL,GAAGiwL,YAAY,cAAexoD,EAAe4nD,EAAet/K,EAAYu/K,EAASC,EAAiBC,EAAiBC,EAAoBC,GACpIlhM,KAAK,SAAUnK,GACdoK,EAAEsW,QAAQ1gB,KACT2gB,KAAK,SAAS3gB,GACfoK,EAAE0W,OAAO9gB,MAEZ8rM,GACI1hM,EAAE2W,WAmBXgrL,SAAU,SAAUjxH,EAAQkwH,EAAet/K,EAAYu/K,EAASC,EAAiBC,EAAiBC,EAAoBC,EAAkBC,EAAeC,GACrJ,GAAI5vL,GAAK/iB,KACLwR,EAAI3S,EAAE0nB,UAeV,OAdAof,cAAa5kB,gBAAgBK,UAAYL,gBAAgBC,uBAAwB,SAAU4kB,GACzF,GAAI4kH,IACF3oH,OAAUqgD,EACVl8C,MAASJ,EACTktK,cAAyC,mBAAjBJ,GAA+B,KAAOA,EAC9DK,aAAuC,mBAAhBJ,IAA+C,MAAhBA,EAAuB,GAAKA,EAEpF5vL,GAAGiwL,YAAY,eAAgBxoD,EAAe4nD,EAAet/K,EAAYu/K,EAASC,EAAiBC,EAAiBC,EAAoBC,GACrIlhM,KAAK,SAASnK,GACboK,EAAEsW,QAAQ1gB,KACT2gB,KAAK,SAAS3gB,GACfoK,EAAE0W,OAAO9gB,MAEZ86E,GACI1wE,EAAE2W,WAoBX6qL,YAAa,SAAUrwB,EAAan4B,EAAe4nD,EAAet/K,EAAYu/K,EAASC,EAAiBC,EAAiBC,EAAoBC,GAC3I,GAAIjhM,GAAI3S,EAAE0nB,UAgBV,OAfAikI,GAA0B,WAAI13H,EAC9B03H,EAA6B,cAAI4nD,EACjC5nD,EAAuB,QAAM6nD,EAAU98H,mBAAmB88H,GAAW,GACrE7nD,EAA+B,kBAAM8nD,GAAkBA,EACvD9nD,EAA+B,kBAAM+nD,GAAkBA,EACvD/nD,EAAkC,mBAAMgoD,EAAqBA,EAAqB,GAElF7mL,EAAOka,gBAAgB88I,EAAa,aAAcn4B,GAAe54H,OAAO,SAASxqB,GAC3EqrM,GAAkBA,EAAiBrrM,KACtCmK,KAAK,SAASnK,GACfoK,EAAEsW,QAAQ1gB,KACT2gB,KAAK,SAAS3gB,GACfoK,EAAE0W,OAAO9gB,KAGJoK,EAAE2W,WAgBXs/I,wBAAyB,SAAU/pH,EAAY01J,EAAgBtgL,EAAYmS,EAAUS,EAAWZ,GAC9F,GAAI/hB,GAAK/iB,IAKT,OAJA2lC,cAAa5kB,gBAAgBC,uBAAwB,SAAU4kB,GAC7D,GAAI4kH,IAAkB1kH,MAAS4X,EAAY3X,QAAW,EAAGC,MAASJ,EAClE,OAAO7iB,GAAGswL,uBAAuB,qBAAsB7oD,EAAe4oD,EAAgBtgL,EAAYmS,EAAUS,EAAWZ,IACtH4Y,EAAY,GACR36B,GAgBTuwL,oBAAqB,SAAUpxH,EAAQkxH,EAAgBtgL,EAAYmS,EAAUS,EAAWZ,GACtF,GAAI/hB,GAAK/iB,IACT2lC,cAAa5kB,gBAAgBS,mBAAoB,SAAUokB,GACzD,GAAI4kH,IAAkB3oH,OAAUqgD,EAAQl8C,MAASJ,EACjD,OAAO7iB,GAAGswL,uBAAuB,sBAAuB7oD,EAAe4oD,EAAgBtgL,EAAYmS,EAAUS,EAAWZ,IACvHo9C,IAgBLqxH,mBAAoB,SAAUL,EAAOE,EAAgBtgL,EAAYmS,EAAUS,EAAWZ,GACpF,GAAI/hB,GAAK/iB,IACT2lC,cAAa5kB,gBAAgBS,mBAAoB,SAAUokB,GACzD,GAAI4kH,IAAkBxqH,MAASkzK,EAAOltK,MAASJ,EAC/C,OAAO7iB,GAAGswL,uBAAuB,qBAAsB7oD,EAAe4oD,EAAgBtgL,EAAYmS,EAAUS,EAAWZ,IACtHouK,IAgBLG,uBAAwB,SAAU1wB,EAAan4B,EAAe4oD,EAAgBtgL,EAAYmS,EAAUS,EAAWZ,GAC7G0lH,EAAoC,qBAAI13H,EACxC03H,EAA0B,WAAI4oD,EAC9B5oD,EAAwB,SAAIvlH,EAE5BtZ,EAAOka,gBAAgB88I,EAAa,aAAcn4B,GAAej5I,KAAK,SAAS0V,GACvEye,GAAaA,EAAUze,EAAShE,UACrC8E,KAAK,SAASd,GACX6d,GAASA,EAAQ7d,EAASwJ,YAMpC9E,GAAO+7I,KAAOA,GACbpjK,OAAOumB,UAAU4C;AChVpB,cAQA,SAAW9B,GACT,GAAIsD,IASFhtB,KAAM,SAAUwuB,GACd,GAAIjf,GAAI3S,EAAE0nB,UAIV,OAHAoF,GAAOka,gBAAgB,SAAU,sBAAwBpV,QAASA,IAAWmB,OAAO,SAASxqB,GAC3FoK,EAAEsW,QAAQ1gB,KAELoK,EAAE2W,WAKbwD,GAAOsD,cAAgBA,GACtB3qB,OAAOumB,UAAU4C;AC7BpB,cAQA,SAAW9B,GACT,GAAIqvB,IASAC,qBAAsB,SAAUhoB,GAC9B,GAAIzhB,GAAI3S,EAAE0nB,WACNitL,EAAkB,EAElBC,EAAU,SAAUtvL,GACtB,GAAIpH,GAAIle,EAAE0nB,UAOV,OANAoF,GAAOka,gBAAgB,qBAAsB,YAAa1hB,GAAM5S,KAAK,SAAUnK,GACzEA,EAAIi5B,SACNmzK,IAEFz2L,EAAE+K,YAEG/K,EAAEoL,UAgBX,OAZAwD,GAAOka,gBAAgB,sBAAuB,YAAa5S,EAAM,IAAIrB,OAAO,SAAUxqB,GAChFA,EAAIi5B,SAASmzK,GAGjB,KAAK,GADDr8J,MACK5vC,EAAI,EAAGA,EAAI0rB,EAAMnlB,OAAQvG,IAChC4vC,EAAU5jC,KAAKkgM,EAAQxgL,EAAM1rB,IAE/B1I,GAAEiwB,KAAK/O,MAAM,KAAMo3B,GAAWxuB,KAAK,WACjCnX,EAAEsW,QAAQ0rL,OAIPhiM,EAAE2W,WAUXurL,sBAAuB,WACrB,GAAIliM,GAAI3S,EAAE0nB,UAIV,OAHAoF,GAAOka,gBAAgB,iBAAkB,gBAAiBt0B,KAAK,SAAU0V,GACvEzV,EAAEsW,QAAQb,EAAShE,UAEdzR,EAAE2W,WASX8zB,sBAAuB,WACrB,GAAIzqC,GAAI3S,EAAE0nB,UAoBV,OAnBAoF,GAAOka,gBAAgB,0BAA2B,gBAAiBjU,OAAO,SAAU3K,GAClF,GAAIA,EAASoZ,QAAS,CACpB,GAAIpN,GAAQhM,EAAShE,MACrB,IAAIgQ,EAAMnlB,OAAS,EAEjB,IAAK,GAAIvG,GAAI,EAAGA,EAAI0rB,EAAMnlB,OAAQvG,IAChC0rB,EAAM1rB,GAAG43B,KAAyB,KAAjBlM,EAAM1rB,GAAG43B,KAAc,OAASlM,EAAM1rB,GAAG43B,KAC1DlM,EAAM1rB,GAAG43B,KAAyB,KAAjBlM,EAAM1rB,GAAG43B,KAAc,MAAQlM,EAAM1rB,GAAG43B,KACzDlM,EAAM1rB,GAAG43B,KAAyB,KAAjBlM,EAAM1rB,GAAG43B,KAAc,OAASlM,EAAM1rB,GAAG43B,KAC1DlM,EAAM1rB,GAAG43B,KAAyB,KAAjBlM,EAAM1rB,GAAG43B,KAAc,MAAQlM,EAAM1rB,GAAG43B,KACzDlM,EAAM1rB,GAAG43B,KAAyB,KAAjBlM,EAAM1rB,GAAG43B,KAAc,MAAQlM,EAAM1rB,GAAG43B,IAG7D3tB,GAAEsW,QAAQmL,OAEVzhB,GAAE0W,WAIC1W,EAAE2W,WAKbwD,GAAOqvB,UAAYA,GAEpB12C,OAAOumB,UAAU4C;CClGpB,SAAW9B,GAqXT,QAASgoL,GAAwBC,GAE/B,GAAuB,MAAnBA,EAAyB,CAE3B,GAAIC,GAAyBhpJ,cAAc,+CACvCipJ,KAEAC,EAA8Bl1M,EAAE,iCAChCm1M,EAAoCn1M,EAAE,uCACtCo1M,EAA8Bp1M,EAAE,iCAChCq1M,EAAiCr1M,EAAE,mCAEvCm1M,GAAkCjvM,KAAK,YAAY,GACnDmvM,EAA+BnvM,KAAK,YAAY,GAChDkvM,EAA4BlvM,KAAK,YAAY,GAC7CkvM,EAA4B30M,YAAY,gBAEO,KAA3Cs0M,EAAgBO,wBAClBJ,EAA4B1nK,KAAK,WAAW,IAE5C0nK,EAA4B1nK,KAAK,WAAW,GAC5C6nK,EAA+BnvM,KAAK,YAAY,GAChDkvM,EAA4BlvM,KAAK,YAAY,GAC7CivM,EAAkC3nK,KAAK,YAAY,IAGJ,KAA7CunK,EAAgBQ,2BAClBF,EAA+B7nK,KAAK,WAAW,GAC/C2nK,EAAkC3nK,KAAK,WAAW,GAClD4nK,EAA4BhgM,IAAI,KAEhC+/L,EAAkC3nK,KAAK,WAAW,GAClD6nK,EAA+B7nK,KAAK,WAAW,GAC/C4nK,EAA4BhgM,IAAI2/L,EAAgBQ,4BAGZ,KAAlCR,EAAgBS,gBAClBP,EAAavgM,MAAO8Q,GAAI5Z,SAASmpM,EAAgBS,gBAAiBl1K,KAAM,MAAOsZ,SAAU,OAEpD,KAAnCm7J,EAAgBU,iBAClBR,EAAavgM,MAAO8Q,GAAI5Z,SAASmpM,EAAgBU,iBAAkBn1K,KAAM,MAAOsZ,SAAU,OAE5Fo7J,EAAuBh/J,MAAM,SAAU1wB,GACrC7f,OAAOkF,KAAKywB,SAAS4pK,mBAAmB1/K,EAAKE,IAAI,KAGnDwvL,EAAuBp7I,SAASq7I,EAAcD,EAAwB,SAAU1vL,GAC9E,MAAO7f,QAAOkF,KAAKywB,SAAS4pK,mBAAmB1/K,EAAKE,IAAI,KAK5D/f,OAAOkF,KAAKywB,SAASs6K,2BAoSvB,QAASC,GAAgCC,GACvC,GAAIC,GAAyB71M,EAAE41M,GAAgBvwM,KAAK,wBAAwB6gC,GAAG,YAC3E4vK,IACJF,GAAehhM,SAASvP,KAAK,0BAA0BnE,KAAK,WAC1D,GAAI60M,GAAiB/1M,EAAEmB,MAAMkE,KAAK,uBAClC0wM,GAAevoK,KAAK,UAAWqoK,GAC/BC,EAAkBphM,KAAK1U,EAAEmB,MAAM+E,KAAK,mBAEtC4mB,EAAOsO,SAAS46K,0BAA0BF,EAAmBD,GA1sB/D,GAMII,GAAc,IAOlBnpL,GAAOsO,YAOPtO,EAAOsO,SAAS86K,aAAe,WACfl2M,EAAE,aAEhB0G,IAAGkoB,MACFs8C,SACAu5G,uBAAsB,GAEvB0xB,wBAAuB,IAQzBrpL,EAAOsO,SAASg7K,WAAa,WAC3B,GAAI7qL,GAAQ7kB,GAAGkoB,MAAMrD,OAAM,EAC3B7H,KAAIqQ,KAAK,QAAS,qCACJ/zB,GAAE,UAEhB0G,IAAG4mB,KAAK5a,KAAK,WACXhM,GAAGmE,GAAGslB,QAAQ/sB,MACd,IAAIo5F,GAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KAC3B3gB,GAAM7Y,KAAK,SAAU2jM,GACfA,GACF75G,EAAMp5F,KAAK0E,EAAE,oCACb6C,KAAKikB,MAAMltB,QAEX86F,EAAMp5F,KAAK0E,EAAE,iCAEdohB,KAAK,WACNszE,EAAMp5F,KAAK0E,EAAE,iCAGfL,WAAW,WACTf,GAAGmE,GAAGslB,QAAQ1uB,OACd8pB,EAAMlC,UACL,SAQPyD,EAAOsO,SAASk7K,UAOhBxpL,EAAOsO,SAASo9I,kBAAoB9xK,GAAGurB,IAAI,WAEzC,GAAIskL,GAASv2M,EAAE,mBACXw2M,EAAYx2M,EAAE,aACdy2M,EAAUz2M,EAAE,WACZ02M,EAAkB12M,EAAE,kBAmCxB,OAjCI0G,IAAGkoB,MAAMxlB,eACXmtM,EAAO/oK,KAAK,WAAW,GACvBgpK,EAAU31M,SAAS,YACnB21M,EAAUtwM,KAAK,YAAY,GAC3BuwM,EAAQ51M,SAAS,YACjB41M,EAAQvwM,KAAK,YAAY,GACzBwwM,EAAgB71M,SAAS,YACzB61M,EAAgBxwM,KAAK,YAAY,IAInCqwM,EAAOt0M,GAAG,SAAU,WACdjC,EAAEmB,MAAM+kC,GAAG,aACbx/B,GAAGkoB,MAAMq8C,UACTurI,EAAU31M,SAAS,YACnB21M,EAAUtwM,KAAK,YAAY,GAC3BuwM,EAAQ51M,SAAS,YACjB41M,EAAQvwM,KAAK,YAAY,GACzBwwM,EAAgB71M,SAAS,YACzB61M,EAAgBxwM,KAAK,YAAY,KAEjCQ,GAAGkoB,MAAMs8C,SACTsrI,EAAU/1M,YAAY,YACtB+1M,EAAUtwM,KAAK,YAAY,GAC3BuwM,EAAQh2M,YAAY,YACpBg2M,EAAQvwM,KAAK,YAAY,GACzBwwM,EAAgBj2M,YAAY,YAC5Bi2M,EAAgBxwM,KAAK,YAAY,IAEnCyE,KAAKywB,SAASq9I,uBACd3rJ,EAAOsO,SAAS4qJ,iCAGXl5J,EAAOsO,WAWhBtO,EAAOsO,SAASu7K,qBAAuB,SAAUC,EAAkBC,EAA0BC,EAAqBC,EAAyBC,GAOzI,MALAzpJ,oBAAqBqpJ,EACrBK,2BAA6BJ,EAC7BK,sBAAwBJ,EACxBloJ,0BAA4BmoJ,EAErBrwM,GAAG8L,IAAIxR,KAAK,sCAEjBm2M,cAAeP,EAAmB,OAAS,QAC3CQ,sBAAuBP,EAA2B,OAAS,QAC3DQ,qBAAsBP,EAAsB,OAAS,QACrDQ,kBAAmBN,EAAoB,OAAS,QAChDO,wBAAyBR,EAA0B,OAAS,WAWhEjqL,EAAOsO,SAAS4qJ,6BAA+B,WAC7C,GAAI4wB,GAA2D,IAAxC52M,EAAE,2BAA2BiP,OAChDjP,EAAE,2BAA2BkmC,GAAG,aAC/Bx/B,GAAGkoB,MAAM6jB,eAAyC,YAAvBC,oBAC5BmkK,EAA+D,IAApC72M,EAAE,uBAAuBiP,OACpDjP,EAAE,uBAAuBkmC,GAAG,YAC5B+wK,2BACAH,EAAgE,IAA1C92M,EAAE,6BAA6BiP,OACrDjP,EAAE,6BAA6BkmC,GAAG,YAClCgxK,sBACAH,EAAuE,IAA7C/2M,EAAE,gCAAgCiP,OAC5DjP,EAAE,gCAAgCkmC,GAAG,YACrC0oB,0BACAooJ,EAAyD,IAArCh3M,EAAE,wBAAwBiP,OAC9CjP,EAAE,wBAAwBkmC,GAAG,YACL,aAAxBwM,mBAEJ,OAAO5lB,GAAOsO,SAASu7K,qBAAqBC,EAAkBC,EAA0BC,EAAqBC,EAAyBC,GAAmBtkM,KAAK,SAAUnK,IACtK,GAAK7B,IAAGygB,IAAIod,IAAI2H,OAAS9oC,KAAK0E,EAAE,qBAC/BirB,OAAO,WACJ/yB,EAAE8jB,WAAWo+I,2BAA2BA,8BAWhDp1I,EAAOsO,SAASi9I,oBAAsB3xK,GAAGurB,IAAI,WAgB3C,MAfAjyB,GAAE,WACA,GAAIw3M,GAA4Bx3M,EAAE,4BAC9Bk3M,wBACFM,EAA0BtxM,KAAK,WAAW,KAI9ClG,EAAE,yEACCiC,GAAG,SAAU8/J,0CACb9/J,GAAG,SAAUwD,OAAOkF,KAAKywB,SAAS4qJ,8BAErChmL,EAAE,8DACCiC,GAAG,SAAU+/J,gDACb//J,GAAG,SAAUwD,OAAOkF,KAAKywB,SAAS4qJ,8BAE9Bl5J,EAAOsO,WAUhBtO,EAAOsO,SAASk9I,4BAA8B5xK,GAAGurB,IAAI,WAenD,MAdAjyB,GAAE,WACAy3M,wBAA0Bz3M,EAAE,uBAExBi3M,4BACFQ,wBAAwBvxM,KAAK,WAAW,GAGtCwxM,oCACFD,wBAAwBvxM,KAAK,YAAY,GACzCuxM,wBAAwB7iM,SAAS1O,KAAK,QAAS4B,EAAE,0CACjD2vM,wBAAwB7iM,SAAS/T,SAAS,qBAIvCisB,EAAOsO,WAUhBtO,EAAOsO,SAASm9I,yBAA2B7xK,GAAGurB,IAAI,WAEhD,GAAIijL,GAA8Bl1M,EAAE,iCAChCm1M,EAAoCn1M,EAAE,uCACtCo1M,EAA8Bp1M,EAAE,iCAChC23M,EAA+B33M,EAAE,kCACjCq1M,EAAiCr1M,EAAE,oCACnC43M,EAAgC53M,EAAE,mBAClC63M,GACF3C,EAA6BC,EAAmCE,EAChED,EA+BF,OA3BAF,GAA4BjzM,GAAG,SAAUwD,OAAOkF,KAAKywB,SAAS08K,4BAG9D93M,EAAEkB,KAAK22M,EAAgB,SAAUp9I,EAAOv6C,GACtCA,EAAMje,GAAG,SAAU,WACjBmF,aAAa6uM,GACbA,EAAcxuM,WAAWhC,OAAOkF,KAAKywB,SAASs6K,yBAA0B,SAI5EN,EAA4BnzM,GAAG,UAAW,WACxCmF,aAAa6uM,GACbA,EAAcxuM,WAAWhC,OAAOkF,KAAKywB,SAASs6K,yBAA0B,OAO1EN,EAA4B9/I,UAAU,uBAGtCqiJ,EAA6B11M,GAAG,QAASwD,OAAOkF,KAAKywB,SAAS28K,mCAG9DH,EAA8B31M,GAAG,QAASwD,OAAOkF,KAAKywB,SAAS48K,+CAExDlrL,EAAOsO,WAShBtO,EAAOsO,SAASs6K,yBAA2BhvM,GAAGurB,IAAI,WAEhD,GAAIijL,GAA8Bl1M,EAAE,iCAChCm1M,EAAoCn1M,EAAE,uCACtCo1M,EAA8Bp1M,EAAE,iCAEhCi4M,EAAkB/C,EAA4BhvK,GAAG,YACjDgyK,EAAYD,EAAmB9C,EAAkCjvK,GAAG,YAAc,EAAI,EAAK,IAC3FiyK,EAAoB/C,EAA4BhgM,KAGpD,OAAkB,IAAb8iM,GAA0C,KAAtBC,EAChBrrL,EAAOsO,UAGX+8K,IACHA,EAAoB,EACpB/C,EAA4BhgM,IAAI,IAGlCopB,iBACA93B,GAAGwnB,SAASltB,KAAK,wCACfo3M,UAAWF,EACXG,kBAAmBF,IAClBplL,OAAO,WACR4L,eAAe72B,EAAE,kBAAmB,OACnC4pB,MAAM,SAAUA,GACjBjO,QAAQC,IAAIgO,KAEP5E,EAAOsO,YAShBtO,EAAOsO,SAASk9K,mBAAqB5xM,GAAGurB,IAAI,SAAU4yB,GAIpD,MAHAA,GAAK9H,WAAW,SAAUz3B,GACxB,MAAO7f,QAAOkF,KAAKywB,SAAS4pK,mBAAmB1/K,EAAKE,IAAI,IACvD1d,EAAE,mBACEglB,EAAOsO,WAShBtO,EAAOsO,SAASm9K,sBAAwB7xM,GAAGurB,IAAI,SAAU4yB,GAIvD,MAHAA,GAAKxH,YAAY,KAAM,SAAU/3B,GAC/B,MAAO7f,QAAOkF,KAAKywB,SAAS4pK,mBAAmB1/K,EAAKE,IAAI,IACvD1d,EAAE,mBACEglB,EAAOsO,WAShBtO,EAAOsO,SAAS4pK,mBAAqBt+L,GAAGurB,IAAI,SAAUod,EAAU4kJ,GAC9D,GAAIzyJ,IAAU,CASd,OANA96B,IAAGwnB,SAASzb,SAAS,mCACnBg8B,SAAUY,EACVoxC,QAASwzG,GACR,GAAI,IAAI,GAAMzyJ,QAAQ,SAAUpd,GACjCod,GAAU,IAELA,IAuET1U,EAAOsO,SAAS08K,2BAA6BpxM,GAAGurB,IAAI,WAElD,GAAIijL,GAA8Bl1M,EAAE,iCAChCm1M,EAAoCn1M,EAAE,uCACtCo1M,EAA8Bp1M,EAAE,iCAChCq1M,EAAiCr1M,EAAE,oCAEnCirE,GAAWiqI,EAA4BhvK,GAAG,WAC9CivK,GAAkCjvM,KAAK,WAAY+kE,GACnDoqI,EAA+BnvM,KAAK,WAAY+kE,GAChDmqI,EAA4BlvM,KAAK,WAAY+kE,GACzCA,EACFmqI,EAA4Bv0M,SAAS,gBAErCu0M,EAA4B30M,YAAY,kBAS5CqsB,EAAOsO,SAAS28K,kCAAoCrxM,GAAGurB,IAAI,WACzD,GAAIuP,IAAU,CAQd,OALA96B,IAAGwnB,SAASzb,SAAS,+CACnB,KAAM,GAAI,IAAI,GAAM+uB,QAAQ,SAAUpd,GACpC0wL,EAAwB1wL,GACxBod,GAAU,IAEPA,IAST1U,EAAOsO,SAAS48K,8CAAgDtxM,GAAGurB,IAAI,WACrE,GAAIuP,IAAU,CAOd,OANA96B,IAAGwnB,SAASltB,KAAK,8DACf,KAAM,GAAI,IAAI,GAAMwgC,QAAQ,SAAUpd,GACpCod,GAAU,EAEVlP,SAASpF,WAENsU,GAOT,IAAIg3K,IAAa,CACjB1rL,GAAOsO,SAASq9K,eAAiB,SAAUxjF,GACzC,IAAIujF,EAAJ,CAEA,GACI7rF,IADU39G,UAAU0pM,OACLzjF,EAAQn0H,OAA6B,sBAEpD63M,EAAOhsF,EAAa/xF,WACpBg+K,EAAcjsF,EAAa9hD,iBAC/B,IAAI8tI,GAAQhsF,EAAapjD,UAAzB,CAEA,GAAIz7D,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQmiB,UAChCt7B,GAAOmlC,oBAAqB,EAC5BnlC,EAAOw0C,gBAAiB,EACxBx0C,EAAOihC,sBAEP,IAAI2Y,IACFmxJ,QAAW/wM,EAAE,WACbgxM,aAAgBhxM,EAAE,MAClBhC,OAAUgC,EAAE,iBAGVixM,iBAAerxJ,GACjBmxJ,QAAW/wM,EAAE,gBACbgxM,aAAgBhxM,EAAE,uBAGpB,IAAIhC,GAAS,WACX0yM,GAAa,EACb7rF,EAAajiD,cAAa,GAC1BjjE,WAAW,WAAc+wM,GAAa,GAAU,KAGlD1qM,GAAOkhC,UAAU,eAAgB0Y,EAAOoxJ,aAAc,WACpD9sL,UAAUkC,SAAS2uD,QAAQ8E,eAAeg3H,GAC1CvmL,UAAUtqB,EAAE,uCAAwC8wM,MAErD5pK,UAAU,eAAgBlnC,EAAE,UAAWhC,GACvCwd,KAAK,aAAcxd,GACnB1C,KAAK0E,EAAE,4BAA6BA,EAAE,kCAAmCA,EAAE,wBAAyB,cAUvGglB,EAAOsO,SAASq9I,qBAAuB/xK,GAAGurB,IAAI,WAC5C,GAAI+mL,GAAoB,SAAUC,GAChCA,EAAKn2K,KAAK,SAASriC,YAAY,kBAC/Bw4M,EAAK/yM,KAAK,YAAY,IAGpBgzM,EAAqB,SAAUD,GACjCA,EAAKn2K,KAAK,SAASjiC,SAAS,kBAC5Bo4M,EAAK/yM,KAAK,WAAY,YAkDxB,OA/CAlG,GAAEiwB,KAAKvpB,GAAG+oB,WAAW3F,KAAK,WACxB,GAAIqvL,GAA0Bn5M,EAAE,2BAC5Bo5M,EAAuBp5M,EAAE,wBACzBq5M,EAAyBr5M,EAAE,0BAC3Bs5M,EAA+Bt5M,EAAE,gCACjCu5M,EAA+Bv5M,EAAE,gCAEjCg/J,GAAyBt4J,GAAGkoB,MAAM6jB,aACtC,QAAQC,qBACN,IAAK,UACHymK,EAAwBjzM,KAAK,WAAW,EACxC,MACF,KAAK,WACHkzM,EAAqBlzM,KAAK,WAAW,EACrC,MACF,KAAK,OACHmzM,EAAuBnzM,KAAK,WAAW,EACvC,MACF,KAAK,eACHmzM,EAAuBnzM,KAAK,WAAW,GAIvC84J,GAAiD,YAAvBtsH,qBAC5BymK,EAAwBjzM,KAAK,WAAW,GAGrC0oD,0BAGH2qJ,EAA6BrzM,KAAK,WAAW,GAF7CozM,EAA6BpzM,KAAK,WAAW,GAK1C84J,GACHg6C,EAAkBK,GAEfr6C,GAA0BzxG,oBAAuB6rJ,EAAqBlzK,GAAG,cAC5E8yK,EAAkBM,GAClBN,EAAkBO,IAGhBv6C,IACFk6C,EAAmBG,GACnBH,EAAmBI,GACnBJ,EAAmBK,MAGhBzsL,EAAOsO,WAWhBtO,EAAOsO,SAASo+K,eAAiB9yM,GAAGurB,IAAI,SAAUk5F,GAChD,MAAOr+F,GAAOsO,WAWhBtO,EAAOsO,SAASq+K,iBAAmB/yM,GAAGurB,IAAI,WACxC,MAAOnF,GAAOsO,WAYhBtO,EAAOsO,SAASs+K,eAAiB,SAAUC,EAAUC,GACnD,OAAO,GAgBT9sL,EAAOsO,SAASy+K,WAAa,SAAUzuM,EAAMrC,EAAMu5E,EAAiBC,GAClE,OAAO,GAYTz1D,EAAOsO,SAAS0+K,YAAc,SAAUj/K,GACtC,MAAO/N,GAAOsO,UAShBtO,EAAOsO,SAASs9I,2BAA6BhyK,GAAGurB,IAAI,WAoBlD,MAlBAjyB,GAAE,wBAAwBqF,KAAK,wBAAwBpD,GAAG,SAAU,WAClE0zM,EAAgC31M,EAAEmB,MAAMyT,YAG1C5U,EAAE,0BAA0BqF,KAAK,wBAAwBpD,GAAG,SAAU,WACpE,GAAI83M,GAAkB/5M,EAAEmB,MAAMyT,SAASA,SACnColM,EAAkBD,EAAgBnlM,SAASvP,KAAK,wBAAwBA,KAAK,uBACjFynB,GAAOsO,SAAS46K,2BAA2Bh2M,EAAEmB,MAAMyT,SAAS1O,KAAK,iBAAkBlG,EAAEmB,MAAM+kC,GAAG,YAC9F,IAAI+zK,GAAqBF,EAAgB10M,KAAK,gCAAgC4J,OAC1EirM,EAAiBH,EAAgB10M,KAAK,wBAAwB4J,MACvC,IAAtBgrM,GAA6BA,GAAsBC,EACtDF,EAAgBxsK,KAAK,WAAW,GAE5BysK,GAAsBC,GACxBF,EAAgBxsK,KAAK,WAAW,KAI/B1gB,EAAOsO,WAOhBtO,EAAOsO,SAAS46K,0BAA4BtvM,GAAGurB,IAAI,SAAU6jL,EAAmB/yH,GAQ9E,MAPAvkD,kBACA93B,GAAGwnB,SAASltB,KAAK,8CACfm5M,kBAAmBrE,EACnB/4J,WAAYgmC,GACX,GAAI,IAAI,GAAMhwD,OAAO,SAAU3O,GAChCua,eAAe72B,EAAE,kBAAmB,OAE/BglB,EAAOsO,WAsBhBtO,EAAOsO,SAAS2qJ,WAAa,WAC3B,GAAIpzK,GAAI3S,EAAE0nB,WACN80E,EAAQ,GAAI91F,IAAGygB,IAAIod,IAAI2H,KAiB3B,OAhBAxlC,IAAGkoB,MAAMm1J,kBAAkB,GAAGrxK,KAAK,SAAU6xK,GACvCA,EACF55K,KAAKikB,MAAMm3J,aAAarzK,KAAK,SAAU0V,GACrCo0E,EAAMqnD,YAAY/7I,EAAE,iCACpB6K,EAAEsW,QAAQb,KACTc,KAAK,SAAUd,GAChBo0E,EAAMqnD,YAAY/7I,EAAE,8BACpB6K,EAAE0W,OAAOjB,KAGXk8B,YAAYx8C,EAAE,wCAEfohB,KAAK,WACNo7B,YAAYx8C,EAAE,wCAGT6K,EAAE2W,YAGV7jB,OAAOkF;CCjvBV,SAAWmiB,GA2ET,QAASstL,GAAmDtT,GAC1DpgM,GAAGmE,GAAGgD,KAAK2Y,WAAW4R,UAAUzjB,QAAQ,SAAU0jB,GAChDA,EAAI3C,SAAS/gB,QAAQ,SAAU+J,GAC7BA,EAAExa,IAAI,WAAW,WACf4oB,EAAOkrJ,MAAMgvB,0BAA0BF,SAU/C,QAASuT,GAAqDvT,GAC5D,GAAIhyK,GAASpuB,GAAGmE,GAAGgD,KAAK6nB,SAASZ,MACjC,KAAK,GAAIiE,KAAajE,GACpBA,EAAOiE,GAAWQ,KAAKnB,UAAUzjB,QAAQ,SAAUujB,GACjDA,EAAI1R,WAAW4R,UAAUzjB,QAAQ,SAAU0jB,GACzCA,EAAI/U,KAAK,iBAAkB,WACzB+U,EAAI3C,SAAS/gB,QAAQ,SAAS+J,GAC5BA,EAAExa,IAAI,WAAY,WAChB4oB,EAAOkrJ,MAAMgvB,0BAA0BF,aA1FrDh6K,EAAOkrJ,SASPlrJ,EAAOkrJ,MAAMhzF,eAAiB,SAAUniF,EAAIkmI,GAW1C,MAVA35F,mBACExmC,KAAMd,EAAE,+BACRkrC,OAAQlrC,EAAE,OACVy6C,WAAYz6C,EAAE,MACd7D,GAAI,WACF,GAAI+E,GAAMhJ,EAAE6C,GAAIE,UAAU+4B,OAAO,gBAChB9yB,EAAIlI,KAAK,UAC1B4F,IAAGmE,GAAGgD,KAAK6nB,SAASZ,OAAO9rB,EAAIlI,KAAK,SAAS6qG,WAAWo9B,MAGrD5nI,MAQT2rB,EAAOkrJ,MAAMgvB,0BAA4B,SAAUF,GACjD,GAAIn5L,GAAUjH,GAAGmE,GAAG8C,OAChBA,IACFm5L,EAAYnyL,QAAQ,SAAUkgH,GAC5B,GAAI9mH,GAASJ,EAAQ0mB,QAAQwgG,EACzB9mH,IACFA,EAAOm9D,YAWfp+C,EAAOkrJ,MAAMC,gCAAkC,SAAU6uB,GAGvD,GAAIC,IAAyB,CAC7B/mM,GAAEiwB,KAAKvpB,GAAGipB,iBAAkBjpB,GAAGiqB,SAAUjqB,GAAGgpB,aAAahd,KAAK,WAC5DhM,GAAGmE,GAAGgD,KAAKyV,KAAK,SAAU,WACxBwJ,EAAOkrJ,MAAMgvB,0BAA0BF,GAClCC,IACHp8L,KAAKqtK,MAAMivB,kCACXF,GAAyB,KAK7BqT,EAAmDtT,GACnDuT,EAAqDvT,MA2CzDh6K,EAAOkrJ,MAAMivB,gCAAkC,WAC7CvgM,GAAGmE,GAAG8C,QAAQ0mB,QAAQ0oG,wBAAwB/jH,oBAAoBG,mBAAmBxE,QAAQ,SAAU5G,GACrGA,EAAOk9D,YAETvkE,GAAGmE,GAAG8C,QAAQ0mB,QAAQ0oG,wBAAwB/jH,oBAAoBI,iBAAiBzE,QAAQ,SAAU5G,GACnGA,EAAOm9D,aAIVzlE,OAAOkF;ACvHV,cACA,SAAwBmiB,GAOtBA,EAAOmiE,QAOPniE,EAAOmiE,KAAKxS,aAOZ3vD,EAAOmiE,KAAKswB,cAAgBv/G,EAAE0nB,WAO9BoF,EAAOmiE,KAAKgmG,oBAAsB,WAChC,GAA2C,mBAAhCqlB,6BACT,MAAOA,4BAEP,IAAIC,GAAa7zM,GAAGwpB,QAAQtiB,QAAQ0mB,KAAKpE,OACzC,IAAMqqL,EAAY,CAChB,GAAIC,EACJ,QAAQ9zM,GAAGuE,eACT,IAAK,YAAauvM,EAAS,SAAW,MACtC,KAAK,MAAOA,EAAS,SAAW,MAChC,KAAK,OAAQA,EAAS,UAAY,MAClC,KAAK,MAAOA,EAAS,SAAW,MAChC,KAAK,SAAUA,EAAS,YAAc,MACtC,SAASA,EAAS,OAEpB,MAAOA,GAAS,IAAMD,EAAWnvM,KAAK8G,cAExC,MAAO,aAIVzM,OAAOkF;CClDV,SAAwCmiB,GAGtC,GAAI2tL,GAAsB/zM,GAAGygB,IAAIi/D,UAAUmB,iBAAiB3kF,QAC1D83C,cAAe,GACf2lC,cAAe,GACf4mC,aAAc,KAEdyzF,SAAU,GACVnzF,iBAAkB,KAElB7lH,KAAM,SAAUg5C,EAAe2lC,EAAes6H,EAAkB1zF,GAC9D,GAAI/iG,GAAK/iB,IAET+iB,GAAGe,OAAOgiG,GAEV/iG,EAAGw2B,cAAgBA,EACnBx2B,EAAGm8D,cAAgBA,EACnBn8D,EAAGy2L,iBAAmBA,EACtBz2L,EAAG+iG,aAAeA,EAElB/iG,EAAGw2L,SAAW9nM,mBAEdsR,EAAG/hB,UACDwlB,cAAezD,EAAGw2B,cAClB5yB,cAAe5D,EAAGm8D,cAClBG,iBAAkBt8D,EAAGy2L,mBAIzBtzF,WAAY,SAAU7/B,GACpB,GAAItjE,GAAK/iB,IAET,OADAqmF,GAAYozH,QAAU12L,EAAGw2L,UAEvBj9K,OAAQz9B,EAAEwkB,OAAON,EAAG2jE,eAAeL,MAIvCtiE,KAAM,SAAUsiE,GACd,GAAItjE,GAAK/iB,KACLijB,EAAS,GAAIpkB,GAAE0nB,SACfmzL,EAAYn0M,GAAG8L,IAAIxR,KAAK,8BAA+BkjB,EAAGmjG,WAAW7/B,GAazE,OAVApgF,cAAa8c,EAAGqjG,kBAEhBszF,EAAUnoM,KAAK,SAAoB5R,GACjCsjB,EAAO6E,QAAQjpB,EAAEsoB,UAAUxnB,MAC1BooB,KAAK,SAAoBiJ,GAC1BzO,IAAIgO,MAAM,OAAQ,+BAAiCS,GACnDzrB,GAAGmE,GAAGylB,WAAWltB,KAAK+uB,GACtB/N,EAAOiF,OAAO,+BAAiC8I,KAG1C/N,EAAOkF,WAGhBm+D,WAAY,SAAU3rD,EAAQg/K,GAC5B,GAAI52L,GAAK/iB,IACT,OAAOuF,IAAG8L,IAAIxR,KAAK,kCACjB0kB,cAAexB,EAAGw2B,cAClB5yB,cAAe5D,EAAGm8D,cAClB06H,iBAAkBj/K,EAASA,EAAS,GACpCk/K,oBAAoB,EACpBx6H,iBAAkBt8D,EAAGy2L,iBACrBnoG,gBAAiBtuF,EAAG+iG,aAAazU,gBACjCyoG,aAAc/2L,EAAG+iG,aAAag0F,aAC9BC,iBAAkBJ,EAAmBA,EAAmB,KACvDxxL,WAGLo+D,UAAW,WACT,GAAIxjE,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,UAEf,OADAtD,GAAO6E,QAAQ/E,EAAG+iG,cACX7iG,EAAOkF,WAGhBq+D,UAAW,SAAUH,EAAa2zH,GAChC,GAAIj3L,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,UAcf,OAbIyzL,MAAsB,EAExB/2L,EAAO6E,WAEP7hB,aAAa8c,EAAGqjG,kBAChBrjG,EAAGqjG,iBAAmB9/G,WAAW,WAC/Bf,GAAG8L,IAAIxR,KAAK,gCAAiCkjB,EAAGmjG,WAAW7/B,IAAcl+D,UAAU5W,KAAK,WACtF0R,EAAO6E,YACNC,KAAK,WACN9E,EAAOiF,YAER,MAEEjF,EAAOkF,YAOlBwD,GAAO2tL,oBAAsBA,GAG5Bh1M,OAAOkF,KAAKskF;CCxGf,SAAiCniE,GAC/B,YAEAA,GAAOsuL,uBAAyB10M,GAAGygB,IAAIi/D,UAAUmB,iBAAiB3kF,QAChEyR,UAAW,yBACXgnM,gBACAC,SAAU,GACVC,eAAgB,GAChBngL,SAAU,KACVogL,yBAA0B,KAE1B95M,KAAM,SAAU05B,GACd,GAAIlX,GAAK/iB,IACT+iB,GAAGe,SACHf,EAAGm3L,gBACHn3L,EAAGkX,SAAWp7B,EAAE4C,UAAWw4B,IAG7BlW,KAAM,SAAUsiE,GACd,GAAItjE,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,WACXohE,KACAM,KACAqyH,IAEAj0H,GAAYsB,iBAAmBtB,EAAYsB,gBAAgB75E,SAC7D65E,EAAkBr+E,EAAE+8E,EAAYsB,iBAAiByR,MAAM,UAIrD/S,EAAY4B,oBAAsB5B,EAAY4B,mBAAmBn6E,SACnEm6E,EAAqB3+E,EAAE+8E,EAAY4B,oBAAoBmR,MAAM,SAI/D,IAAIqY,GAAyBjoG,KAAKskF,KAAKxS,UAAUm2B,wBASjD,IARIprB,EAAY6B,OAASnlE,EAAGo3L,UAAY9zH,EAAYof,aAAe1iF,EAAGq3L,gBAAkBr3L,EAAGs3L,2BAA6B5oG,IACtH1uF,EAAGm3L,gBACHn3L,EAAGo3L,SAAW9zH,EAAY6B,KAC1BnlE,EAAGq3L,eAAiB/zH,EAAYof,WAChC1iF,EAAGs3L,yBAA2B5oG,GAI5B1uF,EAAGm3L,aAAa7zH,EAAYx8E,MAAO,CACrC,GAAIu/E,GAAUrmE,EAAGm3L,aAAa7zH,EAAYx8E,KAe1C,OAbAu/E,GAAU9/E,EAAE8/E,GAAS9sE,IAAI,SAAU6tE,GAMjC,MALK9D,GAAYgE,aAGfF,EAAO9zB,WAAa4xB,EAAmB78E,QAAQ++E,EAAOprE,UAAW,EAFjEorE,EAAO9zB,WAAasxB,EAAgBv8E,QAAQ++E,EAAOprE,UAAW,EAIzDorE,IAITlnE,EAAO6E,QAAQxe,EAAEgxM,EAAet6L,OAAOopE,IAAU9sE,IAAI,SAAUtK,GACrB,MAAxCA,GAAEzO,IAAM,GAAKyO,EAAE+M,OAAOJ,iBAAyB3M,KAE1CiR,EAAOkF,UA8BhB,MA3BA5iB,IAAG8L,IAAIxR,KAAK,8CACV0kB,cAAexB,EAAGkX,SAASsf,eAAiBh0C,GAAGmE,GAAG0jE,mBAClDzmD,cAAe5D,EAAGkX,SAASilD,eAAiB35E,GAAGmE,GAAG4gI,mBAClDuF,cAAexpD,EAAY8f,cAC3BmsB,OAAQvvG,EAAGkX,SAASU,OACpB4/K,aAAcl0H,EAAY6B,KAC1BsyH,WAAYn0H,EAAYof,WACxBg1G,KAAMp0H,EAAY8C,KAClBiV,KAAM/X,EAAY0D,KAClBsnB,gBAAiBtuF,EAAGkX,SAASygL,gBAC7BZ,aAAc/2L,EAAGkX,SAASI,eACzB9oB,KAAK,SAAU63E,GAChBA,EAAU9/E,EAAE8/E,GAAS9sE,IAAI,SAAUzV,GACjC,OACEkY,MAAOlY,EAAK4qI,MACZp2G,aAAcx8B,EAAE2V,KAAK3N,EAAK6qI,QAC1B9pI,KAAM,GACNyuD,WAAcgwB,EAAYgE,aAA6DpC,EAAmB78E,QAAQvE,EAAK4qI,UAAW,EAAxF9pD,EAAgBv8E,QAAQvE,EAAK4qI,UAAW,KAItF1uH,EAAGm3L,aAAa7zH,EAAYx8E,MAAQu/E,EACpCnmE,EAAO6E,QAAQwyL,EAAet6L,OAAOopE,GAAS9sE,IAAI,SAAUtK,GAClB,MAAxCA,GAAEzO,IAAM,GAAKyO,EAAE+M,OAAOJ,iBAAyB3M,OAI5CiR,EAAOkF,cAIjB3e,KAAKskF;CC9FR,SAAkCniE,GAEhC,GAAIi7D,IACF+zH,UAAW,wCAMbhvL,GAAOivL,wBAA0B,SAAUC,GACzC,GAAIr3M,GAAQ,EAkBZ,OAfIq3M,GAAWC,UAAU3pM,EAAI0pM,EAAWC,UAAUC,EAAIF,EAAWC,UAAUE,EAAI,IAC7Ex3M,EAAQkK,OAAO,sCACbmtM,EAAWC,UAAU3pM,EACrB0pM,EAAWC,UAAUC,EACrBF,EAAWC,UAAUE,IAErBH,EAAWI,SACbz3M,GAAgB,sBAEdq3M,EAAWK,WACb13M,GAAgB,uBAEdq3M,EAAWM,cACb33M,GAAgB,kCAEXA,GAMTmoB,EAAOyvL,gBAAkB,WACvBzvL,EAAO2vD,UAAUsP,aAAcymB,gBAAiB5/F,qBAAsB,GACtEka,EAAO2vD,UAAU6b,cAGnBxrE,EAAO0vL,cAAgB,SAAU9hK,EAAe2lC,EAAes6H,EAAkB1oH,EAAS1kE,GAExF,GAAIkvL,GAA2B,SAAU/3M,GACvC,OAASA,GAAIA,EAAI66B,KAAM,MAAOsa,QAASa,EAAes+G,QAAS34E,IAI7Dq8H,EAAsC,SAAU95D,EAAW3zD,GAC7D,GAAI/2D,GAAM/2B,KAAKg8C,QAAQylG,EACvB,IAAI1qH,EAAI4qE,gBAAiB,EAAM,CAC7B,GAAIxgB,GAAkB,EAEtB,IAAIpqD,EAAI8jL,WAAY,CAClB,GAAIW,GAAqBjhL,KAAKC,MAAMzD,EAAI8jL,YAAYY,eAGhDD,GAAmBrqM,EAAIqqM,EAAmBT,EAAIS,EAAmBR,EAAI,MACvE75H,EAAkBzzE,OAAO,2CACvB8tM,EAAmBrqM,EACnBqqM,EAAmBT,EACnBS,EAAmBR,IAIzB,OACE/4D,WAAY,SAAWz4I,KAAKskF,KAAKxS,UAAUwS,KAAKuqD,kBAAkBjtI,QAAQq2I,MAAe,EAAK,WAAa,IAC3GtgE,gBAAiBA,EACjB+gE,YACE3+I,GAAMwzB,EAAIxzB,GACV66B,KAAQ,MACRgX,SAAYmE,EACZ4oG,aAAcprH,EAAIxzB,GAClBm4M,eAAgBniK,EAChBoiK,cAAiB,wGAMzBp2M,IAAG2mB,MAAM,WACP3mB,GAAGynB,UAAUjJ,KAAK6iE,EAAU+zH,WAAWppM,KAAK,SAAUu8F,GAEpD,GAAI5oB,GAAK3/E,GAAGygB,IAAIi/D,UAEZ5yD,GACF,GAAI6yD,GAAGC,YAAYqP,eAAc,GACjC,GAAItP,GAAGC,YAAYiS,eACnB,GAAIlS,GAAGC,YAAY0X,aACnB,GAAI3X,GAAGC,YAAY4b,eACnB,GAAI7b,GAAGC,YAAY2c,mBAAoBM,KAAM,iBAAkBy1D,QAAS34E,IACxE,GAAIgG,GAAGC,YAAY8d,mBACnB,GAAI/d,GAAGC,YAAYgf,gBAAgBx4E,EAAOsuL,yBAGxCrsG,EAAa,GAAIjiF,GAAO2tL,oBAAoB//J,EAAe2lC,EAAes6H,EAAkBptL,GAG5FwvL,EAA+B,SAAUn6D,EAAWC,EAAY3iI,EAAO4iI,EAAWC,GACpF,GAAIgD,GAAQhD,EAAYr+I,EAGxB,QAFAwb,EAAQA,GAAS,GAET4iI,EAAUp+I,IAChB,IAAK,eAEH,MAAO,yLACT,KAAK,YAEH,KACF,SACE,GAAIuE,GAAO+2J,iBAAiBy8C,EAAyB12D,IAEjDrxF,GACFd,QAAS,GACT9yD,KAAM,GAGR,IAAIgiJ,EAAUpuF,KAAM,CAClB,GAAIsoJ,GAAcj6D,EAAYD,EAAUp+I,GACxCgwD,GAAKd,QAAU,OACfc,EAAK5zD,KAAO,cAAgBgiJ,EAAUpuF,KAAKrlD,QAAQ,WAAY02I,GAAO12I,QAAQ,WAAY2tM,GAAe,IAG3G,GAAIr4M,GAAQ,EACRo+I,GAAwB,aAC1Bp+I,EAAQmoB,EAAOivL,wBAAwBrgL,KAAKC,MAAMonH,EAAwB,aAG5E,IAAIz7I,GAAS,MAAQy+I,CAErB,OAAO92C,GAAajqG,QAClBL,MAAOA,EACP+vD,KAAMA,EACNx0C,MAAOA,EACPjX,KAAMA,EACN3B,OAAQA,MAKZ21M,EAAgB,GAAI52H,GAAG0P,KAAK,kBAAmBgZ,EAAY9c,GAC7D+c,qBAAsB0tG,EACtBztG,aAAc8tG,EACdvpL,QAASA,EACT6zE,gCACE3sD,cAAeA,EACf2lC,cAAeA,EACfvkD,OAAQvO,EAAMy0E,0BACd65G,gBAAiBtuL,EAAMilF,gBACvBh3E,aAAcjO,EAAM0tL,gBAKpBiC,EAAmB,WACrBx2M,GAAGmpB,eAAend,KAAK,WACrBhM,GAAGmE,GAAG8pB,WAAW3R,KAAK,iBAG1Bi6L,GAAc35L,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+zE,kBAAmBkmH,GAAkB55L,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM4/E,sBAAuBq6G,GAE9HD,EAAc35L,KAAK5c,GAAGygB,IAAIk/D,GAAG0P,KAAK9yE,MAAM+zE,kBAAmB,WAEzDhjD,iBAKFlnB,EAAO2vD,UAAYwgI,EACnBnwL,EAAOyyF,cAAct2F,gBAM1BxjB,OAAOkF,KAAKskF;CC7Kf,SAAwCniE,GAOtC,GAAIqwL,GAAsBz2M,GAAGygB,IAAIi/D,UAAUmB,iBAAiB3kF,QAC1Dw6M,qBAAsB,KACtBp2F,SAAU,KAEVtlH,KAAM,SAAUulH,GACd,GAAI/iG,GAAK/iB,IAET+iB,GAAGe,OAAOgiG,GACV/iG,EAAGw2L,SAAW9nM,mBACdsR,EAAGk5L,qBAAuBn2F,EAAaG,oBACvCljG,EAAG8iG,SAAWC,EAAapZ,QAE3B3pF,EAAG/hB,UACDk7M,YAAY,GAAI32M,IAAG6e,MAAOqC,eAG5B5nB,EAAE4C,OAAOshB,EAAG/hB,SAAU8kH,IAIxBO,SAAU,WACR,GACI9xD,GADAxxC,EAAK/iB,IAST,OAPIuF,IAAGmE,GAAG4a,OAASlU,YAAYC,YAC7BkkD,EAAO,GAAKhvD,GAAGmE,GAAGyyM,cAGhB52M,GAAGmE,GAAG4a,OAASlU,YAAYK,mBAC7B8jD,EAAO,GAAKhvD,GAAGmE,GAAG0jE,oBAEbvuE,EAAEwkB,QAAQkxC,EAAM,GAAGhvD,GAAGmE,GAAG4gI,mBAAoB,GAAGvnH,EAAGk5L,uBAAuBl+L,WAAW,IAAI,KAMlGmoG,WAAY,SAAU7/B,GACpB,GAAItjE,GAAK/iB,IAET,OADAqmF,GAAYozH,QAAU12L,EAAGw2L,SAClBx2L,EAAG2jE,eAAeL,IAO3BtiE,KAAM,SAAUsiE,GACd,GAAItjE,GAAK/iB,KACLijB,EAAS,GAAIpkB,GAAE0nB,QAWnB,OAVAhhB,IAAG8L,IAAIxR,KAAK,gCAAiCkjB,EAAGmjG,WAAW7/B,IAAc90E,KAAK,SAAU5R,GACtFsjB,EAAO6E,SAAU4nF,KAAM7wG,EAAEsoB,UAAUxnB,OAClCooB,KAAK,SAAU3jB,GAChBmB,GAAG2mB,MAAM,WACP,GAAI4c,GAA2B,OAAf1kC,EAAE2kC,SAAoBC,OAAO5kC,EAAE2kC,UAAY5pB,MAC3D5Z,IAAGmE,GAAGylB,WAAWltB,KAAKmC,EAAEshB,MAAOvG,OAAW2pB,KAE5C7lB,EAAO6E,SAAU4nF,YAGZzsF,EAAOkF,WAIhBo+D,UAAW,WACT,GAAIxjE,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,WACX4/F,EAAStnH,EAAE,IAAIkkB,EAAG8iG,UAIlBlmH,EAAOwmH,EAAOxmH,KAAK,QAOvB,OANIA,IAAQA,EAAiB,kBAAUA,GAAiB,WACxDsjB,EAAO6E,QAAQnoB,GAKRsjB,GAITujE,UAAW,SAAUH,EAAa2zH,GAChC,GAAIj3L,GAAK/iB,KACLijB,EAASpkB,EAAE0nB,UASf,OARAtgB,cAAa8c,EAAGqjG,kBAChBrjG,EAAGqjG,iBAAmB9/G,WAAW,WAC/Bf,GAAGmnB,MAAM0tD,YAAYv/B,QAAQ93B,EAAGsjG,WAAYtjG,EAAGmjG,WAAW7/B,IAAc90E,KAAK,WAC3E0R,EAAO6E,YACNC,KAAK,WACN9E,EAAOiF,YAER,KACIjF,EAAOkF,YAQlBwD,GAAOqwL,oBAAsBA,GAG5B13M,OAAOkF,KAAKskF;CC9Gf,SAAgCniE,GAE9B9sB,EAAE,WAEA,GAAImmH,GAAen6F,UAAUiC,WAAWgH,SAASd,QAAQiyF,mBACzDK,qBAAsB,GAAIN,GAAa,uBAAwBr5F,EAAOqwL,uBAAyBz2M,GAAGunB,WAAWm4D,UAAUE,YAAYikB,mBAAoB7jG,GAAGmE,IAC1J47G,oBAAoBnjG,KAAK6iG,EAAaljG,MAAMyjG,SAAU,SAAUC,GAC9D75F,EAAOqH,QAAUwyF,EAAaC,cAC9BD,EAAaE,cAAcn0G,KAAK,WAC9BhM,GAAGopB,iBAAiB7G,gBAK1BjpB,EAAEiwB,KAAKvpB,GAAGipB,iBAAkBjpB,GAAGiqB,SAAUjqB,GAAGkpB,aAAa9F,KAAK,WACvDpjB,GAAGmE,GAAGgD,KAAK+a,YAGhBliB,GAAGmE,GAAGmtB,wBAGNtxB,GAAGmE,GAAGgD,KAAKyV,KAAK,cAAe,WAC7B,IAAK,GAAIyV,KAAaryB,IAAGmE,GAAGgD,KAAK6nB,SAASZ,OAAQ,CAChD,GAAIyC,GAAQ7wB,GAAGmE,GAAGgD,KAAK6nB,SAASZ,OAAOiE,GACnCQ,EAAOhC,EAAMgC,KAAKnB,UAClBq0E,EAAUlzE,EAAKA,EAAKtqB,OAAS,EAE7BsqB,GAAKtqB,QAAUw9F,IAAYA,EAAQD,wBAA0BC,EAAQqa,SACvEvvF,EAAMo0E,UAAUc,EAAQxzE,YAAY,UAQ3CxzB,OAAOkF,KAAKskF;CCpCf,SAAWniE,GAkYT,QAASywL,KACP,GAAItuH,GAAOuuH,IACP99G,EAAgBzQ,EAAK1hE,MAAMoyE,cAE3B89G,EAAkBxuH,EAAK1hE,MAAMo6E,mBAC1B81G,GAAgB/9G,EAAcl6E,IAErCk4L,GACE/9G,cAAe3/F,EAAE4C,UAAW88F,GAC1Bl6E,GAAI,KACJw0B,KAAM,GACN8xC,aAAc,GACd8T,YAAa,GACbkC,WAAY,GACZoF,mBAEFS,aAAc81G,EACdhhH,UAAW,IAIf,QAASkhH,KACP39M,EAAE,iDAAiDS,YAAY,YAC/DT,EAAE,kBAAkBkG,KAAK,QAAS4B,EAAE,0BACpC9H,EAAE,mBAAmBkG,KAAK,QAAS4B,EAAE,2BACrC9H,EAAE,gBAAgBkG,KAAK,QAAS4B,EAAE,wBAEpC,QAAS81M,KACP59M,EAAE,iDAAiDa,SAAS,YAC5Db,EAAE,kBAAkBkG,KAAK,QAAS4B,EAAE,yBAA2B,KAAOA,EAAE,mCACxE9H,EAAE,mBAAmBkG,KAAK,QAAS4B,EAAE,0BAA4B,KAAOA,EAAE,yCAC1E9H,EAAE,gBAAgBkG,KAAK,QAAS4B,EAAE,uBAAyB,KAAOA,EAAE,mCA/ZtE,GAAI01M,GAAU,WACZ,MAAO7yM,MAAKskF,KAAKxS,WAOfihI,EAAuB,SAAU3uM,GACnC,GAAIkgF,GAAOuuH,IAEPxxH,IAUJ,IATmC,mBAAxBj9E,GAAkB,YAC3Bi9E,EAASyQ,UAAY1tF,EAAkB,WAEF,mBAA5BA,GAAsB,gBAC/Bi9E,EAAS2T,cAAgB5wF,EAAsB,eAEL,mBAAjCA,GAA2B,oBAAqBA,EAA2B,sBAAM,GAC1FkgF,EAAKA,KAAK6Y,oBAEuB,mBAAxB/4F,GAAkB,UAAmB,CAC9C,GAAI2wF,GAAgB1T,EAAS2T,eAAiB1Q,EAAK1hE,MAAMoyE,aACzD3/F,GAAE4C,OAAOopF,GACP2T,cAAe3/F,EAAE4C,UAAW88F,GAC1BS,UAAWpxF,EAAkB,cAMnCkgF,EAAKlD,YAAYC,GAEXiD,EAAK+W,cAAc/W,EAAK+W,eACxB/W,EAAKwP,cAAcxP,EAAKwP,eAE9BxP,EAAKqJ,WAAWtM,GAAUj5D,OAAO,SAAUjyB,GAEzCmuF,EAAKlD,aACH4b,aAAc7mG,EAAKwjF,MAAMqjB,eAE3B76E,EAAOs0E,QAAQyG,sBASnB/6E,GAAOs0E,SACL4K,WAAW,EACXl4B,UAAW,IACX8gH,2BAA4B,wBAC5B+N,qBAAuBvgM,MAAO,IAAKG,OAAQ,IAC3Cm4C,cAAeh0C,GAAGmE,GAAG0jE,mBACrB8R,cAAe35E,GAAGmE,GAAG4gI,mBACrBkvE,iBAAkB,IAQpBv5G,QAAQy8G,oBAAsB,SAAUn7M,EAAO4yE,EAAmBsL,EAAmBL,GACnF6gB,QAAQnzB,UAAYvrE,EACpB0+F,QAAQ1mD,cAAgB46B,GAAqB5uE,GAAGmE,GAAG0jE,mBACnD6yB,QAAQ/gB,cAAgBO,GAAqBl6E,GAAGmE,GAAG4gI,mBACnDrqC,QAAQu5G,iBAAmBp6H,EACtB6gB,QAAQu5G,kBACX36M,EAAEiwB,KAAKvpB,GAAG8oB,aAAa1F,KAAK,WAC1Bs3E,QAAQu5G,iBAAmBhwM,KAAKskF,KAAKgmG,yBAY3C7zF,QAAQyzF,oBAAsB,SAAU39I,EAAUp2C,GAIhD,IAAK,GAFDg9M,GAAa,KACbC,EAAsBj9M,EAAKmO,OAAS,EAC/BvG,EAAI,EAAGA,EAAI5H,EAAKmO,OAAQvG,IACR,KAAnB5H,EAAK4H,GAAS,OAChBo1M,EAAah9M,EAAK4H,GAClB5H,EAAKwV,OAAO5N,EAAG,IAEM,eAAnB5H,EAAK4H,GAAS,OAChBq1M,EAAsBr1M,EAG1B,IAAMo1M,EAAY,CAEhB,GAAIE,GAAWl9M,EAAKi9M,EAAsB,EACjB,QAArBC,EAAe,OACjBA,EAASl1M,iBAAkB,GAE7Bg1M,EAAWh1M,iBAAkB,EAE7BhI,EAAKwV,OAAOynM,EAAqB,EAAGD,GAGtC,IACE,GAAI1iL,GAAWp7B,EAAE4C,UAAWw+F,QAAQuhG,oBAAqB3rB,kCAAkC9/H,GAC3FkqD,SAAQ68G,YAAc,GAAIv3M,IAAGunB,WAAWi4D,MAAM4d,gBAAgB5sD,EAAUp2C,EAAMs6B,GAC9EgmE,QAAQ68G,YAAYj5M,SACpBo8F,QAAQ68G,YAAY36L,KAAK,aAAc,SAAUtb,GAC/C,OAAQA,EAAKoD,MACX,IAAK,cACH3F,OAAO27F,QAAQ88G,kBAAkBl+M,EAAEk3C,GACnC,MACF,KAAK,iBACHzxC,OAAO27F,QAAQ+8G,oBAAoBn+M,EAAEk3C,GACrC,MACF,KAAK,gBACHzxC,OAAO27F,QAAQg9G,aAAap+M,EAAEk3C,GAC9B,MACF,SACExwC,GAAG8L,IAAIiqE,UAAUiE,UAAU0gB,QAAQ1mD,cAAe1yC,EAAKoD,KAAMg2F,QAAQ/gB,cAAe+gB,QAAQu5G,kBAAkBn5K,QAAQ,SAAU68K,GAClG,OAAxBA,EAAiB74L,KAAa64L,EAAiBl+G,WAAY,GAC/Du9G,GACE/9G,cAAe0+G,EACf5hH,UAAW,EACX6hH,oBAAoB,IAGJ,OAAdt2M,EAAKoD,KACPpL,EAAEk3C,GAAUz2C,YAAY,YAExBT,EAAEk3C,GAAUr2C,SAAS,iBAK/B,MAAOu9B,MAKXgjE,QAAQ88G,kBAAoB,SAAUr7M,GACpCu+F,QAAQpgB,WAAWn+E,GAAI,IAGzBu+F,QAAQ+8G,oBAAsB,SAAUt7M,GACtCu+F,QAAQpgB,WAAWn+E,GAAI,IASzBu+F,QAAQpgB,WAAa,SAAUn+E,EAAI07M,GACjC,IAAIv+M,EAAE6C,GAAIjC,SAAS,YAAnB,CAMA,IAAK,GALDm5J,GAAKrzJ,GAAGunB,WAERm6E,EAAUhH,QAAQ68G,YAAYv7M,MAC9BC,KAEK+F,EAAI,EAAGA,EAAI0/F,EAAQn5F,OAAQvG,IACX,MAAnB0/F,EAAQ1/F,GAAG0C,MAAmC,KAAnBg9F,EAAQ1/F,GAAG0C,MAAkC,eAAnBg9F,EAAQ1/F,GAAG0C,MAA4C,kBAAnBg9F,EAAQ1/F,GAAG0C,MAA+C,iBAAnBg9F,EAAQ1/F,GAAG0C,OAC7IzI,EAAQylG,EAAQ1/F,GAAG0C,MAAQg9F,EAAQ1/F,GAAGqiG,MAI1C,IAAyB,KAArB3J,QAAQttB,YAAqB9zE,EAAE,qBAAqBkmC,GAAG,YACzD,MAAOtH,aAAY92B,EAAE,mBAAoBA,EAAE,mBAG7C,IAAI+F,GAAO,GAAIksJ,GAAGtvI,MAAMC,YAAY,qBAC/Bs7F,eAAe,cACf0J,QAAQ,cAAe/sH,EAAS,KAAM,MAAM,GAAQquF,YAAc,GACvEnjF,GAAKi+G,cAAgB,KAErB,IAAIh+G,GAAS,GAAIisJ,GAAG9yI,QAAQ6D,UAC5Bhd,GAAOid,MAAQwzL,EAAYz2M,EAAE,mBAAqBA,EAAE,eACpDgG,EAAO/I,KAAO8I,EAAK7I,SACnB8I,EAAOmlC,oBAAqB,EAC5BnlC,EAAO7J,GAAK,WACV,GAAI4J,EAAKi6G,aAAc,EAAO,OAAO,CACrC,IAAInnC,GAAW9yE,EAAK+sB,SAAS,eACzBmmD,EAAalzE,EAAKg9D,gBAAgB,cACjC0zI,GAsBH73M,GAAG8L,IAAIiqE,UAAUqE,gBAAgBsgB,QAAQ1mD,cAAeqmC,EAAYqgB,QAAQ/gB,cAAe+gB,QAAQu5G,kBAAkBn5K,QAAQ,SAAU68K,GACrIX,GACE/9G,cAAe0+G,MAvBM,KAArBj9G,QAAQttB,UACVptE,GAAG8L,IAAIiqE,UAAUuE,WAAWogB,QAAQ1mD,cAAe0mD,QAAQttB,UAAWiN,EAAYqgB,QAAQ/gB,cAAe+gB,QAAQu5G,kBAAkBn5K,QAAQ,SAAU68K,GACnJX,GACE/9G,cAAe0+G,MAIH,IAAZ19H,EACFj6E,GAAG8L,IAAIiqE,UAAUqE,gBAAgBsgB,QAAQ1mD,cAAeqmC,EAAYqgB,QAAQ/gB,cAAe+gB,QAAQu5G,kBAAkBn5K,QAAQ,SAAU68K,GACrIX,GACE/9G,cAAe0+G,MAInB33M,GAAG8L,IAAIiqE,UAAUuE,WAAWogB,QAAQ1mD,cAAeimC,EAAUI,EAAYqgB,QAAQ/gB,cAAe+gB,QAAQu5G,kBAAkBn5K,QAAQ,SAAU68K,GAC1IX,GACE/9G,cAAe0+G,OAa3BvwM,EAAOwV,KAAK,SAAU,WACpB,GAAIk7L,GACA/jJ,EAAQxiB,sBAAsBmwD,EAAS,OAAQ,IACnD,IAAIx8F,SAAS6uD,EAAO,KAAO,EACzB+jJ,EAAiBp2G,EAAQ3tC,GAAOswC,UAEhC,IAAKwzG,EAGE,CACL,GAAIl2G,GAAc59F,EAAEA,EAAE29F,GAAS3qF,IAAI,SAAUQ,GAC3C,OAAQA,EAAE7S,QACRvE,KACJ23M,GAAiB12M,EAAE,qBAAuB,IAAMjE,KAAKgD,IAAIwhG,EAAc,EAAG,OAN1E5tC,GAAQxiB,sBAAsBmwD,EAAS,OAAQhH,QAAQttB,WACvD0qI,EAAiBp2G,EAAQ3tC,GAAOswC,KAQpCl9F,GAAK2sB,SAAS,cAAe,KAAMgkL,GAEnCx+M,EAAE,gBAAgBy1D,SAAS,SAAUn1D,GACjB,IAAdA,EAAGqjD,UACL71C,EAAO7J,KACP6J,EAAOkyB,aAIblyB,EAAO1K,OAEPyzC,8BAA8B,gBAQhCuqD,QAAQg9G,aAAe,SAAUv7M,GAC/B,IAAI7C,EAAE6C,GAAIjC,SAAS,YAAnB,CACA,GAAIyI,GAAW+3F,QAAQ68G,YAAYjzF,kBAC/Bl9G,EAAS,GAAIpH,IAAGunB,WAAWhH,QAAQ6D,UACvChd,GAAOid,MAAQjjB,EAAE,gBACjBgG,EAAO3I,OAAS,OAChB2I,EAAOmlC,oBAAqB,EAC5BnlC,EAAOkd,QAAQnc,OAAO,aAAc/G,EAAE,8BAA+BwX,WAAWjW,EAAS0hG,SACzFj9F,EAAOwV,KAAK,KAAM,WAChB5c,GAAG8L,IAAIiqE,UAAU0E,aAAaigB,QAAQ1mD,cAAerxC,EAAS+B,KAAMg2F,QAAQ/gB,cAAe+gB,QAAQu5G,kBAAkBn5K,QAAQ,SAAUpd,GACrIm5L,QAGJzvM,EAAO1K,SASTg+F,QAAQyG,kBAAoB,WAC1B,GAAI5Y,GAAOuuH,IACPiB,EAAa,KACb99H,EAAW,GAAKsO,EAAK1hE,MAAMoyE,cAAcn6E,EAC7C47E,SAAQttB,UAAY6M,CAEpB,IAAIynB,GAAUnZ,EAAK1hE,MAAMo6E,YACzB,IAAMS,EAAS,CACb,GAAIs2G,IACFtzM,KAAQ,KACR2/F,MAASjjG,EAAE,wBACXgB,iBAAmB,EACnBO,SAA0B,OAAbs3E,GAEXg+H,GAAqBD,EACzB,KAAK,GAAI39H,KAAcqnB,GAAS,CAC9B,GAAIpgG,IACFoD,KAAQ21E,EACRgqB,MAAS3C,EAAQrnB,GAEfA,IAAcJ,IAChB34E,EAAKqB,UAAW,EAChBo1M,EAAa99H,GAEf34E,EAAiB,WAAI,iBACrB22M,EAAkBjqM,KAAK1M,GAIzB,GAA0C,IAAtChI,EAAE,yBAAyBiP,OAAc,CAE3C0vM,EAAkBA,EAAkB1vM,OAAS,GAAoB,iBAAI,CAErE,IAAI2vM,GAA+B,OAAfH,GAAuC,mBAATxvH,EAElD0vH,GAAkBjqM,MAAOtJ,KAAM,cAAe2/F,MAAOjjG,EAAE,uBAAwByB,KAAM,gBAAiBJ,SAAUy1M,EAAcllG,QAAW7qG,OAAO,aAAc/G,EAAE,uBAAwBA,EAAE,qCAC1L62M,EAAkBjqM,MAAOtJ,KAAM,iBAAkB2/F,MAAOjjG,EAAE,0BAA2BqB,SAAUy1M,EAAcllG,QAAW7qG,OAAO,YAAa/G,EAAE,0BAA2BA,EAAE,2CAC3K62M,EAAkBjqM,MAAOtJ,KAAM,gBAAiB2/F,MAAOjjG,EAAE,yBAA0ByB,KAAM,YAAaJ,SAAUy1M,EAAcllG,QAAW7qG,OAAO,aAAc/G,EAAE,yBAA0BA,EAAE,qCAG9Ls5F,QAAQnzB,UAAY0wI,EAEdv9G,QAAQwzF,4BACZxzF,QAAQyzF,oBAAoBzzF,QAAQwzF,2BAA4B+pB,GAGlEv9G,QAAQy9G,uBAAuBz2G,EAASq2G,GAGxC9zM,KAAK4jD,SAASkuB,UAAUq4G,0BAQ5B1zF,QAAQy9G,uBAAyB,SAAUz2G,EAASq2G,GAClD,GAAIK,GAAoB9+M,EAAE,wBACtB8+M,GAAkB7vM,OAAS,GAAOm5F,IACpC02G,EAAkBl2M,KAAKw/F,EAAQq2G,IAEb,MAAdA,GACFK,EAAkBl2M,KAAKd,EAAE,yBACzB42M,UAAUr1M,UAAW,GAErBy1M,EAAkBl2M,KAAKw/F,EAAQq2G,GAAYrhM,MAAM,KAKhC,OAAfqhM,EACFd,IAEAC,MASNx8G,QAAQC,YAAc,WACpB,GAAIpS,GAAOuuH,GAEPvuH,GACFvoF,GAAG8L,IAAIiqE,UAAU0E,aAAaigB,QAAQ1mD,cAAe,IAAK0mD,QAAQ/gB,cAAe+gB,QAAQu5G,kBAAkBn5K,QAAQ,SAAUpd,GAC3Hm5L,MAGFA,KAQJn8G,QAAQH,kBAAoB,SAAU3gB,GACpC,GAAIx/E,IACFq/F,UAAW7f,EACXmc,UAAW,EAEb+gH,KAAUvuH,KAAK6Y,oBACf41G,EAAqB58M,KAqCtB2E;ACpaH,cAEA,SAAWqnB,GASTA,EAAOsqJ,WACL2nC,YAEAr9M,KAAM,WACJ,GAAIs9M,GAAaC,UACbC,EAAax4M,GAAGmnB,MAAMsvB,QAAQ,UAElC,IAAI6hK,GAAcE,EAAY,CAC5Bx7L,IAAIoQ,QAAQ,UAAW,gDACvB,KAAK,GAAI43B,KAAWvqD,MAAK49M,SACvB59M,KAAK49M,SAASrzJ,GAAS1qD,KAAKG,KAAM+9M,EAAYF,EAEhDt4M,IAAGmnB,MAAMmuB,QAAQ,UAAWgjK,OAMjCv5M,OAAOkF;CC7BV,SAAWmiB,GAMT,GAAIqyL,GAAgB,SAAUD,EAAYF,GACxCt7L,IAAIqQ,KAAK,YAAa,yCAEtBrtB,GAAGmnB,MAAM4pD,WAAW,oBACpB/wE,GAAGmnB,MAAM4pD,WAAW,mBAItB3qD,GAAOiyL,SAASrqM,KAAKyqM,IAEpBx0M,KAAKysK;CChBR,SAAWtqJ,GAMT,GAAIsyL,GAAoB,SAAUF,EAAYF,GAC5Ct7L,IAAIqQ,KAAK,YAAa,2CAEtB,KAAK,GAAI3V,KAAKw5D,cAERx5D,EAAE7R,QAAQ,YAAa,GACzB7F,GAAGmnB,MAAM4pD,WAAWr5D,GAM1B0O,GAAOiyL,SAASrqM,KAAK0qM,IAEpBz0M,KAAKysK;ACpBR,cAEC,SAAUtqJ,GACT,GAAIuyL,KAKJA,GAAWC,aAAe54M,GAAGygB,IAAIF,QAAQmiB,WAAWxmC,QAClDlB,KAAM,WACJP,KAAK8C,GAAKyC,GAAGmE,GAAGpF,OAAOu6B,MACvB7+B,KAAK6yG,SAAS,KACd7yG,KAAK+xG,OAAQ,KASjBmsG,EAAWpvK,UAAY,SAAUrnC,IAC/B,GAAKy2M,GAAWC,cAAcl8M,KAAKwF,EAAM,KAAMd,EAAE,OAAQ,UAM3Du3M,EAAWE,iBAAmB,YAC5B,GAAKF,GAAWC,cAAcl8M,KAAK0E,EAAE,0CACnC,KACAA,EAAE,kCACF,SAMJu3M,EAAW56I,YAAc,WACvB46I,EAAWG,kBAAkB/9M,OAC7B49M,EAAWn5E,SAAS9iI,QAMtBi8M,EAAW36I,YAAc,WACvB26I,EAAWG,kBAAkBp8M,OAC7Bi8M,EAAWn5E,SAASzkI,QAGtBqrB,EAAOuyL,WAAaA,GACpB55M,OAAOkF,MAKTqhB,UAAUqB,MAAM,WACd,GAAyB,WAArB3mB,GAAGuE,cAA4B,CACjCN,KAAK00M,WAAWI,SAAWz/M,EAAE,eAC7B2K,KAAK00M,WAAWG,kBAAoBx/M,EAAE,qBACtC2K,KAAK00M,WAAWn5E,SAAWlmI,EAAE,YAC7B2K,KAAK00M,WAAWK,aAAe1/M,EAAE,eAEjC,IAAI2lB,GAAM,GAAIqG,WAAUpG,IACpBogE,EAAargE,EAAIwX,SAAS,aAAexX,EAAIwX,SAAS,OAG1Dz2B,IAAGwnB,SAASltB,KAAK,gCAAkCmrJ,WAAYnmE,IAActzE,KAAK,SAASszE,GACzF,GAAIgnE,GAAStmJ,GAAG0jB,UAAUy/H,QAAQ7jE,EAElCt/E,IAAGwnB,SAASltB,KAAK,gCACfmrJ,WAAYnmE,EACZh+D,eAAgB,OACftV,KAAK,SAAUitM,GAChBh1M,KAAK00M,WAAWI,SAAS16M,KAAK8J,OAAO/G,EAAE,UAAW63M,IAClDh1M,KAAK00M,WAAWK,aAAa36M,KAAK8J,OAAO/G,EAAE,qBAAsB63M,IAGjE3yD,EAAO1pI,KAAK0pI,EAAc,MAAE/pI,MAAMipI,iBAAkB,WAClDvhJ,KAAK00M,WAAW56I,gBAIlBuoF,EAAO1pI,KAAK0pI,EAAc,MAAE/pI,MAAMiqI,qBAAsB,WACtDxmJ,GAAGmE,GAAGpF,OAAOu6B,UAIfgtH,EAAOG,wBAAwBp6H,OAAO,WACpCpoB,KAAK00M,WAAW36I,gBACfhyD,KAAK,SAAUs6I,GAChBA,EAAOlsH,OACPn2B,KAAK00M,WAAWE,qBACfr2L,KAAK,SAAUkV,GAChBzzB,KAAK00M,WAAWpvK,UAAU7R,OAE3BlV,KAAK,SAAUkV,GAChBzzB,KAAK00M,WAAWpvK,UAAU7R;AClGlC,cAEA,SAAWtR,GAMTA,EAAOtG,eACN/gB,OAAOkF;CCTV,SAAW3K,EAAG8sB,GAMZ,GAAI8yL,GAAsB98L,MAAMlgB,QAC9ByR,UAAW,sBAEXo0E,QAAS,KAGT6iC,UAAW,GAEXu0F,aAAc,GAEdpwF,eAAe,EAGf/tH,KAAM,SAAUiB,GACd,GAAIuhB,GAAK/iB,IACTnB,GAAE4C,OAAOshB,EAAIvhB,GAET3C,EAAE,SAAWkkB,EAAGonG,WAAWr8G,OAC7BiV,EAAG47L,eAEH9/M,EAAE,WACAyH,WAAWyc,EAAG47L,aAAax8L,KAAKY,GAAK,MAI3C47L,aAAc,WACZ,GAAI57L,GAAK/iB,IAET+iB,GAAGukE,QAAUzoF,EAAE,SAAWkkB,EAAGonG,WAC7BpnG,EAAG67L,SAAW//M,EAAE,WAAakkB,EAAGonG,WAEhCpnG,EAAG87L,gBAILA,aAAc,WACZ,GAAI97L,GAAK/iB,IACT+iB,GAAGukE,QAAQxmF,GAAG,QAASiiB,EAAG+7L,SAAS38L,KAAKY,KAI1C+7L,SAAU,SAAUz7M,GAClB,GAAI0f,GAAK/iB,KAEL++M,EAAgB17M,EAAM47G,cAAc8/F,eAAiBz6M,OAAOy6M,cAC5DC,EAAaD,EAAc5sF,QAAQ,OAEvC,IAAI6sF,EAAY,CACd,GAAI/rL,GAAQlQ,EAAGk8L,4BAA4BD,EACvC/rL,IAASA,EAAMnlB,OAAS,EAC1BiV,EAAGm8L,0BAA0BjsL,GAAO1hB,KAAK,SAAU4tM,GACjDp8L,EAAGq8L,iBAAiBD,KACnBp3L,KAAK,SAAUiJ,GAEhBjO,EAAGukE,QAAQrzE,IAAI+qM,KAIjBj8L,EAAGukE,QAAQrzE,IAAI+qM,GAInB37M,EAAML,iBACNK,EAAMjE,mBAIR8/M,0BAA2B,SAAUjsL,GAEnC,GAAIzhB,GAAI3S,EAAE0nB,UAKV,OAJA/U,GAAEsW,QAAQmL,EAAM3W,IAAI,SAAU6H,GAE5B,MADAA,GAAKla,KAAOka,EAAK5gB,GACV4gB,KAEF3S,EAAE2W,WAIXi3L,iBAAkB,SAAUD,GAC1B,GAAIp8L,GAAK/iB,IACT,IAAI+iB,EAAGurG,cAAe,CACpB,GAAIj4F,GAAS8oL,EAAc7iM,IAAI,SAAU+iM,GACvC,MAAOt8L,GAAGu8L,mCAAmCD,IAE/Ct8L,GAAGukE,QAAQlgB,UAAU/wC,GAAQ,OAE7BtT,GAAGukE,QAAQlzC,SAASrxB,EAAGu8L,mCAAmCH,EAAc,KAAK,IAKjFG,mCAAoC,SAAUD,GAE5C,OAAQA,EAAa97M,GAAI87M,EAAap1M,KAAKkU,aAAckhM,EAAap1M,KAAM,OAI9Eg1M,4BAA6B,SAAUD,EAAY1wF,GAIjD,IAAK,GAHDvrG,GAAK/iB,KACLu/M,EAAcP,EAAW/vM,MAAM,MAC/BgkB,KACK1rB,EAAI,EAAGA,EAAIg4M,EAAYzxM,OAAQvG,IAAK,CAC3C,GAAI4wE,GAAOonI,EAAYh4M,GACnB4c,EAAOpB,EAAGy8L,iBAAiBrnI,EAC/B,IAAIh0D,IACF8O,EAAM1f,KAAK4Q,IACNmqG,GACH,MAIN,MAAOr7F,IAITusL,iBAAkB,SAAUrnI,GAC1B,GAAIp1D,GAAK/iB,KACLy/M,EAActnI,EAAKj2D,aAOvB,OALAa,GAAG28L,sBAAwB38L,EAAG28L,uBAAyB3rD,gBAAgB7xI,cACvEa,EAAG48L,gBAAkB58L,EAAG48L,iBAAmB16J,UAAU/iC,cAIjDu9L,EAAYr0M,QAAQ2X,EAAG28L,0BAA2B,GAClDD,EAAYr0M,QAAQ2X,EAAG48L,oBAAqB,GAC5CF,EAAYr0M,QAAQ,IAAM2X,EAAG27L,iBAAkB,EAC1C37L,EAAG68L,kBAAkBznI,GAEvB,MAITynI,kBAAmB,SAAUp7L,GAE3B,MAAO,QAKXmH,GAAO8yL,oBAAsBA,GAE5BryM,OAAQ9H,OAAOkF,KAAK6b;CCpJvB,SAAWxmB,EAAG8sB,GAMZ,GAAIk0L,GAA0Bl0L,EAAO8yL,oBAAoBh9M,QACvDyR,UAAW,0BAGXyrM,aAAc,WACZ,GAAI57L,GAAK/iB,IACT+iB,GAAGe,QAEH,IAAI4U,GAAS3V,EAAGukE,OAEhB5uD,GAAOjlB,SAASxI,MACd,WAAc8X,EAAG+8L,uBAAuB9/M,KAAM04B,EAAQ3V,EAAGg9L,iBACzD,WAAch9L,EAAGi9L,uBAAuBhgN,KAAM04B,KAGhDA,EAAO53B,GAAG,cAAe,SAAUsD,GAGjC,MAFAA,GAAEpB,iBACFoB,EAAEhF,mBACK,GAGT,IAAI6gN,GAAgCl9L,EAAGk9L,+BAAiCvnL,EAAO/4B,KAAK,WACpFsgN,GAAgCphN,EAAE4C,OAAOw+M,GACvCjiL,KAAMjb,EAAG67L,SACT1qK,aAAc5vC,OAAOkF,KAAK6b,WAAW66L,6BAEvCxnL,EAAOquC,gBAAgBk5I,EAA+BvnL,EAAOjlB,SAASA,SAASvP,KAAK,iBAEpFw0B,EAAOzV,OAAO,SAAU5f,EAAO1D,GAC7BojB,EAAGo9L,cACDznL,EACA/4B,EACAojB,EAAGq9L,oBACHr9L,EAAGs9L,yCAMTnB,0BAA2B,SAAUjsL,GACnC,GAAIzhB,GAAI3S,EAAE0nB,WAENpC,EAAO8O,EAAM,EAcjB,OAXA3sB,YAAW,SAAWg6M,GACpB,MAAO,YACL/6M,GAAG8L,IAAInM,SAASy9E,aAAa29H,EAAM/8M,KAAKgO,KAAK,SAAUgvM,GACrDD,EAAMr2M,KAAOs2M,EACb/uM,EAAEsW,SAASw4L,MACVv4L,KAAK,SAAUiJ,GAChBxf,EAAE0W,OAAO8I,OAGZ7M,GAAO,GAEH3S,EAAE2W,WAIXy3L,kBAAmB,SAAUp7L,GAC3B,GAAIg8L,GAAUh8L,EAAItC,cAAc9W,QAAQ,OACxC,IAAIo1M,KAAY,EAAI,CAClB,GAAIC,GAAQj8L,EAAIrI,OAAOqkM,EAAU,GAC7Bj9M,EAAKkH,SAASg2M,EAAO,GACzB,OAAO,IAAIl7M,IAAG6e,KAAK7gB,EAAI6M,YAAYC,WAErC,MAAO,OAIT8vM,cAAe,SAAUnsM,EAAKrU,EAAM+gN,EAAiBC,GAC/ChhN,EACEd,EAAE8jB,WAAW+9L,IAAkBA,EAAgB/gN,EAAK,KAGpDghN,GAAuBD,EAAgB,MAC3C1sM,EAAIogC,SAAS,OAEfpgC,EAAIs/B,UAINwsK,uBAAwB,SAAU/kJ,EAAW/mD,EAAK+rM,GAChD,GAAIa,GAAS/hN,EAAEk8D,GAAW72D,KAAK,uBAC/B08M,GAAO3+M,MAEP,IAAI4+M,GAAWD,EAAO18M,KAAK,gBACvB48M,EAAeF,EAAO18M,KAAK,gBAE3BuhD,EAAS5mD,EAAE,WAAamV,EAAIjP,KAAK,OAAOkP,KAC9B,OAAVwxC,GAA6B,MAAXA,GAAmBs6J,GAA2C,QAAxB/rM,EAAIrU,KAAK,aAAiD,YAAxBqU,EAAIrU,KAAK,aAA6BqU,EAAIrU,KAAK,eAAgB,IAAS,QAAQ0rC,KAAKoa,IAIjLo7J,EAASvgN,OACTwgN,EAAaxgN,SAJbugN,EAAS5+M,OACT6+M,EAAa7+M,SAQjB+9M,uBAAwB,SAAUjlJ,EAAW/mD,GAC3CnV,EAAEk8D,GAAW72D,KAAK,wBAAwB5D,OAAO4D,KAAK,KAAK5D,UAO7DygN,aAAc,SAAUF,EAAUG,GAChC,GAAIv7J,GAAS5mD,EAAE,WAAamiN,GAAS/sM,MACjCkQ,EAAO,GAAI5e,IAAG6e,MAAMqhC,EAAQr1C,YAAYC,UAC5C8T,GAAKwb,QAIPshL,iBAAkB,SAAUJ,EAAUG,GACpC,GAAIl+H,IAASjkF,EAAE,WAAamiN,GAAS/sM,KAErC,OAA4B,SAAxBs9B,wBACF8hI,gBAAgB9vK,GAAIu/E,IAAS,GAEI,iBAAxBvxC,wBACT8hI,gBAAgB9vK,GAAIu/E,IAAS,OAK/ByiF,YAAWziF,GAAO,EAAM,GAAG,KAK/Bn3D,GAAOk0L,wBAA0BA,GAEhCzzM,OAAQ9H,OAAOkF,KAAK6b;CC7IvB,SAAWxmB,EAAG8sB,GAMZ,GAAIu0L,IASFjlL,UAAW,SAAUzW,EAAK5W,EAAQ63D,EAAWC,GAG3C,MAAOngE,IAAG8L,IAAIxR,KAAK,oDACjBw6B,aAAcx7B,EAAEsoB,UAAUvZ,EAAOysB,cACjC6mL,YAAatzM,EAAO2O,EACpBwgF,SAAUnvF,EAAO+3D,MACjB0wE,WAAYzoI,EAAO/D,KACnBs3M,cAAe,wBACfx5J,eAAe,GACd,GAAI,IAAI,GAAM,GAAMp2C,KAAK,SAAU5R,GACpC,GAAI6nE,GAAW3oE,EAAEsoB,UAAUxnB,GAAM2c,IAAI,SAAUm1B,GAC7C,GAAI2vK,GAAWC,eAAe5vK,EAAQ/hB,IAAIxN,cACrCk/L,KAAUA,EAAW,kBAC1B,IAAIE,GAAa,mFAAqFF,EAAW,gBAC7GG,EAAW,EACf,QAAQ9vK,EAAQ06H,MACd,IAAK,OACHo1C,EAAW,0JACb,KAAK,OACHA,EAAW,8JAEf,GAAIn5M,GAAO,4CAA8Ck5M,EAAaC,EAAW,SACjF,QACEh+M,GAAIkuC,EAAQluC,GACZ63B,aAAchzB,EAAOqpC,EAAQxnC,KAAKkU,aAClCyL,MAAO6nB,EAAQxnC,KACfkxB,uBAAwB,OAIxBsqC,IAAWA,EAAU,IAAS+B,KAEjCz/C,KAAK,SAAUC,GACZ09C,GAASA,EAAQ19C,GAAc,MAKzC2D,GAAOu0L,2BAA6BA,GAEnC9zM,OAAQ9H,OAAOkF,KAAK6b;CCxDvB,SAAWxmB,EAAG8sB,GAMZ,GAAI61L,GAAiC71L,EAAO8yL,oBAAoBh9M,QAC9DyR,UAAW,iCAGXgsM,0BAA2B,SAAUjsL,GAEnC,GAAIzhB,GAAI3S,EAAE0nB,UAKV,OAJA/U,GAAEsW,QAAQmL,EAAM3W,IAAI,SAAU6H,GAE5B,MADAA,GAAKla,KAAO,GAAKka,EAAK5gB,GACf4gB,KAEF3S,EAAE2W,WAIXy3L,kBAAmB,SAAUp7L,GAG3B,GAAIg8L,GAAUh8L,EAAItC,cAAc9W,QAAQ,OACxC,IAAIo1M,KAAY,EAAI,CAClB,GAAIC,GAAQj8L,EAAIrI,OAAOqkM,EAAU,GAC7Bj9M,EAAKkH,SAASg2M,EAAO,IAErBrrK,EAAW,EACf,OAAO,IAAI7vC,IAAG6e,KAAK7gB,EAAI6M,YAAYK,iBAAkB2kC,GAEvD,MAAO,QAIXzpB,GAAO61L,+BAAiCA,GAEvCp1M,OAAQ9H,OAAOkF,KAAK6b;ACnCvB,QAASo8L,8BAA6BlkK,EAAK77C,GACzC67C,EAAQ,GAAI1+C,EAAE6C,GAAIE,QAAQ,IAAM27C,EAAIh6C,IACpCm+M,6BAA6BnkK,GAG/B,QAASmkK,8BAA6BjuM,GAOpC,QAAS6zJ,GAAKC,GACZ,GAAIo6C,GACAC,EACAC,CAGe,SAAfpuM,EAAO2qB,MACTwjL,EAAc,YACdC,GAAkBhgL,OAAQpuB,EAAOlQ,GAAIygC,cAAeujI,KAEpDq6C,EAAc,WACdC,GAAkB7hL,MAAOvsB,EAAOlQ,GAAIygC,cAAeujI,IAGrDx1I,YAAY6vL,EAAc,iBAAkBC,EAC1C,SAAUz6M,GACR,GAAKA,EAAIm2B,SAGP,GADAokL,EAAYv6M,EAAI6gB,OACC,CACfxU,EAAOlQ,GAAKo+M,EACZluM,EAAO2qB,KAAO,MACd,IAAIxwB,GAAS,WACbk0M,GAAQ3wL,SAAW0tI,iBAAiBprJ,EAAQ7F,GAC5Ck0M,EAAQvrL,aARMmvC,GAAQt+D,EAAIse,QAYhCggD,GAlCJ,GAAIo8I,GACAp8I,EAAU,SAAUn1C,GACtBuxL,EAAQjjL,QACRnB,UAAUnN,EAAO,KAAM,MA0CrBkV,EAAWhyB,EAAOtL,GAAGpD,KAAK,YAC1BkrK,EAAa,GAAI1qK,IAAGkf,IAAI,mBAG5B,IAFAwrJ,EAAWtrJ,SAAS,UAAWhe,EAAE,qBAE7B8+B,EAAW,GAEb,GAAKlgC,IAAGygB,IAAIF,QAAQmiB,YAAc5E,YAAY18B,EAAE,yCAMhD6C,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChD,GAAIQ,GAAarf,EAAOtL,GAAGpD,KAAK,gBAChC,QAAQ0gC,GACN,IAAK,IACHq8K,EAAU7xC,EAAWtwI,KAAKlsB,EAAO2qB,KAAO3qB,EAAOlQ,IAC5B,QAAfkQ,EAAO2qB,KACTvT,UAAU4C,MAAMi6I,KAAK4rC,oBAAoB7/L,EAAOlQ,GAAIkiC,EAAU3S,EAAY,GAAIw0I,EAAM5hG,GAEpF76C,UAAU4C,MAAMi6I,KAAK6rC,mBAAmB9/L,EAAOlQ,GAAIkiC,EAAU3S,EAAY,GAAIw0I,EAAM5hG,EAErF,MACF,KAAK,IACL,IAAK,IACH1gC,6BAA6B,GAC3B,SAAUC,GACR68K,EAAU7xC,EAAWtwI,KAAKlsB,EAAO2qB,KAAO3qB,EAAOlQ,IAC5B,QAAfkQ,EAAO2qB,KACTvT,UAAU4C,MAAMi6I,KAAK4rC,oBAAoB7/L,EAAOlQ,GAAIkiC,EAAU3S,EAAYmS,EAAUqiI,EAAM5hG,GAE1F76C,UAAU4C,MAAMi6I,KAAK6rC,mBAAmB9/L,EAAOlQ,GAAIkiC,EAAU3S,EAAYmS,EAAUqiI,EAAM5hG,YAMhG,CAIL,GAHAo8I,EAAU7xC,EAAWtwI,KAAK,MAAQlsB,EAAO2qB,KAAO3qB,EAAOlQ,IAGlB,QAAjCgC,GAAGC,IAAIuoB,GAAG9jB,KAAKiY,cAAyB,CAC1C,GAAI8qB,GAAWznC,GAAGmE,GAAGswC,SAAWwyG,eAC5B3iJ,EAAuB,QAAf4J,EAAO2qB,KAAiB,OAAS,MACzC2jL,EAAU,GAAKx8M,IAAGkf,IAAI,IAAM5a,EAAO,QAOvC,OANmB,QAAf4J,EAAO2qB,KACT2jL,EAAQp9L,SAAS,OAAQ,cAEzBo9L,EAAQp9L,SAAS,KAAM,kBAEzBo9L,GAAQp9L,SAAS,KAAMlR,EAAOlQ,IAAIohB,SAAS,SAAUqoB,GAAUynC,OAAOqtI,GAIxEx6C,EAAK,OAQT,QAAS06C,mBAAkBz+M,EAAIqE,EAAMwgG,GACnC7kG,EAAKA,GAAMw4B,cAAc,MACzBn0B,EAAOA,IAAS,aAAayjC,KAAKla,SAASE,UAAY,MAAQ,QAC/D+2E,EAAQA,GAAS,KACjBm7D,gBAAgB,kBACd35I,MAAOjjB,EAAE,6BACT7D,GAAI,WASF,MARAjE,GAAE,iBAAiBc,KAAK,UAAW,WACjCd,EAAE,iBAAiB8N,OAAO,SACd,OAAR/E,EACF60B,SAAS,WAETA,SAAS,SAEb59B,EAAE,sBAAsBg+B,UACjB,GAETl4B,OAAQ,WACM,QAARiD,EACFmqB,YAAY,+BAAiC8P,OAAQt+B,EAAI0+M,gBAAiB,GAAK,WAC7EpjN,EAAE,iBAAiB8N,OAAO,SAC1B8vB,SAAS,UAGXkC,qBACAlC,SAAS,cAGb7uB,QAAUs0M,OAAQ3+M,EAAI4+M,SAAUv6M,EAAMw6M,cAAeh6G,GACrDpkG,OAAQ,OACR/C,MAAO,IACPujK,UAAW,WACTl+J,WAAW,WAETzH,EAAE,iBAAiB6E,IAAI,SAAU,QAEjCmnB,UAAUmF,IAAInO,KAAK,YAEnB,IAAIwgM,GAAgBxjN,EAAE,aAEtBwjN,GAAcvhN,GAAG,WAAY,SAAUuC,EAAOyrF,GAC5CuzH,EAAc3+M,IAAI,SAAU,WAE7B,OAGP7E,EAAE,iBAAiB6E,IAAI,WAAY,QAGrC,QAAS4+M,qBACP,GAAI/+M,GAAKw4B,cAAc,KACvBhK,aAAY,+BAAiC8P,OAAQt+B,EAAI0+M,gBAAiB,GAAK,WAC7EpjN,EAAE,iBAAiB8N,OAAO,SAC1B8vB,SAAS,SAIb,QAAS8lL,0BAAyB96M,GAChCg2B,YAAYh2B,EAAMd,EAAE,6BAA8B27M,kBAAmB,KAAM,KAAM,MAAM,GAIzF,QAASpc,uBACP,GAAI3iM,GAAKw4B,cAAc,KACvBwnI,iBAAgB,kBACd35I,MAAOjjB,EAAE,kBACT7D,GAAI,WACF,GAAIixG,GAAMl1G,EAAE,iBACRqoD,EAAU6sD,EAAI7vG,KAAK,iBAAiB+P,KASxC,OAPAk+J,kBAAiB5uK,EAAI2jD,EAAS,WAG5B,MAFAzqB,UAAS,kBACTs3E,EAAIpnG,OAAO,UACJ,GACN,SAAU61M,GACXzuG,EAAIp0G,KAAK,SAAS6iN,MAEb,GAET50M,QAAUi0B,OAAQt+B,KAItB,QAAS4uK,kBAAiBtwI,EAAQogL,EAAiBx8I,EAAWC,GAC5Dze,6BAA6Bg7J,EAAiB,SAAUtiN,GACtD,GAAIirB,GACA63L,EAA2B,WAC7B1wL,YAAY,+BAAiC8P,OAAQA,EAAQogL,gBAAiBA,GAAmB,SAAU76M,GACzG,GAAIA,EAAIm2B,QAAS,CACf,GAAIkoC,EAAW,CACb,GAAIzzD,GAAIyzD,GACR,IAAIzzD,KAAM,EACR,OAGA5K,EAAI6gB,OACN+5L,kBAAkBngL,EAAQ,QAE1BpF,SAAS,kBAEPgpC,GAAWA,QAEXC,IACFA,EAAQt+D,EAAIse,SAQhB/lB,GAAK49B,SAAiC,GAAtB59B,EAAKsoB,OAAOna,QAAmD,GAApCnO,EAAKsoB,OAAO,GAAG6/B,WAAWh6C,SACvE8c,EAAoB/rB,EAAE2V,KAAK7U,EAAKsoB,OAAO,GAAG6/B,WAAW,GAAGhmB,QAIR,mBAAvCjX,WAAUC,OAAOF,GAC1BC,UAAUkF,KAAKnN,QAAQ,SAAU6/L,EAA0B73L,GAE3D63L,KAED,WACDH,sBAIJ,QAASI,kCAAiCzxM,GACxC,GAAI0xM,GAAmB,SAAUvlL,GAC/BK,YAAYxsB,EAAKtK,EAAE,WAAY,KAAMA,EAAE,MAAO,IAAKy2B,GAAU,IAE3DwlL,EAAgBtvD,cAEpB91H,gBAAe,GAAI,EAAG,KAAMolL,GAC5Bt8M,WAAW,WACLs8M,GAEFx0M,IAAIo/F,SAAS,IACbm1G,EAAiB,WACfv0M,IAAIo/F,SAAS,kBAGfm1G,KAED,KAIL,QAASE,8BAGP,IAAK,GAFDC,IAAQjkN,EAAE,sBAAuBA,EAAE,2BACnCq8B,EAAQ,EACH3zB,EAAI,EAAGA,EAAIu7M,EAAKh1M,OAAQvG,IAAK,CACpC,GAAIyM,GAAM8uM,EAAKv7M,GACXw7M,EAAK/uM,EAAIrU,KAAK,iCACdojN,IAAMA,EAAGC,eACX9nL,GAAS6nL,EAAGE,WAAW/nJ,cAAcptD,OAC5BkG,EAAIlG,OAAS,IACtBotB,GAASlnB,EAAIrU,KAAK,2BAA2B2gE,YAAYxyD,QAG7D,MAAOotB,GAIT,QAASgoL,kBAAiBlvM,EAAKrU,EAAMwjN,EAAcC,EAAmBC,EAAuBC,EAAyBC,GACpH,GAAIC,GACAC,GAAwB,CAC5B,IAAK9jN,GAAuB,GAAfA,EAAKmO,OAAlB,CAGA,GAAKjP,EAAEuzB,cAAczyB,EAAK,IAcxB6jN,EAAU7jN,EAAK,GAEf8jN,IAA0BF,MAhBG,CAE7B,GAAIhgN,GAAK5D,EAAK,GACV4gE,EAAUh9D,EAAG0L,MAAM,KACnBkrB,EAAU,EACQ,IAAlBomC,EAAQzyD,QACVqsB,EAAUomC,EAAQ,GAClBh9D,EAAKg9D,EAAQ,IAEbpmC,EAAUgpL,EAEZK,GAAYhjJ,UAAWrmC,EAAS52B,GAAIA,EAAI0G,KAAMtK,EAAK,IASrD,GAAI+jN,IAAkBljJ,UAAWgjJ,EAAQhjJ,UAAWj9D,GAAIigN,EAAQjgN,GAAI0G,KAAMu5M,EAAQv5M,KAGlF,IAAIu5M,EAAQhjJ,YAAc8iJ,EAAyB,CACjD,GAAI/iJ,GAAUijJ,EAAQjgN,GAAG0L,MAAM,IACT,IAAlBsxD,EAAQzyD,SACV01M,EAAQhjJ,UAAYD,EAAQ,GAC5BijJ,EAAQjgN,GAAKg9D,EAAQ,IAWzB,OAJIkjJ,GAAyBD,EAAQjgN,GAAK,GACxCgC,GAAG8L,IAAIqqE,QAAQ2F,kBAAkBmiI,EAAQhjJ,UAAWgjJ,EAAQjgN,GAAIigN,EAAQv5M,MAGlEu5M,EAAQhjJ,WACd,IAAK2iJ,GAEH,GAA2C,mBAAhCQ,8BAA+E,OAAhCA,4BAAsC,CAC9F,GAAIC,GAAoBf,4BACpBe,GAAoBD,6BACtB3vM,EAAImzD,wBAAwBu8I,EAAcljJ,UAAY,IAAMkjJ,EAAcngN,OAC1Em/M,iCAAiC/7M,EAAE,mBAE9B2sJ,gBACH/tJ,GAAGygB,IAAIod,IAAIhU,WAAWttB,UAMxB4hN,EAAcljJ,YAAc8iJ,GAC9BtvM,EAAIkzD,oBAAoBw8I,EAAcljJ,UAAY,IAAMkjJ,EAAcngN,KAAM4/M,EAAe,IAAMK,EAAQjgN,GAAIigN,EAAQv5M,KAAMu5M,EAAQv5M,OAGrI,MACF,KAAKm5M,GACHS,iBAAiB7vM,EAAKwvM,EAASJ,EAAmBD,EAAcO,EAChE,MACF,KAAKL,GACH1kL,qBACA3qB,EAAIkqD,cACJr/D,EAAE,0BAA0Bq/D,cAC5Bi0G,iBAAiBp2I,cAAc,MAAOynL,EAAQjgN,GAAI,KAAM,SAAU0N,GAEhEggB,UAAUhgB,GAAK,GAEf+C,EAAI6gC,QACJ7gC,EAAIqzD,aACJxoE,EAAE,0BAA0BwoE,iBAMpC,QAASw8I,kBAAiB7vM,EAAKnN,EAAMu8M,EAAmBD,EAAcO,GACpE,GAAI78M,EAAK25D,WAAa4iJ,EAAmB,CACvC/lL,eAAe12B,EAAE,kBAAkB,GAAO,EAE1C,IAAIm9M,GAAe,SAAUn7K,GAE3B5W,YAAY,kCAAoC2W,QAAS7hC,EAAKtD,GAAIolC,qBAAsBA,EAAsBC,aAAa,GAAS,SAAUxhC,GAC5I,GAAIA,EAAIm2B,QAAS,CACf,GAAIggC,MAEAqmJ,EAAoBf,6BAA+B,CAEpB,OAA/Bc,6BAAwCC,EAAoBx8M,EAAI6gB,OAAOna,QAAW61M,6BAC/ErwD,gBACH/tJ,GAAGygB,IAAIod,IAAIhU,WAAWttB,UAGxBjD,EAAEkB,KAAKqH,EAAI6gB,OAAQ,WACjBs1C,EAAUhqD,MAAM4vM,EAAe,IAAMnjN,KAAKuD,IAAK,GAAKvD,KAAKyH,MAAM0W,aAAcne,KAAKyH,SAIpFuM,EAAIkzD,oBAAoBw8I,EAAcljJ,UAAY,IAAMkjJ,EAAcngN,GAAIg6D,GAEtEA,EAAUzvD,OAAS,EACrB0vB,eAAe72B,EAAE,kBAAmB,IAAM,MAAM,GAEhD62B,eAAe72B,EAAE,8BAA+B,IAAM,MAAM,KAG9DqN,EAAIkzD,oBAAoBw8I,EAAcljJ,UAAY,IAAMkjJ,EAAcngN,OACtEm/M,iCAAiC/7M,EAAE,uBAGrCqN,GAAIkzD,oBAAoBw8I,EAAcljJ,UAAY,IAAMkjJ,EAAcngN,OACtEm/M,iCAAiCt7M,EAAIse,SAK3CqM,aAAY,4CAA8C2W,QAAS7hC,EAAKtD,IAAM,SAAU6D,GACtF,GAAIA,EAAIm2B,QAEN,GAAIn2B,EAAI6gB,OAAQ,CACd,GAAI87L,IAAkB,EAElBC,EAAS,WACXD,GAAkB,EAClBD,GAAa,IAEX73J,GACFxkD,KAAMiG,OAAO/G,EAAE,0DAA4D0hC,UAAaxhC,EAAKoD,OAC7F40B,MAAO,WACAklL,GACHD,GAAa,GAEftmL,eAAe,GAAI,IAAM,MAAM,GAC/BpvB,IAAIo/F,SAAS,gBAGjBlnG,YAAW,WAET8H,IAAIo/F,SAAS,IACbv/D,iBAAiBge,EAAM+3J,EAAQ,eAC9B,SAGHF,IAAa,MAOvB,QAASG,+BAA8BjwM,EAAKmvM,EAAcC,EAAmBC,EAAuBa,EAAmBZ,GACrH,OACEa,eAAgBd,EAAuBC,GACvCroG,UAAU,EACVmpG,kBAAmBF,EACnB5zL,QACE+zL,YAAe,WACb,GAAI7uK,GAAQxhC,EAAIjP,KAAK,KACR,sBAATywC,EACFE,8BAA8B,cAE9BA,8BAA8B,mBAGlC4uK,eAAkB,SAAU1jN,EAAWiG,GACrCq8M,iBAAiBlvM,GAAMnN,GAAOs8M,EAAcC,EAAmBC,EAAuBC,GAAyB,MAMvH,QAASiB,iCACP1lN,EAAE,WACAyH,WAAW,WACTzH,EAAE,sBAAsBuzK,8BACvB,OAKP,QAASoyC,yBAAwBlB,EAAyBvqL,GACxD,GAAI0rL,GAAW5lN,EAAEwB,MAAQkF,GAAGC,IAAIC,WAEhCszB,GAASj4B,GAAG,gBAAiB,SAAU3B,EAAIg7B,EAAS/B,GAC9C+B,EAAQjY,gBAAkBohM,EAAwBphM,eACpDrjB,EAAEkB,KAAKq4B,EAAM,WACX,GAAIrB,GAAMl4B,EAAEmB,KACZ,KAAK+2B,EAAIt3B,SAAS,wBAAyB,CACzC,GAAIilN,GAAS3tL,EAAI7yB,KAAK,UAEtB,KAAKwgN,EAAOjlN,SAAS,yBAA2BilN,EAAOjlN,SAAS,4BAA6B,CAC3F,GAAIklN,GAAS9lN,EAAE,uCAAyC4lN,EAAW,GAAK,aAAe,6IAGvFE,GAAO7jN,GAAG,QAAS,SAAU3B,GAC3BA,EAAGC,kBACHD,EAAG6D,gBAGH,IAAIO,GAAKwzB,EAAIhyB,KAAK,WAAWkK,MAAM,KAAK,GAAGA,MAAM,KAAK,EAKtD,OAJA1J,IAAG8L,IAAIqqE,QAAQ+F,qBAAqBl+E,GAEpCwzB,EAAI2Z,UAEG,IAET3Z,EAAI7yB,KAAK,UAAU4kD,QAAQ67J,GAGtBF,GACH1tL,EAAIj2B,GAAG,2BAA4B,WACjCjC,EAAEmB,MAAMkE,KAAK,kBAAkB5E,YAAY,eAC1CwB,GAAG,2BAA4B,WAChCjC,EAAEmB,MAAMkE,KAAK,kBAAkBxE,SAAS,eAK9Cq3B,EAAIr3B,SAAS,6BA8PvB,QAASklN,wBAAuBr0L,GAC9B,GAAIyX,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UAC9BD,GAAK/mC,MAAQ,IACb+mC,EAAK8G,UAAUve,EAAO,KAAM,KAAM,WAAchrB,GAAGmE,GAAGpF,OAAOu6B,UAQ/D,QAASgmL,yBAIP,QAAShyG,GAASnnG,GAChBA,EAAIjB,SAASiB,EAAG,GAChB,IAAI00H,GAAiBvhI,EAAE,mBACnBimN,EAAO1kF,EAAel8H,KAAK,kBAC/B4gN,GAAK7jN,MAAMyK,EAEX,IAAIguK,GAAQt5C,EAAel8H,KAAK,cAChCw1K,GAAMh2K,KAAM87H,YAAe9zH,GAC3B,IAAI4zH,GAAczgI,EAAE,eAChBygI,GAAY7/H,SAAS,eACvB6/H,EAAY57H,KAAM87H,YAAe9zH,IAGnC2uK,kBAAkBj6C,EAElB,IAAIx1E,GAAKC,cAAci6J,EAAK5gN,KAAK,kBAAkBa,KAAK,MACpD6lD,GAAGE,UAAUF,EAAGE,WAnBtB,GAAIi6J,GAAO,IACPC,EAAqB,IAqBrB59M,EAAMvI,EAAE4yB,OAAO,WAEjBohF,GADIzrG,EACKA,EAEA49M,GAGXnmN,EAAE,yBAAyBK,UAAU,SAAUC,GAC7CA,EAAG6D,gBACH,IAAI2H,GAAQ9L,EAAEmB,MACVilN,EAAOpmN,EAAEyF,QAAQrD,QAAU+jN,CAC/Br6M,GAAMjL,SAAS,YAAYS,QAASiD,KAAM8hN,MAAM/lN,EAAGurD,MAAOq6J,EAAME,KAChEpmN,EAAE,QAAQ6E,IAAI,SAAU,cACvBye,KAAK,sBAAuB,SAAUhjB,GACrCA,EAAG6D,iBACH2H,EAAMxK,QAASiD,KAAM8hN,MAAM/lN,EAAGurD,MAAOq6J,EAAME,OAE5C9iM,KAAK,oBAAqB,SAAUhjB,GACnCA,EAAG6D,iBACHnE,EAAE,QAAQ6E,IAAI,SAAU,IAAI8e,OAAO,uBAAuBA,OAAO,qBACjE7X,EAAMrL,YAAY,YAAYoE,IAAI,OAAQ,GAC1C,IAAIgI,GAAI7M,EAAEyF,QAAQrD,QAAUikN,MAAM/lN,EAAGurD,MAAOq6J,EAAME,GAAQ,EAC1DpyG,GAASnnG,GACTxG,SAASusB,OAAS,YAAc/lB,MAsFtC,QAASy5M,+BACP,GAAIC,GAAgBvmN,EAAE,aAAaqF,KAAK,gBAExCkhN,GAAcrlN,KAAK,WACjB,IAAKlB,EAAEmB,MAAMkE,KAAK,mDAAmD4J,OAAQ,CAC3E,GAAIu3M,GAASxmN,EAAEmB,MAAMkE,KAAK,uBAAuBiG,IAAI,EACrDw0J,0BAAyB0mD,KAI7B,IAAIC,GAA4BzmN,EAAE,sBAAsB6mD,GAAG,GAAG9jD,QAAQ,aAAa0mC,SAAS,OACxFi9K,EAAuBD,EAA0BphN,KAAK,sBAC1DqhN,GAAqBxlN,KAAK,WACpBlB,EAAEmB,MAAMP,SAAS,iBACnBk/J,yBAAyB9/J,EAAEmB,QAI/B,IAAIwlN,GAAqC3mN,EAAE,+BAA+B6mD,GAAG,GAAG9jD,QAAQ,aAAa0mC,SAAS,MAC9Gk9K,GAAmCzlN,KAAK,WACtC,GAAIlB,EAAEmB,MAAMP,SAAS,YAAa,CAChC,GAAI8lN,GAAuB1mN,EAAEmB,MAAMkE,KAAK,sBACxCqhN,GAAqBxlN,KAAK,WACpBlB,EAAEmB,MAAMP,SAAS,iBACnBk/J,yBAAyB9/J,EAAEmB,YAQrC,QAASylN,0BACP,GAAIrlF,GAAiBvhI,EAAE,mBAEnB6mN,EAAetlF,EAAel8H,KAAK,sBAAsBtC,QAAQ,cAKrE,IAJK8jN,EAAa53M,SAChB43M,EAAetlF,EAAel8H,KAAK,+BAA+BtC,QAAQ,gBAGxE8jN,EAAa53M,OAAQ,CACvB,GAAI63M,GAAiBD,EAAavgN,WAC9BygN,EAAaxlF,EAAel8H,KAAK,iCACrC0hN,GAAW/gN,UAAU+gN,EAAW/gN,YAAc8gN,EAAeljN,MAKjE,QAASw+B,iCAAgCqE,GACvC,GAAIl+B,GAAMvI,EAAE,WAAa+E,KAAM+C,EAAE,iCAAkCgG,QACjEid,MAAOjjB,EAAE,gBACT48F,WAAW,EACXtiG,MAAO,IACP8wG,OAAO,EACP6C,UAAU,EACV/1E,MAAOyG,EACPpS,UAEEzrB,KAAMd,EAAE,aACR1D,MAAO,WACLpE,EAAEmB,MAAM2M,OAAO,SACf9N,EAAE,cAAc03B,WAIlB9uB,KAAMd,EAAE,eACR1D,MAAO,WACLpE,EAAEmB,MAAM2M,OAAO,SACfgyB,qBACAlC,SAAS,+BAA+B,MAI1Ch1B,KAAMd,EAAE,UACR1D,MAAO,WACLpE,EAAEmB,MAAM2M,OAAO,aAKrBgoG,qBAAoBvtG,EAAIu6B,QAI1B,QAASkkL,mCAAkC3jI,EAAQ4jI,EAAYr1L,GAG7D,QAASs1L,GAAoBC,GAC3BrnL,qBACA5M,YAAY,mCAAqC8P,OAAQqgD,EAAQC,OAAQ6jI,GAAqB,SAAU5+M,GAClGA,EAAIm2B,QACNd,SAAS,4DAA4D,GAErEopL,kCAAkC3jI,EAAQ96E,EAAI6gB,OAAQ7gB,EAAIse,SAKhE,GAAkB,SAAdogM,EAEF,WADArpL,UAAS,4DAA4D,EAIvE,IAAIuL,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UACZ,SAAd69K,GACF99K,EACE6F,UAAU,iBAAkBlnC,EAAE,WAAY,WAAco/M,EAAoBziM,cAAc3I,QAC1FkzB,UAAU,mBAAoBlnC,EAAE,UAAW,WAAco/M,EAAoBziM,cAAcE,UAC3FqqB,UAAU,iBAAkBlnC,EAAE,QAAS,WAAco/M,EAAoBziM,cAAc3K,QACvFk1B,UAAU,gBAAiBlnC,EAAE,6BAA8B,WAC1DpB,GAAGwnB,SAASltB,KAAK,sDAAwDgiC,OAAQqgD,IAAU7hD,QAAQ,WACjG5D,SAAS,4DAA4D,OAGxEoR,UAAU,gBAAiBlnC,EAAE,UAAW,WAAco/M,EAAoBziM,cAAcnM,SACxFkqG,kBAAkB,kBAEJ,QAAdykG,GACF99K,EACC6F,UAAU,iBAAkBlnC,EAAE,WAAY,WAAco/M,EAAoBziM,cAAc3I,QAC1FkzB,UAAU,gBAAiBlnC,EAAE,UAAW,WAAco/M,EAAoBziM,cAAcnM,SACxFkqG,kBAAkB,kBAEH,UAAdykG,GACF99K,EACG6F,UAAU,iBAAkBlnC,EAAE,WAAY,WAAco/M,EAAoBziM,cAAc3I,QAC1FkzB,UAAU,mBAAoBlnC,EAAE,UAAW,WAAco/M,EAAoBziM,cAAcE,UAC3FqqB,UAAU,gBAAiBlnC,EAAE,6BAA8B,WAC1DpB,GAAGwnB,SAASltB,KAAK,sDAAwDgiC,OAAQqgD,IAAU7hD,QAAQ,WACjG5D,SAAS,4DAA4D,OAGxEoR,UAAU,gBAAiBlnC,EAAE,UAAW,WAAco/M,EAAoBziM,cAAcnM,SACxFkqG,kBAAkB,kBAGL,YAAdykG,GACF99K,EACC6F,UAAU,gBAAiBlnC,EAAE,UAAW,WAAco/M,EAAoBziM,cAAcnM,SACxFkqG,kBAAkB,iBAGrBr5E,EAAK8J,oBAAqB,EAC1B9J,EAAKmZ,gBAAiB,CACtB,IAAIlwC,GAAMtK,EAAE,yCAEU,oBAAX8pB,KACTxf,EAAMtK,EAAE,qCAAuC,QAAU8pB,GAG3DuX,EAAKO,aAAa5hC,EAAE,8CAA+CsK,EAAKtK,EAAE,kBAsD5E,QAASs/M,yBAAwBvkN,GAC/B,GAAIwkN,GAAarnN,EAAE6C,GAAIqjC,GAAG,YAAc,EAAI,EACxCohL,EAAYtnN,EAAE,oCACdunN,EAAeD,EAAUxmN,KAAK,uBAChB,IAAdumN,GACFE,EAAax8I,qBAAqB,IAAKjjE,EAAE,UAAWA,EAAE,WAAW,IAAQ0yB,SAAS,KAAKywC,UACzD,KAA1Bs8I,EAAah+I,WAAkBvpE,EAAE4yB,OAAO,iBAAkB20L,EAAah+I,aAE3Eg+I,EAAav8I,uBAAuB,KAC9BhrE,EAAE4yB,OAAO,kBAAmB20L,EAAa/sL,SAASx6B,EAAE4yB,OAAO,mBAAmBs4C,SAC/Eq8I,EAAa78I,eAAeQ,UAEnClrE,EAAE,uBAAuBoV,IAAIiyM,GAyB/B,QAASziL,eAActf,GACrB,GAAMA,EAAM,CACV,GAAI61C,GAAMnP,cAAc,iDACpBovI,EAAY91K,EAAKsC,aAEjBuzC,GAAIrB,YAAYshI,KAElBjgI,EAAIpB,UAAUqhI,GACdjgI,EAAInB,gBA7nBV,SAAWltC,GAGT,GAAI06L,GAAe,KAGfC,EAA4B,WAC9B,MAAMD,GAAqBA,EACpBA,EAAe9gN,GAAG8L,IAAIxR,KAAK,4CAA6C,KAAM,KAAM,MAAM,GAAM,IAIrG0mN,KACAC,EAAuB,SAAU5+M,EAAMrE,EAAIuvB,EAAY4/K,EAAe+T,EAAQC,EAAmB/T,GACtF,MAAT/qM,GACFijB,UAAU4C,MAAMi6I,KAAKyrC,SAAS5vM,EAAIkjN,EAAQ3zL,EAAY,KAAM,KAAM,KAAM,KAAM4zL,EAAmBhU,EAAeC,GAErG,MAAT/qM,GACFijB,UAAU4C,MAAMi6I,KAAKurC,QAAQ1vM,EAAIkjN,EAAQ3zL,EAAY,KAAM,KAAM,KAAM,KAAM4zL,EAAmBhU,EAAeC,IAI/GgU,EAA6B,SAAUp2L,EAAOtmB,EAAMrC,EAAMrE,GAC5D,MAAI0G,GACKyD,OAAO,4DACA/G,EAAY,MAATiB,EAAe,OAAS,OAC3BqC,EACAsmB,EACA,GAAKhrB,IAAG6e,KAAK7gB,EAAIoD,EAAY,MAATiB,EAAewI,YAAYG,KAAOH,YAAYI,MAAQ0T,QAAQd,YAEzF,OAASmN,EAAQ,SAIxBq2L,EAAiB,SAAUh/M,EAAMrE,EAAI0G,EAAM48M,GAC7C,GAAI5jM,GAASpkB,EAAE0nB,UAuFf,OArFItc,KACFA,GAAQ,GAAKA,GAAMkU,cAGrB3U,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAChDg0L,IAA4B/0M,KAAK,SAAUnK,EAAK2oI,GAC9C,GAAI+2E,GAAc1/M,EACd2/M,EAAUD,EAAY73M,MAAM,MAChCwkE,QAAOF,KAAKC,SAASixE,oBACnBr/G,WAAY2hL,EAAQ,GACpBl7C,cAAek7C,EAAQ,GACvBjU,cAAeiU,EAAQ,GACvBC,SAAUj3E,EAAK7jG,QAGjB,IAAIogI,GAAO74F,OAAOF,KAAKC,SAASixE,kBAChC,KAAK6nB,EAAK06C,QAGR,MAFKH,IAAYnpL,WAAWqyG,EAAK7jG,SAAW,IAAI7sB,6BAChD4D,GAAOiF,OAAOy+L,GAA4B52E,EAAK7jG,SAAW,IAAI7sB,wBAAyBpV,EAAMrC,EAAMrE,GAKrG,IAAIqrK,GAAiB,SAASxnK,GAC5B,GAAIA,EAAIi5B,QAAS,CACf,GAAI4mL,GAA+B,MAATr/M,EAAe,oBAAsB,kBAC1Di/M,IAAY9qK,qBAAqBp1C,EAAEsgN,GAAqB,KAC7DhkM,EAAO6E,QAAQnhB,EAAEsgN,QACZ,CACL,GAAM7/M,EAAIqpB,SAA2B,qBAAfrpB,EAAI6b,OAAgC,CAExD,GAAIikM,GAAgBroN,EAAE,wBAElBsoN,EAAoBtoN,EAAE,iBAAiBqF,KAAK,kBAKhD,IAHIqiN,EAAqBn7M,QAAQ7H,KAAO,GACtCgjN,EAAqBhzM,KAAKhQ,GAEA,GAAxB2jN,EAAcp5M,OAAa,CAE7B,GAAgC,GAA5Bq5M,EAAkBr5M,OACtB,CACE,GAA+B,IAA3Bq5M,EAAkBlzM,MACpB,IAAK,GAAI1M,GAAI,EAAGA,EAAIg/M,EAAqBz4M,OAAQvG,IAC/Ci/M,EAAqB5+M,EAAM2+M,EAAqBh/M,GAAI+kK,EAAKlnI,WAAYknI,EAAKwmC,cAAexmC,EAAKT,cAAe+C,EAAgBu4C,EAAkBlzM,MAGnJ,QAGF,GAAI+3L,GAAc,GAAIzmM,IAAGygB,IAAIsD,MAAMC,YAAY,kBAC3C69L,EAAiB,qBACrBpb,GAAY3/E,SAAS+6F,EAAgB,KAAM,KAAM,WAEjD,IAAIz6M,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQ6D,UAChChd,GAAOid,MAAQjjB,EAAE,gBACjBgG,EAAOkd,QAAQmiL,EAAYnoM,UAE3B8I,EAAOmlC,oBAAqB,EAC5BnlC,EAAO7J,GAAK,WACV,GAAIukN,GAAerb,EAAYvyK,SAAS2tL,EACxCz6M,GAAOkyB,OACP,KAAK,GAAIt3B,GAAI,EAAGA,EAAIg/M,EAAqBz4M,OAAQvG,IAC/Ci/M,EAAqB5+M,EAAM2+M,EAAqBh/M,GAAI+kK,EAAKlnI,WAAYknI,EAAKwmC,cAAexmC,EAAKT,cAAe+C,EAAgBy4C,IAEjI16M,EAAO1K,OAET,OAGImF,IAAQy/M,GAAYnpL,UAAUt2B,EAAIqpB,SACxCxN,EAAOiF,OAAOy+L,EAA2Bv/M,EAAIqpB,QAAQpR,wBAAyBpV,EAAMrC,EAAMrE,KAG9FijN,GAAqB5+M,EAAMrE,EAAI+oK,EAAKlnI,WAAYknI,EAAKwmC,cAAexmC,EAAKT,cAAe+C,EAAgB,QAEvG7mJ,KAAK,SAAU27I,GACXmjD,GAAYnpL,UAAUgmI,GAC3BzgJ,EAAOiF,OAAOy+L,EAA2BjjD,EAAOrkJ,wBAAyBpV,EAAMrC,EAAMrE,QAEtFwkB,KAAK,WACN,GAAIiJ,GAAMrqB,EAAE,0BACPkgN,IAAYnpL,UAAU1M,GAC3B/N,EAAOiF,OAAOy+L,EAA2B31L,EAAI3R,wBAAyBpV,EAAMrC,EAAMrE,MAE7E0f,EAGT0I,GAAO2uK,SAAW,SAAU/2L,EAAI0G,EAAM48M,GACpC,MAAOD,GAAe,IAAKrjN,EAAI0G,EAAM48M,IAEvCl7L,EAAO4uK,QAAU,SAAUh3L,EAAI0G,EAAM48M,GACnC,MAAOD,GAAe,IAAKrjN,EAAI0G,EAAM48M,GAIvC,IAAIS,GAA6B,SAAU1/M,EAAMrE,EAAIq6C,EAAc9qB,GACjEtpB,KAAKikB,MAAMikB,UAAU,cAAcngC,KAAK,SAAU+gB,GAEhD,GAAIi1L,GAAkB,SAAUvpK,GAC9B3gB,eAAe12B,EAAE,gBAAgB,GAGjCg/B,aAAa5kB,gBAAgBS,mBAAoB,SAAUokB,GACzD,GAAI+8I,GAAuB,KAAR/6K,EAAc,sBAAwB,qBAGrDgG,GAAWq4B,WAAc2X,EAAc1X,qBAAwBpT,EAAYkT,MAASJ,EAClFoY,IAAkBn/C,EAAE4C,OAAOmM,EAAQowC,GAC7B,KAARp2C,EACFgG,EAAe,OAAIrK,EAEnBqK,EAAc,MAAIrK,EAGpBsnB,UAAU4C,MAAMoY,gBAAgB88I,EAAa,aAAc/0K,GAAQ2D,KAAK,SAAU0V,GAEpE,KAARrf,EACFmqB,YAAY,6BAA+B8P,OAAQt+B,EAAIygC,cAAe/c,EAAShE,QAAU,SAAUgE,GAC7FA,EAASsW,QACP1+B,EAAE,gCAAgCiP,OAAS,EAC7CjP,EAAE,iBAAiBG,OAAOioB,EAASgB,QAEnC3jB,OAAO6sB,SAASpF,SAGlBltB,EAAE,iBAAiBG,OAAOioB,EAASvB,SAIvCqM,YAAY,4BAA8BiO,MAAOz8B,EAAIygC,cAAe/c,EAAShE,QAAU,SAAUgE,GAC3FA,EAASsW,QACP1+B,EAAE,gCAAgCiP,OAAS,EAC7CjP,EAAE,iBAAiBG,OAAOioB,EAASgB,QAEnC3jB,OAAO6sB,SAASpF,SAGlBltB,EAAE,iBAAiBG,OAAOioB,EAASvB,WAIxCqC,KAAK,SAAUd,GAChB,IAGEi3B,cAAgBj3B,EAASwJ,QACzB,MAAOrsB,GACP85C,cAAgBv3C,EAAE,4BAEpB+2B,UAAUwgB,cAAe,WACnBN,EAAe,IAAM,EACvBhf,cAEA0oL,EAA2B1/M,EAAMrE,EAAIq6C,EAAc9qB,IAGvD,IACA,WACE8L,kBAEDhN,OAAO,SAAU3K,GAClBuW,eAAe,GAAI,MAEpBj6B,GAIL,OAAIq6C,IAAgB,EACX5Y,6BAA6B,KAClC,SAAU6Z,GAAQ0oK,GAAkBxjL,SAAU8a,KAC9C,WACShgD,EAAE,gBAAgBc,KAAK,YAC5Bi/B,gBAEDj6B,OAAS,WACVi6B,mBAGJ2oL,GAAgB,QAKtB57L,GAAO67L,qBAAuB,SAAUjkN,EAAIkiC,EAAU3S,GACpD,MAAOw0L,GAA2B,IAAK/jN,EAAMkiC,EAAWA,EAAW5a,UAAUkE,QAAQmW,SAAYpS,EAAaA,EAAajI,UAAUkE,QAAQqW,aAG/IzZ,EAAO87L,oBAAsB,SAAUlkN,EAAIkiC,EAAU3S,GACnD,MAAOw0L,GAA2B,IAAK/jN,EAAMkiC,EAAWA,EAAW5a,UAAUkE,QAAQmW,SAAYpS,EAAaA,EAAajI,UAAUkE,QAAQqW,cAG9I9gC,OAGH,IAAI+1K,mBAAoB,SAAUj6C,KAmB9B8kF,MAAQ,SAAUjxM,EAAK49G,EAAKnsH,GAC9B,MAAOhD,MAAKmvH,IAAInvH,KAAKgD,IAAIuO,EAAK49G,GAAMnsH,GAyDtC7G,GAAE,WACA,GAAI6oN,GAAuB7oN,EAAE,4BAA4BiG,cAGrD6iN,GAAgB,OAAQ,MAAO,SACnC,IAAIA,EAAav8M,QAAQ7F,GAAGuE,kBAAmB,EAA/C,CAEA,GAAIs2H,GAAiBvhI,EAAE,mBACnB+mN,EAAaxlF,EAAel8H,KAAK,iCACrC,IAAI0hN,EAAW93M,OAAQ,CACrB,GAAI85M,GAAmBhC,EAAWzlN,SAASsC,IACvColN,EAAYznF,EAAel8H,KAAK,oBAEhC4jN,GAAW,CAmBf,IAjBAxjN,OAAOu7H,oBAAsB,SAAU1gI,GACrC,IAAK2oN,EAAU,CACb,GAAIrzF,GAAUxoH,eAAiBosK,iBAC/BzxG,IAAK6tD,EAAU51H,EAAEqG,UAAUlB,SAAWiI,eACtC47M,EAAU7jN,OAAOtB,KAAKgD,IAAI,IAAKmiN,EAAU7jN,UAEzC,IAAI2H,GAAIjJ,KAAKgD,IAAI,IAAKkhE,GAAKghJ,EAAmBC,EAAU7jN,SAAW,GACnE4hN,GAAW5hN,OAAO2H,GACb9M,EAAEwB,MACLulN,EAAWriH,UAAU,SAAU,YAAaqiH,EAAW5hN,SAAW6jN,EAAU7jN,SAAW0jN,GAEzFh1K,wBAEAk1K,EAAmBhC,EAAWzlN,SAASsC,OAItC5D,EAAEwB,KAAM,CACX,GAAIkxD,GAASq0J,EAAWjkL,MACxBikL,GAAWriH,WACTwkH,SAAW55M,EAAGojD,GACdmoG,OAAQ,sBACRtvI,MAAO,WAAc09L,GAAW,GAChCt1K,OAAQ,SAAUrzC,EAAI2vF,GACpBA,EAAG4qE,OAAOz4J,MAAM6tF,EAAGk5H,aAAa/mN,MAAQ,IAE1CskC,KAAM,WAEJ,GAAIqhC,GAAK36D,cACL26D,GAAK,MAAKA,EAAK,IACnB,IAAIj7D,GAAIjJ,KAAKgD,IAAI,IAAKkhE,EAAKghJ,EAAmBhC,EAAW5hN,SAAW,GACpE6jN,GAAU7jN,OAAO2H,GACjBi6M,EAAWliN,KAAMzC,MAAS,SAE1Bo5K,kBAAkBj6C,GAClB0nF,GAAW,GAEbG,UAAW,IACX/mK,UAAW0kK,EAAW5hN,SAAW6jN,EAAU7jN,SAAW,MAI1D67H,sBAEAv5H,WAAW,WACT6+M,8BACAtlF,sBACA4lF,yBACA5mN,EAAE,aAAaS,YAAY,qBAC1B,IAEHT,EAAEyF,QAAQkuC,OAAOqtF,yBAuKrB,SAAWl0G,GACT,GAAIu8L,GAAsB,SAAU3kN,GAClC,GAAI2iN,GAAa,EAEbiC,EAAkBtpN,EAAE,wBACRA,GAAE,mCAClByH,YAAW,WACS,GAAd4/M,EACFiC,EAAgBpjN,KAAK,UAAW,WAAWuuC,SAG3C60K,EAAgBl+K,WAAW,WAAWqJ,UAGvC,KACHz0C,EAAE,uBAAuBoV,IAAIiyM,GA8B/Bv6L,GAAOy8L,oBAAsB,SAAU7kN,GACrC,MAAO2kN,GAAoB3kN,KAE5Be,QAiBHzF,EAAE,WACA0G,GAAG2mB,MAAM,WACP5lB,WAAW,WACT,GAAwB,QAApBf,GAAGuE,cAAyB,CAC9B,GAAIq8M,GAAYtnN,EAAE,mCACoB,MAAlCA,EAAE,uBAAuBoV,OACvBkyM,EAAUr4M,QAAQq4M,EAAUxmN,KAAK,wBAAwBiqE,qBAAqB,IAAKjjE,EAAE,UAAWA,EAAE,WAAW,IAAQ0yB,SAAS,KAAKywC,UACvIjrE,EAAE,yBAAyBkG,KAAK,WAAW,KAEvCohN,EAAUr4M,QAAWvI,GAAGwqB,KAAK1L,IAAM9e,GAAGwqB,KAAKs4L,YAAalC,EAAUxmN,KAAK,wBAAwBkqE,uBAAuB,KAAKN,eAAeQ,SAC9IlrE,EAAE,yBAAyBorC,WAAW,cAGzC;AC3mCP,QAASq+K,0BAAyBlqK,GAChC,GAAImqK,GAAyBnqK,EAAWhzC,QAAQ,KAC5Co9M,EAAWpqK,EAAWtpC,UAAUyzM,EAAyB,GACzDE,EAAWrqK,EAAWtpC,UAAU,EAAGyzM,GAEnCG,EAAsBD,EAASr9M,QAAQ,KACvCu9M,EAAoBF,EAASn3L,YAAY,KACzCs3L,EAAQH,EAAS3zM,UAAU,EAAG4zM,GAC9BtoM,EAAMqoM,EAAS3zM,UAAU4zM,EAAoB,EAAGC,GAChDE,EAAOJ,EAAS3zM,UAAU6zM,EAAkB,GAE5CG,EAAsBN,EAASp9M,QAAQ,KACvC29M,EAAqBP,EAASl3L,YAAY,KAC1CjiB,EAAQm5M,EAAS1zM,UAAU,EAAGg0M,GAC9BE,EAAOR,EAAS1zM,UAAUg0M,EAAsB,EAAGC,GACnDE,EAAOT,EAAS1zM,UAAUi0M,EAAqB,EAEnD,OAAO,IAAIt0M,MAAKo0M,EAAMD,EAAM,EAAGxoM,EAAK/Q,EAAO25M,EAAMC,EAAM,GAIzD,QAASC,yBAAwBC,GAC/B,GAAIC,GAAS1mN,KAAKC,MAAMwmN,EAAQ,SAC5BE,EAAS3mN,KAAKC,MAAMwmN,EAAQ,KAChC,OAAIC,GAAS,EACJA,EAAS,IAAMziN,EAAE,uBACf0iN,EAAS,EACXA,EAAS,IAAM1iN,EAAE,uBAEjBwiN,EAAQ,IAAMxiN,EAAE,sBAK3B,QAASotK,wBAAuBnyH,EAAK0nK,EAAah2C,GAIhD,IAAK,GAHDi2C,GAAuC,GAAtBD,EAAYx7M,OAC7Bg6B,GAAWnhC,EAAE,2BAA4BA,EAAE,kCAAmCA,EAAE,4BAChF6iN,EAAkB,KACbjiN,EAAI,EAAGA,EAAIq6C,EAAI4yH,SAAS1mK,SAAUvG,EACrCq6C,EAAI4yH,SAASjtK,GAAGyhC,QAAUsgL,EAAY,GAAGvjL,QAC7CyjL,EAAkB5nK,EAAI4yH,SAASjtK,EAGjC,IAAIkiN,GAAsBnB,yBAAyBgB,EAAY,GAAGI,UAC9DC,EAAqB51M,cAAcy1M,EAAgBI,kBACnDn5L,EAAU/iB,OAAO67M,EAAkB5iN,EAAE,2BAA2BoX,WAAW,QAAS,QAAWpX,EAAE,uCACnG43C,EAAGqD,EAAIyzH,WACP72H,EAAG5vC,eAAe+6M,GAClB1kE,EAAGr2I,eAAe66M,GAClBvkE,EAAGgkE,wBAAwBM,EAAgBK,MAC3CC,EAAGZ,wBAAwBI,EAAY,GAAGO,QAExCjmN,EAAO,iCACXA,IAAQ,gCACRA,GAAQ,0BAA4B+C,EAAE,sBAAwB,SAC9D/C,GAAQ,0BACR,KAAK,GAAI2D,GAAI,EAAGA,EAAIugC,EAAQh6B,OAAQvG,IAAK,CACvC,GAAIwgC,GAAkB,GAALxgC,GAAUgiN,GAAyB,GAALhiN,IAAWgiN,CAC1D3lN,IAAQ,yCACmB2D,EAAI,iCAAmCwgC,EAAY,WAAa,KAAOwhL,EAAiB,GAAK,wBAA0B,YAAchiN,EAAI,0BACxIA,EAAI,MAAQgiN,EAAiB,GAAK,0BAA4B,IAAMzhL,EAAQvgC,GAAK,iBAE/G3D,GAAQ,qBAER86C,2BAA4B4qK,EAAY,GAAGjlM,GAAK,IAAMilM,EAAY,GAAGvjL,SAAY0jL,EAAsBE,EAAqB,UAAY,QAExI,IAAI3hL,GAAO,GAAIziC,IAAGygB,IAAIF,QAAQmiB,UAC9BD,GAAK/mC,MAAQ,IACb+mC,EAAKE,gBAAgB,WACnB,GAAIC,GAAStpC,EAAE,kBAAkBqF,KAAK,iBAAiBa,KAAK,SAC5D,QAAQojC,GACN,IAAK,IAAKsV,gBAAgBmE,EAAIv9B,GAAIilM,EAAY,GAAGvjL,QAAS6b,EAAI1c,SAAU0c,EAAIxc,WAAY2kL,mBAAmBnoK,EAAK0nK,EAAY,GAAGvjL,SAAUujL,EAAY,GAAGI,SAAW,MACnK,KAAK,IACHrpK,gBAAgBuB,EAAIv9B,GAAIilM,EAAY,GAAGvjL,QAAS,WAC9CstI,eAAgB9vK,GAAIq+C,EAAIv9B,IAAMivJ,IAEhC,MACF,KAAK,IAAKzoJ,UAAU4C,MAAMi6I,KAAKyqC,6BAEhC,MACHnqK,EAAK3E,YAAY5S,EAAS7sB,GAC1B8xC,8BAA8B,mBAAoB72C,EAAE,mBAAqBmpC,EAAKzkC,IAAI3B,QAAQ,eAG5F,QAASmoN,oBAAmBnoK,EAAK7b,GAC/B,GAAIrW,GAAMkyB,EAAI0zH,OAAO1pJ,SACrB,IAAMma,EAAS,CAEb,IAAK,GADDqvI,IAAW,EACN7tK,EAAI,EAAGA,EAAIq6C,EAAI4yH,SAAS1mK,OAAQvG,IACvC,GAAIq6C,EAAI4yH,SAASjtK,GAAGyhC,QAAUjD,EAAS,CAAEqvI,EAAW7tK,CAAG,OAEzDmoB,EAAMkyB,EAAI4yH,SAASY,GAAUE,OAAO1pJ,UAEtC,MAAOg2B,GAAIyzH,WAAa,IAAM3lJ,EAAIxN,cAGpC,QAAS8nM,YAAWtoN,GAClB,GAAI+jF,GAAM5mF,EAAE6C,GACRuoN,EAASxkI,EAAI1gF,KAAK,eAClB+9E,EAAQv9E,GAAGwpB,QAAQ1K,GACnBqiJ,EAASjhF,EAAI1gF,KAAK,cACP,MAAXklN,EACFvsL,UAAUhwB,OAAO/G,EAAE,oBAAqB+/J,EAAQnhK,GAAGwpB,QAAQsmJ,aAE3D/wK,OAAO6sB,SAASrpB,KAAO,+CAAiDmiN,EAAS,UAAYnnI,EAAQ,WAAa4jF;CC3GtH,SAAW/6I,GAGT,QAASu+L,GAA0CC,EAAgBC,GACjEvrN,EAAE,WACAA,EAAE,sBAAsBy0C,OAAO,WAC7B+2K,EAAyBxrN,EAAEmB,MAAMiU,MAAOk2M,EAAgBC,OAM9D,QAASC,GAAyBn5H,EAAai5H,EAAgBC,GAC7D,GAAIE,GAAqBC,IACrBC,EAAiBF,EAAmB3qN,KAAK,uBACzCd,GAAEw6D,QAAQ63B,EAAai5H,MAAoB,EACzCK,GAEFA,EAAe1gJ,UACf0gJ,EAAenxL,SAAS+wL,IAGxBG,IAAuBt2M,IAAIm2M,GAAOrlN,KAAK,YAAY,GAAMrF,SAAS,gBAGhE8qN,EAEFA,EAAezgJ,SAGfwgJ,IAAuBxlN,KAAK,YAAY,GAAOzF,YAAY,gBAMjE,QAASirN,KACP,GAAIv4M,GAAInT,EAAE,wBAAwBqF,KAAK,kBAKvC,OAJiB,KAAb8N,EAAElE,SAEJkE,EAAInT,EAAE,6BAEDmT,EAOT2Z,EAAOmrJ,gCAAkC,WACvC,GAAI6uB,IAAe,OAAQ,eAC3B,QAAQpgM,GAAGmE,GAAG+C,QAAQ0mB,KAAKpE,QAAQ9kB,MACjC,IAAK,OACHpL,EAAE,mBAAmBqF,KAAK,mBAAmBnB,IAAI,kBAC/C,WACEyG,KAAKqtK,MAAMgvB,0BAA0BF,IAEzC,MACF,KAAK,aACH9mM,EAAE,WAAWiC,GAAG,eAAgB,WAC9B0I,KAAKqtK,MAAMgvB,0BAA0BF,OAO7Ch6K,EAAO8+L,0CAA4CP,EACnDv+L,EAAO++L,yBAA2BL,GAEjC/lN;ACtEH;CCAA,SAAWzF,GACT,QAAS8rN,GAAuB32M,EAAKk0D,GACnCloE,KAAKO,KAAKyT,EAAKk0D,GAGjByiJ,EAAuB5oN,WAErBiS,IAAK,KAEL42M,WAAY,KAGZhnN,KAAM,KAENq/M,WAAY,KAEZ4H,gBAAiB,KAEjBC,qBAAsB,KAEtBxzG,YAAa,KAEb5rC,YAAa,KAEbq/I,cAAe,KAEfC,qBAAsB,KAGtBC,oBAAqB,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,IAE5CC,gBAAiB,GAIjBC,uBAAwB,0BACxBC,6BAA8B,mCAE9BjH,iBACAC,kBAAmB,KAEnBnpG,UAAU,EACVowG,QAAS,6CACTlwG,wBAAyB,uBACzBmwG,uBAAwB,wBACxBlwG,8BAA+B,gCAC/BmwG,6BAA8B,iCAC9BrwG,sBAAuB,2BACvBswG,2BAA4B,4BAC5BC,uBAAwB,KAExBC,mBAAmB,EAInBC,iBAEAC,eAAgB,KAEhBC,uBAAuB,EAIvBv7L,OAAQ,KAERnO,KAAM,SAAUlY,EAAMwV,GACpB,GAAIsD,GAAK/iB,IACQ,OAAb+iB,EAAGuN,SACLvN,EAAGuN,OAAOrmB,GAAQwV,IAItBoC,KAAM,SAAU5X,GACd,GAAI8Y,GAAK/iB,IACT,IAAiB,MAAb+iB,EAAGuN,QAA6C,mBAApBvN,GAAGuN,OAAOrmB,GAAuB,CAC/D,GAAI+H,GAAI+Q,EAAGuN,OAAOrmB,GAAM8V,MAAMgD,EAAIlV,UAClC,OAAqB,mBAANmE,IAAqBA,IAMxCzR,KAAM,SAAUyT,EAAKk0D,GACnB,GAAInlD,GAAK/iB,IAET+iB,GAAGuN,UAEHvN,EAAG2oM,mBAAoB,EAEvB3oM,EAAG8oM,uBAAwB,EAGvB3jJ,GAAOrpE,EAAE4C,OAAOshB,EAAImlD,GAGxBnlD,EAAGkgM,YACD3tL,QACExnB,OAAQ,GAEVotD,kBAGElnD,IACF+O,EAAG/O,IAAMA,EACT+O,EAAG6nM,WAAa52M,EAAIrU,KAAK,2BACnBojB,EAAG6nM,YACP7nM,EAAG+oM,aAMTA,SAAU,WACR,GAAI/oM,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UAGvB7nM,GAAG/O,IAAInT,IAAI,uBAAuBC,GAAG,6CAA8C,SAAUsD,EAAGk5D,EAAOC,GACrG,GAAIx6C,EAAGigM,eAAgB,CAErB,IAAK,GADD+I,MACKxkN,EAAI,EAAGmK,EAAM6rD,EAAUzvD,OAAQvG,EAAImK,EAAKnK,IAC/CwkN,EAAcx4M,KAAKwP,EAAGipM,2BAA2BzuJ,EAAUh2D,IAE7Dwb,GAAG06C,oBAAoB16C,EAAGkpM,+BAA+B3uJ,GAAQyuJ,OAEjEpzL,GAAG8kC,oBAAoBH,EAAOC,IAIlC,KACMx6C,EAAG2oM,kBACL/yL,EAAGi0B,IAAIltD,SAAS,6BAA6BmB,IAAI,oBAAoBC,GAAG,iEAAkE,WACxIiiB,EAAG9gB,SAIL02B,EAAGi0B,IAAIttD,YAAY,6BAErB,MAAO8E,MAMX6nN,+BAAgC,SAAU5+I,GACxC,GAEI7M,GAFAz9C,EAAK/iB,KAAM24B,EAAK5V,EAAG6nM,WAGnBrnN,EAAK8pE,EACL9M,EAAUh9D,EAAG0L,MAAM,IASvB,OAPsB,IAAlBsxD,EAAQzyD,QACV0yD,EAAYD,EAAQ,GACpBh9D,EAAKg9D,EAAQ,IAEbC,EAAY7nC,EAAGsb,mBAIf1wC,GAAIA,EACJi9D,UAAWA,IAKfwrJ,2BAA4B,SAAUnlN,GACpC,GAAIO,GAAMpH,KAAKisN,+BAA+BplN,EAAK,GAEnD,OADAO,GAAU,KAAKA,EAAI7D,GAAK,EAAIsD,EAAK,GAAKA,EAAK,GACpCO,GAIT47M,aAAc,WACZ,MAA2B,OAApBhjN,KAAKs3G,aAAuBt3G,KAAKs3G,YAAYvyE,GAAG,aAIzDotF,QAAS,SAAU51G,EAAGkpD,EAAWC,GAC/B,GAAI3iD,GAAK/iB,KACL24B,EAAK5V,EAAG6nM,UAEZ7nM,GAAGugD,cAGHvgD,EAAGmoM,gBAAkB3uM,EAEjBwG,EAAGk4F,SACLl4F,EAAGmpM,YAAY,GAAI3vM,GAGnBwG,EAAGopM,aAAa5vM,GAAGhL,KAAK,WACtBwR,EAAGwgD,cACCkC,GAAWA,MACd19C,KAAK,WAEN4Q,EAAG4qC,cACCmC,GAASA,OAKnBymJ,aAAc,SAAU5vM,GAKtB,IAJA,GAAIwG,GAAK/iB,KACL2kE,GADgB5hD,EAAG6nM,eAIhB7nM,EAAG4oM,cAAc79M,OAAS,GAC/BiV,EAAG4oM,cAAc3mJ,MAAMC,OAOzB,IAHAliD,EAAGqpM,sBAGM,IAAL7vM,GAAWwG,EAAGkgM,WAAW3tL,OAAOxnB,OAAS,EAE3C,MAAOjP,GAAEiwB,MAIX,KAAK,GAAI0xC,KAAaz9C,GAAGkgM,WAAW3tL,OAChB,WAAdkrC,GACFmE,EAASpxD,KAAKwP,EAAGspM,YAAY9vM,EAAGikD,GAMpC,OAHAz9C,GAAG4oM,cAAgB9sN,EAAEskB,MAAMJ,EAAG4oM,cAAehnJ,GAGtC9lE,EAAEiwB,KAAK/O,MAAM/f,KAAM2kE,IAG5B0nJ,YAAa,SAAU9vM,EAAGikD,EAAWiF,EAAWC,GAC9C,GAAI3iD,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,WACnBhmJ,EAAgB,SAAUiD,EAAQloE,GACpCojB,EAAGupM,iBAAiB9rJ,EAAWqH,EAAQloE,GAEvCojB,EAAGkgM,WAAW3tL,OAAOkrC,GAAW+rJ,UAAW,EACvC9mJ,GAAWA,KAEbZ,EAAc,SAAU5zD,EAAK6zD,GAC/B/hD,EAAGypM,eAAehsJ,EAAWvvD,EAAK6zD,GAElC/hD,EAAGkgM,WAAW3tL,OAAOkrC,GAAW+rJ,UAAW,EACvC7mJ,GAASA,KAEXC,EAAS8mJ,6BAA8B,EAAK,IAAMA,0BAA4B,CAClF,OAAO9zL,GAAGsC,UAAUulC,EAAWjkD,EAAG,EAAGopD,EAAOf,EAAeC,IAG7DynJ,iBAAkB,SAAU5zK,EAASmvB,EAAQzvC,GAC3C,GAAIrV,GAAK/iB,KACL0sN,EAAUt0L,EAAKtqB,MAEnB,IAAI4+M,EAAU,EAEZ,IAAK,GAAInlN,GAAI,EAAGA,EAAImlN,EAASnlN,IAAK,CAChC,GAAIwvB,GAAMqB,EAAK7wB,GACXhE,EAAKkH,SAASssB,EAAIxzB,GAAI,GAS1B,IANAwf,EAAGkgM,WAAW3tL,OAAOojB,GAASn3C,MAAMgS,MAClChQ,GAAIA,EACJ0G,KAAM8sB,EAAIqE,eAIR7zB,IAAMklN,2BAA6BC,GAAWD,0BAA2B,CAC3E1pM,EAAG8oM,uBAAwB,CAC3B,UAMRW,eAAgB,SAAU9zK,EAASznC,EAAK6zD,GACtC,GAAI/hD,GAAK/iB,IAELiR,KAAQtK,EAAE,sBAEZoc,EAAGkgM,WAAW3tL,OAAOojB,GAASnoB,MAAQtf,EAAIhC,MAAM,KAAK,KAKzD09M,qBAAsB,SAAUppN,GAG9B,IAAK,GAFDwf,GAAK/iB,KACL24G,EAAW51F,EAAGkgM,WAAW/nJ,cACpB3zD,EAAI,EAAGmK,EAAMinG,EAAS7qG,OAAQvG,EAAImK,EAAKnK,IAC9C,GAAIoxG,EAASpxG,GAAGhE,KAAOA,EACrB,MAAOgE,EAGX,QAAO,GAIT+7D,YAAa,WACX,GAAIvgD,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UAEnB7nM,GAAGgoM,eAAehoM,EAAGgoM,cAAcrrN,SAAS,cAE5Ci5B,GAAIA,EAAG2qC,eAGbC,YAAa,WACX,GAAIxgD,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UAEnB7nM,GAAGgoM,eAAehoM,EAAGgoM,cAAczrN,YAAY,cAE/Cq5B,GAAIA,EAAG4qC,eAGbqpJ,gBAAiB,WACf,GAAI7pM,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UAKvB,IAFA7nM,EAAG8nM,gBAAkB9nM,EAAGkgM,WAAW3tL,OAAOxnB,OAAS,EACnDiV,EAAGnf,KAAOmf,EAAG8pM,YACT9pM,EAAGnf,KAAM,CACX,GAAI+I,GAAS,GAAIpH,IAAGygB,IAAIF,QAAQ6D,YAC9BC,MAAQ+O,EAAKA,EAAGm0L,MAAQ,GACxBlpN,KAAMmf,EAAGnf,KACTiuC,OAAQlrC,EAAE,MACVy6C,WAAYz6C,EAAE,UACdkrG,YAAa,8BACb5wG,MAAO,IACP+C,OAAQ,IACR8tC,oBAAqBnZ,EAAG4lC,aACxBj5B,QAAS,WACH//B,GAAGC,IAAIC,cACTkzB,EAAG3kB,IAAIi2B,WAAW,YAClBprC,EAAE,cAAcorC,WAAW,aAE7BlnB,EAAGgqM,kBACH3+M,IAAIo/F,SAAS,WAEf1qG,GAAI,WAEFigB,EAAG8gB,QACFl/B,OAAQ,cAEbgI,GAAO1K,OAEPmM,IAAIo/F,SAAS,eACbzqF,EAAGiqM,uBACHjqM,EAAGkqM,gBACHlqM,EAAGmqM,yBACHnqM,EAAGoqM,cACHpqM,EAAGm1F,+BACHn1F,EAAGqqM,kCACHrqM,EAAGsqM,kCAGHtqM,EAAGlB,KAAK,iBAIZkrM,gBAAiB,WACfluN,EAAE,6BAA6B6E,IAAI,aAAc,WAInD0oN,oBAAqB,WACnB,GAAIrpM,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UACvB7nM,GAAGkgM,WAAW3tL,QAAWxnB,OAAQ,EAEjC,IAAIvG,GAAI,CACR,KAAK,GAAImxC,KAAW/f,GAAG6iC,SACjB38D,EAAEw6D,QAAQ3gB,EAAS31B,EAAGohM,kBAAmB,IAE3CphM,EAAGkgM,WAAW3tL,OAAOojB,IACnB40K,UAAWvqM,EAAG6nM,WAAWpvJ,SAAS9iB,GAASob,QAC3Cy4J,UAAU,EACVhrN,UAEFgG,IAGJwb,GAAGkgM,WAAW3tL,OAAOxnB,OAASvG,GAGhCtF,KAAM,WACJ,GAAI8gB,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UAEvB7nM,GAAGkgM,WAAW/nJ,cAAgBviC,EAAG2nC,YAEjCv9C,EAAGqpM,sBAEHrpM,EAAGovG,QAAQ,GAAI,WACbpvG,EAAG6pM,qBAKP/oL,KAAM,WACJ,GAAI9gB,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UAElBjyL,GAAG4lC,eACN5lC,EAAGklC,UAAU96C,EAAGkgM,WAAW/nJ,eAAe,GAC1Cn4C,EAAG/O,IAAIo0C,QAAQ,YASnBykK,UAAW,WACT,GAAI9pM,GAAK/iB,KACL4D,EAAOmf,EAAGwqM,eAEd,OADA3pN,IAAQmf,EAAGyqM,wBAIbA,qBAAsB,WACpB,GAAI5pN,GAAO,kFAAoF+C,EAAE,oBAAsB,SAIvH,OAHA/C,IAAQ,uCACRA,GAAQ5D,KAAKytN,0BACb7pN,GAAQ,gBAIV6pN,wBAAyB,WACvB,GAAI1qM,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,WACnBhnN,EAAO,uEAUX,OARK+0B,GAAG4lC,eACN36D,GAAQ,uDAEVA,GAAQ,qCAAuCmf,EAAG8nM,gBAAkB,cAAgB,aAAe,KAAOlkN,EAAE,QAAU,QAClHoc,EAAG8nM,kBACLjnN,GAAQ,kDAAoD+C,EAAE,aAAe,SAE/E/C,GAAQ,yBAIVspN,uBAAwB,WAItB,IAAK,GAHDnqM,GAAK/iB,KACL4D,EAAO,GACP+0G,EAAW51F,EAAGkgM,WAAW/nJ,cACpB3zD,EAAI,EAAGmK,EAAMinG,EAAS7qG,OAAQvG,EAAImK,EAAKnK,IAC9C3D,GAAQ5D,KAAK0tN,2BAA2B/0G,EAASpxG,GAEnDwb,GAAG+nM,qBAAqB9rN,OAAO4E,IAIjC8pN,2BAA4B,SAAUtgN,GACpC,GAAI2V,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,WACnBhnN,EAAO,WAAawJ,EAAa7J,GAAK,IAErCo1B,GAAG4lC,eACN36D,GAAQ,yEAA2E+C,EAAE,UAAY,4IAGnG,IAAIwjH,GAAYpnG,EAAG/O,IAAIjP,KAAK,MACxBg1B,EAAYx0B,GAAGmE,GAAGgD,KAAKq6H,wBAAwB5c,GAE/CnlE,EAAgB,EACpB,IAAIjrB,EAAW,CACb,GAAIk/G,GAAoBl/G,EAAUk/G,mBAC9BA,KAAmBj0F,EAAgB,YAAci0F,GAIvD,GAAI90H,GAAO,gCAAkC8gC,UAAY,QAAUC,UAAY,aAAepQ,UAAU1nC,EAAaozD,WAAaxb,EAAgB,OAAS53C,EAAa7J,GAAK,2CACzKu9D,EAAWnoC,EAAGooC,YAAY3zD,EAAaozD,UAAWpzD,EAAa7J,GAAI6J,EAAanD,KAMpF,OALArG,IAAQ,gBAAkBmf,EAAG8nM,gBAAkB,cAAgB,aAAe,iBAAmB/pJ,EAAgB,MAAI,SAAW1zD,EAAa7J,GAAK,KAAOu9D,EAAe,KAAI,KAAO38C,GAAQ,GAAK/W,EAAanD,MAAMkU,aAAe,kBAC9N4E,EAAG8nM,kBACLjnN,GAAQ,kCAAoCmf,EAAGkgM,WAAW3tL,OAAOloB,EAAaozD,WAAar8C,EAAOpB,EAAGkgM,WAAW3tL,OAAOloB,EAAaozD,WAAW8sJ,UAAY,OAAS,IAAM,eAE5K1pN,GAAQ,SAIV2pN,cAAe,WACb,GAAIxqM,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,WACnBryG,EAAUv4G,KAAK2tN,0BACf/pN,EAAO,+CAAiD+0B,EAAG4lC,aAAe,WAAa,IAAM,IACjG36D,IAAQ,2BAA6B+C,EAAE,eAAiB,SAExD,IAAIinN,GAAsBj1L,EAAG4lC,aAAoB,2CAAL,EAM5C,OAJA36D,IAAQ,2GAA6G20G,EAAU,YAAcA,EAAU,KAAOq1G,EAAqB,mBAEnLhqN,GAAQ,yFACRA,GAAQ,UAIVqpN,cAAe,WACb,GAAIlqM,GAAK/iB,KACL4D,EAAO,GACPq/M,EAAalgM,EAAGkgM,UAUpB,IARIlgM,EAAG8oM,sBAEL9oM,EAAG8qM,sBAAsBlnN,EAAE,0BAG3Boc,EAAG+qM,wBAG2B,GAA5B7K,EAAW3tL,OAAOxnB,OACpB,IAAK,GAAIM,KAAO60M,GAAW3tL,OACd,UAAPlnB,IAAiBxK,GAAQmf,EAAGgrM,eAAe3/M,EAAK60M,EAAW3tL,OAAOlnB,SAGjE60M,GAAW3tL,OAAOxnB,OAAS,IAClClK,GAAQmf,EAAGirM,gBAAgB/K,EAAW3tL,QAG5B,KAAR1xB,GACFmf,EAAGkrM,mBAAmBrqN,GAGZ,IAARA,GACFmf,EAAGmrM,qBAAqBnrM,EAAGorM,iBAAmBxnN,EAAE,sBAAwBA,EAAE,sBAG5Eoc,EAAGqrM,4BACHrrM,EAAGu0F,YAAYzyG,UAAU,GACpBhG,EAAEwB,MAASkF,GAAGC,IAAIC,aAAesd,EAAGsvD,UAAUtvD,EAAGu0F,YAAYpzG,KAAK,iBAGzE8pN,gBAAiB,SAAU14L,GACzB,GAAIvS,GAAK/iB,KACL4D,EAAO,EAEX,KAAK,GAAI48D,KAAalrC,GAEH,UAAbkrC,KAA2BlrC,EAAOkrC,GAAW+rJ,UAAYj3L,EAAOkrC,GAAWj/D,MAAMuM,OAAS,GAAwC,mBAA5BwnB,GAAOkrC,GAAWjwC,SAC1H3sB,GAAQmf,EAAGsrM,iBAAiB/4L,EAAOkrC,GAAYA,GAGnD,OAAO58D,IAGTyqN,iBAAkB,SAAUvhN,EAAOsB,GACjC,GAAI2U,GAAK/iB,KACL4D,EAAO,EAKX,OAJAA,IAAQ,mCAAqCwK,EAAM,yBAA2BtB,EAAMy/M,SAAW,GAAK,eAAiB,sBACzFz/M,EAAMy/M,SAAW,cAAgB,eAAiB,oIAAsIz/M,EAAMwgN,UAAY,gBACtO1pN,GAAQmf,EAAGgrM,eAAe3/M,EAAKtB,GAC/BlJ,GAAQ,UAKVmqN,eAAgB,SAAUvtJ,EAAW1zD,GACnC,GAAIiW,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,WACnBrpN,EAAQuL,EAAMvL,MACdqC,EAAO,EAEX,IAAoB,GAAhBrC,EAAMuM,QAAuC,mBAAhBhB,GAAW,MAAkB,CAC5DwhN,QAAUxhN,CACV,IAAIq9E,IAAW5mF,IAAI,EAAI0G,KAAM6C,EAAMyjB,OAC/B9oB,EAAO0iF,EAAOlgF,KACdpD,EAAO,gCAAkCY,EAAO,KAAOA,EAAO,QAElE,OADA7D,IAAQiD,EAIV,IAAK,GAAImW,GAAI,EAAGA,EAAIzb,EAAMuM,OAAQkP,IAChC,GAAIzb,EAAMyb,GAAGswM,UACX1pN,GAAQ5D,KAAKquN,iBAAiB9sN,EAAMyb,GAAIzb,EAAMyb,GAAGo4B,cAE9C,CACH,GAAI+0C,GAAS5oF,EAAMyb,EAEnB,IAAImtE,EAAO5mF,GAAK,EAAG,CAEjB,GAAIgrN,GAAapkI,EAAOlgF,KAAKmB,QAAQ,eAAgB,EAAK++E,EAAOlgF,KAAKkS,OAAOguE,EAAOlgF,KAAKmB,QAAQ,QAAU,GAAK++E,EAAOlgF,KACnH62D,EAAWnoC,EAAGooC,YAAYP,EAAW,GAAK2pB,EAAO5mF,GAAIgrN,GACrD9mN,EAAO,eAAiBq5D,EAAgB,MAAI,KAAOA,EAAe,KAAI,kBAAoB9gE,KAAKmrN,uBAAyB,SAAWoD,EAAa,SAChJ1nN,EAAO,YAAcsjF,EAAO5mF,GAAK,yCAA2CkE,EAC9E,sPAGF7D,IAAQiD,MAGRkc,GAAG8qM,sBAAsB1jI,EAAOlgF,MAKtC,MAAOrG,IAITsqN,qBAAsB,SAAUj9M,GAC9B,GAAI8R,GAAK/iB,KACL+6D,EAAYh4C,EAAGu0F,YAAY33G,KAAK,WAAaojB,EAAGu0F,YAAYpzG,KAAK,qBAAuB6e,EAAGu0F,WAC/Fv8C,GAAUn3D,KAAK,kCAAoCqN,EAAM,WAG3Di7M,YAAa,SAAUzwI,EAAQ9gD,GAC7B,GAAI5X,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,WACnB59K,EAAsB,KAAXyuC,EAAgBA,EAASA,EAAO12E,KAAK,KACpD,OAAOgtB,aAAYhP,EAAGsoM,SAClBlhJ,SAAU,KAAMkH,WAAY,KAAM/jC,SAAU,GAAKN,EAAUwhL,UAAW,GAAK7zL,GAC7E,SAAUvzB,GACR,GAAIA,EAAIm2B,QAAS,CAEf,IAAK,GAAImb,KAAW/f,GAAG6iC,SACjB38D,EAAEw6D,QAAQ3gB,EAAS31B,EAAGohM,kBAAmB,IAC3CphM,EAAGkgM,WAAW3tL,OAAOojB,IACnB40K,UAAWvqM,EAAG6nM,WAAWpvJ,SAAS9iB,GAASob,QAC3CvyD,WAGJwhB,EAAGkgM,WAAW3tL,OAAOxnB,QAAU,CAQjC,IAJKiV,EAAGigM,gBAAgBjgM,EAAG6pM,kBAC3B7pM,EAAGwgD,cAEHxgD,EAAG+qM,wBACCryI,EAAO3tE,OAAQ,CAEjB,GAAIlK,GAAOmf,EAAGipD,SAAS5kE,EAAI6gB,OAE3BwzD,GAAOv3E,KAAK,YAAYwsC,SACxB3tB,EAAG0rM,uBAAuBhzI,EAAOz8E,OAAO4E,IAAO,OAG3CwD,GAAI6gB,OAAOna,OAAS,GACtBiV,EAAGkrM,mBAAmBlrM,EAAGipD,SAAS5kE,EAAI6gB,SACtClF,EAAG0rM,yBACsB,GAArBrnN,EAAI6gB,OAAOna,QAAmC,GAApB1G,EAAI6gB,OAAO,GAAG1kB,IAAW6D,EAAI6gB,OAAO,GAAG8e,SAA4C,GAAjC3/B,EAAI6gB,OAAO,GAAGqgB,SAASx6B,QACrGiV,EAAG8qM,sBAAsBlnN,EAAE,4CAI7Boc,EAAGmrM,qBAAqBnrM,EAAGorM,iBAAmBxnN,EAAE,6BAA+BA,EAAE,qBAGrFoc,GAAGqrM,8BAGP,WAAcrrM,EAAGwgD,iBAGrB0qJ,mBAAoB,SAAUrqN,GAC5B,GAAImf,GAAK/iB,KAEL+6D,EAAYh4C,EAAGu0F,YAAY33G,KAAK,WAAaojB,EAAGu0F,YAAYpzG,KAAK,qBAAuB6e,EAAGu0F,WAC/Fv8C,GAAUzyB,SAAS,kCAAkCoI,SAErDqqB,EAAUjS,QAAQllD,IAGpBooE,SAAU,SAAUC,GAElB,IAAK,GADDroE,GAAO,GACF2D,EAAI,EAAGA,EAAI0kE,EAAMn+D,OAAQvG,IAC5B0kE,EAAM1kE,GAAGhE,IAAM,EACjBK,GAAQ5D,KAAKksE,kBAAkBD,EAAM1kE,IAErCvH,KAAK6tN,sBAAsB5hJ,EAAM1kE,GAAGE,KAGxC,OAAO7D,IAGTsoE,kBAAmB,SAAUhzB,GAC3B,GAAIt1C,GAAOs1C,EAAKzxC,IAChB,OAAIyxC,GAAK5Q,SAASx6B,OAAS,GACzBlK,EAAO/E,EAAE+E,GAAM5E,OAAOgB,KAAKgsE,SAAS9yB,EAAK5Q,WAClC1kC,EAAK,GAAGo8C,WAEVp8C,GAITiqN,sBAAuB,SAAU58M,GAC/B,GAAI8R,GAAK/iB,KACL0uN,EAAS3rM,EAAGu0F,YAAYpzG,KAAK,wBACZ,IAAjBwqN,EAAO5gN,SACT4gN,EAAS3rM,EAAGioM,qBAAqBzhN,QACjCwZ,EAAGu0F,YAAYt4G,OAAO0vN,IAExBA,EAAOjnN,KAAKwJ,GAAKhP,QAGnB6rN,sBAAuB,WACrB,GAAI/qM,GAAK/iB,IACT+iB,GAAGu0F,YAAYpzG,KAAK,yBAAyBuD,KAAK,IAAInH,QAOxD0sN,qBAAsB,WACpB,GAAIjqM,GAAK/iB,IACT+iB,GAAG+nM,qBAAuBjsN,EAAE,8BAA8BypC,SAAS,SACnEvlB,EAAGu0F,YAAcz4G,EAAE,gBACnBkkB,EAAGioM,qBAAuBnsN,EAAE,wBAAyBkkB,EAAGu0F,aACxDv0F,EAAG2oD,YAAc7sE,EAAE,gBAEnBkkB,EAAGgoM,cAAgBhoM,EAAG2oD,YAAYxnE,KAAK,MAGzCiqN,eAAgB,WACd,MAAoD,KAA7CnuN,KAAK0rE,YAAYz3D,MAAM/F,QAAQ,KAAM,KAG9CygN,2BAA4B,WAC1B,GAAI9vN,EAAE4qD,aACJ,GAAIzpD,KAAKs3G,YAAY33G,KAAK,WAExBK,KAAKs3G,YAAY33G,KAAK,WAAWuvD,UAEjClvD,KAAKs3G,YAAY33G,KAAK,WAAWivN,YAAc,OAC1C,CAEL5uN,KAAKs3G,YAAYhvE,WAAWwzJ,QAAQ,mDACpC,IAAI+yB,GAAoB,GAAIjpN,SAAQ,eAAiBC,cAAc,GAEnEgpN,GAAkBD,YAAc,GAChC5uN,KAAKs3G,YAAY33G,KAAK,UAAWkvN,KAKvC1B,YAAa,WACX,GAAIpqM,GAAK/iB,IACM,OAAX+iB,EAAGnf,OACLmf,EAAG+rM,6BACH/rM,EAAGgsM,wBAIPA,oBAAqB,WACnB/uN,KAAKyuN,yBACLzuN,KAAKgvN,0BAGPP,uBAAwB,SAAUrmH,EAAOsR,GACvC,GAAI32F,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,WACnBv4I,EAAY,WAActvD,EAAGsvD,UAAUryE,OACvCivN,EAAc,WAAclsM,EAAGksM,YAAYjvN,OAE3CuB,EAAQ1C,KAYZ,IAXIupG,EACEsR,EACFn4G,EAAQ6mG,EAAMlkG,KAAK,YAEfkkG,EAAM3oG,SAAS,UAAS8B,EAAQ6mG,GAGtC7mG,EAAQwhB,EAAGu0F,YAAYpzG,KAAK,aAIzBy0B,EAAG4lC,aAAc,CACpBh9D,EAAM2C,KAAK,yCAAyCrD,IAAI,gCAAgCC,GAAG,+BAAgC,SAAU3B,GACnI4jB,EAAG8vD,WAAWh0E,EAAEmB,MAAMyT,SAASA,WAGjC,IAAI6hB,GAASz2B,GACTupG,GACEsR,EACFpkF,EAAS8yE,EAAMlkG,KAAK,uBAEhBkkG,EAAM3oG,SAAS,iBAAgB61B,EAAS8yE,EAAM9/D,SAAS,SAG7DhT,EAASvS,EAAGu0F,YAAYpzG,KAAK,uBAE3B6e,EAAGk4F,UACL3lF,EAAOpxB,KAAK,WAAWrD,IAAI,gCAAgCC,GAAG,+BAAgC,WAC5FiiB,EAAGmsM,qBAAqBrwN,EAAEmB,MAAMyT,YAGlCsP,EAAGosM,0BAA0B75L,EAAOgB,IAAI,OACxCvT,EAAGosM,0BAA0B5tN,GAE7B+zB,EAAOpxB,KAAK,kCAAkCrD,IAAI,gCAAgCC,GAAG,+BAAgC,WACnHiiB,EAAG8vD,WAAWh0E,EAAEmB,MAAMyT,SAASA,aAGjC6hB,EAAOz0B,IAAI,gCAAgCC,GAAG,+BAAgC,WAC5EiiB,EAAGmsM,qBAAqBlvN,QAGvBnB,EAAEwB,MAASkF,GAAGC,IAAIC,cACrBlE,EAAM0J,MAAMonE,EAAW48I,GACvB35L,EAAOrqB,MAAM,WAAc8X,EAAGq0F,WAAWv4G,EAAEmB,MAAMyT,WAAc,WAAcsP,EAAGo0F,aAAat4G,EAAEmB,MAAMyT,aAIvGsP,EAAG4rM,6BAIL5rM,EAAGqsM,gBAAgB7tN,IAIrB4tN,0BAA2B,SAAU5tN,GACnC,GAAIwhB,GAAK/iB,KACLwsE,EAAiB3tE,EAAE,MACnB4rD,EAAkB,SAAUrmD,EAAGkoE,GACjCloE,EAAEpB,iBACFoB,EAAEhF,iBAEF,IAAIiwN,IAAQ/xM,EAAGlZ,EAAEsmD,MAAOx2C,EAAG9P,EAAEumD,MACzB2hB,KAEF+iJ,EAAI/xM,EAAIgvD,EAAQnsE,SAASiD,KACzBisN,EAAIn7M,EAAIo4D,EAAQnsE,SAASsC,IAAM,IAGjC6pE,EAAUA,EAAUA,EAAUztE,EAAEmB,MAC3BssE,EAAQvnE,KAAK,QAAOunE,EAAUA,EAAQ74D,SAC3C,IAAI9S,GAAOoiB,EAAGwpD,gBAAgBD,EAASE,EACvC7rE,GAAKuC,QAASE,KAAQisN,EAAI/xM,EAAG7a,IAAO4sN,EAAIn7M,KAEtCo7M,EAAwB,SAAUlrN,GACpC,GAAIyY,GAAIhe,EAAEmB,MAAMyT,SAASA,SAASA,QAClCg3C,GAAgBrmD,EAAGyY,GAGrB,IAAKhe,EAAEwB,MAASkF,GAAGC,IAAIC,YAGhB,CACL,GAAI8pN,GAAiBhuN,EAAM2C,KAAK,kBAChC,IAAIqrN,EAAezhN,OAAS,EAC1ByhN,EAAe1uN,IAAI,0BAA0BC,GAAG,yBAA0BwuN,OACrE,CACL,GAAIhkJ,GAAoB,2HACxB/pE,GAAM2C,KAAK,SAASusC,OAAO66B,GAAmB1pC,OAAO/gC,IAAI,0BAA0BC,GAAG,yBAA0BwuN,GAElH9iJ,EAAelkC,SAAS,QAAQpkC,KAAK,mBAAmBrD,IAAI,0BAA0B6vC,aAVtFnvC,GAAM4gB,KAAK,cAAesoC,GAC1B+hB,EAAelkC,SAAS,QAAQ9lB,OAAO,gBAa3CssM,2BAA4B,WAC1B,GAAI/rM,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,WAEnBhxG,IAGJ,KAAKjhF,EAAG4lC,aAAc,CACpB,GAAIw7C,GAAWl7G,EAAEwB,MAAQkF,GAAGC,IAAIC,aAAoD,UAArCF,GAAGC,IAAI4M,QAAQnI,KAAKiY,cAA4B,OAAS,MACxG03F,GAAKrmG,MAAOymG,OAAUD,EAAUF,UAAY,EAAMC,WAAa,IAIjE,GAAIC,GAAWh3F,EAAG8nM,gBAAkB,QAAU,OAC9CjxG,GAAKrmG,MAAOsmG,UAAY,EAAMG,OAAUD,EAAUD,WAAa,IAG3D/2F,EAAG8nM,iBACLjxG,EAAKrmG,MAAOsmG,UAAY,EAAMC,WAAa,IAG7C/2F,EAAG+nM,qBAAqB7wG,WACtBC,SAAan3F,EAAG+nM,qBAAqBr3M,SAASzP,SAAW,GAAM,KAC/Dk+K,SAAY,OACZ/nE,YAAc,EACdC,cAAgB,EAChBC,WAAa,EACbP,WAAa,EACbQ,WAAeC,aAAgB5zG,EAAE,UACjC6zG,UAAaZ,GAEf,IAAIa,EACC57G,GAAEwB,OACLo6G,EAAa,QAEXl1G,GAAGC,IAAIC,cAAag1G,EAAa,KACrC13F,EAAG+nM,qBAAqBpnN,IAAI,QAAQ+2G,GACpC13F,EAAG+nM,qBAAqB5mN,KAAK,iBAAiBjD,MAAM,QACpD8hB,EAAG+nM,qBAAqBr3M,SAASxS,MAAMw5G,GAAY11G,KAAK,KAAM,0BAC9DlG,EAAE,+BAA+BoC,MAAMw5G,GACpCnyE,SAAS,SAAS5kC,IAAI,QAAQ+2G,GAC9Bv2G,KAAK,iBAAiBjD,MAAM,QAC/B8hB,EAAG+nM,qBAAqB5mN,KAAK,MAAMnE,KAAK,WAAcgjB,EAAGu4F,gCAAgCt7G,SAG3Fs7G,gCAAiC,SAAUvkF,GACzC,GAAIhU,GAAK/iB,IAAW+iB,GAAG6nM,UACvB7zL,GAAMl4B,EAAEk4B,GAEHl4B,EAAEwB,MAASkF,GAAGC,IAAIC,YAMrBsxB,EAAI7yB,KAAK,qBAAqBR,IAAI,aAAc,WALhDqzB,EAAI9rB,MACA,WAAcpM,EAAEmB,MAAMN,SAAS,QAAQwE,KAAK,qBAAqBR,IAAI,aAAc,YACnF,WAAc7E,EAAEmB,MAAMV,YAAY,QAAQ4E,KAAK,qBAAqBR,IAAI,aAAc,YAK5FqzB,EAAI7yB,KAAK,qBAAqBpD,GAAG,+BAAgCd,KAAM,SAAUoE,GAC/EA,EAAEzE,KAAK47G,wBAAwBv7G,QAIjC+iB,EAAGqsM,gBAAgBr4L,IAIrBq4L,gBAAiB,SAAU1tN,GACpB7C,EAAEwB,MAASkF,GAAGC,IAAIC,aACrB/D,EAAGwC,KAAK,SAASnE,KAAK,WACpBu1C,0BAA0Bz2C,EAAEmB,UAMlCgvN,uBAAwB,WACtB,GAAIjsM,GAAK/iB,KACLY,EAAY,SAEhBmiB,GAAG2oD,YAAY5qE,GAAGF,EAAY,sDAAuDmiB,EAAIA,EAAGysM,uBAC5FzsM,EAAG02F,sBAGL+1G,sBAAuB,SAAUrwN,GAC/B,GAAI4jB,GAAK5jB,EAAGQ,IACZ,IAAId,EAAEw6D,QAAQl6D,EAAGqjD,QAASz/B,EAAGkoM,qBAAsB,GACjD,GAAkB,GAAd9rN,EAAGqjD,QAAc,CACnB3jD,EAAEmB,MAAM0wD,MACR,IAAIwS,GAAYngD,EAAGu0F,YAAYpzG,KAAK,YAGpC,OAFAg/D,GAAUzjE,SAAS,QAAUsjB,EAAGsvD,UAAUnP,GAAangD,EAAGq0F,WAAWl0C,GACrEngD,EAAGu0F,YAAYzyG,UAAU,IAClB,OAITke,GAAG0sM,qBAIPh2G,mBAAoB,WAClB,GAAI12F,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UACvB,KAAKjyL,EAAG4lC,eACDx7C,EAAG6nM,WAAW52M,IAAIvU,SAAS,kCAAmC,CACjE,GAAIszE,GAAQ,aACZ3kE,KAAI,OAAQ2kE,EAAO,WAA4C,MAA9BhwD,GAAGk0F,qBAAoB,IAAc,IACtE7oG,IAAI,KAAM2kE,EAAO,WAA6C,MAA/BhwD,GAAGk0F,qBAAoB,IAAe,IACrE7oG,IAAI,QAAS2kE,EAAO,WAAuC,MAAzBhwD,GAAG2sM,sBAA6B,IAClEthN,IAAI,OAAQ2kE,EAAO,WAAsC,MAAxBhwD,GAAG4sM,qBAA4B,IAChEvhN,IAAI,SAAU2kE,EAAO,WAAmC,MAArBhwD,GAAG6sM,kBAAyB,IAC/DxhN,IAAI,YAAa2kE,EAAO,WAItB,MAHAhwD,GAAG2oD,YAAYn1C,QACfxT,EAAGksM,YAAYlsM,EAAGu0F,YAAYpzG,KAAK,UACnC6e,EAAGo0F,aAAap0F,EAAGu0F,YAAYpzG,KAAK,gBAC7B,GAET,IAAI6xC,GAAW,YACX/1C,MAAKi7G,WAAYllE,GAAY,2BACjC3nC,IAAI,QAAS2kE,EAAO,WAClB,GAAIlsE,GAAOkc,EAAGu0F,YAAYpzG,KAAK6xC,GAAUl0C,OACH,OAAlCgF,GAAKiH,QAAQiV,EAAG8vD,WAAWhsE,IAAc,IAE/CuH,IAAIo/F,SAASz6B,GACbhwD,EAAG6nM,WAAW52M,IAAItU,SAAS,oCAKjCiuN,wBAAyB,WACvB,GAAI5qM,GAAK/iB,IACT,IAA6B,OAAzB+iB,EAAGqhM,kBAA4B,CACjC,GAAIz2M,GAAsC,GAA/BoV,EAAGkgM,WAAW3tL,OAAOxnB,OAAcnH,EAAE,6BAA+BA,EAAE,8BAC7EY,EAAI,EACJq3D,IACJ,KAAK,GAAIxwD,KAAO2U,GAAGkgM,WAAW3tL,OACjB,UAAPlnB,IACFwwD,EAAMr3D,GAAK,SAAWwb,EAAGkgM,WAAW3tL,OAAOlnB,GAAKk/M,UAAY,SAC5D/lN,IAIJ,OADAoG,IAAOixD,EAAM3sD,KAAK,MAGlB,MAAO8Q,GAAGqhM,mBAKd73I,gBAAiB,SAAU1lE,EAAM2lE,GAC/B,GACIC,GACAC,EACAC,EACAC,EACAG,EACAF,EANAC,KAOAE,EAASnmE,EAAK9B,KAAK,MACnBge,EAAK/iB,IAiCT,OA/BIwsE,GAAelkC,SAAS,IAAM0kC,GAAQl/D,OAAS,GAAKjH,EAAKpH,SAAS,aACpEktE,EAAwBhmE,EAAE,yBAC1BimE,EAAwB,WACtB7pD,EAAGmqD,qBAAqBrmE,EAAMmmE,GAAQ,EAAOR,IAE/CO,EAAgB,4BAEhBJ,EAAwBhmE,EAAE,oBAC1BimE,EAAwB,WACtB7pD,EAAGmqD,qBAAqBrmE,EAAMmmE,GAAQ,EAAMR,IAE9CO,EAAgB,sBAEdhqD,EAAG4pM,qBAAqB3/I,MAAY,GAEtCP,EAAkB9lE,EAAE,qBACpB+lE,EAAkB,WAChB3pD,EAAG+nM,qBAAqB5mN,KAAK,MAAQ8oE,GAAQ9oE,KAAK,WAAWjB,SAE/D4pE,EAAa,sBAEbJ,EAAkB9lE,EAAE,qBACpB+lE,EAAkB,WAChB3pD,EAAG8vD,WAAWhsE,IAEhBgmE,EAAa,mBAGfC,EAAUv5D,MAAO9L,KAAMglE,EAAiBriE,QAASsiE,EAAiBtkE,KAAMykE,EAAY5iE,KAAM,gBAC1F6iE,EAAUv5D,MAAO9L,KAAMklE,EAAuBviE,QAASwiE,EAAuBxkE,KAAM2kE,EAAe9iE,KAAM,sBAElG,GAAIrL,aAAYkuE,GAAa7rE,MAAO,OAAQkB,cAAe0E,KAMpEqmE,qBAAsB,SAAUrmE,EAAMwmE,EAAQC,EAAWd,GACvD,GAAIzpD,GAAK/iB,IACT+xB,aAAY,uCAAyCw7C,YAAaF,EAAQnmC,QAASrgC,EAAKpH,SAAS,eAAgB+tE,UAAWF,GACxH,SAAUlmE,GACR,GAAIA,EAAIm2B,QACN,GAAI+vC,GACF,GAAoD,GAAhDd,EAAelkC,SAAS,IAAM+kC,GAAQv/D,OAAa,CACrD,GAAIvE,GAAQ1C,EAAK0C,OACjBwZ,GAAG0rM,uBAAuBllN,GAAO,GACjCwZ,EAAG0rM,uBAAuBllN,GAAO,GACjCA,EAAMwlD,SAASyd,GACXjjE,EAAM9J,SAAS,iBACjBsjB,EAAG8sM,iBAAiBtmN,EAAM++B,SAAS,SACnCvlB,EAAG8sM,iBAAiBtmN,EAAMrF,KAAK,yBAEjC6e,EAAG8qD,yBAAyBR,EAAQC,GACpCd,EAAeltE,YAAY,mBAI7BktE,GAAelkC,SAAS,IAAM+kC,GAAQ38B,SACtC3tB,EAAG8qD,yBAAyBR,EAAQC,GAGP,GAAzBd,EAAe1+D,QAAwD,GAAzC0+D,EAAelkC,SAAS,OAAOx6B,SAC5C,aAAf1G,EAAI8kC,SACNnpB,EAAG8qM,sBAAsBlnN,EAAE,2CAE7B6lE,EAAe9sE,SAAS,kBAStCmuE,yBAA0B,SAAUtqE,EAAI0qE,GACtC,GAAI1qE,EAAI,CACN,GAAIwf,GAAK/iB,KAEL+rE,EAAWltE,EAAE4qD,aAAe1mC,EAAGu0F,YAAYhvE,WAAWA,SAAS,MAAQvlB,EAAGu0F,YAAYhvE,SAAS,MAC/FzhC,EAAOklE,EAASj+D,OAAS,EAAIi+D,EAASrF,WAAWxiE,KAAK,IAAMX,GAAMwf,EAAGu0F,YAAYpzG,KAAK,IAAMX,EAChGsD,GAAOA,EAAK+mE,IAAI7B,EAASrF,SAAS,IAAMnjE,IACxCsD,EAAOA,EAAK+mE,IAAI7B,EAASzjC,WAAWpkC,KAAK,IAAMX,GAC/C,IAAI6E,GAAOvB,EAAKyhC,SAAS,QAAQpkC,KAAK,SAClCgqE,EAAYnrD,EAAGo4F,uBACfltC,IACEpnE,EAAKpH,SAAS,QACXoH,EAAKpH,SAAS,aACjB2I,EAAK9I,YAAY4uE,GAAWxuE,SAASqjB,EAAGm4F,uBAI1C9yG,EAAK9I,YAAYyjB,EAAGuoM,wBAAwB5rN,SAASqjB,EAAGyoM,4BAE1D3kN,EAAKnH,SAAS,cAGVmH,EAAKpH,SAAS,QACXoH,EAAKpH,SAAS,aACjB2I,EAAK9I,YAAYyjB,EAAGm4F,uBAAuBx7G,SAASwuE,GAItD9lE,EAAK9I,YAAYyjB,EAAGyoM,4BAA4B9rN,SAASqjB,EAAGuoM,wBAE9DzkN,EAAKvH,YAAY,eAUvBwwN,WAAY,SAAU99I,GACpB,GAAIjvD,GAAK/iB,IACT,IAAI+iB,EAAGu0F,YAAa,CAClB,GAAIrlC,GAAclvD,EAAGu0F,YAAYpzG,KAAK,0BAA0BrC,OAChE,IAAIowE,EAAYnkE,OAAQ,CACtB,GAAIyvC,GAAMx6B,EAAGgtM,oBAAoB99I,EAAaD,EAC1Cz0B,GAAIyyK,SAASliN,SACXmkE,EAAYxyE,SAAS,SACvBsjB,EAAGktM,wBAAwBh+I,EAAaD,GACxCjvD,EAAGksM,YAAYh9I,KAGflvD,EAAGktM,wBAAwBh+I,EAAY3pC,SAAS,UAAW0pC,GAC3DjvD,EAAGo0F,aAAallC,IAGlB10B,EAAIrW,QAAUnkB,EAAGq0F,WAAW75D,EAAIyyK,UAAYjtM,EAAGsvD,UAAU90B,EAAIyyK,eAG5D,CACH,GAAInpN,GACAkgC,GAAU,CAEVirC,IACFnrE,EAAOkc,EAAGu0F,YAAYpzG,KAAK,sBACR,GAAf2C,EAAKiH,SACPjH,EAAOkc,EAAGu0F,YAAYpzG,KAAK,uBAC3B6iC,GAAU,KAIZlgC,EAAOkc,EAAGu0F,YAAYpzG,KAAK,sBAC3B6iC,GAAU,EACS,GAAflgC,EAAKiH,SACPjH,EAAOkc,EAAGu0F,YAAYpzG,KAAK,qBAC3B6iC,GAAU,IAIdhkB,EAAGu0F,YAAYzyG,UAAUmtE,EAAO,EAAI,KACpCjrC,EAAUhkB,EAAGq0F,WAAWvwG,GAAQkc,EAAGsvD,UAAUxrE,MAKnDowG,oBAAqB,SAAUjlC,GAC7B,GAAIjvD,GAAK/iB,KACLiyE,EAAclvD,EAAGu0F,YAAYpzG,KAAK,0DACtC,IAAI+tE,EAAYnkE,OAAQ,CAEtB,GAAIokE,EACAF,IACFE,EAAWD,EAAY/tE,KAAK,kDAAkDrC,QACvD,GAAnBqwE,EAASpkE,SACXokE,EAAWnvD,EAAGmtM,oBAAoBj+I,EAAaD,IAE7CE,EAAStuE,QAAUquE,EAAYx+D,SAAS7P,SAC1CsuE,EAAWD,IAIbC,EAAWnvD,EAAGmtM,oBAAoBj+I,EAAaD,GAE7CE,EAASpkE,SACXmkE,EAAYxyE,SAAS,QAAUsjB,EAAGksM,YAAYh9I,GAAelvD,EAAGo0F,aAAallC,GAC7EC,EAASzyE,SAAS,QAAUsjB,EAAGsvD,UAAUH,GAAYnvD,EAAGq0F,WAAWllC,GACnEnvD,EAAGotM,wBAAwBj+I,EAAUF,QAIvC,IAAIA,EAAM,CACR,GAAInrE,GAAOkc,EAAGu0F,YAAYpzG,KAAK,kDAAkDrC,OACjFgF,GAAKpH,SAAS,QAAUsjB,EAAGsvD,UAAUxrE,GAAQkc,EAAGq0F,WAAWvwG,GAC3Dkc,EAAGu0F,YAAYzyG,UAAU,OAEtB,CACH,GAAIgC,GAAOkc,EAAGu0F,YAAYpzG,KAAK,gDAAgD2+D,MAC/Eh8D,GAAKpH,SAAS,QAAUsjB,EAAGsvD,UAAUxrE,GAAQkc,EAAGq0F,WAAWvwG,GAC3Dkc,EAAGu0F,YAAYzyG,UAAU,OAK/BqrN,oBAAqB,SAAUrpN,EAAMmrE,GACnC,GAAIE,EACJ,IAAIF,EACFE,EAAWrrE,EAAK86B,KAAK,qBACE,GAAnBuwC,EAASpkE,SAKTokE,EAJGrrE,EAAK4M,OAAO,gBAAgB3F,OAIpBjH,EAHA7G,KAAKkwN,oBAAoBrpN,EAAKjF,QAAQ,qBAAsBowE,QAOxE,CACHE,EAAWrrE,EAAK+6B,KAAK,oBACrB,IAAI2wC,IAAU,CAcd,IAbuB,GAAnBL,EAASpkE,SACNjH,EAAK4M,OAAO,gBAAgB3F,QAQ/BokE,EAAWrrE,EACX0rE,GAAU,IARVL,EAAWrrE,EAAKjF,QAAQ,qBACxB2wE,GAAU,EACa,GAAnBL,EAASpkE,SACXokE,EAAWlyE,KAAKkwN,oBAAoBrpN,EAAKjF,QAAQ,qBAAsBowE,MAQzEO,EAAS,CACX,GAAIC,GAAUN,EAAShuE,KAAK,gDAAgD2+D,MACxE2P,GAAQ1kE,SACVokE,EAAWM,IAOjB,OAHIN,EAASpkE,QAAWokE,EAASzyE,SAAS,SAAYyyE,EAASzyE,SAAS,iBACtEyyE,EAAWrrE,GAENqrE,GAGTi+I,wBAAyB,SAAUtpN,EAAMmrE,GACvC,GAAIjvD,GAAK/iB,IACT,IAAI+iB,EAAGqtM,qBAAuBrtM,EAAGu0F,YAAYtzG,SAAU,CACrD,GAAI23G,GAAa,GACb33G,EAAS,EACT2uE,EAAY9rE,EAAK9B,KAAK,MACtBxD,EAAQwhB,EAAGu0F,YAAYpzG,KAAK,2CAEhC,IAAI8tE,EAAM,CACR,IAAK,GAAIzqE,GAAIhG,EAAMuM,OAAS,EAAGvG,GAAK,EAAGA,IACrC,GAAI1I,EAAE0C,EAAMgG,IAAIxC,KAAK,OAAS4tE,EAAW,CACvC3uE,IAAWuD,EAAI,GAAKo0G,CACpB,OAGA54F,EAAGu0F,YAAYtzG,SAAWA,EAAS,IACrC+e,EAAGu0F,YAAYzyG,UAAUke,EAAGu0F,YAAYzyG,YAAc82G,OAGrD,CACH,IAAK,GAAIp0G,GAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAChC,GAAI1I,EAAE0C,EAAMgG,IAAIxC,KAAK,OAAS4tE,EAAW,CACvC3uE,IAAWuD,EAAI,GAAKo0G,CACpB,OAGA33G,EAAS+e,EAAGu0F,YAAYzyG,YAAc,IACxCke,EAAGu0F,YAAYzyG,UAAUke,EAAGu0F,YAAYzyG,YAAc82G,MAM9Dy0G,mBAAoB,WAGlB,IAAK,GAFDpsN,GAAS,EACTzC,EAAQvB,KAAKs3G,YAAYhvE,WACpB/gC,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAChCvD,GAAUnF,EAAE0C,EAAMgG,IAAIvD,QAExB,OAAOA,IAIT+rN,oBAAqB,SAAU99I,EAAaD,GAC1C,GACIE,GACAnrC,GAAU,CAgBd,OAfIkrC,GAAYxyE,SAAS,SACvByyE,EAAWF,EAAOC,EAAYtwC,KAAK,iBAAmBswC,EAAYrwC,KAAK,iBAChD,GAAnBswC,EAASpkE,SACXokE,EAAWF,EAAOC,EAAYx+D,OAAO,gBAAgBkuB,OAASswC,EAAYx+D,OAAO,gBACjFszB,GAAU,KAKZmrC,EAAWF,EAAOC,EAAY3pC,SAAS,uBAAyB2pC,EAAYrwC,OAAO0G,SAAS,sBACrE,GAAnB4pC,EAASpkE,SACXokE,EAAWF,EAAOC,EAAYtwC,OAASswC,EAAYrwC,OACnDmF,GAAU,KAGLipL,SAAU99I,EAAUhrC,QAASH,IAGxCkpL,wBAAyB,SAAUh+I,EAAaD,GAC9C,GAAIjvD,GAAK/iB,IACT,IAAIgyE,GACF,GAAItvE,KAAK28L,IAAIptH,EAAY9sE,WAAW1C,IAAMsgB,EAAGu0F,YAAYtzG,UAAY,GAAI,CACvE,GAAI+B,GAASgd,EAAGu0F,YAAYzyG,WAC5Bke,GAAGu0F,YAAYzyG,UAAUkB,EAASksE,EAAYjuE,eAIhD,IAAItB,KAAK28L,IAAIptH,EAAY9sE,WAAW1C,KAAO,IAAK,CAC9C,GAAIsD,GAASgd,EAAGu0F,YAAYzyG,WAC5Bke,GAAGu0F,YAAYzyG,UAAUkB,EAASksE,EAAYjuE,YAKpD0rN,mBAAoB,WAClB,GAAI3sM,GAAK/iB,KACL4pB,EAAQ7G,EAAGu0F,YAAYpzG,KAAK,aAE5B0lB,GAAM9b,OAAS,IAAM8b,EAAMnqB,SAAS,gBACtCsjB,EAAGq0F,WAAWxtF,GACd7G,EAAGstM,iBAAiBzmM,EAAM0e,SAAS,aAIvCqnL,kBAAmB,WACjB,GAAI5sM,GAAK/iB,KACL4pB,EAAQ7G,EAAGu0F,YAAYpzG,KAAK,qCAAqCuP,OAAO,qBACvEmW,GAAM9b,SAAU8b,EAAQ7G,EAAGu0F,YAAYpzG,KAAK,eAC7C0lB,EAAM9b,SACRiV,EAAGq0F,WAAWxtF,GACd7G,EAAG8sM,iBAAiBjmM,EAAM0e,SAAS,WACnCvlB,EAAGktM,wBAAwBrmM,EAAM0e,SAAS,WAAW,KAIzDsnL,eAAgB,WACd,GAAI7sM,GAAK/iB,KACL03G,EAAa30F,EAAGu0F,YAAYpzG,KAAK,cAAca,KAAK,KACxD,IAAI2yG,EAAY,CACd,GAAIC,GAAkB50F,EAAG+nM,qBAAqB5mN,KAAK,SAAWwzG,EAAa,KAAKxzG,KAAK,oBACrF6e,GAAGw4F,wBAAwB5D,KAI/Bu3G,qBAAsB,SAAUoB,GAC9BA,EAAazxN,EAAEyxN,EACf,IAAIC,GAAKD,EAAW78M,QAEf88M,GAAG9wN,SAAS,gBACX6wN,EAAW78M,SAAShU,SAAS,eAC/BO,KAAKqwN,iBAAiBC,GAGtBtwN,KAAK6vN,iBAAiBS,GAExBtwN,KAAK2uN,+BAIT0B,iBAAkB,SAAUC,GAC1B,GAAIvtM,GAAK/iB,IAGT,IAFAswN,EAAW78M,SAASnU,YAAY,eAChCgxN,EAAWhoL,WAAWzmC,QAAQvC,YAAY,eAAeI,SAAS,eAC9DqjB,EAAGk4F,SAC+B,GAAhCq1G,EAAW5pJ,WAAW54D,SACxBwiN,EAAW78M,SAASzU,OAAOH,EAAE,0DAC7BkkB,EAAGmpM,YAAYoE,EAAW78M,SAAU,SAEjC,CACL,GAAI+8M,GAAOF,EAAW78M,SAClB+sD,EAAYgwJ,EAAKzrN,KAAK,YACtB+H,EAAQiW,EAAGkgM,WAAW3tL,OAAOkrC,EAE5B1zD,GAAMy/M,WAC2B,GAAhCiE,EAAKtsN,KAAK,YAAY4J,QACxB0iN,EAAKxxN,OAAOH,EAAE,0DAEhBkkB,EAAGspM,YAAY,GAAI7rJ,EAAW,WAE5B8vJ,EAAW5pJ,SAAS,YAAYh2B,SAChC8/K,EAAKxxN,OAAO+jB,EAAGgrM,eAAevtJ,EAAW1zD,IACzCiW,EAAG0rM,uBAAuB+B,GAAM,GAChCztM,EAAGqrM,6BACF,WAEDkC,EAAW5pJ,SAAS,YAAYh2B,SAChC8/K,EAAKxxN,OAAO+jB,EAAGgrM,eAAevtJ,EAAW1zD,SAMjD+iN,iBAAkB,SAAUS,GAC1BA,EAAW78M,SAAS/T,SAAS,eAC7B4wN,EAAWpsN,KAAK,gBAAgB5E,YAAY,eAAeI,SAAS,gBAGtE+vN,kBAAmB,WACjB,GAAI1sM,GAAK/iB,IACL+iB,GAAG2oD,cAED3oD,EAAG6oM,gBAAgB3lN,aAAa8c,EAAG6oM,gBACvC7oM,EAAG6oM,eAAiBtlN,WAAW,WAC7B,GAAImqN,GAAe1tM,EAAG2tM,mBAClBD,MAAiB,GACnB1tM,EAAGovG,QAAQs+F,EAAc,WAEvB1tM,EAAGkqM,gBACHlqM,EAAG0rM,4BAGN,OAIPiC,kBAAmB,WACjB,GACIxhF,GADAnsH,EAAK/iB,IAETkvI,GAAerwI,EAAE2V,KAAKuO,EAAG2oD,YAAYz3D,MACrC,IAAI08M,GAAkBzhF,EAAahhI,QAAQ,KAAM,GACjD,OAAIghI,KAAiBnsH,EAAGmoM,kBACE,KAApByF,EACKzhF,EAEA,KAObr8D,WAAY,SAAUhsE,GACpB,GAAIkc,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UAEvB,KAAKjyL,EAAG4lC,aAAc,CACpB13D,EAAOhI,EAAEgI,EACT,IAAItD,GAAKsD,EAAK9B,KAAK,KACnB,IAAkB,mBAAPxB,GAAoB,MAC/B,IAAIi9D,EAEFA,GADEz9C,EAAGk4F,SACOp0G,EAAKlH,KAAK,aAEVojB,EAAGkgM,WAAW3tL,OAAOxnB,OAAS,EAAIjH,EAAKjF,QAAQ,gBAAgBC,QAAQkD,KAAK,YAAcge,EAAG6nM,WAAW32K,iBAEtH,IAAIhqC,GAAOpD,EAAK3C,KAAK,cAAcuD,OAC/BqvG,GAAYt2C,UAAWA,EAAWj9D,GAAIA,EAAI0G,KAAM,GAAKA,EAEzD8Y,GAAG6tM,mCAAmC95G,IAEtC/zF,EAAGlB,KAAK,iBAAkBi1F,KAK9B85G,kCAAmC,SAAUrvN,GAG3C,IAAK,GAFDwhB,GAAK/iB,KACL4D,EAAO,GACF2D,EAAI,EAAGA,EAAIhG,EAAMuM,OAAQvG,IAC5Bwb,EAAG4pM,qBAAqBprN,EAAMgG,GAAGhE,OAAQ,IAC7CK,GAAQmf,EAAG2qM,2BAA2BnsN,EAAMgG,IAC5Cwb,EAAGkgM,WAAW/nJ,cAAc3nD,KAAKhS,EAAMgG,IACvCwb,EAAG8tM,WAAWtvN,EAAMgG,GAAGhE,IAAI,GAEjB,KAARK,IACFmf,EAAG+nM,qBAAqB5mN,KAAK,uBAAuBuP,SAASi9B,SAC7D3tB,EAAG+nM,qBAAqB9rN,OAAO4E,GAC/Bmf,EAAG+nM,qBAAqB5mN,KAAK,MAAMnE,KAAK,WAAcgjB,EAAGu4F,gCAAgCt7G,QACzF+iB,EAAGm1F,+BACHn1F,EAAG+nM,qBAAqBr3M,SAAS5O,UAAU,OAK/C44D,oBAAqB,SAAUguE,EAAOo3D,GACpC,GAAI9/K,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UAElBjyL,GAAG4lC,eAENx7C,EAAGw4F,wBAAwBx4F,EAAG+nM,qBAAqB5mN,KAAK,UAAYunI,EAAMloI,GAAK,MAAMW,KAAK,uBAE1F6e,EAAG6tM,kCAAkC/tB,KAIzCtnF,wBAAyB,SAAU10G,GACjC,GAAIkc,GAAK/iB,KAAM24B,EAAK5V,EAAG6nM,UAEvB,KAAKjyL,EAAG4lC,aAAc,CACpB,GAAIxnC,GAAMl4B,EAAEgI,GAAM4M,SAASA,SACvBlQ,EAAKwzB,EAAIhyB,KAAK,MAEd41G,EAAM53F,EAAG4pM,qBAAqBppN,EAC9Bo3G,MAAQ,GACV53F,EAAGkgM,WAAW/nJ,cAAc/lD,OAAOwlG,EAAK,GAG1C5jF,EAAI2Z,SACJ3tB,EAAG8tM,WAAWttN,GAAI,GAClBwf,EAAGm1F,+BACHn1F,EAAG+tM,oBAIP15G,WAAY,SAAUtqG,GACpB9M,KAAKm3G,aAAan3G,KAAKs3G,YAAYpzG,KAAK,eACxCrF,EAAEiO,GAAOpN,SAAS,aAClBM,KAAKivN,YAAYjvN,KAAKs3G,YAAYpzG,KAAK,WAGzCizG,aAAc,SAAUrqG,GACtBjO,EAAEiO,GAAOxN,YAAY,aAAaI,SAAS,SAG7C2yE,UAAW,SAAUxrE,GACnB,GAAIkc,GAAK/iB,IACT+iB,GAAGksM,YAAYjvN,KAAKs3G,YAAYpzG,KAAK,UACrC6e,EAAGo0F,aAAan3G,KAAKs3G,YAAYpzG,KAAK,eACtCrF,EAAEgI,GAAMnH,SAAS,QAAQwE,KAAK,wBAAwBR,IAAI,aAAc,YAG1EurN,YAAa,SAAUpoN,GACrBhI,EAAEgI,GAAMvH,YAAY,QAAQ4E,KAAK,wBAAwBR,IAAI,aAAc,WAG7E0qN,0BAA2B,WAGzB,IAAK,GAFDrrM,GAAK/iB,KACL24G,EAAW51F,EAAGkgM,WAAW/nJ,cACpB3zD,EAAI,EAAGmK,EAAMinG,EAAS7qG,OAAQvG,EAAImK,EAAKnK,IAC9Cwb,EAAG8tM,WAAWl4G,EAASpxG,GAAGhE,IAAI,IAIlCstN,WAAY,SAAUttN,EAAIwsE,GACxB,GAAIxsE,EAAI,CACN,GAGI2qE,GACA6iJ,EAJAlqN,EAAO7G,KAAKs3G,YAAYpzG,KAAK,YAAcX,EAAK,qBAAuBA,EAAK,KAC5E6E,EAAOvB,EAAK3C,KAAK,SACjB6iC,EAAUlgC,EAAKpH,SAAS,cAGxBO,MAAKi7G,UACP81G,EAAgB/wN,KAAKs3G,YAAYpzG,KAAK,MAAMokC,SAAS,IAAM/kC,GAEzD2qE,EADErnE,EAAKpH,SAAS,YACJsnC,EAAU/mC,KAAKwrN,2BAA6BxrN,KAAKk7G,sBAGjDn0E,EAAU/mC,KAAKsrN,uBAAyBtrN,KAAKm7G,wBAGvDt0G,EAAK3C,KAAK,0BAA0B4J,OAAS,IAC/CogE,EAAYluE,KAAKwrN,6BAInBt9I,EAAYluE,KAAKmrN,sBAEnB,IAAI6F,GAAkBhxN,KAAKi7G,SAAYl0E,EAAU/mC,KAAKurN,6BAA+BvrN,KAAKo7G,8BAAiCp7G,KAAKorN,4BAC5Hr7I,IACFlpE,EAAKnH,SAAS,YACVM,KAAKi7G,UAAY7yG,EAAK9I,YAAYU,KAAKm7G,yBAAyB77G,YAAYU,KAAKk7G,uBACrF9yG,EAAK9I,YAAY4uE,GAAWxuE,SAASsxN,KAGrCnqN,EAAKvH,YAAY,YACjB8I,EAAK9I,YAAY0xN,GAAiBtxN,SAASwuE,GAEvCluE,KAAKi7G,UACP81G,EAAc7sN,KAAK,SAAS5E,YAAY4uE,GAAWxuE,SAASqnC,EAAU/mC,KAAKsrN,uBAAyBtrN,KAAKm7G,4BAOjHjD,6BAA8B,WAC5B,GAAIn1F,GAAK/iB,KACL2B,EAAIohB,EAAG+nM,qBAAqBr3M,QAC5BsP,GAAG+nM,qBAAqB9mN,SAAWrC,EAAEqC,SACvCrC,EAAEjC,SAAS,mBAEXiC,EAAErC,YAAY,oBAIlB8tN,gCAAiC,WAC/B,GAAIrqM,GAAK/iB,IACLnB,GAAEyF,QAAQrD,QAAU,MACtB8hB,EAAGu0F,YAAY11G,QAAQ,iBAAiB8B,IAAI,OAAQ,IAAIA,IAAI,MAAO,KACnE7E,EAAEyF,QAAQyH,WAAW,KAIzBshN,gCAAiC,WAC3B9nN,GAAGC,IAAIC,cACTzF,KAAK4qN,WAAW52M,IAAIjP,KAAK,YAAY,GACrClG,EAAE,cAAckG,KAAK,YAAY,KAIrC+rN,gBAAiB,WACf,GAAI14L,GAAOp4B,KAAK8qN,qBAAqBxiL,SAAS,SAASpkC,KAAK,KAC5D,IAAmB,GAAfk0B,EAAKtqB,OAAa,CACpB,GAAImjN,GAAWpyN,EAAE,6DAA+D8H,EAAE,SAAW,aAC7F3G,MAAK8qN,qBAAqB9rN,OAAOiyN,GACjCjxN,KAAKs7G,gCAAgC21G,MAM3CpyN,EAAE4B,GAAGgB,QACHkpN,uBAAwB,SAAUziJ,GAEhC,MADAloE,MAAKL,KAAK,iCAAkC,GAAIgrN,GAAuB3qN,KAAMkoE,IACtEloE,MAEToyK,2BAA4B,WAC1B,GAAI2wC,GAAK/iN,KAAKL,KAAK,iCAEnB,OADIojN,IAAIA,EAAG9gN,OACJjC,SAGVoM;ACxlDH,GAAI8kN,6BAA8B,EAC9BC,+BAAiC,GAErC,WACE,GAAIC,GAAsBvyN,EAAEkiC,KAE5Bz8B,QAAO+sN,SAAW,WACO,mBAAZ/uM,UAAmD,mBAAjBA,SAAQmS,MACnDlS,IAAIkS,KAAK,UAAU,2GAErBlvB,GAAGgnB,QAAQ,mBACXjoB,OAAO+sN,SAAWA,SACe,mBAArB/sN,QAAe,UAAmB+sN,WAAW9wN,KAAKo1B,SAE9D,IAAI27L,GAAWzyN,EAAE0nB,UAKjB,OAJAjgB,YAAW,WAAcgrN,EAASxpM,WAAc,KAChDjpB,EAAEiwB,KAAKvpB,GAAGiqB,SAAUjqB,GAAGipB,iBAAkB8iM,GAAU//M,KAAK,WACtD1S,EAAE,QAAQupD,QAAQ,kBAEb9jD,OAAO+sN,WAGhB,IAAIE,GAAsB,WAEpB1yN,EAAEkiC,MAAQqwL,EAAsB,MAEiB,mBAAzChlN,QAAO/I,MAAMsoB,OAAsB,cAAkD,mBAArBrnB,QAAe,SACzFA,OAAO+sN,WAEP/qN,WAAWirN,EAAqB,MAGpCA;CCjCF,SAAWv0M,EAAG2O,GA6EZ,QAAS6lM,KACP3yN,EAAE,0CAA0CkC,SAC5ClC,EAAE,qBACCwgI,YAAY,oBACZA,YAAY,wBASjB,QAASoyF,GAAgBhiM,GACvB,GAAIiiM,IAAQ,MAAO,OAAQ,MAC3B,OAAOpoN,GAAE8B,QAAQsmN,EAAMjiM,IAAa,EAStC,QAASkiM,GAAeliM,GACtB,GAAImiM,IAAY,MAAO,OAAQ,MAAO,MAEtC,OAAOtoN,GAAE8B,QAAQwmN,EAAUniM,IAAa,EAO1C,QAASoiM,KACP,GAAIC,GAAajzN,EAAE,qBAAqBsgD,WACpC4yK,EAAclzN,EAAEizN,EAAW5tN,KAAK,YAAYA,KAAK,yBAAyB,GAAG05G,gBACjF,OAAOm0G,GAOT,QAASC,KACP,GAAIz2L,GAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,IACvE,OAAO2I,GAAQogK,YAAYpgK,EAAQqgK,YAAYr4L,IAAI68B,SAxHrD,GAAIgyL,IACFC,SAAU,iBACVC,eAAgB,kBAChBC,YAAa,qBAIXC,GACFH,SAAU,aACVC,eAAgB,gBAChBC,YAAa,gBACbE,aAAc,MACdC,YAAa,MAMf7zN,GAAEyF,QAAQyf,KAAK,WAEb,GAAI4uM,IAAY,CACd9zN,EAAE,iBAAiBiC,GAAG,QAAS,WAC7BjC,EAAE,aAAakC,UAGjB,IAAIyjB,GAAM,GAAIjf,IAAGkf,GAE4B,cAAzCD,EAAIwX,SAAS,UAAU9Z,eAAuE,YAAvCsC,EAAIwX,SAAS,QAAQ9Z,eAA6BsvM,IAC7G3yN,EAAE,qBAAqB4U,SAASm/M,YAAY,kBAG5C/zN,EAAE,yBAAyBiC,GAAG,SAAU,WACtCsL,OAAO6lN,YAAYC,QAAQC,WAAWU,cAAch0N,EAAEmB,MAAMiU,OAE5D6+M,gBAAgB,uBAIlBj0N,EAAE,qBAAqBiC,GAAG,SAAU,WAClC,GAAIiyN,GAAQl0N,EAAEmB,MAAMiU,KACpB7H,QAAO6lN,YAAYC,QAAQC,WAAWryB,SAASizB,GAC/CxtN,GAAG8L,IAAIqqE,QAAQiF,gBAAgBoyI,GAC/BD,gBAAgB,uBAKdrB,EAAgBO,MAClBnzN,EAAE,qBAAqBklB,KAAK,WAC1B8tM,IAAiB3lM,MAAM,WACrBrtB,EAAE,qBAAqB6E,KAAMsvN,YAAaC,IAAe,GAAK,KAAMC,aAAcD,IAAe,GAAK,WAM5Gp0N,EAAE,cAAc+zN,YAAY,gBAQhCjnM,EAAOwnM,kBAAoB,SAAUJ,GACnC3mN,OAAO6lN,YAAYC,QAAQC,WAAWryB,SAASizB,GAC/CxtN,GAAG8L,IAAIqqE,QAAQiF,gBAAgBoyI,GAiEjC,IAAIJ,GAAW,WACb,MAAQ9zN,GAAE,eAAeiP,OAAS,GAahCmlN,EAAe,WACjB,GAAIG,GAAQvB,IAAiB3tN,KAAK,QAC9BmvN,EAASD,EAAMlvN,KAAK,SACpBovN,EAAUF,EAAMlvN,KAAK,MACzB,QAAQmvN,EAAOpyN,QAASoyN,EAAOrvN,SAAWsvN,EAAQtvN,UAUpD2nB,GAAOmnM,gBAAkB,SAAU5yN,GACjC,GAAKyyN,IAAL,CACA,GAAIhpD,GAAY9qK,EAAEqB,GAAMiK,IAAI,GAAGg0G,cAAcj5G,SAASsB,KAAKojF,YAC3D/qF,GAAEqB,GAAMwD,KAAMM,OAAU2lK,EAAWvkK,SAAY,aAIpB,mBAAlB4X,GAAEi1M,cAA6Bj1M,EAAEi1M,gBACP,mBAA1Bj1M,GAAEi1M,YAAYC,UAAyBl1M,EAAEi1M,YAAYC,WAEhE,IAAIqB,GAAc,SAAUljL,GAC1B,OAAQA,EAAI5wC,SAAS,iBAGnB+zN,EAAc,SAAUnjL,GAC1B,MAAOA,GAAI5wC,SAAS,aAGlBg0N,EAAgB,SAAU3pJ,GAC5B,GAAIvuC,GAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,KACnEmoC,EAAY/9C,EAAE,IAAMue,EAAQm4L,WAC5B3hH,EAAQh3C,EAAUn5B,KAAK,gCAC3BmwE,GACG/tG,OAAO+2D,EAAU/2D,UACjB/C,MAAM85D,EAAU95D,SACf6oE,EACFioC,EAAM9vG,OAEN8vG,EAAMzxG,QAQNqzN,EAAa,SAAUt9E,EAAYu9E,EAAgBC,GACrD,GAAInmN,GAAS,eACT6tB,EAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,IAEnEyjH,GAAa96G,EAAQ0iK,aAAaK,YACpCjoD,EAAa96G,EAAQ0iK,aAAaK,WAEhCjoD,EAAa,IACfA,EAAa,GAEf96G,EAAQqgK,YAAYvlD,WAAaA,CAEjC,IAAIkoD,GAAQvhL,EAAE,IAAMue,EAAQm4L,UAAY,KAAOn4L,EAAQu4L,QAGnDrC,GAAgBO,MAClBzzB,EAAM76L,KAAMqwN,mBAAoB,SAGlCx1B,EAAMx5L,KAAK,MAAO2I,EAAOQ,QAAQ,MAAOqtB,EAAQyiK,mBAAmB9vL,QAAQ,MAAOqtB,EAAQ0iK,aAAa16L,IAAI2K,QAAQ,MAAOmoI,IAA+B,IAAhBw9E,EAAqB,IAAMA,EAAe,KAChLhzN,IAAI,QACJC,GAAG,OAAQ,WACV,GAAIq+C,GAAWo/I,EAAMp/I,WAEjB60K,EAAY,wDAGhB,IAFA70K,EAASj7C,KAAK,QAAQlF,OAAOg1N,GAEzBz4L,EAAQ0iK,aAAag2B,QAAS,CAChC,GAAIrnK,GAAMzN,EAASj7C,KAAK,MACK,OAAzB0oD,EAAI7nD,KAAK,cACX6nD,EAAI7nD,KAAK,YAAa6nD,EAAI3rD,SAEE,MAA1B2rD,EAAI7nD,KAAK,eACX6nD,EAAI7nD,KAAK,aAAc6nD,EAAI5oD,UAE7B4oD,EAAIltD,SAAS,gBAGf,IAAKizN,IAAY,CAEf,GAAIhB,EAAeK,KAAsB,CAEvC7yK,EAASj7C,KAAKkuN,EAAgBC,UAAU3yN,SAAS,aACjDy/C,EAASj7C,KAAKkuN,EAAgBE,gBAAgB5yN,SAAS,gBACvDy/C,EAASj7C,KAAKkuN,EAAgBG,aAAa7yN,SAAS,eAGpD,IAAI2yN,GAAWlzK,EAASj7C,KAAKsuN,EAAqBH,SAClD,IAAIA,EAASvkN,OAAS,EAAG,CACvB,GAAIomN,GAAiBl3M,EAAE,oCACvBmiC,GAASj7C,KAAK,QAAQlF,OAAOk1N,GAC7B7B,EAAStjK,SAASmlK,GAGlB7B,EAAStyN,KAAK,SAAUu5D,EAAO53D,GAC7B,GAAIyyN,GAAUt1N,EAAE6C,GAAIqD,KAAK,QACzB,IAAIovN,EACF,IAEE,IAAK,GADDvhM,GAAOuhM,EAAQllN,MAAM,KAChB1H,EAAI,EAAGA,EAAIqrB,EAAK9kB,OAAQvG,IAAK,CACpC,GAAIqG,GAASglB,EAAKrrB,GAAG0H,MAAM,IACT,wBAAdrB,EAAO,IACT/O,EAAE6C,GAAIwC,KAAKsuN,EAAqBF,gBAAgB1uN,KAAKgK,EAAO,GAAGmQ,WAAW,IAAK,IAAM,SAGzF,MAAO3Z,OASf+6C,EAASj7C,KAAK,cACXoyB,IAAI,uBACJv2B,KAAK,SAAUwH,EAAG7F,GACjBsb,EAAEtb,GAAIhC,SAAS,cAAgB6H,KAGP,QAAxByqN,KACF7yK,EAASj7C,KAAK,KACXR,IAAI,kBAAmB,aACvBQ,KAAK,QACLR,IAAI,QAAS,IAIpB8F,KAAKyxL,QAAQgC,UAAU18L,KAAKg7B,GAC5B/xB,KAAKyxL,QAAQY,oBAAoBtgK,GACjC/xB,KAAKyxL,QAAQO,aAAajgK,GAG5B,GAII64L,GAJA7iI,EAAUv0E,EAAE,IAAMue,EAAQm4L,WAG1BX,EAAQxhI,EAAQrtF,KAAK,aAKsBkwN,GAH1CzB,IAGC9zN,EAAE,iBAAiBY,SAAS,YAAwB,IAC/CZ,EAAE,kBAAkBY,SAAS,YAAwB,IAC9CszN,EAAM7uN,KAAK,yBAAyB+P,MAJzC8+M,EAAMpzN,KAAK,UAAY6J,KAAKyxL,QAAQroK,KAAKgpK,YAAYm3B,MAOlEsB,EAAU91B,GACVvhL,EAAEi1M,YAAYC,QAAQC,WAAWryB,SAASs0B,GACrCzB,KACHnpN,KAAKyxL,QAAQgC,UAAUoB,cAAc,GAInC94L,GAAGC,IAAIw5L,QAAUz5L,GAAGC,IAAIw5L,OAAOt6J,OAA+C,SAAtCn/B,GAAGC,IAAIw5L,OAAOt6J,MAAMxiB,cAC9D5b,WAAW,WAAcguN,EAAM/4L,EAAQqgK,YAAYm3B,QAAW,KAE9DuB,EAAM/4L,EAAQqgK,YAAYm3B,SAKhC/1M,EAAE,IAAMue,EAAQm4L,UAAY,uBAAuBz/M,IAAIoiI,IAGrDk+E,EAAsB,WACxBjuN,WAAW,WACT,GAAIkuN,GAAgB31N,EAAE,qBAAqBsL,IAAI,GAAGg0G,aAClDq2G,GAAcj+L,QACdi+L,EAAcC,SACb,MAGDC,EAAiB,SAAUn5L,GAC7B,GAAIg2D,GAAUv0E,EAAE,IAAMue,EAAQm4L,UACdniI,GAAQrtF,KAAK,IAAMq3B,EAAQu4L,UAGzCO,EAAY,SAAU91B,GACxB,GAAIo2B,GAAUp2B,EAAMp/I,WAAWj7C,KAAK,OAC/BywN,GAAQ7mN,QAAsD,MAA5CywL,EAAM,GAAGpgF,cAAcs+E,OAAgB,UAC5Dk4B,EAAU91N,EAAE0/L,EAAM,GAAGpgF,cAAcs+E,OAAgB,QAAEv3L,UAAUhB,KAAK,SAOtEywN,EAAQ7zN,GAAG,QAAS,WAClBjC,EAAE,iBAAiByB,SAGrBq0N,EAAQzwN,KAAK,KAAKnE,KAAK,SAAUu5D,GAC/B,GAAI7yD,GAAQ5H,EAAEmB,MACV8H,EAAOrB,EAAM1B,KAAK,OACV,OAAR+C,GAAwB,IAARA,GAAeA,EAAKy2J,MAAM,OAC5C93J,EAAM1B,KAAK,SAAU,WAKzB,IAAI6vN,GAAYr2B,EAAMp/I,WAAWj7C,KAAK,QAElCoB,EAAU,QACVsvN,GAAUtsL,SAAS,OAAOx6B,OAAS,IACrCxI,EAAU,EACVsvN,EAAUl1N,SAAS,0BAErBk1N,EAAUlxN,KAAMy7L,OAAU,EAAG75L,QAAWA,IAExCi5L,EAAM7+L,SAAS,yBAEXb,EAAE4qD,cAAgBlkD,GAAGC,IAAIC,eACtBktN,MACHkC,6BACAC,0BAMFC,EAAsB,WACxB,GAAIx5L,GAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,OAG/C,KAFKA,GAAW/xB,KAAKyxL,UAAW1/J,EAAU/xB,KAAKyxL,QAAQroK,MAElD2I,EAAL,CACA,GAAIg2D,GAAUv0E,EAAE,IAAMue,EAAQm4L,UAE9B,IAAIf,IAAY,CACd,GAAIphI,GAAUv0E,EAAE,IAAMue,EAAQm4L,WAC1BsB,EAASzjI,EAAQrtF,KAAK,cACtB+wN,EAAcD,EAAO9wN,KAAK,SAC9BkI,QAAO6lN,YAAYC,QAAQC,WAAWryB,SAASm1B,EAAYhhN,OAGjC,IAAxBsnB,EAAQvT,cACV2rM,EAAWp4L,EAAQqgK,YAAYvlD,YAGjC9kD,EAAQrtF,KAAK,eAAeuD,KAAK,KAAO8zB,EAAQ0iK,aAAaK,WAEzD/iK,EAAQ0iK,aAAaK,WAAa,GACpC/sG,EAAQrtF,KAAK,kBAAkBuP,SAASnT,OACxCzB,EAAE,cAAcyB,SAEhBixF,EAAQrtF,KAAK,kBAAkBuP,SAASxR,OACxCpD,EAAE,cAAcoD,OAGlB,IAAIizN,GAAe3jI,EAAQrtF,KAAK,SAoBhC,IAnBIq3B,EAAQ0iK,aAAag2B,SAGvB1iI,EAAQrtF,KAAK,iBAAiBjC,OAC9BsvF,EAAQrtF,KAAK,kBAAkBjC,OAC/BsvF,EAAQrtF,KAAK,kBAAkBjC,OAC/BsvF,EAAQrtF,KAAK,cAAcjC,OAC3BsvF,EAAQrtF,KAAK,eAAejC,OAC5BizN,EAAajzN,SAEbsvF,EAAQrtF,KAAK,iBAAiB5D,OAC9BixF,EAAQrtF,KAAK,kBAAkB5D,OAC/BixF,EAAQrtF,KAAK,kBAAkB5D,OAC/BixF,EAAQrtF,KAAK,cAAc5D,OAC3BixF,EAAQrtF,KAAK,eAAe5D,OAC5B40N,EAAa50N,QAIXqxN,EAAeK,KAAsB,CAIvC,GAHAzgI,EAAQrtF,KAAK,wBAAwBjC,OACrCsvF,EAAQrtF,KAAK,oBAAoBjC,QAE5BpD,EAAE,2BAA2BY,SAAS,YAAa,CACtD,GAAI8+L,GAAQhtG,EAAQrtF,KAAK,IAAMq3B,EAAQu4L,QACvCj1N,GAAE0/L,GAAOx6K,KAAK,WACZllB,EAAEozN,YAAYC,QAAQC,WAAWgD,wBAIrC,IAAKt2N,EAAE,uBAAuBY,SAAS,YAAa,CAClD,GAAI8+L,GAAQhtG,EAAQrtF,KAAK,IAAMq3B,EAAQu4L,QACvCj1N,GAAE0/L,GAAOx6K,KAAK,WACZzd,WAAW,WACTzH,EAAEozN,YAAYC,QAAQC,WAAWiD,mBAChC,YAIP7jI,GAAQrtF,KAAK,wBAAwB5D,OACrCixF,EAAQrtF,KAAK,oBAAoB5D,QAIrCzB,GAAEyF,QAAQ6d,KAAK,oBAAqB,SAAU9e,GAC5C0xN,KAYF,IAAIT,GAAQ,SAAU1sN,GACpB,GAAI2zB,GAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,IAIvE,IAAKrtB,GAAGioB,aAAchkB,KAAKyxL,QAAQK,eAAe02B,KAAlD,CAEA,GAAIzgI,GAAUv0E,EAAE,IAAMue,EAAQm4L,WAC1Bn1B,EAAQhtG,EAAQrtF,KAAK,IAAMq3B,EAAQu4L,SACnClnK,EAAM2xI,EAAMp/I,WAAWj7C,KAAK,OAC5BmxN,EAAW9jI,EAAQrtF,KAAK,iBACxBoxN,EAAY/jI,EAAQrtF,KAAK,kBACzBqxN,EAAYhkI,EAAQrtF,KAAK,iBAExByuN,MAA8C,OAAhCptN,GAAGC,IAAIuoB,GAAG9jB,KAAKiY,gBAChCq8K,EAAQ1/L,EAAE,gBACV0/L,EAAMv6L,OAAOnF,EAAEyF,QAAQN,SAAW,KAGpC,IAAIwxN,GAAc,WAChB5oK,EAAI3rD,MAAM,QACL0xN,IAOH/lK,EAAIghB,IAAI/uE,EAAE0/L,IAAQv6L,OAAOnF,EAAEyF,QAAQN,SAAWnF,EAAE,UAAUsB,SAASsC,KAN/DmqD,EAAIntD,SAAS,MAAQmtD,EAAIntD,SAAS,MACpCmtD,EAAI3rD,MAAMpC,EAAE0/L,GAAOv6L,UACnB4oD,EAAI5oD,OAAO,SAER4oD,EAAI5oD,OAAO,SAKdnF,EAAE4qD,cAAgBlkD,GAAGC,IAAIC,eACtBktN,KAAY8C,0BAGjBv7F,EAAa,WACfttE,EAAI5oD,OAAO,QACX4oD,EAAI3rD,MAAM,QAENpC,EAAEwB,MAAMusD,EAAI3rD,MAAMpC,EAAE,2BAA2BoC,UAE/CpC,EAAE4qD,cAAgBlkD,GAAGC,IAAIC,eACtBktN,KAAY8C,yBAIrB,IAAY,KAAR7tN,GAAuB,KAARA,GAAuB,OAARA,GAAyB,KAARA,EAAa,CAC9D2zB,EAAQqgK,YAAYm3B,MAAQnrN,CAC5B,IAAIotN,GAASzjI,EAAQrtF,KAAK,cACtB+wN,EAActC,IAAaqC,EAAO9wN,KAAK,UAAY8wN,EAAO9wN,KAAK,kBACvD,QAAR0D,EACG+qN,IAGHsC,EAAYhhN,IAAIrM,GAFhBqtN,EAAYhhN,IAAIrM,EAAO,KAKpB+qN,IAGHsC,EAAYhhN,IAAIrM,GAFhBqtN,EAAYhhN,IAAa,KAARrM,EAAe2zB,EAAQm6L,gBAA4B,KAAR9tN,EAAe2zB,EAAQo6L,eAAiBp6L,EAAQq6L,iBAK3GjD,IACAqC,EAAOr1N,KAAK,QAASiI,GADTqtN,EAAY/wN,KAAK,yBAAyB+P,IAAIrM,GAIjE,GAAI+qN,IAAY,CACd,GAAIqC,GAASzjI,EAAQrtF,KAAK,cACtB+wN,EAActC,IAAaqC,EAAO9wN,KAAK,UAAY8wN,EAAO9wN,KAAK,kBACnE8wN,GAAOr1N,KAAK,QAASiI,GAGvB,GAAY,KAARA,EACF4tN,IAEAH,EAAS/1N,YAAY,YACrBg2N,EAAU51N,SAAS,YACnB61N,EAAUj2N,YAAY,gBACjB,IAAY,KAARsI,EACTsyH,IAEAm7F,EAAS31N,SAAS,YAClB41N,EAAUh2N,YAAY,YACtBi2N,EAAUj2N,YAAY,gBACjB,IAAY,KAARsI,EAAa,CACtB,GAAIqV,GAAI2vC,EAAI5oD,SAAW4oD,EAAI3rD,QACvB40N,EAAO54M,EAAI2vC,EAAI7nD,KAAK,YACpB8wN,GAAOt3B,EAAMv6L,SACX4oD,EAAIn5C,SAAShU,SAAS,eACxBmtD,EACG5oD,OAAO,QACP/C,MAAM,QAET2rD,EACG5oD,OAAO,QACP/C,MAAM2rD,EAAI7nD,KAAK,eAGpB8wN,EAAO54M,EAAIshL,EAAMt9L,QACb40N,GAAQt3B,EAAMv6L,SAChBwxN,IAEAt7F,KAIJm7F,EAAS/1N,YAAY,YACrBg2N,EAAUh2N,YAAY,YACtBi2N,EAAU71N,SAAS,gBAGnB41N,GAAUh2N,YAAY,YACtB+1N,EAAS/1N,YAAY,YACrBi2N,EAAUj2N,YAAY,aAI1B0d,GAAEi1M,YAAYC,QAAQC,YAEpB1/L,SAAU,SAAU8I,GAClB,GAAIxY,GAAK/iB,IACTgd,GAAEi1M,YAAYC,QAAQC,WAAW52L,QAAUA,EAEf,IAAxBA,EAAQvT,cACVjF,EAAG+rB,UAAUvT,EAAQvT,aAAcuT,EAAQu6L,UAG7C,IAAIvkI,GAAUv0E,EAAE,IAAMue,EAAQm4L,WAG1BqC,EAAkBxkI,EAAQrtF,KAAK,qBACnC6xN,GAAgBj1N,GAAG,WAAY,SAAUuC,GAEvC,GAAmB,IAAfA,EAAM8mD,MAAa,CAErB,GAAI6rK,GAAgBhtL,OAAOhsB,EAAEhd,MAAMiU,MAE9B0+M,KAIHgB,EAAWqC,GAAe,GAH1BxsN,KAAKyxL,QAAQgC,UAAU4C,WAAWm2B,GAKpC3yN,EAAML,iBAIJgZ,OAAOw4C,aAAanxD,EAAM8mD,OAAOo0G,MAAM,YAAYl7J,EAAML,mBAG/D+yN,EAAgBj1N,GAAG,OAAQ,WAEzB,GAAIk1N,GAAgBhtL,OAAOhsB,EAAEhd,MAAMiU,MAC9B0+M,KAGHgB,EAAWqC,GAAe,GAF1BxsN,KAAKyxL,QAAQgC,UAAU4C,WAAWm2B,KAOtCzkI,EAAQrtF,KAAK,kBAAkBpD,GAAG,QAAS,WAEzC,GAAIm1N,GAASj5M,EAAEhd,KACf,IAAIuzN,EAAY0C,GAAS,CAEvB,GAAIC,GAAiBltL,OAAO+sL,EAAgB9hN,MAExCiiN,GAAiB,IACnBA,IACKvD,IAGHgB,EAAWuC,GAAgB,GAF3B1sN,KAAKyxL,QAAQgC,UAAU4C,WAAWq2B,IAQxC,OAAO,IAKT3kI,EAAQrtF,KAAK,kBAAkBpD,GAAG,QAAS,WAEzC,GAAIm1N,GAASj5M,EAAEhd,KACf,IAAIuzN,EAAY0C,GAAS,CACvB,GAAIC,GAAiBltL,OAAO+sL,EAAgB9hN,MAExCiiN,GAAiB36L,EAAQ0iK,aAAaK,YACxC43B,IAEKvD,IAGHgB,EAAWuC,GAAgB,GAF3B1sN,KAAKyxL,QAAQgC,UAAU4C,WAAWq2B,IAQxC,OAAO,IAMT3kI,EAAQrtF,KAAK,iBAAiBpD,GAAG,QAAS,WAExC,GAAIm1N,GAASj5M,EAAEhd,KAaf,OAZIuzN,GAAY0C,KAEVzC,EAAYyC,IACdj5M,EAAEi1M,YAAYC,QAAQC,WAAWryB,SAAS,OAC1Cv6L,GAAG8L,IAAIqqE,QAAQiF,gBAAgB,SAE/B3jE,EAAEi1M,YAAYC,QAAQC,WAAWryB,SAAS,KAC1Cv6L,GAAG8L,IAAIqqE,QAAQiF,gBAAgB,QAK5B,IAKT4Q,EAAQrtF,KAAK,kBAAkBpD,GAAG,QAAS,WAEzC,GAAIm1N,GAASj5M,EAAEhd,KAaf,OAZIuzN,GAAY0C,KAEVzC,EAAYyC,IACdj5M,EAAEi1M,YAAYC,QAAQC,WAAWryB,SAAS,OAC1Cv6L,GAAG8L,IAAIqqE,QAAQiF,gBAAgB,SAE/B3jE,EAAEi1M,YAAYC,QAAQC,WAAWryB,SAAS,KAC1Cv6L,GAAG8L,IAAIqqE,QAAQiF,gBAAgB,QAK5B,IAKT4Q,EAAQrtF,KAAK,kBAAkBpD,GAAG,QAAS,WACzC,GAAIm1N,GAASj5M,EAAEhd,KAUf,OATIuzN,GAAY0C,KACVzC,EAAYyC,IACdj5M,EAAEi1M,YAAYC,QAAQC,WAAWryB,SAAS,OAC1Cv6L,GAAG8L,IAAIqqE,QAAQiF,gBAAgB,SAE/B3jE,EAAEi1M,YAAYC,QAAQC,WAAWryB,SAAS,KAC1Cv6L,GAAG8L,IAAIqqE,QAAQiF,gBAAgB,QAG5B,IAIT4Q,EAAQrtF,KAAK,cAAcpD,GAAG,QAAS,WAMrC,MALK6xN,KAGHgB,EAAWp4L,EAAQqgK,YAAYvlD,WAAY,KAAM,aAFjD7sI,KAAKyxL,QAAQgC,UAAUsC,YAIlB,IAIThuG,EAAQrtF,KAAK,eAAepD,GAAG,QAAS,WAMtC,MALK6xN,KAGHgB,EAAWp4L,EAAQqgK,YAAYvlD,WAAY,KAAM,cAFjD7sI,KAAKyxL,QAAQgC,UAAUuC,aAIlB,IAITjuG,EAAQrtF,KAAK,uBAAuBpD,GAAG,QAAS,WAE9C,MADAyzN,MACO,IAIThjI,EAAQrtF,KAAK,wBAAwBpD,GAAG,QAAS,WAE/C,MADAiiB,GAAGozM,sBACI,IAIT5kI,EAAQrtF,KAAK,oBAAoBpD,GAAG,QAAS,WAE3C,MADAiiB,GAAGqzM,kBACI,IAIT7kI,EAAQrtF,KAAK,uBAAuBpD,GAAG,QAAS,WAE9C,GAAIm1N,GAASj5M,EAAEhd,KAIf,IAAI2yN,IACFnB,QAEA,IAAI+B,EAAY0C,GAAS,CACvB,GAAIzxM,GAAM+W,EAAQ86L,UACdC,EAAU/6L,EAAQogK,YAAYpgK,EAAQqgK,YAAYr4L,IAElDgzN,EAAe,GAGnB,IAFI/xM,EAAIpZ,QAAQ,KAAO,IAAGmrN,EAAe,KAEZ,MAAzBD,EAAQ9rE,cACV,IAAK,GAAIjjJ,GAAI,EAAGA,EAAI+uN,EAAQ9rE,cAAc18I,OAAQvG,IAAK,CACrD,GAAI4qB,GAAQmkM,EAAQ9rE,cAAcjjJ,EAClCid,GAAMA,EAAM+xM,EAAepkM,EAAMguI,IAAM,IAAMhuI,EAAM2P,MACnDy0L,EAAe,IAInB/xM,EAAMA,EAAM+xM,EAAe,kBAAoBh7L,EAAQqgK,YAAYvlD,WAAa,iBAAmB96G,EAAQqgK,YAAYm3B,MAAQ,yBAA2Bx3L,EAAQqgK,YAAY46B,cAC9K7qM,EAAOwF,SAAW3M,EAItB,OAAO,IAIT+sE,EAAQrtF,KAAK,0BAA0BpD,GAAG,QAAS,SAAUsD,GAC3D,GAAIwmC,GAAU/rC,EAAEmB,MACb+E,KAAK,KAAMQ,GAAGmE,GAAG2a,IACjBtf,KAAK,OAAQ,QACbrF,SAAS,iBAER+2N,EAAgB7rL,EAAQqM,QAAQ,kBAEhCy/K,EAAe9rL,EAAQzqC,SACvBw2N,EAAqBF,EAAct2N,SACnCy2N,EAAqBH,EAAc9vJ,aAGvC,OADAriE,QAAOkF,KAAK44I,YAAYngJ,KAAK2oC,MAAexnC,KAAQszN,EAAatzN,KAAMX,IAAOk0N,EAAmBl0N,IAAMm0N,IAAsB,IACtH,IAKT55M,EAAE,oDAAoDrJ,aAAa49E,EAEnE,IAAIslI,GAAYtlI,EAAQrtF,KAAK,IAAMq3B,EAAQu4L,QAE3C92M,GAAE65M,GAAW/1N,GAAG,OAAQ,WACtBkc,EAAEi1M,YAAYC,QAAQC,WAAW52L,QAAUA,EAC3Ck4L,GAAc,EAEd,IAAImB,GAAY53M,EAAE65M,GAAW13K,WAAWj7C,KAAK,OACxC0wN,GAAU9mN,QAA0D,MAAhD+oN,EAAU,GAAG14G,cAAcs+E,OAAgB,UAClEm4B,EAAY/1N,EAAEg4N,EAAU,GAAG14G,cAAcs+E,OAAgB,QAAEv3L,UAAUhB,KAAK,QAE5E,IAAI4yN,IAAa,CAEjB,IAAsC,GAAlClC,EAAU,GAAGmC,kBAAwB,CAEvCD,GAAa,CACb,KACE,GAAIE,GAAWz8L,KAAKC,MAAMo6L,EAAUntN,QACpC,MAAOrD,GAEP0yN,GAAa,GAIjB,GAAIA,EAEFD,EAAUv2N,OACVyiB,EAAG+rB,UAAUkoL,EAASzmM,MAAOymM,EAASlB,eAEjC,CACL,GAAIv6L,EAAQ0iK,aAAag2B,QAAS,CAEhC,GAAIrnK,GAAM5vC,EAAE65M,GAAW13K,WAAWj7C,KAAK,MACV,OAAzB0oD,EAAI7nD,KAAK,cACX6nD,EAAI7nD,KAAK,YAAa6nD,EAAI3rD,SAEE,MAA1B2rD,EAAI7nD,KAAK,eACX6nD,EAAI7nD,KAAK,aAAc6nD,EAAI5oD,SAI7B,IACIowN,GADArB,EAAQxhI,EAAQrtF,KAAK,aAGvBkwN,GADEzB,IACSI,EAAMpzN,KAAK,SAElBd,EAAE,iBAAiB4U,OAAO,OAAOhU,SAAS,YAAwB,IAC7DZ,EAAE,kBAAkB4U,OAAO,OAAOhU,SAAS,YAAwB,IAC5DszN,EAAM7uN,KAAK,yBAAyB+P,MAGtD+I,EAAEi1M,YAAYC,QAAQC,WAAWryB,SAASs0B,GAC1CE,EAAM/4L,EAAQqgK,YAAYm3B,OAE1B8D,EAAUnzN,IAAI,aAAc,WAI9B2wN,EAAUwC,MAOdxC,EAAUwC,GAEVpD,GAAc,GAEdiB,EAAen5L,GAEfw5L,KAMFlC,cAAe,SAAUzkN,GACvB,GAAI2U,GAAK/iB,KACLu7B,EAAUv7B,KAAKu7B,SAAW/xB,KAAKyxL,QAAQroK,IAC3C6gM,IAAc,EACd,IAAIwD,GAAQ7oN,CAEZmtB,GAAQvT,cAAe,EAEvBhL,EAAEkjB,MACAt4B,KAAM,MACN4c,IAAK+W,EAAQyiK,kBACbr+L,MAAQ4D,GAAI0zN,GACZvqM,OAAO,EACP0T,SAAU,OACVC,QAAS,SAAU1gC,GAEjBojB,EAAGm0M,YACHzD,GAAc,EAEd,IAAIoD,GAAY75M,EAAE,IAAMue,EAAQm4L,UAAY,KAAOn4L,EAAQu4L,QAC3D+C,GAAU50N,OAEVs5B,EAAQqgK,YAAYr4L,GAAK0zN,EACzB17L,EAAQqgK,YAAYvlD,WAAa,EACjC96G,EAAQ0iK,aAAa16L,GAAK5D,EAAKw3N,GAC/B57L,EAAQ0iK,aAAaK,UAAY3+L,EAAKy3N,UACtC77L,EAAQ0iK,aAAao5B,aAAe13N,EAAK23N,aACzC/7L,EAAQ0iK,aAAag2B,QAAUt0N,EAAK43N,QAEpCxC,KAEFxkM,MAAO,SAAUtJ,GAEflE,EAAGm0M,YACHzD,GAAc,EAEd,IAAIxiN,GAAMspB,KAAKC,MAAMvT,EAAS6zD,aAC9B/3D,GAAG+rB,UAAU79B,EAAIsf,MAAOtf,EAAI6kN,UAE5B,IAAIe,GAAY75M,EAAE,IAAMue,EAAQm4L,UAAY,KAAOn4L,EAAQu4L,QAC3D+C,GAAUv2N,WAMhBw/L,SAAU,SAAU1xL,GAClB,GAAImtB,GAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,IACvE2I,GAAQqgK,YAAYm3B,MAAQ3kN,CAC5B,IAAImwL,GAAQvhL,EAAE,IAAMue,EAAQm4L,UAAY,KAAOn4L,EAAQu4L,SACnDlnK,EAAM2xI,EAAMp/I,WAAWj7C,KAAK,MAChCowN,GAAMlmN,GAEDukN,KACHnpN,KAAKyxL,QAAQgC,UAAU6C,SAAS1xL,GAErB,KAAPA,GAAqB,KAAPA,GAAqB,KAAPA,GAC9Bw+C,EACC5oD,OAAO,QACP/C,MAAM2rD,EAAI7nD,KAAK,cAAgBqJ,EAAM,OAGpCvP,EAAE4qD,cAAgBlkD,GAAGC,IAAIC,eACtBktN,KAAY8C,0BAKvB3mL,UAAW,SAAUgqC,EAAUg9I,GAC7B,GAAI3uN,GAAO6V,EAAE,8CACb7V,GAAKjD,KAAK,kBAAkB5D,MAE5B,IAAIk3N,GAAwB,SAAb1B,CACf7kM,WAAU6nD,EAAU0+I,GACpBrwN,EAAKlF,OAGL+a,EAAE,0BAA0B1d,YAAY,0BAG1C43N,UAAW,WACTl6M,EAAE,+CAA+C1c,QASnD61N,mBAAoB,WAClB,GAAI56L,GAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,KAEnE2+D,EAAUv0E,EAAE,IAAMue,EAAQm4L,WAC1B9mN,EAAS2kF,EAAQrtF,KAAK,uBAEtB0I,GAAOnN,SAAS,aAClBmN,EAAOtN,YAAY,YACnBU,KAAKm1N,wBAELvoN,EAAOlN,SAAS,YAChBM,KAAKy3N,sBAIPlyN,GAAG8L,IAAIxR,KAAK,uCAAyCq6E,UAAW,4BAA6BC,aAAevtE,EAAOnN,SAAS,eAE9Hg4N,mBAAoB,WAElB,GAAI10M,GAAK/iB,KACLu7B,EAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,KACnE2+D,EAAUv0E,EAAE,IAAMue,EAAQm4L,WAC1BgE,EAAWnmI,EAAQrtF,KAAK,IAAMq3B,EAAQu4L,SAAS30K,UAEnDu4K,GAASxzN,KAAKsuN,EAAqBC,cAC9B/uN,IAAI,QAAS,QACbA,IAAI,kBAAmB,aAC5Bg0N,EAASxzN,KAAKsuN,EAAqBE,aAAazwN,MAGhD,IAAI01N,GAAgBpmI,EAAQrtF,KAAK,mBACjC,IAAIyzN,EAAcl4N,SAAS,YAAa,CACtC,GAAI4yN,GAAWqF,EAASxzN,KAAKsuN,EAAqBH,UAC9CrqE,EAAQ0vE,EAASxzN,KAAKsuN,EAAqBD,YACJ,KAAvCF,EAAS13L,OAAO,YAAY7sB,OAC9BiV,EAAG60M,kBAEHvF,EAASpwN,OACT+lJ,EAAM/lJ,UAIZkzN,oBAAqB,WAEnB,GAAIpyM,GAAK/iB,KACLu7B,EAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,KACnE2+D,EAAUv0E,EAAE,IAAMue,EAAQm4L,WAC1BgE,EAAWnmI,EAAQrtF,KAAK,IAAMq3B,EAAQu4L,SAAS30K,UAEnDu4K,GAASxzN,KAAKsuN,EAAqBC,cAC9B/uN,IAAI,QAAS,WACbA,IAAI,kBAAmB,QAC5Bg0N,EAASxzN,KAAKsuN,EAAqBE,aAAapyN,MAGhD,IAAIu3N,GAAuB90M,EAAG+0M,2BAA2BJ,GACrDrF,EAAWqF,EAASxzN,KAAK2zN,EAAqBxF,SAC9CA,GAASvkN,SAAW4pN,EAASxzN,KAAKsuN,EAAqBH,UAAUvkN,OACnEiV,EAAGqyM,mBAEH/C,EAAS/xN,OACTo3N,EAASxzN,KAAK2zN,EAAqBE,SAASz3N,OAC5Co3N,EAASxzN,KAAK2zN,EAAqB7vE,OAAO1nJ,SAW9C81N,eAAgB,WACd,GAAI76L,GAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,KAEnE2+D,EAAUv0E,EAAE,IAAMue,EAAQm4L,WAC1B9mN,EAAS2kF,EAAQrtF,KAAK,mBAEtB0I,GAAOnN,SAAS,aAClBO,KAAKo1N,kBACLxoN,EAAOtN,YAAY,cAEnBU,KAAK43N,iBACLhrN,EAAOlN,SAAS,aAIlB6F,GAAG8L,IAAIxR,KAAK,uCAAyCq6E,UAAW,sBAAuBC,aAAevtE,EAAOnN,SAAS,eAExHm4N,eAAgB,WAEd,GAAI70M,GAAK/iB,KACLu7B,EAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,KACnE2+D,EAAUv0E,EAAE,IAAMue,EAAQm4L,WAC1BgE,EAAWnmI,EAAQrtF,KAAK,IAAMq3B,EAAQu4L,SAAS30K,WAC/C64K,EAAczmI,EAAQrtF,KAAK,wBAE3B+zN,EAAmBP,EAASxzN,KAAK,WAAWjD,QAC5Ci3N,EAAeR,EAASxzN,KAAK,2BAC7Bi0N,EAAeD,EAAax0N,IAAI,gBAAkB,MAClD00N,EAAY3tN,SAAS0tN,EAAajqN,QAAQ,KAAM,KAAOxL,KAAK+xG,MAAMwjH,EAAmB,GAErF5F,EAAWqF,EAASxzN,KAAKsuN,EAAqBH,SAG7C2F,GAAYv4N,SAAS,cACxB4yN,EAAWA,EAAS/7L,IAAIvT,EAAG+0M,2BAA2BJ,GAAUrF,WAE9DA,EAASvkN,OAAS,IACpB4pN,EAASxzN,KAAKsuN,EAAqBF,gBAAgBrwN,OACnDowN,EAASpwN,OACTy1N,EAASxzN,KAAK,WAAWjC,OACzBi2N,EAAax0N,IAAI,cAAe00N,EAAY,MAC5C5uN,KAAKyxL,QAAQ2B,cAAc86B,EAASxzN,KAAKsuN,EAAqBF,mBAGlE8C,gBAAiB,WAEf,GAAI75L,GAAUve,EAAEi1M,YAAYC,QAAQC,WAAW52L,SAAW/xB,KAAKyxL,QAAQroK,KACnE2+D,EAAUv0E,EAAE,IAAMue,EAAQm4L,WAC1BgE,EAAWnmI,EAAQrtF,KAAK,IAAMq3B,EAAQu4L,SAAS30K,WAE/C84K,EAAmBP,EAASxzN,KAAK,WAAWjD,QAC5Ci3N,EAAeR,EAASxzN,KAAK,2BAC7Bi0N,EAAeD,EAAax0N,IAAI,gBAAkB,MAClD00N,EAAY3tN,SAAS0tN,EAAajqN,QAAQ,KAAM,KAAOxL,KAAK+xG,MAAMwjH,EAAmB,GAErF5F,EAAWqF,EAASxzN,KAAKsuN,EAAqBH,SAAW,WACzDA,GAASvkN,OAAS,IACpBukN,EAAS/xN,OACTo3N,EAASxzN,KAAKsuN,EAAqBF,gBAAgBhyN,OACnDo3N,EAASxzN,KAAK,WAAW5D,OACzB43N,EAAax0N,IAAI,cAAe00N,EAAY,QAIhDC,yBAA0B,SAAUvwN,GAClC,MAAOA,GAAKoG,QAAQ,QAAS,MAG/B4pN,2BAA4B,SAAU/8J,GACpC,GAAIu9J,GAAev9J,EAAU72D,KAAKsuN,EAAqBD,YAEvD+F,GAAehvN,EAAEqxB,OAAO29L,EAAc,SAAU52N,GAAM,MAA8B,KAAvBA,EAAG4mC,SAASx6B,QAAgBkP,EAAEtb,GAAIwC,KAAK,OAAO4J,OAAS,GAEpH,IAAIyqN,MAEAlG,EAAWr1M,EAAEV,IAAIg8M,EAAc,SAAU52N,GAAM,MAAO,IAAMA,EAAGuI,KAAKiE,QAAQ,MAAO,KAKvF,OAJAqqN,GAAiBvwE,MAAQhrI,EAAEV,IAAIg8M,EAAc,SAAU52N,GAAM,MAAO,UAAYA,EAAGuI,KAAO,MAAOgI,KAAK,KACtGsmN,EAAiBR,QAAU/6M,EAAEV,IAAI+1M,EAAU,SAAU3wN,GAAM,MAAO8wN,GAAqBF,eAAiB,SAAW5wN,EAAK,MAAOuQ,KAAK,KACpIsmN,EAAiBlG,SAAWA,EAASpgN,KAAK,KAEnCsmN,KAIVnsN,OAAQ9H;ACrnCX,QAASk0N,WAEP,MADA/7L,UAAS,aAAa,IACf;ACHT,cAQA,SAAW9Q,GAOT,QAAS8sM,GAAwBxlM,GAC/B,GAAIylM,GAAW,GACXC,EAAYxkE,mBAAmBlhI,EAcnC,OAbAA,GAAMzf,QAAQ,SAAS2Q,GACrBu0M,GAAY,YACZA,GAAY7kE,SAAS1vI,GACrBu0M,GAAY,KACZA,GAAYv0M,EAAK5X,YAAY4R,aAC7Bu6M,GAAY,cAGd19K,UAAU49K,MACRC,YAAaH,EACbI,aAAcH,IAGT1lM,EAAMnlB,OAOf,QAASirN,GAA0B9lM,GACjC,GAAIzhB,GAAI3S,EAAE0nB,UASV,OARAwL,aAAY,2BAA6B+nB,MAAOuB,8BAA8BpoB,IAAU,SAAU7rB,GAC5FA,EAAIm2B,QACN/rB,EAAEsW,QAAQ1gB,GAGVoK,EAAE0W,OAAO9gB,KAGNoK,EAAE2W,UAvCXwD,EAAOqvB,aAiDPrvB,EAAOqvB,UAAUC,qBAAuB,SAAUhoB,GAChD,GAAIzhB,GAAI3S,EAAE0nB,WACN20B,EAAmB,CAGvB,OAAK,IAAajoB,EAAMnlB,OAAS,GAML,OAAxBvI,GAAGC,IAAI4M,QAAQnI,KACjB4gB,UAAU4C,MAAMkE,kBAAkB,aAAaC,OAAO,SAASC,GAEzDA,GACFknM,EAA0B9lM,GAC1BpI,UAAU4C,MAAMutB,UAAUC,qBAAqBhoB,GAAO1hB,KAAK,SAAUnK,GACnEoK,EAAEsW,QAAQ1gB,KACT2gB,KAAK,SAAU3gB,GAChBoK,EAAE0W,OAAO9gB,EAAIse,WAIfw1B,EAAmBu9K,EAAwBxlM,GAC3C8lM,EAA0B9lM,GAAO1hB,KAAK,SAASnK,GAC7CoK,EAAEsW,QAAQ1gB,EAAI6gB,UACbF,KAAK,SAAS3gB,GACfoK,EAAE0W,OAAO9gB,EAAIse,aAMnBw1B,EAAmBu9K,EAAwBxlM,GAC3C8lM,EAA0B9lM,GAAO1hB,KAAK,SAAUnK,GAC9CoK,EAAEsW,QAAQ1gB,EAAI6gB,UACbF,KAAK,SAAU3gB,GAChBoK,EAAE0W,OAAO9gB,EAAIse,UAIVlU,EAAE2W,eAnCP3W,GAAEsW,QAAQozB,IA4CdvvB,EAAOqvB,UAAUsoH,oBAAsB,SAAS77J,GAC9CuzC,UAAU49K,MACRE,aAAcrxN,KASlBkkB,EAAOqvB,UAAUiB,sBAAwB,WACvC,MAAOpxB,WAAU4C,MAAMutB,UAAUiB,0BAKlC33C,OAAOkF","file":"all.js","sourcesContent":["var ContextMenu;\n\n(function ($) {\n\n var panel = $('
');\n var init = false;\n var panel_added = false;\n var scrollDirection;\n var scrollStep = 25;\n\n function ensurePanelAdded() {\n if (!panel_added) {\n panel_added = true;\n $(\"body\").append(panel.mousedown(function (ev) { ev.stopPropagation() }));\n }\n }\n\n function showPanel(panel) {\n panel.removeClass(\"contextmenu-container__hidden\").redraw();\n }\n\n function hidePanel(panel) {\n if (!panel.hasClass(\"contextmenu-container__hidden\")) {\n panel.addClass(\"contextmenu-container__hidden\");\n if (panel.data('contextMenu') && panel.data('contextMenu').onHide) {\n panel.data('contextMenu').onHide.call(panel.data('contextMenu'));\n }\n }\n }\n\n function hideAllPanels() {\n $('.contextmenu-container').each(function () {\n hidePanel($(this));\n });\n }\n\n function getOffset(elem) {\n return elem.offset();\n }\n\n function doInit() {\n $(function () {\n if (!$.ipad)\n $(\"body\").mousedown(function () { ContextMenu.hide(); });\n })\n }\n\n $.fn.contextMenu = function (menu, eventName) {\n if (typeof eventName == \"undefined\")\n eventName = \"click\";\n $(this).off(eventName).on(eventName, function () { menu.toggle(this, panel) });\n return this;\n }\n\n var defaults = {\n width: 200,\n arrowWidth: 15,\n shiftX: 0,\n shiftY: 20,\n cssClass: \"\",\n arrowImage: \"ArrowRight.png\"\n }\n\n ContextMenu = function (items, options) {\n if (!init) {\n init = true;\n doInit();\n }\n this.items = items;\n $.extend(this, defaults, options);\n }\n\n ContextMenu.hide = function (el) {\n var p = panel;\n if (el) p = $(el).parents('div.contextmenu-container').first();\n hidePanel(p);\n }\n\n ContextMenu.hideAll = function () {\n hideAllPanels();\n }\n\n $.extend(ContextMenu.prototype, {\n toggle: function (elem, _panel) {\n if (typeof _panel == \"undefined\")\n _panel = panel;\n ensurePanelAdded();\n if (!panel.hasClass(\"contextmenu-container__hidden\")) {\n hidePanel(_panel);\n }\n else\n this.show(elem, _panel);\n },\n show: function (elem, _panel, opt_event) {\n this.targetElement = elem;\n\n var el = $(elem);\n if (scrollStep < 0) scrollStep = -scrollStep;\n if (typeof _panel == \"undefined\")\n _panel = panel;\n this.lastPanel = _panel;\n this.lastElement = el;\n _panel = $(_panel);\n ensurePanelAdded();\n _panel.data('contextMenu', this);\n this.fillContainer(_panel, opt_event);\n var coords = this.getCoordsFor(getOffset(el), _panel, true);\n coords.top = Math.floor(coords.top);\n //logDebug(coords.top);\n if (coords.top < 0) coords.top = 10;\n this.tuneContainer(_panel, coords, true);\n if (this.onShow) {\n var ok = this.onShow.call(this);\n if (ok === false)\n return;\n }\n if ($.ipad) {\n $('html').one('mousedown', function (ev) {\n ev.preventDefault();\n ev.stopPropagation();\n $('.contextmenu__manualhide').click();\n });\n }\n\n showPanel(_panel);\n },\n\n showAt: function (coords, _panel, isInternal, opt_event) {\n\n if (scrollStep < 0) scrollStep = -scrollStep;\n if (!_panel)\n _panel = panel;\n this.lastPanel = _panel;\n ensurePanelAdded();\n _panel.data('contextMenu', this);\n this.fillContainer(_panel, opt_event);\n coords.left -= defaults.shiftX;\n coords.top -= defaults.shiftY;\n coords.left += this.shiftX;\n coords.top += this.shiftY;\n if (!isInternal) {\n coords = this.getCoordsFor(coords, _panel, false);\n }\n //logDebug(coords.top);\n if (coords.top < 0) coords.top = 10;\n this.tuneContainer(_panel, coords);\n if (this.onShow) {\n var ok = this.onShow.call(this);\n if (ok === false)\n return;\n }\n showPanel(_panel);\n },\n\n fillContainer: function (_panel, event) {\n\n var scroller = $('
', { id: \"menuscroller\", style: \"overflow: auto;\" });\n var imageArrowUp = $('').css('background', 'silver').css('cursor', 'pointer');\n var divArrowUp = $('
').css('position', 'fixed').hide();\n divArrowUp.append(imageArrowUp);\n\n scroller.html(this.render(_panel, $.ipad, event));\n var imageArrowDown = $('').css('background', 'silver').css('cursor', 'pointer');\n var divArrowDown = $('
').css('position', 'fixed').hide();\n divArrowDown.append(imageArrowDown);\n _panel.html(divArrowUp).append(scroller).append(divArrowDown).css('height', scroller.height());\n },\n\n tuneContainer: function (_panel, coords, padLeft) {\n var scroller = $('#menuscroller', _panel);\n var divArrowDown = $('#arrowDown', _panel);\n var divArrowUp = $('#arrowUp', _panel);\n var imageArrowDown = divArrowDown.find('img');\n var imageArrowUp = divArrowUp.find('img');\n\n var wheel = function (e) {\n var scroller = $('#menuscroller');\n var delta = 0;\n e = e ? e : window.event;\n // Установим кроссбраузерную delta\n if (e.wheelDelta) {\n // IE, Opera, safari, chrome - кратность дельта равна 120\n delta = e.wheelDelta / 120;\n } else if (e.detail) {\n // Mozilla, кратность дельта равна 3\n delta = -e.detail / 3;\n }\n\n var cancelEvent = function (e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n if (e.preventDefault) {\n e.preventDefault();\n }\n e.cancelBubble = true;\n e.cancel = true;\n e.returnValue = false;\n return false;\n };\n\n scroller.scrollTop(scroller.scrollTop() - 20 * delta);\n return cancelEvent(e);\n };\n\n if (coords.top >= 34) {\n var top = coords.top;\n if (top + _panel.height() + 34 > window.innerHeight) top -= (top + _panel.height() - window.innerHeight) + 40;\n _panel.attr('style', '').css({ left: coords.left + \"px\", top: top + \"px\" });\n scroller.attr('style', '');\n divArrowDown.hide();\n divArrowUp.hide();\n if (window.removeEventListener) window.removeEventListener('DOMMouseScroll', wheel, false);\n window.onmousewheel = document.onmousewheel = null;\n } else {\n if (_panel.height() > $(window).height() - 10) { // если контекстное меню не влазит в окно, то урезаем его\n _panel.css({\n left: coords.left + \"px\",\n top: \"15px\",\n height: $(window).height() - 20 + \"px\",\n position: \"fixed\",\n overflow: \"hidden\"\n });\n imageArrowDown.css({ width: _panel.width(), background: \"silver\" }).show();\n imageArrowUp.css({ width: _panel.width(), background: \"silver\" }).show();\n if (!$.ipad) {\n divArrowDown.css({ position: \"fixed\", top: _panel.height() + 7 + \"px\" }).show();\n divArrowUp.css({ position: \"fixed\", top: 7 + \"px\" }).show();\n scroller.css({ overflow: \"hidden\", height: _panel.height() });\n if (window.addEventListener) window.addEventListener('DOMMouseScroll', wheel, false);\n window.onmousewheel = document.onmousewheel = wheel; // IE, Opera.\n } else {\n var padding = WA.ENV.isAndroid() ? Math.max(0, coords.left - _panel.width() - 5) : coords.left + 25;\n _panel.attr('style', '').css({ left: padding + \"px\", top: \"10px\" });\n _panel.css('height', $(window).height() - 20 + \"px\");\n divArrowDown.css({ position: \"fixed\", top: _panel.height() + \"px\" }).show();\n divArrowUp.css({ position: \"fixed\", top: 8 + \"px\" }).css('z-index', '100000').show();\n scroller.css({ overflow: \"auto\", paddingTop: \"5px\", height: _panel.height() - 10, width: $(window).width() + 100 }).addClass('contextmenu_scroller');\n if (!WA.ENV.isAndroid()) var contextMenuScroll = new iScroll('menuscroller', { useTransform: true });\n if (window.removeEventListener) window.removeEventListener('DOMMouseScroll', wheel, false);\n window.onmousewheel = document.onmousewheel = null;\n }\n } else { // иначе просто сдвигаем\n var padding = WA.ENV.isAndroid() ? Math.max(0, coords.left - _panel.width() - 5) : coords.left + 25;\n _panel.attr('style', '').css({ left: padding + \"px\", top: \"10px\" });\n scroller.attr('style', '');\n divArrowDown.hide();\n divArrowUp.hide();\n if (window.removeEventListener) window.removeEventListener('DOMMouseScroll', wheel, false);\n window.onmousewheel = document.onmousewheel = null;\n }\n }\n\n scroller.scroll(wheel);\n divArrowDown.click(function (ev) {\n scroller.scrollTop(scroller.scrollTop() + scrollStep);\n });\n divArrowUp.click(function (ev) {\n scroller.scrollTop(scroller.scrollTop() - scrollStep);\n });\n var autohide;\n $('.contextmenu-container')\n .off('mouseenter.contextmenu')\n .off('mouseleave.contextmenu')\n .on('mouseenter.contextmenu', function () { if (autohide) clearTimeout(autohide); })\n .on('mouseleave.contextmenu', function (ev) {\n var jContainer = $(this);\n\n var target = ev.target;\n // IE10 наведение на SVG внутри меню воспринимает как уход с контекстного меню и вызывает это событие. \n // В IE10 c SVG работать надо не так как обычно https://stackoverflow.com/questions/33672395/use-within-svg-not-finding-closest-div-in-ie\n if (target.correspondingUseElement) {\n return;\n } \n\n var jContextMenuTable = jContainer.find('table.contextmenu');\n autohide = setTimeout(function () {\n ContextMenu.hide(jContextMenuTable);\n if (window.addEventListener) window.removeEventListener('DOMMouseScroll', wheel, false);\n window.onmousewheel = document.onmousewheel = null;\n }, 500);\n\n });\n },\n\n render: function (_panel, isTablet, event) {\n var body = $(\"
\").addClass(this.cssClass).css('width', this.width);\n if (this.id)\n body.attr(\"id\", this.id);\n var _this = this;\n $.each(_this.items,\n function () {\n body.append($(\"\").append($(\"\").append(_this.renderItem(this, _panel, $.ipad, event))));\n });\n if ($.ipad) body.append($('' + L(\"CLOSE\") + ''));\n return body;\n },\n\n renderItem: function (it, _panel, isTablet, event) {\n var _this = this;\n var item = {};\n $.extend(item, it);\n var proxy = _this.self;\n if (typeof proxy == \"undefined\")\n proxy = { item: item, menu: _this };\n if (item.jsaction) {\n item.jsaction = new Function(item.jsaction);\n }\n if (item.oncreate) {\n item.oncreate = new Function(item.oncreate);\n }\n var cont;\n var res = $(\"
\");\n if (item.onCreate)\n item.onCreate.call(res, item, _this);\n if (item.oncreate) {\n var upd = item.oncreate.call(proxy);\n if (typeof upd == \"object\") {\n for (var i in upd) {\n item[i] = upd[i];\n }\n }\n }\n\n if (item.visibility === \"hidden\") {\n return;\n }\n\n if (item.text) {\n item.text = L(item.text);\n }\n item.separator = item.separator || item.bottomSeparator;\n if (item.separator) {\n res.addClass('contextmenu__item_bottomseparator');\n }\n switch (item.type) {\n /*Пункт меню - простой текст.*/\n case 'text':\n res.html(\"
\" + L(item.text) + \"
\");\n break;\n\n /*Стандартный пункт меню.*/\n default:\n var tbl = $(\"
\");\n if (item.href) {\n cont = $(\"\");\n res.append(cont);\n }\n else {\n cont = res;\n }\n cont.append(tbl);\n\n if (item['tooltip']) tbl.attr(\"title\", item['tooltip']);\n\n item['default'] = item['default'] || item.isDefault;\n item.disabled = item.disabled || item.isDisabled;\n if (item['default'])\n res.addClass('contextmenu__item_default');\n if (item.disabled)\n res.addClass(\"contextmenu__item_disabled\");\n if (item.selected) {\n res.addClass('contextmenu__item_selected');\n }\n var tr = $(\"\");\n tbl.append(tr);\n\n\n // Иконка действия.\n item.icon = item.icon || item.image;\n item.iconx = item.iconx || item.imageX;\n item.icony = item.icony || item.imageY;\n // Иконка при наведении.\n item.hoverIcon = item.hoverIcon || item.hoverImage;\n item.hoverIconX = item.hoverIconX || item.hoverImageX;\n item.hoverIconY = item.hoverIconY || item.hoverImageY;\n\n var imgCell = $('');\n tr.append(imgCell);\n cont = imgCell;\n\n // Добавляем скрытую иконку при наведении.\n if (item.hoverIcon) {\n cont.append(this.renderImage(item.hoverIcon, item.hoverIconX, item.hoverIconY, item.iconHoverCSSClass, true));\n }\n // Добавляем иконку действия.\n cont.append(this.renderImage(item.icon, item.iconx, item.icony, item.iconCSSClass, false));\n\n var textCell = $(\"\").html(item.text);\n tr.append(textCell);\n\n if (!item.disabled) {\n var _event = _.clone(event);\n tbl.click(function (ev) {\n if (Core.isStatisticEnabled && WA.CR && WA.CR.statistics) {\n ///Запись в статистику\n WA.CR.statistics.write({\n page: WA.getLocation(),\n action: item.stataction || item.name || item.id || 'ContextMenuItem',\n area: 'ContextMenu',\n target: $(_this.targetElement).get(0) || (!!proxy.tr && proxy.tr.get(0))\n });\n };\n\n if (item.onClick || item.href || item.jsaction) {\n if (item.onClick) item.onClick.call(this, item, _this, _event);\n if (item.jsaction) item.jsaction.call(proxy);\n hideAllPanels();\n }\n ev.stopPropagation();\n return true;\n });\n }\n if (item.subMenu) {\n var arrowCell = $(\"\").css({ width: this.arrowWidth + \"px\" });\n arrowCell.append(\"

\");\n tr.append(arrowCell);\n var subPanel = $(\"
\").css({ zIndex: parseInt(_panel.css(\"zIndex\"), 10) + 1 });\n item.showSubMenu = function () {\n var $this = res;\n var coords = getOffset($this);\n coords.left += $this.width() - 5;\n coords.top -= 1;\n var parentCoords = getOffset(_panel);\n coords.left -= parentCoords.left;\n coords.top -= parentCoords.top;\n item.subMenu.parentItem = item;\n item.subMenu.showAt(coords, subPanel, true);\n };\n item.hideSubMenu = function () { hidePanel(subPanel) };\n res.mouseenter(item.showSubMenu);\n res.mouseleave(item.hideSubMenu);\n res.append(subPanel);\n }\n tbl.hover(function () {\n tbl.addClass(\"hover\");\n }, function () {\n tbl.removeClass(\"hover\")\n });\n break;\n }\n return res;\n },\n renderImage: function (icon, iconx, icony, iconCSSClass, isHover) {\n var jIcon = null;\n if (icon) {\n var cssClass = 'contextmenu-item__icon' + (isHover ? ' contextmenu-item__icon_onhover' : '') + (iconCSSClass ? ' contextmenu-item__icon_' + iconCSSClass : '');\n if (icon.indexOf(\"App_Sprites\") !== -1) {\n if (typeof iconx != \"undefined\") {\n jIcon = $('
').css({ backgroundImage: \"url('\" + icon + \"')\", backgroundPosition: (-iconx) + \"px \" + (-icony) + \"px\", backgroundRepeat: \"no-repeat\" });\n } else {\n jIcon = $('');\n }\n } else {\n jIcon = $('');\n }\n }\n return jIcon;\n },\n getCoordsFor: function (c0, _panel, useShift) {\n //var c0 = getOffset($(elem));\n var res = { left: c0.left + (useShift ? this.shiftX : 0), top: c0.top + (useShift ? this.shiftY : 0) };\n var w = _panel.width();\n var h = _panel.height();\n var ww = windowWidth();\n var scr = $('body').scrollLeft();\n if (scr) {\n ww += scr - 20;\n }\n var hh = windowHeight();\n\n if (res.left + w > ww - 5) {\n res.left = ww - 5 - w;\n }\n if (res.left < 0) {\n res.left = 0;\n }\n if ((res.top - $(window).scrollTop()) + h > hh && c0.top - $(window).scrollTop() - h >= 0 || res.top + h > $(window).height()) {\n res.top = c0.top - h;\n }\n return res;\n },\n lastPanelVisible: function () {\n return this.lastPanel && this.lastPanel.css(\"visibility\") != \"hidden\";\n },\n getItemById: function (id) {\n var res = null;\n $.each(this.items, function () {\n if (this.id == id) {\n res = this;\n return false;\n }\n });\n return res;\n }\n })\n\n})(jQuery);\n","ControlTemplate = CT = { \"Description\": \"Html-шаблоны для динамических контролов\" };\n\nCT.toolBar = {};\nCT.sideBar = {};\nCT.form = {};\nCT.dialog = {};\n\n/**\n* Шаблон кнопки панели инструментов\n*\n* @param {string} 1 name\n* @param {string} 2title\n* @param {string} 3 onclick action\n* @param {string} 4 icon\n* @return buttonTemplate\n*/\nCT.toolBar.button = '
\\\n

\\\n {1} \\\n
';\n// Если иконка находится в атласе svg\nCT.toolBar.buttonSvg = '
\\\n \\\n \\\n \\\n {1} \\\n
';\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n/**\n* Шаблон Группы панели инструментов\n*\n* @param {string} 0 name\n* @param {string} 1 title\n* @param {string} 2 icon\n* @return buttonTemplate\n*/\nCT.toolBar.group = '
\\\n
\\\n
\\\n

\\\n {1} \\\n

\\\n
\\\n
';\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n/**\n* Панелька для свернутой группы кнопок\n*\n* @param {string} 0 index\n* @param {string} 1 size\n*/\nCT.toolBar.groupCollapsed = \"
\\\n
\";\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n/**\n* Закладка боковой панели\n*\n* @param {string} 0 name\n* @param {string} 1 text\n* @param {string} 2 icon\n* @param {string} 3 cssClass\n*/\nCT.sideBar.tab = '
\\\n
\\\n

\\\n {1} \\\n \\\n
\\\n
';\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n/**\n* Кнопка действия поиска в шапке сайта.\n*\n* @param {string} 0 name\n* @param {string} 1 text\n* @param {string} 2 icon\n* @param {string} 3 tooltip\n*/\nCT.sideBar.search = '
\\\n
\\\n \\\n \\\n \\\n {1} \\\n
\\\n
';\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n/**\n* Закладка(контейнер на карточке)\n*\n* @param {string} 0 name\n*/\n\nCT.form.tab = '
\\\n
';\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n/**\n* Разметка новой закладки\n*\n* @param {string} 0 title\n* @param {string} 1 helpText\n* @param {string} 2 manualLink\n*/\n\nCT.form.tabHelp = '

{0}

\\\n
\\\n

{1}

\\\n {2} \\\n ';\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\nCT.dialog.selectedItemsArea = '
\\\n
{label}:
\\\n
\\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n {data} \\\n
{name}{option_name}
\\\n
\\\n
';\n\n\nCT.dialog.selectedItem = ' \\\n \\\n \\\n \\\n \\\n
\\\n {name} \\\n
\\\n \\\n \\\n {option} \\\n \\\n ';\n\nCT.dialog.availableItemsArea = '
\\\n
{label}:
\\\n
\\\n \\\n

\\\n
\\\n
\\\n
{placeholder_message}
\\\n
\\\n
\\\n {data} \\\n
\\\n
';\n\nCT.dialog.availableItem = '
\\\n \\\n

{name}

\\\n \\\n
';\n\n\n\nCT.dialog.emptyPlaceholder = '{message}';\n\nCT.dialog.sortingButtons = '

\\\n

';\n\n\nCT.dialog.sortButtons = '
\\\n \\\n \\\n \\\n \\\n \\\n \\\n
';\n","/**\r\n* Получить значение строки локализации по ее коду.\r\n*\r\n* @global\r\n* @function L\r\n* @param {string} code Код строки\r\n* @return {string} Значение строки локализации.\r\n*\r\n* @example\r\n* // Получить значение строки локализации с кодом DESELECT_ALL.\r\n* L('DESELECT_ALL')​​​​​​​\r\n* // В результате появится строка «Снять выделение».\r\n*/\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Минимальная поддерживаемая веб-доступом ширина экрана.\r\n* @global\r\n*/\r\nvar MIN_SUPPORTS_WINDOW_WIDTH = 1024;\r\n/**\r\n* Минимальная поддерживаемая веб-доступом высота экрана.\r\n* @global\r\n*/\r\nvar MIN_SUPPORTS_WINDOW_HEIGHT = 768;\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Возвратить строку, собранную из строки формата и переданных аргументов.\r\n* Заменяет каждый элемент формата в строке, например {0}, {1} … {key}, текстовым эквивалентным значением.\r\n* Не имеет возможности экранировать символы {}.\r\n*\r\n* @global\r\n* @function format\r\n* @param {String} text Строка, которую необходимо преобразовать\r\n* @param {Params} Текстовые эквивалентные значения для замены\r\n* @return {string} Строка, собранная из строки формата и переданных аргументов.\r\n*\r\n* @example\r\n* a = \"цветок\"\r\n* b = \"Подсолнух\";\r\n* var result = format('{1} это {0}', a,b);\r\n* //В результате появится строка «Подсолнух – это цветок»\r\n*/\r\nfunction format(str, params) {\r\n if (!str || arguments.length < 2) return str;\r\n var _params = params;\r\n if (arguments.length > 2 || typeof _params != \"object\")\r\n _params = Array.prototype.slice.call(arguments, 1);\r\n return str.replace(/\\{([^{}]+)\\}/g, function (s, key) {\r\n if (key in _params)\r\n return _params[key];\r\n else\r\n return s;\r\n });\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Преобразовать дату в строку с учетом текущей локализации.\r\n*\r\n* @global\r\n* @function formatDate\r\n* @param {Date} date Дата.\r\n* @param {String} format Формат даты.\r\n* @return {string} Отформатированная строка даты.\r\n*/\r\nfunction formatDate(date, format) {\r\n if (!$.datepicker) return '';\r\n var df = format || $.datepicker.regional[currentCultureName].dateFormat;\r\n return $.datepicker.formatDate(df, date);\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Преобразовать дату и время в строку с учетом текущей локализации.\r\n*\r\n* @global\r\n* @function formatDateTime\r\n* @param {Date} time Дата и время.\r\n* @param {String} format Формат даты и времени.\r\n* @return {string} Отформатированная строка.\r\n*/\r\nfunction formatDateTime(time, format) {\r\n if (!$.datepicker || !$.timepicker) return '';\r\n if (time === null) return '';\r\n var df, tf;\r\n\r\n if (format) {\r\n var formatParts = format.split(' ');\r\n df = formatParts[0];\r\n if (formatParts.length > 1) {\r\n tf = formatParts[1];\r\n } else {\r\n tf = '';\r\n }\r\n } else {\r\n df = $.datepicker.regional[currentCultureName].dateFormat;\r\n tf = $.timepicker.regional[currentCultureName].timeFormat;\r\n }\r\n\r\n var ampm = tf.indexOf('TT') > -1;\r\n var tmptime;\r\n var hours = time.getHours();\r\n var minutes = time.getMinutes();\r\n var seconds = time.getSeconds();\r\n\r\n // Если время 00:00:00, то отбрасываем его\r\n if (hours > 0 || minutes > 0 || seconds > 0) {\r\n if (ampm) {\r\n var hour12 = hours % 12;\r\n if (hour12 === 0)\r\n hour12 = 12;\r\n tmptime = tf\r\n .replace(/hh/g, leadzero(hour12))\r\n .replace(/h/g, hour12)\r\n .replace(/mm/g, leadzero(minutes))\r\n .replace(/m/g, minutes)\r\n .replace(/ss/g, leadzero(seconds))\r\n .replace(/s/g, seconds)\r\n .replace(/TT/g, (hours >= 12 ? 'PM' : 'AM'));\r\n } else {\r\n tmptime = tf\r\n .replace(/hh/g, leadzero(hours))\r\n .replace(/h/g, hours)\r\n .replace(/mm/g, leadzero(minutes))\r\n .replace(/m/g, minutes)\r\n .replace(/ss/g, leadzero(seconds))\r\n .replace(/s/g, seconds);\r\n }\r\n return formatDate(time, df) + ' ' + tmptime;\r\n } else {\r\n return formatDate(time, df)\r\n }\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Преобразовать строку в дату и время с учетом текущей локализации.\r\n*\r\n* @global\r\n* @function parseDateTime\r\n* @param {string} date Строка даты в формате ДД.ММ.ГГГГ ЧЧ:ММ\r\n* @return {Date} Отформатированная строка.\r\n*\r\n* @example\r\n* parseDateTime('1')\r\n* parseDateTime('12.11.2012')\r\n* parseDateTime('12.11.12 14:21')\r\n*/\r\nvar parseDateTime = ParseDateTime = function (inp) {\r\n\r\n var val;\r\n var d;\r\n var m;\r\n var y;\r\n var tmpDate;\r\n var daysInMonth;\r\n var i;\r\n var separator;\r\n var format;\r\n var russianLocale = 'ru-RU';\r\n var enLocale = 'en-US';\r\n var cultureName;\r\n\r\n if ($.type(inp) === \"string\") {\r\n val = $.trim(inp);\r\n } else {\r\n val = $.trim(inp.val());\r\n }\r\n if (!val) return null;\r\n\r\n if (val.indexOf('/Date(') === 0) {\r\n return new Date(parseInt(val.replace(\"/Date(\", \"\").replace(\")/\", \"\"), 10));\r\n }\r\n\r\n cultureName = currentCultureName;\r\n\r\n if ($.type(inp) === \"string\") {\r\n if (inp.indexOf('.') !== -1) {\r\n cultureName = russianLocale;\r\n }\r\n\r\n if (inp.indexOf('/') !== -1) {\r\n cultureName = enLocale;\r\n }\r\n }\r\n\r\n var culture = $.datepicker.regional[cultureName];\r\n var separator = culture.dateseparator;\r\n var format = culture.dateFormat.split(separator);\r\n var timeFormat = $.timepicker.regional[cultureName].timeFormat.split(\":\");\r\n\r\n var today = new Date();\r\n var dmy = val.split(separator);\r\n\r\n var timeFormat;\r\n var time = [];\r\n\r\n for (i = 0; i < format.length; i++) {\r\n format[i] = $.trim(format[i]).substring(0, 1);\r\n }\r\n\r\n // Если ввели только одно число, то считаем, что нужен текущие месяц и год (время 00:00:00).\r\n if ((dmy.length === 1 && !!dmy[0] && parseInt(dmy[0], 10) > 0 && parseInt(dmy[0], 10) <= 31) || (dmy.length === 2 && !dmy[1])) {\r\n d = val;\r\n m = today.getMonth();\r\n y = today.getFullYear();\r\n tmpDate = new Date(y, m + 1, 0);\r\n daysInMonth = parseInt(tmpDate.getDate(), 10);\r\n\r\n if (daysInMonth >= d && d > 0) {\r\n return (new Date(y, m, d));\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n // Если ввели два числа, то считаем, что нужен текущий год (время 00:00:00).\r\n if ((dmy.length === 2 && !!dmy[1]) || (dmy.length === 3 && !!dmy[1] && !dmy[2])) {\r\n d = dmy[format.indexOf(\"d\")];\r\n m = parseInt(dmy[format.indexOf(\"m\")], 10) - 1;\r\n y = today.getFullYear();\r\n tmpDate = new Date(y, m + 1, 0);\r\n daysInMonth = parseInt(tmpDate.getDate(), 10);\r\n\r\n if (daysInMonth >= d && d > 0 && m <= 11 && m >= 0)\r\n return (new Date(y, m, d));\r\n else\r\n return null;\r\n }\r\n\r\n // Если ввели 3 числа и среди них нет пустой строки\r\n if (dmy.length == 3 && dmy.indexOf(\"\") == -1) {\r\n d = dmy[format.indexOf(\"d\")];\r\n m = parseInt(dmy[format.indexOf(\"m\")], 10) - 1;\r\n y = parseInt(dmy[format.indexOf(\"y\")], 10);\r\n\r\n // Если год 2-хзначиное число и больше 60, это это прошлый век, иначе текущий.\r\n if (y < 100) {\r\n if (y > 60) y += 1900; else y += 2000;\r\n }\r\n\r\n // Для предотвращения ошибки \"Переполнение SqlDateTime. Должно находиться в пределах от 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.\".\r\n if (y < 1800) {\r\n y = 1800;\r\n }\r\n\r\n tmpDate = new Date(y, m + 1, 0);\r\n daysInMonth = parseInt(tmpDate.getDate(), 10);\r\n\r\n time = null;\r\n\r\n // Если задано время либо время+AMPM (для английского формата)\r\n tmpTime = $.trim(val).split(\" \");\r\n if (tmpTime.length > 1 && tmpTime.indexOf(\"\") == -1) {\r\n // Удалим дату из массива\r\n tmpDate = tmpTime.splice(0, 1);\r\n time = tmpTime[0];\r\n\r\n\r\n for (i = 0; i < timeFormat.length; i++) {\r\n timeFormat[i] = $.trim(timeFormat[i]).substring(0, 1);\r\n }\r\n\r\n time = ParseTime(tmpTime, timeFormat);\r\n }\r\n\r\n // Число должно быть не больше, чем в указанном месяце, а месяц - не больше 11 (0 - январь)\r\n if (daysInMonth >= d && d > 0 && m <= 11 && m >= 0) {\r\n if (time) {\r\n return (new Date(y, m, d, time[0], time[1], time[2]));\r\n }\r\n else {\r\n return (new Date(y, m, d));\r\n }\r\n }\r\n else return null;\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n* Преобразовать строку в дату с учетом текущей локализации.\r\n*\r\n* @global\r\n* @function parseDate\r\n* @param {String} date Строка даты в формате ДД.ММ.ГГГГ\r\n* @return {string} Отформатированная строка.\r\n*/\r\nfunction parseDate(date) {\r\n return window.ParseDateTime(date);\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Получить хеш указанной строки.\r\n*\r\n* @global\r\n* @function getHash\r\n* @param {string} str Строка, которую необходимо отформатировать\r\n* @return {string} Отформатированная строка.\r\n*\r\n* @example\r\n* console.log(getHash('азбука'));\r\n* console.log(getHash('азбуки'));\r\n* // В результате появятся отформатированные строки:\r\n* //4302529\r\n* //4302537\r\n*/\r\nfunction getHash(str) {\r\n if (!str) return 0;\r\n m = 12345678;\r\n h = 0;\r\n for (var i = 0; i < str.length; i++) h = (h * 255 + parseInt(str.charCodeAt(i), 10)) % m;\r\n return h;\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n * Размеры иконки новой кнопки.\r\n * @readonly\r\n * @enum {boolean} BUTTON\r\n * @since 5.0.0.4104\r\n * @example\r\n *\r\n * //Создать кнопку с иконкой 16x16 пикселей.\r\n * WebAccess.current.toolBar.groups.ATTACHMENTS.createButton(\"myButton\", BUTTON.SMALL);\r\n */\r\nvar BUTTON = {\r\n /** Размер иконки кнопки – 32х32 пикселей */\r\n LARGE: false,\r\n /** Размер иконки кнопки – 16х16 пикселей */\r\n SMALL: true\r\n};\r\n\r\n/**\r\n* Метод отправки формы на веб-сервер.\r\n*\r\n* @readonly\r\n* @global\r\n* @enum {string} FORM_METHOD\r\n* @since 5.0.0.7100\r\n*/\r\nvar FORM_METHOD = {\r\n /** Отправка методом POST */\r\n POST: 'POST',\r\n /** Отправка методом GET */\r\n GET: 'GET'\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Тип отправляемых данных формы.\r\n*\r\n* @readonly\r\n* @global\r\n* @enum {string} ENCTYPE\r\n* @since 5.0.0.7100\r\n*/\r\nvar ENCTYPE = {\r\n /** Данные формы в виде бинарного кода */\r\n MULTIPART: 'multipart/form-data',\r\n /** Данные формы в текстовом виде */\r\n URLENCODED: 'application/x-www-form-urlencoded'\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n/**\r\n* Тип справочника с последними и избранными объектами.\r\n*\r\n* @readonly\r\n* @global\r\n* @enum {string} LAST_REFERENCES\r\n* @since 5.0.0.7200\r\n*/\r\nvar LAST_REFERENCES = {\r\n /** Выбор доступен из справочников «Пользователи», «Группы пользователей» и «Типовые маршруты» */\r\n ALL: '',\r\n /** Выбор доступен из справочника «Пользователи» */\r\n ONLY_USERS: \"!SR!G\",\r\n /** Выбор доступен из справочников «Пользователи» и «Группы пользователей» */\r\n USERS_AND_GROUPS: \"!SR\"\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n/**\r\n* Тип объекта системы DIRECTUM.\r\n*\r\n* @readonly\r\n* @global\r\n* @enum {integer} OBJECT_TYPE\r\n* @since 5.0.0.7100\r\n*/\r\nvar OBJECT_TYPE = {\r\n /** Неизвестный тип */\r\n UNKNOWN: 10,\r\n /** Папка */\r\n FOLDER: 0,\r\n /** Документ */\r\n EDOCUMENT: 1,\r\n /** Задания */\r\n JOB: 3,\r\n /** Задачи */\r\n TASK: 2,\r\n /** Компоненты */\r\n COMPONENT_TOKEN: 4,\r\n /** Произвольный тип */\r\n ANY: 5,\r\n /** Справочники */\r\n REFERENCE: 6,\r\n /** Сценарии */\r\n SCRIPT: 7,\r\n /** Отчеты */\r\n REPORT: 8,\r\n /** Запись справочника */\r\n REFERENCE_RECORD: 9,\r\n /** Пользователь */\r\n USER: 11,\r\n /** Мастер действий */\r\n WIZARD: 12,\r\n /** Пользователь или группа */\r\n USER_OR_GROUP: 100,\r\n /** Поиск */\r\n SEARCH: 101,\r\n /** Диалог */\r\n DIALOG: 102\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Тип состояния делового процесса.\r\n*\r\n* @readonly\r\n* @global\r\n* @enum {string} REQUISITE_TYPE\r\n* @since 5.5.0.9092\r\n*/\r\nvar WORK_STATE = {\r\n /** Инициализация */\r\n INIT: 0,\r\n /** В работе */\r\n RUNNING: 1,\r\n /** Выполнено */\r\n DONE: 2,\r\n /** На контроле */\r\n CONTROLLED: 3,\r\n /** Прекращено */\r\n ABORTED: 4,\r\n /** Возобновлена */\r\n CONTINUED: 5\r\n}\r\n\r\n/**\r\n* Типы данных значений реквизитов.\r\n*\r\n* @readonly\r\n* @global\r\n* @enum {string} REQUISITE_TYPE\r\n* @since 5.2.0.1300\r\n*/\r\nvar REQUISITE_TYPE = {\r\n /** Пусто */\r\n EMPTY: 0,\r\n /** Дата */\r\n DATE: 1,\r\n /** Дробное число */\r\n FLOAT: 2,\r\n /** Признак */\r\n PICK: 3,\r\n /** Строка */\r\n STRING: 4,\r\n /** Справочник */\r\n REFERENCE: 5,\r\n /** Текст */\r\n TEXT: 6,\r\n /** Целое число */\r\n INTEGER: 7,\r\n /** Большое целое число */\r\n LARGE_INTEGER: 8,\r\n /** Документ */\r\n DOCUMENT: 9,\r\n /** Список объектов */\r\n OBJECT_LIST: 11\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n * @readonly\r\n * @global\r\n * @enum {string} ACTION_ENABLED_MODE\r\n * @since 5.5.0.2201\r\n */\r\nvar ACTION_ENABLED_MODE = {\r\n /** Доступно. */\r\n ENABLED_ALWAYS: 0,\r\n /** Недоступно. */\r\n DISABLED_ALWAYS: 1,\r\n /** Доступно при просмотре. */\r\n ENABLED_ON_BROWSE: 2,\r\n /** Доступно при редактировании. */\r\n ENABLED_ON_EDIT: 3,\r\n /** Недоступно без данных. */\r\n DISABLED_ON_BROWSE_EMPTY: 4\r\n}\r\n\r\n/**\r\n* Преобразовывает типы данных значений реквизита в строковое представление\r\n* @global\r\n* @function requisiteTypeToString\r\n* @param {integer} reqType Целое представление типа\r\n* @return {string} Имя типа данных, например \"integer\".\r\n* @since 5.2.0.1300\r\n*/\r\nrequisiteTypeToString = function (reqType) {\r\n switch ('' + reqType) {\r\n case '1':\r\n return 'date';\r\n case '2':\r\n return 'float';\r\n case '3':\r\n return 'pick';\r\n case '4':\r\n return 'string';\r\n case '5':\r\n return 'reference';\r\n case '6':\r\n return 'text';\r\n case '7':\r\n return 'integer';\r\n case '8':\r\n return 'largeinteger';\r\n case '9':\r\n return 'document';\r\n case '11':\r\n return 'objectList';\r\n }\r\n}\r\n\r\nrequisiteTypeFromString = function (reqType) {\r\n switch (reqType) {\r\n case 'date':\r\n return 1;\r\n case 'float':\r\n return 2;\r\n case 'pick':\r\n return 3;\r\n case 'string':\r\n return 4;\r\n case 'reference':\r\n return 5;\r\n case 'text':\r\n return 6;\r\n case 'integer':\r\n return 7;\r\n case 'largeinteger':\r\n return 8;\r\n case 'document':\r\n return 9;\r\n case 'objectList':\r\n return 11;\r\n }\r\n}\r\n\r\n/**\r\n* Преобразовать тип объекта в строку.\r\n*\r\n* @global\r\n* @function objectTypeToString\r\n* @param {OBJECT_TYPE} type Тип объекта\r\n* @return {String} Преобразованная строка. Например, объект типа «Справочник» будет преобразован в строку 'REF'.\r\n* @since 5.0.0.7200\r\n*/\r\nfunction objectTypeToString(objectType) {\r\n switch (objectType) {\r\n case OBJECT_TYPE.EDOCUMENT:\r\n return \"EDOC\";\r\n case OBJECT_TYPE.FOLDER:\r\n return \"FOL\";\r\n case OBJECT_TYPE.TASK:\r\n return \"TASK\";\r\n case OBJECT_TYPE.JOB:\r\n return \"JOB\";\r\n case OBJECT_TYPE.REFERENCE_RECORD:\r\n return \"REF\";\r\n case OBJECT_TYPE.ANY:\r\n return \"ANY\";\r\n case OBJECT_TYPE.UNKNOWN:\r\n return \"UNKNOWN\";\r\n default:\r\n WA.raise('UNKNOWN_TYPE ' + objectType);\r\n break;\r\n }\r\n return null;\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Перевод строки в требуемый тип объекта\r\n*\r\n* @global\r\n* @function objectKindToObjectType\r\n* @param {OBJECT_TYPE} type Тип объекта\r\n* @return {OBJECT_TYPE} Объект типа OBJECT_TYPE.\r\n* @since 5.0.0.7200\r\n*/\r\nfunction objectKindToObjectType(objectKind) {\r\n if (!objectKind) return null;\r\n switch (objectKind.toUpperCase()) {\r\n case \"EDOC\":\r\n return OBJECT_TYPE.EDOCUMENT;\r\n case \"FOL\":\r\n return OBJECT_TYPE.FOLDER;\r\n case \"TASK\":\r\n return OBJECT_TYPE.TASK;\r\n case \"JOB\":\r\n return OBJECT_TYPE.JOB;\r\n case \"REF\":\r\n return OBJECT_TYPE.REFERENCE_RECORD;\r\n case \"ANY\":\r\n return OBJECT_TYPE.ANY;\r\n case \"UNKNOWN\":\r\n return OBJECT_TYPE.UNKNOWN;\r\n default:\r\n WA.raise('UNKNOWN_TYPE');\r\n break;\r\n }\r\n return null;\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n * Режим расположения.\r\n *\r\n * @readonly\r\n * @enum {integer} ORIENTATION\r\n * @since 5.0.0.4200\r\n *\r\n * @example\r\n * //Установить горизонтальное расположение боковой панели.\r\n * WebAccess.current.sideBar.setOrientation(ORIENTATION.HORISONTAL);\r\n *\r\n * @example\r\n * //Установить последовательное горизонтальное расположение элементов на форме.\r\n * var form = WA.CMP.forms.FormBuilder('someForm');\r\n * form.setOrientation(ORIENTATION.VERTICAL);\r\n */\r\nvar SIDEBAR_ORIENTATION;\r\nvar ORIENTATION = SIDEBAR_ORIENTATION = {\r\n /** Горизонтальное */\r\n HORIZONTAL: 0,\r\n /** Вертикальное */\r\n VERTICAL: 1\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n * Тип получаемой модели данных.\r\n *\r\n * @readonly\r\n * @enum {integer} MODEL\r\n * @since 5.0.0.7300\r\n */\r\nvar MODEL = {\r\n /** Полные данные */\r\n FULL: 0,\r\n /** Карточка */\r\n CARD: 1,\r\n /** Содержимое объекта */\r\n CONTENT: 2,\r\n /** Ссылка */\r\n LINK: 3\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n * Тип доступа к деловому процессу.\r\n *\r\n * @readonly\r\n * @enum {integer} WORK_ACCESS_TYPE\r\n * @since 5.0.0.7300\r\n */\r\nvar WORK_ACCESS_TYPE = {\r\n /** Всем */\r\n ALL: 0,\r\n /** Ручной */\r\n MANUAL: 2,\r\n /** Участникам */\r\n PARTICIPANTS: 1\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Тип задания.\r\n*\r\n* @readonly\r\n* @enum {integer} JOB_KIND\r\n* @since 5.0.0.7300\r\n*/\r\nvar JOB_KIND = {\r\n /** Задание */\r\n JOB: 0,\r\n /** Уведомление */\r\n NOTICE: 1,\r\n /** Задание-контроль */\r\n CONTROL_JOB: 2\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Тип сообщения.\r\n*\r\n* @readonly\r\n* @enum {integer} MESSAGE_TYPE\r\n* @since 5.0.0.7300\r\n*/\r\nvar MESSAGE_TYPE = {\r\n /** Предупреждение */\r\n WARNING: 0,\r\n /** Сообщение об ошибке */\r\n ERROR: 1,\r\n /** Информационное сообщение */\r\n INFO: 2\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Тип содержимого папки.\r\n*\r\n* @readonly\r\n* @enum {integer} FOLDER_CONTENT_TYPE\r\n* @since 5.0.0.7300\r\n*/\r\nvar FOLDER_CONTENT_TYPE = {\r\n /** Документы */\r\n EDOCUMENT: 1,\r\n /** Задания */\r\n JOB: 3,\r\n /** Задачи */\r\n TASK: 2,\r\n /** Вариант запуска */\r\n COMPONENT_TOKEN: 4,\r\n /** Произвольный тип */\r\n ANY: 5\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Тип папки.\r\n*\r\n* @readonly\r\n* @enum {integer} FOLDER_TYPE\r\n* @since 5.0.0.7300\r\n*/\r\nvar SPEC_FOLDER_TYPE = FOLDER_TYPE = {\r\n /** Папка «Входящие» */\r\n INBOX: 0,\r\n /** Папка «Исходящие» */\r\n OUTBOX: 1,\r\n /** Папка «Избранное» */\r\n FAVORITES: 2,\r\n /** Папка «Общая папка» */\r\n COMMON_FOLDER: 3,\r\n /** Папка пользователя */\r\n USER_FOLDER: 4,\r\n /** Специальный объект «Ярлыки» */\r\n SHORTCUTS: 7,\r\n /** Папка поиска */\r\n SEARCH: 8\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Уровень журналирования\r\n*\r\n* @readonly\r\n* @since 5.1.0.1523\r\n* @enum {string} LOG_LEVEL\r\n* @global\r\n*/\r\nvar LOG_LEVEL = {\r\n /** Сообщение об ошибке */\r\n ERROR: 'E',\r\n /** Предупреждение */\r\n WARN: 'W',\r\n /** Информационное сообщение */\r\n INFO: 'I',\r\n /** Сообщение об отладке */\r\n DEBUG: 'D'\r\n};\r\n\r\n\r\n/**\r\n* Уровень сериализации\r\n*\r\n* @readonly\r\n* @since 5.2.0.1600\r\n* @enum {integer} SERIALIZATION\r\n* @global\r\n*/\r\nvar SERIALIZATION = {\r\n /** Минимальная сериализация, по умолчанию */\r\n LITE: '1',\r\n /** Максимальное кол-во данных */\r\n FULL: '2'\r\n};\r\n\r\n\r\n/**\r\n* Названия стандартных действий диалога.\r\n*\r\n* @readonly\r\n* @since 5.2.0.1901\r\n* @enum {String} DIALOG_ACTION\r\n* @global\r\n*/\r\nvar DIALOG_ACTION = {\r\n /** ОК */\r\n OK: 'OkAction',\r\n /** Отмена */\r\n CANCEL: 'CancelAction'\r\n};\r\n\r\n\r\n/**\r\n* Режим открытия справочника в модальном окне.\r\n*\r\n* @readonly\r\n* @since 5.4.0.1013\r\n* @enum {integer} REFERENCE_MODAL_MODE\r\n* @global\r\n*/\r\nvar REFERENCE_MODAL_MODE = {\r\n /** Просмотр */\r\n VIEW: 0,\r\n /** Единичный выбор */\r\n SINGLE: 1,\r\n /** Множественный выбор */\r\n MULTI: 2\r\n};\r\n\r\n/**\r\n* Режим открытия справочника в модальном окне.\r\n*\r\n* @readonly\r\n* @since 5.5.0.1000\r\n* @enum {integer} VARIANT_TYPE\r\n* @global\r\n*/\r\nvar VARIANT_TYPE = {\r\n /** Целое число */\r\n INTEGER: 0,\r\n /** Число с плавающей точкой */\r\n SINGLE: 1,\r\n /** Строка */\r\n STRING: 2,\r\n /** Логический тип */\r\n BOOLEAN: 3,\r\n /** Дата */\r\n DATE_TIME: 4,\r\n /** Задача */\r\n TASK: 5,\r\n /** Задание */\r\n JOB: 6,\r\n /** Папка */\r\n FOLDER: 7,\r\n /** Документ */\r\n DOCUMENT: 8,\r\n /** Запись справочника */\r\n REFERENCE_RECORD: 9,\r\n /** Пользователь */\r\n USER: 10,\r\n /** Группа пользователей */\r\n USER_GROUP: 11,\r\n /** Роль */\r\n USER_ROLE: 12,\r\n /** Коллекция целых чисел */\r\n INTEGER_COLLECTION: 13,\r\n /** Коллекция чисел с плавающей точкой */\r\n SINGLE_COLLECTION: 14,\r\n /** Коллекция строк */\r\n STRING_COLLECTION: 15,\r\n /** Коллекция логических типов */\r\n BOOLEAN_COLLECTION: 16,\r\n /** Коллекция дат */\r\n DATE_TIME_COLLECTION: 17,\r\n /** Коллекция задач */\r\n TASK_COLLECTION: 18,\r\n /** Коллекция заданий */\r\n JOB_COLLECTION: 19,\r\n /** Коллекция папок */\r\n FOLDER_COLLECTION: 20,\r\n /** Коллекция документов */\r\n DOCUMENT_COLLECTION: 21,\r\n /** Коллекция записей справочника */\r\n REFERENCE_RECORD_COLLECTION: 22,\r\n /** Коллекция пользователей */\r\n USER_COLLECTION: 23,\r\n /** Коллекция групп пользователей */\r\n USER_GROUP_COLLECTION: 24,\r\n /** Коллекция ролей */\r\n USER_ROLE_COLLECTION: 25\r\n};\r\n\r\n\r\n/**\r\n* Обрезка длинных строк\r\n* @method String.trunc\r\n* @param {length} допустимая длина\r\n* @since 5.0.0.7300\r\n*/\r\nString.prototype.trunc = function (n) {\r\n if (!(\"\" + this)) return '';\r\n if (this.substr) {\r\n if (n < 4) return this[0] + \"...\";\r\n return this.substr(0, n - 3) + (this.length >= n ? '...' : '');\r\n }\r\n return \"\" + this;\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Обрезка длинных строк\r\n* @method String.trunc\r\n* @param {length} допустимая длина\r\n* @since 5.0.0.7300\r\n*/\r\nString.prototype.switchLayout = function (string) {\r\n var map = {\r\n 'q': 'й',\r\n 'w': 'ц',\r\n 'e': 'у',\r\n 'r': 'к',\r\n 't': 'е',\r\n 'y': 'н',\r\n 'u': 'г',\r\n 'i': 'ш',\r\n 'o': 'щ',\r\n 'p': 'з',\r\n '[': 'х',\r\n ']': 'ъ',\r\n 'a': 'ф',\r\n 's': 'ы',\r\n 'd': 'в',\r\n 'f': 'а',\r\n 'g': 'п',\r\n 'h': 'р',\r\n 'j': 'о',\r\n 'k': 'л',\r\n 'l': 'д',\r\n ';': 'ж',\r\n '\\'': 'э',\r\n 'z': 'я',\r\n 'x': 'ч',\r\n 'c': 'с',\r\n 'v': 'м',\r\n 'b': 'и',\r\n 'n': 'т',\r\n 'm': 'ь',\r\n ',': 'б',\r\n '.': 'ю',\r\n '\\/': '.',\r\n '\\`': 'ё'\r\n }\r\n //TODO http://underscorejs.org/#invert для RU-EN\r\n return _(this).map(function (ch) {\r\n return map[ch]\r\n }).join('');\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Замена всех подстрок в строке\r\n* @method String.replaceAll\r\n* @param {needle} искомая строка\r\n* @param {replacement} замена\r\n* @since 5.0.0.7300\r\n*/\r\nString.prototype.replaceAll = function (needle, replacement) {\r\n if (this.replace) return this.replace(new RegExp(needle, 'g'), replacement || '');\r\n else return this;\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Экранирование HTML\r\n* @method String.escapeHtml\r\n* @since 5.0.0.7300\r\n*/\r\nString.prototype.escapeHtml = function () {\r\n var entityMap = {\r\n \"&\": \"&\",\r\n \"<\": \"<\",\r\n \">\": \">\",\r\n '\"': '"',\r\n \"'\": ''',\r\n \"/\": '/'\r\n };\r\n\r\n return String(this).replace(/[&<>\"'\\/]/g, function (s) {\r\n return entityMap[s];\r\n });\r\n\r\n //$('
').text(this).html().replace(/\"/g, \""\");\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Удаление HTML тегов из строки\r\n* @method String.stripHtml\r\n* @since 5.1.0.1505\r\n*/\r\nString.prototype.stripHtml = function () {\r\n if (this.replace) return this.replace(/<(?:.|\\n)*?>/gm, '');\r\n return this;\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n/**\r\n* Перевод переносов строк в HTML теги br\r\n* @method String.newLinesToBR\r\n* @param {length} допустимая длина\r\n* @since 5.0.0.7300\r\n*/\r\nString.prototype.newLinesToBR = function () {\r\n if (this.replace) return this.replace(/\\\\n/g, \"
\");\r\n else return this;\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Уадлеяет все символы и пробелы из строки, и возвращает только буквы и числа\r\n* @method String.makeSafeString\r\n* @param {length} Допустимая длина\r\n* @since 5.2.0.1303\r\n*/\r\nString.prototype.makeSafeString = function () {\r\n if (this.replace) return this.replace(/[^A-ZА-Я0-9]+/ig, \"_\");\r\n else return this;\r\n};\r\n\r\n\r\n/**\r\n* Удаление ведущих и конечных пробелов.\r\n* @method String.trim\r\n* @since 5.0.0.7300\r\n*/\r\nif (typeof String.prototype.trim !== 'function') {\r\n String.prototype.trim = function () {\r\n return this.replace(/^\\s+|\\s+$/g, '');\r\n };\r\n}\r\n\r\n/**\r\n* Метод endsWith() определяет, заканчивается ли строка символами другой строки, возвращая, соотвественно, true или false.\r\n* @method String.endsWith\r\n* @since 5.5.0.9000\r\n*/\r\nif (!String.prototype.endsWith) {\r\n Object.defineProperty(String.prototype, 'endsWith', {\r\n value: function (searchString, position) {\r\n var subjectString = this.toString();\r\n if (position === undefined || position > subjectString.length) {\r\n position = subjectString.length;\r\n }\r\n position -= searchString.length;\r\n var lastIndex = subjectString.indexOf(searchString, position);\r\n return lastIndex !== -1 && lastIndex === position;\r\n }\r\n });\r\n}\r\n\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Приведение строки билдера к нормальному виду\r\n* @method String.fromISBuilderToNormal\r\n* @since 5.0.0.7300\r\n*/\r\nString.prototype.fromISBuilderToNormal = function () {\r\n if (!this.replace) return this;\r\n var str = this;\r\n var isInBrackets = false;\r\n var newStr = '';\r\n for (var i = 0; i < str.length; i++) {\r\n if (str[i] == '|' && !isInBrackets) {\r\n newStr = str.substring(0, i) + ' ' + str.substring(i + 1, str.length);\r\n }\r\n else if (str[i] === '&' && (i + 5) < str.length) {\r\n if (str[i + 1] == 'q' && str[i + 2] == 'u' && str[i + 3] == 'o' && str[i + 4] == 't' && str[i + 5] == ';') {\r\n isInBrackets = !isInBrackets;\r\n i += 5;\r\n }\r\n }\r\n }\r\n // ' ывалп \\n вава \\n новая строка'.replace(/\\n/g, ' ')\r\n if (newStr === '') return str.replace(/\\^/g, ' ').replace(/\\n/g, '
');\r\n return newStr.replace(/\\^/g, ' ').replace(/\\n/g, '
');\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Создать копию функции.\r\n*\r\n* @function cloneFunction\r\n* @param {Function} func Функция, для которой необходимо создать копию.\r\n* @since 5.0.0.7300\r\n*/\r\nvar cloneFunction = function (func) {\r\n var reFn = /^function\\s*([^\\s(]*)\\s*\\(([^)]*)\\)[^{]*\\{([^}]*)\\}$/gi\r\n , s = func.toString().replace(/^\\s|\\s$/g, '')\r\n , m = reFn.exec(s);\r\n if (!m || !m.length) return null;\r\n var conf = {\r\n name: m[1] || '',\r\n args: m[2].replace(/\\s+/g, '').split(','),\r\n body: m[3] || ''\r\n };\r\n\r\n var clone = Function.prototype.constructor.apply(this, [].concat(conf.args, conf.body));\r\n for (var key in func) {\r\n if (func.hasOwnProperty(key)) {\r\n clone[key] = func[key];\r\n }\r\n }\r\n return clone;\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n/**\r\n* Получить строку локализации из базы данных системы.\r\n*\r\n* @method getISBString\r\n* @param {String} code Код строки локализации\r\n* @param {boolean} [opt_is_async] Признак ассинхронного получения данных\r\n* @since 5.0.0.7300\r\n*/\r\nfunction getISBString(msg, opt_is_async) {\r\n var R = '';\r\n var data = { 'Code': msg.replace(\"\\'\", \"\\\\'\") };\r\n opt_is_async = !!opt_is_async ? opt_is_async : false;\r\n if (opt_is_async) {\r\n return WA.SRV.call(\"/Session.asmx/GetBuilderResources\", data);\r\n } else {\r\n WA.SRV.callSync(\"/Session.asmx/GetBuilderResources\", data).done(function (res) {\r\n R = res.d;\r\n });\r\n return R;\r\n }\r\n}\r\n\r\n/**\r\n* Генерирует уникальный ID\r\n* @function generateUniqueID\r\n* @global\r\n* @param {Integer} len длина возвращаемой строки\r\n* @since 5.2.0.1100\r\n*/\r\nfunction generateUniqueID(len, radix) {\r\n var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');\r\n var chars = CHARS, uuid = [], i;\r\n radix = radix || chars.length;\r\n\r\n if (len) {\r\n // Compact form\r\n for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];\r\n } else {\r\n // rfc4122, version 4 form\r\n var r;\r\n\r\n // rfc4122 requires these characters\r\n uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';\r\n uuid[14] = '4';\r\n\r\n // Fill in random data. At i==19 set the high bits of clock sequence as\r\n // per rfc4122, sec. 4.1.5\r\n for (i = 0; i < 36; i++) {\r\n if (!uuid[i]) {\r\n r = 0 | Math.random() * 16;\r\n uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];\r\n }\r\n }\r\n }\r\n\r\n return uuid.join('');\r\n}\r\n\r\n/**\r\n* Преобразовывает строку с датой формата ISO в объект типа Date.\r\n* @method Date.fromISO\r\n* @param {String} s дата в формате ISO\r\n* @since 5.2.0.1100\r\n*/\r\n(function () {\r\n var D = new Date('2011-06-02T09:34:29+02:00');\r\n if (!D || +D !== 1307000069000) {\r\n Date.fromISO = function (s) {\r\n var day, tz,\r\n rx = /^(\\d{4}\\-\\d\\d\\-\\d\\d([tT ][\\d:\\.]*)?)([zZ]|([+\\-])(\\d\\d):(\\d\\d))?$/,\r\n p = rx.exec(s) || [];\r\n if (p[1]) {\r\n day = p[1].split(/\\D/);\r\n for (var i = 0, L = day.length; i < L; i++) {\r\n day[i] = parseInt(day[i], 10) || 0;\r\n };\r\n day[1] -= 1;\r\n day = new Date(Date.UTC.apply(Date, day));\r\n if (!day.getDate()) return NaN;\r\n if (p[5]) {\r\n tz = (parseInt(p[5], 10) * 60);\r\n if (p[6]) tz += parseInt(p[6], 10);\r\n if (p[4] == '+') tz *= -1;\r\n if (tz) day.setUTCMinutes(day.getUTCMinutes() + tz);\r\n }\r\n return day;\r\n }\r\n return NaN;\r\n }\r\n }\r\n else {\r\n Date.fromISO = function (s) {\r\n return new Date(s);\r\n }\r\n }\r\n})();\r\n\r\n/**\r\n* Возможность перезаписи функций, с возможностью запуска родительской функции.\r\n* @inner\r\n*/\r\nFunction.prototype.override = function (func) {\r\n var superFunction = this;\r\n return function () {\r\n this.superFunction = superFunction;\r\n return func.apply(this, arguments);\r\n };\r\n};\r\n\r\n/**\r\n* Скрывает все выпадаюшие менюшки (выбор из справочника, pick, множественный выбор фильтра по колонкам).\r\n* @inner\r\n*/\r\nfunction hideAllPopups() {\r\n // Скрываем выборы из справочника.\r\n $('.rs_container').hide();\r\n // Скрываем множественный выбор для колонки грида.\r\n $('.selectListPopup').hide();\r\n}\r\n\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n * Режим открытия документа в мастере действий.\r\n *\r\n * @readonly\r\n * @enum {integer} WIZARD_DOCUMENT_STEP_SHOW_MODE\r\n * @since 5.4.1.1000\r\n */\r\nvar WIZARD_DOCUMENT_STEP_SHOW_MODE = {\r\n /** Открывать содержимое документа */\r\n BODY: 0,\r\n /** Открывать карточку документа */\r\n CARD: 1\r\n};\r\n\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n * Операции доступные для токена.\r\n *\r\n * @readonly\r\n * @enum {integer} TOKEN_OPERATION\r\n * @since 5.4.2.2000\r\n */\r\nvar TOKEN_OPERATION = {\r\n /** Токен для операции получения тела документа */\r\n DOWNLOAD_DOCUMENT_BODY: 1,\r\n /** Открывать карточку документа */\r\n UPLOAD_DOCUMENT_BODY: 2,\r\n /** Токен для операции обновления агента */\r\n UPDATE_AGENT: 4,\r\n /** Токен для операции подписания документа */\r\n SIGN_DOCUMENT: 8,\r\n /** Токен для операции подписания задачи или задания */\r\n SIGN_TASK: 8,\r\n /** Токен для операции получения списка новых заданий */\r\n GET_NEW_JOB_LIST: 16,\r\n /** Токен для операции блокирования тела документа */\r\n LOCK_VERSION: 32,\r\n /** Токен для операции снятия блокировки с тела документа */\r\n UNLOCK_VERSION: 64,\r\n /** Токен для операции получения зашифрованного сессионного ключа */\r\n GET_ENCRYPTION_KEY: 128,\r\n /** Токен для операции диагностики */\r\n DIAGNOSTICS: 1073741824\r\n};\r\n\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n// Исправляет косяк IE - после манипуляций с DOM, в которых есть svg>use, картинки не отображаются.\r\nfunction fixSvg(el) {\r\n if (WA.ENV.browser.name !== 'IE') return;\r\n\r\n var xmlns = \"http://www.w3.org/2000/svg\";\r\n var xlink = 'http://www.w3.org/1999/xlink';\r\n\r\n var replacingSvgs = [];\r\n var svgs = el.getElementsByTagName('svg'); // результаты \"живые\", поэтому в этой функции неменяется DOM (не делается insertBefore и removeChild)\r\n for (var i = 0; i < svgs.length; i++) {\r\n var prevSvg = svgs[i];\r\n var svgUse = prevSvg.firstChild;\r\n var svgName = svgUse.getAttribute('xlink:href') || svgUse.getAttribute('href');\r\n\r\n var newSvg = document.createElementNS(xmlns, \"svg\");\r\n newSvg.setAttribute('class', prevSvg.className.baseVal);\r\n var newSvgUse = document.createElementNS(xmlns, 'use');\r\n newSvgUse.setAttributeNS(xlink, 'href', svgName);\r\n newSvg.appendChild(newSvgUse);\r\n\r\n replacingSvgs.push({ prevSvg: prevSvg, newSvg: newSvg });\r\n }\r\n replacingSvgs.forEach(function (r) {\r\n var parent = r.prevSvg.parentNode;\r\n parent.insertBefore(r.newSvg, r.prevSvg);\r\n parent.removeChild(r.prevSvg);\r\n });\r\n}","\"use strict\";\n\n/** \n* Базовый объект с поддержкой событий.\n*\n* @class BaseObject\n* @abstract\n* @property {string} className Имя класса\n* @property {Class} class Ссылка на интерфейс класса для упрощённого доступа к статическим свойствам (например, EVENT).\n* @param {any} Данные\n*/\nvar BaseObject = Class.extend({\n\n init: function (data) {\n if (!this._events) {\n this._events = [];\n }\n this.fire(BaseObject.EVENT.CLASS_INIT, this);\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: \"BaseObject\",\n\n /** @private */\n _events: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Пред-обработка переданных параметров\n * @method BaseObject#_parseArguments\n * @private\n * @since 5.2.0.1100\n */\n _parseArguments: function (args) {\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @private\n * @method BaseObject#_simplifyName\n */\n _simplifyName: function (name) {\n name = \"\" + name;\n name = name.makeSafeString().toLowerCase();\n if (name.substr(0, 2) === 'on') {\n name = name.substr(2, name.length);\n };\n return name;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Привязать функцию к событию.\n * @method BaseObject#bind\n * @param {string} name Имя события\n * @param {function} callback Функция, срабатывающая при событии\n * @param {object} [opt_context] Контекст исполнения\n * @return {BaseObject} Объект типа BaseObject.\n */\n bind: function (name, func, opt_context) {\n name = this._simplifyName(name);\n\n if (window.ENABLE_EVENTS_LOGGING) {\n //Шамов А.: Для отладки событий.\n console.log('BaseObject.bind ' + name, arguments);\n }\n\n if (!this._events) {\n this._events = [];\n }\n\n if (this._events) {\n if (!this._events[name]) {\n this._events[name] = [];\n }\n func = !!opt_context ? $.proxy(func, opt_context) : func;\n this._events[name].push(func);\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Удалить функцию, привязанную к событию.\n *\n * @method BaseObject#unbind\n * @param {string} name Имя события\n * @return {BaseObject} Объект типа BaseObject.\n */\n unbind: function (name) {\n name = this._simplifyName(name);\n\n if (window.ENABLE_EVENTS_LOGGING) {\n //Шамов А.: Для отладки событий.\n console.log('BaseObject.unbind ' + name, arguments);\n }\n this._events[name] = [];\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Вызвать событие.\n *\n * @method BaseObject#fire\n * @param {string} Имя события\n * @return {boolean} Метод вернет False, если хотя бы один из обработчиков метода bind вернул False. \n * При этом условии другие обработчики событий вызваны не будут. \n */\n fire: function (name) {\n name = this._simplifyName(name);\n\n //Шамов А.: Для отладки событий.\n if (window.ENABLE_EVENTS_LOGGING) {\n if (!WA.ENV.isTouch()) {\n console.log('BaseObject.fire ' + name, arguments);\n } else {\n //Шамов А.: Почему-то провоцирует ошибки на планшетах.\n //logDebug('BaseObject.fire ' + arguments[0]);\n }\n }\n\n // try {\n var args = $.makeArray(arguments);\n args.splice(0, 1);\n if (this._events && this._events[name]) {\n for (var i = 0, len = this._events[name].length; i < len; i++) {\n if ($.isFunction(this._events[name][i])) {\n var r = this._events[name][i].apply(this, args);\n if (typeof r != 'undefined' && !r) {\n return false;\n }\n }\n }\n return true;\n }\n /*} catch (ex) {\n console.trace()\n log.error('BASE_OBJECT', ex);\n return false;\n }*/\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Последовательно вызвать события BeforeEvent, Event, AfterEvent.\n *\n * @method BaseObject#fireAll\n * @param {string} eventName Имя события, переданное методу\n * @param {string} mainFunc Функция, срабатывающая при событии\n * @ignore\n */\n fireAll: function (eventName, mainFunc) {\n eventName = this._simplifyName(eventName);\n\n //Шамов А.: Для отладки событий.\n if (window.ENABLE_EVENTS_LOGGING) {\n if (!WA.ENV.isTouch()) {\n console.log('BaseObject.fireAll ' + eventName, arguments);\n } else {\n //Шамов А.: Почему-то провоцирует ошибки на планшетах.\n //logDebug('BaseObject.fireAll ' + eventName);\n }\n }\n\n var isRun = false;\n var me = this;\n var args = $.makeArray(arguments);\n args.splice(0, 2);\n\n // Обертка над callback с вызвовом Before и After событий.\n var mainFuncWrapper = function (result) {\n if (typeof result == 'undefined' || result) {\n mainFunc.apply(me, args);\n\n var newArgs = $.merge(['After' + eventName], args);\n me.fire.apply(me, newArgs);\n }\n isRun = true;\n };\n\n var newArgs = $.merge(['Before' + eventName, mainFuncWrapper], args);\n var r = me.fire.apply(me, newArgs);\n if (!isRun) {\n mainFuncWrapper(r);\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить строковое представление объекта.\n *\n * @method BaseObject#asString\n * @since 5.0.0.7100\n * @return {string} Строковое представление объекта.\n */\n asString: function () {\n return $.toJSON(this);\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n}, {\n /**\n * Срабатывает после вызова конструктора\n *\n * @event BaseObject.EVENT.CLASS_INIT\n * @type {object}\n * @property {boolean} context - ссылка на экземпляр класса\n */\n EVENT: {\n CLASS_INIT: 'classInit'\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n});","\"use strict\";\r\n\r\n/**\r\n* Тип прав на объекты системы.\r\n* @since 5.0.0.4204\r\n* @readonly\r\n* @enum {string} ACCESS_RIGHTS\r\n* @example \r\n* WebAccess.task.setAttachmentsRights(ИДзадачи, ACCESS_RIGHTS.VIEW);\r\n*/\r\nvar ACCESS_RIGHTS = {\r\n /** Пусто. */\r\n EMPTY: 0,\r\n /** Нет доступа. */\r\n NO_ACCESS: 2,\r\n /** Просмотр. */\r\n VIEW: 4,\r\n /** Изменение. */\r\n CHANGE: 8,\r\n /** Полные права. */\r\n FULL: 16\r\n};\r\n\r\n\r\n/**\r\n* Типы поддерживаемых команд.\r\n* @since 5.0.0.1600\r\n* @enum {string} COMMAND_TYPE\r\n* @readonly\r\n*/\r\nvar COMMAND_TYPE = {\r\n SHOW_DIALOG: 1,\r\n END: 2,\r\n EXECUTE_SEARCH: 3\r\n};\r\n\r\n/** \r\n* Базовый объект клиентской модели \r\n* @class BaseObjectModel\r\n* @extends BaseObject\r\n* @param {object} data Данные модели.\r\n* @property {string} className имя класса\r\n* @property {object} rawData загруженный json\r\n*/\r\nvar BaseObjectModel = BaseObject.extend({\r\n\r\n /**\r\n * Конструктор\r\n * @private\r\n */\r\n init: function (data) {\r\n this._super(data);\r\n //Если данные были переданы в коструктор, то загрузим их \r\n if (arguments.length > 0) this.load(data);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n className: \"BaseObjectModel\",\r\n rawData: {},\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /* \r\n * Загрузка данных текущего объекта\r\n * @method \r\n * @param {object} JSONData\r\n */\r\n load: function (JSONData) {\r\n // Создаем событие \"ДоЗагрузкиДанных\" - \r\n // может пригодиться если нам, вдруг, понадобиться подменить данные еще до включения в объект\r\n this.rawData = JSONData;\r\n this.fire(\"BeforeDataLoad\", this.rawData);\r\n // Загружаем данные \r\n $.extend(this, this.rawData);\r\n // Создаем событие \"ПослеЗагрузкиДанных\"\r\n this.fire(\"AfterDataLoad\", this.rawData);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Преобразовать ссылку на объект в объект типа WA.URL.\r\n *\r\n * @method WebAccess.mixins.linkMixin#toURL\r\n * @return {WebAccess.URL} Объект типа URL.\r\n */\r\n toURL: function () {\r\n var link = new WA.Link(this.ID, this.Type, this.ReferenceCode);\r\n var url = new WA.URL(link);\r\n if (this.IsNew) {\r\n url.setParam('mode', 'edit');\r\n };\r\n return url;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Запуск действия.\r\n * @since 5.0.0.1600\r\n * @function BaseObjectModel.executeAction\r\n * @param {String} actionName Имя действия.\r\n * @param {Object|WebAccess.components.dialogs.FormDialog} opt_params Параметры действия или диалог, тогда значения реквизитов диалога скопируются в параметры объекта для работы действия.\r\n * @example \r\n * WebAccess.current.executeAction('ActionName').done(function() { console.log('Действие завершилось!'); });\r\n */\r\n executeAction: function (actionName, opt_params) {\r\n var serializedForm;\r\n if (opt_params && opt_params.className === 'FormDialog') {\r\n // Копируем реквизиты диалога в параметры действия.\r\n var dialog = opt_params;\r\n serializedForm = dialog.form.serialize({\r\n onlyValue: true,\r\n returnRowNumber: true,\r\n withoutTables: true,\r\n transformMultiReqsToDetailRows: true\r\n });\r\n } else {\r\n serializedForm = {\r\n requisites: opt_params\r\n };\r\n }\r\n return this._setActionResultAndExecuteAgain(actionName, serializedForm);\r\n },\r\n\r\n /**\r\n * Выполнение прикладного метода.\r\n * @since 5.5.0.1000\r\n * @function BaseObjectModel.executeEntityMethod\r\n * @param {String} methodName Имя метода.\r\n * @param {Object[]} opt_parameters Параметры? с которыми должен вызваться метод.\r\n * @example \r\n * WebAccess.current.executeEntityMethod('MethodName').done(function(result) { console.log(result); });\r\n */\r\n executeEntityMethod: function (methodName, opt_parameters) {\r\n throw new Error(\"Abstract method!\");\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Запуск действия с предварительный показов диалога.\r\n * @since 5.0.0.1901\r\n * @function BaseObjectModel.showDialogAndExecuteAction\r\n * @param {String} actionName Имя действия.\r\n * @param {String} dialogName Имя диалога.\r\n * @example \r\n * WebAccess.current.showDialogAndExecuteAction('ActionName','DialogName').done(function() { console.log('Действие завершилось!'); });\r\n */\r\n showDialogAndExecuteAction: function (actionName, dialogName) {\r\n var me = this;\r\n if (dialogName) {\r\n // Отображение диалога.\r\n WA.FC.dialogs.getObjectByName(dialogName, MODEL.FULL).done(function (dialog) {\r\n dialog.show();\r\n dialog.bind(WA.CMP.dialogs.FormDialog.EVENT.AFTER_ACTION, function (dialogActionName, result) {\r\n if (dialogActionName === DIALOG_ACTION.OK) {\r\n return me.executeAction(actionName, dialog);\r\n }\r\n });\r\n });\r\n } else {\r\n return this._setActionResultAndExecuteAgain(actionName);\r\n }\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Уставливает результат действия и запускает его повторно.\r\n * @since 5.0.0.1600\r\n * @function BaseObjectModel._setActionResultAndExecuteAgain\r\n * @private\r\n */\r\n _setActionResultAndExecuteAgain: function (actionName, serializedForm, commandNumber, commandType, commandResult) {\r\n var me = this;\r\n var result = $.Deferred();\r\n\r\n WA.SRV.call('/Action.asmx/Execute', {\r\n Link: (new WA.Link(me.ID, me.Type, me.ReferenceName)).toLinkModel(),\r\n ViewName: typeof me.ReferenceView === 'undefined' ? \"\" : me.ReferenceView,\r\n ActionName: actionName,\r\n SerializedForm: serializedForm || {},\r\n CommandNumber: commandNumber || 0,\r\n CommandType: commandType || 0,\r\n CommandResult: commandResult || {}\r\n }).done(function (response) {\r\n var responseAsObject = $.parseJSON(response);\r\n\r\n //скрываем сообщения о предыдущих ошибках, если были\n ErrorHide();\r\n\r\n // Применяем изменения к форме.\r\n var changes = responseAsObject.Changes;\r\n var changedMultiSelects = responseAsObject.ChangedMultiSelectRequisitesValues;\r\n if (me.form && me.form.isExist()) me.form.applyServerSideChanges(changes, changedMultiSelects);\r\n\r\n // Выполнение комманд.\r\n var cmds = responseAsObject.Commands;\r\n me._performCommands(cmds);\r\n\r\n result.resolve();\r\n\r\n }).fail(function (errorMessage, response) {\r\n // В ответе с ошибкой могут прийти изменения других реквизитов и их надо будет обработать.\r\n if (response) {\r\n if (response.Result) {\r\n var data = $.parseJSON(response.Result);\r\n // Применяем изменения к форме.\r\n var changes = data.Changes;\r\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\r\n if (me.form && me.form.isExist()) me.form.applyServerSideChanges(changes, changedMultiSelects);\r\n }\r\n\r\n result.reject(response.Error);\r\n } else {\r\n result.reject();\r\n }\r\n });\r\n\r\n return result.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Выполняет команду \"Показать диалог\".\r\n * @since 5.0.0.1600\r\n * @function BaseObjectModel._performShowDialogCommand\r\n * @private\r\n */\r\n _performCommands: function (cmds) {\r\n var result = $.Deferred();\r\n if (cmds.length > 0) {\r\n // Результаты команд.\r\n var commandsResult = [];\r\n\r\n // Запускает последовательность команд.\r\n var allCommandsRunner = $.Deferred();\r\n\r\n // Последовательность всех команд.\r\n var allCommandsQueue = allCommandsRunner;\r\n\r\n _.each(cmds, function (cmd) {\r\n var cmdNumber = cmd.number;\r\n var cmdType = cmd.type;\r\n\r\n allCommandsQueue = allCommandsQueue.then(function () {\r\n // Отложенный запуск команды.\r\n switch (+cmdType) {\r\n case COMMAND_TYPE.SHOW_DIALOG:\r\n // Показать диалог.\r\n return me._performShowDialogCommand(cmd);\r\n case COMMAND_TYPE.END:\r\n // Завершающая команда.\r\n return me._performEndCommand(cmd);\r\n case COMMAND_TYPE.EXECUTE_SEARCH:\r\n // Выполнить поиск.\r\n return me._performExecuteSeachCommand(cmd);\r\n }\r\n\r\n }).then(function (cmdResult) {\r\n // Сохранить результат команды.\r\n commandsResult.push({\r\n 'number': cmdNumber,\r\n 'type': cmdType,\r\n 'result': cmdResult\r\n });\r\n });\r\n });\r\n\r\n // Ожидание выполнения команд и отправка результата снова в действие.\r\n allCommandsQueue.done(function allCommandsCallbackDone() {\r\n //TODO Шамов А.: Отправлять все результаты.\r\n me._setActionResultAndExecuteAgain(actionName, commandsResult[0].number, commandsResult[0].type, commandsResult[0].result).done(function () {\r\n result.resolve();\r\n });\r\n }).fail(function () {\r\n // Одна из команд прервала цепочку, остальные не выполняются и всё действие считаем незавершенным.\r\n result.reject();\r\n });\r\n\r\n // Запустить команды последовательно.\r\n allCommandsRunner.resolve();\r\n } else {\r\n result.resolve();\r\n }\r\n return result.promise();\r\n },\r\n\r\n /**\r\n * Выполняет команду \"Показать диалог\".\r\n * @since 5.0.0.1600\r\n * @function BaseObjectModel._performShowDialogCommand\r\n * @private\r\n */\r\n _performShowDialogCommand: function (params) {\r\n var def = $.Deferred();\r\n\r\n window.WA.factories.dialogs.getObjectByInstanceID(params.InstanceID, MODEL.FULL).done(function (d) {\r\n d.show();\r\n d.bind(WA.CMP.dialogs.FormDialog.EVENT.AFTER_ACTION, function (actionName, result) {\r\n\r\n var actionResult = {\r\n '__RESULT': result\r\n };\r\n\r\n _(d.form.serialize().requisites).each(function (v, k) {\r\n actionResult[k] = v[0];\r\n });\r\n\r\n def.resolve(actionResult);\r\n });\r\n }).fail(function () {\r\n def.reject();\r\n });\r\n\r\n return def.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Выполняет завершающую команду.\r\n * @since 5.0.0.1601\r\n * @function BaseObjectModel._performEndCommand\r\n * @private\r\n */\r\n _performEndCommand: function (params) {\r\n var def = $.Deferred();\r\n def.reject();\r\n return def.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Выполняет команду для показа результатов поиска.\r\n * @since 5.0.0.1601\r\n * @function BaseObjectModel._performExecuteSeachCommand\r\n * @private\r\n */\r\n _performExecuteSeachCommand: function (params) {\r\n var def = $.Deferred();\r\n\r\n var form = new WA.CMP.forms.FormBuilder(\"SearchResultForm\");\r\n // TODO Будет по ИД получать каждый из объектов. Надо оптимизировать!!!\r\n form.addObjectList(\"OBJECTS\", params.SearchContentKind, params.SearchResult, true);\r\n\r\n var dialog = new WA.CMP.dialogs.BaseDialog(\"SearchResultDialog\");\r\n dialog.title = L('SEARCH_RESULT_TITLE');\r\n dialog.setHtml(form.render());\r\n dialog.width = 600;\r\n dialog.show();\r\n\r\n //TODO Когда надо будет получения выбранных элементов, то resolve нужно вызывать после выбора.\r\n def.resolve();\r\n return def.promise();\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n});\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","// Наследуем свойства и методы базового объекта\nvar DocumentModel = BaseObjectModel.extend({\r\n className: \"DocumentModel\",\n\n /**\r\n * Выполнение прикладного метода.\r\n * @since 5.5.0.1000\r\n * @function DocumentModel.executeEntityMethod\r\n * @param {String} methodName Имя метода.\r\n * @param {Object[]} opt_parameters Параметры, с которыми должен вызваться метод.\r\n * @example \r\n * WebAccess.current.executeEntityMethod('MethodName', new WA.Link()).done(function(result) { console.log(result); });\r\n */\r\n executeEntityMethod: function (methodName, opt_parameters) {\r\n var d = $.Deferred();\r\n var me = this;\r\n var parameters = Array.prototype.slice.call(arguments, 1);\n\n WA.domainMethods.executeEntityMethod(\"/api/Document.asmx/ExecuteEntityMethod\",\n this.ID, \"\", methodName, parameters).done(function (res) {\r\n var changes = res.Changes;\n var changedMultiSelects = res.ChangedMultiSelectRequisitesValues;\n if (me.form && me.form.isExist()) me.form.applyServerSideChanges(changes, changedMultiSelects);\n\n d.resolve(res.MethodResult);\r\n }).fail(function (errorMessage, res) {\r\n if (res) {\r\n if (res.Result) {\r\n var data = res.Result;\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n if (me.form && me.form.isExist()) me.form.applyServerSideChanges(changes, changedMultiSelects);\r\n }\n d.reject(res.Error);\r\n } else {\r\n d.reject(errorMessage);\r\n }\r\n });\r\n\r\n return d.promise();\r\n },\n\n /**\r\n * Проверяет, доступнен ли метод для текущего объекта.\r\n * @since 5.5.0.1000\r\n * @function DocumentModel.isMethodAvailable\r\n * @param {string} methodName: Имя метода.\r\n * @returns {boolean} true, если метод доступен, иначе false.\r\n */\n isMethodAvailable: function (methodName) {\r\n return WA.domainMethods.isMethodAvailable(\"/api/Document.asmx/IsEntityMethodAvailable\", this.ID, methodName);\r\n }\r\n});","var TaskModel = BaseObjectModel.extend({\n init: function (data) {\n this._super(data);\n },\n className: \"TaskModel\",\n\n start: function () {\n this.fireAll(\"Start\", function () { StartTask(); });\n },\n\n loadEvents: function (standardRouteEvents) {\n var me = this;\n var eventsForCurrentRoute = standardRouteEvents[this.StandardRouteCode]\n\n if (typeof eventsForCurrentRoute !== 'undefined' && typeof eventsForCurrentRoute.task !== 'undefined') {\n // грузим только события задачи.\n $.each(eventsForCurrentRoute.task, function (eventName, eventCallback) {\n me.bind(eventName, eventCallback);\n });\n }\n },\n\n // standardRouteCode указываем, если вызываем событие \"До запроса параметров\".\n fireAll: function (eventName, mainFunc, standardRouteCode) {\n function fire(eventName) {\n if (typeof WebAccess.Events[standardRouteCode] != 'undefined' && typeof WebAccess.Events[standardRouteCode].task != 'undefined') {\n var r = WebAccess.Events[standardRouteCode].task[eventName].call(this, arguments[1]);\n if (typeof r != 'undefined' && !r) {\n return false;\n }\n return true;\n }\n }\n\n if (typeof standardRouteCode != 'undefined') {\n var isRun = false;\n var me = this;\n\n // Обертка над callback с вызвовом Before и After событий.\n var mainFuncWrapper = function (result) {\n if (typeof result == 'undefined' || result) {\n mainFunc();\n me.fire('After' + eventName);\n };\n isRun = true;\n };\n\n var r = fire('Before' + eventName, mainFuncWrapper);\n if (!isRun) {\n mainFuncWrapper(r);\n }\n }\n else {\n // если не означен standardRouteId, то берем родительский fireAll (находимся в задаче и там все разруливается).\n this._super(eventName, mainFunc);\n }\n }\n});","var JobModel = BaseObjectModel.extend({\n className: \"JobModel\",\n\n // Загрузка событий блока ТМ-а\n loadEvents: function (standardRouteEvents) {\n var me = this;\n var currentStandardRouteEvents = standardRouteEvents[this.LeadTaskStandartRouteCode];\n // Найдем нужный объект (для текущего ТМ-а).\n if (typeof currentStandardRouteEvents != 'undefined') {\n // ... и только для конкретного блока. Если подходящего (по ИД) нет, то не биндим.\n if (typeof currentStandardRouteEvents.blocks[this.WorkflowBlockID] != 'undefined') {\n $.each(currentStandardRouteEvents.blocks[this.WorkflowBlockID], function (eventName, eventCallback) {\n me.bind(eventName, eventCallback);\n });\n }\n }\n },\n //Установка метода,который вызывается для всех заданий по ТМ перед запросом параметров\n bindBeforeAskingCommonEvent: function (commonEvent) {\n var me = this;\n if($.isFunction(commonEvent)) {\n me.bind('BeforeParamAsking', commonEvent);\n }\n }\n});\n\n/**\n* Тип задания.\n* @enum {integer} JOB_KIND\n* @readonly\n* @global\n*/\nvar JOB_KIND = {\n /** Задача */\n JOB: 0,\n /** Уведомление */\n NOTICE: 1,\n /** Задание-контроль */\n CONTROLJOB: 2\n};","// Наследуем свойства и методы базового объекта\nvar ReferenceRecordModel = BaseObjectModel.extend({\r\n className: \"ReferenceRecordModel\",\n\n /**\r\n * Выполнение прикладного метода.\r\n * @since 5.5.0.1000\r\n * @function ReferenceRecordModel.executeEntityMethod\r\n * @param {String} methodName Имя метода.\r\n * @param {Object[]} opt_parameters Параметры, с которыми должен вызваться метод.\r\n * @example \r\n * WebAccess.current.executeEntityMethod('MethodName').done(function(result) { console.log(result); });\r\n */\r\n executeEntityMethod: function (methodName, opt_parameters) {\r\n var d = $.Deferred();\r\n var me = this;\r\n var parameters = Array.prototype.slice.call(arguments, 1);\n\n var viewName = me.ReferenceView === 'undefined' ? \"\" : me.ReferenceView;\n WA.domainMethods.executeEntityMethod(\"/api/Reference.asmx/ExecuteEntityMethod\",\n new WA.Link(this.ID, OBJECT_TYPE.REFERENCE_RECORD, this.ReferenceCode),\n viewName, methodName, parameters).done(function (res) {\r\n var changes = res.Changes;\n var changedMultiSelects = res.ChangedMultiSelectRequisitesValues;\n if (me.form && me.form.isExist()) me.form.applyServerSideChanges(changes, changedMultiSelects);\n\n d.resolve(res.MethodResult);\r\n }).fail(function (errorMessage, res) {\r\n if (res) {\r\n if (res.Result) {\r\n var data = res.Result;\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n if (me.form && me.form.isExist()) me.form.applyServerSideChanges(changes, changedMultiSelects);\r\n }\n d.reject(res.Error);\r\n } else {\r\n d.reject(errorMessage);\r\n }\r\n });\n\n return d.promise();\r\n },\r\n\r\n /**\r\n * Проверяет, доступнен ли метод для текущего объекта.\r\n * @since 5.5.0.1000\r\n * @function ReferenceRecordModel.isMethodAvailable\r\n * @param {string} methodName: Имя метода.\r\n * @returns {boolean} true, если метод доступен, иначе false.\r\n */\n isMethodAvailable: function (methodName) {\r\n return WA.domainMethods.isMethodAvailable(\"/api/Reference.asmx/IsEntityMethodAvailable\", new WA.Link(this.ID, OBJECT_TYPE.REFERENCE_RECORD, this.ReferenceCode), methodName);\r\n }\r\n});","// Наследуем свойства и методы базового объекта\nvar FolderModel = BaseObjectModel.extend({\n className: \"FolderModel\"\n});","var WizardModel = BaseObjectModel.extend({\n init: function (data) {\n this._super(data);\n },\n className: \"WizardModel\"\n});","\"use strict\";\n\n/**\n* Расширение\n* \n* @class Extension\n* @extends BaseObject\n* @property {string} name имя расширения\n* @param {string} itemSelector существующий элемент страницы\n*/\n(function (global) {\n var Extension = BaseObject.extend({\n init: function (data) {\n $.extend(this, data);\n },\n\n name: \"\",\n\n /**\n * Установить это в качестве текущего расширения\n * @method Extension#setAsCurrent\n */\n setAsCurrent: function () {\n if (WebAccess.getLocation() != \"explorer\") Ext_Click(this, this.name, true);\n else Ext_Click(this, this.name, false);\n },\n\n /**\n * Перезагрузка расширения\n * @method Extension#reload\n */\n reload: function () {\n ReloadExtension(this.name);\n }\n });\n \n global.Extension = Extension;\n})(window);\n","\"use strict\";\n(function () {\n /**\n * Базовое пространство имен.\n * Собственные функции данного пространства доступны сразу, например, raise. \n * Для запуска программы после инициализации всех компонентов WebAccess служит специальная функция WebAccess.ready(). \n *\n * Для доступа к дочерним пространствам имен, например current или extensions, необходимо сначала дождаться их инициализации. \n * Если необходимо обеспечить работу лишь с некоторыми из них, можно использовать публичные deferred-объекты, например SideBarInit, ToolBarInit. \n * @example\n * console.log(WebAccess.current); // Возвратит пустой объект.\n * WebAccess.ready(function() {\n * console.log(\"Иницализация завершена\");\n * console.log(this); //this = WebAccess;\n * console.log(WebAccess.current.toolBar); // Объект панели инструментов полностью инициализирован и заполнен.\n * console.log(WebAccess.current.sideBar); // Объект боковой панели полностью инициализирован и заполнен.\n * });\n *\n * // Если предполагается работа только с кнопками панели \n * // инструментов, можно не дожидаться инициализации всех компнентов.\n * $.when(WebAccess.ToolBarInit).done(function () {\n * console.log(\"Иницализация завершена\");\n * console.log(WebAccess.current.toolBar); // Объект панели инструментов полностью инициализирован и заполнен.\n * console.log(WebAccess.current.sideBar); // Может быть пустым и еще не инициализированным. \n * });\n * @global\n * @namespace WebAccess\n * @alias WA\n */\n var WebAccess = function () {\n var self = this;\n\n\n this._whenInitComplete = [];\n\n /**\n * Обработчик инициализации. Добавляет функцию в очередь на исполнение, когда объектная модель WebAccess готова к использованию.\n *\n * @function WebAccess.ready\n * @param {function} callback Ссылка на функцию, которая будет вызвана немедленно по готовности объектной модели к использованию\n * @return WebAccess\n */\n this.ready = function (func) {\n if (!func) {\n WA.raise('ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED', 'function');\n } else if (!$.isFunction(func)) {\n WA.raise('ERR_INVALID_PARAMETER_TYPE');\n } else {\n if (WA.Init.state() === 'pending') {\n this._whenInitComplete.push(func);\n } else {\n func.apply(this);\n };\n }\n return this;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /*\n * Получить расширение файла из URL\n * @private\n * @since 5.2.0.1100\n */\n this._getFileExtensionFromURL = function (url) {\n if (!url) return null;\n if (url.indexOf('.') === -1) return null;\n var parts = url.split(\"?\")[0].split('.');\n return parts[parts.length - 1];\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Динамическая подгрузка ресурсов. \n * Позволяет подключить сторонний JS файл или таблицу стилей CSS.\n * Загрузка JS-файлов или таблиц стилей CSS происходит синхронно в порядке очереди.\n *\n * @function WebAccess.include\n * @param {string} url Абсолютный или относительный путь к целевому файлу\n * @raise ERR_UNSUPPORTED_TYPE_RESOURCE - Данный тип ресурсов не поддерживается \n * @return WebAccess\n * @example \n * // Подключить сторонний файл General.js. \n * WebAccess.include('/js/Extension.RecordOffice/General.js');\n * // Подключить для соответствующих справочников необходимый файл для исполнения специфической логики их работы.\n * var refCode = WebAccess.current.getReferenceCode(); \n * switch (refCode) { \n * case 'РКК' : \n * WebAccess.include('/js/Extension.RecordOffice/RRCReference.js'); \n * break; \n * case 'RRCAssignments': \n * WebAccess.include('/js/Extension.RecordOffice/RRCAssignmentsReference.js'); \n * break; \n * case 'ГДЛ': \n * WebAccess.include('/js/Extension.RecordOffice/LogsReference.js'); \n * break; \n * case 'IndividualUserModuleSettings': \n * WebAccess.include('/js/Extension.RecordOffice/IndividualUserModuleSettingsReference.js'); \n * break; \n * };\n */\n this.include = function (url) {\n var type = this._getFileExtensionFromURL(url);\n switch (type) {\n case \"js\":\n $.ajaxSetup({ async: false, cache: true });\n $.getScript(url);\n $.ajaxSetup({ async: true, cache: false });\n break;\n case \"css\":\n var link = document.createElement(\"link\");\n link.setAttribute(\"rel\", \"stylesheet\");\n link.setAttribute(\"type\", \"text/css\");\n link.setAttribute(\"href\", url);\n document.getElementsByTagName(\"head\")[0].appendChild(link);\n break;\n default:\n this.raise(\"ERR_UNSUPPORTED_TYPE_RESOURCE\", type);\n break;\n }\n return this;\n };\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n \n\n /**\n * Предоставляет доступ к информации о веб-модулях и средства для работы с ними.\n * @namespace WebAccess.extensions\n */\n this.extensions = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для генерирования динамических компонент. \n * Например, модальных окон или контекстных меню.\n * Не требует использования функции WebAccess.ready.\n * @namespace WebAccess.components\n * @since 5.0.0.4000 \n */\n this.components = this.CMP = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с веб-сервисами. \n * Не требует использования функции WebAccess.ready.\n * @namespace WebAccess.services\n * @alias SRV\n * @since 5.0.0.4000 \n */\n this.services = this.SRV = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с шаблонами. \n * Не требует использования функции WebAccess.ready.\n * @namespace WebAccess.templates\n * @alias TMPL\n * @since 5.0.0.4213\n */\n this.templates = this.TMPL = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с фабриками документов, папкок, задач, заданий, справочников, отчетов и сценариев.\n *\n * @namespace WebAccess.factories\n * @alias TMPL\n * @since 5.0.0.7300\n */\n this.factories = this.FC = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет вспомогательные объекты для расширения функциональности классов, например объекты для работы с реквизитами. \n * Не предназначен для создания самостоятельно используемых объектов. \n * Не требует использования WebAccess.ready.\n * @namespace WebAccess.mixins\n * @since 5.0.0.7100\n */\n this.mixins = {};\n\n\n /**\n * Предоставляет инструменты для работы с кэшем. Не требует использования функции WebAccess.ready.\n * @namespace WebAccess.cache\n * @since 5.0.0.7100\n */\n this.cache = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с прикладными функциями Is-Builder. Не требует использования функции WebAccess.ready.\n * @namespace WebAccess.isbuilder\n * @since 5.5.0.5500\n */\n this.isbuilder = this.ISB = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с историей. \n * Генерирует события изменения стека истории. \n * \n * @namespace WebAccess.history\n */\n this.history = {};\n\n /**\n * Предоставляет доступ к прикладным методам объектов.\n * @namespace WebAccess.domainMethods\n * @since 5.5.0.1000\n */\n this.domainMethods = {};\n\n /**\n * Предоставляет информацию о текущем окружении. Например, о версии браузера, об операционной системе, о устройстве.\n * @namespace WebAccess.environment\n * @property {string} ua Строка User-agent\n * @alias ENV\n * @since 5.0.0.4200\n *\n * @example \n * if (WA.ENV.browser.name == \"Firefox\") { alert(\"Текущи браузер Firefox\"); } \n */\n\n this.environment = this.ENV = window.environmentInfo;\n\n /**\n * Содержит информацию об имени и версии текущего браузера.\n *\n * @namespace WebAccess.environment.browser \n * @property {string} name Имя браузера. например, «Firefox»\n * @property {string} major Основная версия текущего браузера, например, «23»\n * @property {string} version Полная версия, например, «23.0»\n *\n * @example \n * if (WA.ENV.browser.name == \"Firefox\") { alert(\"Текущи браузер Firefox\"); } \n */\n\n /**\n * Содержит информацию об архитектуре используемого процессора.\n *\n * @namespace WebAccess.environment.cpu\n * @property {string} architecture Сборка браузера, например, «amd64»\n */\n\n /**\n * Содержит информацию об используемом устройстве.\n *\n * @namespace WebAccess.environment.device\n * @property {string} model Модель устройства\n * @property {string} vendor Поставщик\n * @property {string} type Тип устройства\n */\n\n /**\n * Содержит информацию о движке браузера. \n *\n * @namespace WebAccess.environment.engine\n * @property {string} name Имя движка, например, «Gecko» \n * @property {string} version Полная версия, например, «23.0»\n */\n\n /**\n * Содержит информацию об используемой операционной системе.\n * @namespace WebAccess.environment.os\n * @property {string} name Имя операционной системы, например «Windows» \n * @property {string} version Версия, например «8»\n */\n\n this.environment.isMobile = function () {\n var agent = navigator.userAgent.toLowerCase();\n var oldMobileBrowser = (agent.indexOf(\"series60\") != -1) || (agent.indexOf(\"symbian\") != -1) || (agent.indexOf(\"windows ce\") != -1) || (agent.indexOf(\"blackberry\") != -1);\n var modernMobile = typeof orientation != 'undefined' ? true : false;\n return oldMobileBrowser || modernMobile;\n };\n\n this.environment.isAndroid = function () {\n return self.environment.os.name === \"Android\";\n }\n\n this.environment.isIOS = function () {\n return self.environment.os.name === \"iOS\";\n }\n\n this.environment.isTouch = function () {\n var agent = navigator.userAgent.toLowerCase(); //todo: закешировать уже\n // If touch events are defined we are in a modern touch screen OS \n return ('ontouchstart' in document.documentElement) ? true : false || agent.indexOf(\"touch\") !== -1 || agent.indexOf(\"tablet\") !== -1;\n };\n\n /**\n * Ориентация экрана.\n */\n this.environment.isVertical = function () {\n if (($(window).height() / $(window).width()) > 1) return true;\n else return false;\n };\n\n /**\n * Платформа.\n * \n * @deprecated \n */\n this.environment.platform = \"unknown\"\n if (navigator.appVersion.indexOf(\"Win\") != -1) this.environment.platform = \"windows\";\n if (navigator.appVersion.indexOf(\"Mac\") != -1) this.environment.platform = \"macos\";\n if (navigator.appVersion.indexOf(\"Linux\") != -1 || navigator.appVersion.indexOf(\"X11\") != -1) this.environment.platform = \"linux\";\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * deferred-объект. Сообщает о готовности к использованию клиентской объектной модели после ее полной инициализации.\n *\n * @member WebAccess.Init\n */\n this.Init = $.Deferred();\n\n /**\n * deferred-объект. Сообщает о готовности к использованию пространства имен WebAccess.current.sideBar после его полной инициализации.\n * При использовании WebAcces.ready функция будет исполнена несколько позже, \n * так как функция WeabAcces.ready дожидается полной инициализации всех deferred-объектов и только потом исполняет переданную ей функцию.\n *\n * @member WebAccess.SideBarInit\n *\n * @example\n * $.when(WebAccess.SideBarInit).done(function () {\n *  WebAccess.current.sideBar.tabs.create(\"FilterRRC\").enable().setLabel(L(\"RRC_FILTER\")).setIcon(\"SidebarAndExtensions/EDocumentSearch_24.png\").setHtml(createFilterTabs(\"РКК\"));\n *  WebAccess.current.sideBar.tabs.create(\"FilterRRCAssignment\").enable().setLabel(L(\"RRC_ASSIGNMENTS_FILTER\")).setIcon(\"SidebarAndExtensions/EDocumentSearch_24.png\").setHtml(createFilterTabs(\"RRCAssignments\"));\n * });\n */\n this.SideBarInit = $.Deferred();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * deferred объект. Сообщает о готовности к использованию пространства имен WebAccesst.agent после его полной инициализации.\n * @since 5.1.0.1500\n * @member WebAccess.AgentInit \n */\n this.AgentInit = $.Deferred();\n \n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * deferred объект. Сообщает о готовности к использованию пространства имен WebAccess.current.toolBar после его полной инициализации.\n * @member WebAccess.ToolBarInit\n */\n this.ToolBarInit = $.Deferred();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * deferred объект. Сообщает о готовности к использованию пространства имен WebAccess.current.form.controls после его полной инициализации.\n * @member WebAccess.FormControlsInit\n */\n this.FormControlsInit = $.Deferred();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * deferred объект. Сообщает о готовности к использованию пространства имен WebAccess.current.details после его полной инициализации.\n * @member WebAccess.DetailsInit\n */\n this.DetailsInit = $.Deferred();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * deferred объект. Сообщает о готовности к использованию пространства имен WebAccess.current.objectList после его полной инициализации.\n * @member WebAccess.ObjectListInit\n */\n this.ObjectListInit = $.Deferred();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n this._DetailsGridInit = $.Deferred();\n\n /**\n * deferred объект. Сообщает о готовности к использованию пространства имен WebAccess.current.user после после его полной инициализации\n * @since 5.0.0.7200\n * @member WebAccess.UserInfoInit\n */\n this.UserInfoInit = $.Deferred();\n this._userInfoInit = $.Deferred();\n\n \n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с анимацией, отображающей процесс загрузки.\n *\n * @namespace WebAccess.current.spinner \n * @since 5.0.0.7300 \n */\n\n /**\n * Отложенный запуск анимации процесса загрузки.\n *\n * @method WebAccess.current.spinner.showDelayed\n * @param {Integer} [opt_delay] Задержка запуска анимации в миллисекундах\n * @return {WebAccess.current.spinner} Объект типа spinner.\n * @since 5.0.0.7300\n */\n\n /**\n * Показать анимацию процесса загрузки.\n *\n * @method WebAccess.current.spinner.show\n * @return {WebAccess.current.spinner} Объект типа spinner.\n * @since 5.0.0.7300\n */\n\n /**\n * Показать анимацию процесса загрузки в диалоговом окне.\n *\n * @method WebAccess.current.spinner.showInDialog\n * @param {Integer} [opt_delay] Задержка запуска анимации в миллисекундах\n * @return {WebAccess.current.spinner} Объект типа spinner.\n * @since 5.0.0.7300\n */\n\n /**\n * Скрыть анимацию процесса загрузки.\n *\n * @method WebAccess.current.spinner.hide\n * @param {String} [opt_message] Cообщение о завершении процесса загрузки.\n * @param {Integer} [opt_delay] Задержка запуска анимации в миллисекундах\n * @param {Integer} [opt_callback] Функция, которая будет запущена после скрытия анимации.\n * @return {WebAccess.current.spinner} Объект типа spinner.\n * @since 5.0.0.7300\n */\n\n\n\n /**\n * Предоставляет инструменты для работы с диалоговыми сообщениями.\n *\n * @since 5.0.0.7300\n * @namespace WebAccess.current.inlineHint\n */\n\n /**\n * Показать диалоговое окно с предупреждением.\n *\n * @function WebAccess.current.inlineHint.showWarning\n * @param {String} message Основной текст предупреждения\n * @param {String} [opt_details] Информационный текст, объясняющий суть предупреждения\n * @return {WebAccess.current.inlineHint} Объект типа inlineHint.\n * @since 5.0.0.7300\n */\n\n /**\n * Показать диалоговое окно с текстом ошибки.\n *\n * @function WebAccess.current.inlineHint.showError\n * @param {String} message Основной текст ошибки\n * @param {String} [opt_details] Информационный текст, объясняющий ошибку\n * @return {WebAccess.current.inlineHint} Объект типа inlineHint.\n */\n\n /**\n * Показать диалоговое окно с информацией.\n *\n * @function WebAccess.current.inlineHint.showInfo\n * @param {String} message Основной текст сообщения\n * @param {String} [opt_details] Информационный текст, объясняющий суть сообщения\n * @return {WebAccess.current.inlineHint} Объект типа inlineHint.\n * @since 5.1.0.1511\n */\n\n /**\n * Показать диалоговое окно сообщения.\n *\n * @function WebAccess.current.inlineHint.show\n * @param {String} message сОсновной текст сообщения\n * @param {String} [opt_details] Информационный текст\n * @param {MESSAGE_TYPE} [opt_messageType] Тип сообщения\n * @return {WebAccess.current.inlineHint} Объект типа inlineHint.\n */\n \n /**\n * Скрыть последнее открытое сообщение.\n *\n * @function WebAccess.current.inlineHint.hide \n * @return {WebAccess.current.inlineHint} Объект типа inlineHint.\n * @since 5.0.0.7300\n */\n \n /**\n * Скрыть все сообщения.\n *\n * @function WebAccess.current.inlineHint.hideAll\n * @static\n * @since 5.0.0.7300\n */\n\n $.when(this.FormControlsInit).done(function () {\n if (!$('html').hasClass('mobile')) {\n self.current.spinner = new WA.CMP.notifications.Spinner();\n self.current.inlineHint = new WA.CMP.notifications.InlineHint();\n }\n });\n\n\n /**\n * deferred объект. Сообщает о готовности к использованию пространства имен WebAccess.extensions после его полной инициализации.\n * @member WebAccess.ExtensionsInit\n */\n this.ExtensionsInit = $.Deferred();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * deferred объект. Сообщает о готовности к использованию дерева объектов\n * @member WebAccess.ExtensionsInit\n * @since 5.2.0.1600\n * @comment документаторы, не акцентируйте на него много внимания, немотря на то, что он новый.\n */\n this.FolderTreeInit = $.Deferred();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** @private */\n this._extensionsDataInit = $.Deferred();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * deferred объект. Сообщает о готовности к использованию пространства имен WebAccess.current.form после его полной инициализации.\n * @member WebAccess.FormInit\n * @since 5.0.0.7100\n */\n this.FormInit = $.Deferred();\n\n\n /**\n * Когда объект extensions заполняется данными, дополняем его еще и методами.\n */\n $.when(this._extensionsDataInit).done(function () {\n for (var extension in self.extensions) {\n var ext = new Extension(self.extensions[extension]);\n self.extensions[extension] = ext;\n /**\n * Ссылка на объект типа Extension, который хранит информацию о текущем веб-модуле.\n * @member WebAccess.extensions.current\n */\n if (ext.isCurrent) self.extensions.current = ext;\n }\n self.EXT = self.extensions;\n self.ExtensionsInit.resolve();\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Когда все элементы будут загружены, тогда вызовем все функции иницализации.\n * @fixme вызывать функции асинхронно\n */\n $.when(this.ToolBarInit,\n this.SideBarInit,\n this.FormControlsInit,\n this.DetailsInit,\n this.ExtensionsInit,\n this.ObjectListInit,\n this.FormInit,\n this.UserInfoInit).done(function () {\n self.Init.resolveWith(self);\n while (self._whenInitComplete.length) {\n self._whenInitComplete.shift().call(self);\n }\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n this.Task = new TaskModel();\n this.Job = new JobModel();\n this.Document = new DocumentModel();\n this.ReferenceRecord = new ReferenceRecordModel();\n this.Folder = new FolderModel();\n this.Wizard = new WizardModel();\n // Добавил для отработки событий \"До запроса парраметров\" при выборе ТМа.\n this.Events = {};\n\n /**\n * @ignore\n * @function WebAccess.setEvents\n * @todo кому-нибудь описать что это.\n */\n this.setEvents = function (events) {\n $.each(events, function (key, value) {\n self.Events[key] = value;\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Генерировать исключение.\n * Если при срабатывании исключение не было отловлено конструкцией try/catch или функция\n * не была обернута в функцию tryCatchDecorator, то выполняемый сценарий остановится.\n *\n * @function WebAccess.raise\n * @param {string} error Код строки ошибки\n * @param {string} [opt_value] Переданное значение, например имя объекта, вызвавшего ошибку\n *\n * @example \n * // Проверка существования закладки. Если закладка существует, то генерируется исключение.\n * if (jExistingTab.length > 0) WebAccess.raise(\"ERR_TAB_WITH_THE_SAME_NAME_ALREADY_EXIST\", name);\n */\n this.raise = function (error, opt_value) {\n var message = \"\";\n\n if (!!opt_value) {\n message = L(error) + \": \" + opt_value;\n } else {\n message = L(error);\n }\n\n var exception = new Error(message);\n var logMsg = format('{0}
{1}
', message, exception.stack);\n \n if (window.log) log.error('DEFAULT', logMsg);\n\n exception.name = error;\n throw exception;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n\n /**\n * Автоматически отобрать исключения, которые могут произойти в функции. \n * Выводит информацию об исключении в стандартную область ошибок и уведомлений. \n * Не рекомендуется использовать в местах, где нужна производительность, особенно при работе в циклах.\n *\n * @function WebAccess.tryCatchDecorator\n * @param {function} decoratedFunction декорируемая функция\n * @since 5.0.0.4000 \n * @alias TCD\n *\n * @example\n * function ShowCustomizationWindow(el) {\n * ...\n *\t // Произошло исключение.\n * ...\n * };\n * ShowCustomizationWindow = WebAccess.tryCatchDecorator(ShowCustomizationWindow);\n * // В результате выполнения функции, исключение будет обработано, и не остановит дальнейшее выполнение сценария.\n */\n this.tryCatchDecorator = this.TCD = function (decoratedFunction) {\n return function () {\n try {\n return decoratedFunction.apply(this, arguments);\n } catch (err) {\n if (window.log) log.error('DEFAULT', err);\n if (window.console) console.log(err);\n ErrorShow(L(\"JS_ERROR\") + \": \" + err.message, true);\n return null;\n }\n };\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Закешированное текущее местоположение.\n * @private\n * @property WebAccess.location\n */\n this._location = \"\";\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Определить текущее местоположение.\n *\n * @function WebAccess.getLocation\n * @return {string} Текущее местонахождение, например explorer, task, job, reference, wizard, about.\n * @example \n * if (WA.getLocation == 'explorer') {\n * console.log('В данный момент мы находимся в проводнике веб-доступа');\n * };\n */\n this.getLocation = function () {\n if (!!this.location) return this._location;\n if (!window.location) return \"\";\n var path = window.location.pathname;\n this._location = path.substr(1, path.lastIndexOf(\".\") - 1).toLowerCase();\n return this._location;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показывает, что мобильный веб-доступ открыт.\n *\n * @function WebAccess.isMobile\n * @return {boolean} True – мобильный веб-доступ открыт, иначе False.\n * @since 5.1.0.1505\n */\n this.isMobile = function () {\n return ($(\"html.mobile\").length > 0);\n };\n\n /**\n * Выйти из проводника веб-доступа.\n *\n * @function WebAccess.logout\n * @return {WebAccess} Объет типа WebAccess. \n * @since 5.0.0.7300\n */\n this.logout = function () {\n var mobileView = this.isMobile();\n //$('html').append(\"
\");\n $.cookie('lang', null);\n\n if (mobileView) {\n //дурака пинаем\n } else {\n if (WA.agent.isSessionInitialized()) {\n //FIXME: always переделать на done и fail\n WA.agent.isPluginAvailable(\"edmsplugin\")\n .always(function (isAvailableResponse) {\n //Сообщаем агенту о выходе\n if (isAvailableResponse) {\n WA.agent.endSession();\n }\n });\n } \n }\n\n //Закрываем сессию\n CallService(\"/Authentication.asmx/Logout\", {}, function () { window.location = \"Login.aspx\"; });\n //$(\"#SignOut\").val(\"SignOut\");\n //$('#ExitForm').submit();\n return this;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n };\n\n window.WebAccess = window.WA = new WebAccess();\n})();\n\n","\"use strict\";\n(function pluginMixin(global) {\n\n /**\n * Предоставляет дополнительные методы для для расширения функциональности классов.\n *\n * @mixin WebAccess.mixins.pluginMixin\n * @since 5.2.0.1100\n */\n global.pluginMixin = { \n _plugins: [],\n\n /**\n * Преобработка параметров конструктора. Если в него был передан\n * объект со списком плагинов, то зарегистрируем их сразу же.\n * @method WebAccess.mixins.pluginMixin#_parseArguments\n * @private\n * @since 5.2.0.1100\n */\n _parseArguments: function () { \n var me = this;\n me._plugins = [];\n for (var arg = 0; arg < arguments.length; ++arg) {\n var param = arguments[arg];\n if ($.isPlainObject(param) && param.hasOwnProperty('plugins')) {\n var plugins = param.plugins;\n\n for (var i = 0; i < plugins.length; i++) {\n var plugin = plugins[i];\n\n if (plugin && plugin.__isPlugin === true) {\n me.registerPlugin(plugin);\n } \n }\n };\n } \n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Регистрирует плагин. \n *\n * Вызывается неявно, если в коструктор класса был передан список плагинов.\n * Можно вызвать вручную.\n * @param {WA.Plugin} plugin Плагин\n * @method WebAccess.mixins.pluginMixin#registerPlugin\n * @return {WebAccess.mixins.link}\n * @since 5.2.0.1100\n */\n registerPlugin: function (plugin) {\n var me = this;\n if (plugin.register && plugin.name) {\n var methods = plugin.register(me);\n\n for (var methodName in methods) {\n if (this.hasOwnProperty(methodName)) {\n log.warning('PLUGIN', '\"'+plugin.name + '\" overrides extiting method \"'+ methodName + '\"');\n }\n this[methodName] = methods[methodName];\n }\n\n this._plugins.push(plugin.name);\n log.info('PLUGIN', '\"' + plugin.name + '\" registered');\n } else {\n WA.raise(L('PASSED_OBJECT_IS_NOT_PLUGIN_CLASS_ISTANCE'));\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверяет наличие зарегистрированного плагина в классе. \n * @param {string} pluginName Имя плагина\n * @method WebAccess.mixins.pluginMixin#isPluginRegistered\n * @return {boolean}\n * @since 5.2.0.1100\n */\n isPluginRegistered: function(pluginName) {\n return this._plugins.indexOf(pluginName) !== -1;\n }\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n };\n\n})(window.WebAccess.mixins);","\"use strict\";\n\n(function (global) {\r\n\n var selectors = {\r\n details: '.Reference_Detail',\n links: 'a',\n buttons: '.CardForm_Button, .wizard-form__button',\n tabs: '.sidebar_item, .tab_item',\n searches: '.explorer-search-panel__item',\n toolBarButtons: '.toolbar_button',\n toolBarGroups: '.toolbar_group'\r\n };\n\n /**\n * Предоставляет механизм инициализации дочерних пространств имен для оберток\n * элементов формы.\n *\n * @mixin WebAccess.mixins.formMixin\n * @since 5.2.0.1600\n * @property {WebAccess.components.wrappers.form.Form} form - форма\n * @property {WebAccess.components.wrappers.details.Detail} details - детальные разделы\n * @property {WebAccess.components.wrappers.details.sideBar.SideBar} sideBar - форма\n * @property {BaseObject} toolBar - панель инструментов\n * @property {window} toolBar - панель инструментов //TODO\n * @property {Object} states - deferred объекты инициализации оберток\n */\n\n var formMixin = {\r\n Init: null,\n form: null,\n details: null,\n sideBar: null,\n toolBar: null,\n window: null,\n objectList: null,\n states: null,\n //---------------------------------------------------------------------//\n\n /**\n * Установка начальных значений deferred объектов;\n * @method _preInit\n * @private\n * @return {WebAccess.mixins.formMixin} расширяемый класс\n */\n _preInit: function () {\r\n var me = this;\n me.states = {\r\n objectList: $.Deferred(),\n details: $.Deferred(),\n toolBarButtons: $.Deferred(),\n toolBarGroups: $.Deferred(),\n tabs: $.Deferred(),\n tables: $.Deferred(),\n links: $.Deferred(),\n buttons: $.Deferred(),\n form: $.Deferred()\r\n };\n\n me.Init = $.Deferred();\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Заполенение и инициализация дочерних пространств имен\n * @method _postInit\n * @private\n * @return {WebAccess.mixins.formMixin} расширяемый класс\n */\n _postInit: function () {\r\n var me = this;\n var WR = global.CMP.wrappers;\n\n me._containerInit.done(function () {\r\n me._jContainer = $(me.containerSelector);\n\n me.details = me._getSubItems(selectors.details, WR.details.Detail);\n me.states.details.resolve();\n\n me.form = new WR.form.Form(me._getFormData(), me.serviceURL, me);\n me.form.controls = new BaseObject();\n me.form.Init.then(function () {\r\n me.states.form.resolve();\r\n });\n\n if ($.isFunction(me._initObjectList)) {\r\n me._initObjectList();\r\n } else {\r\n console.warn('It is necessary to implement _initObjectList method in ' + me.className + '.');\r\n }\n me.states.objectList.resolve();\n\n me.form.controls.links = new global.Collection(me._getSubItems(selectors.links, WR.form.Link));\n me.states.links.resolve();\n me.form.controls.buttons = new global.Collection(me._getSubItems(selectors.buttons, WR.form.Button));\n me.states.buttons.resolve();\n\n if (!WA.isMobile()) {\r\n if (me.className === 'Current' && WA.getLocation() === 'explorer') { //спецобработка\n me.sideBar = new WR.sideBar._ExplorerSideBar(me.containerSelector + ' ' + me._sideBarContainerSelector, me);\n me.sideBar.tabs = new WR.sideBar._ExplorerTabs(me._getSubItems(selectors.searches, WR.sideBar._ExplorerTab), me.containerSelector + ' ' + me._sideBarContainerSelector, me);\r\n } else {\r\n me.sideBar = new WR.sideBar.SideBar(me.containerSelector + ' ' + me._sideBarContainerSelector, me);\n me.sideBar.tabs = new WR.sideBar.Tabs(me._getSubItems(selectors.tabs, WR.sideBar.Tab), me.containerSelector + ' ' + me._sideBarContainerSelector, me);\r\n }\r\n }\n\n me.states.tabs.resolve();\n\n me.toolBar = new BaseObject();\n\n if (!WA.isMobile()) {\r\n me.toolBar = new WR.toolBar.ToolBar();\n me.toolBar.buttons = new WR.toolBar.Buttons(me._getSubItems(selectors.toolBarButtons, WR.toolBar.ToolBarButton));\n me.states.toolBarButtons.resolve();\n me.toolBar.groups = new WR.toolBar.Groups(me._getSubItems(selectors.toolBarGroups, WR.toolBar.ToolBarGroup));\r\n }\n\n me.states.toolBarGroups.resolve();\r\n });\n\n\n me._detailsGridInit.done(function () {\r\n var tableParams = {\r\n formData: me._getFormData(),\n grids: me._getGrids(),\n objectLink: me._getObjectLink(),\n objectView: me._getObjectView(),\n serviceURL: me.serviceURL,\n current: me\r\n };\n\n var tables = me._getSubItems(selectors.details, global.CMP.wrappers.form.Table, tableParams);\n var tablesInit = [];\n for (var key in tables) {\r\n var table = tables[key];\n tablesInit.push(table.Init);\r\n }\n $.when.apply(me, tablesInit).then(function () {\r\n me.form.controls.tables = tables;\n me.states.tables.resolve();\r\n });\r\n });\n\n var states = _(me.states).values();\n $.when.apply(me, states).always(function () {\r\n me.Init.resolve();\n if (!WA.isMobile()) {\r\n me._jContainer.find('input[type=\"text\"], textarea').not('.Req_Disabled').first().focus().select(); //#106799\n }\r\n });\n\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Заполнение дочернего пространства соответсвующими элементами\n *\n * @param {string} elementSelector селектор искомого элемента\n * @param {Class} Component класс обертки для элемента\n * @param {Object} opt_params параметры передаваемые в конструктор элемента обертки\n * @private\n * @return {Array} список объектов-оберток\n */\n _getSubItems: function (elementSelector, ComponentClass, opt_params) {\r\n var items = {};\n var me = this;\n opt_params = opt_params || { current: me };\n var jSearchTarget = me._jContainer.find(elementSelector);\n\n for (var i = 0, l = jSearchTarget.length; i < l; i++) {\r\n var elem = new ComponentClass(jSearchTarget[i], opt_params);\n if (!items[elem.name]) items[elem.name] = elem;\n items[elem.name]._jSubElements = items[elem.name]._jSubElements || [];\n items[elem.name]._jSubElements.push(jSearchTarget[i]);\r\n }\n return items;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Навешивает на все реквизиты всех детальных разделов логику работы ведущих/ведомых.\n */\n bindLeaderDrivenLogic: function () {\r\n var me = this;\n\n function bindLeaderDrivenLoginOnRequisites(table, row) {\r\n var reqs = row.requisites.toArray();\n for (var j = 0; j < reqs.length; j++) {\r\n var req = reqs[j];\n var currentColumnMetadata = table.getColumnMetadata(req.name);\n\n if (currentColumnMetadata) {\r\n var reqInfo = currentColumnMetadata.Requisite;\n if (reqInfo) {\r\n if (reqInfo.leaderRequisites && reqInfo.lookUpLeaderRequisites && reqInfo.drivenRequisites) {\r\n\n var leader = _($.parseJSON(reqInfo.leaderRequisites)).map(function (leadReq) {\r\n return { tableName: table.name, rowId: row.getRowId(), reqName: leadReq };\r\n });\n\n var lookup = $.parseJSON(reqInfo.lookUpLeaderRequisites);\n var driven = _($.parseJSON(reqInfo.drivenRequisites)).map(function (drivenReq) {\n return { tableName: table.name, rowId: row.getRowId(), reqName: drivenReq };\r\n });\n\n me._initLeaderDrivenLogic(req, leader, lookup, driven);\r\n }\r\n }\r\n }\r\n }\r\n };\n\n $.when(me.states.tables).then(function () {\r\n for (var tableName in me.form.controls.tables) {\r\n var table = me.form.controls.tables[tableName];\n // Для существующих строк.\n var rows = table.rows.toArray();\n for (var i = 0; i < rows.length; i++) {\r\n (function (_table, _row) {\r\n bindLeaderDrivenLoginOnRequisites(_table, _row);\r\n })(table, rows[i]);\r\n }\n // Для новых строк.\n (function (_table) {\r\n _table.bind('addRow', function (newRow) {\r\n bindLeaderDrivenLoginOnRequisites(_table, newRow);\r\n });\r\n })(table);\r\n };\r\n });\n\n return me;\r\n },\n\n // Инициализация логики ведущих/ведомых для реквизита.\n _initLeaderDrivenLogic: function (req, leader, lookup, driven) {\r\n var me = this;\n\n if (!req || (leader.length === 0 && driven.length === 0)) return me;\n\n req.bind('editModeChange', function (editMode) {\n // Только в режиме редактирования можно означить фильтр по значениям ведущих.\n if (!editMode) return;\n\n _(req._getControls()).each(function (jInput) {\r\n var rs = jInput.data('ReferenceSelectInstance');\n if (rs && rs.extraParams) {\r\n var extraParams = rs.extraParams;\n // Устанавливаем условие фильтрации и необходимость загрузки lookup-реквизитов по ведущим реквизитам.\n $.extend(extraParams, {\r\n LeadSelID: function () {\r\n return me._getLookupValues(leader, lookup);\r\n }\r\n });\n rs.extraParams = extraParams;\r\n }\r\n });\r\n });\n\n req.bind('changeWithLeaderValues', function (jControl, ev, data, needClearDriven) {\n //data = { name: ..., value: ..., displayValue: ..., leaderRequisiteValues: ... }\n\n if (data && data.value !== null) {\n // Надо бы заполнить ведущиеи очистить ведомые.\n\n // Очищаем ведомые.\n if (needClearDriven) {\r\n me._clearRequisitesValue(driven);\r\n }\n // Заполняем ведущие.\n fillLeaderRequisites(data);\n\n // Заполняем ведомые, если в них одно значение (См. FillDrivenIfItResultHasOneRecord).\n //В билдере эта логика не срабатывает, поэтому и у нас не сделал.\n\n } else {\n // Очищаем ведомые.\n me._clearRequisitesValue(driven);\r\n }\n\n //Заполняет ведущие реквизиты\n function fillLeaderRequisites(data) {\r\n for (var i = 0; i < leader.length; i++) {\r\n var leadValues = data.leaderRequisiteValues[lookup[i]];\n if (leadValues) {\r\n var leadReq = me._getRequisiteByFullName(leader[i]);\n if (leadReq) {\n\n //Устанавливаем значение для ведущего реквизита\n leadReq.setValue(leadValues[0], leadValues[2], true);\n\n //Пытаемся установить значение ведущих реквизитов для текущего ведущего\n me._fillLeaderForDetailSectionRequisite(leadReq, leadValues[0]);\r\n }\r\n }\r\n }\r\n }\r\n\n\n });\n\n return me;\r\n },\n\n /**\r\n * Возвращает значения ведущих реквизитов в формате URL, т.е. name1=value1&name2=value2...\r\n * \r\n * @param {Array} leader Массив из {tableName: ..., rowId: ..., reqName: ...}\r\n * @param {Array} lookup Массив имен ведущих реквизитов\r\n * @returns {} \r\n */\n _getLookupValues: function (leader, lookup) {\r\n var me = this;\r\n var val = '';\n for (var i = 0; i < leader.length; i++) {\r\n var leadReq = me._getRequisiteByFullName(leader[i]);\n if (!leadReq) continue;\n var leadReqVal = leadReq.getValue();\n val += lookup[i] + '|' + leadReq.name + '=' + (leadReqVal ? leadReqVal : '') + '&';\r\n };\n return val;\r\n },\n\n /**\r\n * Возвращает объект реквизита по его полному имени\r\n * \r\n * @param {object} fullName Моделька полного имени реквизита вида {tableName: ..., rowId: ..., reqName: ...}\r\n * @returns {object} Реквизит\r\n */\n _getRequisiteByFullName: function (fullName) {\r\n var me = this;\r\n if (_.isString(fullName)) {\n // Реквизит карточки.\n return me.form.requisites[fullName];\r\n } else {\n // Реквизит детального раздела.\n return me.form.controls.tables[fullName.tableName].getRowById(fullName.rowId).requisites[fullName.reqName];\r\n }\r\n },\n\n /**\r\n * Чистит значения реквизитов.\r\n * \r\n * @param {Array} reqFullNames массив моделек вида {tableName: ..., rowId: ..., reqName: ...}\r\n */\n _clearRequisitesValue: function (reqFullNames) {\r\n var me = this;\r\n for (var i = 0 ; i < reqFullNames.length; i++) {\r\n var drivenReq = me._getRequisiteByFullName(reqFullNames[i]);\n if (drivenReq) drivenReq.clear(true);\r\n }\r\n },\n\n /**\r\n * Заполняет ведущие реквизиты для текущего реквизита с заданным значением\r\n * \r\n * @param {object} requisite Реквизит, для которого буду заполнены ведущие\r\n * @param {int} value Значение реквизита, для которого буду заполнены ведущие\r\n */\n _fillLeaderForDetailSectionRequisite: function (requisite, value) {\r\n var me = this;\r\n var row = requisite.getRow();\n var table = row.getTable();\n var currentColumnMetadata = table.getColumnMetadata(requisite.name);\n\n if (currentColumnMetadata) {\r\n var reqInfo = currentColumnMetadata.Requisite;\n if (reqInfo) {\n\n var settings = $.parseJSON(reqInfo.settings);\n var params = getReferenceSelectParams(reqInfo, settings, value);\n\n ReferenceSelectDataProvider.sendQuery(settings.url, params, function (count, res) {\r\n var data = res[0];\n if (data && data.leadingRequisitesValue !== \"{}\") {\r\n requisite.fire('changeWithLeaderValues', null, null, { name: data.encodedTitle, value: data.id, displayValue: data.title, leaderRequisiteValues: $.parseJSON(data.leadingRequisitesValue) }, false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Возвращает параметры для запроса на выборку реквизита с конкретным ИД\r\n * \r\n * @param {object} reqInfo Метаинформация реквизита\r\n * @param {object} settings Метаинформация реквизита\r\n * @param {number} recordId ИД записи, которое попадет в условие выборки\r\n * @returns {object} Параметры запроса\r\n */\r\n function getReferenceSelectParams(reqInfo, settings, recordId) {\n var leader = null;\n var lookup = null;\r\n if (reqInfo.leaderRequisites && reqInfo.lookUpLeaderRequisites) {\r\n\n leader = _($.parseJSON(reqInfo.leaderRequisites)).map(function (leadReq) {\r\n return { tableName: table.name, rowId: row.getRowId(), reqName: leadReq };\r\n });\n\n lookup = $.parseJSON(reqInfo.lookUpLeaderRequisites);\r\n }\n \n var refCode = requisite.getReferences()[0];\n var queryContext = settings.queryContext;\n // Множественный выбор ссылается на несколько ревизитов, поэтому меняем контекст.\n if (settings.referenceCodesAndReqNamesInDetailSection && settings.referenceCodesAndReqNamesInDetailSection[refCode]) {\r\n queryContext = JSON.parse(queryContext);\n queryContext.requisiteNumber = settings.referenceCodesAndReqNamesInDetailSection[refCode].number;\n queryContext = JSON.stringify(queryContext);\r\n }\n\n return $.extend({\r\n q: \"\",\n filter: \"[ИД]=\" + recordId,\n useadditional: settings.useadditional ? \"1\" : \"0\",\n disablespecialprocessing: \"1\",\n queryContext: queryContext,\n LeadSelID: me._getLookupValues(leader, lookup)\r\n }, {});\n }\r\n }\n };\n\n global.mixins.formMixin = formMixin;\r\n})(window.WebAccess);\n","\"use strict\";\n(function BasePluginDefinition(global) {\n\n /** \n * Базовый класс-плагин\n * @class WebAccess.Plugin \n * @property {String} name имя плагина\n * @property {String} className имя класса\n * @since 5.2.0.1100\n */\n global.Plugin = BaseObject.extend({\n __isPlugin: true,\n name: null, \n className: 'Plugin',\n \n init: function (params) {\n this._super(params); \n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Метод регистрации плагина, этот метод вызывается автоматически.\n * В него передается ссылка на расширяемый объект.\n * @param {object} context - расширяемый объект\n * @method WebAccess.Plugin.register\n * @since 5.2.0.1100\n * @return {object} свойства и методы которые будут доступны в расшияремом классе \n * @example\n * //Принцип работы с плагинами\n * var SomeClass = BaseObject.extend([WebAccess.mixins.pluginMixin],{\n * init: functtion() {\n * this._super();\n * }\n * });\n * ....\n * var SomePlugin = WebAccess.Plugin.extend({\n * name: 'somePlugin',\n * init: functtion() {\n * this._super();\n * },\n * register: function() {\n * return {\n * 'doSomething': this.doSomething_exported\n * }\n * }\n * doSomething_exported: function() {\n * return\n * }\n * }); \n * ...\n * var instance = new SomeClass(param1, param2, ..., paramN, {plugins: [new SomePlugin()] });\n */\n register: function (context) {\n this.bind('classInit', this.afterClassInit);\n return {}\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Метод, который будет вызван после инициализации расширяемого объекта. \n * @param {object} context - расширяемый объект\n * @method WebAccess.Plugin.afterMainClassInit\n * @since 5.2.0.1100\n * @return {object} свойства и методы которые будут доступны в расшияремом классе\n */\n afterMainClassInit: function(context) {\n return;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n });\n\n})(window.WebAccess);","/// \r\n/// \r\n/// \r\n\r\n/* Заглушка для старых браузеров */\r\nif (typeof window.console == \"undefined\") {\r\n window.console = { log: function () { }, debug: function () { } };\r\n} else if (WA.ENV.browser.name == \"IE\") {\r\n linktoOldconsole = window.console;\r\n window.console = {\r\n log: function (message) {\r\n //linktoOldconsole.log(typeof message)\r\n\r\n if (typeof message == \"string\") {\r\n linktoOldconsole.log(message);\r\n return;\r\n };\r\n\r\n if (typeof message == \"function\") {\r\n linktoOldconsole.log(message.toString());\r\n return;\r\n };\r\n\r\n if (message && typeof message == \"object\" && typeof message['selector'] !== 'undefined') {\r\n linktoOldconsole.log(\"Jquery object: \" + message.selector);\r\n return;\r\n };\r\n\r\n function dir(object) {\r\n for (s in object) {\r\n linktoOldconsole.log(s + \": \" + object[s].toString().trunc(100).split(\"\\n\")[0]);\r\n }\r\n }\r\n try {\r\n linktoOldconsole.log(dir(message));\r\n } catch (E) {\r\n linktoOldconsole.log(message);\r\n }\r\n }, debug: function () { }\r\n };\r\n}\r\n\r\n/* =Main============================================================================================================================================== */\r\nfunction GetWSSParam(Url, IsFirstParam) {\r\n if (Url.toLowerCase().indexOf(\"wss=1\") != -1) {\r\n return (IsFirstParam ? \"?\" : \"&\") + \"wss=1\";\r\n }\r\n return \"\";\r\n}\r\n// Проверяем жива ли сессия по возвращаемой странице.\r\nfunction CheckForLoginPage(res) {\r\n // Если время жизни сессии пользователя завершилось - обновим страницу, чтобы перенаправить пользователя на страницу входа в систему\r\n if (res != null && (('' + res).indexOf(\"LoginTextBox\") != -1 || (typeof res == \"object\" && res.Error && res.Error == \"sLogin\"))) {\r\n WA.services._isSessionAlive(475);\r\n //location.href = '';\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nfunction GetParamInURL(name, url) {\r\n //log.warn('DEPRECATED', \"Function GetParamInURL is obsolete. Use class WebAccess.URL instead\");\r\n return (new WA.URL(url)).getParam(name);\r\n}\r\n\r\nfunction ChangeParamInURL(url, param, value) {\r\n //log.warn('DEPRECATED', \"Function ChangeParamInURL is obsolete. Use class WebAccess.URL instead\");\r\n return (new WA.URL(url)).setParam(param, value).asString();\r\n}\r\n\r\nfunction RemoveParamInURL(url, param) {\r\n //log.warn('DEPRECATED', \"Function RemoveParamInURL is obsolete. Use class WebAccess.URL instead\");\r\n return (new WA.URL(url)).removeParam(param).asString();\r\n}\r\n\r\nfunction PrepareUrl(url, ParamStr) {\r\n var Params = ParamStr.split('&');\r\n var newUrl = url;\r\n for (var i = 0; i < Params.length; i++) {\r\n if (Params[i] != '') {\r\n if (Params[i].charAt(0) == '-') {\r\n newUrl = RemoveParamInURL(newUrl, Params[i].substr(1));\r\n } else {\r\n var p = Params[i].split('=');\r\n newUrl = ChangeParamInURL(newUrl, p[0], p[1]);\r\n }\r\n }\r\n }\r\n return newUrl;\r\n}\r\nfunction DoAction(ParamStr, NeedSubmitForm, NewFormAction, InHash) {\r\n setTimeout(function () {\r\n try {\r\n var Params = ParamStr.split('&');\r\n\r\n if (NeedSubmitForm) {\r\n for (var i = 0; i < Params.length; i++) {\r\n if (Params[i] != '') {\r\n if (Params[i].charAt(0) == '-') {\r\n $('#' + Params[i].substr(1)).val('');\r\n } else {\r\n var p = Params[i].split('=');\r\n $('#' + p[0]).val(p[1]);\r\n }\r\n }\r\n }\r\n var f = $('form:first');\r\n if (NewFormAction != null) {\r\n f.attr('action', NewFormAction);\r\n }\r\n f.submit();\r\n } else {\r\n var url = window.location.href;\r\n if (InHash != null && InHash) {\r\n url = GetURLHash(url);\r\n }\r\n url = PrepareUrl(url, ParamStr)\r\n\r\n var ActTab = $('#ActiveTab');\r\n if (ActTab.length == 1) {\r\n url = ChangeParamInURL(url, 'ActiveTab', ActTab.val());\r\n }\r\n\r\n if (InHash != null && InHash) {\r\n url = GetURLWithoutHash() + \"#\" + url;\r\n }\r\n if (!InHash && ParamStr.indexOf('#') == -1) {\r\n url = GetURLWithoutHash(url);\r\n }\r\n window.location.href = url;\r\n }\r\n } catch (ex) {\r\n }\r\n }, 100);\r\n}\r\n\r\nfunction GetURLHash(url) {\r\n log.warn('DEPRECATED', \"Function GetURLHash is obsolete. Use class WebAccess.URL instead\");\r\n return (new WA.URL(url)).getHash();\r\n}\r\n\r\nfunction GetURLWithoutHash(url) {\r\n log.warn('DEPRECATED', \"Function GetURLWithoutHash is obsolete. Use class WebAccess.URL instead\");\r\n return (new WA.URL(url)).asStringWithoutHash();\r\n}\r\n\r\nfunction DoActionHash(ParamStr, callback) {\r\n DoAction(ParamStr, false, false, true);\r\n callback();\r\n}\r\n\r\nfunction ReloadExtension(ext) {\r\n log.warn('DEPRECATED', \"Function ReloadExtension is obsolete. Use class WebAccess.extensions.current.reload() instead\");\r\n ShowTopSpinner(L('MSG_RELOADING_EXTENSION'));\r\n CallService(\"/Administration.asmx/ReloadExtension\", { ExtensionName: ext }, function (res) {\r\n if (res.Success) {\r\n HideTopSpinner('', 0);\r\n ShowMessage(L('MSG_EXT_RELOADED'), L('SUCCESS'), function () { location.href = location.href; });\r\n } else {\r\n ShowError(res.Error);\r\n }\r\n });\r\n}\r\n\r\nfunction HintShow(msg) {\r\n ErrorShow(msg, false);\r\n}\r\nfunction WrnShow(msg) {\r\n ErrorShow(msg, true);\r\n}\r\n\r\nvar g_prevFormVal;\r\n\r\nfunction SerializeForm(containerSelector) {\r\n if (WA.isMobile() || !WA.CR.form.isExist()) {\r\n return __legacy_serializeForm(containerSelector);\r\n } else {\r\n return WA.CR.form.asString();\r\n }\r\n}\r\n\r\nfunction __legacy_serializeForm(containerSelector) {\r\n var jContainer;\r\n\r\n if (containerSelector) {\r\n jContainer = $(containerSelector);\r\n } else {\r\n jContainer = $('body');\r\n }\r\n\r\n var r = '';\r\n var cardForm = jContainer.find('.CardForm');\r\n if (cardForm.length == 0) {\r\n r = jContainer.find('input[type=text]:visible,input[type=checkbox]:visible,input[type=radio]:visible,select:visible,textarea:visible');\r\n } else {\r\n // На скрытых вкладках тоже ищем.\r\n r = cardForm.find('input[type=text],input[type=checkbox],input[type=radio],select,textarea');\r\n }\r\n //Добавляем скрытые поля и ИД реквизита \"Выбор из справочника\" для инпутов, которые видимы.\r\n var hidd = jContainer.find('input[id^=hSelID_]').filter(function () {\r\n var dispInp = $('#' + $(this).attr('name'));\r\n if (cardForm.length == 0) {\r\n dispInp = dispInp.filter(':visible');\r\n }\r\n return dispInp.length > 0;\r\n });\r\n r = r.serialize() + '&' + hidd.serialize();\r\n\r\n //Добавляем информацию о вложениях для ЗЗУ\r\n var jAttachments = $('#main_container').find('.attachments_td');\r\n if (jAttachments.find('#pnlEmpty').length == 0) {\r\n var AttachmentStr = [];\r\n jAttachments.find('[data-name=\"ObjectListItem\"]').each(function () {\r\n var kind = $(this).attr(\"kind\");\r\n var additionalAttachmentInfo = \"\";\r\n if (kind === 'Ref') {\r\n additionalAttachmentInfo = \"_\" + $(this).attr(\"compcode\");\r\n }\r\n AttachmentStr.push(kind + \"_\" + $(this).attr(\"id\") + additionalAttachmentInfo);\r\n })\r\n r += '&Attachments=' + AttachmentStr.join(';');\r\n }\r\n return r;\r\n}\r\n\r\nvar g_formContainerSelector;\r\nfunction BindBeforeUnload() {\r\n var containerSelector = g_formContainerSelector; // для сужения области мониторинга изменений (например, в ЗЗУ галочка во вложениях тоже попадается) (#100264).\r\n var initDef;\r\n\r\n // В мобильной версии нет Form, поэтому этот механихм должен работать и отсылки на WA.Init.\r\n if (WA.isMobile()) {\r\n initDef = $.Deferred();\r\n initDef.resolve();\r\n } else {\r\n initDef = WA.Init;\r\n }\r\n\r\n initDef.done(function () {\r\n g_prevFormVal = SerializeForm(containerSelector);\r\n\r\n WA.CR.window.bind('beforeClose', function () {\r\n if ((SerializeForm(containerSelector) != g_prevFormVal) || (g_RightsChanged == 1)) {\r\n return L('DATA_DIDNT_SAVE');\r\n }\r\n return false;\r\n });\r\n });\r\n}\r\nfunction UnbindBeforeUnload() {\r\n WA.CR.window.unbind('beforeClose');\r\n}\r\nfunction CloseWindow() {\r\n WA.CR.window.close();\r\n}\r\n\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Задания=========================================================================================================================================== */\r\nfunction ShowJobCard() {\r\n DoAction('view=JobCard&-op&-val', false);\r\n}\r\nfunction ShowJobAttachments() {\r\n DoAction('view=attach&-op&-val', false);\r\n}\r\nfunction ShowJobState() {\r\n DoAction('view=state&-op&-val', false);\r\n}\r\nfunction GetJobEdit() {\r\n var mode = GetParamInURL(\"mode\");\r\n if (mode.toLowerCase() == \"edit\") {\r\n //Шамов А.: Сделано для оптимизации. Если режим не указан, в серверном коде будет отправлен запрос для получения типа задания,\r\n // он нам нужен что бы задания-контроль всегда открывать заблокированными.\r\n if (WA.current.Kind === JOB_KIND.CONTROLJOB) {\r\n DoAction(\"-mode\", false);\r\n } else {\r\n DoAction(\"mode=read\", false);\r\n }\r\n } else {\r\n DoAction(\"mode=edit\", false);\r\n }\r\n}\r\nfunction SaveInBaseJob(needToClose) {\r\n UnbindBeforeUnload();\r\n if (needToClose)\r\n DoAction('__POSTBACK_ACTION=SaveAndCloseJob', true);\r\n else\r\n DoAction('__POSTBACK_ACTION=SaveTextJob', true);\r\n}\r\n\r\nfunction SetJobApproveParams() {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=SaveAskParams', true);\r\n}\r\nfunction CancelSetJobApproveParams() {\r\n DoAction('view=JobCard&-op&-mode&-val', false);\r\n}\r\nfunction BaseAcceptContolJob(r) {\r\n if (r != null) {\r\n $(\"#__RESULT_VAR\").val(r);\r\n }\r\n DoAction('__POSTBACK_ACTION=AcceptWf', true);\r\n}\r\nfunction ResumeContolJob() {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=ResumeWf', true);\r\n}\r\n\r\nfunction CreateJobSubTask() {\r\n window.open(PrepareUrl(location.href, 'view=JobCard&op=newsubtask'));\r\n}\r\nfunction CloseBaseJobWindow(jobId) {\r\n window.onunload = function () { FreeJob(jobId); }\r\n}\r\nfunction FreeJob(JobID) {\r\n var R;\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/Job.asmx/FreeJob\" + WSSParam,\r\n data: \"{'JobID':'\" + JobID + \"'}\",\r\n async: false,\r\n success: function (res) {\r\n R = res.d;\r\n }\r\n });\r\n CheckForLoginPage(R);\r\n return R;\r\n}\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Задача============================================================================================================================================ */\r\nfunction ShowTaskCard() {\r\n DoAction('-view&-op&-showall', false);\r\n}\r\nfunction ShowAttachments() {\r\n DoAction('view=attach&-op&-showall', false);\r\n}\r\nfunction ShowState() {\r\n DoAction('view=state&-op&-showall', false);\r\n}\r\nfunction ShowTaskHistory() {\r\n DoAction('view=TaskHistory&-op&-ver&-showall', false);\r\n}\r\n\r\nfunction StartTask() {\r\n\r\n if (!$(\"div[name='StartTask']\").hasClass(\"disabled\")) {\r\n // После клика на кнопку \"Старт\" лочим тулбар.\r\n $(\"#toolbar_container\").find(\".toolbar_item\").addClass(\"disabled\");\r\n\r\n var dateInput = $('.dateField').first();\r\n // проверку на корректность даты не делаем т.к. в SetValidDate устанавливается всегда валидная дата при любом изменени поля для даты\r\n if (dateInput.length > 0 && (typeof dateInput.data('selDate')) != 'undefined' && dateInput.data('selDate') != null) {\r\n var d = dateInput.data('selDate');\r\n // если в поле ввода нет пробела, то срок выполнения ставим на конец суток, чтобы корректно сравнивать с актуальной датой\r\n if (dateInput.val().indexOf(' ') == -1) {\r\n d.setHours(23);\r\n d.setMinutes(59);\r\n d.setSeconds(59);\r\n }\r\n var difference = ($.now() - d.getTime());\r\n if (difference > 0) {\r\n ShowTaskDeadlineActualizeDialog(\r\n function () { $(\"#toolbar_container\").find(\".toolbar_item\").removeClass(\"disabled\"); }\r\n );\r\n }\r\n else {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=StartTask', true);\r\n }\r\n }\r\n else {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=StartTask', true);\r\n }\r\n }\r\n}\r\n\r\nfunction AbortTask() {\r\n DoAction('__POSTBACK_ACTION=AbortTask', true);\r\n}\r\nfunction RestartTask() {\r\n DoAction('__POSTBACK_ACTION=RestartTask', true);\r\n}\r\nfunction RestoreTask() {\r\n DoAction('__POSTBACK_ACTION=RestoreTask', true);\r\n}\r\nfunction EnterEditMode() {\r\n var mode = GetParamInURL(\"mode\");\r\n if (mode.toLowerCase() == \"edit\") {\r\n DoAction(\"mode=read\", false);\r\n }\r\n else {\r\n DoAction(\"mode=edit\", false);\r\n }\r\n}\r\nfunction SaveInTask() {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=SaveTask', true);\r\n}\r\nfunction SaveAndCloseTask() {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=SaveAndCloseTask', true);\r\n}\r\nfunction CreateSubTask() {\r\n window.open(PrepareUrl(location.href, 'mode=newsubtask&-view&-op&-showall'));\r\n}\r\nfunction DoImportance(el, val, css) {\r\n UnbindBeforeUnload();\r\n MakeRequestImportance(GetParamInURL('id'), val, function (res) {\r\n if (res.d) {\r\n if ($(el).hasClass(css)) {\r\n $(el).removeClass(css);\r\n } else {\r\n $(el).addClass(css);\r\n }\r\n if (val == 'High') {\r\n $(el).next().removeClass(css);\r\n } else if (val = 'Low') {\r\n $(el).prev().removeClass(css);\r\n }\r\n }\r\n });\r\n}\r\nfunction MakeRequestImportance(TaskID, Value, CallbackFunc) {\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/Task.asmx/DoImportance\" + WSSParam,\r\n data: \"{'TaskID':'\" + TaskID + \"', 'Value':'\" + Value + \"'}\",\r\n success: function (res) {\r\n if (!CheckForLoginPage(res.d)) {\r\n CallbackFunc(res);\r\n }\r\n }\r\n });\r\n}\r\nfunction BaseChangeStandartRoute(el, css) {\r\n if (!$(el).hasClass(css)) {\r\n DoAction('op=ChangeRoute', false);\r\n } else {\r\n ShowTaskCard();\r\n }\r\n}\r\nfunction LoadRouteParams(route_id) {\r\n DoAction('__POSTBACK_ACTION=ChangeSelRoute', true);\r\n}\r\nfunction StandartRouteSelected() {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=SaveAskParams', true, RemoveParamInURL($('form:first').attr('action'), 'isNew'));\r\n}\r\nfunction BaseCancelStandartRoute(callback) {\r\n UnbindBeforeUnload();\r\n if (GetParamInURL('isNew') == '1') {\r\n callback();\r\n } else {\r\n DoAction('__POSTBACK_ACTION=ClearSelRoute', true);\r\n }\r\n}\r\nfunction CloseBaseTaskWindow(taskId) {\r\n window.onunload = function () { FreeTask(taskId); }\r\n}\r\nfunction FreeTask(TaskID) {\r\n var R;\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/Task.asmx/FreeTask\" + WSSParam,\r\n data: \"{'TaskID':'\" + TaskID + \"'}\",\r\n async: false,\r\n success: function (res) {\r\n R = res.d;\r\n }\r\n });\r\n CheckForLoginPage(R);\r\n return R;\r\n}\r\n\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Документ========================================================================================================================================== */\r\n//Панель представлений.\r\nfunction ShowEDocCard() {\r\n DoAction('view=ShowEDoc&-op&-ver&-showall', false);\r\n}\r\nfunction ShowVersionList() {\r\n DoAction('view=ShowVerList&-op&-ver&-showall', false);\r\n}\r\nfunction ShowRightsList() {\r\n DoAction('view=RightsList&-op&-ver&-showall', false);\r\n}\r\nfunction ShowSignInfo() {\r\n DoAction('view=SignInfoEDoc&-op&-ver&-showall', false);\r\n}\r\nfunction ShowBoundEDocs() {\r\n DoAction('view=BoundEDocs&-op&-ver&-showall', false);\r\n}\r\nfunction ShowEDocHistory() {\r\n DoAction('view=EDocHistory&-op&-ver&-showall', false);\r\n}\r\nfunction ShowEDocPreview() {\r\n DoAction('view=EDocPreview&-op&-ver&-showall', false);\r\n}\r\n// Тулбар\r\nfunction EditModeForEDoc() {\r\n var mode = GetParamInURL(\"mode\");\r\n if (mode.toLowerCase() == \"edit\" || mode.toLowerCase() == \"new\") {\r\n DoAction(\"mode=read\", false);\r\n } else {\r\n DoAction(\"mode=edit\", false);\r\n }\r\n}\r\n\r\n/**\r\n* Обновляет родительское окно.\r\n* @global\r\n* @function UpdateOpenerWindow\r\n* @deprecated\r\n*/\r\n\r\n/**\r\n* Обновляет родительское окно при закрытии текущего.\r\n* @global\r\n* @function UpdateOpenerWindowOnClose\r\n* @deprecated\r\n*/\r\n\r\nfunction SaveInDoc(callback) {\r\n //UnbindBeforeUnload();\r\n ShowTopSpinner(L('EDOC_SAVING'));\r\n\r\n var isNeedAddInAttachments = false;\r\n\r\n var data = { DocumentID: parseInt(GetParamInURL('id'), 10), Password: '', EncryptionKey: '' };\r\n data.receiverObjectLink = null;\r\n var currentUrl = new WA.URL();\r\n if (currentUrl.getParam('mode').toLowerCase() === 'new') {\r\n if (currentUrl.getParam('cwid') != '') {\r\n var type = currentUrl.getParam('cwtype') === 'task' ? OBJECT_TYPE.TASK : OBJECT_TYPE.JOB;\r\n data.receiverObjectLink = new WA.Link(parseInt(currentUrl.getParam('cwid'), 10), type);\r\n isNeedAddInAttachments = true;\r\n } else {\r\n if (GetParamInURL('folder') != '') {\r\n data.receiverObjectLink = new WA.Link(parseInt(currentUrl.getParam('folder'), 10), OBJECT_TYPE.FOLDER);\r\n }\r\n }\r\n }\r\n var view = GetParamInURL('view');\r\n switch (view.toUpperCase()) {\r\n case \"RIGHTSLIST\":\r\n SaveRights(function (res) {\r\n if (res.Success) {\r\n save_ok();\r\n } else {\r\n save_fail(res.Error);\r\n }\r\n });\r\n break;\r\n case \"\":\r\n case \"SHOWEDOC\":\r\n case \"CARD\":\r\n WA.CR.form.saveAndAttach(function (ok, warningMessage) {\r\n if (ok) save_ok(warningMessage);\r\n else save_fail();\r\n }, true, data.receiverObjectLink);\r\n break;\r\n case \"SHOWVERLIST\":\r\n var edocid = WA.current.ID;\r\n var stage = $('.State_Table').find('input[id$=\"EdocLifeStage\"]').val();\r\n WA.SRV.call(\"/EDocument.asmx/ChangeEdocLifeStage\", {\r\n EDocID: edocid,\r\n Stage: stage\r\n }).done(function (model) {\r\n save_ok();\r\n }).fail(function (error) {\r\n save_fail(error);\r\n });\r\n break;\r\n default:\r\n save(data);\r\n }\r\n\r\n function save_ok(warningMessage) {\r\n if (WA.CMP.NTF.InlineHint) {\r\n WA.CMP.NTF.InlineHint.hideAll();\r\n if (warningMessage) WA.CR.inlineHint.showWarning(warningMessage);\r\n }\r\n\r\n WA.CR.window.reloadParentWindowOnClose();\r\n\r\n if (window.opener) {\r\n try {\r\n // Вставка ссылки на документ во вложения.\r\n if (isNeedAddInAttachments && (window.opener.WA.getLocation() === 'task' || window.opener.WA.getLocation() === 'job')) {\r\n window.opener.AddAttachment(new WA.Link(WA.CR.ID, OBJECT_TYPE.EDOCUMENT));\r\n }\r\n if (window.opener.NeedUpdateOnChildClose) {\r\n // хак для обновления проводника, потому что карточка документа создается из эксплорера из айфрейма. поэтому здесь window.parent - пустой и нельзя у него вызвать ReloadExplorer\r\n //window.open(\"javascript:void(0)\", \"explorer\").location = window.open(\"javascript:void(0)\", \"explorer\").location;\r\n this.focus();\r\n }\r\n }\r\n catch (e) { }\r\n }\r\n\r\n function CallbackOrAction() {\r\n if (callback) callback();\r\n else {\r\n UnbindBeforeUnload(); // отключаем проверку когда уже все нормально сохранилось\r\n DoAction('mode=edit', false);\r\n }\r\n }\r\n\r\n if (GetParamInURL('mode').toLowerCase() == 'new') {\r\n if ($('html').hasClass('mobile')) {\r\n var id = GetParamInURL('id');\r\n var f = $(\"form:first\");\r\n var url = f.attr('action');\r\n url = ChangeParamInURL(url, 'view', 'Card');\r\n url = ChangeParamInURL(url, 'id', id);\r\n url = RemoveParamInURL(url, 'mode');\r\n f.attr('action', url);\r\n f.submit();\r\n }\r\n else {\r\n ShowSetDocumentRightsDialog(CallbackOrAction);\r\n }\r\n }\r\n else {\r\n CallbackOrAction();\r\n }\r\n }\r\n\r\n function save_fail(err) {\r\n HideTopSpinner();\r\n if (err) {\r\n ErrorShow(err, true);\r\n }\r\n }\r\n\r\n function save(data) {\r\n CallService(\"/Document.asmx/Save\", data, function (res) {\r\n if (!res.Success) {\r\n save_fail(res.Error);\r\n } else {\r\n HideTopSpinner();\r\n HideTopSpinner(L(\"EDOC_SAVE_COMPLETE\"), 2000);\r\n save_ok();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction SaveWithEncoding(save, data) {\r\n var passwordChkbox = $('#EncryptWithPasswordCheckBox');\r\n var certChkBox = $('#EncryptWithCertCheckBox');\r\n var onError = function (error) { certChkBox.attr('checked', true); passwordChkbox.data('password', null); HideTopSpinner(); ShowError(error); };\r\n data.EncryptionKey = '';\r\n if (passwordChkbox.is(':checked') && !!!passwordChkbox.data('password') && passwordChkbox.data('password') != \"\") {\r\n var dialog = RequestPasswordForDecryption('', function (password) {\r\n data.Password = password;\r\n if (WA.Document.Encoding % 2 == 1) {\r\n //FIXME: переделать на WA.agent.getDocumentDecryptionKey\r\n GetEncryptionKeyForDoc(WA.Document.ID, WA.Document.Encoding, WA.Document.PluginName, password, function (encryptionKey) {\r\n data.EncryptionKey = encryptionKey;\r\n save(data);\r\n }, onError);\r\n return;\r\n }\r\n save(data);\r\n });\r\n if (!!dialog) dialog.cancel = dialog.onClose = function () { ShowTopSpinner('', true).stop(); };\r\n return;\r\n }\r\n if (!!passwordChkbox.data('password') && passwordChkbox.data('password') != '') data.Password = passwordChkbox.data('password');\r\n if (WA.Document.Encoding % 2 == 1) {\r\n //FIXME: переделать на WA.agent.getDocumentDecryptionKey\r\n GetEncryptionKeyForDoc(WA.Document.ID, WA.Document.Encoding, WA.Document.PluginName, data.Password, function (encryptionKey) {\r\n data.EncryptionKey = encryptionKey;\r\n save(data);\r\n }, onError);\r\n return;\r\n }\r\n save(data);\r\n}\r\n\r\nfunction GetEncryptionKeyForDoc(docID, encoding, pluginName, password, onSuccess, onError) {\r\n RequestToken(TOKEN_OPERATION.DOWNLOAD_DOCUMENT_BODY, function (token) {\r\n WebAccess.agent.transmitRequest(\"getdocdecryptedkey\", \"edmsplugin\",\r\n {\r\n \"DocID\": docID,\r\n \"Version\": 0,\r\n \"Token\": token,\r\n \"EncodeType\": encoding,\r\n \"EncryptionPluginName\": pluginName,\r\n \"Password\": password\r\n }).done(function (response) {\r\n if (onSuccess) { onSuccess(response.result); }\r\n }).fail(function (response) {\r\n if (onError) onError(response.message);\r\n });\r\n }, docID, 0);\r\n}\r\n\r\nfunction SaveRights(callback, error) {\r\n var src = $('#__SELECTED_USERS').val();\r\n var res = [];\r\n var rightsJson = '';\r\n var rightsChanged = false;\r\n\r\n //Проверка наличия полных прав\r\n if (!IsRightsListValid()) {\r\n HideTopSpinner();\r\n return ShowInfo(L(\"WARN_EMPRY_RIGHTS_ISNOT_VALID\"));\r\n }\r\n\r\n var currentRights = $('#__CURRENT_USERS_RIGHTS');\r\n if (!!!currentRights.data('changed') || currentRights.data('changed') == '0') currentRights.data('changed', CheckRightsHaveChanged(currentRights.val(), src) ? '1' : '0');\r\n var newEcoding = GetDocNewEncoding($('#EncryptWithPasswordCheckBox'), $('#EncryptWithCertCheckBox'));\r\n\r\n if (currentRights.data('changed') == '1' || (newEcoding > 0 && src.indexOf('g_') != -1)) {\r\n var rightRecords = src.split(';');\r\n for (var i = 0; i < rightRecords.length; i++) {\r\n var rec = $.trim(rightRecords[i]);\r\n if (rec) {\r\n var parts = rec.split('-');\r\n var id = parts[0];\r\n var right = [16, 8, 4][parseInt(parts[1], 10)]; // 0 -> 16 (full), 1 -> 8 (change), 2 -> 4 (view)\r\n var isGroup = false;\r\n if (id.indexOf('g_') == 0) {\r\n id = id.substr(2);\r\n if (newEcoding == 0) {\r\n isGroup = true;\r\n }\r\n else {\r\n RequestActionWithGroup(id, parts[1], function () { SaveRights(callback, error); });\r\n return;\r\n }\r\n }\r\n res.push({ UserID: +id, IsGroup: isGroup, RightType: right });\r\n }\r\n }\r\n rightsJson = $.toJSON(res);\r\n rightsChanged = true;\r\n }\r\n var rightsDelegationSetting = GetRightsDelegationSettingValue();\r\n var rightsDelegationInitVal = $('#RightsDelegationCheckBox').data('initval') == 1;\r\n var rightsDelegationChanged = rightsDelegationSetting != rightsDelegationInitVal;\r\n SetEncryptionForDocument({ RightsJSON: rightsJson, RightsDelegationTurnedOn: rightsDelegationSetting }, rightsChanged || rightsDelegationChanged, callback);\r\n}\r\n\r\nfunction RequestActionWithGroup(groupID, accessLevel, onActionSelected) {\r\n var actions = [L('ADD_GROUP_AND_SUBGROUPS_USERS'), L('ADD_GROUP_USERS_ONLY'), L('REMOVE_GROUP_FROM_ACCESS_RIGHTS')];\r\n var html = '
' + L('CANNOT_USE_USERGROUPS_WITH_ENCRYPTION') + '
';\r\n html += '
';\r\n html += '
';\r\n html += '
' + L('LOCAL_COPY_OPTIONS') + '
';\r\n html += '
';\r\n for (var i = 0; i < actions.length; i++) {\r\n var needCheck = (i == 0);\r\n html += '
'\r\n + ''\r\n + '
';\r\n }\r\n html += '
';\r\n\r\n var mbox = new WA.CMP.dialogs.MessageBox();\r\n mbox.width = 450;\r\n mbox\r\n .okCancelButtons(function () {\r\n var opcode = $('#actionOptions').find('input:checked').attr('opcode');\r\n switch (opcode) {\r\n case \"0\": OpenUpUserGroup(groupID, accessLevel, true, onActionSelected); break;\r\n case \"1\": OpenUpUserGroup(groupID, accessLevel, false, onActionSelected); break;\r\n case \"2\":\r\n $('tr#current_g_' + groupID + ',tr#new_g_' + groupID).find('.rights-table__delete-row').click();\r\n if (onActionSelected) onActionSelected();\r\n break;\r\n }\r\n }, function () { HideTopSpinner(); });\r\n var groupName = $('tr#current_g_' + groupID + ',tr#new_g_' + groupID).children('.Rights_Table_td').children().text();\r\n mbox.showQuestion(L('ADD_GROUP_USERS_TO_ENCODED_OBJECT_RIGHTS', groupName), html);\r\n}\r\n\r\nfunction OpenUpUserGroup(groupID, accessLevel, needOpenSubgroups, onGroupOpened) {\r\n WA.SRV.call('/UserList.asmx/GetUsersInGroup', { 'GroupID': groupID, 'NeedProcessSubGroups': needOpenSubgroups, 'RenderItems': true })//'ObjectID': WA.current.ID, 'ObjectType': 1, 'Filtrator': '' })\r\n .success(function (items) {\r\n for (var i = 0; i < items.length; i++) {\r\n var item = items[i];\r\n if (AddUserByDiv($(item.text)[0])) {\r\n // устанавливаем нужные права только у добавленных пользователей\r\n $('tr#current_' + item.id + ',tr#new_' + item.id).children('.rights-table__column_current-rights').find('[name=' + accessLevel + ']').click();\r\n }\r\n }\r\n // удаляем группу из таблицы\r\n $('tr#current_g_' + groupID + ',tr#new_g_' + groupID).find('.rights-table__delete-row').click();\r\n if (onGroupOpened) onGroupOpened();\r\n })\r\n .fail(function (error) {\r\n var severity = (error.Severity !== \"-1\" ? Number(error.Severity) : undefined);\r\n WA.CR.inlineHint.show(error, undefined, severity);\r\n });\r\n}\r\n\r\nfunction GetRightsDelegationSettingValue() {\r\n var RightsDelegationCheckBoxVal = false;\r\n var RightsDelegationCheckBox = $('#RightsDelegationCheckBox');\r\n if (RightsDelegationCheckBox.length) { RightsDelegationCheckBoxVal = RightsDelegationCheckBox.is(':checked'); }\r\n return RightsDelegationCheckBoxVal;\r\n}\r\n\r\nfunction CheckRightsHaveChanged(oldValue, newValue) {\r\n if (oldValue.length != newValue.length) return true;\r\n if (oldValue[oldValue.length - 1] == ';') oldValue = oldValue.substr(0, oldValue.length - 1);\r\n if (newValue[newValue.length - 1] == ';') newValue = newValue.substr(0, newValue.length - 1);\r\n if (oldValue.split(';').sort().join(';') != newValue.split(';').sort().join(';')) return true;\r\n return false;\r\n}\r\n\r\nfunction SetEncryptionForDocument(RightsObject, RightsChanged, OnEncryptionSet) {\r\n var passwordCheckBox = $('#EncryptWithPasswordCheckBox');\r\n var certCheckBox = $('#EncryptWithCertCheckBox');\r\n var password = !!passwordCheckBox.data('password') ? passwordCheckBox.data('password') : '';\r\n var currentEncoding = WA.Document.Encoding;\r\n var newEncoding = GetDocNewEncoding(passwordCheckBox, certCheckBox);\r\n var encryptionKey = \"\";\r\n if (currentEncoding != newEncoding || RightsChanged) {\r\n RightsObject.EncodingType = newEncoding;\r\n RightsObject.Password = password;\r\n SaveWithEncoding(function (res) {\r\n RequestSetEncryption(currentEncoding, res, OnEncryptionSet);\r\n }, RightsObject);\r\n return;\r\n }\r\n if (OnEncryptionSet) OnEncryptionSet({ Success: true, EncodingChanged: RightsChanged });\r\n}\r\n\r\nfunction RequestSetEncryption(currentEncoding, RightsObject, OnEncryptionSet) {\r\n RightsObject.DocumentID = WA.Document.ID;\r\n WA.services.call(\"/Document.asmx/SetEncryption\", RightsObject) //{ \"DocumentID\": WA.Document.ID, \"EncodingType\": newEncoding, \"Password\": password, \"EncryptionKey\": encryptionKey })\r\n .success(\r\n function (res) {\r\n //WA.current.toolBar.buttons.ChangeDocPassword.enable();\r\n var encChanged = (WA.Document.Encoding != RightsObject.EncodingType && $('#__CURRENT_USERS_RIGHTS').data('changed') == '1');\r\n WA.Document.Encoding = RightsObject.EncodingType;\r\n HideTopSpinner(L(\"EDOC_SAVE_COMPLETE\"), 2000);\r\n if (OnEncryptionSet) OnEncryptionSet({ Success: true, EncodingChanged: encChanged });\r\n })\r\n .fail(\r\n function (res) {\r\n var passwordCheckBox = $('#EncryptWithPasswordCheckBox');\r\n passwordCheckBox.data('password', null);\r\n if (currentEncoding < 2) passwordCheckBox.removeAttr(\"checked\");\r\n else passwordCheckBox.attr('checked', true);\r\n if (currentEncoding % 2 == 1) $('#EncryptWithCertCheckBox').attr(\"checked\");\r\n else $('#EncryptWithCertCheckBox').removeAttr(\"checked\");\r\n if (OnEncryptionSet) OnEncryptionSet({ Success: false, Error: res });\r\n //WA.current.toolBar.buttons.ChangeDocPassword.disable();\r\n });\r\n return;\r\n}\r\n\r\nfunction GetDocNewEncoding(passwordCheckBox, certCheckBox) {\r\n var encoding = 0;\r\n var certEncryptEnabled = certCheckBox.is(':checked');\r\n if (certEncryptEnabled) {\r\n encoding++;\r\n }\r\n if (passwordCheckBox.is(':checked')) {\r\n encoding = 2;\r\n if (certEncryptEnabled) {\r\n encoding++;\r\n }\r\n }\r\n return encoding;\r\n}\r\n\r\nfunction ChangeTabDoc(tabName) {\r\n function ChangeTab() {\r\n ShowTopSpinner(L(\"PLEASE_WAIT\"), false);\r\n if (tabName == \"close\") {\r\n SaveInDoc(function () {\r\n CloseDocWindow(L(\"DATA_DIDNT_SAVE\"), GetParamInURL(\"id\"));\r\n });\r\n } else {\r\n var mode = GetParamInURL(\"mode\").toLowerCase();\r\n if (mode == \"export\" || mode == \"explock\" || mode == \"editlock\") { // если мы попали сюда при неудачной попытке экспорта, то уберем mode\r\n DoAction('view=' + tabName + '&-op&-val&-ver&-ShowAll&-mode', false);\r\n } else {\r\n DoAction('view=' + tabName + '&-op&-val&-ver&-ShowAll', false);\r\n }\r\n }\r\n }\r\n\r\n ChangeTab();\r\n}\r\nfunction UndoEDoc() {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=UndoEDoc', true);\r\n}\r\n\r\nfunction SaveAndCloseEDoc() {\r\n UnbindBeforeUnload();\r\n SaveInDoc(function () {\r\n CloseDocWindow(L(\"DATA_DIDNT_SAVE\"), GetParamInURL(\"id\"));\r\n clearTimeout(window.opener.timeoutHandler);\r\n });\r\n}\r\n\r\n// Блокировка/разблокировка документа (в тулбаре).\r\nfunction LockUnlock() {\r\n\r\n var EDocID = GetParamInURL(\"id\");\r\n var isLocked = $(\"#islocked\").val() == \"1\";\r\n var jButton = $(\"[name=LockUnlock]\");\r\n\r\n ShowTopSpinner(!isLocked ? L(\"EDOC_LOCKING\") : L(\"EDOC_UNLOCKING\"));\r\n\r\n CallService(isLocked ? \"/Document.asmx/Unlock\" : \"/Document.asmx/Lock\", { DocumentID: EDocID, UseGlobalLock: false }, function (result) {\r\n if (result.Success) {\r\n var toastMsg = new WA.CMP.notifications.Toast();\r\n var jIsLocked = $(\"#islocked\");\r\n\r\n if ($(\"#islocked\").val() == \"0\") {\r\n jButton.find(\"use\").attr(\"xlink:href\", \"#documentUnblock-20\");\r\n jButton.find(\".toolbar-item__title\").html(L(\"TOOLBAR_UNLOCK_EDOC\"));\r\n jIsLocked.val(1);\r\n toastMsg.showSuccess(L(\"DOC_SUCCESS_LOCK\"));\r\n } else {\r\n jButton.find(\"use\").attr(\"xlink:href\", \"#documentBlock-20\");\r\n jButton.find(\".toolbar-item__title\").html(L(\"TOOLBAR_LOCK_EDOC\"));\r\n jIsLocked.val(0);\r\n toastMsg.showSuccess(L(\"DOC_SUCCESS_UNLOCK\"));\r\n WA.CR.inlineHint.hide();\r\n }\r\n HideTopSpinner('', 0);\r\n\r\n window.location.href = ChangeParamInURL(window.location.href, \"Parent\", \"Doc\");\r\n //$(\"form:first\").submit();\r\n } else {\r\n ErrorShow(result.Error, false);\r\n HideTopSpinner('', 0);\r\n }\r\n }, function (_1, _2, err) {\r\n ErrorShow(err, true);\r\n HideTopSpinner('', 0);\r\n });\r\n\r\n //CallService(\"/EDocument.asmx/DocLockUnlock\", { EDocID: EDocID, Lock: !isLocked }, function (result) {\r\n // if (result.Success) {\r\n // if ($(\"#islocked\").val() == \"1\") {\r\n // p.addClass(\"Doc/UnlockDocument.png\").removeClass(\"Doc/LockDocument.png\");\r\n // p.next(\"span\").html(L(\"TOOLBAR_UNLOCK_EDOC\"));\r\n // }\r\n\r\n // if ($(\"#islocked\").val() == \"0\") {\r\n // p.addClass(\"Doc/LockDocument.png\").removeClass(\"Doc/UnlockDocument.png\");\r\n // p.next(\"span\").html(L(\"TOOLBAR_LOCK_EDOC\"));\r\n // }\r\n\r\n // window.location.href = ChangeParamInURL(window.location.href, \"Parent\", \"Doc\");\r\n // //$(\"form:first\").submit();\r\n // } else {\r\n // ErrorShow(result.Error, false);\r\n // HideTopSpinner('', 0);\r\n // }\r\n //}, function (_1, _2, err) {\r\n // ErrorShow(err, true);\r\n // HideTopSpinner('', 0);\r\n //});\r\n}\r\nfunction DocSendAsAttachment() {\r\n if (/\\/pda\\//.test(location.pathname))\r\n DoAction('op=SendAsAttach', false);\r\n else\r\n window.open(PrepareUrl(location.href, 'op=SendAsAttach'));\r\n}\r\n// Экспорт\r\nfunction Export(id, selectId, checkedId, inNewWindow) {\r\n UnbindBeforeUnload();\r\n var VerNumber = $(\"#\" + selectId + \" option:selected\").val();\r\n var url;\r\n var WSSParam = GetWSSParam(location.href, false);\r\n if ($(\"#\" + checkedId).is(':checked')) { url = \"/Doc.aspx?ID=\" + id + \"&view=ShowVerList&ver=\" + VerNumber + \"&mode=ExpLock\" + WSSParam; }\r\n else { url = \"/Doc.aspx?ID=\" + id + \"&view=ShowVerList&ver=\" + VerNumber + \"&mode=Export\" + WSSParam; };\r\n if (inNewWindow) {\r\n window.open(url, \"VersionBody\", \"\");\r\n CloseExportDlg();\r\n } else {\r\n location.href = url;\r\n /* Делать нельзя, т.к. валиться IEMobile.\r\n setTimeout('CloseExportDlg()', 1000);*/\r\n }\r\n}\r\nfunction CloseExportDlg() {\r\n UnbindBeforeUnload();\r\n var EDocID = GetParamInURL(\"id\");\r\n FreeEDoc(EDocID);\r\n if (document.referrer.toLowerCase().indexOf(\"explorer.aspx\") != -1) {\r\n window.close();\r\n } else {\r\n var url = window.location.href;\r\n url = RemoveParamInURL(url, \"op\", \"\");\r\n if (\"undefined\" != typeof (GetParamInURL(\"ver\"))) {\r\n url = RemoveParamInURL(url, \"ver\");\r\n }\r\n window.location.href = url;\r\n }\r\n}\r\nfunction ChkExportedVersion(VerList, EDocID, ChkLockID) {\r\n var s_res = {};\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/EDocument.asmx/CheckVersionStateForExport\" + WSSParam,\r\n data: \"{'EDocID':'\" + EDocID + \"', 'VerNum':'\" + VerList.value + \"', 'IsExport':'true'}\",\r\n async: false,\r\n cache: false,\r\n success: function (res) {\r\n if (!CheckForLoginPage(res.d)) {\r\n s_res = res.d;\r\n if (!!s_res.Warning) HintShow(s_res.Warning);\r\n if (s_res.Error != '') { WrnShow(s_res.Error) }\r\n var enableLock = s_res.EnableLock == 'true';\r\n var el = $(\"#\" + ChkLockID);\r\n if (enableLock) {\r\n el.removeAttr('disabled');\r\n } else {\r\n el.attr('disabled', 'disabled').prop('checked', false);\r\n }\r\n }\r\n }\r\n });\r\n}\r\n// Импорт и создание документа\r\nfunction GetImgByExt(ext) {\r\n var R;\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/EDocument.asmx/GetImgByExt\" + WSSParam,\r\n data: \"{'Extension':'\" + ext + \"'}\",\r\n async: false,\r\n cache: false,\r\n success: function (res) {\r\n R = res.d;\r\n }\r\n });\r\n CheckForLoginPage(R);\r\n return R;\r\n}\r\n// Импорт\r\nfunction CloseImportDlg() {\r\n UnbindBeforeUnload();\r\n var EDocID = GetParamInURL(\"id\");\r\n FreeEDoc(EDocID);\r\n if (document.referrer.toLowerCase().indexOf(\"explorer.aspx\") != -1 || GetParamInURL(\"place\").toLowerCase().indexOf(\"explorer\") != -1) {\r\n window.close();\r\n } else {\r\n var url = window.location.href;\r\n url = RemoveParamInURL(url, \"op\", \"\");\r\n if (\"undefined\" != typeof (GetParamInURL(\"ver\"))) {\r\n url = RemoveParamInURL(url, \"ver\");\r\n }\r\n url = RemoveParamInURL(url, \"mode\");\r\n window.location = url;\r\n }\r\n}\r\n// Общие\r\nfunction BaseCloseDocWindow(edocId) {\r\n window.onunload = function () { FreeEDoc(edocId); };\r\n}\r\nfunction FreeEDoc(EDocID) {\r\n var R;\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/EDocument.asmx/FreeEDoc\" + WSSParam,\r\n data: \"{'EDocID':'\" + EDocID + \"'}\",\r\n async: false,\r\n success: function (res) {\r\n R = res.d;\r\n }\r\n });\r\n CheckForLoginPage(R);\r\n return R;\r\n}\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Папки============================================================================================================================================= */\r\nfunction ShowFolderCard() {\r\n DoAction('view=Card&-UpdateExplorer', false);\r\n}\r\nfunction ShowFolderRights() {\r\n DoAction('view=RightsList&-UpdateExplorer', false);\r\n}\r\nfunction UndoFolderCard() {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=Undo&-UpdateExplorer', true);\r\n}\r\nfunction EnterEditMode_FolderCard() {\r\n var mode = GetParamInURL(\"mode\");\r\n if (mode.toLowerCase() == \"edit\") {\r\n DoAction(\"mode=read&-UpdateExplorer\", false);\r\n } else {\r\n DoAction(\"mode=edit&-UpdateExplorer\", false);\r\n }\r\n}\r\n\r\n\r\n\r\nfunction ChangeTabFolder(tabName) {\r\n ShowTopSpinner(L(\"PLEASE_WAIT\"), false);\r\n if (tabName != 'RightsList') {\r\n if (!IsRightsListValid()) {\r\n ErrorShow(L(\"WARN_EMPRY_RIGHTS_ISNOT_VALID\"), true);\r\n } else {\r\n DoAction('view=' + tabName + '&-op&-val&-ver&-ShowAll', false);\r\n }\r\n } else {\r\n DoAction('view=' + tabName + '&-op&-val&-ver&-ShowAll', false);\r\n }\r\n}\r\n\r\nfunction BaseCloseFolderCardWindow(folderId) {\r\n window.onunload = function () { FreeFolder(folderId); }\r\n}\r\nfunction FreeFolder(folderId) {\r\n var R;\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/Folder.asmx/FreeFolder\" + WSSParam,\r\n data: \"{'FolderID':'\" + folderId + \"'}\",\r\n async: false,\r\n success: function (res) {\r\n R = res.d;\r\n }\r\n });\r\n CheckForLoginPage(R);\r\n return R;\r\n}\r\nfunction SaveFolderCard(need_close, noCheckSubObj) {\r\n var FolderKind = $('#hiddctl00_MainContent_ctl00_Kind').val();\r\n var FolderID = WA.CR.ID;\r\n\r\n // В мобильной версии права применять только к папке.\r\n if (WA.isMobile())\r\n noCheckSubObj = true;\r\n\r\n if (!IsRightsListValid()) {\r\n HideTopSpinner();\r\n ErrorShow(L(\"WARN_EMPRY_RIGHTS_ISNOT_VALID\"), true);\r\n return;\r\n } else {\r\n if (!noCheckSubObj && (!WA.isMobile() && WA.CR.sideBar.tabs.current.name === \"RightsList\")) {\r\n var selectedUsers = $('input[name=__SELECTED_USERS]').val();\r\n var currentRights = $('input[name=__CURRENT_USERS_RIGHTS]').val();\r\n\r\n if (selectedUsers !== currentRights) {\r\n if (!checkCurrentUserRights()) {\r\n var dialog = new WA.CMP.dialogs.MessageBox();\r\n\r\n var mainText = L('NO_FOLDER_FULL_RIGHTS')\r\n var additionalText = L('NO_FOLDER_FULL_RIGHTS_ADDITIONAL');\r\n var title = L('WARNING');\r\n\r\n dialog.removeDefaultButtons();\r\n dialog.addButton('Continue', L('PROCEED_SAVING'), function () {\r\n saveRightsByService(FolderID, need_close);\r\n });\r\n dialog.addButton('RestoreRights', L('RESTORE_RIGHTS'), function () {\r\n // Восстанавливаем полные права текущему пользователю\r\n $('input[name=__SELECTED_USERS]').val(selectedUsers + ';' + CurrentUserID + '-0');\r\n saveRightsByService(FolderID, need_close);\r\n });\r\n dialog.addButton('Cancel', L('CANCEL'), function () { });\r\n\r\n dialog.show(mainText, additionalText, title, 'warning');\r\n } else {\r\n saveRightsByService(FolderID, need_close);\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // пошлем запрос на сервер о необходимости задать вопрос пользователю.\r\n if (FolderKind != null && FolderID != \"\") {\r\n // отобразим ожидание.\r\n if (typeof (ShowTopSpinner) != 'undefined') ShowTopSpinner(L(\"PLEASE_WAIT\"));\r\n\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/Folder.asmx/CheckFolderType\" + WSSParam,\r\n data: \"{'FolderID':'\" + FolderID + \"', 'FolderKind':'\" + FolderKind + \"'}\",\r\n cache: false,\r\n success: function (res) {\r\n if (!CheckForLoginPage(res.d)) {\r\n SaveFolderCard_WithQuestions(res.d, need_close);\r\n }\r\n }\r\n });\r\n return;\r\n }\r\n\r\n SaveFolderCard_WithQuestions(null, need_close);\r\n}\r\n\r\nfunction SaveAndCloseFolder() {\r\n SaveFolderCard(true);\r\n}\r\n\r\nfunction SaveFolderCard_WithQuestions(msg, need_close) {\r\n if (typeof (HideTopSpinner) != 'undefined') HideTopSpinner(\"\", 1);\r\n\r\n function ok() {\r\n UnbindBeforeUnload();\r\n DoAction(format('__POSTBACK_ACTION={0}&-UpdateExplorer', need_close ? 'SaveAndClose' : 'Save'), true);\r\n }\r\n\r\n function cancel() {\r\n $('div.saving').hide();\r\n }\r\n\r\n if (msg == null) {\r\n ok();\r\n } else {\r\n ConfirmDialogNew(msg, ok, cancel);\r\n }\r\n}\r\n\r\nfunction saveRightsByService(folderID, needClose) {\r\n // проверим, не пустая ли папка\r\n WA.SRV.call('/Folder.asmx/GetContentCount', { \"FolderID\": folderID }).done(function (res) {\r\n if (res > 0) {\r\n // Если есть вложенные элементы, узнаем, надо ли изменять на них права.\r\n rightsToSubObjectsDialog(needClose);\r\n } else {\r\n SaveFolderCard(needClose, true);\r\n }\r\n });\r\n}\r\n\r\nfunction rightsToSubObjectsDialog(need_close) {\r\n var rightsDialog = new WA.CMP.dialogs.MessageBox();\r\n\r\n var mainText = L('APPLY_ACCESS_RIGHTS_TEXT');\r\n var additionalText = L('APPLY_ACCESS_RIGHTS_LONG_TIME');\r\n var title = L('CONFIRMATION');\r\n\r\n rightsDialog.removeDefaultButtons();\r\n rightsDialog.addButton('ApplyReplace', L('YES'), function () {\r\n applyRights(true);\r\n });\r\n rightsDialog.addButton('ApplyNoRepalce', L('APPLY_ACCESS_RIGHTS_YES_REPLACE'), function () {\r\n applyRights(false);\r\n });\r\n rightsDialog.addButton('NoApply', L('NO'), function () { SaveFolderCard(need_close, true); });\r\n\r\n rightsDialog.show(mainText, additionalText, title, 'question');\r\n\r\n function applyRights(isNeedReplace) {\r\n var selectedUsers = $('input[name=__SELECTED_USERS]').val();\r\n var currentRights = $('input[name=__CURRENT_USERS_RIGHTS]').val();\r\n var wdialog = waitDialog();\r\n\r\n wdialog.show();\r\n WA.SRV.call('/Folder.asmx/ApplyRightsToFolder', {\r\n FolderID: WA.CR.ID,\r\n NewUserRights: selectedUsers,\r\n OldUserRights: currentRights,\r\n NeedReplace: isNeedReplace\r\n }).done(function (res) {\r\n wdialog.close();\r\n resultDialog(res);\r\n }).fail(function (res) {\r\n wdialog.close();\r\n resultDialog(res);\r\n });\r\n };\r\n\r\n function waitDialog() {\r\n var dialog = new WA.CMP.dialogs.BaseDialog();\r\n dialog.removeDefaultButtons();\r\n dialog.removeCloseButton();\r\n dialog.title = L('APPLY_ACCESS_RIGHTS_PROGRESS_TITLE');\r\n dialog.setHtml(format('{0}', L('PLEASE_WAIT_DONT_CLOSE_PAGE')));\r\n\r\n return dialog;\r\n };\r\n\r\n function resultDialog(res) {\r\n var dialog = new WA.CMP.dialogs.MessageBox();\r\n if (res) {\r\n dialog.mainText = L('APPLY_ACCESS_RIGHTS_ERROR')\r\n dialog.additionalText = res;\r\n dialog.onClose = function () {\r\n UnbindBeforeUnload();\r\n window.location.reload();\r\n };\r\n dialog.showError();\r\n } else {\r\n // перезагрузить страницу\r\n UnbindBeforeUnload();\r\n window.location.reload();\r\n }\r\n };\r\n}\r\n\r\n// Проверяет, не забрал ли пользователь полные права у себя\r\nfunction checkCurrentUserRights() {\r\n var selectedUsers = $('input[name=__SELECTED_USERS]').val();\r\n var currentRights = $('input[name=__CURRENT_USERS_RIGHTS]').val();\r\n\r\n var oldRights = parseRightsList(currentRights);\r\n var maxRights = null;\r\n var hasFullRights = false;\r\n\r\n for (var i = 0; i < oldRights.length; i++) {\r\n if (oldRights[i].id == CurrentUserID) {\r\n maxRights = oldRights[i].rightsType;\r\n break;\r\n }\r\n }\r\n\r\n if (maxRights) {\r\n var newRights = parseRightsList(selectedUsers);\r\n for (var i = 0; i < newRights.length; i++) {\r\n if (newRights[i].id == CurrentUserID) {\r\n hasFullRights = true;\r\n break;\r\n }\r\n }\r\n } else {\r\n // Если записи с текущим ИД не найдено, значит права были выданы неявно\r\n hasFullRights = true;\r\n }\r\n\r\n return hasFullRights;\r\n}\r\n\r\nfunction parseRightsList(rights) {\r\n var result = [];\r\n\r\n var rightsArray = rights.split(';');\r\n for (var i = 0; i < rightsArray.length; i++) {\r\n var user = rightsArray[i].split('-');\r\n result.push({ id: user[0], rightsType: user[1] });\r\n }\r\n\r\n return result;\r\n}\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Поиски============================================================================================================================================= */\r\nfunction DisableIsAllCheckboxNotChecked(reqname, el_query) {\r\n var tbl = $('.Search_Table');\r\n // Для глобального поиска надо false, для остальных true\r\n var defaultFlag = true;\r\n if ($(\"#SrchGeneralAreaT\").length > 0 || $(\"#SrchGeneralAreaC\").length > 0 || $(\"#SrchGeneralAreaN\").length > 0\r\n || $(\"#SrchGeneralObjectE\").length > 0 || $(\"#SrchGeneralObjectW\").length > 0 || $(\"#SrchGeneralObjectF\").length > 0)\r\n defaultFlag = false;\r\n\r\n var searchAreaText = $(\"#SrchGeneralAreaT\").length > 0 ? $(\"#SrchGeneralAreaT\")[0].checked : defaultFlag;\r\n var searchAreaCard = $(\"#SrchGeneralAreaC\").length > 0 ? $(\"#SrchGeneralAreaC\")[0].checked : defaultFlag;\r\n var searchAreaName = $(\"#SrchGeneralAreaN\").length > 0 ? $(\"#SrchGeneralAreaN\")[0].checked : defaultFlag;\r\n var searchObjEDocument = $(\"#SrchGeneralObjectE\").length > 0 ? $(\"#SrchGeneralObjectE\")[0].checked : defaultFlag;\r\n var searchObjCustomWork = $(\"#SrchGeneralObjectW\").length > 0 ? $(\"#SrchGeneralObjectW\")[0].checked : defaultFlag;\r\n var searchObjFolder = $(\"#SrchGeneralObjectF\").length > 0 ? $(\"#SrchGeneralObjectF\")[0].checked : defaultFlag;\r\n var $archiveTag = $(\"#Search\").find('input[id$=SrchGeneralPseudoArchiveTag]');\r\n //var isInvalidCriteria = (searchObjFolder && !searchObjCustomWork && !searchObjEDocument) && (searchAreaText && !searchAreaCard);\r\n //if (!isInvalidCriteria)\r\n // isInvalidCriteria = (!searchObjFolder && !searchObjCustomWork && !searchObjEDocument);\r\n if (tbl.length == 0) {\r\n tbl = $('div.card');\r\n }\r\n //var el = tbl.find(el_query);\r\n var txt = tbl.find(\"input[id*=Text]\");\r\n var btn = tbl.find(\"input.Search_Btn:first\");\r\n var Warning = $(btn).prev(\"div#SrchWarnMsg\");\r\n\r\n var DisableButton = false;\r\n var DisableTextbars = false;\r\n\r\n if (!searchObjFolder && !searchObjCustomWork && !searchObjEDocument) {\r\n DisableButton = true;\r\n } else if (!searchObjFolder && !searchObjCustomWork && !searchObjEDocument && !searchAreaCard) {\r\n DisableButton = true;\r\n } else if (searchObjFolder) {\r\n DisableButton = false;\r\n }\r\n\r\n if (!searchAreaText && !searchAreaCard && !searchAreaName) {\r\n DisableTextbars = true;\r\n }\r\n // поиск папок по тексу это неверные критерии\r\n if (searchAreaText && searchObjFolder && !searchAreaCard && !searchObjCustomWork && !searchObjEDocument) {\r\n DisableButton = true;\r\n }\r\n\r\n //Отключаем элементы\r\n //if ((tbl.find('input[id*=' + reqname + ']:checked').length == 0) || (isInvalidCriteria)) {\r\n if (DisableButton) {\r\n var htmlWarning = \"
\" +\r\n \"

\" +\r\n L(\"WARN_INVALID_SEARCH_CRITERIA\") +\r\n \"

\";\r\n //Добавляем сообщение\r\n if (Warning.length == 0) $(btn).before(htmlWarning);\r\n //блокируем кнопку\r\n btn.attr(\"disabled\", true);\r\n btn.addClass('disabled');\r\n } else {\r\n //удаляем сообщение\r\n if (Warning.length > 0) Warning.remove();\r\n //снимаем блокировку с кнопки\r\n btn.removeAttr(\"disabled\");\r\n btn.removeClass('disabled');\r\n }\r\n\r\n if (DisableTextbars) {\r\n //блокируем текстовые поля\r\n txt.attr(\"disabled\", true);\r\n txt.addClass('Req_Disabled');\r\n } else {\r\n //снимаем блокировку с текстовых полей\r\n txt.removeAttr(\"disabled\");\r\n txt.removeClass('Req_Disabled');\r\n }\r\n}\r\nfunction DisableTextbox(reqname) {\r\n //DisableIsAllCheckboxNotChecked(reqname, 'input[id*=Text]');\r\n DisableIsAllCheckboxNotChecked(reqname, 'input.Search_Btn:first');\r\n}\r\nfunction DisableSearchBtn(reqname) {\r\n DisableIsAllCheckboxNotChecked(reqname, 'input.Search_Btn:first');\r\n}\r\nfunction SearchPseudoArchiveTagChanged(reqname) {\r\n DisableIsAllCheckboxNotChecked(reqname, 'input.Search_Btn:first');\r\n}\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Мастера действий============================================================================================================================================= */\r\nfunction CloseBaseWizardWindow(key) {\r\n window.onunload = function () { FreeWizard(key); }\r\n}\r\n\r\nfunction FreeWizard(key) {\r\n var R;\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/Wizard.asmx/FreeWizard\" + WSSParam,\r\n data: \"{'Key':'\" + key + \"'}\",\r\n async: false,\r\n success: function (res) {\r\n R = res.d;\r\n }\r\n });\r\n CheckForLoginPage(R);\r\n return R;\r\n}\r\n\r\nfunction DisableWizardButtons() {\r\n $('.wizard-form__button').addClass('disabled').attr('disabled', 'disabled');\r\n}\r\n\r\n// на этапе мастера типа запись справочника и установке автоматически открывать запись справочника - будет открываться вкладка.\r\nfunction OpenObjectInWizardStep(notAutomatically) {\r\n var jShowRefCard = $(\"#ObjectHyperlink\");\r\n\r\n if (jShowRefCard.length > 0) {\r\n if (jShowRefCard.data('hasaccess') == 'True') {\r\n if (jShowRefCard.data('autoshow') == 'True') {\r\n var id = jShowRefCard.data('id');\r\n var versionNum = jShowRefCard.data('version');\r\n var hasVersions = jShowRefCard.data('hasversions') == \"True\";\r\n\r\n if (WA.agent.isAvailable() && (typeof versionNum !== 'undefined') && ('' + versionNum !== '0') && g_defaultListAction !== \"preview\") {\r\n if (hasVersions) {\r\n var openForWrite = false;\r\n if (jShowRefCard.data('openforwrite') == \"True\") {\r\n openForWrite = true;\r\n }\r\n\r\n // Если режим открытия документа - тело\r\n var docLink = new WA.Link(id, OBJECT_TYPE.EDOCUMENT);\r\n if (jShowRefCard.data('showmode') == WIZARD_DOCUMENT_STEP_SHOW_MODE.BODY) {\r\n Core.agent.getPlugin('edmsplugin').done(function () {\r\n SendEDocToAgent(id, versionNum, openForWrite);\r\n }).fail(function () {\r\n if (notAutomatically) {\r\n docLink.open();\r\n }\r\n });\r\n }\r\n else {\r\n // Если режим открытия документа - карточка\r\n docLink.open();\r\n }\r\n }\r\n else {\r\n //отобразить сообщение что недоступна версия\r\n ConfirmDialog({ title: L(\"INFO\"), text: L(\"ERR_NO_VERSIONS_AVAILIBLE\", jShowRefCard.html()), okText: L(\"OK\"), height: \"auto\", width: \"300px\", isShowCancelButton: false });\r\n }\r\n }\r\n else {\r\n jShowRefCard.click();\r\n }\r\n }\r\n }\r\n else {\r\n // Вывести сообщение об отсутствии прав\r\n ShowError(L(\"OBJECT_NOT_ACCESS_OR_CREATE\"));\r\n }\r\n }\r\n}\r\n/* =================================================================================================================================================== */\r\n\r\nvar CallService, CallServiceSync;\r\n\r\n(function () {\r\n\r\n // Функция, чтобы вызывать методы сервисов веб-доступа. Давно нужна была!\r\n // string service_method: метод сервиса, например /Session.asmx/CopyLinks\r\n // [object params]: параметры\r\n // [function callback(res)]: функция, вызываемая при успешном завершении запроса.\r\n // object res: объект, который вернул сервис.\r\n function CallServiceInternal(service_method, params, callback, error, async) {\r\n params = params || {};\r\n var error_handler = function () { if (error) error.apply(null, arguments); }\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: service_method,\r\n data: $.toJSON(params),\r\n async: async,\r\n cache: false,\r\n success: function (res) {\r\n if (!res) {\r\n error_handler();\r\n return;\r\n }\r\n res = res.d;\r\n if (CheckForLoginPage(res)) return;\r\n if (typeof callback !== \"undefined\")\r\n callback(res);\r\n },\r\n error: error_handler\r\n });\r\n }\r\n\r\n CallService = function (service_method, params, callback, error) {\r\n CallServiceInternal(service_method, params, callback, error, true);\r\n }\r\n\r\n CallServiceSync = function (service_method, params, callback, error) {\r\n CallServiceInternal(service_method, params, callback, error, false);\r\n }\r\n\r\n})();\r\n\r\n// ==========================================================================================================\r\n// Супер-функция. Обрабатывает все нажатия на все табы во всех карточках объектов (в идеале).\r\n// string tabName - название вкладки.\r\nfunction CardTabClick(tabName) {\r\n var changeTab = function () {\r\n ShowTopSpinner(L(\"PLEASE_WAIT\"), false);\r\n if (page == \"/reference.aspx\") {\r\n UnbindBeforeUnload();\r\n }\r\n DoAction('view=' + tabName + '&-op&-val&-ver&-ShowAll', false);\r\n };\r\n\r\n if (tabName == 'Card' && $('.CardForm_Tab').length) { // мы в карточке документа, например\r\n Core.sideBar.updateTab(1);\r\n } else {\r\n var page = window.location.pathname.toLowerCase();\r\n if (page.indexOf(\"/doc.aspx\") !== -1)\r\n ChangeTabDoc(tabName);\r\n else if (page.indexOf(\"/folder.aspx\") !== -1)\r\n ChangeTabFolder(tabName);\r\n else if (page == \"/reference.aspx\" && (!GetParamInURL('view') || GetParamInURL('view').toLowerCase() == 'card')) {\r\n if ($('#toolbar_container [name=\"RefCardSave\"]').length) {\r\n WA.CR.form._saveExtended(changeTab, false, 0, {\r\n needShowError: false\r\n });\r\n } else {\r\n changeTab();\r\n }\r\n }\r\n else\r\n changeTab();\r\n }\r\n}\r\n\r\nfunction leadzero(x) {\r\n return (x < 10) ? '0' + x : x;\r\n}\r\n\r\n/* =================================================================================================================================================== */\r\n/* =================================================================================================================================================== */\r\n\r\nfunction ShowAllCustomWorkState() {\r\n DoAction('ShowAll=1');\r\n return false;\r\n}\r\n\r\nfunction ReloadExplorer() {\r\n WA.CR.window.reloadExplorer();\r\n}\r\n\r\nfunction PageInit() {\r\n $(function () {\r\n $(window).resize(function () { setRealHeightAndWidthOnResize(); });\r\n setRealHeightAndWidth();\r\n initCollapsableElements();\r\n InitMouseEvents();\r\n InitTooltips();\r\n });\r\n jQuery().pagezoom(function () {\r\n setTimeout(function () {\r\n setRealHeightAndWidth();\r\n }, 150);\r\n });\r\n}\r\n\r\n\r\nfunction RefSel_AttachResult(inp, data, id, AfterSelectFunc, IsNeedCallFuncOnClr, leader, driven) {\r\n if (data != null) {\r\n if ($.isFunction(AfterSelectFunc)) AfterSelectFunc(data[0]);\r\n\r\n var needFillLeadAndDriven = (leader.length > 0 || driven.length > 0);\r\n if (needFillLeadAndDriven) {\r\n ClrVal(id, true, driven);\r\n g_FillLead[id] && g_FillLead[id](data[3]);\r\n g_FillDriven[id] && g_FillDriven[id]();\r\n }\r\n\r\n inp.change();\r\n } else {\r\n //вызываем функцию если поле очищено\r\n if (IsNeedCallFuncOnClr) AfterSelectFunc(null);\r\n ClrVal(id, false, driven);\r\n }\r\n}\r\n\r\nfunction RefSel_AttachMultiResult(inp, data, AfterSelectFunc) {\r\n if (AfterSelectFunc != null) AfterSelectFunc(inp, data);\r\n}\r\n\r\nvar g_GetLeadSelIDs = {};\r\nvar g_FillLead = {};\r\nvar g_FillDriven = {};\r\n\r\nfunction BindLeaderDrivenRequisites(id, leader, lookup, driven) {\r\n\r\n //Получим значения ведущих реквизитов.\r\n g_GetLeadSelIDs[id] = function () {\r\n var val = '';\r\n for (var i = 0; i < leader.length; i++) {\r\n var leaderParts = leader[i].split(\"|\");\r\n var leaderControlName = leaderParts[0];\r\n var leaderRequisiteName;\r\n if (leaderParts.length === 1) {\r\n leaderRequisiteName = '';\r\n } else {\r\n leaderRequisiteName = leaderParts[1];\r\n }\r\n\r\n val += lookup[i] + '|' + leaderRequisiteName + '=' + getValue(leaderControlName) + '&';\r\n };\r\n return val;\r\n };\r\n\r\n // Заполним ведущие реквизиты.\r\n g_FillLead[id] = function (LeadIDs) {\r\n var ht = $.parseJSON(LeadIDs);\r\n\r\n for (var i = 0; i < leader.length; i++) {\r\n var leaderData = ht[lookup[i]];\r\n var leaderControlName = leader[i].split(\"|\")[0];\r\n\r\n if (!$.isEmptyObject(leaderData)) {\r\n var inp = $('input#' + leaderControlName);\r\n if (inp.length > 0) {\r\n var rs = inp.data('ReferenceSelectInstance');\r\n var refCode = rs.getFirstRefCode();\r\n\r\n var queryContext = rs.queryContext;\r\n // Множественный выбор ссылается на несколько ревизитов, поэтому меняем контекст.\r\n if (rs.referenceCodesAndReqNamesInDetailSection && rs.referenceCodesAndReqNamesInDetailSection[refCode]) {\r\n queryContext = JSON.parse(queryContext);\r\n queryContext.requisiteNumber = rs.referenceCodesAndReqNamesInDetailSection[refCode].number;\r\n queryContext = JSON.stringify(queryContext);\r\n }\r\n\r\n var url = rs.url;\r\n var params = $.extend({\r\n q: \"\",\r\n filter: \"[ИД]=\" + leaderData[0],\r\n useadditional: rs.useadditional ? \"1\" : \"0\",\r\n disablespecialprocessing: \"1\",\r\n queryContext: queryContext\r\n }, rs.extraParams || {});\r\n\r\n rs.dataProvider.sendQuery(url, params, (function (_leaderControlName) {\r\n return function (count, res) {\r\n var data = res[0];\r\n if (data && data.leadingRequisitesValue !== \"{}\") {\r\n g_FillLead[_leaderControlName](data.leadingRequisitesValue);\r\n }\r\n };\r\n })(leaderControlName));\r\n }\r\n\r\n $('#' + leaderControlName).SetValue(leaderData).change();\r\n }\r\n };\r\n };\r\n\r\n // Вызовем функции автозаполнения у ведомых реквизитов.\r\n g_FillDriven[id] = function () {\r\n try {\r\n for (var i = 0; i < driven.length; i++) {\r\n FillDrivenIfItResultHasOneRecord(driven[i], g_GetLeadSelIDs[driven[i]]);\r\n };\r\n } catch (ex) { }\r\n };\r\n\r\n};\r\n\r\n//Очистка значений реквизитов\r\nfunction ClrVal(ID, ClrOnlyDriven, DrivenIDs) {\r\n var IDs = [];\r\n var CurentID;\r\n try {\r\n if (ClrOnlyDriven) IDs = IDs.concat(DrivenIDs);\r\n else IDs = IDs.concat(ID, DrivenIDs);\r\n for (i = 0; i < IDs.length; i++) {\r\n CurentID = IDs[i];\r\n var inp = $(\"#\" + CurentID);\r\n inp.SetValue(null).change();\r\n }\r\n } catch (ex) { }\r\n}\r\n\r\n// Получение значение реквизита\r\nfunction getValue(reqID, inp) {\r\n var v = $('#hSelID_' + reqID).val();\r\n return (typeof v == 'undefined' ? '' : v);\r\n}\r\n\r\nfunction FillDrivenIfItResultHasOneRecord(id, LeadSelIDs) {\r\n var refurl = $(\"#\" + id).attr(\"refurl\");\r\n $(\"#\" + id).Clear();\r\n $.ajax({\r\n type: \"GET\",\r\n dataType: \"text\",\r\n url: refurl + \"&LeadSelID=\" + encodeURI(LeadSelIDs()),\r\n cache: false,\r\n success: function (res) {\r\n var rows = res.split(\"\\r\\n\");\r\n if (rows.length > 0 && rows[0] != 'ERROR' && rows.length == 3) {\r\n $(\"#\" + id).SetValue(rows[1].split('|')).change();\r\n }\r\n }\r\n });\r\n}\r\n\r\n// Инициализируем подсказки для реквизита выбора из справочника.\r\nfunction RefSel_InitHint(el, RefSelID, RefCode) {\r\n var inpId = el.attr('id');\r\n el.addClass('hint').data('data-hint', { id: RefSelID, compcode: RefCode }).removeClass('hintInit').qtip('hide');\r\n\r\n function updateHintData($this, newRecID, RefCode) {\r\n if (newRecID != null && newRecID != '') {\r\n $this.data('data-hint', { id: newRecID, compcode: RefCode })\r\n $this.removeClass('hintInit').qtip('hide');\r\n InitAdditionalInfoTooltip($this);\r\n } else {\r\n $this.removeData('data-hint').removeClass('hintInit').qtip('hide').qtip('disable');\r\n }\r\n }\r\n\r\n el.bind('onSelected', function () {\r\n updateHintData($(this), $('#hSelID_' + inpId).val(), RefCode);\r\n });\r\n el.result(function (event, data) {\r\n updateHintData($(this), (data != null ? data[0] : null), RefCode);\r\n });\r\n}\r\n\r\nvar OnTabChanged = function (callback, tabName, dfmTabName) {\r\n if (tabName === 'Card') dfmTabName = 'Card';\r\n\r\n var SB = WA.CR.sideBar;\r\n //TODO Шамов А.: События должны fire внутри класса, а не где попало.\r\n if (SB) SB.fire(SB['class'].EVENT.BEFORE_TAB_SWITCH, SB.tabs[tabName]);\r\n\r\n var isRun = false;\r\n var callbackRunChecker = function () {\r\n var r;\r\n if (callback) {\r\n r = callback();\r\n }\r\n isRun = true;\r\n return r;\r\n };\r\n dfmTabName = dfmTabName || '';\r\n\r\n var htmlEl = $('div.tab_item').filter('[id$=_' + tabName + ']');\r\n\r\n var result = $('html').triggerHandler('OnTabChanged', [tabName, dfmTabName, callbackRunChecker, htmlEl]);\r\n if (!isRun && (typeof result == 'undefined' || result)) {\r\n callbackRunChecker();\r\n }\r\n //TODO Шамов А.: События должны fire внутри класса, а не где попало.\r\n if (SB) SB.fire(SB['class'].EVENT.AFTER_TAB_SWITCH, SB.tabs[tabName]);\r\n}\r\n\r\n/**\r\n* Преобразует специальные символы в HTML сущности\r\n* @function HTMLEncode\r\n* @global\r\n* @param {string} text\r\n* @return {string}\r\n* @deprecated\r\n*/\r\nfunction escapeHtml(text) {\r\n return ('' + text).escapeHtml();\r\n};\r\n\r\n/**\r\n* Используется в WebAccess для проверки наличия биндингов, не удаляйте пожалуйста(один раз уже пропало)\r\n* @function jQuery.hasAttr\r\n* @param {string} name\r\n* @return {boolean}\r\n*/\r\n$.fn.hasAttr = function (name) {\r\n return this.attr(name) !== undefined;\r\n};\r\n\r\n/**\r\n* Поиск объекта в массиве по атрибуту\r\n* @function getElementIndexByAttr\r\n* @global\r\n* @param {array} array массив объектов\r\n* @param {string} key атрибут по которому ищется объект\r\n* @param {string} value значение атрибута\r\n* @return {integer} индекс найденного элемента, либо -1 если не найден\r\n*/\r\ngetElementIndexByAttr = function (array, key, value) {\r\n for (var i = 0, len = array.length; i < len; i++) {\r\n if (array[i][key] === value) {\r\n return i;\r\n };\r\n };\r\n return -1;\r\n};\r\n\r\n/**\r\n* Возможность перезаписи функций, с возможностью запуска родительской функции.\r\n* @global\r\n*/\r\nFunction.prototype.override = function (func) {\r\n var superFunction = this;\r\n return function () {\r\n this.superFunction = superFunction;\r\n return func.apply(this, arguments);\r\n };\r\n};\r\n\r\n// Показать модальное окно с инструкцией\r\nfunction showInstructionDialog() {\r\n WA.services.call(\"/Task.asmx/GetInstruction\", { \"Type\": WA.getLocation(), \"ID\": GetParamInURL(\"id\") }).success(function (result) {\r\n var dialog = new WebAccess.components.dialogs.BaseDialog();\r\n dialog.setHtml(this.Result.html);\r\n dialog.width = '600px';\r\n dialog.height = 'auto';\r\n dialog.title = this.Result.title;\r\n dialog.okText = L(\"CLOSE\");\r\n dialog.show();\r\n BindHelpIcoClickOnModalWindow('Instruction');\r\n }).error(function (error) {\r\n console.log(error);\r\n });\r\n}\r\n\r\n/**\r\n* Поиск предка для элемента\r\n*/\r\n$.fn.hasAncestor = function (a) {\r\n return this.filter(function () {\r\n return !!$(this).closest(a).length;\r\n });\r\n};\r\n\r\n/**\r\n* Стандартный метод when jquery резолвится сразу как только зафейлится первый из деферредов.\r\n* Этот метод дожидается всей пачки переданных deferred-объектов и только тогда вызывается done или fail;\r\n*/\r\n$.whenAllDone = function () {\r\n var deferreds = [];\r\n var result = $.Deferred();\r\n\r\n $.each(arguments, function (i, current) {\r\n var currentDeferred = $.Deferred();\r\n current.then(function () {\r\n currentDeferred.resolve(false, arguments);\r\n }, function () {\r\n currentDeferred.resolve(true, arguments);\r\n });\r\n deferreds.push(currentDeferred);\r\n });\r\n\r\n $.when.apply($, deferreds).then(function () {\r\n var failures = [];\r\n var successes = [];\r\n\r\n $.each(arguments, function (i, args) {\r\n // If we resolved with `true` as the first parameter\r\n // we have a failure, a success otherwise\r\n var target = args[0] ? failures : successes;\r\n var data = args[1];\r\n // Push either all arguments or the only one\r\n target.push(data && data.length === 1 ? data[0] : args);\r\n });\r\n\r\n if (failures.length) {\r\n return result.reject.apply(result, failures);\r\n }\r\n\r\n return result.resolve.apply(result, successes);\r\n });\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n* Способ для определения того,\r\n* что браузер был перезапущен для браузеров которые не грохают сессионные куки\r\n* @see #93027\r\n*/\r\n(function emulateSession() {\r\n var cookieName = 'fakeSession';\r\n var sessionId = new Date().getTime();\r\n var keepAliveLoop = null;\r\n\r\n var getSession = function () {\r\n return $.cookie(cookieName);\r\n }\r\n\r\n var setSession = function () {\r\n var options = { expires: new Date((new Date).getTime() + 5 * 1000) };\r\n $.cookie(cookieName, sessionId, options);\r\n };\r\n\r\n var runSession = function () {\r\n var me = this;\r\n var seconds = 2 * 1000;\r\n var keepAlive = function () {\r\n\r\n if (getSession()) setSession();\r\n else if (WA.getLocation() !== 'login') {\r\n browserSessionIsRestored = true;\r\n };\r\n };\r\n\r\n if (!keepAliveLoop) keepAliveLoop = setInterval(keepAlive, seconds);\r\n keepAlive();\r\n };\r\n\r\n if (WA.getLocation() === 'login') setSession();\r\n\r\n else setTimeout(function () {\r\n browserSessionIsRestored = false;\r\n setSession();\r\n }, 100);\r\n\r\n runSession();\r\n})();\r\n\r\n/* DEPRECATED */\r\n(function () {\r\n window._isDarkTheme = function () {\r\n return false;\r\n };\r\n\r\n window._prefixIfDark = function () {\r\n return '';\r\n };\r\n})();\r\n","/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n/// \n\n/**\n * Предоставляет инструменты для работы со ссылками. Например, скопировать ссылки в буфер обмена.\n *\n * @namespace window\n * @since 5.4.0.1000\n */\n(function (global) {\n /**\n * Запомнить в кэше источник ссылок.\n *\n * @method window#setLinksSource\n * @param {string} sourceId ИД ресурса.\n * @param {string} sourceType Тип ресурса.\n */\n global.setLinksSource = function (sourceId, sourceType) {\n WA.cache.setItem('sourceID', sourceId);\n WA.cache.setItem('sourceType', sourceType);\n }\n\n /**\n * Скопировать cсылки в буфер.\n *\n * @method window#CopyLinks\n * @param {object} opt_contextMenuCopyObj Объект, для которого было вызвано контекстное меню\n */\n global.CopyLinks = function (opt_contextMenuCopyObj) {\n setLinksSource(null, null);\n\n ShowTopSpinner();\n var links = getSelectedLinks(opt_contextMenuCopyObj);\n\n Core.clipboard.copyLinksToClipboard(links).done(function (copiedLinksCount) {\n HideTopSpinner(L(\"COPIED_LINKS\", copiedLinksCount), 2000);\n }).fail(function (completeMsg) {\n HideTopSpinner(completeMsg, 2000);\n });\n }\n\n /**\n * Вырезать ссылки.\n *\n * @method window#CutLinks\n * @param {object} opt_contextMenuCopyObj Объект, для которого было вызвано контекстное меню\n */\n global.CutLinks = function (opt_contextMenuCopyObj) {\n ShowTopSpinner();\n\n var folderId = getCurrentFolderId();\n\n //если находимся не в папке, то вместо вырезания просто копируем\n if (folderId == null) {\n setLinksSource(null, null);\n } else {\n setLinksSource(folderId, 'F');\n }\n\n var links = getSelectedLinks(opt_contextMenuCopyObj);\n\n Core.clipboard.copyLinksToClipboard(links).done(function (copiedLinksCount) {\n HideTopSpinner(L(\"CUT_LINKS\", copiedLinksCount), 2000);\n }).fail(function (completeMsg) {\n HideTopSpinner(completeMsg, 2000);\n });\n }\n\n /**\r\n * Возвращает массив ссылок, которые отмечены как выбранные.\r\n * \r\n * @param {object} opt_contextMenuObj объект из которого было вызвано контекстное меню\r\n * @return {Array} массив ссылок вида {ID:..., Type:..., CompCode:..., Description}\r\n */\n function getSelectedLinks(opt_contextMenuObj) {\n var links = [];\n\n if (!!opt_contextMenuObj) {\n // если мы в проводнике или справочнике, значит происходит копирование через контекстное меню\n if (WA.getLocation() === \"explorer\" || WA.getLocation() === 'referencerecords') {\n links = takeLinkFromContextMenu(opt_contextMenuObj);\n } else {\n //иначе мы в карточке Документа/ЗЗУ/Записи справочника\n links = takeLinkFromCard(opt_contextMenuObj);\n }\n\n } else {\n links = takeLinksFromPage();\n }\n\n return links;\n }\n\n /**\r\n * Получает ссылку из объекта карточки.\r\n * \r\n * @param {any} cardObj объект карточки. Может быть как основным объектом карточки, так и вложением.\r\n * @return {object} ссылка в формате для агента вида {ID:..., Type:..., CompCode:..., Description}\r\n */\n function takeLinkFromCard(cardObj) {\n //Тут нужно понять, мы копируем сам объект карточки или его вложение\n //Объект с вложением имеет tr, так мы его и опознаем\n return [\n {\n ID: cardObj.id,\n Type: cardObj.type[0],\n CompCode: !!cardObj.refcode ? cardObj.refcode : '',\n Description: cardObj.tr ? cardObj.tr.find('div.objectname').text() : getCardObjectName()\n }\n ];\n }\n\n function getCardObjectName() {\n switch (WebAccess.getLocation()) {\n case \"job\": return WebAccess.Job.Subject;\n case \"task\": return WebAccess.Task.Subject;\n case \"doc\": return WA.Document.Name;\n case \"reference\": return WebAccess.ReferenceRecord.ReferenceCaption + \": \" + WebAccess.ReferenceRecord.Name;\n default: return \"\";\n }\n }\n\n /**\r\n * Возвращает ссылку при копировании через контекстное меню\r\n * \r\n * @param {any} contextMenuCopyObj объект, для которого было вызвано контекстное меню\r\n * @return {object} ссылка на объект в формате для агента вида {ID:..., Type:..., CompCode:..., Description}\r\n */\n function takeLinkFromContextMenu(contextMenuCopyObj) {\n var selected = [];\n selected.push(WA.CR.objectList.getItems()[contextMenuCopyObj.id]);\n //если контекстное меню вызвано у папки из дерева папок\n if (selected.length === 1 && typeof selected[0] === 'undefined') {\n selected[0] = contextMenuCopyObj;\n // Если элемент из DOM, то берем имя прямо со страницы, иначе передан узел дерева, и берем информацию из него. \n if (contextMenuCopyObj instanceof jQuery || contextMenuCopyObj instanceof HTMLElement || contextMenuCopyObj.type === 'CurrentFolder') {\n selected[0].name = contextMenuCopyObj.tr.find('.current-folder__name').text();\n } else {\n if (contextMenuCopyObj.node) {\n selected[0].name = contextMenuCopyObj.node.caption;\n }\n }\n }\n return makeLinksFromItems(selected);\n }\n\n /**\r\n * Возвращает ссылки помеченные как выбранные с текущей страницы\r\n *\r\n * @return {Array} Массив ссылок вида {ID:..., Type:..., CompCode:..., Description}\r\n */\n function takeLinksFromPage() {\n var selected = WA.CR.objectList.getSelectedItems();\n return makeLinksFromItems(selected);\n }\n\n /**\r\n * Конвертирует API-ссылки в формат для агента.\r\n * \r\n * @param {Array} items Массив ссылок вида {id:..., kind:..., referenceName:..., name:...}\r\n * @return {Array} Массив ссылок вида {ID:..., Type:..., CompCode:..., Description}\r\n */\n function makeLinksFromItems(items) {\n var links = _(items).map(function (item) {\n var desc = item.name;\n if (item.referenceName && WA.getLocation() === 'referencerecords') {\n // Небольшая оптимизация, т.к. для получения описания записи справочника отправляется запрос на сервер, а если выделить много объектов, то будет тормоза и большая нагрузка.\n var refCaption = $('.card-header__label').data('captioned');\n desc = refCaption + ': ' + item.name;\n }\n return {\n ID: item.id,\n Type: item.kind[0].toUpperCase(),\n CompCode: item.referenceName ? item.referenceName : '',\n Description: desc\n };\n });\n return links;\n }\n\n function convertTypeToKind(type) {\n switch (type[0].toUpperCase()) {\n case \"E\": return \"EDOC\";\n case \"F\": return \"FOL\";\n case \"J\": return \"JOB\";\n case \"T\": return \"TASK\";\n case \"R\": return \"REF\";\n }\n return \"\";\n }\n\n /**\r\n * Конвертирует ссылки из формата агента в Models.Link\r\n * \r\n * @param {Array} links массив ссылок вида {ID:..., Type:..., CompCode:..., Description:...}}\r\n * @returns {Array} массив ссылок вида {ID:..., Kind:..., CompCode:..., Desc:...}}\r\n */\n global.convertAgentLinksToLinkModels = function (links) {\n var convertedLinks = [];\n for (var i = 0; i < links.length; i++) {\n var params = {\n \"Kind\": convertTypeToKind(links[i].Type),\n \"ID\": links[i].ID,\n \"CompCode\": links[i].CompCode,\n \"Desc\": links[i].Description\n };\n convertedLinks.push(params);\n }\n return convertedLinks;\n }\n\n /**\r\n * Переводит ссылки из формата Models.Link в формат агента\r\n * \r\n * @param {Array} links массив ссылок вида {ID:..., Kind:..., CompCode:..., Desc:...}}\r\n * @returns {Array} массив ссылок вида {ID:..., Type:..., CompCode:..., Description:...}}\r\n */\n global.convertLinkModelsToAgentLinks = function (linkModels) {\n var convertedLinks = [];\n for (var i = 0; i < linkModels.length; i++) {\n var params = {\n \"Type\": linkModels[i].Kind[0],\n \"ID\": linkModels[i].ID,\n \"CompCode\": linkModels[i].CompCode,\n \"Description\": linkModels[i].Desc\n };\n convertedLinks.push(params);\n }\n return convertedLinks;\n }\n\n function getCurrentFolderId() {\n if (WebAccess.getLocation() == \"explorer\" && GetParamInURL(\"mode\") == \"\") {\n return GetParamInURL(\"id\");\n }\n return null;\n }\n\n global.isAllRecordsInFolderSelected = function () {\n return WA.ObjectListInit.state() === \"resolved\" && !!WA.CR.objectList && WA.CR.objectList._isAllSelected;\n }\n\n /**\n * Вставить cсылки из буфера.\n *\n * @method window#PasteLinks\n * @param destType: Тип приемника ссылок.\n * @param destId: Приемник ссылок.\n * @param callback: Функция обратного вызова для обработанной ссылки.\n */\n global.PasteLinks = function (destType, destId, callback) {\n if (g_ViewOnlyMsg != '') {\n ShowTopSpinnerResult(g_ViewOnlyMsg, 2000);\n return;\n }\n\n if (typeof callback == 'undefined')\n ShowTopSpinner(L(\"PASTE_LINKS\"));\n if (destType == null) destType = \"FOLDER\";\n if (typeof destId == \"undefined\" || destId == null) destId = getCurrentFolderId();\n\n var source = {\n SourceID: WA.cache.getItem('sourceID'),\n SourceType: WA.cache.getItem('sourceType')\n };\n\n WebAccess.agent.isPluginAvailable(\"Clipboard\").always(function (isAvailableResponse) {\n if (isAvailableResponse) {\n WebAccess.agent.clipboard.getLinksFromClipboard().done(function (links) {\n if (links.length > 0 && typeof links != 'string') {\n //Вставляем ссылки в папку\n switch (destType) {\n case \"FOLDER\": pasteLinksToFolder(destId, links, source, callback); break;\n case \"EDOCUMENT\": pasteLinksToBoundDocuments(destId, links, callback); break;\n default:\n }\n }\n else {\n HideTopSpinner();\n }\n }).fail(function () {\n pasteLinksDefault(destId, destType, source.SourceID, callback);\n });\n } else {\n pasteLinksDefault(destId, destType, source.SourceID, callback);\n }\n setLinksSource(null, null);\n });\n }\n\n function pasteLinksToFolder(destId, links, source, callback) {\n CallService('/Folder.asmx/AddLinks', { FolderID: destId, Links: links }, function (res) {\n if (res.Success) {\n var d = $.Deferred();\n //Если успешно вставили, то удаляем ссылки из источника\n if ((source != null) && (source.SourceID != null) && source.SourceID != WA.current.getID() && source.SourceType === 'F') {\n d = WA.services.call('/Folder.asmx/RemoveLinks', { FolderID: source.SourceID, Links: links });\n } else {\n d.resolve();\n }\n\n d.always(function () {\n if (!CheckForLoginPage(res)) {\n if (res.Result != 0) {\n if (typeof callback !== 'undefined') {\n EnableOrDisableCheckAll();\n callback();\n } else {\n // Обновить список и дерево\n WA.CR.objectList.reload().always(function () { EnableOrDisableCheckAll() });\n // Если среди ссылок есть папки, то обновить дерево.\n if (_.some(links, function (el) { return el.type == OBJECT_TYPE.FOLDER; }))\n WA.CR.folderTree.updateByFolderID(destId);\n HideTopSpinner(L(\"PASTED_LINKS\", res.Result), 2000);\n }\n } else {\n if (typeof callback === 'undefined')\n HideTopSpinner(L('NOT_LINKS_TO_PASTE'), 2000);\n }\n }\n });\n } else {\n HideTopSpinner(L('ERROR_MSG', res.Error), 5000);\n }\n });\n }\n\n function pasteLinksToBoundDocuments(DocID, links, callback) {\n CallService(\"/EDocument.asmx/PasteLinksToBoundObjects\", { EDocID: DocID, Links: links },\n function (res) {\n if (res.Success) {\n if (!CheckForLoginPage(res)) {\n if (res.Result != 0) {\n EnableOrDisableCheckAll();\n if (typeof callback != 'undefined')\n callback();\n else\n $('form:first').submit();\n } else {\n if (typeof callback == 'undefined')\n HideTopSpinner(L(\"NOT_LINKS_TO_PASTE\"), 2000);\n }\n }\n } else {\n HideTopSpinner(L(\"ERROR_MSG\", res.Error), 5000);\n }\n });\n }\n\n function pasteLinksDefault(DestID, DestType, SourceID, callback) {\n CallService(\"/Session.asmx/PasteLinks\", { \"DestID\": DestID, \"DestType\": DestType, \"SourceID\": SourceID }, function (res) {\n if (!CheckForLoginPage(res)) {\n if (res.Result != 0) {\n EnableOrDisableCheckAll();\n if (typeof callback != 'undefined')\n callback();\n else {\n if (DestType === \"FOLDER\") {\n // Обновить список и дерево\n WA.CR.objectList.reload();\n // Если среди ссылок есть папки, то обновить дерево.\n if (_.some([], function (el) { return el.type == OBJECT_TYPE.FOLDER; }))\n WA.CR.folderTree.updateByFolderID(DestID);\n HideTopSpinner(L(\"PASTED_LINKS\", res.Result), 2000);\n } else\n $('form:first').submit();\n }\n } else {\n if (typeof callback == 'undefined')\n HideTopSpinner(L(\"NOT_LINKS_TO_PASTE\"), 2000);\n };\n }\n });\n }\n\n /**\n * Вставить cсылки из буфера.\n *\n * @method window#DeleteLinks\n * @param extraParams: Дополнительные параметры.\n * @param links: Ссылки.\n * @param needSubmit: \n * @param sourceId: ИД источника ссылок.\n * @param needConfirmDeleting: Признак необходимости подтверждения удаления.\n * @param afterDeleteCallback: Функция обратного вызова для удаленной ссылки.\n * @param isFromTree: Признак принадлежности дереву.\n */\n global.DeleteLinks = function (extraParams, links, needSubmit, sourceId, needConfirmDeleting, afterDeleteCallback, isFromTree) {\n var submit = (typeof needSubmit == 'undefined' ? \"\" : needSubmit);\n var sourceFol = (typeof sourceId == 'undefined' ? \"\" : sourceId);\n\n if (!isFromTree && g_ViewOnlyMsg != '') {\n ShowTopSpinnerResult(g_ViewOnlyMsg, 2000);\n } else {\n if (extraParams == null) extraParams = \"\";\n var linksToDelete = [];\n\n if (typeof links == \"undefined\" || links == null)\n linksToDelete = GetSelectedID().links;\n else\n linksToDelete = links;\n\n function getSourceType() {\n var src = WA.getLocation();\n switch (src) {\n case 'explorer':\n return 'FOLDER';\n case 'doc':\n return 'EDOCUMENT';\n case 'job':\n return 'JOB';\n case 'task':\n return 'TASK';\n default:\n return 'FOLDER';\n }\n }\n\n function callDeleteLinksService() {\n ShowTopSpinner(L(\"DELETE_LINKS\"));\n CallService(\"/Session.asmx/DeleteLinksWithFilter\", {\n Links: linksToDelete,\n SourceID: (sourceFol || GetParamInURL('id')),\n SourceType: getSourceType(),\n UserFilterText: WA.CR.objectList.getLikeFilter(),\n UserFilterRequisites: WA.CR.objectList.getlikeFilterRequisites(),\n PredefinedFilter: WA.CR.objectList.getPredefinedFilter()\n }, function (res) {\n if (res.Success) {\n res = res.Result;\n if (res != 0) {\n if (getSourceType() == 'FOLDER') {\n WA.CR.objectList.reload().done(function () {\n if (WA.CR.folderTree)\n WA.CR.folderTree.updateNodesWithFolder(WA.CR.getID());\n });\n updateChkAll($('div.object_contents'), $('#chkAll'));\n UpdateCopyPasteIcons();\n HideTopSpinner(L('DELETED_LINKS', res), 2000);\n EnableOrDisableCheckAll();\n } else {\n $('form:first').submit();\n }\n if ($.isFunction(afterDeleteCallback)) afterDeleteCallback();\n } else {\n if (submit == \"\") HideTopSpinner(L(\"NO_RIGHT_DELETE_LINKS\"), 2000);\n }\n } else {\n HideTopSpinner(res.Error, 2000);\n }\n });\n }\n\n if (linksToDelete.length > 0) {\n needConfirmDeleting = needConfirmDeleting || (typeof needConfirmDeleting === \"undefined\");\n if (needConfirmDeleting) {\n ConfirmDelete(linksToDelete.length).done(function () {\n callDeleteLinksService();\n });\n }\n else {\n callDeleteLinksService();\n }\n }\n else {\n ShowTopSpinnerResult(L(\"OBJECTS_NOT_SELECTED\"), 2000);\n }\n }\n }\n})(window);","//Список рекомендуемых действий для локальных копий.\nvar LocalCopyRecommendedAction = {};\n\n/*Обработчики действий над локальными копиями*/\n\nfunction ReturnLocalCopyCM(obj) {\n var item = obj.tr;\n var version = item.attr('version');\n var encoding = item.attr('encoding');\n var pluginName = item.attr('encpluginname');\n ReturnLocalCopy(obj.id, version, !!encoding ? encoding : '', !!pluginName ? pluginName : '');\n}\n\n//Вернуть локальную копию\nfunction ReturnLocalCopy(documentID, versionNumber, encodingType, pluginName, fileName, editDate) {\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\n var OnConfirmRecoverLocalCopy = function (dialog, additionalParams) {\n var params = { \"DocumentID\": documentID, \"Version\": versionNumber, \"EncodeType\": encodingType, \"EncryptionPluginName\": pluginName };\n\n if (!!additionalParams) $.extend(params, additionalParams);\n\n _returnLocalCopyRequest(params, function (result) {\n var resultMessage = L('RECOVER_FROM_LOCAL_COPY_SUCCESS');\n ShowTopSpinnerResult(resultMessage);\n RemoveItemFromRecoveryList(documentID, versionNumber);\n }, function (err) {\n var resultMessage = \"\";\n try {\n resultMessage = err.message;\n } catch (e) {\n resultMessage = L('RECOVER_FROM_LOCAL_COPY_FAIL');\n }\n ShowError(resultMessage);\n });\n }\n var modifyDate = formatDateTime(new Date(editDate ? editDate : GetLastEditDate(documentID, versionNumber)));\n var confirm = (format(L(\"CONFIRM_RECOVER_FROM_LOCAL_COPY\"), { 0: versionNumber, 1: (fileName ? fileName : GetDocumentFileName(documentID)) })).escapeHtml();\n var warning = LocalCopyRecommendedAction[(documentID + 'v' + versionNumber)] == 'RECOVER' ? \"\" : (format(L(\"MSG_DELETE_COPY\"), { 0: modifyDate })).escapeHtml();\n ShowDocumentRecoveryConfirmation(confirm, warning, function (dialog) {\n if (GetDocumentEncodingType(documentID) >= 2) {\n RequestPasswordForDecryption(null, function (pass) { OnConfirmRecoverLocalCopy(dialog, { Password: pass }); });\n return;\n }\n OnConfirmRecoverLocalCopy(dialog, null);\n });\n });\n}\n\n// Возврат документа, открытого в агенте.\nfunction ReturnDocument(documentID, versionNumber, encodingType, pluginName, fileName, editDate) {\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\n var OnConfirmRecoverLocalCopy = function (additionalParams) {\n var params = { \"DocumentID\": documentID, \"Version\": versionNumber, \"EncodeType\": encodingType, \"EncryptionPluginName\": pluginName };\n if (!!additionalParams) $.extend(params, additionalParams);\n _returnLocalCopyRequest(params, function (result) {\n var resultMessage = L('AGENT_RETURN_DOCUMENT_SUCCESS');\n ShowTopSpinnerResult(resultMessage);\n RemoveItemFromRecoveryList(documentID, versionNumber);\n }, function (err) {\n var resultMessage = \"\";\n try {\n resultMessage = err.message;\n } catch (e) {\n resultMessage = L('AGENT_RETURN_DOCUMENT_FAIL');\n }\n ShowError(resultMessage);\n });\n }\n\n if (GetDocumentEncodingType(documentID) >= 2) {\n RequestPasswordForDecryption(null, function (pass) { OnConfirmRecoverLocalCopy({ Password: pass }); });\n return;\n }\n OnConfirmRecoverLocalCopy(null);\n });\n}\n\n// Запрос на возврат документа из локальной копии.\nfunction _returnLocalCopyRequest(params, successCallback, errCallback) {\n RequestToken(TOKEN_OPERATION.UPLOAD_DOCUMENT_BODY | TOKEN_OPERATION.DOWNLOAD_DOCUMENT_BODY, function (token) {\n $.extend(params, { \"Token\": token });\n\n Core.agent.invoke(\"ReturnLocalCopy\", \"edmsplugin\", params).done(function (result) {\n successCallback(result);\n }).fail(function(result) {\n errCallback(result);\n });\n\n }, params['DocumentID'], params['Version']);\n}\n\nfunction getDocumentListItem(docID) {\n return $('.List')\n .filter('[mode=OpenedDocs], [mode=EDocRestore]')\n .filter('#' + docID);\n}\n\nfunction GetDocumentFileName(DocID) {\n var item = getDocumentListItem(DocID);\n var ext = item.find('svg.Icon32>use').attr('alt');\n var name = item.find('div.objectname').contents()[0];\n return (!!name.textContent ? name.textContent : name.nodeValue) + '.' + ext;\n}\n\nfunction GetLastEditDate(DocID, VersionNumber) {\n var date = getDocumentListItem(DocID)\n .filter('[version=' + VersionNumber + ']')\n .attr('localeditdate');\n return !!date ? date : \"\";\n}\n\nfunction GetDocumentEncodingType(DocID) {\n return getDocumentListItem(DocID).attr('encoding');\n}\n\nfunction GetEncodingPluginName(DocID) {\n return getDocumentListItem(DocID).attr('encpluginname');\n}\n\nfunction ShowDocumentRecoveryConfirmation(message, warning, onConfirm) {\n var dialog = new WA.components.dialogs.MessageBox();\n dialog.width = 600;\n dialog.okText = L(\"RESTORE\");\n dialog.okCancelButtons(function () {\n dialog.disableButton(\"modal_ok_button\");\n dialog.disableButton(\"modal_cancel_button\");\n $('.ui-dialog-titlebar-close:visible', dialog._jDialog.parent()).remove();\n dialog._jDialog.find('.upper-area').hide().next().children().show();\n if (onConfirm) onConfirm(dialog);\n }, null);\n dialog.showQuestion(message, warning + GetConfirmRecoveryDlgHtml());\n}\n\nfunction ShowDocumentDeleteCopyConfirmation(message, warning, onConfirm) {\n var dialog = new WA.components.dialogs.MessageBox();\n dialog.width = 600;\n dialog.yesNoButtons(onConfirm, null);\n dialog.showQuestion(message, warning);\n}\n\nfunction GetConfirmRecoveryDlgHtml() {\n var html = '';\n var spinnerImage = 'spinner.gif';\n var spinnerHtml = $('')[0].outerHTML;\n var recoveryProcMsg = $('').html(L('DOCUMENT_RECOVER_PROCESS'))[0].outerHTML;\n html += $('
').html(spinnerHtml + recoveryProcMsg).attr('id', 'recovery_spinner').hide()[0].outerHTML;\n return html;\n}\n\nfunction OpenLocalCopyCM(obj) {\n OpenLocalCopy(obj.id, obj.tr.attr('version'));\n}\n\n//Открыть локальную копию\nfunction OpenLocalCopy(documentID, versionNumber) {\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\n var params = { \"DocumentID\": documentID, \"Version\": versionNumber };\n plugin.invoke(\"OpenLocalCopy\", params).fail(function (result) {\n try {\n var resultMessage = result.message;\n ShowMessage(resultMessage, L('INFO'));\n } catch (e) { }\n });\n });\n}\n\nfunction DeleteLocalCopyCM(obj) {\n DeleteLocalCopy(obj.id, obj.tr.attr('version'));\n}\n\n//Удалить локальную копию\nfunction DeleteLocalCopy(documentID, versionNumber, OnDeleteCallback, SilentMode) {\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\n var OnConfirmDeleteLocalCopy = function () {\n var resultMessage = \"\";\n RequestToken(TOKEN_OPERATION.UNLOCK_VERSION, function (token) {\n var params = { \"DocumentID\": documentID, \"Version\": versionNumber, \"Token\": token };\n WebAccess.agent.transmitRequest(\"DeleteLocalCopy\", \"edmsplugin\", params).done(function (result) {\n resultMessage = L('LOCAL_COPY_DELETE_SUCCESS');\n updateOpenedDocumentsWidget();\n if (!SilentMode) {\n ShowTopSpinnerResult(resultMessage);\n }\n RemoveItemFromRecoveryList(documentID, versionNumber);\n if (OnDeleteCallback) OnDeleteCallback();\n }).fail(function (result) {\n try {\n resultMessage = result.message;\n } catch (e) {\n resultMessage = L('LOCAL_COPY_DELETE_FAIL');\n }\n\n if (!SilentMode) ShowError(resultMessage);\n });\n }, documentID, versionNumber);\n }\n\n if (SilentMode) {\n OnConfirmDeleteLocalCopy();\n } else {\n var confirm = L(\"CONFIRM_DELETE_LOCAL_COPY\");\n var warning = LocalCopyRecommendedAction[(documentID + 'v' + versionNumber)] == 'DELETE' ? \"\" : L(\"MSG_RECOVERY_FROM_COPY\");\n ShowDocumentDeleteCopyConfirmation(confirm, warning, OnConfirmDeleteLocalCopy);\n }\n });\n}\n\n// Показать окно для обработки локальных копий.\nfunction ShowLocalCopiesWindow(localCopies) {\n CallService(\"/ModalWindow.asmx/Create\", { ControlName: \"LocalCopiesProcess\", Params: $.toJSON({ Documents: localCopies }) }, function (res) {\n if (res.Success) {\n var content = $(res.Result.html);\n if (content.children().length > 0) {\n var instruction = MakeInfoMessage(L(localCopies.length == 1 ? 'LOCAL_COPY_RECOVERY_INSTRUCTION' : 'LOCAL_COPIES_RECOVERY_INSTRUCTION'))[0].outerHTML;\n var dialog = new WebAccess.components.dialogs.BaseDialog({ wordWrap: false, maxHeight: 400 });\n dialog.title = L(\"EDOCUMENT_LOCAL_COPIES\");\n dialog.setHtml(instruction + $('
').css('overflow-y', 'auto').css('overflow-x', 'hidden').css('position', 'relative').css('max-height', 400).html(content)[0].outerHTML);\n dialog.isShowOkButton = false;\n dialog.cancelText = L('CLOSE');\n dialog.isShowCancelButton = true;\n dialog.width = 630;\n dialog.show();\n BindHelpIcoClickOnModalWindow('RestoreDocuments', $('#dialog_content_' + dialog.id).parents('.ui-dialog'));\n }\n if (res.Result.initJs) {\n var f = new Function(res.Result.initJs);\n setTimeout(function () {\n f.apply(window);\n }, 10);\n }\n } else {\n if (res.Error == \"NO_DOCS\") { console.log('no local copies'); }\n }\n HideTopSpinner();\n });\n}\n\nfunction RemoveItemFromRecoveryList(DocID, Version) {\n var dialog = $('div[role=dialog]:visible');\n dialog.find('div#' + DocID + '[version=' + Version + ']').remove();\n if (IsRecoveryListEmpty(dialog)) {\n //AddEmptyItemToList(dialog);\n CloseRecoveryDialog(dialog);\n }\n}\n\nfunction AddEmptyItemToList(dialog) {\n dialog.find('#modal_window').children('span').append('' + L(\"EMPTY\") + '');\n}\n\nfunction IsRecoveryListEmpty(dialog) {\n return dialog.find('#modal_window').find('.List').length == 0;\n}\n\nfunction CloseRecoveryDialog(dialog) {\n dialog.find('.ui-icon-closethick').click();\n}\n\nfunction updateOpenedDocumentsWidget() {\n if (Core.footer.openedDocumentsWidget)\n Core.footer.openedDocumentsWidget.update();\n};","/// \n\nfunction RequestPasswordForDecryption(Doc, OnPasswordEnter, OnClose, SetNewPassword, ChangePassword) {\n var settings = {\n ok: function () {\n var password = $(\"#docPassword\").val();\n $(\"#docPassword\").data('entered', true);\n if (!!SetNewPassword && OnPasswordEnter) {\n var passwordConfirm = $('#docPasswordConfirm').val();\n return OnPasswordEnter(password, passwordConfirm);\n }\n if (!!ChangePassword && OnPasswordEnter) {\n var oldPassword = $('#docOldPassword').val();\n var passwordConfirm = $('#docPasswordConfirm').val();\n return OnPasswordEnter(oldPassword, password, passwordConfirm);\n }\n if (OnPasswordEnter) return OnPasswordEnter(password);\n }\n };\n var dialog = new WA.components.dialogs.BaseDialog(settings);\n\n var docName = '
';\n //'
' +\n //'
' + Doc.ClientName + '.' + Doc.Editor.Extension.toLowerCase() + '
' +\n //'
';\n var passwordInput = '
' +\n (!!ChangePassword ? '' : '') +\n '' +\n (!!SetNewPassword || !!ChangePassword ? '' : '') +\n '
';\n\n\n dialog.title = L(\"ENTER_PASSWORD\");\n dialog.isShowCancelButton = true;\n //dialog.onClose = function () { clearAllModalDivs(); }\n if (!!OnClose) dialog.onClose = function() { OnClose(); };\n dialog.onOpen = function () { BindPasswordFieldToOk(dialog); dialog.disableButton('modal_ok_button'); };\n dialog.setHtml(docName + passwordInput);\n dialog.show();\n return dialog;\n}\n\nfunction OnKeyUpPassDoc(event, el, id) {\n if (event.keyCode == 13) {\n event.preventDefault();\n event.stopPropagation();\n var button = $('#dialog_content_' + id).parent().parent().find('button.primary'); //$('div.ui-dialog').find('.ui-dialog-buttonset:visible').children().first();\n if (!button.hasClass('disabled')) button.click();\n return false;\n }\n}\n\nfunction BindPasswordFieldToOk(dialog) {\n $('#docPassword').keyup(function (ev) {\n if ($(this).val() != '')\n {\n dialog.enableButton('modal_ok_button');\n }\n else {\n dialog.disableButton('modal_ok_button');\n }\n });\n}\n\n\nfunction SetPasswordForDoc(checkbox) {\n checkbox = $(checkbox);\n if (checkbox.is(':checked')) {\n if (true){//$('#__SELECTED_USERS').val().indexOf('g_') == -1) {\n if (!!checkbox.data('password')) {\n }\n else {\n if (WA.Document.Encoding < 2) {\n RequestPasswordForDecryption(\"\", function (password, confirmation) {\n if (!IsPasswordConfirmed(password, confirmation)) return false;\n checkbox.data('password', password);\n return true;\n },\n function () {\n if (!!!checkbox.data('password') && checkbox.data('password') != \"\") { checkbox.removeAttr('checked'); }\n },\n true);\n }\n }\n }\n else {\n ShowWarning(L('CANNOT_ENCRYPT_PASSWORD_USERGROUP_QUALIFIED'), null, 400);\n checkbox.removeAttr('checked');\n }\n }\n else {\n if (WA.Document.Encoding >= 2) {\n RequestPasswordForDecryption(\"\", function (password) {\n checkbox.data('password', password);\n //WA.current.toolBar.buttons.ChangeDocPassword.disable();\n },\n function () {\n if (!!!checkbox.data('password')) { checkbox.attr('checked', true); }\n });\n }\n else {\n checkbox.data('password', null);\n }\n }\n}\n\nfunction ChangeDocPassword() {\n\n var changePassword = function (oldPassword, password, encryptionKey) {\n encryptionKey = !!encryptionKey ? encryptionKey : \"\";\n WA.services.call(\"/Document.asmx/ChangePassword\", { DocumentID: WA.Document.ID, OldPassword: oldPassword, NewPassword: password, EncryptionKey : encryptionKey }).success(function () {\n HideTopSpinner(L(\"USER_PASSWORD_WAS_CHANGED_SUCCESSFULLY\"), 2000);\n }).fail(function (error) {\n ShowError(error);\n });\n };\n\n if (WA.Document.Encoding >= 2)\n {\n RequestPasswordForDecryption(\"\", function (oldPassword, password, confirmation) {\n if (!IsPasswordConfirmed(password, confirmation)) return false;\n\n if (WA.Document.Encoding == 3) {\n RequestToken(TOKEN_OPERATION.DOWNLOAD_DOCUMENT_BODY, function (token) {\n WebAccess.agent.transmitRequest(\"getdocdecryptedkey\", \"edmsplugin\",\n { \"DocID\": WA.Document.ID, \"Version\": 0, \"Token\": token, \"EncodeType\": WA.Document.Encoding, \"EncryptionPluginName\": WA.Document.PluginName, \"Password\": oldPassword })\n .done(function(response) {\n changePassword(oldPassword, password, response.result);\n }).fail(function(response) {\n ShowError(response.message);\n });\n }, WA.Document.ID, 0);\n return true;\n }\n changePassword(oldPassword, password, null);\n return true;\n }, null, null, true);\n }\n}\n\nfunction IsPasswordConfirmed(password, confirmation)\n{\n if (password != \"\" && confirmation == \"\") {\n ShowWarning(L(\"WRN_ENTER_PASSWORD_CONFIRAMATION\"), null, 350, function () { $('#docPasswordConfirm').focus(); });\n return false;\n }\n if (password != confirmation) {\n ShowWarning(L(\"WRN_PASSWORD_AND_CONFIRMATION_MUST_MATCH\"), null, 350, function () { $('#docPasswordConfirm').focus(); });\n return false;\n }\n if (password == \"\") return false;\n return true;\n}\n\nfunction SetCertForDoc(checkbox) {\n checkbox = $(checkbox);\n var passwordCheckbox = $('#EncryptWithPasswordCheckBox');\n if (checkbox.is(':checked')) {\n if (true){//$('#__SELECTED_USERS').val().indexOf('g_') == -1) {\n if (WA.Document.Encoding == 3) {\n passwordCheckbox.data('password', null);\n }\n if (WA.Document.Encoding == 2) {\n RequestPasswordForDecryption(\"\", function (password) {\n passwordCheckbox.data('password', password);\n return true;\n },\n function () {\n if (!!!passwordCheckbox.data('password') && checkbox.data('password') != \"\") { checkbox.removeAttr('checked'); }\n });\n }\n }\n else {\n ShowWarning(L('CANNOT_ENCRYPT_CERT_USERGROUP_QUALIFIED'), null, 400);\n checkbox.removeAttr('checked');\n }\n }\n else {\n if (WA.Document.Encoding == 3) {\n if (!passwordCheckbox.data('password') || passwordCheckbox.data('password') == \"\") {\n RequestPasswordForDecryption(\"\", function (password) {\n passwordCheckbox.data('password', password);\n //WA.current.toolBar.buttons.ChangeDocPassword.disable();\n return true;\n },\n function () {\n if (!passwordCheckbox.data('password') && passwordCheckbox.data('password') != \"\") { checkbox.attr('checked', true); }\n });\n }\n }\n }\n}\n","/**\n* @deprecated\n*/\nfunction ErrorShow(msg, IsError) {\n $.when(WA.FormControlsInit).then(function () {\n // Скрываем другие сообщения об ошибках, т.к. может быть показано сообщение другого типа.\n WA.CMP.NTF.InlineHint.hideAll();\n if (IsError) {\n WA.CR.inlineHint.showError(msg);\n } else {\n WA.CR.inlineHint.showWarning(msg);\n }\n });\n}\n\n/**\n* @deprecated\n*/\nfunction ErrorHide() {\n $.when(WA.FormControlsInit).then(function () {\n WA.CMP.NTF.InlineHint.hideAll();\n });\n}\n\n/**\n* @deprecated\n*/\nfunction GetBuilderResources(msg) {\n var R;\n $.ajax({\n type: \"POST\",\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n url: \"/EDocument.asmx/GetBuilderResources\",\n data: \"{'Code':'\" + msg.replace(\"\\'\", \"\\\\'\") + \"'}\",\n async: false,\n cache: false,\n success: function (res) {\n R = res.d;\n }\n });\n CheckForLoginPage(R);\n return R;\n}\n\n/* =Связанные документы=========================================================================================================================== */\nfunction LoadSubRelations(type, obj, id, refcode, filter, additional) {\n $.ajax({\n type: \"GET\",\n dataType: \"html\",\n url: \"DynControl.ashx?c=\" + type + \"&id=\" + id + \"&refcode=\" + refcode + \"&filter=\" + filter + '&additional=' + additional,\n success: function (res) {\n if (!CheckForLoginPage(res)) {\n obj.html(res);\n var list = obj.find('.List');\n InitHover(list);\n InitListClick(list);\n if (WA.ObjectListInit.state() === \"resolved\" && !!WA.CR.objectList) WA.CR.objectList.fire(\"itemsChange\");\n }\n }\n });\n}\n\nfunction ShowRelations(type, obj) {\n var tr = $(obj).parent();\n\n var filter;\n var tbl = tr.parent();\n var tblID = tbl.attr('id');\n var tbl_ids = tblID.split('_');\n if (tbl_ids[0] == 'REL') {\n filter = tbl_ids[1];\n } else {\n filter = $('#OBJ_' + tblID).val() + \"-\";\n }\n\n var additional = $('#ADD_' + tblID).val();\n\n var id = tr.attr('id');\n var refcode = tr.attr('compcode');\n var isAdded = tr.next().hasClass('SubBounds');\n var trAdd;\n if (!isAdded) {\n tr.after('
');\n }\n trAdd = tr.next();\n if (trAdd.is(':hidden') || !isAdded) {\n trAdd.show();\n $(obj).find('.att_plus\\\\.png').removeClass('att_plus.png').addClass('att_minus.png');\n trAdd.html('');\n LoadSubRelations(type, trAdd, id, refcode, filter, additional);\n } else {\n trAdd.hide();\n $(obj).find('.att_minus\\\\.png').removeClass('att_minus.png').addClass('att_plus.png');\n }\n}\n\n\n\n/* =================================================================================================================================================== */\n/* =================================================================================================================================================== */\n\n/* =Поиски============================================================================================================================================ */\nfunction CheckIsSearchNotEmpty(el, emptyCriteriaWarningMessage, callback) {\n var isAnyCriteriaFilled = false;\n var criteriaContainer = $(el).parents(\".Search_Table\");\n var criterionInputs = $.unique(criteriaContainer.find(\":text, input[type=hidden], select\"));\n\n $.each(criterionInputs, function (i, criterionInput) {\n //Исключаем критерий архивности\n if (!criterionInput.id.endsWith(\"ArchiveTaginp\") && !criterionInput.id.endsWith(\"ArchiveTag\"))\n isAnyCriteriaFilled = isAnyCriteriaFilled || ($.trim($(criterionInput).val()) != '');\n });\n\n if (!isAnyCriteriaFilled) {\n var dialog = new WA.CMP.dialogs.MessageBox();\n dialog.showWarning(emptyCriteriaWarningMessage, null, null, function () {\n return false;\n });\n } else {\n callback();\n return true;\n }\n}\n\nfunction BindOnEnterToSearchCrit() {\n //$('div.Search_Table input[type=\"text\"]')\n $('div.Search_Table').children().children(':not(.Search_Date_Row)').find('input[type=text]').keyup(function (event) {\n if (event.keyCode == 13 && $('div.rs_container:visible').length == 0) {\n $('input.Search_Btn:visible:first').click();\n }\n });\n}\nfunction ClearSearch() {\n //Lysenko_YN: ищем в Search_TD, так как иначе очищает название кнопок\n var searchTD = $('.Search_Table').find('.Search_TD');\n searchTD.find('input').val(\"\");\n searchTD.find('.rs_SelItems').find('span').remove();\n //замечание 93683\n if (false) {\n //снимаем галочки с checkbox\n var checkboxToClear = searchTD.find('input[type=\"checkbox\"]');\n if (checkboxToClear.is(\":visible\")) {\n checkboxToClear.removeAttr('checked');\n //вызываем функцию, иначе сообщение об ошибке не появляется и кнопка поиска не дизейблится\n DisableSearchBtn('Object');\n }\n }\n}\n/* =================================================================================================================================================== */\n/* =================================================================================================================================================== */\n\nfunction RefSelect_GetSelectedValue(item, parent) {\n var RefCode = $(item).data('refcode');\n var RecID = $('#hSelID_' + parent).val();\n if (RecID !== '') {\n var b = RecID.split(';');\n if (b.length == 2) {\n RefCode = b[0];\n RecID = b[1];\n }\n return [RefCode, RecID];\n } else {\n return null;\n }\n}\n\nfunction Reference_OpenRecordInNewWindow(item, parent, viewName) {\n var viewNameParam = viewName ? \"&refview=\" + viewName : \"\";\n var v = RefSelect_GetSelectedValue(item, parent);\n window.open(\"/Reference.aspx?sys=\" + g_SysCode + \"&ext=\" + g_ExtName + \"&compcode=\" + encodeURI(v[0]) + viewNameParam + \"&id=\" + v[1] + \"&parent=\" + parent, 'RefRec' + v[1]);\n}\n\nfunction InputOnMouseOverForShowAddIcons(el, inp, IsShowCreateButton, IsAccessDenied) {\n var me = $(el).closest('.reference_requisite');\n var icons = me.find('.Req_AdditionalIcons');\n\n var OpenIco = icons.find('.OpenCardIco');\n var CreateRecIco = icons.find('.CreateRecIco');\n var selVal = RefSelect_GetSelectedValue(OpenIco, inp.attr('id'));\n if (selVal != null && selVal !== '*' && !IsAccessDenied && (inp.data('selected') == \"true\" || inp.data('selected') == \"selected\" || inp.data('selected') === true) && /^\\d+$/.test(selVal[1])) {\n OpenIco.show();\n } else {\n OpenIco.hide();\n }\n\n if (IsShowCreateButton && !IsAccessDenied && inp.attr('readonly') != 'readonly') {\n CreateRecIco.show();\n } else {\n CreateRecIco.hide();\n }\n\n icons.show();\n\n icons.find('.ErrorRecIco').eq(0).attr(\"title\", \"Возникла какая-то ошибка\");\n icons.find('.ErrorRecIco').show();\n}\n\nfunction InputOnMouseOutForShowAddIcons() {\n $(this).parent().find('.Req_AdditionalIcons').hide().find('p').hide();\n}\n\n/* =================================================================================================================================================== */\n/* =================================================================================================================================================== */\n\n/* =Фильтрация ввода пользователя согласно регулярному выражению====================================================================================== */\n(function ($) {\n $.fn.extend({\n Validator: function (regexstr, decimalSeparator) {\n this.each(function () {\n $(this).keypress(function (event) {\n if ($(this).attr('readonly') === 'readonly') return;\n\n var self = this;\n var code = event.which;\n if (code != 0 && code != 8) {\n var c = String.fromCharCode(code); // определяем какая буква была нажата.\n var docSelection = document.selection;\n if (docSelection) { // для IE<11\n self.focus();\n var Sel = docSelection.createRange();\n var SelLength = docSelection.createRange().text.length;\n Sel.moveStart('character', -self.value.length);\n SelStart = Sel.text.length - SelLength;\n SelEnd = SelStart + SelLength;\n $(event.target).trigger('change');\n } else {\n SelStart = event.target.selectionStart;\n SelEnd = event.target.selectionEnd;\n if (WA.ENV.browser.name == 'IE' && WA.ENV.browser.major == '11') {\n $(event.target).trigger('change');\n }\n }\n //формируем новое значение.\n var val = self.value.substr(0, SelStart) + c + self.value.substr(SelEnd);\n var patt = new RegExp(regexstr);\n if (!patt.test(val)) {\n return false;\n }\n var isIDevice = (/iphone|ipad/gi).test(navigator.appVersion);\n\n if (decimalSeparator) {\n if (isIDevice) {\n setTimeout(function () {\n //Lysenko_YN: иначе значения при вводе дублируются. Происходит потому что при вводе значения self.value уже содержит измененное значение а не исходное.\n val = self.value;\n $(self).val(val.replace(/[.,]/g, decimalSeparator));\n }, 0);\n }\n else {\n setTimeout(function () { $(self).val(val.replace(/[.,]/g, decimalSeparator)) }, 0);\n }\n }\n return true;\n }\n });\n });\n return this;\n }\n });\n})(jQuery);\n/* =================================================================================================================================================== */\n/* =================================================================================================================================================== */\n\n/* =Перезагрузка окна после открытия на изменения версии============================================================================================== */\nfunction EditVersion(el, msg) {\n ShowTopSpinner(msg);\n var funcReload;\n if (typeof ReloadVersionList == \"undefined\")\n funcReload = function () { window.location.reload(); };\n else\n funcReload = ReloadVersionList;\n setTimeout(funcReload, 1000);\n}\n/*function ReloadVerAddRegion(ID) {\nvar el = document;\nvar update_func = function (ID, el) {\n//(\"tr[id=\" + ID + \"].AddRegion tr[id=ViewList_VersionList]\", el).click();\nShowAddRegion($(\"tr[id=\" + ID + \"]:first\"), true, true);\n}\nif (ID == null) {\nID = window.name.substring(4);\nif (window.opener != null) {\nel = window.opener.document;\nupdate_func(ID, el);\n}\n} else {\nsetTimeout(function () { update_func(ID, el); }, 1000);\n}\n}*/\nfunction VerLockOrUnlock(ID, Ver, msg, addArea) {\n var s_res = {};\n ShowTopSpinner(msg);\n var funcReload;\n if (typeof ReloadVersionList == \"undefined\")\n funcReload = function () { window.location.reload(); };\n else\n funcReload = ReloadVersionList;\n $.ajax({\n type: \"POST\",\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n url: \"/EDocument.asmx/VersionLockUnlock\",\n data: \"{'EDocID':'\" + ID + \"', 'VerNum':'\" + Ver + \"'}\",\n async: false,\n cache: false,\n success: function (res) {\n HideTopSpinner(\"\", 1);\n s_res = res.d;\n if (!CheckForLoginPage(s_res)) {\n if (s_res.Warning == '' && s_res.Error == '') {\n funcReload();\n } else {\n if (s_res.Warning != '') {\n ErrorShow(s_res.Warning, false);\n } else {\n ErrorShow(s_res.Error, true);\n }\n }\n }\n }\n });\n}\n/* =================================================================================================================================================== */\n/* =================================================================================================================================================== */\n\nvar oldf = '';\nfunction InitContentListToolbox(cont_id) {\n setInlineHint();\n EnableOrDisableCheckAll();\n}\n\nfunction EnableOrDisableCheckAll() {\n var checkBox = $('#QFilter').find('#chkAll');\n if (checkBox.length) {\n if ($('.List').length > 0) {\n checkBox.attr('disabled', false);\n }\n else checkBox.attr('disabled', true);\n }\n}\n\nfunction clearInlineHint(obj) {\n if (!$.ipad) {\n if ($(obj).hasClass('Req_Gray')) {\n $(obj).val('').removeClass('Req_Gray');\n }\n }\n}\n\nfunction setInlineHint() {\n var labels = L('SEARCH_BY') + \" \";\n var filterVariants = $(\"#QFilter input[id*='FilterVariantsLoc']\");\n if (filterVariants.length > 0) {\n var arr = filterVariants.val().split(\";\");\n for (i = 0; i < arr.length; i++) {\n labels += arr[i].toLowerCase() + \", \";\n }\n labels = labels.substr(0, labels.length - 2);\n $('#FastSearch').attr('placeholder', labels);\n }\n}\n\nfunction FilterEDMSContent(componentID, filterVal, filterRequisites) {\n WA.CR.objectList.setLikeFilter(filterVal, filterRequisites).reload();\n\n if (Core.isStatisticEnabled) {\n ///Запись в статистику\n WA.CR.statistics.write({\n page: WA.getLocation(),\n action: \"FilterQuery\",\n area: 'FilterPanel',\n target: $('#' + componentID).get(0)\n });\n };\n}\n\nvar g_clipboard = null;\n\n/* =================================================================================================================================================== */\n/* =================================================================================================================================================== */\n\n\n/* = Клиентская сортировка ============================================================================================== */\nfunction LinkClick(el) {\n $(\"form:first\").attr(\"action\", el.href).submit();\n}\n\n// Сохранение последнего выбранного объекта.\nfunction SaveLastRun(id) {\n var WSSParam = GetWSSParam(location.href, true);\n $.ajax({\n type: \"POST\",\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n url: \"/Wizard.asmx/LastRun\" + WSSParam,\n data: \"{'ID':'\" + id + \"'}\",\n async: false,\n cache: false,\n success: function (res) {\n }\n });\n}\n\n/* =================================================================================================================================================== */\n// пролучить код ТМа по его ИД.\nfunction GetStandardRouteCodeByAnalit(routeID, successCallback, failCallback) {\n GetRecordWithFilteredRequisitedByAnalit(L(\"STANDARADROUTEREFCODE\"), \"[\" + L(\"REQID\") + \"] = \" + routeID, \"\", [L(\"REQCODE\")], 1, 0, 0, \"\", successCallback, failCallback);\n}\n\n// options = {\n// ReferenceCode: \"КодСправочника\",\n// FilterExpression: \"[ИД] = \" + StandardRouteID, // фильтр\n// FilterValue: string,\n// Requisites: [\"Req1\", \"Req2\", ...],\n// RecordsCount: int,\n// StartFromRecord: int,\n// SortIndex: int,\n// SortDirection: string\n//}\nfunction GetRecordWithFilteredRequisitedByAnalit(referenceCode, filterExpression, filterValue, requisites, recordsCount, startFromRecord, sortIndex, sortDirection, successCallback, failCallback) {\n CallServiceSync(\"/Reference.asmx/GetRecords\", {\n ReferenceCode: referenceCode,\n FilterExpression: filterExpression,\n FilterValue: filterValue,\n Requisites: requisites,\n RecordsCount: recordsCount,\n StartFromRecord: startFromRecord,\n SortIndex: sortIndex,\n SortDirection: sortDirection\n }, function (data) {\n if (data.Success) {\n if (typeof successCallback != 'undefined') {\n successCallback(data);\n }\n } else {\n failCallback(data);\n }\n });\n}\n\n/* =================================================================================================================================================== */\n\n/* =Пользовательский фильтр ============================================================================================== */\nfunction ToggleItem(el) {\n var tr = el.parents('.List');\n if (tr.hasClass('selected')) {\n tr.removeClass('selected');\n el.prop('checked', false);\n\n } else {\n tr.addClass('selected');\n el.prop('checked', true);\n }\n el.trigger('itemChecked', []);\n}\n\nfunction ToggleAllItem(el) {\n var inp;\n var isSearchMode = (GetParamInURL('mode') == 'search');\n if ($(el).is(':checked')) {\n if (!isSearchMode) {\n $('.List:not(.selected)').each(function () {\n if ($(this).is(':visible')) {\n inp = $(this).find('input:first').attr('checked', true);\n ToggleItem(inp);\n }\n });\n $(el).attr('title', L('DESELECT_ALL'));\n }\n else {\n $(el).removeAttr('checked').attr('title', L('CANNOT_COPY_ALL_LINKS_IN_SEARCH_RESULTS'));\n }\n }\n else {\n $(\".List.selected\").each(function () {\n inp = $(this).find('input:first').attr('checked', false);\n ToggleItem(inp);\n });\n $(el).removeClass('notallyet').attr('title', L(isSearchMode ? 'CANNOT_COPY_ALL_LINKS_IN_SEARCH_RESULTS' : 'SELECT_ALL'));\n }\n UpdateCopyPasteIcons();\n}\n\nfunction ToggleAllItemsInComponent(comp_id) {\n var comp = $('#' + comp_id);\n var el = $('#' + comp_id + '_chkAll');\n\n var inp;\n if (el.is(':checked')) {\n comp.find('.List:not(.selected)').each(\n function () {\n inp = $(this).find('input:first').attr('checked', 'true'); //.show();\n ToggleItem(inp);\n }\n );\n $(el).attr('title', L('DESELECT_ALL'));\n }\n else {\n comp.find('.selected').each(\n function () {\n inp = $(this).find('input:first').attr('checked', ''); //.hide();\n ToggleItem(inp);\n }\n );\n $(el).attr('title', L('SELECT_ALL'));\n }\n UpdateCopyPasteIcons(comp);\n var isChecked = el.is(':checked');\n setTimeout(function () { el.attr('checked', isChecked) }, 0); // WTF fix (something makes another check, so to override this...)\n}\n\n// Обновляет иконки (9+)\nfunction UpdateSelectionNumbers() {\n var objList = $('.object_contents:first');\n var num = $('.List.selected', objList).length - (objList.hasClass('ReferenceTable') ? 1 : 0);\n if (num == 0) {\n $('#toolbar_container .selection_numbers_icon_container').remove();\n } else {\n $('#toolbar_container .selection_numbers:not(:has(>.selection_numbers_icon_container))').prepend('
');\n var cont = $('#toolbar_container .selection_numbers_icon_container');\n\n // найти все .List:not(.selected) в objList (все элементы с классом List, но без класса selected в objList). Если таких элементов 0 => выбрали все.\n if ($('.List:not(.selected)', objList).length == 0) {\n num = GetRowsCount();\n }\n\n var title = L('SEND_AS_ATTACHMENT', num);\n if (num > 9) num = 10;\n var iconSrc = format('links_count_{0}.png', num);\n cont.html(format('

', iconSrc, title));\n }\n}\n\nvar UpdateCopyPasteIcons; // устанавливает .disabled у \"копировать\" и \"удалить\", если не выбран ни один элемент\n(function () {\n\n function GetButtonsData(comp) {\n return comp.data('copypasteicons') || (function () {\n var res = {};\n res.copy_button = comp.find('div.copy_btn:first');\n if (res.copy_button.length) {\n res.del_button = comp.find('div.delete_btn');\n res.sign_button = comp.find('div.sign_btn');\n res.sign_button_initially_disabled = res.sign_button.hasClass('disabled');\n res.copy_button_initially_disabled = res.copy_button.hasClass('disabled');\n res.del_button_initially_disabled = res.del_button.hasClass('disabled');\n res.copy_button_title = res.copy_button.attr('title');\n res.del_button_title = res.del_button.attr('title');\n }\n comp.data('copypasteicons', res);\n return res;\n })();\n }\n\n UpdateCopyPasteIcons = function (listReq) {\n var isFilled = false; // ListRequisite из одного объекта. Если там есть объект, то кнопки копировать и удалить все равно работают.\n if (!listReq || !listReq.length) {\n listReq = $('.object_contents:first');\n UpdateSelectionNumbers();\n } else {\n var lr = ListRequisite(listReq.attr('id'));\n isFilled = !lr.IsList && lr.Values && lr.Values.length > 0;\n }\n var b = GetButtonsData(listReq);\n var isListReq = listReq.hasClass('ListRequisite');\n\n /**\n * Если есть выбранные ссылки указанного типа\n * @inner\n * @function isSelected\n * @return {boolean}\n */\n var isSelected = function (objType) {\n return (listReq.find('.List.' + objType + '_obj.selected').length);\n };\n\n if (b.copy_button.length) {\n if (isFilled || listReq.find((isListReq ? '' : '>') + '.List.selected').length) {\n if (!b.copy_button_initially_disabled) b.copy_button.removeClass('disabled').attr('title', b.copy_button_title);\n\n // Отображаем кнопки для подписания всегда, т.к. не знаем, возможно ли запустить агент.\n if (isSelected('Job') || isSelected('EDoc') || isSelected('Task')) {\n if (!b.sign_button_initially_disabled) b.sign_button.removeClass('disabled').attr('title', L('TOOLBAR_LINKS_SIGN_LINK_TOOLTIP'));\n } else {\n b.sign_button.attr('title', L(\"NO_LIST_SELECTION\"));\n }\n\n if (listReq.find((isListReq ? '' : '>') + '.List.selected.cannot_delete').length) {\n if (!b.del_button_initially_disabled) b.del_button.addClass('disabled').attr('title', L(\"CANNOT_DELETE_ATTACHMENTS_NOT_OWNED\"));\n } else {\n if (!b.del_button_initially_disabled) b.del_button.removeClass('disabled').attr('title', b.del_button_title);\n }\n }\n else {\n var reason = L(\"NO_LIST_SELECTION\");\n if (!b.copy_button_initially_disabled) b.copy_button.addClass('disabled').attr('title', reason);\n if (!b.del_button_initially_disabled) b.del_button.addClass('disabled').attr('title', reason);\n if (!b.sign_button_initially_disabled) b.sign_button.addClass('disabled').attr('title', reason);\n //При пустом списке чекбокс недизейблился\n EnableOrDisableCheckAll();\n }\n }\n };\n\n})();\n\n/////////////////////////////// ListRequisite ////////////////////////////////////////////////////////////////////////\n\nvar updateChkAll = function (comp, chkAll) {\n var checkedBoxes = comp.find('input.chk:checked');\n if (checkedBoxes.length > 0) {\n chkAll.attr('checked', '1').attr('title', L('DESELECT_ALL'));\n } else {\n chkAll.removeClass('notallyet').removeAttr('checked').attr('title', L('SELECT_ALL'));\n }\n};\n\nfunction ToggleFolderItem($this) {\n var chk;\n if ($this.hasClass('chk')) {\n chk = $this;\n } else {\n if ($this.hasClass('Icon32')) {\n chk = $this.parent().find('input.chk:first');\n } else {\n chk = $this.find('input.chk:first');\n }\n }\n ToggleItem(chk);\n}\n\n// Инициализирует компоненту EntityList.\nfunction EntityListInit(_comp, allowSelect, enableActions) {\n var comp = _comp;\n var tr = comp.children('div.folder_item');\n comp.children('div:odd').addClass('even');\n\n // Что бы обновить кнопки, в том числе, когда ничего не найдено.\n UpdateCopyPasteIcons(listReq);\n\n if (tr.length == 0)\n return;\n\n var el0 = $(tr[0]);\n if ($.scrollActive && WA.ENV.isAndroid() && _comp.hasClass('object_contents')) {\n var h = _comp.offset().top + _comp.height() + 50;\n _comp.css('margin-bottom', '-50px');\n setRealHeightAndWidth(null, h);\n $.superHeight = true;\n }\n if (!el0.data('initialized')) {\n el0.data('initialized', '1');\n InitObjectContentsAutoLoad();\n }\n\n var listReq = _comp.parents('.ListRequisite');\n var chkAll = $(\"#\" + listReq.attr('id') + \"_chkAll\");\n if (chkAll.length == 0) {\n comp = comp.parents(':has(#chkAll)');\n chkAll = comp.find('#chkAll');\n }\n\n\n /**\n * Обработчики того, что произойдет при клике на строку списка\n */\n var eventHandler = function () {\n\n /**\n * @function updateSelection\n * @private\n */\n var _updateSelection = function () {\n updateChkAll(_comp, chkAll.addClass('notallyet'));\n UpdateCopyPasteIcons(listReq);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Помечает элемент выборанным\n * @function _selectItem\n * @param {Object} jItem - элемент списка. В данном случае tr.\n * @private\n */\n var _selectItem = function (jItem) {\n ToggleFolderItem(jItem);\n _updateSelection();\n jItem.redraw();\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выбор элемента при клике на него.\n * @function bindSelectItems\n */\n this.bindSelectItems = function (jItems) {\n jItems.unbind('mousedown.entitylist').bind('mousedown.entitylist', function (ev) {\n if (ev.which === 1) {\n ev.stopPropagation();\n _selectItem($(this));\n }\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Навесить события для открытия элемента.\n * @function bindOpenItems\n */\n this.bindOpenItems = function (jItems) {\n jItems\n .find(\".object-list-item__icon\")\n .off('mousedown.entitylist')\n .on('mousedown.entitylist', function (ev) {\n // Предотвращаем выделение галочкой.\n ev.stopPropagation();\n })\n .off('click.entitylist')\n .on('click.entitylist', function (ev) {\n ev.stopPropagation();\n var jLink = $(this).closest('.object-list-item').find(\".object-list-item__title\");\n DoFirstAction(jLink, jLink.data(\"type\"));\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _comp.data('updateSelection', _updateSelection);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n var handler = new eventHandler();\n\n // Отображение/скрытие действий (по умолчанию отображаем).\n if (enableActions) {\n InitShowHideActions(tr);\n }\n\n InitHover(tr);\n\n handler.bindOpenItems(tr);\n if (allowSelect) {\n handler.bindSelectItems(tr);\n };\n\n tr.unbind('contextmenu.entitylist').bind('contextmenu.entitylist', function (e) {\n e.preventDefault();\n e.stopPropagation();\n ShowContextMenu($(this), {}, { 'left': e.pageX, 'top': e.pageY }, true);\n\n //Обновляем доступность кнопок для элементов списка, так как rightClick сам не провоцирует\n UpdateCopyPasteIcons(listReq);\n return false;\n });\n\n if (listReq.length) {\n var lr = ListRequisite(listReq.attr('id'));\n if (lr.onUpdate) lr.onUpdate.call(lr);\n }\n}\n\nfunction InitListClick(trs) {\n trs.unbind('mousedown.entitylist').bind('mousedown.entitylist', function (ev) {\n ev.stopPropagation();\n var $this = $(this);\n ToggleFolderItem($this);\n updateChkAll($this.parent(), $('#chkAll').addClass('notallyet'));\n });\n}\n\nfunction InitHover(trs) {\n if ($.ipad) return;\n var hoverEventNames = GetEventsName('hover_entitylist');\n trs\n .unbind(hoverEventNames[0]).bind(hoverEventNames[0], function (ev, isManualTriggered) {\n if (!isKeyNavigationActive || isManualTriggered) {\n $('.List.hover').removeClass('hover');\n $(this).addClass('hover');\n }\n })\n .unbind(hoverEventNames[1]).bind(hoverEventNames[1], function (ev, isManualTriggered) {\n if (!isKeyNavigationActive || isManualTriggered) {\n $(this).removeClass('hover');\n }\n });\n}\n\nfunction InitShowHideActions(trs) {\n if (!$.ipad) {\n trs.each(function () {\n var $this = $(this);\n $this\n .unbind('mouseenter.animate_entitylist').bind('mouseenter.animate_entitylist', function (ev, isManualTriggered) {\n if (!isKeyNavigationActive || isManualTriggered) {\n EntityList_ShowAction($this, trs);\n }\n })\n .unbind('mouseleave.animate_entitylist').bind('mouseleave.animate_entitylist', function (ev, isManualTriggered) {\n if (!isKeyNavigationActive || isManualTriggered) {\n EntityList_HideAction($this);\n }\n });\n });\n }\n}\n\nvar dbg_is_hover = false;\n\n// Отображение действий для элемента списка.\nfunction EntityList_ShowAction(el, trs) {\n // Формирует панель быстрыъ действий.\n function MakeActions(el) {\n if (typeof listActionsSettings != 'undefined') {\n var objKindMap = { \"edoc\": \"EDocument\", \"task\": \"Task\", \"job\": \"Job\", \"fol\": \"Folder\", \"ref\": \"ReferenceRecord\", \"usr\": \"UserSettings\", 'ver': 'EDocumentVersion' };\n var proxy = GetObjectInfoFromRow(el);\n var objKind = proxy.kind.toLowerCase();\n proxy.type = objKindMap[objKind];\n\n var sett;\n var mode = proxy.tr.attr('mode');\n switch (mode) {\n case 'EDocRestore':\n sett = listActionsSettings['EDocRestore'];\n break;\n case 'OpenedDocs':\n sett = listActionsSettings['OpenedDocs'];\n break;\n default:\n sett = listActionsSettings[proxy.type];\n }\n\n if (sett) {\n // Выберем только те действия, которые нужно показать.\n var actions = _.filter(sett.items.slice(0), function (item) { return item.needshow ? window[item.needshow](proxy) : true });\n if (actions.length > 0) {\n if (objKind == 'edoc' && mode != 'EDocRestore' && mode != 'OpenedDocs') {\n SetPreviewActionFirst(actions);\n if (g_isPreviewEnabled) SortEditActionsByPriority(actions);\n }\n var actionsHTML = '

';\n for (var i = 0; i < actions.length; i++) {\n var item = actions[i];\n // Формируем так что бы все параметры были в одинарных кавычках ($.toJSON делает все в двойных)\n var objStr = \"{'id\\':\" + proxy.id +\n \", 'kind':'\" + proxy.kind +\n \"', 'type':'\" + proxy.kind +\n \"', 'refcode':'\" + (typeof proxy.refcode == 'undefined' ? '' : proxy.refcode) +\n \"', 'version':'\" + proxy.tr.attr('version') +\n \"', 'encodeType':'\" + (!!proxy.tr.attr('encoding') ? proxy.tr.attr('encoding') : \"\") +\n \"', 'pluginName' : '\" + (!!proxy.tr.attr('encpluginname') ? proxy.tr.attr('encpluginname') : \"\") +\n \"'}\";\n\n // Формируем гиперссылку, если нужно.\n var hyperlink = MakeActionListItemHyperlink(item, proxy);\n\n // Формируем текст ссылки.\n var text = L(item.text);\n if (objKind == 'job' && item.id == 'MarkAsRead') {\n if (!el.hasClass('unread')) {\n text = L('MENU_MARK_AS_UNREAD');\n } else {\n text = L('MENU_MARK_AS_READ');\n }\n }\n // Формируем ссылку (быстрое действие).\n var ITEM_IMG_TEMPLATE = '';\n var iconHtml = (typeof item.icon !== 'undefined') ? format(ITEM_IMG_TEMPLATE, { icon: item.icon }) : '';\n actionsHTML += format('{img}', {\n 'img': iconHtml,\n 'name': item.id,\n 'href': (hyperlink != '' ? hyperlink : '#'),\n 'target': (item.innewwindow == 'True' ? ('target=\"' + proxy.kind + proxy.id + '\" ') : ' target=\"_self\" '),\n 'stopPropagation': 'if(typeof evt != \\'undefined\\') evt.stopPropagation(); else { cancelBubble(event); };',\n 'js': (typeof item.jsaction != 'undefined' ? '(function(CurrentActionHTMLElement) {{ ' + item.jsaction + ' }}).call(' + objStr + ',this);' : ''),\n 'retFalse': (hyperlink != '' ? '' : 'return false;'),\n 'title': text\n });\n }\n return actionsHTML + '
';\n }\n }\n }\n return \"\";\n }\n\n\n var content = $(el).addClass('showingActions').find('.content');\n if (!isKeyNavigationActive && content.length > 0) {\n // Формируем html-код действий.\n var actionsHTML = MakeActions(el);\n if (actionsHTML != '') {\n content.append(actionsHTML);\n content.find('.fastActions').show();\n }\n }\n}\n\n// ставит действие по умолчанию при нажатии на название документа на первое место в быстрых действиях\nfunction SetPreviewActionFirst(actions) {\n //var defaultAction = g_isPreviewEnabled ? 'preview' : (g_openDocForEditByDefault ? 'open' : 'viewineditor');\n if (actions[0].id.toLowerCase() != g_defaultListAction) {\n for (var i = 0; i < actions.length; i++) {\n if (actions[i].id.toLowerCase() == g_defaultListAction) {\n var temp = actions[i];\n actions[i] = actions[0];\n actions[0] = temp;\n break;\n }\n }\n }\n}\n\nfunction SortEditActionsByPriority(actions) {\n var defaultAction = 'open';//(g_openDocForEditByDefault ? 'open' : 'viewineditor');\n var secondAction = 'viewineditor';//(!g_openDocForEditByDefault ? 'open' : 'viewineditor');\n for (var i = 0; i < actions.length; i++) {\n if (actions[i].id.toLowerCase() == defaultAction && i > 0 && actions[i - 1].id.toLowerCase() == secondAction) {\n var temp = actions[i];\n actions[i] = actions[i - 1];\n actions[i - 1] = temp;\n break;\n }\n }\n\n}\n\nfunction DoNotShowInSearchResults() {\n return !Core.toolBars.main.isSearchMode();\n}\n\nfunction DoNotShowWhenAgentEnabled() {\n return !WA.agent.isAvailable();\n}\n\nfunction ShowWhenAgentEnabled() {\n return WA.agent.isAvailable();\n}\n\nfunction IsDocOpenedForEditByDefault() {\n return ShowWhenAgentEnabled() && g_openDocForEditByDefault;\n}\n\nfunction IsDocOpenedForReadByDefault() {\n return ShowWhenAgentEnabled() && !g_openDocForEditByDefault;\n}\n\nfunction IsIsDocOpenedForEditByDefaultAndPreviewDisabled() {\n return IsDocOpenedForEditByDefault() && !g_isPreviewEnabled;\n}\n\nfunction IsIsDocOpenedForReadByDefaultAndPreviewDisabled() {\n return IsDocOpenedForReadByDefault() && !g_isPreviewEnabled;\n}\n\nfunction IsRecoverActionsAvailable(proxy) {\n return $(proxy.tr.context).hasClass('list-item__doc_to-recover');\n}\n\nfunction IsReturnActionAvailable(proxy) {\n return $(proxy.tr.context).hasClass('list-item__doc_edited');\n}\n\nfunction IsOpenActionsAvailable(proxy) {\n var jContext = $(proxy.tr.context);\n return jContext.hasClass('list-item__doc_edited') || jContext.hasClass('list-item__doc_no-change');\n}\n\n\n// Скрытие действий для элемента списка.\nfunction EntityList_HideAction(el) {\n var $el = $(el);\n if ($el.hasClass('showingActions') && !$el.hasClass('menu_select')) {\n $(el).removeClass('showingActions').find('.fastActions').remove();\n }\n}\n\n// Получить список выделенных объектов.\nfunction GetSelectedObjects() {\n var selected = WA.CR.objectList.getSelectedItems();\n return _(selected).map(function (item) {\n return {\n id: item.id,\n kind: item.kind,\n refcode: item.referenceName ? item.referenceName : ''\n };\n });\n}\n\n// Инициализация автоподгрузки в списке объектов.\nfunction InitObjectContentsAutoLoad(filterVal, filterRequisites) {\n var browser = WA.ENV.browser.name.toLowerCase();\n\n var MinBottomDistanceToStartAutoLoad = 150; // пикселей\n\n function BindOnScroll(obj) {\n if ($.superHeight || WA.ENV.isAndroid()) { // TODO Bessolcyn_FI: надо разобраться с этим странным свойством superheight\n $.when(WA.ObjectListInit).done(function () {\n if (_(WA.CR.objectList.getItems()).any()) {\n // Если есть элементы в списке, то отобразим ссылку \"Показать больше объектов\".\n if (!$('.main-content__load-more').length) {\n var $loadbtn = $('
' + L('AUTO_LOAD_MORE') + '
').click(function () {\n $.when(WA.ObjectListInit).done(function () {\n AutoLoad(obj);\n });\n $loadbtn.remove();\n });\n obj.after($loadbtn);\n }\n } else {\n // Иначе удалим эту ссылку \"Показать больше объектов\", т.к. загружать больше нечего и так ничего нет.\n $('.main-content__load-more').remove();\n }\n });\n } else {\n var mc = obj.parents('#main_container');\n var scroller = mc;\n mc.unbind('scroll.auto_load').bind('scroll.auto_load', function () {\n if ($.scrollActive) {\n var bottomDistance = obj[0].offsetHeight - scroller[0].offsetHeight - scroller.offset().top + obj.offset().top;\n } else {\n if (browser === 'ie') {\n var bottomDistance = obj.height() - scroller.height() - scroller.scrollTop();\n } else {\n var bottomDistance = obj[0].offsetHeight - scroller[0].offsetHeight - scroller[0].scrollTop;\n }\n }\n if (bottomDistance <= MinBottomDistanceToStartAutoLoad) {\n mc.unbind('scroll.auto_load');\n $.when(WA.ObjectListInit).done(function () {\n AutoLoad(obj);\n });\n }\n });\n }\n }\n\n function AutoLoad(obj) {\n var page = obj.data('nextPage');\n if (!page) {\n page = 2;\n }\n obj.data('nextPage', page + 1);\n\n var folderId = WA.CR.getID();\n\n if (filterVal && filterRequisites) {\n WA.CR.objectList.setLikeFilter(filterVal, filterRequisites);\n }\n\n removeSpinningThingy();\n\n var spinningThingy = $('
');\n var spinnerIcon = $('');\n var spinnerText = $('').html(\n L('PLEASE_WAIT')\n );\n spinningThingy.append(spinnerIcon).append(spinnerText);\n spinningThingy.appendTo(obj);\n obj.data('spinningThingy', spinningThingy);\n\n function removeSpinningThingy() {\n if (obj.data('spinningThingy')) {\n obj.data('spinningThingy').remove();\n obj.data('spinningThingy', null);\n }\n }\n\n WA.CR.objectList._loadPage(folderId, page).done(function (res) {\n removeSpinningThingy();\n if (!CheckForLoginPage(res)) {\n var count = obj.children('div.List').length;\n obj.append(res);\n EntityListInit(obj, true);\n if ($.scrollActive && window.mainScroll) {\n mainScroll.refresh();\n }\n setTimeout(function () {\n var objs = obj.children('div.List');\n if (objs.length > count) {\n BindOnScroll(obj);\n } else {\n if (objs.length > g_MaxRowsPerPage) {\n var autoLoadNoMore = $('.main-content__all-loaded', obj);\n if (autoLoadNoMore.length == 0) {\n $('
' + L('NO_MORE_ITEMS') + '
').appendTo(obj);\n }\n else autoLoadNoMore.show();\n }\n $('.main-content__load-more').hide();\n }\n\n UpdateRowsCount();\n\n /**\n * Чтобы прокрутка на iPad проходила до конца списка\n * @see Замечание 78037\n */\n if ($.scrollActive && window.mainScroll) {\n mainScroll.refresh();\n };\n\n //Обновим объект клиентской ОМ\n if (WA.ObjectListInit.state() === \"resolved\" && !!WA.CR.objectList) WA.CR.objectList.fire(\"itemsChange\");\n }, 0);\n }\n }).fail(function () {\n removeSpinningThingy();\n });\n }\n\n $('.object_contents.auto_load').each(function () {\n var $this = $(this);\n $this.data('AutoLoad', function () {\n $.when(WA.ObjectListInit).done(function () {\n AutoLoad($this);\n });\n });\n BindOnScroll($this);\n });\n}\n\nfunction ExplorerInitialScroll(initialItemsCount, itemsOnPage) {\n var obj = $('.object_contents.auto_load');\n if (obj.length) {\n var nextPage = (itemsOnPage === 0) ? 1 : Math.ceil(initialItemsCount / itemsOnPage) + 1;\n obj.data('nextPage', nextPage);\n //Lysenko_YN: после перезагрузки на ipad теперь сохраняется скролбар. Замечание: 62892\n // if (!$.ipad) {\n var initScroll = parseInt($.cookie('load_scroll'), 10);\n if (initScroll) {\n setTimeout(function () {\n obj.parents('#main_container').scrollTop(initScroll);\n }, 0);\n }\n // }\n }\n}\n\nfunction enableButtonAddInListRequisite(idListReq, data) {\n if (data != null) {\n if (data.length != 0) {\n $('#' + idListReq).find('button').removeClass('disabled').removeAttr('disabled');\n }\n }\n else {\n $('#' + idListReq).find('button').addClass('disabled').attr('disabled', 'diasabled');\n }\n}\n// Функции для реквизита \"Список объектов\".\nvar ListRequisite;\n(function () {\n\n // Кэш объектов ListRequisiteClass.\n var controls = {};\n\n // Возвращает объект для работы с ListRequisite.\n // string id: ClientID объекта\n ListRequisite = function (id) {\n if (!controls.hasOwnProperty(id))\n controls[id] = new ListRequisiteClass(id);\n return controls[id];\n };\n\n // Класс для работы с ListRequisite.\n function ListRequisiteClass(id) {\n this.id = id;\n }\n\n ListRequisiteClass.prototype = {\n\n AjaxInProcess: false,\n\n // Инициализирует объект.\n // string param.ContentKind: тип объектов в списке\n // bool param.ReadOnly: реквизит только для чтения\n // string param.RefCode: код справочника\n // bool param.IsList: если true, то это список, иначе это 1 объект\n // array param.Values: массив ссылок на объекты\n Init: function (param) {\n var me = this;\n $.extend(me, param);\n me.elem = $('#' + me.id);\n me.Values = $.parseJSON(me.Values);\n var valJSON = $.toJSON(me.Values);\n $('#' + me.id + \"_data\").val(valJSON);\n me.AjaxInProcess = false;\n if (param.OnLoad) {\n var onLoadFunc = new Function(param.OnLoad);\n onLoadFunc.call(me);\n }\n UpdateCopyPasteIcons(me.elem);\n },\n\n Disable: function () {\n var me = this;\n me.elem.find('.ListRequisiteOuterPanel').addClass('readonly')\n .find('.paste_btn, .cut_btn, .delete_btn').hide();\n me.elem.find('.ListRequisite__addReferencePanel').hide();\n me.ReadOnly = true;\n },\n\n Enable: function () {\n var me = this;\n me.elem.find('.ListRequisiteOuterPanel').removeClass('readonly')\n .find('.paste_btn, .delete_btn').show();\n me.elem.find('.ListRequisite__addReferencePanel').show();\n me.ReadOnly = false;\n },\n\n /**\n * Подписывает выбранные ссылки\n * @method ListRequisie#SignLinks\n * @param callback: функция обратного вызова для обработанной ссылки.\n * @param completeMsg: сообщение о завершении операции.\n * @since 5.1.0.1505\n * @return {ListRequisie}\n */\n SignLinks: function (callback, completeMsg) {\n var me = this;\n var links = me.GetSelectedLinks();\n if (links.hrefs != '') {\n\n Core.agent.getPlugin(\"edmsplugin\").done(function () {\n Core.objectList.signLinks(_.map(links.links, function (link) {\n var newLinkWithName = $.extend({}, link);\n // GetSelectedLinks возвращает ссылки, в которых в поле Desc написано наименование объекта, но для отображения ошибок нужно свойство name.\n newLinkWithName[\"name\"] = newLinkWithName[\"Desc\"];\n delete newLinkWithName[\"Desc\"];\n return newLinkWithName;\n }));\n });\n\n } else {\n (new WA.CMP.NTF.Toast).show(L(\"OBJECTS_NOT_SELECTED\"));\n }\n return this;\n },\n\n /**\r\n * Копирует выделенные ссылки в буфер.\r\n * \r\n * @param {function} callback функция обратного вызова для обработанной ссылки.\r\n * @param {string} completeMsg сообщение о завершении операции.\r\n */\n CopyLinks: function (callback, completeMsg) {\n var me = this;\n\n setLinksSource(null, null);\n\n me.ShowSpinner(L(\"COPY_LINKS\"));\n\n var linkContainer = me.GetSelectedLinks();\n if (linkContainer.hrefs != '') {\n var linkModels = linkContainer.links;\n var apiLinks = convertLinkModelsToAgentLinks(linkModels);\n Core.clipboard.copyLinksToClipboard(apiLinks).done(function (copiedLinksCount) {\n me.HideSpinner(L(\"COPIED_LINKS\", copiedLinksCount), 2000);\n }).fail(function (completeMsg) {\n me.HideSpinner(completeMsg, 2000);\n });\n } else {\n me.ShowSpinner(L(\"OBJECTS_NOT_SELECTED\"), 2000);\n }\n },\n\n /**\r\n * Вставляет ссылки в список объектов (с проверкой соответствия).\r\n * \r\n * @param {function} callback функция обратного вызова для обработанной ссылки.\r\n * @param {string} completeMsg сообщение о завершении операции.\r\n */\n PasteLinks: function (callback, completeMsg) {\n var me = this;\n\n if (me.ReadOnly) return;\n\n if (!me.AjaxInProcess) {\n me.AjaxInProcess = true;\n setLinksSource(null, null);\n me.ShowSpinner(L(\"PASTE_LINKS\"));\n if (!me.IsAttachments) {\n WebAccess.agent.isPluginAvailable(\"Clipboard\").always(function (isAvailableResponse) {\n if (isAvailableResponse) {\n Core.clipboard.getLinksFromClipboard().done(function (links) {\n me.AddLinks(links, me, callback, completeMsg);\n me.AjaxInProcess = false;\n });\n } else {\n CallService(\"/Session.asmx/GetLinksFromBuffer\",\n null,\n function (res) {\n if (res.Success) {\n var links = res.Result;\n me.AddLinks(links, me, callback, completeMsg);\n } else {\n me.HideSpinner(res.Error, 5000);\n }\n me.AjaxInProcess = false;\n },\n function () {\n me.AjaxInProcess = false;\n });\n }\n }\n );\n } else {\n var oldCount = me.Values.length;\n var svcParams = {\n ClientID: me.id + \"_list\",\n CustomWorkID: me.CustomWorkID,\n CustomWorkType: me.CustomWorkType\n };\n\n var callServiceToPaste = function (svcMethodName, svcParams) {\n me.CallMyService(svcMethodName,\n svcParams,\n function (res) {\n me.RenderList(res);\n\n var newCount = me.Values.length;\n var pasteCount = newCount - oldCount;\n if (pasteCount > 0) {\n me.elem.trigger('change', me.Values);\n if (completeMsg === \"\" || !(completeMsg))\n me.HideSpinner(L(\"PASTED_LINKS\", pasteCount), 2000);\n else\n me.HideSpinner(completeMsg, 2000);\n EnableOrDisableCheckAll();\n } else {\n me.HideSpinner(L(\"NOT_LINKS_TO_PASTE\"), 2000);\n }\n if (callback) callback(res);\n me.AjaxInProcess = false;\n },\n function (x, e1, e2) {\n me.AjaxInProcess = false;\n });\n };\n\n WebAccess.agent.isPluginAvailable(\"Clipboard\").always(function (isAvailableResponse) {\n if (isAvailableResponse) {\n Core.clipboard.getLinksFromClipboard()\n .done(function (links) {\n $.extend(svcParams, { Links: links });\n callServiceToPaste(\"PasteLinks\", svcParams);\n }).fail(function () {\n callServiceToPaste(\"PasteAttachments\", svcParams);\n });\n } else {\n callServiceToPaste(\"PasteAttachments\", svcParams);\n }\n });\n }\n }\n },\n\n // Добавляет ссылки в список.\n // @param callback: функция обратного вызова для обработанной ссылки.\n // @param completeMsg: сообщение о завершении операции.\n AddLinks: function (links, me, callback, completeMsg) {\n var me = this;\n if (me.ReadOnly) return;\n\n var counter = 0;\n if (links) {\n $.each(links, function () {\n //Проверяем на соответствие объекта списку\n if (me.CheckObject(this)) {\n //Проверяем вставился ли объект в список\n if ((!callback) || (callback(this))) {\n me.AddObject(this);\n counter += 1;\n return me.IsList;\n }\n }\n });\n }\n if (counter > 0) {\n me.UpdateList(function () {\n if (completeMsg === \"\")\n me.HideSpinner(L(\"PASTED_LINKS\", counter), 2000);\n else\n me.HideSpinner(completeMsg, 2000);\n });\n } else {\n me.HideSpinner(L(\"NOT_LINKS_TO_PASTE\"), 2000);\n }\n },\n\n // Удаляет выделенные ссылки из списка объектов.\n // @param callback: функция обратного вызова для обработанной ссылки.\n // @param completeMsg: сообщение о завершении операции.\n DeleteLinks: function (links, callback, completeMsg) {\n var me = this;\n if (me.ReadOnly) return;\n\n var me = this;\n if (!me.AjaxInProcess) {\n if (!links) {\n var sel = me.GetSelectedLinks();\n if (sel.cannotDelete)\n return;\n links = sel.links;\n }\n var oldCount = me.Values.length;\n if ((links) && (links.length > 0)) {\n ConfirmDelete(links.length, me.IsAttachments ? (links.length > 1 ? L(\"CONFIRM_DELETE_ATTACHMENTS\", links.length) : L(\"CONFIRM_DELETE_ATTACHMENT\")) : null).done(function () {\n\n me.AjaxInProcess = true;\n if (!me.IsAttachments) {\n var ids = $.map(links, function (link) { return parseInt(link.ID, 10) });\n me.Values = $.grep(me.Values, function (v) { return $.inArray(v.ID, ids) == -1; });\n var newCount = me.Values.length;\n var delCount = oldCount - newCount;\n if (delCount > 0) {\n me.ShowSpinner(L(\"DELETE_LINKS\"));\n me.UpdateList(function () {\n if (completeMsg === \"\")\n me.HideSpinner(L(\"DELETED_LINKS\", delCount), 2000);\n else\n me.HideSpinner(completeMsg, 2000);\n me.AjaxInProcess = false;\n });\n if (callback) $.each(links, function (index, link) { callback(link); });\n }\n } else {\n me.ShowSpinner(L(\"DELETE_LINKS\"));\n\n WA.SRV.call('/ListRequisite.asmx/DeleteAttachments', {\n ClientID: me.id + \"_list\",\n CustomWorkID: me.CustomWorkID,\n CustomWorkType: me.CustomWorkType,\n ValuesJSON: $.toJSON(links)\n }, null, null, true, true).done(function (res, obj) {\n me.RenderList(res);\n var newCount = me.Values.length;\n var delCount = oldCount - newCount;\n if (completeMsg === \"\")\n me.HideSpinner(L(\"DELETED_LINKS\", delCount), 2000);\n else\n me.HideSpinner(completeMsg, 2000);\n EnableOrDisableCheckAll();\n me.AjaxInProcess = false;\n //Отобразить сообщение\n if (obj.Warning) {\n var errorStr = JSON.parse(obj.Warning);\n if (errorStr.mainText) {\n var dialog = new WA.CMP.dialogs.MessageBox({ width: 600 });\n dialog.showWarning(errorStr.mainText, errorStr.additionalText.replace('\\n', '

'));\n }\n }\n }).fail(function (e) {\n me.AjaxInProcess = false;\n //Отобразить сообщение\n var dialog = new WA.CMP.dialogs.MessageBox({ width: 600 });\n dialog.showError(e);\n });\n }\n\n });\n } else {\n //me.ShowSpinner(L(\"OBJECTS_NOT_SELECTED\"), 2000);\n }\n }\n },\n\n DeleteLink: function (obj, callback, msg) {\n var me = this;\n if (me.ReadOnly) return;\n\n this.DeleteLinks([{ ID: obj.id, Kind: obj.kind, CompCode: obj.refcode || '' }], callback, msg);\n },\n\n // Удаляет все ссылки из списка объектов.\n Clear: function (callback) {\n var me = this;\n if (me.ReadOnly) return;\n\n var me = this;\n if (!me.AjaxInProcess) {\n me.AjaxInProcess = true;\n\n if (callback) {\n $.each(me.Values, function () { callback(this); });\n }\n\n me.Values = [];\n me.UpdateList(function () {\n me.AjaxInProcess = false;\n });\n }\n },\n\n // Добавляет выбранную запись справочника.\n // string input_id: ID контроля выбор из справочника.\n AddRefRec: function (input_id) {\n var me = this;\n if (me.ReadOnly) return;\n\n var add_id;\n try {\n add_id = parseInt($(\"#hSelID_\" + input_id).val(), 10);\n } catch (e) {\n add_id = 0;\n }\n if (add_id) {\n var req = $(\"#\" + input_id).data();\n req.ReferenceSelectInstance.setValue();\n\n // Lysenko_YN: EnableSameRecords - если установлено в false, то одну и туже запись добавить несколько раз нельзя\n if ((me.EnableSameRecords === false) || (me.elem && (me.elem.attr('data-enableSameRecords') == 'false'))) {\n if ($.grep(me.Values, function (v) { return v.ID == add_id }).length == 0) {\n me.AddRefRecToList(add_id);\n }\n } else { //Шамов А.: По обращению 75532 - что бы можно было дабавлять одну и туже запись справочника несколько раз.\n me.AddRefRecToList(add_id);\n }\n }\n },\n\n //Добавляет запись в список\n AddRefRecToList: function (add_id) {\n var me = this;\n if (me.ReadOnly) return;\n\n var newObj = { ID: add_id, Kind: \"REF\", CompCode: me.RefCode };\n if (me.IsList) {\n me.Values.push(newObj);\n } else {\n me.Values = [newObj];\n };\n me.ShowSpinner(L(\"PLEASE_WAIT\"));\n me.UpdateList(function () {\n me.HideSpinner(\"\", 0);\n });\n },\n\n\n InitAttachments: function (CustomWorkID, CustomWorkType) {\n this.IsAttachments = true;\n this.CustomWorkID = CustomWorkID;\n this.CustomWorkType = CustomWorkType;\n var att = this.elem.parents('.attachments');\n var cont = att.parents('.attachments_container');\n\n var me = this;\n me.elem.find('div.ListRequisiteList')\n .attr('kind', 'att')\n .bind('contextmenu', function (e) {\n e.preventDefault();\n e.stopPropagation();\n ShowContextMenu($(this), {}, { 'left': e.pageX, 'top': e.pageY }, true);\n return false;\n });\n },\n\n SetCannotDelete: function (ids) {\n var me = this;\n $.each(ids, function () {\n var row = $('#' + this + '.folder_item:not(.cannot_delete)', me.elem);\n if (row.length)\n row.addClass('cannot_delete');\n });\n },\n\n //////////////// PRIVATE /////////////////////////////\n\n // Возвращает список выбранных объектов.\n // return object:\n // string .hrefs: ссылки в текстовом виде для вставки в буфер.\n // array .links: массив объектов для передачи сервису.\n GetSelectedLinks: function () {\n if (!this.IsList)\n return GetSelectedID(this.elem.find('.folder_item'));\n else {\n var items = this.elem.find('.folder_item.selected');\n var res = GetSelectedID(items);\n if (items.filter('.cannot_delete').length) {\n res.cannotDelete = true;\n }\n return res;\n }\n },\n\n\n GetLinks: function () {\n if (!this.IsList)\n return GetSelectedID(this.elem.find('.folder_item'));\n else {\n var items = this.elem.find('.folder_item');\n var res = GetSelectedID(items);\n if (items.filter('.cannot_delete').length) {\n res.cannotDelete = true;\n }\n return res;\n }\n },\n\n // Показывает информационное сообщение.\n // string msg: сообщение\n // [int delay]: если указано, то сообщение пропадет через delay миллисекунд\n ShowSpinner: function (msg, delay) {\n if (delay) {\n ShowTopSpinnerResult(msg, delay);\n } else {\n ShowTopSpinner(msg);\n }\n },\n\n // Показывает информационное сообщение о завершении действия. Если до этого панель спиннера была спрятана, нужно использовать ShowSpinner.\n // string msg: сообщение\n // int delay: задержка в миллисекундах\n HideSpinner: function (msg, delay) {\n HideTopSpinner(msg, delay);\n },\n\n // Обновляет список объектов с сервера. Также сохраняет Values в скрытое поле.\n // [function callback()]: вызывается после обновления списка\n UpdateList: function (callback) {\n var me = this;\n\n var valJSON = $.toJSON(me.Values);\n $('#' + me.id + \"_data\").val(valJSON);\n me.CallMyService(\"UpdateList\", {\n ClientID: me.id + \"_list\",\n ContentKind: me.ContentKind,\n RefCode: me.RefCode,\n IsList: me.IsList,\n ShowScrollBar: me.ShowScrollBar,\n Values: valJSON,\n EmptyText: me.EmptyText,\n IsShowActions: me.IsShowActions\n }, function (res) {\n me.RenderList(res);\n if (typeof callback !== \"undefined\")\n callback.call(me);\n });\n EnableOrDisableCheckAll();\n },\n\n RenderList: function (res) {\n var me = this;\n if (res.NewValues != null) {\n\n me.Values = $.parseJSON(res.NewValues);\n $('#' + me.id + \"_data\").val(res.NewValues);\n }\n var listContainer = $('#' + me.id + '_list');\n listContainer.empty();\n if (me.ShowScrollBar && me.Values.length > 3) {\n listContainer.addClass('ListRequisiteScroller');\n } else {\n listContainer.removeClass('ListRequisiteScroller');\n }\n if (res.HTML) listContainer.html(res.HTML);\n if (res.InitJS) eval(res.InitJS);\n $('#' + me.id + \"_chkAll\").removeAttr('checked').attr('title', L('SELECT_ALL'));\n try { // Только для мастеров!\n ProcessEmptyChecks();\n } catch (e) { }\n UpdateCopyPasteIcons(this.elem);\n me.elem.trigger('change');\n },\n\n // Вызывает метод сервиса ListRequisite.\n // string method: метод\n // [object params]: передаваемые параметры\n // [function callback(res)]: функция, вызываемая при успешном результате (result.Success == true)\n // object res: результат (result.Result)\n CallMyService: function (method, params, callback, errorCallback) {\n var me = this;\n CallService(\"/ListRequisite.asmx/\" + method, params, function (res) {\n if (res.Success) {\n if (typeof callback !== \"undefined\")\n callback.call(me, res.Result);\n }\n else {\n me.ShowSpinner(\"Во время операции произошла ошибка. Обратитесь к администратору.\", 5000);\n }\n }, errorCallback);\n },\n\n // Проверяет объект на соответстие списку.\n // object obj: объект\n // int obj.ID: ИД объекта\n // string obj.Kind: тип объекта\n // string obj.CompCode: код справочника\n // return bool: соответствует ли объект списку\n CheckObject: function (obj) {\n obj.Kind = obj.Kind.toUpperCase();\n if (this.ContentKind != \"ANY\" &&\n (obj.Kind != this.ContentKind ||\n obj.Kind == \"REF\" && obj.CompCode != this.RefCode)) {\n return false;\n }\n return ($.grep(this.Values, function (v) { return v.ID == obj.ID; }).length == 0);\n },\n\n // Добавляет объект в список.\n // object obj: объект\n // int obj.ID: ИД объекта\n // string obj.Kind: тип объекта\n // string obj.CompCode: код справочника\n AddObject: function (obj) {\n obj.Kind = obj.Kind.toUpperCase();\n var newObj = { ID: obj.ID, Kind: obj.Kind.toUpperCase(), CompCode: obj.CompCode };\n if (this.IsList) {\n this.Values.push(newObj);\n } else {\n this.Values = [newObj];\n }\n }\n };\n\n})();\n\n// Список валидаторов.\nvar g_EmptyCheckFunc = [];\n\n// Добавляет валидатор для контроля.\n// [jQuerySet control]: контроль, на события которого вешается операция проверки валидности.\n// function func(): функция-валидатор.\nfunction RegisterEmptyCheck(control, func) {\n g_EmptyCheckFunc.push(func);\n if (control) {\n var events = ['blur', 'click', 'change', 'keyup'];\n for (var i = 0; i < events.length; ++i) {\n try {\n control[events[i]](ProcessEmptyChecks);\n }\n catch (e) { }\n }\n }\n}\n\n// Выполняет валидацию контролей на странице.\nfunction ProcessEmptyChecks() {\n // При выборе из справочника значения еще может не быть. Например, такое бывает если выбираешь из \"Избранных и последних\" в выборе пользователей. #107229\n setTimeout(function () {\n var ok = true;\n for (var i = 0; i < g_EmptyCheckFunc.length; ++i) {\n if (!g_EmptyCheckFunc[i]()) {\n ok = false;\n break;\n }\n }\n $('.next_button').each(function () {\n var init;\n var disabled;\n init = $(this).data('initial_disabled');\n if (!init) {\n init = ($(this).attr('disabled') || $(this).attr('disabled') === \"\") ? \"y\" : \"n\";\n $(this).data('initial_disabled', init);\n }\n\n disabled = (ok ? (init == \"y\") : true);\n if (disabled) {\n $(this).attr('disabled', 'disabled').addClass(\"disabled\");\n } else {\n $(this).removeAttr('disabled').removeClass(\"disabled\");\n }\n });\n }, 100);\n}\n\n/* =================================================================================================================================================== */\n/* =================================================================================================================================================== */\n\n\n/* = Карточка справочника ============================================================================================================================ */\n\nfunction scrollbarWidth() {\n var div = $('
');\n // Append our div, do our calculation and then remove it\n $('body:first').append(div);\n var w1 = $('div', div).innerWidth();\n div.css('overflow-y', 'scroll');\n var w2 = $('div', div).innerWidth();\n $(div).remove();\n return (w1 - w2);\n}\n\nfunction Reference_SelectRecord(el) {\n var chk = $(el);\n var tr = chk.parents('.List:first');\n if (chk.is(':checked')) {\n tr.addClass('selected');\n } else {\n tr.removeClass('selected');\n }\n updateChkAll(tr.parent(), $('#chkAll').addClass('notallyet'));\n UpdateCopyPasteIcons();\n}\n\n/* =================================================================================================================================================== */\n/* =================================================================================================================================================== */\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Поля поиска\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfunction InitSearchField() {\n $('.explorer-search-input').focus(function () {\n var me = $(this);\n if (!me.hasClass('Search_FilledField')) {\n // Стираем текущий текст, только если это общий поиск.\n if (me.attr(\"id\") == \"SrchQuickText\")\n me.val('');\n me.addClass('Search_FilledField');\n }\n })\n .blur(function () {\n var me = $(this);\n if (me.val() == '') {\n me.val(me.data('empty'));\n me.removeClass('Search_FilledField');\n }\n }).each(function () {\n var me = $(this);\n if (me.data('empty') && (me.val() == '' || me.val() == me.data('empty')))\n me.val(me.data('empty'));\n else\n me.addClass('Search_FilledField');\n });\n}\n\n//////////////////// Компонента \"список версий\" /////////////////////////////////////////\n\n// Генерирует функцию, осуществляющую загрузку с сервера списка версий.\n// controlID - id контроля списка\n// EDocID - id документа\n// ErrorClientID - id контроля Error\nfunction GenReloadVersionList(controlID, EDocID, ErrorClientID) {\n return function () {\n $.ajax({\n type: \"GET\",\n dataType: \"html\",\n url: format(\"DynControl.ashx?c=versions&EDocID={0}&ErrorClientID={1}\", EDocID, ErrorClientID),\n success: function (res) {\n if (!CheckForLoginPage(res)) {\n $('#' + controlID).html(res);\n HideTopSpinner();\n }\n },\n error: function (err) {\n HideTopSpinner(err, 5000);\n },\n cache: false\n });\n };\n}\n\n// Показывает дерево \"Папки\" в левой панели.\nfunction ShowFolderTree(el) {\n ClearSelectedElements(el);\n SetElementToolBar(el);\n $('#Tree').show().find(\".FolderTreeDiv\").show();\n if (window.UpdateFolderTreeScroll) UpdateFolderTreeScroll();\n}\n\n//Определяет, является ли папка targetFolder вложенной относительно sourceFolder (targetFolder и sourceFolder = fpath из url = id li)\nfunction isChildFolder(sourceFolderPath, targetFolderPath, currentFolderPath) {\n /*\n tp = \"1-2-3-4-5-\";\n sp = \"1-2-\";\n tp.split(sp).indexOf(\"\") == 0; => isChildFolder\n */\n var arr = targetFolderPath.split(sourceFolderPath);\n return (arr.length > 1 && arr.indexOf(\"\") == 1 && currentFolderPath != sourceFolderPath);\n}\n\n// определяет, что dragEl - корневая папка (Favorites, Outbox, Inbox, Common)\nfunction isRootFolder(dragEl) {\n return ($(dragEl).parent().parent().parent(\"ul.treeview\").length == 1);\n}\n\n// Инициализирует меню по правой кнопке в компоненте для построения связанных документов/записей справочника.\nfunction InitContextMenuForBound(trs) {\n if (!trs) trs = $('.List');\n trs\n .unbind('contextmenu.bound').bind('contextmenu.bound', function (e) {\n ShowContextMenu($(this).children(), {}, { 'left': e.pageX, 'top': e.pageY });\n return false;\n });\n}\n\n// Инициализирует реквизит типа \"флажок\".\nfunction InitCheckboxRequisite(el) {\n //setTimeout(function () {\n var displayControl = $(format('#{0}_display', el.attr('id')), el);\n var valueControl = $(format('#{0}_value', el.attr('id')), el);\n el.data('requisite').val = function (value) {\n if (typeof value !== 'undefined') {\n displayControl.prop('checked', value == el.data('requisite').yes);\n valueControl.val(value);\n } else {\n return valueControl.val();\n }\n };\n displayControl.bind('click change', function () {\n if (displayControl.is(':checked')) {\n valueControl.val(el.data('requisite').yes);\n } else {\n valueControl.val(el.data('requisite').no);\n }\n });\n //}, 0);\n}\n\nfunction getHintDataObj(el) {\n return (typeof el.data(\"data-hint\") == 'undefined' ? eval(\"(\" + el.attr(\"data-hint\") + \")\") : el.data(\"data-hint\")); //FIXME: eval\n}\n\n\n// Навешивает подсказку по доп. реквизитам на элемент.\nfunction AttachTooltipToElement(el, ev, opt_showAfterAttach, opt_showOptions, opt_positionOptions) {\n // Получение содержимого подсказки.\n var getContent = function (el, callback) {\n var dataobject = getHintDataObj(el); //есть два поля: id и compcode\n if (typeof dataobject != 'undefined') {\n if (dataobject.id != \"\" && dataobject.compcode != \"\") {\n CallService(\"/Reference.asmx/GetAdditionalInfo\", { RefCode: dataobject.compcode, RecID: dataobject.id }, function (res) {\n if (res.Success) {\n el.qtip(\"enable\");\n el.qtip.zindex = 130000;\n\n var html = GenerateAdditionalInfoTooltipHtml(res.Result);\n if (html) {\n if (callback) callback(html);\n } else {\n el.qtip(\"disable\");\n return;\n }\n } else {\n el.qtip(\"disable\");\n return;\n }\n });\n }\n }\n };\n\n opt_showAfterAttach = (opt_showAfterAttach !== false);\n opt_showOptions = opt_showOptions || {};\n opt_positionOptions = opt_positionOptions || {};\n\n // Если уже навесили подсказку, больше этого не делаем.\n if (!el.hasClass('hintInit')) {\n getContent(el, function (hintContent) {\n hintContent = $(hintContent);\n // Событие по крестику для закрытия хинта.\n hintContent.find('i').bind('click.hint', function () {\n el.qtip('hide', ev);\n });\n el.addClass('hintInit').qtip('destroy').qtip({\n style: { classes: \"ui-tooltip-light ui-tooltip-shadow ui-tooltip-rounded\" },\n show: $.extend({\n effect: false,\n solo: true,\n delay: 800\n }, opt_showOptions),\n content: { text: hintContent },\n hide: {\n effect: false,\n fixed: true, delay: 100,\n leave: false\n },\n position: $.extend({\n viewport: $(window),\n effect: false,\n target: 'mouse',\n adjust: {\n mouse: false,\n x: 15,\n y: 0\n },\n my: 'bottom left',\n at: 'bottom left'\n }, opt_positionOptions),\n events: {\n show: function (event, api) {\n if (!el.is(':visible')) {\n event.preventDefault();\n }\n }\n }\n });\n if (opt_showAfterAttach) el.qtip('show', ev);\n });\n }\n};\n\n// Функция для инициализации подсказок по допреквизитам.\nvar hintTimeout;\nfunction InitAdditionalInfoTooltip(el, opt_position) {\n var me = el;\n if (!$.ipad) {\n me.unbind('mouseenter.hint').bind('mouseenter.hint', function (ev) {\n var $this = $(this);\n if (hintTimeout) clearTimeout(hintTimeout);\n hintTimeout = setTimeout(function () {\n AttachTooltipToElement($this, ev, true, undefined, opt_position);\n }, 800);\n }).unbind('mouseleave.hint').bind('mouseleave.hint', function () {\n if (hintTimeout) clearTimeout(hintTimeout);\n });\n }\n}\n\n// Генерирует подсказку к объекту системы.\nfunction GenerateAdditionalInfoTooltipHtml(hint) {\n var reqCount = 0;\n\n function getAnchorElementFromRequisiteInfo(reqInfo) {\n //listOfRequisitesInfo[i].Href == null ? listOfRequisitesInfo[i].Text : format(\"{1}\", listOfRequisitesInfo[i].Href, listOfRequisitesInfo[i].Text)\n var result = \"\";\n if ((reqInfo.Href != null && reqInfo.Href != \"\") && (reqInfo.Text != null && reqInfo.Text != \"\")) {\n result = format('{1}', reqInfo.Href, reqInfo.Text);\n } else {\n if (reqInfo.Text != null && reqInfo.Text != \"\") {\n result = reqInfo.Text;\n }\n }\n return result;\n }\n\n function generateHtmlForContentTextFromRequisites(listOfRequisitesInfo) {\n var result = \"\";\n var anchor = \"\";\n var j = 0;\n for (var i = 0; i < listOfRequisitesInfo.length; i++) {\n anchor = getAnchorElementFromRequisiteInfo(listOfRequisitesInfo[i]);\n if (anchor != \"\") {\n result += format('

{0} {1}

', (listOfRequisitesInfo[i].Caption || \"\"), anchor, (j == 0 ? 'first' : ''));\n reqCount++;\n j++;\n }\n }\n return result;\n }\n\n function generateHtmlForContentTextForImage(imgsrc) {\n return format(\"\", imgsrc);\n }\n\n var html = generateHtmlForContentTextFromRequisites(hint.Requisites);\n var img = \"\";\n if (hint.Image != null) {\n img = generateHtmlForContentTextForImage(hint.Image);\n }\n\n // TODO: Исправить на получение шаблона\n if (reqCount != 0) {\n return format(\"
\" +\n \"
\" +\n \"\" +\n \"{1}\" +\n \"
{0}
\" +\n \"
\" +\n '' +\n \"
\", html, img, (img != \"\" ? \"style='left:120px;'\" : \"\"));\n } else {\n return \"\";\n }\n}\n","/* Выбор из справочника */\n(function ($) {\n var lastFocusedInputId = null;\n\n var rs = function (inp, o, img) {\n this.init(inp, o, img);\n };\n rs.prototype = {\n // HTML элементы.\n inp: null, // главный input\n container: null, // главный контейнерю\n results: null, // результаты поиска.\n table: null,\n img: null,\n title: null,\n footer: null,\n hidd: null,\n inpParent: null,\n selectedItems: null,\n selectedItemsCont: null,\n fakeInp: null,\n\n contId: '',\n\n // Таймауты.\n close: null, // на скрытие\n timeout: null, // на поиск\n spinner_timeout: null, // на спинер\n\n // Настройка.\n url: null, // url for ajax request\n refcodes: {},\n refcodesCount: 0, //у объекта получить length нельзя.\n selectedRefCode: null,\n selectedRefIsClosed: false,\n extraParams: null,\n max: 25, // max result rows\n delay: 400, // for search\n minChars: 1,\n mustMatch: false,\n showNoMatchText: true,\n cellIDIndex: 0,\n cellToInput: 2,\n multiselect: false,\n referenceCodesAndReqNamesInDetailSection: null,\n allowlike: true,\n useadditional: true,\n isCustomSelect: false,\n selected: false,\n currentPage: 1,\n maxPages: 1,\n mainReferenceCode: '',\n dataProvider: null,\n sendQueryOnlyOnEnter: false,\n\n suggestInProcess: false,\n suggestLastMode: 'show',\n NoMatchText: L(\"NO_RECORDS_FOUND\"),\n CancelText: L(\"CANCEL_ACTION\"),\n SelectText: L(\"SELECT_X_FROM_Y_TEXT\"),\n TitleText: L(\"CHOOSE_REFERENCE\"),\n\n init: function (inp, options, img) {\n var self = $.extend(this, options);\n self.inp = $(inp);\n // Проверим проинициализирован ли контроль.\n if (self.inp.hasClass('rs_InitComplete')) return;\n if (self.isCustomSelect) self.inp.addClass('rs_custom');\n\n self.inp\n .addClass('rs_input')\n .data('selected', self.selected)\n .bind('focus.refselect', function () {\n // При фокусе скрываем все выпадающие списки записей всех реквизитов \"Выбор из справочника\".\n if (self.inp.attr('id') != lastFocusedInputId) {\n // Закрыть надо предыдущий, а не текущий.\n $('#' + lastFocusedInputId).HideContainer();\n };\n\n self.fakeInp.addClass('refselect-input_focused');\n self._hidePlaceholder();\n\n lastFocusedInputId = self.inp.attr('id');\n })\n .bind('blur.refselect', function () {\n // Если это инициализация значений или потеря фокуса, то сместим выбранные записи в самое лево, что бы был виден первый элемент.\n self.changeInpWidthAndPadding(true);\n self.fakeInp.removeClass('refselect-input_focused');\n if (!self.hidd.val() && !self.inp.val()) self._showPlaceholder();\n })\n .bind('SetSelected', function (e, v) {\n self.inp.data('selected', v);\n self.inp.trigger('onSelected');\n self._hidePlaceholder();\n })\n .bind('ReplaceSelectedItem', function (e, oldID, newValues, onlyLast) {\n self.replaceSelectedItem(oldID, newValues, onlyLast);\n self._hidePlaceholder();\n })\n .bind('Clear', function () {\n self.deleteAllItems();\n self._showPlaceholder();\n })\n .bind('HideContainer', function () {\n self.hideContainer();\n })\n .bind('SetValue', function (e, newValue, needTriggerResult) {\n self.setValue(newValue, needTriggerResult);\n self._hidePlaceholder();\n })\n .bind('SetValues', function (e, newValues, needTriggerResult) {\n self.setValues(newValues, needTriggerResult);\n self._hidePlaceholder();\n })\n .bind('SetDisabled', function (e, v) {\n if (!!v) {\n self.inp.attr('readonly', 'readonly').addClass('Req_Disabled').attr('tabindex', -1);\n self.inpParent.find('.fakeInput').addClass('Req_Disabled');\n self.selectedItems.find('span').addClass('Req_Disabled');\n if (self.img.length) {\n self.img.addClass('Req_Icon_Disabled');\n }\n } else {\n self.inp.removeAttr('readonly').removeClass(\"Req_Disabled\").attr('tabindex', 0);\n self.inpParent.find('.fakeInput').removeClass(\"Req_Disabled\");\n self.selectedItems.find('span').removeClass(\"Req_Disabled\");\n if (self.img.length) {\n self.img.removeClass(\"Req_Icon_Disabled\");\n }\n };\n\n // Событие изменения доступности\n self.inp.trigger('onAvailabilityChange', v);\n });\n\n self.inpParent = self.inp.parent();\n\n self.inp.bind('keydown', self, self.process);\n // хак для планшетов: создаем кнопку, навешиваем на нее клик, в клике ставим фокус на поле ввода\n // вызываем клик у кнопки при клике на див в котором находится поле ввода\n if ($.ipad || WA.ENV.isAndroid()) {\n if ($('#focusBtn' + self.inp.attr('id')).length === 0) {\n var btn = $('')\n .unbind('click')\n .click(function () {\n self.inp.focus();\n });\n\n $('body').append(btn);\n } else {\n $('#focusBtn' + self.inp.attr('id')).unbind('click').click(function () {\n self.inp.focus();\n });\n }\n\n self.inp.parent().click(function () {\n $('#focusBtn' + self.inp.attr('id')).click();\n });\n }\n\n\n if (self.allowlike) {\n if ($.ipad && WA.ENV.isAndroid()) {\n self.oldv = self.inp.val();\n var pollTimer = null;\n var interval = 500;\n function pollInputChanged() {\n if (!self.inp.is(':focus')) return;\n\n try {\n self.onInputChanged(self.sendQueryOnlyOnEnter);\n self.changeInpWidthAndPadding();\n pollTimer = setTimeout(pollInputChanged, interval);\n } catch (_) { }\n }\n self.inp.bind('focus', function () {\n pollTimer = setTimeout(pollInputChanged, interval);\n }).bind('blur', function () {\n if (pollTimer) clearTimeout(pollTimer);\n //self.inp.val(''); закомментил тк при при смене справочника в выпадающем списке не подгружались записи по фильтру\n });\n };\n } else {\n self.inp.bind('change', function () {\n // Передаем значение введенное пользователем со знаком $, что бы отличить от выбранного из справочника.\n self.hidd.val('$' + $(this).val());\n });\n };\n\n if (img != null) {\n self.img = $(img)\n .addClass('rs_img')\n .bind('click touchstart', function (ev) {\n // Помечаем выделенным при нажатии на \"...\", что бы он не закрывался раньше времени (на событии onFocus, когда lastFocusedInputId = null).\n lastFocusedInputId = self.inp.attr('id');\n return self.onImgClick(ev);\n });\n }\n\n // Скрытие вариантов при click на любое другое место.\n $('html').bind('click.refselect', function (ev) {\n var t = $(ev.target);\n if (t && t.length > 0) {\n var className = t[0].className;\n if (className && className.baseVal) {\n className = className.baseVal;\n }\n if (typeof className === 'string' && className.indexOf('rs_') === -1 && className.indexOf('-icon') === -1) {\n if (self.table.find(\"tr\").length === 1 && self.inp.val() !== \"\") {\n self.select(true);\n }\n if (self.container.is(':visible')) self.hideContainer();\n }\n } else {\n if (self.container.is(':visible')) self.hideContainer();\n }\n });\n\n self.contId = 'rscont' + (Math.random() * 100 | 0);\n self.container = $('
').appendTo(\"body\");\n self.results = $('
').appendTo(self.container);\n self.title = $('
').prependTo(self.container);\n self.table = $('
').appendTo(self.results.find('#loller'));\n self.footer = $('
').appendTo(self.container);\n\n if (self.multiselect) {\n self.table.addClass('rs_multiselect_table');\n }\n\n // Контейнер что бы выбранные элементы не налезали на \"...\".\n self.selectedItemsCont = $('
');\n self.selectedItems = $('
');\n\n self.selectedItemsCont.bind('click.refselect', function () {\n // Перемещаем input в конец.\n self.selectedItems.children('span:last').after(self.inp);\n self.changeInpWidthAndPadding();\n setTimeout(function () { //для IE\n self.inp.focus();\n }, 100);\n });\n if (inp.hasClass('Req_Disabled')) {\n self.inp.SetDisabled();\n }\n self.selectedItemsCont.append(self.selectedItems);\n self.inpParent.prepend(self.selectedItemsCont);\n\n self.moveInputToSelecetedItem();\n\n self.initSelecetedItems();\n\n if (self.hidd.val()) self._hidePlaceholder();\n\n // Инициализация закончена.\n self.inp.addClass('rs_InitComplete');\n // Подобрать ширину для значения реквизита\n $(function () { self.changeInpWidthAndPadding(); });\n },\n\n onImgClick: function (ev) {\n var self = this;\n ev.preventDefault();\n ev.stopPropagation();\n if (!self.inp.attr('readonly') && !self.inp.attr('disabled')) {\n self.container.hide();\n self.table.empty().removeData('refcode');\n self.currentPage = 1;\n self.clearBlurTimeout();\n self.suggestLastMode = 'show_all';\n self.suggest(function () {\n self.results.scrollTop(0);\n });\n }\n },\n\n isReadonly: function () {\n var self = this;\n return (self.inp.attr('readonly'));\n },\n\n initSelecetedItems: function (_ids, _names) {\n var self = this;\n\n var hiddVals = self.hidd.val();\n var inpVals = self.inp.val();\n\n var ids = _ids || (hiddVals ? hiddVals.split(';') : []);\n var names = _names || (inpVals ? inpVals.split(';') : []);\n\n var html = '';\n for (var i = 0; i < names.length; i++) {\n var val = [];\n val[self.cellIDIndex] = $.trim(ids[i]);\n val[self.cellToInput] = $.trim(names[i]);\n if (val[self.cellIDIndex] != '') {\n html += self.createNewSelecetedItemHTML(val);\n }\n }\n //TODO Шамов А.: Когда-нибудь переделать на setValues.\n self.createNewSelecetedItem(null, $(html));\n\n // Если это инициализация значений или потеря фокуса, то сместим выбранные записи в самое лево, что бы был виден первый элемент.\n setTimeout(function () { // CardForm инициализирует значения немного позже, поэтому для него setTimeout.\n self.changeInpWidthAndPadding(true);\n }, 150);\n\n //Навешиваем событие на resize окна, что бы изменялось положение выбранных записей.\n if (!self.multi_windowResizeInit) {\n var rsTimeout;\n $(window).bind('resize.refselect', function () {\n if (rsTimeout) clearTimeout(rsTimeout); // нужен что бы часто не рассчитывать.\n rsTimeout = setTimeout(function () {\n self.changeInpWidthAndPadding();\n }, 100);\n });\n self.multi_windowResizeInit = true;\n }\n },\n\n // Загрузка нужной страницы.\n loadPage: function (delta) {\n var self = this;\n var p = self.currentPage;\n if (delta == -2) {\n p = 1;\n } else if (delta == -1) {\n p -= 1;\n } else if (delta == 1) {\n p += 1;\n } else if (delta == 2) {\n p = self.maxPages;\n }\n\n if (p < 1) p = 1;\n if (p > self.maxPages) p = self.maxPages;\n\n if (self.currentPage != p) {\n self.currentPage = p;\n self.suggest();\n }\n },\n\n // Удаление таймаута на событии onblur главного inputa.\n clearBlurTimeout: function () {\n var self = this;\n clearTimeout(self.close);\n self.inp.focus();\n },\n\n onInputChanged: function (disableSendQuery) {\n var self = this;\n setTimeout(function () { //эта функция вызывается в keypress и что бы в input появился символ, который нажали, делаем этот setTimeout.\n var v = $.trim(self.inp.val());\n if (v !== self.oldv) {\n // Сохраняем предыдущее значение только если будем отправлять запрос.\n if (!disableSendQuery) {\n self.oldv = v;\n }\n var check = v;\n check = check.replace(/ /g, \"\");\n var len = check.length;\n if (len >= self.minChars) {\n if (self.timeout) clearTimeout(self.timeout);\n self.timeout = setTimeout(function () {\n // Если быстро ввести и удалить символ отображалась выпадайка со всеми записями,\n // но терялся констекст и она была в верхнем левом углу, поэтому если в инпуте ничего не введено выпадайку не показываем.\n if (self.oldv.length > 0) {\n self.suggestLastMode = 'show';\n self.suggest(function () {\n self.results.scrollTop(0);\n }, disableSendQuery);\n };\n }, self.delay);\n } else {\n if (v == '' && !self.multiselect) {\n self.selectEmpty(true);\n }\n self.hideContainer();\n };\n };\n }, 0);\n },\n\n // Перемещение по справочникам.\n moveReference: function (d) {\n var self = this;\n var refCaptions = $.merge(self.title.children(), self.footer.children());\n var selected = refCaptions.filter('.selected');\n if (d == 0) {\n return selected;\n } else {\n var nextSelIndex = refCaptions.index(selected.removeClass('selected').get(0)) + d;\n if (nextSelIndex == -1) {\n nextSelIndex = refCaptions.length - 1;\n }\n if (nextSelIndex == refCaptions.length) {\n nextSelIndex = 0;\n }\n return $(refCaptions.get(nextSelIndex)).addClass('selected');\n }\n },\n\n // Обработка нажатий на клавищи.\n process: function (e) {\n var self = e.data;\n\n if (self.inp.attr('readonly') || self.inp.attr('disabled')) return;\n\n if (!(/^13$|^9$/.test(e.keyCode)) && !self.container.is(':visible')) {\n self.inp.data('selected', 'false'); // Значение изменилось.\n }\n\n //alt+down для раскрытия полного списка.\n if (e.altKey && e.keyCode == 40 && $.trim(self.inp.val()) == '' && !self.container.is(':visible')) {\n self.onImgClick(e);\n }\n\n\n // Влево/вправо при множественном выборе\n if (self.multiselect && /^46$|^36$|^35$|^37$|^39$/.test(e.keyCode) && $.trim(self.inp.val()) == '') {\n e.preventDefault();\n e.stopPropagation();\n switch (e.keyCode) {\n case 46: //del\n //Если пользователь удаляет много элементов подрят, то удалим все элементы сразу.\n if (!self.checkLongDeletion()) {\n self.deleteOneItem(self.inp.next());\n } else {\n self.deleteAllItems();\n };\n break;\n case 36: //home\n self.multiLeft(true);\n break;\n case 35: //end\n self.multiRight(true);\n break;\n case 37: //left\n // Выпадающиего списка нет, то переходим между элементами.\n if (!self.container.is(':visible')) {\n self.multiLeft();\n }\n break;\n case 39: //right\n if (!self.container.is(':visible')) {\n self.multiRight();\n }\n break;\n };\n };\n\n // Скрытие/раскрытие записей справочника.\n if (self.refcodesCount > 1 && /^37$|^39$/.test(e.keyCode) && self.container.is(':visible')) {\n e.preventDefault();\n e.stopPropagation();\n //left, right\n if (e.keyCode == 37 || e.keyCode == 39) {\n self.selectReference(self.moveReference(0));\n }\n }\n\n // Backspace работает всегда\n if (/^8$/.test(e.keyCode) && self.inp.val() == '') {\n e.preventDefault();\n e.stopPropagation();\n //Если пользователь удаляет много элементов подрят, то удалим все элементы сразу.\n if (!self.checkLongDeletion()) {\n self.deleteOneItem(self.inp.prev());\n } else {\n self.deleteAllItems();\n };\n }\n\n if ((/^27$|^38$|^40$/.test(e.keyCode) && (self.container.is(':visible') || self.suggestInProcess)) || (/^13$|^9$/.test(e.keyCode) && self.container.is(':visible') && self.get())) {\n e.preventDefault();\n e.stopPropagation();\n switch (e.keyCode) {\n case 38: //up\n if (self.table.is(':visible')) {\n self.prev();\n } else {\n // Таблица с записями скрыта, значит выбираем справочник.\n self.moveReference(-1);\n }\n break;\n case 40: //down\n if (self.table.is(':visible')) {\n self.next();\n } else {\n // Таблица с записями скрыта, значит выбираем справочник.\n self.moveReference(1);\n }\n break;\n case 9: //tab\n case 13: //return\n if (self.table.is(':visible')) {\n // Выбор записи справочника.\n var selected_row = self.get();\n if (selected_row != null) {\n selected_row.click();\n } else {\n self.select();\n }\n } else {\n // Выбор справочника.\n self.selectReference(self.moveReference(0));\n }\n break;\n case 27: // escape\n self.hideContainer();\n break;\n }\n } else {\n if (e.keyCode !== 9 && self.allowlike) {\n\n //Если включен режим поиска только при нажатии на Enter, то проверяем кнопку.\n var disableSendQuery = false;\n if (self.sendQueryOnlyOnEnter) {\n\n // Если продолжили набирать, то скрываем предыдущие результаты.\n self._hideAndResetContainer();\n\n if (e.keyCode === 13) {\n e.preventDefault();\n e.stopPropagation();\n disableSendQuery = false;\n } else {\n disableSendQuery = true;\n }\n }\n\n self.onInputChanged(disableSendQuery);\n }\n }\n },\n\n //Проверяет долгое нажатие на кнопку Del/Backspace.\n checkLongDeletion: function () {\n var self = this;\n\n // Запомним время первого нажатия кнопки удалить (Del/Backspace).\n if (self._startDeleteTime === null) {\n self._startDeleteTime = $.now();\n };\n\n //Если прошло 1.5 с. с момента первого нажатия, то это долгое нажатие кнопки удалить.\n if (($.now() - self._startDeleteTime) > 1500) {\n return true;\n };\n\n // Таймер для сброса времени первого нажатия кнопки удалить.\n if (self._deleteTimeout) clearTimeout(self._deleteTimeout);\n self._deleteTimeout = setTimeout(function () {\n self._startDeleteTime = null;\n }, 300);\n\n //Не должгое нажатие.\n return false;\n },\n _startDeleteTime: null,\n _deleteTimeout: null,\n\n\n // Получение текущей выделенной строки таблицы.\n get: function () {\n var self = this;\n return self.table.find('.rs_tr_over');\n },\n\n // Переход на предыдущую строку\n prev: function () {\n this.move(-1);\n },\n\n // Переход на следующую строку\n next: function () {\n this.move(1);\n },\n\n move: function (delta) {\n var self = this;\n var current = self.get();\n var next = (delta > 0 ? current.next() : current.prev());\n var overed;\n if (current.length > 0) {\n if (next.length > 0) {\n current.parent().find('.rs_tr_over').removeClass('rs_tr_over');\n overed = next.addClass('rs_tr_over');\n }\n } else {\n overed = self.table.find('tr:first').addClass('rs_tr_over');\n }\n self.scrollToOver(overed);\n },\n\n scrollToOver: function (overed) {\n var self = this;\n if (overed && overed.length > 0) {\n var overTop = overed.position().top;\n if ((overTop + overed.height()) > self.results.height()) {\n self.results.scrollTop(self.results.scrollTop() + overTop - overed.height());\n }\n if (overTop < 0) {\n self.results.scrollTop(self.results.scrollTop() + overTop + overed.height() - self.results.height());\n }\n }\n },\n\n //Получаем все выбранные записи.\n getValues: function () {\n var self = this;\n var v = [];\n if (self.selectedItems !== null) {\n self.selectedItems.children('span').each(function () {\n var item = $(this);\n var refcode;\n var id = '' + item.data('id');\n var idParts = id.split(':');\n if (idParts.length == 2) {\n refcode = idParts[0];\n id = idParts[1];\n } else {\n refcode = self.getFirstRefCode();\n };\n v.push({\n groupcode: refcode,\n id: id,\n name: '' + item.data('text')\n });\n });\n }\n return v;\n },\n\n // Устанавливает 1 значение.\n setValue: function (newValue, needTriggerResult) {\n var self = this;\n var oldHiddVal = self.hidd.val();\n\n // Если не множественный выбор, то очищаем предыдущее значение.\n try {\n if (!self.multiselect) {\n self.deleteAllItems(false);\n }\n } catch (e) {\n console.log(e);\n }\n\n if (newValue != null) {\n // Создаем новый выбранный элемент.\n self.createNewSelecetedItem(newValue);\n }\n\n if (!!needTriggerResult) {\n if (self.allowlike) {\n self.triggerResultEvent(oldHiddVal, newValue);\n } else {\n self.inp.trigger('changeOnSelectValue', [newValue]);\n }\n }\n\n self.inp.data('selected', '' + (newValue != null));\n },\n\n // Устанавливает множество значений. Формат [{groupcode:'код справочника', id:'ид записи', name:'наименование'}, ...]\n setValues: function (newValues, needTriggerResult) {\n var self = this;\n if (self.multiselect) {\n var oldHiddVal = self.hidd.val();\n\n self.deleteAllItems(false);\n\n var html = '';\n for (var i = 0; i < newValues.length; i++) {\n var val = [];\n val[self.cellIDIndex] = $.trim(newValues[i].groupcode + ':' + newValues[i].id);\n val[self.cellToInput] = $.trim(newValues[i].name);\n if (val[self.cellIDIndex] != '') {\n //Для увеличения скорости работы не вызываем setValue.\n html += self.createNewSelecetedItemHTML(val);\n }\n }\n self.createNewSelecetedItem(null, $(html));\n if (!!needTriggerResult) {\n self.triggerResultEvent(oldHiddVal, newValues);\n }\n\n self.inp.data('selected', '' + (html != ''));\n }\n },\n\n triggerResultEvent: function (oldHiddVal, val) {\n var self = this;\n if (self.hidd.val() != oldHiddVal) {\n if (self.multiselect) {\n //Шамов А.: Не вызываем триггер result во множественном выборе, т.к. оно перезапишет значение в скрытом поле.\n self.inp.trigger(\"resultMulti\", [val, self.getValues()]);\n } else {\n self.inp.trigger(\"result\", [val]);\n }\n }\n },\n\n // Значение выбранно.\n select: function (isOne, el) {\n var self = this;\n var selected_row = el ? el : (isOne ? self.table.find('tr') : self.table.find('.rs_tr_over'));\n if (selected_row != null) {\n var data = selected_row.data('rowData') || null;\n if (data !== null) {\n var val = [data.id, data.encodedTitle, data.title, data.leadingRequisitesValue];\n self.inp.val(val[self.cellToInput]);\n val[0] = (self.isCustomSelect || self.refcodesCount > 1 || self.multiselect ? (self.selectedRefCode + ':') : '') + val[0]; //добавляем код выбранного справочника.\n\n self.setValue(val, true);\n\n // Если оставить этот setTimeout то в детальных раздела прохо работает клавиатурная навигация.\n if (WA.ENV.browser.name === 'IE' && self.inp.parents('.slick-cell').length === 0) {\n // Для IE иначе после выбора нельзя ничего написать (#103690).\n setTimeout(function () {\n self.inp.blur();\n self.inp.focus();\n }, 100);\n }\n self.hideContainer();\n }\n }\n },\n\n // Перемещает реальный input в div с выбранными.\n moveInputToSelecetedItem: function () {\n var self = this;\n\n // Shirobokov_AV: Для исправления дефекта с неотображаемыми текстбоксами в хроме и сафари (№ 56018).\n if ($('#modal_window form').length != 0) { $('#modal_window form').css(\"position\", \"relative\"); }\n\n if (self.selectedItems.find('input').length == 0) {\n // Создаем фэйковую input для сохранения красоты.\n var placeholder = self.inp.data('placeholder') ? self.inp.data('placeholder') : self.inp.attr('placeholder');\n self.fakeInp = $('')\n .bind('focus.refselect', function () {\n self.inp.focus();\n })\n .addClass(self.inp.attr('class'))\n .attr('placeholder', placeholder);\n\n if ($.ipad) {\n self.inpParent.bind('click touchstart', function (e) {\n self.inp.focus();\n if (!WA.ENV.isAndroid()) {\n e.stopPropagation();\n e.preventDefault();\n }\n });\n };\n\n self.inpParent.append(self.fakeInp);\n self.inpParent.attr('data-stataction', 'Requisite');\n\n self.fakeInp.on('contextmenu', function (e) {\n e.preventDefault();\n e.stopPropagation();\n return false;\n });\n\n // Корректируем стили для множественного выбора.\n /*self.inpParent.css({ 'padding-right': '2px' });\n self.img.css({ right: 0 });*/\n\n // Добавляем реальный input в div с выбранными.\n self.selectedItems.append(self.inp);\n\n self.inp\n .addClass('rs_multi_input')\n .bind('keyup.refselect', function () {\n self.changeInpWidthAndPadding();\n })\n .bind('click.refselect', function (e) {\n // Запрещаем все остальные события, такие как клик на контейнер выбранных записей.\n e.stopPropagation();\n });\n }\n },\n\n // Формирует HTML строку для выбранного элемента.\n createNewSelecetedItemHTML: function (val) {\n\n var self = this;\n\n if (val[self.cellToInput] == '') return '';\n\n // Передано выбранное значение с кодом справочника, то вычленим его.\n var refCode = '';\n var id = val[self.cellIDIndex];\n var idParts = ('' + id).split(':');\n // Получаем код справочника из ИД, если он там есть, иначе берем переданный или первый в списке.\n if (idParts.length == 2) {\n refCode = idParts[0];\n id = idParts[1];\n } else {\n refCode = self.getFirstRefCode();\n }\n\n var refDesc = null;\n if (refCode != '' && typeof self.refcodes[refCode] !== 'undefined') {\n refDesc = self.refcodes[refCode];\n }\n\n var hintData = self.getHintData(refCode, id, val[self.cellToInput]);\n var delIco = $.ipad && !self.isReadonly() ? '' : (self.multiselect ? ';' : '');\n var dataText = ' data-text=\"' + val[self.cellToInput].escapeHtml() + '\" ';\n\n // Если нет прав на реквизит, то не подчеркиваем *.\n var spanClass = '';\n if (val[self.cellToInput] == '*') {\n delIco = '';\n spanClass = ' underline-none ';\n }\n\n return '' +\n ('' + val[self.cellToInput]).escapeHtml() + '' + delIco + '';\n },\n\n // Создает новый выбранный элемент.\n createNewSelecetedItem: function (val, items) {\n var self = this;\n var lastItem;\n\n if (typeof items === 'undefined' || items == null) {\n var html = self.createNewSelecetedItemHTML(val);\n if (html == '') return;\n lastItem = $(html);\n } else {\n lastItem = items;\n }\n\n if (self.isReadonly()) {\n lastItem.addClass('Req_Disabled');\n } else {\n lastItem.bind('click.refselect', function (e) {\n if (self.multiselect) {\n // Запрещаем все остальные события, такие как клик на контейнер выбранных записей.\n e.stopPropagation();\n var $this = $(this);\n var middleX = $this.offset().left + ($this.outerWidth(true) / 2);\n // Если кликнули на первую половину, то input перемещаем слева, иначе справа.\n if (e.clientX < middleX) {\n $this.before(self.inp);\n } else {\n $this.after(self.inp);\n }\n self.changeInpWidthAndPadding();\n }\n setTimeout(function () { //для IE\n self.inp.focus();\n }, 100);\n });\n lastItem.find('i').one('click.refselect touchstart', function () { self.deleteOneItem($(this).parent()); });\n }\n\n self.inp.before(lastItem);\n\n // Подсказки к выбранным элементам.\n $.each(lastItem, function () {\n if ($(this).hasClass('hint')) {\n InitAdditionalInfoTooltip($(this));\n }\n });\n\n // Очищаем input, т.к. уже добавили новый элемент во внешнюю div.\n self.inp.val('');\n self.oldv = '';\n\n // Обновляем скрытое поле.\n self.changeHiddenValue();\n\n //Изменяем ширину input.\n self.changeInpWidthAndPadding();\n },\n\n // Удаляет переданный элемент.\n deleteOneItem: function (item, callSelectEmpty, isNeedAnimate) {\n var self = this;\n if (item.length > 0) {\n var removeFunc = function () {\n $(item).remove();\n var oldval = self.hidd.val()\n\n self.changeHiddenValue();\n\n self.triggerResultEvent(oldval, null);\n\n self.changeInpWidthAndPadding();\n //Вызываем функцию здесь, чтобы сработала после анимации, для множественного выбора один раз должна сработать\n if (self.selectedItems.children('span').length == 0) {\n self.selectEmpty(callSelectEmpty !== false);\n }\n };\n if (isNeedAnimate !== false) {\n item.animate({ width: 0 }, 300, 'linear', removeFunc);\n } else {\n removeFunc();\n }\n }\n },\n\n // Удаляет все элементы.\n deleteAllItems: function (callSelectEmpty) {\n var self = this;\n if (self.selectedItems !== null) {\n var childspan = self.selectedItems.children('span');\n if (childspan.length > 0) {\n self.selectEmpty(callSelectEmpty !== false);\n }\n childspan.remove();\n }\n self.changeHiddenValue();\n self.changeInpWidthAndPadding();\n },\n\n // Изменяет ширину input и сдвигает каретку.\n changeInpWidthAndPadding: function (isInitOrBlur) {\n var self = this;\n\n if (self.inpParent !== null) {\n // Если inpParent скрыт, то Width работать не будет, поэтому навешиваемся на любой клик для мониторинга видимости этого элемента.\n if (self.inpParent.is(':hidden')) {\n var checkVis = function () {\n if (self.inpParent.is(':visible')) {\n self.changeInpWidthAndPadding();\n $('body').unbind('click keyup keydown', checkVis);\n }\n }\n $('body').bind('click keyup keydown', checkVis);\n return;\n }\n\n var parentWidth = self.inpParent.width() - 21; //21 - картинка с \"...\"\n self.selectedItemsCont.css({ 'width': parentWidth });\n }\n\n\n // Меняем длину input в зависимости от введенного текста.\n var inpWidth = 12;\n if ($.ipad) {\n inpWidth = 70;\n }\n self.inp.css({ 'width': (inpWidth + self.getTextMetric(self.inp)) });\n\n // Считаем длину всех выбранных элементов для сдвига.\n var sumWidthBeforeInp = 0;\n var sumWidthAll = 0;\n var isInp = false;\n if (self.selectedItems !== null) {\n self.selectedItems.children().each(function () {\n var w = $(this).outerWidth(true);\n sumWidthAll += w;\n // Считаем сумму выбранных элементов до input + сам input, что бы input находился всегда на виду.\n if (!isInp) {\n sumWidthBeforeInp += w;\n isInp = $(this).hasClass('rs_multi_input');\n }\n });\n }\n // Сдвигам влево выбранные записи.\n var dLeft = parentWidth - sumWidthBeforeInp;\n // Если это инициализация значений или потеря фокуса, то сместим выбранные записи в самое лево, что бы был виден первый элемент.\n if (dLeft < 0 || dLeft > 0 || !!isInitOrBlur || !self.inp.is(':focus')) dLeft = '0px'; //что бы не уезжал вправо\n if (self.selectedItems !== null) {\n self.selectedItems.css({ left: dLeft });\n self.selectedItemsCont.scrollLeft(0); //При focus'е на input невидимый (overflow:hidden) скрол смещается, ставим его наместо!\n }\n self.setCoordForContainer();\n },\n\n // Определяет ширину введенного текста в input.\n getTextMetric: function (input) {\n var body = $('body');\n var textMetric = body.find('.textMetric:first');\n if (textMetric.length == 0) {\n textMetric = $('
').addClass('textMetric').css({\n position: 'absolute',\n left: -1000,\n top: -1000,\n display: 'none'\n });\n body.append(textMetric);\n\n var styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];\n $.each(styles, function () {\n var s = this.toString();\n textMetric.css(s, input.css(s));\n });\n }\n var text = input.val().replace(/ /g, ' ').replace(//g, '>');\n return textMetric.html(text).outerWidth();\n },\n\n // Обновляет скрытое поле значениями из выбранных блоков.\n changeHiddenValue: function () {\n var self = this;\n var ids = '';\n if (self.selectedItems !== null) {\n self.selectedItems.children('span').each(function () {\n ids += $(this).data('id') + ';';\n });\n }\n // Удаляем последнюю ;\n if (ids != '') {\n ids = ids.substr(0, ids.length - 1);\n self._hidePlaceholder();\n }\n\n self.hidd.val(ids);\n },\n\n // Заменяет выбранный элемент на новые.\n replaceSelectedItem: function (oldID, newValues, onlyLast) {\n var onlyLast = onlyLast || false;\n var self = this;\n\n var replaced = self.selectedItems.find('span[data-id=\"' + oldID + '\"]');\n if (onlyLast) {\n replaced = replaced.last();\n };\n\n if (replaced.length > 0) {\n replaced.after(self.inp);\n self.deleteOneItem(replaced, true, false);\n\n var html = '';\n $.each(newValues, function () {\n html += self.createNewSelecetedItemHTML(this);\n });\n\n // Создаем сразу все span так быстрее.\n self.createNewSelecetedItem(null, $(html));\n\n setTimeout(function () {\n self.inp.focus();\n }, 100);\n }\n },\n\n // Событие при нажатии клавиши влево при множественном выборе.\n multiLeft: function (toBegin) {\n var self = this;\n var item;\n if (toBegin) {\n item = self.selectedItems.children('span:first');\n } else {\n item = self.inp.prev();\n }\n item.before(self.inp);\n\n setTimeout(function () { //для IE\n self.inp.focus();\n }, 100);\n\n self.changeInpWidthAndPadding();\n },\n\n // Событие при нажатии клавиши вправо при множественном выборе.\n multiRight: function (toEnd) {\n var self = this;\n var item;\n if (toEnd) {\n item = self.selectedItems.children('span:last');\n } else {\n item = self.inp.next();\n }\n item.after(self.inp);\n\n setTimeout(function () { //для IE\n self.inp.focus();\n }, 100);\n\n self.changeInpWidthAndPadding();\n },\n\n // Значение из представленных не выбранно.\n selectEmpty: function (AlwaysEmpty) {\n var self = this;\n if (self.mustMatch || AlwaysEmpty) {\n self.inp.val('');\n //Шамов А.: Убрал, т.к. удалять если в Input ввели что-то некорректно не правильно, пусть остается предыдущее значение.\n //self.deleteAllItems();\n //self.inp.trigger('result', [null]);\n var item = self.selectedItems.find('span');\n if (item.length == 1) {\n //Значение осталось прежним выбранным.\n self.inp.data('selected', true);\n } else {\n //Ничего ранее выбранно не было и сейчас не выбрали, то сообщаем об этом внешнему интерфейсу.\n if (self.multiselect) {\n //Шамов А.: Не вызываем триггер result во множественном выборе, т.к. оно перезапишет значение в скрытом поле.\n self.inp.trigger(\"resultMulti\", [null]);\n }\n else {\n self.inp.trigger('result', [null]);\n }\n }\n }\n },\n\n // Отображает выбор из справочника.\n showContainer: function () {\n var self = this;\n $.each($('.rs_container'), function () {\n if ($(this).attr('id') != self.contId) $(this).hide();\n });\n\n // Не отображаем выпадающий список, если открылся модальный диалог и этот выбор из справочника не в нем.\n if ($('.ui-dialog:visible').length == 0 || self.img.parents('.ui-dialog').length > 0) {\n self.setCoordForContainer();\n self.container.show();\n var firstItem = self.table.find('tr:first');\n if (firstItem.data('rowData') && self.table.find('tr.rs_tr_over').length == 0) firstItem.addClass('rs_tr_over');\n if ($.scrollActive) {\n if (!self.container.data('iscroll')) {\n self.container.data('iscroll', new iScroll(self.container.find('.rs_results')[0]));\n } else {\n self.container.data('iscroll').refresh();\n }\n }\n };\n\n self.bindScrollLoad();\n },\n\n bindScrollLoad: function () {\n var self = this;\n self.results.off('scroll.refselect').on('scroll.refselect', function () {\n var scroller = $(this);\n var table = scroller.find('table:first');\n var bottomDistance;\n if (!self.suggestInProcess) {\n if ($.scrollActive) { // проверка на скролл на сенсорных устройствах\n bottomDistance = table.height() - scroller.height() - scroller.offset().top + table.offset().top;\n } else {\n bottomDistance = table.height() - (scroller.scrollTop() + scroller.height());\n }\n if (bottomDistance < 100) self.loadPage(1);\n }\n });\n },\n\n // Скрывает выбор из справочника и очищает поле ввода если ничего не выбрано.\n hideContainer: function () {\n var self = this;\n if (self.inp.data('selected') == 'false') {\n self.selectEmpty(true);\n }\n self._hideAndResetContainer();\n },\n\n // Скрывает выбор из справочника.\n _hideAndResetContainer: function () {\n var self = this;\n self.selectedRefCode = null;\n self.selectedRefIsClosed = false;\n self.results.off('scroll.refselect');\n self.table.empty().removeData('refcode');\n self.currentPage = 1;\n self.oldv = '';\n $('.rs_container').hide();\n },\n\n getQueryValue: function () {\n var self = this;\n var v = self.inp.val();\n if (self.multiselect) {\n var vs = v.split(';');\n v = vs[vs.length - 1];\n }\n return $.trim(v);\n },\n\n showSpinner: function () {\n var self = this;\n if (self.spinner_timeout != null) clearTimeout(self.spinner_timeout);\n self.spinner_timeout = setTimeout(function () {\n var spinner = self.img.find('.refselect-input__spinner');\n var icon = self.img.find('.refselect-input__icon');\n if (spinner.length === 0) {\n self.img.append('
');\n } else {\n spinner.show();\n }\n icon.hide();\n }, 100);\n\n self.suggestInProcess = true;\n self.inp.addClass('suggestInProcess');\n },\n\n hideSpinner: function () {\n var self = this;\n if (self.spinner_timeout != null) clearTimeout(self.spinner_timeout);\n if (self.img !== null) {\n var spinner = self.img.find('.refselect-input__spinner');\n var icon = self.img.find('.refselect-input__icon');\n\n if (spinner) {\n spinner.hide();\n icon.show();\n }\n }\n self.suggestInProcess = false;\n self.inp.removeClass('suggestInProcess');\n },\n\n // Получает первый переданный справочник.\n getFirstRefCode: function () {\n var self = this;\n // Получить первый элемент можно только так.\n for (var refcode in self.refcodes) {\n // Возвращаем первый реальный справочника, а не псевдо (#95748).\n if (!self.refcodes[refcode].IsPseudoReference) {\n return refcode;\n }\n }\n return '';\n },\n\n /**\n * Установить выборку из указанных справочников\n * @param {object} references - информация о справочниках {\"ОРГ\":{\"Caption\":\n * \"организации\",...},\"РАБ\":{..}}}\n * @function setReferences\n */\n setReferences: function (references) {\n this._checkIsReferencesSetProperly(references);\n this.refcodes = references;\n this.refcodesCount = this._getReferencesCount();\n this._makeIconAccessible();\n return this;\n },\n\n /**\n * К существующим спраочникам, по которым идет выборка, добавить указанные.\n * @param {object} references - информация о справочниках {\"ОРГ\":{\"Caption\":\n * \"организации\",...},\"РАБ\":{..}}}\n * @function addReferences\n */\n addReferences: function (references) {\n this._checkIsReferencesSetProperly(references);\n var object = $.extend(this.refcodes, references);\n this.refcodesCount = this._getReferencesCount();\n this._makeIconAccessible();\n return this;\n },\n\n /**\n * Проверка введенных параметров\n * @private\n */\n _checkIsReferencesSetProperly: function (references) {\n if (!references) WA.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\", \"references\");\n if (typeof references !== 'object') {\n WA.raise('ERR_AN_INVALID_PARAMETER_WAS_PASSED_TO_FUNCTION');\n };\n },\n\n /**\n * Сделать иконку кликабельной, и задать ей нормальную подпись.\n * @private\n */\n _makeIconAccessible: function () {\n this.img.removeClass(\"Req_Icon_AccessDenied\");\n this.img.attr(\"title\", this._getToolTip());\n },\n\n /**\n * Сформировать текст сплывающей подсказки.\n * @private\n */\n _getToolTip: function () {\n var lbl = \"RECORDS_OF_REFERENCE\";\n if (this.refcodesCount > 1) lbl = \"RECORDS_OF_REFERENCES\";\n var refs = [];\n for (var item in this.refcodes) {\n refs.push(this.refcodes[item].Caption);\n };\n return L(lbl, '\"' + refs.join(\", \") + '\"');\n },\n\n /**\n * Подсчет кол-ва справочников по которым идет выборка.\n * @private\n */\n _getReferencesCount: function () {\n var count = 0;\n for (var k in this.refcodes) {\n if (this.refcodes.hasOwnProperty(k)) {\n ++count;\n }\n }\n return count;\n },\n\n // Список последних запросов к серверу.\n lastRequests: [],\n // Выполняет поисковый запрос.\n suggest: function (afterShowCallback, disableSendQuery) {\n var self = this;\n\n // Блокируем поиск если это необходимо.\n if (!!disableSendQuery) return;\n\n\n function onSearchQueryDoneCallback() {\n var refCode;\n if (self.refsWithRecords.length == 0) {\n refCode = self.getFirstRefCode();\n } else {\n //Найдено больше 2 справочников, покажем выбор из первого справочников с записями.\n for (var refcode in self.refcodes) {\n if ($.inArray(refcode, self.refsWithRecords) != -1) {\n refCode = refcode;\n break;\n }\n }\n }\n self.selectedRefCode = refCode;\n\n //Запоминаем последнее введенное значение, что бы не было зацикливания. Замечание №55804.\n self.lastQuery = query;\n self.suggest(afterShowCallback);\n self.hideSpinner();\n };\n\n function onSearchError() {\n //self.hideContainer();\n self.hideSpinner();\n };\n\n function searchInOtherReferences() {\n self.refsWithRecords = [];\n self.refsWithErrorMessage = {};\n var requests = [];\n for (var refcode in self.refcodes) {\n var OnSuccessFunc = (function (refcode) { //Эта обертка нужна что бы замыкание переменной refcode сработало корректно, иначе в refcode будет всегда последнее значение.\n return function (maxPages, data) {\n // Какие-то записи найдены.\n if (data.length > 0) {\n self.refsWithRecords.push(refcode);\n }\n }\n })(refcode);\n var OnErrorFunc = (function (refcode) {\n return function (msg, isHttp) {\n // Если там ошибка и она не тот что записей не найдено, сохраним её для вывода в шапке.\n if (msg !== self.NoMatchText) {\n // В некоторых случаях нужно отображать разные сообщения в заголовке и при раскрытии.\n self.refsWithErrorMessage[refcode] = msg.split('^')[0];\n }\n }\n })(refcode);\n // Добавляем запрос к списку, что бы дождаться выполнения всех.\n requests.push(self.sendQuery(refcode, query, 1, self.max, OnSuccessFunc, OnErrorFunc));\n }\n self.lastRequests = $.merge(self.lastRequests, requests);\n // Ждем пока все запросы выполнятся.\n deferred = $.when.apply(this, requests);\n deferred.done(onSearchQueryDoneCallback).fail(onSearchError);\n };\n\n // Прекращаем все предыдущие запросы.\n while (self.lastRequests.length > 0) {\n self.lastRequests.pop().abort();\n };\n\n // Если не нужно показывать всё, то при пустом значении input поиск не выполняем.\n if (self.multiselect && self.suggestLastMode != 'show_all' && self.inp.val() == '') {\n self.hideContainer();\n self.hideSpinner();\n return;\n }\n\n self.showSpinner();\n\n var query = (self.suggestLastMode == 'show_all' ? '' : self.getQueryValue());\n\n // Если текст запроса изменился, то сбрасываем страницы на первую.\n if (query != self.lastQuery || self.selectedRefCode != self.lastSelectedRefCode) {\n self.currentPage = 1;\n self.results.scrollTop(0);\n }\n\n // Если указаны несколько кодов справочника, то отображаем выбор.\n // Провериям изменился ли текст в input что бы переполучить refsWithRecords. Замечание №55804.\n if ((query != self.lastQuery || (typeof self.selectedRefCode === 'undefined' || self.selectedRefCode == null)) && self.refcodesCount > 0) {\n if (self.refcodesCount > 1) {\n self.refsWithRecords = [];\n self.refsWithErrorMessage = {};\n\n if (!!self.mainReferenceCode) {\n self.sendQuery(self.mainReferenceCode, query, 1, self.max, function (maxPages, data) {\n // Какие-то записи найдены.\n if (data.length > 0) {\n for (var refcode in self.refcodes) {\n self.refsWithRecords.push(refcode);\n }\n onSearchQueryDoneCallback();\n } else {\n for (var refcode in self.refcodes) {\n if (refcode !== self.mainReferenceCode) {\n self.refsWithRecords.push(refcode);\n }\n }\n searchInOtherReferences();\n }\n }, function (msg, isHttp) {\n // Если там ошибка и она не тот что записей не найдено, сохраним её для вывода в шапке.\n if (msg !== self.NoMatchText) {\n // В некоторых случаях нужно отображать разные сообщения в заголовке и при раскрытии.\n self.refsWithErrorMessage[self.mainReferenceCode] = msg.split('^')[0];\n }\n }).fail(onSearchError);\n\n } else {\n // Делаем запросы по всем справочникам, что бы лишний раз не заставлять пользователя его выбирать.\n searchInOtherReferences();\n }\n\n return;\n } else {\n self.selectedRefCode = self.getFirstRefCode();\n }\n }\n\n if (Core.isStatisticEnabled) {\n // Записываем статистику.\n WA.CR.statistics.write({\n page: WA.getLocation(),\n action: 'LikeQuery',\n area: 'ReferenceRequisite',\n target: self.inp.get(0)\n });\n };\n\n self.lastRequests.push(self.sendQuery(self.selectedRefCode, query, self.currentPage, self.max, function (maxPages, data) {\n //OnSuccess\n self.maxPages = maxPages;\n if (self.currentPage == 1) self.table.empty().removeData('refcode');\n\n // Обновим видимость табилицы с записями справочника.\n self.updateTableVisibility();\n isEmpty = self.createRows(self.selectedRefCode, data, afterShowCallback);\n\n if (!isEmpty && (self.suggestLastMode == 'show' || self.suggestLastMode == 'show_all')) {\n self.showContainer();\n if (afterShowCallback) afterShowCallback();\n } else {\n self.hideContainer();\n }\n\n self.hideSpinner();\n }, function (msg, isHttp) {\n // OnError\n\n // Обновим видимость табилицы с записями справочника.\n self.updateTableVisibility();\n\n if (msg != 'abort') {\n self.showError(isHttp ? L('SERVER_ERROR_OCCURRED') : msg);\n }\n self.hideSpinner();\n }));\n\n self.lastQuery = query;\n self.lastSelectedRefCode = self.selectedRefCode;\n },\n\n sendQuery: function (RefCode, Query, Page, Limit, OnSuccess, OnError) {\n var self = this;\n\n if (!self.refcodes[RefCode]) {\n var d = $.Deferred();\n d.reject();\n return d;\n }\n\n var filter = \"\";\n if (self.refcodes[RefCode] && self.refcodes[RefCode]['Filter'] !== null) {\n filter = self.refcodes[RefCode]['Filter'];\n } else {\n filter = self.inp.data('filter');\n };\n\n // Нужно ли отключать спец. обработку справочника.\n if (self.refcodes[RefCode]) {\n var disablespecialprocessing = self.refcodes[RefCode]['DisableSpecialProcessing'];\n }\n\n var queryContext = self.queryContext;\n // Множественный выбор ссылается на несколько ревизитов, поэтому меняем контекст.\n if (self.referenceCodesAndReqNamesInDetailSection && self.referenceCodesAndReqNamesInDetailSection[RefCode]) {\n queryContext = JSON.parse(queryContext);\n queryContext.requisiteNumber = self.referenceCodesAndReqNamesInDetailSection[RefCode].number;\n queryContext = JSON.stringify(queryContext);\n }\n\n var url = self.url + '&RefCode=' + encodeURI(RefCode);\n var params = $.extend({\n q: Query || \"\",\n limit: Limit,\n page: Page,\n filter: filter,\n sort: self.inp.data('sort'),\n useadditional: self.useadditional ? \"1\" : \"0\",\n disablespecialprocessing: disablespecialprocessing ? \"1\" : \"0\",\n queryContext: queryContext,\n }, self.extraParams || {});\n\n return self.dataProvider.sendQuery(url, params, OnSuccess, OnError);\n },\n\n // Обновяет видимость табилицы с записями справочника.\n updateTableVisibility: function () {\n var self = this;\n if ((typeof self.refsWithRecords != 'undefined' && self.refsWithRecords.length == 0) || !self.selectedRefIsClosed) {\n self.table.show();\n } else {\n self.table.hide();\n }\n // Сохраним в таблице код справочника записи которого были выбраны.\n self.table.data('refcode', self.selectedRefCode);\n },\n\n showError: function (msg, afterShowCallback) {\n var self = this;\n self.makeTitleAndFooter(afterShowCallback);\n\n // В некоторых случаях нужно отображать немного другой текст ошибки, чем в заголовке справочника.\n if (msg.indexOf('^') != -1) {\n if (self.multiselect) {\n msg = msg.split('^')[1];\n } else {\n msg = msg.replace('^', '. ');\n }\n }\n\n\n if (self.inp.offset().top === 0) return; //не показываем ничего если инпута уже нет\n\n\n self.table.html('' + msg + '');\n self.showContainer();\n if (afterShowCallback) afterShowCallback();\n self.hideSpinner();\n },\n\n // Формирует шапку и подножие.\n makeTitleAndFooter: function (afterShowCallback) {\n var self = this;\n\n if (self.refcodesCount > 1) {\n var beforeRefCodes = [];\n var afterRefCodes = [];\n var current = beforeRefCodes;\n\n // Определяем коды справочника до и после выбранного.\n for (var refcode in self.refcodes) {\n current.push(refcode);\n if (refcode == self.selectedRefCode) {\n current = afterRefCodes;\n }\n }\n\n var makeDivs = function (codes, container) {\n if (codes.length == 0) {\n container.empty();\n } else {\n var html = '';\n for (var i = 0; i < codes.length; i++) {\n if ((typeof self.refsWithRecords != 'undefined' && $.inArray(codes[i], self.refsWithRecords) != -1) ||\n (typeof self.refsWithErrorMessage != 'undefined' && typeof self.refsWithErrorMessage[codes[i]] != 'undefined')) {\n\n var cssClass = '';\n if (codes[i] == self.selectedRefCode) cssClass = 'selected';\n if (self.selectedRefIsClosed) cssClass += ' closed';\n\n html += '
';\n html +=\n '

' +\n ' ' +\n ' ' +\n ' ' +\n '

';\n html += self.refcodes[codes[i]].Caption;\n\n if (typeof self.refsWithErrorMessage != 'undefined' && typeof self.refsWithErrorMessage[codes[i]] != 'undefined') {\n html += ' (' + $.trim(self.refsWithErrorMessage[codes[i]].toLowerCase()) + ')';\n }\n\n html += '
';\n }\n }\n container.html(html).find('div')\n .bind('click.refselect', function () { self.selectReference(this, afterShowCallback); })\n .hover(\n function () { $(this).addClass('hover'); },\n function () { $(this).parent().children('.rs_RefCaption').removeClass('hover'); }\n );\n }\n }\n\n //Формируем заголовок\n makeDivs(beforeRefCodes, self.title);\n if (beforeRefCodes.length > 0) {\n self.title.show();\n } else {\n self.title.hide();\n }\n\n //Формируем подножие\n makeDivs(afterRefCodes, self.footer);\n if (afterRefCodes.length > 0) {\n self.footer.show();\n } else {\n self.footer.hide();\n }\n } else {\n self.title.hide();\n self.footer.hide();\n }\n },\n\n // Выбирает справочник и открывает/подгружает его записи.\n selectReference: function (refCaption, afterShowCallback) {\n var self = this;\n var $this = $(refCaption);\n if ($this.hasClass('selected')) {\n self.selectedRefIsClosed = !$this.hasClass('closed');\n } else {\n self.selectedRefIsClosed = false;\n }\n\n // Навешиваем/снимаем стиль закрыточки справочника.\n if (self.selectedRefIsClosed) {\n $this.addClass('closed');\n } else {\n $this.removeClass('closed');\n }\n\n self.inp.focus();\n self.selectedRefCode = $this.data('refcode');\n self.suggest(afterShowCallback);\n },\n\n // Генерирует data-атрибут и нужный css-класс для html-элемента.\n getHintData: function (refcode, id, text) {\n var self = this;\n // Нужно ли отображать подсказку.\n var hintClass = (self.refcodes[refcode] && self.refcodes[refcode].NeedShowHint ? \"hint \" : \"\");\n var hindData;\n if (self.refcodes[refcode] && self.refcodes[refcode].NeedShowHint) {\n if (id.indexOf('_') != -1) {\n var idParts = id.split('_');\n refcode = idParts[0];\n id = idParts[1];\n };\n hintData = ' data-hint=\"{ \\'compcode\\' : \\'' + refcode + '\\', \\'id\\' : \\'' + id + '\\' }\" ';\n } else {\n hintData = ' title=\"' + (('' + text + '').replace(/\"/g, '"')) + '\" ';\n };\n return {\n 'attr': hintData,\n 'class': hintClass\n };\n },\n\n // Строит результирующую таблицу.\n createRows: function (refCode, rows, afterShowCallback) {\n var self = this;\n var tr, td;\n var isEmpty;\n var table_html = '';\n\n self.makeTitleAndFooter(afterShowCallback);\n\n var rowsByUid = {};\n\n if (rows.length > 0) {\n rows.forEach(function (row, i) {\n if (isNaN(parseInt(row.id, 10)) || row.id >= 0) {\n var rowUid = '' + Math.random();\n rowsByUid[rowUid] = row;\n var hintData = self.getHintData(refCode, row.id, row.title);\n table_html += '';\n table_html += '' + self.highlight(row.encodedTitle, self.getQueryValue()) + '';\n } else {\n table_html += '';\n table_html += '
' + row.encodedTitle + '
';\n // Только 1 сообщение об ошибке и пустая строка.\n if (rows.length == 0) {\n self.maxPages = self.currentPage;\n }\n }\n table_html += '';\n });\n\n //Удалем строку с ошибкой, если она там была.\n self.table.find('td.error').parent().remove();\n\n var newRows = $(table_html);\n // Связываем HTML строку с данными.\n $.each(newRows, function (index, newRow) {\n var rowUid = $(newRow).data('rowuid');\n $(newRow).data('rowData', rowsByUid[rowUid]);\n });\n\n var trs = self.table.append(newRows).find('tr:not(.rs_tr_error)');\n trs.unbind('mouseenter.refselect').bind('mouseenter.refselect', function () { $(this).siblings('.rs_tr_over').removeClass('rs_tr_over'); $(this).addClass('rs_tr_over'); })\n .unbind('mouseleave.refselect').bind('mouseleave.refselect', function () { $(this).parent().find('.rs_tr_over').removeClass('rs_tr_over'); })\n .unbind('click.refselect').bind('click.refselect', function () { self.select(false, $(this)); });\n isEmpty = false;\n if (self.refcodes[refCode].NeedShowHint) {\n trs.each(function () {\n InitAdditionalInfoTooltip($(this));\n });\n }\n\n self.inp.trigger('OnRowsCreated', [refCode, trs]);\n\n } else {\n if (self.currentPage == 1) {\n isEmpty = !self.showNoMatchText;\n self.selectEmpty(false);\n if (self.showNoMatchText) {\n self.table.html('' + self.NoMatchText + '');\n }\n } else {\n // Изменим максимальное количество страниц, если записей уже нет.\n self.maxPages = self.currentPage;\n }\n }\n\n return isEmpty;\n },\n\n setCoordForContainer: function () {\n var self = this;\n var c = self.inpParent;\n if (c !== null) {\n var top = c.offset().top + c.height() + 3;\n var height = self.container.outerHeight();\n var wh = $(window).height();\n if ((top + height) > wh) {\n top = c.offset().top - height - 1;\n if (top < 0) top = 0;\n }\n\n var width = c.outerWidth(true) - 3;\n self.container.css({\n left: (c.offset().left),\n top: top,\n width: width,\r\n minWidth: Math.max(width, 360)\n });\n }\n },\n\n // Функция подцветки искомой строки.\n highlight: function (value, term) {\n if (term == '') return value;\n return value.replace(new RegExp(\"(?![^&;]+;)(?!<[^<>]*)(\" + term.replace(/([\\^\\$\\(\\)\\[\\]\\{\\}\\*\\.\\+\\?\\|\\\\])/gi, \"\\\\$1\") + \")(?![^<>]*>)(?![^&;]+;)\", \"gi\"), \"$1\");\n },\n\n // Скрыть плейсхолдер\n _hidePlaceholder: function () {\n var self = this;\n $(function () {\n if (self.fakeInp)\n self.fakeInp.attr(\"placeholder\", \"\");\n });\n },\n\n // Показать плейсхолдер\n _showPlaceholder: function () {\n var self = this;\n $(function () {\n if (self.fakeInp) {\n var input = self.fakeInp.parent().before().find('.input');\n var placeholder = input.data('placeholder') ? input.data('placeholder') : input.attr('placeholder');\n self.fakeInp.attr('placeholder', placeholder);\n }\n });\n }\n };\n\n $.fn.extend({\n ReferenceSelect: function (options, img) {\n this.data('ReferenceSelectInstance', new rs(this, options, img));\n this.trigger('Init');\n return this;\n },\n SetSelected: function (v) {\n this.trigger('SetSelected', [v]);\n },\n result: function (handler) {\n return this.bind(\"result\", handler);\n },\n resultMulti: function (handler) {\n return this.bind(\"resultMulti\", handler);\n },\n ReplaceSelectedItem: function (oldID, newValues) {\n this.trigger('ReplaceSelectedItem', [oldID, newValues, false]);\n },\n ReplaceLastSelectedItem: function (oldID, newValues) {\n this.trigger('ReplaceSelectedItem', [oldID, newValues, true]);\n },\n Clear: function () {\n this.trigger(\"Clear\");\n },\n HideContainer: function () {\n this.trigger(\"HideContainer\");\n },\n SetValue: function (val, needTriggerResult) {\n this.trigger(\"SetValue\", [val, needTriggerResult]);\n return $(this);\n },\n SetValues: function (values, needTriggerResult) {\n this.trigger(\"SetValues\", [values, needTriggerResult]);\n return $(this);\n },\n SetDisabled: function () {\n this.trigger(\"SetDisabled\", [true]);\n return $(this);\n },\n SetEnabled: function () {\n this.trigger(\"SetDisabled\", [false]);\n return $(this);\n }\n });\n})(jQuery);\n","(function ($, global) {\n /**\n * Результат выбора из справочника.\n * @typedef {Object} ReferenceSelectData\n * @property {string} id ИД записи.\n * @property {string} encodedTitle Экранированный заголовок записи.\n * @property {string} title Заголовок записи.\n * @property {string} leadingRequisitesValue Значения ведущих реквизитов (в JSON-формате)\n * @since 5.5.0.1000\n */\n\n /**\n * Функция, вызываемая при удачном выполнении запроса от сервера. \n * @callback ReferenceSelectSuccessCallback\n * @param {number} pageCount Общее количество страниц с данными.\n * @param {ReferenceSelectData[]} entities Данные от сервера.\n * @since 5.5.0.1000\n */\n\n /**\n * Функция, вызываемая при НЕ удачном выполнении запроса от сервера. \n * @callback ReferenceSelectErrorCallback\n * @param {string} message Сообщение об ошибке.\n * @param {boolean} isHttp Признак обозначающий была ли это HTTP ошибка.\n * @since 5.5.0.1000\n */\n\n /**\n * Провайдер данных для выбора из справочника.\n * @since 5.5.0.1000\n */\n var ReferenceSelectDataProvider = {\n /**\n * Отправляет запрос на сервер и обрабатывает результаты.\n * @param {string} url Адрес веб-сервиса или веб-хэндлера.\n * @param {Object} params Список параметров веб-сервиса или веб-хэндлера.\n * @param {ReferenceSelectSuccessCallback} OnSuccess Функция, вызываемая при удачном выполнении запроса от сервера. \n * @param {ReferenceSelectErrorCallback} OnError Функция, вызываемая при НЕ удачном выполнении запроса от сервера. \n * @returns {jqXHR} Объект запроса возвращаемой функцией jQuery.ajax.\n */\n sendQuery: function (url, params, OnSuccess, OnError) {\n var me = this;\n\n return $.ajax({\n type: \"POST\",\n dataType: \"text\",\n url: url,\n cache: false,\n data: params,\n success: function (res) {\n if (!CheckForLoginPage(res)) {\n var data = me._parseResponse(res);\n if (data.success) {\n if (OnSuccess) OnSuccess(data.pagesCount, data.entities);\n } else {\n if (OnError) OnError(data.errorMessage, false);\n }\n }\n },\n error: function (jqXHR, textStatus, errorThrown) {\n if (OnError) OnError(textStatus, true);\n }\n });\n\n },\n\n /**\n * Парсит результат от хэндлера в массив объектов.\n * @private\n */\n _parseResponse: function (response) {\n var firstN = response.indexOf('\\n');\n var status = response.substr(0, firstN);\n var data = response.substr(firstN + 1);\n\n if ($.trim(status) != \"ERROR\") {\n var rows = data.split(\"\\r\\n\");\n var entities = rows.map(function (row) {\n row = $.trim(row);\n if (row) {\n var currRowData = row.split(\"|\");\n return {\n id: currRowData[0], //строка, т.к. может быть \"ПОЛ_103576\" таким значением - такое есть в последних используемых объектах\n encodedTitle: currRowData[1],\n title: currRowData[2],\n leadingRequisitesValue: currRowData[3]\n };\n } else {\n return null;\n }\n }).filter(function (entity) { return !!entity; });\n\n return {\n success: true,\n pagesCount: parseInt(status, 10),\n entities: entities\n };\n } else {\n return {\n success: false,\n errorMessage: data\n };\n }\n }\n\n };\n\n global.ReferenceSelectDataProvider = ReferenceSelectDataProvider;\n\n})(jQuery, window);\n","/* Pick-реквизит */\n(function ($) {\n function DropDownList(inp, img, hidd, keyvalues, opt, placeholder) {\n this.init(inp, img, hidd, keyvalues, opt, placeholder);\n }\n DropDownList.prototype = {\n inp: null,\n img: null,\n hidd: null,\n results: null,\n initValue: null,\n prevValue: null,\n\n _isShown: false,\n\n onAfterChange: null,\n\n keyvalues: [],\n\n // Инициализация класса.\n // inp - текстовое поле элемента.\n // img - иконка календаря, по которой откроется выбор.\n // hidd - скрытое поле для хранения ключа выбранного значения.\n // keyvalues - список значений и ключей.\n // opt - дополнительные настройки (например, onAfterChange).\n init: function (inp, img, hidd, keyvalues, opt, placeholder) {\n \n var me = this;\n me.inp = inp;\n me.img = img;\n me.hidd = hidd;\n me.initValue = hidd.val();\n me.prevValue = me.initValue;\n me.keyvalues = keyvalues;\n me.filterPlaceholder = (!!placeholder) ? placeholder : L(\"PLEASE_INPUT_VALUE\");\n\n $.extend(me, opt);\n \n // Проверяем была ли инициализация или нет.\n if (!me.inp.data('initComplete')) {\n // Инициализиуем текстовое поле. \n if (!me.inp.hasClass('editable')) {\n me.inp.bind('click.DropDownList', function (ev) {\n ev.stopPropagation();\n if (me._isShown) me.hide();\n else me.show();\n });\n \n me.inp.prop('readonly', true);\n } else {\n me.addPlaceholder();\n me.inp.on('change.DropDownList', function () {\n me.hidd.val(\"-1\");\n });\n };\n\n // Инициализация событий клавиатуры. \n me.inp.bind('keydown.DropDownList', me, me.keyPress); \n\n // Инициализиуем иконку. \n if (me.img) me.img.bind('click.DropDownList', function (ev) {\n ev.stopPropagation();\n if (me._isShown) me.hide();\n else me.show();\n });\n\n // Скрытие вариантов при click на любое другое место.\n setTimeout(function () { $('body').bind('click.DropDownList', function (ev) { me.hide(); }); }, 1000);\n setTimeout(function () { try { $('iframe').contents().find('body').bind('click.DropDownList', function (ev) { me.hide(); }); } catch (e) { } }, 1000);\n setTimeout(function () { try { $('iframe').contents().find('ftameset').bind('click.DropDownList', function (ev) { me.hide(); }); } catch (e) { } }, 1000);\n setTimeout(function () { $('.ui-dialog-titlebar-close').bind('click.DropDownList', function (ev) { me.hide(); }); }, 1000); //Крестик в модалке. Отчего-то он особый. Замечание #4683153\n\n // Инициализация завершена.\n me.inp.data('initComplete', true);\n }\n },\n\n addPlaceholder: function () {\n var me = this;\n me.inp.focus(function () {\n if ($(this).val() == me.filterPlaceholder) {\n $(this).removeClass(\"placeholderInInput\");\n $(this).val('');\n }\n });\n\n me.inp.blur(function () {\n if ($(this).val() == '') {\n $(this).addClass(\"placeholderInInput\");\n $(this).val(me.filterPlaceholder);\n } else {\n $(this).removeClass(\"placeholderInInput\");\n }\n });\n },\n\n // Событие клавиатуры.\n keyPress: function (e) {\n \n var me = e.data;\n var isVisible = me.results != null && me.results.is(':visible');\n\n if (me.inp.hasClass('disabled') || me.inp.attr('disabled')) return;\n\n if (isVisible) {\n if (/27$|38$|40$/.test(e.keyCode) || /9$|13$/.test(e.keyCode)) {\n\n e.preventDefault();\n e.stopPropagation();\n switch (e.keyCode) {\n case 38: // up\n // Если выбор не открыт, то откроем его и выделим текущую запись.\n me.goTo(isVisible ? -1 : 0);\n break;\n case 40: // down\n // Если выбор не открыт, то откроем его и выделим текущую запись.\n me.goTo(isVisible ? 1 : 0);\n break;\n case 9: // tab\n case 13: // return\n me.selectCurrent();\n $('.rs_container').hide();\n break;\n case 27: // escape\n me.hide();\n break;\n }\n }\n } else {\n if (/38$|40$/.test(e.keyCode) && e.altKey) {\n me.show();\n }\n }\n },\n\n // Метод для перехода по элементам.\n goTo: function (direction) {\n var me = this;\n if (!me.results) return;\n var selEl = me.results.find('.rs_tr_over');\n var newEl;\n\n // Первый раз открываем c выбранной первой записью. \n if (selEl.length == 0 && direction == 0) {\n selEl = me.results.find('tr:first');\n me.toggleSelected(selEl);\n } else {\n // Предыдущее значение.\n if (direction == -1) {\n newEl = selEl.prev();\n if (newEl.length == 0) {\n newEl = selEl.parent().find('tr:last');\n }\n me.toggleSelected(newEl);\n } else\n // Следующее значение.\n if (direction == 1) {\n newEl = selEl.next();\n if (newEl.length == 0) {\n newEl = selEl.parent().find('tr:first');\n }\n me.toggleSelected(newEl);\n }\n }\n },\n\n // Снимает выделение со всех значений, и устанавливает у переданного.\n toggleSelected: function (el) {\n el.parent().find('.rs_tr_over').removeClass('rs_tr_over');\n el.addClass('rs_tr_over');\n },\n\n // Показывает выбор значения.\n show: function () {\n var me = this;\n\n // Если не активен input, то не показываем выпадающее меню.\n if (me.inp.hasClass('Req_Disabled')) return;\n\n // Фильтр для отображения элементов списка.\n var keyFilter = null;\n var tmp = me.inp.data('filter');\n if (typeof tmp != 'undefined') {\n keyFilter = tmp.split(';');\n me.results = null;\n }\n\n if (!me.results) {\n var html = '
';\n var hasItems = false;\n for (var i = 0, j = 0, c = me.keyvalues.length; i < c; i++) {\n if (me.keyvalues[i][0] != \"-1\") {\n if (keyFilter == null || (keyFilter != null && $.inArray(me.keyvalues[i][0], keyFilter) != -1)) {\n html += '';\n hasItems = true;\n j++;\n }\n }\n }\n\n if (!hasItems) {\n html += '';\n };\n\n html += '
' + me.keyvalues[i][2] + '
' + L(\"NO_ITEMS_FOUND\") + '
';\n me.results = $(html).appendTo(\"body\");\n\n if (hasItems) {\n // Навешиваем события на строки.\n me.results.find('tr:not(.disabled)')\n .hover(function () { $(this).addClass('rs_tr_over'); }, function () { $(this).parent().find('.rs_tr_over').removeClass('rs_tr_over'); })\n .unbind('click.DropDownList').bind('click.DropDownList', function () {\n me.selectCurrent(this);\n });\n }\n }\n\n // Устанавливаем положение выпадающего списка.\n me.setCoord();\n\n if (!me.results.is(':visible')) {\n\n $('.rs_container').hide();\n me.results.show();\n }\n me._isShown = true;\n },\n\n // Событие при выборе значения пользователем.\n selectCurrent: function (selectedEl) {\n var me = this;\n var el;\n if (selectedEl == null || typeof selectedEl == 'undefined') {\n el = me.results.find('.rs_tr_over');\n } else {\n el = $(selectedEl);\n }\n\n if (el.length == 1) {\n me.setValue(el.attr('data-key'));\n }\n },\n\n setInitValue: function () {\n return this.setValue(this.initValue);\n },\n\n setPrevValue: function () {\n return this.setValue(this.prevValue);\n },\n\n setValue: function (value, displayValue, opt_needTriggerResult) {\n var me = this;\n var needTriggerResult = (opt_needTriggerResult !== false); //по умолчанию события срабатывает, если поменялось значение.\n var valueIsChanged = false;\n\n if (typeof displayValue === 'undefined') {\n for (var i = 0; i < me.keyvalues.length; i++) {\n if (me.keyvalues[i][0] === value) {\n me.prevValue = me.hidd.val();\n\n me.inp.val(me.keyvalues[i][1]);\n me.hidd.val(value);\n\n valueIsChanged = true;\n \n break;\n }\n }\n } else {\n me.prevValue = me.hidd.val();\n me.inp.val(displayValue);\n me.hidd.val(value);\n valueIsChanged = true;\n }\n\n if (needTriggerResult && valueIsChanged) {\n me.inp.change(); //change вызываем явно, т.к. оно не вызывается при установке val(), а в мастерах действия навешивается это событие\n me.inp.removeClass(\"placeholderInInput\");\n var v = me.hidd.val();\n if (me.onAfterChange) me.onAfterChange(v);\n me.inp.trigger('result', [v]);\n }\n\n return this;\n },\n\n getValue: function () {\n return this.hidd.val();\n },\n\n getDisplayValue: function () {\n var me = this;\n if (me.inp.hasClass('placeholderInInput')) {\n return '';\n } else {\n return me.inp.val();\n }\n },\n \n clearDropDownListItems: function () {\n this.keyvalues = [];\n if (!!this.results) this.results.remove();\n this.results = null;\n return this;\n },\n\n\n addDropDownListItem: function (item) {\n this.keyvalues.push(item);\n if (!!this.results) this.results.remove();\n this.results = null;\n return this;\n },\n\n removeDropDownListItem: function (key) {\n var me = this;\n for (var i = 0; i < me.keyvalues.length; i++) {\n if (me.keyvalues[i][0] === key) {\n me.keyvalues[i][0] = '-1';\n if (!!this.results) this.results.remove();\n this.results = null;\n break;\n }\n }\n return this;\n },\n\n // Скрывает выбор значения.\n hide: function () {\n if (this.results) this.results.hide();\n this._isShown = false;\n return this;\n },\n\n disable: function () {\n this.inp.addClass('Req_Disabled');\n return this;\n },\n\n enable: function () {\n this.inp.removeClass('Req_Disabled');\n return this;\n },\n\n setCoord: function () {\n var me = this;\n var c = me.inp;\n\n var top = c.offset().top + c.height() + 6;\n var height = me.results.outerHeight();\n var wh = $(window).height();\n if ((top + height) > wh) {\n top = c.offset().top - height - 1;\n if (top < 0) top = 0;\n }\n\n me.results.css({\n left: (c.offset().left + 1),\n top: top,\n width: Math.max(c.width() - 10, 130),\n minWidth: me.inp.outerWidth(true) - 5\n });\n }\n\n };\n\n // Регистрируем плагин jQuery.\n $.fn.extend({\n DropDown: function (img, hidd, keyvalues, opt) {\n this.data('DropDownListInstance', new DropDownList($(this), img, hidd, keyvalues, opt));\n this.trigger('Init');\n return this;\n },\n HidePickContainer: function () {\n this.data('DropDownListInstance').hide();\n return this;\n }\n });\n})(jQuery);\n","var g_RightsChanged = 0;\n\nfunction UserRightInit(ClientID, ObjectID, HashCode, Msg, IsNeedHideTree) {\n var jRightsTable = $('.Rights');\n var updateTree = function (event, hideFilterView) {\n if (IsNeedHideTree) {\n if (hideFilterView) $('#Filter_User_View_' + ClientID).hide();\n var rootUl = $('#ul' + ClientID).empty();\n rootUl.treeview({\n url: \"/UserList.asmx/GetUsers\",\n collapsed: true,\n ajax: {\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n dataWS: \"'ObjectID':\" + ObjectID + \", 'ObjectType':\" + HashCode + \",'Filtrator':'' \",\n async: true,\n cache: false,\n type: \"post\",\n onAfterSuccess: function (el, cont) {\n $(el).find('.hint').each(function () {\n InitAdditionalInfoTooltip($(this));\n });\n MarkAllGroupsAndUsers(jRightsTable);\n $('#spinnerDiv').hide();\n if ($('#0').children('ul').children().length == 0) {\n $('#ShowingTreeError').show();\n } else {\n $('#ShowingTreeError').hide();\n }\n\n $('#scroller').height($('#right_column').height());\n\n if ($.ipad || WA.ENV.isAndroid()) {\n InitTabletContextMenu($('.Rights_List_div:not(#g_0)', el));\n }\n }\n }\n });\n }\n jRightsTable.delegate('.Rights_List_div', 'mouseover', UserInTreeMouseOver);\n jRightsTable.delegate('.Rights_List_div', 'mouseout', UserInTreeMouseOut);\n jRightsTable.delegate('.Rights_Table tr', 'mouseover', UserRightsMouseOver);\n jRightsTable.delegate('.Rights_Table tr', 'mouseout', UserRightsMouseOut);\n if (!$.ipad && !WA.ENV.isAndroid()) {\n jRightsTable.undelegate('.Rights_List_div > span', 'contextmenu').delegate('.Rights_List_div:not(#g_0) > span', 'contextmenu', UserListShowContextMenu);\n } else {\n var contextmenuButton = '';\n $('.Rights_List_div:not(#g_0)', jRightsTable).find('p.icon').before(contextmenuButton).prev().unbind('click').bind('click', UserListShowContextMenu);\n }\n InitRightsUserTreeKeyNavigation();\n // Шамов А.: keydown сделано специально, т.к. на keyup не блокируется Enter.\n var filterInput = $('#Filter_User_' + ClientID);\n filterInput.keydown(function (ev) {\n if (ev.keyCode == 9) {\n filterInput.blur();\n var firstItem = $('.Rights_List_div:visible:first', '.Rights_User_List');\n if (firstItem.length == 0) firstItem = $('.Rights_User_List').find('ul').find('.Rights_List_div:visible:first');\n UserInTreeMouseOver({ currentTarget: firstItem });\n } else {\n return FilterUserAjax(ev, 'ul' + ClientID, 'Filter_User_View_' + ClientID, ObjectID, HashCode, this, Msg);\n }\n });\n };\n\n // Изменились ли права, чтобы при переходе на другую вкладку руннуться на сохраненные данные.\n jRightsTable.on('rightsChange', function () {\n g_RightsChanged = 1;\n });\n\n jRightsTable.on('reload.UserTree', updateTree);\n updateTree(null, true);\n}\n\nfunction CheckIfFavoritesEmpty(favGroup) {\n if (favGroup.children('ul').children().length > 0) {\n $('#ShowingTreeError').hide();\n }\n else {\n if ($('.treeview:visible').length > 0) {\n favGroup.attr('class', '');\n $('#ShowingTreeError').show();\n }\n }\n}\n\n\nfunction fillTree(res) {\n var html = \"\";\n if (res.Error == null) {\n if (res.Result.length > 0) {\n var nodes = res.Result;\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i].id > 0) {\n html += buildTreeNodeHTML(nodes[i]);\n }\n else {\n //this.showGroupsListMessage(nodes[i].text);\n }\n }\n }\n }\n return html;\n}\n\nfunction buildTreeNodeHTML(node) {\n var html = node.text;\n return html;\n}\n\nfunction MarkAllGroupsAndUsers(RightsTable) {\n var selectedIDs = $('[name=__SELECTED_USERS]').val().split(';');\n for (var i = 0; i < selectedIDs.length; i++) {\n var id = selectedIDs[i].split('-')[0];\n if (id != \"\") MarkUser(RightsTable.find('#' + id), true);\n }\n}\n\nfunction InitTabletContextMenu(items) {\n if (items.find('.tabletcontextm').length > 0) {\n items.find('.tabletcontextm').unbind('click').bind('click', UserListShowContextMenu);\n } else {\n var contextmenuButton = '';\n items.find('p.icon').before(contextmenuButton).prev().unbind('click').bind('click', UserListShowContextMenu);\n }\n}\n\nfunction UserListShowContextMenu(e) {\n e.preventDefault(); e.stopPropagation();\n var currObj = $(this);\n if (!currObj.attr('id')) currObj = currObj.parents('.Rights_List_div:first');\n var menu = _GetContextMenu(currObj, $('#0'));\n menu.showAt({ 'left': e.pageX, 'top': e.pageY });\n}\n\n// получает объект контекстного меню для элемента дерева\nfunction _GetContextMenu(item, favoritesGroup) {\n var menuItems = [];\n var addMenuItemText;\n var addClickHandler;\n var favoritesMenuItemText;\n var favoritesClickHandler;\n var favoritesIcon = \"folderFavorites-16\";\n var itemID = item.attr('id');\n var actionIcon;\n var liID = itemID;\n if (itemID[0] == 'g') { liID = itemID.substr(2); }\n if (favoritesGroup.children('ul').children('#' + liID).length > 0 || item.hasClass('favorite')) {\n favoritesMenuItemText = L(\"REMOVE_FROM_FAVORITES\");\n favoritesClickHandler = function () {\n addOrRemoveFavorites(item, itemID, false, favoritesGroup);\n };\n favoritesIcon = \"deleteFromFavourites-16\";\n }\n else {\n favoritesMenuItemText = L(\"ADD_TO_FAVORITES\");\n favoritesClickHandler = function () {\n addOrRemoveFavorites(item, itemID, true, favoritesGroup);\n };\n }\n if (IsSelected(itemID)) {\n // то элемент уже выбран\n addMenuItemText = L(\"USERGROUP_EXCLUDE\");\n addClickHandler = function () {\n $('.Rights_Table').find('tr[id$=' + itemID + ']').find('p:first').trigger('click');\n };\n actionIcon = \"unchooseRecord-16\";\n }\n else {\n addMenuItemText = L(\"USERGROUP_INCLUDE\");\n addClickHandler = function () { AddUserByDiv(item); MarkUser(item, true); };\n actionIcon = \"chooseRecord-16\";\n }\n\n menuItems.push({ text: addMenuItemText, onClick: addClickHandler, icon: actionIcon });\n menuItems.push({ text: favoritesMenuItemText, onClick: favoritesClickHandler, icon: favoritesIcon });\n\n var menu = new ContextMenu(menuItems, { width: \"auto\" });\n var proxy = { id: item.attr('id'), kind: 'ref', refcode: WA.CR.getReferenceCode(), elem: item, tr: item };\n menu.self = proxy\n return menu\n}\n\n// Добавление или удаление пользователей из избранного\n// item - элемент, который надо добавить\n// needToAdd - нужно ли добавить или удалить\nfunction addOrRemoveFavorites(item, itemId, needToAdd, favoritesGroup) {\n var liID = itemId;\n var isGroup = false;\n if (itemId[0] == 'g') { liID = itemId.substr(2); isGroup = true; }\n CallService(\"/UserList.asmx/AddOrRemoveFavorites\", { PrincipalID: liID, IsGroup: isGroup, NeedToAdd: needToAdd },\n function (res) {\n if (res.Success) {\n var favGroupUl = favoritesGroup.children('ul');\n if (favGroupUl.length == 0) {\n favGroupUl = $('
    ');\n favoritesGroup.append(favGroupUl);\n }\n if (needToAdd) {\n if (favGroupUl.children('#' + liID).length == 0) {\n var clone;\n if (item.parent('.Filter_User_View').length > 0) {\n ReloadFavoritesGroup(favoritesGroup, favGroupUl);\n }\n else {\n clone = item.parent().parent().clone();\n initTreeViewItemEvents(clone);\n clone.appendTo(favGroupUl);\n clone.removeClass('collapsable');\n clone.find('.collapsable').removeClass('collapsable');\n if (favGroupUl.children().length == 1) {\n if (favoritesGroup.children('.hitarea').length == 0) {\n favoritesGroup.prepend('
    ');\n }\n $('.treeview').treeview({ add: favoritesGroup });\n } else {\n $('.treeview').treeview({ add: clone });\n }\n }\n markUnmarkItemAsFavorite(itemId, needToAdd);\n }\n }\n else {\n favGroupUl.children('li#' + liID).remove();\n markUnmarkItemAsFavorite(itemId, needToAdd);\n }\n CheckIfFavoritesEmpty(favoritesGroup);\n }\n });\n}\n\nfunction ReloadFavoritesGroup(favoritesGroup, favGroupUl) {\n //var hitArea = favoritesGroup.children('.hitarea');\n // if (hitArea.length > 0) {\n // favoritesGroup.removeClass('open').addClass('hasChildren');\n // favGroupUl.empty();\n // hitArea.click().click();\n // favoritesGroup.hasClass('expandable') ? favGroupUl.hide() : favGroupUl.show();\n // } else {\n $('.Rights').data('needUpdTree', true);\n //}\n}\n\nfunction initTreeViewItemEvents(item) {\n var span = item.find('.Rights_List_div')\n .bind('mouseover', UserInTreeMouseOver)\n .bind('mouseout', UserInTreeMouseOut)\n .on('click', function () {\n var el = $(this);\n AddUserByDiv(el);\n MarkUser(el, true);\n })\n .children('span');\n if ($.ipad || WA.ENV.isAndroid()) {\n InitTabletContextMenu(item.find('.Rights_List_div'));\n } else {\n span.bind('contextmenu', UserListShowContextMenu);\n }\n}\n\nfunction AddFavoritesToRightsTable(el) {\n $(el).parent().siblings('ul').children().find('.Rights_List_div:first').click();\n}\n\nfunction IsSelected(ItemId) {\n var selectedIDs = $('[name=__SELECTED_USERS]').val().split(';');\n var isSelected = false;\n for (var i = 0; i < selectedIDs.length; i++) {\n var id = selectedIDs[i].split('-')[0];\n if (id == ItemId) isSelected = true;\n }\n return isSelected;\n}\n\n// Помечает или снимает отметку избранных пользователей или групп\n// isFavorite - признак пометить как избранное или нет\nfunction markUnmarkItemAsFavorite(id, isFavorite) {\n if (id) {\n var item = $('.treeview').children(':not(#0)').find('#' + id).add($('.Filter_User_View').find('#' + id));\n var icon = item.children('span').find('p.icon');\n var isGroup = id[0] == 'g';\n var iconClass = isGroup ? 'user-tree__icon_group' : 'user-tree__icon_user';\n var isSelected = IsSelected(id);\n\n if (isFavorite) {\n if (id[0] != 'g') { // если это пользователь\n if (!isSelected) { // у выбранных записей иконки не меняем\n icon.removeClass(iconClass).addClass('user-tree__icon_fav-user');\n }\n } // если это группа\n else {\n if (!isSelected) {\n icon.removeClass('user-tree__icon_group').addClass('user-tree__icon_fav-group');\n }\n }\n item.addClass('favorite');\n }\n else {\n if (id[0] != 'g') { // если это пользователь\n if (!isSelected) { // у выбранных записей иконки не меняем\n icon.removeClass('user-tree__icon_fav-user').addClass(iconClass);\n }\n } // если это группа\n else {\n if (!isSelected) {\n icon.removeClass('user-tree__icon_fav-group').addClass('user-tree__icon_group');\n }\n }\n item.find('.favorite').removeClass('favorite');\n item.removeClass('favorite');\n }\n }\n}\n\nfunction UserRightTreeInit(ClientID, ObjectID, GetHashCode) {\n $('#ul>' + ClientID).treeview({\n url: \"/UserList.asmx/GetUsers\",\n collapsed: true,\n ajax: {\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n dataWS: \"'ObjectID':'\" + ObjectID + \"','ObjectType':'\" + GetHashCode + \"','Filtrator':''\",\n async: true,\n cache: false,\n type: \"post\"\n }\n });\n\n // Событие при наведении на элемент дерева.\n $('.treeview div').live('mouseover', function () { $(this).addClass('over'); });\n $('.treeview div').live('mouseout', function () { $(this).removeClass('over'); });\n\n setTimeout(SetEvents, 1000);\n SetCurrentUsers();\n}\n\n// Функция при наведение мышки на пользователя или группу в дереве.\nfunction UserInTreeMouseOver(event) {\n var el = event.currentTarget;\n $('div.over', '.Rights_User_List').removeClass('over').find('p.treeview_img_action').css('visibility', 'hidden');\n if ($(el).length) {\n if (!$(el).hasClass(\"marked\")) {\n var arrow = $(el).find('p.treeview_img_action');\n arrow.css('visibility', 'visible');\n //$(el).find('span > div').attr('title', arrow.attr('title'));\n }\n }\n $(el).addClass('over');\n}\n\n// Функция при отведение мышки с пользователя или группы в дереве.\nfunction UserInTreeMouseOut(event) {\n $('div.over', '.treeview').removeClass('over').find('p.treeview_img_action').css('visibility', 'hidden');\n var el = event.currentTarget;\n $(el).find('p.treeview_img_action').css('visibility', 'hidden');\n // $(el).find('span > div').attr('title', '');\n $(el).removeClass('over');\n}\n\n// Клик на кружочке.\nfunction SetRightChoose(elem) {\n SetNewRight(elem);\n}\n\nfunction GetUserID(tr) {\n var UserID = tr.attr('id');\n var prefixIndex = UserID.indexOf('_');\n if (prefixIndex != -1) {\n UserID = UserID.substr(prefixIndex + 1);\n }\n return UserID;\n}\n\nvar g_OldChangedUsers = {};\n\n// Устанавливает права для выбранного пользователя.\nfunction SetNewRight(el) {\n el = $(el);\n var rights = el.attr(\"class\");\n var rightsID = el.attr(\"name\");\n var tbl = $(el).parentsUntil(\"table\");\n var UserID = GetUserID($(tbl[tbl.length - 2]));\n var currentRightVal;\n\n var isOldUser = IsOldUser(UserID); // супер логика для изменения прав, имея неполные права. для пользователей которые уже есть в списке можем только повышать права\n\n //Проверка полных прав\n // не можем менять права пользователей если у них полные,а у нас нет\n if (rightsID < g_MaxRightsValue || (el.parent().hasClass(\"full\") && g_MaxRightsValue != 0 && isOldUser)) return; // g_MaxRightsValue - максимальное значение прав, которое может назначить текущий пользователь\n if (rightsID > 0 && !GetFullRightsUserCount(UserID)) return ShowInfo(L(\"WARN_EMPRY_RIGHTS_ISNOT_VALID\"));\n if (el.parent().hasClass(rights)) return;\n\n // Заменяем у выбранного пользователя права.\n var SelUsers = $(\"input[name='__SELECTED_USERS']\");\n var oldSelUsers = SelUsers.val().split(';');\n for (var i = 0; i < oldSelUsers.length; i++) {\n var oldUser = oldSelUsers[i].split('-');\n if (oldUser[0] == UserID) {\n currentRightVal = oldUser[1];\n oldSelUsers[i] = UserID + '-' + rightsID;\n break;\n }\n }\n var rightValue = RightsToNumber($.trim(el.parent().attr(\"class\"))); // до своего уровня.\n // если у нас нет полных прав и мы пытаемся понизить права пользователя которому они уже назначены\n if (g_MaxRightsValue != 0 && rightsID > rightValue && isOldUser && !g_OldChangedUsers[UserID]) return;\n // если мы повышали старому пользователю права (до Изменение при передаче прав) и меняем теперь обратно\n if (isOldUser && rightsID != rightValue) { g_OldChangedUsers[UserID] ? delete g_OldChangedUsers[UserID] : g_OldChangedUsers[UserID] = 1; }\n\n el.parent().attr(\"class\", rights).removeClass('disabled'); // окрашиваются кружочки\n el.siblings(\"span\").text(L(\"RIGHT_\" + $.trim(el.parent().attr('class').toUpperCase())));\n SelUsers.val(oldSelUsers.join(';'));\n\n $('.Rights').trigger('rightsChange');\n}\n\n// определяет были ли пользователю уже назначены права.\n//чтобы при передаче прав юзер не мог менять права тем, кому уже назначены\nfunction IsOldUser(UserID) {\n var SelUsers = $(\"input[name='__CURRENT_USERS_RIGHTS']\");\n var oldSelUsers = SelUsers.val().split(';');\n for (var i = 0; i < oldSelUsers.length; i++) {\n var oldUser = oldSelUsers[i].split('-');\n if (oldUser[0] == UserID) {\n return true;\n }\n }\n return false;\n}\n\nfunction RightsToNumber(right) {\n switch (right) {\n case \"full\": return 0;\n case \"change\": return 1;\n case \"view\": return 2;\n }\n}\n\nfunction IsRightsListValid() {\n var SelUsers = $(\"input[name='__SELECTED_USERS']\");\n if (SelUsers.length > 0) {\n return GetFullRightsUserCount() > 0;\n } else {\n return true;\n }\n}\n\n//Получает к-во пользователей с полными правами, с учетом изменений.\nfunction GetFullRightsUserCount(UserID) {\n var SelUsers = $(\"input[name='__SELECTED_USERS']\");\n var oldSelUsers = SelUsers.val().split(';');\n var fullRightsUserCount = 0;\n //Подсчитаем количество пользователей, которые имеют полные права,\n for (var i = 0; i < oldSelUsers.length; i++) {\n var oldUser = oldSelUsers[i].split('-');\n if (oldUser[1] == 0 && oldUser[0] != UserID)++fullRightsUserCount;\n }\n return fullRightsUserCount;\n}\n\n\n// Циклично изменяет права для пользователя.\nfunction ChangeRightCycle(elem) {\n var sp = $(elem).parent();\n var rightsID = sp.children(\".\" + sp.attr(\"class\")).attr(\"name\");\n if (rightsID == 0 && g_MaxRightsValue > 0) return;\n rightsID -= 1;\n if (rightsID < g_MaxRightsValue) rightsID = 2;\n sp.children(\"[name='\" + rightsID + \"']\").click();\n}\n\n// Функция при наведении мышки на строку прав.\nfunction UserRightsMouseOver(event) {\n var el = $(event.currentTarget);\n var DelIco = el.find('td:first p');\n if (DelIco.length > 0) {\n el.addClass('over');\n DelIco.css('visibility', 'visible');\n }\n}\n\n// Функция при отведение мышки со строки прав.\nfunction UserRightsMouseOut(event) {\n var el = $(event.currentTarget);\n var DelIco = el.find('td:first p');\n if (DelIco.length > 0) {\n DelIco.css('visibility', 'hidden');\n el.removeClass('over');\n }\n}\n\n// Удаляет текущего пользователя из прав.\nfunction RemoveUserFromRights(elem) {\n var el = $(elem);\n var tr = el.parent().parent();\n\n //если пользователь всего один, то удалять его нельзя\n if (tr.parent().parent().find('tbody>tr').length <= 2) {\n ShowInfo(L(\"WARN_EMPRY_RIGHTS_ISNOT_VALID\"));\n } else {\n var UserID = GetUserID(tr);\n // если права не полные, то запретим удалять из списка пользователей которым уже были назначены права\n if (g_MaxRightsValue != 0 && IsOldUser(UserID)) return;\n var SelUsers = $(\"input[name='__SELECTED_USERS']\");\n var oldSelUsers = SelUsers.val().split(';');\n\n\n //Если пользователь с полными правами один и мы его удаляем,\n if (!GetFullRightsUserCount(UserID)) return ShowInfo(L(\"WARN_EMPRY_RIGHTS_ISNOT_VALID\"));\n // Удяляет выбранного пользователя из права.\n for (var i = 0; i < oldSelUsers.length; i++) {\n var oldUser = oldSelUsers[i].split('-');\n if (oldUser[0] == UserID) {\n oldSelUsers[i] = '';\n break;\n }\n }\n\n SelUsers.val(oldSelUsers.join(';').replace(';;', ';'));\n tr.remove();\n\n MarkUser($('.Rights').find('div#' + UserID), false);\n }\n\n\n $('.Rights').trigger('rightsChange');\n}\n\nfunction MarkUser(el, mark) {\n if (el.length > 0) {\n if (el.hasClass('bubble')) {\n // Если выбран показываем галочку.\n if (mark) {\n el.unbind('mouseenter mouseleave').children('i').attr('title', '');\n } else {\n // Если нет, то при наведении показываем стрелочку для добавления пользователя в права.\n el\n .hover(function () {\n $(this).children('i').show();\n }, function () {\n $(this).children('i').hide();\n })\n .children('i')\n .removeClass('TaskAndJob/PerformJob_16.png').addClass('Rights_AddUserOrGroup.png')\n .attr('title', L('ADD'))\n .hide()\n .one('click.Rights', function () { //событие click уберется после первого клика по стрелочке\n AddUserByDiv(el.data('div'));\n MarkUser(el, true);\n });\n }\n } else {\n el = $('.Rights').find('div#' + el.attr('id')); // находим все такие элементы в дереве\n if (el.length > 0) {\n var img = el.find('p.icon');\n if (el.attr('id').charAt(0) != 'g') // user\n {\n if (mark) {\n img.removeClass('user-tree__icon_user').removeClass('user-tree__icon_fav-user').addClass('user-tree__icon_selected-user');\n el.addClass('marked');\n } else {\n img.removeClass('user-tree__icon_selected-user').addClass(el.hasClass('favorite') ? 'user-tree__icon_fav-user' : 'user-tree__icon_user');\n $('.treeview > #0').find('.user-tree__icon_fav-user').removeClass('user-tree__icon_fav-user').addClass('user-tree__icon_user');\n el.removeClass('marked');\n }\n } else { // group\n if (mark) {\n img.removeClass('user-tree__icon_group').removeClass('user-tree__icon_fav-group').addClass('user-tree__icon_selected-group');\n el.addClass('marked');\n } else {\n img.removeClass('user-tree__icon_selected-group').addClass(el.hasClass('favorite') ? 'user-tree__icon_fav-group' : 'user-tree__icon_group');\n $('.treeview > #0').children('ul').find('.user-tree__icon_fav-group').removeClass('user-tree__icon_fav-group').addClass('user-tree__icon_group');\n el.removeClass('marked');\n }\n }\n }\n }\n }\n}\n\n// Добавляет пользователя.\nfunction AddUserByDiv(elem) {\n var el = $(elem);\n var NewUserID = el.attr('id');\n var NewUserName = el.find('span > div').text();\n\n var table = $('.Rights_Table');\n var lastFilledRow = table.find('tr:last');\n\n if (table.find('tr#new_' + NewUserID + ',tr#current_' + NewUserID).length) // не добавляем юзеров несколько раз\n return false;\n\n $('.Rights').trigger('rightsChange');\n\n MarkUser(el, true);\n\n // По умолчанию - права только на чтение.\n var NewUserRight = 2;\n\n var newRow = lastFilledRow.clone(true);\n newRow.attr('id', 'new_' + NewUserID);\n newRow.find('p:first').removeClass(\"disabled\").attr('title', L('REMOVE_FROM_RIGHTS_LIST')); // на случай если включено делегирование прав\n var jCircleCell = newRow.find('td:last');\n jCircleCell.attr('title', L('PUSH_TO_CHANGE_TYPE_RIGHT'));\n\n //При копировании последней заполненной, копируются и стили disabled. Снимем их в соответствии с максимально возможными для назначения правами.\n $.each(jCircleCell.find('p'), function () {\n var jThis = $(this);\n var circleRight = +jThis.attr('name');\n if (circleRight >= g_MaxRightsValue) {\n jThis.removeClass('disabled').attr('title', '');\n } else {\n jThis.addClass('disabled').attr('title', L('CANNOT_ASSIGN_RIGHTS_HIGHER'));\n }\n });\n jCircleCell.find('span').removeClass('disabled');\n\n var newRow_div = newRow.find('td div').text(NewUserName);\n lastFilledRow.after(newRow.show());\n\n //Подсказка\n var hintData = getHintDataObj(el);\n if (typeof hintData !== 'undefined') {\n // Подсказка есть, значит НЕ надо показать обычный title.\n newRow_div.removeAttr('title');\n\n var hint = newRow.find('.Rights_Table_td');\n hint.removeClass('hintInit').qtip('hide').removeAttr('data-hint').data('data-hint', hintData)\n InitAdditionalInfoTooltip(hint);\n } else {\n // Подсказки нет, значит надо показать обычный title.\n newRow_div.attr('title', NewUserName);\n var rightsCell = newRow.find('.Rights_Table_td');\n rightsCell.removeClass('hint').removeClass('hintInit').qtip('hide').qtip('destroy');\n rightsCell.removeAttr(\"data-hint\");\n }\n\n // Переинициализируем подсказки.\n newRow.parent().find('.hint').each(function () {\n $(this).removeClass('hintInit').qtip('hide');\n InitAdditionalInfoTooltip($(this));\n });\n\n SetNewRight(newRow.find('td:last svg:first'), NewUserRight);\n\n var SelUsers = $(\"input[name='__SELECTED_USERS']\");\n var oldSelUsers = SelUsers.val();\n SelUsers.val(oldSelUsers + NewUserID + '-' + NewUserRight + ';');\n return true;\n}\n\n/* =Фильтрация пользователей в правах================================================================================================================== */\nvar UserFilterTTimeout;\nfunction ClearInputFilterUser(el) {\n if (!$.ipad) {\n if ($(el).hasClass('Req_Gray')) {\n $(el).removeClass('Req_Gray');\n $(el).val('');\n }\n } else {\n $(el).trigger('keyup');\n }\n}\nfunction SetDefaultFilterValue(el, value) {\n if (!$.ipad) {\n if ($(el).val().length == 0) {\n $(el).val(value);\n $(el).addClass('Req_Gray');\n }\n }\n}\n\nfunction FilterUser(idSrc, idDest, el) {\n clearTimeout(UserFilterTTimeout);\n UserFilterTTimeout = setTimeout(function () { DoFilter(idSrc, idDest, el); }, 400);\n}\nfunction DoFilter(idSrc, idDest, el) {\n var elJq = $(el);\n var value = $.trim(elJq.val());\n if (value.length != 0) {\n $('#' + idDest).empty();\n var GlobalFilterUser = \"\";\n $('#' + idSrc + ' span[innerHTML]').each(function () {\n if (($(this).attr('innerHTML').toUpperCase().indexOf(value.toUpperCase()) != -1) && ($(this).parent().attr('id').split('g_').length == 1)) {\n var div = $(this).parent();\n if (GlobalFilterUser.indexOf(div.attr('id')) == -1) {\n var cloneDiv = div.clone(true);\n $('#' + idDest).append(cloneDiv);\n GlobalFilterUser = GlobalFilterUser + div.attr('id') + \";\";\n }\n }\n });\n $('#' + idDest).show();\n $('#' + idSrc).hide();\n }\n else {\n $('#' + idDest).empty().hide();\n $('#' + idSrc).show();\n }\n}\n\nfunction FilterUserAjax(ev, UserTreeId, FilterAreaId, ObjectID, ObjectType, el, defvalue) {\n clearInlineHint(el);\n clearTimeout(UserFilterTTimeout);\n UserFilterTTimeout = setTimeout(function () { AjaxUserSearch(UserTreeId, FilterAreaId, ObjectID, ObjectType, el, defvalue); }, 400);\n return ev.keyCode != 13;\n}\n\n//Поиск пользователей с помощью ajax.\nfunction AjaxUserSearch(UserTreeId, FilterAreaId, ObjectID, ObjectType, el, defvalue) {\n var elJq = $(el);\n var value = $.trim(elJq.val());\n if (value.length != 0 && value != defvalue) {\n\n if (Core.isStatisticEnabled) {\n ///Запись в статистику\n WA.CR.statistics.write({\n page: WA.getLocation(),\n action: \"FilterQuery\",\n area: 'UsersTree',\n target: elJq.get(0)\n });\n };\n\n $.ajax({\n type: \"POST\",\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n url: \"/UserList.asmx/GetUsers\",\n data: \"{'ObjectID':\" + ObjectID + \", 'ObjectType':\" + ObjectType + \", 'FolderID':'', 'Filtrator':'\" + value + \"'}\",\n async: true,\n cache: false,\n success: function (res) {\n var FilterArea = $('#' + FilterAreaId);\n $('#' + UserTreeId).hide();\n $('#ShowingTreeError').hide();\n\n var SelUsers = ';' + $(\"input[name='__SELECTED_USERS']\").val();\n\n FilterArea.empty().show();\n\n if (res.d.Result.length == 0) {\n FilterArea.append('
    ' + L('EMPTY_WITH_FILTER') + '
    ');\n } else {\n $(res.d.Result).each(function () {\n var currUser = this;\n var itemId = currUser.id;\n if (currUser.isGroup) itemId = 'g_' + itemId;\n var isSelected = (SelUsers.indexOf(';' + itemId + '-') != -1);\n var u;\n if (currUser.id > -1) {\n if (currUser.hint == null) {\n // Подсказки НЕ настроены.\n u = $(currUser.text);\n if (u.hasClass('hint')) {\n u.each(function () {\n InitAdditionalInfoTooltip($(this));\n });\n }\n MarkUser(u, isSelected);\n } else {\n // Подсказки настроены.\n u = $(GenerateAdditionalInfoTooltipHtml(currUser.hint));\n u.attr('id', itemId).data('div', currUser.text).append('');\n MarkUser(u, isSelected);\n }\n } else {\n // -1 - сообщение об ошибке.\n if (this.text) {\n u = $('
    ' + (currUser.text) + '
    ');\n } else {\n u = null;\n }\n }\n if (u) {\n FilterArea.append(u);\n }\n });\n if ($.ipad || WA.ENV.isAndroid()) {\n InitTabletContextMenu(FilterArea.find('.Rights_List_div'));\n }\n MarkAllGroupsAndUsers($('.Rights'));\n };\n }\n });\n } else {\n $('#' + UserTreeId).show();\n CheckIfFavoritesEmpty($('li#0'));\n var rightsTable = $('.Rights');\n if (rightsTable.data('needUpdTree') == true) {\n rightsTable.trigger('reload.UserTree', [false]);\n rightsTable.data('needUpdTree', null);\n }\n $('#' + FilterAreaId).hide();\n }\n}\n\nfunction InitRightsUserTreeKeyNavigation() {\n var tree = $('ul.treeview:visible');\n var filterResults = $('.Filter_User_View');\n var mainContent = $('#scroller');\n var rightsTable = $('.Rights_Table');\n var rightsUserList = $('.Rights_User_List');\n if (!$.ipad) {\n mainContent.height(mainContent.parent().parent().height()).css('overflow', 'auto');\n }\n\n var UpDownKeyNavigation = function (down) {\n if (tree.length > 0 && tree.css('display') != \"none\") {\n var currentItem = tree.find('div.over').parents('li:first');\n if (currentItem.length) {\n // от текущего элемента делаем поиск в 3-х направлениях: в дочерних элементах, в следующих элементах на уровень выше и в элементах того же уровня\n var nextItem;\n if (down) {\n nextItem = currentItem.find('li:visible:first');\n if (nextItem.length == 0) { // если не нашли внизу\n nextItem = FindSiblingOrParent(currentItem, down);\n }\n }\n else {\n nextItem = FindSiblingOrParent(currentItem, down);\n }\n if (nextItem.length) {\n UnhoverAllItems();\n HoverItem(nextItem);\n ScrollToHoveredItem(nextItem, down);\n }\n }\n else {\n if (down) {\n HoverItem(tree.find('li:visible:first'));\n mainContent.scrollTop(0);\n }\n else {\n HoverItem(tree.find('li:visible:last'));\n mainContent.scrollTop(100000);\n }\n }\n }\n else {\n var currentItem = filterResults.find('div.over');\n if (currentItem.length) {\n var nextItem;\n if (down) {\n nextItem = currentItem.next('.Rights_List_div');\n }\n else {\n nextItem = currentItem.prev();\n }\n if (!nextItem.length) nextItem = currentItem;\n UnhoverAllItems();\n HoverItem(nextItem);\n ScrollToHoveredItem(nextItem, down);\n }\n else {\n if (down) {\n HoverItem(filterResults.children('div:first:visible'));\n mainContent.scrollTop(0);\n }\n else {\n HoverItem(filterResults.children('div:last:visible'));\n mainContent.scrollTop(100000);\n }\n }\n }\n };\n\n var FindSiblingOrParent = function (item, down) {\n var nextItem;\n if (down) {\n nextItem = item.next('li:visible:first'); // ищем след элемент на этом же уровне\n if (nextItem.length == 0) { // если не нашли\n if (!item.parent('.treeview').length) { // и если родительский элемент это не все дерево, и значит есть куда подниматься выше\n nextItem = FindSiblingOrParent(item.parents('li:visible:first'), down); // ищем сиблингов у родителя или его родителей\n } else {\n nextItem = item;\n }\n }\n } else { // движение вверх\n nextItem = item.prev('li:visible:first'); // ищем сперва сиблинга\n var sibling = true;\n if (nextItem.length == 0) { // если его не нашли и родительский элемент не само дерево, и значит есть куда подниматься выше\n if (!item.parent('.treeview').length) {\n nextItem = item.parents('li:visible:first'); // то берем родителя\n sibling = false;\n if (nextItem.length == 0) { // если его не нашли, то пытаемся найти сиблинга родителя или его родителей\n nextItem = FindSiblingOrParent(item.parents('li:visible:first'), down);\n }\n } else { // если родитель - это все дерево, то мы на крайнем элементе и никуда не двигаемся\n nextItem = item;\n sibling = false;\n }\n }\n if (sibling) { // если нашли сиблинга, то проверяем наличие дочерних узлов и переходим к ним\n var subItem = nextItem.find('li:visible:last');\n if (subItem.length) {\n nextItem = subItem;\n }\n }\n }\n return nextItem;\n };\n\n var ExpandOrCollapseGroup = function (expand) {\n if (tree.length > 0 && tree.css('display') != \"none\") {\n var currentItem = tree.find('div.over').parents('li:visible:first');\n if (expand) {\n if (currentItem.hasClass('expandable')) {\n currentItem.children('div.hitarea').click();\n }\n } else {\n if (currentItem.hasClass('collapsable')) {\n currentItem.children('div.hitarea').click();\n } else {\n if (!currentItem.parent('.treeview').length) {\n var parent = currentItem.parents('li:visible:first');\n UnhoverAllItems();\n HoverItem(parent);\n parent.children('div.hitarea').click();\n }\n }\n }\n }\n };\n\n var ScrollToHoveredItem = function (item, down) {\n if (tree.filter(':visible').height() > mainContent.height() ||\n (filterResults.height() > mainContent.height() && filterResults.css('display') != \"none\")) {\n\n var height = 65;\n var currentID = item.attr('id');\n var lis = tree.filter(':visible').length ? tree.find('li:visible') : filterResults.children('.Rights_List_div');\n\n\n if (down) {\n for (var i = lis.length - 1; i >= 0; i--) {\n if ($(lis[i]).attr('id') == currentID) {\n height += (i + 1) * 24;\n break;\n }\n }\n if (mainContent.height() - height < 100) {\n mainContent.scrollTop(mainContent.scrollTop() + 24);\n }\n } else {\n for (var i = 0; i < lis.length; i++) {\n if ($(lis[i]).attr('id') == currentID) {\n height += (i + 1) * 24;\n break;\n }\n }\n if (height - mainContent.scrollTop() < 100) {\n mainContent.scrollTop(mainContent.scrollTop() - 24);\n }\n }\n }\n };\n\n var HoverItem = function (item) {\n UnhoverAllItems();\n if (tree.length == 0 || tree.css('display') == \"none\") {\n item.filter('div.Rights_List_div:first').addClass('over');\n } else {\n item.find('div.Rights_List_div:first').addClass('over');\n }\n if (!item.hasClass('notallshown') && item.length) {\n if (item.find('p:first')[0].className.indexOf('Marked') == -1) {\n item.find('p.treeview_img_action:first').css('visibility', 'visible');\n }\n }\n };\n var UnhoverAllItems = function () {\n var title = rightsUserList.find('div.over'); //tree.css('display') == \"none\" ? filterResults.find('div.over') : tree.find('div.over');\n if (title.length == 0) title = rightsUserList.find('ul').find('div.over');\n title.removeClass('over').find('p.treeview_img_action').css('visibility', 'hidden');\n title.parent().removeClass('hover');\n };\n\n var SelectItem = function () {\n tree.length == 0 || tree.css('display') == \"none\" ?\n filterResults.find('div.over').click() :\n tree.find('div.over').click();\n };\n\n var DeselectItem = function () {\n var item = tree.length == 0 || tree.css('display') == \"none\" ?\n filterResults.find('div.over').click() :\n tree.find('div.over').click();\n var tr = rightsTable.find('tr[id$=\"_' + item.attr('id') + '\"]');\n RemoveUserFromRights(tr.find('td:first').children());\n };\n\n var scope = 'common';\n key('down', scope, function () { UpDownKeyNavigation(true); return false; });\n key('up', scope, function () { UpDownKeyNavigation(false); return false; });\n key('right', scope, function () { ExpandOrCollapseGroup(true); return false; });\n key('left', scope, function () { ExpandOrCollapseGroup(false); return false; });\n key('enter', scope, function () { SelectItem(); return false; });\n key('delete', scope, function () { DeselectItem(); return false; });\n key('shift+tab', scope, function () { $(':focus').blur(); $('input.Filter_Text').focus(); UnhoverAllItems(); return false; });\n $('input.Filter_Text').focus(function () { ClearInputFilterUser(this); UnhoverAllItems(); });\n // key('shift+down', function () { UpDownKeyNavigation(true); return false; });\n // key('shift+up', function () { UpDownKeyNavigation(false); return false; });\n // key('shift+right', function () { ExpandOrCollapseGroup(true); return false; });\n // key('shift+left', function () { ExpandOrCollapseGroup(false); return false; });\n // key('shift+enter', function () { SelectItem(); return false; });\n // key('shift+delete', function () { DeselectItem(); return false; });\n}\n","function InitializeSessionRoutiness() {\n setTimeout(SessionKeepAlive, SessionUpdateTime);\n}\n\nfunction SessionKeepAlive() {\n $.ajax({\n type: \"POST\",\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n url: \"/Session.asmx/KeepAlive\",\n cache: false,\n success: function (data, textStatus, xhr) {\n // В мобильной версии WebAccess нет.\n try {\n if (WebAccess) {\n $.when(WA.AgentInit).done(function () {\n WebAccess.agent.keepAlive();\n });\n }\n } catch (e) {\n console.log('using WebAccess to keep alive the Agent');\n }\n setTimeout(SessionKeepAlive, SessionUpdateTime);\n if (!WA.services._isSessionAlive(xhr.status)) return;\n },\n error: function (err) {\n setTimeout(SessionKeepAlive, SessionUpdateTime);\n if (!WA.services._isSessionAlive(err.status)) return;\n }\n });\n}\n\nfunction ObjLockKeepAlive(url, data) {\n var R = false;\n var obj = {\n timeout: null //чтобы работала передача по сслыке\n };\n\n //TODO Почему синхронные запросы?\n $.ajax({\n type: \"POST\",\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n url: url,\n cache: false,\n async: false,\n data: data,\n success: function (res) {\n R = res.d;\n },\n error: function (err) {\n obj.timeout = setTimeout(function () { ObjLockKeepAlive.call(ObjLockKeepAlive, url, data) }, LockUpdateTime);\n if (!WA.services._isSessionAlive(err.status)) return;\n }\n });\n if (R) {\n obj.timeout = setTimeout(function () { ObjLockKeepAlive.call(ObjLockKeepAlive, url, data) }, LockUpdateTime);\n }\n\n return obj;\n}\n","(function (exports) {\n\n // Модель Пользователь. Конструктор.\n var User = exports.User = function (data) {\n _.extend(this, data);\n }\n\n User.prototype.constructor = User;\n User.prototype.toString = function () {\n return \"[object models.User]\";\n }\n\n // Получает текущего пользователя.\n User.current = function () {\n return User._current;\n } \n\n})(this.models || (this.models = {}));","(function (global) {\n\n /**\n * Коллекция элементов. \n * @class WebAccess.Collection\n * @param {object} elements Элементы коллекции.\n * @since 5.0.0.7100\n */\n var Collection = Class.extend({\n className: \"Collection\",\n\n /**\n * Массив элементов.\n * @since 5.0.0.7100\n * @private\n */\n _arr: [],\n\n /**\n * Конструктор.\n * @since 5.0.0.7100\n * @private\n */\n init: function (elements) {\n this._arr = [];\n for (var name in elements) {\n this.addElement(name, elements[name]);\n }\n },\n\n /**\n * Добавляет новый элемент в коллекцию.\n * @method WebAccess.Collection#addElement\n * @param {string} name Название элемента коллекции.\n * @param {object} data Данные элемента коллекции.\n * @return {WebAccess.Collection}\n * @since 5.0.0.7100\n */\n addElement: function (name, data) { \n this[name] = data;\n if (!$.isFunction(data)) this._arr.push(data);\n return this;\n },\n\n /**\n * Удаляет элемент из коллекции.\n * @method WebAccess.Collection#deleteElement\n * @param {string} name Название элемента коллекции.\n * @return {object} Удаленный элемент.\n * @since 5.0.0.7100\n */\n deleteElement: function (name) {\n var me = this;\n var deletedElement = null;\n if (me[name]) {\n deletedElement = me[name];\n delete me[name];\n\n for (var i = 0; i < me._arr.length; i++) {\n if (me._arr[i] === deletedElement) {\n me._arr.splice(i, 1);\n break;\n }\n }\n }\n return deletedElement;\n },\n\n /**\n * Очищает коллекцию.\n * @method WebAccess.Collection#clear\n * @return {WebAccess.Collection}\n */\n clear: function () {\n var me = this;\n for (var name in me) {\n if ($.inArray(me[name], me._arr) !== -1) {\n delete me[name];\n }\n }\n this._arr = [];\n return this;\n },\n\n /**\n * Кол-во элементов коллекции\n * @method WebAccess.Collection#count\n * @return {integer}\n */\n count: function () {\n return this._arr.length;\n },\n\n /**\n * Проверяет наличие элемента в коллекции по имени.\n * @method WebAccess.Collection#isExist\n * @param {string} name Название элемента коллекции.\n * @return {Boolean}\n */\n isExist: function (name) {\n return !!this[name];\n },\n\n /**\n * Возвращает элементы коллекции в виде массива.\n * @method WebAccess.Collection#toArray\n * @return {Array}\n */\n toArray: function () {\n return this._arr;\n }\n\n });\n\n global.Collection = Collection;\n\n})(window.WebAccess);","\"use strict\";\n\n(function (global) {\n\n /**\n * Предоставляет дополнительные методы для работы со ссылками на объекты.\n *\n * @mixin WebAccess.mixins.linkMixin\n * @since 5.0.0.7300\n */\n var linkMixin = {\n\n /**\n * Открыть ссылку в новом окне.\n *\n * @method WebAccess.mixins.linkMixin#open\n * @return {WebAccess.mixins.link} Объект типа link.\n */\n open: function () {\n var url = this.toURL();\n if (this.isNew) {\n url.setParam('mode', 'edit');\n };\n url.open();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Открыть ссылку в desktop-клиенте.\n *\n * @method WebAccess.mixins.linkMixin#openInDesktop\n * @return {WebAccess.mixins.link} Объект типа link.\n */\n openInDesktop: function () {\n var url = this.toURL();\n url.setParam('Desktop', 1);\n url.setParam('-view');\n url.open();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Преобразовать ссылку на объект в объект типа WA.URL.\n *\n * @method WebAccess.mixins.linkMixin#toURL\n * @return {WebAccess.URL} Объект типа URL.\n */\n toURL: function () {\n //TODO Шамов А.: Сломается везде, кроме Link, если использовать этот mixin в другом классе.\n //Шабардин П.: Да сломается, ну и что расширим URL, в нем для этого нет преград, а других объкетов мы пока не знаем, когда будем делать - тогда и расширим.\n var url = new WA.URL(this);\n if (this.isNew) {\n url.setParam('mode', 'edit');\n };\n\n return url;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Преобразовать ссылку на объект в объект типа WebAccess.Models.Link, совместимый с серверной объекной моделью.\n *\n * @method WebAccess.mixins.linkMixin#toLinkModel\n * @return {Object} Объект типа WebAccess.Models.Link.\n */\n toLinkModel: function () {\n return {\n ID: this.id,\n Kind: objectTypeToString(this.type),\n CompCode: this.referenceName\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Преобразовать объект типа WebAccess.Models.Link в ссылку.\n *\n * @method WebAccess.mixins.linkMixin#toLinkModel\n * @return {Object} Ссылка на объект.\n */\n fromLinkModel: function (model) {\n if (!model) WA.raise('ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED');\n this.id = model.ID;\n this.type = objectKindToObjectType(model.Kind);\n this.referenceName = model.CompCode;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить строковое представление объекта.\n *\n * @method WebAccess.mixins.linkMixin#asString\n * @since 5.0.0.7300 \n * @return {string} Строковое представление объекта.\n */\n asString: function () {\n return $.toJSON({\n id: this.id,\n type: this.type,\n referenceName: this.referenceName\n });\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n };\n\n global.linkMixin = linkMixin;\n})(window.WebAccess.mixins);","\"use strict\";\n(function (global) {\n\n /** \n * Ссылка на объект.\n *\n * @class WebAccess.Link\n * @mixes WebAccess.mixins.linkMixin\n * @param {Integer} id Идентификатор объекта\n * @param {OBJECT_TYPE} type Тип объекта\n * @param {String} [opt_referenceName] Имя справочника\n * @property {Integer} id Идентификатор объекта\n * @property {OBJECT_TYPE} type Тип объекта\n * @property {String} referenceCode Имя справочника\n * @property {String} className Имя класса\n * @since 5.0.0.7300 \n */\n var Link = Class.extend([global.mixins.linkMixin], {\n className: \"Link\",\n id: 0,\n type: OBJECT_TYPE.UNKNOWN,\n referenceName: null,\n isNew: false,\n\n init: function (id, type, opt_referenceName) {\n if (isNaN(id) && typeof id !== 'object') {\n this.id = WA.CR.getID();\n this.type = WA.CR.getObjectType();\n this.referenceName = WA.CR.getReferenceCode();\n return this;\n }\n\n if (typeof id === 'object') {\n this.id = id['id'];\n this.type = id['type'];\n this.referenceName = id['referenceName'];\n } else {\n this.id = id;\n this.type = type;\n this.referenceName = opt_referenceName;\n }\n return this;\n }\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n });\n\n global.Link = Link;\n})(window.WebAccess);","\"use strict\";\n(function (global) {\n\n /** \n * Ссылки.\n\n * @class WebAccess.URL\n * @param {String|WA.Link} url Адрес URL, либо ссылка WA.Link на объект системы.\n * @property {String} className Имя класса \n * @property {integer} id ИД объекта\n * @since 5.0.0.7300\n */\n var URL = Class.extend({\n className: \"URL\",\n _url: '',\n\n init: function (url) {\n if (typeof url === 'object' && url.className === 'Link') {\n this._url = this._getUrlFromLink(url);\n } else {\n this._url = url;\n }\n if (!url) this._url = window.location.href;\n this._refresh();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * todo, может когда нибудь в будущем\n * @ignore\n */\n _refresh: function () {\n return;\n //$.extend(this, new window.URL(this._url));\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Открывает URL-ссылку в новом окне.\n * Примечание. Браузер Google Chrome блокирует страницы, которые открываются через асинхронный вызов или из потока, \n * не имеющего прямого участия с пользователем. Для устранения этой ситуации, используйте пример, представленный ниже.\n *\n * @method WebAccess.URL#open\n * @since 5.0.0.7300\n * @return {WebAccess.current.window} Объект типа window.\n *\n * @example Открытие ссылки в новом окне\n * var url = new WA.URL('/Explorer.aspx');\n * url.open();\n *\n * @example Асинхронное открытие объектов\n * function createTask() {\n * var taskTab = new WA.URL('/PleaseWait.aspx').open(); // Ссылка на указанную веб-страницу открывается.\n * WebAccess.factories.tasks.createTask().done(function(task) {\n * // Если здесь вызвать task.toURL().open(), то в браузере Google Crome появится уведомление, что всплывающее окно заблокировано.\n * task.toURL().openIn(taskTab);\n * // Второй вариант: taskTab.location.href = task.toURL();\n * });\n * };\n */\n open: function (opt_target) {\n opt_target = opt_target || '_blank';\n return window.open(this._url, opt_target);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Открывает URL-ссылку в указанном окне.\n *\n * @method WebAccess.URL#openIn\n * @param {window} window Окно браузера, в котором необходимо открыть URL-ссылку\n * @return {WebAccess.current.window} Объект типа window.\n * @since 5.0.0.7300\n */\n openIn: function (win) {\n return win.location.href = this._url;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает параметр URL-ссылки.\n *\n * @method WebAccess.URL#getParam\n * @param {String} paramName Имя параметра\n * @return {String} Наименование параметра URL-ссылки.\n * @since 5.0.0.7300\n */\n getParam: function (paramName) {\n return this._getParam(paramName, this.asStringWithoutHash());\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить параметр из URL.\n *\n * @method WebAccess.URL#getParam\n * @param {String} paramName Имя параметра\n * @since 5.0.0.7300\n * @return {String}\n * @private\n */\n _getParam: function (paramName, url) {\n var param = this._getNonEncoded(url, paramName);\n try {\n return decodeURIComponent(param);\n } catch (_) {\n return param;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает параметр из хеша URL-ссылки.\n *\n * @method WebAccess.URL#getParamInHash\n * @param {String} paramName Имя параметра\n * @since 5.0.0.7300\n * @return {String} Наименование параметра, полученного из хеша URL-ссылки.\n */\n getParamInHash: function (paramName) {\n return this._getParam(paramName, '?' + this.getHash());\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает или изменяет параметр из хеша URL-ссылки.\n *\n * @method WebAccess.URL#getParamInHash\n * @param {String} paramName Имя параметра\n * @since 5.2.0.1100\n * @return {String} Наименование параметра, полученного из хеша URL-ссылки.\n */\n setParamInHash: function (paramName, value) {\n var me = this;\n var newHash = me._setParam(paramName, value, '?' + me.getHash()).substr(1);\n if (newHash.charAt(0) === '&') newHash = newHash.substr(1); //Удаляем лишний & вначале\n me._url = me.asStringWithoutHash() + '#' + newHash;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает хеш URL-ссылки.\n *\n * @method WebAccess.URL#getHash\n * @since 5.0.0.7300\n * @return {String} Строга, содержащая хеш URL-ссылки.\n */\n getHash: function () {\n var hashIndex = this._url.indexOf('#');\n if (hashIndex != -1) {\n return this._url.substr(hashIndex + 1);\n } else {\n return \"\";\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает расширение файла.\n * @method WebAccess.URL#getExtension\n * @since 5.2.0.1100\n * @return {String}\n */\n getExtension: function () {\n return WA._getFileExtensionFromURL(this._url);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает строку URL-ссылки без хэш-символов.\n * @method WebAccess.URL#asStringWithoutHash\n * @since 5.0.0.7300\n * @return {String} Строка URL-ссылки без хэш-символов.\n */\n asStringWithoutHash: function () {\n var hashIndex = this._url.indexOf('#');\n if (hashIndex != -1) {\n return this._url.substr(0, hashIndex);\n } else {\n return this._url;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает или изменяет параметр URL-ссылки.\n *\n * @method WebAccess.URL#setParam\n * @param {String} paramName Имя параметра\n * @param {String} value Новое значение, заданное параметру\n * @return {WebAccess.URL} Объект типа URL.\n * @since 5.0.0.7300\n */\n setParam: function (paramName, value) {\n var hash = this.getHash(this._url);\n\n this._url = this._setParam(paramName, value, this.asStringWithoutHash());\n if (hash)\n this._url = this._url + '#' + hash;\n\n this._refresh();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает или изменяет параметр URL-ссылки.\n *\n * @method WebAccess.URL#setParam\n * @param {String} paramName Имя параметра\n * @param {String} value Новое значение, заданное параметру\n * @param {String} url URL-ссылка.\n * @return {WebAccess.URL} Объект типа URL.\n * @since 5.2.0.1100\n * @private\n */\n _setParam: function (paramName, value, url) {\n var newUrl = url;\n var re = new RegExp('([\\?|&])' + paramName + '=([^?&]*)', 'i');\n var m = re.exec(newUrl);\n if (!m) {\n newUrl += ((newUrl.indexOf('?') == -1) ? '?' : '&') + paramName + \"=\" + encodeURIComponent(value);\n } else {\n newUrl = newUrl.replace(re, m[1] + paramName + \"=\" + encodeURIComponent(value));\n }\n return newUrl;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удаляет параметр из URL-ссылки.\n *\n * @method WebAccess.URL#removeParam\n * @param {String} paramName Имя параметра\n * @since 5.0.0.7300\n * @return {WebAccess.URL} Объект типа URL.\n */\n removeParam: function (paramName) {\n var me = this;\n var hash = me.getHash(me._url);\n var urlWithoutHash = me.asStringWithoutHash();\n var re = new RegExp('([\\?|&]?)' + paramName + '=([^?&]*)', 'ig');\n urlWithoutHash = urlWithoutHash.replace(re, \"$1\").replace('?&', '?').replace('&&', '&');\n if (urlWithoutHash.charAt(urlWithoutHash.length - 1) === '&') {\n urlWithoutHash = urlWithoutHash.substr(0, urlWithoutHash.length - 1);\n }\n if (hash) {\n me._url = urlWithoutHash + '#' + hash;\n } else {\n me._url = urlWithoutHash;\n }\n me._refresh();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение не закодированного URL\n * @method WebAccess.URL#_getNonEncoded\n * @private\n * @since 5.0.0.7300\n * @return {String}\n */\n _getNonEncoded: function (url, name) {\n name = name.replace(/[\\[]/, \"\\\\\\[\").replace(/[\\]]/, \"\\\\\\]\");\n var regexS = \"[\\\\?&]\" + name + \"=([^&#]*)\";\n var regex = new RegExp(regexS, 'i');\n var results = null;\n if (!url) {\n results = regex.exec(window.location.href);\n } else {\n results = regex.exec(url);\n }\n if (!results) {\n return \"\";\n } else {\n return results[1];\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обработка объекта Link - выжимка и сборка из него url\n * @method WebAccess.URL._getUrlFromLink\n * @private\n * @return {String} строка url\n * @since 5.0.0.7300\n */\n _getUrlFromLink: function (link) {\n var host = window.location.href.substr(0, window.location.href.lastIndexOf('/') + 1);\n var page = this._getPageNameByKind(objectTypeToString(link.type));\n var url = host + page + \"x?sys=\" + g_SysCode +\n \"&id=\" + link.id +\n (link.referenceName ? \"&compcode=\" + encodeURIComponent(link.referenceName) : '') +\n \"&ext=\" + g_ExtName;\n return url;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение имени страницы исходя из типа объекта.\n * @method WebAccess.URL._getPageNameByKind\n * @param {String} kind\n * @private\n * @return {String}\n * @since 5.0.0.7300\n */\n _getPageNameByKind: function (kind) {\n switch (kind.toUpperCase()) {\n case \"EDOC\": return \"doc.asp\";\n case \"FOL\": return \"folder.asp\";\n case \"JOB\": return \"job.asp\";\n case \"TASK\": return \"task.asp\";\n case \"REF\": return \"reference.asp\";\n default:\n return null;\n break;\n }\n return null;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает строкове представление адреса URL-ссылки.\n *\n * @method WebAccess.URL#asString\n * @since 5.0.0.7300\n * @return {String} Строка с адресом URL-ссылки.\n */\n asString: function () {\n return this._url;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n global.URL = URL;\n})(window.WebAccess);","\"use strict\";\n\n(function (global) {\n /**\n * Предоставляет вспомогательные инструменты.\n * \n * @namespace WebAccess.utils\n * @since 5.1.0.1523\n */\n global.utils = {};\n\n global.utils.compareData = function (v1, v2, dataType) {\n if (v1 === null) v1 = \"\";\n if (v2 === null) v2 = \"\";\n\n v1 = (\"\" + v1).toLowerCase();\n v2 = (\"\" + v2).toLowerCase();\n\n if (dataType.toLowerCase() == 'date') {\n //TODO Парсинг строк может быть медленным. Возможно стоит timestamp возвращать с сервера в отдельном поле.\n v1 = (v1 == '' ? new Date(100, 1, 1, 0, 0, 0) : parseDateTime('' + v1));\n v2 = (v2 == '' ? new Date(100, 1, 1, 0, 0, 0) : parseDateTime('' + v2));\n }\n\n if (dataType.toLowerCase() == 'float') {\n v1 = (v1 == '' ? Number.NEGATIVE_INFINITY : parseFloat(v1.replaceAll(',', '.')));\n v2 = (v2 == '' ? Number.NEGATIVE_INFINITY : parseFloat(v2.replaceAll(',', '.')));\n }\n\n if (dataType.toLowerCase() == 'integer') {\n v1 = +v1;\n v2 = +v2;\n }\n\n if (v1 < v2) return -1;\n if (v1 > v2) return 1;\n return 0;\n }\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n})(window.WebAccess);","\"use strict\";\n/**\n * Предоставляет инструменты для работы с кэш-хранилищем.\n *\n * @namespace WebAccess.cache\n * @since 5.0.0.7100\n */\n(function (global) { \n\n var Cache = BaseObject.extend({\n _errorCatched: false,\n init: function (data) {\n var me = this;\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n _data: {\n setItem: function (key, value) {\n this[key] = value;\n return this;\n },\n removeItem: function(key) {\n delete this[key];\n },\n getItem: function (key) {\n return this[key]; \n },\n clear: function () {\n for (p in this) {\n if (!$.isFunction(this[p])) {\n delete this[p];\n }\n }\n return this;\n }\n },\n className: \"Cache\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Проверить, поддерживается ли браузером локальное хранилище (localStorage).\n *\n * @function WebAccess.cache.isLocalStorageAvailable\n * @return {boolean} True – локальное хранилище поддерживается браузером, иначе False.\n * @since 5.0.0.7100 \n * @since 5.1.0.1505 RENAMED_FROM isLocalStorageAvailable \n */\n isStorageAvailable: function () {\n return !!(window[\"localStorage\"]) && !this._errorCatched;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @private \n * @method WebAccess.cache._getStorage\n */\n _getStorage: function () {\n if (this.isStorageAvailable) return window.localStorage;\n else {\n log.warn('CACHE', 'LocalStorage is not available for this browser, using local variable instead');\n return this._data;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Удалить значение.\n *\n * @function WebAccess.cache.removeItem\n * @param {string} key Ключ кэш-хранилища \n * @return {WebAccess.cache} Объект типа cache.\n * @since 5.1.0.1534 \n */\n removeItem: WA.TCD(function (key) {\n var me = this;\n try {\n this._getStorage().removeItem(key); \n this.fire('itemRemoved', key);\n } catch (e) {\n log.error('CACHE', e);\n me._errorCatched = true;\n }\n return this;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Сохранить значение в кэш.\n *\n * @function WebAccess.cache.setItem\n * @param {string} key Ключ кэш-хранилища \n * @param {string} value Сохраняемое значение. Объекты не сохраняются\n * @return {WebAccess.cache} Объект типа cache.\n * @since 5.0.0.7100\n */\n setItem: function (key, value) {\n var me = this;\n try {\n this._getStorage().setItem(key, value); \n this.fire('itemSet', key, value);\n } catch (e) {\n log.error('CACHE',e);\n me._errorCatched = true; \n }\n\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Получить значение из кэша.\n *\n * @function WebAccess.cache.getItem\n * @param {string} key Ключ кэш-хранилища \n * @return {String|Integer} Полученное значение типа String или Integer.\n * @since 5.0.0.7100\n */\n getItem: function (key) {\n return this._getStorage().getItem(key); \n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Сохранить объект в кэш.\n *\n * @function WebAccess.cache.setObject\n * @param {string} key Ключ\n * @param {object} value Сохраняемый объект\n * @return {WebAccess.cache} Объект типа cache.\n * @since 5.0.0.7100\n */\n setObject: WA.TCD(function(key, value) {\n this.setItem(key, $.toJSON(value));\n return this;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Получить объект из кэша.\n *\n * @function WebAccess.cache.getObject\n * @param {string} key Ключ\n * @return {object} Полученный объект.\n * @since 5.0.0.7100\n */\n getObject: function (key) {\n var value = this.getItem(key);\n return value && (value !=='undefined' ? $.parseJSON(value) : null);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Очистить кэш.\n *\n * @function WebAccess.cache.clear\n * @return {WebAccess.cache} Объект типа cache.\n * @since 5.0.0.7100\n */\n clear: function () {\n this._getStorage().clear();\n return this;\n } \n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n \n global.cache = new Cache();\n global.cache.Cache = Cache;\n})(window.WebAccess);","//Включает логирование всех событий. Используется для отладки.\n//window.ENABLE_EVENTS_LOGGING = true;\n//window.ENABLE_EVENTS_LOGGING_JQUERY = true;\n\n(function (global) {\n \"use strict\";\n\n var includedLevels = {\n 'E': ['E'],\n 'W': ['E', 'W'],\n 'I': ['E', 'W', 'I'],\n 'D': ['E', 'W', 'I', 'D']\n }\n\n /** \n * Предоставляет инструменты для логирования.\n * В режиме отладки веб-доступ записывает все действия в лог-файлы. \n * Данные файлов впоследствии можно использовать для отладки веб-модулей.\n *\n * @namespace WebAccess.utils.log \n * @since 5.1.0.1523\n *\n * @example \n * WA.utils.log.info('Загружен новый веб-модуль «Модуль 1.0»');\n * // Либо использовать второй вариант записи.\n * log.info('Загружен новый веб-модуль «Модуль 1.0»'); \n */\n var Log = BaseObject.extend({\n className: \"Log\",\n _disabled: true,\n saveImmediate: false,\n maxStackSize: 50,\n _writeTimeOut: null,\n\n init: function () {\n if (!this.isDisabled()) this._disabled = false;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n strToLevel: function (level) {\n switch (level) {\n case 'error':\n return LOG_LEVEL.ERROR;\n break;\n case 'warn':\n case 'warning':\n return LOG_LEVEL.WARN;\n break;\n case 'info':\n return LOG_LEVEL.INFO;\n break;\n case 'debug':\n return LOG_LEVEL.DEBUG\n break;\n default:\n return null;\n };\n },\n\n getLevel: function () {\n return WA.cache.getItem('log.level') || this.strToLevel(Core.logLevel) || LOG_LEVEL.ERROR;\n },\n\n setLevel: function (level) {\n WA.cache.setItem('log.level', level);\n return this;\n },\n\n /**\n * Проверить, отключено ли логирование.\n * Значение по умолчанию True.\n *\n * @method WebAccess.utils.log.isDisabled\n * @return {Boolean} True – логирование отключено, иначе False.\n */\n isDisabled: function () {\n return (!window.isDebug && WA.cache.getItem('log.isEnabled') !== 'true');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Включить логирование.\n * По умолчанию логирование отключено.\n * \n * @method WebAccess.utils.log.enable\n * @return {WebAccess.utils.log} Объект типа log.\n */\n enable: function () {\n WA.cache.setItem('log.isEnabled', 'true');\n this._disabled = false;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n _write: function (params) {\n if (!Core.isLogsEnabled) return this;\n if (this._isDisabled) return this;\n if (WA.getLocation() === 'login') return;\n if (!params) return;\n if (this.saveImmediate) {\n WA.SRV.call('/ClientLogs.asmx/Write', params);\n } else {\n var queue = WA.cache.getObject('logs') || [];\n queue.push(params);\n WA.cache.setObject('logs', queue);\n if (queue.length > this.maxStackSize) this._writeQueue();\n }\n return this;\n },\n\n /** \n * Выгрузить текущий пакет лога на веб-сервер.\n * @method WebAccess.current.statistics._writeQueue\n * @private\n */\n _writeQueue: function () {\n if (this._isDisabled) return this;\n var queue = WA.cache.getObject('logs');\n clearTimeout(this._writeTimeOut);\n\n this._writeTimeOut = setTimeout(function () {\n WA.SRV.call('/ClientLogs.asmx/writeQueue', { \"Queue\": queue }).done(function (success) {\n if (success) WA.cache.setObject('logs', []);\n });\n }, 1000);\n return this;\n },\n\n /**\n * Отключить логирование.\n * По умолчанию логирование отключено.\n *\n * @method WebAccess.utils.log.enable\n * @return {WebAccess.utils.log} Объект типа log.\n */\n disable: function () {\n WA.cache.setItem('log.isEnabled', 'false');\n this._disabled = true;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Записать предупреждение в лог. \n * По умолчанию логирование отключено.\n *\n * @method WebAccess.utils.log.warn\n * @param {string} tag Тэг \n * @param {string} message Сообщение\n * @return {WebAccess.utils.log} Объект типа log.\n */\n warn: function (tag, message) {\n if (this._disabled) return;\n tag = tag || 'DEFAULT';\n tag = tag.toUpperCase();\n var c = arguments.length;\n return this._log(LOG_LEVEL.WARN, tag, Array.prototype.splice.call(arguments, 1, c)); //Для IE8 нужно 2 параметра в splice.\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Записать предупреждение в лог. \n * По умолчанию логирование отключено.\n *\n * @method WebAccess.utils.log.warning\n * @param {string} tag Тэг \n * @param {string} message Сообщение\n * @alias WebAccess.utils.log.warn\n * @return {WebAccess.utils.log} Объект типа log.\n */\n warning: function (tag, message) {\n return this.warn(tag, message);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Записать в лог информационное сообщение.\n *\n * @method WebAccess.utils.log.info\n * @param {string} tag Тэг \n * @param {string} message Сообщение\n * @return {WebAccess.utils.log} Объект типа log.\n * @since 5.1.0.1523 \n */\n info: function (tag, message) {\n if (this._disabled) return;\n tag = tag || 'DEFAULT';\n tag = tag.toUpperCase();\n var c = arguments.length;\n return this._log(LOG_LEVEL.INFO, tag, Array.prototype.splice.call(arguments, 1, c)); //Для IE8 нужно 2 параметра в splice.\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Записать в лог сообщение об ошибке.\n *\n * @method WebAccess.utils.log.error\n * @param {string} tag Тэг \n * @param {string} message Сообщение\n * @return {WebAccess.utils.log} Объект типа log.\n * @since 5.1.0.1523 \n */\n error: function (tag, message) {\n if (this._disabled) return;\n tag = tag || 'DEFAULT';\n tag = tag.toUpperCase();\n var c = arguments.length;\n return this._log(LOG_LEVEL.ERROR, tag, Array.prototype.splice.call(arguments, 1, c)); //Для IE8 нужно 2 параметра в splice.\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить в консоли последние сообщения, ожидающие отправки на веб-сервер.\n *\n * @method WebAccess.utils.log.showLastMessages\n * @return {WebAccess.utils.log} Объект типа log.\n */\n showLastMessages: function () {\n var queue = WA.cache.getObject('logs') || [];\n for (var i in queue) {\n var line = queue[i];\n var dt = new Date(line.Time);\n var fd = formatDateTime(dt).split(' ')[1] + ':' + dt.getSeconds() + '.' + dt.getMilliseconds();\n console.log(fd + ' ' + line.Level + ' ' + line.Tag + ' ' + line.Message);\n }\n\n return this;\n },\n\n last: function () {\n this.showLastMessages();\n },\n\n /**\n * Сохранить лог в файл на веб-сервере.\n *\n * @method WebAccess.utils.log.save\n * @return {WebAccess.utils.log} Объект типа log.\n */\n save: function () {\n this._writeQueue();\n return this;\n },\n\n /**\n * Записать в лог сообщение об отладке\n * @method WebAccess.utils.log.debug\n * @return {WebAccess.utils.log} Объект типа log.\n * @since 5.1.0.1523 \n */\n debug: function (tag, message) {\n if (this._disabled) return;\n var message\n\n var c = arguments.length;\n message = Array.prototype.splice.call(arguments, 1, c);\n\n if (c === 1) message = [tag];\n tag = (c === 1) ? 'DEFAULT' : tag;\n\n tag = tag.toUpperCase();\n\n return this._log(LOG_LEVEL.DEBUG, tag, message); //Для IE8 нужно 2 параметра в splice.\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Непосредственная обрабтка вызовов записи в журнал\n * @method WebAccess.utils.log._log\n * @return {WebAccess.utils.log}\n * @private\n * @since 5.1.0.1523 \n */\n _log: function (level, tag, messages) {\n if (includedLevels[this.getLevel()].indexOf(level) === -1) return this;\n\n var dt = new Date();\n var t = formatDateTime(dt).split(' ')[1] + ':' + dt.getSeconds() + '.' + dt.getMilliseconds();\n this.fire('onMessage', level, t, tag, messages);\n\n var params = { 'Time': new Date(), 'Tag': tag, 'Level': level, 'Message': messages.join(' ') };\n var logParams = [t, tag].concat(messages).join(' ');\n\n if (WA.ENV.browser.name !== 'IE') {\n switch (level) {\n case LOG_LEVEL.ERROR:\n console.error(logParams);\n break;\n case LOG_LEVEL.INFO:\n console.info(logParams);\n break;\n case LOG_LEVEL.WARN:\n console.warn(logParams);\n break;\n case LOG_LEVEL.DEBUG:\n default:\n console.log(logParams);\n }\n } else {\n console.log(logParams);\n }\n\n this._write(params);\n return this;\n }\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n var log = new Log();\n global.log = function () {\n log.debug.apply(log, arguments);\n //console.log.apply(this, arguments);\n };\n\n $.extend(global.log, log);\n\n window.onerror = function errorHandler(errorMsg, url, lineNumber) {\n if (!WA.ENV.isTouch()) {\n log.error('DEFAULT', format('{0} {1}:{2}', errorMsg, url, lineNumber));\n } else {\n logDebug('ERROR: ' + format('{0} {1}:{2}', errorMsg, url, lineNumber));\n }\n return false;\n }\n\n\n})(window.WebAccess.utils);\n\n\n\n//Шамов А.: Для отладки событий.\nif (window.ENABLE_EVENTS_LOGGING && window.ENABLE_EVENTS_LOGGING_JQUERY) {\n var prevOn = jQuery.fn.on;\n jQuery.fn.on = function () {\n console.log('jQuery.on', arguments);\n return prevOn.apply(this, arguments);\n };\n\n var prevOff = jQuery.fn.off;\n jQuery.fn.off = function () {\n console.log('jQuery.off', arguments);\n return prevOff.apply(this, arguments);\n };\n\n var prevTrigger = jQuery.fn.trigger;\n jQuery.fn.trigger = function () {\n if (!WA.ENV.isTouch()) {\n console.log('jQuery.trigger', arguments);\n } else {\n logDebug('jQuery.trigger ' + arguments[0]);\n }\n return prevTrigger.apply(this, arguments);\n };\n\n var prevTriggerHandler = jQuery.fn.triggerHandler;\n jQuery.fn.triggerHandler = function () {\n if (!WA.ENV.isTouch()) {\n console.log('jQuery.triggerHandler', arguments);\n } else {\n logDebug('jQuery.triggerHandler ' + arguments[0]);\n }\n return prevTriggerHandler.apply(this, arguments);\n };\n}","\"use strict\";\n\n(function (global) {\n /**\n * Предоставляет инструменты для работы с историей. \n */\n var History = BaseObject.extend({\n allowHistory: null,\n\n init: function () {\n var me = this;\n me.allowHistory = window.history && history.pushState;\n\n if (me.allowHistory) {\n // HACK: чтобы не ловить onpopstate при загрузке страницы в некоторых браузерах.\n window.addEventListener('load', function() {\n setTimeout(function() {\n window.addEventListener('popstate', function() {\n me.fire(me.EVENT.POP_STATE, event);\n me.fire(me.EVENT.CHANGE_STATE, event.state);\n });\n }, 0);\n });\n }\n },\n\n /**\n * Добавить состояние в историю.\n * \n * @param {object} state Объект состояния. \n * @param {string} title Заголовок страницы. \n * @param {string} url URL страницы.\n */\n pushState: function (state, title, url) {\n var me = this;\n if (me.allowHistory) {\n if (!state.type) {\n state.type = WA.getLocation();\n }\n\n history.pushState(state, title, url);\n me.fire(me.EVENT.PUSH_STATE, state, title, url);\n me.fire(me.EVENT.CHANGE_STATE, state);\n } else {\n window.open(url, '_self');\n }\n },\n\n /**\n * Заменить текущее состояние. \n * \n * @param {object} state Объект состояния. \n * @param {string} title Заголовок страницы. \n * @param {string} url URL страницы.\n */\n replaceState: function (state, title, url) {\n var me = this;\n if (me.allowHistory) {\n if (!state.type) {\n state.type = WA.getLocation();\n }\n\n history.replaceState(state, title, url);\n me.fire(me.EVENT.PUSH_STATE, state, title, url);\n me.fire(me.EVENT.CHANGE_STATE, state);\n }\n },\n \n /**\n * События. \n */\n EVENT: {\n /**\n * Добавлено состояние в историю. \n */\n PUSH_STATE: 'pushstate',\n /**\n * Извлечено состояние из истории. \n */\n POP_STATE: 'popstate',\n /**\n * Изменено текущиее состояние. \n */\n CHANGE_STATE: 'changestate'\n }\n });\n\n global.history = new History();\n})(WebAccess);","\"use strict\";\n/**\n * Предоставляет инструменты для работы со сессионным хранилищем (sessionStorage).\n *\n * @namespace WebAccess.cache.sessionCache\n * @since 5.1.0.1534\n */\n(function (global) { \n var SessionCache = global.cache.Cache.extend({\n init: function (data) {\n this._super(data);\n },\n\n /** \n * Проверить, поддерживается ли браузером сессионное хранилище (sessionStorage).\n *\n * @function WebAccess.cache.sessionCache.isStorageAvailable\n * @since 5.1.0.1505\n * @return {boolean} True – сессионное хранилище поддерживается браузером, иначе False.\n */\n isStorageAvailable: function () {\n return !!(window[\"sessionStorage\"]);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @private \n * @since 5.1.0.1505\n * @method WebAccess.cache.sessionCache._getStorage\n */\n _getStorage: function () {\n if (this.isStorageAvailable) return window.sessionStorage;\n else {\n console.warn('sessionCache is not available for this browser, using local variable instead');\n return this._data;\n }\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n });\n global.cache.sessionOnly = global.cache.sessionCache = new SessionCache();\n})(window.WebAccess);","\"use strict\";\n/**\n * Предоставляет инструменты для работы со сессионным хранилищем (sessionStorage).\n *\n * @namespace WebAccess.cache.sessionCache\n * @since 5.1.0.1534\n */\n(function (global) {\n var ServerCache = global.cache.Cache.extend({\n init: function (data) {\n this._super(data);\n },\n\n /** \n * Проверить, поддерживается ли браузером сессионное хранилище (sessionStorage).\n *\n * @function WebAccess.cache.sessionCache.isStorageAvailable\n * @since 5.1.0.1505\n * @return {boolean} True – сессионное хранилище поддерживается браузером, иначе False.\n */\n isStorageAvailable: function () {\n return !!(window[\"sessionStorage\"]);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Удалить значение.\n *\n * @function WebAccess.cache.removeItem\n * @param {string} key Ключ кэш-хранилища \n * @return {WebAccess.cache} Объект типа cache.\n * @since 5.1.0.1534 \n */\n removeItem: WA.TCD(function (key) {\n var me = this;\n try {\n this._getStorage().removeItem(key);\n this.fire('itemRemoved', key);\n } catch (e) {\n log.error('CACHE', e);\n me._errorCatched = true;\n }\n return this;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Сохранить значение в кэш.\n *\n * @function WebAccess.cache.setItem\n * @param {string} key Ключ кэш-хранилища \n * @param {string} value Сохраняемое значение. Объекты не сохраняются\n * @return {WebAccess.cache} Объект типа cache.\n * @since 5.0.0.7100\n */\n setItem: function (key, value) {\n var me = this;\n value = $.toJSON(value);\n return WA.SRV.call('/Session.asmx/SetUserProfileSettings', { ParamName: key, ParamValue: value }).done(function () {\n me.fire('itemSet', key, value);\n }).fail(function(e) {\n log.error('CACHE', e);\n me._errorCatched = true;\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Получить значение из кэша.\n *\n * @function WebAccess.cache.getItem\n * @param {string} key Ключ кэш-хранилища \n * @return {String|Integer} Полученное значение типа String или Integer.\n * @since 5.0.0.7100\n */\n getItem: function (key) {\n var me = this;\n var result = $.Deferred();\n WA.SRV.call('/Session.asmx/GetUserProfileSettings', { ParamName: key }).done(function (value) {\n value = $.parseJSON(value);\n result.resolve(value);\n }).fail(function (e) {\n result.reject(e)\n log.error('CACHE', e);\n me._errorCatched = true;\n });\n return result;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n setObject: function(key,value) {\n return this.setItem(key, value);\n },\n\n getObject: function(key,value) {\n return this.getItem(key);\n },\n\n /**\n * @private \n * @since 5.1.0.1505\n * @method WebAccess.cache.sessionCache._getStorage\n */\n _getStorage: function () {\n if (this.isStorageAvailable) return window.sessionStorage;\n else {\n console.warn('sessionCache is not available for this browser, using local variable instead');\n return this._data;\n }\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n global.cache.serverCache = new ServerCache();\n})(window.WebAccess);","\"use strict\";\n\n(function (global) {\n\n /**\n * Вызвать метод веб-сервисов.\n * В методы done и error можно передать функции обратного вызова, \n * которые выполняются тогда, когда будет получен ответ от сервиса. \n * Если операции веб-сервиса прошли без сбоев, то будет вызвана функция, \n * переданная в метод done данного deferred-объекта, иначе будет вызвана функция, переданная в метод еrror.\n * Полный ответ сервиса можно получить обратившись к контексту this внутри функции callback.\n * @tutorial services\n * @function WebAccess.services.call\n * @param {string} service_method Вызываемый метод веб-сервиса\n * @param {object} [opt_params] Параметры веб-сервиса \n * @param {string} [opt_spinnerText] Текст строки прогресса @deprecated\n * @param {string} [opt_onCompleteSpinnerText] Текст строки прогресса после выполнения операции @deprecated\n * @param {boolean} [opt_hideError] Не отображать ошибку\n * @param {boolean} [opt_hideWarning] Не отображать уведомления\n * @return {Deferred} deferred-объект – специальный объект для управления отложенными вызовами.\n * @this {object} result - результат выполнения сервиса содержит полный ответ.\n * @since 5.0.0.4000\n *\n * @example\n * WA.services.call(\"/Reference.asmx/CreateNewFilter\", { \"ReferenceCode\": WA.current.getReferenceCode(), \"Name\": displayValue }).success(function (result) {\n * console.log(result); //то же самое что this.Result.\n console.log(this.Result);\n console.log(this.Warning);\n console.log(this.Success);\n console.log(this.Error); \n * }).error(function(error) {\n console.log(error);\n });\n *\n * @example\n * WA.services.call(\"/Script.asmx/Run\",{Name:\"WADemoTest\",\"Params\": {\"id\": 10} }).error(function(errorText) { ShowDialog(errorText); } );\n */\n global.services.call = function (service_method, opt_params, opt_spinnerText, opt_onCompleteSpinnerText, opt_hideError, opt_hideWarning) {\n return global.services._call(service_method, opt_params, true, opt_spinnerText, opt_onCompleteSpinnerText, opt_hideError, opt_hideWarning);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выполнить синхронный вызов методов веб-сервисов.\n * В методы done и error можно передать функции обратного вызова, \n * которые выполняются тогда, когда будет получен ответ от сервиса. \n * Если операции веб-сервиса прошли без сбоев, то будет вызвана функция, \n * переданная в метод done данного deferred-объекта, иначе будет вызвана функция, переданная в метод еrror.\n *\n * @tutorial services \n * @function WebAccess.services.callSync\n * @param {string} service_method Вызываемый метод веб-сервиса\n * @param {object} [opt_params] Параметры веб-сервиса\n * @param {string} [opt_spinnerText] Текст строки прогресса @deprecated\n * @param {string} [opt_onCompleteSpinnerText] Текст строки прогресса после выполнения операции\n * @param {boolean} [opt_hideError] Не отображать ошибку @deprecated\n * @param {boolean} [opt_hideWarning] Не отображать уведомления\n * @return {Deferred} deferred-объект – специальный объект для управления отложенными вызовами.\n * @since 5.0.0.4004\n */\n global.services.callSync = function (service_method, opt_params, opt_spinnerText, opt_onCompleteSpinnerText, opt_hideError, opt_hideWarning) {\n return global.services._call(service_method, opt_params, false, opt_spinnerText, opt_onCompleteSpinnerText, opt_hideError, opt_hideWarning);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Вызов сервисов. Базовая функция.\n * @private \n */\n global.services._call = function (service_method, opt_params, async, opt_spinnerText, opt_onCompleteSpinnerText, opt_hideError, opt_hideWarning) {\n if (!service_method) WA.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\", \"service_method\");\n\n var showHint = function (msg, isError) { \n ErrorShow(msg, isError);\n }\n\n if (opt_spinnerText !== false) opt_spinnerText = opt_spinnerText || '';\n if (opt_onCompleteSpinnerText !== false) opt_onCompleteSpinnerText = opt_onCompleteSpinnerText || '';\n opt_hideError = opt_hideError || false;\n opt_hideWarning = opt_hideWarning || false;\n var params = opt_params || {};\n\n var deferred = jQuery.Deferred();\n deferred.success = deferred.done;\n deferred.error = deferred.fail;\n\n if (opt_spinnerText !== false) {\n ShowTopSpinner(opt_spinnerText);\n }\n\n var xhr = $.ajax({\n type: \"POST\",\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n url: service_method,\n data: $.toJSON(params),\n async: async,\n cache: false,\n success: function (res) {\n if (!res) {\n deferred.rejectWith({}, [\"NO_ANSWER\"]);\n if (opt_spinnerText !== false) {\n HideTopSpinner(opt_spinnerText);\n }\n return;\n };\n\n res = res.d;\n\n if (!opt_hideWarning && res.Warning !== null) {\n showHint(res.Warning, false);\n }\n\n if (!res.Success) {\n if (!opt_hideError) {\n ErrorShow(res.Error, true);\n }\n if (opt_spinnerText !== false) {\n HideTopSpinner(opt_spinnerText);\n }\n deferred.rejectWith(res, [res.Error, res]);\n } else {\n if (opt_onCompleteSpinnerText !== false) {\n HideTopSpinner(opt_onCompleteSpinnerText, 2000);\n }\n }\n\n if (CheckForLoginPage(res)) return;\n deferred.resolveWith(res, [res.Result, res]);\n }, error: function (err) {\n var brokenSessionText;\n if (service_method.indexOf('/ClientStatistic.asmx/writeQueue') === -1) { //#86815\n if (!global.services._isSessionAlive(err.status)) {\n opt_hideError = true;\n brokenSessionText = L('WARN_BROKEN_SESSION');\n }\n } else {\n return;\n }\n \n if (!opt_hideError) showHint(err.responseText, true);\n var errResp = {\n Result: null,\n Success: false,\n Warning: null,\n Error: brokenSessionText || err.responseText\n };\n deferred.rejectWith(errResp, [brokenSessionText || err.responseText, err]);\n if (opt_spinnerText !== false) {\n HideTopSpinner(opt_spinnerText);\n }\n }\n });\n\n deferred.abort = xhr.abort;\n return deferred;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.services._sessionBrokenDialog = null;\n global.services._sessionRestoredDialog = null; \n\n /**\n * @fixme: рефактор плачет по этому\n * @private\n */\n global.services._isSessionAlive = function (statusCode) {\n\n if (statusCode == 401) {\n return false;\n }\n\n if (statusCode == 503) {\n WA.CR.inlineHint.show(L('ERROR_DESTRUCTIVE_FAULT'));\n log.error('SESSION', 'Service unavailavble');\n return false;\n }\n\n if (statusCode == 475) { \n var dialog = global.services._sessionRestoredDialog;\n if (!!dialog && dialog.isOpened()) {\n dialog.close();\n };\n \n if (!global.services._sessionBrokenDialog) {\n dialog = new WA.CMP.dialogs.MessageBox({ width: 450 });\n dialog.id = '475';\n dialog.isSingleInstance = true;\n dialog.removeDefaultButtons()\n .addButton('reloginLater', L('STAY_ON_PAGE'), function () {\n \n })\n .addButton('Relogin', L('LOGIN_AGAIN'), function () {\n ShowTopSpinner();\n WA.CR.window.openLogin();\n })\n .show(L('WARN_BROKEN_SESSION'), L('WARN_BROKEN_SESSION_DETAILS'), L('WARNING'), 'warning');\n } else {\n dialog = global.services._sessionBrokenDialog;\n dialog.show();\n }\n \n global.services._sessionBrokenDialog = dialog;\n return false;\n } else { \n var dialog = global.services._sessionBrokenDialog;\n if (!!dialog && dialog.isOpened()) {\n dialog.close();\n if (!global.services._sessionRestoredDialog) {\n dialog = new WA.CMP.dialogs.MessageBox();\n dialog.isSingleInstance = true;\n dialog.removeDefaultButtons()\n .addButton('ReloginLater', L('OK'))\n .show(L('WARN_RESTORED_SESSION'), L('WARN_RESTORED_SESSION_DETAILS'), L('INFO'), 'info');\n \n };\n } else { dialog = global.services._sessionRestoredDialog }\n global.services._sessionRestoredDialog = dialog;\n }\n return true;\n };\n\n /**\n * Предоставляет инструменты для работы со справочниками, карточками справочников, \n * а также предоставляет ресурсы для выполнения различных настроек в справочниках, например, работа с фильтрами.\n *\n * @namespace WebAccess.services.reference\n * @since 5.0.0.4004\n */\n global.services.reference = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы со сценариями. Например, позволяет запустить сценарий.\n *\n * @namespace WebAccess.services.script\n * @since 5.0.0.4004\n */\n global.services.script = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с объектами системы DIRECTUM. \n * Например, позволяет установить пользовательский статус на объекте.\n *\n * @namespace WebAccess.services.entity\n * @since 5.0.0.4200\n */\n global.services.entity = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с задачами. \n * Например, позволяет создать задачу с вложениями и установить права на вложения задачи.\n *\n * @namespace WebAccess.services.task\n * @since 5.0.0.4200\n */\n global.services.task = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для проведения аутентификации пользователя и его работы с реквизитами. \n * Например, позволяет сменить пароль пользователя.\n *\n * @namespace WebAccess.services.authenticaion\n * @since 5.2.0.1200\n */\n global.services.authenticaion = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с папками системы DIRECTUM. \n * Например, позволяет установить пользовательские статусы на папках.\n *\n * @namespace WebAccess.services.folder\n * @since 5.0.0.4200\n */\n global.services.folder = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с сессией пользователя. \n * Например, позволяет изменить тему профиля пользователя.\n *\n * @namespace WebAccess.services.session\n * @since 5.0.0.4214\n */\n global.services.session = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с документами.\n *\n * @namespace WebAccess.services.document\n * @since 5.0.0.4218\n */\n global.services.document = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для работы с карточками.\n *\n * @namespace WebAccess.services.cardform\n * @since 5.0.0.7100\n */\n global.services.cardform = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Предоставляет инструменты для получения разметки реквизитов на сервере.\n *\n * @namespace WebAccess.services.requisite\n * @since 5.0.0.7100\n */\n global.services.requisite = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n})(window.WebAccess);","\"use strict\";\n\n(function (global) {\n\n /**\n * Получает объект-словарь, необходимый для наполнения данными шаблона.\n * Позволяет использовать глобальную функцию L в шаблонах для перевода строк.\n *\n * @function WebAccess.templates.prepare\n * @return {object} Объект-словарь для наполнения данными шаблона.\n * @see WebAccess.templates.render\n * @since 5.0.0.4321\n */\n global.templates.prepare = function (opt_control_id) {\n var hasID = false;\n if (opt_control_id) hasID = true;\n \n var data = {\n \"ID\": $.isPlainObject(opt_control_id) ? (new Date).getTime() : opt_control_id,\n \"hasID\": hasID,\n \"L\": function () {\n return function (a) {\n return L($.trim(a));\n }\n }\n };\n\n if ($.isPlainObject(opt_control_id)) $.extend(data, opt_control_id);\n\n return data;\n };\n \n\n /**\n * Устанавливает данные для указанного шаблона.\n * Накладывает данные на указанный шаблон, генерирует html-разметку.\n *\n * @function WebAccess.templates.render \n * @param {string} templateName Путь к файлу шаблона относительно папки Site/templates\n * @param {object} opt_data Данные для шаблона\n * @param {boolean} opt_disableCache Отключить кеширование. Возможные значения: true, false. Значение по умолчанию false\n * @param {object} opt_sync Загружать данные синхронно\n * @param {object} opt_partials Подшаблоны\n * @return {deferred} Специальный deferred-объект.\n * @since 5.0.0.4213\n * @todo создать метод для синхронного запроса \n * @todo покрыть тестами\n *\n * @example\n *\n * //Добавляем данные в словарь.\n * var data = WA.TMPL.prepare();\n * data.left = 'Левая колонка';\n * data.right = 'Правая колонка';\n * data.center = 'Центральная колонка с html'; \n *\n * //Добавляем данные в шаблон.\n * // layouts/3Columns.html - шаблон с тремя колонками на блоках без таблиц.\n * WA.TMPL.render(\"layouts/3Columns.html\", data, false, false, {left: \"panels/left.html\" }).done(function(html) {\n * ShowDialog(html);\n * });\n * //В результате появится окно с тремя колонками: «Левая колонка», «Правая колонка», «Центральная колонка с html».\n */\n global.templates.render = function (templateName, opt_data, opt_disableCache, opt_sync, opt_partials) { \n\n opt_data = opt_data || global.templates.prepare();\n opt_sync = opt_sync || false;\n var jDeferred = getCustomDeferred();\n\n if (arguments.length < 1) global.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\");\n\n loadPartials(opt_partials).done(function(partials) { \n findTemplate(templateName, opt_sync, opt_disableCache).done(function (template) {\n var html = template[0].render(opt_data, partials);\n jDeferred.resolveWith(this, [html]);\n }).fail(function (err) {\n jDeferred.rejectWith(this, [err]);\n });\n\n }).fail(function (err) {\n jDeferred.rejectWith(this, [err]);\n });\n\n return jDeferred; \n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Пока опасаюсь делать публичным. Не описывать в документации\n * @since 5.2.0.1300 \n * @ignore\n * @private \n */\n global.templates.load = function (templateName, opt_disableCache, opt_sync) { \n opt_sync = opt_sync || false;\n var jDeferred = getCustomDeferred();\n if (arguments.length < 1) global.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\");\n\n findTemplate(templateName, opt_sync, opt_disableCache).done(function(_template) { \n jDeferred.resolveWith(this, [_template[0]]);\n }).fail(function (err) {\n jDeferred.rejectWith(this, [err]);\n });\n\n return jDeferred;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить спец-Deferred, похожий на Ajax от jQuery\n * @inner\n * @ignore\n * @function getCustomDeferred \n */\n var getCustomDeferred = function () {\n var jDeferred = jQuery.Deferred();\n jDeferred.success = jDeferred.done;\n jDeferred.error = jDeferred.fail;\n return jDeferred;\n }\n \n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n /**\n * Загрузка подшаблонов\n * @inner\n * @ignore\n * @function loadPartials \n */\n var loadPartials = function (opt_partials) {\n var jDeferred = jQuery.Deferred();\n var invertedNames = _.invert(opt_partials);\n var queries = [];\n if (opt_partials && !$.isEmptyObject(opt_partials)) {\n\n for (var partialKey in opt_partials) {\n var partialName = opt_partials[partialKey]; \n queries.push(findTemplate(partialName));\n }\n \n $.when.apply($, queries).done(function () {\n var partials = {};\n var args = $.makeArray(arguments); \n\n for (var i =0; i 0) {\n d.resolve(docs[0].name);\n } else {\n d.reject(L('ERR_OBJECT_NOT_FOUND'));\n }\n }).fail(function (err) {\n d.reject(err);\n });\n\n return d.promise();\n }\n\n\n /**\n * Изменить примечание версии.\n *\n * @function WebAccess.services.document.version.setNote\n * @param {integer} docId ИД документа\n * @param {integer} verNumber Номер версии документа\n * @param {string} note Текст примечания\n * @return {deferred} Специальный deferred-объект. \n * @since 5.0.0.4218\n * @example\n *\n * //Установить для первой версии документа с ИД=123123 примечание «Для рассылки».\n * WA.SRV.document.version.setNote(123123,1,\"Для рассылки\");\n */\n global.document.version.setNote = function (docId, verNumber, note) {\n return global.call(\"/Document.asmx/ChangeVersionNote\", {\n 'DocumentID': docId,\n 'VersionNumber': verNumber,\n 'Note': note\n }, false, false);\n };\n\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n /**\n * Изменить состояние версии.\n *\n * @function WebAccess.services.document.version.setState\n * @param {integer} docId ИД документа\n * @param {integer} verNumber Номер версии документа\n * @param {string} state Состояние документа. Глобальная функция VERSION_STATE\n * @return {deferred} Специальный deferred-объект. \n * @since 5.0.0.4218\n * @example \n *\n * //Установить для первой версии документа с ИД=123123 состояние «В разработке».\n * WA.SRV.document.version.setState(123123,1,VERSION_STATE.IN_DESING);\n */\n global.document.version.setState = function (docId, verNumber, state) {\n return global.call(\"/Document.asmx/ChangeVersionState\", {\n 'DocumentID': docId,\n 'VersionNumber': verNumber,\n 'State': state\n }, false, false);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.WebAccess.services);","\"use strict\";\n(function (global) {\n\n /**\n * Создать новую строку детального раздела.\n *\n * @function WebAccess.services.cardform.createTableRow\n * @param {Link} obj Ссылка на объект\n * @param {string} view Представление, в котором открыта карточка\n * @param {integer} detailNum Номер детального раздела\n * @param {string} tableName Имя таблицы детального раздела\n * @param {integer} number Номер строки таблицы\n\n * @return {Deferred} Специальный deferred-объект.\n */\n global.cardform.createTableRow = function (obj, requisites, view, detailNum, tableName, number, opt_sync) {\n var callFunc = (opt_sync === true) ? global.callSync : global.call;\n return callFunc(\"/CardForm.asmx/CreateTableRow\", {\n Obj: obj,\n Requisites: requisites || {},\n View: view,\n DetailNum: detailNum,\n Number: number\n }, false, false);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Копирует строку детального раздела.\n *\n * @function WebAccess.services.cardform.copyTableRow\n * @param {Link} obj Ссылка на объект\n * @param {string} view Представление, в котором открыта карточка\n * @param {integer} detailNum Номер детального раздела\n * @param {integer} sourceRowID ИД копириуемой строки\n * @param {string} tableName Имя таблицы детального раздела\n * @param {integer} number Номер строки таблицы\n * @return {Deferred} Специальный deferred-объект.\n * @since 5.2.0.1300\n */\n global.cardform.copyTableRow = function (obj, requisites, view, detailNum, sourceRowID, tableName, number, opt_sync) {\n var callFunc = (opt_sync === true) ? global.callSync : global.call;\n return callFunc(\"/CardForm.asmx/CopyTableRow\", {\n Obj: obj,\n View: view,\n DetailNum: detailNum,\n SourceRowID: sourceRowID,\n Number: number,\n Requisites: requisites || {}\n }, false, false);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n \n\n /**\n * Удалить строку детального раздела по ИД.\n *\n * @function WebAccess.services.cardform.deleteTableRow\n * @param {Link} obj Ссылка на объект\n * @param {string} view Представление, в котором открыта карточка\n * @param {integer} detailNum Номер детального раздела\n * @param {integer} rowID ИД строки таблицы\n * @return {Deferred} Специальный deferred-объект.\n * @since 5.2.0.1300\n */\n global.cardform.deleteTableRow = function (obj, view, detailNum, rowID, opt_sync) {\n var callFunc = (opt_sync === true) ? global.callSync : global.call;\n return callFunc(\"/CardForm.asmx/DeleteTableRow\", {\n Obj: obj,\n View: view,\n DetailNum: detailNum,\n RowID: rowID\n }, false, false);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сохранить карточку объекта.\n *\n * @function WebAccess.services.cardform.save\n * @param {Link} obj Ссылка на объект\n * @param {string} view Представление, в котором открыта карточка\n * @param {Object} reqs Значения реквизитов\n * @param {Object} cmd Дополнительные команды при сохранении. Например, удаление строки детального раздела\n * @param {boolean} needSaveObject Признак необходимости сохранения карточки\n * @param {integer} folderIdToPaste ИД папки, в которую вставлена ссылка\n *\n * @return {Deferred} Специальный deferred-объект.\n */\n global.cardform.save = function (obj, view, reqs, cmd, needSaveObject, folderIdToPaste) {\n return global.call(\"/CardForm.asmx/Save\", {\n Obj: obj,\n View: view,\n Req: reqs,\n Cmd: cmd,\n NeedSaveObject: needSaveObject,\n FolderIDToPaste: folderIdToPaste\n }, false, false, true, true);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сохранение карточки объекта и вставка этого объект в папку или ЗЗУ.\n * @param {Link} obj Ссылка на объект.\n * @param {string} view Представление, в котором открыта карточка.\n * @param {Object} reqs Значения реквизитов.\n * @param {Object} cmd Дополнительные команды при сохранении (например, удаление строки детального раздела(.\n * @param {boolean} needSaveObject Признак нужно ли сохранять карточку.\n * @param {Link} receiverObjectLink Ссылка куда надо вставить объект после сохранения.\n * @function WebAccess.services.cardform.saveAndAttach\n * @return {Deferred} jQuery Deferred объект\n */\n global.cardform.saveAndAttach = function (obj, view, reqs, cmd, needSaveObject, receiverObjectLink) {\n return global.call(\"/CardForm.asmx/SaveAndAttach\", {\n Obj: obj,\n View: view,\n Req: reqs,\n Cmd: cmd,\n NeedSaveObject: needSaveObject,\n ReceiverObjectLink: (!!receiverObjectLink && receiverObjectLink.id ? receiverObjectLink.toLinkModel() : null)\n }, false, false, true, true);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.WebAccess.services);","\"use strict\";\n(function (global) {\n /**\n * Собрать реквизиты на сервере с помощью асинхронного вызова.\n *\n * @function WebAccess.services.requisite.build\n * @param {object} model Модель для построения реквизитов\n * @return {Deferred} Специальный deferred-объект.\n * @since 5.0.0.7100\n */\n global.build = function (model) {\n return WebAccess.services.call(\"/Requisite.asmx/Build\", { \"Model\": model });\n };\n\n /**\n * Собрать реквизиты на сервере с помощью синхронного вызова.\n *\n * @function WebAccess.services.requisite.buildSync\n * @param {object} model Модель для построения реквизитов\n * @return {Deferred} Специальный deferred-объект.\n * @since 5.0.0.7100\n */\n global.buildSync = function (model) {\n return WebAccess.services.callSync(\"/Requisite.asmx/Build\", { \"Model\": model });\n };\n\n})(window.WebAccess.services.requisite);","\"use strict\";\n\n(function (global) {\n \n \t/**\n \t * Генераторы модальных окон.\n *\n \t * @namespace WebAccess.components.dialogs\n * @since 5.0.0.4000 \n *\n * @example\n * // Создать и показать новое диалоговое окно.\n * var dialog = new WebAccess.components.dialogs.BaseDialog();\n * dialog.show();\n * // Создать и показать диалог множественного выбора.\n * var multiSelectDialog = new WebAccess.components.dialogs.BaseMultiSelect([],[]);\n * multiSelectDialog.show();\n \t */\n\n global.components.dialogs = {};\n\n /**\n * Диалоговое окно \"Вы уверены что хотите выйти из веб-доступа\" [пока в игноре]\n * @function WebAccess.components.dialogs.showLogoutPrompt\n * @ignore\n * @since 5.0.0.7300\n */\n global.components.dialogs.showLogoutPrompt = function () {\n var exit = function (message) {\n if ($(\"#ExitForm\").length === 0)\n ConfirmDialogNew({ text: message, width: 400, height: 'auto' }, logout);\n };\n exit(L('CONFIRM_EXIT'));\n return global.components.dialogs;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Диалоговое окно \"Вы уверены что хотите выйти из веб-доступа\" [пока в игноре]\n * @function WebAccess.components.dialogs.showLogoutPrompt \n * @ignore\n * @since 5.0.0.7300\n */\n global.components.dialogs.showReportParams = function (reportName, id, refcode) {\n ShowReportParams(reportName, id, refcode);\n };\n\n /**\n * Генераторы контекстных меню.\n *\n * @namespace WebAccess.components.menus \n * @since 5.0.0.4000\n */\n global.components.menus = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Генераторы форм и прочих элементов ввода.\n *\n * @namespace WebAccess.components.forms \n * @since 5.0.0.4000\n */\n global.components.forms = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Генераторы контролов реквизитов.\n *\n * @since 5.0.0.4000\n * @namespace WebAccess.components.forms.requisites\n */\n global.components.forms.requisites = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обертки для элементов страниц.\n *\n * @namespace WebAccess.components.wrappers\n * @since 5.0.0.4011\n */\n global.components.wrappers = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n \n\n /**\n * Обертки для таблиц – оберток детальных разделов набора данных. \n * @since 5.0.0.4011\n * @namespace WebAccess.components.wrappers.details\n */\n global.components.wrappers.details = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обертки для элементов форм.\n * @since 5.0.0.4011\n * @namespace WebAccess.components.wrappers.form\n */\n global.components.wrappers.form = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обертки для дерева папок\n * @since 5.2.0.1600\n * @namespace WebAccess.components.wrappers.folderTree\n */\n global.components.wrappers.folderTree = {};\n\n /**\n * Обертки для существующих реквизитов.\n * @since 5.0.0.7100\n * @namespace WebAccess.components.wrappers.form.requisites\n */\n global.components.wrappers.form.requisites = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обертки для существующих реквизитов.\n * @since 5.0.0.7100\n * @private\n * @namespace WebAccess.components.wrappers.form.requisites._details\n */\n global.components.wrappers.form.requisites._details = {};\n\n /**\n * Обертки для списка объектов.\n * @since 5.0.0.4011\n * @namespace WebAccess.components.wrappers.objectList\n */\n global.components.wrappers.objectList = {};\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n /**\n * Обертки для элементов боковой панели страницы.\n * @since 5.0.0.4011\n * @namespace WebAccess.components.wrappers.sideBar\n */\n global.components.wrappers.sideBar = {};\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обертки для элементов ленты.\n * @since 5.0.0.4011\n * @namespace WebAccess.components.wrappers.toolBar\n */\n global.components.wrappers.toolBar = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Уведомления.\n * @since 5.0.0.4305\n * @namespace WebAccess.components.notifications\n */\n global.components.notifications = global.components.NTF = {}; \n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обертки для элементов страниц.\n * @since 5.2.0.1100\n * @namespace WebAccess.components.dataViews \n */\n global.components.dataViews = global.components.DV = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обертки для элементов страниц.\n * @since 5.2.0.1100\n * @namespace WebAccess.components.dataViews.gridPlugins \n */\n global.components.dataViews.gridPlugins = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обертки для элементов страниц.\n * @since 5.2.0.1100\n * @private\n * @namespace WebAccess.components.dataViews.gridPlugins._controls \n */\n global.components.dataViews.gridPlugins._controls = {};\n\n /**\n * Обертки для элементов страниц.\n * @since 5.2.0.1100\n * @private\n * @namespace WebAccess.components.dataViews.gridPlugins._editors \n */\n global.components.dataViews.gridPlugins._editors = {};\n\n /**\n * Обертки для элементов страниц.\n * @since 5.2.0.1100\n * @private\n * @namespace WebAccess.components.dataViews.gridPlugins._controls.selectList\n */\n global.components.dataViews.gridPlugins._controls.selectList = {\n passEventToContainer: function (element, event) {\n var jEl = $(element);\n var params = [jEl.is(\":checked\"), jEl.val(), jEl.text(), jEl.data('type')];\n jEl.parents('.container').trigger(event, params);\n return true;\n },\n\n SPECIAL_VALUE: {\n ALL: 'ALL',\n BLANK: 'BLANK',\n NOBLANK: 'NOBLANK'\n },\n\n DATE_SPECIAL_VALUE: {\n YESTERDAY: 'YESTERDAY',\n TODAY: 'TODAY',\n TOMORROW: 'TOMORROW',\n THIS_WEEK: 'THIS_WEEK',\n THIS_MONTH: 'THIS_MONTH',\n THIS_YEAR: 'THIS_YEAR'\n }\n };\n \n\n})(window.WebAccess);","\"use strict\";\n(function baseDataProviderDefinition(global) {\n\n /**\n * Базовый класс провайдера данных. \n * @since 5.2.0.1100\n * @class WebAccess.components.dataViews.BaseDataProvider\n * @extends BaseObject\n * @property {object} defaults Конфигурация по умолчанию\n */\n global.BaseDataProvider = BaseObject.extend({\n defaults: null,\n\n init: function (settings) {\n this._super(settings);\n this.defaults = {};\n },\n\n /**\n * Загружает данные.\n *\n * Метод в чистом виде не используется. Переопределяется наследниками. \n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.BaseDataProvider#load\n * @return {deferred} Deferred-объект\n */\n load: function (loadOptions) {\n var result = $.Deferred();\n var data = [];\n\n result.resolve(data);\n return result.promise();\n },\n\n /**\n * Получает количество записей.\n *\n * Метод в чистом виде не используется. Переопределяется наследниками. \n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.BaseDataProvider#totalCount\n * @return {deferred} Deferred-объект\n */\n totalCount: function (filter) {\n var result = $.Deferred();\n var count = 0;\n\n result.resolve(count);\n return result.promise();\n },\n\n /**\n * Загружает конфигурацию.\n *\n * Метод в чистом виде не используется. Переопределяется наследниками. \n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.BaseDataProvider#loadState\n * @return {deferred} Deferred-объект\n */\n loadState: function () {\n var result = $.Deferred();\n var state = {};\n\n result.resolve(state);\n return result.promise();\n },\n\n /**\n * Сохраняет конфигурацию.\n *\n * Метод в чистом виде не используется. Переопределяется наследниками. \n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.BaseDataProvider#saveState\n * @return {deferred} Deferred-объект\n */\n saveState: function (state) {\n var result = $.Deferred();\n var savedWithoutErrors = true;\n\n result.resolve(savedWithoutErrors);\n return result.promise();\n },\n\n /**\n * Расширяет конфигурацию.\n *\n * @method WebAccess.components.dataViews.BaseDataProvider#extendDefaults\n * @since 5.2.0.1100\n * @return {object} Расширенная конфигурация\n */\n extendDefaults: function (loadOptions) {\n var me = this;\n return $.extend({}, this.defaults, loadOptions);\n }\n });\n\n})(WA.CMP.dataViews);","(function slectListDefinition(global) {\n \"use strict\";\n\n var ELLIPSIS = '...';\n var TEMPLATES = {\n MAIN_INPUT: '/components/selectList/mainInput.compile.html',\n LIST_RECORD: '/components/selectList/listRecord.compile.html',\n POPUP_AREA: '/components/selectList/popup.compile.html'\n };\n var LOAD_MARGIN = 50;\n\n /**\n * Поле с выпадающим списком.\n *\n * @class WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl;\n * @extends BaseObject\n * @mixes WebAccess.mixins.pluginMixin\n * @since 5.2.0.1300\n * @param {string} containerSelector Блок, содержащий таблицу;\n * @param {WebAccess.components.dataViews.DataProvider} dataProvider Класс, предоставляющий данные для поля с выпадающим списком; \n * @param {Object} defaults Дополнительные параметры;\n * @property {String} className Имя класса\n * @property {String} instanceID Идентификатор поля с выпадающим списком\n * @property {String} listInstanceID Идентификатор выпадающего списка\n * @property {String} dataProvider Класс, предоставляющий данные поля с выпадающим списком \n * @property {String} minWidth Минимальная ширина выпадающего списка \n * @property {object} state Объект, хранящий параметры текущего поля\n */\n var SelectListControl = global.SelectListControl = BaseObject.extend([WA.mixins.pluginMixin], {\n className: \"SelectListControl\",\n instanceID: null,\n listInstanceID: null,\n containerSelector: null,\n dataProvider: null,\n state: {},\n minWidth: 260,\n\n _jContainer: null,\n _jDropDownIcon: null,\n _jWait: null,\n _jInput: null,\n _jOk: null,\n _jCancel: null,\n _jCheckBoxContaier: null,\n\n _spinnerTimeout: null,\n\n init: function (containerSelector, dataProvider, defaults) {\n var me = this;\n\n me._super();\n me.state = {\n selectedRecords: []\n };\n\n me.state = $.extend({}, me.state, defaults);\n\n me.dataProvider = dataProvider;\n me.instanceID = generateUniqueID();\n me.listInstanceID = generateUniqueID();\n me.containerSelector = containerSelector;\n me._jContainer = $(containerSelector);\n me._render();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отрисовка контрола и вставка его в контейнер\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_render \n * @private \n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl}\n */\n _render: function () {\n var me = this;\n var template = WA.templates.render(TEMPLATES.MAIN_INPUT, {\n ID: me.instanceID,\n initialValue: me._getInputValue()\n }).done(function (html) {\n me._jContainer.html(html);\n me._initControls();\n me._bindEvents();\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение значения основного input-а\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_getInputValue\n * @private\n * @since 5.2.0.1300\n * @return {String} значение\n */\n _getInputValue: function () {\n var me = this;\n return ((me.state.selectedRecords && me.state.selectedRecords.length) || (me.state.notSelectedRecords && me.state.notSelectedRecords.length)) ? ELLIPSIS : me.state.like;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение jquery объектов контролов\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_initControls\n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl}\n */\n _initControls: function () {\n var me = this;\n me._jDropDownIcon = $('.DropDown_Arrow', me.containerSelector);\n me._jInput = $('input.input', me.containerSelector);\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Навешивание событий на существующие контролы поля ввода\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_bindEvents\n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl}\n */\n _bindEvents: function () {\n var me = this;\n me._jDropDownIcon.click($.proxy(me.openList, me));\n me._jInput.on('change', $.proxy(me._applyLike, me));\n me._jInput.on('focus', $.proxy(me._hideEllipsis, me));\n me._jInput.on('blur', $.proxy(me._showEllipsis, me));\n me._jInput.on('keyup', $.proxy(me._applyOnEnter, me));\n\n\n if (me.state.column && me.state.column.type === 'Date') {\n // По Enter дописываем все остальные части даты. Если ввесли только день, то дописываем месяц и год. Если ввели день и месяц, то дописываем год.\n me._jInput.on('keydown.dateControl', function (e) {\n var key = e.which || e.keyCode;\n\n if (key === 13) {\n var inp = me._jInput;\n var date = ParseDateTime(inp);\n inp.val(formatDate(date));\n inp.change();\n me.close();\n }\n\n if ((key === 59 || key === 186) && e.ctrlKey) {\n var inp = me._jInput;\n inp.val(formatDate(new Date()));\n inp.change();\n me.close();\n }\n\n });\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Применение фильтрации при нажатии на enter в поле для like-ввода\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_applyOnEnter\n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl}\n */\n _applyOnEnter: function (e, d) {\n var me = this;\n var charCode = e.which || e.keyCode;\n if (charCode === 13) {\n me._jInput.trigger('change');\n }\n return me;\n },\n\n /**\n * При фокусе на поле ввода скрываем многоточие\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_hideEllipsis\n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl}\n */\n _hideEllipsis: function () {\n var me = this;\n if (me._jInput.val() === ELLIPSIS) me._jInput.val('');\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * При потере фокуса показываем многоточие, если поле пустое и есть выбранные элементы\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_showEllipsis\n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl}\n */\n _showEllipsis: function () {\n var me = this;\n if (me.state.selectedRecords && me.state.selectedRecords.length) me._jInput.val(ELLIPSIS);\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Означивание элементов выпадающего списка\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_initListControls\n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl}\n */\n _initListControls: function () {\n var me = this;\n me._jList = $(\"#\" + me.listInstanceID);\n me._jWait = me._jList.find('.jsSpinner');\n me._jCheckBoxContaier = me._jList.find('ul');\n me._jOk = me._jList.find('.jsOk');\n me._jCancel = me._jList.find('.jsCancel');\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Навешивание событий на элементы выпадающего списка\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_bindListEvents\n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl}\n */\n _bindListEvents: function () {\n var me = this;\n me._jList.on('_change', function (ev, isChecked, value, display, type) {\n me.fire(SelectListControl.EVENT.ITEM_SELECT, isChecked, value, display, type);\n });\n me._jOk.on('click', $.proxy(me._applyList, me));\n me._jCancel.on('click', $.proxy(me.close, me));\n me._jCheckBoxContaier.on('scroll', $.proxy(me._handleScroll, me));\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрываем открытые контекстные меню.\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_hideOpenedControls\n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl}\n */\n _hideOpenedControls: function () {\n ContextMenu.hideAll();\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверяет, открыт ли выпадающий список.\n *\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#isOpened \n * @since 5.2.0.1300\n * @return {Boolean} \n */\n isOpened: function () {\n var me = this;\n var jList = $(\"#\" + me.listInstanceID);\n return !!jList.length;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Открывает выпадающий список.\n *\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#openList \n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl} \n */\n openList: function () {\n var me = this;\n if (me.isOpened()) {\n me.close();\n return;\n };\n\n me.state.page = 0;\n me.state.skip = 0;\n\n me._spinnerTimeout = setTimeout(function () {\n me._jDropDownIcon.addClass('circle-spinner select-list__spinner');\n }, 200);\n\n me.dataProvider.load(me.state).done(function (records) {\n clearTimeout(me._spinnerTimeout);\n me._jDropDownIcon.removeClass('circle-spinner select-list__spinner');\n\n var partials = {\n listRecord: TEMPLATES.LIST_RECORD\n };\n\n var leftPosition = null;\n var winWidth = $(window).width();\n var rightPosition = (winWidth - (me._jContainer.offset().left + me._jContainer.outerWidth()));\n\n if (winWidth - rightPosition < me.minWidth) {\n leftPosition = me._jContainer.offset().left;\n }\n if (rightPosition === 0 && leftPosition === null) {\n rightPosition = 1; //0 воспринимается шаблоном как false и от этого right не задается\n };\n\n me.fire(SelectListControl.EVENT.BEFORE_LIST_OPEN, me, records);\n var template = WA.templates.render(TEMPLATES.POPUP_AREA,\n {\n instanceID: me.listInstanceID,\n values: records,\n okText: L('OK'),\n cancelText: L('CANCEL'),\n waitText: L('WAIT'),\n position: {\n right: rightPosition,\n left: leftPosition,\n top: me._jContainer.offset().top + me._jContainer.outerHeight(),\n width: me._jContainer.width(),\n minWidth: me.minWidth\n }\n }, null, null, partials).done(function (html) {\n $('body').append(html);\n me._initListControls();\n me._bindListEvents();\n });\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Запуск дозагрузки списка при прокрутке\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_handleScroll \n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl} \n */\n _handleScroll: function (event, data) {\n var me = this;\n var area = event.target;\n var jArea = me._jCheckBoxContaier;\n\n if (jArea.scrollTop() + jArea.innerHeight() >= area.scrollHeight - LOAD_MARGIN) {\n me._appendRecords();\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Дозагрузки списка при прокрутке\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_appendRecords \n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl} \n */\n _appendRecords: function () {\n var me = this;\n if (me.state.isPending) return;\n\n me.state.page++;\n me.state.isPending = true;\n me.state.skip = me.state.take * me.state.page;\n\n var timeout = setTimeout(function () {\n me._jWait.fadeIn(200);\n }, 500);\n\n me.dataProvider.load(me.state).done(function (records) {\n me.fire(SelectListControl.EVENT.BEFORE_RECORDS_APPEND, records, me);\n me.state.isPending = false;\n clearTimeout(timeout);\n\n me._jWait.fadeOut(400);\n _(records).each(function (record) {\n //Здесь синхронно потому, что порядок важен\n\n WA.templates.render(TEMPLATES.LIST_RECORD, record, false, true).done(function (line) {\n me._jCheckBoxContaier.append(line);\n });\n });\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Обработка значения like-поиска\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_applyLike \n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl} \n */\n _applyLike: function () {\n var me = this;\n var currentLike = (me._jInput.val() !== ELLIPSIS) ? me._jInput.val() : '';\n var recordsCount = me.state.selectedRecords.length + me.state.notSelectedRecords.length; //чтобы работал сброс по enter-у\n me.state.selectedRecords = [];\n me.state.notSelectedRecords = [];\n me.state.invertedMode = false;\n\n if (!me._validateLike(currentLike)) {\n me._jInput.val('');\n return me;\n }\n\n if (me.state.like !== currentLike || recordsCount > 0) {\n me.state.like = currentLike;\n me.fire(SelectListControl.EVENT.VALUE_CHANGED, me.getValue());\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Валидация значения like фильтра.\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_validateLike \n * @private\n * @since 5.4.0.1035\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl} \n */\n _validateLike: function (value) {\n var me = this;\n switch (me.state.column.type) {\n case \"Integer\":\n return !isNaN(+value);\n case \"Float\":\n return !isNaN(+value.replaceAll(',', '.'));\n }\n return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обработка выбранных записей\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#_applyList \n * @private\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl} \n */\n _applyList: function () {\n var me = this;\n me.state.selectedRecords = me.state.selectedRecords || [];\n me.state.notSelectedRecords = me.state.notSelectedRecords || [];\n\n //Убираем из списка выбранных снятые галочки\n me.state.selectedRecords = _(_(me.state.selectedRecords).map(function (record, index) {\n var jOption = me._jList.find('#' + (\"\" + record.Value).makeSafeString() + '-list-option');\n if (jOption.length && !jOption.is(':checked')) {\n return\n } else {\n return me.state.selectedRecords[index]\n }\n })).compact();\n\n\n //Убираем из списка невыбранных отмеченные галочки\n me.state.notSelectedRecords = _(_(me.state.notSelectedRecords).map(function (record, index) {\n var jOption = me._jList.find('#' + (\"\" + record.Value).makeSafeString() + '-list-option');\n if (jOption.length && jOption.is(':checked')) {\n return\n } else {\n return me.state.notSelectedRecords[index]\n }\n })).compact();\n\n /**\n * Запись входит в список обектов\n */\n var isExist = function (value, isInverted) {\n if (isInverted) {\n return !!_(me.state.notSelectedRecords).find(function (r) { return r.Value === value });\n } else {\n return !!_(me.state.selectedRecords).find(function (r) { return r.Value === value });\n }\n };\n\n\n //Добавляем в список новые отмеченные галочки \n me._jList.find('input[type=checkbox]:checked').each(function () {\n var value = $(this).val();\n if (!isExist(value, false)) {\n me.state.selectedRecords.push({\n Type: $(this).data('type'),\n Value: value,\n DisplayValue: $(this).attr('title')\n });\n };\n });\n\n //Добавляем в список новые неотмеченные галочки \n me._jList.find('input[type=checkbox]:not(:checked)').each(function () {\n var value = $(this).val();\n if (!isExist(value, true)) {\n me.state.notSelectedRecords.push({\n Type: $(this).data('type'),\n Value: value,\n DisplayValue: $(this).attr('title')\n });\n };\n });\n\n if (me.state.selectedRecords && me.state.selectedRecords.length) {\n me._jInput.val(ELLIPSIS);\n } else {\n me._jInput.val('');\n }\n\n me.state.like = '';\n me.close();\n me.fire(SelectListControl.EVENT.VALUE_CHANGED, me.getValue());\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обновляет состояние поля.\n *\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#updateState \n * @param {Object} newState Новое состояние\n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl} \n */\n updateState: function (newState) {\n var me = this;\n $.extend(me.state, newState);\n me._jInput.val(me._getInputValue());\n me.close();\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Закрывает выпадающий список.\n *\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#close \n * @since 5.2.0.1300\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl} \n */\n close: function () {\n var me = this;\n if (!me._jOk) return;\n me._jOk.off('click');\n me._jCancel.off('click');\n me._jList.remove();\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает значение поля.\n *\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl#getValue \n * @since 5.2.0.1300\n * @return {Object} Значение поля.\n */\n getValue: function () {\n var me = this;\n var filterType = (me.state.selectedRecords && me.state.selectedRecords.length) ? 'In' : 'Like';\n var equalRes = null;\n\n var columnType = me.state.column.type;\n //Сравнение для числовых типов по лайк вводу на равно\n if (((columnType === 'Float') || (columnType === 'Integer')) && (filterType === 'Like')) {\n if (me.state.like) {\n me.state.like = me.state.like.replaceAll(',', '.');\n }\n filterType = 'Equal';\n equalRes = $.trim(me.state.like);\n }\n\n var value = {\n 'Like': $.trim(me.state.like),\n 'In': me.state.selectedRecords,\n 'Equal': equalRes,\n 'Type': filterType\n }\n\n me.fire(SelectListControl.EVENT.ON_GET_VALUE, me, value);\n\n if (me.state.invertedMode) {\n value.In = me.state.notSelectedRecords;\n value.Type = 'Exclude'\n };\n\n return value;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n }, {\n EVENT: {\n /**\n * Срабатывает перед получением значения из поля.\n *\n * @event WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl.EVENT.ON_GET_VALUE\n * @param {Object} selectList ссылка на экземпляр класса контрола\n * @param {Object} byref_value Значение \n */\n ON_GET_VALUE: 'getValue',\n\n /**\n * Срабатывает при смене значения в поле.\n *\n * @event WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl.EVENT.VALUE_CHANGED\n * @param {Object} byref_value Значение \n */\n VALUE_CHANGED: 'change',\n\n /**\n * Срабатывает при выборе одного из значений выпадающего списка.\n *\n * @event WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl.EVENT.ITEM_SELECT\n * @param {Object} isChecked Выбранный элемент списка. \n * @param {Object} value Значение выбранного элемента. \n * @param {Object} displayValue Значение поля.\n */\n ITEM_SELECT: 'select',\n\n /**\n * Срабатывает перед открытием выпадающего списка.\n *\n * @event WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl.EVENT.BEFORE_LIST_OPEN\n * @param {Object} selectList Ссылка на экземпляр класса поля\n * @param {Object} items Список начальных элементов выпадающего списка \n */\n BEFORE_LIST_OPEN: 'beforeListOpen',\n\n /**\n * Срабатывает при добавлении новых записей в выпадающий список.\n *\n * @event WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectListControl.EVENT.BEFORE_RECORDS_APPEND\n * @param {Object} isChecked Значение \n * @param {Object} items Новые элементы списка \n */\n BEFORE_RECORDS_APPEND: 'beforeRecordsAppend'\n }\n });\n\n})(window.WA.components.dataViews.gridPlugins._controls.selectList);","(function checkboxPlugin(global) {\n \"use strict\";\n\n var SPECIAL_VALUE = global.DATE_SPECIAL_VALUE;\n var CONTROL_EVENT = global.SelectListControl.EVENT;\n\n /**\n * Плагин для добавления специавльных значений \"Все\", \"Пустые\", \"Не пустые\" для контрола SelectList\n * @class WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin\n * @extends WebAccess.Plugin\n * @property {string} name Имя плагина. \n * @since 5.2.0.1300\n */\n global.DateValuesPlugin = WA.Plugin.extend({\n name: 'SpecialValuesPlugin',\n\n _selectList: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Регистрация плагина.\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#register\n * @param {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectList} расширяемый экземпляр\n * @since 5.2.0.1300\n * @return {object} публичные методы доступные расширяемому объекту.\n */\n register: function (selectList) {\n var me = this;\n me._selectList = selectList\n .bind(CONTROL_EVENT.BEFORE_LIST_OPEN, $.proxy(me._beforeListOpen, me))\n .bind(CONTROL_EVENT.BEFORE_RECORDS_APPEND, $.proxy(me._beforeRecordsAppend, me)) \n return {};\n },\n \n /**\n * Признак того что были выбраны все записи\n * @private\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#_onRecordSelect\n * @return {Boolean}\n */\n _isAllSelected: function () {\n var me = this; \n return me._selectList._jList.find('#' + SPECIAL_VALUE.ALL + '-list-option').is(':checked');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Проверка наличия значения в списке объектов\n * @private\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#_isExist\n * @param {string} value проверяемое значение\n * @return {Boolean}\n */\n _isExist: function (value, isInverted) {\n var me = this;\n var state = me._selectList.state;\n if (isInverted) {\n return !_(state.notSelectedRecords).where({ Value: value }).length;\n } else {\n return !!_(state.selectedRecords).where({ Value: value }).length;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Дополнение списка объектов спец.значениями при открытии списка\n * @private\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#_beforeListOpen\n * @param {string} value проверяемое значение\n * @return {Boolean}\n */\n _beforeListOpen: function (selectList, byref_records) {\n var me = this;\n var isInverted = selectList.state.invertedMode; \n \n byref_records.unshift({\n id: (\"\" + SPECIAL_VALUE.THIS_YEAR).makeSafeString(),\n value: SPECIAL_VALUE.THIS_YEAR,\n displayValue: L('CHOICE_THIS_YEAR'),\n type: SPECIAL_VALUE.THIS_YEAR,\n isSelected: me._isExist(SPECIAL_VALUE.THIS_YEAR, isInverted),\n classes: 'withBottomBorder'\n })\n\n byref_records.unshift({\n id: (\"\" + SPECIAL_VALUE.THIS_MONTH).makeSafeString(),\n value: SPECIAL_VALUE.THIS_MONTH,\n displayValue: L('CHOICE_THIS_MONTH'),\n type: SPECIAL_VALUE.THIS_MONTH,\n isSelected: me._isExist(SPECIAL_VALUE.THIS_MONTH, isInverted)\n });\n\n byref_records.unshift({\n id: (\"\" + SPECIAL_VALUE.THIS_WEEK).makeSafeString(),\n value: SPECIAL_VALUE.THIS_WEEK,\n displayValue: L('CHOICE_THIS_WEEK'),\n type: SPECIAL_VALUE.THIS_WEEK,\n isSelected: me._isExist(SPECIAL_VALUE.THIS_WEEK, isInverted)\n });\n\n byref_records.unshift({\n id: (\"\" + SPECIAL_VALUE.TOMORROW).makeSafeString(),\n value: SPECIAL_VALUE.TOMORROW,\n displayValue: L('CHOICE_TOMORROW'),\n type: SPECIAL_VALUE.TOMORROW,\n isSelected: me._isExist(SPECIAL_VALUE.TOMORROW, isInverted)\n });\n\n byref_records.unshift({\n id: (\"\" + SPECIAL_VALUE.TODAY).makeSafeString(),\n value: SPECIAL_VALUE.TODAY,\n displayValue: L('CHOICE_TODAY'),\n type: SPECIAL_VALUE.TODAY,\n isSelected: me._isExist(SPECIAL_VALUE.TODAY, isInverted)\n });\n\n byref_records.unshift({\n id: (\"\" + SPECIAL_VALUE.YESTERDAY).makeSafeString(),\n value: SPECIAL_VALUE.YESTERDAY,\n displayValue: L('CHOICE_YESTERDAY'),\n type: SPECIAL_VALUE.YESTERDAY,\n isSelected: me._isExist(SPECIAL_VALUE.YESTERDAY, isInverted)\n });\n \n return me;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n });\n\n})(WA.components.dataViews.gridPlugins._controls.selectList);","(function checkboxPlugin(global) {\n \"use strict\";\n\n var SPECIAL_VALUE = global.SPECIAL_VALUE;\n var CONTROL_EVENT = global.SelectListControl.EVENT;\n\n /**\n * Плагин для добавления специальных значений \"Все\", \"Пустые\", \"Не пустые\" для поля с выпадающим списком\n *\n * @class WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin\n * @extends WebAccess.Plugin\n * @property {string} name Имя плагина. \n * @since 5.2.0.1300\n */\n global.SpecialValuesPlugin = WA.Plugin.extend({\n name: 'SpecialValuesPlugin',\n\n _selectList: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Регистрирует плагин.\n *\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#register\n * @param {WebAccess.components.dataViews.gridPlugins._controls.selectList.SelectList} Расширяемый экземпляр\n * @since 5.2.0.1300\n * @return {object} Ассоциативный массив, содержащий публичные методы.\n */\n register: function (selectList) {\n var me = this;\n me._selectList = selectList\n .bind(CONTROL_EVENT.BEFORE_LIST_OPEN, $.proxy(me._beforeListOpen, me))\n .bind(CONTROL_EVENT.BEFORE_RECORDS_APPEND, $.proxy(me._beforeRecordsAppend, me))\n .bind(CONTROL_EVENT.ON_GET_VALUE, $.proxy(me._onGetValue, me))\n .bind(CONTROL_EVENT.ITEM_SELECT, $.proxy(me._onRecordSelect, me))\n return {};\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обработка кликов по спец.значениям\n * @private\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#_onRecordSelect\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin}\n */\n _onRecordSelect: function (isChecked, value, display, type) {\n var me = this;\n if (type === SPECIAL_VALUE.ALL) {\n var jInp = me._selectList._jList.find('input[type=checkbox]');\n\n if (isChecked === true) {\n me._selectList.state.invertedMode = true;\n jInp.prop('checked', true);\n } else {\n me._selectList.state.invertedMode = false;\n jInp.prop('checked', false);\n } \n\n me._selectList.state.selectedRecords = [];\n me._selectList.state.notSelectedRecords = [];\n }\n\n if (type === SPECIAL_VALUE.BLANK || type === SPECIAL_VALUE.NOBLANK) {\n if (isChecked === true & (!me._isExist(value))) {\n if (!me._selectList.state.selectedRecords) me._selectList.state.selectedRecords = [];\n me._selectList.state.selectedRecords.push({\n Value: value,\n Type: type,\n Display: display\n }); \n }\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак того что были выбраны все записи\n * @private\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#_onRecordSelect\n * @return {Boolean}\n */\n _isAllSelected: function () {\n var me = this; \n return me._selectList._jList.find('#' + SPECIAL_VALUE.ALL + '-list-option').is(':checked');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отметка чекбоксов при подзагрузке если была выбрана галочка ALL\n * @private\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#_beforeRecordsAppend\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin}\n */\n _beforeRecordsAppend: function (byref_records, selectList) {\n var me = this;\n if (me._isAllSelected()) {\n _(byref_records).each(function (record) { \n record.isSelected = true;\n //Если были записи исключенные из выборки когда нажималась кнопка \"Все\" надо при восстановлении снять выделение;\n if (_(selectList.state.notSelectedRecords).findIndex({ 'Value': record.value }) !== -1) {\n record.isSelected = false;\n }\n });\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверка наличия значения в списке объектов\n * @private\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#_isExist\n * @param {string} value проверяемое значение\n * @return {Boolean}\n */\n _isExist: function (value, isInverted) {\n var me = this;\n var state = me._selectList.state;\n if (isInverted) {\n return !_(state.notSelectedRecords).where({ Value: value }).length;\n } else {\n return !!_(state.selectedRecords).where({ Value: value }).length;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Дополнение списка объектов спец.значениями при открытии списка\n * @private\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#_beforeListOpen\n * @param {string} value проверяемое значение\n * @return {Boolean}\n */\n _beforeListOpen: function (selectList, byref_records) {\n var me = this;\n var emptyIndex;\n var isInverted = selectList.state.invertedMode;\n\n\n var emptyRecord = _(byref_records).find(function (record, index) { \n emptyIndex = index;\n return record.value === ''; \n });\n \n var hasEmptyRecords = (!$.isEmptyObject(emptyRecord)); \n\n if (hasEmptyRecords) {\n byref_records.splice(emptyIndex, 1)\n byref_records.unshift({\n id: (\"\" + SPECIAL_VALUE.NOBLANK).makeSafeString(),\n value: SPECIAL_VALUE.NOBLANK,\n displayValue: L('CHOICE_NONBLANK'),\n type: SPECIAL_VALUE.NOBLANK,\n isSelected: me._isExist(SPECIAL_VALUE.NOBLANK, isInverted),\n classes: 'withBottomBorder'\n });\n byref_records.unshift({\n id: (\"\" + SPECIAL_VALUE.BLANK).makeSafeString(),\n value: SPECIAL_VALUE.BLANK,\n displayValue: L('CHOICE_BLANK'),\n type: SPECIAL_VALUE.BLANK,\n isSelected: me._isExist(SPECIAL_VALUE.BLANK, isInverted)\n });\n };\n\n var classes = (!hasEmptyRecords) ? 'withBottomBorder' : '';\n byref_records.unshift({\n id: (\"\" + SPECIAL_VALUE.ALL).makeSafeString(),\n value: SPECIAL_VALUE.ALL,\n displayValue: L('CHOICE_ALL'),\n type: SPECIAL_VALUE.ALL,\n isSelected: isInverted,\n classes: classes\n }); //classes: 'withBottomBorder' \n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Если ALL то чистим фильтр и убираем многоточие\n * @private\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin#_onGetValue\n * @param {string} value проверяемое значение\n * @return {WebAccess.components.dataViews.gridPlugins._controls.selectList.SpecialValuesPlugin}\n */\n _onGetValue: function (selectList, byref_filter) { \n var me = this;\n\n //Уберем из фильтра запись ALL, иначе она поломает фильтрацию\n if (selectList.state.invertedMode === true) {\n selectList.state.notSelectedRecords = _.without(selectList.state.notSelectedRecords, _.findWhere(selectList.state.notSelectedRecords, {\n Value: SPECIAL_VALUE.ALL\n }));\n }\n\n if (byref_filter.Type === 'In') {\n if (_(byref_filter.In).where({ Value: SPECIAL_VALUE.ALL }).length) { \n if (_(selectList.state.notSelectedRecords).filter(function (record) { return record.Value !== SPECIAL_VALUE.ALL }).length > 0) {\n //значит снимали выделение хотя-бы от одной из всех выделенных записей\n selectList.state.invertedMode = true; \n } else {\n byref_filter.In = null;\n byref_filter.Type = 'Like';\n selectList.state.selectedRecords = [];\n selectList.state.notSelectedRecords = [];\n selectList._jInput.val('');\n selectList.state.invertedMode = false; \n } \n }\n\n var blankAndNoBlankItems = _(byref_filter.In).filter(function (i) {\n return i.Type === SPECIAL_VALUE.BLANK || i.Type === SPECIAL_VALUE.NOBLANK \n });\n\n if (blankAndNoBlankItems.length === 2) {\n byref_filter.In = _.chain(byref_filter.In)\n .map(function (i, index) {\n if (i.Type === SPECIAL_VALUE.BLANK || i.Type === SPECIAL_VALUE.NOBLANK) return null;\n return i;\n })\n .compact()\n .value();\n }\n\n }\n return me;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n})(WA.components.dataViews.gridPlugins._controls.selectList);","(function dateControlDefinition(global) {\n \"use strict\";\n\n // Шаблон.\n var TEMPLATE = '/formBuilder/date.compile.html';\n\n /**\n * Выбирает даты для фильтра в таблице.\n *\n * @class WebAccess.components.dataViews.gridPlugins._controls.DateControl\n * @property {string} containerSelector Блок, содержащий выбор даты для фильтра в таблице. \n * @property {Object} defaults Настройки по умолчанию. \n * @since 5.2.0.1100\n */\n var DateControl = global.DateControl = BaseObject.extend({\n className: \"DateControl\",\n instanceID: null,\n containerSelector: '',\n state: {\n column: null,\n value: null\n },\n\n _jContainer: null,\n _jInput: null,\n\n init: function (containerSelector, defaults) {\n var me = this;\n me._super();\n me.state = {};\n $.extend(me.state, defaults);\n me.instanceID = generateUniqueID();\n me.containerSelector = containerSelector;\n me._jContainer = $(containerSelector);\n me._render();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отрисовка компоненты.\n * @method WebAccess.components.dataViews.gridPlugins._controls.DateControl#_initControls\n * @private\n * @since 5.2.0.1100\n */\n _render: function () {\n var me = this;\n var template = WA.templates.render(TEMPLATE, {\n id: me.instanceID,\n 'class': 'dateControl',\n showTime: (me.state.column.dateType === 'DateTime')\n }).done(function (html) {\n me._jContainer.html(html);\n me._initControls();\n me._bindEvents();\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация контролов компоненты.\n * @method WebAccess.components.dataViews.gridPlugins._controls.DateControl#_initControls\n * @private\n * @since 5.2.0.1100\n */\n _initControls: function () {\n var me = this;\n me._jInput = $('input.input', me.containerSelector);\n\n // Восстановление значения из состояния.\n me._fillInputValue();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Навершивание событий на HTML-элементы компоненты.\n * @method WebAccess.components.dataViews.gridPlugins._controls.DateControl#_bindEvents\n * @private\n * @since 5.2.0.1100\n */\n _bindEvents: function () {\n var me = this;\n me._jInput.on('change.dateControl', $.proxy(me._applyFilter, me));\n\n // По Enter дописываем все остальные части даты. Если ввесли только день, то дописываем месяц и год. Если ввели день и месяц, то дописываем год.\n me._jInput.on('keydown.dateControl', function (e) {\n var key = e.which || e.keyCode;\n if (key === 13) {\n var inp = me._jInput;\n var d = ParseDateTime(inp);\n inp.datepicker(\"setDate\", d);\n inp.data('selDate', d);\n inp.change();\n me.close();\n }\n });\n\n var isSet = me._jInput.data('isSetBeforeShowForOpenEvent');\n if (!isSet) {\n // Изменяем функцию события beforeShow, что бы вызвать наше событие open.\n var prevBeforeShow = me._jInput.datepicker('option', 'beforeShow');\n var newBeforeShow = function () {\n if (prevBeforeShow) prevBeforeShow();\n me.fire(DateControl.EVENT.OPEN, me);\n };\n me._jInput.datepicker('option', 'beforeShow', newBeforeShow);\n me._jInput.data('isSetBeforeShowForOpenEvent', true);\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Применение выбранного значение и сохранение его в состоянии.\n * @method WebAccess.components.dataViews.gridPlugins._controls.DateControl#_applyFilter\n * @private\n * @since 5.2.0.1100\n */\n _applyFilter: function () {\n var me = this;\n var displayValue = me._jInput.val();\n if (!!displayValue) {\n me.state.value = $.toJSON(parseDate(displayValue)).replaceAll('\"'); //$.toJSON возвращает дату в кавычнах, в данном случае они нам не нужны.\n } else {\n me.state.value = '';\n }\n me.fire(DateControl.EVENT.VALUE_CHANGED, me.getValue());\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обновляет состояние поля.\n *\n * @method WebAccess.components.dataViews.gridPlugins._controls.DateControl#updateState\n * @since 5.2.0.1100\n */\n updateState: function (newState) {\n var me = this;\n $.extend(me.state, newState);\n me._fillInputValue();\n me.close();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Закрывает выпадающий список поля.\n *\n * @method WebAccess.components.dataViews.gridPlugins._controls.DateControl#close\n * @since 5.2.0.1100\n */\n close: function () {\n if (!this._jInput.length) return;\n try {\n this._jInput.datepicker('hide');\n } catch (e) {\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установка значения input из состояния.\n * @method WebAccess.components.dataViews.gridPlugins._controls.DateControl#_fillInputValue\n * @private\n * @since 5.2.0.1100\n */\n _fillInputValue: function () {\n var me = this;\n var value = '';\n if (!!me.state.value) {\n var formatFunc = (me.state.column.dateType === 'DateTime' ? formatDateTime : formatDate);\n value = formatFunc(Date.fromISO(me.state.value));\n }\n me._jInput.val(value);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает значения поля.\n *\n * @method WebAccess.components.dataViews.gridPlugins._controls.DateControl#getValue\n * @since 5.2.0.1100\n */\n getValue: function () {\n var me = this;\n var value = {\n 'Type': 'Equal',\n 'Like': '',\n 'In': null,\n 'Equal': me.state.value\n };\n\n me.fire(DateControl.EVENT.GET_VALUE, me, value);\n\n return value;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n }, {\n EVENT: {\n GET_VALUE: 'getValue',\n VALUE_CHANGED: 'change',\n OPEN: 'open'\n }\n });\n})(window.WA.components.dataViews.gridPlugins._controls);","\"use strict\";\r\n(function (global) {\r\n\r\n /**\r\n * Редактор для компоненты slick-грида, для текстового реквизита\r\n * @see https://github.com/mleibman/SlickGrid/wiki/Writing-custom-cell-editors\r\n * @class WebAccess.components.dataViews.gridPlugins._editors.StringEditor\r\n * @extends BaseObject\r\n * @since 5.2.0.1300 \r\n */\r\n global.StringEditor = BaseObject.extend({\r\n id: null,\r\n renderState: null,\r\n\r\n _jContainer: null,\r\n _jInput: null,\r\n _column: null,\r\n _row: null,\r\n _gridComp: null,\r\n\r\n _value: null,\r\n _displayValue: null,\r\n _data: null,\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n init: function (args) {\r\n var me = this;\r\n\r\n ContextMenu.hideAll()\r\n\r\n me._super(args);\r\n me.renderState = $.Deferred();\r\n me.id = generateUniqueID();\r\n me._gridComp = args.grid;\r\n me._column = args.column;\r\n me._row = args.item;\r\n\r\n\r\n me.commit = args.commitChanges;\r\n me._value = me._row[me._column.id];\r\n // Чтобы 0 был нулём, а не пустым значением.\r\n if (me._value === null || _.isUndefined(me._value)) {\r\n me._value = '';\r\n }\r\n me._displayValue = me._row[me._column.field];\r\n if (me._displayValue === null || _.isUndefined(me._displayValue)) {\r\n me._displayValue = '';\r\n }\r\n\r\n me._jContainer = $(args.container);\r\n me._data = $.extend({}, me._column.requisite); //Копируем метаинформацию реквизита, т.к. копируется ссылка и изменение полей _data приводит к изменению _column.requisite, что нежелательно (#111079).\r\n\r\n me.render().done(function () {\r\n me._getWrapper().bind('change', function (e, i, values) {\r\n var last = me._value;\r\n var current = values.value;\r\n\r\n last = (last === null) ? \"\" : last;\r\n current = (current === null) ? \"\" : current;\r\n\r\n if (me.type === 'float' || me.type === 'integer') {\r\n last = +last;\r\n current = +current;\r\n } else {\r\n last = \"\" + last;\r\n current = \"\" + current;\r\n }\r\n\r\n if (last != current) {\r\n me._updateData(me._row, values);\r\n };\r\n });\r\n });\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Отрисовка реквизита, при активации редактора на ячейке грида\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#render\r\n * @since 5.2.0.1300 \r\n */\r\n render: function () {\r\n var me = this;\r\n\r\n var t = Hogan.compile('
    ');//FIXME: понятно же не так\r\n me._jContainer.html(t.render({\r\n id: me.id,\r\n value: me._getValueForRender()\r\n }));\r\n\r\n me._jInput = $('#' + me.id);\r\n\r\n // Для планшетов и сматфонов отключаем клавиатурную навигацию.\r\n if (!WA.ENV.isTouch()) {\r\n me.initKeyNavigation();\r\n }\r\n\r\n return me.renderState.resolve();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получает значение реквизита для рендеринга редактора.\r\n * @private\r\n */\r\n _getValueForRender: function () {\r\n return this._displayValue;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n /**\r\n * Инициализация событий отвечающих за клавиатурную навигацию по ячейке\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#initKeyNavigation\r\n * @since 5.2.0.1300 \r\n */\r\n initKeyNavigation: function () {\r\n var me = this;\r\n var attempts = 0;\r\n var lastKey = null;\r\n\r\n // функция для читабельности кода\r\n var leaveOut = function (e) { };\r\n\r\n // функция для читабельности кода\r\n var stayHere = function (e) { e.stopImmediatePropagation(); };\r\n\r\n var isAllTextSelected = function (jInput) {\r\n var range = jInput.range();\r\n return (range.end - range.start === range.length && range.length);\r\n };\r\n\r\n var hasText = function (jInput) {\r\n return !!jInput.val();\r\n };\r\n\r\n me._jInput.bind(\"keydown.nav\", function (e) {\r\n var key = e.keyCode;\r\n var jInput = $(this);\r\n var c = $.ui.keyCode;\r\n\r\n if (key === c.ENTER) {\r\n var _isAllTextSelected = isAllTextSelected(jInput);\r\n setTimeout(function () { // что бы дробное число выделялось при нажатии на Enter.\r\n if (_isAllTextSelected) {\r\n jInput.caret(0);\r\n } else {\r\n jInput.focus().select();\r\n }\r\n }, 100);\r\n e.stopImmediatePropagation();\r\n }\r\n\r\n if (key === c.ESCAPE) {\r\n jInput.focus().select();\r\n e.stopImmediatePropagation();\r\n }\r\n\r\n if (key === c.DOWN || key === c.UP) {\r\n me._handleUpDownKey(e);\r\n }\r\n\r\n if ((key === c.LEFT || key === c.RIGHT) && !e.shiftKey && !e.altKey && !e.metaKey && !e.ctrlKey) {\r\n if (isAllTextSelected(jInput) || !hasText(jInput)) {\r\n leaveOut(e);\r\n } else {\r\n if (jInput.caret() === jInput.val().length && key === c.RIGHT) {\r\n return leaveOut(e);\r\n }\r\n if (jInput.caret() === 0 && key === c.LEFT) {\r\n return leaveOut(e);\r\n }\r\n stayHere(e);\r\n }\r\n }\r\n }).focus();\r\n\r\n setTimeout(function () { // Без setTimeout не выделяется дробное число из-за плагина autoNumeric\r\n me._jInput.range(0, me._jInput.val().length); //Выделить текст\r\n });\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n _handleUpDownKey: function (e) {\r\n var key = e.keyCode;\r\n var c = $.ui.keyCode;\r\n\r\n if (key === c.DOWN) {\r\n // чтобы не добавлялось бесконечное число строк при нажатии вниз(изза \r\n // change, который срабатывает в focusout) \r\n this._jInput.off('focusout.autoNumeric').blur();\r\n } else {\r\n // чтобы не удалялась добавленная строка со значением\r\n this._jInput.blur();\r\n }\r\n\r\n //Чтобы не скролился документ\r\n e.preventDefault();\r\n },\r\n\r\n /**\r\n * Установить фокус на поле ввода\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#focus\r\n * @since 5.2.0.1300 \r\n */\r\n focus: function () {\r\n this._jInput.focus();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получить объект-обертку над контролом реквизита, с необходимыми методами типа getValue;\r\n * @since 5.2.0.1300\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#_getWrapper\r\n */\r\n _getWrapper: function () {\r\n var me = this;\r\n if (!!me._wrapper) return me._wrapper;\r\n\r\n var parentCurrent = {\r\n _current: me._gridComp._parent.settings.current\r\n };\r\n\r\n var data = {\r\n controls: [me.id],\r\n displayValue: \"\",\r\n isRequired: false,\r\n isVisible: true,\r\n isReadOnly: false,\r\n value: \"\",\r\n row_id: me._row.id,\r\n sectionNumber: me._gridComp._parent.settings.sectionNumber,\r\n hasCalculation: me._column.hasCalculation\r\n };\r\n\r\n return me._wrapper = new WA.CMP.wrappers.form.requisites.Text(me._column.id, data, parentCurrent);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Признак того что значение в ячейке изменилось\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#isValueChanged\r\n * @since 5.2.0.1300 \r\n */\r\n isValueChanged: function () {\r\n var me = this;\r\n var newValue = me.serializeValue();\r\n\r\n if (newValue.value != me._value) {\r\n me._value = newValue.value;\r\n return true;\r\n }\r\n return false;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Применить существующее значение к гриду\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#applyValue\r\n * @since 5.2.0.1300 \r\n */\r\n applyValue: function (row, newData) {\r\n var me = this;\r\n\r\n me._updateData(row, newData);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n _updateData: function (row, newData) {\r\n var me = this;\r\n row[me._column.id] = newData.value;\r\n row[me._column.field] = newData.displayValue;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * @stub\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#loadValue\r\n * @since 5.2.0.1300 \r\n */\r\n loadValue: function () {\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получение значение из реквизита\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#serializeValue\r\n * @since 5.2.0.1300 \r\n */\r\n serializeValue: function () {\r\n var me = this;\r\n var control = me._getWrapper();\r\n var value = control.getValue();\r\n return { value: value, displayValue: value };\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * @stub\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#validate\r\n * @since 5.2.0.1300 \r\n */\r\n validate: function () {\r\n return { valid: true, msg: null };\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Очистка поля\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#destroy\r\n * @since 5.2.0.1300 \r\n */\r\n destroy: function () {\r\n var me = this;\r\n me._updateData(me._row, me.serializeValue());\r\n me._jContainer.empty();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Проброшенный метод из клиентской ОМ\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#disable\r\n * @since 5.2.0.1300 \r\n */\r\n disable: function () {\r\n this._getWrapper().disable();\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Проброшенный метод из клиентской ОМ\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#enable\r\n * @since 5.2.0.1300 \r\n */\r\n enable: function () {\r\n this._getWrapper().enable();\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Проброшенный метод из клиентской ОМ\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#setCustomAction\r\n * @since 5.2.0.1300 \r\n */\r\n setCustomAction: function (callback, opt_tooltip) {\r\n this._getWrapper().setCustomAction(callback, opt_tooltip);\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получить связанную с текущим реквизитом колонку.\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#_getColumn\r\n * @private\r\n * @since 5.5.0.2703\r\n * @return {object} Колонка, связанная с реквизитом строки детального раздела.\r\n */\n _getColumn: function () {\r\n var me = this;\n var currentTable = me._gridComp._parent.getTable();\r\n return currentTable.columns[me._column.id];\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n });\r\n\r\n})(window.WA.components.dataViews.gridPlugins._editors)","\"use strict\";\n(function (global) {\n\n /**\n * Редактор для компоненты slick-грида, для реквизита типа \"Многострочный текст\"\n * @class WebAccess.components.dataViews.gridPlugins._editors.FloatEditor\n * @extends WebAccess.components.dataViews.gridPlugins._editors.StringEditor\n * @since 5.2.0.1300 \n */\n global.TextEditor = global.StringEditor.extend({});\n\n})(window.WA.components.dataViews.gridPlugins._editors)","\"use strict\";\n(function (global) {\n\n /**\n * Редактор для ячейки с реквизитом типа pick. \n * @class WebAccess.components.dataViews.gridPlugins._editors.PickEditor\n * @extends WebAccess.components.dataViews.gridPlugins._editors.StringEditor\n * @since 5.2.0.1300\n */\n global.PickEditor = global.StringEditor.extend({\n _renderer: null,\n _wrapper: null,\n\n init: function (args) {\n var me = this;\n me._super(args);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Рендеринг и добавление контрола реквизита в ячейку грида\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._editors.PickEditor#render\n */\n render: function () {\n var me = this;\n\n\n me._data.id = me.id;\n \n me._data.selectedKey = me._value;\n me._data.selectedValue = me._displayValue;\n\n me._renderer = new WebAccess.components.forms.requisites.Pick();\n\n me._renderer.renderAsync(me._data).done(function (html) {\n me._jContainer.html('
    ' + html + '
    ');\n me._jContainer.find('input.input').addClass('noBorder');\n \n me._jInput = $('#' + me.id);\n me.initKeyNavigation();\n me.renderState.resolve();\n });\n return me.renderState\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n initKeyNavigation: function() {\n this._super();\n\n this._jInput.bind(\"keydown.nav\", function (e) {\n var key = e.keyCode;\n var c = $.ui.keyCode;\n\n if ((key === c.DOWN || key === c.UP) && e.altKey) {\n e.stopImmediatePropagation();\n };\n }) \n },\n\n _handleUpDownKey: function () {\n //не вызываем родительский метод, чтобы не поломать ALT+вниз\n },\n\n /**\n * Получить объект-обертку над контролом реквизита, с необходимыми методами типа getValue;\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._editors.PickEditor#_getWrapper\n */\n _getWrapper: function () {\n var me = this;\n if (!!me._wrapper) return me._wrapper;\n var parentCurrent = me._gridComp._parent.settings.current;\n return me._wrapper = new WA.CMP.wrappers.form.requisites.Pick(me._column.id, me.id, parentCurrent);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак того что значение ячейки изменилось\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._editors.PickEditor#isValueChanged\n */\n isValueChanged: function () {\n var me = this;\n var values = me.serializeValue();\n \n if (me._value !== values.value) {\n me._value = values.value;\n return true;\n }\n return false\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Очистка поля\n * @method WebAccess.components.dataViews.gridPlugins._editors.PickEditor#destroy\n * @since 5.2.0.1300 \n */\n destroy: function () {\n var me = this;\n me._jInput.HidePickContainer();\n me._super();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Метод вызывается когда значение в ячейке изменилось, и передает данные из\n * редактора в набор данных грида.\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._editors.PickEditor#serializeValue\n */\n serializeValue: function () {\n var me = this; \n var control = me._getWrapper(); \n return {\n 'value': control.getValue(),\n 'displayValue': control.getDisplayValue()\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n clearValues: function () {\n var wrapper = this._getWrapper();\n wrapper.clearValues.apply(wrapper, arguments);\n },\n\n addValue: function () {\n var wrapper = this._getWrapper();\n wrapper.addValue.apply(wrapper, arguments);\n },\n\n \n });\n\n})(window.WA.components.dataViews.gridPlugins._editors)","\"use strict\";\n(function (global) {\n var TEMPLATE = 'formBuilder/date.compile.html';\n\n /**\n * Редактор для компоненты slick-грида, для реквизита типа \"Дата\"\n * @class WebAccess.components.dataViews.gridPlugins._editors.DateEditor\n * @extends WebAccess.components.dataViews.gridPlugins._editors.StringEditor\n * @since 5.2.0.1300\n */\n global.DateEditor = global.StringEditor.extend({\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отрисовка реквизита, при активации редактора на ячейке грида\n * @method WebAccess.components.dataViews.gridPlugins._editors.DateEditor#render\n * @since 5.2.0.1300 \n */\n render: function () {\n var me = this;\n\n var data = {};\n data.showTime = (me._column.dateType === 'DateTime');\n data.id = me.id;\n\n if (typeof me._value === \"object\") {\n data.value = formatDate(me._value);\n } else {\n data.value = me._value;\n };\n \n WA.templates.render(TEMPLATE, data).done(function (html) {\n me._jContainer.html('
    ' + html + '
    ');\n me._jContainer.find('input.input').addClass('noBorder');\n me._jInput = $('#' + me.id);\n\n me.initPicker();\n\n // Для планшетов и сматфонов отключаем клавиатурную навигацию.\n if (!WA.ENV.isTouch()) {\n me.initKeyNavigation();\n }\n\n me.renderState.resolve();\n });\n\n return me.renderState.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Включить дополнение по Enter\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._editors.DateEditor#initPicker \n */\n initPicker: function () {\n var me = this;\n\n var isAllTextSelected = function (jInput) {\n var range = jInput.range();\n if (range.end - range.start === range.length && range.length) {\n return true;\n } else {\n return false;\n }\n }\n\n var hasText = function (jInput) {\n return !!jInput.val();\n }\n\n // По Enter дописываем все остальные части даты. Если ввесли только день, то дописываем месяц и год. Если ввели день и месяц, то дописываем год.\n me._jInput.on('keydown.dateControl', function (e) {\n var inp = me._jInput;\n var c = $.ui.keyCode;\n\n var key = e.which || e.keyCode;\n\n function adjustDate() {\n var d = ParseDateTime(inp);\n inp.datepicker(\"setDate\", d);\n inp.data('selDate', d);\n //Шамов А.: Убрал потому, что \"ставлю курсор в поле Дата, по стрелке вправо перехожу к другому полю и по стрелке вниз добавляю вторую пустую строку\" - \n // способом можно добавить бесконечное количество пустых строк (#103514).\n //inp.trigger('change');\n me.close();\n }\n\n //ENTER\n if (key === 13) {\n if (!isAllTextSelected(inp) && hasText(inp)) {\n adjustDate();\n }\n }\n\n //LEFT or RIGHT\n if (key === c.LEFT || e.keyCode === c.RIGHT) {\n if (inp.caret() === inp.val().length && key === c.RIGHT) {\n return adjustDate();\n }\n if (inp.caret() === 0 && key === c.LEFT) {\n return adjustDate();\n }\n }\n\n //DOWN or UP\n if (key === c.DOWN || key === c.UP) {\n return adjustDate();\n }\n\n // CTRL+;\n if ((key === 59 || key === 186) && e.ctrlKey) {\n var now = new Date();\n inp.datepicker(\"setDate\", now);\n inp.data('selDate', now);\n inp.trigger('change');\n me.close();\n }\n\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Закрыть окно выбора-даты\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._editors.DateEditor#close \n */\n close: function () {\n if (!this._jInput.length) return;\n try {\n this._jInput.datepicker('hide');\n } catch (e) {\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение значение из реквизита\n * @method WebAccess.components.dataViews.gridPlugins._editors.DateEditor#serializeValue\n * @since 5.2.0.1300 \n */\n serializeValue: function () {\n var me = this;\n var control = me._getWrapper();\n var value = control.getValue();\n return { value: value, displayValue: value };\n },\n\n /**\n * Очистка поля\n * @method WebAccess.components.dataViews.gridPlugins._editors.DateEditor#destroy\n * @since 5.2.0.1300 \n */\n destroy: function () {\n var me = this;\n me.close();\n me._super();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить объект-обертку над контролом реквизита, с необходимыми методами типа getValue;\n * @since 5.2.0.1300\n * @method WebAccess.components.dataViews.gridPlugins._editors.DateEditor#_getWrapper\n */\n _getWrapper: function () {\n var me = this;\n if (!!me._wrapper) return me._wrapper;\n var parentCurrent = me._gridComp._parent.settings.current;\n return me._wrapper = new WA.CMP.wrappers.form.requisites.Date(me._column.id, me.id, parentCurrent);\n }\n });\n\n})(window.WA.components.dataViews.gridPlugins._editors)","\"use strict\";\n(function (global) {\n\n /**\n * Редактор для компоненты slick-грида, для реквизита типа \"Целое число\"\n * @class WebAccess.components.dataViews.gridPlugins._editors.IntegerEditor\n * @extends WebAccess.components.dataViews.gridPlugins._editors.StringEditor\n * @since 5.2.0.1300 \n */\n global.IntegerEditor = global.StringEditor.extend({\r\n init: function (args) {\r\n var me = this;\n me.type = 'integer';\n me._super(args);\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отрисовка реквизита, при активации редактора на ячейке грида\n * @method WebAccess.components.dataViews.gridPlugins._editors.FloatEditor#render\n * @since 5.2.0.1300 \n */\n render: function () {\r\n var me = this;\n me._super();\n var currentColumn = me._getColumn();\n if (!currentColumn.isDisabled()) {\r\n var opt = $.extend({}, $.fn.autoNumeric.defaults, { mDec: '0', aPad: false });\n me._jInput.autoNumeric('init', opt);\r\n }\r\n return me.renderState;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает значение реквизита для рендеринга редактора.\n * @private\n */\n _getValueForRender: function () {\r\n return this._value;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение значение из реквизита\n * @method WebAccess.components.dataViews.gridPlugins._editors.FloatEditor#serializeValue\n * @since 5.2.0.1300 \n */\n serializeValue: function () {\r\n var me = this;\n var currentColumn = me._getColumn();\n var control = me._getWrapper();\n var value = control.getValue();\n if (!currentColumn.isDisabled()) {\n //Шамов А.: Что бы сработало форматирование дробного числа в плагине autoNumeric.\n me._jInput.autoNumeric('format');\r\n }\n return { value: value, displayValue: me._jInput.val() };\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\r\n /**\r\n * Очистка поля\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.IntegerEditor#destroy\r\n * @since 5.2.0.9100 \r\n */\r\n destroy: function () {\r\n var me = this;\r\n var autoNumeric = me._jInput.data('autoNumeric');\r\n if (typeof autoNumeric === 'object') {\r\n // Для того, чтобы обязательно отработал focusout\r\n // у контрола, установив значение в реквизит\r\n me._jInput.trigger('focusout.autoNumeric');\r\n }\r\n me._super();\r\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\r\n\n})(window.WA.components.dataViews.gridPlugins._editors)","\"use strict\";\r\n(function (global) {\r\n\r\n\r\n /**\r\n * Редактор для компоненты slick-грида, для реквизита типа \"Дробное число\"\r\n * @class WebAccess.components.dataViews.gridPlugins._editors.FloatEditor\r\n * @extends WebAccess.components.dataViews.gridPlugins._editors.StringEditor\r\n * @since 5.2.0.1300 \r\n */\r\n global.FloatEditor = global.StringEditor.extend({\r\n init: function (args) {\r\n var me = this;\r\n me.type = 'float';\r\n me._super(args);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Отрисовка реквизита, при активации редактора на ячейке грида\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.FloatEditor#render\r\n * @since 5.2.0.1300 \r\n */\r\n render: function () {\r\n var me = this;\r\n me._super();\r\n var currentColumn = me._getColumn();\r\n if (!currentColumn.isDisabled()) {\r\n var opt = $.extend({}, $.fn.autoNumeric.defaults);\r\n if (me._column.precision) {\r\n opt = { mDec: '' + me._column.precision, aPad: true }\r\n }\r\n me._jInput.autoNumeric('init', opt);\r\n }\r\n return me.renderState;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получает значение реквизита для рендеринга редактора.\r\n * @private\r\n */\r\n _getValueForRender: function () {\r\n return this._value;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получение значение из реквизита\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.FloatEditor#serializeValue\r\n * @since 5.2.0.1300 \r\n */\r\n serializeValue: function () {\r\n var me = this;\n var currentColumn = me._getColumn();\r\n var control = me._getWrapper();\r\n var value = control.getValue();\r\n if (!currentColumn.isDisabled()) {\r\n //Шамов А.: Что бы сработало форматирование дробного числа в плагине autoNumeric.\r\n me._jInput.autoNumeric('format');\r\n }\r\n return { value: value, displayValue: me._jInput.val() };\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\r\n /**\r\n * Очистка поля\r\n * @method WebAccess.components.dataViews.gridPlugins._editors.IntegerEditor#destroy\r\n * @since 5.2.0.9100 \r\n */\r\n destroy: function () {\r\n var me = this;\r\n var autoNumeric = me._jInput.data('autoNumeric');\r\n if (typeof autoNumeric === 'object') {\r\n // Для того, чтобы обязательно отработал focusout\r\n // у контрола, установив значение в реквизит\r\n me._jInput.trigger('focusout.autoNumeric');\r\n }\r\n me._super();\r\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n });\r\n\r\n})(window.WA.components.dataViews.gridPlugins._editors)","\"use strict\";\n(function (global) {\n\n /**\n * Редактор для ячейки с реквизитом \"Ссылка на документ\". \n * @class WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor\n * @extends WebAccess.components.dataViews.gridPlugins._editors.StringEditor\n * @since 5.5.0.1000\n */\n global.BaseObjectSelectEditor = global.StringEditor.extend({\n _renderer: null,\n _wrapper: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (args) {\n var me = this;\n me._super(args);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Рендеринг и добавление контрола реквизита в ячейку грида\n * @since 5.5.0.1000\n * @method WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor#render\n */\n render: function () {\n var me = this;\n\n me._data.id = me.id,\n me._data.defaultValue = me._displayValue;\n me._data.hiddenInputValue = me._value; //если выбор множествeнный то тут должны быть перечисления id через \";\"\n me._data.selectedRecordID = me._value;\n\n //Для отключения старой логики работы ведущих/ведомых. Новая находится в Core.cards.initLeaderDrivenLogic.\n me._data.leaderRequisites = '[]';\n me._data.drivenRequisites = '[]';\n\n // Означиваем номер строки детально раздела в контексте вызова. Тут а не в конструкторе, т.к. в базовом в конструкторе вызывается render.\n var settings = $.parseJSON(me._data.settings);\n\n // Устанавливаемость признак что значение есть, т.к. для детального раздела он из вне передается некорректный.\n settings.selected = ('' + me._data.selectedRecordID) !== '';\n\n var queryContext = $.parseJSON(settings.queryContext);\n if (queryContext) {\n queryContext.detailRecordId = +me._row.id;\n settings.queryContext = $.toJSON(queryContext);\n }\n me._data.settings = $.toJSON(settings);\n\n me._renderer = me._createRenderer();\n if (me._renderer) {\n me._renderer.renderAsync(me._data).done(function (html) {\n me._jContainer.html('
    ' + html + '
    ');\n me._jContainer.find('input.input').addClass('noBorder');\n\n me._getWrapper().bind('change', function (e, i, values) {\n me._updateData(me._row, values);\n });\n\n me._jInput = $('#' + me.id);\n\n // Для планшетов и сматфонов отключаем клавиатурную навигацию.\n if (!WA.ENV.isTouch()) {\n me.initKeyNavigation();\n }\n\n me.renderState.resolve();\n });\n } else {\n me.renderState.reject();\n }\n return me.renderState;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает рендерер.\n * @private\n */\n _createRenderer: function () {\n return null;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация событий отвечающих за клавиатурную навигацию по ячейке\n * @method WebAccess.components.dataViews.gridPlugins._editors.StringEditor#initKeyNavigation\n * @since 5.5.0.1000 \n */\n initKeyNavigation: function () {\n var me = this;\n var c = $.ui.keyCode;\n var jEditContainer = me._jContainer.find('.editor');\n\n var isAllTextSelected = function (jInput) { return me.isFocused(); }\n var hasText = function (jInput) { return !!jInput.val(); }\n var hasNoValue = function () { return !me._getWrapper().getValue() }\n var leaveOut = function (e) { };\n var stayHere = function (e) { e.stopImmediatePropagation(); }\n var disableSlickOnEnter = function (e) { e.stopImmediatePropagation(); }\n\n var passKeyToInput = function (key) {\n var press = jQuery.Event(\"keydown\");\n press.ctrlKey = false;\n press.which = key;\n me._jInput.trigger(press);\n }\n\n var selectAllText = function () {\n me._jInput.blur();\n me.focus();\n jEditContainer.focus();\n }\n\n var focusToInput = function () {\n me.unFocus();\n me._jInput.focus();\n }\n\n //При нажатии на enter переводим фокус на инпут\n jEditContainer.on(\"keydown.nav\", function (e) {\n var key = e.which\n if (key === c.ENTER) {\n if (isAllTextSelected() || hasNoValue()) {\n focusToInput();\n disableSlickOnEnter(e);\n }\n }\n })\n\n //Если выделен весь текст, то при вводе пробрасываем событие в инпут и фокус тоже\n jEditContainer.on(\"keydown.nav\", function (e) {\n\n if (!isAllTextSelected()) return;\n var key = e.which\n if (key === c.BACKSPACE || key === c.DELETE) {\n if (!me._getWrapper().isDisabled()) {\n me._getWrapper().clear(true);\n }\n }\n\n var ignoredKeys = [c.LEFT, c.RIGHT, c.DOWN, c.CONTROL, c.UP, c.TAB, c.ESCAPE, c.SHIFT, c.PAGE_UP, c.PAGE_DOWN, c.END, c.CAPS_LOCK, c.ENTER];\n if (ignoredKeys.indexOf(key) === -1 && !e.shiftKey && !e.metaKey && !e.ctrlKey) {\n\n //чтобы при нажатии на alt+down поле не очищалось а работала выпадайка вниз\n if (!e.altKey && !me._getWrapper().isDisabled()) {\n me._getWrapper().clear();\n }\n\n focusToInput();\n passKeyToInput(key);\n }\n }).focus().select();\n\n //Если нажимаем на enter находясь в инпуте - убираем фокус с него и выделяем весь текст\n me._jInput.bind(\"keydown.nav\", function (e) {\n var key = e.which;\n if (key === c.ENTER) {\n selectAllText();\n disableSlickOnEnter(e);\n }\n\n if (e.keyCode === c.LEFT || e.keyCode === c.RIGHT) {\n //if (hasNoValue()) {\n leaveOut(e);\n /*} else {\n stayHere(e);\n } */\n }\n });\n\n //При клике в инпут, надо снимать выделение с текста\n me._jInput.on('focus.nav', function () {\n me.unFocus();\n });\n\n //Инициализация фокуса\n if (hasNoValue()) {\n focusToInput();\n } else {\n selectAllText();\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить фокус на поле ввода(а если честно, то на спан с текстом)\n * @method WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor#focus\n * @since 5.5.0.1000 \n */\n focus: function () {\n this._getSelectedItemElements().addClass('selectedText');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n isFocused: function () {\n return this._getSelectedItemElements().hasClass('selectedText');\n },\n\n /**\n * Получить объект-обертку над контролом реквизита, с необходимыми методами типа getValue\n * @since 5.5.0.1000\n * @method WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor#unFocus\n */\n unFocus: function () {\n this._getSelectedItemElements().removeClass('selectedText');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает выбранные элементы.\n * @since 5.5.0.1000\n * @private\n * @method WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor#_getSelectedItemElements\n */\n _getSelectedItemElements: function () {\n return this._jContainer.find('.rs_SelItems span');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить объект-обертку над контролом реквизита, с необходимыми методами типа getValue\n * @since 5.5.0.1000\n * @method WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor#_getWrapper\n * @private\n */\n _getWrapper: function () {\n var me = this;\n if (!!me._wrapper) return me._wrapper;\n var parentCurrent = me._gridComp._parent.settings.current;\n return me._wrapper = me._createWrapper(parentCurrent);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает объект-обертку над контролом реквизита, с необходимыми методами типа getValue\n * @private\n */\n _createWrapper: function (parentCurrent) {\n return null;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак того что значение ячейки изменилось\n * @since 5.5.0.1000\n * @method WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor#isValueChanged\n */\n isValueChanged: function () {\n var me = this;\n var values = me.serializeValue();\n //if (!me._value) me._value = null; //Шамов А.: Убрал, что бы осталась совместимость метода getValue, который должен вернуть пустую строку.\n\n\n if (me._value != values.value) {\n me._value = values.value;\n return true;\n }\n return false\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Метод вызывается когда значение в ячейке изменилось, и передает данные из\n * редактора в набор данных грида.\n * @since 5.5.0.1000\n * @method WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor#applyValue\n */\n applyValue: function (row, newData) {\n var me = this;\n me._updateData(row, newData);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Метод вызывается когда значение в ячейке изменилось, и передает данные из\n * редактора в набор данных грида.\n * @since 5.5.0.1000\n * @method WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor#serializeValue\n */\n serializeValue: function () {\n\n var me = this;\n var control = me._getWrapper();\n\n return {\n 'value': control.getValue(),\n 'displayValue': control.getDisplayValue()\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Очистка поля\n * @method WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor#destroy\n * @since 5.5.0.1000 \n */\n destroy: function () {\n var me = this;\n if ($('.rs_container').is(':visible').length) {\n me._jInput.HideContainer();\n }\n me._super();\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n})(window.WA.components.dataViews.gridPlugins._editors)","\"use strict\";\n(function (global) {\n\n /**\n * Редактор для ячейки с реквизитом множественного выбора. \n * @class WebAccess.components.dataViews.gridPlugins._editors.ReferenceEditor\n * @extends WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor\n * @since 5.2.0.1300\n */\n global.ReferenceEditor = global.BaseObjectSelectEditor.extend({\n _renderer: null,\n _wrapper: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает рендерер.\n * @private\n */\n _createRenderer: function () {\n return new WebAccess.components.forms.requisites.ReferenceSelect();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает объект-обертку над контролом реквизита, с необходимыми методами типа getValue\n * @private\n */\n _createWrapper: function (parentCurrent) {\n var me = this;\n return new WA.CMP.wrappers.form.requisites.Reference(me._column.id, me.id, parentCurrent);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проброшенный метод из клиентской ОМ\n * @method WebAccess.components.dataViews.gridPlugins._editors.ReferenceEditor#setCustomAction\n * @since 5.2.0.1300 \n */\n setReferences: function (references) {\n this._getWrapper().setReferences(references);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проброшенный метод из клиентской ОМ\n * @method WebAccess.components.dataViews.gridPlugins._editors.ReferenceEditor#setCustomAction\n * @since 5.2.0.1300 \n */\n setFilter: function (filter, opt_refCode) {\n this._getWrapper().setFilter(filter, opt_refCode);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проброшенный метод из клиентской ОМ\n * @method WebAccess.components.dataViews.gridPlugins._editors.ReferenceEditor#setCustomAction\n * @since 5.2.0.1300 \n */\n setValues: function (filter, opt_refCode) {\n this._getWrapper().setValues(filter, opt_refCode);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проброшенный метод из клиентской ОМ\n * @method WebAccess.components.dataViews.gridPlugins._editors.ReferenceEditor#setCustomAction\n * @since 5.2.0.1300 \n */\n setMainReference: function (referenceName) {\n this._getWrapper().setMainReference(referenceName);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проброшенный метод из клиентской ОМ\n * @method WebAccess.components.dataViews.gridPlugins._editors.ReferenceEditor#setCustomAction\n * @since 5.2.0.1300 \n */\n addLastObjectsPseudoReference: function (lastReferences) {\n this._getWrapper().addLastObjectsPseudoReference(lastReferences);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проброшенный метод из клиентской ОМ\n * @method WebAccess.components.dataViews.gridPlugins._editors.ReferenceEditor#setCustomAction\n * @since 5.2.0.1300 \n */\n removeLastObjectsPseudoReference: function (lastReferences) {\n this._getWrapper().removeLastObjectsPseudoReference(lastReferences);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Привязка вызова справочника в модальном окне по клику на иконке в поле ввода.\n * @method WebAccess.components.dataViews.gridPlugins._editors.ReferenceEditor#bindReferenceGridDialog\n * @since 5.4.0.1012 \n */\n bindReferenceGridDialog: function () {\n this._getWrapper().bindReferenceGridDialog();\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n})(window.WA.components.dataViews.gridPlugins._editors)","\"use strict\";\n(function (global) {\n\n /**\n * Редактор для ячейки с реквизитом \"Ссылка на документ\". \n * @class WebAccess.components.dataViews.gridPlugins._editors.DocumentEditor\n * @extends WebAccess.components.dataViews.gridPlugins._editors.BaseObjectSelectEditor\n * @since 5.5.0.1000\n */\n global.DocumentEditor = global.BaseObjectSelectEditor.extend({\n _renderer: null,\n _wrapper: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает рендерер.\n */\n _createRenderer: function () {\n return new WebAccess.components.forms.requisites.DocumentSelect();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает объект-обертку над контролом реквизита, с необходимыми методами типа getValue\n */\n _createWrapper: function (parentCurrent) {\n var me = this;\n return new WA.CMP.wrappers.form.requisites.Document(me._column.id, me.id, parentCurrent);\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n})(window.WA.components.dataViews.gridPlugins._editors)","\"use strict\";\n(function sortingPlugin(global) {\n\n /**\n * Плагин для сохранения и загрузки сортировки в таблице.\n *\n * @class WebAccess.components.dataViews.gridPlugins.SortingPlugin\n * @extends WebAccess.Plugin\n * @since 5.2.0.1100\n */\n global.SortingPlugin = WA.Plugin.extend({\n name: 'SortingPlugin',\n\n // Расширяемый грид\n _grid: null,\n _useServer: false,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (useServer) {\n this._useServer = useServer;\n },\n\n /**\n * Регистрирует плагин.\n *\n * @method WebAccess.components.dataViews.gridPlugins.SortingPlugin#register\n * @param {grid} Таблица.\n * @since 5.2.0.1100\n * @return {object} Ассоциативный массив, содержащий публичные методы.\n */\n register: function (grid) {\n var me = this;\n me._grid = grid;\n\n me._grid.bind(WA.CMP.DV.Grid.EVENT.BEFORE_GRID_INIT, me._onGridBeforeInit, me);\n me._grid.bind(WA.CMP.DV.Grid.EVENT.COLUMN_INIT, $.proxy(me._onColumnInit, me));\n me._grid.bind(WA.CMP.DV.Grid.EVENT.GRID_INIT, $.proxy(me._onGridInit, me));\n return {\n 'reSortColumns': me._reSort\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Хэндлер события до инициализации грида.\n * @method WebAccess.components.dataViews.gridPlugins.EditPlugin#_onGridBeforeInit\n * @param {string} containerSelector селектор контейнера для грида.\n * @param {Object} dataView представление данных.\n * @param {Object} columns описания всех колонок.\n * @param {Object} settings настройки грида.\n * @private\n * @since 5.2.0.1100\n */\n _onGridBeforeInit: function (containerSelector, dataView, columns, byref_settings) {\n var me = this;\n if (!me._useServer) {\n // byref_settings.multiColumnSort = true;\n };\n },\n\n /**\n * Делаем все колонки сортируемыми\n * @method WebAccess.components.dataViews.gridPlugins.CheckboxPlugin#_onColumnInit\n * @param {object} byref_column колонка\n * @private\n * @since 5.2.0.1100\n */\n _onColumnInit: function (byref_column) {\n var isSpecialColumn = (byref_column.id.charAt(0) === '_');\n byref_column.sortable = !isSpecialColumn;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Хэндлер события инициализации грида.\n * @method WebAccess.components.dataViews.gridPlugins.SortingPlugin#onGridInit\n * @param {SlickGrid} slickGrid копмопнента грид.\n * @private\n * @since 5.2.0.1100\n */\n _onGridInit: function (slickGrid) {\n this._bindOnSort();\n this._restoreSorting();\n\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Восстанавливает сохраненную сортировку при инициализации грида.\n * @method WebAccess.components.dataViews.gridPlugins.SortingPlugin#_restoreSorting \n * @private\n * @since 5.2.0.1100\n */\n _restoreSorting: function () {\n var me = this;\n if (!me._useServer) {\n me._grid.bind(WA.CMP.DV.Grid.EVENT.AFTER_DATA_LOADED, function () {\n me._grid.reSortColumns();\n });\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Пересортировка\n * @method WebAccess.components.dataViews.gridPlugins.SortingPlugin#_restoreSorting \n * @private\n * @since 5.2.0.1304\n */\n _reSort: function () {\n var grid = this;\n var me = this; \n var sortingColumns = _(grid.state.Sort).map(function (sortInfo) {\n return {\n columnId: sortInfo.Name,\n sortAsc: sortInfo.IsAsc\n };\n });\n\n grid.grid.setSortColumns(sortingColumns);\n\n _(sortingColumns).each(function (_column) {\n var column = _(grid._columns).findWhere({ id: _column.columnId });\n if (!column) return;\n\n var comparer = function (g1, g2) {\n var v1 = g1[column.field];\n var v2 = g2[column.field];\n var type = requisiteTypeToString(column.type);\n // Дробные и целые числа могут быть записаны в формате \"1 234 567,34\". Такая запись не конвертируется в число, поэтому берем значение без форматирования.\n if (type === 'float' || type === 'integer' || type === 'largeinteger') {\n v1 = g1[column.id];\n v2 = g2[column.id];\n }\n \n return WA.utils.compareData(v1, v2, type);\n };\n\n grid.grid.setSortColumn(_column.columnId, _column.sortAsc);\n grid.dataView.sort(comparer, _column.sortAsc);\n });\n\n //проверяем была ли добавлена новая строка в таблицу, добавленной строке устанавливаем ранг - 1000000\n if (grid._table !== null) {\n var rowsArr = grid._table.rows.toArray();\n for (var i = 0; i < rowsArr.length; i++) {\n var row = rowsArr[i];\n if (row._isNew) {\n var rowData = grid.dataView.getItemById(row.id);\n if (rowData) {\n rowData.rank = 1000000;\n }\n };\n };\n //сортируем в обратном порядке, так новая строка всегда будет последней\n grid.dataView.fastSort('rank', false);\n };\n\n grid.grid.invalidate();\n grid.grid.render();\n },\n\n /**\n * Навешивается на событие смены сортировки что бы сохранить состояние и загрузить новые данные.\n * @method WebAccess.components.dataViews.gridPlugins.SortingPlugin#_bindOnSort \n * @private\n * @since 5.2.0.1100\n */\n _bindOnSort: function () {\n var me = this;\n\n me._grid.grid.onSort.subscribe(function (e, args) {\n me._grid.updateState({\n Sort: [{ Name: args.sortCol.id, IsAsc: args.sortAsc }]\n });\n\n if (me._useServer) {\n me._grid.reloadData();\n } else {\n\n var comparer = function (g1, g2) {\n var v1 = g1[args.sortCol.field];\n var v2 = g2[args.sortCol.field];\n var type = requisiteTypeToString(args.sortCol.type);\n // Дробные и целые числа могут быть записаны в формате \"1 234 567,34\". Такая запись не конвертируется в число, поэтому берем значение без форматирования.\n //CREVIEW Шамов А.: Тут Int64?\n if (type === 'float' || type === 'integer') {\n v1 = g1[args.sortCol.id];\n v2 = g2[args.sortCol.id];\n }\n return WA.utils.compareData(v1, v2, type);\n };\n\n me._grid.dataView.sort(comparer, args.sortAsc);\n }\n });\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n})(WA.components.dataViews.gridPlugins);","\"use strict\";\n(function groupingPlugin(global) {\n\n //TODO: Шамов А.: В целом не понятно как она работает. Часть функций в гриде часть тут. Надо бы как-то сделать понятнее, например максимально перенести из грида сюда. \n\n /**\n * Плагин для группировки в таблице.\n *\n * @class WebAccess.components.dataViews.gridPlugins.GroupingPlugin\n * @extends WebAccess.Plugin\n * @property {string} name Имя пункта меню.\n * @property {string} grid Таблица.\n * @since 5.2.0.1100\n */\n global.GroupingPlugin = WA.Plugin.extend({\n name: 'GroupingPlugin',\n _grid: null,\n _oldGrouping: null,\n\n _groupItemMetadataProvider: null,\n\n /**\n * Регистрирует плагин.\n *\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#register\n * @param {grid} Таблица\n * @since 5.2.0.1100\n * @return {object} Ассоциативный массив, содержащий публичные методы.\n */\n register: function (grid) {\n var me = this;\n me._super();\n me._grid = grid;\n\n me._groupItemMetadataProvider = new Slick.Data.GroupItemMetadataProvider();\n\n var E = WA.CMP.DV.Grid.EVENT;\n grid.bind(E.BEFORE_GRID_INIT, $.proxy(me._onGridBeforeInit, me));\n grid.bind(E.GRID_INIT, $.proxy(me._onGridInit, me));\n grid.bind(E.COLUMN_INIT, $.proxy(me._onColumnInit, me));\n grid.bind(E.GET_VISIBLE_COLUMNS_FOR_DIALOG, $.proxy(me._onGetVisibleColumnsForDialog, me));\n grid.bind(E.SET_VISIBLE_COLUMNS_FROM_DIALOG, $.proxy(me._onSetVisibleColumnsFromDialog, me));\n grid.bind(E.AFTER_DATA_LOADED, $.proxy(me._onAfterDataLoaded, me));\n\n return {\n 'unGroupColumnsById': me._unGroupColumnsById_exported,\n 'updateGroupingInfo': me._updateGroupingInfo_exported,\n 'toogleGrouping': me._toogleGrouping_exported\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Модификация видимых колонок грида для отображения колонок с группировкой.\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_onGetVisibleColumnsForDialog\n * @since 5.2.0.1100\n * @private \n */\n _onGetVisibleColumnsForDialog: function (columns) {\n var me = this;\n me._includeGroupedColumns(columns);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Модификация видимых колонок грида для разгруппировки и задания видимых колонок.\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_onGetVisibleColumnsForDialog\n * @since 5.2.0.1100\n * @private \n */\n _onSetVisibleColumnsFromDialog: function (columns) {\n var me = this;\n me._excludeGroupedColumns(columns);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Разгруппировка списка колонок.\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_unGroupColumnsById_exported\n * @since 5.2.0.1100\n * @private \n */\n _unGroupColumnsById_exported: function (columnIds) {\n var me = this;\n var grouping = _(me.state.GroupColumns).map(function (column) {\n if (columnIds.indexOf(column.Name) !== -1) {\n var selector = '#' + me.grid.getUID() + column.Name;\n selector = selector.replaceAll(' ', '\\\\ ');\n $(selector).remove();\n me.dataView.removeGroupBy(column.Name);\n return null\n } else {\n return column;\n }\n });\n\n me.updateState({ GroupColumns: _(grouping).compact() });\n me.reloadData();\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Начальная модификация колонок грида для поддержки группировки\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_onColumnInit\n * @since 5.2.0.1100\n * @private \n */\n _onColumnInit: function (byref_column) {\n var isSpecialColumn = (byref_column.id.charAt(0) === '_');\n byref_column.type === 'Date'\n var isFloatColumn = (byref_column.type === 'Float');\n\n byref_column.headerCssClass = (isSpecialColumn ? 'notDraggable' : ''); // Отключяем группировку по реквизиту типа \"Дробное число\", т.к. делать сравнение 2 дробных чисел сложно.\n\n if (!isSpecialColumn) {\n byref_column['grouping'] = {\n getter: byref_column.id,\n formatter: function (g) {\n return byref_column.name + \": \" + g.rows[0][byref_column.field];\n },\n comparer: function (g1, g2) {\n var direction = byref_column.grouping.sortAsc ? 1 : -1;\n // Сравнивает по отображаемому значению.\n var v1 = g1.rows[0][byref_column.field];\n var v2 = g2.rows[0][byref_column.field];\n \n return direction * WA.utils.compareData(v1, v2, byref_column.type)\n },\n collapsed: true,\n sortAsc: true\n };\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установка дополнительных опции грида. Поскольку это событие, то приходится менять объект по ссылке.\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_onGridBeforeInit\n * @since 5.2.0.1100\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.GroupingPlugin} GroupingPlugin\n */\n _onGridBeforeInit: function (containerSelector, byref_dataView, columns, byref_options) {\n byref_options['enableDraggableGroupBy'] = true;\n byref_dataView['groupItemMetadataProvider'] = this._groupItemMetadataProvider;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Метод срабатывает после создания экземпляра slickGrid-а в классе грида. \n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_onGridInit\n * @param {slickGrid} объект грида \n * @since 5.2.0.1100\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.GroupingPlugin} GroupingPlugin\n */\n _onGridInit: function (slickGrid) {\n var me = this;\n log.debug('GRID', 'onGridInit method called');\n\n // register the group item metadata provider to add expand/collapse group handlers\n me._grid.grid.registerPlugin(this._groupItemMetadataProvider);\n\n //При пермещении колонок в области группировки обновляем состояние в соответсвии с новым порядком колонок\n me._grid.grid.onColumnsReordered.subscribe(function () {\n log.debug('GRID', 'Event onColumnsReordered emited(GROUPING_PLUGIN)');\n var grouping = me._getGrouping();\n var newGrouping = _(grouping).pluck('Name');\n\n log.debug('GRID', 'Updating columns grouping');\n\n /** \n * Если группировка изменилась, то будем сворачивать расскрытые группы и \n * обновим саму группировку в state.\n * Иначе ничего не меняем, чтобы смена местами обычных колонок (не группируемых) работала \n * не сворачивая групп \n * @see #97566 Если поменять колонки местами при раскрытой группе в гриде, то группа закроется\n */\n if (!_.isEqual(newGrouping, me._oldGrouping)) {\n me._grid.updateState({ GroupColumns: grouping });\n me._grid.dataView.collapseAllGroups();\n me._grid.reloadData();\n }\n\n me._oldGrouping = newGrouping;\n });\n\n // Событие разгруппировки.\n me._grid.grid.onUnGroup.subscribe(function (event, data) {\n log.debug('GRID', 'Event onUnGroup emited');\n var jColumn = data.column;\n var columnId = jColumn.find('span').attr('name');\n me._grid.dataView.removeGroupBy(columnId, null, jColumn);\n var index = $('.slick-header-columns div.slick-header-column', me._grid.containerSelector).index(jColumn);\n me._grid.showColumn(columnId, index);\n });\n\n // Смена сортировки по колонке с группировкой.\n me._grid.grid.onGroupSort.subscribe(function (e, args) {\n log.debug('GRID', 'Event onGroupSort emited');\n var prevGrouping = me._grid.state.GroupColumns;\n var groupCol = _(prevGrouping).findWhere({ Name: args.columnId });\n groupCol.SortIsAsc = args.sortAsc;\n\n me._grid.updateState({ GroupColumns: prevGrouping }, true); //true - потому изменяется объект по ссылке и сравнение внутри updateState не корректно сработает.\n me._grid.reloadData();\n });\n\n me._restoreGrouping();\n me._handleGroupToggle();\n me._oldGrouping = _(me._getGrouping()).pluck('Name');\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Востановление группировки при перезагрузке страницы \n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_restoreGrouping\n * @since 5.2.0.1100\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.GroupingPlugin} GroupingPlugin\n */\n _restoreGrouping: function () {\n log.debug('GRID', 'Restoring grouping');\n var me = this;\n\n /**\n * Показ скрытие области группировки\n */\n me._grid.toogleGrouping(me._grid.state.IsGroupPanelVisible);\n\n /**\n * Восстановление представления шапки и логической группировки грида\n */\n me._grid.dataView.setGrid(me._grid.grid);\n if (me._grid.state.GroupColumns) {\n\n // #97328 Если не стало прав на реквизит, по которому идет группировка, то грид ломается\n var shrinked = _(_(me._grid.state.GroupColumns).map(function (column) {\n var gridColumn = _(me._grid._columns).findWhere({ 'id': column.Name });\n if (!!gridColumn) return column;\n else return null;\n })).compact();\n\n var columns = _(shrinked).map(function (column) {\n var gridColumn = _(me._grid._columns).findWhere({ 'id': column.Name });\n // Восстановление направления сортировки по группе.\n gridColumn.grouping.sortAsc = column.SortIsAsc\n return gridColumn;\n });\n\n me._grid.dataView.restoreGroupedColumns(columns);\n }\n\n /**\n * Восстановление раскрытых строк\n */\n _(me._grid.state.GroupColumns).each(function (column, level) {\n _(column.Opened).each(function (chain) {\n me._grid.dataView.expandCollapseGroup(level, chain, false);\n });\n });\n\n me._setupGroupsReordering();\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Обработка раскрытия групп. \n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_handleGroupToggle\n * @since 5.2.0.1100 \n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.GroupingPlugin} GroupingPlugin\n */\n _handleGroupToggle: function () {\n var me = this;\n me._grid.dataView.prepareDataBeforeToggle = function (groupingKey, isCollapsed) {\n me._grid.updateGroupingInfo(groupingKey, isCollapsed);\n return me._grid.reloadData();\n };\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Реализация возможности изменения порядка колонок, по которым идет группировка\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_setupGroupsReordering\n * @private\n * @since 5.2.0.1100 \n * @return {WebAccess.components.dataViews.gridPlugins.GroupingPlugin} GroupingPlugin\n */\n _setupGroupsReordering: function () {\n log.debug('GRID', 'Groups sorting setup');\n var me = this;\n\n $('.slick-groupby').sortable({\n containment: me._grid.containerSelector,\n connectWith: \".connected\",\n cursor: 'move',\n tolerance: \"pointer\",\n distance: 20,\n cancel: '.slick-placeholder, .group-arrow',\n placeholder: \"slick-sortable-placeholder ui-state-default slick-header-column\",\n forcePlaceholderSize: true,\n stop: function (event, element) {\n me._grid.dataView.beginUpdate();\n me._grid.dataView.resortGroupColumns();\n },\n receive: function (event, ui) {\n\n // Группировка - перенос из шапки грида в область группировки.\n if (ui.item.hasClass('notDraggable')) {\n $(ui.sender).sortable('cancel');\n var toast = new WA.CMP.NTF.Toast();\n toast.showWarning(L('GROUPING_IS_NOT_AVAILABLE_FOR_THIS_COLUMN'));\n return;\n };\n\n me._grid.updateState({ \"PageIndex\": 0 });\n\n var jColumn = $(ui.item);\n var columnId = jColumn.find('span').attr('name');\n var index = $('.slick-groupby div.slick-header-column', me._grid.containerSelector).index(jColumn);\n\n // Смотрим какая была сортировка у этой колонки, что бы её применить в группе.\n var sortColumnInfo = _(me._grid.state.Sort).findWhere({ Name: columnId });\n var column = _(me._grid._columns).findWhere({ id: columnId });\n column.grouping.sortAsc = (!sortColumnInfo || sortColumnInfo.IsAsc);\n\n me._grid.dataView.handleGroupByDrop($(), ui.item, index);\n me._grid.dataView.bindGroupSort(jColumn, me._grid._columns);\n\n jColumn.css({ 'width': 'auto' });\n me._grid.hideColumn(columnId);\n }\n });\n\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение информации о группировке от грида, и выдача его в виде\n * пригодном для сохранения в state\n * @private\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#getGrouping\n * @return {array} groups\n */\n _getGrouping: function () {\n var me = this;\n\n var groups = _(me._grid.dataView.getGrouping()).map(function (col) {\n return {\n Name: col.getter,\n SortIsAsc: col.sortAsc,\n Opened: []\n };\n });\n\n me._updatePlaceHolder(groups.length);\n return groups;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать/скрыть текст-подсказку в области группировки\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_updatePlaceHolder\n * @param {int} groupsCount кол-во групп\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.GroupingPlugin} GroupingPlugin\n */\n _updatePlaceHolder: function (groupsCount) {\n var me = this;\n if (groupsCount > 0) {\n $(\".slick-placeholder\", me._grid.containerSelector).hide();\n } else {\n $(\".slick-placeholder\", me._grid.containerSelector).show();\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Метод вызывается внешним классом groupitemmetadataprovider, для того, \n * чтобы обновить информацию по сворачиванию/разворачиванию определенных групп\n * для дальнейшего сохранения в обеъект state;\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#updateGroupingInfo_exported\n * @param {String} groupingKey ключ вида \"123213:|:323423\" - иерархия раскрытия групп\n * @param {isExpand} призна того раскрывается группа или сворчивается\n * @this {WebAccess.components.dataViews.Grid}\n * @since 5.2.0.1100\n * @private\n * @return {WebAccess.components.dataViews.Grid}\n */\n _updateGroupingInfo_exported: function (groupingKey, isExpand) {\n log.debug('GRID', 'Updating grouping info: ' + groupingKey);\n var me = this;\n var values = groupingKey.split(':|:');\n var lastIndex = values.length - 1;\n\n var currentGrouping = me.state.GroupColumns;\n if (isExpand) {\n currentGrouping[lastIndex].Opened.push(groupingKey);\n } else {\n var index = currentGrouping[lastIndex].Opened.indexOf(groupingKey);\n currentGrouping[lastIndex].Opened.splice(index, 1);\n }\n\n me.updateState({\n GroupColumns: currentGrouping,\n LastCollapsedGroupingKey: (!isExpand ? groupingKey : '__NOT_KEY__')\n }, true);\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Событие после загрузки данных.\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_onAfterDataLoaded\n * @since 5.2.0.1100\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.GroupingPlugin} GroupingPlugin\n */\n _onAfterDataLoaded: function () {\n // Сбрасываем последную закрытую группу.\n this._grid.updateState({\n LastCollapsedGroupingKey: '__NOT_KEY__'\n });\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показ/скрытие области группировки\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#toogleGrouping_exported\n * @this {WebAccess.components.dataViews.Grid}\n * @since 5.2.0.1100\n * @private\n * @return {WebAccess.components.dataViews.Grid}\n */\n _toogleGrouping_exported: function (needToEnable) {\n log.debug('GRID', 'Toggling group area: ' + needToEnable);\n var me = this;\n var jPHolder = $('.slick-placeholder', me.containerSelector);\n var jGroupBy = $('.slick-groupby', me.containerSelector);\n\n jPHolder.text(L('DRAG_A_COLUMN_HEADER_HERE_TO_GROUP_BY_THAT_COLUMN'));\n if (me.state.GroupColumns.length) {\n jPHolder.hide();\n } else {\n jPHolder.show();\n }\n\n if (needToEnable) {\n jGroupBy.show();\n\n me.grid.setOptions({\n showGroupByRow: true,\n groupByRowHeight: jGroupBy.outerHeight()\n });\n me.grid.resizeViewport();\n me.updateState({ IsGroupPanelVisible: true }, true);\n } else {\n jGroupBy.hide();\n\n me.grid.setOptions({ showGroupByRow: false });\n me.grid.resizeViewport();\n me.updateState({ IsGroupPanelVisible: false }, true);\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Включает группы в список видимых колонок для диалога.\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_includeGroupedColumns\n * @this {WebAccess.components.dataViews.Grid}\n * @since 5.2.0.1100\n * @private\n * @return {WebAccess.components.dataViews.Grid}\n */\n _includeGroupedColumns: function (byref_visibleColumns) {\n var me = this;\n\n _(me._grid.state.GroupColumns).each(function (groupInfo) {\n var column = _(me._grid._columns).find(function (col) {\n return col.id === groupInfo.Name;\n });\n byref_visibleColumns.push(column);\n });\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Исключает группы из списока видимых колонок и разгруппировывает группы.\n * @method WebAccess.components.dataViews.gridPlugins.GroupingPlugin#_excludeGroupedColumns\n * @this {WebAccess.components.dataViews.Grid}\n * @since 5.2.0.1100\n * @private\n * @return {WebAccess.components.dataViews.Grid}\n */\n _excludeGroupedColumns: function (byref_visibleColumns) {\n var me = this;\n var unGroupingColumns = [];\n\n _(me._grid.state.GroupColumns).each(function (groupInfo) {\n\n // Ищем групп в списке возвращенных видимых колонок.\n var index = _(byref_visibleColumns).findIndex(function (visibleColumn) {\n return visibleColumn.id === groupInfo.Name;\n });\n if (index !== -1) {\n // Если нашли, то просто удаляем её из видимых колонок.\n byref_visibleColumns.splice(index, 1);\n } else {\n // Если НЕ нашли, то добавляем в список разгруппируемых.\n unGroupingColumns.push(groupInfo.Name);\n }\n });\n\n // Выполняем разгруппировку.\n me._grid.unGroupColumnsById(unGroupingColumns);\n\n return me;\n }\n\n });\n\n})(WA.components.dataViews.gridPlugins);","\"use strict\";\n(function footerPlugin(global) {\n\n /**\n * Плагин для области навигации между страницами таблицы.\n *\n * @property {string} name Имя плагина.\n * @property {integer} pageIndex Текущая страница\n * @property {integer} pageSize Количество строк таблицы на странице\n * @since 5.2.0.1100\n * @class WebAccess.components.dataViews.gridPlugins.FooterPlugin\n * @extends WebAccess.Plugin\n */\n global.FooterPlugin = WA.Plugin.extend({\n name: 'FooterPlugin',\n\n pageIndex: 0,\n pageSize: 100, // Для реального количества записей на странице используется значение из константы REFERENCE_RECORDS_PAGE_SIZE в бекэнде.\n\n _grid: null,\n _jPager: null,\n _jPagerControls: null,\n _selectExpression: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function () {\n this._super();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Регистрирует плагин.\n *\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#register\n * @param {WebAccess.components.dataViews.Grid} grid Таблица.\n * @since 5.2.0.1100\n * @return {object} Ассоциативный массив, содержащий публичные методы.\n */\n register: function (grid) {\n var me = this;\n me._super();\n\n me._grid = grid;\n\n grid.bind(WA.CMP.DV.Grid.EVENT.STATE_LOADED, $.proxy(me._afterGridStateLoaded, me));\n grid.bind(WA.CMP.DV.Grid.EVENT.AFTER_DATA_LOADED, $.proxy(me._afterGridDataLoaded, me));\n grid.bind(WA.CMP.DV.Grid.EVENT.GRID_INIT, $.proxy(me._onGridInit, me));\n\n return {\n 'updateFooter': $.proxy(me._updateFooter_exported, me)\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обрабатывает события до инициализации таблицы.\n *\n * @param {object} slickGrid Таблица\n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#_onGridInit\n */\n _onGridInit: function (slickGrid) {\n var me = this;\n\n me.initPager().done(function () {\n\n // Обновление состояния кнопок, в зависимости от количества оставшихся записей.\n me._grid.bind(WA.CMP.DV.Grid.EVENT.DATA_LOADED, function (index, recordsCount, records) {\n\n me.renderTemplates().done(function () {\n\n index = index || \"0\"\n index = +index;\n\n recordsCount = +recordsCount;\n\n if (recordsCount < me.pageSize && !me._grid.state.GroupColumns.length && index === 0) {\n me._setCountLabel(recordsCount);\n }\n\n me.pageIndex = index;\n\n if (index === 0 && recordsCount <= me.pageSize) {\n me._jPagerControls.navPanel.hide();\n } else {\n me._jPagerControls.navPanel.show();\n }\n\n if (index > 0) {\n // используемая версия jQuery не умеет работать с css-классами элементов svg. Приходится использовать data-атрибуты.\n me._jPagerControls.prev.add(me._jPagerControls.first).attr('data-disabled', 'false');\n } else {\n me._jPagerControls.prev.add(me._jPagerControls.first).attr('data-disabled', 'true');\n }\n\n var recordsFrom = (index * me.pageSize) + 1;\n var recordsTo = (index + 1) * me.pageSize;\n\n if (!isNaN(recordsCount)) {\n // Если реально вернулось больше чем нужно, то значит у нас есть следующая страница.\n if (recordsCount <= me.pageSize) {\n recordsTo = recordsFrom + recordsCount - 1;\n me._jPagerControls.next.add(me._jPagerControls.last).attr('data-disabled', 'true');\n } else {\n me._jPagerControls.next.add(me._jPagerControls.last).attr('data-disabled', 'false');\n }\n }\n\n var currentPageText = (recordsCount > 1) ? (recordsFrom + ' - ' + recordsTo) : (index + recordsCount);\n me._jPagerControls.currentPage.text(currentPageText);\n\n // Если реально вернулось больше чем нужно, то значит у нас есть следующая страница, а эту лишную запись удалим, т.к. она загрузится на след. странице.\n if (recordsCount > me.pageSize) {\n // Удаляем лишнюю строку.\n records.pop();\n }\n });\n });\n\n // Перемотка кверху при переключении страницы.\n me._grid.bind(WA.CMP.DV.Grid.EVENT.PAGE_CHANGE, function () {\n $(\".slick-viewport\", me._grid.containerSelector).scrollTop(0);\n });\n\n });\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обрабатывает события завершения загрузки состояния таблицы.\n *\n * @param {object} slickGrid Таблица.\n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#_onGridInit\n */\n _afterGridStateLoaded: function () {\n var me = this;\n\n // Проверяем надо ли восстанавливать номер страницы.\n var gridId = me._grid.containerSelector; //другого ИД у нас тут еще нет.\n var url = new WA.URL();\n var pageIndexSaved = $.parseJSON(decodeURIComponent(url.getParamInHash('pageIndexSaved')) || '[]');\n if (pageIndexSaved.indexOf(gridId) === -1) {\n // Сбрасываем состояние страницы.\n WA.cache.setItem('grid.pageIndex.' + gridId, 0);\n // Добавляем текущий грид в состояние сохранения номера страницы грида.\n pageIndexSaved.push(gridId);\n url.setParamInHash('pageIndexSaved', encodeURIComponent($.toJSON(pageIndexSaved)));\n window.location.href = url.asString();\n }\n\n // Восстанавливаем номер страницы.\n me._grid.updateState({\n PageIndex: +WA.cache.getItem('grid.pageIndex.' + gridId) || 0\n });\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обрабатывает события до завершения загрузки данных.\n *\n * @param {object} slickGrid Таблица.\n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#_onGridInit\n */\n _afterGridDataLoaded: function () {\n var me = this;\n\n // Сохраняем номер страницы для последующего восставновления при перезагрузке страницы браузера.\n var gridId = me._grid.containerSelector;\n WA.cache.setItem('grid.pageIndex.' + gridId, me._grid.state.PageIndex);\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Публичная функция для обновления пагинатора.\n * @param {object} slickGrid грид\n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#_updateFooter_exported\n */\n _updateFooter_exported: function () {\n this.renderTemplates();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Включает область навигации.\n *\n * @since 5.2.0.1100\n * @param {String} containerSelector Блок, содержащий таблицу.\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#initPager\n * @return {WebAccess.components.dataViews.gridPlugins.FooterPlugin} FooterPlugin Навигация между страницами таблицы.\n */\n initPager: function () {\n var me = this;\n var jGridContainer = $(me._grid.containerSelector);\n\n if (me._grid.state.PageIndex) me.pageIndex = +me._grid.state.PageIndex;\n if (me._grid.state.Take) me.pageSize = +me._grid.state.Take;\n me._jPager = $('
    ');\n jGridContainer.append(me._jPager);\n\n return me.renderTemplates();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Генерирует область навигации из шаблона.\n *\n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#renderTemplates\n * @return {WebAccess.components.dataViews.gridPlugins.FooterPlugin} FooterPlugin Навигация между страницами таблицы.\n */\n renderTemplates: function () {\n var me = this;\n var state = me._grid.state;\n\n var selectOn = function (limit) {\n if (limit == me.pageSize) return 'selected=\"selected\"';\n };\n\n var partials = {\n left: \"referenceRecords/status.html\",\n center: \"referenceRecords/filters.html\",\n right: \"referenceRecords/paginator.html\"\n }\n\n var currentFilter = state.CurrentFilter || { 'Name': '', 'DisplayValue': '', 'DisplayHint': '', 'isEnabled': false }\n var currentRecordsRange = (me.pageIndex * me.pageSize) > 0 ? ((me.pageIndex * me.pageSize) + 1) + ' - ' + ((me.pageIndex + 1) * me.pageSize) : '1 - ' + me.pageSize;\n var filterName = $.trim(currentFilter.Name);\n\n var data = WA.TMPL.prepare({\n ID: 'reference_footer',\n 'class': 'dxgvPagerBottomPanel',\n HasFilterExpression: (currentFilter.DisplayValue !== ''),\n CurrentFilterName: filterName.trunc(50),\n CurrentFilterNameHint: filterName,\n FilterExpression: currentFilter.DisplayValue,\n FilterHint: currentFilter.DisplayHint,\n IsFilterEnabled: currentFilter.IsEnabled,\n CurrentRecordsRange: currentRecordsRange,\n CurrentPage: me.pageIndex + 1,\n PageIndex: me.pageIndex,\n Options: [\n { Name: 15, Selected: selectOn(15) },\n { Name: 25, Selected: selectOn(25) },\n { Name: 50, Selected: selectOn(50) },\n { Name: 100, Selected: selectOn(100) }\n ],\n FirstDisabled: false,\n PrevDisabled: false,\n NextDisabled: false,\n LastDisabled: false\n });\n\n\n return WA.TMPL.render('layouts/3Columns.html', data, false, false, partials).done(function (pager) {\n\n me._jPager.html(pager);\n\n me._grid.grid.setOptions({\n showPagerRow: true,\n pagerRowHeight: me._jPager.outerHeight()\n });\n\n me._grid.grid.resizeViewport();\n\n me._bindEvents();\n me._initCounter();\n });\n\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обработчики событий\n * @since 5.2.0.1100\n * @private\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#_bindEvents\n * @return {WebAccess.components.dataViews.gridPlugins.FooterPlugin} FooterPlugin\n */\n _bindEvents: function () {\n var me = this;\n me._jPagerControls = {\n resetFilterState: $('.resetFilterState', me._jPager),\n changeFilterState: $('.changeFilterState', me._jPager),\n navPanel: $('.grid-paginator', me._jPager),\n next: $('#gridNextPage', me._jPager),\n prev: $('#gridPrevPage', me._jPager),\n first: $('#gridFirstPage', me._jPager),\n last: $('#gridLastPage', me._jPager),\n pageSize: $('.gridChangePageSize', me._jPager),\n currentPage: $('.gridCurrentPage', me._jPager)\n };\n\n me._bindFilterEvents();\n me._bindPagerEvents();\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Навешивает элементы управления фильтром.\n _bindFilterEvents: function () {\n var me = this;\n\n // Очистить фильтр.\n me._jPagerControls.resetFilterState.click(function () {\n window.Filters.resetFilter();\n });\n\n // Вкл/Выкл фильтра\n me._jPagerControls.changeFilterState.click(function () {\n window.Filters.changeFilterState($(this).is(':checked'));\n });\n\n return me;\n },\n\n // Навешивает события на пагинатор.\n _bindPagerEvents: function () {\n var me = this;\n\n var isDisabled = function (el) {\n el = $(el);\n // используемая версия jQuery не умеет работать с css-классами элементов svg. Приходится использовать data-атрибуты.\n if (el.attr('data-disabled') === 'true') return true;\n return false;\n };\n\n var afterClick = function (el) {\n el = $(el);\n el.attr('data-disabled', 'true');\n\n me._getData().done(function () {\n me._grid.fire(WA.CMP.DV.Grid.EVENT.PAGE_CHANGE, me.pageIndex);\n el.attr('data-disabled', 'false');\n });\n };\n\n me._jPagerControls.next.click(function () {\n if (isDisabled(this)) return;\n me.pageIndex += 1;\n afterClick(this);\n });\n\n me._jPagerControls.prev.click(function () {\n if (isDisabled(this)) return;\n me.pageIndex -= 1;\n if (me.pageIndex < 0) me.index = 0;\n afterClick(this);\n });\n\n me._jPagerControls.first.click(function () {\n if (isDisabled(this)) return;\n me.pageIndex = 0;\n afterClick(this);\n });\n\n me._jPagerControls.last.click(function () {\n if (isDisabled(this)) return;\n me.pageIndex = -1;\n afterClick(this);\n });\n\n me._jPagerControls.pageSize.change(function () {\n var prevPageLimit = me.pageSize;\n var prevPageIndex = me.pageIndex;\n\n me.pageSize = $(this).val();\n me.pageIndex = 0;\n afterClick(this);\n me._grid.fire(WA.CMP.DV.Grid.EVENT.PAGE_LIMIT_CHANGE, me.pageSize);\n });\n\n return me;\n },\n\n /**\n * Обработчик события нажатия на кол-во записей\n * @since 5.2.0.1100\n * @private\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#_initCounter\n * @return {WebAccess.components.dataViews.gridPlugins.FooterPlugin} FooterPlugin\n */\n _initCounter: function () {\n var me = this;\n $('.RowCount', me.jPager)\n .html(L(\"RECORDS_TOTAL_LINK\"))\n .addClass('dashed')\n .attr(\"title\", L(\"SHOW_EXACT_RECORDS_COUNT\"))\n .one('click', $.proxy(me._toggleRecordCountDisplayMode, me)); //добавляем возможность получения точного количества записей\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Изменяет \"Всего записей\" на реальное количество.\n * @since 5.2.0.1100\n * @private\n * @method WebAccess.components.dataViews.gridPlugins.FooterPlugin#_initCounter\n * @return {WebAccess.components.dataViews.gridPlugins.FooterPlugin} FooterPlugin\n */\n _toggleRecordCountDisplayMode: function () {\n var me = this;\n var jRowCount = $('.RowCount', me.jPager).removeClass('dashed');\n\n var spinner = $('.counterSpinner', me.jPager);\n var spinnerShowDelay = setTimeout(function () {\n jRowCount.hide();\n spinner.show();\n }, 300);\n\n var filter = me._grid.state.GlobalPageFilter || '';\n var currentFilter = me._grid.state.CurrentFilter;\n if (currentFilter) {\n if (currentFilter.IsEnabled) {\n if (!filter) {\n filter = currentFilter.Expression;\n } else {\n if (currentFilter.Expression !== '') {\n filter = '(' + filter + ') & (' + currentFilter.Expression + ')';\n }\n }\n }\n }\n\n me._grid._dataSource.totalCount(filter, me._grid.state.GlobalPageFilterLikeQuery).done(function (res) {\n clearTimeout(spinnerShowDelay);\n spinner.hide();\n // Меняем на точное\n me._setCountLabel(res);\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _setCountLabel: function (total) {\n var me = this;\n var jRowCount = $('.RowCount', me.jPager).removeClass('dashed');\n\n jRowCount\n .html(L(\"RECORDS_TOTAL\", total))\n .attr(\"title\", L(\"EXACT_RECORDS_COUNT\"))\n .show();\n },\n\n /**\n * Отправка запроса на получение данных с учетом страницы и кол-ва записей\n * @private\n * @method getData\n */\n _getData: function () {\n var me = this;\n var loadOptions = {\n PageIndex: me.pageIndex,\n Take: me.pageSize\n };\n return me._grid.reloadData(loadOptions);\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n})(WA.components.dataViews.gridPlugins);\n","(function checkboxPlugin(global) {\n \"use strict\";\n\n /**\n * Плагин для колонки таблицы с флажком.\n *\n * @class WebAccess.components.dataViews.gridPlugins.CheckboxPlugin\n * @extends WebAccess.Plugin\n * @property {string} name Имя плагина. \n * @since 5.2.0.1100\n */\n global.CheckboxPlugin = WA.Plugin.extend({ \n name: 'CheckboxPlugin',\n\n // Грид. \n _grid: null,\n // Стандартный плагин для чекбоксов.\n _checkboxSelector: null,\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Регистрирует плагин.\n *\n * @method WebAccess.components.dataViews.gridPlugins.CheckboxPlugin#register\n * @param {WebAccess.components.dataViews.Grid} Таблица\n * @since 5.2.0.1100\n * @return {object} Ассоциативный массив, содержащий публичные методы. \n */\n register: function (grid) {\n var me = this;\n me._grid = grid;\n \n\n me._checkboxSelector = new Slick.CheckboxSelectColumn({\n columnId: '_Checkbox',\n cssClass: 'slick-cell-checkboxsel',\n toolTip: L('SELECT_ALL'),\n headerCssClass: 'centered notDraggable',\n width: 30\n });\n\n me._grid.bind(WA.CMP.DV.Grid.EVENT.BEFORE_GRID_INIT, $.proxy(me._onGridBeforeInit, me));\n me._grid.bind(WA.CMP.DV.Grid.EVENT.GRID_INIT, $.proxy(me._onGridInit, me));\n return {};\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Хэндлер события до инициализации грида.\n * @method WebAccess.components.dataViews.gridPlugins.CheckboxPlugin#_onGridBeforeInit\n * @param {string} containerSelector селектор контейнера для грида.\n * @param {Object} dataView представление данных.\n * @param {Object} columns описания всех колонок.\n * @param {Object} settings настройки грида.\n * @private\n * @since 5.2.0.1100\n */\n _onGridBeforeInit: function (containerSelector, dataView, columns, settings) { \n var me = this;\n var checkboxColumndDef = this._checkboxSelector.getColumnDefinition();\n var column = _.findWhere(columns, { id: checkboxColumndDef.id });\n $.extend(column, checkboxColumndDef);\n \n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обработчик события инициализации грида.\n * @method WebAccess.components.dataViews.gridPlugins.CheckboxPlugin#_onGridInit\n * @private\n * @since 5.2.0.1100\n */\n _onGridInit: function () {\n var me = this;\n this._grid.grid.setSelectionModel(new Slick.RowSelectionModel({ selectActiveRow: false }));\n this._grid.grid.registerPlugin(this._checkboxSelector);\n\n this._grid.dataView.syncGridSelection(me._grid.grid, true);\n\n // Для работы objectList.\n me._grid.grid.onSelectedRowsChanged.subscribe(function (e, args) { \n me._grid.fire(WA.CMP.DV.Grid.EVENT.SELECTED_ROWS_CHANGED);\n });\n\n // Пометка галочкой строки по клику на свободное место.\n me._grid.grid.onClick.subscribe(function (e, args) {\n \n // Для строк без данных не выделяем.\n if (me._grid.dataView.getItem(args.row).__nonDataRow) return; \n\n me._grid.grid.getSelectionModel().selectOnClickEvent(e, true);\n // вызываем событие изменения checkbox-а для работы клиентской ОМ\n var el = $(e.target).parents('.List:first').find(\"input.chk\");\n el.trigger('itemChecked', []);\n });\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n})(WA.components.dataViews.gridPlugins);","(function contextMenuPlugin(global) {\n \"use strict\";\n\n /**\n * Плагин для контекстного меню таблицы.\n *\n * @class WebAccess.components.dataViews.gridPlugins.ContextMenuPlugin\n * @extends WebAccess.Plugin\n * @param {Object} options Настройки контекстного меню\n * @property {string} name Имя плагина\n * @since 5.2.0.1100\n */\n global.ContextMenuPlugin = WA.Plugin.extend({ \n name: 'ContextMenuPlugin',\n\n // Настройки.\n _contextMenuOptions: {},\n _customMenuClass: null,\n _contextMenu: null, \n _grid: null,\n _form: null,\n \n init: function (args, opt_form) {\n var me = this;\n this._super();\n if (opt_form) me._form = opt_form;\n if (!args.from) {\n this._customMenuClass = args;\n } else {\n this._contextMenuOptions = args;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Регистрирует плагин.\n *\n * @method WebAccess.components.dataViews.gridPlugins.ContextMenuPlugin#register\n * @param {WebAccess.components.dataViews.Grid} grid Таблица\n * @since 5.2.0.1100\n * @return {object} Ассоциативный массив, содержащий публичные методы.\n */\n register: function (grid) {\n var me = this;\n me._grid = grid;\n\n return {\n 'openContextMenu': $.proxy(me._openContextMenu_exported, me)\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Открытие контекстного меню.\n * @method WebAccess.components.dataViews.gridPlugins.ContextMenuPlugin#_openContextMenu_exported\n * @private\n * @param {HTMLElement} el Элемент, на котором вызвали контекстное меню\n * @param {Event} ev Событие\n * @since 5.2.0.1100\n */\n _openContextMenu_exported: function (el, ev) {\n var me = this;\n\n var x = ev.pageX || ev.clientX;\n var y = ev.pageY || ev.clientY;\n\n if (this._contextMenuOptions.from) {\n me._openLegacyContextMenu(x,y,ev,el);\n } else {\n me._openBaseContextMenu(x,y,ev);\n }\n\n // Предотвращаем открытие стандратного контекстного меню браузера\n if (ev.preventDefault) ev.preventDefault();\n ev.cancelBubble = true;\n return false;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Открытие контекстного который был раньше, в pages.js\n * @method WebAccess.components.dataViews.gridPlugins.ContextMenuPlugin#_openLegacyContextMenu\n * @private\n * @param {integer} x-координата\n * @param {integer} y-координата\n * @param {Event} ev Событие.\n * @since 5.2.0.1100\n */\n _openLegacyContextMenu: function (x, y, ev, el) {\n var me = this;\n var jEl = $(el);\n jEl.attr('name', 'MenuIcon');\n ShowContextMenu(jEl, this._contextMenuOptions, (ev ? { 'left': x, 'top': y } : {}));\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Открытие контекстного меню с использованием Клиентской ОМ\n * @method WebAccess.components.dataViews.gridPlugins.ContextMenuPlugin#_openBaseContextMenu\n * @private\n * @param {integer} x-координата\n * @param {integer} y-координата\n * @param {Event} ev Событие.\n * @since 5.2.0.1100\n */\n _openBaseContextMenu: function (x, y, ev) {\n var me = this;\n WA.Init.done(function () {\n me._customMenuClass.setGrid(me._grid);\n me._customMenuClass.setForm(me._form);\n me._contextMenu = new WA.CMP.menus.BaseContextMenu('body', me._customMenuClass.generateItems(ev), {\n 'onShow': function () {\n me._removeMenuSelectCssClassAndReturnClickedRow(ev).addClass('menu_select');\n },\n 'onHide': function () {\n me._removeMenuSelectCssClassAndReturnClickedRow(ev);\n }\n });\n me._contextMenu.showAt(x, y, ev);\n me._customMenuClass.bindActionsToMenuItems(me._contextMenu, ev, me._grid);\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удаляет CSS-класс menu_select со всех строк таблицы и возвращаает ту строку, которой кликнули.\n * @method WebAccess.components.dataViews.gridPlugins.ContextMenuPlugin#_removeMenuSelectCssClassAndReturnClickedRow\n * @private\n * @param {Event} ev Событие.\n * @since 5.2.0.1300\n */\n _removeMenuSelectCssClassAndReturnClickedRow: function (ev) {\n var target = ev.target || ev.srcElement;\n var jRow = $(target).parents('div.slick-row');\n jRow.parent().children('.menu_select').removeClass('menu_select');\n return jRow;\n }\n\n });\n\n})(WA.components.dataViews.gridPlugins);","(function columnResizePlugin(global) {\n \"use strict\";\n\n /**\n * Плагин для изменения ширины колонок таблицы.\n *\n * @class WebAccess.components.dataViews.gridPlugins.ColumnResizePlugin\n * @extends WebAccess.Plugin\n * @property {string} name Имя плагина\n * @since 5.2.0.1100\n */\n global.ColumnResizePlugin = WA.Plugin.extend({\n name: 'ColumnResizePlugin',\n\n // Грид. \n _grid: null,\n // Настройки.\n _settings: null,\n\n init: function (settings) {\n this._super();\n this._settings = $.extend({}, settings);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Регистрирует плагин.\n *\n * @method WebAccess.components.dataViews.gridPlugins.ColumnResizePlugin#register\n * @param {WebAccess.components.dataViews.Grid} Таблица\n * @since 5.2.0.1100\n * @return {object} Ассоциативный массив, содержащий публичные методы.\n */\n register: function (grid) {\n var me = this;\n me._grid = grid;\n\n me._grid.bind(WA.CMP.DV.Grid.EVENT.COLUMN_INIT, $.proxy(me._onColumnInit, me));\n //me._grid.bind(WA.CMP.DV.Grid.EVENT.BEFORE_GRID_INIT, $.proxy(me._onGridBeforeInit, me));\n me._grid.bind(WA.CMP.DV.Grid.EVENT.GRID_INIT, $.proxy(me._onGridInit, me));\n me._grid.bind(WA.CMP.DV.Grid.EVENT.AFTER_DATA_LOADED, $.proxy(me._onAfterGridDataLoaded, me));\n\n // Отключать надо для планшетов и если будут редактироваться ячейки.\n if (!me._settings['disableOnResizeBinding']) {\n $(window).on(\"resizeEnd\", $.proxy(me._onWindowsResize, me));\n }\n\n return {\n 'autoAdjustColumnWidth': $.proxy(me._autoAdjustColumnWidth_exported, me)\n };\n },\n\n /**\n * Делаем все колонки растягивабельными\n * @method WebAccess.components.dataViews.gridPlugins.CheckboxPlugin#_onColumnInit\n * @param {object} byref_column колонка\n * @private\n * @since 5.2.0.1100\n */\n _onColumnInit: function (byref_column) {\n var me = this;\n var isSpecialColumn = (byref_column.id.charAt(0) === '_');\n byref_column.resizable = !isSpecialColumn;\n\n if (me._grid.state && me._grid.state['ColumnsWidth'] && me._grid.state['ColumnsWidth'][byref_column.id] > 0) {\n byref_column.width = me._grid.state['ColumnsWidth'][byref_column.id];\n }\n },\n\n /**\n * Хэндлер события инициализации грида.\n * @method WebAccess.components.dataViews.gridPlugins.ColumnResizePlugin#_onGridInit\n * @private\n * @since 5.2.0.1100\n */\n _onGridInit: function () {\n var me = this;\n\n // Если ColumnsWidth пустой или заполнен некорректными значениями заполнить его при инициализации грида,\n // это нужно для корректной выгрузки записей справочника в ексель.\n if (me._columnsWidthIsEmpty())\n me._saveColumnWidthState(me._grid.state.IsColumnsAutoWidthEnabled);\n\n me._grid.grid.onColumnsResized.subscribe(function () {\n me._saveColumnWidthState(me._grid.state.IsColumnsAutoWidthEnabled);\n });\n },\n\n /**\n * Возвращает признак пустоты объекта Core.grid.reference.state.ColumnsWidth\n * @returns {bool}\n * @private\n * @since 5.2.0.2005-beta\n */\n _columnsWidthIsEmpty: function () {\n var result = false;\n var columnsWidth = this._grid.state['ColumnsWidth'];\n\n if (jQuery.isEmptyObject(columnsWidth)) {\n result = true;\n } else {\n $.each(columnsWidth, function (key, value) {\n // При первом открытии справочника объект пустой, а при обновлении размеры всех колонок -1.\n if (value === -1) {\n result = true;\n return false;\n }\n });\n }\n\n return result;\n },\n\n /**\n * Хэндлер события \"После загрузки данных\".\n * @method WebAccess.components.dataViews.gridPlugins.ColumnResizePlugin#_onAfterGridDataLoaded\n * @private\n * @since 5.2.0.1100\n */\n _onAfterGridDataLoaded: function () {\n if (this._grid.state.IsColumnsAutoWidthEnabled === true) {\n this._autoAdjustColumnWidth_exported(true);\n }\n },\n\n /**\n * Хэндлер события \"Изменение размера окна браузера\".\n * @method WebAccess.components.dataViews.gridPlugins.ColumnResizePlugin#_onWindowsResize\n * @private\n * @since 5.2.0.1100\n */\n _onWindowsResize: function () {\n this._grid.grid.resizeCanvas();\n this._onAfterGridDataLoaded.call(this);\n },\n\n /**\n * Автоподбор ширины колонок.\n * @method WebAccess.components.dataViews.gridPlugins.ColumnResizePlugin#_autoAdjustColumnWidth_exported\n * @param {boolean} isEnabled Включен ли автоподбор ширины колонок.\n * @private\n * @since 5.2.0.1100\n */\n _autoAdjustColumnWidth_exported: function (isEnabled) {\n var me = this;\n\n // Что бы нельзя было при включенном режиме растянуть колонки за пределы видимой области.\n me._grid.grid.setOptions({\n forceFitColumns: isEnabled\n });\n\n if (isEnabled) {\n //Если включили, то отресайзим колонки. \n me._grid.grid.autosizeColumns();\n }\n\n me._saveColumnWidthState(isEnabled);\n },\n\n /**\n * Сохранение текущих размеров колонок в состоянии грида.\n * @method WebAccess.components.dataViews.gridPlugins.ColumnResizePlugin#_saveColumnWidthState\n * @param {boolean} IsColumnsAutoWidthEnabled Включен ли автоподбор ширины колонок\n * @private\n * @since 5.2.0.1100\n */\n _saveColumnWidthState: function (IsColumnsAutoWidthEnabled) {\n var me = this;\n var columnsWidth = {};\n var columns = me._grid.grid.getColumns();\n for (var i = 0; i < columns.length; i++) {\n // \"~~\" операция двойного побитового NOT.\n // Использется как более быстрая реализация Math.floor().\n // floor() используется для округления числа в меньшую сторону.\n columnsWidth[columns[i].id] = ~~columns[i].width;\n }\n\n // Обновим состояние (сохраним в профиль пользователя).\n me._grid.updateState({\n IsColumnsAutoWidthEnabled: IsColumnsAutoWidthEnabled,\n ColumnsWidth: columnsWidth\n }, true);\n }\n });\n\n})(WA.components.dataViews.gridPlugins);","(function filteringPlugin(global) {\n \"use strict\";\n\n var SELECT_LIST_PAGE_SIZE = 50;\n var SPECIAL_VALUE = global._controls.selectList.SPECIAL_VALUE;\n var DATE_SPECIAL_VALUE = global._controls.selectList.DATE_SPECIAL_VALUE;\n\n /**\n * Плагин для фильтра таблицы.\n *\n * @class WebAccess.components.dataViews.gridPlugins.FilteringPlugin\n * @extends WebAccess.Plugin\n * @param {WebAccess.dataViews.grid.BaseDataProvider} selectListDataProvider Класс, предоставляющий данные для компоненты selectList\n * @property {string} name Имя плагина\n * @property {integer} groupDisplayLimit Максимальная длина отображаемого значения фильтра по колонке\n * @property {WebAccess.dataViews.grid.BaseDataProvider} selectListDataProvider Класс, предоставляющий данные для компоненты selectList\n * @since 5.2.0.1100\n */\n var FilteringPlugin = global.FilteringPlugin = WA.Plugin.extend({\n\n name: 'FilteringPlugin',\n groupDisplayLimit: 40,\n selectListDataProvider: null,\n\n _grid: null,\n _controls: [],\n _selectListContainerSelector: '.selectList',\n _popupSelector: '.selectListPopup',\n _slickHeaderSelector: '.slick-headerrow',\n _dataPickerInputSelector: '.dateField',\n _datePickerSelector: '.ui-datepicker',\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (selectListDataProvider) {\n var me = this;\n me._super();\n me._controls = [];\n if (!!selectListDataProvider) me.selectListDataProvider = selectListDataProvider;\n else WA.raise('SELECT_LIST_DATA_PROVIDER_IS_REQUIRED');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Регистрирует плагин.\n *\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#register\n * @param {WebAccess.components.dataViews.Grid} grid Таблица\n * @since 5.2.0.1100\n * @return {object} Ассоциативный массив, содержащий публичные методы.\n */\n register: function (grid) {\n var me = this;\n me._grid = grid;\n me._grid.bind(WA.CMP.DV.Grid.EVENT.GRID_INIT, WA.TCD($.proxy(me._onGridInit, me)));\n return {\n toggleFiltering: me._toggleFiltersArea_exported,\n updateFilter: $.proxy(me._updateFilter_exported, me),\n getFillingRequisites: $.proxy(me._getFillingRequisites, me)\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показ/скрытие облсти фильтрации\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_toggleFiltersArea_exported\n * @private\n * @this {grid}\n * @since 5.2.0.1100\n */\n _toggleFiltersArea_exported: function (needToEnable) {\n var me = this;\n log.debug('GRID', 'Toggling filter area: ' + needToEnable);\n\n var jArea = $(me._slickHeaderSelector, me._selectListContainerSelector);\n\n if (needToEnable) {\n jArea.show();\n me.grid.setHeaderRowVisibility(true);\n me.grid.resizeViewport();\n me.updateState({ IsFilterPanelVisible: true }, true);\n } else {\n jArea.hide();\n me.grid.setHeaderRowVisibility(false);\n me.grid.resizeViewport();\n me.updateState({ IsFilterPanelVisible: false }, true);\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обработчик события инициализации грида.\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_onGridInit\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.FilteringPlugin}\n * @since 5.2.0.1100\n */\n _onGridInit: function () {\n var me = this;\n var columnFilters = {};\n\n var CF = me._grid.state.CurrentFilter;\n me._updateFilterExpression()\n\n me._grid.updateState({ CurrentFilter: CF });\n (!!me._grid.updateFooter) && me._grid.updateFooter();\n\n me._grid.toggleFiltering(me._grid.state.IsFilterPanelVisible);\n\n // Закрытие всех выпадающих списоков всех контролов.\n $(document).mouseup(function (e) {\n var container = $(me._popupSelector).add(me._datePickerSelector).add(me._dataPickerInputSelector);\n if (!container.is(e.target) && container.has(e.target).length === 0 && e.target != $('html').get(0)) {\n _(me._controls).each(function (control) {\n var jTarget = $(e.target);\n if (!!jTarget.attr(\"id\")) {\n if (jTarget.attr(\"id\") !== control.instanceID) control.close();\n } else {\n control.close();\n }\n });\n }\n });\n\n //При фильтрации, обновим у всех контролов выражение фильтрации\n //У того контрола по которому идет фильтрация, выражение выпилим\n me.bind(FilteringPlugin.EVENT.FILTER_UPDATE, function (filter, expression) {\n _(me._controls).each(function (control) {\n control.state.expression = me._getColumnExpression(filter, control.state.column.id);\n });\n });\n\n me._grid.grid.onHeaderRowCellRendered.subscribe($.proxy(me.renderControl, me));\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает поле фильтрации.\n *\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#renderControls\n * @since 5.2.0.1100\n * @return {WebAccess.components.dataViews.gridPlugins.FilteringPlugin}\n */\n renderControl: function (event, data) {\n var me = this;\n var closeOtherControls = function (control) {\n _(_(me._controls).filter(function (c) {\n return control.instanceID !== c.instanceID\n })).each(function (c) {\n c.close();\n });\n }\n\n var column = data.column;\n var grid = data.grid;\n var container = data.node;\n var columnFilters = me._grid.state.CurrentFilter.ColumnsFilter;\n switch (column.type) {\n case 'Integer':\n case 'LargeInteger':\n case 'Float':\n case 'String':\n case 'Pick':\n case 'Document':\n case 'Reference':\n var SelectList = global._controls.selectList.SelectListControl;\n var columnFilter = (!!columnFilters) ? columnFilters[column.id] : null;\n\n var like = (columnFilter) ? columnFilter.Like : '';\n var selectedRecords = (!!columnFilter && columnFilter.Type == 'In') ? columnFilter.In : [];\n var notSelectedRecords = (!!columnFilter && columnFilter.Type == 'Exclude') ? columnFilter.In : [];\n var invertedMode = !!notSelectedRecords.length;\n\n var selectList = new SelectList(container, new me.selectListDataProvider(me._grid.settings.selectListDataProviderSettings), {\n column: column,\n requisiteName: column.id,\n take: SELECT_LIST_PAGE_SIZE,\n skip: 0,\n page: 0,\n expression: me._getColumnExpression(columnFilters, column.id),\n like: like,\n selectedRecords: selectedRecords, //CREVIEW Шамов А.: Название selectedRecords больше относится к справочнику, может переименуем в selectedItems? //поздно уже это менять\n notSelectedRecords: notSelectedRecords,\n invertedMode: invertedMode,\n plugins: [new global._controls.selectList.SpecialValuesPlugin()]\n });\n\n //Скрывать все остальные открытые контролы, когда текущий открыт\n selectList.bind(SelectList.EVENT.BEFORE_LIST_OPEN, $.proxy(closeOtherControls, me));\n selectList.bind(SelectList.EVENT.VALUE_CHANGED, function (value) { me._updateStateAndReloadData(column, value); });\n me._controls.push(selectList);\n break;\n\n case 'Date':\n var SelectList = global._controls.selectList.SelectListControl;\n var columnFilter = (!!columnFilters) ? columnFilters[column.id] : null;\n\n var like = (columnFilter) ? columnFilter.Like : '';\n var selectedRecords = (!!columnFilter && columnFilter.Type == 'In') ? columnFilter.In : [];\n var notSelectedRecords = (!!columnFilter && columnFilter.Type == 'Exclude') ? columnFilter.In : [];\n var invertedMode = !!notSelectedRecords.length;\n\n var selectList = new SelectList(container, new me.selectListDataProvider(me._grid.settings.selectListDataProviderSettings), {\n column: column,\n requisiteName: column.id,\n take: SELECT_LIST_PAGE_SIZE,\n skip: 0,\n page: 0,\n expression: me._getColumnExpression(columnFilters, column.id),\n like: like,\n selectedRecords: selectedRecords, //CREVIEW Шамов А.: Название selectedRecords больше относится к справочнику, может переименуем в selectedItems? //поздно уже это менять\n notSelectedRecords: notSelectedRecords,\n invertedMode: invertedMode,\n plugins: [\n new global._controls.selectList.DateValuesPlugin(),\n new global._controls.selectList.SpecialValuesPlugin()\n ]\n });\n\n //Скрывать все остальные открытые контролы, когда текущий открыт\n selectList.bind(SelectList.EVENT.BEFORE_LIST_OPEN, $.proxy(closeOtherControls, me));\n selectList.bind(SelectList.EVENT.VALUE_CHANGED, function (value) { me._updateStateAndReloadData(column, value); });\n me._controls.push(selectList);\n\n break;\n case 'Empty':\n $(container).append('

    ');\n break;\n default:\n $.noop();\n }\n return me;\n },\n\n /**\n * Обновление фильтрации грида при смене значения в одном из контролов\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_updateStateAndReloadData\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.FilteringPlugin}\n * @since 5.2.0.1100\n */\n _updateStateAndReloadData: function (column, value) {\n var me = this;\n log.debug('GRID', 'Updating filter');\n\n var CF = me._grid.state.CurrentFilter;\n var isPrevAutoFilter = (CF.ID == '0');\n var isPrevEmptyFilter = (CF.ID == '-1');\n\n CF.ColumnsFilter[column.id] = value;\n me._updateFilterExpression();\n\n CF.IsNeedSave = true;\n // Если фильтра больше нет, то сбросим его совсем.\n if (CF.Expression === '') {\n $.extend(CF, {\n ID: '-1',\n Name: '',\n ColumnsFilter: {}\n });\n\n // Удалим автофильтр.\n delete me._grid.state.SavedFilters['0'];\n\n if (Filters && Filters.resetFilter) Filters.resetFilter();\n } else {\n CF.ID = '0';\n if (!CF.Name || !isPrevAutoFilter) {\n CF.Name = me._getAutoFilterName();\n }\n\n // Обновим или добавим имя автосохраненного фильтра в список сохраненных.\n me._grid.state.SavedFilters[CF.ID] = CF.Name;\n\n // Включим новый фильтр, даже если предыдущий был выключен.\n CF.IsEnabled = true;\n }\n\n //Обновляем контекстное меню в ленте.\n if (Filters && Filters.setupFiltersState) Filters.setupFiltersState();\n\n me._grid.updateState({\n CurrentFilter: CF,\n PageIndex: 0\n });\n\n me.fire(FilteringPlugin.EVENT.FILTER_UPDATE, CF.ColumnsFilter, CF.Expression);\n\n if (!!me._grid.updateFooter) me._grid.updateFooter();\n\n // Сбросить выделение\n me._grid.grid.setSelectedRows([]);\n\n me._grid.reloadData();\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обновление выражения фильтрации и состояние контролов.\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_updateFilter_exported\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.FilteringPlugin}\n * @since 5.2.0.1100\n */\n _updateFilter_exported: function () {\n var me = this;\n me._updateFilterExpression();\n me._updateControlsState();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обновления выраженяи фильтрации.\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_updateFilterExpression\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.FilteringPlugin}\n * @since 5.2.0.1100\n */\n _updateFilterExpression: function () {\n var me = this;\n var CF = me._grid.state.CurrentFilter;\n $.extend(CF, {\n ColumnsFilter: me._removeDeniedColumns(CF.ColumnsFilter),\n Expression: me._convertToSBRSE(CF.ColumnsFilter),\n DisplayValue: me._convertToHumanRedableText(CF.ColumnsFilter, true),\n DisplayHint: me._convertToHumanRedableText(CF.ColumnsFilter)\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удалить колонки из фильтра если фильтрация по ним невозможна\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_removeDeniedColumns\n * @private\n * @since 5.2.0.1100\n * @see #98783\n */\n _removeDeniedColumns: function (filter) {\n var me = this;\n var allColumnsIds = _(me._grid._columns).pluck('id');\n _(filter).each(function (f, name) {\n if (allColumnsIds.indexOf(name) === -1) {\n delete filter[name];\n }\n });\n return filter;\n },\n\n /**\n * Получить имя \"автофильтра\"\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_updateStateAndReloadData\n * @private\n * @return {String}\n * @since 5.2.0.1100\n */\n _getAutoFilterName: function () {\n var filters = this._grid.state.SavedFilters;\n var maxFilterID = _(_(_(filters).keys()).map(function (k) {\n return +k; // Преобразуем в число, что бы вычислить max.\n })).max();\n return L('AUTO_FILTER_LABEL') + ' ' + Math.max(maxFilterID + 1, 1); //Если фильтров нет, то max вернет -Infinity, а имя фильтра сделаем с номером 1.\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Преобразовние объекта фильтра в человеко-читаемую строку для футера\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_convertToHumanRedableText\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.FilteringPlugin}\n * @since 5.2.0.1100\n */\n _convertToHumanRedableText: function (filter, needTrunc) {\n var me = this;\n needTrunc = !!needTrunc;\n\n var expression = _(filter).map(function (reqFilter, requsiteName) {\n var expression = '';\n\n var column = _(me._grid._columns).find(function (col) {\n return col.id == requsiteName;\n });\n\n var columnName = column.name;\n\n switch (reqFilter.Type) {\n case 'Exclude':\n expression = _(reqFilter.In).map(function (record) {\n if (record.Type && record.Type === SPECIAL_VALUE.BLANK) return columnName + wrapWith.space(L('NOT')) + L('CHOICE_BLANK');\n if (record.Type && record.Type === SPECIAL_VALUE.NOBLANK) return columnName + wrapWith.space(L('NOT')) + L('CHOICE_NONBLANK');\n return columnName + wrapWith.space(L('NOT')) + $.trim(record.DisplayValue);\n }).join(wrapWith.space(L('FILTER_OR')));\n break;\n\n case 'In':\n expression = _(reqFilter.In).map(function (record) {\n if (record.Type && record.Type === SPECIAL_VALUE.BLANK) return columnName + wrapWith.space('=') + L('CHOICE_BLANK');\n if (record.Type && record.Type === SPECIAL_VALUE.NOBLANK) return columnName + wrapWith.space('=') + L('CHOICE_NONBLANK');\n return columnName + wrapWith.space('=') + $.trim(record.DisplayValue);\n }).join(wrapWith.space(L('FILTER_OR')));\n break;\n case 'Like':\n if (reqFilter.Like) expression = columnName + wrapWith.space(L('FILTER_CONTAINS')) + reqFilter.Like;\n break;\n case 'Equal':\n if (column.type === 'Date') {\n if (!!reqFilter.Equal) {\n var d = Date.fromISO(reqFilter.Equal);\n if (!isNaN(d.getTime())) {\n //Формат должен зависить от языка веб-доступа.\n var formatFunc = (column.dateType === 'DateTime' ? formatDateTime : formatDate);\n expression = columnName + wrapWith.space('=') + formatFunc(d);\n }\n }\n } else {\n if (reqFilter.Equal) {\n expression = columnName + wrapWith.space('=') + reqFilter.Equal;\n }\n }\n break;\n }\n\n expression = needTrunc ? expression.trunc(me.groupDisplayLimit) : expression;\n if (!!expression) expression = wrapWith.group(expression);\n return expression;\n });\n\n expression = _(expression).compact().join(wrapWith.space(L('FILTER_AND')));\n return expression;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Преобразовние объекта фильтра в строку-выражение SBRSE;\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_convertToHumanRedableText\n * @private\n * @return {WebAccess.components.dataViews.gridPlugins.FilteringPlugin}\n * @since 5.2.0.1100\n */\n _convertToSBRSE: function (filter) {\n var me = this;\n\n var expression = _(filter).map(function (reqFilter, requsiteName) {\n var expression = null;\n\n var column = _(me._grid._columns).find(function (col) {\n return col.id == requsiteName;\n });\n\n var getDateFilter = function (record, mode) {\n if (record.Type && record.Type === DATE_SPECIAL_VALUE.YESTERDAY) {\n var yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n return expression = me._makeOneDayDateExpression(requsiteName, yesterday);\n }\n\n if (record.Type && record.Type === DATE_SPECIAL_VALUE.TODAY) return expression = me._makeOneDayDateExpression(requsiteName, new Date());\n if (record.Type && record.Type === DATE_SPECIAL_VALUE.TOMORROW) {\n var tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n return expression = me._makeOneDayDateExpression(requsiteName, tomorrow);\n }\n\n if (record.Type && record.Type === DATE_SPECIAL_VALUE.THIS_WEEK) {\n var curr = new Date();\n var day = curr.getDay()\n firstDay = new Date(curr.getFullYear(), curr.getMonth(), curr.getDate() + (day == 0 ? -6 : 1) - day);\n lastDay = new Date(curr.getFullYear(), curr.getMonth(), curr.getDate() + (day == 0 ? 0 : 7) - day);\n return expression = me._makeDateBetweenExpression(requsiteName, firstDay, lastDay);\n }\n\n if (record.Type && record.Type === DATE_SPECIAL_VALUE.THIS_MONTH) {\n var curr = new Date();\n var firstDay = new Date(curr.getFullYear(), curr.getMonth(), 1);\n var lastDay = new Date(curr.getFullYear(), curr.getMonth() + 1, 0);\n return expression = me._makeDateBetweenExpression(requsiteName, firstDay, lastDay);\n }\n\n if (record.Type && record.Type === DATE_SPECIAL_VALUE.THIS_YEAR) {\n var curr = new Date();\n var firstDay = new Date(curr.getFullYear(), 0, 1);\n var lastDay = new Date(curr.getFullYear(), 11, 31);\n return expression = me._makeDateBetweenExpression(requsiteName, firstDay, lastDay);\n }\n }\n\n switch (reqFilter.Type) {\n case 'Exclude':\n if (!reqFilter.In.length) return null;\n expression = '!' + wrapWith.group(_(reqFilter.In).map(function (record) {\n if (record.Type && record.Type === SPECIAL_VALUE.BLANK) return wrapWith.block(requsiteName) + ' = NULL';\n if (record.Type && record.Type === SPECIAL_VALUE.NOBLANK) return wrapWith.block(requsiteName) + ' != NULL';\n\n var dateFilter = getDateFilter(record);\n if (dateFilter) return dateFilter;\n\n var operand = (column.type === \"String\" ? 'matches' : '=');\n return wrapWith.block(requsiteName) + ' ' + operand + ' \"' + record.Value + '\"';\n }).join(' | '));\n break;\n\n case 'In':\n expression = _(reqFilter.In).map(function (record) {\n if (record.Type && record.Type === SPECIAL_VALUE.BLANK) return wrapWith.block(requsiteName) + ' = NULL';\n if (record.Type && record.Type === SPECIAL_VALUE.NOBLANK) return wrapWith.block(requsiteName) + ' != NULL';\n\n var dateFilter = getDateFilter(record);\n if (dateFilter) return dateFilter;\n\n if (column.type === 'Date') {\n var likeExpr = me._makeDateTimeLikeExpression(requsiteName, record.Value, column.dateType);\n if (!!likeExpr) expression = likeExpr;\n return expression;\n }\n\n var operand = (column.type === \"String\" ? 'matches' : '=');\n return wrapWith.block(requsiteName) + ' ' + operand + ' \"' + record.Value + '\"';\n }).join(' | ');\n break;\n\n case 'Like':\n // Like должен работать по отображаемому значению, а для справочника и признака он хранится вдругом месте.\n var value = reqFilter.Like.replaceAll('%', '[%]').replaceAll('\"', '\\\\\"');\n\n var displayValueFieldName = requsiteName;\n switch (column.type) {\n case 'Reference':\n case 'Document':\n case 'Pick':\n displayValueFieldName = column.field;\n break;\n case 'Float':\n value = value.replaceAll(',', '.');\n break;\n }\n if (reqFilter.Like) expression = wrapWith.block(displayValueFieldName) + ' like \"%' + value + '%\"';\n\n if (column.type === 'Date' && !!reqFilter.Like) {\n var likeExpr = me._makeDateTimeLikeExpression(requsiteName, reqFilter.Like, column.dateType);\n if (!!likeExpr) expression = likeExpr;\n }\n break;\n case 'Equal':\n if (column.type === 'Date' && !!reqFilter.Equal) {\n // Для совместимости со старыми фильтрами.\n var d = Date.fromISO(reqFilter.Equal);\n if (!isNaN(d.getTime())) {\n var likeExpr = me._makeDateTimeLikeExpression(requsiteName, d, column.dateType);\n if (!!likeExpr) expression = likeExpr;\n }\n } else {\n if (reqFilter.Equal) {\n expression = wrapWith.block(requsiteName) + ' = ' + reqFilter.Equal;\n }\n }\n break;\n }\n\n return wrapWith.group(expression);\n })\n\n expression = _(expression).compact().join(' & ');\n return expression;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Формирует выражение фильтрации для like по указанной дате или дате со временем.\n _makeDateTimeLikeExpression: function (requsiteName, likeValue, dateType) {\n var me = this;\n var d = (typeof likeValue === 'string' ? parseDateTime(likeValue) : likeValue);\n\n if (!d) return;\n if (d.getFullYear() > 9999) return;\n\n if (!isNaN(d.getTime())) {\n if (dateType === 'DateTime') {\n return '(' + wrapWith.block(requsiteName) + ' >= #' + formatDateTime(d, 'dd.mm.yy hh:mm:00') + '# & ' +\n wrapWith.block(requsiteName) + ' < #' + formatDateTime(new Date(d.getTime() + 60000), 'dd.mm.yy hh:mm:00') + '#)'; //+1 мин.\n } else {\n return me._makeOneDayDateExpression(requsiteName, d);\n }\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Формирует выражение фильтрации по дате за один день.\n _makeOneDayDateExpression: function (requsiteName, d) {\n return this._makeDateBetweenExpression(requsiteName, d, d);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Формирует выражение фильтрации по интервалу дат.\n _makeDateBetweenExpression: function (requsiteName, d, d2) {\n var expression = '(' + wrapWith.block(requsiteName) + ' >= #' + formatDate(d, 'dd.mm.yy') + ' 00:00:00# & ';\n expression += wrapWith.block(requsiteName) + ' < #' + formatDate(new Date(d2.getTime() + 24 * 3600000), 'dd.mm.yy') + ' 00:00:00#)';\n return expression;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _getColumnExpression: function (filter, columnId) {\n var me = this;\n var currentFilter = _(filter).clone();\n delete currentFilter[columnId];\n var currentFilterExpr = me._convertToSBRSE(currentFilter);\n\n var GF = me._grid.state.GlobalPageFilter;\n if (GF) {\n if (currentFilterExpr) {\n return '(' + GF + ') & (' + currentFilterExpr + ')';\n } else {\n return GF;\n }\n } else {\n return currentFilterExpr;\n }\n },\n\n /**\n * Получение значений фильтрации для заполнения новой записи\n * @method WebAccess.components.dataViews.gridPlugins.FilteringPlugin#_getFillingRequisites\n * @private\n */\n _getFillingRequisites: function () {\n var me = this;\n var requisites = {};\n var value;\n _(me._controls).each(function (control) {\n var requsiteName = control.state.requisiteName;\n\n var column = _(me._grid._columns).find(function (col) {\n return col.id == requsiteName;\n });\n\n\n if (control.className === 'SelectListControl') {\n value = control.getValue();\n\n if (value.Type === 'In') {\n var record = value.In[0];\n\n if (!record) return;\n\n var today = new Date();\n\n switch (record.Value) {\n case SPECIAL_VALUE.BLANK:\n case SPECIAL_VALUE.NOBLANK:\n case SPECIAL_VALUE.ALL:\n return\n break\n case DATE_SPECIAL_VALUE.YESTERDAY:\n today.setDate(today.getDate() - 1);\n requisites[requsiteName] = formatDateTime(today);\n return\n break\n case DATE_SPECIAL_VALUE.TODAY:\n requisites[requsiteName] = formatDateTime(today);\n return\n break\n case DATE_SPECIAL_VALUE.TOMORROW:\n today.setDate(today.getDate() + 1);\n requisites[requsiteName] = formatDateTime(today);\n return\n }\n\n\n switch (column.type) {\n case 'String':\n requisites[requsiteName] = record.DisplayValue\n break;\n case 'Date':\n var d = parseDateTime(record.Value);\n if (!d) return;\n if (d.getFullYear() > 9999) return;\n\n requisites[requsiteName] = formatDateTime(d);\n break;\n default:\n requisites[requsiteName] = record.Value;\n }\n }\n\n if (value.Type === 'Equal' || value.Type === 'Like') {\n if (column.type === 'Date') {\n var date = value.Equal || value.Like;\n\n var d = parseDateTime(\"\" + date);\n if (!d) return;\n if (d.getFullYear() > 9999) return;\n requisites[requsiteName] = formatDateTime(d);\n }\n }\n\n };\n });\n return $.toJSON(requisites);\n },\n\n _updateControlsState: function () {\n var me = this;\n var CF = me._grid.state.CurrentFilter;\n var columnFilters = CF.ColumnsFilter;\n _(me._controls).each(function (c) {\n var column = c.state.column;\n switch (c.className) {\n case 'SelectListControl':\n\n var columnFilter = (!!columnFilters) ? columnFilters[column.id] : null;\n\n var like = (columnFilter) ? columnFilter.Like : '';\n var selectedRecords = (!!columnFilter && columnFilter.Type == 'In') ? columnFilter.In : [];\n var notSelectedRecords = (!!columnFilter && columnFilter.Type == 'Exclude') ? columnFilter.In : [];\n var invertedMode = !!notSelectedRecords.length;\n\n c.updateState({\n skip: 0,\n page: 0,\n expression: me._getColumnExpression(columnFilters, column.id),\n like: like,\n notSelectedRecords: notSelectedRecords,\n invertedMode: invertedMode,\n selectedRecords: selectedRecords\n });\n break;\n case 'DateControl':\n var equalValue = (columnFilters && columnFilters[column.id]) ? columnFilters[column.id].Equal : '';\n c.updateState({\n value: equalValue\n });\n break;\n }\n });\n }\n\n }, {\n EVENT: {\n FILTER_UPDATE: 'filterUpdate'\n }\n });\n\n /**\n * Оборачивание строки в различные скобки\n * @inner\n */\n var wrapWith = {\n group: function (str) {\n if (!str) return str;\n return '(' + str + ')';\n },\n block: function (str) {\n if (!str) return str;\n return '[' + str + ']';\n },\n space: function (str) {\n if (!str) return str;\n return ' ' + str + ' ';\n }\n }\n\n})(WA.components.dataViews.gridPlugins);\n","(function DetailsContextMenuLambda(global) {\n\n /*\n * Пункт меню \n */\n var ITEM = {\r\n ADD: 1,\n COPY: 2,\n DELETE: 3\r\n };\n\n /*\n * Имя реквизита \"Номер строки\" \n */\n var ROW_NUMBER = {\r\n VALUE: L('DETAIL_REQ_NUMBER'),\n DISPLAY_VALUE: 'Field_' + L('DETAIL_REQ_NUMBER')\r\n };\n\n /**\n * Контекстное меню для грида\n * @class Core.grid.DetailsContextMenu\n * @extends BaseObject\n */\n global.DetailsContextMenu = BaseObject.extend({\r\n _sectionNumber: null,\n _grid: null,\n _form: null,\n _clickedCell: 1,\n _clickedInContextMenu: false, //что бы событие addRow и выделение активной ячейки срабатывало только при вызове контекстного меню.\n\n init: function (dfmName) {\r\n var me = this;\n me._dfmName = dfmName;\n\n me._clickedCell = 1;\n me._clickedInContextMenu = false;\r\n\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n setGrid: function (grid) {\r\n this._grid = grid;\r\n },\n\n setForm: function (form) {\r\n this._form = form;\r\n },\n\n /**\n * Создание настроек для пунктов меню\n * @method Core.grid.DetailsContextMenu#generateItems\n */\n generateItems: function (event) {\r\n var me = this;\n var rowId = me._getRowIdFromEvent(event);\n var isTableDisabled = this._grid._table.isDisabled();\n\n var item = function (id, label, icon, opt_disabled) {\r\n return {\r\n \"name\": id,\n \"label\": L(label),\n \"icon\": icon,\n \"bottomSeparator\": false,\n \"disabled\": false || opt_disabled\r\n }\r\n };\n return [\n item(ITEM.ADD, 'ADD', 'cardCreate-16', !me._canAddNewRow() || isTableDisabled),\n item(ITEM.COPY, 'COPY', 'cardCopy-16', !rowId || !me._canCopyRow(rowId) || isTableDisabled),\n item(ITEM.DELETE, 'DELETE', 'delete-16', !rowId || isTableDisabled)\n ]\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Навесить обработчки на меню и свзяать их с гридом\n * @method Core.grid.DetailsContextMenu#generateSettings\n */\n bindActionsToMenuItems: function (menu, ev, grid) {\r\n var me = this;\n me._grid = grid;\n\n me._clickedCell = me._getCellNumberFromEvent(ev);\n me._clickedInContextMenu = true;\n\n var table = me._grid._table;\n //TODO Шамов А.: Оптимизировать, т.к. точно такое же есть в EditPlugin.js.\n table.bind('addRow', function (row) {\r\n if (me._clickedInContextMenu) {\r\n log.info('DETAILGRID', 'addRow in DetailsContextMenu');\n var grid = table._grid;\n var editor = grid.grid.getCellEditor();\n if (!!editor) {\n // Вызываем сохранение выбранного значения в текущем редакторе, что бы оно ушло в datasource и потом сохранилось в БД (замечание №103950).\n editor.commit();\r\n }\n setTimeout(function () {\n // Смещаем фокус на новую строку в ту же ячейку что и на предыдущей (замечание №103371).\n grid.grid.setActiveCell(grid.grid.getDataLength() - 1, me._clickedCell);\n grid.grid.editActiveCell();\n me._clickedInContextMenu = false;\r\n }, 100);\r\n }\r\n });\n\n menu.bind('itemSelect', function (item, menu, event) {\r\n var rowId = me._getRowIdFromEvent(event);\n\n switch (item.name) {\r\n case ITEM.ADD:\n me.addRow();\n break\n case ITEM.COPY:\n if (!rowId) return;\n me.copyRow(rowId);\n break\n case ITEM.DELETE:\n if (!rowId) return;\n me.deleteRow(rowId);\n break\r\n }\r\n });\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавление новой строки \n * @method Core.grid.DetailsContextMenu#addRow \n */\n addRow: function () {\r\n if (this._canAddNewRow()) {\r\n this._grid._table.addRow();\r\n }\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Копирование строки. \n * @method Core.grid.DetailsContextMenu#copyRow \n * @param {integer} rowId ид строки\n */\n copyRow: function (id) {\r\n var me = this;\n var row, rows, reqArray;\n\n var currTable = me._grid._table;\n var detailNum = currTable.detailNum;\n var tablesArr = me._form.details[detailNum].getTables().toArray(); //FIXME: Хз, что делать\n\n // Сначала удаляем пустую строку, если она есть.\n var rowsArr = currTable.rows.toArray();\n for (var i = 0; i < rowsArr.length; i++) {\r\n row = rowsArr[i];\n if (row.isNew() && !row.isChanged()) {\r\n row.remove();\r\n }\r\n }\n\n // Проверить наличие колонок с CanGUIRead = true. Если такие имеются, то в них содержатся\n // \"*\", а не корректные данные\n var currentTableColumns = currTable.columns;\n var hasColumnWithDisabledGuiChange = currentTableColumns.toArray().some(function (column) {\r\n return !column.getCanGUIRead();\r\n });\n\n // Собираем реквизиты со всех вкладок.\n var requisites = {};\r\n for (var t = 0; t < tablesArr.length; t++) {\r\n rows = tablesArr[t].rows;\n row = rows[id];\n if (row) {\r\n reqArray = row.requisites.toArray();\n\n // Создадим словарь\n $.extend(requisites, _.chain(reqArray)\n .filter(function (req) {\r\n var currentColumn = currentTableColumns[req.name];\r\n return !req.isSystem() && currentColumn.getCanGUIRead() && currentColumn.isVisible();\r\n })\n .map(function (item) {\r\n return [item.name, {\r\n value: item.getValue(),\n displayValue: item.getDisplayValue(),\n needTriggerResult: true\r\n }]\r\n }).object().value());\r\n }\r\n }\n\n // Если детальный раздел только один, то копируем на клиенте, иначе копируем на сервере (замечание №104110).\n if (tablesArr.length === 1 && !hasColumnWithDisabledGuiChange) {\n // Копируем строку.\n this._grid._table.addRow(requisites, function (row) {\r\n reqArray = row.requisites.toArray();\n _(reqArray).each(function (req) {\r\n req.touch(); //Если так не делать, то после копирования невозможно будет добавить новую строку\n })\r\n });\r\n\n } else {\n // Копируем строку на сервере (замечание №104110).\n this._grid._table.copyRowOnServer(id, requisites, function (row) {\r\n reqArray = row.requisites.toArray();\n _(reqArray).each(function (req) {\r\n req.touch(); //Если так не делать, то после копирования невозможно будет добавить новую строку\n })\r\n });\r\n }\n\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удаление строки\n * @method Core.grid.DetailsContextMenu#deleteRow\n * @param {integer} rowId ид строки\n */\n deleteRow: function (rowId) {\r\n this._grid._table.deleteRow(rowId);\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить ид-строки над которой было вызвано контекстное меню\n * @method Core.grid.DetailsContextMenu#_getRowIdFromEvent\n * @private\n * @return {integer}\n */\n _getRowIdFromEvent: function (event) {\r\n var target = event.target || event.srcElement;\n var jRow = $(target).parents('div.slick-row');\n var rowId = jRow.attr('id');\n return rowId;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить номер колонки над которой было вызвано контекстное меню\n * @method Core.grid.DetailsContextMenu#_getRowIdFromEvent\n * @private\n * @return {integer}\n */\n _getCellNumberFromEvent: function (event) {\r\n var target = $(event.target || event.srcElement);\n var jCell;\n if (target.hasClass('slick-cell')) {\r\n jCell = target;\r\n } else {\r\n jCell = target.parents('.slick-cell:first');\r\n }\n return jCell.index();\r\n },\n\n /**\n * Проверка возможности копирования строки\n * @method Core.grid.DetailsContextMenu#_canCopyRow\n * @private\n * @return {boolean}\n */\n _canCopyRow: function (rowId) {\r\n var row = this._grid._table.rows[rowId];\n if (row.hasFilledRequisites()) {\n return true;\n } else {\n return false;\n }\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверка возможности добавления новой строки\n * @method Core.grid.DetailsContextMenu#_canAddNewRow\n * @private\n * @return {boolean}\n */\n _canAddNewRow: function () {\r\n var table = this._grid._table;\n var rows = table.rows.toArray();\n\n if (rows.length) {\r\n var lastRow = rows[rows.length - 1];\n if (lastRow.hasFilledRequisites()) {\n return true;\n } else {\n return false;\n }\n } else {\n return true\n }\r\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\r\n\n})(window.WA.components.dataViews.gridPlugins);","(function checkboxPlugin(global) {\r\n \"use strict\";\r\n\r\n /**\r\n * Плагин для возможности редактирования грида\r\n * @class WebAccess.components.dataViews.gridPlugins.EditPlugin\r\n * @extends WebAccess.Plugin\r\n * @property {string} name Имя плагина. \r\n * @since 5.2.0.1300\r\n */\r\n global.EditPlugin = WA.Plugin.extend({\r\n name: 'EditPlugin',\r\n _pending: null,\r\n // Грид. \r\n _grid: null,\r\n _selectionModel: null,\r\n _exceptions: null,\r\n _bindedTables: [],\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Регистрация плагина.\r\n * @method WebAccess.components.dataViews.gridPlugins.EditPlugin#register\r\n * @param {WebAccess.components.dataViews.Grid} grid расширяемый объект(в данном конкреном случае - это грид).\r\n * @since 5.2.0.1300\r\n * @return {object} публичные методы доступные расширяемому объекту.\r\n */\r\n register: function (grid) {\r\n\r\n var me = this;\r\n me._exceptions = ['.contextmenu', '.rs_results', '.ui-datepicker', '.rs_tr_odd', '.rs_tr_even', '.rs_RefCaption'];\r\n me._grid = grid;\r\n me._grid.bind(WA.CMP.DV.Grid.EVENT.BEFORE_GRID_INIT, me._onGridBeforeInit, me);\r\n me._grid.bind(WA.CMP.DV.Grid.EVENT.GRID_INIT, me._onGridInit, me);\r\n me._grid.bind(WA.CMP.DV.Grid.EVENT.COLUMN_INIT, me._onColumnInit, me);\r\n me._bindedTables = [];\r\n\r\n log.info('GRID', 'Edit plugin registered');\r\n return {};\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Хэндлер события до инициализации грида.\r\n * @method WebAccess.components.dataViews.gridPlugins.EditPlugin#_onGridBeforeInit\r\n * @param {string} containerSelector селектор контейнера для грида.\r\n * @param {Object} dataView представление данных.\r\n * @param {Object} columns описания всех колонок.\r\n * @param {Object} settings настройки грида.\r\n * @private\r\n * @since 5.2.0.1100\r\n */\r\n _onGridBeforeInit: function (containerSelector, dataView, columns, byref_settings) {\r\n var me = this;\r\n byref_settings.enableCellNavigation = true,\r\n byref_settings.editable = true;\r\n byref_settings.autoEdit = true;\r\n //byref_settings.enableAddRow = true; \r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Обработчик события инициализации грида.\r\n * @method WebAccess.components.dataViews.gridPlugins.EditPlugin#_onGridInit\r\n * @private\r\n * @since 5.2.0.1100\r\n */\r\n _onGridInit: function (grid) {\r\n var me = this;\r\n\r\n // Для планшетов и сматфонов отключаем возможность выделять ячейки и строки, что бы заработала прокрутка.\r\n if (!WA.ENV.isTouch()) {\r\n me._selectionModel = new Slick.CellSelectionModel();\r\n grid.setSelectionModel(me._selectionModel);\r\n } else {\r\n me._selectionModel = new Slick.StubSelectionModel();\r\n grid.setSelectionModel(me._selectionModel);\r\n }\r\n\r\n grid.onCellChange.subscribe(function (e, args) {\r\n var row = args['item'];\r\n var colNum = args['cell'];\r\n var columns = grid.getColumns();\r\n var column = columns[args.cell];\r\n me._grid.fire('requisiteChange', column.id, row.id, row[column.id], row[column.field]);\r\n });\r\n\r\n grid.onEditorInit.subscribe(function (e, args) {\r\n var row = args['item'];\r\n var colNum = args['cell'];\r\n var columns = grid.getColumns();\r\n var column = columns[args.cell];\r\n var editor = args.editor;\r\n me._grid.fire('editorInit', column.id, row.id, row[column.id], row[column.field], editor);\r\n })\r\n\r\n grid.onBeforeCellEditorDestroy.subscribe(function (e, args) {\r\n me._grid.fire('editorDestroy', e, args);\r\n });\r\n\r\n grid.onGetEditor.subscribe(function (ev, byref_editor) {\r\n me._grid.fire('getEditor', byref_editor);\r\n });\r\n\r\n // Для планшетов и сматфонов отключаем клавиатурную навигацию.\r\n if (!WA.ENV.isTouch()) {\r\n /**\r\n * Клавиатурная навигация:\r\n * Добавление и удаление строк при перемещении курсора вниз.\r\n */\r\n var lastActiveCell; // Вынесена тут, что бы в событиях addRow и deleteRow были актуальные данные, получаемые по этой ссылке.\r\n var needRestoreEditorAfterReload = false;\r\n\r\n grid.onKeyDown.subscribe(function (e, args) {\r\n var key = e.keyCode;\r\n var table = me._grid._table;\r\n if (!table || table.isDisabled()) return;\r\n var rows = table.rows.toArray();\r\n var lastRow = rows[rows.length - 1];\r\n lastActiveCell = [args.row - 1, args.cell];\r\n var grid = me._grid.grid;\r\n\r\n // Что бы много раз не биндись, а вынести их события не получается, т.к. table появляется не сразу.\r\n if (me._bindedTables.indexOf('addRow' + me._grid.settings.DFMName) === -1) {\r\n // Смещаем фокус на новую строку в ту же ячейку что и на предыдущей.\r\n table.bind(table['class'].EVENT.ROW_ADDED, function (row) {\r\n log.info('DETAILGRID', 'addRow event in EditPlugin');\r\n // Вызываем сохранение выбранного значения в текущем редакторе, что бы оно ушло в datasource и потом сохранилось в БД (замечание №103950).\r\n var editor = grid.getCellEditor();\r\n if (!!editor) {\r\n editor.commit();\r\n }\r\n lastActiveCell[0] = grid.getDataLength() - 1;\r\n grid.setActiveCell(lastActiveCell[0], lastActiveCell[1]);\r\n grid.editActiveCell();\r\n\r\n //После добавления строки данные могут обновиться, поэтому востанавливаем редактируемую ячейку после загрузки данных.\r\n needRestoreEditorAfterReload = true;\r\n });\r\n\r\n me._bindedTables.push('addRow' + me._grid.settings.DFMName);\r\n }\r\n\r\n // Что бы много раз не биндись, а вынести их события не получается, т.к. table появляется не сразу.\r\n if (me._bindedTables.indexOf('deleteRow' + me._grid.settings.DFMName) === -1) {\r\n table.bind('deleteRow', function (row) {\r\n log.info('DETAILGRID', 'deleteRow event in EditPlugin');\r\n setTimeout(function () { //что бы не перескакивало 1 строку\r\n lastActiveCell[0] = grid.getDataLength() - 1;\r\n grid.setActiveCell(lastActiveCell[0], lastActiveCell[1]);\r\n grid.editActiveCell();\r\n\r\n //После удалении строки данные могут обновиться, поэтому востанавливаем редактируемую ячейку после загрузки данных.\r\n needRestoreEditorAfterReload = true;\r\n }, 100);\r\n });\r\n me._bindedTables.push('deleteRow' + me._grid.settings.DFMName);\r\n }\r\n\r\n // Что бы много раз не биндись, а вынести их события не получается, т.к. table появляется не сразу.\r\n if (me._bindedTables.indexOf('dataReloaded' + me._grid.settings.DFMName) === -1) {\r\n table.bind(table['class'].EVENT.DATA_RELOADED, function (row) {\r\n log.info('DETAILGRID', 'dataReloaded event in EditPlugin');\r\n if (needRestoreEditorAfterReload) {\r\n grid.setActiveCell(lastActiveCell[0], lastActiveCell[1]);\r\n grid.editActiveCell();\r\n needRestoreEditorAfterReload = false;\r\n }\r\n });\r\n me._bindedTables.push('dataReloaded' + me._grid.settings.DFMName);\r\n }\r\n\r\n if (key === $.ui.keyCode.DOWN) {\r\n if (args.row + 1 == grid.getDataLength()) {\r\n if (lastRow.hasFilledRequisites()) {\r\n table.addRow();\r\n }\r\n }\r\n }\r\n\r\n if (key === $.ui.keyCode.UP) {\r\n if (args.row + 1 == grid.getDataLength()) {\r\n if (!lastRow.hasFilledRequisites()) {\r\n lastRow.remove()\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Скролим вниз при добавлении новой строки\r\n */\r\n me._grid.dataView.onAddNewItem.subscribe(function (e, item) {\r\n //me._grid.reSortColumns(); #103533\r\n var index = me._grid.dataView.getIdxById(item.id);\r\n grid.scrollRowToTop(index, true);\r\n });\r\n\r\n /**\r\n * Навешиваем события, чтобы при клике на таблицу добавлялась новая строка\r\n * @since 5.2.0.1303\r\n */\r\n WA.DetailsInit.done(function () {\r\n $(document).on('mouseup.editplugin', $.proxy(me._onFocusOrUnFocus, me));\r\n })\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * При фокусе на таблицу добавлем новую строку если таблица пустая и Удаляем созданную строку при потере фокуса\r\n * @since 5.2.0.1303\r\n */\r\n _onFocusOrUnFocus: function (e) {\r\n var me = this;\r\n\r\n var targetInExceptions = function (target) {\r\n var result = !!_(me._exceptions).find(function (ex) {\r\n return $(target).hasAncestor(ex).length\r\n });\r\n return result;\r\n }\r\n\r\n var container = $(me._grid.containerSelector);\r\n var target = e.target;\r\n\r\n // В IE10 c SVG работать надо не так как обычно https://stackoverflow.com/questions/33672395/use-within-svg-not-finding-closest-div-in-ie\r\n if (target.correspondingUseElement) {\r\n target = target.correspondingUseElement;\r\n\r\n // Поднимаемся до уровня оборачивающей svg div'ки. Тут target - use, target.parentNode - SvgElement.\r\n target = target.parentNode.parentNode;\r\n }\r\n\r\n //FIX #5667: В IE при нажатии на скролбар в выпадающем списке, снивается фокус с input и ставится на div с выпадающим списком, поэтому проверяем текущий зафокусированный элемент на исключения.\r\n if (!container.is(target) && container.has(target).length === 0 && !targetInExceptions(target) && !targetInExceptions(document.activeElement)) {\r\n\r\n // Нажали мышкой не в область грида (focusout, blur).\r\n log.info('DETAILGRID', 'onBlur event in EditPlugin');\r\n\r\n // Если кликнули на другой грид (не текущий обрабатываемый) или вообще в пустое место, что бы текущий не сбросил key scope. \r\n window._needSetGridsKeyScope = window._needSetGridsKeyScope || false;\r\n\r\n var table = me._grid._table;\r\n if (!table || !table.rows) return;\r\n\r\n me._grid.grid.navigateUp();\r\n me._grid.grid.resetActiveCell();\r\n me._grid.grid.setSelectedRows([]);\r\n\r\n var rows = table.rows.toArray();\r\n var lastRow = rows[rows.length - 1];\r\n if (rows.length === 1 && lastRow && !lastRow.hasFilledRequisites()) {\r\n lastRow.remove();\r\n }\r\n // Убрать режим редактирования с текущей ячейки\r\n me._grid.grid.setActiveCell(null);\r\n me._grid.grid.setSelectedRows([]);\r\n\r\n me.isFocused = false;\r\n } else {\r\n\r\n //#108739 \r\n if ($(target).hasClass('rs_td') || $('.ui-datepicker').has($(target)).length || $('.contextmenu__item').has($(target)).length) {\r\n return;\r\n }\r\n\r\n // Нажали мышкой в область грида (focusin, focus). \r\n // Кликнули на грид надо что бы key scope стал равен grid в любом случае (даже если другие гриды хотят поменять его на общий). \r\n window._needSetGridsKeyScope = true;\r\n\r\n // if (!me.isFocused) { // #108827\r\n log.info('DETAILGRID', 'onFocus event in EditPlugin');\r\n var table = me._grid._table;\r\n if (table && !table.isDisabled() && !table.rows.count()) table.addRow();\r\n\r\n me.isFocused = true;\r\n //}\r\n }\r\n\r\n // Устанавливаем область глобального обработчика горячих клавишь.\r\n // Через timeout, что бы остальные гридов не сбросили key scope.\r\n clearTimeout(window._setGridsKeyScopeTimeout);\r\n window._setGridsKeyScopeTimeout = setTimeout(function () {\r\n var globalKeyScope;\r\n\r\n if (window._needSetGridsKeyScope) {\r\n globalKeyScope = 'grid';\r\n } else {\r\n globalKeyScope = $('.ui-dialog').length ? 'baseDialog' : 'common';\r\n }\r\n key.setScope(globalKeyScope);\r\n\r\n window._needSetGridsKeyScope = false;\r\n }, 50);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Назначивание редакторов для колонок\r\n * @method WebAccess.components.dataViews.gridPlugins.EditPlugin#_onGridInit\r\n * @private\r\n * @since 5.2.0.1100\r\n */\r\n _onColumnInit: function (byref_column) {\r\n switch (+byref_column.type) {\r\n case REQUISITE_TYPE.STRING:\r\n byref_column.editor = function (args) {\r\n return new global._editors.StringEditor(args);\r\n };\r\n break;\r\n\r\n case REQUISITE_TYPE.TEXT:\r\n byref_column.editor = function (args) {\r\n return new global._editors.TextEditor(args);\r\n };\r\n break;\r\n\r\n case REQUISITE_TYPE.REFERENCE:\r\n byref_column.editor = function (args) {\r\n return new global._editors.ReferenceEditor(args);\r\n };\r\n break;\r\n\r\n case REQUISITE_TYPE.PICK:\r\n byref_column.editor = function (args) {\r\n return new global._editors.PickEditor(args);\r\n };\r\n break;\r\n\r\n case REQUISITE_TYPE.DATE:\r\n byref_column.editor = function (args) {\r\n return new global._editors.DateEditor(args);\r\n };\r\n break;\r\n\r\n case REQUISITE_TYPE.LARGE_INTEGER:\r\n case REQUISITE_TYPE.INTEGER:\r\n byref_column.editor = function (args) {\r\n return new global._editors.IntegerEditor(args);\r\n };\r\n break;\r\n\r\n case REQUISITE_TYPE.FLOAT:\r\n byref_column.editor = function (args) {\r\n return new global._editors.FloatEditor(args);\r\n };\r\n break;\r\n\r\n case REQUISITE_TYPE.DOCUMENT:\r\n byref_column.editor = function (args) {\r\n return new global._editors.DocumentEditor(args);\r\n };\r\n break;\r\n }\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \r\n });\r\n\r\n})(WA.components.dataViews.gridPlugins);","(function gridDefenition(global) {\n \"use strict\";\n\n var ASTERISK = '*';\n\n /**\n * Таблица.\n *\n * @class WebAccess.components.dataViews.Grid\n * @extends BaseObject\n * @mixes WebAccess.mixins.pluginMixin\n * @since 5.2.0.1100\n * @param {string} Блок, содержащий таблицу\n * @param {WebAccess.components.dataViews.DataProvider} Класс, предоставляющий данные для таблицы\n * @param {Array} Список колонок таблицы\n * @param {Object} Дополнительные параметры\n * @property {dxGrid} dxGrid Ссылка на экземпляр таблицы\n * @property {object} state Объект, хранящий параметры текущей таблицы\n * @property {array} _table Cвязанный объект таблицы клиентской ОМ\n */\n global.components.dataViews.Grid = BaseObject.extend([global.mixins.pluginMixin], {\n _columns: [],\n settings: null,\n state: null,\n containerSelector: null,\n _queryDelay: null,\n _saveStateDelay: null,\n _table: null,\n\n /**\n * Провайдер данных для таблицы\n * @private\n */\n _dataSource: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (containerSelector, dataSource, columns, settings) {\n var me = this;\n\n log.info('GRID', 'Grid initialization');\n me.settings = {\n getRowAdditionalInfo: null, /*\n Формат этого свойства:\n function (rowNumber) {\n return {\n cssClasses: '',\n attributes: {}\n }\n }\n */\n cellTemplate: null,\n plugins: null\n };\n\n if (!dataSource) WA.raise(L('DATA_SOURCE_NOT_SET'));\n\n me._super(containerSelector, dataSource, columns);\n me._columns = [];\n\n $.extend(me.settings, settings);\n me.containerSelector = containerSelector;\n me._dataSource = dataSource;\n\n\n me._dataSource.loadState().always(function (state) {\n me.state = state || {};\n me._columns = me._initializeColumns(columns);\n\n //Списка видимых колонок может не быть в состоянии (профиле), поэтому означим их по данным колонок.\n if (!me.state.VisibleColumns || me.state.VisibleColumns.length == 0) {\n me.updateState({\n VisibleColumns: _(me.getVisibleColumns()).map(function (col) { return col.id; })\n });\n }\n\n // Событие для возможности модифицировать состоение грида, после его загрузки.\n me.fire(WA.CMP.DV.Grid.EVENT.STATE_LOADED);\n\n me._initializeGrid(containerSelector);\n })\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Связывает с таблицей клиентской ОМ.\n * @method WebAccess.components.dataViews.Grid#setTable\n * @since 5.2.0.1100\n */\n setTable: function (table) {\n this._table = table;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить таблицу, связанную с текущим гридом.\n * @method WebAccess.components.dataViews.Grid#getTable\n * @since 5.5.0.2703\n */\n getTable: function() {\n return this._table;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает список колонок.\n * @method WebAccess.components.dataViews.Grid#getColumns\n * @since 5.4.0.1021\n * @return {Array} Список колонок.\n */\n getColumns: function () {\n return this._columns;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Изменяет колонки таблицы.\n *\n * @method WebAccess.components.dataViews.Grid#setColumns\n * @param {Array} newColumns Список колонок\n * @since 5.4.0.1021\n * @return {WebAccess.components.dataViews.Grid} Grid Таблица.\n */\n setColumns: function (newColumns) {\n var me = this;\n log.info('GRID', 'Updating columns');\n\n me._columns = newColumns;\n\n var nextVisibleColumns = me.getVisibleColumns();\n me.grid.setColumns(nextVisibleColumns);\n me.dataView.setColumns(nextVisibleColumns);\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает список видимых колонок.\n * @method WebAccess.components.dataViews.Grid#getVisibleColumns\n * @since 5.2.0.1100\n * @return {Array} Список видимых колонок.\n */\n getVisibleColumns: function () {\n return _(_(this._columns).filter(function (column) {\n return column.visible;\n })).sortBy(function (column) {\n return column.index;\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация компоненты грида devExtreme\n * @method WebAccess.components.dataViews.Grid#_initializeGrid\n * @private\n * @since 5.2.0.1100\n * @return {WebAccess.components.dataViews.Grid} Grid\n */\n _initializeGrid: function () {\n var me = this;\n var columnFilters = {};\n\n var options = {\n //showHeaderRow: true, FIXME: Это не здесь должно задаваться и отсутствеие этого здесь ломает фильтрацию\n headerRowHeight: 36,\n rowHeight: 30,\n explicitInitialization: true,\n syncColumnCellResize: true,\n // enableColumnReorder: false, для отключения перетаскивания колонок в записях справочников, документах и диалогах\n // чтобы не было проблем при показе после скрытия.\n enableColumnReorder: WA.getLocation() === 'referencerecords'\n };\n\n me.dataView = new Slick.Data.DataView();\n\n var visColumns = me.getVisibleColumns();\n me.fire(WA.CMP.DV.Grid.EVENT.BEFORE_GRID_INIT, me.containerSelector, me.dataView, visColumns, options);\n\n // Означиваем метод для получения дополнительной информации о строке.\n if (me.settings.getRowAdditionalInfo) {\n me.dataView['getItemAdditionalMetadata'] = me.settings.getRowAdditionalInfo;\n }\n me.grid = new Slick.Grid(me.containerSelector, me.dataView, visColumns, options);\n me.grid._parent = me;\n\n me.fire(WA.CMP.DV.Grid.EVENT.GRID_INIT, me.grid);\n\n me.dataView.onRowCountChanged.subscribe(function (e, args) {\n me.grid.updateRowCount();\n me.grid.render();\n });\n\n me.dataView.onRowsChanged.subscribe(function (e, args) {\n me.grid.invalidateRows(args.rows);\n me.grid.render();\n });\n\n //При изменении порядка колонок некоторые колонки могут быть скрыты или добавлены, все происходит в одном месте,\n //поэтому требуется проследить чтобы данные о видимых колонках были актуальны.\n me.grid.onColumnsReordered.subscribe(function (ev, columns) {\n if (columns && columns.VisibleColumns) me.updateState({ VisibleColumns: columns.VisibleColumns }, true);\n });\n\n me.grid.init();\n me.reloadData();\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сохраняет параметры таблицы.\n *\n * @param {object} state Параметры\n * @param {boolean} opt_force Признак принудительного сохранения параметров\n * @method WebAccess.components.dataViews.Grid#updateState\n * @since 5.2.0.1100\n * @return {WebAccess.components.dataViews.Grid} Таблица.\n */\n updateState: function (state, opt_force) {\n var me = this;\n\n log.info('GRID', 'Updating state');\n\n var prevState = me.state;\n var newState = $.extend({}, me.state, state);\n\n me.state = newState;\n\n //TODO Оптимизировать - не для каждого изменения состояния надо его сохранять. Например, при изменении номера страницы не надо.\n if ($.toJSON(newState) !== $.toJSON(prevState) || opt_force === true) {\n clearTimeout(me._saveStateDelay); //для сокращения запросов на сервер ВД.\n me._saveStateDelay = setTimeout(function () {\n me._dataSource.saveState(me.state, opt_force).done(function () {\n log.info('GRID', 'New state saved to userprofile');\n }).fail(function (err) {\n log.error(\"GRID\", \"Can't save state: \" + err);\n });\n }, 100);\n\n log.debug('GRID', 'New state is:' + $.toJSON(me.state));\n } else {\n log.debug('GRID', 'State not changed');\n }\n\n return me;\n },\n\n /**\n * Загружает и обновляет таблицу с учетом переданных параметров.\n *\n * @param {object} options Параметры запроса\n * @method WebAccess.components.dataViews.Grid#reloadData\n * @since 5.2.0.1100\n * @return {Deferred} Deferred-объект.\n */\n reloadData: function (options) {\n var me = this;\n var result = $.Deferred();\n var jContainer = $(me.containerSelector);\n var fadeSpeed = 'fast';\n log.info('GRID', 'Reloading data');\n\n WA.CR.spinner && WA.CR.spinner.show();\n\n options = options || {};\n\n clearTimeout(me._queryDelay);\n me._queryDelay = setTimeout(function () {\n var fadeTO = setTimeout(function () { jContainer.fadeTo(fadeSpeed, .6); }, 500);\n\n var loadOptions = $.extend({}, me.state, options);\n me.updateState(loadOptions);\n\n log.info('GRID', 'Reloading data on timeout');\n me.fire(WA.CMP.DV.Grid.EVENT.BEFORE_DATA_LOADED, loadOptions);\n me._dataSource.load(loadOptions).done(function (data) {\n\n var pageIndex = data.PageIndex;\n var records = data.Rows;\n\n // Сохраняем новый номер страницы, т.к. она могла поменятся при переходе на последнюю страницу.\n me.updateState({ PageIndex: pageIndex });//fixme не его логика\n\n me.fire(WA.CMP.DV.Grid.EVENT.DATA_LOADED, pageIndex, !!records ? records.length : 0, records);\n\n me.dataView.setItems(records);\n me.grid.invalidate();\n me.dataView.endUpdate();\n\n me.fire(WA.CMP.DV.Grid.EVENT.AFTER_DATA_LOADED, data);\n result.resolve(data);\n }).always(function () {\n clearTimeout(fadeTO);\n jContainer.fadeTo(fadeSpeed, 1);\n WA.CR.spinner && WA.CR.spinner.hide();\n });\n\n }, 100);\n\n return result;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Перевод колонок из формата серверного в формат понятный devExtreme\n * @private\n * @param {array} список колонок\n * @method WebAccess.components.dataViews.Grid#_initializeColumns\n * @since 5.2.0.1100\n * @return {array} список колонок\n */\n _initializeColumns: function (rawColumns) {\n var me = this;\n var ALIGNMENT_RIGHT = 1;\n\n var columns = _(rawColumns).map(function (column) {\n var isSpecialColumn = (column.Name.charAt(0) === '_');\n\n var isRequired = column.IsRequired === true || column.IsRequired === 'True';\n\n var cssClass = (isSpecialColumn ? 'centered' : '');\n if (column.TextAlign == ALIGNMENT_RIGHT) cssClass += \" text_align_right\"\n\n var columnSettings = {\n name: (isRequired ? ASTERISK : '') + column.Caption,\n id: column.Name,\n field: column.Field,\n cssClass: cssClass,\n sortable: false,\n visible: column.IsVisible === true || column.IsVisible === 'True',\n resizable: false,\n width: +column.Width,\n index: column.Index,\n hint: column.Hint,\n type: column.Type,\n dateType: column.DateType,\n isRequired: isRequired,\n hasCalculation: column.HasCalculation === true || column.HasCalculation === 'True',\n isReadOnly: column.IsReadOnly === true || column.IsReadOnly === 'True',\n requisite: column.Requisite,\n precision: column.Precision\n };\n\n\n if (column.Type == REQUISITE_TYPE.DATE && WA.ENV.isTouch()) {\n columnSettings['minWidth'] = 90;\n };\n\n if (me.state.VisibleColumns && !isNaN(me.state.VisibleColumns.indexOf(column.Name)) && WA.getLocation() === 'referencerecords') {\n columnSettings['index'] = me.state.VisibleColumns.indexOf(column.Name);\n }\n\n // Шаблонизатор значений в ячейках.\n if (me.settings.cellTemplate) {\n columnSettings['formatter'] = me.settings.cellTemplate;\n }\n\n if (me.settings.asyncPostRender) {\n columnSettings['asyncPostRender'] = me.settings.asyncPostRender\n }\n\n if (me.settings.editor) {\n columnSettings['editor'] = me.settings.editor\n }\n\n me.fire(WA.CMP.DV.Grid.EVENT.COLUMN_INIT, columnSettings);\n return columnSettings;\n });\n\n return columns;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _excludeSpecialColumns: function (columns) {\n return _(columns).filter(function (column) {\n return (column.id != '_ContextMenu'\n && column.id != '_Checkbox'\n && column.id != '_SelectRecord');\n });\n },\n\n /**\n * Получает список колонок для выбора видимых колонок.\n *\n * @method WebAccess.components.dataViews.Grid#getColumnsForDialog\n * @since 5.2.0.1100\n * @return {array} Список колонок.\n */\n getColumnsForDialog: function () {\n var me = this;\n var columns = me._excludeSpecialColumns(_(this._columns).clone());\n this.fire(WA.CMP.DV.Grid.EVENT.GET_COLUMNS_FOR_DIALOG, columns);\n return columns;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает список видимых колонок для выбора видимых колонок.\n\n * @description В первый раз список получается из данных, которые пришли с сервера.\n * Если пользователь что-то выбирал, выборка колонок\n * делается на основе актуальных измененных данных dx-грида с учетом выбранных в\n * предыдущий раз видимых колонок.\n * @since 5.2.0.1100\n * @method WebAccess.components.dataViews.Grid#getVisibleColumnsForDialog\n * @return {array} columns Список колонок.\n */\n getVisibleColumnsForDialog: function () {\n var me = this;\n var columns = me._excludeSpecialColumns(this.getVisibleColumns());\n this.fire(WA.CMP.DV.Grid.EVENT.GET_VISIBLE_COLUMNS_FOR_DIALOG, columns);\n return columns;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n setVisibleColumnsFromDialog: function (newColumns) {\n this.fire(WA.CMP.DV.Grid.EVENT.SET_VISIBLE_COLUMNS_FROM_DIALOG, newColumns);\n this.setVisibleColumns(newColumns);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавляет колонки в список видимых.\n *\n * @method WebAccess.components.dataViews.Grid#setVisibleColumns\n * @param {array} newColumns Список видимых колонок\n * @since 5.2.0.1100\n * @return {WebAccess.components.dataViews.Grid} Grid Таблица.\n */\n setVisibleColumns: function (newColumns) {\n var me = this;\n log.info('GRID', 'Updating visible columns');\n this.fire(WA.CMP.DV.Grid.EVENT.SET_VISIBLE_COLUMNS, newColumns);\n\n newColumns = me._excludeSpecialColumns(newColumns);\n var visibleIds = _(newColumns).map(function (c) { return c.id });\n\n me._columns = _(me._columns).map(function (column) {\n var isSpecialColumn = (column.id.charAt(0) === '_');\n var index = visibleIds.indexOf(column.id);\n if (index !== -1 || isSpecialColumn) {\n column.visible = true;\n column.index = index;\n } else {\n column.visible = false;\n if (WA.getLocation() === 'referencerecords') {\n column.index = 0;\n }\n }\n return column;\n });\n\n var visibleColumns = me.getVisibleColumns();\n\n\n me.dataView.setColumns(visibleColumns);\n me.grid.setColumns(visibleColumns);\n\n me.reloadData({\n VisibleColumns: _(visibleColumns).pluck('id') || [],\n QueryInstanceID: generateUniqueID()\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрытие колонки при добавление группировки по ней\n * @private\n * @method WebAccess.components.dataViews.Grid#hideColumn\n */\n hideColumn: function (id) {\n log.debug('GRID', 'Hiding columns ' + id);\n var me = this;\n var columns = me.getVisibleColumns();\n var newColumns = _(columns).filter(function (col) {\n return id !== col.id;\n });\n\n me.setVisibleColumns(newColumns);\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показ колонки при удалении группировки по ней\n * @private\n * @method WebAccess.components.dataViews.Grid#showColumn\n */\n showColumn: function (id, opt_index) {\n log.debug('GRID', 'Showing column ' + id);\n log.debug('GRID', 'Showing column index' + opt_index);\n var me = this;\n var columns = me._columns;\n var oldColumns = me.getVisibleColumns();\n\n var newColumn = _(me._columns).find(function (col) {\n return id == col.id;\n });\n\n if (newColumn) {\n oldColumns.splice(opt_index || 0, 0, newColumn);\n me.setVisibleColumns(oldColumns);//здесь порядок имеет значение из него строятся индексы\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @function isCurrentPeriodEnabled - функция получает текущее состояние фильтра по периоду.\n * @returns {boolean} - true - если фильтр по периоду включен, false - если фильтр по периоду отключен.\n */\n isCurrentPeriodEnabled: function () {\n return (typeof WA.CR.toolBar.buttons.ToggleCurrentPeriod === 'object' && WA.CR.toolBar.buttons.ToggleCurrentPeriod.isSelected());\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n }, {\n EVENT: {\n /**\n * Срабатывает после вызова конструктора.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.CLASS_INIT\n * @param {object} context ссылка на экземпляр класса\n */\n CLASS_INIT: 'classInit',\n\n /**\n * Срабатывает до инициализации таблицы.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.BEFORE_GRID_INIT\n * @param {string} containerSelector Селектор основного контейнера\n * @param {object} dataView Класс представления\n * @param {array} visibleColumns Список видимых колонок\n * @param {object} options Параметры таблицы\n */\n BEFORE_GRID_INIT: 'gridBeforeInit',\n\n /**\n * Срабатывает после запуска конструктора.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.GRID_INIT\n * @param {object} context ссылка на экземпляр класса\n */\n GRID_INIT: 'gridInit',\n\n /**\n * Срабатывает после инициализации таблицы перед загрузкой данных.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.BEFORE_DATA_LOADED\n * @param {object} state Параметры запроса\n */\n BEFORE_DATA_LOADED: 'beforeDataLoaded',\n\n /**\n * Срабатывает после загрузки данных.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.DATA_LOADED\n * @param {integer} pageIndex Номер страницы\n * @param {integer} count Количество записей таблицы\n * @param {array} records Полученные записи таблицы\n */\n DATA_LOADED: 'dataLoaded',\n\n /**\n * Срабатывает после загрузки данных и отображения их в таблице.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.AFTER_DATA_LOADED\n * @param {object} data Полученные данные\n */\n AFTER_DATA_LOADED: 'afterDataLoaded',\n\n /**\n * Срабатывает перед получением списка доступных колонок.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.GET_COLUMNS_FOR_DIALOG\n * @param {array} columns Список колонок\n */\n GET_COLUMNS_FOR_DIALOG: 'getColumnsForDialog',\n\n /**\n * Срабатывает перед получением списка видимых колонок.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.GET_VISIBLE_COLUMNS_FOR_DIALOG\n * @param {array} columns Список колонок\n */\n GET_VISIBLE_COLUMNS_FOR_DIALOG: 'getVisibleColumnsForDialog',\n\n /**\n * Срабатывает перед добавлением колонок в список видимых.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.GET_VISIBLE_COLUMNS_FOR_DIALOG\n * @param {array} columns Список колонок\n */\n SET_VISIBLE_COLUMNS: 'setVisibleColumns',\n\n /**\n * Срабатывает перед добавлением колонок в список видимых.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.GET_VISIBLE_COLUMNS_FOR_DIALOG\n * @param {array} columns Список колонок\n */\n SET_VISIBLE_COLUMNS_FROM_DIALOG: 'setVisibleColumnsFromDialog',\n\n /**\n * Срабатывает при переходе на страницу.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.PAGE_CHANGE\n * @param {integer} index Номер страницы\n */\n PAGE_CHANGE: 'pageChange',\n\n /**\n * Срабатывает при смене количества записей на странице.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.PAGE_CHANGE\n * @param {integer} limit Ограничение количества записей\n */\n PAGE_LIMIT_CHANGE: 'pageLimitChange',\n\n /**\n * Срабатывает при выделении записей.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.SELECTED_ROWS_CHANGED\n * @param {integer} limit Ограничение количества записей\n */\n SELECTED_ROWS_CHANGED: 'selectedRowsChanged',\n\n /**\n * Срабатывает при инициализации колонки.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.COLUMN_INIT\n * @param {object} column Колонка\n */\n COLUMN_INIT: 'columnInit',\n\n /**\n * Срабатывает после загрузки параметров таблицы.\n *\n * @event WebAccess.components.dataViews.Grid.EVENT.STATE_LOADED\n */\n STATE_LOADED: 'stateLoaded'\n }\n });\n\n})(window.WA);\n","\"use strict\";\r\n\r\n/**\r\n* Диалоговое окно.\r\n*\r\n* @class WebAccess.components.dialogs.BaseDialog\r\n* @since 5.0.0.4000\r\n* @extends BaseObject\r\n*\r\n* @property {string} id ИД диалогового окна\r\n* @property {string} name Номер набора данных\r\n* @property {string} title Заголовок модального диалога\r\n* @property {string} html Содержимое окна\r\n* @property {string} okText Подпись кнопки «OK»\r\n* @property {string} cancelText Подпись кнопки «Отмена»\r\n* @property {function} ok Функция обратного вызова, исполняется при нажатии на кнопку «OK»\r\n* @property {function} cancel Функция обратного вызова, исполняется при нажатии на кнопку «Отмена»\r\n* @property {integer} height Высота модального диалога\r\n* @property {integer} width Ширина модального диалога\r\n* @property {boolean} resizable Возможность изменения размеров окна\r\n* @property {boolean} modal Если значение равно False, то задний план затемняется\r\n* @property {boolean} enterOk Если значение равно True, при нажатии на ENTER срабатывает нажатие на кнопку «OK»\r\n* @property {boolean} isShowOkButton Отображать кнопку «ОК»\r\n* @property {boolean} isShowCancelButton Отображать кнопку «Отмена»\r\n* @property {boolean} isOpened Признак того, что окно уже открылось\r\n* @property {boolean} isSingleme Не открывать новое окно, если такое же окно открыто. Значение по умолчанию TRUE\r\n* @property {string} dialogClass Указанное имя класса будет добавлено к диалогу\r\n* @property {WebAccess.components.notifications.inlineHint} inlineHint Сообщение об ошибке, отображаемое на странице @since 5.0.0.7400\r\n*\r\n* @example\r\n* var dialog = new WebAccess.components.dialogs.BaseDialog();\r\n* dialog.setHtml(\"TestHTML\");\r\n* dialog.show();\r\n*\r\n* @example Создание собственных кнопок\r\n* var dialog = new WebAccess.components.dialogs.BaseDialog();\r\n* var myButton = { id: \"myButtonID\", text: \"Button\", click: myFunction };\r\n* dialog.modalWindowButtons.push(myButton);\r\n* dialog.show();\r\n*\r\n* @example Отображение сообщения об ошибке\r\n* var dialog = new WebAccess.components.dialogs.BaseDialog();\r\n* dialog.show();\r\n* dialog.inlineHint.showError('Этот диалог пока бесполезен');\r\n*/\r\n(function (global) {\r\n\r\n var BaseDialog = BaseObject.extend({\r\n init: function (settings) {\r\n var me = this;\r\n this.modalWindowButtons = [];\r\n this.id = new Date().getTime(); //timestamp\r\n this._super(settings);\r\n\r\n this._setKeyBindings();\r\n\r\n if ($.isPlainObject(settings)) {\r\n $.extend(this, settings);\r\n }\r\n\r\n var me = this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n className: 'BaseDialog',\r\n dialogClass: '',\r\n inlineHint: null,\r\n id: \"0\",\r\n modalWindowButtons: [],\r\n title: L(\"MODAL_DIALOG\"),\r\n html: L(\"MODAL_DIALOG_INITIAL_TEXT\"),\r\n okText: L(\"OK\"),\r\n cancelText: L(\"CANCEL\"),\r\n closeText: L(\"CLOSE\"),\r\n ok: function () { },\r\n cancel: function () { },\r\n height: 'auto',\r\n width: 'auto',\r\n minWidth: 350,\r\n resizable: false,\r\n modal: true,\r\n enterOk: true,\r\n onOpen: function () { },\r\n onClose: function () { },\r\n isShowOkButton: true,\r\n isShowCancelButton: false,\r\n closeOnEscape: true,\r\n keyScope: 'baseDialog',\r\n isSingleme: true,\r\n keyBindings: {},\r\n _jContent: null,\r\n _isFitted: false,\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Задает сочетания глобальных горячих клавишь.\r\n * @private\r\n */\r\n _setKeyBindings: function () {\r\n var me = this;\r\n me.keyBindings = {\r\n \"enter\": function (e) {\r\n if (e && $(e.target).is('.ui-dialog-titlebar-close')) return;\r\n $(\"#modal_ok_button_\" + me.id).click();\r\n }\r\n };\r\n },\r\n\r\n /**\r\n * Показывает иконку прогресса при выполнении длительной операции.\r\n *\r\n * @function WebAccess.components.dialogs.BaseDialog#setSpinner\r\n * @param {String} [opt_text] текст диалога\r\n * @since 5.0.0.7100\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n setSpinner: function (opt_text) {\r\n this.setTitle(L('PLEASE_WAIT'));\r\n\r\n var spinnerHtml = '
    {1}';\r\n\r\n if (opt_text)\r\n spinnerHtml = format(spinnerHtml, \"ui-dialog__spinner_right\", opt_text);\r\n else\r\n spinnerHtml = format(spinnerHtml, \"ui-dialog__spinner_centered\", \"\");\r\n\r\n this.setHtml(spinnerHtml);\r\n\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Удаляет кнопки «ОК» и «Отмена» с формы диалогового окна.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#removeDefaultButtons\r\n * @since 5.0.0.7200\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n removeDefaultButtons: function () {\r\n this.isShowOkButton = false;\r\n this.isShowCancelButton = false;\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Скрывает кнопку закрытия диалога.\r\n * @method WebAccess.components.dialogs.BaseDialog#removeCloseButton\r\n * @since 5.2.0.1931\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n removeCloseButton: function () {\r\n if (this.isOpened())\r\n $('#dialog_content_' + this.id).parent().parent().find(\".ui-dialog-titlebar-close\").remove();\r\n else\r\n this.bind(this['class'].EVENT.AFTER_OPEN, this.removeCloseButton);\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Включает отображение кнопки \"Отмена\".\r\n * @method WebAccess.components.dialogs.BaseDialog#showCancelButton\r\n * @since 5.2.0.1300\r\n * @todo: Реализовать до конца\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n showCancelButton: function () {\r\n this.isShowCancelButton = true;\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Задает ширину окна.\r\n * @method WebAccess.components.dialogs.BaseDialog#setWidth\r\n * @param {integer} width Ширина в пикселях\r\n * @since 5.2.0.1300\r\n * @todo: Реализовать до конца\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n setWidth: function (width) {\r\n var me = this;\r\n me.width = width;\r\n if (me._jContent) {\r\n me._jContent.dialog(\"option\", \"width\", width);\r\n }\r\n return me;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n /**\r\n * Задает высоту окна.\r\n * @method WebAccess.components.dialogs.BaseDialog#setWidth\r\n * @param {integer} height Высота в пикселях\r\n * @since 5.2.0.1300\r\n * @todo: Реализовать до конца\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n setHeight: function (height) {\r\n var me = this;\r\n me.height = height;\r\n if (me._jContent) {\r\n me._jContent.dialog(\"option\", \"height\", height);\r\n }\r\n return me;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Задает заголовок окна.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#setTitle\r\n * @param {string} title Заголовок окна\r\n * @since 5.0.0.5000\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n setTitle: function (title) {\r\n this.title = title;\r\n if (this.isOpened()) $('#dialog_content_' + this.id).parents(\".ui-dialog\").find(\".ui-dialog-title\").html(title);\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Проверяет, открыто ли диалоговое окно.\r\n *\r\n * @function WebAccess.components.dialogs.BaseDialog#isOpened\r\n * @since 5.0.0.5000\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n isOpened: function () {\r\n return ($('#dialog_content_' + this.id).length) > 0;\r\n },\r\n\r\n /**\r\n * Очищает содержимое окна.\r\n *\r\n * @function WebAccess.components.dialogs.BaseDialog#clear\r\n * @since 5.0.0.7100\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n clear: function () {\r\n this.setHtml('');\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Устанавливает содержимое диалогового окна.\r\n *\r\n * @function WebAccess.components.dialogs.BaseDialog#setHtml\r\n * @param {string} html Содержимое окна – текст html-разметки\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n setHtml: function (html) {\r\n this.html = html;\r\n if (this.isOpened()) $('#dialog_content_' + this.id).html(this.html);\r\n this._placeInCenter();\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Установка сочетаний клавиш, для текущего окна.\r\n * @private\r\n */\r\n _setupKeyScope: function () {\r\n var me = this;\r\n\r\n for (var keyName in me.keyBindings) {\r\n key(keyName, me.keyScope, me.keyBindings[keyName]);\r\n }\r\n\r\n key.setScope(me.keyScope);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Делает кнопку доступной.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#enableButton\r\n * @param {string} buttonId ИД кнопки, например, \"modal_ok_button\",\"modal_cancel_button\"\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n enableButton: function (buttonId) {\r\n if (!!buttonId) {\r\n $(\"#\" + buttonId + \"_\" + this.id).attr('disabled', false).removeClass(\"disabled\");\r\n $(\"#\" + buttonId).attr('disabled', false).removeClass(\"disabled\");\r\n }\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Делает кнопку недоступной.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#disableButton\r\n * @param {string} buttonId ИД кнопки, например, \"modal_ok_button\",\"modal_cancel_button\"\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n disableButton: function (buttonId) {\r\n if (!!buttonId) {\r\n $(\"#\" + buttonId + \"_\" + this.id).attr('disabled', true).addClass(\"disabled\");\r\n $(\"#\" + buttonId).attr('disabled', true).addClass(\"disabled\");\r\n }\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Изменяет свойства кнопки с указанным ИД.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#changeButton\r\n * @param {string} buttonId ИД кнопки, например \"modal_ok_button\",\"modal_cancel_button\"\r\n * @param {object} params Новые свойства кнопки\r\n */\r\n changeButton: function (buttonId, params) {\r\n var me = this;\r\n\r\n var button = _.findWhere(me.modalWindowButtons, { id: buttonId });\r\n if (button) {\r\n _.each(_.keys(params), function (key) {\r\n button[key] = params[key];\r\n });\r\n }\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Перерисовывает кнопки в диалоге из dialog.modalWindowButtons.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#updateButtons\r\n */\r\n updateButtons: function () {\r\n var me = this;\r\n me._jDialog.dialog('option', 'buttons', me.modalWindowButtons);\r\n },\r\n\r\n /**\r\n * Добавляет иконку к кнопке.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#addButtonIcon\r\n * @param {string} buttonId ИД кнопки, например \"modal_ok_button\",\"modal_cancel_button\"\r\n * @param {string} iconClass Класс иконки (jQuery UI)\r\n */\r\n addButtonIcon: function (buttonId, iconClass) {\r\n var me = this;\r\n me.changeButton(buttonId, { icons: { primary: iconClass, secondary: null } });\r\n me.updateButtons();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Удаляет иконку у указанной кнопки.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#removeButtonIcon\r\n * @param {string} buttonId ИД кнопки, например, \"modal_ok_button\",\"modal_cancel_button\"\r\n */\r\n removeButtonIcon: function (buttonId) {\r\n var me = this;\r\n me.changeButton(buttonId, { icons: { primary: null, secondary: null } });\r\n me.updateButtons();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Переводит кнопку в состояние ожидания (со спиннером).\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#enableButtonWaitState\r\n * @param {string} buttonId ИД кнопки, например, \"modal_ok_button\",\"modal_cancel_button\"\r\n * @param {string} waitText Текст для отображения на кнопке\r\n */\r\n enableButtonWaitState: function (buttonId, waitText) {\r\n var me = this;\r\n var button = _.findWhere(me.modalWindowButtons, { id: buttonId });\r\n if (button) {\r\n button.originalText = button.text;\r\n if (waitText)\r\n button.text = waitText;\r\n me.addButtonIcon(buttonId, 'ui-wait-spinner');\r\n\r\n me.disableButton(buttonId);\r\n }\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Возвращает кнопку в нормальное состояние.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#disableButtonWaitState\r\n * @param {string} buttonId ИД кнопки, например, \"modal_ok_button\",\"modal_cancel_button\"\r\n */\r\n disableButtonWaitState: function (buttonId) {\r\n var me = this;\r\n var button = _.findWhere(me.modalWindowButtons, { id: buttonId });\r\n if (button) {\r\n if (button.orginalText)\r\n button.text = button.originalText;\r\n me.removeButtonIcon(buttonId);\r\n me.enableButton(buttonId);\r\n }\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Добавляет иконку справки на форму диалогового окна.\r\n *\r\n * @method WebAccess.components.dialogs.BaseDialog#addHelpIcon\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n * @since 5.0.0.7300\r\n */\r\n addHelpIcon: function (isCustomDlg) {\r\n var wnd = this._jDialog;\r\n if (wnd && wnd.length > 0) {\r\n var el;\r\n if (isCustomDlg === true) {\r\n el = wnd;\r\n } else {\r\n el = wnd.parent().find('.ui-dialog-titlebar');\r\n }\r\n if (el.find('.DialogHelpIco').length === 0) {\r\n el.append('
    ');\r\n }\r\n }\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n onOK: function (callback) {\r\n this.ok = WA.TCD(callback);\r\n return this;\r\n },\r\n\r\n onCancel: function (callback) {\r\n this.cancel = WA.TCD(callback);\r\n return this;\r\n },\r\n\r\n /**\r\n * Показывает диалоговое окно.\r\n *\r\n * @function WebAccess.components.dialogs.BaseDialog#show\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n show: function () {\r\n var me = this;\r\n\r\n //скрывать все календари\r\n $('.ui-datepicker').hide();\r\n\r\n if (me.isSingleme && $(\"div#dialog_content_\" + me.id).length > 0) return me;\r\n\r\n var existingButtons = [];\r\n for (var i = 0; i < me.modalWindowButtons.length; i++) {\r\n existingButtons.push(me.modalWindowButtons[i].id);\r\n if (me.modalWindowButtons[i].closeDialog === undefined || !!me.modalWindowButtons[i].closeDialog) {\r\n me.modalWindowButtons[i].click = me.modalWindowButtons[i].click.override(function () {\r\n var res = this.superFunction();\r\n if (res === false) { return res; }\r\n $(this).dialog(\"close\");\r\n $(this).remove();\r\n return res;\r\n });\r\n me.modalWindowButtons[i]['data-name'] = me.modalWindowButtons[i].id;\r\n }\r\n }\r\n\r\n if (me.isShowOkButton) {\r\n if (existingButtons.indexOf(\"modal_ok_button_\" + me.id) === -1)\r\n me.modalWindowButtons.push({\r\n id: \"modal_ok_button_\" + me.id,\r\n text: me.okText,\r\n click: function () { if (me.ok(this) === false) { return; } $(this).dialog(\"close\"); $(this).remove(); },\r\n 'class': 'primary',\r\n 'data-name': 'OkButton'\r\n });\r\n }\r\n if (me.isShowCancelButton) {\r\n if (existingButtons.indexOf(\"modal_cancel_button_\" + me.id) === -1)\r\n me.modalWindowButtons.push({\r\n id: \"modal_cancel_button_\" + me.id,\r\n text: me.cancelText,\r\n click: function () { if (me.cancel(this) === false) { return; } $(this).dialog(\"close\"); $(this).remove(); },\r\n 'data-name': 'CancelButton'\r\n });\r\n }\r\n\r\n /**\r\n * При нажатии на OK вызовем соответствующее событие, для этого\r\n * задекорируем существующу функцию и добавим немного своей логики\r\n * @ignore\r\n */\r\n me.ok = me.ok.override(\r\n function () {\r\n me.fire(\"ok\");\r\n return this.superFunction();\r\n }\r\n );\r\n\r\n if (me.cancel) {\r\n me.cancel = me.cancel.override(\r\n function () {\r\n me.fire(\"cancel\");\r\n return this.superFunction();\r\n });\r\n }\r\n\r\n $(\"div#dialog_content_\" + me.id).parent(\"div\").remove();\r\n\r\n me._jDialog = $('
    ', { html: '
    ' + me.html + '
    ' });\r\n\r\n var globalPrevBeforeUnloadFunc = null;\r\n var globalPrevFormVal = '';\r\n me._jContent = me._jDialog.dialog({\r\n zIndex: 1000,\r\n title: me.title,\r\n resizable: me.resizable,\r\n height: me.height,\r\n width: me.width,\r\n modal: me.modal,\r\n dialogClass: me.dialogClass,\r\n closeText: me.closeText,\r\n open: function () {\r\n // Сохраняем предыдущее состояние формы, что бы при закрытии диалога восстановить это значение.\r\n globalPrevFormVal = window['g_prevFormVal'];\r\n globalPrevBeforeUnloadFunc = window.onbeforeunload;\r\n\r\n if (me.height == 'auto') {\r\n if (me._jDialog.height() > $(window).height() * 0.8) {\r\n var optimalHeight = Math.round(0.8 * windowHeight());\r\n me._jDialog.dialog(\"option\", \"height\", optimalHeight);\r\n me._isFitted = true;\r\n }\r\n }\r\n\r\n me.inlineHint = new WA.CMP.NTF.InlineHint({}, me.id);\r\n me._setupKeyScope();\r\n hideAllPopups();\r\n me.fire(\"show\");\r\n me.fire(me['class'].EVENT.AFTER_OPEN, me);\r\n if (me.onOpen) me.onOpen();\r\n AdjustDialogIfIpad(me.width);\r\n var buttons = me._jDialog.next();\r\n InitHoverForButtons(buttons);\r\n me._jDialog.find('.ui-dialog-content').css('overflow', 'auto');\r\n me._jDialog.css(\"min-width\", me.minWidth);\r\n me._placeInCenter();\r\n $(window).on(\"resizeEnd.BaseDialog\", function () {\r\n me._placeInCenter();\r\n });\r\n },\r\n autoOpen: true,\r\n beforeClose: function (event) {\r\n if (me.fire(me['class'].EVENT.BEFORE_CLOSE, me) === false) return false;\r\n if (event.keyCode === $.ui.keyCode.ESCAPE) {\r\n if (me.closeOnEscape) {\r\n me.bind(me['class'].EVENT.AFTER_CLOSE, function (event) {\r\n // После закрытия по esc вызываем destroy, чтобы удалить диалог, а не просто скрыть\r\n me._jContent.dialog('destroy');\r\n });\r\n }\r\n return (me.fire(me['class'].EVENT.BEFORE_CLOSE_BY_ESCAPE, me) !== false);\r\n }\r\n },\r\n close: function () {\r\n $(window).off(\"resizeEnd.BaseDialog\");\r\n if (me.onClose) me.onClose();\r\n //clearAllModalDivs();\r\n hideAllPopups();\r\n me.fire(me['class'].EVENT.AFTER_CLOSE, me);\r\n key.setScope('common');\r\n // Восстанавливаем предыдущее состояние формы, если еще надо.\r\n if (window.onbeforeunload) {\r\n window['g_prevFormVal'] = globalPrevFormVal;\r\n window.onbeforeunload = globalPrevBeforeUnloadFunc;\r\n }\r\n },\r\n buttons: me.modalWindowButtons,\r\n closeOnEscape: me.closeOnEscape\r\n });\r\n\r\n me.addHelpIcon();\r\n me._setStatisticsClasses();\r\n\r\n me.fire('OnAfterOpen');\r\n\r\n me._jContent.parent().find(\".ui-dialog-titlebar-close\").off('click').on('click', function () {\r\n if (me.fire(me['class'].EVENT.BEFORE_CLOSE_BY_CROSS, me) !== false) {\r\n me.close();\r\n };\r\n });\r\n\r\n return me;\r\n },\r\n\r\n // Смещение диалога в центр экрана.\r\n _placeInCenter: function () {\r\n var jDialog = $('#dialog_content_' + this.id).parent();\r\n jDialog.parent().position({\r\n my: \"center center\",\r\n at: \"center center\",\r\n of: window\r\n });\r\n },\r\n\r\n /**\r\n * Добавление классов для клиентской статистики.\r\n * @function WebAccess.components.dialogs.BaseDialog#close\r\n * @return {WebAccess.components.dialogs.BaseDialog}\r\n * @private\r\n */\r\n _setStatisticsClasses: function () {\r\n // Для статистики.\r\n var jModalWindowContainer = this._jContent.parents('.ui-dialog').addClass(\"stat_ModalWindow_\" + this.className).attr(\"data-stataction\", 'ModalWindow');\r\n jModalWindowContainer.find('.ui-dialog-titlebar').addClass('stat_Title');\r\n jModalWindowContainer.find('.ui-dialog-titlebar-close').attr('data-name', 'CloseIcon');\r\n jModalWindowContainer.find('.DialogHelpIco').attr('data-name', 'HelpIcon');\r\n jModalWindowContainer.find('.ui-dialog-content').addClass('stat_Content');\r\n jModalWindowContainer.find('.ui-dialog-buttonpane').addClass('stat_Buttons');\r\n },\r\n\r\n /**\r\n * Закрывает диалоговое окно.\r\n *\r\n * @function WebAccess.components.dialogs.BaseDialog#close\r\n * @return {WebAccess.components.dialogs.BaseDialog} Объект типа BaseDialog.\r\n */\r\n close: function () {\r\n if (!!this._jContent) {\r\n //просто close не удаляет верстку, а только прячет\r\n //поэтому вызываем destroy\r\n //но close тоже нужен, иначе не отрабатывают события\r\n this._jContent.dialog('close');\r\n this._jContent.dialog('destroy');\r\n }\r\n return this;\r\n }\r\n\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n },\r\n {\r\n EVENT: {\r\n\r\n /**\r\n * Срабатывает перед закрытием модального окна.\r\n * Можно предотвратить закрытие диалога, вернув false в обработчике события.\r\n * @event WebAccess.components.dialogs.BaseDialog.EVENT.BEFORE_CLOSE\r\n * @param {WebAccess.components.dialogs.BaseDialog} dialog экземпляр диалога\r\n * @since 5.2.0.1600\r\n */\r\n BEFORE_CLOSE: 'beforeClose',\r\n\r\n /**\r\n * Срабатывает перед закрытием модального окна от нажатия кнопки Escape.\r\n * Можно предотвратить закрытие диалога, вернув false в обработчике события.\r\n * @event WebAccess.components.dialogs.BaseDialog.EVENT.BEFORE_CLOSE_BY_ESCAPE\r\n * @param {WebAccess.components.dialogs.BaseDialog} dialog экземпляр диалога\r\n * @since 5.2.0.1600\r\n */\r\n BEFORE_CLOSE_BY_ESCAPE: 'escapeClose',\r\n\r\n /**\r\n * Срабатывает перед закрытием модального окна от нажатия на крестик в заголовке окна.\r\n * Можно предотвратить закрытие диалога, вернув false в обработчике события.\r\n * @event WebAccess.components.dialogs.BaseDialog.EVENT.BEFORE_CLOSE_BY_CROSS\r\n * @param {WebAccess.components.dialogs.BaseDialog} dialog экземпляр диалога\r\n * @since 5.2.0.1600\r\n */\r\n BEFORE_CLOSE_BY_CROSS: 'crossClose',\r\n\r\n /**\r\n * Срабатывает после закрытия диалогового окна.\r\n * @event WebAccess.components.dialogs.BaseDialog.EVENT.AFTER_CLOSE\r\n * @param {WebAccess.components.dialogs.BaseDialog} dialog экземпляр диалога\r\n * @since 5.2.0.1600\r\n */\r\n\r\n AFTER_CLOSE: 'close',\r\n\r\n /**\r\n * Срабатывает перед закрытием модального окна.\r\n * Можно предотвратить закрытие диалога, вернув false в обработчике события.\r\n * @event WebAccess.components.dialogs.BaseDialog.EVENT.AFTER_OPEN\r\n * @param {WebAccess.components.dialogs.BaseDialog} dialog экземпляр диалога\r\n * @since 5.2.0.1600\r\n */\r\n AFTER_OPEN: 'open',\r\n\r\n /**\r\n * Срабатывает после закрытия модального окна по кнопке ОК.\r\n * @event WebAccess.components.dialogs.BaseDialog.EVENT.AFTER_CLOSE_BY_OK\r\n * @param {WebAccess.components.dialogs.BaseDialog} dialog экземпляр диалога\r\n * @since 5.2.0.1600\r\n */\r\n AFTER_CLOSE_BY_OK: 'ok',\r\n\r\n /**\r\n * Срабатывает после закрытия модального окна по кнопке Отмена.\r\n * @event WebAccess.components.dialogs.BaseDialog.EVENT.AFTER_CLOSE_BY_OK\r\n * @param {WebAccess.components.dialogs.BaseDialog} dialog экземпляр диалога\r\n * @since 5.2.0.1934\r\n */\r\n AFTER_CLOSE_BY_CANCEL: 'cancel'\r\n }\r\n });\r\n\r\n global.BaseDialog = BaseDialog;\r\n})(window.WebAccess.components.dialogs);\r\n","\"use strict\";\n\n/**\n * Параметры элемента множественного выбора.\n *\n * @typedef {Object} WebAccess.components.dialogs.BaseMultiSelect.multiSelectItem\n * @property {string} id Идентификатор элемента формы\n * @property {string} name Заголовок элемента формы. Значение поля обязательно должно быть установлено\n * @since 5.0.0.4211\n *\n * @example\n * var items = [\n * { \"name\": \"Пункт 1\", \"id\": 1 },\n * { \"name\": \"Пункт 2\", \"id\": 2 }\n * ];\n * multiDialog = new WebAccess.components.dialogs.SelectableMultiSelect(items);\n * multiDialog.show();\n */\n\n/**\n* Диалог множественного выбора.\n*\n* Принимает два объекта-массива, второй из которых является опциональным.\n* Во время работы не исключено изменение, добавление или удаление атрибутов или содержимого массивов.\n* Поведение событий диалога ok и selectComplete отднотипно.\n* Отличие в том, что событие ok срабатывает, если объекты для множественного выбора не меняются.\n*\n* @class WebAccess.components.dialogs.BaseMultiSelect\n* @extends WebAccess.components.dialogs.BaseDialog\n\n* @param {array} availableItems Список доступных элементов, в том числе элементы, которые были выбраны. Отображается в левой части окна\n* @param {array} [opt_selectedItems] Список выбранных элементов. Отображается в правой части окна\n* @param {object} [opt_settings] Настройки модального окна\n* @property {string} className Имя текущего класса\n* @property {boolean} isReadonly Признак того, что содержимое недоступно для изменения\n* @property {string} defaultRecordIcon Иконка элемента списка доступных элементов\n* @property {string} defaultMarkedRecordIcon Иконка выбранного элемента\n* @property {string} isSelectionChanged Признак того, что список выбранных элементов изменился\n* @property {string} filterPlaceholder Текст подсказки для фильтрации\n* @property {string} filteredItemsEmptyPlaceholder Текст, отображаемый в случае, если после фильтрации элементы отсутствуют в списке\n* @throws ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED – заданы не все обязательные параметры.\n* @since 5.0.0.4000\n* @example\n* var items = [{id:\"1\", name: \"firstItem\"},\n* {id:\"2\", name: \"secondItem\"}];\n* var dialog = new WebAccess.components.dialogs.BaseMultiSelect(items);\n* dialog.bind(\"ok\", function(data) {console.log(data);});\n* dialog.show();\n*/\n(function (global) {\n var BaseMultiSelect = global.BaseDialog.extend({\n\n title: L(\"MODAL_DIALOG_SELECT_ITEMS\"),\n width: 925,\n height: 450,\n availableItemslabel: L(\"MODAL_DIALOG_ALL_ITEMS\"),\n selectedItemslabel: L(\"MODAL_DIALOG_SELECTED_ITEMS\"),\n filterPlaceholder: L(\"MODAL_DIALOG_SEARCH_IN_ITEMS\"),\n filteredItemsEmptyPlaceholder: L(\"MODAL_DIALOG_NO_ITEMS\"),\n\n className: \"BaseMultiSelect\",\n\n isReadonly: false,\n defaultRecordIcon: \"referenceRecord-16\",\n defaultMarkedRecordIcon: \"referenceRecordSelected-16\",\n isSelectionChanged: false,\n\n _html: \"\",\n _navigationKeyCodes: [27, 9, 13, 37, 38, 39, 40],\n _handlers: {},\n _jSelectedItemsTable: null,\n _jAvailableItemsList: null,\n _lastFilterValue: null,\n _displayOptions: false,\n _datatable: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (availableItems, opt_selectedItems, opt_settings) {\n var instance = this;\n\n if (!availableItems) WebAccess.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\");\n this.availableItems = availableItems;\n this.selectedItems = opt_selectedItems || [];\n\n this._super(opt_settings);\n\n /** @this - здесь, это элемент над которым производятся манипуляции, а не контекст класса BaseMultiSelect; */\n /** Когда курсор мыши убежал с элемента из области выбранных записей */\n this._handlers._hoverItem = function (event) {\n instance._hoverItem(this);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** Когда курсор мыши убежал с элемента из области выбранных записей */\n this._handlers._unhoverItem = function (event) {\n instance._unhoverItem(this);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** Выбор элемента и перемещение его в список выбранных. */\n this._handlers.selectItem = function (event) {\n if (!instance.isReadonly) {\n var item = $(this);\n var id = item.attr('id');\n var field = item.attr('field');\n var name = item.find('.recordlist-item__name').text();\n\n var newItem = {\n id: id,\n name: '' + name,\n field: '' + field\n };\n\n instance._addItemToSelectedItems([newItem]);\n instance.fire(\"itemSelect\", newItem);\n }\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** Фильтрация записей в левой части */\n this._handlers.keyPressEventHandler = function (event) {\n this._jAvailableItemsList = $('#recordsList');\n if ($.inArray(event.keyCode, instance._navigationKeyCodes) > -1) {\n\n if (event.keyCode == 9) {\n $(this).blur();\n var firstItem = this._jAvailableItemsList.find('div.item:visible:first');\n if (firstItem.hasClass('item')) firstItem.addClass(\"over\");\n\n this._jAvailableItemsList.scrollTop(0);\n return false;\n }\n //me._NavigationKeyPressHandler(ev);\n } else {\n var placeholder = this._jAvailableItemsList.find(\"#empty-with-filter\");\n\n var term = $(this).val();\n this._jAvailableItemsList.find(\"div.item\").show().not(\":Contains('\" + term + \"')\").hide();\n\n if (this._jAvailableItemsList.find(\"div.item:visible\").length === 0) {\n placeholder.removeClass(\"hidden\");\n } else {\n placeholder.addClass(\"hidden\");\n }\n }\n\n return undefined;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n this._handlers.upDownKeyNavigation = function (down) {\n this._jAvailableItemsList = $('#recordsList');\n var currentItem = instance._jAvailableItemsList.find('div.item.over:visible');\n if (currentItem.length) {\n // от текущего элемента делаем поиск в 3-х направлениях: в дочерних элементах, в следующих элементах на уровень выше и в элементах того же уровня\n var nextItem;\n if (down) {\n nextItem = currentItem.find('.item:visible:first,.recordGroup:visible:first').first();\n if (nextItem.length === 0) { // если не нашли внизу\n nextItem = instance._findSiblingOrParent(currentItem, down);\n }\n if (nextItem.html() === currentItem.parent().html()) {\n nextItem = currentItem;\n }\n }\n else {\n nextItem = instance._findSiblingOrParent(currentItem, down);\n }\n if (nextItem.length) {\n currentItem.hasClass('item') ? instance._unhoverItem(currentItem) : instance.UnhoverGroup(currentItem);\n nextItem.hasClass('item') ? instance._hoverItem(nextItem) : me.HoverGroup(nextItem);\n instance._scrollListToHoveredItem(nextItem, down);\n }\n }\n else {\n var jItem;\n\n if (down) {\n jItem = instance._jAvailableItemsList.find('.item:visible:first,.recordGroup:visible:first').first();\n jItem.hasClass('item') ? instance._hoverItem(jItem) : instance.HoverGroup(jItem);\n instance.recordsList.scrollTop(0);\n }\n else {\n jItem = instance._jAvailableItemsList.find('.item:visible:last,.recordGroup:visible:last').last();\n jItem.hasClass('item') ? instance._hoverItem(jItem) : instance.HoverGroup(jItem);\n instance.recordsList.scrollTop(100000);\n }\n }\n };\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n this._handlers.rightArrowKeyPress = function () {\n };\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n this._handlers.leftArrowKeyPress = function () {\n };\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n this._handlers.deleteKeyPress = function () {\n this._jSelectedItemsTable = $('#selectedRecordsScrollArea').find('table');\n var idToRemove = instance._jAvailableItemsList.find('.item.over').attr('id');\n if (idToRemove) {\n var rowDeleteButton = instance._jSelectedItemsTable.find('tr[id=' + idToRemove + ']').find('.removeFromSelect');\n instance.deleteItemFromSelectedItemsTable(rowDeleteButton);\n }\n };\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** Вернем все, что навыбирали в ok callback, и еще выбросим событие с выбранными данными\n * @ignore\n */\n this.ok = this.ok.override(\n function () {\n instance.fire(\"ok\", instance.selectedItems);\n if (this.isSelectionChanged) instance.fire(\"selectComplete\", instance.selectedItems);\n this.superFunction(instance.selectedItems);\n }\n );\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создание html разметки и контейнеров\n * @private\n */\n _preInit: function () {\n this._prepareAvailableItemsArea();\n this._prepareSelectedItemsArea();\n },\n\n /**\n * Иницииализация jQuery объектов и навешивание на них событий,\n * функция вызывается когда модальное окно и все его элементы загружены.\n * @private\n */\n _postInit: function () {\n this._jSelectedItemsTable = $('#selectedRecordsScrollArea').find('table');\n this._jAvailableItemsList = $('#recordsList');\n this._jFilterInput = $('#filterInput');\n this._initEvents();\n\n this._markSelectedItemsInAvailableItemsList();\n this._fixSelectedItemsTableBorder();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Подготовка области с доступными записями\n * @private\n */\n _prepareAvailableItemsArea: function () {\n var renderedItems = \"\";\n for (var i = 0, l = this.availableItems.length; i < l; i++) {\n this.availableItems[i][\"default_icon\"] = this.defaultRecordIcon;\n this.availableItems[i][\"url\"] = this.availableItems[i][\"url\"] || \"#\";\n renderedItems += format(CT.dialog.availableItem, this.availableItems[i]);\n }\n var isAreaReadonly = this.isReadonly ? 'readonly' : '';\n var osName = WA.ENV.os.name.toLowerCase();\n this._html = format(CT.dialog.availableItemsArea, {\n is_readonly: isAreaReadonly,\n label: this.availableItemslabel,\n tooltip: L(\"NAME\"),\n redaonly_attr: \"\",\n data: renderedItems,\n placeholder_message: this.filteredItemsEmptyPlaceholder,\n tabindex: (osName === 'ios' || osName == 'android') ? 'tabindex = \"-1\"' : ''\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отметить выбранные записи(те что во втором массиве) галочкой.\n * Использутся только после показа модального окна.\n * @private\n */\n _markSelectedItemsInAvailableItemsList: function () {\n var selItems = this.selectedItems;\n for (var i = 0, len = selItems.length; i < len; i++) {\n this._markRecord(selItems[i].id, true);\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Строит html для области с выбранными записями.\n * @private\n */\n _prepareSelectedItemsArea: function () {\n var renderedItems = \"\";\n\n for (var i = 0, l = this.selectedItems.length; i < l; i++) {\n var selected = this._renderSelectedItem(this.selectedItems[i]);\n renderedItems += selected;\n }\n\n var displayDelete = this.isReadonly ? 'hidden' : '';\n var displayOptions = !this._displayOptions || this.isReadonly ? 'hidden' : '';\n\n this._html += format(CT.dialog.selectedItemsArea, {\n label: this.selectedItemslabel,\n extra_attributes: \"\",\n name: L(\"NAME\"),\n data: renderedItems,\n display_delete: displayDelete,\n display_options: displayOptions,\n option_name: \"\",\n area_class: 'stat_SelectedItems'\n });\n\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создание html представления для элемента массива выбранных пунктов {id:\"\", name: \"\"};\n * @private\n */\n _renderSelectedItem: function (item) {\n item[\"display_delete\"] = this.isReadonly ? 'hidden' : '';\n item[\"delete_title\"] = L(\"DELETE\");\n item[\"url\"] = item[\"url\"] || \"#\";\n item[\"display_options\"] = 'hidden';\n item[\"name\"] = escapeHtml(item[\"name\"]);\n return format(CT.dialog.selectedItem, item);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Вызывается сразу после открытия модалки, навешивает события на эелементы списков\n * @private\n */\n _initEvents: function () {\n this._initSelectedItemsEvents();\n this._InitAvailableItemsListEvents();\n this._initFilterInputEvents();\n\n this.bind(\"itemSelect\", function () {\n this.isSelectionChanged = true;\n });\n this.bind(\"itemUnSelect\", function () {\n this.isSelectionChanged = true;\n });\n\n this._initExtraEvents();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Чтобы переопределять в наследниках\n * @private\n */\n _initExtraEvents: function() {\n\n },\n\n /**\n * Вызывается сразу после открытия модалки, навешивает события на эелементы списков\n * @private\n */\n _initFilterInputEvents: function () {\n var instance = this;\n\n this._jFilterInput.bind('keypress keyup', instance._handlers.keyPressEventHandler);\n if (WA.ENV.isAndroid()) { this._jFilterInput.bind('change', instance._handlers.keyPressEventHandler); }//на андроиде так\n if (WA.ENV.os.name.toLowerCase() === 'ios') {\n this._jFilterInput.blur();\n }\n this._InitKeyNavigation();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Если только на чтение, то запрещаем выбирать записи.\n * Для айпада отключаем ховеры\n * @private\n */\n _InitAvailableItemsListEvents: function (block, isNeedProcessChild) {\n var instance = this;\n var _hoverItem = function () { this._handlers._hoverItem(this); };\n var _unhoverItem = function () { this._handlers._unhoverItem(this); };\n\n var items = $([]); // = block ? block.find('div.item') : me.recordsList.find('div.item');\n\n items = this._jAvailableItemsList.find('div.item');\n\n if (!this.isReadonly) {\n items.on('click.MultiSelectModalWindow', instance._handlers.selectItem);\n\n if (!$.ipad && !WA.ENV.isAndroid()) { //\n items.hover(this._handlers._hoverItem, this._handlers._unhoverItem);\n }\n //me._InitScrollForTouchScreens();\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @private\n */\n _getColumnsInfo: function() {\n var cols = [];\n // Колонка для удаления выбранной записи.\n if (!this.isReadonly) {\n var colWidth = WA.ENV.isMobile() ? '20px' : '15px';\n cols.push({ \"sWidth\": colWidth, \"bVisible\": true, \"bSortable\": false });\n } else {\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n }\n // Колонка \"Наименование\"\n cols.push({ \"bVisible\": true, \"sWidth\": '400px', \"bSortable\": false });\n // Скрытая опциональная колонка\n if (!this.isReadonly && this._displayOptions) cols.push({ \"bVisible\": false, \"sWidth\": \"0\", \"bSortable\": false });\n else cols.push({ \"bVisible\": false, \"bSortable\": false });\n return cols;\n },\n\n /**\n * Установка событий для контролов выбранных элементов\n * @private\n */\n _initSelectedItemsEvents: function () {\n var cols = this._getColumnsInfo();\n this._datatable = this._jSelectedItemsTable.dataTable({\n \"sScrollY\": (this._jSelectedItemsTable.parent().height() - 38) + 'px',\n \"bAutoWidth\": false,\n \"bDeferRender\": true,\n \"bPaginate\": false,\n \"bSortable\": false,\n \"oLanguage\": { \"sZeroRecords\": L(\"EMPTY\") },\n 'aoColumns': cols\n });\n\n if (WA.ENV.isAndroid() || $.ipad) {\n var tableWidth = 489;\n this._jSelectedItemsTable.width(tableWidth);\n $('.dataTables_scrollHeadInner').width(tableWidth).children('table').width(tableWidth);\n } else {\n // dataTable пересчитывает ширину таблицы, приходится исправлять на 100%\n $('.dataTables_scrollHeadInner').width('100%').children('table').width('100%');\n }\n\n var instance = this;\n this._jSelectedItemsTable.find('tr').each(function () { instance._initSingleSelectedItemEvents(this); });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Навешивание обработчков событий на конкретный элемент списка выбранных записей\n * @private\n */\n _initSingleSelectedItemEvents: function (row) {\n row = $(row);\n var instance = this;\n\n if (!$.ipad && !WA.ENV.isAndroid()) {\n row.hover(\n function () { instance._jSelectedItemsTable.find(\"tr\").not(this).trigger(\"mouseout\"); $(this).addClass('over'); },\n function () { $(this).removeClass('over'); });\n }\n row.find('.removeFromSelect').on('click.MultiSelectModalWindow', this, function (e) {\n e.data.deleteItemFromSelectedItemsTable(this);\n });\n\n // Навешивает события для отображения подсказок.\n //this._initHintEvents(row);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удаление элемента из списка выбранных записей, и из массива который был передан в конструктор.\n * @private\n */\n deleteItemFromSelectedItemsTable: function (item) {\n // Если только для чтения, запрещаем удалять выбранные записи.\n if (!this.isReadonly) {\n var row = $(item).parent().parent();\n\n var id = row.attr('id');\n\n var idx = this._getSelectedItemById(id);\n\n if (idx !== -1) {\n this.selectedItems.splice(idx, 1);\n }\n\n this.fire('itemUnSelect', id);\n //row.remove();\n this._datatable.fnDeleteRow(row[0]);\n this._markRecord(id, false);\n this._fixSelectedItemsTableBorder();\n this._addPlaceholderIfTableIsempty();\n\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** Поиск элемента среди выбранных по id\n * @param {string} id - идентификатор элемента\n * @return {integer} индекс выбранного элемента в массиве\n * @private\n * @function WebAccess.components.dialogs.BaseMultiSelect#_getSelectedItemById\n */\n _getSelectedItemById: function (id) {\n return getElementIndexByAttr(this.selectedItems, \"id\", id);\n },\n\n /** Поиск элемента среди доступных по id\n * @param {string} id - идентификатор элемента\n * @private\n * @return {object} объект выбранного элемента\n * @function WebAccess.components.dialogs.BaseMultiSelect#_getSelectedItemById\n */\n _getAvailableItemById: function (id) {\n return this.availableItems[getElementIndexByAttr(this.availableItems,\"id\", id)];\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Пометка элемента \"выбранным\" или наоборот, не выбранным если второй аргумент false.\n * @private\n * @param {string} id идентификатор\n * @param {boolean} mark если true то элемент выделяется как выбранный, и наоборот.\n */\n _markRecord: function (id, mark) {\n if (id) {\n var item = this._jAvailableItemsList.find('.item[id=\"' + id + '\"]');\n var icon = item.find('.recordlist-item__icon > use');\n var iconImage;\n if (this.treeMode) {\n iconImage = (item.hasClass('favorite')) ? this.favoriteUserIconClass : this.treeModeRecordIconClass;\n }\n else {\n iconImage = this.defaultRecordIcon;\n }\n if (mark) {\n item.addClass('selected');\n if (this.treeMode) {\n icon.removeClass(this.treeModeRecordIconClass).removeClass(this.favoriteUserIconClass);\n iconImage = this.treeModeMarkedRecordIconClass;\n } else {\n iconImage = this.defaultMarkedRecordIcon;\n }\n }\n else {\n item.removeClass('selected');\n }\n icon.attr('xlink:href', '#' + iconImage);\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Вставляет сообщение в таблицу, если нет ни одного элемента для отображаения.\n * (Сейчас по всей видимости за это отвечает параметр у datatable, а здесь просто отключается кнопка)\n * @private\n */\n _addPlaceholderIfTableIsempty: function () {\n var jRows = this._jSelectedItemsTable.children('tbody').find('tr');\n\n if (jRows.length === 1) {\n if (jRows.first().children(\"td\").hasClass(\"dataTables_empty\")) {\n this.disableButton(\"modal_ok_button\");\n }\n }\n //var colsCount = 3;\n //var emptyRow = $(format(CT.dialog.emptyPlaceholder, { message: L('EMPTY'), cols_count: colsCount }));\n //this._jSelectedItemsTable.append(emptyRow);\n //this._InitSingleSelectedRecordEvents(emptyRow);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Используется для динамического добавления новой записи.\n * @private\n */\n _InitSingleSelectedRecordEvents: function (row) {\n row = $(row);\n if (!$.ipad && !WA.ENV.isAndroid()) {\n row.hover(\n function () { $(this).addClass('over').find('.removeFromSelect').css('visibility', 'visible'); },\n function () { $(this).removeClass('over').find('.removeFromSelect').css('visibility', 'hidden'); });\n }\n else {\n row.find('.removeFromSelect').css('visibility', 'visible');\n }\n row.find('.removeFromSelect').on('click.MultiSelectModalWindow', this, function (e) {\n e.data.DeleteItemFromSelection(this);\n });\n\n // Навешивает события для отображения подсказок.\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _setupKeyScope: function() {\n },\n\n /**\n * Добавлем бордер к div в которой находится таблица.\n * @private\n */\n _fixSelectedItemsTableBorder: function () {\n var p = this._jSelectedItemsTable.parent();\n if (this._jSelectedItemsTable.height() > p.height()) {\n p.addClass('fixBorderBottom');\n } else {\n p.removeClass('fixBorderBottom');\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выбрать элемент.\n *\n * @param {object} item Выбранный элемент\n * @function WebAccess.components.dialogs.BaseMultiSelect#selectItem\n * @returne {WebAccess.components.dialogs.BaseMultiSelect} Объект типа BaseMultiSelect.\n */\n selectItem: function (item) {\n this.selectedItems.push(item);\n\n this._markRecord(item.id, true);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _hoverItem: function (item) {\n $(item).addClass(\"over\").find('.treeview_img_action').removeClass(\"hidden\");\n },\n\n _unhoverItem: function (item) {\n $(item).removeClass('over').find('.treeview_img_action').addClass(\"hidden\");\n },\n\n /**\n * Добавляет новые строки в таблицу выбранных.\n * @private\n */\n _addItemToSelectedItems: function (items) {\n var instance = this;\n var html = \"\";\n for (var i = 0; i < items.length; i++) {\n if (this._getSelectedItemById(items[i].id) !== -1) continue;\n items[i].name = escapeHtml(items[i].name);\n html += this._renderSelectedItem(items[i]);\n this.selectItem(items[i]);\n }\n if (!!html) {\n this._jSelectedItemsTable.find('td.dataTables_empty').parent().remove();\n this.enableButton(\"modal_ok_button\");\n //this._jSelectedItemsTable.append(html);\n\n var columns = html.split(/<\\/td>\\s*', '', ' instance._jAvailableItemsList.height()) {\n var itemHeight = 20;\n var height = 0;\n var currentID = item.attr('id');\n var items = instance._jAvailableItemsList.find('div.item:visible,div.recordGroup:visible');\n var i;\n\n if (down) {\n for (i = items.length - 1; i >= 0; i--) {\n if ($(items[i]).attr('id') == currentID) {\n height += (i + 1) * itemHeight;\n break;\n }\n }\n if (instance._jAvailableItemsList.height() - height < 50) {\n instance._jAvailableItemsList.scrollTop(instance._jAvailableItemsList.scrollTop() + itemHeight);\n }\n }\n else {\n for (i = 0; i < items.length; i++) {\n if ($(items[i]).attr('id') == currentID) {\n height += (i + 1) * itemHeight;\n break;\n }\n }\n if (height - instance._jAvailableItemsList.scrollTop() < 50) {\n instance._jAvailableItemsList.scrollTop(instance._jAvailableItemsList.scrollTop() - itemHeight);\n }\n }\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _getItemsListHeight: function () {\n var height = 0;\n var items = this._jAvailableItemsList.children();\n for (var i = 0; i < items.length; i++) {\n height += $(items[i]).height();\n }\n return height;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n show: function () {\n this._preInit();\n this.html = this._html;\n this._super();\n this._postInit();\n return this;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Регистронезависимый селектор :Contains\n * с лайк поиском (((\n * @inner\n */\n jQuery.expr[':'].Contains = function (a, i, m) {\n var words = m[3].toUpperCase().split(\" \");\n var matches = 0;\n if (words.length > 10) return false; //Много слов - большие затупы. Цикл же.\n\n for (var n = 0; n < words.length; n++) {\n if (jQuery(a).text().toUpperCase().indexOf(words[n]) >= 0) matches += 1;\n if (matches == words.length) return true;\n }\n\n return matches == words.length;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.BaseMultiSelect = BaseMultiSelect;\n})(window.WebAccess.components.dialogs);\n","\"use strict\";\n\n/**\n* Диалог со справочником в табличном режиме.\n*\n* @class WebAccess.components.dialogs.ReferenceGridDialog\n* @extends WebAccess.components.dialogs.BaseDialog\n* @since 5.4.0.1012\n*\n* Открывает справочник в табличном режиме в iframe в диалоговом окне.\n*\n\n* @param {object} settings Настройки диалога со справочником:\n* @param {string} referenceName Код справочника\n* @param {string} [referenceCaption] Заголовок справочника\n* @param {string} [context] Контекст представления справочника (объединяется с \"modal.\")\n* @param {REFERENCE_MODAL_MODE} [mode] Режим открытия справочника (MULTI – множественный выбор, SINGLE – единичный выбор, VIEW – просмотр)\n* @param {string} [filterQuery] Фильтр справочника - значение, введенное с клавиатуры в поле ввода\n* @param {string} [filterExpression] Выражение фильтрации\n* @param {array} [visibleColumns] Порядок и состав видимых колонок справочника, если их еще нет в сохраненном контексте\n* @param {string} [modalDialogTitle] Заголовок модального окна\n* @property {string} className Имя текущего класса\n\n* @example\n* var dialog = new WebAccess.components.dialogs.ReferenceGridDialog({referenceName:\"РАБ\"});\n* dialog.bind(\"close\", function(data) {});\n* dialog.show();\n*/\n(function (global) {\n var BROWSER_TOOLBAR_HEIGHT = 100;\n\n var MIN_DIALOG_MARGIN = 40;\n var MAX_DIALOG_MARGIN_PERCENT = 30; // отступы 30% от размера браузера, но не менее MIN_DIALOG_MARGIN.\n\n var ReferenceGridDialog = global.BaseDialog.extend({\n className: 'ReferenceGridDialog',\n height: MIN_SUPPORTS_WINDOW_HEIGHT - BROWSER_TOOLBAR_HEIGHT - MIN_DIALOG_MARGIN,\n width: MIN_SUPPORTS_WINDOW_WIDTH - MIN_DIALOG_MARGIN,\n isShowOkButton: false,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (settings) {\n var me = this;\n me._super(settings);\n me.settings = settings;\n\n if (me.settings.modalDialogTitle) {\n me.title = me.settings.modalDialogTitle;\n } else {\n me._addReferenceCaptionToTitle();\n }\n\n var referenceUrl = me._makeReferenceRecordUrl(me.settings.referenceName, me.settings.context, me.settings.mode,\n me.settings.filterExpression, me.settings.filterQuery, me.settings.visibleColumns, me.settings.hideToolbar,\n me.settings.queryContext, me.settings.leaderSelectedId);\n me.html = '';\n\n me._changeDialogBodyMinWidth();\n\n me._changeDialogDimensions();\n\n me._bindDialogEvents();\n\n if (me.settings.mode == REFERENCE_MODAL_MODE.SINGLE) {\n me._addSelectRecordColumn();\n }\n\n return me;\n },\n\n // Добавляет заголовок справочника в заголовок модального окна.\n _addReferenceCaptionToTitle: function () {\n var me = this;\n var filterTitle = me.filterQuery ? (L('REFERENCE_GRID_DIALOG_TITLE_FILTER_QUERY') + '\"' + me.filterQuery.escapeHtml() + '\"') : '';\n if (me.referenceCaption) {\n me.setTitle(format(L('REFERENCE_GRID_DIALOG_TITLE_WITH_REFERENCE_CAPTION') + filterTitle, me.referenceCaption.escapeHtml()));\n } else {\n // Временно установим общий заголовок без названия справочника.\n me.setTitle(L('REFERENCE_GRID_DIALOG_TITLE') + filterTitle);\n WebAccess.services.reference.getReferenceCaption(me.settings.referenceName).done(function (caption) {\n me.setTitle(format(L('REFERENCE_GRID_DIALOG_TITLE_WITH_REFERENCE_CAPTION') + filterTitle, caption.escapeHtml()));\n });\n }\n },\n\n // Формирует URL для вызова справочника в iframe в модальном окне\n _makeReferenceRecordUrl: function (compcode, context, modalmode, filter, likefilter, columns, hideToolbar, queryContext, leaderSelectedId) {\n var cols = columns;\n // Обязательные колонки.\n if (cols) {\n cols.unshift('_Checkbox');\n }\n\n var url = WA.FC.references(compcode).toURL();\n url.setParam('context', context ? ('modal.' + context) : 'modal');\n if (modalmode) url.setParam('modalmode', modalmode);\n if (filter) url.setParam('filter', filter);\n if (likefilter) url.setParam('likefilter', likefilter);\n if (cols) url.setParam('columns', cols.join(';'));\n if (hideToolbar) url.setParam('hidetoolbar', '1');\n if (queryContext) url.setParam('querycontext', queryContext);\n if (leaderSelectedId) url.setParam('leaderSelectedId', encodeURIComponent(leaderSelectedId));\n\n return url.asString();\n },\n\n _changeDialogBodyMinWidth: function () {\n var me = this;\n me.bind(me['class'].EVENT.AFTER_OPEN, function () {\n var jIframe = me._jDialog.find('iframe').eq(0);\n jIframe.on('load', function () {\n var IframeWindow = jIframe.get(0).contentDocument;\n $(IframeWindow.body).addClass('reference_dialog_body');\n });\n });\n },\n\n // Изменяет размеры диалогового окна в зависимости от размеров экрана\n _changeDialogDimensions: function () {\n var me = this;\n var ww = $(window).width();\n var wh = $(window).height();\n\n // ширина диалога с отступами MAX_DIALOG_MARGIN_PERCENT % от ширины браузера, либо с отступами MIN_DIALOG_MARGIN при малой ширине браузера.\n var dialogWidth = ww * (1 - MAX_DIALOG_MARGIN_PERCENT / 100);\n if (dialogWidth > MIN_SUPPORTS_WINDOW_WIDTH)\n me.setWidth(dialogWidth);\n else\n me.setWidth(ww - MIN_DIALOG_MARGIN);\n\n var dialogHeight = wh - MIN_DIALOG_MARGIN;\n if (dialogHeight > MIN_SUPPORTS_WINDOW_HEIGHT)\n me.setHeight(dialogHeight);\n else\n me.setHeight(wh - MIN_DIALOG_MARGIN);\n },\n\n // Подписывается и отписывается на событие получения сообщения и закрытия диалога\n _bindDialogEvents: function () {\n var me = this;\n $(window)\n .on(\"message.ReferenceGridDialog\", function (e) {\n me._sendSelectedRecords(e);\n })\n .on(\"resizeEnd.ReferenceGridDialog\", function () {\n me._changeDialogDimensions();\n me._placeInCenter();\n });\n\n // Вызываем событие resizeEnd для пересчитывания размеров ленты справочника и иконок в ней\n me.bind(me['class'].EVENT.AFTER_OPEN, function () {\n var jIframe = me._jDialog.find('iframe').eq(0);\n jIframe.on('load', function () {\n jIframe.trigger('resizeEnd');\n });\n });\n\n me.bind(me['class'].EVENT.AFTER_CLOSE, function () {\n $(window)\n .off(\"message.ReferenceGridDialog\")\n .off(\"resizeEnd.ReferenceGridDialog\");\n });\n\n if (me.settings.mode !== REFERENCE_MODAL_MODE.VIEW) {\n me.bind(me['class'].EVENT.AFTER_OPEN, function () {\n\n var jIframe = me._jDialog.find('iframe').eq(0);\n // Когда iframe загрузился.\n jIframe.on('load', function () {\n\n // Добавляем кнпоку \"Выбрать\".\n me._initSelectionButton(me.settings.referenceName);\n if (me.settings.mode == REFERENCE_MODAL_MODE.SINGLE) {\n me._bindDisableSelectButtonInSigleMode(me.settings.referenceName);\n } else {\n me._bindDisableSelectButtonInMultiMode(me.settings.referenceName);\n }\n });\n });\n }\n },\n\n _addSelectRecordColumn: function () {\n var me = this;\n //var jIframe = me._jDialog.find('iframe').eq(0);\n if (me.settings.mode !== REFERENCE_MODAL_MODE.VIEW) {\n me.bind(me['class'].EVENT.AFTER_OPEN, function () {\n\n var jIframe = me._jDialog.find('iframe').eq(0);\n\n // Когда iframe загрузился.\n jIframe.on('load', function () {\n var IframeWindow = jIframe.get(0).contentWindow;\n // Когда grid проинициализировался.\n $.when(IframeWindow.Core.grid.referenceInit).then(function () {\n // Регистрируем глобальную функцию для клика по ссылке в ячейке грида.\n IframeWindow.ReferenceGridDialogCellClick = function (ev, el) {\n var recId = $(el).parents('.slick-row').eq(0).data('recid');\n var selectedRow = IframeWindow.Core.grid.reference.dataView.getItemById(recId);\n var leaderValues = me._getLeaderValues(selectedRow);\n IframeWindow.WebAccess.components.dialogs.ReferenceGridDialog.sendRecordById(me.settings.referenceName, recId, leaderValues);\n };\n\n // Функция пересортировки полей справочника\n var grid = IframeWindow.Core.grid.reference;\n var columns = grid.getColumns();\n var columnsAmount = columns.length;\n var selectRecordColumnIndex = 0;\n for (var i = 0; i < columnsAmount; i++) {\n var isSpecialColumn = (columns[i].id.charAt(0) == '_') ? true : false;\n if (isSpecialColumn) {\n selectRecordColumnIndex = columns[i].index + 1;\n }\n else if (columns[i].index > -1) {\n columns[i].index += 1;\n }\n }\n // Параметры добавляемой колонки \"Выбрать\"\n var selectRecordColumn = {\n cssClass: \"centered\",\n formatter: function () {\n return '

    '\n + ''\n + L('SELECT_RECORDS') + '

    ';\n },\n headerCssClass: \"notDraggable\",\n id: \"_SelectRecord\",\n index: selectRecordColumnIndex,\n name: \" \",\n field: null,\n resizable: false,\n sortable: false,\n visible: true,\n width: (L(\"SELECT_RECORDS\").length * 11 + 25)\n }\n columns.push(selectRecordColumn);\n grid.setColumns(columns);\n });\n });\n });\n }\n },\n\n // Возвращает значения ведущих реквизитов.\n _getLeaderValues: function (row) {\n var me = this;\n var leaderValues = {};\n if (me.settings.leaderSelectedId) {\n //убираем последний символ '&'\n var leadReqNames = me.settings.leaderSelectedId.slice(0, -1).split('&').map(function (selId) {\n return selId.split(\"|\")[0];\n });\n leadReqNames.forEach(function (leadColumnName) {\n leaderValues[leadColumnName] = [\n row[leadColumnName],\n row[\"SBRSE_\" + leadColumnName + \"_Text\"],\n row[\"SBRSE_\" + leadColumnName + \"_Text\"],\n {}\n ];\n });\n }\n return leaderValues;\n },\n\n // Возвращает массив с выбранными в справочнике значениями при получении postMessage из ифрейма\n _sendSelectedRecords: function (e) {\n var me = this;\n var data = e.originalEvent.data;\n var locationOrigin = !location.origin ? (location.protocol + '//' + location.host) : location.origin;\n if (e.originalEvent.origin != locationOrigin) {\n console.log(\"Домен отправителя postMessage не совпадает с доменом адресата: \" + e.originalEvent.origin);\n return false;\n }\n if (data.destination == 'ReferenceGridDialog') {\n me.fire('select', data.selectedItems);\n me.close();\n }\n\n },\n\n // Добавляет кнопку \"выбрать\" в ленту справочника при открытии его в диалоговом окне.\n _initSelectionButton: function (referenceCode) {\n var me = this;\n var IframeWindow = me._jDialog.find('iframe').get(0).contentWindow;\n $.when(IframeWindow.WA.ToolBarInit).then(function () {\n var afterGroupName = 'TOOLBAR_DOC_FOLDER_TASK_GROUP';\n // Если группа есть, вставляем после ней, иначе вставляем в самое начало.\n if (!IframeWindow.WA.CR.toolBar.groups[afterGroupName]) {\n afterGroupName = '';\n }\n IframeWindow.WA.CR.toolBar.groups.create(\"TOOLBAR_SELECT_RECORDS\", afterGroupName);\n IframeWindow.WA.CR.toolBar.groups['TOOLBAR_SELECT_RECORDS'].createButton({\n name: \"SelectRecords\",\n text: L(\"SELECT_RECORDS\"),\n icon: \"accept-20\",\n toolTip: L(\"CLICK_TO_SELECT_RECORDS\"),\n jsaction: function () {\n var selectedRecords = IframeWindow.WA.CR.objectList.getSelectedItems();\n if (me.settings.mode === REFERENCE_MODAL_MODE.SINGLE && selectedRecords.length === 1) {\n var recId = selectedRecords[0].id;\n var selectedRow = IframeWindow.Core.grid.reference.dataView.getItemById(recId);\n var leaderValues = me._getLeaderValues(selectedRow);\n IframeWindow.WebAccess.components.dialogs.ReferenceGridDialog.sendRecordById(referenceCode, recId, leaderValues);\n } else {\n IframeWindow.WebAccess.components.dialogs.ReferenceGridDialog.sendMultiSelectedRecords(referenceCode, selectedRecords);\n }\n }\n });\n });\n },\n\n // Блокирует кнопку выбора, если не выбрана только 1 запись.\n _bindDisableSelectButtonInSigleMode: function (referenceCode) {\n var me = this;\n $.when(WA.ObjectListInit).then(function () {\n var IframeWindow = me._jDialog.find('iframe').get(0).contentWindow;\n IframeWindow.WA.CR.objectList.bind('onChange', function (records) {\n var btn = IframeWindow.WA.CR.toolBar.groups['TOOLBAR_SELECT_RECORDS'].getButtons()['SelectRecords'];\n if (records.length === 1) {\n btn.enable();\n } else {\n btn.disable();\n }\n });\n });\n },\n\n // Блокирует кнопку выбора, если не выбрано ни одной записи.\n _bindDisableSelectButtonInMultiMode: function (referenceCode) {\n var me = this;\n $.when(WA.ObjectListInit).then(function () {\n var IframeWindow = me._jDialog.find('iframe').get(0).contentWindow;\n IframeWindow.WA.CR.objectList.bind('onChange', function (records) {\n var btn = IframeWindow.WA.CR.toolBar.groups['TOOLBAR_SELECT_RECORDS'].getButtons()['SelectRecords'];\n if (records.length < 1) {\n btn.disable();\n } else {\n btn.enable();\n }\n });\n });\n }\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n }, {\n // static\n\n /**\n * Создает и отображает модальное окно со справочником.\n\t*\n * @since 5.4.0.1012\n * @function WebAccess.components.dialogs.ReferenceGridDialog.createAndShow\n *\n * @param {object} settings Настройки диалога со справочником\n * @return {object} Объект с функциями selectionDone и selectionCancel, которые срабатывают соответственно при выборе записи или при отмене выбора.\n * @examples\n * WebAccess.components.dialogs.ReferenceGridDialog.createAndShow({referenceName:\"РАБ\",mode:REFERENCE_MODAL_MODE.MULTI})\n * .selectionDone(function(result) { console.log('result', result); });\n * WebAccess.components.dialogs.ReferenceGridDialog.createAndShow({referenceName:\"РАБ\"}).selectionCancel(function() { console.log('cancel'); });\n */\n createAndShow: function (settings) {\n var def = $.Deferred();\n var dialog = new WebAccess.components.dialogs.ReferenceGridDialog(settings);\n dialog.bind(\"select\", function (data) {\n def.resolve(data);\n });\n dialog.bind(\"close\", function (data) {\n // Если Deferred зарезолвился, то reject уже не срабатывает.\n def.reject();\n });\n dialog.show();\n return {\n selectionDone: function (cb) {\n def.done(cb);\n },\n selectionCancel: function (cb) {\n def.fail(cb);\n }\n }\n },\n\n /**\n * Отправляет все выбранные значения справочника в родительское окно.\n\t*\n * @since 5.4.0.1013\n * @function WebAccess.components.dialogs.ReferenceGridDialog.sendMultiSelectedRecords\n * @param {string} referenceCode Код справочника\n * @param {WebAccess.components.wrappers.objectList.ListItem[]} opt_records Список записей для отправки.\n */\n sendMultiSelectedRecords: function (referenceCode, opt_records) {\n var records = opt_records || WA.CR.objectList.getSelectedItems();\n var convertedRecords = records.map(function (record) {\n return convertObjectListRecord(referenceCode, record);\n });\n sendRecordsToParent(convertedRecords);\n },\n\n /**\n * Отправляет выбранное значение справочника в родительское окно.\n\t*\n * @since 5.4.0.1021\n * @function WebAccess.components.dialogs.ReferenceGridDialog.sendRecordById\n * @param {string} referenceCode Код справочника\n * @param {string} recId ИД записи справочника\n */\n sendRecordById: function (referenceCode, recId, leaderRequisiteValues) {\n var record = WA.CR.objectList.getItems()[recId];\n record = convertObjectListRecord(referenceCode, record, leaderRequisiteValues);\n sendRecordsToParent([record]);\n }\n });\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Отправка объекта с выбранными значениями в родительское окно.\n function sendRecordsToParent(records) {\n var locationOrigin = !location.origin ? (location.protocol + '//' + location.host) : location.origin;\n window.parent.postMessage({\n destination: 'ReferenceGridDialog',\n selectedItems: records\n }, locationOrigin);\n }\n\n // Подготовка записи справочника для отправки в родительское окно (формирование объекта с необходимыми атрибутами).\n function convertObjectListRecord(referenceCode, record, leaderRequisiteValues) {\n return {\n id: record[\"id\"],\n name: record[\"name\"],\n code: record[\"code\"],\n referenceCode: referenceCode,\n leaderRequisiteValues: leaderRequisiteValues\n };\n }\n\n global.ReferenceGridDialog = ReferenceGridDialog;\n})(window.WebAccess.components.dialogs);\n","\"use strict\";\n/**\n* Диалог множественного выбора c поддержкой сортировки.\n* \n* @class WebAccess.components.dialogs.SortableMultiSelect\n* @extends WebAccess.components.dialogs.BaseMultiSelect\n* @ignore\n* @param {array} availableItems Список доступных элементов, в том числе элементы, которые были выбраны. Отображаются в левой части диалогового окна\n* @param {array} [opt_selectedItems] Список выбранных элементов. Отображается в правой части диалогового окна\n* @param {object} [opt_settings] Настройки диалогового окна\n*/\n(function (global) {\n var SortableMultiSelect = global.BaseMultiSelect.extend({\n init: function (availableItems, opt_selectedItems, opt_settings) {\n var instance = this;\n this._displayOptions = true;\n this._super(availableItems, opt_selectedItems, opt_settings);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация событий\n * Здесь сделаем, так что при смене сортировки данные будут считаться измененными.\n * @private \n */\n _initEvents: function () {\n this._super();\n \n this.bind(\"sortingChanged\", function () {\n this.isSelectionChanged = true;\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установки параметров колонок таблицы с выбранными элементами.\n * В данном случае есть 3-й столбец\n * Для мобильных браузеров проще и эффективнее задавать ширину в процентах\n * @private\n * @return {array} параметры колонок\n */\n _getColumnsInfo: function () {\n var cols = []; \n if (WA.ENV.isMobile()) {\n if (!this.isReadonly) {\n //cols.push({ \"bVisible\": true, \"sWidth\": \"15px\", \"bSortable\": false });\n //cols.push({ \"bVisible\": true, \"sWidth\": \"360px\", \"bSortable\": false });\n //cols.push({ \"bVisible\": true, \"sWidth\": \"30px\", \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"8%\", \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"74%\", \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"12%\", \"bSortable\": false });\n } else {\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"100%\", \"bSortable\": false });\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n }\n } else {\n if (!this.isReadonly) {\n cols.push({ \"bVisible\": true, \"sWidth\": \"14px\", \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"399px\", \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"31px\", \"bSortable\": false });\n } else {\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"447px\", \"bSortable\": false });\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n }\n }\n return cols;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * параметры отрисовки выбранного элемента. В данном случае у нас добавился еще один столбец option\n * @param {object} item элемент массива выбранных пунктов\n * @private\n * @return {string} разметка элемента\n */\n _renderSelectedItem: function (item) {\n\n item[\"display_delete\"] = this.isReadonly ? 'hidden' : '';\n item[\"delete_title\"] = L(\"DELETE\");\n item[\"display_options\"] = this.isReadonly ? 'hidden' : '';\n item[\"url\"] = item[\"url\"] || \"#\";\n \n// item[\"name\"] = escapeHtml(item[\"name\"]);\n\n if (!WA.ENV.isAndroid() && !$.ipad) var visibility = 'hidden';\n item[\"option\"] = format(CT.dialog.sortingButtons, { 'is_hidden': visibility });\n\n return format(CT.dialog.selectedItem, item); \n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Навешиваем события на выбранный пункт\n * @param {string} rowSelector [description]\n * @private\n */\n _initSingleSelectedItemEvents: function (rowSelector) { \n this._super(rowSelector);\n var instance = this;\n\n var jRow = $(rowSelector);\n if (!$.ipad && !WA.ENV.isAndroid()) {\n jRow.hover(\n function () {\n $(this).find('.itemUp').removeClass(\"hidden\");\n $(this).find('.itemDown').removeClass(\"hidden\");\n },\n function () {\n $(this).find('.itemUp').addClass('hidden');\n $(this).find('.itemDown').addClass('hidden');\n }\n );\n }\n\n jRow.find('.itemUp').off('click.MultiSelectModalWindow').on('click.MultiSelectModalWindow', this, function (e) {\n e.data._swapRows(this, \"up\");\n var a = $(this); \n });\n jRow.find('.itemDown').off('click.MultiSelectModalWindow').on('click.MultiSelectModalWindow', this, function (e) {\n e.data._swapRows(this, \"down\");\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n /**\n * Смена элементов местами\n * @param {string} itemSelector пункт меню который будет перемещатся\n * @param {string} [\"up\"|\"down\"] direction направление перемещения\n * @private\n */\n _swapRows: function (itemSelector, direction) {\n var jPair;\n var jRow = this._jSelectedItemsTable.find(itemSelector).parent().parent();\n\n var id = jRow.attr('id');\n var index = this._getSelectedItemById(id); \n var tmp;\n\n if (index > 0 && direction == \"up\") {\n jPair = jRow.prev();\n jPair.before(jRow);\n\n setTimeout(function () { \n jRow.trigger('mouseover');\n }, 50);\n\n tmp = this.selectedItems[index - 1];\n this.selectedItems[index - 1] = this.selectedItems[index];\n this.selectedItems[index] = tmp;\n this.fire(\"sortingChanged\");\n }\n \n if (index < this.selectedItems.length-1 && direction == \"down\") { \n jPair = jRow.next();\n jPair.after(jRow);\n setTimeout(function () { \n jRow.trigger('mouseover');\n }, 50);\n\n tmp = this.selectedItems[index + 1];\n this.selectedItems[index + 1] = this.selectedItems[index];\n this.selectedItems[index] = tmp;\n this.fire(\"sortingChanged\");\n }\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n });\n\n global.SortableMultiSelect = SortableMultiSelect;\n})(window.WebAccess.components.dialogs);","\"use strict\";\n\n/**\n* Диалог множественного выбора c поддержкой сортировки.\n*\n* @class WebAccess.components.dialogs.SelectableMultiSelect\n* @extends WebAccess.components.dialogs.BaseMultiSelect\n\n* @param {array} availableItems Список доступных элементов, в том числе элементы, которые были выбраны. Отображаются в левой части диалогового окна\n* @param {array} [opt_selectedItems] Список выбранных элементов. Отображаются в правой части диалогового окна\n* @param {object} [opt_settings] Настройки диалогового окна\n*/\n(function (global) {\n var SelectableMultiSelect = global.BaseMultiSelect.extend({\n init: function (availableItems, opt_selectedItems, opt_settings) {\n var instance = this;\n this._displayOptions = false;\n this._super(availableItems, opt_selectedItems, opt_settings);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация событий\n * Здесь сделаем, так что при смене сортировки данные будут считаться измененными.\n * @private\n */\n _initEvents: function () {\n this._super();\n\n this.bind(\"sortingChanged\", function () {\n this.isSelectionChanged = true;\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установки параметров колонок таблицы с выбранными элементами.\n * В данном случае есть 3-й столбец\n * Для мобильных браузеров проще и эффективнее задавать ширину в процентах\n * @private\n * @return {array} параметры колонок\n */\n _getColumnsInfo: function () {\n var cols = [];\n if (WA.ENV.isMobile()) {\n if (!this.isReadonly) {\n //cols.push({ \"bVisible\": true, \"sWidth\": \"15px\", \"bSortable\": false });\n //cols.push({ \"bVisible\": true, \"sWidth\": \"360px\", \"bSortable\": false });\n //cols.push({ \"bVisible\": true, \"sWidth\": \"30px\", \"bSortable\": false });\n\n cols.push({ \"bVisible\": true, \"sWidth\": \"8%\", \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"92%\", \"bSortable\": false });\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n } else {\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"100%\", \"bSortable\": false });\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n }\n } else {\n if (!this.isReadonly) {\n cols.push({ \"bVisible\": true, \"sWidth\": \"14px\", \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"399px\", \"bSortable\": false });\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n } else {\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n cols.push({ \"bVisible\": true, \"sWidth\": \"447px\", \"bSortable\": false });\n cols.push({ \"bVisible\": false, \"bSortable\": false });\n }\n }\n return cols;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Кнопки вверх и вниз.\n * Навешиваем на них обработчики.\n * Когда нажимем на кнопку и нет ни одной выделенной записи среди выбранных,\n * то сами выделяем.\n * @private\n */\n _initExtraEvents: function () {\n var me = this;\n $(document).not(\"#move_up, #move_down\").bind('click', function (e) {\n $(\"#selectedRecordsTable tr\").removeClass(\"marked\");\n });\n\n $(\"#move_up\").on(\"click\", function (e) {\n e.stopPropagation();\n var jMarkedRow = $(\"#selectedRecordsTable tr.marked\");\n if (jMarkedRow.length > 0) {\n me._swapRows(jMarkedRow, \"up\");\n } else {\n $(\"#selectedRecordsTable tbody tr:first\").addClass(\"marked\");\n }\n });\n $(\"#move_down\").on(\"click\", function (e) {\n e.stopPropagation();\n var jMarkedRow = $(\"#selectedRecordsTable tr.marked\");\n if (jMarkedRow.length > 0) {\n me._swapRows(jMarkedRow, \"down\");\n } else {\n $(\"#selectedRecordsTable tbody tr:first\").addClass(\"marked\");\n }\n });\n\n //setTimeout(function () { $(\"#selectedRecordsTable tbody tr:first\").addClass(\"marked\") }, 0);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Строит html для области с выбранными записями.\n * @private\n */\n _prepareSelectedItemsArea: function () {\n var renderedItems = \"\";\n\n for (var i = 0, l = this.selectedItems.length; i < l; i++) {\n var selected = this._renderSelectedItem(this.selectedItems[i]);\n renderedItems += selected;\n }\n\n var displayDelete = this.isReadonly ? 'hidden' : '';\n var displayOptions = !this._displayOptions || this.isReadonly ? 'hidden' : '';\n\n this._html += format(CT.dialog.selectedItemsArea, {\n label: this.selectedItemslabel,\n extra_attributes: 'style=\"width: 490px\"',\n name: L(\"NAME\"),\n data: renderedItems,\n display_delete: displayDelete,\n display_options: displayOptions,\n option_name: \"\",\n area_class: 'stat_SelectedItems'\n });\n this._html += CT.dialog.sortButtons;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * параметры отрисовки выбранного элемента. В данном случае у нас добавился еще один столбец option\n * @param {object} item элемент массива выбранных пунктов\n * @private\n * @return {string} разметка элемента\n */\n _renderSelectedItem: function (item) {\n item[\"items_mode\"] = \"\";\n item[\"display_delete\"] = this.isReadonly ? 'hidden' : '';\n item[\"delete_title\"] = L(\"DELETE\");\n item[\"extra_attributes\"] = 'style=\"text-decoration: none;\"';\n item[\"display_options\"] = this.isReadonly ? 'hidden' : 'hidden';\n item[\"url\"] = item[\"url\"] || \"#\";\n\n // item[\"name\"] = escapeHtml(item[\"name\"]);\n\n //if (!WA.ENV.isAndroid() && !$.ipad) var visibility = 'hidden';\n //item[\"option\"] = format(CT.dialog.sortingButtons, { 'is_hidden': visibility });\n\n return format(CT.dialog.selectedItem, item);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Навешиваем события на выбранный пункт\n * @param {string} rowSelector [description]\n * @private\n */\n _initSingleSelectedItemEvents: function (rowSelector) {\n this._super(rowSelector);\n var instance = this;\n\n var jRow = $(rowSelector);\n if (!$.ipad && !WA.ENV.isAndroid()) {\n jRow.hover(\n function () {\n $(this).find('.itemUp').removeClass(\"hidden\");\n $(this).find('.itemDown').removeClass(\"hidden\");\n },\n function () {\n $(this).find('.itemUp').addClass('hidden');\n $(this).find('.itemDown').addClass('hidden');\n }\n );\n }\n\n jRow.on('click', this, function (e) {\n e.stopPropagation();\n $(\"#selectedRecordsTable tr\").not(this).removeClass(\"marked\");\n $(this).addClass(\"marked\");\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n /**\n * Смена элементов местами\n * @param {string} itemSelector пункт меню который будет перемещатся\n * @param {string} [\"up\"|\"down\"] direction направление перемещения\n * @private\n */\n _swapRows: function (jRow, direction) {\n var jPair;\n\n var id = jRow.attr('id');\n var index = this._getSelectedItemById(id);\n var tmp;\n\n if (index > 0 && direction == \"up\") {\n jPair = jRow.prev();\n jPair.before(jRow);\n\n setTimeout(function () {\n jRow.trigger('mouseover');\n }, 50);\n\n tmp = this.selectedItems[index - 1];\n this.selectedItems[index - 1] = this.selectedItems[index];\n this.selectedItems[index] = tmp;\n this.fire(\"sortingChanged\");\n }\n\n if (index < this.selectedItems.length - 1 && direction === \"down\") {\n jPair = jRow.next();\n jPair.after(jRow);\n setTimeout(function () {\n jRow.trigger('mouseover');\n }, 50);\n\n tmp = this.selectedItems[index + 1];\n this.selectedItems[index + 1] = this.selectedItems[index];\n this.selectedItems[index] = tmp;\n this.fire(\"sortingChanged\");\n }\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n global.SelectableMultiSelect = SelectableMultiSelect;\n})(window.WebAccess.components.dialogs);\n","\"use strict\";\n/**\n* Модальное сообщение.\n* @todo Шабардин П.: описать! \n* @class WebAccess.components.dialogs.MessageBox\n* @since 5.0.0.4206 \n* @extends WebAccess.components.dialogs.BaseDialog\n* @todo Шабардин П.: свойства тоже описать\n* @todo Шабардин П.: примеры\n*/\n(function (global) {\n\n var MessageBox = global.BaseDialog.extend({\n className: 'MessageBox',\n mainText: '',\n additionalText: '',\n title: '',\n //messageBoxButtons: [],\n messageBoxIcon: '',\n messageBoxIcons: { 'error': 'error-16', 'info': 'info-16', 'question': 'help-16', 'warning': 'warning-16' },\n //okText: '',\n height: 'auto',\n baseDialog: null,\n\n init: function (settings) { \n this.modalWindowButtons = [];\n this._super(settings);\n if ($.isPlainObject(settings)) {\n $.extend(this, settings);\n }\n },\n\n /**\n * Добавить кнопку на форму диалогового окна.\n *\n * @function WebAccess.components.dialogs.MessageBox#addButton\n * @param {string} buttonId ИД кнопки\n * @param {string} buttonText Надпись кнопки\n * @param {function} buttonClick Функция для обработки действия «Нажать на кнопку»\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n addButton: function (buttonId, buttonText, buttonClick) {\n this.modalWindowButtons.push(\n {\n id: buttonId,\n text: buttonText,\n click: !!buttonClick ? buttonClick : function () { }\n });\n return this;\n },\n\n /**\n * Добавить кнопку «ОК» на форму диалогового окна.\n *\n * @function WebAccess.components.dialogs.MessageBox#okButton\n * @param {function} okCallback Функция для обработки действия «Нажать на кнопку «ОК»\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n okButton: function (okCallback) {\n this.modalWindowButtons = [];\n this.ok = !!okCallback ? okCallback : function () { };\n this.cancel = null;\n return this;\n },\n\n /**\n * Добавить кнопки «Да» и «Нет» на форму диалогового окна.\n *\n * @function WebAccess.components.dialogs.MessageBox#yesNoButtons\n * @param {function} yesCallback Функция для обработки действия «Нажать на кнопку «Да»\n * @param {function} noCallback Функция для обработки действия «Нажать на кнопку «Нет»\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n yesNoButtons: function (yesCallback, noCallback) {\n this.okText = L('YES');\n this.cancelText = L('NO');\n return this.okCancelButtons(yesCallback, noCallback);\n },\n\n /**\n * Добавить кнопки «ОК» и «Отмена» на форму диалогового окна.\n *\n * @function WebAccess.components.dialogs.MessageBox#okCancelButtons\n * @param {function} okCallback Функция для обработки действия «Нажать на кнопку «ОК»\n * @param {function} cancelCallback Функция для обработки действия «Нажать на кнопку «Отмена»\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n okCancelButtons: function (okCallback, cancelCallback) {\n this.messageBoxButtons = [];\n this.ok = !!okCallback ? okCallback : function () { };\n this.cancel = !!cancelCallback ? cancelCallback : function () { };\n this.isShowCancelButton = true;\n this.isShowOkButton = true;\n return this;\n },\n\n /**\n * Показать диалоговое окно с текстом ошибки.\n *\n * @method WebAccess.components.dialogs.MessageBox#showError\n * @param {string} mainText Основной текст ошибки\n * @param {string} additionalText Информационный текст, объясняющий ошибку\n * @param {string} title Заголовок диалогового окна\n * @param {function} onClose Обработчик события закрытия диалогового окна\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n showError: function (mainText, additionalText, title, onClose) {\n if (!title) title = L('ERROR');\n this.okText = L('CLOSE');\n this.show(mainText, additionalText, title, 'error', null, onClose);\n return this;\n },\n\n /**\n * Показать диалоговое окно с информацией.\n *\n * @method WebAccess.components.dialogs.MessageBox#showInfo\n * @param {string} mainText Основной текст сообщения\n * @param {string} additionalText Информационный текст, объясняющий суть сообщения\n * @param {string} title Заголовок диалогового окна\n * @param {function} onClose Обработчик события закрытия диалогового окна\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n showInfo: function (mainText, additionalText, title, onClose) {\n if (!title) title = L('INFO');\n this.okText = L('CLOSE');\n this.show(mainText, additionalText, title, 'info', null, onClose);\n return this;\n },\n\n /**\n * Показать диалоговое окно с вопросом\n *\n * @method WebAccess.components.dialogs.MessageBox#showQuestion\n * @param {string} mainText Основной текст вопроса\n * @param {string} additionalText Информационный текст, объясняющий суть вопроса\n * @param {string} title Заголовок диалогового окна\n * @param {function} onClose Обработчик события закрытия диалогового окна\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n showQuestion: function (mainText, additionalText, title, onClose) {\n if (!title) title = L('CONFIRMATION');\n this.show(mainText, additionalText, title, 'question', null, onClose);\n return this;\n },\n\n /**\n * Показать диалоговое окно с предупреждением.\n *\n * @method WebAccess.components.dialogs.MessageBox#showWarning\n * @param {string} mainText Основной текст предупреждения\n * @param {string} additionalText Информационный текст, объясняющий суть предупреждения\n * @param {string} title Заголовок диалогового окна\n * @param {function} onClose Обработчик события закрытия диалогового окна\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n showWarning: function (mainText, additionalText, title, onClose) {\n if (!title) title = L('WARNING');\n this.show(mainText, additionalText, title, 'warning', null, onClose);\n return this;\n },\n\n /**\n * Показать диалоговое окно.\n *\n * @method WebAccess.components.dialogs.MessageBox#show\n * @param {string} mainText Основной текст\n * @param {string} additionalText Информационный текст\n * @param {string} title Заголовок диалогового окна\n * @param {string} icon Иконка диалогового окна, например, иконка сообщения об ошибке. Возможные значения: error, info, question, warning\n * @param {string} defaultButtonId ИД кнопки, которая будет выделена на форме как действие по умолчанию. Имеет смысл, когда кнопки были добавлены через метод addButton\n * @param {function} onClose Обработчик события закрытия диалогового окна\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n show: function (mainText, additionalText, title, icon, defaultButtonId, onClose) {\n var me = this;\n if (mainText === null) return me;\n me.setMainText(mainText);\n me.setAdditionalText(additionalText);\n if (!!title) me.title = title;\n if (!!icon) me.messageBoxIcon = icon;\n me._setDefaultButton(defaultButtonId);\n if (!!onClose) me.onClose = onClose;\n me.setHtml(me._getHtml());\n //var dialog = new WA.CMP.dialogs.BaseDialog(this._createSettingsObject());\n //dialog.height = this.height;\n //dialog.width = this.width;\n //this.baseDialog = dialog;\n me.onOpen = function () {\n me._jDialog.parents('.ui-dialog:first').addClass((!!icon ? icon : '') + '-mbox');\n };\n me._super();\n //dialog.show();\n return me;\n },\n\n /**\n * Добавляет основной текст на форму диалогового окна.\n *\n * @method WebAccess.components.dialogs.MessageBox#setMainText\n * @param {string} mainText Основной текст\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n setMainText: function (mainText) {\n if (!!mainText) {\n var splitterIndex = mainText.indexOf('^');\n if (splitterIndex != -1) {\n //var text = mainText.split('^');\n //mainText = text[0];\n this.setAdditionalText(mainText.substring(splitterIndex + 1, mainText.length).fromISBuilderToNormal());\n mainText = mainText.substring(0, splitterIndex);\n }\n this.mainText = mainText;\n\n if (this.isOpened() && this._jDialog) {\n this._jDialog.find('.upper-area-text').html(mainText);\n }\n }\n return this;\n },\n\n /**\n * Добавляет информационный текст на форму диалогового окна.\n *\n * @method WebAccess.components.dialogs.MessageBox#setAdditionalText\n * @param {string} additionalText Информационный текст\n * @return {WebAccess.components.dialogs.MessageBox} Oбъект класса MessageBox.\n * @since 5.0.0.4206\n */\n setAdditionalText: function (additionalText) {\n if (!!additionalText || typeof additionalText == 'string') {\n this.additionalText = ('' + additionalText);\n if (this.isOpened() && this._jDialog) {\n this._jDialog.find('.lower-area').html(additionalText);\n }\n }\n return this;\n },\n\n /**\n * Устанавливает кнопку по умолчанию в диалоге. Имеет действие только если кнопки добавлялись через метод addButton\n * @private\n * @param {string} buttonId ид кнопки по умолчанию\n * @since 5.0.0.4206\n */\n _setDefaultButton: function (buttonId) {\n if (!!buttonId && !!this.modalWindowButtons && this.modalWindowButtons.length) {\n for (var btn in this.modalWindowButtons) {\n if (this.modalWindowButtons[btn].id == buttonId) {\n this.modalWindowButtons[btn]['class'] = 'primary';\n break;\n }\n }\n }\n return this;\n },\n\n /**\n * создает объект с настройками для отображения окна\n * @private\n * @since 5.0.0.4206\n */\n _createSettingsObject: function () {\n var showOkButton = this.messageBoxButtons.length === 0 || !!this.ok;\n var showCancelButton = !!this.cancel;\n var settings = {\n html: this._getHtml(),\n title: this.title,\n modalWindowButtons: this.messageBoxButtons,\n isShowOkButton: showOkButton,\n isShowCancelButton: showCancelButton\n };\n if (!!this.onClose) settings['onClose'] = this.onClose;\n if (!!this.ok) settings['ok'] = this.ok;\n if (!!this.cancel) settings['cancel'] = this.cancel;\n if (!!this.okText) settings['okText'] = this.okText;\n if (!!this.cancelText) settings['cancelText'] = this.cancelText;\n return settings;\n },\n\n /**\n * возвращает html-разметку для окна\n * @private\n * @since 5.0.0.4206\n */\n _getHtml: function () {\n var icon = !!this.messageBoxIcon ? '' : '';\n var mainTextHtml = '

    ' + icon + '

    ' + this.mainText + '
    ';\n var additionalTextHtml = '
    ' + this.additionalText + '
    ';\n var html = '
    ' + mainTextHtml + additionalTextHtml + '
    ';\n return html;\n }\n\n });\n\n global.MessageBox = MessageBox;\n})(window.WebAccess.components.dialogs);","\"use strict\";\n\n/**\n* Диалог создания документа.\n*\n* @class WebAccess.components.dialogs.CreateDocument\n* @since 5.2.0.1100\n* @extends WebAccess.components.dialogs.BaseDialog\n*\n* @example\n* // Открытие диалогового окна «Создание документа».\n* var dialog = new WA.CMP.dialogs.CreateDocument()\n* dialog.bind('ok', function(data) {\n* alert('ok')\n* });\n* dialog.bind('create', function(document) {\n* document.open();\n* });\n* dialog.show()\n*/\n\n/**\n * Событие срабатывает при открытии окна создания документа.\n * @event WebAccess.components.dialogs.CreateDocument#open\n */\n\n/**\n * Событие срабатывает после загрузки содержимого окна создания документа.\n * @event WebAccess.components.dialogs.CreateDocument#loaded\n */\n\n/**\n * Событие срабатывает после нажатия на кнопку «Создать документ».\n * @event WebAccess.components.dialogs.CreateDocument#ok\n */\n\n/**\n * Событие срабатывает после создания документа.\n * @event WebAccess.components.dialogs.CreateDocument#create\n * @param {Link} doc Ссылка на созданный документ\n *\n */\n\n(function (global) {\n var CreateDocument = global.BaseDialog.extend({\n title: L(\"MODAL_DIALOG_SELECT_ITEMS\"),\n width: 600,\n height: 'auto',\n className: \"CreateDocument\",\n mode: 'create',\n _jWindow: null,\n _html: \"\",\n _handlers: {},\n _jSelectedItemsTable: null,\n _jAvailableItemsList: null,\n _lastFilterValue: null,\n _displayOptions: false,\n _datatable: null,\n isShowCancelButton: true,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (settings) {\n var me = this;\n\n this._super(settings); \n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создание html разметки и контейнеров\n * @private\n */\n _preInit: function () {\n /** Вернем все, что навыбирали в ok callback, и еще выбросим событие с выбранными данными \n * @ignore\n */\n var me = this;\n this.ok = this.ok.override(\n function () {\n var rnd = Math.floor(Math.random() * 10000).toString();\n var jWindow = me._jWindow;\n var formIsValid = me.isFormValid(jWindow);\n\n if (formIsValid && CheckFileSize(jWindow.find('form input[type=\"file\"]')[0], jWindow.data('error'))) {\n jWindow.find('form').submit();\n return false;\n }\n else if (!formIsValid) {\n jWindow.data('error')(L('NOT_ALL_REQUIRED_FIELDS_FILLED'));\n return false;\n }\n }\n );\n },\n\n /**\n * Иницииализация jQuery объектов и навешивание на них событий, \n * функция вызывается когда модальное окно и все его элементы загружены.\n * @private\n */\n _postInit: function () {\n var me = this; \n var jWindow = this._jWindow; \n jWindow.data('success', function (res) {\n var url = new WA.URL(res);\n //me.popup.location = url;\n var id = url.getParam('id');\n var link = new WA.Link(id, OBJECT_TYPE.EDOCUMENT);\n link.isNew = true;\n me.fire('create', link);\n me.close();\n \n }).data('error', function (res) {\n me.inlineHint.show(res);\n me.fire('error', res);\n }); \n\n me.initCreateNewDocumentControl(jWindow);\n\n me.fire('loaded');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n initCreateNewDocumentControl: function () {\n var me = this;\n me._jWindow.find('[name=\"is_from_file\"]').change(function () {\n if (me._jWindow.find('#radio_from_file').is(':checked')) {\n $('#new_div_file input').removeAttr('disabled');\n setTimeout(function () { //setTimeout нужно т.к. инициализация \"выбора из справочника\" проходит немного позже этого события.\n $('#new_div_app input').SetEnabled();\n $('#new_div_template input').SetDisabled();\n }, 50);\n $('#new_div_file, #new_div_app').removeClass('field_disabled');\n $('#new_div_template').addClass('field_disabled');\n } else {\n $('#new_div_file input').attr('disabled', 'disabled');\n setTimeout(function () { //setTimeout нужно т.к. инициализация \"выбора из справочника\" проходит немного позже этого события.\n $('#new_div_app input').SetDisabled();\n $('#new_div_template input').SetEnabled();\n }, 50);\n $('#new_div_file, #new_div_app').addClass('field_disabled');\n $('#new_div_template').removeClass('field_disabled');\n }\n }).trigger('change');\n if ($.ipad && !WA.ENV.isAndroid()) {\n me._jWindow.find('#radio_from_file').attr('disabled', 'disabled');\n }\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n isFormValid: function (jWindow) {\n if (!jWindow.find('input[name=refVid]').val()) return false;\n if (!jWindow.find('input[name=refCardType]').val()) return false;\n if (this.mode == 'copy') return true;\n if ($('#radio_from_template').is(':checked')) {\n if (!jWindow.find('input[name=refTempl]').val()) return false;\n } else {\n if (!jWindow.find('input[type=file]').val()) return false;\n if (!jWindow.find('input[name=refApp]').val()) return false;\n }\n return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Вызывается сразу после открытия модалки, навешивает события на эелементы списков\n * @private\n */\n _initEvents: function () {\n this._initSelectedItemsEvents();\n this._InitAvailableItemsListEvents();\n this._initFilterInputEvents();\n\n this.bind(\"itemSelect\", function () {\n this.isSelectionChanged = true;\n });\n this.bind(\"itemUnSelect\", function () {\n this.isSelectionChanged = true;\n });\n\n this._initExtraEvents();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n \n show: function (opt_mode) {\n opt_mode = opt_mode || this.mode;\n var me = this;\n me._preInit();\n var title;\n\n switch (opt_mode) {\n case \"template\":\n title = L(\"CREATE_DOCUMENT_FROM_TEMPLATE\");\n break;\n case \"file\":\n title = L(\"CREATE_DOCUMENT_FROM_FILE\");\n break;\n case \"create\":\n title = L(\"CREATE_DOCUMENT\");\n break;\n case \"copy\":\n title = L(\"COPY_DOCUMENT\");\n break;\n default:\n title = L(\"CREATE_DOCUMENT\");\n break;\n }\n\n me.okText = opt_mode == \"copy\" ? L(\"COPY\") : L(\"CREATE\");\n\n\n me._super();\n me.setSpinner();\n\n var folder_id = GetParamInURL(\"id\");\n if (!folder_id) folder_id = FavoritesFolderID;\n var data = {\n Mode: opt_mode,\n FolderID: folder_id\n };\n\n WA.SRV.call(\"/ModalWindow.asmx/Create\", { ControlName: \"new_document\", Params: $.toJSON(data) }).done(function (data) {\n me.setTitle(title);\n me.setHtml('
    ' + data.html + '
    ');\n me._jWindow = $('#modal_window');\n me._postInit();\n moveOpenedDialogToCenter();\n }).fail(function () {\n me.close();\n });\n return this;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n /**\n * Возможность перезаписи функций, с возможностью запуска родительской функции. \n * @inner\n */\n Function.prototype.override = function (func) {\n var superFunction = this;\n return function () {\n this.superFunction = superFunction;\n return func.apply(this, arguments);\n };\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n global.CreateDocument = CreateDocument;\n})(window.WebAccess.components.dialogs);","\"use strict\";\n(function (global) {\n\n var TEMPLATE = {\n LAYOUT: 'layouts/FormDialog.compile.html'\n };\n\n /**\n * Диалог для работы с формами.\n * @class WebAccess.components.dialogs.FormDialog\n * @extends WebAccess.components.dialogs.BaseDialog\n * @mixes WebAccess.mixins.formMixin\n * @property {Deferred} Init меняет сосотояние при инициализации элементов управления формы\n * @property {Object} model переданная в конструктор модель \n * @property {String} serviceURL адрес веб-сервиса обслуживающего диалог\n * @since 5.2.0.1600 \n */\n var FormDialog = global.CMP.dialogs.BaseDialog.extend([global.mixins.formMixin], {\n className: 'FormDialog',\n model: null,\n width: 1000,\n height: 'auto',\n dialogClass: 'form-dialog-content-padding', //если нужно будет поменять padding или убрать его, то не забыть поменять внизу размер этого padding.\n serviceURL: \"/Dialogs.asmx\",\n modalWindowButtons: null,\n\n _pendingOperations: null,\n _containerInit: null,\n _detailsGridInit: null,\n _keepAliveTimer: null,\n _sideBarContainerSelector: '.twc_left',\n //-----------------------------------------------------------------------// \n\n init: function (settings, model) {\n var me = this;\n if (!model) WA.raise(L(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\"));\n me.model = model;\n me._pendingOperations = {};\n\n me._preInit();\n\n me._keepAliveTimer = {\n timeout: null\n };\n\n me._containerInit = $.Deferred();\n me._detailsGridInit = $.Deferred();\n\n me._super(settings);\n\n me.id = me.model.InstanceID;\n me._postInit();\n me._keepAlive();\n\n me.bind(me['class'].EVENT.AFTER_CLOSE, $.proxy(me._freeDialog, me));\n return this;\n },\n //-----------------------------------------------------------------------//\n\n // Инициализация objectList.\n _initObjectList: function () {\n var me = this;\n me.objectList = new global.CMP.wrappers.objectList.ObjectList(me.containerSelector);\n },\n\n /**\n * Отобразить диалоговое окно\n * @method WebAccess.components.dialogs.FormDialog#show\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n show: function () {\n var me = this;\n var baseShow = me._super; //_beforeShow асинхронный, поэтому _super уже удалится после выполнения метода, сохраняем его чтобы вызвать.\n\n me._beforeShow().done(function () {\n baseShow.apply(me); //если вызвать без apply то this будет равен window.\n me._afterShow();\n });\n\n return me;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Запуск таймера для поддержания объекта диалога\n * @method WebAccess.components.dialogs.FormDialog#_keepAlive\n * @private\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n _keepAlive: function () {\n var me = this;\n if (!LockUpdateTime) {\n log.warn('DEPRECATION', 'Call to global variable \"LockUpdateTime\" failed');\n return;\n }\n me._keepAliveTimer = setTimeout(function () {\n WA.SRV.call(me.serviceURL + '/KeepAlive', {\n InstanceID: me.id\n }).always(function () {\n me._keepAlive();\n });\n }, LockUpdateTime);\n return me;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Получить модель объекта связанного с текущим диалогом\n * @method WebAccess.components.dialogs.FormDialog#_keepAlive\n * @private\n * @return {String} минимальная модель объекта формы в виде JSON\n */\n _getObjectLink: function () {\n var me = this;\n return $.toJSON({\n 'InstanceID': me.id\n });\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Получить представление\n * @method WebAccess.components.dialogs.FormDialog#_getObjectView\n * @private\n * @return {String} код представления\n */\n _getObjectView: function () {\n return '';\n },\n //-----------------------------------------------------------------------//\n\n _registerOperation: function (name, operation) {\n this._pendingOperations[name] = operation;\n },\n //-----------------------------------------------------------------------//\n\n _unRegisterOperation: function (name) {\n delete this._pendingOperations[name];\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Получить информацию о форме\n * @method WebAccess.components.dialogs.FormDialog#_getFormData\n * @private\n * @return {String} модель формы в виде JSON\n */\n _getFormData: function () {\n var me = this;\n return $.parseJSON(me.model['FormData']);\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Получить экземпляры объектов грида\n * @method WebAccess.components.dialogs.FormDialog#_getGrids\n * @private\n * @return {Array} экземпляры гридов\n */\n _getGrids: function () {\n var me = this;\n return me.grids;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Создание html разметки и контейнеров\n * @method WebAccess.components.dialogs.FormDialog#_beforeShow\n * @private \n * @return {Deferred} результат подготовки разметки\n */\n _beforeShow: function () {\n var me = this;\n me.containerSelector = \"div#dialog_content_\" + me.id;\n me.modalWindowButtons = [];\n me.isShowOkButton = false;\n\n var state = $.Deferred();\n me.width = +(me.model.Width || me.width) + 20; //20 - padding указанный в CSS .form-dialog-content-padding\n\n //inlineHint плохо работает с фиксированной высотой, поэтому строку ниже закоментировал.\n //me.height = me.model.Height || me.height; \n me.title = me.model.Caption || me.title;\n\n if (!me.model['TabsHtml']) {\n me.html = me.model['FormHtml'];\n state.resolve();\n return state;\n }\n\n me.height = me.model.Height || me.height;\n me.width += 75; //Ширина табов \n\n WA.templates.render(TEMPLATE.LAYOUT, {\n left: me.model['TabsHtml'],\n right: me.model['FormHtml']\n }).done(function (html) {\n me.html = html;\n state.resolve();\n })\n\n return state;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Иницииализация jQuery объектов и навешивание на них событий, \n * функция вызывается когда модальное окно и все его элементы загружены.\n * @method WebAccess.components.dialogs.FormDialog#_afterShow\n * @private\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n _afterShow: function () {\n var me = this;\n me._containerInit.resolve();\n me._fixStyles();\n me._initActions();\n\n if (!!me.model['TabsHtml']) me._initTabs();\n me._initDetails();\n return me;\n },\n //-----------------------------------------------------------------------// \n\n /**\n * Подгонка стилей, чтобы ничего не выпирало. \n * @method WebAccess.components.dialogs.FormDialog#_fixStyles\n * @private\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n _fixStyles: function () {\n var me = this;\n var isAnySelected = me.sideBar.tabs.toArray().some(function (tab) {\n if (!isAnySelected && tab.isVisible()) {\n tab._jObject.addClass('selected');\n return true;\n }\n return false;\n });\n if (!isAnySelected) me._jContent.find('.tab_item.first').addClass('selected');\n if (!InitHoverForButtons) {\n log.warn('DEPRECATION', 'Call to global variable \"InitHoverForButtons\" failed');\n return;\n }\n\n $('.CardForm').redraw(); //#106605\n InitHoverForButtons();\n return me;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Инициализация прикладных действий. Навешивание обработчиков на кнопки и ссылки.\n * @method WebAccess.components.dialogs.FormDialog#_initActions\n * @private\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n _initActions: function () {\n var me = this;\n if (me.model && me.model.hasOwnProperty('Actions')) {\n var actions = $.parseJSON(me.model.Actions);\n var buttons = me.form.controls.buttons.toArray();\n var links = me.form.controls.links.toArray();\n me._initActionItems(buttons, actions);\n me._initActionItems(links, actions);\n me.bind(me['class'].EVENT.BEFORE_CLOSE_BY_CROSS, function () {\n me._executeDefaultAction(DIALOG_ACTION.CANCEL);\n return false;\n }).bind(me['class'].EVENT.BEFORE_CLOSE_BY_ESCAPE, function () {\n me._executeDefaultAction(DIALOG_ACTION.CANCEL);\n return false;\n });\n }\n return me;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Именно здесь кнопки и ссылки с действиями становятся активными и получают\n * свои заголовки\n * @param {Array} items компоненты\n * @param {Object} actions действия\n * @method WebAccess.components.dialogs.FormDialog#_initActionItems\n * @private\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n _initActionItems: function (items, actions) {\n var me = this;\n _(items).each(function (item) {\n var action = _(actions).findWhere({ Name: item.actionName });\n if (action) {\n item.bind('click', function () {\n\n //#106918\n if (!action.Description.HasChangeEventHandler && item.actionName !== DIALOG_ACTION.OK) {\n // Не передаем результат, что бы диалог не закрылся, но при \"Отмене\" нужно закрыть в любом случае. #107380\n return me._handleAction(name, item.actionName === DIALOG_ACTION.CANCEL ? 1 : undefined);\n }\n\n var process = $.proxy(me._executeDefaultAction, me);\n if (me.fire(FormDialog.EVENT.BEFORE_ACTION, item.actionName, action, me) === false) {\n return;\n };\n process(item.actionName);\n });\n\n if (!item.getLabel()) item.setLabel(action.Description.Caption);\n item.setTooltip(action.Description.Hint);\n if (!action.Description.IsEnabled) {\n item.disable();\n }\n if (!action.Description.IsVisible) {\n item.hide();\n }\n }\n });\n\n return me;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Запуск действия \"по умолчанию\". Т.е. когда обработкой занимается сервер, \n * а клиент только говорит какое действие надо вызвать и передает данные формы.\n * свои заголовки.\n * @param {string} name имя действия \n * @method WebAccess.components.dialogs.FormDialog#_executeDefaultAction\n * @private\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n _executeDefaultAction: function (name) {\n var me = this;\n me.form._unHighlightRequisites();\n if (me.fire(FormDialog.EVENT.BEFORE_ACTION, name, me) === false) return me;\n\n //#106428\n if (name === DIALOG_ACTION.CANCEL) {\n me._handleAction(name, 1);\n return me;\n }\n // HACK для сохранения изменения в детальных разделах, если после изменения сразу сохранять карточку без клика куда-то в друое место грида.\n var allGrids = me.grids;\n for (var gridName in allGrids) {\n var grid = allGrids[gridName].grid;\n var cell = grid.getActiveCell();\n if (cell) {\n grid.navigateUp();\n }\n }\n\n WA.SRV.call(me.serviceURL + '/ExecuteAction', {\n DialogInstanceID: me.id,\n ActionName: name,\n Req: me.form._getRequisitesToSend(me.form),\n Cmd: $.toJSON(me.form._commandList)\n }, null, null, true).done(function (response) {\n var responseAsObject = $.parseJSON(response);\n\n //скрываем сообщения о предыдущих ошибках, если были\n ErrorHide();\n\n // Обрабатываем изменения реквизитов действием.\n var changes = responseAsObject.Changes;\n var changedMultiSelects = responseAsObject.ChangedMultiSelectRequisitesValues;\n me.form.applyServerSideChanges(changes, changedMultiSelects);\n\n // Обрабатываем результат выполнения действия.\n var result = responseAsObject.Result;\n me._handleAction(name, result);\n\n }).fail(function (err, response) {\n me.form._handleFailSave(this, true, null, me.details, me.inlineHint);\n\n // В ответе с ошибкой могут прийти изменения других реквизитов и их надо будет обработать.\n if (response && response.Result) {\n var data = $.parseJSON(response.Result);\n // Обрабатываем изменения реквизитов действием.\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n me.form.applyServerSideChanges(changes, changedMultiSelects);\n }\n });\n return me;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Пост-обработка действия\n * @param {string} name имя действия \n * @param {object} result результат выполнения\n * @method WebAccess.components.dialogs.FormDialog#_handleAction\n * @private\n * @return {String} JSON объект с реквизитами\n */\n _handleAction: function (name, result) {\n var me = this;\n var preventClose = (me.fire(FormDialog.EVENT.AFTER_ACTION, name, result, me) === false);\n\n // 0 - когда нажимаем на не стандартную кнопку с custom-действием.\n // Вычислений на действии нет. Возвращается 0. В билдере окно не закрывается.\n // Мы тоже не будем.\n // См. #106093\n if ((result && result != 0) && !preventClose) {\n me.close();\n }\n return me;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Поддержка работы табов\n * @method WebAccess.components.dialogs.FormDialog#_initTabs\n * @private\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n _initTabs: function () {\n var me = this;\n me.sideBar.setOrientation(ORIENTATION.VERTICAL);\n var jTabs = me._jContent.find('.twc_right .CardForm_Tab');\n\n // Получить выбранную вкладку\n var activeTabDfmName = $('.tab_item.selected').data('name');\n jTabs.filter('[data-dfm-name=' + activeTabDfmName + ']').show();\n me._jContent.find('.tab_item').not('.more').on('click', function () {\n var tabName = $(this).data('name');\n\n //TODO Шамов А.: События должны fire внутри класса, а не где попало.\n me.sideBar.fire(me.sideBar['class'].EVENT.BEFORE_TAB_SWITCH, me.sideBar.tabs[tabName]);\n\n jTabs = me._jContent.find('.twc_right .CardForm_Tab');\n me._jContent.find('.tab_item.selected').removeClass('selected');\n $(this).addClass('selected');\n jTabs.hide();\n jTabs.filter('[data-dfm-name=\"' + tabName + '\"]').show();\n\n //TODO Шамов А.: События должны fire внутри класса, а не где попало.\n me.sideBar.fire(me.sideBar['class'].EVENT.AFTER_TAB_SWITCH, me.sideBar.tabs[tabName]);\n });\n\n if (!me._isFitted) {\n me._jDialog.dialog(\"option\", \"height\", 'auto');\n };\n me._jContent.find('input[type=\"text\"], textarea').not('.Req_Disabled').first().focus().select(); //#106799\n $('.CardForm').redraw(); //#106605\n return me;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Поддержка работы детальных разделов\n * @method WebAccess.components.dialogs.FormDialog#_initDetails\n * @private\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n _initDetails: function () {\n var me = this;\n var Initiializer = WebAccess.components.wrappers.details.DetailsInitiializer;\n\n var DataProviderClass = global.components.dialogs.FormDialogDataProvider;\n var dataProviderOptions = {\n \"DialogName\": me.model.Name,\n \"InstanceID\": me.model.InstanceID\n };\n\n var detailsInitiializer = new Initiializer(me._jContainer.selector + ' div.Reference_Detail',\n DataProviderClass,\n dataProviderOptions,\n WA.components.dataViews.gridPlugins.DetailsContextMenu, me);\n detailsInitiializer.bind(Initiializer.EVENT.COMPLETE, function (initiializer) {\n me.grids = initiializer.gridInstances;\n initiializer.waitForData().done(function () {\n me._detailsGridInit.resolve();\n });\n });\n\n $.when(me.states.form, me.states.tables).then(function () {\n if (!me.form.isExist()) return;\n\n // Логика работы ведущих/ведомых в дательных разделах.\n me.bindLeaderDrivenLogic();\n\n //Удаляем пустые строки перед сохранением\n me.form.bind(\"prepareSave\", function removeEmptyRows() {\n for (var tableName in me.form.controls.tables) {\n var table = me.form.controls.tables[tableName];\n var rows = table.rows.toArray();\n var lastRow = rows[rows.length - 1];\n\n if (rows.length && lastRow && !lastRow.hasFilledRequisites() && !lastRow._locked) {\n table.deleteRow(lastRow.getRowId(), true);\n }\n }\n });\n });\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Получить высоту диалога\n * @private\n */\n _getAvailableHeight: function () {\n return this.model.Height;\n },\n\n /**\n * Освободить серверный объект API при закрытии диалога.\n * setTimeout используется, потому что грид инициализируется асинхронно,\n * и запросы могут посыпаться позже, чем мы сделаем freeDialog.\n * @method WebAccess.components.dialogs.FormDialog#_freeDialog \n * @private\n * @return {WebAccess.components.dialogs.FormDialog}\n */\n _freeDialog: function () {\n var me = this;\n setTimeout(function () {\n clearTimeout(this._keepAliveTimer);\n _(me.grids).each(function (grid, name) {\n clearTimeout(grid._queryDelay);\n })\n _(me._pendingOperations).each(function (operation, name) {\n operation.abort();\n });\n WA.SRV.call(me.serviceURL + '/FreeDialog', {\n InstanceID: me.id\n });\n }, 300);\n return me;\n },\n\n /**\n * Выполнение прикладного метода.\n * @since 5.5.0.1000\n * @function FormDialog.executeEntityMethod\n * @param {String} methodName Имя метода.\n * @param {Object[]} opt_parameters Параметры, с которыми должен вызваться метод.\n * @example \n * WebAccess.current.executeEntityMethod('MethodName', new WA.Link()).done(function(result) { console.log(result); });\n */\n executeEntityMethod: function (methodName, opt_parameters) {\n var d = $.Deferred();\r\n var me = this;\n var parameters = Array.prototype.slice.call(arguments, 1);\r\n\n WA.domainMethods.executeEntityMethod(\"/api/Dialog.asmx/ExecuteEntityMethod\",\n this.id, \"\", methodName, parameters).done(function (res) {\n var changes = res.Changes;\n var changedMultiSelects = res.ChangedMultiSelectRequisitesValues;\n if (me.form && me.form.isExist()) me.form.applyServerSideChanges(changes, changedMultiSelects);\n\n d.resolve(res.MethodResult);\n }).fail(function (errorMessage, res) {\n if (res) {\n if (res.Result) {\n var data = res.Result;\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n if (me.form && me.form.isExist()) me.form.applyServerSideChanges(changes, changedMultiSelects);\n }\n d.reject(res.Error);\n } else {\n d.reject(errorMessage);\n }\n });\n\n return d.promise();\n },\n\n /**\n * Проверяет, доступнен ли метод для текущего объекта.\n * @since 5.5.0.1000\n * @function FormDialog.isMethodAvailable\n * @param {string} methodName: Имя метода.\n * @returns {boolean} true, если метод доступен, иначе false.\n */\n isMethodAvailable: function (methodName) {\n return WA.domainMethods.isMethodAvailable(\"/api/Dialog.asmx/IsEntityMethodAvailable\", this.id, methodName);\n }\n\n\n //-----------------------------------------------------------------------//\n\n }, {\n EVENT: $.extend({\n /**\n * Срабатывает перед началом выполнения действия. \n * Можно остановить запуск действия \"по умолчанию\" возвратив false в обработчике события.\n * Затем можно продолжить запуск действия \"по умолчанию\" взывав функцию action.\n * @event WebAccess.components.dialogs.FormDialog.EVENT.BEFORE_ACTION\n * @param {string} actionName имя действия\n * @param {function} action действие по умолчанию\n * @param {WebAccess.components.dialogs.FormDialog} dialog экземпляр диалога\n */\n BEFORE_ACTION: 'beforeAction',\n\n /**\n * Срабатывает после выполнения действия. \n * Можно предотвратить закрытие диалога, возвратив false в обработчике события.\n * @event WebAccess.components.dialogs.FormDialog.EVENT.AFTER_ACTION\n * @param {string} actionName имя действия\n * @param {object} result результат выполнения действия. Данные которые возвращает сервер.\n * @param {WebAccess.components.dialogs.FormDialog} dialog экземпляр диалога\n */\n AFTER_ACTION: 'afterAction'\n }, global.components.dialogs.BaseDialog.EVENT)\n });\n\n //-------------------------------------------------------------------------//\n\n global.components.dialogs.FormDialog = FormDialog;\n})(window.WebAccess);","\"use strict\";\r\n(function FormDialogDataProviderDefinition(global) {\r\n\r\n /**\r\n * Провайдер данных детальных разделов диалога.\r\n * @since 5.2.0.1600\r\n * @class WebAccess.components.dialogs.FormDialogDataProvider\r\n * @extends WebAccess.components.dataViews.BaseDataProvider\r\n * @property {Object} defaults конфигурация \"по-умолчанию\"\r\n */\r\n var FormDialogDataProvider = WA.CMP.dataViews.BaseDataProvider.extend({\r\n _DFMName: null,\r\n _form: null,\r\n init: function(initialState, form) {\r\n var me = this;\r\n me._form = form; \r\n me._super(initialState);\r\n\r\n // Для сохранения состояния.\r\n me._dialogName = initialState.DialogName;\r\n me._detailSectionNumber = initialState.DetailSectionNumber;\r\n me._DFMName = initialState.DFMName;\r\n\r\n me.defaults = {}; \r\n $.extend(me.defaults, initialState);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Формирует параметры запросов.\r\n * @method WebAccess.components.dialogs.FormDialogDataProvider#makeParams\r\n * @param {Object} loadOptions Параметры запроса.\r\n * @return {Object} Расширенные параметры запроса.\r\n * @since 5.2.0.1600\r\n */\r\n makeParams: function (loadOptions) {\r\n return this.extendDefaults(loadOptions);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Загружает данные детального раздела.\r\n * @method WebAccess.components.dialogs.FormDialogDataProvider#load\r\n * @param {Object} loadOptions Параметры запроса.\r\n * @return {Deferred} Результат загрузки данных.\r\n * @since 5.2.0.1600 \r\n */\r\n load: function (loadOptions) {\r\n var me = this;\r\n var result = new $.Deferred();\r\n\r\n var operation = WA.SRV.call('/Dialogs.asmx/GetDetailsData', me.makeParams(loadOptions));\r\n me._form._registerOperation('load' + me._DFMName, operation); \r\n operation.done(function (data) {\r\n result.resolve({ Rows: $.parseJSON(data) });\r\n }).fail(function (e) {\r\n WA.ready(function () {\r\n var severity = (e.Severity !== \"-1\" ? Number(e.Severity) : undefined);\r\n WA.CR.inlineHint.show(e, undefined, severity)\r\n });\r\n result.resolve({ Rows: [] });\r\n }).always(function () {\r\n me._form._unRegisterOperation('load' + me._DFMName);\r\n });\r\n\r\n return result.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Загружает сохранненные настройки детального раздела из профиля пользователя.\r\n * @method WebAccess.components.dialogs.FormDialogDataProvider#loadState\r\n * @return {Deferred} Результат загрузки состояние.\r\n * @since 5.2.0.1600\r\n */\r\n loadState: function () {\r\n var me = this;\r\n var result = $.Deferred();\r\n\r\n var jTable = $('#' + me._DFMName);\r\n var data = jTable.data('state');\r\n if (data && data[\"InstanceID\"]) delete data[\"InstanceID\"]; //В профиле может быть неактуальная ссылка\r\n result.resolve(data);\r\n\r\n return result.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Сохраняет настройки детального раздела в профиль пользователя.\r\n * @method WebAccess.components.dialogs.FormDialogDataProvider#saveState\r\n * @param {Object} loadOptions Параметры запроса.\r\n * @return {Deferred} Результат сохранения состояния.\r\n * @since 5.2.0.1600\r\n */\r\n saveState: function (loadOptions) {\r\n var me = this;\r\n var result = $.Deferred();\r\n clearTimeout(me._saveSateTimeout);\r\n var operation = WA.cache.serverCache.setItem(me._makeKey(), me.makeParams(loadOptions));\r\n me._form._registerOperation('saveState' + me._DFMName, operation);\r\n me._saveSateTimeout = setTimeout(function () {\r\n operation.done(function () { \r\n result.resolve();\r\n }).fail(function () {\r\n result.reject();\r\n }).always(function () {\r\n me._form._unRegisterOperation('saveState' + me._DFMName);\r\n });\r\n }, 200);\r\n return result.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Формирует ключ для хранения настроек в профиле пользователя.\r\n * @method WebAccess.components.dialogs.FormDialogDataProvider#_makeKey\r\n * @return {String} Ключ для хранения в профиле пользователя.\r\n * @since 5.2.0.1600\r\n * @private\r\n */\r\n _makeKey: function () {\r\n var me = this;\r\n //Формат: [имя диалога, представление, номер детального раздела].\r\n return $.toJSON([me._dialogName, '', '' + me._detailSectionNumber]).replaceAll(' ', '');\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n });\r\n\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n // Публичные объекты.\r\n global.FormDialogDataProvider = FormDialogDataProvider;\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n})(window.WebAccess.components.dialogs);","\"use strict\";\n\n(function (global) {\n\n /**\n* Диалог для работы с формами запроса параметров отчетов.\n* @class WebAccess.components.dialogs.ReportParamsDialog\n* @extends WebAccess.components.dialogs.FormDialog\n* @mixes WebAccess.mixins.formMixin\n* @property {Deferred} Init меняет сосотояние при инициализации элементов управления формы\n* @property {Object} model переданная в конструктор модель \n* @property {String} serviceURL адрес веб-сервиса обслуживающего диалог\n* @since 5.2.0.1931 \n*/\n var ReportParamsDialog = global.FormDialog.extend({\n className: 'ReportParamsDialog',\n width: \"600\",\n title: L('REPORT_ASKABLE_PARAMS'),\n\n init: function (settings, model) {\n if (!model) WA.raise(L(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\"));\n\n var me = this;\n me.model = model;\n me.requisitesModels = JSON.parse(model.FormData).req;\n\n me.isShowOkButton = true;\n me.isShowCancelButton = true;\n\n me._pendingOperations = {};\n me._preInit();\n me._containerInit = $.Deferred();\n me._detailsGridInit = $.Deferred();\n me._postInit();\n\n me._setKeyBindings();\n\n return this;\n },\n\n /**\n * Создание html разметки и контейнеров\n * @method WebAccess.components.dialogs.ReportParamsDialog#_beforeShow\n * @private \n * @return {Deferred} результат подготовки разметки\n */\n _beforeShow: function () {\n var def = $.Deferred();\n var me = this;\n\n // WindowModal возвращает разметку в притык, без отступов, поэтому добавляемых их вручную.\n me.model.FormHtml = format('
    {0}
    ', me.model.FormHtml);\n\n me._super().done(function () {\n me.isShowOkButton = true;\n def.resolve();\n });\n\n return def;\n },\n\n /**\n * Проверить заполненность обязательных реквизитов.\n * Если реквизиты не заполнены они подсвечиваются на форме.\n * @method WebAccess.components.dialogs.ReportParamsDialog#validateForm\n * @return {WebAccess.components.dialogs.ReportParamsDialog}\n */\n validateForm: function () {\n var requisites = this.form.requisites;\n window.req = requisites;\n var isValid = true;\n\n for (var name in requisites) {\n var requisite = requisites[name];\n if (requisite.isRequired && requisite.isRequired() && !requisite.getValue()) {\n requisite.highlight();\n isValid = false;\n }\n }\n\n if (!isValid) {\n this.inlineHint.showError(L('NOT_ALL_REQUIRED_FIELDS_FILLED'));\n WA.raise(L('NOT_ALL_REQUIRED_FIELDS_FILLED'));\n }\n\n return this;\n }\n });\n\n global.ReportParamsDialog = ReportParamsDialog;\n})(window.WebAccess.components.dialogs);","\"use strict\";\r\n\r\n(function (globalWebAccess) {\r\n\r\n var FLOAT_DIALOG_TEMPLATE = '/layouts/FloatDialog.compile.html';\r\n\r\n /**\r\n * Всплывающее диалоговое окно\r\n *\r\n * @class WebAccess.components.dialogs.FloatDialog\r\n * @extends BaseObject\r\n * @property {String} id ИД диалогового окна\r\n * @property {Object} settings Настройки диалогового окна\r\n * @since 5.4.0.1000\r\n */\r\n\r\n var FloatDialog = BaseObject.extend({\r\n\r\n // Конструктор.\r\n init: function (id, settings) {\r\n var me = this;\r\n\r\n me.id = id;\r\n me.settings = settings;\r\n if ($.isPlainObject(settings)) {\r\n $.extend(this, settings);\r\n }\r\n me._inited = $.Deferred();\r\n\r\n me._createHtml(); //асинхронная\r\n },\r\n\r\n _createHtml: function () {\r\n var me = this;\r\n\r\n var floatDialogTemplate = WA.templates.render(FLOAT_DIALOG_TEMPLATE, $.extend({\r\n id: me.id,\r\n title: '',\r\n showMinimizeButton: true,\r\n minimized: false,\r\n showCloseButton: true,\r\n contentAsHtml: '',\r\n isLoading: true,\r\n hidden: false,\r\n loadingText: L('LOADING')\r\n }, me.settings));\r\n\r\n // Когда отрендерятся все шаблоны, создаем из них DOM элементы.\r\n $.when(floatDialogTemplate).done(function (html) {\r\n me._jDialog = $(html);\r\n\r\n me._jTitle = me._jDialog.find('.float-dialog__header-title');\r\n me._jMinimizingIcon = me._jDialog.find('.float-dialog__header-icon_toggle-size');\r\n me._jCloseIcon = me._jDialog.find('.float-dialog__header-icon_close');\r\n me._jContentArea = me._jDialog.find('.float-dialog__content-area');\r\n me._jContent = me._jContentArea.find('.float-dialog__content');\r\n me._jLoading = me._jDialog.find('.float-dialog__loading');\r\n me._jLoadingText = me._jLoading.find('.float-dialog__loading-text');\r\n\r\n me._bindEvents();\r\n\r\n if ($('#' + me.id).length === 0) {\r\n me._jDialog.addClass('float-dialog_hidden');\r\n me._jDialog.appendTo('body');\r\n }\r\n // Инициализация закончилась.\r\n me._inited.resolve();\r\n });\r\n },\r\n\r\n // Навешивает события на элементы диалога.\r\n _bindEvents: function () {\r\n var me = this;\r\n\r\n me._jMinimizingIcon.on('click', function () {\r\n me.setMinimized(!me.isMinimized(), true);\r\n });\r\n me._jCloseIcon.on('click', function () {\r\n if (me.fire(me['class'].EVENT.BEFORE_CLOSE, me) === false) return false;\r\n me.hide();\r\n me.fire(me['class'].EVENT.AFTER_CLOSE, me);\r\n });\r\n },\r\n\r\n /**\r\n * Добавляет диалоговое окно на страницу и отображает его.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#show\r\n */\r\n show: function () {\r\n var me = this;\r\n $.when(me._inited).done(function () {\r\n me._jDialog.removeClass('float-dialog_hidden');\r\n });\r\n },\r\n\r\n /**\r\n * Скрывает диалоговое окно.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#hide\r\n */\r\n hide: function () {\r\n var me = this;\r\n $.when(me._inited).done(function () {\r\n // Минимизировать для анимации сворачивания.\r\n me.setMinimized(true);\r\n me._jDialog.addClass('float-dialog_hidden');\r\n });\r\n },\r\n\r\n /**\r\n * Устанавливает новый заголовок диалогового окна.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#setTitle\r\n * @param {string} newTitle Заголовок диалога\r\n */\r\n setTitle: function (newTitle) {\r\n var me = this;\r\n $.when(me._inited).done(function () {\r\n me._jTitle.text(newTitle);\r\n });\r\n },\r\n\r\n /**\r\n * Устанавливает новый заголовок диалогового окна в формате HTML.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#setTitleAsHtml\r\n * @param {string} newTitleHtml Заголовок диалога в формате HTML\r\n */\r\n setTitleAsHtml: function (newTitleHtml) {\r\n var me = this;\r\n $.when(me._inited).done(function () {\r\n me._jTitle.html(newTitleHtml);\r\n });\r\n },\r\n\r\n /**\r\n * Устанавливает содержимое диалогового окна в формате HTML.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#setContentAsHtml\r\n * @param {string} contentAsHtml Содержимое диалогового окна в формате HTML\r\n * @param {function} callback Функция, которая будет вызвана при установке значения содержимого\r\n */\r\n setContentAsHtml: function (contentAsHtml, callback) {\r\n var me = this;\r\n $.when(me._inited).done(function () {\r\n me._jLoading.hide();\r\n me._jContent.html(contentAsHtml);\r\n me._jContent.show();\r\n if (callback) callback();\r\n });\r\n },\r\n\r\n /**\r\n * Устанавливает содержимое диалогового окна.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#setContent\r\n * @param {string} content Содержимое диалогового окна\r\n * @param {function} callback Функция, которая будет вызвана при установке значения содержимого\r\n */\r\n setContent: function (content, callback) {\r\n this.setContentAsHtml('
    ' + content + '
    ', callback);\r\n },\r\n\r\n /**\r\n * Показывает сообщение о загрузке.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#showLoader\r\n * @param {string} text Текст сообщения о загрузке\r\n */\r\n showLoader: function (text) {\r\n var me = this;\r\n $.when(me._inited).done(function () {\r\n if (text) {\r\n me._jLoadingText.text(text);\r\n }\r\n me._jContent.hide();\r\n me._jLoading.show();\r\n });\r\n },\r\n\r\n /**\r\n * Проверяет, минимизировано ли диалоговое окно.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#isMinimized\r\n * @return {boolean} True – диалоговое окно минимизировано, иначе False.\r\n */\r\n isMinimized: function () {\r\n var me = this;\r\n return me._jDialog.hasClass('float-dialog_minimized');\r\n },\r\n\r\n /**\r\n * Проверяет, развернул ли пользователь диалоговое окно.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#isUserExpanded\r\n * @return {boolean} True – диалоговое окно развернуто, иначе False.\r\n */\r\n isUserExpanded: function () {\r\n var me = this;\r\n return WA.cache.getItem('floatdialog.' + me.id + '.expanded') === '1';\r\n },\r\n\r\n /**\r\n * Устанавливает признак минимизации диалогового окна.\r\n *\r\n * @method WebAccess.components.dialogs.FloatDialog#setMinimized\r\n * @param {boolean} isMinimized Признак минимизации диалогового окна\r\n * @param {boolean} saveState Признак сохранения состояния диалогового окна\r\n */\r\n setMinimized: function (isMinimized, saveState) {\r\n var me = this;\r\n $.when(me._inited).done(function () {\r\n if (isMinimized) {\r\n // Сворачиваем.\r\n me._jDialog.addClass('float-dialog_minimized');\r\n me._jContentArea.addClass('float-dialog__content-area_minimized');\r\n me._jLoading.hide();\r\n me._jMinimizingIcon.removeClass('float-dialog__header-icon_toggle-size_maximized');\r\n } else {\r\n // Разворачиваем.\r\n me._jDialog.removeClass('float-dialog_minimized');\r\n me._jContentArea.removeClass('float-dialog__content-area_minimized');\r\n me._jMinimizingIcon.addClass('float-dialog__header-icon_toggle-size_maximized');\r\n\r\n me._jContent.niceScroll({\r\n cursorcolor: \"#d8dce3\",\r\n cursorwidth: \"6px\",\r\n cursorborder: \"0\",\r\n autohidemode: \"false\",\r\n cursorborderradius: \"0\",\r\n railpadding: { right: 3 },\r\n horizrailenabled: false,\r\n railalign: \"right\"\r\n });\r\n }\r\n });\r\n\r\n if (saveState)\r\n WA.cache.setItem('floatdialog.' + me.id + '.expanded', isMinimized ? '0' : '1');\r\n }\r\n }, {\r\n EVENT: {\r\n\r\n /**\r\n * Срабатывает перед закрытием модального окна.\r\n * Можно предотвратить закрытие диалогового окна, вернув false в обработчике события.\r\n *\r\n\t * @event WebAccess.components.dialogs.FloatDialog.EVENT.BEFORE_CLOSE\r\n * @param {WebAccess.components.dialogs.FloatDialog} dialog Экземпляр диалога\r\n * @since 5.4.0.1004\r\n */\r\n BEFORE_CLOSE: 'beforeClose',\r\n\r\n /**\r\n * Срабатывает после закрытия диалогового окна.\r\n *\r\n\t * @event WebAccess.components.dialogs.FloatDialog.EVENT.AFTER_CLOSE\r\n * @param {WebAccess.components.dialogs.FloatDialog} dialog Экземпляр диалога\r\n * @since 5.4.0.1004\r\n */\r\n AFTER_CLOSE: 'close'\r\n }\r\n });\r\n\r\n // ---------------------------------------------------------------------------------------------------\r\n globalWebAccess.components.dialogs.FloatDialog = FloatDialog;\r\n\r\n})(window.WebAccess);\r\n","\"use strict\";\n\n\n/**\n* Контекстное меню.\n* Отображается по нажатию левой кнопкой мыши на элемент. После отображения не может быть изменено.\n* Для создания другого набора элементов следует использовать новый объект.\n*\n* @class WebAccess.components.menus.BaseContextMenu\n* @since 5.0.0.4000\n* @extends BaseObject\n* @param {string} itemSelector Существующий элемент страницы\n* @param {WebAccess.components.menus.BaseContextMenu.contextMenuItem} [opt_menuItems] Массив со списком пунктов меню\n* @param {WebAccess.components.menus.BaseContextMenu.contextMenuSettings} [opt_settings] Параметры контекстного меню\n* @throws ERR_ELEMENT_DOES_NOT_EXIST - указанного элемента страницы не существует.\n* @fires Следует использовать параметр itemSelect с передачей выбранного элемента.\n* @example\n* function CreateReferenceFiltersMenu(selector, data) {\n* var menu = new WA.components.menus.BaseContextMenu(selector,data);\n* menu.render();\n* menu.bind(\"itemSelect\", function(item) {\n* grid.PerformCallback(['CHANGEFILTER', item.name, item.label]);\n* $(selector).html(item.label);\n* });\n* };\n*/\n\n/**\n * Пункт меню.\n * @typedef {Object} WebAccess.components.menus.BaseContextMenu.contextMenuItem\n * @since 5.0.0.4000\n * @property {string} name Имя пункта меню\n * @property {string} label Заголовок пункта меню\n * @property {string} [icon] Иконка рядом с заголовком\n * @property {boolean} [bottomSeparator] Признак необходимости добавления разделителя ниже пункта меню\n * @property {boolean} [selected] Признак того, что объект выбран\n * @property {string} [tooltip] Подсказка при наведенииы\n * @example\n * var menuItems = [\n * {\"name\": \"-1\",\n * \"label\": L(\"DEFAULT_EMPTY_FILTER\"),\n * \"bottomSeparator\": true\n * }];\n */\n\n/**\n * Параметры контекстного меню.\n * @typedef {Object} WebAccess.components.menus.BaseContextMenu.contextMenuSettings\n * @since 5.0.0.4000\n * @property {string} [shiftY] Величина верхнего отступа\n * @property {string} [width] Ширина меню\n * @property {function} [onShow] Ссылка на функцию, которая будет выполнена при отображении меню\n * @property {function} [onHide] Ссылка на функцию, которая будет выполнена при скрытии меню\n * @example\n * var settings = [\n * {\"shiftY\": 100,\n * \"width\": 300,\n * \"onShow\": function( ) { alert(\"onShow\"); }\n * }];\n */\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n//\n(function (global) {\n var BaseContextMenu = BaseObject.extend({\n\n className: 'BaseContextMenu',\n items: [],\n settings: {},\n _imageWidth: 16,\n _imageHeight: 16,\n _isRendered: false,\n _menu: null,\n\n init: function (itemSelector, opt_menuItems, opt_settings) {\n log.info('CONTEXT_MENU', 'Init context menu for ' + itemSelector);\n var instance = this;\n\n this.items = (!!opt_menuItems) ? opt_menuItems : [];\n this.settings = { imageWidth: this._imageWidth, imageHeight: this._imageWidth };\n if (!$.isEmptyObject(opt_settings)) $.extend(this.settings, opt_settings);\n\n this._super(itemSelector);\n this._jObject = $(itemSelector);\n if (this._jObject.length <= 0) WA.raise(\"ERR_ELEMENT_DOES_NOT_EXIST\", itemSelector);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _makeMenuObject: function () {\n var me = this;\n //if (!!this._menu) return this;\n for (var i = 0; i < me.items.length; ++i) {\n me.items[i].text = escapeHtml(me.items[i].label).trunc(50) || me.items[i].text; //чтобы было как везде, ближе к эталонам\n me.items[i].image = me.items[i].icon;\n me.items[i].hoverImage = me.items[i].hoverIcon;\n if (me.items[i].selected && !me.items[i].image) {\n me.items[i].image = \"/App_Sprites/menu_check.png\";\n }\n me.items[i].onClick = (!!me.items[i].onClick) ? me.items[i].onClick : function (item, menu, event) { me.fire(\"itemSelect\", item, menu, event); };\n }\n this._menu = new ContextMenu(this.items, this.settings);\n return this;\n },\n\n /**\n * Добавить новый пункт меню.\n * @method WebAccess.components.menus.BaseContextMenu#addItem\n * @param {string} name Имя пункта меню\n * @param {string} label Заголовок пункта меню\n * @param {string} [opt_icon] Значок рядом с заголовком\n * @param {boolean} [opt_bottomSeparator] Признак необходимости добавления разделителя после пункта меню\n * @param {boolean} [opt_selected] Признак того, что объект выбран\n * @param {boolean} [opt_disabled] Признак того, что объект доступен\n * @throws ERR_OBJECT_IS_ALREADY_RENDERED - объект уже отображен.\n * @return {WebAccess.components.menus.BaseContextMenu} Объект типа BaseContextMenu.\n * @todo Возможность принятия WebAccess.components.menus.contextMenuItem.\n */\n addItem: function (name, label, opt_icon, opt_bottomSeparator, opt_selected, opt_disabled, opt_tooltip) {\n if (!this._isRendered) {\n var instance = this;\n this.items.push({\n 'name': name,\n 'label': escapeHtml(label).trunc(50),\n \"image\": opt_icon,\n \"bottomSeparator\": (opt_bottomSeparator || false),\n \"selected\": (opt_selected || false),\n \"disabled\": (opt_disabled || false),\n \"tooltip\": (opt_tooltip || '')\n });\n return this;\n } else {\n return WA.raise(\"ERR_OBJECT_IS_ALREADY_RENDERED\");\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить выбранный пункт меню.\n * @method WebAccess.components.menus.BaseContextMenu#getSelectedItem\n * @return {WebAccess.components.menus.BaseContextMenu.contextMenuItem} Объект типа BaseContextMenu.contextMenuItem.\n */\n getSelectedItem: function () {\n return this.items[getElementIndexByAttr(this.items, \"selected\", true)];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить выбранный пункт меню.\n * @method WebAccess.components.menus.BaseContextMenu#setSelectedItem\n * @param {string} name Имя пункта меню.\n * @param {boolean} isSelected Выбран или нет пункт меню.\n * @param {string} opt_icon Новая иконка.\n * @return {WebAccess.components.menus.BaseContextMenu} Объект типа BaseContextMenu.\n */\n setSelectedItem: function (name, isSelected, opt_icon, opt_iconCSSClass) {\n var me = this;\n\n isSelected = (isSelected !== false);\n\n var item = me.items[getElementIndexByAttr(me.items, \"name\", name)];\n item.selected = isSelected;\n item.icon = _.isUndefined(opt_icon) ? item.icon : opt_icon;\n item.image = item.icon;\n if (isSelected) {\n if (!item.image) {\n item.image = \"/App_Sprites/menu_check.png\";\n } else if (opt_iconCSSClass) {\n item.iconCSSClass = opt_iconCSSClass;\n }\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отображает меню.\n * Метод может быть вызван только один раз – когда все пункты меню уже переданы.\n * @method WebAccess.components.menus.BaseContextMenu#render\n * @throws ERR_OBJECT_IS_ALREADY_RENDERED - объект уже отображен.\n * @return {WebAccess.components.menus.BaseContextMenu} Объект типа BaseContextMenu.\n */\n render: function (force) {\n var me = this;\n if (!!me._isRendered && !force) return WA.raise(\"ERR_OBJECT_IS_ALREADY_RENDERED\");\n this._makeMenuObject();\n this._isRendered = true;\n this._jObject.contextMenu(this._menu);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить меню. (Альтернативыный способ, c исходного события)\n * @method WebAccess.components.menus.BaseContextMenu#show\n * @param {object} [opt_event] DOM-событие вызывающее данный метод\n * @return {WebAccess.components.menus.BaseContextMenu} Объект типа BaseContextMenu.\n * @since 5.2.0.1300\n */\n show: function (opt_event) {\n this._makeMenuObject();\n this._menu.show(null, null, opt_event);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить меню в указанных координатах.\n * @method WebAccess.components.menus.BaseContextMenu#showAt\n * @param {integer} x Координата по горизонтали\n * @param {integer} y Координата по вертикали\n * @param {object} [opt_event] DOM-событие вызывающее данный метод\n * @return {WebAccess.components.menus.BaseContextMenu} Объект типа BaseContextMenu.\n * @since 5.2.0.1300\n */\n showAt: function (x, y, opt_event) {\n this._makeMenuObject();\n this._menu.showAt({ left: x, top: y }, null, null, opt_event);\n return this;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n global.BaseContextMenu = BaseContextMenu;\n})(window.WebAccess.components.menus);\n","\"use strict\";\n\n/**\n* Контекстное меню в виде горизонтально расположенных иконок.\n*\n* @class WebAccess.components.menus.OnlyIconsContextMenu\n* @since 5.0.0.4200\n* @extends WebAccess.components.menus.BaseContextMenu\n* @param {string} itemSelector Существующий элемент страницы\n* @param {WebAccess.components.menus.BaseContextMenu.contextMenuItem} [opt_menuItems] Массив со списком пунктов меню\n* @param {WebAccess.components.menus.BaseContextMenu.contextMenuSettings} [opt_settings] Параметры контекстного меню\n* @param {string} [opt_settings] ИД элемента страницы\n* @property WebAccess.components.menus.OnlyIconsContextMenu#jMenu jQuery элемент текущего отрисованного меню\n* @property WebAccess.components.menus.OnlyIconsContextMenu#controlId ИД элемента на страницы\n* @example\n* // При наведении мыши на логотип Directum откроется контекстное меню.\n* var menu = new window.WebAccess.components.menus.OnlyIconsContextMenu(\"#logo\", [{\n* name: \"itemName\",\n* text: \"text\",\n* image: \"ToolbarAndTab/SaveAndExit_16.png\",\n* imageCSSClass: \"availableStatuses[i]\",\n* selected: true\n* }], {}, \"menuId\");\n* menu.render();\n*\n* menu.bind('itemSelect', function (item) {\n* console.log(item);\n* });\n*\n* $(\"#logo\").hover(function() { menu.show() },function() { menu.hide() } );\n*/\n(function (global) {\n var OnlyIconsContextMenu = global.BaseContextMenu.extend({\n init: function (element, opt_menuItems, opt_settings, opt_controlId) {\n var me = this;\n me._super(element, opt_menuItems, opt_settings);\n me.controlId = opt_controlId || 'onlyIconsContextMenu';\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: 'OnlyIconsContextMenu',\n controlId: 'onlyIconsContextMenu',\n jMenu: null,\n\n /**\n * Отобразить контекстое меню.\n * Метод может быть вызван только один раз – когда все пункты меню уже переданы.\n * @method WebAccess.components.menus.OnlyIconsContextMenu#render\n * @throws ERR_OBJECT_IS_ALREADY_RENDERED - объект уже отображен.\n * @return {WebAccess.components.menus.OnlyIconsContextMenu} Oбъект типа OnlyIconsContextMenu.\n */\n render: function (force) {\n var me = this;\n var i;\n if (!!me._isRendered && !force) return WA.raise(\"ERR_OBJECT_IS_ALREADY_RENDERED\");\n\n // Удяляем элемент с таким ИД.\n $('#' + me.controlId).remove();\n\n // Генерируем HTML.\n var html = '
    ';\n for (i = 0; i < me.items.length; i++) {\n html += '
    ';\n html += '
    ';\n html += '
    ';\n }\n html += '
    ';\n me.jMenu = $(html);\n\n // Навешиваем события на элементы списка.\n var itemEls = me.jMenu.find('.item');\n for (i = 0; i < me.items.length; i++) {\n var onClick = (function (item) {\n return function () {\n me.jMenu.find('.selected').removeClass('selected');\n $(this).addClass('selected');\n me.fire(\"itemSelect\", item);\n };\n })(me.items[i]);\n itemEls.eq(i)\n .on('click.onlyIconsCM', onClick);\n }\n me._isRendered = true;\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить меню в координатах переданного элемента.\n * @method WebAccess.components.menus.OnlyIconsContextMenu#show\n * @return {WebAccess.components.menus.OnlyIconsContextMenu} Oбъект типа OnlyIconsContextMenu.\n */\n show: function () {\n var me = this;\n if ($('#' + me.controlId).length === 0) {\n $('body').append(me.jMenu);\n }\n var jObjOffset = me._jObject.offset();\n me.jMenu.css({\n 'position': 'absolute',\n 'left': Math.round(jObjOffset.left),\n 'top': Math.round(jObjOffset.top)\n });\n me.jMenu.show();\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить меню в переданном элементе.\n * @method WebAccess.components.menus.OnlyIconsContextMenu#showIn\n * @param {string} container Селектор или контейнер\n\t * @param {boolean} atTop Признак, выше или ниже контейнера должно быть вставлено меню\n * @return {WebAccess.components.menus.OnlyIconsContextMenu} Oбъект типа OnlyIconsContextMenu.\n */\n showIn: function (container, atTop) {\n var me = this;\n if (atTop === true) {\n $(container).prepend(me.jMenu);\n } else {\n $(container).append(me.jMenu);\n }\n me.jMenu.show();\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть контекстное меню.\n * @method WebAccess.components.menus.OnlyIconsContextMenu#hide\n * @return {WebAccess.components.menus.OnlyIconsContextMenu} Oбъект типа OnlyIconsContextMenu.\n */\n hide: function () {\n this.jMenu.hide();\n return me;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n global.OnlyIconsContextMenu = OnlyIconsContextMenu;\n})(window.WebAccess.components.menus);","\"use strict\";\n\n\n/**\n* Генератор форм.\n*\n* @example\n* var form = new WebAccess.components.forms.FormBuilder(\"uniq_id\");\n* var form_html = form.addInput(\"ERR_ELEMENT_DOES_NOT_EXIST\")\n* .addInput(\"NOT_CREATED_SESSION_MANAGER\")\n* .addInput(\"EDOCUMENT_SIGN\")\n* .addText(\"NO_RIGHTS_FOR_SIGN_EDOC_DUE_EDIT\")\n* .addTextarea(\"REPORT_ASKABLE_PARAMS\")\n* .addInput(\"NOT_CREATED_SESSION_MANAGER\")\n* .render();\n* WebAccess.current.sideBar.tabs.FldTree.setHtml(form_html);\n\n* @example\n* var CP = WA.components;\n* var form = new CP.forms.FormBuilder(\"filter_save_modal\");\n* form.addPick(\"FILTER_NAME\", {\"key\": \"value\", \"key2\": \"value2\"}, null, null, true, {\"isRequired\": true});\n\n* var dialog = new CP.dialogs.BaseDialog();\n* dialog.title = L(\"SAVE_NEW_FILTER\");\n* dialog.html = form.render();\n* dialog.isShowCancelButton = true;\n* dialog.ok = function() {\n* if (form.isValid() === false) return false;\n* var filterName = form.getValue(\"FILTER_NAME\");\n* var displayValue = form.getDisplayValue(\"FILTER_NAME\");\n* if (filterName === \"\") {\n* CallService(\"/Service.asmx/CreateNewFilter\", {\"ReferenceCode\": WA.current.getReferenceCode() ,\"Name\": displayValue} , function(response) {\n* });\n* }};\n* dialog.show();\n*\n* @since 5.0.0.4000\n* @class WebAccess.components.forms.FormBuilder\n* @mixes WebAccess.mixins.pluginMixin\n* @extends BaseObject\n* @param {string} id Уникальный идентификатор формы. Параметр является обязательным\n* @property {string} displayErrors [\"tip\",\"inline\", \"none\"] - режим отображения ошибок, возникающих при проверке корректности заполнения формы\n* @throws ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED - заданы не все обязатаельные параметры.\n*/\n\n/**\n * Правила корректности заполнения формы.\n * @typedef {Object} WebAccess.components.forms.FormBuilder.validatorRules\n * @property {boolean} [isRequired] Признак обязательного поля\n * @property {boolean} [isDate] Признак того, что поле имеет тип «Дата»: 01/01/2000, 01.01.2000, а не 01/01.2000 или «фдлврф»\n * @property {boolean} [isDigit] Признак того, что поле имеет тип «Число»\n * @property {boolean} [min] Допустимое минимальное числовое значение\n * @property {boolean} [max] Допустимое максимальное числовое значение\n * @property {boolean} [isEmail] Значение поля – адрес электронной почты\n * @since 5.0.0.4000\n *\n * @example\n * form.addCustomField(\"TO_ARCHIVE_DATE\", toArchiveDateHtml, { \"isRequired\": true, \"isDate\": true });\n */\n\n/**\n * Ссылка на объект\n * @typedef {Object} WebAccess.components.forms.FormBuilder.objectLink\n * @property {integer} id ИД объекта\n * @property {OBJECT_TYPE} type Тип объекта\n * @property {boolean} [referenceCode] Код справочника\n * @since 5.0.0.7100\n*/\n\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n(function (global) {\n var FormBuilder = BaseObject.extend([WA.mixins.pluginMixin], {\n className: \"FormBuilder\",\n id: \"\",\n items: {},\n invalidFields: [],\n displayErrors: \"tip\",\n heigth: 100,\n _html: '',\n _orientaion: ORIENTATION.HORIZONTAL,\n _request: [],\n _action: \"#\",\n _method: FORM_METHOD.POST,\n _enctype: ENCTYPE.MULTIPART,\n _constructors: [],\n isHtmlFormEnabled: false,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (id) {\n if (!id) WA.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\", \"id\");\n this._super(id);\n this.id = id;\n\n //Это обязательно, не понятно почему, но оно не обнуляется само\n this.items = {};\n this.invalidFields = [];\n this._request = [];\n this._constructors = [];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Изменить ориентацию содержимого формы.\n * Поддерживается вертикальная и горизонтальная ориентация.\n * Метод используется до вызова одной из функций добавления поля, например addText или addReferenceSelect,\n * сразу после вызова конструктора либо после вызова метода render.\n *\n * @function WebAccess.components.forms.FormBuilder#setOrientation\n * @param {string} orientation Ориентация HTML-разметки. Возможные значения: \"vertical\" – поля располагаются под названием поля; \"horizontal\" – поле и его название располагаются в одной строке. Значение по умолчанию - \"horizontal\"\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n setOrientation: function (orientation) {\n var me = this;\n if (!isNaN(orientation)) {\n if (orientation === 0) me._orientaion = 'horizontal';\n else me._orientaion = 'vertical';\n } else {\n this._orientaion = orientation;\n }\n\n var jForm = $(\"#\" + this.id);\n if (jForm.length > 0) {\n jForm.find(\".field_container\").removeClass(me._orientaion).addClass(me._orientaion);\n jForm.find(\".rs_SelItems_cont\").removeAttr(\"style\"); //хак для RefSel\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Получить значение поля.\n *\n * @function WebAccess.components.forms.FormBuilder#getValue\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {boolean} [opt_byId] Признак, отключено ли внутреннее преобразование идентификатора. Если отключено, указанный идентификатор используется в неизменном виде\n * @return {string} Значение поля.\n */\n getValue: function (name, opt_byId) {\n if (!$(\"#\" + this.id).length) WA.raise('ERR_UNABLE_TO_GET_THE_VALUE_FORM_IS_MISSING');\n\n var byId = byId || false;\n name = name.toLowerCase();\n var type = \"\";\n var value = \"\";\n var jField = $(\"#\" + name);\n\n if (name in this.items) type = this.items[name].type;\n else type = \"undefinied\";\n\n switch (type) {\n case \"text\":\n jField = $(\"#\" + name + \"_label\");\n value = jField.html();\n break;\n case \"textFrame\":\n value = jField.html();\n break;\n case \"radio\":\n value = jField.find('input[name=\"' + name + '\"]:checked').val();\n break;\n case \"input\":\n case \"date\":\n value = jField.val();\n break;\n case \"select\":\n value = jField.val();\n break;\n case \"referenceSelect\":\n case \"multiSelect\":\n value = $(\"#hSelID_\" + name).val();\n break;\n case \"custom\":\n if (!byId) value = $(\"#hSelID_\" + name).val();\n else value = jField.val();\n break;\n case \"pick\":\n var pickInstance = $(\"#\" + name + \"inp\").data('DropDownListInstance');\n value = pickInstance.getValue();\n if (value == \"-1\") value = \"\";\n break;\n case \"objectList\":\n return ListRequisite(name).GetLinks();\n break;\n case \"undefinied\":\n value = \"\";\n break;\n case \"checkbox\":\n value = jField.is(':checked');\n break;\n default:\n value = jField.val();\n break;\n }\n return value;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Устанавливает значение указанного поля.\n * Метод можно использовать, только когда поле уже отображаетсяна странице.\n * Например, если форма используется в модальном окне, то метод необходимо использовать только после события open модального окна:\n * dialog.bind('open', function() {\n * form.setValue(.....)\n * ...\n * })\n *\n * @function WebAccess.components.forms.FormBuilder#setValue\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {string} value Значение поля\n * @param {string} displayValue Отображаемое значение поля\n * @param {boolean} [opt_byId] Отключить внутренние преобразования идентификатора, и использовать указанный.\n * @return {WebAccess.components.forms.FormBuilder} Объект типа FormBuilder.\n */\n setValue: function (name, value, displayValue, opt_byId) {\n var byId = byId || false;\n name = name.toLowerCase();\n var type = \"\";\n var jField = $(\"#\" + name);\n\n if (name in this.items) type = this.items[name].type;\n else type = \"undefinied\";\n\n switch (type) {\n case 'radio':\n var jRadios = jField.find('input[name=\"' + name + '\"]');\n jRadios.filter('[value=\"' + value + '\"]').prop('checked', true);\n break;\n case \"referenceSelect\":\n case \"multiSelect\":\n WA.CMP.wrappers.form.requisites.BaseObjectSelectRequisite.setControlValue(jField, value, displayValue);\n break;\n case \"pick\":\n setTimeout(function () {\n var pickInstance = $(\"#\" + name + \"inp\").data('DropDownListInstance');\n pickInstance.setValue(value, displayValue);\n }, 10);\n break;\n case \"undefinied\":\n break;\n case \"text\":\n jField = $(\"#\" + name + \"_label\");\n jField.html(L(value));\n break;\n case \"textFrame\":\n jField.html(value);\n break;\n case \"objectList\":\n var list = ListRequisite(name);\n var links = [];\n\n for (var i in value) {\n links.push({\n 'ID': value[i].id,\n 'Kind': objectTypeToString(value[i].type),\n 'referenceName': value[i].CompCode\n });\n }\n list.Values = links;\n list.UpdateList();\n break;\n case 'date':\n if (typeof value === \"object\") {\n value = formatDate(value);\n }\n jField.val(value);\n break;\n case 'checkbox':\n if (!!value) jField.attr('checked', 'checked');\n else jField.removeAttr('checked');\n break;\n default:\n jField.val(value);\n break;\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выкидывает исключение при попытке добавить одно и то-же поле\n * @private\n * @function WebAccess.components.forms.FormBuilder#_preventDoubles\n */\n _preventDoubles: function (id) {\n if (this.items[id]) WA.raise(\"ERR_FIELD_WITH_THE_SAME_NAME_ALREADY_EXIST\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить отображаемое значение поля.\n *\n * @param {string} name Имя поля\n * @function WebAccess.components.forms.FormBuilder#getDisplayValue\n * @return {string} Отображаемое значение поля.\n */\n getDisplayValue: function (name) {\n var type = \"\";\n name = name.toLowerCase();\n var value = \"\";\n var jField = $(\"#\" + name);\n\n if (name in this.items) type = this.items[name].type;\n else type = \"undefinied\";\n switch (type) {\n case \"text\":\n jField = $(\"#\" + name + \"_label\");\n jField.html(L(value));\n break;\n case \"textFrame\":\n value = jField.html();\n break;\n case \"pick\":\n var pickInstance = $(\"#\" + name + \"inp\").data('DropDownListInstance');\n value = pickInstance.getDisplayValue();\n break;\n case \"multiSelect\":\n case \"referenceSelect\":\n var values = [];\n $('#' + name + '_container').find('.rs_SelItems').children(\"span\").each(function () {\n values.push($(this).attr(\"data-text\"));\n });\n value = values.join(';');\n break;\n case \"undefinied\":\n value = \"\";\n break;\n case \"objectList\":\n WA.raise('ERR_UNSUPPORTED_METHOD');\n break;\n default:\n value = jField.val();\n break;\n }\n return value;\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить высоту формы.\n * Устаревший метод, оставлен для совместимости с предыдущими версиями. Не рекомендуется его использовать.\n *\n * @function WebAccess.components.forms.FormBuilder#getHeight\n * @return {integer} Высота формы.\n * @since 5.0.0.4000\n * @deprecated\n */\n getHeight: function () {\n return this.heigth;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Получить высоту формы.\n *\n * @deprecated\n * @alias WebAccess.components.forms.FormBuilder#getHeight\n * @function WebAccess.components.forms.FormBuilder#getHeigth\n * @ignore\n */\n getHeigth: function () { return this.getHeight.apply(this, arguments); },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удаление поля с формы\n * @function WebAccess.components.forms.FormBuilder#_removeField\n * @private\n * @param {string} name идентификатор поля\n * @return {WebAccess.components.forms.FormBuilder}\n */\n _removeField: function (id) {\n if (!id) WA.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\", \"name\");\n this._preventDoubles(id);\n $(\"#\" + name.toLowerCase() + \"_container\").remove();\n this.items[id] = { 'id': id }; //В этой строке заключается порядок, убрать её, значит нарушить его.\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить текст на форму.\n *\n * @function WebAccess.components.forms.FormBuilder#addText\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n addText: function (name) {\n var me = this;\n var id = name.toLowerCase();\n me._removeField(id);\n\n var constructor = {\n template: 'formBuilder/text.compile.html',\n params: {\n 'id': id,\n 'text': L(name)\n },\n\n afterRender: function (html) {\n me._addItem(name, id, false, 'text', html, null);\n }\n };\n\n me._constructors.push(constructor);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Для вставки звездочки в обязательные поля\n * @private\n */\n _asterisk: function (label, rules) {\n if (rules && rules['isRequired'] && label !== '') {\n return '*';\n }\n return '';\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить поле типа «Текст».\n *\n * @function WebAccess.components.forms.FormBuilder#addInput\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {number} [opt_maxlength] Допустимое количество символов в поле\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n addInput: function (name, opt_maxlength, opt_validateRules, opt_type, opt_defaultValue) {\n var me = this;\n var id = name.toLowerCase();\n me._removeField(id);\n opt_type = opt_type || 'input';\n opt_maxlength = opt_maxlength || '';\n opt_defaultValue = opt_defaultValue || '';\n\n var label = L(name);\n var constructor = {\n template: 'formBuilder/input.compile.html',\n params: {\n 'id': id,\n 'orientation': me._orientaion,\n 'asterisk': me._asterisk(label, opt_validateRules),\n 'label': (label === '' ? '' : label + ':'),\n 'type': (opt_type == 'input') ? 'text' : opt_type,\n 'max': opt_maxlength,\n 'value': opt_defaultValue\n },\n afterRender: function (html) {\n me._addItem(name, id, false, opt_type, html, opt_validateRules);\n }\n };\n\n me._constructors.push(constructor);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить поле типа «File».\n *\n * @function WebAccess.components.forms.FormBuilder#addFileField\n * @param {string} name Строка локализации равная идентификатору поля\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n addFileField: function (name, opt_validateRules) {\n return this.addInput(name, null, opt_validateRules, 'file');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить скрытое поле.\n *\n * @function WebAccess.components.forms.FormBuilder#addHiddenField\n * @param {string} name Строка локализации равная идентификатору поля\n * @param {string} value Значение поля\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n addHiddenField: function (name, value) {\n var me = this;\n var id = name.toLowerCase();\n me._removeField(id);\n\n var constructor = {\n template: 'formBuilder/hidden.compile.html',\n params: {\n 'id': id,\n 'value': value\n },\n afterRender: function (html) {\n me._addItem(name, id, false, \"datehidden\", html, null);\n }\n };\n\n me._constructors.push(constructor);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить поле для выбора даты.\n *\n * @method WebAccess.components.forms.FormBuilder#addDate\n * @param {string} name Строка локализации равная идентификатору поля\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n addDate: function (name, opt_validateRules) {\n var me = this;\n var id = name.toLowerCase();\n me._removeField(id);\n\n var constructor = {\n template: 'formBuilder/date.compile.html',\n params: {\n 'id': id\n },\n afterRender: function (html) {\n html = me._wrapControl(id, html, opt_validateRules);\n me._addItem(name, id, false, \"date\", html, opt_validateRules);\n }\n };\n\n me._constructors.push(constructor);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить многострочное поле.\n *\n * @function WebAccess.components.forms.FormBuilder#addTextarea\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {string} opt_defaultvalue Значение по умолчанию\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n addTextArea: function (name, opt_defaultvalue, opt_validateRules) {\n var me = this;\n var id = name.toLowerCase();\n me._removeField(id);\n\n var label = L(name);\n var constructor = {\n template: 'formBuilder/textArea.compile.html',\n params: {\n 'id': id,\n 'orientation': me._orientaion,\n 'asterisk': me._asterisk(label, opt_validateRules),\n 'label': (label === '' ? '' : label + ':'),\n 'value': opt_defaultvalue\n },\n afterRender: function (html) {\n me._addItem(name, id, false, \"textArea\", html, opt_validateRules);\n }\n };\n\n me._constructors.push(constructor);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Добавить многострочное поле фиксированной высоты.\n *\n * @function WebAccess.components.forms.FormBuilder#addTextFrame\n * @param {string} name Строка локализации равная идентификатору поля\n * @param {string} defaultvalue Значение по умолчанию\n * @param {integer} [opt_maxHeigth] Высота, в рамках которой ограничивается поле\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила коррктности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Объект класса FormBuilder.\n * @since 5.1.0.1523\n */\n addTextFrame: function (name, opt_defaultvalue, opt_maxHeigth, opt_validateRules) {\n var me = this;\n var id = name.toLowerCase();\n me._removeField(id);\n\n opt_maxHeigth = opt_maxHeigth || '150';\n opt_maxHeigth = opt_maxHeigth + 'px';\n\n var label = L(name);\n var constructor = {\n template: 'formBuilder/textFrame.compile.html',\n params: {\n 'id': id,\n 'maxHeigth': opt_maxHeigth,\n 'orientation': me._orientaion,\n 'asterisk': me._asterisk(label, opt_validateRules),\n 'label': (label === '' ? '' : label + ':'),\n 'value': opt_defaultvalue\n },\n afterRender: function (html) {\n me._addItem(name, id, false, \"textFrame\", html, opt_validateRules);\n }\n };\n\n me._constructors.push(constructor);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Добавить многострочное поле.\n * @deprecated\n * @alias WebAccess.components.forms.FormBuilder#addTextArea\n * @function WebAccess.components.forms.FormBuilder#addTextarea\n * @ignore\n */\n addTextarea: function () {\n return this.addTextArea.apply(this, arguments);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить поле выбора из списка.\n *\n * @function WebAccess.components.forms.FormBuilder#addSelect\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {dictionary} options Список элементов выбора\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n addSelect: function (name, options, opt_validateRules) {\n var me = this;\n var id = name.toLowerCase();\n me._removeField(id);\n\n\n var mustache_options = [];\n for (var prop in options) {\n if (options.hasOwnProperty(prop)) {\n mustache_options.push({\n 'key': prop,\n 'value': L(options[prop])\n });\n }\n }\n\n var label = L(name);\n var constructor = {\n template: 'formBuilder/select.compile.html',\n params: {\n 'id': id,\n 'orientation': me._orientaion,\n 'asterisk': me._asterisk(label, opt_validateRules),\n 'label': (label === '' ? '' : label + ':'),\n 'options': mustache_options\n },\n afterRender: function (html) {\n me._addItem(name, id, false, \"select\", html, opt_validateRules);\n }\n };\n\n me._constructors.push(constructor);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить группу переключателей.\n *\n * @function WebAccess.components.forms.FormBuilder#addRadioButtons\n * @param {string} name Строка локализации, равная идентификатору этого поля\n * @param {dictionary} options Список элементов выбора\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n * @since 5.1.0.1505\n */\n addRadioButtons: function (name, options, opt_validateRules, opt_defaultvalue) {\n var me = this;\n var id = name.toLowerCase();\n me._removeField(id);\n opt_defaultvalue = opt_defaultvalue || null;\n\n var mustache_options = [];\n for (var prop in options) {\n if (options.hasOwnProperty(prop)) {\n mustache_options.push({\n 'key': prop,\n 'value': L(options[prop]),\n 'checked': opt_defaultvalue == prop ? 'checked=\"checked\"' : ''\n });\n }\n }\n\n var label = L(name);\n var constructor = {\n template: 'formBuilder/radio.compile.html',\n params: {\n 'id': id,\n 'orientation': me._orientaion,\n 'asterisk': me._asterisk(label, opt_validateRules),\n 'label': (label === '' ? '' : label + ':'),\n 'options': mustache_options\n },\n afterRender: function (html) {\n me._addItem(name, id, false, \"radio\", html, opt_validateRules);\n }\n };\n\n me._constructors.push(constructor);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Добавить поле типа «Справочник».\n *\n * @function WebAccess.components.forms.FormBuilder#addReferenceSelect\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {string} referenceCode Код справочника\n * @param {string} [opt_toolTip] Текст всплывающей подсказки для кнопки выбора из справочника\n * @param {string} [opt_searchReqName] Отображаемый реквизит. По умолчанию реквизит «Наименование»\n * @param {string} [opt_filter] Выражение фильтрации. Для выбора будут доступны только отфильтрованные записи указанного справочника\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n addReferenceSelect: function (name, referenceCode, opt_toolTip, opt_searchReqName, opt_filter, opt_validateRules) {\n var me = this;\n var id = name.toLowerCase();\n this._removeField(id);\n\n var other = {\n 'referenceCode': referenceCode,\n 'toolTip': opt_toolTip,\n 'searchReqName': opt_searchReqName,\n 'filter': opt_filter\n };\n\n me._addItem(name, id, true, \"referenceSelect\", '', opt_validateRules, other);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить поле типа «Список объектов».\n *\n * @function WebAccess.components.forms.FormBuilder#addObjectList\n * @param {string} name Строка локализации равная идентификатору этого поля.\n * @param {string} type Возможные значения: EDOCUMENT, JOB, FOLDER, TASK, REFERENCE_RECORD, ANY\n * @param {WebAccess.components.forms.FormBuilder.objectLink} opt_liks Ссылки объектов по умолчанию. Подробнее см. WebAccess.components.forms.FormBuilder.objectLink\n * @param {boolean} opt_isList Значение True, если можно вставить несколько объектов в поле, иначе False\n * @param {string} referenceCode Код справочника.\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n * @since 5.0.0.7100\n *\n * @example\n * var form = new WA.CMP.forms.FormBuilder(\"1\")\n * form.addObjectList(\"YEsdscSd\", OBJECT_TYPE.REFERENCE_RECORD,[{\"id\": \"103619\", \"type\": OBJECT_TYPE.REFERENCE_RECORD, \"referenceCode\": \"ПРС\"}], true,'ПРС')\n *\n * var dialog = new WA.CMP.dialogs.BaseDialog(\"as\")\n * dialog.setHtml(form.render())\n * dialog.width = 700\n * dialog.show()\n */\n addObjectList: function (name, type, opt_links, opt_isList, opt_referenceCode, opt_validateRules) {\n var me = this;\n\n var id = name.toLowerCase();\n this._removeField(id);\n\n var other = {\n \"object_type\": type,\n \"values\": opt_links,\n \"isList\": opt_isList,\n \"referenceCode\": opt_referenceCode\n };\n\n me._addItem(name, id, true, \"objectList\", '', opt_validateRules, other);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить поле множественного выбора из справочника.\n *\n * @function WebAccess.components.forms.FormBuilder#addMultiSelect\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {string} referenceNames Коды справочников, разделенные \";\"\n * @param {string} [opt_toolTip] Текст всплывающей подсказки\n * @param {string} [opt_searchReqName] Отображаемый реквизит\n * @param {string} [opt_filter] Выражение фильрации. В поле будут доступны только отфильтрованные записи выбранного справочника\n * @param {boolean} [opt_isMultiSelect] Признак множественного выбора\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n * @since 5.0.0.4106\n */\n addMultiSelect: function (name, referenceNames, opt_toolTip, opt_searchReqName, opt_filter, opt_isMultiSelect, opt_validateRules) {\n var me = this;\n\n var id = name.toLowerCase();\n this._removeField(id);\n\n var other = {\n 'referenceNames': referenceNames,\n 'toolTip': opt_toolTip,\n 'searchReqName': opt_searchReqName,\n 'filter': opt_filter,\n 'isMultiSelect': opt_isMultiSelect\n };\n\n me._addItem(name, id, true, \"multiSelect\", '', opt_validateRules, other);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить поле типа «Признак».\n *\n * @function WebAccess.components.forms.FormBuilder#addPick\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {dict} values Ассоциативный массив, содержащий пары: ИД пункта выпадающего списка – отображаемое значение пункта\n * @param {dict} [opt_displayValues] Отображаемые значения для выпадающего списка\n * @param {array} [opt_disabledValues] Пункты недоступные для выбора\n * @param {boolean} [opt_editable] Если значение true, то поле ввода становится доступным для изменения. В случае, если значение было введено вручную, метод getValue вернет пустую строку. Такое значение необходимо получать методом getDisplayValue\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Текущий конструктор форм.\n */\n addPick: function (name, values, opt_displayValues, opt_disabledValues, opt_editable, opt_validateRules) {\n var me = this;\n\n var id = name.toLowerCase();\n this._removeField(id);\n var other = {\n 'values': values,\n 'displayValues': opt_disabledValues,\n 'disabledValues': opt_disabledValues,\n 'editable': opt_editable\n };\n\n me._addItem(name, id, true, \"pick\", '', opt_validateRules, other);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить поле информацию о поле во внутренний объект\n * @since 5.0.0.7100\n * @private\n */\n _addItem: function (name, id, fromServerSide, type, html, validateRules, other) {\n this.items[id] = {\n 'id': id,\n 'name': name,\n 'fromServerSide': fromServerSide,\n \"type\": type,\n 'validateRules': validateRules,\n 'data': html\n };\n\n if (other) {\n $.extend(this.items[id], other);\n }\n },\n\n /**\n * Добавить поле с произвольным содержимым.\n *\n * @function WebAccess.components.forms.FormBuilder#addCustomField\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {string} html HTML-разметка. Должна содержать указанный параметр name\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n addCustomField: function (name, html, opt_validateRules, opt_type) {\n var me = this;\n var id = name.toLowerCase();\n me._removeField(id);\n var type = (!!opt_type) ? opt_type : \"custom\";\n var item = me._wrapControl(id, html, opt_validateRules);\n\n me._addItem(name, id, false, type, item, opt_validateRules);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обернуть контрол в контейнер с нужными отступами\n * Следуюя общему принципу эта функция тоже должна быть асинхронной\n * и использовать шаблоны, но в силу сложности дальнейших доработок и\n * ограниченности времени оставется в текущем виде\n * @todo перенести на шаблоны\n * @private\n * @since 5.0.0.7001\n */\n _wrapControl: function (id, control_html, opt_validateRules) {\n var label = L(id.toUpperCase());\n var html = \"
    \";\n html += format(\"\", {\n 'id': id,\n 'label': (label === '' ? '' : label + ':'),\n 'asterisk': this._asterisk(label, opt_validateRules)\n });\n\n html += '
    ' + control_html + '
    ';\n html += \"
    \";\n return html;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить переключатель.\n *\n * @function WebAccess.components.forms.FormBuilder#addCheckbox\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @param {bool} opt_isChecked Проверяет, установлен переключатель или нет\n * @param {WebAccess.components.forms.FormBuilder.validatorRules} [opt_validateRules] Правила корректности заполнения формы\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n * @since 5.0.0.4301\n */\n addCheckbox: function (name, opt_isChecked, opt_validateRules) {\n var me = this;\n var id = name.toLowerCase();\n this._removeField(id);\n\n var label = L(name);\n var constructor = {\n 'template': 'formBuilder/checkBox.compile.html',\n 'params': {\n 'id': id,\n 'label': label,\n 'asterisk': me._asterisk(label, opt_validateRules),\n 'isChecked': opt_isChecked === true ? 'checked=\"checked\"' : '',\n 'orientation': this._orientaion\n },\n 'afterRender': function (html) {\n me._addItem(name, id, false, \"checkbox\", html, opt_validateRules);\n }\n };\n\n me._constructors.push(constructor);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Попытка получить значение контрола всеми возможными способами.\n * @private\n * @function WebAccess.components.forms.FormBuilder#_tryGetValue\n */\n _tryGetValue: function (item) {\n var value = this.getValue(item[\"id\"]) || this.getDisplayValue(item[\"id\"]);\n if (typeof value == 'undefined') value = this.getValue(item[\"id\"], true);\n if (typeof value == 'undefined') value = '';\n if (item.type === 'objectList') {\n if (value.links && value.links.length > 0)\n return 'undefined';\n else\n return '';\n }\n return value;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить правила корректности ввода данных.\n *\n * @function WebAccess.components.forms.FormBuilder#addValidationRule\n * @param {string} name Название правила\n * @param {function} handler Функция проверки правила\n * @param {string} opt_error_message Сообщение об ошибке, возникающей при невыполнении правила\n *\n * @example\n * // К правилам корректности ввода данных добавляется новое «MoreThanTen».\n * // Правило означает, что форма заполнена правильно, если значение поля больше 10.\n * var form = new WA.CMP.forms.FormBuilder('buldy');\n * form.addValidationRule('moreThanTen', function(value, display) {\n * console.log(arguments);\n * if (value < 10) return false;\n * return true;\n * }, L('ERROR'));\n *\n * var dialog = new WA.CMP.dialogs.BaseDialog();\n *\n * //Применяем правило к полю «YES».\n * form.addInput(\"YES\", 100, {'isRequired': true, 'moreThanTen': true});\n * dialog.setHtml(form.render());\n * dialog.show();\n * dialog.ok = function() {\n * if (form.isValid() !== true) return false;\n *\n * }\n */\n addValidationRule: function (name, handler, opt_error_message) {\n this._validators[name] = {};\n this._validators[name].handler = handler;\n this._validators[name].error = opt_error_message;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверить корректность значений.\n * @function WebAccess.components.forms.FormBuilder#isValid\n * @return {boolean} True, если значения полей формы корректны, иначе False.\n */\n isValid: function () {\n var me = this;\n this.invalidFields = [];\n\n $.each(me.items, function (key, item) {\n if (item[\"validateRules\"]) {\n var rules = item[\"validateRules\"];\n\n // Забываем все предыдущие ошибки полей\n me._markAsValid(item);\n item.error = \"\";\n $('#' + item[\"id\"] + '_mt_error').html(\"\");\n\n // Проверка на обязательность, она особая и запускается отдельно\n if (rules.isRequired) {\n if (me._validators['isRequired']['handler'](me._tryGetValue(item)) === false) {\n item.error = me._validators['isRequired']['error'] || L('ERROR');\n me._markAsInvalid(item);\n }\n }\n\n /**\n * Остальные правила\n */\n for (var ruleName in me._validators) {\n if (rules[ruleName] && !item.error && me._tryGetValue(item) !== '') {\n if (me._validators[ruleName]['handler'](me._tryGetValue(item), me.getDisplayValue(item.id), rules[ruleName]) === false) {\n item.error = me._validators[ruleName]['error'] || L('ERROR');\n me._markAsInvalid(item);\n }\n }\n }\n }\n });\n var prevColor;\n //Изменение внешнего вида невалидных полей\n $.each(this.invalidFields, function (index, item) {\n var jBorder = me._getFieldBorder(item).addClass(\"Req_Error\");\n if (!prevColor) prevColor = jBorder.css('backgroundColor');\n var highlight = \"#F6DADA\";\n\n jBorder.animate({ backgroundColor: highlight }, 300, function () {\n jBorder.animate({ backgroundColor: prevColor }, 300);\n });\n\n if (me.displayErrors == \"inline\") {\n var errorsHtml = format(\" ({0})\", item.error);\n $(format(\"#{0}_mt_error\", item[\"id\"])).html(errorsHtml);\n }\n\n if (me.displayErrors == \"tip\") {\n var el = jBorder;\n if (item.type == 'referenceSelect') el = el.siblings('.rs_SelItems_cont');\n el.qtip({\n style: { classes: \"ui-tooltip-light ui-tooltip-shadow ui-tooltip-rounded\" },\n content: { text: item.error },\n events: {\n render: function (event, api) {\n setTimeout(function () { el.qtip(\"destroy\"); }, 2000);\n }\n }\n });\n }\n\n });\n\n if (this.invalidFields.length > 0) return false;\n return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Чтобы отметить поле невалидным визуально, нужно знать как с ним работать\n * тут перечилены селекторы, которые отвечают за границы элементов ввода\n * @function WebAccess.components.forms.FormBuilder#_getFieldBorder\n * @private\n * @todo: некрасиво, отрефакторить\n * @param {object} item\n */\n _getFieldBorder: function (item) {\n var element = null;\n var selector = $(\"#\" + item[\"id\"]);\n switch (item[\"type\"]) {\n case \"custom\":\n element = selector.parents(\"span\").find(\".fakeInput\");\n break;\n case \"referenceSelect\":\n case \"multiSelect\":\n element = selector.parents(\"span\").find(\".fakeInput\");\n break;\n case \"objectList\":\n element = selector.find(\".ListRequisiteBorder\");\n break;\n case \"pick\":\n element = $(\"#\" + item[\"id\"] + \"inp\");\n break;\n default:\n element = selector;\n break;\n }\n return element;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отметка элемента невалидным, то что его представление\n * будет крассным обрабатывается уже не здесь\n * @private\n * @function WebAccess.components.forms.FormBuilder#_markAsInvalid\n * @param {object} item\n */\n _markAsInvalid: function (item) {\n var id = item[\"id\"];\n this.invalidFields.push(item);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отметка элемента валидным\n * @function WebAccess.components.forms.FormBuilder#_markAsValid\n * @private\n * @param {object} item\n */\n _markAsValid: function (item) {\n var id = item[\"id\"];\n this._getFieldBorder(item).removeClass(\"Req_Error\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Заполенение данных для отображения.\n * @private\n * @since 5.0.0.7100\n */\n _fillItem: function (id, result, opt_validateRules) {\n var me = this;\n var html = result.html + '';\n me.items[id].data = me._wrapControl(id, html, opt_validateRules);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /*\n * Установить адрес для отправки формы.\n *\n * @function WebAccess.components.forms.FormBuilder#setAction\n * @param {string} url Адрес для отправки формы\n * @return {WebAccess.components.forms.FormBuilder} Текущий конструктор форм.\n * @since 5.0.0.7100\n */\n setAction: function (url) {\n var me = this;\n me.isHtmlFormEnabled = true;\n me._action = url;\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /*\n * Метод для отправки формы.\n *\n * @function WebAccess.components.forms.FormBuilder#setMethod\n * @param {FORM_METHOD} form_method Метод для отправки формы\n * @return {WebAccess.components.forms.FormBuilder} Текущий конструктор форм.\n * @since 5.0.0.7100\n */\n setMethod: function (form_method) {\n var me = this;\n me.isHtmlFormEnabled = true;\n me._method = form_method;\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /*\n * Установить тип содержимого формы.\n *\n * @function WebAccess.components.forms.FormBuilder#setEnctype\n * @param {ENCTYPE} enctype Тип содержимого формы\n * @return {WebAccess.components.forms.FormBuilder} Текущий конструктор форм.\n * @since 5.0.0.7100\n */\n setEnctype: function (enctype) {\n var me = this;\n me.isHtmlFormEnabled = true;\n me._enctype = enctype;\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /*\n * Отправить форму.\n *\n * @function WebAccess.components.forms.FormBuilder#submit\n * @return {WebAccess.components.forms.FormBuilder} Текущий конструктор форм.\n * @since 5.0.0.7100\n */\n submit: function () {\n $(\"#\" + this.id + \" form\").submit();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Гененерировать форму.\n *\n * @function WebAccess.components.forms.FormBuilder#render\n * @return {string} Сгенерированная HTML-разметка.\n */\n render: function () {\n var me = this;\n me._render(true);\n return me._html;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Генерировать форму с помощью асинхронного вызова.\n *\n * @function WebAccess.components.forms.FormBuilder#renderAsync\n * @return {Deferred} Специальный deferred-объект.\n * @since 5.0.0.7100\n */\n renderAsync: function () {\n return this._render(false);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @private\n * @function WebAccess.components.forms.FormBuilder#_render\n * @return {Deferred} jquery deferred объект\n * @since 5.0.0.7100\n */\n _render: function (sync) {\n var me = this;\n var jMasterDeferred = $.Deferred();\n me.clean();\n\n var deferreds = [];\n for (var i = 0; i < me._constructors.length; i++) {\n var c = me._constructors[i];\n deferreds.push(WA.templates.render(c.template, c.params, false, sync).done(c.afterRender));\n }\n\n //Когда все поля готовы, делаем запрос\n $.when.apply(me, deferreds).then(function () {\n\n //TODO Шамов А.: Я думаю стоит переделать логику на на формирование запросов, засовывание в кэш, и рендеринг из кэша.\n // На мой взгляд это будет более понятно и не будет дублирования функции _fillItem.\n // Сейчас странно что _preRender только в этой части условия вызывается, а не в общей.\n\n me._preRender();\n var launchPostRender = function () {\n me._postRender(sync).done(function () {\n jMasterDeferred.resolve.apply(this, arguments);\n }).error(function () {\n jMasterDeferred.reject.apply(this, arguments);\n });\n };\n\n if (me._request.length) {\n var method = (sync) ? 'buildSync' : 'build';\n WA.SRV.requisite[method](me._request).done(function (result) {\n me._parseServiceResult(result);\n launchPostRender();\n });\n } else {\n launchPostRender();\n }\n });\n\n return jMasterDeferred;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Разбор ответа сервиса\n * @private\n * @since 5.0.0.7100\n */\n _parseServiceResult: function (result) {\n var me = this;\n for (var id in me._request) {\n var request = me._request[id];\n var name = request.id;\n if (typeof request == 'function') continue;\n WA.cache.setObject('field.' + getHash(JSON.stringify(request)), result[name]);\n me._fillItem(name, result[name], request.validateRules);\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Формирование запроса\n * @private\n * @since 5.0.0.7100\n */\n _preRender: function () {\n var me = this;\n me._request = [];\n\n /**\n * Если не можем взять реквизит из кеша по хешу,\n * то добавляем его в запрос\n */\n for (var i in me.items) {\n var request = this.items[i];\n if (request[\"fromServerSide\"]) {\n var name = request.id;\n var cached = WA.cache.getObject('field.' + getHash(JSON.stringify(request)));\n if (!cached) {\n me._request.push(this.items[i]);\n } else {\n me._fillItem(name, cached, request.validateRules);\n }\n }\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Формирование разметки\n * @private\n * @since 5.0.0.7100\n */\n _postRender: function (sync) {\n var me = this;\n\n var content = '';\n for (var id in this.items) {\n content += this.items[id][\"data\"];\n }\n\n var t = WA.templates.render('formBuilder/formLayout.compile.html', {\n 'id': me.id,\n 'action': me._action,\n 'method': me._method,\n 'enctype': me._enctype,\n 'orientation': me._orientaion,\n 'isHorizontal': me._orientaion == 'horizontal',\n 'content': content,\n 'isHtmlFormEnabled': me.isHtmlFormEnabled\n }, false, sync).done(function (html) {\n me._html = html;\n });\n\n return t;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Очистить форму.\n *\n * @function WebAccess.components.forms.FormBuilder#clean\n * @return {WebAccess.components.forms.FormBuilder} Oбъект класса FormBuilder.\n */\n clean: function () {\n $(\"#\" + this.id).remove();\n this._html = '';\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Делает неактивным контрол формы.\n * @private\n * @function WebAccess.components.forms.FormBuilder#disable\n * @param {string} name Строка локализации равная идентификатору этого поля\n * @return {WebAccess.components.forms.FormBuilder} Объект типа FormBuilder.\n * @since 5.3.0.1002\n */\n disable: function (name) {\n name = name.toLowerCase();\n var jField = $(\"#\" + name);\n\n // TODO доделать для остальных.\n\n var type = \"\";\n if (name in this.items) type = this.items[name].type;\n else type = \"undefinied\";\n\n switch (type) {\n case 'radio':\n //var jRadios = jField.find('input[name=\"' + name + '\"]');\n //jRadios.filter('[value=\"' + value + '\"]').prop('checked', true);\n break;\n case \"referenceSelect\":\n case \"multiSelect\":\n //WA.CMP.wrappers.form.requisites.BaseObjectSelectRequisite.setControlValue(jField, value, displayValue);\n break;\n case \"pick\":\n //TODO закэшировать в классе.\n var pickWrapper = new WA.CMP.wrappers.form.requisites.Pick(name, name);\n pickWrapper.disable();\n break;\n case \"undefinied\":\n break;\n case \"text\":\n //jField = $(\"#\" + name + \"_label\");\n //jField.html(L(value));\n break;\n case \"textFrame\":\n //jField.html(value);\n break;\n case \"objectList\":\n //var list = ListRequisite(name);\n //var links = [];\n\n //for (var i in value) {\n // links.push({\n // 'ID': value[i].id,\n // 'Kind': objectTypeToString(value[i].type),\n // 'referenceName': value[i].CompCode\n // });\n //}\n //list.Values = links;\n //list.UpdateList();\n break;\n case 'date':\n //jField.val(value);\n break;\n case 'checkbox':\n //if (!!value) jField.attr('checked', 'checked');\n //else jField.removeAttr('checked');\n break;\n default:\n //jField.val(value);\n break;\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сериализация формы\n *\n * @since 5.0.0.7300\n * @ignore\n * @function WebAccess.components.forms.FormBuilder#serialize\n * @return {WebAccess.components.forms.FormBuilder}\n */\n serialize: function (type) {\n\n switch (type) {\n case SERIALIZATION.FULL:\n return this._fullSerialization();\n break;\n case SERIALIZATION.LITE:\n default:\n return this._defaultSerialization();\n break;\n }\n\n\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _defaultSerialization: function () {\n var form = {\n source: 'FormBuilder',\n requisites: {}\n };\n\n var name;\n for (name in this.items) {\n if ($.isPlainObject(this.items[name])) {\n try {\n if (this.items[name].type == 'text') continue;\n form.requisites[name] = [this.getValue(name), this.getDisplayValue(name)];\n } catch (e) { }\n }\n }\n return form;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n //TODO: Научить работать с FormDialog\n _fullSerialization: function () {\n var me = this;\n var result = {\n ID: me.id,\n Actions: null,\n Caption: null,\n FType: 0,\n FormJS: null\n };\n var formData = {\n source: 'FormBuilder',\n obj: null,\n isNew: false,\n isreadonly: false,\n tab: null,\n view: null\n };\n\n result.FormData = $.toJSON(formdata);\n\n //TODO: дополнить\n var reqTypes = {\n 'input': 'string',\n 'referenceSelect': 'reference',\n 'multiSelect': 'reference',\n 'date': 'date',\n 'pick': 'pick'\n };\n\n var keys = _(this.items).pluck('name');\n var controls = _(this.items).pluck('id');\n var values = _(this.items).map(function (req) {\n return {\n value: me.getValue(req.name),\n displayValue: me.getDisplayValue(req.name),\n isVisible: true,\n isRequired: req.validateRules && req.validateRules.isRequired,\n type: reqTypes[req.type],\n controls: [req.id]\n }\n });\n\n data.req = _.object(keys, values);\n data.reqUD_inv = _(controls, keys);\n return result;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Десериализация формы\n * @since 5.0.0.7300\n * @ignore\n * @function WebAccess.components.forms.FormBuilder#deserialize\n * @return {WebAccess.components.forms.FormBuilder}\n */\n deserialize: function (form) {\n for (name in form.requisites) {\n if ($.isPlainObject(this.items[name])) {\n try {\n if (this.items[name].type == 'text') continue;\n if (!form.requisites[name].value) continue;\n this.setValue(name, form.requisites[name][0]);\n this.setDisplayValue(name.requisites, form[name][1]);\n } catch (e) { }\n }\n }\n return this;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n global.FormBuilder = FormBuilder;\n})(window.WebAccess.components.forms);","\"use strict\";\n(function (global) {\n global._validators = {\n\n 'isRequired': {\n 'handler': function (value, display) {\n if (!$.trim(value)) return false;\n return true;\n },\n 'error': L(\"ERR_THIS_FIELD_IS_REQUIRED\")\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n 'isDate': {\n 'handler': function (value, display) {\n if (!ParseDateTime(value)) return false;\n return true;\n },\n 'error': L(\"ERR_THIS_FIELD_MUST_CONTAIN_DATE\")\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n 'isDigit': {\n 'handler': function (value, display) {\n if (isNaN(value) && length!==1) return false;\n return true;\n },\n 'error': L(\"ERR_THIS_FIELD_MUST_CONTAIN_DIGITS_ONLY\")\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n 'isNumber': {\n 'handler': function (value, display) {\n if (isNaN(value)) return false;\n return true;\n },\n 'error': L(\"ERR_THIS_FIELD_MUST_CONTAIN_NUMBERS_ONLY\")\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n 'isEmail': {\n 'handler': function (value, display) {\n if (!validateEmail(value)) return false;\n return true;\n },\n 'error': L(\"ERR_THIS_FIELD_MUST_CONTAIN_EMAIL_ADRESS_ONLY\")\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n 'min': {\n 'handler': function (value, display, ruleValue) {\n if (value < ruleValue) return false;\n return true;\n },\n 'error': L(\"ERR_THIS_FIELD_REQUIRE_A_GIVEN_MINIMUM\")\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n 'max': {\n 'handler': function (value, display, ruleValue) {\n if (value > ruleValue) return false;\n return true;\n },\n 'error': L(\"ERR_THIS_FIELD_REQUIRE_A_GIVEN_MAXIMUM\")\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n };\n\n var validateEmail = function (email) {\n var re = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return re.test(email);\n };\n\n})(window.WebAccess.components.forms.FormBuilder.prototype);","\"use strict\";\n(function (global) {\n\n var TEMPLATE = '/components/documentRequisite.compile.html';\n\n/** \n* Реквизит типа «Ссылка на документ».\n* \n* @since 5.5.0.1000\n* @class WebAccess.components.forms.requisites.DocumentSelect\n* @param {string|WebAccess.components.forms.requisites.DocumentSelect.settings} id Идентификатор элемента. Является обязательным параметром\n* @param {string} [opt_toolTip] Всплывающая подсказка\n* @param {string} [opt_searchReqName] Название отображаемого реквизита\n\n* @property {string} id Идентификатор элемента\n* @property {string} toolTip Всплывающая подсказка\n* @property {string} searchReqName Название отображаемого реквизита\n* @property {string} html HTML-разметка элемента\n*\n* @fires render вызывается после того, как HTML-разметка собрана и готова к использованию.\n* @throws ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED - заданы не все обязательные параметры.\n* @example\n* var field = new WebAccess.components.forms.requisites.DocumentSelect(\"employe_select\", \"РАБ\").render();\n* WebAccess.current.sideBar.tabs.FldTree.setHtml(field);\n*/\n\n/** \n* @typedef {object} WebAccess.components.forms.requisites.DocumentSelect.settings\n* @property {string} id Идентификатор формы справочника\n* @property {string} toolTip Всплывающая подсказка\n* @property {string} searchReqName Наименование отображаемого реквизита\n* @property {string} html HTML-разметка элемента\n*/\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n \n\n var DocumentSelect = BaseObject.extend({\n init: function (id, opt_toolTip, opt_searchReqName) {\n this._super(id);\n if (!id) return;\n\n if ($.isPlainObject(id)) {\n $.extend(this, id);\n } else { \n this.id = id;\n this.toolTip = !!opt_toolTip ? opt_toolTip : \"\";\n this.searchReqName = !!opt_searchReqName ? opt_searchReqName : \"ISBEDocName\";\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: \"DocumentSelect\",\n id: \"\",\n toolTip: \"\",\n searchReqName: \"ISBEDocName\",\n html: \"\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Генерировать HTML-разметку\n * @function WebAccess.components.forms.requisites.DocumentSelect#render\n * @return {string} Сгенерированная HTML-разметка\n */\n render: function() { \n var result = \"\";\n var requestMap = { \n \"ID\": this.id.toLowerCase(),\n \"ToolTip\": this.toolTip, \n \"SearchReqName\": this.searchReqName, \n };\n\n CallServiceSync(\"/Requisite.asmx/DocumentSelect\", requestMap, function (response) {\n if (response.Success) {\n result = response.Result.html;\n }\n else ShowMessage(response.Result);\n });\n\n this.fire(\"render\");\n this.html = result;\n return result;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Асинхронно генерирует HTML-разметку \n * @function WebAccess.components.forms.requisites.DocumentSelect#renderAsync\n * @return {string} Сгенерированная HTML-разметка.\n */\n renderAsync: function (opt_data) {\n //TODO: Этот метод использует hogan шаблон, а для его работы необходимо много данных,\n //в том числе частично нужны данные с серверной стороны. В будущем необходимо эти\n //данные научится формировать либо получать. Сейчас пока этот метод будет работать\n //только если предоствить все данные явно. В будущем метод render(тот что выше) нужно \n //будет переделать на него, но с флагами синхронного вызова.\n var me = this;\n var data = opt_data || me.getData();\n var result = $.Deferred();\n if (!opt_data) WA.raise('NOT_IMPLEMENTED_EXCEPTION')\n\n WA.templates.render(TEMPLATE, opt_data).done(function (html) {\n me.html = html;\n result.resolve(me.html);\n me.fire(\"render\");\n });\n\n return result;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n \n global.DocumentSelect = DocumentSelect;\n})(window.WebAccess.components.forms.requisites);","\"use strict\";\n/** \n* Множественый выбор из справочника\n* \n* @since 5.0.0.4106 \n* @class WebAccess.components.forms.requisites.MultiSelect\n* @param {string|WebAccess.components.forms.requisites.MultiSelect.multiSelectSettings} id Идентификатор элемента. Является обязательным параметром\n* @param {string} referenceNames Коды справочников, разделенные символом \";\"\n* @param {string} [opt_toolTip] Высплывающая подсказка\n* @param {string} [opt_searchReqName] Название отображаемого реквизита\n* @param {string} [opt_filter] Выражение фильрации элементов выбранного справочника\n* @param {boolean} [opt_isMultiSelect] Признак выбора одной или нескольких записей из нескольких справочников в диалоговом окне. Если установлено значение False, то можно выбрать только одну запись. Иначе доступен выбор несколько записей из нескольких справочников\n\n* @property {string} id Идентификатор элемента. Является обязательным параметром\n* @property {string} referenceNames Коды справочников, разделенные символом \";\"\n* @property {string} toolTip Всплывающая подсказка\n* @property {string} searchReqName Название отображаемого реквизита\n* @property {string} filter Выражение фильтрации элементов выбранного справочника\n* @property {boolean} isMultiSelect Признак выбора одной или нескольких записей из нескольких справочников в диалоговом окне. Если установлено значение False, то можно выбрать только одну запись. Иначе доступен выбор несколько записей из нескольких справочников\n* @property {string} html HTML-разметка элемента\n*\n* @fires render вызывается после того, как HTML-разметка собрана и готова к использованию.\n* @throws ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED - заданы не все обязатаельные параметры. \n*/\n\n/** \n* Параметры множественного выбора из справочника.\n* @typedef {object} WebAccess.components.forms.requisites.MultiSelect.multiSelectSettings\n* @property {string} id Идентификатор элемента. Является обязательным параметром\n* @property {string} referenceNames Коды справочников, разделенные символом \";\"\n* @property {string} toolTip Всплывающая подсказка\n* @property {string} searchReqName Название отображаемого реквизита\n* @property {string} filter Выражение фильтрации элементов выбранного справочника\n* @property {boolean} isMultiSelect Признак выбора одной или нескольких записей из нескольких справочников в диалоговом окне. Если установлено значение False, то можно выбрать только одну запись. Иначе доступен выбор несколько записей из нескольких справочников\n* @property {string} html HTML-разметка элемента\n*/\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n(function (global) {\n\n var MultiSelect = BaseObject.extend({\n init: function (id, referenceNames, opt_toolTip, opt_searchReqName, opt_filter, opt_isMultiSelect) {\n\n if (!id) WA.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\");\n\n this._super(id);\n if ($.isPlainObject(id)) {\n $.extend(this, id);\n } else {\n if (!referenceNames) WA.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\");\n this.id = id;\n this.referenceNames = !!referenceNames ? referenceNames : \"ПОД\";\n this.toolTip = !!opt_toolTip ? opt_toolTip : \"\";\n this.searchReqName = !!opt_searchReqName ? opt_searchReqName : \"Наименование\";\n this.filter = !!opt_filter ? opt_filter : \"\";\n this.isMultiSelect = !!opt_isMultiSelect ? opt_isMultiSelect : false;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: \"MultiSelect\",\n id: \"\",\n referenceNames: \"\",\n toolTip: \"\",\n searchReqName: \"Наименование\",\n filter: \"\",\n isMultiSelect: false,\n html: \"\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Собрать HTML-разметку с учетом указанных данных.\n * @function WebAccess.components.forms.requisites.MultiSelect#render\n * @return {string} Сгенерированная HTML-разметка\n */\n render: function () {\n var result = \"\";\n var requestMap = {\n \"ID\": this.id.toLowerCase(),\n \"RefNames\": this.referenceNames,\n \"ToolTip\": this.toolTip,\n \"SearchReqName\": this.searchReqName,\n \"Filter\": this.filter,\n \"IsMultiSelect\": this.isMultiSelect\n };\n\n CallServiceSync(\"/Requisite.asmx/MultiSelectControl\", requestMap, function (response) {\n if (response.Success) {\n result = response.Result.html;\n }\n else ShowMessage(response.Result);\n });\n\n this.fire(\"render\");\n this.html = result;\n return result;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n global.MultiSelect = MultiSelect;\n})(window.WebAccess.components.forms.requisites);","\"use strict\";\n(function (global) {\n var TEMPLATE = '/components/pick.compile.html';\n\n/** \n* Реквизит типа «Признак».\n* Предназначен для хранения значений, выбираемых из списка возможных значений. Может быть представлен в режиме для редактирования.\n* \n* @since 5.0.0.4000\n* @class WebAccess.components.forms.requisites.Pick\n* @param {string|WebAccess.components.forms.requisites.Pick.pickSettings} id Уникальный идентификатор элемента. Параметр является обязательным\n* @param {dict} values Словарь, состоящий из пар: ключ и значение элемента списка\n* @param {dict} [opt_displayValues] Список элементов, которые отображаются в списке возможных значений. Например, может быть использован для дополнения элементов списка иконками\n* @param {array} [opt_disabledValues] Список элементов, недоступных для выбора\n* @param {boolean} [opt_editable] Признак того, что список возможных значений можно редактировать\n\n* @property {string} id Уникальный идентификатор реквизита\n* @property {dict} values Словарь, состоящий из пар: ключ и значение элемента списка\n* @property {dict} opt_displayValues Список элементов, которые отображаются в списке возможных значений\n* @property {array} opt_disabledValues Список элементов, не доступных для выбора\n* @property {boolean} [opt_editable] Признак того, что список возможных значений в списке можно редактировать\n* @throws ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED - заданы не все обязательные параметры.\n* @fires render вызывается после того, как HTML-разметка собрана и готова к использованию.\n* @example\n* var vlues = {\"1\": \"Пункт списка 1\", \"2\":\"Пункт списка 2\"};\n* var field = new WebAccess.components.forms.requisites.Pick(\"dropDown1\", values);\n* WebAccess.current.sideBar.tabs.FldTree.setHtml(field.render());\n*/\n\n/**\n* Настройки реквизита типа «Признак».\n* @typedef {object} WebAccess.components.forms.requisites.Pick.pickSettings\n* @property {string} id Уникальный идентификатор элемента\n* @property {dict} values Словарь, состоящий из ключей элементов списка и их значений\n* @property {dict} opt_displayValues Список элементов, которые отображаются в списке возможных значений \n* @property {array} opt_disabledValues Список элементов, недоступных для выбора\n* @property {boolean} [opt_editable] Признак того, что список возможных значений можно редактировать\n*/\n\n\n\n var Pick = BaseObject.extend({\n init: function (id, values, opt_displayValues, opt_disabledValues, opt_editable) {\n if (!id) return;\n\n this._super(id);\n if ($.isPlainObject(id)) {\n $.extend(this, id);\n } else { \n if (!values) WA.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\");\n this.id = id; \n this.values = values;\n\n this.displayValues = !!opt_displayValues ? opt_displayValues : {};\n this.disabledValues = !!opt_disabledValues ? opt_disabledValues : [];\n this.editable = !!opt_editable; \n }\n\n if (this.editable === true) {\n this.values[\"-1\"] = \"\";\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: \"Pick\", \n id: \"\",\n values: {\"0\": L(\"EMPTY\")},\n displayValues: {},\n disabledValues: [],\n editable: false,\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Собрать HTML-разметку с учетом указанных параметров\n * @function WebAccess.components.forms.requisites.Pick#render\n * @return {string} Сгенерированная HTML-разметка\n */\n render: function() { \n var result = \"\";\n\n var requestMap = {\n \"ID\": this.id.toLowerCase(),\n \"Values\": this.values,\n \"DisplayValues\": this.displayValues, \n \"DisabledValues\": this.disabledValues,\n \"Editable\": this.editable\n };\n \n CallServiceSync(\"/Requisite.asmx/Pick\", requestMap, function (response) {\n if (response.Success) {\n result = response.Result.html;\n }\n else ShowMessage(response.Result);\n });\n\n this.fire(\"render\");\n this.html = result;\n return result;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Асинхронно генерирует HTML-разметку\n * @function WebAccess.components.forms.requisites.Pick#renderAsync\n * @return {string} Сгенерированная HTML-разметка. \n * @since 5.2.0.1200\n */\n renderAsync: function (opt_data) {\n //TODO: Этот метод использует hogan шаблон, а для его работы необходимо много данных,\n //в том числе частично нужны данные с серверной стороны. В будущем необходимо эти\n //данные научится формировать либо получать. Сейчас пока этот метод будет работать\n //только если предоствить все данные явно. В будущем метод render(тот что выше) нужно \n //будет переделать на него, но с флагами синхронного вызова.\n var me = this;\n var data = opt_data || me.getData();\n var result = $.Deferred();\n if (!opt_data) WA.raise('NOT_IMPLEMENTED_EXCEPTION')\n\n WA.templates.render(TEMPLATE, opt_data).done(function (html) {\n me.html = html;\n result.resolve(me.html);\n me.fire(\"render\");\n });\n\n return result;\n }\n });\n \n global.Pick = Pick;\n})(window.WebAccess.components.forms.requisites);","\"use strict\";\n(function (global) {\n\n var TEMPLATE = '/components/referenceRequisite.compile.html';\n\n/** \n* Реквизит типа «Справочник».\n* \n* @since 5.0.0.4000\n* @class WebAccess.components.forms.requisites.ReferenceSelect\n* @param {string|WebAccess.components.forms.requisites.ReferenceSelect.settings} id Идентификатор элемента. Является обязательным параметром\n* @param {string} referenceCode Код справочника\n* @param {string} [opt_toolTip] Всплывающая подсказка\n* @param {string} [opt_searchReqName] Название отображаемого реквизита\n* @param {string} [opt_filter] Выражение фильтрации элементов выбранного справочника\n\n* @property {string} id Идентификатор элемента\n* @property {string} referenceCode Код справочника\n* @property {string} toolTip Всплывающая подсказка\n* @property {string} searchReqName Название отображаемого реквизита\n* @property {string} filter Выражение фильтрации элементов выбранного справочника\n* @property {string} html HTML-разметка элемента\n*\n* @fires render вызывается после того, как HTML-разметка собрана и готова к использованию.\n* @throws ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED - заданы не все обязательные параметры.\n* @example\n* var field = new WebAccess.components.forms.requisites.ReferenceSelect(\"employe_select\", \"РАБ\").render();\n* WebAccess.current.sideBar.tabs.FldTree.setHtml(field);\n*/\n\n/** \n* @typedef {object} WebAccess.components.forms.requisites.ReferenceSelect.settings\n* @property {string} id Идентификатор формы справочника\n* @property {string} referenceCode Код справочника\n* @property {string} toolTip Всплывающая подсказка\n* @property {string} searchReqName Наименование отображаемого реквизита\n* @property {string} filter Выражение фильрации элементов выбранного справочника\n* @property {string} html HTML-разметка элемента\n*/\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n \n\n var ReferenceSelect = BaseObject.extend({\n init: function (id, referenceCode, opt_toolTip, opt_searchReqName, opt_filter) {\n this._super(id);\n if (!id) return;\n\n if ($.isPlainObject(id)) {\n $.extend(this, id);\n } else { \n if (!referenceCode) WA.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\"); \n this.id = id;\n this.referenceCode = !!referenceCode ? referenceCode : \"ПОД\"; \n this.toolTip = !!opt_toolTip ? opt_toolTip : \"\";\n this.searchReqName = !!opt_searchReqName ? opt_searchReqName : \"Наименование\";\n this.filter = !!opt_filter ? opt_filter : \"\";\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: \"ReferenceSelect\", \n id: \"\",\n referenceCode: \"\", \n toolTip: \"\",\n searchReqName: \"Наименование\",\n filter: \"\",\n html: \"\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Генерировать HTML-разметку\n * @function WebAccess.components.forms.requisites.ReferenceSelect#render\n * @return {string} Сгенерированная HTML-разметка\n */\n render: function() { \n var result = \"\";\n var requestMap = { \n \"ID\": this.id.toLowerCase(),\n \"ReferenceCode\": this.referenceCode, \n \"ToolTip\": this.toolTip, \n \"SearchReqName\": this.searchReqName, \n \"Filter\": this.filter\n };\n\n CallServiceSync(\"/Requisite.asmx/ReferenceSelect\", requestMap, function (response) {\n if (response.Success) {\n result = response.Result.html;\n }\n else ShowMessage(response.Result);\n });\n\n this.fire(\"render\");\n this.html = result;\n return result;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Асинхронно генерирует HTML-разметку \n * @function WebAccess.components.forms.requisites.ReferenceSelect#renderAsync\n * @return {string} Сгенерированная HTML-разметка.\n * @since 5.2.0.1200\n */\n renderAsync: function (opt_data) {\n //TODO: Этот метод использует hogan шаблон, а для его работы необходимо много данных,\n //в том числе частично нужны данные с серверной стороны. В будущем необходимо эти\n //данные научится формировать либо получать. Сейчас пока этот метод будет работать\n //только если предоствить все данные явно. В будущем метод render(тот что выше) нужно \n //будет переделать на него, но с флагами синхронного вызова.\n var me = this;\n var data = opt_data || me.getData();\n var result = $.Deferred();\n if (!opt_data) WA.raise('NOT_IMPLEMENTED_EXCEPTION')\n\n WA.templates.render(TEMPLATE, opt_data).done(function (html) {\n me.html = html;\n result.resolve(me.html);\n me.fire(\"render\");\n });\n\n return result;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n \n global.ReferenceSelect = ReferenceSelect;\n})(window.WebAccess.components.forms.requisites);","\"use strict\";\n\n/** \n* Базовый объект страницы.\n*\n* @class WebAccess.components.wrappers.BasePageElement\n* @extends BaseObject\n* @property {string} className Имя класса\n* @property {string} name Имя объекта\n* @property {string} selector Селектор для работы с объектом вне API\n*/\n\n(function (global) {\n var BasePageElement = BaseObject.extend({\n\n /**\n * Конструктор\n * @param {string} itemSelector Селектор существующего элемента страницы\n * @method WebAccess.components.wrappers.BasePageElement#init\n */\n init: function (itemSelector) {\n this._super(itemSelector);\n this._jObject = $(itemSelector);\n this.name = this._jObject.attr(\"name\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: \"BasePageElement\",\n name: \"\",\n selector: \"\",\n\n /** @private */\n _jObject: {},\n /** @private */\n _storedEvents: [],\n /** @private */\n _byNameSelectorTemplate: \"{0}[name='{1}']\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак скрытия объекта.\n * \n * @method WebAccess.components.wrappers.BasePageElement#isHidden\n * @return {boolean} True, если объект скрыт, иначе False.\n */\n isHidden: function () {\n return !this._jObject.is(\":visible\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак отображения объекта.\n * \n * @method WebAccess.components.wrappers.BasePageElement#isEnabled\n * @return {boolean} True, если объект отображается, иначе False.\n */\n isEnabled: function () {\n return !this._jObject.hasClass(\"disabled\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак выбора объекта.\n * \n * @method WebAccess.components.wrappers.BasePageElement#isSelected\n * @return {boolean} True, если объект выбран, иначе False.\n * @since 5.0.0.4203\n */\n isSelected: function () {\n return this._jObject.hasClass(\"selected\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить скрытый объект.\n * \n * @method WebAccess.components.wrappers.BasePageElement#show\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BasePageElement.\n */\n show: function () {\n this._jObject.show();\n this.fire(\"show\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть объект.\n * \n * @method WebAccess.components.wrappers.BasePageElement#hide\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BasePageElement.\n */\n hide: function () {\n this._jObject.hide();\n this.fire(\"hide\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить подпись к объекту.\n * \n * @param {string} text Текст подписи\n * @method WebAccess.components.wrappers.BasePageElement#setLabel\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BasePageElement. \n */\n setLabel: function (text) {\n this._jObject.find(\"span\").text(text);\n this.fire(\"change\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить текст подписи объекта.\n * \n * @method WebAccess.components.wrappers.BasePageElement#getLabel\n * @return {string} Текст подписи объекта.\n */\n getLabel: function () {\n return this._jObject.find(\"span\").text();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Установить всплывающую подсказку.\n * \n * @param {string} text Текст всплывающей подсказки\n * @method WebAccess.components.wrappers.BasePageElement#setTooltip\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BasePageElement. \n * @since 5.0.0.4005\n */\n setTooltip: function (text) {\n var me = this;\n var label = me.getLabel();\n var tooltip = text;\n // Добавим название кнопки в подсказку к этой кнопке.\n if (tooltip !== label) {\n tooltip = label + '\\n' + tooltip;\n }\n me._jObject.attr('title', tooltip);\n me.fire(\"change\");\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить текст всплывающей подсказки.\n * \n * @method WebAccess.components.wrappers.BasePageElement#getTooltip\n * @return {string} Текст всплывающей подсказки.\n * @since 5.0.0.4005\n */\n getTooltip: function () {\n return this._jObject.attr(\"title\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить иконку.\n *\n * Иконку необходимо разместить в папке проекта App_Sprites и после скопилировать проект.\n * \n * @example \n * WebAccess.current.sideBar.tabs.create(\"FilterRRCAssignment1\")\n * .enable().setLabel(L(\"RRC_ASSIGNMENTS_FILTER\"))\n * .setIcon(\"SidebarAndExtensions/EDocumentSearch_24.png\") \n * \n * WebAccess.current.sideBar.tabs.create(\"FilterRRCAssignment1\")\n * .enable()\n * .setLabel(L(\"RRC_ASSIGNMENTS_FILTER\"))\n * .setIcon(\"/App_Sprites/SidebarAndExtensions/EDocumentSearch_24.png\") \n * \n * @param {string} path Путь к иконке\n * @method WebAccess.components.wrappers.BasePageElement#setIcon\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BasePageElement.\n */\n setIcon: function (path) {\n\n if (path.indexOf(\".\") !== -1) {\n\n var jSvgIcon = this._jObject.find(\"svg\");\n\n if (jSvgIcon.length != 0) {\n jSvgIcon.remove();\n var jContainer = this._jObject.find(\"div\").first();\n jContainer.prepend(\"

    \");\n }\n\n if (path.indexOf(\"/App_Sprites/\") !== -1) {\n path = path.substring(path.indexOf(\"s/\") + 2);\n };\n\n this._jObject.find(\"p\").first().removeClass().addClass(path);\n }\n else {\n var jSpriteIcon = this._jObject.find(\"p\").first();\n if (jSpriteIcon.length !== 0) {\n var jContainer = this._jObject.find(\"div\").first();\n jSpriteIcon.remove();\n jContainer.prepend('');\n }\n else {\n var jUseElement = this._jObject.find(\"use\").first();\n jUseElement.attr(\"xlink:href\", \"#\" + path);\n }\n }\n\n this.fire(\"change\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить имя иконки.\n * \n * @method WebAccess.components.wrappers.BasePageElement#getIcon\n * @return {string} Имя иконки.\n */\n getIcon: function () {\n\n var jSvgIcon = this._jObject.find(\"svg\");\n\n if (jSvgIcon.length !== 0)\n return jSvgIcon.children(\"use\").attr(\"xlink:href\").substr(1);\n\n return this._jObject.find(\"p\").first().attr('class');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Имитировать щелчок мыши.\n * Имитация щелчка мыши на кнопке либо установка обработчика на событие onClick, если передан callback. \n * Заменяет обработчик, установленный по умолчанию. Используется в прикладной разработке.\n * \n * @param {function} [opt_callback] Функция, которая будет вызвана после щелчка мыши по кнопке\n * @method WebAccess.components.wrappers.BasePageElement#click\n * @throws ERR_OBJECT_IS_ALREADY_RENDERED – объект уже отображен.\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BasePageElement.\n *\n * @example\n * WebAccess.current.toolBar.buttons.CrtRefRecords.click();\n * WebAccess.current.toolBar.buttons.CrtRefRecords.click(function() {\n * alert(\"Существующие обработчки событий click были перезаписаны данным\");\n * })\n */\n click: function (opt_callback) {\n var instance = this;\n if ($.isFunction(opt_callback)) {\n this._disableClickHandler(this._jObject);\n this.unbind('click').bind(\"click\", opt_callback);\n } else {\n this._jObject.click();\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _defaultAction: function () {\n if (!this._inlineEvent) return;\n return (new Function(this._inlineEvent)).call(this._jObject.get(0));\n },\n\n /**\n * Выхов нашего fire при клике на элемент\n * @private\n */\n _eventHandler: function (event) {\n var eventName = event.data.eventName;\n var name = event.data.buttonName;\n var element = event.data.instance;\n var continueDefaultAction = event.data.continueDefaultAction;\n\n if (element.fire(eventName, name, continueDefaultAction) !== false && eventName === 'click') {\n element._defaultAction.call(element);\n };\n },\n\n /** \n * Привязать функцию к событию. \n * Аналогичен методу click, но без замены обработчиков.\n *\n * @example\n * var tab = WebAccess.current.sideBar.tabs.create(\"FilterRRCAssignment1\");\n * tab.bind(\"click\",function () { createFilterTabs(\"RRCAssignments\"); });\n * @method WebAccess.components.wrappers.BasePageElement#bind\n * @param {string} name Имя события\n * @param {function} callback Функция, срабатывающая при событии\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BaseObject.\n */\n bind: function (event, callback) {\n var instance = this;\n if (event === 'click') this._storeInlineEvents();\n\n this._super(event, callback);\n //if (event == \"click\") this._disableClickHandler(this._jObject); \n this._jObject.unbind(event, this._eventHanler).bind(event, {\n \"instance\": instance,\n \"eventName\": event,\n \"buttonName\": instance.name,\n \"continueDefaultAction\": $.proxy(instance._defaultAction, instance)\n }, this._eventHandler);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Отключение обработчика click у объекта\n * @method WebAccess.components.wrappers.BasePageElement#_disableClickHandler\n * @private\n */\n _disableClickHandler: function (jObject) {\n\n jObject.removeAttr(\"onclick\"); // Здесь именно так \n jObject.prop(\"onclick\", null); // именно две строки\n\n jObject.off(\"click\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сделать кнопку недоступной. \n * Кнопка становится полупрозрачной и не реагирует на события.\n * \n * @method WebAccess.components.wrappers.BasePageElement#disable\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BasePageElement.\n */\n disable: function () {\n if (this.isEnabled()) { // Без этого если вызывать disable 2 раза, то он потеряет собятия вообще.\n this._storeEvents();\n this._jObject.unbind(\"click\");\n this._jObject.addClass(\"disabled\").removeClass('hover');\n this.fire(\"disable\");\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сделать кнопку доступной.\n * \n * @method WebAccess.components.wrappers.BasePageElement#enable\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BasePageElement.\n */\n enable: function () {\n if (!this.isEnabled()) {\n this._jObject.removeClass(\"disabled\");\n this._restoreEvents();\n this.fire(\"enable\");\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сохранение привязанных обработчиков событий\n * \n * @private \n * @method WebAccess.components.wrappers.BasePageElement#_storeEvents\n * @return {WebAccess.components.wrappers.BasePageElement}\n */\n _storeEvents: function () {\n this._storeInlineEvents();\n this._storedEvents = this._events;\n\n this._events = [];\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сохранение того, что было навешено на атрибут onclick.\n * @private \n * @method WebAccess.components.wrappers.BasePageElement#_storeInlineEvents\n */\n _storeInlineEvents: function () {\n if (this._jObject.hasAttr(\"onclick\")) {\n if (WA.ENV.browser.name !== 'IE' && WA.ENV.browser.major !== '7') {\n this._inlineEvent = this._jObject.attr(\"onclick\"); //Здесь имеенно attr, не prop! и точка.\n this._jObject.removeAttr(\"onclick\"); // Аналогично\n }\n //this._jObject.prop(\"onclick\")\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Восстановление привязанных обработчиков событий\n * \n * @private\n * @method WebAccess.components.wrappers.BasePageElement#_storeEvents\n * @return {WebAccess.components.wrappers.BasePageElement}\n */\n _restoreEvents: function () {\n this._restoreInlineEvents();\n if (Object.keys(this._storedEvents).length > 0) {\n this._events = this._storedEvents;\n this._storedEvents = [];\n\n var instance = this;\n for (var event in this._events) {\n if (this._events.hasOwnProperty(event)) {\n this._jObject.bind(event, function () {\n instance.fire(event, instance.name);\n });\n }\n }\n }\n\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Восстановление привязанных атрибутом обработчиков событий onclick\n * \n * @private\n * @method WebAccess.components.wrappers.BasePageElement#_restoreInlineEvents\n */\n _restoreInlineEvents: function () {\n if (this._inlineEvent !== \"\") {\n this._jObject.attr(\"onclick\", this._inlineEvent);\n }; //И здесь имеенно attr, не prop! железно!\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n global.BasePageElement = BasePageElement;\n\n})(window.WebAccess.components.wrappers);\n","\"use strict\";\n\n/**\n* Кнопка панели инструментов.\n* \n* @class WebAccess.components.wrappers.toolBar.ToolBarButton\n* @extends WebAccess.components.wrappers.BasePageElement\n* @property {string} name Имя кнопки\n* @property {group} groupName Группа, в которую вложена кнопка\n* @property {string} selector Путь в DOM-иерархии к объекту кнопки, например div.content#container \n* @property {boolean} isSynthetic Признак, указывающий на то, что закладка была создана средствами API\n* @param {string} itemSelector Существующий элемент страницы\n*/\n\n(function (global) {\n\n var buttonSelector = \"div.toolbar_button\";\n var groupSelector = \"div.toolbar_group\";\n\n // Признак доступности действия, если в области вложений выделен хотя бы один элемент.\n var isEnabledOnAttachmentSelected = 1 << 0;\n\n // Признак доступности действия, если ЗЗУ прекращено.\n var isEnabledOnAborted = 1 << 1;\n\n // Признак доступности действия, если ЗЗУ выполнено.\n var isEnabledOnDone = 1 << 2;\n\n // Признак доступности действия, если ЗЗУ в работе.\n var isEnabledOnRunning = 1 << 3;\n\n var ToolBarButton = global.components.wrappers.BasePageElement.extend({\n init: function (itemSelector) {\n this._super(itemSelector);\n this.selector = format(this._byNameSelectorTemplate, buttonSelector, this.name);\n this.groupName = this._jObject.parents(groupSelector).attr(\"name\");\n this._jGroup = this._jObject.parents(groupSelector);\n\n // Если мы создаем кнопку динамически, и говорим что она \n // должна быть маленькой, но при этом указываем большую иконку,\n // то приходится конверитровать её здесь\n if (!this._jObject.data(\"icon\")) {\n this._jObject.data(\"icon\", this._jObject.find('p').attr('class'));\n };\n if (this.isSmall()) {\n this._setupSmallIcon();\n };\n\n // Установка свойства связанного прикладного действия\n this._linkedAction = this._jObject.data('linkedaction');\n this._enabledMode = this._jObject.data('enabledmode');\n var enabledWhen = this._jObject.data('enabledwhen');\n if (enabledWhen) {\n this._enabledWhen = enabledWhen;\n }\n\n // Получить тексты всплывающих подсказок\n this._disabledHint = this._jObject.data('disabledhint');\n this._hint = this._jObject.data('hint');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: \"ToolBarButton\",\n groupName: \"\",\n isSynthetic: false,\n _jGroup: null,\n _inlineEvent: \"\",\n _isConverted: false,\n _linkedAction: null,\n _enabledMode: null,\n _disabledHint: \"\",\n _hint: \"\",\n _enabledWhen: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @private\n */\n _setupIcon: function (firstIcon, secondIcon, from, to) {\n if (!!firstIcon) {\n this._jObject.find('p').removeClass().addClass(firstIcon);\n } else {\n if (!!secondIcon) {\n var picName = secondIcon.split(\".\")[0];\n if (picName.indexOf(\"_\" + from) !== -1) {\n picName = picName.replace(\"_\" + from, \"_\" + to);\n picName += \".png\";\n } else {\n picName += \"_\" + to + \".png\";\n };\n this._jObject.find('p').removeClass().addClass(picName);\n };\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Пробуем получить маленькую иконку.\n * @private\n */\n _setupSmallIcon: function () {\n var storedSmallIcon = this._jObject.data(\"smallicon\");\n var storedLargeIcon = this._jObject.data(\"icon\");\n this._setupIcon(storedSmallIcon, storedLargeIcon, \"32\", \"16\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Пробуем получить большую иконку.\n * @private\n */\n _setupLargeIcon: function () {\n var storedSmallIcon = this._jObject.data(\"smallicon\");\n var storedLargeIcon = this._jObject.data(\"icon\");\n this._setupIcon(storedLargeIcon, storedSmallIcon, \"16\", \"32\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Изменение размера и перемещение большой кнопки в колонку.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#_putInColumn\n * @private\n */\n _putInColumn: function (jColumn) {\n var me = this;\n me._jObject.removeClass('toolbar_item').addClass('small_toolbar_item');\n me._setupSmallIcon();\n $(me._jObject).prependTo(jColumn);\n me._isConverted = true; //Чтобы сохранить следы для обратного восстановления\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Изменение размера и перемещение маленькой кнопки из колонки в большую.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#_putInColumn\n * @private\n */\n _takeFromColumn: function (jColumn) {\n var me = this;\n me._jObject.removeClass('small_toolbar_item').addClass('toolbar_item');\n me._setupLargeIcon();\n $(me._jObject).insertBefore(jColumn);\n me._isConverted = true; //Чтобы сохранить следы для обратного восстановления\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Логика конвертирования из большой кнопки в маленькую.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#_convertToSmall\n * @private\n */\n _convertToSmall: function () {\n var me = this;\n var largeButtonsCount = me._jGroup.find(\".toolbar_item\").length;\n var firstColumnSelector = \".toolbar_column:first\";\n var jFirstColumn = me._jObject.nextAll(firstColumnSelector);\n if (!me.isSmall() && (largeButtonsCount > 1 || jFirstColumn.length > 0)) {\n if (me._jGroup.find(\".toolbar_column\").length > 0 && jFirstColumn.length > 0) {\n if (jFirstColumn.find(\".small_toolbar_item\").length < 3) {\n //Ковертируем в маленькую и переводим в колонку \n me._putInColumn(jFirstColumn);\n } else {\n if (largeButtonsCount > 1 && me._jObject.prev().is(\".toolbar_item\")) {\n //Создаем колонку, вставляем перед всеми колонками\n //Ковертируем в маленькую и переводим в колонку\n var jColumn = $('
    ');\n jColumn.insertBefore(jFirstColumn);\n me._putInColumn(jColumn);\n }\n }\n } else {\n //Создаем колонку, вставляем в конце\n //Ковертируем в маленькую и переводим в колонку\n var jColumn = $('
    ');\n me._jGroup.append(jColumn);\n me._putInColumn(jColumn);\n }\n fixSvg(me._jGroup[0]);\n };\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Конвертация мальенькой кнопки в большую\n * @private\n */\n _convertToLarge: function () {\n var me = this;\n if (me.isSmall()) {\n me._jColumn = me._jObject.parent('.toolbar_column');\n me._takeFromColumn(me._jColumn);\n if (me._jColumn.find(\".toolbar_button\").length == 0) me._jColumn.remove();\n fixSvg(me._jGroup[0]);\n };\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Изменить регистр букв.\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#convertTo\n * @param {BUTTON} buttonType Тип кнопки \n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton} Объект типа ToolBarButton.\n * @since 5.0.0.4104\n */\n convertTo: function (buttonType) {\n switch (buttonType) {\n case BUTTON.SMALL:\n return this._convertToSmall();\n case BUTTON.LARGE:\n return this._convertToLarge();\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить наименование прикладного действия, связанного с кнопкной на ленте.\n * @function WebAccess.components.wrappers.toolBar.ToolBarButton#getLinkedAction\n * @return {string} Наименование связанного с кнопкой прикладного действия. Если действие не указано - undefined.\n */\n getLinkedAction: function () {\n return this._linkedAction;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить режим доступности действия.\n * @function WebAccess.components.wrappers.toolBar.ToolBarButton#getEnabledMode\n * @return {ACTION_ENABLED_MODE} Режим доступности кнопки.\n */\n getEnabledMode: function () {\n return this._enabledMode;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить режим доступности действия для состояния \"Прекращено\".\n * @function WebAccess.components.wrappers.toolBar.ToolBarButton#getIsEnabledOnAborted\n * @return {boolean} True - если кнопка доступна, иначе False.\n */\n getIsEnabledOnAttachnentSelected: function () {\n var me = this;\n if (me._enabledWhen) {\n return Boolean(me._enabledWhen & isEnabledOnAttachmentSelected);\n }\n return false;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить режим доступности действия для состояния \"Прекращено\".\n * @function WebAccess.components.wrappers.toolBar.ToolBarButton#getIsEnabledOnAborted\n * @return {boolean} True - если кнопка доступна, иначе False.\n */\n getIsEnabledOnAborted: function () {\n var me = this;\n if (me._enabledWhen) {\n return Boolean(me._enabledWhen & isEnabledOnAborted);\n }\n return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить режим доступности действия для состояния \"Выполнено\".\n * @function WebAccess.components.wrappers.toolBar.ToolBarButton#getIsEnabledOnDone\n * @return {boolean} True - если кнопка доступна, иначе False.\n */\n getIsEnabledOnDone: function () {\n var me = this;\n if (me._enabledWhen) {\n return Boolean(me._enabledWhen & isEnabledOnDone);\n }\n return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить режим доступности действия для состояния \"В работе\".\n * @function WebAccess.components.wrappers.toolBar.ToolBarButton#getIsEnabledOnRunning\n * @return {boolean} True - если кнопка доступна, иначе False.\n */\n getIsEnabledOnRunning: function () {\n var me = this;\n if (me._enabledWhen) {\n return Boolean(me._enabledWhen & isEnabledOnRunning);\n }\n return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Устанавливает для кнопки состояние \"Нажата\"\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#select\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton} Объект типа ToolBarButton.\n * @since 5.2.0.1100\n */\n select: function () {\n this._jObject.addClass(\"selected\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Устанавливает для кнопки состояние \"Не нажата\"\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#unSelect\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton} Объект типа ToolBarButton.\n * @since 5.2.0.1100\n */\n unSelect: function () {\n this._jObject.removeClass(\"selected\");\n return this\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить значение состояния кнопки.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#isSelect\n * @return {boolean} True, если кнопка нажата, иначе False.\n * @since 5.3.0.1104\n */\n isSelected: function () {\n return this._jObject.hasClass(\"selected\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак кнопки маленького размера.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#isSmall\n * @return {boolean} True, если кнопка маленького размера, иначе False.\n * @since 5.0.0.4104\n */\n isSmall: function () {\n return this._jObject.hasClass(\"small_toolbar_item\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить родительскую группу кнопок.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#group\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton} Объект типа ToolBarGroup.\n */\n group: function () {\n this.groupName = this._jObject.parents(groupSelector).attr(\"name\");\n return global.current.toolBar.groups[this.groupName];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n click: function (opt_callback) {\n if ($.isFunction(opt_callback)) {\n this.unbind(\"click\");\n };\n this._super(opt_callback);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n bind: function (event, callback) {\n this._super(event, callback);\n if (this.isSynthetic && event == \"click\") { //Убираем алерт с подсказкой\n this._jObject.removeAttr(\"onclick\"); // Здесь именно так \n this._jObject.prop(\"onclick\", null); // именно две строки\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрытие кнопки.\n * \n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#hide\n * @comment Keit_B: Новый. Пока не трогаю, ранее наследовался от BasePageElement.\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton} \n */\n hide: function () {\n var me = this;\n me._super();\n if (me._jGroup.find('.toolbar_button:visible').length === 0) {\n me.group().hideNextSeparator();\n };\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показ скрытой кнопки.\n * \n * @comment Keit_B: Новый. Пока не трогаю, ранее наследовался от BasePageElement.\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#show\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton}\n */\n show: function () {\n var me = this;\n me._super();\n if (me._jGroup.find('.toolbar_button:visible').length > 0) {\n me.group().showNextSeparator();\n };\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Заблокировать кнопку.\n * \n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#disable\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton}\n */\n disable: function () {\n var me = this;\n me._super();\n me._setActualHint();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Разблокировать кнопку.\n * \n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#enable\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton}\n */\n enable: function () {\n var me = this;\n me._super();\n me._setActualHint();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить тексты всплывающих подсказок.\n * \n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#setHints\n * @param {string} hint Текст всплывающей подсказки.\n * @param {string} disabledHint Текст всплывающей подсказки при заблокированной кнопке.\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton}\n */\n setHints: function (hint, disabledHint) {\n var me = this;\n me._hint = hint;\n me._disabledHint = disabledHint;\n me._setActualHint();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить подсказку на основе состояния действия и значений свойств.\n *\n * @private\n * @method WebAccess.components.wrappers.toolBar.ToolBarButton#_setActualHint\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton}\n */\n _setActualHint: function() {\n var me = this;\n if (!me.isEnabled() && me._disabledHint) {\n me.setTooltip(me._disabledHint);\n } else {\n if (me._hint) {\n me.setTooltip(me._hint);\n } else {\n me.setTooltip(me.getLabel());\n }\n }\n }\n });\n\n global.components.wrappers.toolBar.ToolBarButton = ToolBarButton;\n})(window.WebAccess);","\"use strict\";\n\n/**\n * Режим сжатия группы кнопок.\n * @since 5.0.0.4104\n * @readonly\n * @enum {string} GROUP_FOLD_MODE\n * @example\n * //В группе кнопок, именуемой ATTACHMENTS, убрать подписи у маленьких кнопок.\n * WebAccess.current.toolBar.groups.ATTACHMENTS.compress(GROUP_FOLD_MODE.SHRINK_SMALL_BUTTONS);\n */\nvar GROUP_FOLD_MODE = {\n /** Убрать подписи у маленьких кнопок */\n SHRINK_SMALL_BUTTONS: 0,\n /** Преобразовать большие кнопки в столбец из маленьких */\n CONVERT_LARGE_BUTTONS: 1,\n /** Свернуть группу, состоящую из маленьких кнопок, в одну большую кнопку */\n COLLAPSE: 2,\n /** Свернуть группу кнопок по приоритету: CONVERT_LARGE_BUTTONS > SHRINK_SMALL_BUTTONS > COLLAPSE */\n AUTO: 3\n};\n\n/**\n* Группа панели инструментов.\n* \n* @class WebAccess.components.wrappers.toolBar.ToolBarGroup\n* @extends WebAccess.components.wrappers.BasePageElement\n* @property {string} name Имя группы\n* @property {string} priority Приоритет сворачивания группы\n* @property {string} selector Путь в DOM-иерархии к объекту группы, например div.content#container\n* @param {string} itemSelector Существующий элемент страницы\n* @return {WebAccess.components.wrappers.toolBar.ToolBarGroup}\n*/\n\n(function (global) {\n var toolBarConatainerSelector = \"#toolbar_container\";\n var groupSelector = \"div.toolbar_group\";\n var separatorSelector = \"div.toolbar_separator\";\n var groupHeaderSelector = \"div.toolbar_group_header\";\n var buttonAndColumnSelector = \"div.toolbar_item, div.toolbar_column\";\n var smallButtonSelector = \"div.small_toolbar_item\";\n var jToolBarConatainer = $(toolBarConatainerSelector);\n var toolBarBottomBorderClass = 'toolbar_bottom_border';\n var buttonArrowSelector = \".toolbar-item__arrow\";\n\n\n global.index = 100;\n\n var ToolBarGroup = global.components.wrappers.BasePageElement.extend({\n init: function (itemSelector) {\n this._super(itemSelector);\n this.selector = format(this._byNameSelectorTemplate, groupSelector, this.name);\n this._index = global.index += 1;\n this.priority = this._jObject.attr('priority');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** @private */\n priority: null,\n _isCollapsed: false,\n _index: 0,\n className: \"ToolBarGroup\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создать кнопку в текущей группе.\n *\n * @method ToolBarGWebAccess.components.wrappers.toolBar.ToolBarGroup#createButton\n * @param {string} buttonName Имя создаваемой кнопки\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton} Объект типа ToolBarButton.\n */\n createButton: function (buttonName, opt_smallSized) {\n var newButton = global.current.toolBar.buttons.create(this.name, buttonName, opt_smallSized);\n return newButton;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть группу кнопок с панели инструментов.\n * \n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#hide\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} Объект типа ToolBarGroup.\n */\n hide: function () {\n this._super();\n this.hideNextSeparator();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить группу кнопок на панели инструментов.\n * \n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#show\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} Объект типа ToolBarGroup.\n */\n show: function () {\n this._super();\n this.showNextSeparator();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Установка подписи группы кнопок\n *\n * @comment Keit_B: Новый. Пока не трогаю. Ранее: Унаследован от BasePageElement.\n * @param {string} text текст подписи\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#setLabel\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup}\n */\n setLabel: function (text) {\n this._jObject.children(groupHeaderSelector).find(\"span\").text(text);\n this.fire(\"change\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Получение текста подписи группы\n * \n * @comment Keit_B: Новый. Пока не трогаю. Ранее: Унаследован от BasePageElement.\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#getLabel\n * @return {string}\n */\n getLabel: function () {\n return this._jObject.children(groupHeaderSelector).find(\"span\").text();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Сворачивание группы кнопок \n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#collapse\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup}\n */\n collapse: function () {\n if (!this.isCollapsed()) {\n\n var me = this;\n var headerInlineBlock = 'inline-block';\n var addedGroupSelector = \"div[id^='addedDiv']\";\n\n jToolBarConatainer.find(addedGroupSelector + \":visible\").hide();\n var items = this._jObject.children(buttonAndColumnSelector).filter(':visible');\n var jButtonArrows = items.find(buttonArrowSelector);\n var smallItems = items.find(smallButtonSelector);\n //Нельзя сворачивать группы из одной кнопки. А также нельзя скрывать группы с кнопками со стрелками, чтобы не получилось многоуровневое меню.\n if (items.length + smallItems.length > 1 && jButtonArrows.length === 0) {\n var tbgroup_header = this._jObject.children(groupHeaderSelector);\n tbgroup_header.css('display', headerInlineBlock).unbind('click').bind('click', function (evt) {\n evt.stopPropagation();\n var elem = $(this).nextAll(addedGroupSelector);\n if (elem.css('display') != 'none') {\n elem.hide();\n } else {\n var docWidth = $(document).width();\n $(addedGroupSelector).hide();\n elem.show();\n var jHiddenDiv = me._jObject.find(\".addedHiddenDiv:visible\").css(\"left\", \"\");\n var divWidth = jHiddenDiv.width();\n if (divWidth > (docWidth - jHiddenDiv.position().left)) jHiddenDiv.css(\"left\", docWidth - divWidth);\n };\n });\n\n tbgroup_header.nextAll(buttonAndColumnSelector).hover(function () { $(this).addClass(\"hover\"); }, function () { $(this).removeClass(\"hover\"); });\n\n this._jObject.append(format(CT.toolBar.groupCollapsed, this._index, this._jObject.css('left')));\n\n var jAddedDiv = $(\"#addedDiv\" + this._index);\n items.appendTo(jAddedDiv);\n fixSvg(jAddedDiv[0]);\n\n this._isCollapsed = true;\n this.fire(\"collapse\");\n } else {\n return this;\n }\n\n this._autoHideGroup($(\".addedHiddenDiv\"));\n items.hover(function () { $(this).addClass(\"hover\"); }, function () { $(this).removeClass(\"hover\"); });\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Автоскрытие группы, когда мышь находится вне её.\n *\n * @private \n * @since 5.0.0.4212\n */\n _autoHideGroup: function (jGroup) {\n var rebind = function (jObject) {\n jObject.unbind('click.collapse').bind('click.collapse', function () {\n jGroup.hide();\n });\n };\n\n setTimeout(function () {\n var frameDocument = $('iframe').contents().get(0);\n var jFrame = $(frameDocument);\n rebind(jFrame);\n }, 1000);\n\n rebind($('body'));\n\n var autohide;\n jGroup\n .off('mouseenter.collapse').off('mouseleave.collapse')\n .on('mouseenter.collapse', function () { if (autohide) clearTimeout(autohide); })\n .on('mouseleave.collapse', function () {\n autohide = setTimeout(\n function () {\n jGroup.hide();\n }, 500);\n });\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Сжать маленькие кнопки до размера иконок.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#_shrinkSmallButtons\n * @private\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} \n */\n _shrinkSmallButtons: function () {\n var jColumn = this._jObject.find(\"div.toolbar_column\").not(\".shrinked\").last();\n if (jColumn.length > 0) {\n var canBeShrinked = true;\n jColumn.find(smallButtonSelector + \" div p\").each(function (i, item) {\n if ($(this).width() == 0) return canBeShrinked = false;\n });\n\n jColumn.addClass(\"shrinked\");\n if (!canBeShrinked) jColumn.addClass(\"no_icon\");\n\n };\n\n jColumn = this._jObject.find(\"div.toolbar_column\").not(\".shrinked\").last();\n if (jColumn.length == 0) return false;\n else return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Пошаговое сжатие группы кнопок, по приоритетам операций. При сворачивании в группу, восстанавливаем все кнопки в первоначальное состояние.\n * @private\n */\n _autoCompress: function () {\n if (this._jObject.children(\".toolbar_item\").not(\".packed\").length > 0) { this.fold(GROUP_FOLD_MODE.CONVERT_LARGE_BUTTONS); return true; };\n if (this._jObject.children(\".toolbar_column\").not(\".shrinked\").length > 0) { this.fold(GROUP_FOLD_MODE.SHRINK_SMALL_BUTTONS); return true; };\n if (!this.isCollapsed()) {\n while (this._jObject.children(\".toolbar_column.shrinked\").length > 0) { this.unfold(GROUP_FOLD_MODE.SHRINK_SMALL_BUTTONS); };\n while (this._jObject.find(\".toolbar_button.packed\").length > 0) { this.unfold(GROUP_FOLD_MODE.CONVERT_LARGE_BUTTONS); };\n this.fold(GROUP_FOLD_MODE.COLLAPSE);\n return false;\n };\n return false;\n },\n\n _autoRestore: function () {\n if (this.isCollapsed()) {\n this.unfold(GROUP_FOLD_MODE.COLLAPSE);\n while (this._jObject.children(\".toolbar_item\").not(\".packed\").length > 0) { this.fold(GROUP_FOLD_MODE.CONVERT_LARGE_BUTTONS); };\n while (this._jObject.children(\".toolbar_column\").not(\".shrinked\").length > 0) { this.fold(GROUP_FOLD_MODE.SHRINK_SMALL_BUTTONS); };\n return true;\n };\n if (this._jObject.children(\".toolbar_column.shrinked\").length > 0) { this.unfold(GROUP_FOLD_MODE.SHRINK_SMALL_BUTTONS); return true };\n if (this._jObject.find(\".toolbar_button.packed\").length > 0) { this.unfold(GROUP_FOLD_MODE.CONVERT_LARGE_BUTTONS); return true };\n return false;\n },\n\n /**\n * Восстановление текста маленьких кнопок которые были свернуты в икноку.\n * @private\n */\n _restoreSmallButtons: function () {\n var jColumn = this._jObject.find(\"div.toolbar_column.shrinked\").last();\n if (jColumn.length > 0) {\n jColumn.removeClass(\"shrinked\");\n } else return false;\n\n jColumn = this._jObject.find(\"div.toolbar_column.shrinked\").last();\n if (jColumn.length == 0) return false;\n else return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * В группе ищем все большие группы без класса .packed\n * @private\n */\n _convertLargeButtons: function () {\n var jLargeButtons = this._jObject.find('div.toolbar_item').not('.packed');\n if (jLargeButtons.length == 0) return false;\n var buttons = this.getButtons();\n\n var i;\n var count = i = (jLargeButtons.length < 3 ? jLargeButtons.length - 1 : 2);\n for (i = 0; i <= count; i++) {\n var jButton = $(jLargeButtons[jLargeButtons.length - i - 1]);\n var buttonName = jButton.attr('name');\n if (buttons.hasOwnProperty(buttonName)) {\n if (typeof buttons[buttonName] !== 'undefined')\n buttons[buttonName].convertTo(BUTTON.SMALL);\n }\n jButton.addClass('packed');\n if (jButton.prev().is(\".toolbar_column\")) break;\n };\n\n jLargeButtons = this._jObject.find('.toolbar_item').not('.packed');\n if (jLargeButtons.length == 0) return false;\n else return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @private\n */\n _convertSmallButtons: function () {\n var jSmallButtons = this._jObject.find('div.toolbar_button.packed');\n var buttons = this.getButtons();\n\n var i;\n var count = i = (jSmallButtons.length < 3 ? jSmallButtons.length - 1 : 2);\n for (i; i > -1; i--) {\n\n var jButton = $(jSmallButtons[count - i]);\n var btnByName = buttons[jButton.attr('name')];\n if (typeof btnByName !== 'undefined')\n btnByName.convertTo(BUTTON.LARGE);\n jButton.removeClass('packed');\n //if (jButton.next().is(\".toolbar_column\")) break;\n };\n\n jSmallButtons = this._jObject.find('.small_toolbar_item.packed');\n if (jSmallButtons.length == 0) return false;\n else return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Пошагово сжать группу кнопок.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#fold\n * @param {GROUP_FOLD_MODE} foldMode Режим сжатия\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} Объект типа ToolBarGroup.\n * @since 5.0.0.4104\n */\n fold: function (foldMode) {\n switch (foldMode) {\n case GROUP_FOLD_MODE.SHRINK_SMALL_BUTTONS:\n return this._shrinkSmallButtons();\n break;\n case GROUP_FOLD_MODE.CONVERT_LARGE_BUTTONS:\n return this._convertLargeButtons();\n break;\n case GROUP_FOLD_MODE.COLLAPSE:\n this.collapse();\n return false;\n break;\n case GROUP_FOLD_MODE.AUTO:\n return this._autoCompress();\n break\n default:\n return this._autoCompress();\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Пошагово восстановить группы кнопок.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#unfold\n * @param {GROUP_FOLD_MODE} foldMode Режим сжатия\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} Объект типа ToolBarGroup.\n * @since 5.0.0.4104\n */\n unfold: function (foldMode) {\n switch (foldMode) {\n case GROUP_FOLD_MODE.SHRINK_SMALL_BUTTONS:\n return this._restoreSmallButtons();\n break;\n case GROUP_FOLD_MODE.CONVERT_LARGE_BUTTONS:\n return this._convertSmallButtons();\n break;\n case GROUP_FOLD_MODE.COLLAPSE:\n this.expand();\n return false;\n break;\n case GROUP_FOLD_MODE.AUTO:\n return this._autoRestore();\n break;\n default:\n return this._autoRestore();\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сжать группу в указанный размер.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#fitToWidth\n * @param {integer} width Ширина, в которую необходимо вписать группу.\n * @return {boolean} Результат сжатия. True – группы вместилась, иначе False.\n * @since 5.0.0.4104\n */\n fitToWidth: function (width) {\n if (this.getWidth() > width) {\n var stop = true;\n while (stop && this.getWidth() > width) {\n stop = this.fold(GROUP_FOLD_MODE.CONVERT_LARGE_BUTTONS);\n };\n\n stop = true;\n while (stop && this.getWidth() > width) {\n stop = this.fold(GROUP_FOLD_MODE.SHRINK_SMALL_BUTTONS);\n };\n if (this.getWidth() > width) this.fold(GROUP_FOLD_MODE.COLLAPSE);\n return this.getWidth() > width;\n };\n return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Развернуть кнопки группы.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#expand\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} Объект типа ToolBarGroup.\n */\n expand: function () {\n if (this.isCollapsed()) {\n var jAddedDiv = this._jObject.find('#addedDiv' + this._index);\n var items = jAddedDiv.children(buttonAndColumnSelector);\n items.appendTo(this._jObject);\n fixSvg(this._jObject[0]);\n jAddedDiv.remove(); //удалять надо после вставки в другое место иначе теряются обработчики событий.\n\n this._jObject.children('.toolbar_group_header').css('display', 'none');\n\n setRealHeightAndWidth();\n var jSmallItems = items.find('.small_toolbar_item');\n items.add(jSmallItems).hover(function () {\n if (!$(this).hasClass('disabled')) {\n $(this).addClass('hover');\n };\n }, function () {\n if (!$(this).hasClass('disabled')) {\n $(this).removeClass('hover');\n };\n });\n this._isCollapsed = false;\n this.fire('expand');\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак свернутой группы.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#isCollapsed\n * @return {boolean} True, если группа свернута, иначе False.\n */\n isCollapsed: function () {\n return this._isCollapsed; //this._jObject.children(groupHeaderSelector).is(\":visible\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить ширину группы.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#getWidth\n * @return {integer} Ширина группы.\n * @since 5.0.0.4104\n */\n getWidth: function () {\n return this._jObject.width();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Имитировать щелчок мыши на кнопке свернутой группы.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#click\n * @throws ERR_CANT_CLICK_ON_EXPANDED_GROUP – метод click поддерживается только для свернутых групп.\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} Объект типа ToolBarGroup.\n */\n click: function (opt_callback) {\n var jHeader = this._jObject.children(groupHeaderSelector);\n\n if (this.isCollapsed()) {\n if ($.isFunction(opt_callback)) {\n this._disableClickHandler(jHeader);\n this.bind(\"click\", opt_callback);\n this.jHeader.bind(\"click\", function () { instance.fire(\"click\"); });\n } else jHeader.click();\n } else global.raise(\"ERR_CANT_CLICK_ON_EXPANDED_GROUP\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить список кнопок текущей группы.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#getButtons\n * @return {WebAccess.current.toolBar.buttons} Список объектов типа ToolBarButton, вложенных в эту группу.\n */\n getButtons: function () {\n var me = this;\n var buttons = global.current.toolBar.buttons.toArray();\n var filteredButtons = {};\n var filtered = _(buttons).filter(function (button) {\n return button.groupName === me.name;\n });\n for (var buttonName in filtered) {\n filteredButtons[filtered[buttonName].name] = filtered[buttonName];\n };\n return new WA.Collection(filteredButtons);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Добавить нижнюю границу к текущей группе.\n *\n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#addBottomBorder\n * @param {string} color CSS-класс цвета нижней границы\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} Объект типа ToolBarGroup.\n * @since 5.0.0.4200\n */\n addBottomBorder: function (color) {\n var me = this;\n var jBottomBorder = me._jObject.children('.' + toolBarBottomBorderClass)\n if (jBottomBorder.length == 0) {\n // Дополнительный div нужен что бы сделать ему position:relative, \n // т.к. у toolbar_group этого сделать нельзя, потому что ломается выпадающий список сгруппированных кнопок.\n // А вообще position:relative нужен что бы в IE7 нормально заработало.\n jBottomBorder = $('
    ');\n me._jObject.prepend(jBottomBorder);\n }\n jBottomBorder.removeClass().addClass(toolBarBottomBorderClass + ' ' + color);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Скрыть следующий за группой разделитель.\n * \n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#hideNextSeparator\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} Объект типа ToolBarGroup.\n * @since 5.0.0.4212\n */\n hideNextSeparator: function () {\n this._jObject.next(separatorSelector).hide();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Показать следующий за группой разделитель.\n * \n * @method WebAccess.components.wrappers.toolBar.ToolBarGroup#showNextSeparator\n * @return {WebAccess.components.wrappers.toolBar.ToolBarGroup} Объект типа ToolBarGroup.\n * @since 5.0.0.4212\n */\n showNextSeparator: function () {\n this._jObject.next(separatorSelector).show();\n return this;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n });\n\n global.components.wrappers.toolBar.ToolBarGroup = ToolBarGroup;\n})(window.WebAccess);",";\"use strict\";\n (function defButtonsCollection(global) {\n\n /**\n * Часто используемые селекторы\n */\n var toolBarConatainerSelector = \"#toolbar_container\";\n var groupSelector = \"div.toolbar_group\";\n var buttonSelector = \"div.toolbar_button\";\n var byNameSelectorTemplate = \"{0}[name='{1}']\";\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Класс-обертка для коллекции кнопок\n * @class WebAccess.components.wrappers.toolBar.Buttons\n * @extends WebAccess.Collecton\n * @since 5.2.0.1600\n */\n var Buttons = global.Collection.extend({\n\n // Список действий и соответствующих им кнопок на ленте.\n _buttonsByActionName: {},\n\n // Список режимов доступности и соответствующих им действий.\n _buttonsByEnabledMode: {},\n\n // Список кнопок, состояние которых изменяется в зависимости от выделения вложений\n _buttonsEnabledOnAttachmentSelection: [],\n\n /**\n * Часто-используемые jQuery объекты\n */\n\n init: function (elements) {\n var me = this;\n me._super(elements);\n\n // Сформировать списки\n me._arr.forEach(function (item) {\n // Действия и соответствующие им кнопки\n var linkedAction = item.getLinkedAction();\n var buttons = null;\n if (linkedAction) {\n buttons = me._buttonsByActionName[linkedAction];\n if (buttons) {\n buttons.push(item);\n } else {\n me._buttonsByActionName[linkedAction] = [item];\n }\n }\n\n // Режимы доступности и соответствующие им кнопки\n var enabledMode = item.getEnabledMode();\n if (enabledMode) {\n buttons = me._buttonsByEnabledMode[enabledMode];\n if (buttons) {\n buttons.push(item);\n } else {\n me._buttonsByEnabledMode[enabledMode] = [item];\n }\n }\n\n // Сформировать список кнопок, состояния которых изменяются в зависимости от выделения элементов\n if (item.getIsEnabledOnAttachnentSelected()) {\n me._buttonsEnabledOnAttachmentSelection.push(item);\n }\n });\n\n me._jToolBarConatainer = $(toolBarConatainerSelector),\n me._jSearchTarget = me._jToolBarConatainer.find(buttonSelector);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создать новую кнопку панели инструментов.\n *\n * @method WebAccess.components.wrappers.toolBar.Buttons#create\n * @param {string} toolGroupName Имя группы кнопок, в которую будет вложена кнопка.\n * @param {string | object} buttonName Имя создаваемой кнопки или объект {name: \"\", text:\"\", action:\"\", icon:\"\"}\n * @param {BUTTON} opt_smallSized Размер кнопки. Возможные значения: LARGE, SMALL\n * @throws ERR_SPECIFIED_BUTTONS_GROUP_DOES_NOT_EXIST – указанной группы кнопок не существует;\n * @throws ERR_BUTTON_NAME_IS_NOT_SPECIFIED – неверно указано имя кнопки;\n * @throws ERR_BUTTON_WITH_THE_SAME_NAME_ALREADY_EXIST – кнопка с указанным именем уже существует.\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton} Объект типа ToolBarButton.\n */\n create: function (toolGroupName, buttonName, opt_smallSized) {\n var me = this;\n if (arguments.length < 2) global.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\");\n var isSmall = opt_smallSized || false;\n var name = \"\";\n var text = L(\"NEW_BUTTON\");\n var action = \"alert(L('WRN_USE_CLICK_OR_BIND_METHODS_TO_SET_THE_ACTION'));\";\n var icon = isSmall ? \"Doc/doc_16.png\" : \"Doc/doc_32.png\";\n var toolTip = text;\n\n if (typeof buttonName == \"object\") {\n //Шабардин П.: Не используется extend потому-что format в качестве шаблонизатора\n name = buttonName.name;\n text = buttonName.text ;\n action = buttonName.action;\n icon = buttonName.icon;\n toolTip = buttonName.toolTip || buttonName.tooltip;\n } else if (typeof buttonName == \"string\") {\n name = buttonName;\n } else global.raise(\"ERR_BUTTON_NAME_IS_NOT_SPECIFIED_PROPERLY\");\n\n var currentGroupSelector = format(byNameSelectorTemplate, groupSelector, toolGroupName);\n var jToolGroup = me._jToolBarConatainer.find(currentGroupSelector);\n\n if (jToolGroup.length > 0) {\n var currentButtonSelector = format(byNameSelectorTemplate, isSmall ? \"div.small_toolbar_item\" : \"div.toolbar_item\", name);\n var jExistingButton = me._jToolBarConatainer.find(currentButtonSelector);\n if (jExistingButton.length > 0) global.raise(\"ERR_BUTTON_WITH_THE_SAME_NAME_ALREADY_EXIST\", name);\n\n if (global.current.toolBar.groups[toolGroupName].isCollapsed()) jToolGroup = jToolGroup.find(\".addedHiddenDiv\");\n\n var buttonClass = isSmall ? \"small_toolbar_item toolbar_button\" : \"toolbar_item toolbar_button\";\n\n var jContainer;\n\n if (isSmall) {\n // Если в этой группе уже есть колонка, кол-вол элементов в которой меньше трех, то конечно добавляем в конец,\n // если нет, то создаем новую колонку и вкладываем в неё\n var jColumn = global.current.toolBar.groups[toolGroupName]._jObject.find(\".toolbar_column:last\");\n if (jColumn.length == 0 || jColumn.find(\".small_toolbar_item\").length == 3) {\n var jColumn = $('
    ');\n jToolGroup.append(jColumn);\n };\n\n jContainer = jColumn;\n } else {\n jContainer = jToolGroup;\n };\n\n // Разные шаблоны для кнопки с svg-иконкой и, ради совместимости, для кнопки с png-иконкой.\n // Начиная с v5.5\n var buttonTemplate = (icon.substr(-4) === \".png\") ? CT.toolBar.button : CT.toolBar.buttonSvg;\n jContainer.append(format(buttonTemplate.replace(/> {1,}<'), name, text, action, icon, buttonClass, toolTip));\n\n var button = new global.components.wrappers.toolBar.ToolBarButton(currentButtonSelector);\n button.isSynthetic = true;\n me.addElement(name, button);\n\n jExistingButton = me._jToolBarConatainer.find(currentButtonSelector);\n jExistingButton.hover(\n function () {\n $(this).addClass(\"hover\");\n },\n function () {\n $(this).removeClass(\"hover\");\n }\n );\n\n if (buttonName['jsaction']) {\n me[name].bind('click', buttonName['jsaction']);\n };\n\n return me[name];\n } else global.raise(\"ERR_SPECIFIED_BUTTONS_GROUP_DOES_NOT_EXIST\", toolGroupName);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удалить кнопку панели инструментов.\n *\n * @method WebAccess.components.wrappers.toolBar.Buttons#remove\n * @param {string} buttonName Имя создаваемой кнопки панели инструментов\n * @return {WebAccess.current.toolBar.buttons} Пространство имен WebAccess.components.wrappers.toolBar.Buttons#\n */\n remove: function (buttonName) {\n var me = this;\n delete me[buttonName];\n me._jToolBarConatainer.find(format(byNameSelectorTemplate, buttonSelector, buttonName)).remove();\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверить наличие кнопки панели инструментов.\n *\n * @method WebAccess.components.wrappers.toolBar.Buttons#isExist\n * @param {string} buttonName Имя кнопки панели инструментов\n * @return {boolean} True, если кнопка существует, иначе False.\n */\n isExist: function (buttonName) {\n var existingButton = $(format(byNameSelectorTemplate, buttonSelector, buttonName));\n return existingButton.length > 0;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить список кнопок панели инструментов, которые зависят от указанного прикладного действия.\n * @function WebAccess.components.wrappers.toolBar.Buttons#getButtonsByActionName\n * @param {string} actionName Наименование прикладного действия.\n * @returns {array} Массив кнопок панели инструментов, которые зависят от указанного прикладного действия.\n */\n getButtonsByActionName: function (actionName) {\n var buttons = this._buttonsByActionName[actionName.toLowerCase()];\n return buttons ? buttons : [];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить список кнопок панели инструментов по режиму доступности.\n * @function WebAccess.components.wrappers.toolBar.Buttons#getButtonsByEnabledMode\n * @param {ACTION_ENABLED_MODE} enabledMode Режим доступности действия.\n * @returns {array} Массив кнопок панели инструментов, для которых установлен соответствующий режим доступности.\n */\n getButtonsByEnabledMode: function (enabledMode) {\n var buttons = this._buttonsByEnabledMode[enabledMode];\n return buttons ? buttons : [];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить список кнопок панели инструментов, состояния которых изменяются в зависимости от выделения вложений.\n * @function WebAccess.components.wrappers.toolBar.Buttons#getButtonsEnabledOnAttachmentSelection\n * @returns {array} Массив кнопок панели инструментов, состояния которых изменяются в зависимости от выделения вложений.\n */\n getButtonsEnabledOnAttachmentSelection: function () {\n return this._buttonsEnabledOnAttachmentSelection;\n }\n });\n\n global.components.wrappers.toolBar.Buttons = Buttons;\n\n})(window.WebAccess);\n",";\"use strict\";\r\n(function defGroupsCollection(global) {\r\n\r\n /**\r\n * Часто используемые селекторы\r\n */\r\n var toolBarConatainerSelector = \"#toolbar_container\";\r\n var groupSelector = \"div.toolbar_group\";\r\n var buttonSelector = \"div.toolbar_button\";\r\n var byNameSelectorTemplate = \"{0}[name='{1}']\";\r\n //------------------------------------------------------------------------//\r\n\r\n /**\r\n * Обертка для коллекции кнопок\r\n * \r\n * @class WebAccess.components.wrappers.toolBar.Groups\r\n * @extends WebAccess.Collecton\r\n * @since 5.2.0.1600\r\n */\r\n var Groups = global.Collection.extend({\r\n\r\n /**\r\n * Часто-используемые jQuery объекты\r\n */\r\n init: function (elements) {\r\n var me = this;\r\n me._super(elements);\r\n\r\n me._jToolBarConatainer = $(toolBarConatainerSelector),\r\n me._jSearchTarget = me._jToolBarConatainer.find(buttonSelector);\r\n },\r\n //----------------------------------------------------------------------//\r\n\r\n /**\r\n * Создает новую группу кнопок панели инструментов.\r\n *\r\n * @method WebAccess.components.wrappers.toolBar.Groups#create\r\n * @param {string | object} toolGroupName Имя группы кнопок или объект {name: \"\", label:\"\", action:\"\", icon:\"\"}\r\n * @param {string} toolGroupNameToAppendAfter Имя существующей группы кнопок на ленте, после которой вставится новая группа\r\n * @throws ERR_GROUP_NAME_IS_NOT_SPECIFIED_PROPERLY – Неверно указано имя группы.\r\n * @throws ERR_GROUP_WITH_THE_SAME_NAME_ALREADY_EXIST – Группа с указанным именем уже существует.\r\n * @return {WebAccess.components.wrappers.toolBar.ToolBarButton} Объект типа ToolBarButton.\r\n */\r\n create: function (toolGroupName, toolGroupNameToAppendAfter) {\r\n var me = this;\r\n var jToolBar = me._jToolBarConatainer.children(\"span\").first();\r\n\r\n var name = \"\";\r\n var text = L(\"NEW_GROUP\");\r\n var label = L(\"NEW_GROUP\");\r\n var icon = \"Doc/unknown_32.png\";\r\n\r\n if (typeof toolGroupName == \"object\") {\r\n //Шабардин П.: Не используется extend потому-что format в качестве шаблонизатора\r\n name = toolGroupName.name;\r\n label = toolGroupName.label;\r\n icon = toolGroupName.icons;\r\n } else if (typeof toolGroupName == \"string\") {\r\n name = toolGroupName;\r\n } else {\r\n global.raise(\"ERR_GROUP_NAME_IS_NOT_SPECIFIED_PROPERLY\");\r\n }\r\n\r\n var jExistingGroup = $(format(byNameSelectorTemplate, groupSelector, name));\r\n if (jExistingGroup.length > 0) global.raise(\"ERR_GROUP_WITH_THE_SAME_NAME_ALREADY_EXIST\", name);\r\n\r\n if (typeof toolGroupNameToAppendAfter == \"string\") {\r\n if (toolGroupNameToAppendAfter === '') {\r\n jToolBar.prepend(format(ControlTemplate.toolBar.group, name, label, icon));\r\n var firstChild = jToolBar.children().eq(0);\r\n // Если это разделитель перемещаем его после группы, т.к. в шаблоне этот разделитель всегда слева.\r\n if (firstChild.hasClass('toolbar_separator')) {\r\n jToolBar.find(\"[name='\" + name + \"']\").after(firstChild);\r\n }\r\n } else {\r\n var jBeforeGroup = jToolBar.find(\"[name='\" + toolGroupNameToAppendAfter + \"']\");\r\n if (jBeforeGroup.length) {\r\n jToolBar.find(\"[name='\" + toolGroupNameToAppendAfter + \"']\").after(format(ControlTemplate.toolBar.group, name, label, icon));\r\n } else {\r\n global.raise(\"ERR_SPECIFIED_BUTTONS_GROUP_DOES_NOT_EXIST\");\r\n }\r\n }\r\n } else {\r\n jToolBar.append(format(ControlTemplate.toolBar.group, name, label, icon));\r\n }\r\n me.addElement(name, new global.components.wrappers.toolBar.ToolBarGroup(format(byNameSelectorTemplate, groupSelector, name)));\r\n return me[name];\r\n },\r\n //----------------------------------------------------------------------//\r\n\r\n /**\r\n * Проверяет наличие группы кнопок панели инструментов.\r\n *\r\n * @method WebAccess.components.wrappers.toolBar.Groups#isExist\r\n * @param {string} toolGroupName Имя группы кнопок\r\n * @return {boolean} True, если группа кнопок существует, иначе False.\r\n */\r\n isExist: function (toolGroupName) {\r\n var existingGroup = $(format(byNameSelectorTemplate, groupSelector, toolGroupName));\r\n return existingGroup.length > 0;\r\n }\r\n //----------------------------------------------------------------------//\r\n });\r\n\r\n global.components.wrappers.toolBar.Groups = Groups;\r\n\r\n})(window.WebAccess);","\"use strict\";\n\n/**\n* Закладка боковой панели.\n* \n* @class WebAccess.components.wrappers.sideBar.Tab\n* @extends BasePageElement\n* @property {string} name Имя закладки\n* @property {string} selector Путь в DOM-иерархии к объекту группы, например div.content#container\n* @property isSynthetic {boolean} Признак, указывающий на то, что закладка была создана средствами API\n* @param {string} itemSelector Cуществующий элемент страницы\n*/\n(function (global) {\n\n /**\n * Часто используемые селекторы\n */\n var sideBarConatainerSelector = \"#card_left_container\";\n var tabSelector = \"div.tab_item\";\n var cardFormTabTemplate = '#CardForm_Tab_{0}';\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Частоиспользуемые jQuery объекты\n */\n var jSideBarConatainer = $(sideBarConatainerSelector);\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n var Tab = WebAccess.components.wrappers.BasePageElement.extend({\n _current: null,\n dfmName: '',\n\n init: function (itemSelector, opt_current) {\n var me = this;\n me._current = opt_current.current;\n\n if (me._current && me._current.sideBar) {\n me._jObject = me._current.sideBar._jSideBar.find(itemSelector);\n } else {\n me._jObject = $(itemSelector);\n }\n\n me._super(me._jObject);\n me.selector = format(me._byNameSelectorTemplate, tabSelector, me.name);\n me.dfmName = me._jObject.data('name');\n\n // Заново рассчитаем положение закладок в сайдбаре при их изменении. \n me.bind('change', function (e) {\n if (me._current && me._current.sideBar) {\n var sidebar = me._current.sideBar;\n sidebar.setOrientation(sidebar.isVertical() ? ORIENTATION.VERTICAL : ORIENTATION.HORIZONTAL);\n }\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: \"Tab\",\n isSynthetic: false,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Заполнение закладки произвольным контентом\n * \n * @method WebAccess.current.sideBar.tabs.tab#setHtml\n * @param {string} html - текст html разметки\n * @return {Tab}\n */\n setHtml: function (html) {\n if (global.getLocation() != \"explorer\") {\n if (this._jObject.hasClass(\"inline_tab\") && !this.isSynthetic) {\n if (this.name == \"Card\") {\n $(\"#CardForm_Tab_Card\").html(html);\n } else {\n var id = this._jObject.attr(\"id\");\n var num = id.substr(id.length - 1);\n $(\"#CardForm_Tab_\" + num).html(html);\n }\n } else {\n $(format(cardFormTabTemplate, this.name)).html(html);\n };\n } else {\n if (this._current && this._current.className === 'Current') { //Все исключительные ситуации ниже для совместимости и равнозначности всех закладок.\n switch (this.name) {\n case \"FldTree\":\n $(\"#ctl00_LeftContentPlaceHolder_TreeDiv\").html(html);\n break;\n default:\n $(\"#Search\").children(\"#\" + this.name).html(html);\n }\n }\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n click: function (opt_callback) {\n if ($.isFunction(opt_callback)) {\n this.unbind(\"click\");\n };\n this._super(opt_callback);\n },\n\n /**\n * Скрытие закладки\n * \n * @method WebAccess.current.sideBar.tabs.tab#setHtml\n * @return {Tab}\n */\n hide: function () {\n this._super();\n if (this._jObject.hasClass(\"last\")) this._jObject.removeClass(\"last\").prev(\"div\").addClass(\"last\");\n return this;\n },\n\n /** \n * Показ закладки\n * \n * @method WebAccess.current.sideBar.tabs.tab#show\n * @return {Tab}\n */\n show: function () {\n this._super();\n if (this._jObject.prev().hasClass(\"last\")) this._jObject.addClass(\"last\").prev(\"div\").removeClass(\"last\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Скрытие закладки\n * \n * @method WebAccess.current.sideBar.tabs.tab#enable\n * @return {Tab}\n */\n enable: function () {\n var me = this;\n me._super();\n if (!me.isSynthetic) me._jObject.bind(\"click\", function () {\n me._current.sideBar.tabs._defaultClickHandler(me, me.name, me.selector);\n });\n return me;\n },\n\n /** \n * Является ли закладка скрытой\n * \n * @method WebAccess.current.sideBar.tabs.tab#isVisible\n * @return {boolean} true - закладка отображается, false - закладка скрыта\n */\n isVisible: function () {\n return this._jObject.is(':visible');\n }\n\n });\n\n global.components.wrappers.sideBar.Tab = Tab;\n})(window.WebAccess);\n","\"use strict\";\n\n(function (global) {\n\n /**\n * Класс-обертка для коллекции закладок\n * @class WebAccess.components.wrappers.sideBar.Tabs\n * @extends WebAccess.Collecton\n * @since 5.2.0.1600 \n */\n var Tabs = global.Collection.extend({\n _tabSelector: 'div.tab_item',\n _byNameSelectorTemplate: '{0}[name=\"{1}\"]',\n _cardFormTabTemplate: '#CardForm_Tab_{0}',\n _cardFormTabSelector: 'div.CardForm_Tab',\n _cssClass: 'tab_item',\n _noCardFormAtStartFound: false,\n _current: null,\n\n init: function (elements, sideBarConatainerSelector, opt_current) {\n var me = this;\n me._super(elements);\n me._current = opt_current;\n me._jSideBarConatainer = $(sideBarConatainerSelector);\n me._jPlaceHolder = me._jSideBarConatainer.find(\"span:first\");\n\n me._jCardForm = $(\".CardForm, .FakeCardForm\");\n me._jScroller = $(\"#scroller\");\n me._jAfterTabs = $(\".after_tabs\");\n me._jSideBar = $('#card_left_container');\n me._actualizeCurrentOnClick();\n\n // Подписываемся на изменение активной вкладки.\n if (me._current && me._current.sideBar) {\n var currentSidebar = me._current.sideBar;\n currentSidebar.bind(currentSidebar['class'].EVENT.AFTER_TAB_SWITCH, function () {\n me._updateCurrentSelectedTab();\n });\n }\n\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n /**\n * Слежение за тем, какая закладка текущая\n * @private\n */\n _actualizeCurrentOnClick: function () {\n var me = this;\n me._jSearchTarget = me._jSideBarConatainer.bind('click', function () {\n me._updateCurrentSelectedTab();\n });\n me._updateCurrentSelectedTab();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n /**\n * Слежение за тем, какая закладка текущая\n * @private\n */\n _updateCurrentSelectedTab: function () {\n var me = this;\n me._jSelectedTab = me._jSideBarConatainer.find(me._tabSelector + '.selected');\n if (!me._jSelectedTab.length)\n me._jSelectedTab = me._jSideBarConatainer.find(me._tabSelector + '.first');\n var name = me._jSelectedTab.attr('name') || me._jSelectedTab.data('name');\n me.current = me[name];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создать новую закладку боковой панели.\n * \n * @method WebAccess.components.wrappers.sideBar.Tabs#create\n * @param {string|object} tabName Имя закладки или объект \n * {name: \"\", label:\"\", action:\"\", icon:\"\"}\n * @throws ERR_TAB_NAME_IS_NOT_SPECIFIED_PROPERLY – неверно указанно имя закладки;\n * @throws ERR_TAB_WITH_THE_SAME_NAME_ALREADY_EXIST – закладка с указанным\n * именем уже существует.\n * @return {WebAccess.components.wrappers.sideBar.Tab} Объект типа Tab. \n */\n create: function (tabName) {\n var me = this;\n\n var name = \"\";\n var label = L(\"NEW_TAB\");\n var icon = \"Doc/doc_32.png\";\n var toolTip = label;\n\n if (typeof tabName == \"object\") {\n name = tabName.name || tabName.id;\n label = tabName.label || tabName.text;\n icon = tabName.icon || icon;\n toolTip = tabName.toolTip || tabName.tooltip;\n } else if (typeof tabName == \"string\") {\n name = tabName;\n } else global.raise(\"ERR_TAB_NAME_IS_NOT_SPECIFIED_PROPERLY\");\n\n me._currentTabSelector = format(me._byNameSelectorTemplate, me._tabSelector, name);\n me._jExistingTab = me._jSideBarConatainer.find(me._currentTabSelector);\n\n if (me._jExistingTab.length > 0) {\n global.raise(\"ERR_TAB_WITH_THE_SAME_NAME_ALREADY_EXIST\", name);\n };\n\n var template = format(ControlTemplate.sideBar.tab, name, label, icon, me._cssClass, toolTip);\n\n if (me._jPlaceHolder.find('.more').length) {\n me._jAfterTabs.append(template);\n } else {\n me._jPlaceHolder.append(template);\n }\n\n me._jSideBarConatainer.find(me._currentTabSelector).addClass(\"last\")\n .prev().removeClass(\"last\");\n\n this._preparePage(name);\n\n\n var tab = new global.components.wrappers.sideBar.Tab(me._currentTabSelector, me._current);\n\n\n tab.bind('click', function () { me._defaultClickHandler(this, name, me._currentTabSelector) });\n tab.isSynthetic = true;\n\n tab.setHtml(format(ControlTemplate.form.tabHelp, L(\"NEW_TAB\"), L(\"WRN_USE_SET_HTML_HELP_TEXT\"), L(\"OM_HELP_HYPERLINK\")));\n me.addElement(name, tab);\n\n if (tabName['jsaction']) {\n tab.bind('click', tabName['jsaction']);\n };\n return tab;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Устанавливает обработку события щелчка, для измененной DOM структуры.\n *\n * @private \n * @method WebAccess.components.wrappers.sideBar.Tabs#_bindOpenHandler\n * @property tabName имя закладки\n */\n _bindOpenHandler: function (tabName) {\n var me = this;\n me._current.sideBar.tabs.current.click(function (tabName) {\n var currentTabSelector = format(me._byNameSelectorTemplate, me._tabSelector, tabName);\n me._openHandler(tabName, currentTabSelector);\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Новые кнопки тоже должны уметь делать expand/collapse\n * @private\n */\n _defaultClickHandler: function (element, name, currentTabSelector) {\n var me = this;\n if (name !== \"FldTree\" && name !== \"Run\") me._openHandler(name, currentTabSelector);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выбор активной закладки/\n *\n * @private\n * @method WebAccess.components.wrappers.sideBar.Tabs#_openHandler\n * @property tabName имя закладки\n * @property me._tabSelector селектор закладки\n */\n _openHandler: function (tabName, targetTabSelector) {\n var me = this;\n me._jCardForm.find(me._cardFormTabSelector).hide();\n $(me._tabSelector).removeClass('selected');\n me._jSideBarConatainer.find(targetTabSelector).addClass('selected');\n if (me._current.className !== \"FormDialog\") {\n window.location.hash = tabName;\n }\n me._jCardForm.find(format(me._cardFormTabTemplate, tabName)).show();\n\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создает имитацию поддержки табов, там где карточки не существует. \n * Для возможности переключения табов.\n *\n * @private \n * @method WebAccess.components.wrappers.sideBar.Tabs#_preparePage\n * @param {string} name\n */\n _preparePage: function (name) {\n\n var me = this;\n if (me._current.sideBar.tabs.hasOwnProperty(\"current\")) {\n var currentTabName = me._current.sideBar.tabs.current.name;\n //Если изначально поддержки табов не было, сделаем их сами.\n if (me._jCardForm.length == 0) {\n me.noCardFormAtStartFound = true;\n if (me._jScroller.children(\"div\").length === 1) {\n //Если справочник, но закладка без формы\n me._jScroller.children(\"div\").addClass(\"FakeCardForm\");\n } else {\n //Если мы в ЗЗУ\n me._jScroller.wrapInner('
    ');\n me._jScroller.wrapInner('
    ');\n }\n };\n\n me._jCardForm = $(\".CardForm, .FakeCardForm\");\n\n //Если содержимое текущей закладки не обернуто в div для таба\n if ($(me._cardFormTabSelector).length == 0) {\n me._jCardForm.wrapInner('
    ');\n //jCardForm.addClass('CardForm_Tab').attr('id', 'CardForm_Tab_' + currentTabName);\n this._bindOpenHandler(currentTabName);\n };\n\n if (!me._current.sideBar.tabs.current._jObject.hasClass(\"inline_tab\")) {\n this._bindOpenHandler(currentTabName);\n }\n var template = format(ControlTemplate.form.tab, name);\n me._jCardForm.append(template);\n if (me.noCardFormAtStartFound) me._jCardForm.find(format(me._cardFormTabTemplate, name)).addClass(\"basic_padding\");\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверить наличие закладки боковой панели.\n * \n * @method WebAccess.components.wrappers.sideBar.Tabs#isExist\n * @param tabName Имя закладки\n * @return {boolean} True, если закладка существует, иначе False.\n */\n isExist: function (tabName) {\n var me = this;\n\n var selector = format(me._byNameSelectorTemplate, me._tabSelector, tabName);\n me._jExistingTab = me._jSideBarConatainer.find(selector);\n return me._jExistingTab.length > 0;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n global.components.wrappers.sideBar.Tabs = Tabs;\n\n})(window.WebAccess);","\"use strict\";\n\n (function (global) {\n\n var cssClass = \"sidebar_item\";\n\n \n /**\n * Класс-обертка для коллекции закладок\n * @class WebAccess.components.wrappers.sideBar.Tabs\n * @extends WebAccess.Collecton\n * @since 5.2.0.1600 \n */\n var _ExplorerTabs = global.components.wrappers.sideBar.Tabs.extend({\n\n _tabSelector: 'div.explorer-search-panel__item',\n _byNameSelectorTemplate: '{0}[name=\"{1}\"]',\n\n \n /**\n * Новые кнопки тоже должны уметь делать expand/collapse\n * @private\n */\n _defaultClickHandler: function (element, name, currentTabSelector) {\n var me = this;\n // обработка двойного клика - сворачивание - разворачивание. \n var index = $(me._tabSelector).index(element);\n\n if (window.nowSelect == index) {\n if (!me._current.sideBar.isCollapsed()) me._current.sideBar.collapse();\n else me._current.sideBar.expand();\n }\n else {\n window.nowSelect = index;\n me._current.sideBar.expand();\n }\n if (name !== \"FldTree\" && name !== \"Run\") CustomSearch(name, this); \n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверить наличие закладки боковой панели.\n * \n * @method WebAccess.components.wrappers.sideBar.Tabs#isExist\n * @param tabName Имя закладки\n * @return {boolean} True, если закладка существует, иначе False.\n */\n isExist: function (tabName) {\n var me = this;\n\n var selector = format(byNameSelectorTemplate, me._tabSelector, tabName);\n me._jExistingTab = me._jSideBarConatainer.find(selector);\n return me._jExistingTab.length > 0;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Создать новую закладку боковой панели.\n **/\n // TODO: Возможность создавать закладки временно отключена.\n create: function (tabName) { return; }\n\n });\n\n global.components.wrappers.sideBar._ExplorerTabs = _ExplorerTabs;\n\n})(window.WebAccess);","; \"use_strict\";\n(function defSideBar(global) {\n\n var cssClass = \"tab_item\";\n\n /**\n * Часто используемые селекторы\n */\n var noCardFormAtStartFound = false;\n\n var tabSelector = \"div.tab_item\";\n var byNameSelectorTemplate = \"{0}[name='{1}']\";\n var cardFormTabTemplate = '#CardForm_Tab_{0}';\n var cardFormTabSelector = 'div.CardForm_Tab';\n\n /**\n * У проводника немного другая верстка\n */\n /*if (global.getLocation() == \"explorer\") {\n sideBarConatainerSelector = \"#sidebar_container\";\n tabSelector = \"div.sidebar_item\";\n cssClass = \"sidebar_item\";\n }*/\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Частоиспользуемые jQuery объекты\n */\n\n /**\n * Класс-обертка для панели закладок\n * @class WebAccess.components.wrappers.sideBar.SideBar\n * @since 5.2.0.1600\n */\n var SideBar = BaseObject.extend({\n _jContainer: null,\n _current: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (containerSelector, current) {\n var me = this;\n me._current = current;\n me._jSideBar = $(containerSelector);\n me._jAfterTabs = me._jSideBar.find(\".after_tabs\");\n me._super();\n\n\n // Не появляется горизонтальный скроллинг в детальном разделе, пока не\n // пошевелишь колонки\n // #106665\n // Это может быть медленно, особенно где много вкладок и таблиц\n me.bind(me['class'].EVENT.AFTER_TAB_SWITCH, function () {\n _(me._current._getGrids()).each(function (grid) {\n grid.grid.resizeCanvas();\n\n // #106257 Поле в детальном разделе не становится активным. Помогает обновление страницы\n grid.grid.resetActiveCell();\n });\n });\n\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Логика сворачивания / разорачивания горизонтальных закладок в кнопку еще.\n *\n * @function WebAccess.components.wrappers.sideBar.SideBar#_fitHorizontalTabs\n * @private\n * @since 5.2.0.1600\n * @return {WebAccess.current.sideBar}\n */\n _fitHorizontalTabs: global.TCD(function () {\n var me = this;\n if (me._jSideBar.length > 0) {\n return this._fitTabs('outerWidth', Math.min(windowWidth(), me._jSideBar.width())); //В карточке ЗЗУ есть вложения, которые уменьшают область горизонтальных вкладок.\n };\n return false;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Логика сворачивания / разорачивания вертикальных закладок в кнопку Еще.\n *\n * @function WebAccess.components.wrappers.sideBar.SideBar#_fitVerticalTabs\n * @private\n * @since 5.2.0.1600\n * @return {WebAccess.current.sideBar}\n */\n _fitVerticalTabs: global.TCD(function () {\n var me = this;\n if (me._jSideBar.length > 0) {\n return this._fitTabs('outerHeight', me._current._getAvailableHeight())\n }\n return false;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Подсчет ширины или высоты всех закладок.\n *\n * @function WebAccess.components.wrappers.sideBar.SideBar#_getSideBarSize\n * @since 5.2.0.1600\n * @private\n * @param {object} jSideBar - контейнер сайдбара\n * @param {string} sizeName - измерение (доступные значения: 'outerWidth', 'outerHeight').\n * @return {integer} ширина сайдбара\n */\n _getSideBarSize: function (sizeName) {\n var me = this;\n var sideBarSize = 0;\n\n me._jSideBar.find('span:first').find(tabSelector).each(function () {\n sideBarSize += $.fn[sizeName].call($(this), true);\n });\n\n if (!this.isVertical()) sideBarSize += $(\".more\").width();\n return sideBarSize;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение ширины или высоты последней нескрытой закладки (не учитывая закладку \"Еще\").\n *\n * @function WebAccess.components.wrappers.sideBar.SideBar#_getLastTabSize\n * @since 5.2.0.1600\n * @private\n * @param {object} jSideBar - контейнер сайдбара\n * @param {string} sizeName - измерение (доступные значения: 'outerWidth', 'outerHeight').\n * @return {integer}\n */\n _getLastTabSize: function (sizeName) {\n var me = this;\n var tabs = me._jSideBar.find('span:first').find(tabSelector);\n return $.fn[sizeName].call(tabs.not('.more').last(), true);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Логика сворачивания / разворачивания закладок в кнопку \"Еще\".\n *\n * @function WebAccess.components.wrappers.sideBar.SideBar#_fitTabs\n * @private\n * @since 5.2.0.1600\n * @param {string} sizeName - измерение (доступные значения: 'outerWidth', 'outerHeight').\n * @param {integer} availableSize - доступная максимальная величина измерения.\n * @return {WebAccess.current.sideBar}\n */\n _fitTabs: global.TCD(function (sizeName, availableSize) {\n var me = this;\n me._current.states.tabs.done(function () {\n var sideBarSize = me._getSideBarSize(sizeName);\n\n var jMore = me._jSideBar.find('div.more');\n\n var stop = true;\n if (availableSize < sideBarSize) {\n var moreSize = 0;\n if (me.isVertical()) {\n moreSize = $.fn[sizeName].call(jMore, true);\n if (me._jAfterTabs.find(tabSelector).length > 0 && jMore.length > 0) {\n moreSize = 0;\n }\n }\n\n while (stop && (availableSize < sideBarSize - moreSize)) {\n stop = me.collapse();\n jMore = me._jSideBar.find('div.more');\n sideBarSize = me._getSideBarSize(sizeName);\n if (me.isVertical() && jMore.width() > 0) { moreSize = 0; }\n };\n } else {\n var lastSize = me._getLastTabSize(sizeName);\n var moreSize = $.fn[sizeName].call(jMore, true);\n while (stop && (availableSize > sideBarSize + lastSize)) {\n stop = me.expand();\n lastSize = me._getLastTabSize(sizeName);\n sideBarSize = me._getSideBarSize(sizeName);\n };\n };\n });\n return me;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Восстановить спрятанные закладки\n * Спрятать кнопку \"Еще\".\n *\n * @private\n * @method WebAccess.components.wrappers.sideBar.SideBar#_internalExpand\n * @since 5.2.0.1600\n * @return {boolean} имеется ли возможность дальнейшего разворачивания\n */\n _internalExpand: global.TCD(function (jSideBar) {\n var me = this;\n var firstTab = me._jAfterTabs.find(tabSelector + \":first\");\n var prevId = firstTab.data('prevId');\n\n\n if (prevId) $('#' + prevId).after(firstTab);\n else me._jSideBar.find(tabSelector + \":first\").before(firstTab);\n\n //Когда скрыт всего один элемент, смысла в кнопке еще нет.\n var tabsLeft = me._jAfterTabs.find(tabSelector);\n if (tabsLeft.length === 1) {\n me._internalExpand();\n };\n\n var firstTab = me._jAfterTabs.find(tabSelector + \":first\");\n if (firstTab.length == 0) {\n if (!!this.tabs[\"More\"]) {\n //this.tabs[\"More\"].hide();\n me.tabs[\"More\"]._jObject.remove();\n delete me.tabs[\"More\"];\n }\n return false;\n }\n return true;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать кнопку \"Еще\".\n * Спрятать все, что не влазит в неё.\n * Создать выпадющее меню по аналогии с группами.\n *\n * @since 5.2.0.1600\n * @private\n * @method WebAccess.components.wrappers.sideBar.SideBar#_internalCollapse\n * @return {boolean} имеется ли возможность дальнейшего сворачивания\n */\n _internalCollapse: global.TCD(function () {\n var me = this;\n\n if (!me.tabs[\"More\"]) {\n\n me.tabs.create(\"More\")\n .setLabel(L(\"MORE_TABS\"))\n .setTooltip(L(\"OTHER_TABS\"))\n .setIcon(\"ToolbarAndTab/More.png\")\n .click($.noop);\n\n me.tabs[\"More\"]._jObject.click(function (e) {\n e.stopPropagation();\n me._jAfterTabs.toggleClass(\"hidden\");\n\n var jLeftColumn = me._jSideBar;\n if (jLeftColumn.hasClass('horizontal')) {\n var left = $(this).offset().left;\n var afterTabsWidth = me._jAfterTabs.width();\n\n if (left + afterTabsWidth > windowWidth()) {\n left = windowWidth() - afterTabsWidth - 10;\n }\n me._jAfterTabs.css({ 'left': left });\n } else {\n var top = $(this).position().top;// + $(this).parents('.ui-dialog-content').scrollTop() - $(this).outerHeight()/2;\n var left = me.tabs[\"More\"]._jObject.outerWidth();\n\n var width = 0;\n var jTabs = me._jAfterTabs.find(tabSelector);\n\n jTabs.last().css({ 'marginRight': 0 });\n jTabs.each(function () {\n width += $(this).outerWidth(true);\n })\n me._jAfterTabs.css({ 'top': top, 'width': width, 'left': left });\n }\n $('.CardForm').redraw(); //#106605\n });\n\n } else {\n this.tabs[\"More\"].show();\n };\n\n var jMore = me._jSideBar.find(this.tabs[\"More\"].selector).addClass(\"more\");\n var lastTab = jMore.prev(tabSelector);\n if (lastTab.length < 1) return false;\n\n if (lastTab.hasClass('selected')) {\n lastTab = lastTab.prev(tabSelector);\n if (lastTab.length < 1) return false;\n }\n\n lastTab.data('prevId', lastTab.prev().attr('id'));\n me._jAfterTabs.prepend(lastTab);\n\n return true;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Развернуть содержимое закладок или дерево задач в проводнике.\n * В карточках объектов пошагово переносит скрытые закладки с закладки «Еще» на боковую панель.\n *\n * @method WebAccess.components.wrappers.sideBar.SideBar#expand\n */\n expand: global.TCD(function () {\n return this._internalExpand();\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Свернуть содержимое закладок или дерево папок в проводнике.\n * В карточках объектов пошагово переносит закладки с боковой панели на закладку «Еще».\n * @method WebAccess.components.wrappers.sideBar.SideBar#collapse\n * @param {string} tabName Имя закладки\n * @return {WebAccess.current.sideBar | boolean} True – имеется возможность свернуть содержимое закладок, иначе False.\n */\n collapse: global.TCD(function () {\n return this._internalCollapse();\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверить, свернута ли боковая панель.\n *\n * @method WebAccess.components.wrappers.sideBar.SideBar#isCollapsed\n * @param {String} tabName Имя закладки\n * @since 5.2.0.1600\n */\n isCollapsed: function () {\n var me = this;\n return !$(\"#tree_container\").is(\":visible\"); //FIXME\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Изменить расположение боковой панели.\n *\n\n * @method WebAccess.components.wrappers.sideBar.SideBar#setOrientation\n * @todo проверить в разных местах, например в проводнике, мастерах\n * @fixme с иконками в обратную сторону пока плохо.\n * @param {ORIENTATION} orientation Режим расположения боковой панели.\n * Возможные значения:HORIZONTAL – горизонтальное; VERTICAL – вертикальное.\n * @since 5.2.0.1600\n * @example\n *\n * //Установить горизонтальное расположение боковой панели.\n * WA.CR.sideBar.setOrientation(ORIENTATION.HORIZONTAL)\n */\n setOrientation: function (orientation) {\n var me = this;\n\n if (orientation == ORIENTATION.HORIZONTAL) {\n me._jSideBar.removeClass(\"vertical\").addClass(\"horizontal\");\n $(\"#right_column\").addClass(\"no_margin\");\n me._jSideBar.find(tabSelector + \" p\").each(function () {\n var smallIcon = $(this).data('smallicon');\n $(this).removeClass().addClass(smallIcon);\n });\n\n this._fitHorizontalTabs();\n } else {\n me._jSideBar.addClass(\"vertical\").removeClass(\"horizontal\");\n\n $(\"#right_column\").removeClass(\"no_margin\");\n me._jSideBar.find(tabSelector + \" p\").each(function () {\n var icon = $(this).data('icon');\n $(this).removeClass().addClass(icon);\n });\n\n this._fitVerticalTabs();\n this.moveSidebarToLeftColumn();\n };\n\n // Скрывает панель \"Еще\".\n $('body').off('click.tabs').on('click.tabs', function () {\n me._jAfterTabs.addClass(\"hidden\");\n });\n\n // Сворачивает вкладки в \"Еще\" при изменении размеров экрана.\n $(window).bind('resizeEnd', function () {\n me._jAfterTabs.addClass(\"hidden\");\n if (me._jSideBar.hasClass(\"horizontal\")) {\n me._fitHorizontalTabs();\n } else {\n me._fitVerticalTabs();\n };\n });\n\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверить, вертикально ли распологается боковая панель.\n *\n * @method WebAccess.components.wrappers.sideBar.SideBar#isVertical\n * @since 5.0.0.4206\n * @return {boolean} True – боковая панель располагается вертикально, иначе False.\n */\n isVertical: function () {\n var me = this;\n return !$(\"#left_column\").hasClass(\"horizontal\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить первоначальное положение закладок боковой панели.\n *\n * @method WebAccess.components.wrappers.sideBar.SideBar#moveSidebarToLeftColumn\n * @since 5.2.0.1600\n */\n //\n moveSidebarToLeftColumn: function () {\n var me = this;\n var jLeftColumn = $('#left_column');\n var jRightColumn = $('#right_column');\n // Перенос.\n jRightColumn.before(jLeftColumn);\n // Корректируем стили левой колонки.\n //jLeftColumn.css({ 'width': '', 'marginRight': '' }); //FIXME: проверить на планшетах\n // Корректируем размер полей текста ЗЗУ.\n if (typeof (initSavedTextHeight) !== 'undefined') initSavedTextHeight();\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n }, {\n EVENT: {\n /**\n * Срабатывает до смены закладки\n * @event WebAccess.components.wrappers.sideBar.SideBar.EVENT.BEFORE_TAB_SWITCH\n * @param {WebAccess.components.wrappers.sideBar.Tab} закладка,\n * на которую произошло переключение\n * @since 5.2.0.1304\n */\n BEFORE_TAB_SWITCH: 'beforeTabSwitch',\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Срабатывает после смены закладки\n * @event WebAccess.components.wrappers.sideBar.SideBar.EVENT.AFTER_TAB_SWITCH\n * @param {WebAccess.components.wrappers.sideBar.Tab} закладка,\n * на которую произошло переключение\n * @since 5.2.0.1304\n */\n AFTER_TAB_SWITCH: 'afterTabSwitch'\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n }\n }\n );\n\n WA.CMP.wrappers.sideBar.SideBar = SideBar;\n\n})(window.WA);\n","; \"use_strict\";\n(function defSideBar(global) {\n\n var cssClass = \"tab_item\";\n\n /**\n * Часто используемые селекторы\n */\n var noCardFormAtStartFound = false;\n\n var tabSelector = \"div.tab_item\";\n var byNameSelectorTemplate = \"{0}[name='{1}']\";\n var cardFormTabTemplate = '#CardForm_Tab_{0}';\n var cardFormTabSelector = 'div.CardForm_Tab';\n\n /**\n * У проводника немного другая верстка\n */\n /*if (global.getLocation() == \"explorer\") {\n sideBarConatainerSelector = \"#sidebar_container\";\n tabSelector = \"div.sidebar_item\";\n cssClass = \"sidebar_item\";\n }*/\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Частоиспользуемые jQuery объекты\n */\n\n /**\n * Класс-обертка для панели закладок\n * @class WebAccess.components.wrappers.sideBar.SideBar\n * @since 5.2.0.1600 \n */\n var _ExplorerSideBar = WA.CMP.wrappers.sideBar.SideBar.extend({\n _jContainer: null,\n _current: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Логика сворачивания / разорачивания горизонтальных закладок в кнопку еще.\n *\n * @function WebAccess.components.wrappers.sideBar.SideBar#_fitHorizontalTabs\n * @private\n * @since 5.2.0.1600\n * @return {WebAccess.current.sideBar}\n */\n _fitHorizontalTabs: global.TCD(function () {\n return false;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Логика сворачивания / разорачивания вертикальных закладок в кнопку Еще.\n *\n * @function WebAccess.components.wrappers.sideBar.SideBar#_fitVerticalTabs\n * @private\n * @since 5.2.0.1600\n * @return {WebAccess.current.sideBar}\n */\n _fitVerticalTabs: global.TCD(function () {\n return false;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Подсчет ширины или высоты всех закладок.\n *\n * @function WebAccess.components.wrappers.sideBar.SideBar#_getSideBarSize\n * @since 5.2.0.1600\n * @private\n * @param {object} jSideBar - контейнер сайдбара\n * @param {string} sizeName - измерение (доступные значения: 'outerWidth', 'outerHeight').\n * @return {integer} ширина сайдбара\n */\n _getSideBarSize: function (sizeName) {\n var me = this;\n var sideBarSize = 0;\n\n me._jSideBar.find('span:first').find(tabSelector).each(function () {\n sideBarSize += $.fn[sizeName].call($(this), true);\n });\n\n if (!this.isVertical()) sideBarSize += $(\".more\").width();\n return sideBarSize;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение ширины или высоты последней нескрытой закладки (не учитывая закладку \"Еще\").\n *\n * @function WebAccess.components.wrappers.sideBar.SideBar#_getLastTabSize\n * @since 5.2.0.1600\n * @private\n * @param {object} jSideBar - контейнер сайдбара\n * @param {string} sizeName - измерение (доступные значения: 'outerWidth', 'outerHeight').\n * @return {integer}\n */\n _getLastTabSize: function (sizeName) {\n var me = this;\n var tabs = me._jSideBar.find('span:first').find(tabSelector);\n return $.fn[sizeName].call(tabs.not('.more').last(), true);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /** \n * Развернуть содержимое закладок или дерево задач в проводнике.\n * В карточках объектов пошагово переносит скрытые закладки с закладки «Еще» на боковую панель.\n *\n * @method WebAccess.components.wrappers.sideBar.SideBar#expand\n */\n expand: global.TCD(function () {\n var jTreeArea = $(\".explorer-header__tree-area\");\n var jLeftContainer = $(\"#left_column\");\n var jTreeContainer = $(\"#tree_container\");\n var jExpandTreeContainer = $(\"#expand_tree_container\");\n var jExpandHeaderContainer = $(\".explorer-header__expand-area\");\n var jRightColumn = $(\"#right_column\");\n\n jLeftContainer.removeClass('left_column_collapsed');\n jRightColumn.removeClass('left_column_collapsed');\n\n jExpandTreeContainer.hide();\n jExpandHeaderContainer.hide();\n\n jTreeContainer.show();\n jTreeArea.show();\n\n $.cookie('SideBarCollapsed', '0', { expires: 70000 });\n return this;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Свернуть содержимое закладок или дерево папок в проводнике.\n * В карточках объектов пошагово переносит закладки с боковой панели на закладку «Еще».\n * @method WebAccess.components.wrappers.sideBar.SideBar#collapse\n * @param {string} tabName Имя закладки\n * @return {WebAccess.current.sideBar | boolean} True – имеется возможность свернуть содержимое закладок, иначе False.\n */\n collapse: global.TCD(function () {\n var jTreeArea = $(\".explorer-header__tree-area\");\n var jLeftContainer = $(\"#left_column\");\n var jTreeContainer = $(\"#tree_container\");\n var jExpandTreeContainer = $(\"#expand_tree_container\");\n var jExpandHeaderContainer = $(\".explorer-header__expand-area\");\n var jRightColumn = $(\"#right_column\");\n\n jLeftContainer.addClass('left_column_collapsed');\n jRightColumn.addClass('left_column_collapsed');\n\n jTreeContainer.hide();\n jTreeArea.hide();\n\n jExpandTreeContainer.show();\n jExpandHeaderContainer.show();\n\n $.cookie('SideBarCollapsed', '1', { expires: 70000 });\n return this;\n }),\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверить, свернута ли боковая панель.\n *\n * @method WebAccess.components.wrappers.sideBar.SideBar#isCollapsed\n * @param {String} tabName Имя закладки\n * @since 5.2.0.1600\n */\n isCollapsed: function () {\n var me = this;\n return !$(\"#tree_container\").is(\":visible\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Изменить расположение боковой панели.\n *\n\n * @method WebAccess.components.wrappers.sideBar.SideBar#setOrientation\n * @todo проверить в разных местах, например в проводнике, мастерах\n * @fixme с иконками в обратную сторону пока плохо.\n * @param {ORIENTATION} orientation Режим расположения боковой панели. \n * Возможные значения:HORIZONTAL – горизонтальное; VERTICAL – вертикальное.\n * @since 5.2.0.1600\n * @example\n *\n * //Установить горизонтальное расположение боковой панели.\n * WA.CR.sideBar.setOrientation(ORIENTATION.HORIZONTAL)\n */\n setOrientation: function (orientation) {\n var me = this;\n\n if (orientation == ORIENTATION.HORIZONTAL) {\n me._jSideBar.removeClass(\"vertical\").addClass(\"horizontal\");\n $(\"#right_column\").addClass(\"no_margin\");\n me._jSideBar.find(tabSelector + \" p\").each(function () {\n var smallIcon = $(this).data('smallicon');\n $(this).removeClass().addClass(smallIcon);\n });\n\n this._fitHorizontalTabs();\n this._moveSidebarBeforeCustomWorkCard();\n } else {\n me._jSideBar.addClass(\"vertical\").removeClass(\"horizontal\");\n\n $(\"#right_column\").removeClass(\"no_margin\");\n me._jSideBar.find(tabSelector + \" p\").each(function () {\n var icon = $(this).data('icon');\n $(this).removeClass().addClass(icon);\n });\n\n this._fitVerticalTabs();\n this.moveSidebarToLeftColumn();\n };\n\n // Скрывает панель \"Еще\".\n $('body').off('click.tabs').on('click.tabs', function () {\n me._jAfterTabs.addClass(\"hidden\");\n });\n\n // Сворачивает вкладки в \"Еще\" при изменении размеров экрана.\n $(window).bind('resizeEnd', function () {\n me._jAfterTabs.addClass(\"hidden\");\n if (me._jSideBar.hasClass(\"horizontal\")) {\n me._fitHorizontalTabs();\n } else {\n me._fitVerticalTabs();\n };\n });\n\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверить, вертикально ли распологается боковая панель.\n *\n * @method WebAccess.components.wrappers.sideBar.SideBar#isVertical\n * @since 5.0.0.4206\n * @return {boolean} True – боковая панель располагается вертикально, иначе False.\n */\n isVertical: function () {\n var me = this;\n return !$(\"#left_column\").hasClass(\"horizontal\");\n },\n\n /**\n * Переносит вкладки внутрь основной области, что бы минитулбар вложений был с ними на одном уровне.\n *\n * @method WebAccess.components.wrappers.sideBar.SideBar#_moveSidebarBeforeCustomWorkCard\n * @since 5.2.0.1600 \n * @private \n */\n _moveSidebarBeforeCustomWorkCard: function () {\n var me = this;\n var view = GetParamInURL(\"view\").toLowerCase();\n if (view !== \"card\" && view !== \"\") return;\n if (me._jSideBar.hasClass('horizontal')) {\n var jMainContainer = $('#main_container');\n var jAttachment = jMainContainer.find('.attachments_td');\n var jLeftColumn = $('#left_column');\n if (jAttachment.length > 0) {\n // Перенос.\n jMainContainer.find('.card').before(jLeftColumn);\n // Корректируем стили левой колонки, что бы не наезжала на минитулбар вложений.\n var attachmentWidth = parseInt(jAttachment.width(), 10);\n jLeftColumn.css({ 'width': 'auto', 'marginRight': attachmentWidth - 5 });\n // Корректируем размер полей текста ЗЗУ.\n if (typeof (initSavedTextHeight) !== 'undefined') initSavedTextHeight();\n }\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить первоначальное положение закладок боковой панели.\n *\n * @method WebAccess.components.wrappers.sideBar.SideBar#moveSidebarToLeftColumn\n * @since 5.2.0.1600 \n */\n // \n moveSidebarToLeftColumn: function () {\n var me = this;\n var jLeftColumn = $('#left_column');\n var jRightColumn = $('#right_column');\n // Перенос.\n jRightColumn.before(jLeftColumn);\n // Корректируем стили левой колонки.\n jLeftColumn.css({ 'width': '', 'marginRight': '' }); //FIXME: проверить на планшетах\n // Корректируем размер полей текста ЗЗУ.\n if (typeof (initSavedTextHeight) !== 'undefined') initSavedTextHeight();\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n WA.CMP.wrappers.sideBar._ExplorerSideBar = _ExplorerSideBar;\n\n})(window.WA);","\"use strict\";\n\n/**\n* Ссылка.\n* \n* @class WebAccess.components.wrappers.form.Link\n* @extends WebAccess.components.wrappers.BasePageElement\n* @property {string} name Имя ссылки\n* @property {string} selector Путь в DOM-иерархии к объекту группы, например div.content#container\n* @param {string} itemSelector Cуществующий элемент страницы\n*/\n(function (global) {\n \n var Link = global.components.wrappers.BasePageElement.extend({\n\n init: function (itemSelector) {\n this._super(itemSelector);\n this.name = this._jObject.attr('id');\n this.selector = \"#\" + this.name;\n this.actionName = this._jObject.data('action-name');\n }, \n\n className: \"Link\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Имитировать щелчок мыши.\n * Имитация щелчка мыши по ссылке либо установка обработчика на событие onClick, если передан callback. \n * Заменяет обработчик по умолчанию.\n * \n * @param {function} [opt_callback] Функция, которая будет вызвана после щелчка мыши по ссылке\n * @method WebAccess.components.wrappers.form.Link#click \n * @return {button}\n */\n click: function (opt_callback) {\n var me = this;\n if ($.isFunction(opt_callback)) {\n var jObject = me._jObject;\n me._super(function () {\n if (!jObject.hasClass('disabled')) opt_callback();\n });\n jObject.addClass('binded');\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Подписка на события\n * \n * @param {string} event\n * @method WebAccess.components.wrappers.form.Link#bind\n * @return { WebAccess.components.wrappers.form.Link}\n */\n bind: function (event, callback) {\n var me = this;\n if ($.isFunction(callback)) {\n var jObject = me._jObject;\n me._super(event, function () {\n if (!jObject.hasClass('disabled')) callback();\n });\n jObject.addClass('binded');\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отключение ссылки\n * \n * @method WebAccess.components.wrappers.form.Link#disable\n * @return { WebAccess.components.wrappers.form.Link}\n * @see module:tests/FormControls~isLinkRealyDisabled\n */\n disable: function () {\n if (this.isEnabled()) {\n this._super();\n this._jObject.addClass('disabled');\n };\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Включение ссылки, если она была отключена ранее.\n * \n * @method WebAccess.components.wrappers.form.Link#enable\n * @return { WebAccess.components.wrappers.form.Link}\n * @see module:tests/FormControls~isLinkRealyEnabled\n */\n enable: function () {\n if (!this.isEnabled()) {\n this._super();\n this._jObject.removeClass('disabled');\n };\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить подпись ссылки\n * \n * @method WebAccess.components.wrappers.form.Link#getLabel\n * @return {string}\n * @see module:tests/FormControls~getLabelValue\n */\n getLabel: function() { \n return this._jObject.text();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить подпись ссылки\n * \n * @method WebAccess.components.wrappers.form.Link#setLabel\n * @param {string} text текст подписи\n * @see module:tests/FormControls~setLabelValue\n * @return {link}\n */\n setLabel: function(text) {\n this._jObject.text(text);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @ignore\n * @method WebAccess.components.wrappers.form.Link#setIcon\n */\n setIcon: function (path) {\n global.raise(\"ERR_UNSUPPORTED_METHOD\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @ignore\n * @method WebAccess.components.wrappers.form.Link#getIcon\n */\n getIcon: function (path) { \n global.raise(\"ERR_UNSUPPORTED_METHOD\");\n return this;\n },\n\n /**\n * Отобразить гиперссылку.\n * \n * @method WebAccess.components.wrappers.form.Link#show\n * @return {WebAccess.components.wrappers.form.Link} Объект типа Link.\n */\n show: function () {\n this._jObject.css('visibility', 'visible');\n this.fire(\"show\");\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть гиперссылку.\n * \n * @method WebAccess.components.wrappers.form.Link#hide\n * @return {WebAccess.components.wrappers.form.Link} Объект типа Link.\n */\n hide: function () {\n this._jObject.css('visibility', 'hidden');\n this.fire(\"hide\");\n return this;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n global.components.wrappers.form.Link = Link;\n})(window.WebAccess);","\"use strict\";\n\n/**\n* Кнопка.\n* \n* @class WebAccess.components.wrappers.form.Button\n* @extends WebAccess.components.wrappers.BasePageElement\n* @property {string} name Имя ссылки\n* @property {string} actionName имя дествия\n* @property {string} selector Путь в DOM-иерархии к объекту группы, например div.content#container\n* @param {string} itemSelector Cуществующий элемент страницы\n*/\n(function (global) {\n\n var Button = global.components.wrappers.BasePageElement.extend({\n\n init: function (itemSelector) {\n this._super(itemSelector);\n this.name = this._jObject.attr('button-name') || this._jObject.attr('id');\n this.actionName = this._jObject.data('action-name');\n this.selector = \"#\" + this.name; //TODO Будет неправильный селектор если указано button-name\n },\n\n className: \"Button\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Имитировать щелчок мыши.\n * Имитация щелчка мыши по ссылке либо установка обработчика на событие onClick, если передан callback. \n * Заменяет обработчик по умолчанию.\n * \n * @param {function} [opt_callback] Функция, которая будет вызвана после щелчка мыши по ссылке\n * @method WebAccess.components.wrappers.form.Button#click \n * @return {button}\n */\n click: function (opt_callback) {\n var me = this;\n me._super(opt_callback);\n if ($.isFunction(opt_callback)) {\n this._jObject.addClass('binded_button').removeClass('disabled');\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Выхов нашего fire при клике на элемент\n * @private\n */\n _eventHandler: function (event) {\n var eventName = event.data.eventName;\n var name = event.data.actionName;\n var element = event.data.instance;\n var continueDefaultAction = event.data.continueDefaultAction;\n if (element.fire(eventName, name, continueDefaultAction) !== false && eventName === 'click') {\n element._defaultAction.call(element);\n };\n },\n\n /**\n * Подписка на события\n * \n * @param {string} event\n * @method WebAccess.components.wrappers.form.Button#bind\n * @return { WebAccess.components.wrappers.form.Button}\n */\n bind: function (event, callback) {\n var instance = this;\n this._super(event, callback);\n\n //if (event == \"click\") this._disableClickHandler(this._jObject); \n this._jObject.unbind(event, this._eventHanler).bind(event, {\n \"instance\": instance,\n \"eventName\": event,\n \"buttonName\": instance.name,\n \"actionName\": instance._jObject.data('action-name'),\n \"continueDefaultAction\": $.proxy(instance._defaultAction, instance)\n }, this._eventHandler);\n\n this._jObject.addClass('binded_button').removeClass('disabled');\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Отключение ссылки\n * \n * @method WebAccess.components.wrappers.form.Button#disable\n * @return { WebAccess.components.wrappers.form.Button}\n * @see module:tests/FormControls~isLinkRealyDisabled\n */\n disable: function () {\n if (this.isEnabled()) {\n this._super();\n this._jObject.removeClass(\"binded_button\");\n this._jObject.attr(\"disabled\", \"disabled\");\n return this;\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Включение ссылки, если она была отключена ранее.\n * \n * @method WebAccess.components.wrappers.form.Button#enable\n * @return { WebAccess.components.wrappers.form.Button}\n * @see module:tests/FormControls~isLinkRealyEnabled\n */\n enable: function () {\n if (!this.isEnabled()) {\n this._super();\n this._jObject.addClass(\"binded_button\");\n this._jObject.removeAttr(\"disabled\");\n return this;\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить подпись ссылки\n * \n * @method WebAccess.components.wrappers.form.Button#getLabel\n * @return {string}\n * @see module:tests/FormControls~getLabelValue\n */\n getLabel: function () {\n return this._jObject.val();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить подпись ссылки\n * \n * @method WebAccess.components.wrappers.form.Button#setLabel\n * @param {string} text текст подписи\n * @see module:tests/FormControls~setLabelValue\n * @return {link}\n */\n setLabel: function (text) {\n this._jObject.val(text);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @ignore\n * @method WebAccess.components.wrappers.form.Button#setIcon\n */\n setIcon: function (path) {\n global.raise(\"ERR_UNSUPPORTED_METHOD\");\n return this;\n },\n\n /**\n * @ignore\n * @method WebAccess.components.wrappers.form.Button#getIcon\n */\n getIcon: function (path) {\n global.raise(\"ERR_UNSUPPORTED_METHOD\");\n return this;\n }\n });\n\n global.components.wrappers.form.Button = Button;\n})(window.WebAccess);","\"use strict\";\n\n/**\n* Предоставляет работу с деревом папок.\n*\n* @namespace WebAccess.components.wrappers.folderTree.FolderTree\n* @property {string} containerSelector Блок, содержащий дерево папок\n* @fires WebAccess.current.objectList#onChange Вызывается после изменения дерева папок.\n* @since 5.2.0.1600\n*/\n\n(function (global) {\n\n var FolderTree = BaseObject.extend({\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n className: 'FolderTree',\n containerSelector: '#tree_container',\n\n _data: {},\n _containerId: {},\n _promise: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (promise) {\n this._super();\n this._promise = promise;\n },\n\n /**\n * Инициализирует объектную модель для react-компоненты.\n * @param {string} containerId ID контейнера\n * @param {Array} state Модель дерева.\n */\n initComponent: function (containerId, state) {\n this._data = state;\n this._containerId = containerId;\n this.containerSelector = '#' + containerId;\n\n if (this._promise) this._promise.resolve();\n },\n\n /**\n * Установить произвольное содержимое вместо текущего списка объектов.\n *\n * @method WebAccess.components.wrappers.folderTree.FolderTree.setHtml\n * @return {WebAccess.components.wrappers.folderTree.FolderTree} Объект типа folderTree.\n */\n setHtml: function (html) {\n $(this.containerSelector).html(html);\n return this;\n },\n\n /**\n * Выполнить переход в указанную папку.\n *\n * @param {event} event Событие клика.\n * @param {object} treeitem Элемент дерева.\n */\n selectNode: function (nodeInfo) {\n var me = this;\n // Если не указан node, возвращаем true, чтобы событие обработалось дальше.\n if (!nodeInfo) return false;\n\n var url = me._buildFolderUrl(nodeInfo);\n var prevPath = GetParamInURL('fpath');\n var nextPath = nodeInfo.key;\n\n // Записать в историю переход.\n var state = {\n type: 'explorer',\n folderID: nodeInfo.id,\n path: nodeInfo.key,\n title: nodeInfo.caption,\n hasCover: nodeInfo.hasFolderCover,\n hasCoverOnly: nodeInfo.showCoverOnly,\n contentType: nodeInfo.contentType\n };\n WA.history.pushState(state, nodeInfo.caption, url);\n me.markAsSelected(nodeInfo);\n // Раскроем список. По информации найдем реальный узел, т.к. в инфо-объекте нет ссылок на потомков.\n var node = me._findNode(me._data, function (n) { return n.key === nodeInfo.key });\n if (node.children && node.children.length > 0) {\n if (prevPath !== nextPath) {\n // Если до этого находились в другом узле, то выбранный всегда только раскрываем\n me.openNode({ key: node.key });\n } else {\n me.toggleNode({ key: node.key });\n }\n } else {\n me.loadNode({ key: node.key }, function () {\n me.openNode({ key: node.key });\n });\n }\n // Отметим узел как выбранный и перерисуем дерево.\n me._render(me._data);\n\n return true;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отмечает узел в модели как выбранный.\n * @param {object} node Узел дерева.\n */\n markAsSelected: function (node) {\n var me = this;\n me._mapNodes(me._data, function (n) {\n n.selected = (n.key === node.key);\n return n;\n });\n\n return me;\n },\n\n /**\n * Открыть папку по fpath.\n *\n * @param {str} fpath Путь к папке.\n * @param {boolean} triggerClick Необходимость вызвать событие клика.\n */\n selectNodeByPath: function (fpath, triggerClick) {\n var me = this;\n var node = me._findNode(me._data, function (n) { return n.key === fpath });\n if (!node) {\n // Проверим, что папка является следующей по fpath. Если да, то загрузим узел и раскроем его.\n var currentPath = GetParamInURL('fpath');\n var prevPath = fpath.substring(fpath.indexOf('-') + 1, fpath.length);\n if (prevPath === currentPath && me._findNode(me._data, function (n) { return n.key === currentPath }) !== null) {\n me.loadNode({ key: currentPath }, function () {\n me.toggleNode({ key: currentPath });\n me.selectNodeByPath(fpath, triggerClick);\n });\n return true;\n }\n return false;\n }\n\n if (triggerClick) {\n me.selectNode(node);\n } else {\n // Отметим узел как выбранный и перерисуем дерево.\n me.markAsSelected(node)\n ._render(me._data);\n };\n return true;\n },\n\n /**\n * Обновить счетчик непрочитанных.\n *\n * @param {integer} folderID ИД папки.\n * @param {boolean} forceUpdateCache Признак принудительного обновления кэша.\n */\n updateUnreadJobCount: function (folderID, forceUpdateCache) {\n var me = this;\n\n var nodes = me._findNodes(me._data, function (n) {\n return n.id == folderID && n.showUnread;\n });\n\n if (nodes.length > 0) {\n WA.SRV.call('/Folder.asmx/GetUnreadJobCount', { 'FolderID': folderID, 'ForceUpdateCache': !!(forceUpdateCache) }).done(function (count) {\n $.each(nodes, function (i, node) {\n node.unreadCount = count;\n });\n\n me._render(me._data);\n document.title = nodes[0].caption + (count > 0 ? ' (' + count + ')' : '');\n });\n }\n },\n\n /**\n * Обновляет узел дерева.\n *\n * @method WebAccess.components.wrappers.folderTree.FolderTree.updateNode\n * @param {} folderPath Путь к папке.\n * @param {} callback Callback-функция.\n */\n _updateNode: function (folderPath, callback) {\n var me = this;\n callback = callback || $.noop;\n\n var node = me._findNode(me._data, function (n) { return n.key === folderPath; });\n\n me.loadNode(node, function () {\n me._render(me._data);\n callback();\n });\n },\n\n /**\n * Обновляет все дерево целиком.\n *\n * @method WebAccess.components.wrappers.folderTree.FolderTree.update\n * @param {function} callback Callback-функция.\n */\n update: function (callback) {\n var me = this;\n var id = WA.CR.getID();\n var fpath = GetParamInURL('fpath');\n\n this.loadNode({ id: id, key: fpath }, function () {\n me._render(me._data);\n if (callback) callback();\n });\n },\n\n /**\n * Обновить узел для указанной папки.\n *\n * @param {int} folderID ИД папки.\n * @param {function} callback Callback-функция.\n */\n updateByFolderID: function (folderID, callback) {\n var me = this;\n\n var nodes = me._findNodes(me._data, function (n) {\n return n.id == folderID;\n });\n\n if (nodes && nodes.length > 0) {\n me._getNodeContent(nodes[0]).done(function (children) {\n nodes.forEach(function (node) {\n node.children = JSON.parse(children);\n });\n\n me._render(me._data);\n if (callback) callback();\n });\n }\n },\n\n /**\n * Обновляет узлы, содержащие папку. Может принимать отдельные ID, массив с ID.\n * Если ничего не передано, обновляет узел, содержащий открытую папку.\n *\n * @method WebAccess.components.wrappers.folderTree.FolderTree.updateNodesWithFolder\n * @param folder ID папок.\n * @param callback Callback-функция.\n */\n updateNodesWithFolder: function (folderID, callback) {\n var me = this;\n var nodes = me._findNodesWithFolder(me._data, folderID);\n if (nodes.length > 0) {\n nodes.forEach(function (node) {\n me.updateByFolderID(node.id, callback);\n });\n } else {\n me.update();\n }\n },\n\n /**\n * Получить имя выбранной папки.\n *\n * @method WebAccess.components.wrappers.folderTree.FolderTree.getCurrentFolderName\n * @returns {string} Имя выбранной папки.\n */\n getCurrentFolderName: function () {\n var node = this._findNode(this._data, function (n) { return n.selected; });\n return node && node.caption;\n },\n\n /**\n * Установить отображаемое имя для папки.\n *\n * @method WebAccess.components.wrappers.folderTree.FolderTree.setFolderVisibleName\n * @param {int} id ИД папки.\n * @param {string} name Новое имя папки.\n */\n setFolderVisibleName: function (id, name) {\n this._mapNodes(this._data, function (n) {\n if (n.id == id)\n node.caption = name;\n return n;\n });\n me._render(me._data);\n },\n\n /**\n * Обновить имя папки значением с сервера.\n *\n * @method WebAccess.components.wrappers.folderTree.FolderTree.updateFolderName\n * @param {int} id ИД папки.\n */\n updateFolderName: function (id) {\n var me = this;\n var nodes = me._findNodes(me._data, function (n) {\n return n.id == id;\n });\n\n if (nodes && nodes.length > 0) {\n WA.SRV.call('/Folder.asmx/GetName', { FolderID: id }).done(function (name) {\n nodes.forEach(function (node) {\n node.caption = name;\n });\n me._render(me._data);\n });\n }\n },\n\n /**************************************************************************************/\n /**\n * Возвращает массив узлов, содержащий путь к узлу с указанным ключом.\n * @param {string} key Ключ.\n * @param {Array} nodes Массив узлов.\n */\n _findNodePath: function (nodes, predicate) {\n for (var i = 0; i < nodes.length; i++) {\n if (predicate(nodes[i])) {\n return [nodes[i]];\n } else {\n if (nodes[i].children && nodes[i].children.length > 0) {\n var nodesPath = this._findNodePath(nodes[i].children, predicate);\n if (nodesPath && nodesPath.length > 0) {\n nodesPath.push(nodes[i]);\n return nodesPath;\n }\n }\n }\n }\n return null;\n },\n\n /**\n * Ищет узел дерева с указанным ключом.\n * @param {Array} nodes Массив узлов.\n */\n _findNode: function (nodes, predicate) {\n var result = this._findNodes(nodes, predicate);\n return (result && result.length > 0) ? result[0] : null;\n },\n\n /**\n * Ищет узел дерева с указанным ключом.\n * @param {Array} nodes Массив узлов.\n */\n _findNodes: function (nodes, predicate) {\n var result = [];\n for (var i = 0; i < nodes.length; i++) {\n if (predicate(nodes[i])) {\n result.push(nodes[i]);\n } else {\n if (nodes[i].children && nodes[i].children.length > 0) {\n var childNodes = this._findNodePath(nodes[i].children, predicate);\n if (childNodes && childNodes.length > 0) {\n result = result.concat(childNodes[0]);\n }\n }\n }\n }\n return result;\n },\n\n /**\n * Возвращает массив узлов, содержащих указанную папку.\n *\n * @param {Array} nodes Массив узлов.\n * @param {number} folderID ИД папки.\n * @returns {Array} Массив узлов с указанной папкой.\n */\n _findNodesWithFolder: function (nodes, folderID) {\n var me = this;\n var result = [];\n nodes.forEach(function (item) {\n if (item.children && item.children.length > 0) {\n var filteredNodes = item.children.filter(function (n) { return n.id == folderID; });\n if (filteredNodes.length > 0) {\n result.push(item);\n };\n\n var childNodes = me._findNodesWithFolder(item.children, folderID);\n if (childNodes.length > 0) {\n childNodes.forEach(function (n) {\n if (!result.some(function (el) { return el.id === n.id })) {\n result.push(n);\n }\n });\n }\n }\n });\n return result;\n },\n\n /**\n * Преобразовывает указанные узлы.\n * @param {} nodes\n * @param {} changeFunc\n * @returns {}\n */\n _mapNodes: function (nodes, changeFunc) {\n for (var i = 0; i < nodes.length; i++) {\n nodes[i] = changeFunc(nodes[i]);\n if (nodes[i].children && nodes[i].children.length > 0) {\n this._mapNodes(nodes[i].children, changeFunc);\n }\n }\n\n return nodes;\n },\n\n /**\n * Инициирует перерисовку дерева.\n * @param {} state\n * @returns {}\n */\n _render: function (state) {\n ReactDOM.render(\n React.createElement(Component.FolderTree, { data: state, constants: { systemCode: g_SysCode, extension: g_ExtName } }),\n document.getElementById(this._containerId));\n },\n\n /**\n * Загружает содержимое узла.\n * @param {object} nodeInfo Информация об узле.\n * @param {function} onSuccess Callback при успешной загрузке.\n * @param {function} onFail Callback при ошибке.\n */\n loadNode: function (nodeInfo, onSuccess, onFail) {\n var me = this;\n if (me._data) {\n var node = me._findNode(me._data, function (n) {\n return n.key === nodeInfo.key;\n });\n\n if (node) {\n me._getNodeContent(node).done(function (res) {\n if (res) {\n var children = JSON.parse(res);\n node.hasChildren = (children.length > 0);\n node.children = children;\n\n if (onSuccess) onSuccess();\n if (!node.hasChildren) me._render(me._data);\n }\n }).fail(function (err) {\n log.error('FOLDER_TREE', err);\n if (onFail) onFail(err);\n });\n }\n\n }\n },\n\n /**\n * Выполняет запрос к сервису для загрузки содержимого узла.\n * @param {object} node Узел.\n * @returns {$.Deferred} Deferred-объект загрузки.\n */\n _getNodeContent: function (node) {\n var selectedNode = this._findNode(this._data, function (n) { return n.selected; });\n return WA.SRV.call('/FolderList.asmx/LoadTree', {\n FolderID: node.id,\n FolderPath: node.key,\n SelectedTreeItem: selectedNode ? selectedNode.key : ''\n });\n },\n\n /**\n * Раскрывает или сворачивает узел.\n * @param {object} node Информация об узле.\n */\n toggleNode: function (node) {\n this._mapNodes(this._data, function (n) {\n if (n.key === node.key) {\n n.expanded = !n.expanded;\n WA.SRV.call('/FolderList.asmx/SaveOpened', {\n IsOpening: n.expanded,\n FolderPath: node.key\n }, '', '', true, true); // не показываем ошибки\n } else if (node.key.indexOf(n.key) !== -1) {\n n.expanded = true; //раскрываем родителя\n }\n return n;\n });\n this._render(this._data);\n },\n\n /**\r\n * Всегда раскрывает узел\r\n * @param {object} node Информация об узле.\r\n */\n openNode: function (node) {\n this._mapNodes(this._data, function (n) {\n if (n.key === node.key) {\n n.expanded = true;\n WA.SRV.call('/FolderList.asmx/SaveOpened', {\n IsOpening: n.expanded,\n FolderPath: node.key\n }, '', '', true, true); // не показываем ошибки\n } else if (node.key.indexOf(n.key) !== -1) {\n n.expanded = true; //раскрываем родителя\n }\n return n;\n });\n this._render(this._data);\n },\n\n /**\n * Строит url для папки.\n * @param {} node\n * @returns {}\n */\n _buildFolderUrl: function (node) {\n var url = new WA.URL('Explorer.aspx');\n url\n .setParam('sys', g_SysCode)\n .setParam('ext', g_ExtName)\n .setParam('id', node.id);\n\n if (node.key) url.setParam('fpath', node.key);\n if (node.treeitem) url.setParam('treeitem', node.treeitem);\n\n return url.asString();\n }\n\n });\n\n global.components.wrappers.folderTree.FolderTree = FolderTree;\n\n})(window.WebAccess);\n","\"use strict\";\n\n/**\n* Встроенная подсказка\n* \n* @class WebAccess.components.notifications.InlineHint\n* @extends BaseObject\n* @param {object} [opt_settings] Параметры подсказки\n* @param {Integer} [opt_dialogId] ИД подсказки\n* @since 5.0.0.7300\n*\n* @example\n* var hint = new WA.CMP.NTF.InlineHint()\n* hint.showError(\"Hello world\");\n*/\n(function (global) {\n var InlineHint = BaseObject.extend({\n _jDialog: null,\n _dialogId: 0,\n _customDialogId: false,\n init: function (opt_settings, opt_dialogId) {\n this._super(opt_settings);\n this._dialogId = opt_dialogId;\n if (opt_dialogId) this._customDialogId = true;\n if ($.isPlainObject(opt_settings)) {\n $.extend(this, opt_settings);\n };\n\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n className: 'InlineHint',\n\n /**\n * Показать встроенную подсказку с предупреждением.\n *\n * @function WebAccess.components.notifications.InlineHint#showWarning\n * @param {String} message Основной текст предупреждения\n * @param {String} [opt_details] Информационный текст, объясняющий суть предупреждения\n * @return {WebAccess.components.notifications.InlineHint} Объект типа InlineHint.\n * @since 5.0.0.7300\n */\n showWarning: function (msg, opt_details) {\n this.show(msg, opt_details, MESSAGE_TYPE.WARNING);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать встроенную подсказку с текстом ошибки.\n *\n * @function WebAccess.components.notifications.InlineHint#showError\n * @param {String} message Основной текст ошибки\n * @param {String} [opt_details] Информационный текст, объясняющий ошибку\n * @return {WebAccess.components.notifications.InlineHint} Объект типа InlineHint.\n */\n showError: function (msg, opt_details) {\n this.show(msg, opt_details, MESSAGE_TYPE.ERROR);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Показать встроенную подсказку с информационным сообщением.\n *\n * @function WebAccess.components.notifications.InlineHint#showInfo\n * @param {String} message Основной текст сообщения\n * @param {String} [opt_details] Информационный текст, объясняющий суть сообщения\n * @return {WebAccess.components.notifications.InlineHint} Объект типа InlineHint.\n * @since 5.1.0.1511\n */\n showInfo: function (msg, opt_details) {\n this.show(msg, opt_details, MESSAGE_TYPE.INFO);\n return this;\n },\n\n /**\n * Показать подсказку в диалоге\n * @function WebAccess.components.notifications.InlineHint#showInDialog\n * @param {String} dialogId Идентификатор целевого диалога\n * @param {String} message Основной текст сообщения\n * @param {String} [opt_details] Информационный текст\n * @param {MESSAGE_TYPE} [opt_messageType] Тип сообщения\n * @return {WebAccess.components.notifications.InlineHint} Объект типа InlineHint\n */\n showInDialog: function (dialogId, message, opt_details, opt_messageType) {\n this._dialogId = dialogId;\n this._customDialogId = true;\n return this.show(message, opt_details, opt_messageType);\n },\n\n\n _updateContext: function () {\n if (this._customDialogId) return;\n\n this._dialogId = null;\n \n var jDialog = $('.ui-dialog-content').last();\n if (!jDialog.length) return;\n var jDialogContent = jDialog.children();\n if (jDialogContent.length) {\n this._dialogId = jDialogContent.attr('id');\n if (typeof this._dialogId !== 'undefined') {\n this._dialogId = this._dialogId.replace('dialog_content_', '');\n }\n }\n },\n\n /**\n * Показать встроенную подсказку.\n *\n * @function WebAccess.components.notifications.InlineHint#show\n * @param {String} message сОсновной текст сообщения\n * @param {String} [opt_details] Информационный текст\n * @param {MESSAGE_TYPE} [opt_messageType] Тип сообщения\n * @return {WebAccess.components.notifications.InlineHint} Объект типа InlineHint.\n */\n show: function (message, opt_details, opt_messageType) {\n var jError;\n var IsError;\n var details = opt_details || '';\n var me = this;\n\n me._updateContext();\n\n if (this._dialogId) {\n this._jDialog = $('#dialog_content_' + this._dialogId);\n } else {\n this._jDialog = $();\n };\n\n opt_messageType = !isNaN(opt_messageType) ? opt_messageType : MESSAGE_TYPE.ERROR;\n\n try {\n var jsonObject = $.parseJSON(message);\n message = jsonObject.Message;\n } catch (e) { \n }\n\n this.hide();\n if (!!$.trim(message)) {\n message = message.newLinesToBR().replaceAll(\"\\u0026quot;\", '\"');\n\n if (opt_messageType === MESSAGE_TYPE.ERROR) IsError = true;\n if (opt_messageType !== MESSAGE_TYPE.WARNING && opt_messageType !== MESSAGE_TYPE.ERROR && opt_messageType !== MESSAGE_TYPE.INFO) {\n WA.raise('NOT_IMPLEMENTED_EXCEPTION');\n };\n\n if (IsError) {\n jError = $(\"p#errp\").first();\n } else {\n jError = $(\"p#wrnp\").first();\n }\n\n // Для предпросмотра.\n if (jError.length > 1) {\n jError = $(jError[jError.length - 1]);\n }\n\n var splitterIndex = message.indexOf('^');\n if (splitterIndex != -1) {\n details = message.substring(splitterIndex + 1, message.length).fromISBuilderToNormal();\n message = message.substring(0, splitterIndex);\n }\n\n var params = WA.TMPL.prepare();\n params.type = IsError ? 'err' : 'wrn';\n\n params.typeClass = IsError ? 'error' : 'highlight';\n if (opt_messageType == MESSAGE_TYPE.INFO) params.typeClass = 'info';\n\n params.closeIcon = (IsError ? 'Delete_16.png' : '');\n params.message = message;\n params.details = details;\n\n var jContainer;\n \n WA.TMPL.render('components/inlineHint.compile.html', params).done(function (html) {\n if (me._jDialog.length) {\n jContainer = me._jDialog.find('#new_error_container');\n if (!!me._jDialog.find('#new_error_container').length) {\n jContainer.remove();\n }\n me._jDialog.prepend(html);\n jContainer = me._jDialog.find('#new_error_container').css({ 'margin-bottom': '15px' });\n } else {\n var isPreviewPage = $('.npocomputer-previewdoc-errors-place-holder').length;\n jContainer = isPreviewPage ? $('.npocomputer-previewdoc-errors-place-holder') : $(\"[name='ErrorControl']\").parent();\n\n if (!jContainer.length) {\n jContainer = $('#right_column');\n jContainer.prepend(html);\n $('#new_error_container').wrap('
    ');\n } else {\n jContainer.find('.ui-state-error').css('display', 'none');\n jContainer.addClass('error_content_padding');\n jContainer.find('div:first').html(html);\n }\n };\n\n jContainer.find(\".error_close\").on('click', function () {\n me.hide();\n });\n });\n };\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть последнее открытое сообщение.\n *\n * @function WebAccess.components.notifications.InlineHint#hide \n * @return {WebAccess.components.notifications.InlineHint} Объект типа InlineHint.\n * @since 5.0.0.7300\n */\n hide: function () {\n global.InlineHint.hideAll();\n return this;\n }\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.InlineHint = InlineHint;\n\n /**\n * Скрыть все сообщения.\n *\n * @function WebAccess.components.notifications.InlineHint#hideAll\n * @static\n * @since 5.0.0.7300\n */\n global.InlineHint.hideAll = function () {\n $(\".error_div_msg\").add('#error_container').hide();\n $(\".fake.error_content_padding\").remove();\n $(\".error_content_padding\").addClass('error_content_init_padding').removeClass('error_content_padding');\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n})(window.WebAccess.components.notifications);","\"use strict\";\n/**\n* Анимация процесса загрузки.\n*\n* @class WebAccess.components.notifications.Spinner\n* @extends BaseObject\n* @since 5.0.0.7300\n*\n* @example\n* var spinner = new WA.CMP.notifications.Spinner()\n* spinner.show();\n*/\n(function (global) {\n\n var Spinner = BaseObject.extend({\n // Спиннер.\n jSpinner: '',\n timer: '',\n\n init: function(jSpinner) {\n this.jSpinner = jSpinner || $('.loader');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Запуск анимации спиннера.\n * @method WebAccess.components.notifications.Spinner#_start\n * @private\n * @since 5.0.0.7300\n * @see http://easings.net/ru - Функции easing\n */\n _start: function () {\n var me = this;\n me.jSpinner.addClass('loader_animated');\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отложенный запуск анимации процесса загрузки.\n *\n * @method WebAccess.components.notifications.Spinner#showDelayed\n * @param {Integer} [opt_delay] Задержка запуска анимации в миллисекундах\n * @return {WebAccess.components.notifications.Spinner} Объект типа Spinner.\n * @since 5.0.0.7300\n */\n showDelayed: function (opt_delay) {\n var me = this;\n opt_delay = opt_delay || 500;\n if (me.timer) clearTimeout(me.timer);\n me.timer = setTimeout(function () { me._start() }, opt_delay);\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отложенный запуск спиннера\n * @method WebAccess.components.notifications.Spinner#_stop\n * @return {WebAccess.components.notifications.Spinner}\n * @since 5.0.0.7300\n */\n _stop: function () {\n var me = this;\n me.jSpinner.removeClass('loader_animated');\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать анимацию процесса загрузки.\n *\n * @method WebAccess.components.notifications.Spinner#show\n * @return {WebAccess.components.notifications.Spinner} Объект типа Spinner.\n * @since 5.0.0.7300\n */\n show: function () {\n if (this.jSpinner.length === 0) this.jSpinner = $('.loader');\n\n this._start();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать анимацию процесса загрузки в диалоговом окне.\n *\n * @method WebAccess.components.notifications.Spinner#showInDialog\n * @param {Integer} [opt_delay] Задержка запуска анимации в миллисекундах\n * @return {WebAccess.components.notifications.Spinner} Объект типа Spinner.\n * @since 5.0.0.7300\n */\n showInDialog: function (opt_delay) {\n var dialog = $('.ui-dialog:visible, .wizard-form:visible');\n dialog.append('
    ');\n var dialogTopSpinner = $('.ui-dialog-loader');\n this.jSpinner = dialogTopSpinner;\n\n !!opt_delay ? this.showDelayed(opt_delay) : this.show();\n\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть анимацию процесса загрузки.\n *\n * @method WebAccess.components.notifications.Spinner#hide\n * @param {String} [opt_message] Cообщение о завершении процесса загрузки.\n * @param {Integer} [opt_delay] Задержка запуска анимации в миллисекундах\n * @param {Integer} [opt_callback] Функция, которая будет запущена после скрытия анимации.\n * @return {WebAccess.components.notifications.Spinner} Объект типа Spinner.\n * @since 5.0.0.7300\n */\n hide: function (opt_message, opt_delay, opt_callback) {\n if (this.timer) clearTimeout(this.timer);\n if (opt_message) {\n var toast = new WA.CMP.NTF.Toast();\n toast.show(opt_message, 'success', null, opt_delay);\n };\n if ($.isFunction(opt_callback)) {\n setTimeout(function () { opt_callback(); }, delay);\n }\n this._stop();\n return this;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n global.Spinner = Spinner;\n\n})(window.WebAccess.components.notifications);\n","\"use strict\";\n\n\n(function (global) {\n\n /**\n * Предоставляет дополнительные методы для работы с реквизитами. \n *\n * @mixin WebAccess.mixins.requisitesMixin\n * @since 5.0.0.7100 \n */\n var requisitesMixin = {\n\n /**\n * Ассоциация класса реквизита по его типу.\n *\n * @method WebAccess.mixins.requisitesMixin._createRequisite\n * @private\n * @since 5.0.0.7100\n * @return {Object}\n */\n _createRequisite: function (reqName, reqData, opt_isDetail, opt_grid) {\r\n var REQ;\n\n if (opt_isDetail)\n var REQ = WA.CMP.wrappers.form.requisites._details;\n else {\r\n var REQ = WA.CMP.wrappers.form.requisites;\r\n }\n\n switch (reqData.type) {\r\n case \"string\":\n case \"text\": \n return new REQ.Text(reqName, reqData, this, opt_grid);\n case \"pick\":\n return new REQ.Pick(reqName, reqData, this, opt_grid);\n case \"date\":\n return new REQ.Date(reqName, reqData, this, opt_grid);\n case \"integer\":\n case \"largeinteger\":\n case \"float\":\n return new REQ.Integer(reqName, reqData, this, opt_grid);\n case \"reference\":\n return new REQ.Reference(reqName, reqData, this, opt_grid);\n case \"document\":\n return new REQ.Document(reqName, reqData, this, opt_grid);\n case \"radio\":\n return new REQ.Radio(reqName, reqData, this, opt_grid);\n case \"checkbox\":\n return new REQ.CheckBox(reqName, reqData, this, opt_grid);\n case \"objectList\":\n return new REQ.ObjectList(reqName, reqData, this, opt_grid);\n default:\n return new REQ.BaseRequisite(reqName, reqData, this, opt_grid);\r\n };\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Начальное заполнение реквизитов формы данными.\n *\n * @method WebAccess.mixins.requisitesMixin._initRequisiteValues\n * @private\n * @since 5.0.0.7100\n * @return {WebAccess.mixins.requisitesMixin}\n */\n _initRequisiteValues: function (reqsData) {\r\n var me = this;\n\n if (me.isDisabled()) {\r\n me.disable();\r\n } else {\n //Шамов А.: Закоментировал потому, что дизэйблятся все контролы реквизита на всех вкладках, если на какой-нибуль из вкладок реквизит задизэйблен.\n //me._disableReadOnlyFields();\n }\n\n var globalReqValuesInit = $.Deferred();\n if (me._reqValuesInit) me._reqValuesInit.push(globalReqValuesInit);\n\n for (var reqName in reqsData) {\r\n if (me.requisites[reqName].isRendered()) {\r\n (function (_reqName, req) {\r\n\n var currReqValueInit = $.Deferred();\n if (me._reqValuesInit) me._reqValuesInit.push(currReqValueInit);\n\n $.when(req.Init).then(function () {\r\n req.setValue(reqsData[_reqName].value, reqsData[_reqName].displayValue, false)._bindMirrors()._isChanged = false;\n currReqValueInit.resolve();\r\n });\r\n\n })(reqName, me.requisites[reqName]);\r\n }\r\n };\n\n UnbindBeforeUnload();\n BindBeforeUnload();\n\n $(\"input.input\").change(function () { $(this).attr(\"title\", $(this).val()) });\n\n globalReqValuesInit.resolve();\n\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Свзяать реквизиты с множественными контролами\n * @private\n * @method WebAccess.mixins.requisitesMixin._disable\n * @since 5.0.0.7100\n */\n _bindMirrors: function (reqsData) {\r\n for (var reqName in reqsData) {\r\n if (this.requisites[reqName].isRendered()) {\r\n this.requisites[reqName]._bindMirrors();\r\n }\r\n }\n return this;\r\n },\n\n /**\n * Установить для всех реквизитов состояние \"Только чтение\", \n * и скрыть ссылку \"Добавить строку\".\n *\n * @method WebAccess.mixins.requisitesMixin._disable\n * @private\n * @since 5.0.0.7100\n * @return {WebAccess.mixins.requisitesMixin}\n */\n _disable: function () {\r\n var reqs = this.requisites.toArray();\n reqs.forEach(function (requisite) {\r\n requisite.disable();\r\n });\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Снять у всех реквизитов состояние \"Только чтение\".\n *\n * @method WebAccess.mixins.requisitesMixin._enable\n * @private\n * @since 5.0.0.7100\n * @return {WebAccess.mixins.requisitesMixin}\n */\n _enable: function () {\r\n var reqs = this.requisites.toArray();\n var parentTable = this._parentTable;\n if (parentTable) {\n var columns = parentTable.columns;\n reqs.forEach(function (requisite) {\n var reqName = requisite.name;\n var currentColumn = columns[reqName];\n if (!currentColumn.isDisabled()) {\n requisite.enable();\n }\n });\n } else {\n reqs.forEach(function (requisite) {\n requisite.enable();\n });\n }\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Используется при иницалиции формы - отключает все видимые \n * поля для которых доступ только на чтение.\n *\n * @method WebAccess.mixins.requisitesMixin._disableReadOnlyFields\n * @private\n * @since 5.0.0.7100\n * @return {WebAccess.mixins.requisitesMixin}\n */\n _disableReadOnlyFields: function () {\r\n var reqs = this.requisites.toArray();\n var parentTable = this._parentTable;\n if (parentTable) {\n var columns = parentTable.columns;\n reqs.forEach(function (requisite) {\n var reqName = requisite.name;\n var currentColumn = columns[reqName];\n if (currentColumn.isDisabled()) {\n requisite.disable();\n }\n });\n } else {\n reqs.forEach(function (requisite) {\n if (requisite.isDisabled()) requisite.enable();\n });\n }\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Возвращает реквизит по ИД элемента управления.\n *\n * @method WebAccess.mixins.requisitesMixin.getRequisiteByControlId\n * @param {string} controlId ИД HTML-элемента\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Объект реквизита или значение null, если реквизит не найден.\n * @since 5.0.0.7100\n */\n getRequisiteByControlId: function (controlId) {\r\n var reqs = this.requisites.toArray();\n for (var reqI = 0; reqI < reqs.length; reqI++) {\r\n var req = reqs[reqI];\n for (var i = 0; i < req.controlsIds.length; i++) {\r\n if (controlId === req.controlsIds[i]) {\r\n return req;\r\n }\r\n }\r\n }\n return null;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак изменения реквизитов.\n *\n * @method WebAccess.mixins.requisitesMixin.isChanged\n * @return {boolean} True – реквизиты были изменены, иначе False.\n * @since 5.0.0.7100\n */\n isChanged: function () {\r\n var reqs = this.requisites.toArray();\n for (var reqI = 0; reqI < reqs.length; reqI++) {\r\n if (reqs[reqI].isChanged()) {\r\n return true;\r\n }\r\n }\n return false;\r\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n };\n\n global.requisitesMixin = requisitesMixin;\r\n})(window.WebAccess.mixins);","\"use strict\";\n\n/** \n* Коллекция реквизитов.\n*\n* @class WebAccess.components.wrappers.form.RequisiteCollection\n* @extends WebAccess.Collection\n* @since 5.2.0.1900\n*/\n\n(function (global) {\n\n var RequisiteCollection = global.Collection.extend({\n className: 'RequisiteCollection',\n \n /**\n * Значение всех реквизитов в виде словоря.\n *\n * @method WebAccess.components.wrappers.form.RequisiteCollection.toDictionary\n * @return {Object} Значение всех реквизитов.\n * @since 5.2.0.1900\n */\n toDictionary: function () {\n var resultDict = {};\n var reqs = this.toArray();\n for (var reqI = 0; reqI < reqs.length; reqI++) {\n resultDict[reqs[reqI].name] = reqs[reqI].getValue();\n }\n return resultDict;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n });\n\n global.components.wrappers.form.RequisiteCollection = RequisiteCollection;\n})(window.WebAccess);","\"use strict\";\n\n/**\n* Базовый класс строк и столбцов таблицы. \n* Содержит общие методы.\n* \n* @class WebAccess.components.wrappers.form.BaseTableLine\n* @abstract\n* @extends BaseObject\n* @param {string} itemSelector существующий элемент страницы\n* @param {WebAccess.components.wrappers.form.Table} parentTable Таблица, которой принадлежит строка или столбец\n*/\n(function (global) {\n\n var BaseTableLine = BaseObject.extend([global.mixins.requisitesMixin], {\n className: \"BaseTableLine\",\n\n _parentTable: null,\n _isDisabled: false,\n _jDataItems: null,\n\n init: function (itemSelector, parentTable) {\n var me = this;\n me._super(itemSelector);\n me._jObject = $(itemSelector);\n me._parentTable = parentTable;\n me._isDisabled = parentTable.isDisabled();\n },\n\n /**\n * Признак недоступности строки для изменения.\n *\n * @method WebAccess.components.wrappers.form.BaseTableLine#isDisabled\n * @return {boolean} True – строка доступна только для чтения , иначе False.\n */\n isDisabled: function () {\n return this._isDisabled;\n },\n\n /**\n * Cделать элемент недоступным.\n * Делает недоступными вложенные в элемент реквизиты. \n * Реквизитам присваивается атрибут «Только чтение».\n *\n * @method WebAccess.components.wrappers.form.BaseTableLine#disable\n * @return {WebAccess.components.wrappers.form.BaseTableLine} Объект типа BaseTableLine.\n */\n disable: function () {\n this._disable();\n this._isDisabled = true;\n this.fire('disable');\n return this;\n },\n\n /**\n * Cделать элемент доступным.\n * Делает доступными вложенные в элемент реквизиты. С реквизитов убирается атрибут «Только чтение».\n *\n * @method WebAccess.components.wrappers.form.BaseTableLine#enable\n * @return {WebAccess.components.wrappers.form.BaseTableLine} Объект типа BaseTableLine.\n */\n enable: function () {\n this._enable();\n this._isDisabled = false;\n this.fire('enable');\n return this;\n },\n\n /**\n * Cкрыть элемент.\n *\n * @method WebAccess.components.wrappers.form.BaseTableLine#hide\n * @return {WebAccess.components.wrappers.form.BaseTableLine} Объект типа BaseTableLine.\n */\n //FIXME: Shabardin_PI: WA.CR.form.controls.tables.STcxGrid1.columns[\"НомСтр\"].hide() - большая печаль с заголовками и с таблицей в целом при скрытии столбца.\n hide: function () {\n var me = this;\n _(me.requisites.toArray()).each(function (req) {\n req.hide();\n });\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить элемент.\n *\n * @method WebAccess.components.wrappers.form.BaseTableLine#show\n * @return {WebAccess.components.wrappers.form.BaseTableLine} Объект типа BaseTableLine.\n */\n show: function () {\n \n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Формирует полное имя реквизита - с номер детального раздела и номером строки черех символ $.\n * @method WebAccess.components.wrappers.form.BaseTableLine#_makeFullName\n * @private\n * @since 5.0.0.7100\n */\n _makeFullName: function (reqName, newRowNum) {\n return '' + this._parentTable.detailNum + '$' + newRowNum + '$' + reqName;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Возвращает таблицу, к которой относится строка.\n *\n * @method WebAccess.components.wrappers.form.BaseTableLine#getTable\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table\n */\n getTable: function () {\n return this._parentTable;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n global.components.wrappers.form.BaseTableLine = BaseTableLine;\n})(window.WebAccess);","\"use strict\";\n\n/**\n* Строка таблицы.\n* \n* @class WebAccess.components.wrappers.form.TableRow\n* @extends WebAccess.components.wrappers.form.BaseTableLine\n* @property {string} name Имя реквизита\n* @property {string} selector Путь в DOM-иерархии к объекту группы, например div.content#container\n* @param {string} itemSelector Существующий элемент страницы\n*/\n(function (global) {\n\n /**\n * Имя реквизита \"Номер строки\"\n */\n var ROW_NUMBER = {\n VALUE: L('DETAIL_REQ_NUMBER'),\n DISPLAY_VALUE: 'Field_' + L('DETAIL_REQ_NUMBER')\n }\n\n var TableRow = global.components.wrappers.form.BaseTableLine.extend({\n className: \"TableRow\",\n\n _rowID: null,\n _isNew: false,\n rowNum: -1,\n requisites: {},\n\n // Событие когда вся строка или колонка проинициализирована, т.к. значения всех реквизитов есть.\n Init: null,\n // Массив Init для каждого реквизита в виде Deffered объектов.\n _reqValuesInit: null,\n\n init: function (itemSelector, rowNum, rowData, isNew, parentTable, grid) {\n var me = this;\n me._super(itemSelector, parentTable);\n\n me.Init = $.Deferred();\n me._reqValuesInit = [];\n\n var rowNumReq = rowData.requisitesData[ROW_NUMBER.VALUE];\n me.name = rowNumReq ? rowNumReq.value : rowNum;\n me.rowNum = rowNumReq ? +rowNumReq.value : +rowNum;\n\n me.id = me._rowID = +rowData.id;\n me._isNew = isNew;\n\n me.requisites = new global.components.wrappers.form.RequisiteCollection();\n var reqData = rowData.requisitesData;\n\n for (var reqName in reqData) {\n if (reqName === 'class') continue;\n\n var req = me._createRequisite(reqName, reqData[reqName], true, grid);\n req.fullName = me._makeFullName(reqName, me._rowID);\n req._isNew = isNew;\n\n if (me.isDisabled()) {\n req.disable();\n }\n\n req.bind(req['class'].EVENT.CHANGE, function () {\n me.fire(me['class'].EVENT.CHANGE);\n });\n\n me.requisites.addElement(reqName, req);\n }\n me._jDataItems = $('div[name=\"' + me.name + '\"]');\n\n // _reqValuesInit заполняется в родительском классе requisitesMixin\n $.when.apply(null, me._reqValuesInit).then(function () {\n me.Init.resolve();\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Получает признак, что запись новая\n * @method WebAccess.components.wrappers.form.TableRow#isNew\n * @return {boolean} Признак, что запись новая\n * @since 5.2.0.1300\n */\n isNew: function () {\n return this._isNew;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить ИД строки.\n *\n * @method WebAccess.components.wrappers.form.TableRow#getRowId\n * @since 5.0.0.7100\n * @return {integer} ИД строки детального раздела.\n */\n getRowId: function () {\n return this._rowID;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает значения всех реквизитов для отправки на сервер.\n * @method WebAccess.components.wrappers.form.TableRow#_getActualValues\n * @private\n * @since 5.0.0.7100\n */\n _getActualValues: function () {\n var me = this;\n var tbl = me._parentTable._jObject;\n var row = me._jObject;\n var rowId = me._rowID;\n\n var res = {};\n var reqs = this.requisites.toArray();\n for (var reqI = 0; reqI < reqs.length; reqI++) {\n var req = reqs[reqI];\n if (req.isChanged() || req.isNew() || (req._data.type === 'pick' && req.isRequired() && req.isRendered())) {\n res[me._makeFullName(req.name, rowId)] = req.getValue();\n }\n };\n\n //Дополнительные скрытые реквизиты.\n if (row.data('hiddenRequisites')) {\n // Модифицируем отправляемые данные с учетом ИД строк.\n var modHiddReqs = {};\n var hiddReqs = row.data('hiddenRequisites');\n for (var fullReqName in hiddReqs) {\n if (fullReqName.indexOf('$') !== -1) {\n var reqNameParts = fullReqName.split('$');\n if (reqNameParts.length === 3) {\n modHiddReqs[me._makeFullName(reqNameParts[2], rowId)] = hiddReqs[fullReqName];\n }\n }\n };\n $.extend(res, modHiddReqs);\n }\n\n return res;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удалить строку.\n *\n * @method WebAccess.components.wrappers.form.TableRow#remove\n * @return {WebAccess.components.wrappers.form.TableRow} Объект типа TableRow.\n * @since 5.0.0.7100\n */\n remove: function () {\n this._parentTable.deleteRow(this._rowID);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сделать строку недоступной для изменения.\n *\n * @method WebAccess.components.wrappers.form.TableRow#disable\n * @return {WebAccess.components.wrappers.form.TableRow} Объект типа TableRow.\n */\n disable: function () {\n this._super();\n this._jObject.find(\".Delete_16\\\\.png\").hide();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Делает активным, доступными для изменения все реквизиты строки.\n * @method WebAccess.components.wrappers.form.TableRow#enable\n * @return WebAccess.components.wrappers.form.TableRow\n * @comment Keit_B: не было ранее, пока не смотрю.\n */\n enable: function () {\n this._super();\n this._jObject.find(\".Delete_16\\\\.png\").show();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить реквизиты записи детального раздела.\n * \n * @method WebAccess.components.wrappers.form.TableRow#getRequisites\n * @return {WebAccess.components.wrappers.form.RequisiteCollection} Объект типа RequisiteCollection.\n * @since 5.0.0.7100\n */\n getRequisites: function () {\n return this.requisites;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Если ли заполненные реквизиты строки, кроме системых.\n * \n * @method WebAccess.components.wrappers.form.TableRow#hasFilledRequisites\n * @return {boolean} Если ли заполненные реквизиты строки, кроме системых .\n * @since 5.5.0.1000\n */\n hasFilledRequisites: function () {\n var reqs = this.requisites.toArray();\n return reqs.some(function (req) {\n var reqVal = req.getValue();\n return !req.isSystem() && typeof reqVal !== 'undefined' && reqVal !== '' && reqVal !== null; // 0 - это нормальное значение.\n });\n }\n\n },\n {\n EVENT: {\n /**\n * Событие срабатывает если данные в строке были изменены.\n *\n * @event WebAccess.components.wrappers.form.TableRow.EVENT.CHANGE\n * @param {object} context ссылка на экземпляр класса\n * @since 5.5.0.2201\n */\n CHANGE: 'change'\n //-------------------------------------------------------------------//\n }\n });\n\n global.components.wrappers.form.TableRow = TableRow;\n})(window.WebAccess);","\"use strict\";\r\n\r\n/**\r\n* Колонка таблицы.\r\n* \r\n* @class WebAccess.components.wrappers.form.TableColumn\r\n* @extends BaseObject\r\n* @property {string} reqName Имя реквизита.\r\n* @property {WebAccess.components.wrappers.form.Table} parentTable Таблица, которой принадлежит колонка.\r\n* @param {number} num Номер детального раздела.\r\n*/\r\n(function (global) {\r\n\r\n var TableColumn = BaseObject.extend({\r\n className: \"TableColumn\",\r\n\r\n reqName: '',\r\n _parentTable: null,\r\n _isDisabled: null,\r\n _isRendered: null,\r\n _isVisible: null,\r\n _isSystem: null,\r\n _isCanGUIRead: null,\r\n number: null,\r\n dfmName: '',\r\n\r\n init: function (reqName, parentTable, num) {\r\n var me = this;\r\n me._super();\r\n me.name = reqName;\r\n me.reqName = reqName;\r\n me._parentTable = parentTable;\r\n me.number = num;\r\n\r\n // Получить метаинформацию по колонке\r\n var currentColumnMetadata = me._parentTable.getColumnMetadata(me.reqName);\r\n\r\n me.dfmName = currentColumnMetadata.DFMName;\r\n\r\n // Установить свойства изменяемости и доступности\r\n me._isDisabled = currentColumnMetadata.IsReadOnly;\r\n me._isVisible = currentColumnMetadata.IsVisible;\r\n me._isSystem = currentColumnMetadata.IsSystem;\r\n me._isRendered = currentColumnMetadata.IsRendered;\r\n me._isCanGUIRead = currentColumnMetadata.IsCanGUIRead;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получить свойство возможности визуального чтения реквизита.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#getCanGUIRead\r\n * @return {boolean} True – значение отображается, иначе False.\r\n */\r\n getCanGUIRead: function() {\r\n return this._isCanGUIRead;\r\n },\r\n\r\n /**\r\n * Установить свойство возможности визуального чтения реквизита.\r\n * Данное свойство не изменяет визуально колонку, т.к. при установке значения в True необходимо\r\n * получать и устанавливать значения каждой строки детального раздела.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#setCanGUIRead\r\n */\r\n setCanGUIRead: function(value) {\r\n this._isCanGUIRead = value;\r\n },\r\n\r\n /**\r\n * Признак недоступности колонки для изменения.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#isDisabled\r\n * @return {boolean} True – колонка доступна только для чтения , иначе False.\r\n */\r\n isDisabled: function () {\r\n return this._isDisabled;\r\n },\r\n\r\n /**\r\n * Признак видимости колонки.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#isVisible\r\n * @return {boolean} True – колонка отображается, иначе False.\r\n */\r\n isVisible: function () {\r\n return this._isVisible;\r\n },\r\n\r\n /**\r\n * Признак, что реквизит колонки системный.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#isSystem\r\n * @return {boolean} True – реквизит колонки системный, иначе False.\r\n */\r\n isSystem: function () {\r\n return this._isSystem;\r\n },\r\n\r\n /**\r\n * Признак наличия колонки в списке отображаемых.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#isRendered\r\n * @return {boolean} True – колонка была вынесена на форму в редакторе форм, иначе False.\r\n */\r\n isRendered: function () {\r\n return this._isRendered;\r\n },\r\n\r\n /**\r\n * Cделать колонку недоступной для изменения.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#disable\r\n * @return {WebAccess.components.wrappers.form.TableColumn} Объект типа TableColumn.\r\n */\r\n disable: function () {\r\n var me = this;\r\n var rows = me._parentTable.rows.toArray();\r\n rows.forEach(function (currentRow) {\r\n currentRow.requisites[me.reqName].disable();\r\n });\r\n me._isDisabled = true;\r\n return me;\r\n },\r\n\r\n /**\r\n * Cделать колонку доступной для изменения.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#enable\r\n * @return {WebAccess.components.wrappers.form.TableColumn} Объект типа TableColumn.\r\n */\r\n enable: function () {\r\n var me = this;\r\n var rows = me._parentTable.rows.toArray();\r\n rows.forEach(function (currentRow) {\r\n currentRow.requisites[me.reqName].enable();\r\n });\r\n me._isDisabled = false;\r\n return me;\r\n },\r\n\r\n /**\r\n * Скрыть колонку.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#hide\r\n * @return {WebAccess.components.wrappers.form.TableColumn} Объект типа TableColumn.\r\n */\r\n hide: function () {\r\n if (this._isRendered) {\r\n this._parentTable._grid.hideColumn(this.reqName);\r\n this._isVisible = false;\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * Показать колонку.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#show\r\n * @return {WebAccess.components.wrappers.form.TableColumn} Объект типа TableColumn.\r\n */\r\n show: function () {\r\n var me = this;\r\n if (me._isRendered) {\r\n var index = 0;\r\n var parentGrid = me._parentTable._grid;\r\n parentGrid._columns.some(function (currentColumn) {\r\n if (currentColumn.id === me.reqName) {\r\n index = currentColumn.index;\r\n return true;\r\n }\r\n return false;\r\n });\r\n parentGrid.showColumn(me.reqName, index);\r\n me._isVisible = true;\r\n }\r\n return me;\r\n },\r\n\r\n /**\r\n * Возвращает таблицу, к которой относится колонка.\r\n *\r\n * @method WebAccess.components.wrappers.form.TableColumn#getTable\r\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table\r\n */\r\n getTable: function () {\r\n return this._parentTable;\r\n }\r\n });\r\n\r\n global.components.wrappers.form.TableColumn = TableColumn;\r\n})(window.WebAccess);","\"use strict\";\n\n\n/**\n * Событие срабатывает после удаления строки таблицы.\n * @param {integer} rowNum Номер удаленной строки.\n * @event WebAccess.current.form.controls.tables.TableName#deleteRow\n */\n\n/**\n * Событие срабатывает после скрытия таблицы.\n * @event WebAccess.current.form.controls.tables.TableName#hide\n */\n\n/**\n * Событие срабатывает после отображения таблицы.\n * @event WebAccess.current.form.controls.tables.TableName#show\n */\n\n/**\n * Событие срабатывает после включения таблицы.\n * @event WebAccess.current.form.controls.tables.TableName#enable\n */\n\n/**\n * Событие срабатывает после отключения таблицы.\n * @event WebAccess.current.form.controls.tables.TableName#disable\n */\n\n/**\n * Событие срабатывает после добавления или удаления строки таблицы.\n * @event WebAccess.current.form.controls.tables.TableName#change\n */\n\n(function (global) {\n\n /**\n * Команды для сохранения карточки объекта.\n * @inner\n */\n var COMMAND = {\n ADD_ROW: 1,\n DELETE_ROW: 2\n };\n\n /** \n * Имя реквизита \"Номер строки\"\n * @inner\n */\n var ROW_NUMBER = {\n VALUE: L('DETAIL_REQ_NUMBER'),\n DISPLAY_VALUE: 'Field_' + L('DETAIL_REQ_NUMBER')\n }\n\n /**\n * Класс для хранения списка столбцов таблицы и \n * предоставления методов для работы с ними. \n * @class ColumnsCollection\n * @extends BaseTableCollection\n */\n var ColumnsCollection = WebAccess.Collection.extend({\n className: \"ColumnsCollection\",\n\n /**\n * Родительская таблица.\n * @property ColumnsCollection#_parentTable //\n * @private\n * @since 5.0.0.7100\n */\n _parentTable: null,\n _data: null,\n _isChanged: false,\n\n init: function (colsData, parentTable, grid) {\n var me = this;\n me._super();\n me._parentTable = parentTable;\n me._data = colsData;\n var num = 0;\n for (var reqName in colsData) {\n me.addElement(reqName, me._createTableColumn(reqName, null, num));\n num++;\n }\n },\n //---------------------------------------------------------------------//\n\n /**\n * Создает объект колонки.\n * @method ColumnsCollection#_createTableColumn\n * @private\n * @since 5.0.0.7100\n */\n _createTableColumn: function (reqName, isDisabled, num) {\n var newCol = new WebAccess.components.wrappers.form.TableColumn(reqName, this._parentTable, num);\n if (isDisabled) {\n newCol.disable();\n }\n return newCol;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить список видимых колонок таблицы.\n * @method ColumnsCollection#getVisibleColumns\n * @since 5.5.0.1007\n * @return {object} Массив TableColumn.\n */\n getVisibleColumns: function () {\n return this._arr.filter(function (column) {\n return column.isVisible;\n });\n }\n });\n //-----------------------------------------------------------------------//\n\n /**\n * Класс для хранения списка строк таблицы и \n * предоставления методов для работы с ними. \n * @class RowsCollection\n * @extends BaseTableCollection\n */\n var RowsCollection = WebAccess.Collection.extend({\n className: \"RowsCollection\",\n\n /**\n * Родительская таблица.\n * @method RowsCollection#_parentTable\n * @private\n * @since 5.0.0.7100\n */\n _parentTable: null,\n Init: null,\n //---------------------------------------------------------------------//\n\n init: function (rowsData, parentTable, grid) {\n var me = this;\n me._super();\n me._grid = grid;\n me._parentTable = parentTable;\n\n me.Init = $.Deferred();\n var rowsInit = [];\n\n for (var rowId in rowsData) {\n var currentRow = me._addRow(rowId, rowsData[rowId], false);\n rowsInit.push(currentRow.Init);\n }\n\n $.when.apply(null, rowsInit).then(function () {\n me.Init.resolve();\n });\n },\n //---------------------------------------------------------------------//\n\n /**\n * Добавляет новую строку в коллекцию.\n * @method RowsCollection#_addRow\n * @return {object} Строка детального раздела.\n * @private\n * @since 5.0.0.7100\n */\n _addRow: function (rowID, rowData, isNew) {\n var me = this;\n var parentTableSelector = me._parentTable.selector;\n var row = new WebAccess.components.wrappers.form.TableRow(parentTableSelector + ' #' + rowID, rowID, rowData, isNew, me._parentTable, me._grid);\n me.addElement(rowID, row);\n return row;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Удаляет строку из коллекции.\n * @method RowsCollection#_deleteRow\n * @private\n * @since 5.0.0.7100\n */\n _deleteRow: function (rowID) {\n this.deleteElement(rowID);\n },\n //---------------------------------------------------------------------//\n\n /**\n * Удаляет строку детального раздела.\n * @method RowsCollection#deleteRow\n * @private\n * @since 5.0.0.7100\n */\n deleteRow: function (rowNum) {\n this._parentTable.deleteRow(rowNum);\n return this;\n }\n //---------------------------------------------------------------------//\n });\n //-----------------------------------------------------------------------//\n\n /**\n * Таблица. \n * \n * @class WebAccess.components.wrappers.form.Table\n * @extends BaseObject\n * @param {string} itemSelector Cуществующий элемент страницы\n * @param {object} formData Данные реквизитов таблицы\n * @property {string} name Имя таблицы\n * @property {string} selector Путь к объекту группы в DOM-иерархии\n * @property {integer} detailNum Номер детального раздела\n * @property {integer} detailName Номер детального раздела в строковом представлении. Параметр устаревший, оставлен для совместимости с ранними версиями\n * @property {integer} rows Строка таблицы\n * @property {integer} columns Колонка таблицы\n * @property {string} parentTabName Имя закладки, на которой располагается элемент\n * @example \n * WA.CR.form.controls.tables.STcxGrid1.addRow({'ISBCoordX':{value:1, displayValue:'1'}})\n */\n var Table = BaseObject.extend({\n className: \"Table\",\n\n _grid: null,\n _uid: 0,\n _isDisabled: false,\n _currentForm: null,\n _columnsMetadata: {},\n _gridColumnsMetadata: {},\n\n detailNum: -1,\n detailName: \"\", //Оставлено для совместимости.\n rows: null,\n columns: null,\n parentTabName: null,\n _data: null,\n _hasPendingOperation: null, //для ограничения одновременно отправляемых запросов на сервер\n Init: null, // Событие таблица проинициализирована\n\n serviceURL: '/CardForm.asmx',\n\n _objectLink: null,\n _objectView: null,\n //---------------------------------------------------------------------//\n\n init: function (itemSelector, params) {\n var me = this;\n\n me.Init = $.Deferred();\n\n me._currentForm = params.current.form;\n\n me.serviceURL = params.serviceURL || '/CardForm.asmx';\n me._objectLink = params.objectLink || $.toJSON(new WA.Link().toLinkModel());\n\n me._objectView = params.objectView;\n if (!me._objectView && me._objectView !== '') { //Пустая строка считается нормальным значением.\n me._objectView = WA.CR.getReferenceView();\n }\n\n me._hasPendingOperation = {\n 'addRow': false,\n 'copyRow': false,\n 'deleteRow': false\n };\n\n if (!params.formData) return;\n me._super(params.formData);\n me._data = params.formData;\n\n\n me._jObject = $(itemSelector);\n\n me.parentTabName = me._jObject.parents('.CardForm_Tab').data('dfmName');\n\n me.name = me._jObject.attr(\"id\");\n\n me._grid = params.grids[me.name];\n me._grid.setTable(this);\n\n me.selector = \"#\" + me.name;\n\n me.detailNum = +me._jObject.data('detailSectionNumber');\n\n me.detailName = '' + me.detailNum; //Оставлено для совместимости.\n me._isDisabled = this._data.isreadonly || me._jObject.data('readonly');\n me._uid = 0;\n\n // Если нет вкладок, инициализируем таблицу.ColumnsCollection\n me._initColumns()\n me._initRows();\n\n $.when(me.rows.Init).then(function () {\n // Событие изменения строки\n var tableRows = me.rows.toArray();\n tableRows.forEach(function (row) {\n row.bind(row['class'].EVENT.CHANGE, function () {\n me.fire(me['class'].EVENT.CHANGE);\n });\n });\n\n me.Init.resolve();\n });\n },\n //---------------------------------------------------------------------//\n\n _initColumns: function () {\n var me = this;\n me._columnsMetadata = me.getColumnsMetadata();\n me._gridColumnsMetadata = {};\n\n // Получить информацию о колонках\n me._columnsMetadata.forEach(function (currentColumn) {\n var reqName = currentColumn.Name;\n me._gridColumnsMetadata[reqName] = {\n fieldName: \"Field_\" + reqName,\n isVisible: currentColumn.IsVisible,\n isReadOnly: currentColumn.IsReadOnly,\n type: requisiteTypeToString(currentColumn.Type),\n isRequired: currentColumn.IsRequired,\n hasCalculation: currentColumn.HasCalculation,\n isSystem: currentColumn.IsSystem\n }\n });\n\n me.columns = new ColumnsCollection(me._gridColumnsMetadata, me, me._grid);\n },\n\n _initRows: function () {\n var me = this;\n var rows = me._grid.dataView.getItems() || [];\n var rowsData = me._makeRowsData(rows);\n me.rows = new RowsCollection(rowsData, me, me._grid);\n me.fire(me['class'].EVENT.DATA_RELOADED, me);\n },\n //---------------------------------------------------------------------//\n\n _makeEmptyRow: function (id, opt_row) {\n var me = this;\n var row = _(me.columns).mapObject(function (val, key) { return '' });\n if (opt_row) $.extend(row, opt_row);\n row.id = id;\n return row;\n },\n\n //---------------------------------------------------------------------//\n\n /**\n * Создает данные для построения реквизитов новой строки\n * @private\n */\n _makeRowsData: function (rows) {\n var me = this;\n var rowsMetadata = {};\n \n for (var i = 0; i < rows.length; i++) {\n var rowId = rows[i]['id'];\n me._columnsMetadata.forEach(function (columnMetadata) {\n var columnRequisiteName = columnMetadata.Name;\n\n var gridColumnMetadata = me._gridColumnsMetadata[columnRequisiteName];\n var currentColumn = me.columns[columnRequisiteName];\n var requisiteMetadata = {\n row_id: rowId,\n fieldName: gridColumnMetadata.fieldName,\n value: rows[i][columnRequisiteName],\n displayValue: rows[i][gridColumnMetadata.fieldName],\n isVisible: currentColumn.isVisible(),\n isReadOnly: currentColumn.isDisabled() || me.isDisabled(),\n type: gridColumnMetadata.type,\n isRequired: gridColumnMetadata.isRequired,\n hasCalculation: gridColumnMetadata.hasCalculation,\n isSystem: gridColumnMetadata.isSystem\n };\n\n if (!rowsMetadata[rowId]) {\n rowsMetadata[rowId] = {\n id: rowId,\n requisitesData: {}\n };\n }\n rowsMetadata[rowId]['requisitesData'][columnRequisiteName] = requisiteMetadata;\n });\n }\n\n return rowsMetadata;\n },\n //---------------------------------------------------------------------//\r\n\r\n /**\r\n * Сбросить выделение с ячейки.\r\n * @since 5.0.0.2706\r\n * @method WebAccess.components.wrappers.form.Table#resetActiveCell\r\n */\r\n resetActiveCell: function () {\r\n var me = this;\r\n var grid = me._grid.grid;\r\n var activeCell = grid.getActiveCell();\r\n if (activeCell) {\r\n grid.resetActiveCell();\r\n }\r\n },\r\n //---------------------------------------------------------------------//\n\n /**\n * Признак изменения реквизитов таблицы.\n * @since 5.0.0.7100\n * @method WebAccess.components.wrappers.form.Table#isChanged\n * @return {boolean} True – таблица была изменена, иначе False.\n */\n isChanged: function () {\n if (this._isChanged === true) return true;\n var rows = this.rows.toArray();\n for (var i = 0; i < rows.length; i++) {\n if (rows[i].isChanged()) {\n return true;\n }\n }\n return false;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Признак недоступности реквизитов таблицы.\n * @method WebAccess.components.wrappers.form.Table#isDisabled\n * @return {boolean} True, если реквизиты таблицы не доступны для изменения, иначе False.\n * @since 5.0.0.7100\n */\n isDisabled: function () {\n return this._isDisabled;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить метаданные по колонкам таблицы.\n * @method WebAccess.components.wrappers.form.Table#getColumnsMetadata\n * @return {object} Список объектов с информацией о колонках.\n */\n getColumnsMetadata: function () {\n return this._jObject.data('columns');\n },\n //---------------------------------------------------------------------//\n\n\n /**\n * Получить метаданные по колонке таблицы.\n * @method WebAccess.components.wrappers.form.Table#getColumnMetadata\n * @param {string} columnName Имя колонки, по которой получаются метаданные.\n * @return {object} Метаданные по колонке.\n */\n getColumnMetadata: function (columnName) {\n if (columnName) {\n var columnsMetadata = this.getColumnsMetadata();\n var columnMetadata = columnsMetadata.filter(function (item) {\n return item.Name === columnName;\n });\n if (columnMetadata.length > 0) return columnMetadata[0];\n }\n return;\n },\n\n /**\n * Скрыть таблицу.\n * @method WebAccess.components.wrappers.form.Table#hide\n * @fires WebAccess.components.wrappers.form.Table#hide\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table.\n */\n hide: function () {\n this._jObject.css('visibility', 'hidden');\n this.fire('hide');\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Отобразить таблицу.\n * @method WebAccess.components.wrappers.form.Table#show\n * @fires WebAccess.components.wrappers.form.Table#show\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table.\n */\n show: function () {\n this._jObject.css('visibility', 'visible');\n this.fire('show');\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Сделать доступными реквизиты таблицы.\n * @method WebAccess.components.wrappers.form.Table#enable\n * @fires WebAccess.components.wrappers.form.Table#enable\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table.\n */\n enable: function () {\n var me = this;\n var rows = me.rows.toArray();\n for (var i = 0; i < rows.length; i++) {\n rows[i].enable();\n }\n me._isDisabled = false;\n me.fire('enable');\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Сделать недоступными реквизиты таблицы.\n * @method WebAccess.components.wrappers.form.Table#disable\n * @fires WebAccess.components.wrappers.form.Table#disable\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table.\n */\n disable: function () {\n var me = this;\n var rows = me.rows.toArray();\n for (var i = 0; i < rows.length; i++) {\n rows[i].disable();\n }\n me._isDisabled = true;\n me.fire('disable');\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить столбцы таблицы. \n * Столбцы в данном случае – объекты типа TableColumn.\n *\n * @method WebAccess.components.wrappers.form.Table#getColumns\n * @see Column\n * @see ColumnsCollection\n * @return {ColumnsCollection} Объект типа ColumnsCollection.\n */\n getColumns: function () {\n return this.columns;\n },\n //---------------------------------------------------------------------//\n\n /** \n * Обновить идентификатор строки\n * @private \n */\n _updateRowID: function (oldId, newId) {\n var me = this;\n var dataView = me._grid.dataView;\n var row = dataView.getItemById(oldId);\n if (!row) return this;\n\n row.id = newId;\n this.rows.deleteElement(oldId)\n dataView.deleteItem(oldId)\n dataView.addItem(row);\n var rowsData = me._makeRowsData([row]);\n this.rows._addRow(newId, rowsData[newId], false);\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить строки таблицы. \n * Строки в данном случае – объекты типа TableRow.\n *\n * @method WebAccess.components.wrappers.form.Table#getRows\n * @see Row\n * @see RowsCollection\n * @return {Object} Объект содержащий строки таблицы. Ключом является номер строки. Также в объекте есть метод count, возвращающий количество строк.\n * @deprecated since 5.0.0.7100\n */\n getRows: function () {\n var me = this;\n var resultRowsByName = {};\n var rows = me.rows.toArray();\n for (var rowI = 0; rowI < rows.length; rowI++) {\n resultRowsByName[rows[rowI].name] = rows[rowI];\n }\n resultRowsByName['count'] = function () {\n return me.rows.count();\n };\n return resultRowsByName;\n },\n //---------------------------------------------------------------------//\n\n _getGeneratedRow: function (isBuilderEventsSupported, opt_requisiteValues, opt_sync) {\n var me = this;\n me._uid -= 1;\n\n var newRowNumber = me._getNextRowNumber();\n\n var result = $.Deferred();\n\n if (isBuilderEventsSupported) {\n me._hasPendingOperation['addRow'] = true;\n\n me._sendRequest('CreateTableRow', {\n Obj: me._objectLink,\n Requisites: opt_requisiteValues || {},\n View: me._objectView,\n DetailNum: me.detailNum,\n Number: newRowNumber\n }, opt_sync).done(function (data) {\n if (data !== \"\") {\n data = $.parseJSON(data);\n \n result.resolve(data);\n }\n }).fail(function (errorMessage, response) {\n // В ответе с ошибкой могут прийти изменения других реквизитов и их надо будет обработать.\n if (response && response.Result) {\n var data = $.parseJSON(response.Result);\n result.reject(data);\n }\n }).always(function () {\n me._hasPendingOperation['addRow'] = false;\n });\n } else {\n // Здесь нам нужны все реквизиты, иначе потом в случае ошибки \n // мы не сможем полноценно обновить эту строку в методе updateRowID\n var row = me.columns.toArray()\n .filter(function (col) { return !col.isSystem(); }) //пропускаем системные реквизиты, т.к. их нельзя устанавливать.\n .reduce(function (prev, curr) { prev[curr.name] = null; return prev; }, {}); // преобразуем массив колонок в объект типа {colName1: null, ...}\n\n row.id = me._uid;\n row[ROW_NUMBER.VALUE] = row[ROW_NUMBER.DISPLAY_VALUE] = newRowNumber;\n\n // Устанавливаем значение реквизитов.\n if (!!opt_requisiteValues) {\n for (var reqName in opt_requisiteValues) {\n var reqValue = opt_requisiteValues[reqName];\n if (!_.isUndefined(row[reqName])) {\n row[reqName] = reqValue.value;\n row['Field_' + reqName] = reqValue.displayValue;\n }\n }\n }\n\n me._currentForm._commandList.push({\n CmdCode: COMMAND.ADD_ROW,\n Section: me.detailNum,\n ID: me._uid\n });\n\n result.resolve({ RowData: row });\n }\n return result;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Генерирует следующий номер строки.\n * @private\n */\n _getNextRowNumber: function () {\n var me = this;\n var lastRowNum = 0;\n\n var dataView = me._grid.dataView;\n var exisitingRows = dataView.getItems() || [];\n\n if (exisitingRows.length) {\n var lastRowNum = _(exisitingRows).chain().map(function (r) {\n return +r[ROW_NUMBER.VALUE]\n }).max().value();\n }\n\n return +lastRowNum + 1;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Добавить строку детального раздела.\n *\n * @function WebAccess.components.wrappers.form.Table#addRow\n * @param {object} opt_requisiteValues Значение реквизитов в формате: \n * {'имя реквизита': {value: 'значение', displayValue: 'отображаемое значение', 'needTriggerResult': 'true|false нужно ли вызывать событие на установку значения (по умолчанию true)'},...}\n * @param {function} opt_callback Функция для добавления строки. Предназначена для совместимости. Рекомендуется использовать событие типа addRow\n * @param {boolean} opt_sync Признак синхронного создания строки. Предназначен для свместимости. Рекомендуется использовать асинхронное создание строки\n * @fires WebAccess.components.wrappers.form.Table#addRow\n * @fires WebAccess.components.wrappers.form.Table#change\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table.\n */\n addRow: function (opt_requisiteValues, opt_callback, opt_sync) {\n var me = this;\n\n if (me._hasPendingOperation['addRow']) return me;\n\n me._getGeneratedRow(me._grid.settings.isBuilderEventsSupported, opt_requisiteValues, opt_sync).done(function (data) {\n var row = data.RowData;\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n me._appendNewRowToDataView(row, changes, changedMultiSelects, function (tableRow) {\n // Отбираем колонки, у которых CanGUIRead = false\r\n var currentTableColumns = me.columns.toArray();\r\n currentTableColumns.forEach(function (column) {\r\n var reqName = column.reqName;\r\n var currentRequisite = tableRow.requisites[reqName];\r\n if (!column.getCanGUIRead()) {\r\n currentRequisite.setValue('*', '*', false);\r\n currentRequisite.setUntouched();\r\n }\r\n if (!!opt_requisiteValues && opt_requisiteValues[reqName] && opt_requisiteValues[reqName].needTriggerResult) {\r\n currentRequisite.touch();\r\n }\r\n });\n\n // Установить состояния реквизитов\n tableRow._disableReadOnlyFields();\n\n if ($.isFunction(opt_callback)) opt_callback(tableRow);\n });\n }).fail(function (data) {\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n me.fire('applychanges', null, changes, me, changedMultiSelects);\n });\n\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Копирует строку детального раздела на сервере.\n *\n * @function WebAccess.components.wrappers.form.Table#copyRowOnServer\n * @param {integer} sourceRowId ИД копируемой строки\n * @param {object} opt_requisiteValues Значение реквизитов в формате: \n * {'имя реквизита': {value: 'значение', displayValue: 'отображаемое значение', 'needTriggerResult': 'true|false - признак необходимости вызывать событие для установки значения (по умолчанию true)'},...}\n * @param {function} opt_callback Функция для добавления строки. Предназначена для обратной совместимости с предыдущими версиями. Рекомендуется использовать событие типа addRow\n * @param {boolean} opt_sync Признак синхронного создания строки. Предназначен для обратной совместимости с предыдущими версиями. Рекомендуется использовать асинхронное создание строки\n * @fires WebAccess.components.wrappers.form.Table#addRow\n * @fires WebAccess.components.wrappers.form.Table#change\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table.\n * @since 5.2.0.1300\n */\n copyRowOnServer: function (sourceRowId, opt_requisiteValues, opt_callback, opt_sync) {\n var me = this;\n\n if (me._hasPendingOperation['copyRow']) return me;\n\n var result = $.Deferred();\n var newRowNumber = me._getNextRowNumber();\n\n me._hasPendingOperation['copyRow'] = true;\n\n me._sendRequest('CopyTableRow', {\n Obj: me._objectLink,\n View: me._objectView,\n DetailNum: me.detailNum,\n SourceRowID: sourceRowId,\n Number: newRowNumber,\n Requisites: opt_requisiteValues || {}\n }, opt_sync).done(function (data) {\n data = $.parseJSON(data);\n result.resolve(data);\n }).fail(function (errorMessage, response) {\n // В ответе с ошибкой могут прийти изменения других реквизитов и их надо будет обработать.\n if (response && response.Result) {\n var data = $.parseJSON(response.Result);\n result.reject(data);\n }\n }).always(function () {\n me._hasPendingOperation['copyRow'] = false;\n });\n\n // Строка скопирована, добавляем в DataSource.\n result.done(function (data) {\n var row = data.RowData;\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n me._appendNewRowToDataView(row, changes, changedMultiSelects, opt_callback);\n }).fail(function (data) {\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n me.fire('applychanges', null, changes, me, changedMultiSelects);\n });\n\n return me;\n },\n //---------------------------------------------------------------------//\n\n _appendNewRowToDataView: function (row, changes, changedMultiSelects, opt_callback) {\n var me = this;\n var dataView = me._grid.dataView;\n\n dataView.addItem(row);\n dataView.refresh();\n row = me._makeEmptyRow(row.id, row);\n\n var rowsData = me._makeRowsData([row]);\n me.rows._addRow(row.id, rowsData[row.id], true);\n\n if ($.isFunction(opt_callback)) opt_callback(me.rows[row.id]);\n\n me._isChanged = true;\n me.fire(me['class'].EVENT.ROW_ADDED, me.rows[row.id], me);\n me.fire('change', me.rows[row.id], me);\n me.fire('applychanges', me.rows[row.id], changes, me, changedMultiSelects);\n\n return me;\n },\n //---------------------------------------------------------------------//\n\n _tryToDeleteRow: function (rowID, isBuilderEventsSupported, opt_sync) {\n var me = this;\n var result = $.Deferred();\n\n if (isBuilderEventsSupported) {\n me._hasPendingOperation['deleteRow'] = true;\n\n me._sendRequest('DeleteTableRow', {\n Obj: me._objectLink,\n View: me._objectView,\n DetailNum: me.detailNum,\n RowID: rowID\n }, opt_sync).done(function (data) {\n if (data) data = $.parseJSON(data);\n result.resolve(rowID, data);\n }).fail(function (errorMessage, response) {\n // В ответе с ошибкой могут прийти изменения других реквизитов и их надо будет обработать.\n if (response && response.Result) {\n var data = $.parseJSON(response.Result);\n result.reject(rowID, data);\n }\n }).always(function () {\n me._hasPendingOperation['deleteRow'] = false;\n });\n } else {\n var commands = me._currentForm._commandList;\n var existingCommand = _(commands).findWhere({ 'ID': rowID, 'CmdCode': COMMAND.ADD_ROW, Section: +me.detailNum });\n\n if (existingCommand) {\n //Если удаляем только что добавленую строку, то удаляем и команду на добавление\n me._currentForm._commandList = _(commands).filter(function (cmd) {\n return cmd.ID !== rowID\n });\n } else {\n //Если удаляем существующую строку, то добавим команду на её удаление\n me._currentForm._commandList.push({\n CmdCode: COMMAND.DELETE_ROW,\n Section: me.detailNum,\n ID: rowID\n });\n }\n result.resolve(rowID, {});\n }\n\n return result;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Удалить строку детального раздела.\n *\n * @function WebAccess.components.wrappers.form.Table#deleteRow\n * @param {integer} rowNum Номер строки\n * @fires WebAccess.components.wrappers.form.Table#deleteRow\n * @fires WebAccess.components.wrappers.form.Table#change\n * @fires WebAccess.components.wrappers.form.Table#applychanges\n * @return {TableWebAccess.components.wrappers.form.Table} Объект типа Table.\n * @since 5.0.0.7100\n */\n deleteRow: function (rowId, opt_sync) {\n var me = this;\n\n if (me._hasPendingOperation['deleteRow']) {\n return me;\n }\n\n if (!isNaN(rowId)) {\n\n var dataView = me._grid.dataView;\n var row = dataView.getItemById(rowId);\n me._tryToDeleteRow(+rowId, me._grid.settings.isBuilderEventsSupported, opt_sync).done(function (id, data) {\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n\n dataView.deleteItem(rowId);\n me.rows._deleteRow(rowId);\n me._isChanged = true;\n me.fire('deleteRow', rowId, row);\n me.fire('change', row, me);\n me.fire('applychanges', row, changes, me, changedMultiSelects);\n }).fail(function (id, data) {\n var changes = data.Changes;\n var changedMultiSelects = data.ChangedMultiSelectRequisitesValues;\n me.fire('applychanges', row, changes, me, changedMultiSelects);\n });\n\n } else {\n WA.raise('ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED');\n }\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Вернуть реквизит таблицы по ИД элемента управления.\n *\n * @method WebAccess.components.wrappers.form.Table#getRequisiteByControlId\n * @param {string} controlId ИД HTML-элемента.\n * @since 5.0.0.7100\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Объект реквизита.\n */\n getRequisiteByControlId: function (controlId) {\n log.warning('REQUISITE', 'This method was changed in last version and may work improperly.');\n var rowsArr = this.rows.toArray();\n for (var rowI = 0; rowI < rowsArr.length; rowI++) {\n var row = rowsArr[rowI];\n var reqs = row.requisites.toArray();\n for (var reqI = 0; reqI < reqs.length; reqI++) {\n var req = reqs[reqI];\n for (var j = 0; j < req.controlsIds.length; j++) {\n if (controlId === req.controlsIds[j]) {\n return req;\n }\n }\n }\n }\n return null;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Возвращает строку таблицы по ИД.\n *\n * @method WebAccess.components.wrappers.form.Table#getRowById\n * @return {TableRow} Объект строки.\n * @since 5.2.0.1300\n */\n getRowById: function (rowId) {\n return this.rows[rowId];\n },\n //---------------------------------------------------------------------//\n\n /**\n * Обновляет данные таблицы.\n *\n * @method WebAccess.components.wrappers.form.Table#reloadData\n * @return {Deferred} Специальный deferred-объект\n * @since 5.2.0.1303\n */\n reloadData: function () {\n var me = this;\n log.warn('TABLE', 'Table reloaded. If you have any binded event handlers for rows or columns you must rebind them manualy');\n return this._grid.reloadData().done(function () {\n me._initRows();\n });\n },\n //---------------------------------------------------------------------//\n\n /**\n * Отправляет запрос на веб-сервис.\n * @private\n */\n _sendRequest: function (action, params, opt_sync) {\n var method = WA.SRV.call;\n if (opt_sync === true) {\n method = WA.SRV.callSync;\n }\n return method(this.serviceURL + '/' + action, params);\n },\n //---------------------------------------------------------------------//\n\n /**\n * Привязывает вызов справочника в модальном окне к клику на иконке в поле ввода.\n *\n * @method WebAccess.components.wrappers.form.Table#bindReferenceGridDialog\n * @param {String | Array} requisites Имя или имена реквизитов для привязки логики вызова справочника в модальном окне\n * @return {TableWebAccess.components.wrappers.form.Table} Объект типа Table.\n * @since 5.4.0.1012\n */\n bindReferenceGridDialog: function (requisites) {\n var me = this;\n\n var colNames = typeof (requisites) === 'string' ? [requisites] : requisites;\n\n // На существующие строки.\n var rows = me.rows.toArray();\n for (var i = 0; i < rows.length; i++) {\n bindOnRowRequisites(rows[i]);\n }\n // На новые строки\n me.bind(me['class'].EVENT.ROW_ADDED, function (newRow) {\n bindOnRowRequisites(newRow);\n });\n\n function bindOnRowRequisites(row) {\n for (var j = 0; j < colNames.length; j++) {\n var req = row.requisites[colNames[j]]\n if (req) {\n req.bindReferenceGridDialog();\n }\n }\n }\n\n return me;\n }\n\n }, {\n EVENT: {\n /**\n * Событие срабатывает после добавления строки таблицы.\n *\n * @event WebAccess.components.wrappers.form.Table.EVENT.ROW_ADDED\n * @param {TableRow} newRow Новая строка.\n * @param {object} context ссылка на экземпляр класса\n * @example\n * var table = WebAccess.current.form.controls.tables['STcxGrid1'];\n * table.bind(table['class'].EVENT.ROW_ADDED , function(newRow, table) {\n * console.log(newRow);\n * newRow.requisites['СодержаниеТ2'].setValue('тест', 'тест');\n * });\n * @since 5.2.0.2014\n */\n ROW_ADDED: 'addRow',\n //-------------------------------------------------------------------//\n\n /**\n * Событие срабатывает если данные в таблице были обновлены.\n *\n * @event WebAccess.components.wrappers.form.Table.EVENT.DATA_RELOADED\n * @param {object} context ссылка на экземпляр класса\n * @since 5.2.0.2014\n */\n DATA_RELOADED: 'dataReloaded',\n //-------------------------------------------------------------------//\n \n /**\n * Событие срабатывает если данные в таблице были изменены.\n *\n * @event WebAccess.components.wrappers.form.Table.EVENT.CHANGE\n * @param {object} context ссылка на экземпляр класса\n * @since 5.5.0.2201\n */\n CHANGE: 'change'\n //-------------------------------------------------------------------//\n }\n });\n\n global.Table = Table;\n})(window.WebAccess.components.wrappers.form);\r\n","\"use strict\";\n\n/** \n* Предоставляет инструменты для работы с элементами формы.\n*\n* @class WebAccess.components.wrappers.form.Form\n* @extends BaseObject\n* @mixes WebAccess.mixins.requisitesMixin\n* @param {object} data - данные формы\n* @param {string} serviceUrl - адрес сервиса сохранения данных\n* @since 5.2.0.1600\n*/\n\n/**\n * Выполняется до начала сохранения формы.\n *\n * @event WebAccess.components.wrappers.form.Form#BeforeSave\n * @param {function} process Основной поток действий по выполнению сохранения формы. \n * При необходимости вызов функции позволяет продолжить процесс сохранения в любой момент времени\n * @param {object} data Данные для сохранения формы\n * @param {function} callback Функция, выполняющаяся после сохранения формы. Можно вызвать в любой момент сохранения\n * @example\n *\n * WA.CR.form.bind(\"BeforeSave\", function(process,data,callback) { \n * console.log(process,data,callback); \n * var dialog = new WA.CMP.dialogs.BaseDialog();\n * dialog.setHtml('Карточка не будет сохранена, но страница перезагрузится');\n * dialog.ok = function() {\n * process();\n * }\n * dialog.show();\n * return false; \n * });\n */\n\n/**\n * Выполняется в момент сохранения формы.\n *\n * @event WebAccess.components.wrappers.form.Form#Save\n * @param {function} process Основной поток действий по выполнению сохранения формы. \n * При необходимости вызов функции позволяет продолжить процесс сохранения в любой момент времени\n * @param {object} data Данные для сохранения формы\n * @param {function} callback Функция, выполняющаяся после сохранения формы. Можно вызвать в любой момент сохранения\n */\n\n/**\n * Выполняется после завершения сохранения формы.\n *\n * @event WebAccess.components.wrappers.form.Form#AfterSave\n * @param {function} process Основной поток действий по выполнению сохранения формы. \n * При необходимости вызов функции позволяет продолжить процесс сохранения в любой момент времени\n * @param {object} data Данные для сохранения формы\n * @param {function} callback Функция, выполняющаяся после сохранения формы. Можно вызвать в любой момент сохранения\n */\n\n(function (global) {\r\n\n var CHANGE_TYPE = {\r\n REQUISITE_CHANGE: 0,\n DETAIL_ROW_INSERT: 1,\n DETAIL_ROW_DELETE: 2,\n PICK_VALUES_CHANGE: 3,\n FORM_CONTROL_CHANGE: 4,\n FORM_REQUISITE_CONTROL_CHANGE: 5,\n ACTION_CHANGE: 6,\n REQUISITE_GUI_CHANGE: 7\r\n };\n\n var CONTROL_TYPE = {\r\n TABLE: 6,\n REQUISITE: 9,\n TAB: 23,\n HYPERLINK: 26,\n MULTISELECT: 28,\n DETAIL_SECTION_REQUISITE: 100\r\n };\n\n var Form = BaseObject.extend([global.mixins.requisitesMixin], {\r\n serviceUrl: null,\n _current: null,\n _calcServiceCall: {}, //таймауты вызова сервиса на изменение реквизита (для оптимизации количества запросов).\n\n init: function (data, serviceUrl, opt_current) {\r\n var me = this;\n log.info('FORM', 'Init current form')\n\n me.Init = $.Deferred();\n me._reqValuesInit = [];\n\n me._current = opt_current;\n me._calcServiceCall = {};\n\n this.serviceUrl = serviceUrl;\n me.requisites = new global.components.wrappers.form.RequisiteCollection();\n if (!data) {\n // Если данных нет, то сразу говорим что форма проинициализирована. Нужно для дальнейшего resolv'a WA.FormInit.\n me.Init.resolve();\n return;\r\n }\n me._super(data);\n\n me._data = data;\n\n me._commandList = [];\n this._isDisabled = me._data.isreadonly;\n me._fillRequisites();\n\n if (!me._data.isInitialized) {\r\n me._initRequisiteValues(me._data.req);\r\n } else {\r\n me._bindMirrors(me._data.req);\r\n }\n me._bindCalculation();\n\n var requisites = me.requisites.toArray();\n requisites.forEach(function (req) {\r\n req.bind(req['class'].EVENT.CHANGE, function (el, ev, reqData) {\r\n me.fire(me['class'].EVENT.CHANGE, el, ev, reqData);\r\n });\r\n });\n\n me._current.states.tables.done(function () {\r\n var form = (!!me._current) ? me._current.form : global.current.form;\n var tables = form.controls.tables;\n\n _(tables).forEach(function (table) {\r\n table.bind(table['class'].EVENT.CHANGE, function () {\r\n me.fire(me['class'].EVENT.CHANGE);\r\n });\r\n });\r\n });\n\n // _reqValuesInit заполняется в родительском классе requisitesMixin\n $.when.apply(null, me._reqValuesInit).then(function () {\r\n me.Init.resolve();\n log.info('FORM', 'Current form requsites values inited')\r\n });\r\n },\n //---------------------------------------------------------------------//\n\n\n className: \"Form\",\n\n /**\n * Реквизиты текущей формы.\n * Содержит объекты WebAccess.components.wrappers.form.requisites для управления реквизитами.\n *\n * @namespace WebAccess.current.form.requisites\n * @see WebAccess.components.wrappers.form.requisites\n * @since 5.0.0.7100\n */\n requisites: {},\n\n /**\n * Команды при сохранении.\n * @private\n * @since 5.0.0.7100\n */\n _commandList: [],\n\n /**\n * Исходные данные текущей формы\n * @private\n * @since 5.0.0.7100\n */\n _data: null,\n\n /**\n * Признак активности формы.\n * @private\n * @since 5.0.0.7100\n */\n _isDisabled: false,\n\n // Событие когда вся форма проинициализирована, т.к. значения всех реквизитов есть.\n Init: null,\n // Массив Init для каждого реквизита в виде Deffered объектов.\n _reqValuesInit: null,\n //---------------------------------------------------------------------//\n\n /**\n * Создание объектов реквизитов.\n * @method WebAccess.components.wrappers.form.Form#_fillRequisites\n * @since 5.0.0.7100\n * @private\n */\n _fillRequisites: function () {\r\n for (var reqName in this._data.req) {\r\n this.requisites.addElement(reqName, this._createRequisite(reqName, this._data.req[reqName]));\r\n };\n return this;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получчение значения реквизита для сериализации.\n * @param {Object} requisite Реквизит, значение которого требуется получить.\n * @param {Object} options Настройки сериализации.\n * @returns {Object} Значение реквизита для сериализации.\n * @since 5.2.0.2006\n * @private \n */\n _getRequisiteValueDependsOnOptions: function (requisite, options) {\r\n var result;\n\n if (requisite.getType() == 1 && (options.dateFormat || options.dateTimeFormat)) {\r\n if (requisite.isShowTime()) {\r\n result = formatDateTime(requisite.getDate(), options.dateTimeFormat);\r\n } else {\r\n result = formatDate(requisite.getDate(), options.dateFormat);\r\n }\r\n } else {\r\n result = requisite.getValue();\r\n }\n\n if (!options.onlyValue) {\r\n result = [result, requisite.getDisplayValue()];\r\n }\n\n return result;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Сериализация формы.\n *\n * @method WebAccess.components.wrappers.form.Form#serialize\n * @ignore\n * @param {Object} opt_options Настройки сериализации.\n * @return {Object} Литеральный объект.\n * @since 5.0.0.7300\n *\n * @example\n * var formBackup = WA.CR.form.serialize();\n * WA.cache.setObject('formBackup', formBackup);\n * \n * ...\n *\n * WA.CR.form.deserialize(WA.cache.getObject('formBackup'));\n */\n serialize: function (opt_options) {\r\n var options = opt_options || {\r\n onlyValue: false, // Возвращать только значения, т.е. без отображаемого значения.\n useRowNumber: false, //Возвращать номер строк вместо ИД.\n withoutTables: false, //Не возвращать массив tables.\n dateFormat: '', // Формат дат.\n dateTimeFormat: '', // Формат даты со временем.\n transformMultiReqsToDetailRows: false // Преобразование реквизитов множественного выбора в детальный раздел\n };\n\n var reqs = this.requisites.toArray();\n var result = {};\n result.details = {};\n result.requisites = {};\n for (var i = 0; i < reqs.length; i++) {\r\n result.requisites[reqs[i].name] = this._getRequisiteValueDependsOnOptions(reqs[i], options);\n\n if (options.transformMultiReqsToDetailRows) {\r\n var reqControl = reqs[i].controls[0];\n if (typeof reqControl !== 'undefined') {\r\n var refSelectInstance = reqControl.data('ReferenceSelectInstance');\n if ((typeof reqControl.data('ReferenceSelectInstance') !== 'undefined') && reqControl.data('ReferenceSelectInstance').multiselect) {\n //реквизит множественного выбора\n var currentValue = result.requisites[reqs[i].name];\n if ($.isArray(currentValue)) {\r\n currentValue = currentValue[0];\r\n }\n\n if (!!currentValue) {\r\n var detailNum = refSelectInstance.detailIndex;\n var currentValueArray = currentValue.split(';');\n result.details[detailNum] = {};\n for (var j = 0; j < currentValueArray.length; j++) {\r\n var reqInfo = currentValueArray[j].split(':');\n var multiReqNames = refSelectInstance.referenceCodesAndReqNamesInDetailSection;\n\n result.details[detailNum][j] = {};\n var reqName = multiReqNames[reqInfo[0]].name;\n if (reqName) {\r\n result.details[detailNum][j][reqName] = reqInfo[1];\r\n }\r\n };\r\n }\r\n }\r\n }\r\n }\r\n }\n\n result.tables = {};\n var tables = this.controls.tables;\n for (var table in tables) {\r\n var detailNum = tables[table].detailNum;\n result.tables[table] = {};\n result.details[detailNum] = {};\n var rows = tables[table].rows.toArray()\n for (var i = 0; i < rows.length; i++) {\r\n var row = rows[i];\n var rowIdentifier = row.id;\n if (options.useRowNumber) {\r\n rowIdentifier = row.name; //Номер строки.\n }\n result.tables[table][rowIdentifier] = {};\n result.details[detailNum][rowIdentifier] = {};\n var reqs = row.requisites.toArray();\n for (var k = 0; k < reqs.length; k++) {\r\n var req = reqs[k];\n var value = this._getRequisiteValueDependsOnOptions(req, options);\n result.tables[table][rowIdentifier][req.name] = value;\n result.details[detailNum][rowIdentifier][req.name] = value;\r\n }\r\n }\r\n }\n\n if (options.withoutTables) {\r\n delete result['tables'];\r\n }\n\n return result;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить строковое представление объекта.\n *\n * @method WebAccess.components.wrappers.form.Form#asString\n * @return {String} Строковое представление объекта.\n */\n asString: function () {\r\n return $.toJSON(this.serialize());\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Десериализация формы.\n *\n * @method WebAccess.components.wrappers.form.Form#deserialize\n * @ignore\n * @param {Object} data Сериализованная ранее форма\n * @return {WebAccess.current.form} Преобразованная форма.\n * @since 5.0.0.7300\n *\n * @example\n * var formBackup = WA.CR.form.serialize();\n * WA.cache.setObject('formBackup', formBackup);\n * \n * ...\n *\n * WA.CR.form.deserialize(WA.cache.getObject('formBackup')); \n */\n deserialize: function (data) {\r\n var reqs = data.requisites;\n for (var n in reqs) {\r\n this.requisites[n].setValue(reqs[n][0]).setDisplayValue(reqs[n][1]);\r\n }\n\n var tables = data.tables;\n for (var table in tables) {\r\n for (var rowId in tables[table].rows) {\r\n for (var req in tables.rows[rowId]) {\r\n var row = tables[table].rows[rowId];\n this.controls.tables[table].rows[rowId].requisites[req].setValue(row[req][0]).setDisplayValue(row[req][1]);\r\n }\r\n }\r\n }\n\n return this;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * При наличии вычислении на реквизитах обрабатывать их.\n * \n * @method WebAccess.components.wrappers.form.Form#_bindCalcutaion\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.Form\n */\n _bindCalculation: function () {\r\n var me = this;\n if (!me._current) return;\n\n _.each(me.requisites.toArray(), function (req) {\r\n me._bindRequisiteCalculation(req);\r\n });\n\n me._current.states.tables.done(function () {\r\n var tables = me.controls.tables;\n for (var tableName in tables) {\r\n var table = tables[tableName];\n\n var rebindRow = function (row) {\r\n _.each(row.requisites.toArray(), function (req) {\r\n me._bindRequisiteCalculation(req);\r\n });\r\n };\n\n var rebindTable = function () {\r\n _.each(table.rows.toArray(), function (row) {\r\n rebindRow(row);\r\n });\r\n };\n\n table\n .bind(table['class'].EVENT.DATA_RELOADED, function (table) {\r\n rebindTable(table);\r\n })\n .bind(table['class'].EVENT.ROW_ADDED, function (row) {\r\n rebindRow(row);\r\n })\n .bind('applychanges', function (row, changes, table, changedMultiSelects) {\r\n if (row) row._locked = true;\n me.applyServerSideChanges(changes, changedMultiSelects);\r\n });\n rebindTable();\r\n }\r\n });\n\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Если реквизит имеет вычисления, то реализовать их выполенение\n *\n * @method WebAccess.components.wrappers.form.Form#_bindRequisiteCalculation\n * @private\n * @return {boolean} True – форма на странице существует, иначе False.\n * @since 5.0.0.7100\n */\n _bindRequisiteCalculation: function (req) {\r\n var me = this;\n var parentCurrent = me._current;\n\n if (req.hasCalculation) {\r\n req.bind('change', function (r, ev, data) {\r\n if (req.isCalculationDisabled()) return me;\n req._showSpinner();\n\n //data может быть массивом, когда заполняется реквизит множественного выбора (#108963).\n if ($.isArray(data)) {\r\n var values = _(data).map(function (val) {\r\n return val.value;\r\n }).join(';');\n data = {\r\n value: values\r\n };\r\n }\n\n clearTimeout(me._calcServiceCall[req.fullName]);\n // Событие change может сработать несколько раз в разнымх местах (в разных компонентах) для одно и того же реквизита. Из-за этого отправятся 2 одинаковых запроса, а нам этого не надо.\n // Например, так бывает autoNumeric тригерит change и slickGrid тригерит change через commitCurrentEdit->fire(requisiteChange). По-другому сделать не получилось.\n me._calcServiceCall[req.fullName] = setTimeout(function () {\r\n WA.SRV.call(me.serviceUrl + '/SetRequisiteValue', {\r\n Obj: parentCurrent._getObjectLink(),\n View: (!!parentCurrent.getReferenceView) ? parentCurrent.getReferenceView() : '',\n RequisiteName: req.fullName,\n RequisiteValue: data.value\r\n }).done(function (response) {\n // Чтобы не сработали вычисления повторно.\n req.setUntouched();\n\n var resp = $.parseJSON(response);\n\n var changes = resp.Changes;\n var changedMultiSelects = resp.ChangedMultiSelectRequisitesValues;\n\n me.applyServerSideChanges(changes, changedMultiSelects);\n\n req.setUntouched();\r\n }).fail(function (errorMessage, response) {\n\n // В ответе с ошибкой могут прийти изменения других реквизитов и их надо будет обработать.\n if (response && response.Result) {\r\n var result = $.parseJSON(response.Result);\n var changes = result.Changes;\n var changedMultiSelects = result.ChangedMultiSelectRequisitesValues;\n me.applyServerSideChanges(changes, changedMultiSelects);\r\n }\r\n }).always(function () {\r\n req._hideSpinner();\r\n });\r\n }, 100);\r\n\n });\r\n }\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Обработка изменений пришедших от сервера\n * @param {array} changes набор изменений\n * @method WebAccess.components.wrappers.form.Form#applyServerSideChanges\n * @since 5.2.0.2014\n * @return {WebAccess.components.wrappers.form.Form}\n * @example\n * WA.SRV.call(me.serviceURL + '/ExecuteAction', { \n * ActionName: name,\n * ...\n * }, null, null, true).done(function (response) {\n * var responseAsObject = $.parseJSON(response);\n * \n * // Обрабатываем результат выполнения действия.\n * var dialogResult = responseAsObject.Result;\n * \n * // Обрабатываем изменения реквизитов действием.\n * var changes = responseAsObject.Changes;\n * console.log(changes);\n * WA.CR.form.applyServerSideChanges(changes);\n * \n *}).fail(function (err) {\n * // Показываем ошибку.\n *});\n */\n applyServerSideChanges: function (changes, changedMultiSelects) {\r\n var me = this;\n if (!changes) return me;\n me._applyRequisiteChanges(changes);\n me._applyMultiSelectRequisiteChanges(changedMultiSelects);\n me._applyPickValuesChange(changes);\n me._applySectionsChange(changes);\n me._applyFormControlChanges(changes);\n me._applyActionChanges(changes);\n me._applyRequisiteGuiChange(changes);\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Применить изменения визуальной части реквизитов.\n * @private\n * @param {array} changes Набор изменений.\n * @since 5.5.0.2701\n */\n _applyRequisiteGuiChange: function (changes) {\r\n var me = this;\r\n var current = me._current;\r\n\r\n // Получить изменения визуальной части реквизитов.\r\n var guiChanges = [];\r\n var details = {};\r\n\r\n _(changes).each(function (change) {\r\n if (change.Type === CHANGE_TYPE.REQUISITE_GUI_CHANGE) {\r\n guiChanges.push(change);\r\n if (change.Section) {\r\n details[change.Section] = true;\r\n }\r\n }\r\n });\r\n\r\n // Перед тем, как переходить к обработке визуальных изменений,\r\n // нужно сбросить фокус с активной ячейки грида, иначе невозможно установить\r\n // значение в данную ячейку и возникают ошибки\r\n Object.keys(details).forEach(function (sectionNumber) {\r\n var detail = current.details[sectionNumber];\r\n var tables = detail.getTables().toArray();\r\n tables.forEach(function (table) {\r\n table.resetActiveCell();\r\n });\r\n });\r\n\r\n if (me.isChanged() && guiChanges.length) {\r\n me.save(function () {\r\n me._applyGuiChangesCallback(guiChanges);\r\n }, false);\r\n } else {\r\n me._applyGuiChangesCallback(guiChanges);\r\n }\r\n },\n\n /**\n * Callback-функция для применения визуальных изменений.\n * @private\n * @param {array} guiChanges Набор изменений.\n * @since 5.5.0.2705\n */\n _applyGuiChangesCallback: function (guiChanges) {\r\n var me = this;\r\n var current = me._current;\r\n\r\n _(guiChanges).each(function (change) {\r\n var requisite;\r\n var isRequisiteEnabled = change.CanGUIRead && change.CanGUIWrite;\r\n\r\n if (change.Section) {\r\n var detail = current.details[change.Section];\r\n if (detail) {\r\n if (change.RowID) {\r\n var records = detail.getRecords();\r\n var currentRecord;\r\n var table = detail.getTable();\r\n if (table) {\r\n currentRecord = table.getRowById(change.RowID);\r\n if (currentRecord) {\r\n requisite = currentRecord.requisites[change.Name];\r\n }\r\n }\r\n }\r\n\r\n // Установить CanGUIRead для колонки детального раздела\r\n var tables = detail.getTables().toArray();\r\n tables.forEach(function (table) {\r\n var column = table.columns[change.Name];\r\n if (column) {\r\n column.setCanGUIRead(change.CanGUIRead);\r\n if (isRequisiteEnabled) {\r\n column.enable();\r\n } else {\r\n column.disable();\r\n }\r\n }\r\n });\r\n\r\n }\r\n } else {\r\n requisite = me.requisites[change.Name];\r\n if (isRequisiteEnabled) {\r\n requisite.enable();\r\n } else {\r\n requisite.disable();\r\n }\r\n }\r\n\r\n if (requisite) {\r\n // Установка значения реквизита производится только в случае изменения CanGUIRead\r\n // Как следствие, либо в реквизите, либо в изменении значение должно отображаться\r\n // как скрытое - в виде *\r\n if (change.Value === '*' || requisite.getValue() === '*') {\r\n requisite.setValue(change.Value, change.DisplayValue, false);\r\n requisite.setUntouched();\r\n }\r\n }\r\n });\r\n },\n\n /**\n * Обновляем состояния доступности и видимости кнопок на панели инструментов.\n * @private\n * @param {array} changes Набор изменений.\n * @since 5.5.0.2200\n */\n _applyActionChanges: function (changes) {\r\n var toolBar = this._current.toolBar;\n\n if (toolBar) {\r\n var actionChanges = _(changes).filter(function (change) {\r\n return change.Type === CHANGE_TYPE.ACTION_CHANGE;\r\n });\n\n _(actionChanges).each(function (change) {\n // Получить список связанных с действием кнопок\n var buttons = toolBar.buttons.getButtonsByActionName(change.Name);\n\n buttons.forEach(function (button) {\n // Установить свойство доступности\n if (change.IsEnabled) {\r\n button.enable();\r\n } else {\r\n button.disable();\r\n }\n\n // Установить свойство видимости\n if (change.IsVisible) {\r\n button.show();\r\n } else {\r\n button.hide();\r\n }\n\n // Установить свойство отмеченности\n if (change.IsChecked) {\r\n button.select();\r\n } else {\r\n button.unSelect();\r\n }\n\n // Установить текст всплывающей подсказки\n button.setHints(change.Hint, change.DisabledHint);\r\n });\r\n });\r\n }\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Обновляем состояния доступности и видимости контролов на форме.\n * @private\n * @param {array} changes набор изменений\n * @since 5.5.0.1302\n */\n _applyFormControlChanges: function (changes) {\r\n var current = this._current;\n var controlChanges = _(changes).filter(function (change) {\r\n return change.Type === CHANGE_TYPE.FORM_CONTROL_CHANGE || change.Type === CHANGE_TYPE.FORM_REQUISITE_CONTROL_CHANGE;\r\n });\n var tabs = current.sideBar.tabs.toArray();\n\n _(controlChanges).each(function (change) {\r\n var currentControl;\n var isControlEnabled = change.IsEnabled;\n\n if (change.Type === CHANGE_TYPE.FORM_REQUISITE_CONTROL_CHANGE) {\r\n isControlEnabled &= !change.IsReadOnly;\n\n currentControl = current.form.requisites[change.RequisiteName];\n if (!currentControl) {\r\n _(current.form.controls.tables).some(function (table) {\r\n var columns = table.columns.toArray();\n columns.some(function (column) {\r\n if (column.dfmName === change.Name) {\r\n currentControl = column;\r\n }\n return currentControl;\r\n });\n return currentControl;\r\n });\r\n }\r\n } else {\r\n switch (change.ControlType) {\r\n case CONTROL_TYPE.TABLE:\n currentControl = current.form.controls.tables[change.Name];\n break;\n case CONTROL_TYPE.TAB:\n var filteredTabs = tabs.filter(function (el) {\r\n return el.dfmName === change.Name;\r\n });\n if (filteredTabs.length > 0) {\r\n currentControl = filteredTabs[0];\n // Закладки боковой панели всегда доступны для перехода. Учитываются только свойства видимости.\n // Сделано по аналогии с десктоп-клиентом, где блокируется не сама вкладка, а ее содержимое.\n isControlEnabled = true;\r\n }\n break;\n case CONTROL_TYPE.HYPERLINK:\n // Если для метки не указан bind on click, то не делать enable, т.к. он снимает класс disabled.\n currentControl = current.form.controls.links[change.Name];\n if (change.IsEnabled && currentControl._jObject.hasClass('disabled'))\n change.IsEnabled = false;\n break;\n case CONTROL_TYPE.MULTISELECT:\n // Получить имя реквизита\n var reqName = $('div[name=' + change.Name + ']').not('.CardForm_Label').data('requisitename');\n if (reqName) {\r\n currentControl = current.form.requisites[reqName];\r\n }\n break;\n default:\n // Если тип контрола - группа, то управляем только видимостью.\n // Доступность и изменяемость группы перенесена на дочерние элементы.\n currentControl = $('div[name=' + change.Name + ']');\n if (change.IsVisible) {\r\n currentControl.css('visibility', 'visible');\r\n } else {\r\n currentControl.css('visibility', 'hidden');\r\n }\n return;\r\n }\r\n }\n\n if (currentControl) {\r\n if (isControlEnabled) {\r\n currentControl.enable();\r\n } else {\r\n currentControl.disable();\r\n }\n\n if (change.IsVisible) {\r\n currentControl.show();\r\n } else {\r\n currentControl.hide();\r\n }\r\n }\r\n });\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Обновляем детальные разделы при добавлении/удалении значений\n * @private\n * @since 5.2.0.2014\n */\n _applyRequisiteChanges: function (changes) {\r\n var me = this;\n var parentCurrent = me._current;\n\n var changedRequisites = _(changes).filter(function (req) {\r\n return req.Type === CHANGE_TYPE.REQUISITE_CHANGE;\r\n });\n\n _(changedRequisites).each(function (req) {\r\n if (req.Section) {\r\n if (!parentCurrent.details[req.Section]) return;\n\n _.each(parentCurrent.details[req.Section].getTables().toArray(), function (table) {\r\n var row = table.rows[req.RowID];\n if (row && row.requisites[req.Name]) {\r\n var requisite = row.requisites[req.Name];\n requisite.setValue(req.Value, req.DisplayValue, false);\n requisite.setUntouched();\r\n }\r\n });\r\n } else {\r\n if (!me.requisites.isExist(req.Name)) return;\n\n var requisite = me.requisites[req.Name];\n requisite.setValue(req.Value, req.DisplayValue, false);\n requisite.setUntouched();\r\n }\r\n });\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Обновляем значения множественный выборов.\n * @private\n * @since 5.5.0.1000\n */\n _applyMultiSelectRequisiteChanges: function (changedMultiSelects) {\r\n var me = this;\n\n if (!changedMultiSelects) return;\n\n for (reqName in changedMultiSelects) {\r\n if (me.requisites.isExist(reqName) && me.requisites[reqName].isMultiselect) {\r\n var req = me.requisites[reqName];\n var displayValues = changedMultiSelects[reqName].First;\n var ids = changedMultiSelects[reqName].Second\n\n if (req.isMultiselect()) {\n // Множественный выбор из одного или нескольких справочников.\n\n displayValues = changedMultiSelects[reqName].First.split(';');\n ids = changedMultiSelects[reqName].Second.split(';');\n\n var values = [];\n ids.forEach(function (id, i) {\r\n var idParts = id.split(':');\n\n var refcode;\n if (idParts.length >= 2) {\r\n refcode = idParts[0];\n id = idParts[1];\r\n } else {\r\n var refcodes = req.getReferences();\n // Получаем первый ключ в объекте.\n for (refcode in refcodes) break;\r\n }\n\n values.push({\r\n groupcode: refcode,\n id: id,\n name: displayValues[i]\r\n });\r\n\n });\n\n req.setValues(values, false);\r\n } else {\n // Единичный выбор из нескольких справочников.\n req.setValue(ids, displayValues, false);\r\n }\n req.setUntouched();\r\n\n }\r\n }\r\n\n },\n //---------------------------------------------------------------------//\n\n /**\n * Динамическое перестроение значений pick-реквизита\n * @private\n * @since 5.2.0.2014\n */\n _applyPickValuesChange: function (changes) {\r\n var me = this;\n var parentCurrent = me._current;\n\n\n _(changes).chain().filter(function (req) {\r\n return req.Type === CHANGE_TYPE.PICK_VALUES_CHANGE;\r\n }).each(function (req) {\r\n\n if (req.Section) {\n //Детальные разделы пропускаем, т.к. некорректно работают из-за режима редактирования и нередактирования.\n return;\n\n _.each(parentCurrent.details[req.Section].getTables().toArray(), function (table) {\r\n\n _.each(table.rows.toArray(), function (row) {\r\n\n if (row && row.requisites[req.Name]) {\r\n var needReset = true;\n var oldVal = row.requisites[req.Name].getValue();\n\n row.requisites[req.Name].clearValues();\n if (!row.requisites[req.Name].isRequired()) {\r\n row.requisites[req.Name].addValue('', '');\r\n };\n\n _.each(req.Items, function (item) {\r\n if (oldVal == item.ID) needReset = false;\n row.requisites[req.Name].addValue(item.ID, item.DisplayText);\r\n });\n\n if (needReset) {\r\n row.requisites[req.Name].setValue('', '', false);\r\n }\r\n }\r\n });\r\n });\r\n } else {\n //Реквизиты карточки\n var oldVal = me.requisites[req.Name].getValue();\n var needReset = true;\n\n me.requisites[req.Name].clearValues();\n\n if (!me.requisites[req.Name].isRequired()) {\r\n me.requisites[req.Name].addValue('', '');\r\n };\n\n _.each(req.Items, function (item) {\r\n if (oldVal == item.ID) needReset = false;\n me.requisites[req.Name].addValue(item.ID, item.DisplayText);\r\n });\n\n if (needReset) {\r\n me.requisites[req.Name].setValue('', '', false);\r\n }\r\n }\r\n });\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Обновляем детальные разделы при добавлении/удалении значений\n * @private\n * @since 5.2.0.2014\n */\n _applySectionsChange: function (changes) {\r\n var me = this;\n var parentCurrent = me._current;\n\n // Проверить наличие изменений детальных разделов, не относящихся к изменениям визуальных свойств\n // Например, Enabled, CanGUIRead и прочее.\n var changedSections = _(changes).chain().filter(function (req) {\r\n return req.Type > 0 && req.Type < 4 && req.Section !== 0;\r\n }).pluck('Section').uniq().value();\n\n if (changedSections.length) {\r\n me.save(function () {\r\n _(changedSections).each(function (sectonNumber) {\r\n if (parentCurrent.details[sectonNumber]) {\r\n _.each(parentCurrent.details[sectonNumber].getTables().toArray(), function (table) {\r\n table.reloadData();\r\n });\r\n }\r\n });\r\n }, false, undefined, {\r\n disableHidePreviousInlineHint: true\r\n });\r\n }\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Проверить наличие формы на странице.\n *\n * @method WebAccess.current.form.isExist\n * @return {boolean} True – форма на странице существует, иначе False.\n * @since 5.0.0.7100\n */\n isExist: function () {\r\n return !!this._data;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Признак недоступности реквизитов формы.\n *\n * @method WebAccess.current.form.isDisabled\n * @return {boolean} True – форма открывается только для чтения, иначе False.\n * @since 5.0.0.7100\n */\n isDisabled: function () {\r\n return this._isDisabled;\r\n },\n //---------------------------------------------------------------------// \n\n /**\n * Сделать все реквизиты недоступными и скрыть ссылку «Добавить строку».\n *\n * @method WebAccess.current.form.disable\n * @return {WebAccess.current.form} Текущая форма.\n * @since 5.0.0.7100\n */\n disable: function () {\r\n var me = this;\n $.when(WA.FormControlsInit, WA.FormInit, WA.DetailsInit).then(function () {\r\n me._disable();\n if (me.controls)\n for (var tableName in me.controls.tables) {\r\n me.controls.tables[tableName].disable();\r\n };\n me._isDisabled = true;\r\n });\n return this;\r\n },\n //---------------------------------------------------------------------// \n\n /**\n * Сделать все реквизиты доступными и отобразить ссылку «Добавить строку».\n *\n * @method WebAccess.current.form.enable\n * @return {WebAccess.current.form} Текущая форма.\n * @since 5.0.0.7100\n */\n enable: function () {\r\n var me = this;\n me._enable();\n for (var tableName in me.controls.tables) {\r\n me.controls.tables[tableName].enable();\r\n };\n me._isDisabled = false;\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Признак изменения реквизитов.\n *\n * @method WebAccess.current.form.isChanged\n * @return {boolean} True – реквизиты были изменены, иначе False.\n * @since 5.0.0.7100\n */\n isChanged: function () {\r\n var me = this;\n var reqs = me.requisites.toArray();\n for (var reqI = 0; reqI < reqs.length; reqI++) {\r\n if (reqs[reqI].isChanged()) {\r\n return true;\r\n }\r\n }\n // Получаем данные из детальных разделов.\n var tables = me.controls.tables;\n for (var tableName in tables) {\r\n var rows = tables[tableName].rows.toArray();\n for (var i = 0; i < rows.length; i++) {\r\n if (rows[i].isChanged()) {\r\n return true;\r\n }\r\n }\r\n }\n return false;\r\n },\n //---------------------------------------------------------------------//\n\n\n /**\n * Используется при сохранении формы - обводка реквизитов незаполненных \n * обязательных реквизитов красным.\n * поля для которых доступ только на чтение.\n *\n * @method WebAccess.current.form._highlightRequisites\n * @private\n * @since 5.0.0.7100\n * @return {WebAccess.current.form}\n */\n _highlightRequisites: function (reqsStr, details) {\r\n\n var prevColor;\n var me = this;\n\n if (!reqsStr) return;\n\n // Получаем список реквизитов\n var reqs = reqsStr.split(\", \");\n // Пробегаемся по списку чтобы выделить реквизиты\n for (var i = 0; i < reqs.length; i++) {\r\n var requisite;\n if (reqs[i].indexOf('$') !== -1) {\r\n var reqNameParts = reqs[i].split('$');\n var detailNum = +reqNameParts[0];\n var rowId = +reqNameParts[1];\n var reqName = reqNameParts[2];\n\n var tables = details[detailNum].getTables().toArray();\n for (var t = 0; t < tables.length; t++) {\r\n var table = tables[t];\n var row = table.rows[rowId];\n if (!row) continue;\n\n requisite = row.requisites[reqName];\n if (!requisite) continue;\n\n requisite.highlight();\r\n }\r\n } else {\r\n requisite = me.requisites[reqs[i]];\n if (!requisite) continue;\n\n requisite.highlight();\r\n }\r\n }\n return this;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Снятие красной обводки со всех реквизитов.\n *\n * @method WebAccess.current.form._unHighlightRequisites\n * @private\n * @since 5.0.0.7100\n * @return {WebAccess.current.form}\n */\n _unHighlightRequisites: function () {\r\n $('.Card_Element').find('.Req_Error').removeClass('Req_Error');\n return this;\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Сохранить карточку объекта.\n *\n * @method WebAccess.current.form.save\n * @param {function} callback Функция, вызвается после сохранения.\n * @param {Boolean} needSaveObject Признак - нужно ли сохранять изменения в базу.\n * @param {Integer} folderIdToPaste Папка для вставки ссылки на сохраняем объект.\n * @param {Object} [options] Дополнительные настройки сохранения.\n * @param {String} options.needShowError Нужно ли показывать ошибку.\n * @param {String} options.disableHidePreviousInlineHint Нужно ли скрывать предыдущую ошибку при удачно сохранении.\n * @return {WebAccess.current.form} Текущая форма карточки объекта с сохраненными изменениями.\n * @since 5.0.0.7100\n */\n save: function (callback, needSaveObject, folderIdToPaste, options) {\r\n return this.saveAndAttach(callback, needSaveObject, new WA.Link(folderIdToPaste, OBJECT_TYPE.FOLDER), options);\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Сохранить и вложить карточку объекта в папку, задачу, задание или уведомление.\n * @method WebAccess.current.form.saveAndAttach\n * @param {function} callback Функция, вызвается после сохранения.\n * @param {Boolean} needSaveObject Признак - нужно ли сохранять изменения в базу.\n * @param {Object} receiverObjectLink Объект для вставки ссылки на сохраняем объект.\n * @param {Object} [options] Дополнительные настройки сохранения.\n * @param {String} options.needShowError Нужно ли показывать ошибку.\n * @param {String} options.disableHidePreviousInlineHint Нужно ли скрывать предыдущую ошибку при удачно сохранении.\n * @return {WebAccess.current.form} Объект типа form.\n * @since 5.0.0.7100\n */\n saveAndAttach: function (callback, needSaveObject, receiverObjectLink, options) {\r\n return this._saveExtended(callback, needSaveObject, receiverObjectLink, $.extend({\r\n needShowError: true\r\n }, options));\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Расширенное сохранение карточки текущего объекта (больше параметров функции). \n *\n * @method WebAccess.current.form._saveExtended\n * @since 5.1.0.1305\n * @private\n * @return {WebAccess.current.form}\n */\n _saveExtended: function (callback, needSaveObject, receiverObjectLink, options) {\r\n var me = this;\n me.fire('prepareSave');\n\n options = options || {};\n // Показываем ошибку по умолчанию?\n options.needShowError = (options.needShowError !== false);\n options.disableHidePreviousInlineHint = (options.disableHidePreviousInlineHint === true);\n\n me._unHighlightRequisites();\n\n if (me.isDisabled()) {\r\n if (callback) callback(false);\n return me;\r\n };\n\n needSaveObject = !!needSaveObject;\n\n // HACK для сохранения изменения в детальных разделах, если после изменения сразу сохранять карточку без клика куда-то в друое место грида.\n // Замечание 113045.\n if (!WA.isMobile()) {\r\n var allGrids = WA.CR._getGrids();\n for (var gridName in allGrids) {\r\n var grid = allGrids[gridName].grid;\n var cell = grid.getActiveCell();\n if (cell) {\r\n grid.navigateUp();\r\n }\r\n }\r\n }\n\n var form = (!!me._current) ? me._current.form : global.current.form;\n var data = {\r\n Obj: $.toJSON(me._data.obj),\n View: WA.CR.getReferenceView(),\n Req: me._getRequisitesToSend(form),\n Cmd: $.toJSON(me._commandList),\n NeedSaveObject: needSaveObject,\n ReceiverObjectLink: receiverObjectLink\r\n };\n me.fireAll(\"Save\", me._saveData, data, callback, options);\n\n return me;\r\n },\n //---------------------------------------------------------------------//\n\n _getRequisitesToSend: function (form) {\r\n var res = {};\n\n // Получаем данные из карточки.\n var reqs = form.requisites.toArray();\n for (var reqI = 0; reqI < reqs.length; reqI++) {\r\n var req = reqs[reqI];\n if (req.isChanged() || req.isNew() || (req._data.type === 'pick' && req.isRequired() && req.isRendered())) {\r\n res[req.name] = req.getValue();\r\n };\r\n };\n\n // Получаем данные из детальных разделов.\n if (form.controls) {\r\n var tables = form.controls.tables;\n for (var tableName in tables) {\r\n var rows = tables[tableName].rows.toArray();\n for (var i = 0; i < rows.length; i++) {\r\n $.extend(res, rows[i]._getActualValues())\r\n };\r\n };\r\n };\n return $.toJSON(res)\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Отправка сохраняемых данных.\n *\n * @method WebAccess.current.form._save\n * @private\n * @since 5.0.0.7100\n * @return {WebAccess.current.form}\n */\n _saveData: function (data, callback, options) {\r\n var me = this;\n\n WA.SRV.call(this.serviceUrl + '/SaveAndAttach', {\r\n Obj: data.Obj,\n View: data.View,\n Req: data.Req,\n Cmd: data.Cmd,\n NeedSaveObject: data.NeedSaveObject,\n ReceiverObjectLink: (!!data.ReceiverObjectLink && data.ReceiverObjectLink.id ? data.ReceiverObjectLink.toLinkModel() : null)\r\n }, null, null, true).done(function (result, res) {\r\n if (WA.CMP.NTF.InlineHint && !options.disableHidePreviousInlineHint) {\r\n WA.CMP.NTF.InlineHint.hideAll();\r\n }\n if (data.NeedSaveObject) {\r\n UnbindBeforeUnload();\n BindBeforeUnload();\r\n }\n\n me._fillRowsID(result, me._current.details);\n if ($.isFunction(callback)) callback(true, res.Warning);\n HideTopSpinner();\r\n }).fail(function (data) {\r\n var res = this;\n var details = WA.CR.details;\n var inlineHint = WA.CR.inlineHint;\n me._handleFailSave(res, options.needShowError, callback, global.current.details, inlineHint);\r\n });\r\n },\n //---------------------------------------------------------------------//\n\n _handleFailSave: function (res, needShowError, callback, details, inlineHint) {\r\n var me = this;\n var severity = (res.Severity !== \"-1\" ? Number(res.Severity) : undefined);\n me._fillRowsID(res.Result, details);\n // Проверяем есть ли в ошибке {}\n if (needShowError) {\r\n var isJSON = new RegExp(/^\\{.+\\}$/);\n if (isJSON.test(res.Error)) {\r\n var err = $.parseJSON(res.Error);\n // Получаем сообщение без указания реквизитов\n var mes = err.message;\n\n if (!WA.isMobile()) {\r\n inlineHint.show(format(L(\"ERROR_MSG\"), mes), undefined, severity);\r\n } else {\r\n ErrorShow(format(L(\"ERROR_MSG\"), mes), true)\r\n };\n\n me._highlightRequisites(err.reqs, details);\r\n } else {\r\n if (!WA.isMobile()) {\r\n inlineHint.show(format(L(\"ERROR_MSG\"), res.Error), undefined, severity);\r\n } else {\r\n ErrorShow(format(L(\"ERROR_MSG\"), res.Error), true)\r\n }\r\n }\r\n };\n if ($.isFunction(callback)) callback(false, res.Warning);\n HideTopSpinner();\r\n },\n //---------------------------------------------------------------------//\n\n /**\n * Устанавливает ИД новым строкам после сохранения. \n * @method WebAccess.current.form._fillRowsID \n * @private \n * @since 5.0.0.7100 \n * @return {WebAccess.current.form} \n */\n _fillRowsID: function (res, details) {\r\n var me = this; // Заполняем ИД для новых строк.\n if (res !== '' && res !== null) {\r\n var Result = $.parseJSON(res);\n if (Result) {\r\n var RowNumber2ID = Result['RowNumber2ID'] || [];\n\n for (var i = 0; i < RowNumber2ID.length; i++) {\r\n var tbl = $('table[data-section=' + RowNumber2ID[i].Section + '][id]');\n $('#row' + RowNumber2ID[i].Number, tbl).data('id', RowNumber2ID[i].ID);\r\n };\n\n var newRowIDs = Result['ApendedRecords'] || [];\n for (var i = 0; i < newRowIDs.length; i++) {\r\n var row = newRowIDs[i];\n var section = row[0];\n var tempID = row[1];\n var realID = row[2];\n\n var tables = details[section].getTables().toArray();\n\n var table = _(tables).find(function (table) {\r\n return !!table.rows[tempID];\r\n });\n\n table._updateRowID(tempID, realID);\n // Обнуляем признак isNew\n table.rows[realID]._isNew = false;\n\n var reqs = table.rows[realID].requisites.toArray();\n _(reqs).each(function (r) { r._isNew = false; });\n\n me._commandList = _(me._commandList).filter(function (cmd) {\r\n return cmd.ID != tempID && cmd.Section != section\r\n });\r\n }\r\n };\r\n };\n return this;\r\n }\n //---------------------------------------------------------------------//\n }, {\r\n EVENT: {\n /**\n * Событие срабатывает если данные на форме были изменены.\n *\n * @event WebAccess.components.wrappers.form.Form.EVENT.CHANGE\n * @param {object} context ссылка на экземпляр класса\n * @since 5.5.0.2201\n */\n CHANGE: 'change'\n //-------------------------------------------------------------------//\n }\r\n });\n\n global.components.wrappers.form.Form = Form;\r\n})(window.WebAccess);","\"use strict\";\n\n/**\n* Элемент списка объектов.\n*\n* @class WebAccess.components.wrappers.objectList.ListItem\n* @since 5.0.0.4102\n* @extends BasePageElement\n* @property {string} id ИД объекта\n* @property {string} name Имя объекта\n* @property {string} kind Тип объекта. Например, задача, задание, документ\n* @param {string} itemSelector Существующий элемент списка\n* @param {boolean} isTableItem Признак того, что текущий элемент является строкой таблицы\n*/\n(function (global) {\n\n var ListItem = WebAccess.components.wrappers.BasePageElement.extend([global.mixins.linkMixin], {\n init: function (itemSelector, isTableItem, data) {\n var me = this;\n\n me._super(itemSelector);\n me._jObject = $(itemSelector);\n\n if (!isTableItem) {\n me.id = me._jObject.attr('id');\n me.name = me._jObject.find(\".objectname\").text();\n\n me.kind = me._jObject.attr('kind').toUpperCase();\n\n if (me.kind !== 'VER') {\n me.type = objectKindToObjectType(me.kind);\n }\n me.referenceName = me.referenceCode = me._jObject.attr('compcode');\n me.isSelected = me._jObject.find('input:first').is(':checked');\n\n } else {\n $.extend(me, data);\n }\n\n me._setupBindings();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n className: \"ListItem\",\n id: null,\n name: null,\n kind: null,\n type: null,\n referenceName: null,\n referenceCode: null,\n isSelected: false,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установка событий. При щелчке на чекбокс, вызываем событие у всего списка, чтобы удобно было менять состояние кнопок тулбара например.\n * @private\n * @return {WebAccess.components.wrappers.objectList.ListItem}\n */\n _setupBindings: function () {\n var me = this;\n\n me._jObject.find(\"input.chk\").off('change.objectList itemChecked').on('change.objectList itemChecked', function () {\n $('body').trigger(\"click.collapse\"); //Чтобы распахнутые свернутые группы тоже скрывались\n\n if ($(this).is(':checked')) {\n global.current.objectList.fire(\"itemSelect\", me);\n } else {\n global.current.objectList.fire(\"itemUnSelect\", me);\n }\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать иконку связанных объектов.\n *\n * @method WebAccess.components.wrappers.objectList.ListItem#showBindIcon\n * @return {WebAccess.components.wrappers.objectList.ListItem} Объект класса ListItem.\n * @since 5.1.0.1523\n */\n showBindIcon: function () {\n this._jObject.find('.object-list-item__addicon_type_bound').show();\n\n return this;\n },\n\n /**\n * Скрыть элемент списка.\n * @method WebAccess.components.wrappers.objectList.ListItem#hide\n * @return {WebAccess.components.wrappers.objectList.ListItem} Объект класса ListItem.\n */\n hide: function () {\n this._jObject.hide();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать элемент списка.\n *\n * @method WebAccess.components.wrappers.objectList.ListItem#show\n * @return {WebAccess.components.wrappers.objectList.ListItem} Объект класса ListItem.\n */\n show: function () {\n this._jObject.show();\n return this;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n global.components.wrappers.objectList.ListItem = ListItem;\n})(window.WebAccess);\n","\"use strict\";\n\n/**\n* Элемент списка объектов. \n* \n* @class WebAccess.components.wrappers.objectList.CustomWorkListItem\n* @since 5.3.0.1010\n* @extends ListItem\n* @property {string} id ИД объекта\n* @property {string} name Имя объекта\n* @property {string} kind Тип объекта. Например, задача, задание, документ\n* @param {string} itemSelector Существующий элемент списка\n* @param {boolean} isTableItem Признак того, что текущий элемент является строкой таблицы\n*/\n(function (global) {\n\n var CustomWorkListItem = WebAccess.components.wrappers.objectList.ListItem.extend({\n /**\n * Удаляет у задания стиль непрочитанного задания.\n * @returns {WebAccess.components.wrappers.objectList.CustomWorkListItem} \n */\n removeUnreadStyle: function () {\n this._jObject.removeClass('unread');\n return this;\n },\n /**\n * Добавляет к заданию стиль непрочитанного задания.\n * @returns {WebAccess.components.wrappers.objectList.CustomWorkListItem} \n */\n addUnreadStyle: function () {\n this._jObject.addClass('unread');\n return this;\n },\n /**\n * Возвращает признак прочитанности задания.\n * @returns {boolean} \n */\n isUnread: function () {\n return this._jObject.hasClass('unread');\n }\n });\n\n global.components.wrappers.objectList.CustomWorkListItem = CustomWorkListItem;\n})(window.WebAccess);","\"use strict\";\n/**\n * Выбирает объект из списка с помощью установки переключателя.\n *\n * @event WebAccess.components.wrappers.objectList.ObjectList#onSelect \n * @param {WebAccess.components.wrappers.objectList.ListItem} item Объект списка-переключатель, который был установлен в текущий момент\n * @param {WebAccess.components.wrappers.objectList.ListItem[]} checkedItems Все выбранные объекты списка\n * @example\n *\n * WA.current.objectList.bind('onSelect', function (last, allItems) {\n * \n * console.log(last.name); //Вернет имя выбранного элемента в списке.\n * \n * //Вернет имена всех выделенных в текущий момент элементов в списке.\n * for (var i =0; i < allItems.length; i++) {\n * console.log(allItems[i].name);\n * }\n * });\n */\n\n/** \n* Предоставляет работу со списками объектов. \n* Например, получить список отфильтрованных объектов – задач, заданий и уведомлений в проводнике, выделить объекты в списке закладок, \n* снять выделение с элементов табличной части справочника.\n*\n* @class WebAccess.components.wrappers.objectList.ObjectList\n* @property {string} containerSelector Блок, содержащий список\n* @property {string} objectSelector Элемент списка\n* @fires WebAccess.components.wrappers.objectList.ObjectList#onSelect Вызывается после того, как был выбран объект из списка\n* @fires WebAccess.components.wrappers.objectList.ObjectList#onChange Вызывается после внесения изменений в состав списка\n* @since 5.0.0.4102\n*/\n\n(function (global) {\n\n\n var ObjectList = BaseObject.extend({\n className: 'ObjectList',\n\n init: function (containerSelector) {\n this._super(containerSelector);\n\n this.containerSelector = containerSelector + ' #main_container';\n this._jMainContainer = $(this.containerSelector);\n\n this._setupBindings();\n this._getType();\n\n this.getItems();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n containerSelector: \"\",\n objectSelector: \".List\",\n _isAllSelected: false,\n _items: {},\n _jMainContainer: null,\n _jSearchTarget: null,\n _isTable: false,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить произвольное содержимое вместо текущего списка объектов.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList.setHtml\n * @return {WebAccess.components.wrappers.objectList} Специальный deferred-объект.\n */\n setHtml: function (html) {\n this._jMainContainer.html('
    ' + html + '
    ');\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить элементы списка.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList.getItems\n * @comment Keit_B: в справке не нашла. Пока не трогаю.\n * @return {WebAccess.components.wrappers.objectList.ListItem[]}\n */\n getItems: function () {\n var me = this;\n var items = {};\n\n me._jSearchTarget = me._jMainContainer.find(me.objectSelector);\n if (me._isTable) me._jSearchTarget = me._getItemsElementsinTable(me._jSearchTarget);\n\n for (var i = 0, l = me._jSearchTarget.length; i < l; i++) {\n var obj;\n var searchTarget = me._jSearchTarget[i];\n var jSearchTarget = $(searchTarget);\n if (jSearchTarget.hasClass('Task_obj') || jSearchTarget.hasClass('Job_obj'))\n obj = new global.components.wrappers.objectList.CustomWorkListItem(searchTarget, me._isTable);\n else\n obj = new global.components.wrappers.objectList.ListItem(searchTarget, me._isTable);\n\n if (obj.id) items[obj.id] = obj;\n };\n\n me._items = items;\n return items;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n isAllItemsSelected: function () {\n return !!WA.CR.objectList && WA.CR.objectList._isAllSelected;\n },\n\n /**\n * Получить объекты списка, отфильтрованные селектором.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList.getFilteredItems \n * @return {WebAccess.components.wrappers.objectList.ListItem[]} Специальный deferred-объект.\n */\n getFilteredItems: function (filterSelector) {\n var me = this;\n var items = me._jMainContainer.find(me.objectSelector);\n\n if (filterSelector !== '') items = items.filter(filterSelector).filter(':not(.movedItem)');\n if (me._isTable) items = me._getItemsElementsinTable(items);\n\n var filteredItems = [];\n for (var i = 0; i < items.length; i++) {\n var newItem = me._getItemIdByjObject(items.eq(i));\n if (!!newItem) filteredItems.push(newItem);\n };\n\n return filteredItems;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n removeItems: function (links, opt_needUpdateTree) {\n var selector;\n var needUpdateTree = false || opt_needUpdateTree === true;\n $.each(links, function (_, l) {\n selector = format('#{0}.folder_item', l.id);\n if (links && links[0] && links[0].type && links[0].type === OBJECT_TYPE.ANY) {\n selector = '.folder_item';\n };\n\n var linkKind = l.kind ? l.kind.toLowerCase() : objectTypeToString(l.type).toLowerCase();\n $(selector).each(function () {\n var me = $(this);\n var elementKind = me.attr('kind').toLowerCase();\n\n if (elementKind == linkKind || linkKind == 'any') {\n if (elementKind == 'job' || elementKind == 'task' || elementKind == 'fol') needUpdateTree = true;\n me.remove();\n }\n });\n });\n\n if (needUpdateTree) {\n WA.CR.folderTree.update(function() {\n document.title = WA.CR.folderTree.getCurrentFolderName();\n });\n }\n },\n\n /**\n * Получает выделеннные элементы списка.\n * @method WebAccess.components.wrappers.objectList.ObjectList.getSelectedElements \n * @return {WebAccess.components.wrappers.objectList.ListItem[]}\n */\n getSelectedItems: function () {\n return this.getFilteredItems('.selected');\n },\n\n /**\n * Выделить все объекты списка с учетом настройки \"Папки в списке\".\n * @method WebAccess.components.wrappers.objectList.ObjectList.selectAll\n * @return {WebAccess.current.objectList}\n */\n selectAll: function () {\n this._isAllSelected = false;\n if (WA.CR.objectList.isShowFolders()) {\n this._isAllSelected = true;\n }\n this._setCheckedForFilteredItems(':not(.selected)', true);\n HideTopSpinner(L(\"ITEMS_SELECETED\", WA.CR.objectList.getSelectedItems().length));\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выделить элемент списка.\n * @method WebAccess.components.wrappers.objectList.ObjectList.selectAll\n * @return {WebAccess.current.objectList}\n */\n selectItemByID: function (id) {\n this._setCheckedForFilteredItems('#' + id + '.List', true);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выделить элемент списка.\n * @method WebAccess.components.wrappers.objectList.ObjectList.selectAll\n * @return {WebAccess.current.objectList}\n */\n selectItem: function (link) {\n this.selectItemByID(link.id);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Снять выделение со всех элементов списка.\n * @method WebAccess.components.wrappers.objectList.ObjectList.deselectAll\n * @return {WebAccess.current.objectList} Специальный deferred-объект.\n */\n deselectAll: function () {\n this._isAllSelected = false;\n this._setCheckedForFilteredItems('.selected', false);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Снять выделение или, напротив, выделить все объекты списка в зависимости от их текущего состояния.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList.toggleAll \n * @return {WebAccess.current.objectList} Специальный deferred-объект.\n */\n toggleAll: function () {\n if (!$(\"#chkAll\").prop('checked')) { this.deselectAll(); }\n else this.selectAll();\n $(\"#scroller\").redraw();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инвертировать выделение всех объектов списка.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList.invertSelection\n * @return {WebAccess.current.objectList} Специальный deferred-объект.\n */\n invertSelection: function () {\n var jCheckedItemsLength = this._jSearchTarget.filter(\".selected\").length;\n // Если небыло ничего выбранно и нажали на инвертировать выделение, то выделяем все.\n this._isAllSelected = (jCheckedItemsLength === 0);\n this._setCheckedForFilteredItems('', 'toggle');\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Устанавливает или снимает выделение с элементов списка, отфильтрованных filterSelector.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList._setCheckedForFilteredItems\n * @private\n */\n _setCheckedForFilteredItems: function (filterSelector, isChecked) {\n var me = this;\n var items = me._jMainContainer.find(me.objectSelector);\n\n if (filterSelector !== '') items = items.filter(filterSelector);\n\n if (me._isTable) items = me._getItemsElementsinTable(items);\n\n for (var i = 0; i < items.length; i++) {\n var jListBox = items.eq(i);\n var chk = jListBox.find('input:first');\n if (isChecked === 'toggle') {\n chk.attr('checked', chk.is(':checked'));\n } else {\n chk.attr('checked', isChecked);\n }\n ToggleItem(chk);\n jListBox.redraw();\n }\n UpdateSelectionNumbers();\n me.fire('onSelect', me._getItemIdByjObject(items.last()), me.getFilteredItems('.selected'));\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Тип списка: таблица или нет.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList._getType\n * @private\n * @return {boolean}\n */\n _getType: function () {\n return this._isTable = this._jMainContainer && this._jMainContainer.attr('class') && this._jMainContainer.attr('class').indexOf('slickgrid') !== -1;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установка событий, при кликах на чекбоксы. Чтобы срабатывали глобальные события.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList._setupBindings\n * @private\n * @return {WebAccess.current.objectList}\n */\n _setupBindings: function () {\n var me = this;\n this.bind('itemsChange', function () {\n me._onItemsChanged();\n });\n\n this.bind('itemSelect', function (item) {\n item.isChecked = true;\n me._onItemSelected(item);\n });\n\n this.bind('itemUnSelect', function (item) {\n item.isChecked = false;\n me._isAllSelected = false;\n me._onItemSelected(item);\n });\n\n Core.toolBars.main.enableCheckBoxOnItemsSelect();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * При AJAX автоподгрузке элементов, надо обновлять список объектов.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList._onItemsChanged\n * @private\n * @return {WebAccess.components.wrappers.objectList.ListItem[]}\n */\n _onItemsChanged: function () {\n var me = this;\n me._jMainContainer = $(me.containerSelector);\n var items = me.getItems();\n me.fire(\"onChange\", me.getFilteredItems('.selected'), items);\n return items;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//1\n\n /**\n * При клике на чекбокс, вызовем свое событие.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList._onItemSelected\n * @private \n * @return {WebAccess.current.objectList}\n */\n _onItemSelected: function (item) {\n this.fire('onSelect', item, this.getFilteredItems('.selected'));\n return this;\n },\n\n /**\n * Получает элементы списка отфильтрованные селектором.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList._onItemSelected\n * @private \n * @return {WebAccess.components.wrappers.objectList.ListItem}\n */\n _getItemIdByjObject: function (jObject) {\n var id = this._isTable ? jObject.data('recid') : jObject.attr('id');\n return this._items[id];\n },\n\n /**\n * Получает элементы таблицы.\n * @method WebAccess.components.wrappers.objectList.ObjectList._getItemsElementsinTable\n * @private \n * @return {jQuery}\n */\n _getItemsElementsinTable: function (items) {\n return items.not(\".dxgvSelectedRow\").not('.dxgvGroupRow').not('.dxgvEmptyDataRow');\n }\n\n });\n\n global.CMP.wrappers.objectList.ObjectList = ObjectList;\n\n})(window.WebAccess);","\"use strict\";\n/** \n* Предоставляет работу со списками объектов в проводнике. \n* Например, получить список отфильтрованных объектов – задач, заданий и уведомлений в проводнике, выделить объекты в списке закладок, \n* снять выделение с элементов табличной части справочника.\n*\n* @class WebAccess.components.wrappers.objectList.FolderList\n* @since 5.2.0.2000\n*/\n\n(function (global) {\n\n var FolderList = global.CMP.wrappers.objectList.ObjectList.extend({\n state: null,\n init: function () {\n var me = this;\n me._super.apply(me, arguments);\n me.state = {\n likeFilterValue: '',\n likeFilterRequisites: null,\n predefinedFilter: null,\n sort: null,\n sortIsAsc: true,\n isShowFolders: null\n }\n },\n\n setPredefinedFilter: function (name) {\n this.state.predefinedFilter = name;\n return this;\n },\n getPredefinedFilter: function () {\n return this.state.predefinedFilter;\n },\n isPredefinedFilterEmpty: function () {\n return !this.state.predefinedFilter;\n },\n\n setSort: function (name, sortIsAsc) {\n if (_.isObject(name)) {\n this.state.sort = name.name;\n this.state.sortIsAsc = name.sortIsAsc;\n } else {\n this.state.sort = name;\n this.state.sortIsAsc = sortIsAsc;\n }\n return this;\n },\n getSort: function () {\n return {\n name: this.state.sort,\n sortIsAsc: this.state.sortIsAsc\n }\n },\n\n setLikeFilter: function (likeValue, likeRequisites) {\n this.state.likeFilterValue = likeValue;\n this.state.likeFilterRequisites = likeRequisites;\n return this;\n },\n getLikeFilter: function () {\n return this.state.likeFilterValue;\n },\n getlikeFilterRequisites: function () {\n return this.state.likeFilterRequisites;\n },\n\n /*\n * Перезагружает содержимое текущей папки.\n */\n reload: function () {\n var me = this;\n var d = $.Deferred();\n\n var jMainContainer = $('#main_container');\n var jObjectContents = $('.object_contents');\n\n var currentScrollTop;\n if ($.scrollActive) {\n currentScrollTop = jMainContainer.offset().top - jObjectContents.offset().top;\n } else {\n currentScrollTop = jMainContainer.scrollTop();\n }\n var jFolderItems = jObjectContents.children('.folder_item');\n\n // Вычисляем какая страница сейчас показана на экране у пользователя. Округляем в большую сторону, чтобы если даже часть след. страницы показана, она загрузилась.\n var pageHeight = g_MaxRowsPerPage * jFolderItems.first().outerHeight();\n var shownPage = (pageHeight === 0) ? 0 : Math.ceil(((currentScrollTop + jMainContainer.height()) / pageHeight));\n\n var currentFolderId = WA.CR.getID();\n\n me._loadAndInsertNewPage({\n folderId: currentFolderId,\n pageNumber: 1,\n pageCountToLoad: shownPage,\n needUseFilters: true,\n needUseSort: true,\n afterLoadCallback: function () {\n // Смещаем скрол на предыдущее место.\n jMainContainer.scrollTop(currentScrollTop);\n d.resolve();\n }\n });\n\n return d.promise();\n },\n\n /*\n * Загружает контент произвольной папки.\n */\n loadFolderContent: function (folderId) {\n var d = $.Deferred();\n this._loadAndInsertNewPage({\n folderId: folderId,\n pageNumber: 1,\n pageCountToLoad: 1,\n needUseFilters: false,\n needUseSort: false,\n afterLoadCallback: function () {\n // Смещаем скрол в начало страницы.\n $('#main_container').scrollTop(0);\n d.resolve();\n }\n });\n\n return d.promise();\n },\n\n // Загружает и вставляет в HTML-контейнер нужную страницу объектов.\n _loadAndInsertNewPage: function (params) {\n var me = this;\n var jObjectContents = $('.object_contents');\n\n var nextPage;\n var itemsToLoad;\n if (params.pageCountToLoad && params.pageCountToLoad > 0) {\n itemsToLoad = params.pageCountToLoad * g_MaxRowsPerPage;\n // Если грузим больше объектов чем на 1 страницы, то учитываем это в след. странице.\n nextPage = params.pageCountToLoad + 1;\n } else {\n itemsToLoad = g_MaxRowsPerPage;\n nextPage = params.pageNumber + 1;\n }\n\n WA.CR.ID = params.folderId;\n jObjectContents.data('nextPage', nextPage);\n\n me._loadPage(params.folderId, params.pageNumber, itemsToLoad, params.needUseFilters, params.needUseSort).done(function (html) {\n if (!CheckForLoginPage(html)) {\n\n jObjectContents.html(html);\n\n if ($.isFunction(params.afterLoadCallback)) {\n params.afterLoadCallback.call(me);\n }\n\n //HACK: Для IE11 не работают действие по наименованию записанные в атрибуте onclick. Такой хак заставляет их работать.\n if (WA.ENV.browser.name === 'IE' && WA.ENV.browser.major === '11') {\n $.each(jObjectContents.find('div[onclick]'), function () {\n var onclick = $(this).attr('onclick');\n $(this).attr('onclick', onclick + ';');\n });\n }\n\n jObjectContents.children().first().addClass('hover');\n if (jObjectContents.children('.folder_item').length == 0) {\n var emptyMessage = L('EMPTY');\n if (params.needUseFilters && me.getPredefinedFilter() || me.getLikeFilter()) {\n emptyMessage = L('EMPTY_WITH_FILTER');\n }\n jObjectContents.append('
    ' + emptyMessage + '
    ');\n }\n EntityListInit(jObjectContents, true);\n if (params.needUseFilters) {\n InitObjectContentsAutoLoad(me.state.likeFilterValue, me.state.likeFilterRequisites);\n } else {\n InitObjectContentsAutoLoad();\n }\n\n me.updateState();\n }\n });\n },\n\n // Загружает HTML-кода pageNumber страницы с элементами из папки с ИД = folderId.\n _loadPage: function (folderId, pageNumber, opt_itemsToLoad, opt_needUseFilters, opt_needUseSort) {\n var me = this;\n var def = $.Deferred();\n\n var jObjectContents = $('.object_contents');\n var uid = '';\n if (jObjectContents.data('uid')) {\n uid = jObjectContents.data('uid');\n }\n\n var newQueryParams = {\n c: jObjectContents.data('component'),\n id: folderId,\n page: pageNumber,\n itemsToLoad: opt_itemsToLoad || -1,\n ctrl: encodeURIComponent(jObjectContents.attr('id')),\n uid: uid\n };\n\n if (opt_needUseFilters !== false) {\n $.extend(newQueryParams, {\n filterValue: me.state.likeFilterValue,\n filterReq: me.state.likeFilterRequisites,\n predefinedFilter: me.state.predefinedFilter\n });\n }\n\n if (opt_needUseSort !== false) {\n $.extend(newQueryParams, {\n sort: (me.state.sortIsAsc ? '' : '-') + me.state.sort\n });\n }\n\n var currentQueryParams = new WA.URL(location.search.substr(1));\n currentQueryParams.removeParam('sort');\n currentQueryParams.removeParam('id');\n currentQueryParams.removeParam('fpath');\n\n ShowTopSpinner();\n $.ajax({\n type: \"GET\",\n dataType: \"html\",\n url: \"DynControl.ashx?\" + currentQueryParams.asString() + '&' + $.param(newQueryParams),\n cache: false,\n success: function (res) {\n HideTopSpinner('', 0);\n def.resolve(res);\n },\n error: function (err) {\n HideTopSpinner('', 0);\n def.reject(err);\n }\n });\n\n return def.promise();\n },\n\n /**\n * Обновляет внутренее состояние списка и перестраивает объект КОМ.\n * @param {object} state Состояние объекта. \n */\n updateState: function (state) {\n var me = this;\n if (state) $.extend(me.state, state);\n\n //Обновим объект клиентской ОМ\n me.fire(\"itemsChange\");\n me.fire(\"itemUnSelect\", {});\n\n //Сбросим переключатель выделения всех объектов.\n me._isAllSelected = false;\n },\n\n /**\n * Устанавливает флаг отображения папок в состоянии объекта.\n * @param {} value Значение флага. \n */\n setIsShowFolders: function(value) {\n this.state.isShowFolders = value;\n },\n\n /**\n * Необходимо ли показывать папки.\n * \n * @returns {boolean} \n */\n isShowFolders: function() {\n return !!this.state.isShowFolders;\n }\n });\n\n global.CMP.wrappers.objectList.FolderList = FolderList;\n\n})(window.WebAccess);","\"use strict\";\n/**\n* Предоставляет работу со списками объектов в проводнике.\n* Например, получить список отфильтрованных объектов – задач, заданий и уведомлений в проводнике, выделить объекты в списке закладок,\n* снять выделение с элементов табличной части справочника.\n*\n* @class WebAccess.components.wrappers.objectList.ObjectsAsTable\n* @since 5.2.0.2004\n*/\n\n(function (global) {\n\n var ObjectsTable = global.CMP.wrappers.objectList.ObjectList.extend({\n className: 'ObjectsTable',\n\n init: function (containerSelector) {\n var me = this;\n me._items = {};\n me._selectedItems = {};\n me._super(containerSelector);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Устанавливает ссылку на текущий грид.\n _setGrid: function () {\n var me = this;\n me._grid = Core.grid.reference;\n me._slickGrid = me._grid.grid;\n me._slickGridDataView = me._grid.dataView;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить элементы списка.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList.getItems\n * @comment Keit_B: в справке не нашла. Пока не трогаю.\n * @return {WebAccess.components.wrappers.objectList.ListItem[]}\n */\n getItems: function () {\n return this._items;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * При AJAX автоподгрузке элементов, надо обновлять список объектов.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList._onItemsChanged\n * @private\n * @return {WebAccess.components.wrappers.objectList.ListItem[]}\n */\n _onItemsChanged: function () {\n var me = this;\n me._setGrid();\n var rowsData = me._slickGrid.getData().getItems();\n me._items = {};\n _(rowsData).each(function (rowData) {\n if (!isNaN(rowData.id)) {\n var itemData = {\n id: +rowData.id,\n name: rowData.__name,\n code: rowData.__code,\n kind: 'REF',\n type: objectKindToObjectType('REF'),\n referenceName: me._grid.state.ReferenceName,\n referenceCode: me._grid.state.ReferenceName,\n isSelected: true\n };\n var itemSelector = '#' + rowData.id;\n var jItem = $(itemSelector);\n if (jItem.hasClass('Task_obj') || jItem.hasClass('Job_obj')) {\n me._items[+rowData.id] = new global.components.wrappers.objectList.CustomWorkListItem(itemSelector, true, itemData);\n } else {\n me._items[+rowData.id] = new global.components.wrappers.objectList.ListItem(itemSelector, true, itemData);\n }\n }\n });\n me.fire(\"onChange\", me.getSelectedItems(), me._items);\n return me._items;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает выделеннные элементы списка.\n * @method WebAccess.components.wrappers.objectList.ObjectList.getSelectedElements\n * @return {WebAccess.components.wrappers.objectList.ListItem[]}\n */\n getSelectedItems: function () {\n var me = this;\n me._setGrid();\n var selectedRowIds = me._slickGridDataView.getSelectedRowIds();\n\n // Сохраняем выделенные объекты в переменной для возможности получения их с любой страницы.\n // Формировать новый объект нужно, т.к. галочки могут быть сняты, а грид возвращает всегда только текущие выделенные.\n var newSelectedItemsData = {};\n _(selectedRowIds).each(function (rowIdStr) {\n if (typeof rowIdStr !== \"undefined\") {\n var rowId = +rowIdStr;\n newSelectedItemsData[rowId] = me._items[rowId] || me._selectedItems[rowId];\n }\n });\n me._selectedItems = newSelectedItemsData;\n\n return _.toArray(me._selectedItems);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * При клике на чекбокс, вызовем свое событие.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList._onItemSelected\n * @private\n * @return {WebAccess.current.objectList}\n */\n _onItemSelected: function (item) {\n this.fire('onSelect', item, this.getSelectedItems());\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выделить все объекты списка.\n * @method WebAccess.components.wrappers.objectList.ObjectList.selectAll\n * @return {WebAccess.current.objectList}\n */\n selectAll: function () {\n var me = this;\n me._isAllSelected = true;\n\n me._setGrid();\n var rowsData = me._slickGrid.getData().getItems();\n var selectedRowNums = _.range(rowsData.length);\n me._slickGrid.setSelectedRows(selectedRowNums);\n\n me._raiseOnSelectEvent('last');\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Снять выделение со всех элементов списка.\n * @method WebAccess.components.wrappers.objectList.ObjectList.deselectAll\n * @return {WebAccess.current.objectList} Специальный deferred-объект.\n */\n deselectAll: function () {\n var me = this;\n me._isAllSelected = false;\n\n me._setGrid();\n me._slickGrid.setSelectedRows([]);\n\n me._raiseOnSelectEvent(null);\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выделить элемент списка.\n * @method WebAccess.components.wrappers.objectList.ObjectList.selectAll\n * @return {WebAccess.current.objectList}\n */\n selectItemByID: function (id) {\n var me = this;\n\n me._setGrid();\n var selectedRowNums = me._slickGrid.getSelectedRows();\n selectedRowNums.push(me._slickGrid.getData().getIdxById(+id));\n me._slickGrid.setSelectedRows(selectedRowNums);\n\n me._raiseOnSelectEvent(me._items[+id]);\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инвертировать выделение всех объектов списка.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList.invertSelection\n * @return {WebAccess.current.objectList} Специальный deferred-объект.\n */\n invertSelection: function () {\n var me = this;\n\n me._setGrid();\n\n var selectedRowNums = me._slickGrid.getSelectedRows();\n\n var rowsData = me._slickGrid.getData().getItems();\n var allItemNums = _.range(rowsData.length);\n\n var newSelectedRowNums = _.difference(allItemNums, selectedRowNums);\n me._slickGrid.setSelectedRows(newSelectedRowNums);\n\n me._raiseOnSelectEvent('last');\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _raiseOnSelectEvent: function (item) {\n var me = this;\n\n UpdateSelectionNumbers();\n var selected = me.getSelectedItems() || [];\n if (item === 'last') {\n var lastSelected = null;\n if (selected.length > 0) {\n lastSelected = selected[selected.length - 1];\n }\n me.fire('onSelect', lastSelected, selected);\n } else {\n me.fire('onSelect', item, selected);\n }\n },\n\n /**\n * Получить объекты списка, отфильтрованные селектором.\n *\n * @method WebAccess.components.wrappers.objectList.ObjectList.getFilteredItems\n * @return {WebAccess.components.wrappers.objectList.ListItem[]} Специальный deferred-объект.\n */\n getFilteredItems: function (filterSelector) {\n if (filterSelector === '.selected') {\n return this.getSelectedItems();\n }\n throw new Error(\"Not supported.\");\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n global.CMP.wrappers.objectList.ObjectsTable = ObjectsTable;\n\n})(window.WebAccess);\n","\"use strict\";\n(function (global) {\n\n/**\n* Базовый класс реквизита.\n*\n* @class WebAccess.components.wrappers.form.requisites.BaseRequisite\n* @extends BaseObject\n* @property {string} name Имя реквизита\n* @property {string} calssName Имя класса\n* @property {string} fullName Полное имя реквизита. Оставлено для совместимости\n* @property {array} controlsIds Список ИД элементов управления\n* @property {array} controls Список элементов управления\n* @param {string} requisiteName Имя реквизита\n * @param {object|string} data Параметры элемента страницы, либо его селектор\n*/\n var BaseRequisite = BaseObject.extend({\n className: \"BaseRequisite\",\n\n name: \"\",\n fullName: '',\n hasCalculation: false,\n\n controlsIds: [],\n controls: [],\n _isCalculationDisabled: false,\n _isNew: false,\n _isChanged: false,\n _isDisabled: null,\n _data: null,\n _parent: null,\n _referenceViewName: '',\n Init: null,\n // Список всех Init для всех контролов реквизита. От них зависит глобальное событие Init.\n _allControlsInit: null,\n //---------------------------------------------------------------------//\n\n init: function (requisiteName, data, opt_parent) {\n this.Init = $.Deferred();\n this._allControlsInit = [];\n\n if (!$.isPlainObject(data)) {\n var selector = data;\n data = {\n controls: [selector],\n displayValue: \"\",\n isRequired: false,\n isRendered: true,\n isReadOnly: false,\n isSystem: false,\n value: \"\"\n }\n }\n\n this._parent = opt_parent;\n\n if (typeof (data) == 'object') {\n this._data = data;\n } else {\n return this._super(requisiteName);\n };\n\n this.hasCalculation = data.hasCalculation;\n this.name = requisiteName;\n this.fullName = requisiteName;\n\n if (this._data.row_id && this._data.sectionNumber) {\n this.fullName = format(\"{0}${1}${2}\", this._data.sectionNumber, this._data.row_id, this.fullName);\n };\n\n this.controlsIds = this._data.controls || [];\n this._type = data.type;\n this._referenceViewName = data.referenceView;\n\n this.controls = this._getControls();\n this._super(this.controls, true);\n this._bindEvents();\n this._bindUnHighlightOnChange(); // Не в _bindEvents, т.к. _bindEvents переопределяется в других классах не вызывая родительский.\n this._isChanged = false;\n this._raiseInitEvent();\n },\n\n /**\n * Генерирует событие инициализаии реквизита.\n * @private\n */\n _raiseInitEvent: function () {\n var me = this;\n\n $.when.apply(null, me._allControlsInit).then(function () {\n me.Init.resolve();\n });\n },\n //---------------------------------------------------------------------//\n\n /**\n * Инициализация снятия подсветки при изменении реквизита (#108403)\n * @private\n * @since 5.0.0.2008\n * @return WebAccess.components.wrappers.form.requisites.BaseRequisite\n */\n _bindUnHighlightOnChange: function () {\n var me = this;\n me.bind('change', me.unHighlight, me);\n return me;\n },\n\n /**\n * Признак отключения серверных вычислений на реквизите.\n\t *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isCalculationDisabled\n * @return {boolean}\n * @since 5.2.0.2014\n */\n isCalculationDisabled: function () {\n return this._isCalculationDisabled;\n },\n\n /**\n * Представление справочника.\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#referenceViewName\n * @since 5.5.0.9023\n * @return {string}\n */\n referenceViewName: function () {\n return this._referenceViewName;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Признак, что реквизит системный.\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isSystem\n * @since 5.5.0.9000\n * @return {boolean}\n */\n isSystem: function () {\n return this._data.isSystem;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Устанавливает текст всплывающей подсказки.\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#setTooltip\n\t * @param {string} value Текст всплывающей подсказки.\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.2.0.2014\n */\n setTooltip: function (value) {\n $('.tooltip[for=\"' + this.name + '\"]').qtip('option', 'content.text', value);\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получает текст всплывающей подсказки.\n \t*\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#getTooltip\n * @return {string} Текст всплывающей подсказки.\n * @since 5.2.0.2014\n */\n getTooltip: function () {\n var tooltip = $('.tooltip[for=\"' + this.name + '\"]').qtip('option', 'content.text');\n return (!_.isString(tooltip)) ? '' : tooltip;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Отключает серверные вычисления на реквизите.\n\t *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#disableCalculation\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.2.0.2014\n */\n disableCalculation: function () {\n this._isCalculationDisabled = true;\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Включает серверные вычисления на реквизите.\n\t *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#enableCalculation\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.2.0.2014\n */\n enableCalculation: function () {\n this._isCalculationDisabled = false;\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получает тип реквизита.\n\t*\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#getType\n * @return {REQUISITE_TYPE} Тип реквизита.\n * @since 5.2.0.2014\n */\n getType: function () {\n return requisiteTypeFromString(this._type) || this._type;\n },\n //---------------------------------------------------------------------//\n\n /**\n * @ignore\n */\n isNew: function () {\n return this._isNew;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Отобразить спиннер внутри контрола реквизита\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_showSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.BaseRequisite\n */\n _showSpinner: function () {\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\n var jControl = me.controls[i];\n jControl.parent().append('
    ');\n }\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Скрыть спиннер\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_hideSpinner\n * @since 5.2.0.2014\n * @private\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит\n */\n _hideSpinner: function () {\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\n var jControl = me.controls[i];\n jControl.parent().find('.circle-spinner').remove();\n }\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Инициализация событий\n * @private\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_bindEvents\n * @since 5.0.0.7100\n * @return WebAccess.components.wrappers.form.requisites.BaseRequisite\n */\n _bindEvents: function () {\n if (this.controls.length === 0) return this;\n\n var me = this;\n _(me.controls).each(function (jControl) {\n me._bindControlEvents(jControl);\n });\n\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * @private\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_bindControlEvents\n * @since 5.0.0.7100\n */\n _bindControlEvents: function (jControl) {\n var me = this;\n var reqFullName = me.fullName;\n\n jControl.off('change.BaseRequisite').on('change.BaseRequisite', function (ev) {\n var value = me.getValue($(this));\n var displayValue = me.getDisplayValue($(this));\n me._fireChange(reqFullName, value, displayValue, ev);\n });\n },\n //---------------------------------------------------------------------//\n\n /**\n * Вызвать событие изменения\n * @private\n */\n _fireChange: function (reqFullName, value, displayValue, opt_ev) {\n var me = this;\n me._isChanged = true;\n me.fire(\"change\", this, opt_ev, { name: reqFullName, value: value, displayValue: displayValue });\n },\n\n /**\n * Получить контролы реквизита\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_getControls\n * @since 5.0.0.7100\n * @private\n * @return {array} список jquery объектов\n */\n _getControls: function () {\n var me = this;\n var res = [];\n\n if (me.controlsIds.length == 0 || me.controlsIds[0] == \"\") return [];\n\n for (var i = 0; i < me.controlsIds.length; i++) {\n var id = me.controlsIds[i];\n var jControl = $('#' + id);\n res.push(jControl);\n }\n return res;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получает значение подписи для реквизита.\n *\n * @function WebAccess.components.wrappers.form.requisites.BaseRequisite#getLabel\n * @return {string} Строка, содержащая значение подписи для реквизита.\n * @since 5.0.0.7100\n */\n getLabel: function () {\n if (this.controls.length === 0) return null;\n var jLabel = this._getLabelForControl(this.controls[0]);\n return jLabel.text();\n },\n //---------------------------------------------------------------------//\n\n /**\n * Устанавливает подпись для реквизита.\n *\n * @function WebAccess.components.wrappers.form.requisites.BaseRequisite#setLabel\n * @param {string} text Текст подписи\n * @return {WebAccess.components.wrappers.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.0.0.7100\n */\n setLabel: function (text) {\n if (this.controls.length === 0) return this;\n for (var i = 0; i < this.controls.length; i++) {\n var jLabel = this._getLabelForControl(this.controls[0]);\n jLabel.text(text);\n }\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить контрол подписи.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_getLabelForControl\n * @private\n * @since 5.0.0.7100\n * @return {object}\n */\n _getLabelForControl: function (jControl) {\n var jC = jControl.parents('.Card_Element:first').prev('.CardForm_Label');\n if (jC.length) return jC;\n return jControl.parents('tr').eq(0).find('td.wizard-table__cell_type_label');\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получает значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#getValue\n * @return {string} Строка, содержащая значение реквизита.\n * @since 5.0.0.7100\n */\n getValue: function (opt_jControl) {\n var value;\n if (this._data && this._data.isRendered === false) return this._data.value;\n var id;\n if (opt_jControl) id = opt_jControl.attr('id');\n value = this._getControlValue(id || this.controlsIds[0]);\n\n return value;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Признак видимости реквизита на форме.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isVisible\n * @return {boolean} True – реквизит отображается на форме, иначе False.\n * @since 5.0.0.7100\n */\n isVisible: function () {\n if (this.controls.length > 0) {\n return this.controls[0].css('visibility') === 'visible';\n }\n return false;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Признак наличия контролов для реквизита на форме.\n *\n * @since 5.5.0.9003\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isRendered\n * @return {boolean} True – для реквизита присутствуют контролы на форме, иначе False.\n */\n isRendered: function() {\n return this._data.isRendered;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Признак изменения реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isChanged\n * @return {boolean} True – реквизит был изменен, иначе False.\n * @since 5.0.0.7100\n */\n isChanged: function () {\n return this._isChanged;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить значение в поле по его имени.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_getControlValue\n * @since 5.0.0.7100\n * @private\n */\n _getControlValue: function (controlName) {\n var jControl = $(\"input#\" + controlName); //\n if (jControl.data('requisite')) { //\n return jControl.data('requisite').val();\n };\n return jControl.val();\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получает отображаемое значение реквизита.\n *\n * @fixme Не работает с детальными разделами.\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#getDisplayValue\n * @return {string} Строка, содержащая отображаемое значение реквизита.\n */\n getDisplayValue: function (opt_jControl) {\n if (this._data && this._data.isRendered === false) return this._data.displayValue;\n if (this.controls.length === 0) return;\n\n var displayValue = \"\";\n var jReq = opt_jControl || this.controls[0];\n\n displayValue = this.getValue(opt_jControl);\n return displayValue;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Установка значений невидимых реквизитов.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_setInvisibleValues\n * @private\n * @param value {string} устанавливаемое значение\n * @param [opt_displayValue] {string} отображаемое значение\n * @param [opt_needTriggerResult] {string} вызывать триггер события change\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит\n * @since 5.0.0.7100\n */\n _setInvisibleValues: function (value, opt_displayValue, opt_needTriggerResult) {\n this._data.value = value;\n if (opt_displayValue) this._data.displayValue = opt_displayValue;\n this._isChanged = true;\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Устанавливает значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#setValue\n * @param value {string} Устанавливаемое значение реквизита\n * @param [opt_displayValue] {string} Отображаемое значение реквизита\n * @param [opt_needTriggerResult] {boolean} Признак необходимости вызова триггера события change\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.0.0.7100\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult) {\n var me = this;\n if (_.isUndefined(value)) return this;\n if (opt_displayValue && opt_displayValue[0] === '$') opt_displayValue = opt_displayValue.replace('$');\n\n opt_needTriggerResult = (opt_needTriggerResult !== false); //если не передан, то по умолчанию будет true.\n if (this.controls.length === 0) return this._setInvisibleValues(value, opt_displayValue, opt_needTriggerResult);\n\n var val = opt_displayValue || value;\n var jControl;\n for (var i = 0; i < this.controls.length; i++) {\n jControl = this.controls[i];\n jControl.val(val);\n if (opt_displayValue) {\r\n jControl.attr(\"title\", opt_displayValue);\r\n } else {\r\n jControl.removeAttr('title');\r\n }\n if (opt_needTriggerResult) { jControl.change(); }\n };\n\n this._isChanged = true;\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Устанавливает отображаемое значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#setDisplayValue\n * @param value {string} Устанавливаемое значение реквизита\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.0.0.7100\n */\n setDisplayValue: function (value) {\n this.setValue(this.getValue(), value);\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Делает реквизит недоступным для изменения.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#disable\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.0.0.7100\n */\n disable: function () {\n var me = this;\n $(me.controls).each(function (index) {\n me._disableControl($(this));\n });\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Делает реквизит доступным для изменения.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#enable\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.0.0.7100\n */\n enable: function () {\n var me = this;\n $(this.controls).each(function (index) {\n me._enableControl($(this));\n });\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Признак недоступности реквизита для изменения.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isDisabled\n * @return {boolean} True – реквизит недоступен для изменения, иначе False.\n * @since 5.0.0.7100\n */\n isDisabled: function () {\n var isDisabled = false;\n $(this.controls).each(function (index) {\n isDisabled = $(this).hasClass('Req_Disabled');\n });\n return isDisabled;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Отключение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_disableControl\n * @private\n * @since 5.0.0.7100\n */\n _disableControl: function (jControl) {\n jControl.attr('readonly', 'readonly').addClass(\"Req_Disabled\").attr('tabindex', -1);\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Включение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_enableControl\n * @private\n * @since 5.0.0.7100\n */\n _enableControl: function (jControl) {\n jControl.removeAttr('readonly').removeClass(\"Req_Disabled\").removeAttr('tabindex');;\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Скрывает реквизит и его подпись.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#hide\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.0.0.7100\n */\n hide: function () {\n if (this.controls.length === 0) return this;\n for (var i = 0; i < this.controls.length; i++) {\n var jControl = this.controls[i].parents('.Card_Element:first, tr');\n jControl.add(jControl.prev('.CardForm_Label')).css('visibility', \"hidden\");\n };\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Отображает реквизит и его подпись.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#show\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.0.0.7100\n */\n show: function () {\n if (this.controls.length === 0) return this;\n for (var i = 0; i < this.controls.length; i++) {\n var jControl = this.controls[i].parents('.Card_Element:first, tr');\n jControl.add(jControl.prev('.CardForm_Label')).css('visibility', \"visible\");\n };\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Очищает значения реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#clear\n * @param [opt_needTriggerResult] {boolean} Признак необходимости вызова события change\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.0.0.7100\n */\n clear: function (opt_NeedTriggerResult) {\n this.setValue(\"\", \"\", opt_NeedTriggerResult);\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Добавляет иконку к элементу управления реквизита, за исключением реквизитов типа «Справочник» и «Множественный выбор».\n * Метод прикрепляет к тестовому полю действие для события, например, нажатие на иконку.\n * При наступлении этого события в код передаются данные о текущем реквизите.\n *\n * @function WebAccess.components.wrappers.form.requisites.BaseRequisite#setCustomAction\n * @param {string} reqName Имя реквизита\n * @param {string} tooltip Подсказка к реквизиту\n * @param {function} callback Функция, которая будет вызвана после нажатия на иконку реквизита.\n * В эту функцию первым параметром будет отправлена информация о реквизите.\n */\n setCustomAction: function (callback, opt_tooltip) {\n opt_tooltip = \"\" || opt_tooltip;\n var me = this;\n if (this.controls.length === 0) return this;\n\n //TODO Вынести в соответсвующие классы реквизитов.\n\n for (var i = 0; i < this.controls.length; i++) {\n var jReq = this.controls[i];\n var instance = jReq.data(\"ReferenceSelectInstance\");\n\n if (instance) {\n //Для реквизита типа справочник или мультивыбор\n var jReqIcon = jReq.parents(\".rs_SelItems_cont\").next(\".Req_Icon\");\n jReqIcon.unbind();\n jReqIcon.click(function () {\n var reqObj = {\n \"name\": me.name,\n \"value\": me.getValue(),\n \"displayValue\": me.getDisplayValue()\n };\n callback(reqObj);\n });\n } else {\n var jReq = this.controls[i].parent(\"span, div\");\n if (jReq.length > 0) {\n // Для текстового реквизита\n var jReqInput = this.controls[i];\n jReqInput.removeClass(\"text_align_right\");\n\n jReq.prepend(format('
    ', opt_tooltip));\n jReq.children(\".Req_Icon\").click(function () {\n var reqObj = {\n \"name\": me.name,\n \"value\": me.getValue(),\n \"displayValue\": me.getDisplayValue()\n };\n callback(reqObj);\n });\n } else WebAccess.raise(\"ERR_REQUISTE_NOT_FOUND_OR_IS_UNSUPPORTED\");\n }\n }\n },\n //---------------------------------------------------------------------//\n\n /**\n * При смене значения в одном контроле оно должно примениться ко всем.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_bindMirrors\n * @private\n * @since 5.0.0.7100\n */\n _bindMirrors: function () {\n var me = this;\n if (me.controls.length > 1) {\n me.bind('change', function (context, ev, data) {\n me.setValue(data.value, data.displayValue, false);\n });\n }\n return this;\n },\n\n //---------------------------------------------------------------------//\n\n /**\n * Признак обязательного заполнения реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isRequired\n * @return {boolean} True – реквизит обязателен для заполнения, иначе False.\n * @since 5.0.0.7100\n */\n isRequired: function () {\n return this._data.isRequired;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Подсвечивает реквизит.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#highlight\n * @param {string} [opt_color] Цвет поля, в котором указывается значение реквизита. Цвет указывается в виде десятичного или шестнадцатеричного числа.\n\t * Рамка поля всегда окрашивается в красный цвет\n * @param {integer} [opt_speed] Длительность подсвечивания поля, в котором указывается значение реквизита. Чем больше число, тем дольше поле подсвечивается\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.2.0.1300\n */\n highlight: function (opt_color, opt_speed) {\n var me = this;\n var speed = opt_speed || 300;\n\n var blink = function (jObject) {\n var prevColor = jObject.css('backgroundColor');\n var prevBorder = jObject.css('borderColor'); //Почему-то не работает\n\n var highlight = \"#F6DADA\";\n\n if (opt_color) {\n var colorLuminance = function (hex, lum) {\n // validate hex string\n hex = String(hex).replace(/[^0-9a-f]/gi, '');\n if (hex.length < 6) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n lum = lum || 0;\n\n // convert to decimal and change luminosity\n var rgb = \"#\", c, i;\n for (i = 0; i < 3; i++) {\n c = parseInt(hex.substr(i * 2, 2), 16);\n c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);\n rgb += (\"00\" + c).substr(c.length);\n }\n return rgb;\n }\n jObject.animate({ backgroundColor: colorLuminance(opt_color, .4), borderColor: opt_color }, speed, function () {\n $(this).animate({ backgroundColor: prevColor, borderColor: prevBorder }, speed);\n });\n } else {\n jObject.addClass('Req_Error').animate({ backgroundColor: highlight }, 300, function () {\n $(this).animate({ backgroundColor: prevColor }, speed);\n });\n }\n return jObject;\n };\n\n for (var j = 0; j < me.controlsIds.length; j++) {\n (function (index) {\n var reqSelector = me.controlsIds[index];\n if (!reqSelector) return;\n\n var jEl = me._getJElementForHighlight(reqSelector);\n if (jEl) {\n blink(jEl);\n }\n })(j);\n }\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Снимает подсветку с реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#unHighlight\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.2.0.2008\n */\n unHighlight: function () {\n var me = this;\n\n for (var j = 0; j < me.controlsIds.length; j++) {\n var reqSelector = me.controlsIds[j];\n if (!reqSelector) continue;\n\n var jEl = me._getJElementForHighlight(reqSelector);\n if (jEl) {\n jEl.removeClass('Req_Error')\n .css('borderTopColor', '')\n .css('borderBottomColor', '')\n .css('borderLeftColor', '')\n .css('borderRightColor', ''); // Просто borderColor не получить http://stackoverflow.com/questions/9915966/jquery-cssborder-color-does-not-return-anything\n }\n }\n\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Возвращает элемент для подсветки.\n * @private\n */\n _getJElementForHighlight: function (reqSelector) {\n var reqChild = $('#' + reqSelector).find('input,textarea');\n if (reqChild.length > 0) {\n // Если реквизит текстовый\n return reqChild;\n } else {\n if (typeof (reqSelector) != \"undefined\") {\n // Если реквизит типа справочник\n var reqRef = $('#' + reqSelector);\n if (reqRef.length > 0) {\n var fakeInput = reqRef.parent().parent().parent().find('input.fakeInput:first');\n if (fakeInput.length > 0) {\n return fakeInput;\n } else {\n return reqRef;\n };\n };\n } else {\n // Если реквизит типа справочник в детальном разделе\n var fakereq = $('div[name=\"' + reqs[i] + '\"]');\n if (fakereq.length > 0) {\n return fakereq.find('input.fakeInput');\n };\n }\n }\n return null;\n },\n\n /**\n * Устанавливает признак isChanged в состояние true.\n * Не вызывает срабатывания событий change.\n *\n\t* @method WebAccess.components.wrappers.form.requisites.BaseRequisite#touch\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.2.0.1300\n */\n touch: function () {\n this._isChanged = true;\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Устанавливает признак isChanged в состояние false.\n\t*\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#setUntouched\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит.\n * @since 5.2.0.2014\n */\n setUntouched: function () {\n this._isChanged = false;\n return this;\n },\n //---------------------------------------------------------------------//\n\n\n /**\n * Получает строковое представление реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#asString\n * @overrides BaseObject.asString\n * @return {string} Строковое представление реквизита.\n * @since 5.0.0.7100\n */\n asString: function () {\n var me = this;\n return $.toJSON({\n name: me.name,\n fullName: me.fullName,\n value: me.getValue(),\n displayValue: me.getDisplayValue()\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает строку детального раздела, к которой относится реквизит.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#getRow\n * @return {WebAccess.components.wrappers.form.BaseTableLine} Строка детального раздела.\n */\n getRow: function () {\n var row = null;\n if (typeof this._parent.getTable !== 'undefined') {\n var table = this._parent.getTable();\n if (typeof table !== 'undefined') {\n row = table.rows[this._parent.id];\n }\n }\n\n return row;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n }, {\n /**\n * Срабатывает после изменения реквизита.\n\t *\n * @event WebAccess.components.wrappers.form.requisites.BaseRequisite.EVENT.AFTER_CHANGE\n * @param {WebAccess.components.wrappers.form.requisites.BaseRequisite} Наследник объекта типа BaseRequisite в зависимости от того, к какому классу относится реквизит\n * @param {Event} event Исходное событие (оставлено для обратной совместимости с CardForm)\n * @param {Object} values Значение реквизита\n * @since 5.2.0.2014\n */\n EVENT: {\n AFTER_CHANGE: 'change',\n\n\n /**\n * Событие срабатывает если данные в реквизите были изменены.\n *\n * @event WebAccess.components.wrappers.form.requisites.BaseRequisite.EVENT.CHANGE\n * @param {object} context ссылка на экземпляр класса\n * @since 5.5.0.2201\n */\n CHANGE: 'change'\n }\n });\n\n global.WA.CMP.wrappers.form.requisites.BaseRequisite = BaseRequisite;\n})(window);\n","\"use strict\";\n\n/**\n* Реквизит типа «Ссылка на документ».\n*\n* @class WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite\n* @extends WebAccess.components.wrappers.form.requisites.BaseRequisite\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {obbject} data Данные для инициализации реквизита\n* @since 5.5.0.1000\n*/\n(function (global) {\n\n /**\n * @inner\n * @since 5.5.0.1000\n */\n var onControlInitComplete = function (jControl, callback) {\n if (jControl.data('ReferenceSelectInstance')) {\n callback();\n } else {\n jControl.bind('Init', function () {\n callback();\n });\n }\n };\n\n var BaseObjectSelectRequisite = global.WA.CMP.wrappers.form.requisites.BaseRequisite.extend({\n className: \"BaseObjectSelectRequisite\",\n\n /**\n * Получить контролы реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#_bindEvents\n * @private\n * @return {array} список jquery объектов\n * @since 5.5.0.1000\n */\n _getControls: function () {\n var me = this;\n var res = [];\n\n if (me.controlsIds.length == 0 || me.controlsIds[0] == \"\") return [];\n\n for (var i = 0; i < me.controlsIds.length; i++) {\n var id = me.controlsIds[i];\n var jControl = $('input#' + id);\n res.push(jControl);\n }\n\n return res;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Отобразить спиннер внутри контрола реквизита\n * @method WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#_showSpinner\n * @since 5.5.0.1000\n * @private\n * @return WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite\n */\n _showSpinner: function () {\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\n var jControl = me.controls[i];\n var jContainer = jControl.parents('.reference_requisite');\n jContainer.find('.Req_Icon').hide();\n jContainer.append('
    ');\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть спиннер\n * @method WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#_hideSpinner\n * @since 5.5.0.1000\n * @private\n * @return WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite\n */\n _hideSpinner: function () {\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\n var jControl = me.controls[i];\n var jContainer = jControl.parents('.reference_requisite');\n jContainer.find('.Req_Icon').show(); //FIXME: Не всегда все иконки должны быть отображены\n jContainer.find('.circle-spinner').remove();\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#getDisplayValue\n * @return {string} Строка, содержащая отображаемое значение реквизита.\n */\n getDisplayValue: function (opt_jControl) {\n if (this._data && this._data.isRendered === false) return this._data.displayValue;\n if (this.controls.length === 0) return;\n var jCustomControl = opt_jControl || this.controls[0].prev(\"span\");\n var jInput = this.controls[0];\n if (jInput.hasClass('rs_custom') && jInput.data('selected') == 'false') {\n return jInput.val();\n } else {\n var values = [];\n jCustomControl.parents('.rs_SelItems').children(\"span\").each(function () {\n values.push($(this).attr(\"data-text\"));\n });\n return values.join(';');\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить значение отображаемых и неотображаемых реквизитов.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#setValue\n * @param value {string} Устанавливаемое значение\n * @param [opt_displayValue] {string} Отображаемое значение\n * @param [opt_needTriggerResult] {string} Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite} Текущий объект реквизита – BaseObjectSelectRequisite.\n * @since 5.5.0.1000\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult, opt_leadRequisiteValues) {\n var me = this;\n opt_needTriggerResult = (opt_needTriggerResult !== false);\n\n if (me.controls.length === 0) return me._setInvisibleValues(value, opt_displayValue, opt_needTriggerResult);\n\n $.each(me.controls, function () {\n WA.CMP.wrappers.form.requisites.BaseObjectSelectRequisite.setControlValue(this, value, opt_displayValue, opt_needTriggerResult, opt_leadRequisiteValues);\n });\n\n this._isChanged = true;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить значение в поле по его имени.\n *\n * @private\n * @function WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#_getControlValue\n * @since 5.5.0.1000\n */\n _getControlValue: function (controlName) {\n var value;\n\n var jHidden = $('#hSelID_' + controlName);\n\n var jInput = this.controls[0];\n if (jInput.hasClass('rs_custom')) {\n if (jInput.data('selected') == 'false') {\n value = '$' + jInput.val();\n } else {\n value = jHidden.val();\n }\n } else {\n value = jHidden.val();\n }\n\n return (value && value !== '$') ? value : '';\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак недоступности реквизита справочника для изменения.\n *\n * @function WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#isDisabled\n * @return {Boolean} True – реквизит справочника доступен только для чтения, иначе False.\n * @since 5.5.0.1000\n */\n isDisabled: function () {\n var isDisabled = false;\n $(this.controls).each(function (index) {\n if ($(this).attr('readonly') === \"readonly\") isDisabled = true;\n });\n return isDisabled;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Отключение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#_disableControl\n * @private\n * @return {WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite}\n * @since 5.5.0.1000\n */\n _disableControl: function (jControl) {\n onControlInitComplete(jControl, function () { jControl.SetDisabled() });\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Включение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#_enableControl\n * @private\n * @return {WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite}\n * @since 5.5.0.1000\n */\n _enableControl: function (jControl) {\n onControlInitComplete(jControl, function () { jControl.SetEnabled(); });\n return this;\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация событий.\n *\n * @private\n * @method WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#_bindEvents\n * @since 5.5.0.1000\n * @return WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite\n */\n _bindEvents: function () {\n var me = this;\n\n if (me.controls.length === 0) {\n var controlInit = $.Deferred();\n me._allControlsInit.push(controlInit);\n controlInit.resolve();\n return me;\n }\n\n $.each(me.controls, function () {\n me._bindControlEvents(this);\n });\n\n return me;\n },\n\n _bindControlEvents: function (jControl) {\n var me = this;\n\n var controlInit = $.Deferred();\n me._allControlsInit.push(controlInit);\n\n onControlInitComplete(jControl, function () {\n\n var rs = jControl.data('ReferenceSelectInstance');\n var reqFullName = me.fullName;\n if (!!rs) {\n if (rs.multiselect) {\n jControl.resultMulti(function (ev, changedData, data) {\n var res = [];\n if (data) {\n if (!$.isArray(data)) {\n data = [data];\n };\n for (var i = 0; i < data.length; i++) {\n res.push({ name: reqFullName, value: data[i].groupcode + ':' + data[i].id, displayValue: data[i].name });\n }\n }\n me._isChanged = true;\n me.fire(\"change\", jControl, ev, res);\n WA.CR.form.fire(\"change\", jControl, ev, res);\n return this;\n });\n } else {\n\n jControl.result(function (ev, data) {\n if (data == null) {\n data = [null, null, null, '{}'];\n }\n me._isChanged = true;\n me.fire(\"change\", jControl, ev, { name: reqFullName, value: data[0], displayValue: data[2] });\n me.fire(\"changeWithLeaderValues\", jControl, ev, { name: reqFullName, value: data[0], displayValue: data[2], leaderRequisiteValues: $.parseJSON(data[3]) }, true);\n WA.CR.form.fire(\"change\", jControl, ev, { name: reqFullName, value: data[0], displayValue: data[2] });\n });\n }\n if (!rs.allowlike) {\n jControl\n .on('change', function (ev) {\n var value = jControl.val();\n me._isChanged = true;\n me.fire(\"change\", jControl, ev, { name: reqFullName, value: '$' + value, displayValue: value });\n WA.CR.form.fire(\"change\", jControl, ev, { name: reqFullName, value: '$' + value, displayValue: value });\n })\n .on('changeOnSelectValue', function (ev, data) {\n if (data == null) {\n data = [null, null, null, '{}'];\n }\n var value = data[0];\n var displayValue = data[2];\n me._isChanged = true;\n me.fire(\"change\", jControl, ev, { name: reqFullName, value: value, displayValue: displayValue });\n WA.CR.form.fire(\"change\", jControl, ev, { name: reqFullName, value: value, displayValue: displayValue });\n });\n }\n }\n\n\n // Бывает случаи когда он изменяется без срабатывания событий выше, но изменения должны уходить на сервер. Например, при очистке ведущего, очищается ведомый.\n jControl.on('change', function (ev) {\n me._isChanged = true;\n });\n\n controlInit.resolve();\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Возвращает признак возможности множественного выбора.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite#isMultiselect\n * @since 5.4.0.1013\n * @return {boolean} True - если реквизит поддерживает множественный выбор, иначе - False.\n */\n isMultiselect: function () {\n return false;\n }\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @static\n */\n BaseObjectSelectRequisite.setControlValue = function (jControl, value, opt_displayValue, opt_needTriggerResult, opt_leadRequisiteValues) {\n var id = jControl.attr('id');\n var jHidd = $(\"#hSelID_\" + id);\n if (jHidd.length > 0) {\n //jHidd.val(value); //Шамов А.: Нельзя устанавливать значение скрытой переменной, т.к. это не позволит выполнить событие result. Скрытую переменную означит метод SetValue у компоненты выбор из справочника.\n jControl.attr(\"title\", opt_displayValue);\n\n if (!$('html').hasClass('mobile')) {\n if (value) {\n // если множественный выбор, то значения\n // записываются в виде \"СПР:11111;СПР2:23233\"\n var values = ('' + value).split(\";\");\n var displayValues = ('' + opt_displayValue).split(\";\");\n onControlInitComplete(jControl, function () {\n jControl.Clear();\n for (var i = 0; i < values.length; i++) {\n var leadRequisiteValues = opt_leadRequisiteValues ? JSON.stringify(opt_leadRequisiteValues) : '{}';\n jControl.SetValue(['' + values[i], ('' + displayValues[i]).escapeHtml(), displayValues[i], leadRequisiteValues], opt_needTriggerResult);\n };\n });\n } else {\n onControlInitComplete(jControl, function () {\n jControl.SetValue(['', '', '', '{}'], opt_needTriggerResult);\n });\n }\n } else {\n jControl.val(opt_displayValue);\n }\n jControl.SetSelected(true);\n }\n };\n\n global.WA.CMP.wrappers.form.requisites.BaseObjectSelectRequisite = BaseObjectSelectRequisite;\n})(window);","\"use strict\";\n\n/**\n* Реквизит типа «Выбор из справочника» и «Множественный выбор».\n*\n* @class WebAccess.components.wrappers.form.requisites.Reference\n* @extends WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {obbject} data Данные для инициализации реквизита\n* @since 5.0.0.7100\n*/\n(function (global) {\r\n\n var Reference = global.WA.CMP.wrappers.form.requisites.BaseObjectSelectRequisite.extend({\r\n className: \"Reference\",\n\n /**\n * Установить фильтрацию по реквизитам справочника.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#setFilter\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Текущий объект реквизита – Reference.\n * @since 5.0.0.7100\n */\n setFilter: function (filter, opt_refCode) {\r\n if (this.controls.length === 0) return;\n for (var i = 0; i < this.controls.length; i++) {\r\n var jControl = this.controls[i];\n if (!opt_refCode) {\r\n jControl.data('filter', filter);\r\n } else {\r\n jControl.data('ReferenceSelectInstance').refcodes[opt_refCode]['Filter'] = filter;\r\n }\r\n };\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Получает выражение фильтрации реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#getFilter\n * @since 5.4.0.1013\n * @return {string} Выражение фильтрации.\n */\n getFilter: function (referenceCode) {\r\n if (this.controls.length === 0) return null;\n\n var filter = null;\n for (var i = 0; i < this.controls.length; i++) {\r\n var jControl = this.controls[i];\n var refSelect = jControl.data('ReferenceSelectInstance');\n if (referenceCode && refSelect && refSelect.refcodes[referenceCode]) {\r\n filter = refSelect.refcodes[referenceCode]['Filter'];\r\n }\n return filter || jControl.data('filter');\r\n }\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить имена справочников для выборки.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#getReferences\n * @since 5.0.0.7200\n * @return {object} Имена справочников для выборки.\n */\n getReferences: function () {\r\n var jControl;\n if (this.controls.length === 0) return this;\n for (var i = 0; i < this.controls.length; i++) {\r\n jControl = this.controls[i];\n return jControl.data('ReferenceSelectInstance').refcodes;\r\n };\r\n },\n\n /**\n * Установить выборку из указанных справочников.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#setReferences\n * @param {object} references Информация о справочниках. Формат описания выборки:\n * {\"ОРГ\":{\"Caption\": \"организации\",...},\"РАБ\":{..}}}\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Текущий объект реквизита – Reference.\n * @since 5.0.0.7100\n */\n setReferences: function (references) {\r\n var jControl;\n if (this.controls.length === 0) return this;\n for (var i = 0; i < this.controls.length; i++) {\r\n jControl = this.controls[i];\n jControl.data('ReferenceSelectInstance').setReferences(references);\r\n };\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить новый справочник к текущему списку справочников для выборки.\n *\n * @function WebAccess.components.wrappers.form.requisites.Reference#addReferences\n * @param {object} references Информация о справочниках. Формат описания выборки:\n * {\"ОРГ\":{\"Caption\": \"организации\",...},\"РАБ\":{..}}}\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Текущий объект реквизита – Reference.\n * @since 5.0.0.7100\n */\n addReferences: function (references) {\r\n if (this.controls.length === 0) return this;\n for (var i = 0; i < this.controls.length; i++) {\r\n var jControl = this.controls[i];\n jControl.data('ReferenceSelectInstance').addReferences(references);\r\n };\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить значение отображаемых и неотображаемых реквизитов.\n * Формат записи метода: [{groupcode:'код справочника', id:'ид записи', name:'наименование'}, ...].\n *\n * @function WebAccess.components.wrappers.form.requisites.Reference#setValues\n * @param {object} newValues Новые значения множественного выбора\n * @param {boolean} needTriggerResult Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Текущий объект реквизита – Reference.\n * @since 5.0.0.7100\n */\n setValues: function (newValues, needTriggerResult) {\r\n var me = this;\n if (me.controls.length === 0) return me; //TODO Сделать установку скрытых полей множественного выбора.\n me._setControlsValues(newValues, needTriggerResult);\n\n me._updateNewValues(newValues).done(function (updatedNewValues) {\r\n me._setControlsValues(updatedNewValues, false);\r\n });\n\n me._isChanged = true;\n return me;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить значение контролов.\n *\n * @function WebAccess.components.wrappers.form.requisites.Reference#_setControlsValues\n * @private\n * @param {object} newValues Новые значения множественного выбора\n * @param {boolean} needTriggerResult Вызвать триггер для события типа change\n * @since 5.0.0.9107\n */\n _setControlsValues: function (newValues, needTriggerResult) {\r\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\r\n var jControl = me.controls[i];\n jControl.data('ReferenceSelectInstance').setValues(newValues, needTriggerResult);\r\n };\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обновить значения устанавливаемых значений.\n *\n * @function WebAccess.components.wrappers.form.requisites.Reference#_updateNewValues\n * @param {object} newValues Обновляемые значения.\n * @return {Array} Обновленный список значений с заполненными свойствами наименования и справочника.\n * @since 5.5.0.9000\n */\n _updateNewValues: function (newValues) {\r\n var d = $.Deferred();\n\n if (newValues.length) {\r\n // Получить список новых значений, у которых не указаны отображаемые значения\n var withoutDisplayValues = newValues.filter(function (item) {\r\n return !item.name && item.id;\r\n });\n\n if (withoutDisplayValues.length) {\r\n var ids = [];\r\n withoutDisplayValues.forEach(function (item) {\r\n ids.push(item.id);\r\n });\r\n\r\n // Получим наименования записей справочника\r\n WA.SRV.reference.getReferenceRecordsNames(ids).done(function (res) {\r\n // Пройтись по всем записям справочника\r\n newValues.forEach(function (item) {\r\n if (!item.name && res[item.id]) {\r\n item.name = res[item.id].name;\r\n }\r\n });\r\n\r\n d.resolve(newValues);\r\n });\r\n } else {\r\n d.resolve(newValues);\r\n }\r\n } else {\r\n d.resolve(newValues);\r\n }\n\r\n\r\n return d.promise();\r\n },\n\n /**\n * Получает значения реквизита.\n * Формат результата метода: [{groupcode:'код справочника', id:'ид записи', name:'наименование'}, ...].\n *\n * @function WebAccess.components.wrappers.form.requisites.Reference#getValues\n * @return {Array} Массив объектов значений реквизита – currentValues.\n * @since 5.4.0.1012\n */\n getValues: function () {\r\n if (this.controls.length === 0) return this; //TODO Сделать установку скрытых полей множественного выбора.\n for (var i = 0; i < this.controls.length; i++) {\r\n var jControl = this.controls[i];\n return jControl.data('ReferenceSelectInstance').getValues();\r\n };\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавляет новые значения отображаемых и неотображаемых реквизитов к уже существующим.\n * Формат записи метода: [{groupcode:'код справочника', id:'ид записи', name:'наименование'}, ...].\n *\n * @function WebAccess.components.wrappers.form.requisites.Reference#addValues\n * @param {object} newValues Новые значения множественного выбора\n * @param {boolean} needTriggerResult Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Текущий объект реквизита – Reference.\n * @since 5.4.0.1012\n */\n addValues: function (newValues, needTriggerResult) {\r\n var me = this;\r\n var currentValues = me.getValues();\n me._addValues(currentValues, newValues, needTriggerResult);\n\n me._updateNewValues(newValues).done(function (updatedNewValues) {\r\n me._addValues(currentValues, updatedNewValues, false);\r\n });\n\n return me;\r\n },\n\n /**\n * Добавить новые значения к реквизиту.\n *\n * @function WebAccess.components.wrappers.form.requisites.Reference#_addValues\n * @private\n * @param {object} currentValues - значение реквизита, к которому добавляются новые.\n * @param {object} newValues Новые значения множественного выбора\n * @param {boolean} needTriggerResult Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Текущий объект реквизита – Reference.\n * @since 5.5.0.9107\n */\n _addValues: function (currentValues, newValues, needTriggerResult) {\r\n var me = this;\r\n var allValues = currentValues.concat(newValues.filter(function (newItem) {\r\n var unique = true;\n currentValues.forEach(function (currentItem) {\r\n if (currentItem.id == newItem.id) {\r\n unique = false;\n return false;\r\n }\r\n });\n return unique;\r\n }));\n me.setValues(allValues, needTriggerResult);\n return me;\r\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Указать справочник, выбор из которого будет выполняться в первую очередь.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#setMainReference\n * @param {string} referenceName Справочник, выбор из которого будет выполняться в первую очередь\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Объект типа Reference.\n * @since 5.0.0.7200\n */\n setMainReference: function (referenceName) {\r\n if (this.controls.length === 0) return this;\n for (var i = 0; i < this.controls.length; i++) {\r\n var jControl = this.controls[i];\n jControl.data('ReferenceSelectInstance').mainReferenceCode = referenceName;\r\n };\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Очистить параметры выбора из справочников.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#clearReferences\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Объект типа Reference.\n * @since 5.0.0.7200\n */\n clearReferences: function () {\r\n this.setReferences({});\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавляет справочник для выборки, из которого доступны последние и избранные объекты.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#addLastObjectsPseudoReference\n * @param {LAST_REFERENCES} lastReferences Справочники, из которых будет выполняться выбор\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Объект типа Reference.\n * @since 5.0.0.7200\n */\n addLastObjectsPseudoReference: function (lastReferences) {\r\n var oldRefs = this.getReferences();\n\n var newRefs = $.extend({\r\n 'ROUTELASTOBJS': { 'Caption': L('ROUTE_LAST_OBJECTS_PSEUDO_REFERENCE_CAPTION'), 'NeedShowHint': true, 'DisableSpecialProcessing': false, 'Filter': lastReferences }\r\n }, oldRefs);\n\n this.setReferences(newRefs);\n return this;\r\n },\n\n /**\n * Удалить из списка выборки справочник, из которого доступны последние и избранные объекты.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#removeLastObjectsPseudoReference\n * @param {LAST_REFERENCES} LastReferences Справочники, из которых будет выполняться выбор\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Объект типа Reference.\n * @since 5.0.0.7200\n */\n removeLastObjectsPseudoReference: function () {\r\n var oldRefs = this.getReferences();\n delete oldRefs['ROUTELASTOBJS'];\n this.setReferences(oldRefs);\n return this;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Привязывает вызов справочника в модальном окне к клику на иконке в поле ввода.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#bindReferenceGridDialog\n * @since 5.4.0.1012\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Текущий объект реквизита – Reference\n */\n bindReferenceGridDialog: function () {\r\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\r\n var jControl = me.controls[i];\n var jContainer = jControl.parents('.reference_requisite');\n var jReqIcon = jContainer.find('.Req_Icon');\n jReqIcon.unbind('click touchstart').bind('click touchstart', function (e) {\r\n e.stopPropagation();\n var referenceCode = '';\n // Получаем первый код справочника\n for (var value in me.getReferences()) {\r\n referenceCode = value;\n break;\r\n }\n var mode = me.isDisabled() ? REFERENCE_MODAL_MODE.VIEW :\n (me.isMultiselect() ? REFERENCE_MODAL_MODE.MULTI : REFERENCE_MODAL_MODE.SINGLE);\n WebAccess.components.dialogs.ReferenceGridDialog.createAndShow({\r\n referenceName: referenceCode,\n mode: mode,\n filterExpression: me.getFilter(referenceCode),\n filterQuery: jControl.val(),\n queryContext: me.queryContext(),\n leaderSelectedId: me.leaderSelectedId()\r\n }).selectionDone(function (result) {\r\n if (mode == REFERENCE_MODAL_MODE.MULTI) {\r\n var valuesToBeSet = result.map(function (entry) {\r\n return {\r\n groupcode: referenceCode,\n id: entry.id,\n name: entry.name\r\n }\r\n });\n me.addValues(valuesToBeSet);\r\n } else if (mode == REFERENCE_MODAL_MODE.SINGLE) {\r\n me.setValue(result[0].id, result[0].name, true, result[0].leaderRequisiteValues);\r\n }\r\n });\r\n });\r\n }\n return me;\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Возвращает признак возможности множественного выбора.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#isMultiselect\n * @since 5.4.0.1013\n * @return {boolean} True - если реквизит поддерживает множественный выбор, иначе - False.\n */\n isMultiselect: function () {\r\n if (this.controls.length === 0) return false;\n for (var i = 0; i < this.controls.length; i++) {\r\n return this.controls[i].data('ReferenceSelectInstance').multiselect;\r\n }\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Возвращает контекст выборки.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#isMultiselect\n * @since 5.5.0.1000\n * @return {dict} Контекст выборки.\n */\n queryContext: function () {\r\n if (this.controls.length === 0) return null;\n for (var i = 0; i < this.controls.length; i++) {\r\n return this.controls[i].data('ReferenceSelectInstance').queryContext;\r\n }\r\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Возвращает список ведущих реквизитов.\n *\n * @method WebAccess.components.wrappers.form.requisites.Reference#isMultiselectse.js\n * @since 5.5.0.1000\n * @return {string} Список ведущих реквизитов.\n */\n leaderSelectedId: function () {\r\n if (this.controls.length === 0) return null;\n for (var i = 0; i < this.controls.length; i++) {\r\n return this.controls[i].data('ReferenceSelectInstance').extraParams.LeadSelID();\r\n }\r\n },\n\n /**\r\n * Установить значение отображаемых и неотображаемых реквизитов.\r\n *\r\n * @method WebAccess.components.wrappers.form.requisites.Reference#setValue\r\n * @param value {string} Устанавливаемое значение\r\n * @param [opt_displayValue] {string} Отображаемое значение\r\n * @param [opt_needTriggerResult] {string} Вызвать триггер для события типа change\r\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Текущий объект реквизита – Reference.\r\n * @since 5.5.0.9000\r\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult, opt_leadRequisiteValues) {\r\n var me = this;\r\n me._super(value, opt_displayValue, opt_needTriggerResult, opt_leadRequisiteValues);\r\n\r\n if (!opt_displayValue && !me.hasCalculation) {\r\n if (value) {\r\n var baseSetValue = me._super;\r\n\r\n var references = me.getReferences();\r\n var referenceName = Object.keys(references)[0];\r\n me._updateNewValues([{ groupcode: referenceName, id: value, name: '' }]).done(function (updatedNewValues) {\r\n baseSetValue.apply(me, [value, updatedNewValues[0].name, false, false]);\r\n });\r\n }\r\n }\r\n\r\n return me;\r\n }\r\n\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.WA.CMP.wrappers.form.requisites.Reference = Reference;\r\n})(window);","\"use strict\";\n\n/**\n* Реквизит типа «Ссылка на документ».\n*\n* @class WebAccess.components.wrappers.form.requisites.Document\n* @extends WebAccess.components.wrappers.form.requisites.BaseObjectSelectRequisite\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {obbject} data Данные для инициализации реквизита\n* @since 5.5.0.1000\n*/\n(function (global) {\n\n var Document = global.WA.CMP.wrappers.form.requisites.BaseObjectSelectRequisite.extend({\n className: \"Document\",\n\n /**\n * Возвращает признак возможности множественного выбора.\n *\n * @method WebAccess.components.wrappers.form.requisites.Document#isMultiselect\n * @since 5.4.0.1013\n * @return {boolean} True - если реквизит поддерживает множественный выбор, иначе - False.\n */\n isMultiselect: function () {\n return false;\n },\n\n /**\n * Установить значение отображаемых и неотображаемых реквизитов.\n *\n * @method WebAccess.components.wrappers.form.requisites.Document#setValue\n * @param value {string} Устанавливаемое значение\n * @param [opt_displayValue] {string} Отображаемое значение\n * @param [opt_needTriggerResult] {string} Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.Document} Текущий объект реквизита – Document.\n * @since 5.5.0.9000\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult, opt_leadRequisiteValues) {\n var me = this;\n var baseSetValue = me._super;\n me._super(value, opt_displayValue, opt_needTriggerResult, opt_leadRequisiteValues);\n\n if (!opt_displayValue && !me.hasCalculation) {\n if (value) {\n WA.SRV.document.getNameById([value]).done(function (res) {\n baseSetValue.apply(me, [value, res, false, false]);\n }).fail(function (message) {\n baseSetValue.apply(me, [value, message, false, false]);\n });\n }\n }\n\n return me;\n }\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.WA.CMP.wrappers.form.requisites.Document = Document;\n})(window);","\"use strict\";\n\n/**\n* Реквизит типа «Строка» и «Многострочный текст».\n* \n* @class WebAccess.components.wrappers.form.requisites.Text\n* @extends WebAccess.components.wrappers.form.requisites.BaseRequisite\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {object} data Данные для инициализации реквизита\n* @since 5.0.0.7100\n*/\n(function (global) {\n\n var Text = global.WA.CMP.wrappers.form.requisites.BaseRequisite.extend({\n className: \"Text\",\n\n /** \n * Получить значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Text#getValue\n * @return {string} Строка, содержащая значение реквизита.\n * @since 5.0.0.7100\n */\n getValue: function (opt_jControl) {\n if (this._data && this._data.isRendered === false) return this._data.value;\n\n var jControl = opt_jControl || this.controls[0];\n if (typeof jControl.data('autoNumeric') === 'object') {\n return jControl.autoNumeric('get');\n }\n return (!jControl.val()) ? null : jControl.val();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /** \n * Получить отображаемое значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Text#getDisplayValue\n * @return {string} Строка, содержащая отображаемое значение реквизита.\n */\n getDisplayValue: function (opt_jControl) {\n return this.getValue(opt_jControl);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /** \n * Установить значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Text#setValue\n * @param value {string} Устанавливаемое значение реквизита\n * @param [opt_displayValue] {string} Отображаемое значение\n * @param [opt_needTriggerResult] {string} Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.Text} Текущий объект реквизита – Text.\n * @since 5.0.0.7100\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult) { \n opt_needTriggerResult = (opt_needTriggerResult !== false);\n var value = opt_displayValue || value;\n var jControl;\n\n if (this.controls.length === 0) return this._setInvisibleValues(value, opt_displayValue, opt_needTriggerResult);\n\n for (var i = 0; i < this.controls.length; i++) {\n jControl = this.controls[i];\n jControl.val(value);\n if (opt_needTriggerResult) { jControl.change(); }\n if (!jControl.is(\"textarea\")) jControl.attr(\"title\", value);\n };\n\n this._isChanged = true;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /** \n * Установить отображаемое значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Text#setDisplayValue\n * @param value {string} Устанавливаемое значение реквизита\n * @return {WebAccess.components.wrappers.form.requisites.Text} Текущий объект реквизита – Text.\n * @since 5.0.0.7100\n */\n setDisplayValue: function (value) {\n this.setValue(value);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Получить контролы реквизита\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_bindEvents\n * @since 5.0.0.7100\n * @private\n * @return {array} список jquery объектов\n */\n _getControls: function () {\n var me = this;\n var res = [];\n var jControl;\n\n if (me.controlsIds.length == 0 || me.controlsIds[0] == \"\") return [];\n\n for (var i = 0; i < me.controlsIds.length; i++) {\n var id = me.controlsIds[i];\n jControl = $('input#' + id + ',textarea#' + id);\n res.push(jControl);\n };\n return res;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n global.WA.CMP.wrappers.form.requisites.Text = Text;\n})(window);","\"use strict\";\n\n/**\n* Класс для реквизита типа «Дата».\n* \n* @class WebAccess.components.wrappers.form.requisites.Date\n* @extends WebAccess.components.wrappers.form.requisites.Text\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {obbject} data Данные для инициализации реквизита\n* @since 5.0.0.7100\n*/\n(function (global) {\n /**\n * @inner\n */\n var onControlInitComplete = function (jControl, callback) {\n if (jControl.hasClass('inited')) {\n callback();\n } else {\n jControl.bind('Init', function () {\n callback();\n });\n }\n };\n\n var Date = global.WA.CMP.wrappers.form.requisites.Text.extend({\n className: \"Date\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @private \n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_bindControlEvents\n * @since 5.0.0.7100\n */\n _bindControlEvents: function (jControl) {\n var me = this;\n var controlInit = $.Deferred();\n me._allControlsInit.push(controlInit);\n\n me._super(jControl);\n\n onControlInitComplete(jControl, function () {\n controlInit.resolve();\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить спиннер внутри контрола реквизита\n * @method WebAccess.components.wrappers.form.requisites.Date#_showSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.Date\n */\n _showSpinner: function () {\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\n var jControl = me.controls[i];\n var jContainer = jControl.parent();\n jContainer.find('.Req_Icon').hide();\n jContainer.append('
    ');\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть спиннер\n * @method WebAccess.components.wrappers.form.requisites.Date#_hideSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.Date\n */\n _hideSpinner: function () {\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\n var jControl = me.controls[i];\n var jContainer = jControl.parent();\n jContainer.find('.Req_Icon').show();\n jContainer.find('.circle-spinner').remove();\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Установить значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Date#setValue\n * @param value {string} Устанавливаемое значение реквизита\n * @param [opt_displayValue] {string} Отображаемое значение\n * @param [opt_needTriggerResult] {string} Вызов триггера события типа change\n * @return {WebAccess.components.wrappers.form.requisites.Date} Текущий объект реквизита – Date.\n * @since 5.0.0.7100\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult) {\n if (typeof value === \"object\") {\n value = formatDate(value);\n } else if(value !== null && ('' + value).indexOf('T') !== -1) {\n value = new Date(value);\r\n }\n return this._super(value, opt_displayValue, opt_needTriggerResult);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Получить значение реквизита в виде JS-объекта типа «Дата».\n *\n * @method WebAccess.components.wrappers.form.requisites.Date#getDisplayValue\n * @return {WebAccess.components.wrappers.form.requisites.Date} Объект типа Date.\n * @since 5.0.0.7100\n */\n getDate: function () {\n var value = this.getValue();\n if (value) return parseDate(this.getValue());\n return null;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Отключение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Date#_disableControl\n * @return {WebAccess.components.wrappers.form.requisites.Date}\n * @private \n * @since 5.0.0.7100\n */\n _disableControl: function (jControl) {\n this._super(jControl);\n var icon = jControl.siblings('.Req_Icon');\n if (icon.length) {\n icon.attr('readonly', 'readonly').addClass(\"Req_Icon_Disabled\");\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Включение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Date#_enableControl\n * @private \n * @return {WebAccess.components.wrappers.form.requisites.Date}\n * @since 5.0.0.7100\n */\n _enableControl: function (jControl) {\n this._super(jControl);\n var icon = jControl.siblings('.Req_Icon');\n if (icon.length) {\n icon.removeAttr('readonly').removeClass(\"Req_Icon_Disabled\");\n }\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показывается ли время в реквизите.\n *\n * @method WebAccess.components.wrappers.form.requisites.Date#isShowTime\n * @return {boolean} True – реквизит показывает время, иначе False.\n * @since 5.2.0.2006\n */\n isShowTime: function () {\n var me = this;\n if (me.controls.length > 0) {\n var jControl = me.controls[0];\n return '' + jControl.siblings('.datepickerinfo').attr('showtime') === 'true';\n } else {\n return (me._data && me._data.dateFormat === 'DateTime');\n }\n return false;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n global.WA.CMP.wrappers.form.requisites.Date = Date;\n})(window);\n\n\n","\"use strict\";\n\n/**\n* Реквизит карточки типа «Признак».\n* \n* @class WebAccess.components.wrappers.form.requisites.Pick\n* @extends WebAccess.components.wrappers.form.requisites.BaseRequisite\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {object} data Данные для инициализации реквизита\n*/\n(function (global) {\n\n var Pick = global.WA.CMP.wrappers.form.requisites.BaseRequisite.extend({\n className: \"Pick\",\n\n\n /**\n * Отобразить спиннер внутри контрола реквизита\n * @method WebAccess.components.wrappers.form.requisites.Pick#_showSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.Pick\n */\n _showSpinner: function () {\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\n var jControl = me.controls[i];\n var isCheckbox = me._isCheckBox(jControl);\n var jContainer = jControl.parent();\n jContainer.find('.Req_Icon').hide();\n jContainer.append('
    ');\n }\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Скрыть спиннер\n * @method WebAccess.components.wrappers.form.requisites.Pick#_hideSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.Pick\n */\n _hideSpinner: function () {\n var me = this;\n for (var i = 0; i < me.controls.length; i++) {\n var jControl = me.controls[i];\n var jContainer = jControl.parent();\n jContainer.find('.Req_Icon').show();\n jContainer.find('.circle-spinner').remove();\n }\n return me;\n },\n //---------------------------------------------------------------------//\n\n _isCheckBox: function (jControl) {\n return jControl.length && !jControl.is('.pickField');\n },\n\n _getControls: function () {\n var me = this;\n var res = [];\n\n if (me.controlsIds.length == 0 || me.controlsIds[0] == \"\") return [];\n for (var i = 0; i < me.controlsIds.length; i++) {\n var id = me.controlsIds[i];\n var jControl = $('input#' + id + 'inp, input#' + id);\n if (jControl.length == 0) {\n jControl = $('#' + id + '_value');\n if (jControl.length == 0) {\n jControl = $('#' + id);\n }\n }\n res.push(jControl);\n };\n return res;\n },\n\n /**\n * Получить значение в поле по его имени.\n *\n * @since 5.0.0.7100\n * @method WebAccess.components.wrappers.form.requisites.Pick#_getControlValue\n * @private\n */\n _getControlValue: function (controlName) {\n var me = this;\n var jControl;\n jControl = $(\"input#\" + controlName.replace('inp', '').replace('_display', '') + '_value');\n if (jControl.length == 0) {\n jControl = $(\"select#\" + controlName.replace('inp', '').replace('_display', ''));\n if (!me._isCheckBox(jControl)) {\n jControl = $(\"input#hidd\" + controlName.replace('inp', ''));\n }\n }\n return (!jControl.val()) ? null : jControl.val();\n },\n //---------------------------------------------------------------------//\n\n /** \n * Получить отображаемое значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Pick#getDisplayValue\n * @return {string} Строка, содержащая отображаемое значение реквизита.\n */\n getDisplayValue: function (opt_jControl) {\n if (this._data.isRendered === false) return this._data.displayValue;\n if (this.controls.length === 0) return;\n var jC = opt_jControl || this.controls[0];\n return jC.val();\n },\n //---------------------------------------------------------------------//\n\n _isEditable: function (jControl) {\n return jControl.hasClass('editable');\n },\n //---------------------------------------------------------------------//\n\n /** \n * Установить значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Pick#setValue\n * @param value {string} Устанавливаемое значение реквизита\n * @param [opt_displayValue] {string} Отображаемое значение\n * @param [opt_needTriggerResult] {string} Вызов триггера события типа change\n * @return { WebAccess.components.wrappers.form.requisites.Pick} Текущий объект реквизита – Pick.\n * @since 5.0.0.7100\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult) {\n var me = this;\n if (_.isUndefined(value)) return this;\n opt_needTriggerResult = (opt_needTriggerResult !== false);\n\n if (me.controls.length === 0) return me._setInvisibleValues(value, opt_displayValue, opt_needTriggerResult);\n\n var jControl;\n for (var i = 0; i < this.controls.length; i++) {\n jControl = this.controls[i];\n if (me._isCheckBox(jControl)) {\n jControl.val(value);\n\n var jDisplay = me._getCheckBoxControl(jControl);\n \n if ((typeof jControl.parents('span').data('requisite') !== 'undefined') && (value == jControl.parents('span').data('requisite').yes)) jDisplay.attr('checked', 'checked').prop('checked', true);\n else jDisplay.removeAttr('checked').prop('checked', false);\n me._isChanged = true;\n }\n };\n\n var setValue = function (control, value, opt_displayValue, opt_needTriggerResult) {\n var ddInstance = control.data('DropDownListInstance');\n if (ddInstance) {\n ddInstance.setValue(value, opt_displayValue, opt_needTriggerResult);\n };\n };\n\n _(me.controls).each(function (jControl) {\n if (!me._isCheckBox(jControl)) {\n if (jControl.data('DropDownListInstance')) {\n setValue(jControl, value, opt_displayValue, opt_needTriggerResult);\n } else {\n jControl.bind('Init', function () {\n setValue(jControl, value, opt_displayValue, opt_needTriggerResult);\n });\n }\n if (opt_displayValue) {\r\n jControl.attr(\"title\", opt_displayValue);\r\n } else {\r\n jControl.removeAttr('title');\r\n }\n me._isChanged = true;\n };\n });\n\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * При смене значения в одном контроле оно должно примениться ко всем.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_bindMirrors\n * @private\n * @since 5.0.0.7100\n */\n _bindMirrors: function () {\n var me = this;\n if (me.controls.length > 1) {\n me.bind('change', function (context, ev, data) {\n me.setValue(data.value, undefined, false);\n });\n }\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить контрол для чек-бокса.\n *\n * @method WebAccess.components.wrappers.form.requisites.Pick#_getCheckBoxControl\n * @return {object} - чек-бокс для текущего контрола.\n * @private \n * @since 5.5.0.1310\n */\n _getCheckBoxControl: function (jControl) {\n var cardFormControl = jControl.closest('span');\n return cardFormControl.find('input[type=checkbox]');\n },\n //---------------------------------------------------------------------//\n\n /**\n * Отключение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Pick#_disableControl\n * @return { WebAccess.components.wrappers.form.requisites.Pick}\n * @private \n * @since 5.0.0.7100\n */\n _disableControl: function (jControl) {\n var me = this;\n jControl.addClass(\"Req_Disabled\").attr('tabindex', -1);\n jControl.next('.Req_Icon').addClass('PickReq_Icon_Disabled');\n if (me._isEditable(jControl)) {\n jControl.prop('readonly', true);\n }\n if (me._isCheckBox(jControl)) {\n var jDisplay = me._getCheckBoxControl(jControl);\n if (jDisplay.length > 0) {\n jDisplay.attr('disabled', true); \n }\n }\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Включение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Pick#_enableControl\n * @private\n * @return { WebAccess.components.wrappers.form.requisites.Pick}\n * @since 5.0.0.7100\n */\n _enableControl: function (jControl) {\n var me = this;\n jControl.removeClass(\"Req_Disabled\").removeAttr('tabindex');\n jControl.next('.Req_Icon').removeClass('PickReq_Icon_Disabled');\n if (me._isEditable(jControl)) {\n jControl.prop('readonly', false);\n }\n if (me._isCheckBox(jControl)) {\n var jDisplay = me._getCheckBoxControl(jControl);\n if (jDisplay.length > 0) {\n jDisplay.attr('disabled', false);\n }\n }\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * @private\n */\n _bindEvents: function () {\n var me = this;\n\n if (me.controls.length === 0) {\n var controlInit = $.Deferred();\n me._allControlsInit.push(controlInit);\n controlInit.resolve();\n return me;\n }\n\n _(me.controls).each(function (jControl) {\n var controlInit = $.Deferred();\n me._allControlsInit.push(controlInit);\n\n if (me._isCheckBox(jControl)) {\n jControl = me._getCheckBoxControl(jControl);\n me._bindControlEvents(jControl, true);\n controlInit.resolve();\n return;\n };\n\n if (jControl.data('DropDownListInstance')) {\n me._bindControlEvents(jControl);\n controlInit.resolve();\n } else {\n jControl.bind('Init', function () {\n me._bindControlEvents(jControl);\n controlInit.resolve();\n });\n }\n });\n\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * @private \n * @method WebAccess.components.wrappers.form.requisites.Pick#_bindControlEvents\n * @since 5.0.0.7100\n */\n _bindControlEvents: function (jControl, isCheckBox) {\n var me = this;\n var reqFullName = me.fullName;\n var eventName = 'change.BaseRequisite';\n if (isCheckBox && (WA.ENV.browser.name === 'IE')) {\n eventName = 'click.BaseRequisite';\n }\n\n jControl.off(eventName).on(eventName, function (ev) {\n var value = me.getValue($(this));\n var displayValue = me.getDisplayValue($(this));\n me._fireChange(reqFullName, value, displayValue, ev);\n });\n },\n //---------------------------------------------------------------------//\n\n /**\n * @private\n */\n _applyControlMethod: function (jControl, method, args) {\n var me = this;\n var instance = jControl.data('DropDownListInstance');\n if (instance) {\n instance[method].apply(instance, args);\n } else {\n jControl.bind('Init', function () {\n instance = jControl.data('DropDownListInstance');\n instance[method].apply(instance, args);\n });\n }\n },\n //---------------------------------------------------------------------//\n\n /**\n * Очистка списка доступных для выбора значений.\n *\n * @method WebAccess.components.wrappers.form.requisites.Pick#clearValues\n * @return { WebAccess.components.wrappers.form.requisites.Pick}\n * @since 5.2.0.2014\n */\n clearValues: function () {\n var me = this;\n _(me.controls).each(function (jControl) {\n if (me._isCheckBox(jControl)) {\n jControl.parents('span').data('requisite', {});\n } else {\n me._applyControlMethod(jControl, 'clearDropDownListItems');\n }\n });\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Добавление нового значения в список доступных для выбора.\n *\n * @method WebAccess.components.wrappers.form.requisites.Pick#addValue\n * @param {string} value значение (например \"Y\", \"Д\", \"Н\")\n * @param {string} displayValue отображаемое значение (например \"Да\")\n * @param {boolean} [opt_isDisabled] значение недоступно для выбора\n * @return { WebAccess.components.wrappers.form.requisites.Pick}\n * @since 5.2.0.2014\n */\n addValue: function (value, displayValue, opt_isDisabled) {\n var me = this;\n var item = [value, displayValue, displayValue.escapeHtml(), opt_isDisabled];\n _(me.controls).each(function (jControl) {\n if (me._isCheckBox(jControl)) {\n if (!jControl.parents('span').data('requisite')['yes']) {\n jControl.parents('span').data('requisite')['yes'] = value;\n } else {\n jControl.parents('span').data('requisite')['no'] = value;\n }\n } else {\n me._applyControlMethod(jControl, 'addDropDownListItem', [item]);\n }\n });\n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Удаление значения из списка доступных для выбора.\n *\n * @method WebAccess.components.wrappers.form.requisites.Pick#removeValue\n * @param {string} value значение (например \"Y\", \"Д\", \"Н\")\n * @return { WebAccess.components.wrappers.form.requisites.Pick}\n * @since 5.2.0.2014\n */\n removeValue: function (value) {\n _(me.controls).each(function (jControl) {\n me._applyControlMethod(jControl, 'removeDropDownListItem', [value]);\n });\n return me;\n }\n //---------------------------------------------------------------------//\n });\n\n global.WA.CMP.wrappers.form.requisites.Pick = Pick;\n})(window);\n\n\n","\"use strict\";\n\n/**\n* Класс для числовых реквизитов.\n* \n* @class WebAccess.components.wrappers.form.requisites.Integer\n* @extends WebAccess.components.wrappers.form.requisites.Text\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {object} data Данные для инициализации реквизита\n* @since 5.0.0.7100\n*/\n(function (global) {\n\n /**\n * @inner\n */\n var onControlInitComplete = function (jControl, callback) {\n if (jControl.hasClass('inited')) {\n callback();\n } else {\n jControl.bind('Init', function () {\n callback();\n });\n }\n };\n\n var Integer = global.WA.CMP.wrappers.form.requisites.Text.extend({\n className: \"Integer\",\n\n /**\n * @private \n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_bindControlEvents\n * @since 5.0.0.7100\n */\n _bindControlEvents: function (jControl) {\n var me = this;\n var controlInit = $.Deferred();\n me._allControlsInit.push(controlInit);\n\n me._super(jControl);\n\n onControlInitComplete(jControl, function () {\n controlInit.resolve();\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n getValue: function (opt_jControl) {\n if (this._data && this._data.isRendered === false) return this._data.value;\n var jControl = opt_jControl || this.controls[0];\n var jControlValue = jControl.val();\n if (typeof jControl.data('autoNumeric') === 'object' && jControlValue !== '*') {\r\n return jControl.autoNumeric('get');\r\n }\n return (!jControlValue) ? null : jControlValue;\n },\n\n setValue: function (value, opt_displayValue, opt_needTriggerResult) { \n var me = this;\n if (_.isUndefined(value)) return this;\n opt_needTriggerResult = (opt_needTriggerResult !== false); //если не передан, то по умолчанию будет true.\n\n if (this.controls.length === 0) return this._setInvisibleValues(value, opt_displayValue, opt_needTriggerResult);\n \n value = (value+\"\").replace(',', '.');\n \n var val = parseFloat(value);\n\n var jControl;\n for (var i = 0; i < this.controls.length; i++) {\n jControl = this.controls[i];\n\n if (value === '*') {\n jControl.val('*');\n } else {\n if ((value === '' || _.isNull(value) || isNaN(val))) {\n jControl.val('');\n jControl.removeAttr(\"title\");\n continue;\n }\n\n if (typeof jControl.data('autoNumeric') === 'object') {\n jControl.autoNumeric('set', val);\n } else {\n jControl.val(val);\n }\n }\n\n if (opt_displayValue) {\r\n jControl.attr(\"title\", opt_displayValue);\r\n } else {\r\n jControl.removeAttr('title');\r\n }\n if (opt_needTriggerResult) { jControl.change(); }\n };\n\n this._isChanged = true;\n return this;\n }\n\n });\n\n global.WA.CMP.wrappers.form.requisites.Integer = Integer;\n})(window);\n\n\n","\"use strict\";\n\n/**\n* Реквизит типа «Выбор из справочника» и «Множественный выбор».\n* \n* @class WebAccess.components.wrappers.form.requisites.Radio\n* @extends WebAccess.components.wrappers.form.requisites.BaseRequisite\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {obbject} data Данные для инициализации реквизита\n* @since 5.2.0.2014\n*/\n(function (global) {\n\n /**\n* @inner\n* @since 5.2.0.2014\n*/\n\n var Radio = global.WA.CMP.wrappers.form.requisites.BaseRequisite.extend({\n className: \"Radio\",\n\n /**\n * Получить контролы реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.Radio#_bindEvents\n * @private\n * @return {array} список jquery объектов\n * @since 5.2.0.2014\n */\n _getControls: function () {\n var me = this;\n var res = [];\n\n if (me.controlsIds.length == 0 || me.controlsIds[0] == \"\") return [];\n\n for (var i = 0; i < me.controlsIds.length; i++) {\n var id = me.controlsIds[i]; \n var selector = '[name=\"' + id + '\"][type=\"radio\"]';\n selector = selector.replaceAll('_', '$');\n var jControl = $(selector);\n res.push(jControl);\n }\n return res;\n },\n //---------------------------------------------------------------------//\n\n\n /**\n * Отобразить спиннер внутри контрола реквизита\n * @method WebAccess.components.wrappers.form.requisites.Radio#_showSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.Radio\n */\n _showSpinner: function () {\n var me = this; \n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Скрыть спиннер\n * @method WebAccess.components.wrappers.form.requisites.Radio#_hideSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.Radio\n */\n _hideSpinner: function () {\n var me = this;\n return me;\n },\n //---------------------------------------------------------------------//\n\n /** \n * Получить значение реквизита.\n * \n * @method WebAccess.components.wrappers.form.requisites.Radio#getDisplayValue\n * @return {string} Строка, содержащая отображаемое значение реквизита.\n */\n getDisplayValue: function (opt_jControl) {\n if (this._data && this._data.isRendered === false) return this._data.displayValue;\n if (this.controls.length === 0) return;\n return $(this.controls[0]).filter(':checked').next('label').text();\n\n },\n //---------------------------------------------------------------------// \n\n /** \n * Установить значение отображаемых и неотображаемых реквизитов.\n *\n * @method WebAccess.components.wrappers.form.requisites.Radio#setValue\n * @param value {string} Устанавливаемое значение\n * @param [opt_displayValue] {string} Отображаемое значение\n * @param [opt_needTriggerResult] {string} Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.Radio} Текущий объект реквизита – Reference.\n * @since 5.2.0.2014\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult) {\n var me = this;\n opt_needTriggerResult = (opt_needTriggerResult !== false);\n\n if (this.controls.length === 0) return this._setInvisibleValues(value, opt_displayValue, opt_needTriggerResult);\n\n $.each(me.controls, function () {\n var jControl = $(this).filter(function () {\n return $(this).val().toLowerCase() === value.toString().toLowerCase();\n })\n jControl.prop('checked', true);\n //if (opt_displayValue) jControl.next('label').text(opt_displayValue);\n });\n\n this._isChanged = true;\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * @ignore\n * @method WebAccess.components.wrappers.form.requisites.Radio#setDisplayValue\n */\n setDisplayValue: function (displayValue, opt_needTriggerResult) {\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить значение в поле по его имени.\n *\n * @private\n * @function WebAccess.components.wrappers.form.requisites.Radio#_getControlValue\n * @since 5.2.0.2014\n */\n _getControlValue: function (controlName) {\n if (this.controls.length === 0) return;\n return $(this.controls[0]).filter(':checked').val() === 'True'; \n },\n //---------------------------------------------------------------------//\n\n /**\n * @method WebAccess.components.wrappers.form.requisites.Radio#setCustomAction\n * @ignore \n */\n setCustomAction: function() {\n return this;\n }\n });\n\n global.WA.CMP.wrappers.form.requisites.Radio = Radio;\n})(window);","\"use strict\";\n\n/**\n* Реквизит типа «Выбор из справочника» и «Множественный выбор».\n* \n* @class WebAccess.components.wrappers.form.requisites.CheckBox\n* @extends WebAccess.components.wrappers.form.requisites.BaseRequisite\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {obbject} data Данные для инициализации реквизита\n* @since 5.0.0.7100\n*/\n(function (global) {\n\n /**\n* @inner\n* @since 5.2.0.2014\n*/\n\n var CheckBox = global.WA.CMP.wrappers.form.requisites.BaseRequisite.extend({\n className: \"CheckBox\",\n\n /**\n * Получить контролы реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.CheckBox#_bindEvents\n * @private\n * @return {array} список jquery объектов\n * @since 5.0.0.7100\n */\n _getControls: function () {\n var me = this;\n var res = [];\n\n if (me.controlsIds.length == 0 || me.controlsIds[0] == \"\") return [];\n\n for (var i = 0; i < me.controlsIds.length; i++) {\n var id = me.controlsIds[i]; \n var selector = '[id=\"' + id + '\"]';\n var jControl = $(selector);\n res.push(jControl);\n }\n return res;\n },\n //---------------------------------------------------------------------//\n\n\n /**\n * Отобразить спиннер внутри контрола реквизита\n * @method WebAccess.components.wrappers.form.requisites.CheckBox#_showSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.CheckBox\n */\n _showSpinner: function () {\n var me = this; \n return me;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Скрыть спиннер\n * @method WebAccess.components.wrappers.form.requisites.CheckBox#_hideSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.CheckBox\n */\n _hideSpinner: function () {\n var me = this;\n return me;\n },\n //---------------------------------------------------------------------//\n\n /** \n * Получить значение реквизита.\n * \n * @ignore\n * @method WebAccess.components.wrappers.form.requisites.CheckBox#getDisplayValue\n * @return {string} Строка, содержащая отображаемое значение реквизита.\n */\n getDisplayValue: function (opt_jControl) { \n return '';\n },\n //---------------------------------------------------------------------// \n\n /** \n * Установить значение отображаемых и неотображаемых реквизитов.\n *\n * @method WebAccess.components.wrappers.form.requisites.CheckBox#setValue\n * @param value {string} Устанавливаемое значение\n * @param [opt_displayValue] {string} Отображаемое значение\n * @param [opt_needTriggerResult] {string} Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.CheckBox} Текущий объект реквизита – Reference.\n * @since 5.0.0.7100\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult) {\n var me = this;\n opt_needTriggerResult = (opt_needTriggerResult !== false);\n\n if (this.controls.length === 0) return this._setInvisibleValues(value, opt_displayValue, opt_needTriggerResult);\n\n $.each(me.controls, function () {\n $(this).prop('checked', value);\n });\n\n this._isChanged = true;\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * @ignore\n * @method WebAccess.components.wrappers.form.requisites.CheckBox#setDisplayValue\n */\n setDisplayValue: function (displayValue, opt_needTriggerResult) {\n var me = this; \n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить значение в поле по его имени.\n *\n * @private\n * @function WebAccess.components.wrappers.form.requisites.CheckBox#_getControlValue\n * @since 5.0.0.7100\n */\n _getControlValue: function (controlName) {\n if (this.controls.length === 0) return;\n return $(this.controls[0]).is(':checked'); \n },\n //---------------------------------------------------------------------// \n\n /**\n * Установить подпись для реквизита.\n *\n * @function WebAccess.components.wrappers.form.requisites.BaseRequisite#setLabel\n * @ignore\n * @return {WebAccess.components.wrappers.BaseRequisite} Текущий объект реквизита.\n */\n setLabel: function (text) {\n return this;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить контрол подписи.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_getLabelForControl\n * @private\n * @since 5.0.0.7100\n * @return {object}\n */\n _getLabelForControl: function (jControl) {\n var jC = jControl.parents('.Card_Element:first').prev('.CardForm_Label');\n if (jC.length) return jC;\n jC = jControl.parents('label');\n return jC;\n },\n //---------------------------------------------------------------------//\n \n /**\n * @method WebAccess.components.wrappers.form.requisites.CheckBox#setCustomAction\n * @ignore \n */\n setCustomAction: function() {\n return this;\n }\n //---------------------------------------------------------------------//\n\n });\n\n global.WA.CMP.wrappers.form.requisites.CheckBox = CheckBox;\n})(window);","\"use strict\";\n\n/**\n* Реквизит типа \"Список обьектов\".\n*\n* @class WebAccess.components.wrappers.form.requisites.ObjectList\n* @extends WebAccess.components.wrappers.form.requisites.BaseRequisite\n* @property {string} name Имя реквизита\n* @param {string} requisiteName Имя реквизита\n* @param {obbject} data Данные для инициализации реквизита\n* @since 5.2.0.2014\n*/\n(function (global) {\n\n\n\n var ObjectList = global.WA.CMP.wrappers.form.requisites.BaseRequisite.extend({\n className: \"ObjectList\",\n\n /**\n * Получить контролы реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.ObjectList#_bindEvents\n * @private\n * @return {array} список jquery объектов\n * @since 5.2.0.2014\n */\n _getControls: function () {\n var me = this;\n var res = [];\n\n if (me.controlsIds.length == 0 || me.controlsIds[0] == \"\") return [];\n\n for (var i = 0; i < me.controlsIds.length; i++) {\n var id = me.controlsIds[i];\n var jControl = $('#' + id + '_list');\n res.push(jControl);\n }\n return res;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Вызвать событие изменения\n * @private\n */\n _fireChange: function (reqFullName, value, displayValue, opt_ev) {\n var me = this;\n me._isChanged = true;\n me.fire(\"change\", this, opt_ev, { name: reqFullName, value: me.getValue(), displayValue: null });\n if (this._parent && this._parent.form) this._parent.form.fire(\"change\", this, opt_ev, { name: reqFullName, value: me.getValue(), displayValue: displayValue });\n },\n\n\n /**\n * Отобразить спиннер внутри контрола реквизита\n * @method WebAccess.components.wrappers.form.requisites.ObjectList#_showSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.ObjectList\n */\n _showSpinner: function () {\n var me = this;\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть спиннер\n * @method WebAccess.components.wrappers.form.requisites.ObjectList#_hideSpinner\n * @since 5.2.0.2014\n * @private\n * @return WebAccess.components.wrappers.form.requisites.ObjectList\n */\n _hideSpinner: function () {\n var me = this;\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить значение реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.ObjectList#getDisplayValue\n * @ignore\n * @return {string} Строка, содержащая отображаемое значение реквизита.\n */\n getDisplayValue: function (opt_jControl) {\n return;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить выбранные ссылки.\n *\n * @method WebAccess.components.wrappers.form.requisites.ObjectList#getDisplayValue\n * @ignore\n * @return {string} Строка, содержащая отображаемое значение реквизита.\n * @since 5.2.0.2014\n */\n getSelectedValue: function( ) {\n return this._getControlValue(this.controlsIds[0], 'GetSelectedLinks')\n },\n\n /**\n * Установить значение отображаемых и неотображаемых реквизитов.\n *\n * @method WebAccess.components.wrappers.form.requisites.ObjectList#setValue\n * @param value {WebAccess.Link|WebAccess.Link[]} Устанавливаемое значение\n * @param [opt_displayValue] {string} Отображаемое значение\n * @param [opt_needTriggerResult] {string} Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.ObjectList} Текущий объект реквизита – ObjectList.\n * @since 5.2.0.2014\n */\n setValue: function (value, opt_displayValue, opt_needTriggerResult) {\n var me = this;\n if (_.isUndefined(value)) return;\n opt_needTriggerResult = (opt_needTriggerResult !== false);\n\n if (!_.isArray(value)) value = [value];\n _.each(me.controlsIds, function (name) {\n var list = ListRequisite(name);\n var links = _(value).map(function (link) {\n return link.toLinkModel();\n });\n list.Values = links;\n list.UpdateList();\n });\n\n this._isChanged = true;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить контрол подписи.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#_getLabelForControl\n * @private\n * @since 5.0.0.7100\n * @return {object}\n */\n _getLabelForControl: function (jControl) {\n var jC = jControl.parents('.Card_Element:first').prev('.CardForm_Label');\n if (jC.length) return jC;\n return jControl.parents('tr').eq(1).find('td.wizard-table__cell_type_label');\n },\n\n /**\n * Получить значение в поле по его имени.\n *\n * @private\n * @function WebAccess.components.wrappers.form.requisites.ObjectList#_getControlValue\n * @since 5.2.0.2014\n * @return {Array}\n */\n _getControlValue: function (controlName, method) {\n method = method || 'GetLinks';\n\n var value;\n var result = ListRequisite(controlName)[method]();\n\n if (result.links) {\n return _(result.links).map(function (link) {\n var newLink = new WA.Link({});\n return newLink.fromLinkModel(link);\n });\n } else {\n return null;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак недоступности реквизита справочника для изменения.\n *\n * @function WebAccess.components.wrappers.form.requisites.ObjectList#isDisabled\n * @return {Boolean} True – реквизит справочника доступен только для чтения, иначе False.\n * @since 5.2.0.2014\n */\n isDisabled: function () {\n return ListRequisite(this.controlsIds[0]).ReadOnly;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отключение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.ObjectList#_disableControl\n * @private\n * @return {WebAccess.components.wrappers.form.requisites.ObjectList}\n * @since 5.2.0.2014\n */\n _disableControl: function (jControl) {\n _.each(this.controlsIds, function (name) {\n ListRequisite(name).Disable();\n });\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Включение контрола реквизита.\n *\n * @method WebAccess.components.wrappers.form.requisites.ObjectList#_enableControl\n * @private\n * @return {WebAccess.components.wrappers.form.requisites.ObjectList}\n * @since 5.2.0.2014\n */\n _enableControl: function (jControl) {\n _.each(this.controlsIds, function (name) {\n ListRequisite(name).Enable();\n });\n return this;\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация событий.\n *\n * @private\n * @method WebAccess.components.wrappers.form.requisites.ObjectList#_bindEvents\n * @since 5.2.0.2014\n * @return WebAccess.components.wrappers.form.requisites.ObjectList\n */\n _bindEvents: function () {\n var me = this;\n if (me.controls.length === 0) return this;\n $.each(me.controls, function () {\n me._bindControlEvents($(this).parents('.ListRequisite'));\n });\n return me;\n }\n\n });\n\n global.WA.CMP.wrappers.form.requisites.ObjectList = ObjectList;\n})(window);\n","\"use strict\";\n(function (global) {\n\n /**\n * Для детальных раздела доступно два режима работы, это когда курсор находится\n * на реквизите и существует непосредственно контрол реквизита и когда данными необходимо\n * оперировать напрямую меняя грид.\n * Этот миксин дополняет реквизиты детальных разделов таким образом, что конечная \n * работа с реквизитом становится прозрачной и одинаково рабочей независимо от того,\n * есть ли сейчас контрол для реквизита или его нет.\n * Логика не вынесена в класс _details.BaseRequisite потому, что тогда для каждого\n * реквизита пришлось бы снова имплементировать существующие методы.\n * @mixin WebAccess.components.wrappers.form.requisites._details.editModeMixin\n * @propery {boolean} isEditMode признак наличия активного редактора\n * @private\n */\n\n var editModeMixin = {\n isEditMode: false,\n\n _grid: null,\n _filter: null,\n _filters: null,\n _isVisible: true,\n _pickValues: null,\n _references: null,\n _customAction: null,\n _mainReference: null,\n _lastReferences: null,\n _lastValue: null,\n _addLastObjectsPseudoReference: null,\n _bindReferenceGridDialog: null,\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n init: function (requisiteName, data, opt_parent, opt_grid) {\n\n var me = this;\n me._lastValue = {};\n me._super(requisiteName, data, opt_parent);\n me._isDisabled = data.isReadOnly;\n\n me._filters = {};\n me._references = {};\n me._pickValues = [];\n\n if (data.requisite) {\n me._references = data.requisite.refcodes;\n };\n\n me._grid = opt_grid; //Core.grid.details[me._parent._parentTable.name];\n me._bindGridEvents();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * В момент когда редактор активирован, необходимо перестроить jquery объекты на новые контролы;\n * @mixin WebAccess.components.wrappers.form.requisites._details.editModeMixin#_reInitControls\n * @return {WebAccess.components.wrappers.form.requisites._details.editModeMixin}\n */\n _reInitControls: function (editor) {\n this.controls = this._getControls(editor);\n this._bindEvents();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * \n * @mixin WebAccess.components.wrappers.form.requisites._details.editModeMixin#_reInitControls\n * @return {WebAccess.components.wrappers.form.requisites._details.editModeMixin}\n */\n _bindGridEvents: function () {\n var me = this;\n me._lastValue[me.name] = me.getValue();\n\n this._grid.bind('requisiteChange', function (requisiteName, rowId, value, displayValue) {\n\n if (requisiteName === me.name && rowId == me._data.row_id) {\n var last = me._lastValue[me.name];\n var current = value;\n last = (last === null) ? \"\" : last;\n current = (current === null) ? \"\" : current;\n\n if (me._type === 'float' || me._type === 'integer') {\n last = +last;\n current = +current;\n } else {\n last = \"\" + last;\n current = \"\" + current;\n }\n\n if (last != current) {\n me._lastValue[me.name] = value;\n me._fireChange(requisiteName, value, displayValue);\n }\n }\n });\n\n this._grid.bind('editorInit', function (requisiteName, rowId, value, displayValue, editor) {\n if (requisiteName === me.name && rowId == me._data.row_id) {\n me.isEditMode = true;\n\n if (me.isDisabled()) {\n editor.disable();\n } else {\n editor.enable();\n }\n\n if (me._filter) editor.setFilter(me._filter);\n if (!_.isEmpty(me._filters)) {\n for (var refName in me._filters) {\n editor.setFilters(me._filters[refName], refName);\n }\n }\n\n if (me._clearPick) {\n editor.clearValues();\n }\n\n if (!_.isEmpty(me._pickValues)) {\n _.each(me._pickValues, function (v) {\n editor.addValue(v[0], v[1], v[2]);\n });\n }\n\n if (!_.isEmpty(me._references)) {\n if (editor.setReferences) editor.setReferences(me._references);\n };\n\n if (me._mainReference) {\n if (editor.setReferences) editor.setMainReference(me._mainReference);\n };\n\n if (me._addLastObjectsPseudoReference) {\n editor.addLastObjectsPseudoReference(me._lastReferences);\n };\n\n if (me._bindReferenceGridDialog) {\n editor.bindReferenceGridDialog();\n }\n\n if (!_.isEmpty(me._customAction)) {\n editor.setCustomAction(me._customAction.callback, me._customAction.tooltip);\n };\n\n me._reInitControls(editor);\n\n me.fire('editModeChange', true);\n }\n });\n\n this._grid.bind('editorDestroy', function () {\n // Оптимизация, что бы не срабатывало много editModeChange при кадом чихе.\n if (me.isEditMode) {\n me.isEditMode = false;\n me.fire('editModeChange', false);\n }\n });\n\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n _getControls: function (editor) {\n var me = this;\n if (editor) {\n var res = [];\n me.controlsIds = [];\n me.controlsIds.push(editor.id);\n res.push($('input#' + editor.id))\n this.controls = res;\n return res;\n } else {\n return this.controls;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n getValue: function () {\n var me = this;\n if (me.isEditMode) {\n return me._super();\n }\n var row = me._grid.dataView.getItemById(me._data.row_id);\n return row[me.name];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n getDisplayValue: function () {\n var me = this;\n if (me.isEditMode) {\n return me._super();\n }\n var row = me._grid.dataView.getItemById(me._data.row_id);\n return row[me._data.fieldName];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n setValue: function (value, opt_displayValue, opt_needTriggerResult) {\n var me = this;\n\n if (opt_displayValue && opt_displayValue[0] === '$') opt_displayValue = opt_displayValue.replace('$');\n opt_needTriggerResult = (opt_needTriggerResult !== false); //если не передан, то по умолчанию будет true.\n\n var editorActive = me._grid.grid.getEditorLock().isActive();\n\n if (me.isEditMode) {\n return me._super(value, opt_displayValue, opt_needTriggerResult);\n } else if (me.className == 'DetailDate' && value !== null && ('' + value).indexOf('T') !== -1) {\r\n // Форматируем дату\r\n if (me.isShowTime()) {\r\n value = formatDateTime(new Date(value));\r\n } else {\r\n value = formatDate(new Date(value));\r\n }\r\n }\n\n var row = me._grid.dataView.getItemById(me._data.row_id);\n row[me.name] = value;\n\n // тут нельзя проверять просто приводя к булеву, \n // потому что 0 - тоже значение.\n if (!_.isUndefined(opt_displayValue)) {\n if (me.className == 'DetailInteger' && currentCultureName === 'ru-RU' && !_.isNull(opt_displayValue)) { //FIXME: Спецобработка\n opt_displayValue = (\"\" + opt_displayValue).replace('.', ',');\n }\n\n row[me._data.fieldName] = opt_displayValue;\n } else {\n row[me._data.fieldName] = value;\n }\n\n me._grid.dataView.updateItem(me._data.row_id, row);\n if (opt_needTriggerResult) {\n me._fireChange(me.fullName, value, opt_displayValue);\n }\n\n if (editorActive) me._grid.grid.editActiveCell();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сделать реквизит недоступным для изменения.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#disable\n * @since 5.0.0.7100\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Текущий объект реквизита.\n */\n disable: function () {\n var me = this;\n if (me.isEditMode) {\n me._super();\n }\n me._isDisabled = true;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сделать реквизит доступным для изменения.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#enable\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Текущий объект реквизита.\n * @since 5.0.0.7100\n */\n enable: function () {\n var me = this;\n if (me.isEditMode) {\n me._super();\n }\n me._isDisabled = false;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть реквизит и его подпись.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#hide\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Текущий объект реквизита.\n * @since 5.0.0.7100\n */\n hide: function () {\n log.warning('REQUISITE', 'This method was changed since version 5.2.0.1300 and may work improperly.');\n var me = this;\n me._isVisible = false;\n var cellStyle = {};\n var rownNum = me._grid.dataView.getIdxById(me._data.row_id);\n cellStyle[rownNum] = {};\n cellStyle[rownNum][me.name] = \"hidden_cell\";\n\n me._grid.grid.setCellCssStyles(rownNum + me.name, cellStyle);\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Отобразить реквизит.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#show\n * @return {WebAccess.components.wrappers.form.requisites.BaseRequisite} Текущий объект реквизита.\n * @since 5.2.0.1300\n */\n show: function () {\n log.warning('REQUISITE', 'This method was changed since version 5.2.0.1300 and may work improperly.');\n var me = this;\n me._isVisible = true;\n var cellStyle = {};\n var rownNum = me._grid.dataView.getIdxById(me._data.row_id);\n cellStyle[rownNum] = {};\n cellStyle[rownNum][me.name] = \"\";\n me._grid.grid.setCellCssStyles(rownNum + me.name, cellStyle);\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Признак видимости реквизита на форме.\n *\n * @since 5.0.0.7100\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isVisible\n * @return {boolean} True – реквизит отображается на форме, иначе False.\n */\n isVisible: function () {\n log.warning('REQUISITE', 'This method was changed since version 5.2.0.1300 and may work improperly.');\n return this._isVisible;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак недоступности реквизита для изменения.\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isDisabled\n * @return {boolean} True – реквизит недоступен для изменения, иначе False. \n * @since 5.2.0.1300\n */\n isDisabled: function () {\n var me = this;\n var isDisabled = false;\n return this._isDisabled;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить иконку к элементу управления реквизита, за исключением реквизитов типа «Справочник» и «Множественный выбор». \n * Метод прикрепляет к тестовому полю действие для события, например, нажатие на иконку. \n * При наступлении этого события в код передаются данные о текущем реквизите.\n *\n * @function WebAccess.components.wrappers.form.requisites.BaseRequisite#setCustomAction\n * @param {string} reqName Имя реквизита\n * @param {string} tooltip Подсказка к реквизиту\n * @param {function} callback Функция, которая будет вызвана после нажатия на иконку реквизита. \n * В эту функцию первым параметром будет отправлена информация о реквизите.\n */\n setCustomAction: function (callback, opt_tooltip) {\n var me = this;\n me._customAction = {\n callback: callback,\n tooltip: opt_tooltip\n };\n\n if (me.isEditMode) {\n me._super(callback, opt_tooltip);\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Подсветить реквизит\n *\n * @method WebAccess.components.wrappers.form.requisites.BaseRequisite#isRequired\n * @return {boolean} True – реквизит обязателен для заполнения, иначе False.\n * @param {integer} [opt_speed] скорость анимации\n * @param {string} [opt_color] цвет подсветки\n * @since 5.2.0.1300\n */\n highlight: function (opt_color, opt_speed) {\n var me = this;\n me._grid.dataView.flashCellById(me._data.row_id, me.name, opt_speed, opt_color);\n return me;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n };\n\n global.WA.CMP.wrappers.form.requisites._details.editModeMixin = editModeMixin;\n})(window);","\"use strict\";\n\n/**\n* Базовый класс реквизита.\n* \n* @class WebAccess.components.wrappers.form.requisites._details.BaseRequisite\n* @extends WebAccess.components.wrappers.form.requisites.BaseRequisite\n* @mixes WebAccess.components.wrappers.form.requisites._details.editModeMixin\n* @private\n* @since 5.2.0.1300\n*/\n(function (global) {\n\n var BaseRequisite = global.BaseRequisite.extend([global._details.editModeMixin], {\n className: \"DetailBaseRequisite\"\n }); \n\n global._details.BaseRequisite = BaseRequisite;\n})(window.WA.CMP.wrappers.form.requisites);","\"use strict\";\n\n/**\n* Реквизит типа «Выбор из справочника» и «Множественный выбор» для детальных разделов.\n* \n* @class WebAccess.components.wrappers.form.requisites._details.Reference\n* @extends WebAccess.components.wrappers.form.requisites.Reference\n* @mixes WebAccess.components.wrappers.form.requisites._details.editModeMixin\n* @private\n*/\n(function (global) {\n\n var Reference = global.Reference.extend([global._details.editModeMixin], {\n className: \"DetailReference\",\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить фильтрацию по реквизитам справочника.\n *\n * @method WebAccess.components.wrappers.form.requisites._details.Reference#setFilter\n * @return {WebAccess.components.wrappers.form.requisites._details.Reference} Текущий объект реквизита – Reference.\n * @since 5.2.0.1300\n */\n setFilter: function (filter, opt_refCode) {\n var me = this;\n me._filter = filter;\n\n if (me.isEditMode) {\n me._super(filter, opt_refCode);\n }\n\n if (opt_refCode) me._filters[opt_refCode] = filter;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Получить имена справочников для выборки.\n *\n * @method WebAccess.components.wrappers.form.requisites._details.Reference#getReferences\n * @since 5.2.0.1300\n * @return {object} Имена справочников для выборки.\n */\n getReferences: function () {\n var me = this;\n if (me.isEditMode) {\n return me._super();\n }\n return this._references;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить выборку из указанных справочников.\n *\n * @method WebAccess.components.wrappers.form.requisites._details.Reference#setReferences\n * @param {object} references Информация о справочниках. Формат описания выборки:\n * {\"ОРГ\":{\"Caption\": \"организации\",...},\"РАБ\":{..}}}\n * @return {WebAccess.components.wrappers.form.requisites._details.Reference} Текущий объект реквизита – Reference.\n * @since 5.2.0.1300\n */\n setReferences: function (references) {\n var me = this;\n me._references = references;\n if (me.isEditMode) {\n me._super(references);\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить новый справочник к текущему списку справочников для выборки.\n *\n * @function WebAccess.components.wrappers.form.requisites._details.Reference#addReferences\n * @param {object} references Информация о справочниках. Формат описания выборки:\n * {\"ОРГ\":{\"Caption\": \"организации\",...},\"РАБ\":{..}}}\n * @return {WebAccess.components.wrappers.form.requisites._details.Reference} Текущий объект реквизита – Reference.\n * @since 5.2.0.1300\n */\n addReferences: function (references) {\n var me = this;\n $.extend(me._references, references);\n if (me.isEditMode) {\n me._super(references);\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Указать справочник, выбор из которого будет выполняться в первую очередь.\n *\n * @method WebAccess.components.wrappers.form.requisites._details.Reference#setMainReference\n * @param {string} referenceName Справочник, выбор из которого будет выполняться в первую очередь\n * @return {WebAccess.components.wrappers.form.requisites._details.Reference} Объект типа Reference.\n * @since 5.2.0.1300\n */\n setMainReference: function (referenceName) {\n var me = this;\n me._mainReference = referenceName;\n if (me.isEditMode) {\n me._super(referenceName);\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить справочник для выборки, из которого доступны последние и избранные объекты.\n *\n * @method WebAccess.components.wrappers.form.requisites._details.Reference#addLastObjectsPseudoReference\n * @param {LAST_REFERENCES} lastReferences Справочники, из которых будет выполняться выбор\n * @return {WebAccess.components.wrappers.form.requisites._details.Reference} Объект типа Reference.\n * @since 5.2.0.1300\n */\n addLastObjectsPseudoReference: function (lastReferences) {\n var me = this;\n me._addLastObjectsPseudoReference = true;\n me._lastReferences = lastReferences;\n if (me.isEditMode) {\n me._super(lastReferences);\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удалить из списка выборки справочник, из которого доступны последние и избранные объекты. \n *\n * @method WebAccess.components.wrappers.form.requisites._details.Reference#removeLastObjectsPseudoReference\n * @param {LAST_REFERENCES} LastReferences Справочники, из которых будет выполняться выбор\n * @return {WebAccess.components.wrappers.form.requisites._details.Reference} Объект типа Reference.\n * @since 5.2.0.1300\n */\n removeLastObjectsPseudoReference: function () {\n log.warning('REQUISITE', 'This method was changed in last version and may work improperly.');\n var me = this;\n me._addLastObjectsPseudoReference = false;\n me._lastReferences = null;\n if (me.isEditMode) {\n me._super();\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Установить значение отображаемых и неотображаемых реквизитов. \n *\n * @function WebAccess.components.wrappers.form.requisites._details.Reference#setValues\n * @fires NOT_IMPLEMENTED_EXCEPTION\n * @param {object} newValues Новые значения множественного выбора\n * @param {boolean} needTriggerResult Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites._details.Reference} Текущий объект реквизита – Reference.\n * @since 5.0.0.7100\n */\n setValues: function (newValues, needTriggerResult) {\n WA.raise('NOT_IMPLEMENTED_EXCEPTION')\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает значения реквизита.\n * Формат записи метода: [{groupcode:'код справочника', id:'ид записи', name:'наименование'}, ...].\n *\n * @fires NOT_IMPLEMENTED_EXCEPTION\n * @function WWebAccess.components.wrappers.form.requisites._details.Reference#getValues\n * @return [{groupcode:'код справочника', id:'ид записи', name:'наименование'}, ...] Массив объектов значений реквизита – currentValues.\n * @since 5.4.0.1012\n */\n getValues: function () {\n WA.raise('NOT_IMPLEMENTED_EXCEPTION')\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавляет новые значения отображаемых и неотображаемых реквизитов к уже существующим.\n * Формат записи метода: [{groupcode:'код справочника', id:'ид записи', name:'наименование'}, ...].\n *\n * @fires NOT_IMPLEMENTED_EXCEPTION\n * @function WebAccess.components.wrappers.form.requisites._details.Reference#addValues\n * @param {object} newValues Новые значения множественного выбора\n * @param {boolean} needTriggerResult Вызвать триггер для события типа change\n * @return {WebAccess.components.wrappers.form.requisites.Reference} Текущий объект реквизита – Reference.\n * @since 5.4.0.1012\n */\n addValues: function (newValues, needTriggerResult) {\n WA.raise('NOT_IMPLEMENTED_EXCEPTION')\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Привязка вызова справочника в модальном окне по клику на иконке в поле ввода.\n *\n * @method WebAccess.components.wrappers.form.requisites._details.Reference#bindReferenceGridDialog\n * @since 5.4.0.1012\n * @return {WebAccess.components.wrappers.form.requisites._details.Reference} Текущий объект реквизита – Reference.\n */\n bindReferenceGridDialog: function () {\n var me = this;\n me._bindReferenceGridDialog = true;\n if (me.isEditMode) {\n me._super();\n }\n return me;\n }\n });\n\n global._details.Reference = Reference;\n})(window.WA.CMP.wrappers.form.requisites);","\"use strict\";\n\n/**\n* Реквизит типа «Ссылка на документ» для детальных разделов.\n* \n* @class WebAccess.components.wrappers.form.requisites._details.Document\n* @extends WebAccess.components.wrappers.form.requisites.Document\n* @mixes WebAccess.components.wrappers.form.requisites._details.editModeMixin\n* @private\n*/\n(function (global) {\n\n var Document = global.Document.extend([global._details.editModeMixin], {\n className: \"DetailDocument\"\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n global._details.Document = Document;\n})(window.WA.CMP.wrappers.form.requisites);","\"use strict\";\n\n/**\n* Реквизит типа «Строка» и «Многострочный текст».\n* \n* @class WebAccess.components.wrappers.form.requisites._details.Text\n* @extends WebAccess.components.wrappers.form.requisites.Text\n* @mixes WebAccess.components.wrappers.form.requisites._details.editModeMixin\n* @since 5.2.0.1300\n*/\n(function (global) {\n\n var Text = global.Text.extend([global._details.editModeMixin], {\n className: \"DetailText\"\n });\n\n global._details.Text = Text;\n})(window.WA.CMP.wrappers.form.requisites);","\"use strict\";\n\n/**\n* Класс для реквизита типа «Дата».\n* \n* @class WebAccess.components.wrappers.form.requisites._details.Date\n* @extends WebAccess.components.wrappers.form.requisites.Date\n* @mixes WebAccess.components.wrappers.form.requisites._details.editModeMixin\n* @private\n* @since 5.2.0.1300\n*/\n(function (global) {\n\n var Date = global.Date.extend([global._details.editModeMixin], {\n className: \"DetailDate\",\n\n /**\n * Показывается ли время в реквизите.\n *\n * @method WebAccess.components.wrappers.form.requisites._details.Date#isShowTime\n * @return {boolean} True – реквизит показывает время, иначе False.\n * @since 5.2.0.2006\n */\n isShowTime: function () {\n var me = this;\n if (me.isEditMode) {\n return me._super();\n }\n var cols = me._grid._columns;\n var curCol = _(cols).findWhere({ 'id': me.name });\n if (curCol) {\n return curCol.dateType === 'DateTime';\n } else {\n return false;\n }\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n global._details.Date = Date;\n})(window.WA.CMP.wrappers.form.requisites);\n\n\n","\"use strict\";\n\n/**\n* Реквизит карточки типа «Признак».\n* \n* @class WebAccess.components.wrappers.form.requisites._details.Pick\n* @extends WebAccess.components.wrappers.form.requisites.Pick\n* @mixes WebAccess.components.wrappers.form.requisites._details.editModeMixin\n* @since 5.2.0.1300\n* @private\n*/\n(function (global) {\n\n var Pick = global.Pick.extend([global._details.editModeMixin], {\n className: \"DetailPick\",\n \n /**\n * Указать справочник, выбор из которого будет выполняться в первую очередь.\n *\n * @method WebAccess.components.wrappers.form.requisites._details.Reference#setMainReference\n * @param {string} referenceName Справочник, выбор из которого будет выполняться в первую очередь\n * @return {WebAccess.components.wrappers.form.requisites._details.Reference} Объект типа Reference.\n * @since 5.2.0.1300\n */\n \n clearValues: function(referenceName) {\n var me = this;\n me._clearPick = true;\n me._pickValues = [];\n\n if (me.isEditMode) {\n me._super(referenceName);\n }\n return me;\n },\n\n addValue: function (value, displayValue, opt_isDisabled) {\n var me = this;\n me._pickValues.push([value, displayValue, opt_isDisabled]);\n\n if (me.isEditMode) {\n me._super(value, displayValue, opt_isDisabled);\n }\n return me;\n }\n\n });\n\n global._details.Pick = Pick;\n})(window.WA.CMP.wrappers.form.requisites);\n\n\n","\"use strict\";\n\n/**\n* Класс для числовых реквизитов.\n* \n* @class WebAccess.components.wrappers.form.requisites._details.Integer\n* @extends WebAccess.components.wrappers.form.requisites.Integer\n* @mixes WebAccess.components.wrappers.form.requisites._details.editModeMixin\n* @private\n* @since 5.0.0.7100\n*/\n(function (global) {\n\n var Integer = global.Integer.extend([global._details.editModeMixin], {\n className: \"DetailInteger\"\n });\n\n global._details.Integer = Integer;\n})(window.WA.CMP.wrappers.form.requisites);\n\n\n","\"use strict\";\n\n/**\n* Детальный набор данных.\n* \n* @class WebAccess.components.wrappers.details.Detail\n* @extends BaseObject\n* @property {string} name Номер набора данных\n* @property {string} tableName DFM-имя элемента управления таблицы\n* @param {string} itemSelector Существующий элемент страницы\n*/\n(function (global) {\n\n var Detail = BaseObject.extend({\n _useTable: null,\n _jTables: null,\n _current: null,\n\n init: function (itemSelector, opt_params) {\n this._super(itemSelector);\n if (opt_params) this._current = opt_params.current;\n\n this._jObject = $(itemSelector);\n this.name = this._jObject.data('detailSectionNumber');\n this.tableName = this._jObject.attr('id');\n this._jTables = $('.Reference_Detail').filter('[data-detail-section-number=' + this.name + ']');\n },\n\n className: 'Detail',\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Определяет таблицу, с которой связан детальный раздел\n * @function WebAccess.components.wrappers.details.Detail#useTable\n * @return WebAccess.components.wrappers.details.Detail.\n * @since 5.0.2.1301\n */\n useTable: function(tableName) {\n this._useTable = tableName;\n return this;\n },\n\n /**\n * Добавление новой записи в детальный раздел. (Если можно, избегайте пока использование этой функции, \n * очень велика вероятность, что её поведение кардинально изменится в будущем);\n * @function WebAccess.components.wrappers.details.Detail#append\n * @return WebAccess.components.wrappers.details.Detail\n */\n append: function () {\n var tableName = this._useTable || this.tableName;\n this._current.form.controls.tables[tableName].addRow();\n return this;\n },\n\n\n /**\n * Получить все записи детального раздела.\n * @function WebAccess.components.wrappers.details.Detail#getRecords\n * @return {WebAccess.components.wrappers.form.TableRow} Oбъект класса TableRow.\n */\n getRecords: function () {\n var tableName = this._useTable || this.tableName;\n return this._current.form.controls.tables[tableName].getRows();\n },\n\n\n /**\n * Получает таблицу, связанную с данным детальным разделом. \n * @function WebAccess.components.wrappers.details.Detail#getTable\n * @param {string} [opt_tableName] Имя таблицы\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table.\n * @since 5.2.0.1303\n */\n getTable: function (opt_tableName) {\n var tableName = opt_tableName || this._useTable || this.tableName;\n return this._current.form.controls.tables[tableName];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает все таблицы данного детального раздела.\n * @function WebAccess.components.wrappers.details.Detail#getTables\n * @return {WebAccess.components.wrappers.form.Table} Объект типа Table.\n * @since 5.2.0.1303\n */\n getTables: function () {\n var me = this;\n var tables = new WA.Collection();\n \n $(this._jTables).each(function (el) {\n var name = $(this).attr('id');\n var table = me._current.form.controls.tables[name];\n if (typeof table !== 'undefined')\n tables.addElement(name, table);\n });\n return tables;\n }\n });\n\n global.Detail = Detail;\n})(window.WebAccess.components.wrappers.details);","\"use strict\";\n\n(function (global) {\n\n /**\n * Шаблоны ячеек\n */\n var TEMPLATES = {\n CELL: 'components/grid/cell.compile.html',\n CELL_WITH_MENU: 'components/grid/contextMenuCell.compile.html'\n };\n\n /**\n * Дата-аттрибуты контейнеров\n * @inner\n */\n var DATA_ATTR = {\n COLUMNS: 'columns',\n SECTION_NUMBER: 'detailSectionNumber',\n BUILDER_EVENTS_ENABLED: 'builderEventsEnabled',\n COLUMN_AUTO_WIDTH: 'columnAutoWidth'\n };\n\n /**\n * Поиск и создание таблиц детальных разделов.\n * \n * @class WebAccess.components.wrappers.details.DetailsInitializer\n * @extends BaseObject\n * @property {Array} gridInstances экземпляры таблиц \n * @param {String} detailsSelector селектор контейнеров детальных разделов\n * @param {WebAccess.components.dataViews.BaseDataProvider} DataProviderClass \n * @since 5.2.0.1600\n */\n var DetailsInitiializer = BaseObject.extend({\n gridInstances: null,\n\n _detailsSelector: null,\n _dv: null,\n _jDetails: null,\n _cellMarkUp: null,\n _templates: null,\n _contextMenuMarKUp: null,\n _form: null,\n\n init: function (detailsSelector, DataProviderClass, dataProviderOptions, ContextMenuClass, current) {\n var me = this;\n me._super(detailsSelector);\n me._current = current;\n\n me.DataProviderClass = DataProviderClass;\n me.dataProviderOptions = dataProviderOptions;\n\n me.ContextMenuClass = ContextMenuClass;\n var templates = {};\n var load = WA.templates.load;\n\n $.when(\n load(TEMPLATES.CELL),\n load(TEMPLATES.CELL_WITH_MENU)\n ).done(function (cell, cellWithMenu) {\n templates.cellMarkUp = cell;\n templates.contextMenuMarkUp = cellWithMenu;\n\n me.gridInstances = {};\n me._templates = templates;\n me._dv = WA.CMP.dataViews;\n me._detailsSelector = detailsSelector;\n\n me._jDetails = $(me._detailsSelector);\n\n me._setTemplates();\n me._initializeGridInstances();\n setTimeout(function () {\n me.fire(DetailsInitiializer.EVENT.COMPLETE, me);\n }, 10)\n });\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Поиск и создание экземпляров таблиц\n * @private\n * @method WebAccess.components.wrappers.details.DetailsInitializer#_initializeGridInstances\n * @return {WebAccess.components.wrappers.details.DetailsInitializer}\n */\n _initializeGridInstances: function () {\n var me = this;\n var isSideBarBindEventBeforeTab = false;\n\n me._jDetails.each(function () {\n var jTable = $(this);\n\n var dfmName = jTable.attr('id');\n var columns = me._getExtraColumns();\n var sectionNumber = +jTable.data(DATA_ATTR.SECTION_NUMBER);\n var columnAutoWidth = jTable.data(DATA_ATTR.COLUMN_AUTO_WIDTH);\n\n var isBuilderEventsEnabled = jTable.data(DATA_ATTR.BUILDER_EVENTS_ENABLED);\n var dataProvider = new me.DataProviderClass($.extend({}, me.dataProviderOptions, {\n DetailSectionNumber: sectionNumber,\n DFMName: dfmName\n }), me._current);\n\n columns = columns.concat(jTable.data(DATA_ATTR.COLUMNS));\n var sortedColumns = {};\n var num = 0;\n Object.keys(columns).sort(function (a, b) {\n return columns[a].Index - columns[b].Index;\n }).forEach(function (index) {\n sortedColumns[num++] = columns[index];\n });\n\n var getCellTemplate = function (rowNumber, cellNumber, value, columnDef, dataContext) {\n var refCode = '';\n if (columnDef.type == REQUISITE_TYPE.REFERENCE && columnDef.requisite) {\n refCode = columnDef.requisite.referenceName;\n }\n var recordId = dataContext.id;\n switch (columnDef.id) {\n case '_contextMenu':\n return me._contextMenuMarkUp.render({ index: dfmName, recordId: recordId });\n default:\n var valueId = dataContext[columnDef.id];\n return me._cellMarkUp.render({\n hasValue: (!!valueId && valueId !== '*' && !!refCode),\n id: valueId,\n value: value,\n refCode: refCode,\n openCardButtonTitle: L('OPEN_CARD')\n });\n }\n };\n\n var grid;\n\n var getRowAdditionalInfo = function (rowNumber, data) {\n var row = data.getItem(rowNumber);\n if (row && row.__nonDataRow !== true) {\n return {\n cssClasses: 'List',\n attributes: {\n 'id': row.id,\n 'kind': 'REF',\n 'compcode': WA.CR.getReferenceCode(),\n 'data-recid': row.id,\n 'contextmenu': function (event) {\n grid.openContextMenu(this, event);\n },\n 'click': function (event) {\n if (event.target && $(event.target).is('.popup_menu')) {\n grid.openContextMenu(this, event);\n }\n }\n }\n };\n }\n };\n\n //Инициализируем грид\n grid = new me._dv.Grid(jTable, dataProvider, sortedColumns, {\n plugins: me._getAvailablePlugins(dfmName),\n getRowAdditionalInfo: getRowAdditionalInfo,\n cellTemplate: getCellTemplate,\n isBuilderEventsSupported: isBuilderEventsEnabled,\n DFMName: dfmName,\n sectionNumber: sectionNumber,\n current: me._current\n });\n\n grid.autoAdjustColumnWidth(columnAutoWidth);\n\n //Добавляем контекстное меню при клике в пустое место \n if (me.ContextMenuClass) {\n jTable.find('.slick-viewport').on('contextmenu', function (ev) {\n grid.openContextMenu(this, ev);\n });\n }\n\n me.gridInstances[dfmName] = grid;\n\n me._current.Init.done(function () {\n if (!isSideBarBindEventBeforeTab) {\n isSideBarBindEventBeforeTab = true;\n var sideBar = me._current.sideBar;\n // При переключении вкладки отправляем запрос на сервер для установки \n // значений реквизитов, но не сохраняем в базу. После проверяем если есть \n // такой же детальный раздел на переключаемой вкладке, то перезагружаем \n // (подтягиваем новые данные с сервера) этот детальный раздел. \n sideBar.bind(sideBar['class'].EVENT.BEFORE_TAB_SWITCH, function () {\n var currentTabName = sideBar.tabs.current.name;\n _(_(me._current.form.controls.tables).filter(function (table) {\n return table.isChanged() && table.parentTabName === currentTabName;\n })).each(function (table) {\n var details = me._current.details[table.detailNum];\n me._current.form.save(function () {\n _(details.getTables().toArray()).each(function (table) {\n table.reloadData();\n table._isChanged = false;\n })\n }, false);\n })\n });\n }\n });\n });\n\n return me;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Ожидание загрузки данных.\n * @method WebAccess.components.wrappers.details.DetailsInitializer#waitForData\n * @return {Deferred} Специальный Deferred-объект.\n */\n waitForData: function () {\n var me = this;\n var stateVariable = $.Deferred();\n\n //Инициализацию гридов делать не всегда, а только где они есть\n if ($.isEmptyObject(me.gridInstances)) {\n stateVariable.resolve();\n return stateVariable;\n }\n\n var states = [];\n for (var detailName in me.gridInstances) {\n var state = $.Deferred();\n states.push(state);\n (function (state) { //замкнуто, чтобы state нужный был внутри\n me.gridInstances[detailName].bind(WA.CMP.DV.Grid.EVENT.AFTER_DATA_LOADED, function (data) {\n state.resolve();\n });\n })(state);\n }\n\n $.when.apply($, states).done(function () {\n stateVariable.resolve();\n });\n return stateVariable;\n },\n\n _getExtraColumns: function () {\n var columns = [];\n if (WA.ENV.isTouch()) {\n columns.push({\n Caption: ' ',\n Field: '_contextMenu',\n Name: '_contextMenu',\n IsVisible: true,\n type: REQUISITE_TYPE.EMPTY,\n Width: 30,\n Index: 0\n });\n }\n\n return columns;\n },\n //-----------------------------------------------------------------------//\n\n\n /**\n * Заполнение обьектов шаблонов\n * @method WebAccess.components.wrappers.details.DetailsInitializer#_setTemplates\n * @return {Deferred} Специальный Deferred-объект.\n */\n _setTemplates: function () {\n var me = this;\n me._cellMarkUp = me._templates.cellMarkUp;\n me._contextMenuMarkUp = me._templates.contextMenuMarkUp;\n },\n //-----------------------------------------------------------------------//\n\n /**\n * Заполнение обьектов шаблонов\n * @method WebAccess.components.wrappers.details.DetailsInitializer#_getAvailablePlugins\n * @return {Deferred} Специальный Deferred-объект.\n */\n _getAvailablePlugins: function (dfmName) {\n var me = this;\n var plugins = [\n new me._dv.gridPlugins.EditPlugin(),\n new me._dv.gridPlugins.SortingPlugin(),\n new me._dv.gridPlugins.ColumnResizePlugin({\n // Отключаем в плагине реакцию на ресайз окна, т.к. на планшетах\n // ресайз вызывает появление клавиатуры в редактируемых ячейках, \n // а после этого события грид перестраивается и клавиатура \n // убирается (замечание №103899). Да и незачем детальным разделам \n // изменять свой размер или перерисовываться.\n \"disableOnResizeBinding\": true\n })\n ];\n if (me.ContextMenuClass) {\n var menu = new me.ContextMenuClass(dfmName);\n plugins.push(new me._dv.gridPlugins.ContextMenuPlugin(menu, me._current))\n };\n return plugins;\n }\n //-----------------------------------------------------------------------//\n }, {\n EVENT: {\n COMPLETE: 'complete'\n }\n //-----------------------------------------------------------------------//\n });\n\n global.DetailsInitiializer = DetailsInitiializer;\n})(window.WebAccess.components.wrappers.details);","\"use strict\";\n\n/**\n* Всплывающее сообщение.\n* \n* @class WebAccess.components.notifications.Toast\n* @since 5.0.0.4305\n* @extends BaseObject\n* @property {object} [opt_settings] Параметры уведомления\n* @example\n* // Показать всплывающее сообщение с текстом «Hello world».\n* var toast = new WA.CMP.NTF.Toast()\n* toast.showMessage(\"Hello world\");\n*/\n(function (global) {\n var Toast = BaseObject.extend({\n \n init: function (opt_settings) { \n this._super(opt_settings);\n\n if ($.isPlainObject(opt_settings)) {\n $.extend(this, opt_settings);\n };\n\n $.toast.config.align = this.align; \n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n className: 'Toast',\n align: 'right',\n id: null,\n\n /**\n * Показать сообщение с текстовой информацией.\n *\n * @function WebAccess.components.notifications.Toast#showMessage\n * @param {string} message Текст сообщения\n * @param {boolean} [opt_sticky] Признак закрытия сообщения по кнопке «Закрыть». Возможные значения: true, false\n * @param {integer} [opt_duration] Продолжительность показа сообщения\n * @return {WebAccess.components.notifications.Toast} Объект класса Toast.\n */\n showMessage: function (msg, opt_sticky, opt_duration) { \n this.show(msg, \"info\", opt_sticky, opt_duration)\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать сообщение с сообщением об успехе.\n *\n * @function WebAccess.components.notifications.Toast#showMessage\n * @param {string} message Текст сообщения\n * @param {boolean} [opt_sticky] Признак закрытия сообщения по кнопке «Закрыть». Возможные значения: true, false\n * @param {integer} [opt_duration] Продолжительность показа сообщения\n * @return {WebAccess.components.notifications.Toast} Объект класса Toast.\n */\n showSuccess: function (msg, opt_sticky, opt_duration) {\n // В JQuery.Toast есть опечатка в Success, поэтому здесь используется именно succecc!\n this.show(msg, \"succecc\", opt_sticky, opt_duration)\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать сообщение с предупреждением.\n *\n * @function WebAccess.components.notifications.Toast#showWarning\n * @param {string} message Текст сообщения\n * @param {boolean} [opt_sticky] Признак закрытия сообщения по кнопке «Закрыть». Сообщение требуется закрыть вручную. Возможные значения: true, false \n * @param {integer} [opt_duration] Продолжительность показа сообщения \n * @return {WebAccess.components.notifications.Toast} Объект класса Toast.\n */\n showWarning: function (msg, opt_sticky, opt_duration) {\n this.show(msg, \"warning\", opt_sticky, opt_duration)\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать сообщение об ошибке.\n *\n * @function WebAccess.components.notifications.Toast#showError\n * @param {string} message Текст сообщения\n * @param {boolean} [opt_sticky] Признак закрытия сообщения по кнопке «Закрыть». Возможные значения: true, false\n * @param {integer} [opt_duration] Продолжительность показа сообщения\n * @return {WebAccess.components.notifications.Toast} Объект класса Toast.\n */\n showError: function (msg, opt_sticky, opt_duration) {\n this.show(msg, \"error\", opt_sticky, opt_duration)\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Показать последнее сообщение.\n *\n * @function WebAccess.components.notifications.Toast#show\n * @param {string} message Текст сообщения\n * @param {MESSAGE_TYPE} type Тип сообщения (ошибка, предупреждение, информация)\n * @param {boolean} [opt_sticky] Признак закрытия сообщения по кнопке «Закрыть». Возможные значения: true, false\n * @param {integer} [opt_duration] Продолжительность показа сообщения\n * @return {WebAccess.components.notifications.Toast} Объект класса Toast.\n */\n show: function (msg, type, opt_sticky, opt_duration) {\n var type = type || 'success';\n var sticky = opt_sticky || 'false';\n var duration = opt_duration || 2000;\n this.id = $.toast(msg, { sticky: sticky, type: type, duration: duration }); \n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n /**\n * Скрыть последнее сообщение.\n *\n * @function WebAccess.components.notifications.Toast#hide \n * @return {WebAccess.components.notifications.Toast} Объект класса Toast.\n * @since 5.0.0.4312\n */\n hide: function () {\n if (this.id) $(\"#\"+this.id).remove();\n else global.Toast.hideAll();\n return this;\n }\n });\n\n global.Toast = Toast;\n\n /**\n * Скрыть все сообщения.\n *\n * @function WebAccess.components.notifications.Toast.hideAll\n * @static\n * @since 5.0.0.4312\n */\n global.Toast.hideAll = function () {\n $(\"ul.toast.active li\").remove();\n }\n\n})(window.WebAccess.components.notifications);","\"use strict\";\n\n(function (global) {\n\n var tabSelector = \"div.explorer-search-panel__item\";\n var actionButtonSelector = '.action-button';\n\n /**\n * Класс-обертка для закладки в проводнике.\n * @class WebAccess.components.wrappers.sideBar.Tabs\n * @extends WebAccess.Collecton\n * @since 5.2.0.1600 \n */\n var _ExplorerTab = WebAccess.components.wrappers.BasePageElement.extend({\n dfmName: '',\n\n // Конструктор.\n init: function (itemSelector, opt_current) {\n var me = this;\n me._jObject = $(itemSelector)\n me._super(me._jObject);\n\n me.selector = format(me._byNameSelectorTemplate, tabSelector, me.name);\n me.dfmName = me._jObject.data('name');\n\n me._jActionButon = me._jObject.find(actionButtonSelector);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Имитировать щелчок мыши.\n * Имитация щелчка мыши на кнопке либо установка обработчика на событие onClick, если передан callback. \n * Заменяет обработчик, установленный по умолчанию. Используется в прикладной разработке.\n * \n * @param {function} [opt_callback] Функция, которая будет вызвана после щелчка мыши по кнопке\n * @method WebAccess.components.wrappers.BasePageElement#click\n * @throws ERR_OBJECT_IS_ALREADY_RENDERED – объект уже отображен.\n * @return {WebAccess.components.wrappers.BasePageElement} Объект типа BasePageElement.\n *\n * @example\n * WebAccess.current.toolBar.buttons.CrtRefRecords.click();\n * WebAccess.current.toolBar.buttons.CrtRefRecords.click(function() {\n * alert(\"Существующие обработчки событий click были перезаписаны данным\");\n * })\n */\n click: function (opt_callback) {\n var instance = this;\n if ($.isFunction(opt_callback)) {\n this._disableClickHandler(this._jActionButon);\n this.unbind('click').bind(\"click\", opt_callback);\n } else {\n this._jActionButon.click();\n }\n return this;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n });\n\n global.components.wrappers.sideBar._ExplorerTab = _ExplorerTab;\n\n})(window.WebAccess);","\n\"use strict\";\n\n(function (global) {\n\n var moreButtonHeaderSelector = \".toolbar-more-button__header\";\n var moreButtonContainer = \".toolbar-more-lists\";\n var moreButtonSelector = \".toolbar-more-button\";\n\n /**\n * Класс-обертка для панели инструментов.\n * @class WebAccess.components.wrappers.toolBar.ToolBar\n * @since 5.5.0.9000\n */\n var ToolBar = BaseObject.extend({\n\n init: function (data) {\n var me = this;\n me._super(data);\n me._initButtonMore();\n },\n\n _initButtonMore: function() {\n\n var jMoreButtonHeaderSelector = $(moreButtonHeaderSelector);\n var jMoreButtonSelector = $(moreButtonSelector);\n\n jMoreButtonHeaderSelector.on(\"click\", function () {\n var jActions = $(this).siblings(moreButtonContainer);\n jActions.show();\n });\n\n var autohide;\n var jActions = jMoreButtonHeaderSelector.siblings(moreButtonContainer);\n\n // Выравниваем выпадайку по правой границе экрана, если она нвыходит за границы экрана.\n if (jMoreButtonSelector.length > 0 && jActions.width() > $(document).width() - jMoreButtonSelector.offset().left) {\n jActions.addClass('toolbar-more-lists_align-right');\n }\n\n jMoreButtonSelector\n .off('mouseenter').off('mouseleave')\n .on('mouseenter', function () { if (autohide) clearTimeout(autohide); })\n .on('mouseleave', function () {\n autohide = setTimeout(\n function () {\n jActions.hide();\n }, 500);\n });\n }\n });\n\n global.components.wrappers.toolBar.ToolBar = ToolBar;\n\n})(window.WA);\n","\"use strict\";\n\n/**\n* Кнопка панели \"Создать\".\n*\n* @class WebAccess.components.ActionButton\n* @extends BaseObject\n* @property {object} _model Модель кнопки панели \"Создать\"\n*/\n\n(function (global) {\n var ActionButton = BaseObject.extend({\n\n _model: {},\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Конструктор\n * @param {object} model Модель кнопки панели \"Создать\"\n * @method WebAccess.components.ActionButton#init\n */\n init: function (model) {\n this._model = model;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак скрытия объекта.\n *\n * @method WebAccess.components.ActionButton#isHidden\n * @return {boolean} True, если объект скрыт, иначе False.\n */\n isHidden: function () {\n return this._model.hidden;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Признак отображения объекта.\n *\n * @method WebAccess.components.ActionButton#isEnabled\n * @return {boolean} True, если объект отображается, иначе False.\n */\n isEnabled: function () {\n return !this._model.disabled;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отобразить скрытый объект.\n *\n * @method WebAccess.components.ActionButton#show\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n *\n * @example\n * WebAccess.current.createPanel.buttons['CrtDocTmpl'].show();\n */\n show: function () {\n this._model.hidden = false;\n this._dispatchChangeEvent();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Скрыть объект.\n *\n * @method WebAccess.components.ActionButton#hide\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n */\n hide: function() {\n this._model.hidden = true;\n this._dispatchChangeEvent();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сделать кнопку недоступной.\n * Кнопка становится полупрозрачной и не реагирует на события.\n *\n * @method WebAccess.components.ActionButton#disable\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n */\n disable: function() {\n this._model.disabled = true;\n this._dispatchChangeEvent();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сделать кнопку доступной.\n *\n * @method WebAccess.components.ActionButton#enable\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n */\n enable: function () {\n this._model.disabled = false;\n this._dispatchChangeEvent();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить подпись к объекту.\n *\n * @param {string} text Текст подписи\n * @method WebAccess.components.ActionButton#setLabel\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n */\n setLabel: function (text) {\n this._model.text = text;\n this._dispatchChangeEvent();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить текст подписи объекта.\n *\n * @method WebAccess.components.ActionButton#getLabel\n * @return {string} Текст подписи объекта.\n */\n getLabel: function () {\n return this._model.text;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Установить всплывающую подсказку.\n *\n * @param {string} text Текст всплывающей подсказки\n * @method WebAccess.components.ActionButton#setTooltip\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n * @since 5.0.0.4005\n */\n setTooltip: function (text) {\n this._model.tooltip = text;\n this._dispatchChangeEvent();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить текст всплывающей подсказки.\n *\n * @method WebAccess.components.ActionButton#getTooltip\n * @return {string} Текст всплывающей подсказки.\n * @since 5.0.0.4005\n */\n getTooltip: function () {\n return this._model.tooltip;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить иконку.\n *\n * Иконку необходимо разместить в папке проекта App_Sprites и после скомпилировать проект.\n * Либо можно использовать название svg-спрайта.\n *\n * @example\n * WebAccess.current.createPanel.buttons['CrtDocTmpl'].setIcon('SidebarAndExtensions/EDocumentSearch_24.png');\n * или\n * WebAccess.current.createPanel.buttons['CrtDocTmpl'].setIcon('task-32');\n *\n * @param {string} path Путь к иконке или название svg-спрайта\n * @method WebAccess.components.ActionButton#setIcon\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n */\n setIcon: function (path) {\n this._model.icon = path;\n this._dispatchChangeEvent();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить имя иконки.\n *\n * @method WebAccess.components.ActionButton#getIcon\n * @return {string} Имя иконки.\n */\n getIcon: function() {\n return this._model.icon;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Назначить функцию на клик.\n *\n * @param {string} callback Функция, исполняемая при клике, передаваемая в виде строки.\n * @method WebAccess.components.ActionButton#getIcon\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n */\n click: function(callback) {\n var instance = this;\n if (callback) {\n this._model.jsaction = callback;\n this._dispatchChangeEvent();\n } else {\n // TODO: сэмулировать клик каким-то образом.\n }\n return this;\n },\n\n /**\n * Вызвать событие, которое оповещает подписчиков об изменениях в модели кнопки.\n *\n * // Вызванное событие повлечет за собой рендер ExplorerHeader с помощью react (ВД 5.5.0).\n */\n _dispatchChangeEvent: function() {\n this.fire(this['class'].EVENT.CHANGE_STATE);\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n }, {\n /**\n * События.\n */\n EVENT: {\n /**\n * Изменилось свойство кнопки.\n */\n CHANGE_STATE: 'changeState'\n }\n });\n\n global.ActionButton = ActionButton;\n\n})(window.WebAccess.components);\n","\"use strict\";\n\n/**\n* Объект панели \"Создать\".\n*\n* @class WebAccess.components.CreatePanel\n* @extends BaseObject\n* @property {object} _model Модель панели \"Создать\"\n* @property {object} buttons Коллекция объектов кнопок панели \"Создать\"\n*/\n\n(function (global) {\n var CreatePanel = BaseObject.extend({\n\n _model: {},\n buttons: {},\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Конструктор\n * @param {object} model Модель панели \"Создать\"\n * @method WebAccess.components.CreatePanel#init\n */\n init: function (model) {\n var me = this;\n me._model = model;\n model.forEach(function(button_model) {\n me._initButton(button_model);\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проинициализировать в КОМ кнопку панели \"Создать\".\n *\n * @param {string} button_model Модель кнопки панели \"Создать\"\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n */\n _initButton: function (button_model) {\n var me = this;\n var button = new global.ActionButton(button_model);\n me.buttons[button_model.id] = button;\n button.bind(button['class'].EVENT.CHANGE_STATE, function () {\n me.fire(me['class'].EVENT.CHANGE_STATE);\n });\n return button;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создать кнопку на панели \"Создать\".\n *\n * @method WebAccess.components.CreatePanel#createButton\n * @param {string} button_name Имя создаваемой кнопки\n * @param {object} params\n * @throws ERR_BUTTON_NAME_IS_NOT_SPECIFIED_PROPERLY – некорректно указано имя кнопки;\n * @throws ERR_BUTTON_WITH_THE_SAME_NAME_ALREADY_EXIST – кнопка с указанным именем уже существует.\n * @return {WebAccess.components.ActionButton} Объект типа ActionButton.\n *\n * @example\n * WebAccess.current.createPanel.createButton('newButton', {disabled: fasle, text: L('CREATE_DOCUMENT'), icon: 'task-32'})\n * или\n * WebAccess.current.createPanel.createButton('newButton')\n * .enable()\n * .setLabel(L('CREATE_DOCUMENT'))\n * .setIcon('SidebarAndExtensions/EDocumentSearch_24.png') \n */\n createButton: function (button_name, params) {\n var me = this;\n if (!button_name || typeof button_name !== 'string') WebAccess.raise('ERR_BUTTON_NAME_IS_NOT_SPECIFIED_PROPERLY');\n // Проверяем, существует ли такая кнопка.\n for (var i = 0, len = me._model.length; i < len; i++) {\n if (me._model[i].id == button_name) WebAccess.raise('ERR_BUTTON_WITH_THE_SAME_NAME_ALREADY_EXIST', button_name);\n };\n if (typeof params !== 'object') params = {};\n // id модели кнопки должен быть в любом случае равен button_name\n params.id = button_name;\n me._model.push(params);\n me.fire(me['class'].EVENT.CHANGE_STATE);\n return me._initButton(params);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удалить кнопку на панели \"Создать\".\n *\n * @method WebAccess.components.CreatePanel#removeButton\n * @param {string} button_name Имя удаляемой кнопки панели инструментов\n * @return {WebAccess.components.CreatePanel} Объект типа CreatePanel.\n */\n removeButton: function (button_name) {\n var me = this;\n for (var i = 0, len = me._model.length; i < len; i++) {\n if (me._model[i].id == button_name) {\n delete me.buttons[me._model[i].id];\n me._model.splice(i, 1);\n me.fire(me['class'].EVENT.CHANGE_STATE);\n break;\n }\n };\n return me;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n }, {\n /**\n * События.\n */\n EVENT: {\n /**\n * Изменились кнопки панели \"Создать\":\n * поменялось их количество, либо\n * поменялись их свойства (в этом случае событие прокидывается из дочерних объектов).\n */\n CHANGE_STATE: 'changeState'\n }\n });\n\n global.CreatePanel = CreatePanel;\n\n})(window.WebAccess.components);\n","\"use strict\";\n\n/**\n* Объект шапки проводника.\n*\n* @class WebAccess.components.Header\n* @extends BaseObject\n* @property {string} _containerID - ID элемента DOM, в котором рендерится react-компонента шапки\n* @property {object} _model - Модель шапки проводника\n*/\n\n(function (global) {\n var Header = BaseObject.extend({\n\n _containerId: \"\",\n _model: {},\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Конструктор\n * @param {string} containerId - ID элемента DOM, в котором рендерится react-компонента шапки\n * @param {object} model - Модель шапки проводника\n * @param {array} childObjects - Массив объектов в шапке проводника, которыми можно манипулировать через КОМ\n * @method WebAccess.components.Header#init\n */\n init: function (containerId, model, childObjects) {\n var me = this;\n me._containerId = containerId;\n me._model = model;\n childObjects.forEach(function(object) {\n object.bind(object['class'].EVENT.CHANGE_STATE, function () {\n me._render();\n });\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отрендерить компоненту ExplorerHeader с помощью react.\n */\n _render: function () {\n var me = this;\n ReactDOM.render(\n React.createElement(ExplorerHeader, me._model),\n document.getElementById(me._containerId)\n );\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n\n global.Header = Header;\n\n})(window.WebAccess.components);\n","; 'use_strict';\n\n(function defCurrent(global) {\n\n /**\n * Предоставляет текущую открытую часть веб-доступа.\n * В зависимости от текущего контекста пространство имен WebAccess.сurrent\n * может содержать различную информацию.\n * Например, на страницах проводника WebAccess.сurrent предоставляет\n * функции для работы с панелью инструментов, боковой панелью.\n * На страницах задачи оно, помимо перечисленного, будет также включать\n * подробную информацию о текущей задаче и будет иметь такие атрибуты,\n * как Subject, AuthorID, WorkflowBlockID и прочие.\n * @namespace WebAccess.current\n */\n\n var Current = BaseObject.extend([global.mixins.formMixin], {\n\n /**\n * Предоставляет информацию о текущем пользователе.\n *\n * @namespace WebAccess.current.user\n * @property {integer} ID ИД пользователя\n * @property {string} fullName Полное имя пользователя\n * @property {string} name Имя пользователя\n * @property {string} login Логин пользователя\n * @property {string} organization Организация, в которую входит пользователь\n * @property {string} defaultCertificate Сертификат пользователя\n * @since 5.0.0.7200\n\n * @example\n * if (WA.CR.user.login == \"Administrator\") { alert(\"Добро пожаловать, Администратор\"); }\n */\n user: null,\n serviceURL: '/CardForm.asmx',\n containerSelector: 'form.master',\n className: 'Current',\n\n _detailsGridInit: null,\n _containerInit: null,\n _sideBarContainerSelector: '#left_column',\n\n init: function (formData) {\n var me = this;\n\n me._preInit();\n me._super();\n me._containerInit = $.Deferred();\n\n $('document').ready(me._containerInit.resolve);\n\n me._detailsGridInit = WA._DetailsGridInit;\n\n $.when(global._userInfoInit).done(function (user) {\n me.user = {};\n me.user.ID = user.ID;\n me.user.fullName = user.FullName;\n me.user.login = user.Login;\n me.user.name = user.Name;\n me.user.organization = user.Organization;\n me.user.defaultCertificate = user.DefaultCertificate;\n global.UserInfoInit.resolve();\n });\n\n me._postInit();\n\n $.when(me.states.details).then(function () {\n WA.DetailsInit.resolve();\n });\n\n $.when(me.states.tables, me.states.links, me.states.buttons, me.states.form).then(function () {\n WA.FormInit.resolve();\n WA.FormControlsInit.resolve();\n });\n\n $.when(me.states.toolBarButtons, me.states.toolBarGroups).then(function () {\n WA.ToolBarInit.resolve();\n });\n\n $.when(me.states.tabs).then(function () {\n WA.SideBarInit.resolve();\n });\n\n $.when(me.states.objectList).then(function () {\n WA.ObjectListInit.resolve();\n });\n\n me.folderTree = new global.components.wrappers.folderTree.FolderTree(WA.FolderTreeInit);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Инициализация objectList.\n _initObjectList: function () {\n var me = this;\n var WR = global.CMP.wrappers;\n var isTable = WA.getLocation() === 'referencerecords'; //TODO придумать нормальную проверку, но тут еще грид не проинициализирован.\n if (isTable) {\n me.objectList = new WR.objectList.ObjectsTable(me.containerSelector);\n } else {\n me.objectList = new WR.objectList.FolderList(me.containerSelector);\n }\n },\n\n // Возвращает ссылку на текущий объект.\n _getObjectLink: function () {\n var link = new WA.Link();\n if (link.type) {\n return $.toJSON(link.toLinkModel());\n } else {\n return '';\n }\n },\n\n // Возвращает представление текущего объекта.\n _getObjectView: function () {\n return WA.CR.getReferenceView();\n },\n\n _getFormData: function () {\n return window.formData;\n },\n\n _getGrids: function () {\n return Core.grid.details;\n },\n\n /**\n * Проверка на существование объекта\n * @private\n */\n _isDefined: function (object) {\n return (typeof object !== 'undefined' && object !== 'undefined') || false;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить идентификатор текущей записи.\n *\n * @function WebAccess.current.getID\n * @return {string} ИД текущего справочника.\n */\n getID: function () {\n var me = this;\n // Для проводника всегда получаем из URL, т.к. он может измениться.\n if (!!me.ID) return me.ID;\n var recID = recID = parseInt(GetParamInURL(\"id\"), 10);\n if (!isNaN(recID)) {\n me.ID = recID;\n return recID;\n }\n return null;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Получить код текущего справочника.\n *\n * @function WebAccess.current.getReferenceCode\n * @return {string} Имя текущего справочника; иначе возвращает null.\n */\n getReferenceCode: function () {\n var me = this;\n if (me._isDefined(me.ReferenceCode)) return me.ReferenceCode;\n var refName = unescape(GetParamInURL(\"compcode\"));\n if (me._isDefined(refName)) { me.ReferenceCode = refName; return refName; }\n else {\n refName = unescape($(\"#RefCode\").val());\n if (me._isDefined(refName)) { me.ReferenceCode = refName; return refName; }\n }\n return null;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить имя текущего представления справочника.\n *\n * @function WebAccess.current.getReferenceView\n * @return {string} Имя текущего представления справочника.\n */\n getReferenceView: function () {\n var me = this;\n if (me._isDefined(me.ReferenceView)) return me.ReferenceView;\n var refView = GetParamInURL(\"refview\");\n if (me._isDefined(refView)) { me.ReferenceView = refView; return refView; }\n return null;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить тип текущего объекта.\n *\n * @function WebAccess.current.getKind\n * @return {string} Cтроковое представление типов объекта: \"fol\", \"edoc\", \"task\", \"job\", \"ref\".\n * @since 5.0.0.4200\n */\n getKind: function () {\n var me = this;\n if (typeof me.Type !== 'undefined' && me.Type !== null) {\n var type = me.Type;\n var typesKinds = { 0: 'FOL', 1: 'EDOC', 2: 'TASK', 3: 'JOB', 9: 'REF' };\n return typesKinds[type] || null;\n } else {\n switch (global.getLocation()) {\n case 'explorer':\n case 'folder':\n return 'FOL';\n case 'doc':\n return 'EDOC';\n case 'job':\n return 'JOB';\n case 'task':\n return 'TASK';\n default:\n return null;\n }\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить тип текущего объекта.\n *\n * @function WebAccess.current.getObjectType\n * @return {OBJECT_TYPE} Тип объекта.\n * @since 5.0.0.4200\n *\n * @example\n * if (WebAccess.current.getObjectType() === OBJECT_TYPE.JOB) {\n * alert('Открыта карточка задания');\n * }\n *\n */\n getObjectType: function () {\n var me = this;\n return objectKindToObjectType(me.getKind());\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проинициализировать модель панели \"Создать\".\n *\n * @function WebAccess.current.initCreatePanel\n * @param {object} model - Модель панели \"Создать\", передается от модели родительской компоненты.\n * @since 5.5.0\n *\n */\n initCreatePanel: function (model) {\n this.createPanel = new WA.components.CreatePanel(model);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проинициализировать модель шапки проводника.\n *\n * @function WebAccess.current.initHeader\n * @param {string} containerId - ID элемента DOM, в котором рендерится react-компонента шапки.\n * @param {object} model - Модель шапки проводника, передается из react-компоненты шапки.\n * @since 5.5.0\n *\n */\n initHeader: function (containerId, model) {\n this.initCreatePanel(model.createPanelData);\n this.header = new WA.components.Header(containerId, model, [this.createPanel]);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _getAvailableHeight: function () {\n return windowHeight() - $(this._sideBarContainerSelector).offset().top;\n }\n });\n\n global.current = global.CR = new Current();\n\n})(window.WA);","\"use strict\";\n\n/**\n* Текущая веб-страница.\n* Предоставляет инструменты для работы с текущей веб-страницой.\n* Например, позволяет обновить страницу проводника веб-доступа, закрыть страницу, открыть в новом окне.\n*\n* @namespace WebAccess.current.window\n* @since 5.0.0.7300\n*\n* @example\n* WebAccess.current.window.bind('onAfterClose', function(parentWindow) { parentWindow.console.log('afterclose');} );\n*/\n\n/**\n * Событие срабатывает до закрытия текущей страницы.\n * @event WebAccess.current.window#beforeclose\n *\n * @example\n * // Проверка изменения веб-страницы. Если веб-страница изменена, открывается окно с подтвержением о выходе со страницы.\n * WA.CR.window.bind('beforeClose', function() { if(SerializeForm() != g_prevFormVal) {return true;} } );\n */\n\n/**\n * Событие срабатывает после закрытия текущей страницы.\n * Срабатывает либо на текущей странице либо на предыдущей странице, с которой была открыта текущая.\n * Работа события зависит от настроек браузера.\n *\n * @event WebAccess.current.window#afterClose\n *\n * @example\n *\n * // Оповещение о закрытии текущей страницы.\n * WA.CR.window.bind('afterClose', function(parentWindow) { parentWindow.console.log('afterclose');} );\n */\n\n(function (global) {\n var Window = BaseObject.extend({\n className: 'Window',\n name: '',\n url: null,\n _isOnBeforeCloseExecuted: false,\n _closeCheckerTimeoutHandlers: {},\n\n init: function () {\n this._super();\n this.name = window.name;\n this.url = new WA.URL();\n this._isOnBeforeCloseExecuted = false;\n this._closeCheckerTimeoutHandlers = {};\n },\n\n /**\n * Привязать функцию к событию.\n *\n * @method WebAccess.current.window.bind\n * @param {string} name Имя события\n * @param {function} fuc Функция-обработчик\n * @since 5.0.0.7300\n * @return {WebAccess.current.window} Объект типа window.\n */\n bind: function (name, func) {\n var me = this;\n var nameLowered = name.toLowerCase();\n if (nameLowered === 'beforeclose') {\n me._bindOnBeforeClose(name, func);\n } else if (nameLowered === 'afterclose') {\n // Событие срабатывает на закрытие окна.\n me._bindOnAfterClose(name, func);\n } else {\n me._super(name, func);\n }\n return me;\n },\n\n /**\n * Привязать функциию к событию BeforeClose.\n *\n * @method WebAccess.current.window._bindOnBeforeClose\n * @since 5.0.0.7300\n * @return {WebAccess.current.window} Объект типа window.\n * @private\n */\n _bindOnBeforeClose: function (name, func) {\n var me = this;\n window.onbeforeunload = function (e) {\n if (me._isOnBeforeCloseExecuted) return;\n try {\n e = e || window.event;\n\n var msg = '';\n if ($.isFunction(func)) {\n msg = func();\n }\n\n if (msg && msg !== false) {\n // Этот флаг исправляет баг FF, в котором окно появеляется дважды.\n me._isOnBeforeCloseExecuted = true;\n setTimeout(function () { me._isOnBeforeCloseExecuted = false; }, 10);\n // For IE and Firefox\n if (e) {\n e.returnValue = msg;\n }\n // хитрость чтобы скрыть спиннер если пользователь нажмет отмену\n setTimeout(function () {\n setTimeout(function () {\n HideTopSpinner();\n }, 1000);\n }, 1);\n // For Safari\n return msg;\n }\n }\n catch (ex) {\n log.warning('WINDOW', ex);\n }\n };\n\n return me;\n },\n\n /**\n * Привязать функцию к событию AfterClose.\n *\n * @method WebAccess.current.window._bindOnAfterClose\n * @since 5.0.0.7300\n * @return {WebAccess.current.window}\n * @private\n */\n _bindOnAfterClose: function (name, func) {\n var me = this;\n var opener = me._getWindowOpener();\n if (opener && !opener.closed) {\n // Навешиваем событие на родительское окно, т.к. это окно закроется, то некому будет выполнить это событие.\n if (opener.WebAccess) opener.WebAccess.current.window._startWindowCloseChecker(window, opener.cloneFunction(func));\n } else {\n window.onunload = function () {\n me._runCallbackIfClose(window, func);\n };\n }\n return me;\n },\n\n /**\n * Удалить функцию, привязанную к событию.\n *\n * @method WebAccess.current.window.unbind\n * @param {string} name Имя события\n * @return {WebAccess.current.window} Объект типа window.\n * @since 5.0.0.7300\n */\n unbind: function (name) {\n var nameLowered = name.toLowerCase();\n if (nameLowered === 'beforeclose') {\n this._unbindOnBeforeClose(name);\n } else if (nameLowered === 'afterclose') {\n this._unbindOnAfterClose(name);\n } else {\n this._super(name);\n }\n },\n\n /**\n * Удаление привязонной функции к событию BeforeClose.\n *\n * @method WebAccess.current.window._unbindOnBeforeClose\n * @param {string} name Имя события\n * @return {WebAccess.current.window}\n * @private\n * @since 5.0.0.7300\n */\n _unbindOnBeforeClose: function (name, func) {\n window.onbeforeunload = null;\n },\n\n /**\n * Удаление привязонной функции к событию AfterClose.\n *\n * @method WebAccess.current.window._unbindOnBeforeClose\n * @param {string} name Имя события\n * @return {WebAccess.current.window}\n * @private\n * @since 5.0.0.7300\n */\n _unbindOnAfterClose: function (name) {\n var opener = this._getWindowOpener();\n if (opener && !opener.closed) {\n opener.WebAccess.current.window._clearAndDeleteCloseCheckerTimeoutHandler(window.name);\n } else {\n window.onunload = null;\n }\n },\n\n /**\n * Получает родительское окно.\n *\n * @method WebAccess.current.window._getWindowOpener\n * @return {window}\n * @private\n * @since 5.0.0.7300\n */\n _getWindowOpener: function () {\n try { //IE9 может ругаться\n if (window.opener) {\n // Если открыт грид в iframe, то его можно обновлять после закрытия вкладки.\n if (window.opener.location.href.toLowerCase().indexOf('/referencerecords.aspx?') === -1 && window.opener.frameElement) {\n //Открыто из iframe.\n return window.opener.parent;\n } else {\n //Открыто из обычного окна.\n return window.opener;\n }\n }\n } catch (e) {\n log.warning('WINDOW', e);\n }\n return null;\n },\n\n /**\n * Запускает таймер на родительской странице, который следит за закрытием окна.\n *\n * @method WebAccess.current.window._startWindowCloseChecker\n * @return {WebAccess.current.window}\n * @private\n * @since 5.0.0.7300\n */\n _startWindowCloseChecker: function (childWindow, onCloseFunc) {\n var me = this;\n var childWindowName = childWindow.name;\n me._clearAndDeleteCloseCheckerTimeoutHandler(childWindowName);\n me._closeCheckerTimeoutHandlers[childWindowName] = setTimeout(function () {\n if (childWindow.closed) {\n me._clearAndDeleteCloseCheckerTimeoutHandler(childWindowName);\n me._runCallbackIfClose(childWindow, onCloseFunc);\n } else {\n me._startWindowCloseChecker(childWindow, onCloseFunc);\n }\n }, 2500);\n return me;\n },\n\n /**\n * Удаляет таймер на родительской странице, который следит за закрытием окна.\n *\n * @method WebAccess.current.window._clearAndDeleteCloseCheckerTimeoutHandler\n * @return {WebAccess.current.window}\n * @private\n * @since 5.0.0.7300\n */\n _clearAndDeleteCloseCheckerTimeoutHandler: function (name) {\n var me = this;\n if (!!me._closeCheckerTimeoutHandlers[name]) {\n try {\n clearTimeout(me._closeCheckerTimeoutHandlers[name]);\n } catch (e) { }\n try {\n delete me._closeCheckerTimeoutHandlers[name];\n } catch (e) { }\n }\n return me;\n },\n\n /**\n * Запускает callback после закрытия окна.\n *\n * @method WebAccess.current.window._runCallbackIfClose\n * @return {WebAccess.current.window}\n * @private\n * @since 5.0.0.7300\n */\n _runCallbackIfClose: function (childWindow, onCloseFunc) {\n var me = this;\n setTimeout(function () {\n if (childWindow.closed) {\n if (window.NeedUpdateOnChildClose) {\n if (WA.getLocation() === 'referencerecords' && window.Core.grid.reference && window.Core.grid.reference.reloadData) {\n window.Core.grid.reference.reloadData();\n } else {\n me.updateExplorerContent();\n }\n }\n if ($.isFunction(onCloseFunc)) {\n onCloseFunc.apply(window, [window]);\n } else {\n //Нужен что бы функция onCloseFunc выполнилась в родительском окне. Это не происходит из-за замыкания на закрытой странице переменной в onCloseFunc.\n eval(onCloseFunc);\n }\n }\n }, 10);\n return me;\n },\n\n /**\n * Закрыть текущую страницу.\n *\n * @method WebAccess.current.window.close\n * @since 5.0.0.7300\n */\n close: function () {\n var browser = WA.ENV.browser;\n if ((window.opener && window.opener.WA) || $.ipad) {\n window.close();\n } else {\n location.href = \"/explorer.aspx\";\n }\n },\n\n /**\n * Обновить текущую страницу.\n *\n * @method WebAccess.current.window.reload\n * @since 5.0.0.7300\n */\n reload: function () {\n window.location.reload();\n },\n\n /**\n * Открыть проводник веб-доступа в текущем окне.\n *\n * @method WebAccess.current.window.openExplorer\n * @since 5.0.0.7300\n */\n openExplorer: function () {\n window.location = '';\n },\n\n /**\n * Открыть страницу входа на сайт веб-доступа.\n *\n * @method WebAccess.current.window.openLogin\n * @since 5.0.0.7300\n */\n openLogin: function () {\n try {\n window.location.href = 'Login.aspx?ReturnUrl=' + encodeURIComponent(window.location.pathname + window.location.search);\n } catch (e) {\n log.warning('WINDOW', e);\n }\n },\n\n /**\n * Обновить страницу проводника веб-доступа.\n *\n * @method WebAccess.current.window.reloadExplorer\n * @return {WebAccess.current.window} Объект типа window.\n * @since 5.0.0.7300\n */\n reloadExplorer: function () {\n if (WA.getLocation() === 'explorer') {\n var jLikeFilter = $('#FastSearch');\n var predefinedFilters = $('#predefined_filters');\n\n var likeFilterValue = '';\n if (jLikeFilter.length > 0 && jLikeFilter.val() != '') {\n likeFilterValue = jLikeFilter.val();\n }\n\n if (likeFilterValue !== '' || (predefinedFilters.length > 0 && predefinedFilters.data('predefinedselectedfilter') !== '')) {\n setTimeout(function () {\n FilterEDMSContent(regionID, likeFilterValue, $(\"#QFilter input[id*='FilterVariantsNoLoc']\").val());\n }, 500);\n WA.CR.folderTree.update();\n } else {\n var list = $('.object_contents.auto_load');\n if (list.length) {\n var scroller = list.parents('#main_container');\n var scrollTop;\n if ($.scrollActive) {\n scrollTop = scroller.offset().top - list.offset().top;\n } else {\n scrollTop = scroller.scrollTop();\n }\n var count = $('>.folder_item', list).length;\n $.cookie('load_count', count);\n $.cookie('load_scroll', scrollTop);\n }\n window.location.reload();\n }\n }\n return this;\n },\n\n /**\n * Обновить страницу проводника веб-доступа в родительском окне.\n *\n * @method WebAccess.current.window.reloadParentExplorer\n * @return {WebAccess.current.window} Объект типа window.\n * @since 5.0.0.7300\n */\n reloadParentExplorer: function () {\n try {\n var w = window;\n if (w.opener != null && w.opener.location.href.toLowerCase().search('mode=search') < 0 && w.opener.WebAccess != null) {\n w.opener.WebAccess.current.window.reloadExplorer();\n }\n } catch (e) {\n log.warning('WINDOW', e);\n };\n return this;\n },\n\n\n /**\n * Обновить страницу, содержащую список записей справочника, в родительском окне.\n *\n * @method WebAccess.current.window.reloadParentGrid\n * @return {WebAccess.current.window} Объект типа window.\n * @since 5.0.0.7300\n */\n reloadParentGrid: function () {\n try {\n var w = window;\n if (w.opener != null && w.opener.Core.grid.reference && w.opener.Core.grid.reference.reloadData) {\n w.opener.Core.grid.reference.reloadData();\n }\n } catch (e) {\n log.warning('WINDOW', e);\n };\n return this;\n },\n\n\n /**\n * Обновить страницу проводника веб-доступа в родительском окне в момент закрытия текущей страницы.\n *\n * @method WebAccess.current.window.reloadParentWindowOnClose\n * @return {WebAccess.current.window} Объект типа window.\n * @since 5.0.0.7300\n */\n reloadParentWindowOnClose: function () {\n try {\n var op = window.opener;\n if (op != null) {\n var formChanged = false;\n if (!!op && !!op.g_prevFormVal && !!op.SerializeForm) {\n formChanged = (op.g_prevFormVal != op.SerializeForm());\n }\n op.NeedUpdateOnChildClose = !formChanged && op.location.href.toLowerCase().search('mode=search') < 0;\n }\n\n }\n catch (e) {\n log.warning('WINDOW', e);\n }\n return this;\n },\n\n /**\n * Обновить содержимое проводника.\n *\n * @method WebAccess.current.window.updateExplorerContent\n * @returns {WebAccess.current.window} Объект типа window.\n * @since 5.4.0.1013\n */\n updateExplorerContent: function () {\n if (WA.getLocation() === 'explorer') {\n if (WA.CR.objectList)\n WA.CR.objectList.reload();\n }\n\n return this;\n },\n\n /**\n * Обновить содержимое проводника в родительском окне.\n *\n * @method WebAccess.current.window.updateParentExplorerContent\n * @returns {WebAccess.current.window} Объект типа window.\n * @since 5.4.0.1013\n */\n updateParentExplorerContent: function () {\n try {\n var w = window;\n if (w.opener != null && w.opener.location.href.toLowerCase().search('mode=search') < 0 && w.opener.WebAccess != null) {\n w.opener.WebAccess.current.window.updateExplorerContent();\n }\n } catch (e) {\n log.warning('WINDOW', e);\n };\n return this;\n }\n });\n\n global.window = new Window();\n})(window.WebAccess.current);\n","\"use strict\";\n\n/**\n* Предоставляет инструменты для сбора и отправки статистики по взаимодействию пользователя с веб-страницей.\n* Например, пользователь перешел по ссылке из карточки задачи или нажал на кнопку «Создать папку» на странице проводника веб-доступа.\n*\n* @namespace WebAccess.current.statistics\n* @property {boolean} saveImmediate Признак автоматического сохранения статистики после каждого действия\n* @property {int} maxStackSize Размер пакета для отправки статистики\n* @since 5.1.0.1300\n*/\n\n(function (global) {\n $('document').ready(function () {\n var statistics = {\n\n saveImmediate: false,\n\n maxStackSize: 10,\n\n _isDisabled: true,\n\n _ignoredActions: [\n 'sidebar_container',\n 'caption_container',\n 'tree_container',\n 'toolbar_container',\n 'logo_container',\n 'main_container',\n 'left_column',\n 'QFilter',\n 'reference_footer',\n 'ctl00_MainContent_CardContainer',\n 'ctl00_MainContent_CardControl_ctl00',\n 'ctl00_MainContent_RefRecTable_GridCtrl',\n 'ctl00_MainContent_Attachments_AttachmentsList_list',\n 'ctl00_MainContent_CardControl',\n 'ModalWindow',\n 'ModalWindowContent',\n 'info',\n 'ToolbarSeparator',\n 'header',\n 'ui-datepicker-div',\n 'SelectedRightsRow',\n 'InstructionText',\n 'content_list_toolbox',\n 'lblEmpty', 'pnlEmpty',\n 'ListRequisiteOuterPanel',\n 'Requisite', 'Requisite (disabled)',\n 'WizardPanelForm',\n 'StatOff', 'StatOff (disabled)'],\n\n _ignoredAreas: [\n 'CustomWorkTree',\n 'ColumnFilterDialog'\n ]\n };\n\n /**\n * Включить сбор статистики.\n *\n * @method WebAccess.current.statistics.enable \n * @return {WebAccess.current.statistics} Объект типа statistics.\n * @since 5.1.0.1300\n */\n statistics.enable = function () {\n this._isDisabled = false;\n return this;\n };\n\n /**\n * Отключить сбор статистики.\n *\n * @method WebAccess.current.statistics.disable \n * @return {WebAccess.current.statistics} Объект типа statistics.\n * @since 5.1.0.1300\n */\n statistics.disable = function () {\n this._isDisabled = true;\n return this;\n };\n\n /**\n * Проверить, отключен ли механизм сбора статистики.\n *\n * @method WebAccess.current.statistics.isDisabled \n * @return {boolean} True – механизм сбора статистики отключен, иначе False.\n * @since 5.1.0.1300\n */\n statistics.isDisabled = function () {\n return this._isDisabled;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавить информацию об HTML-объекте в журнал сбора статистики веб-доступа.\n *\n * @method WebAccess.current.statistics.write\n * @param {Object} HTMLelement HTML-объект, информация о котором записывается в журнал сбора статистики\n * @param {Object} [opt_actionTarget] HTML-объект, для которого было вызвано действие в веб-доступе\n * @return {WebAccess.current.statistics} Объект типа statistics.\n * @since 5.1.0.1300\n *\n * @example Записать действия пользователя, выполняемые на панели инструментов веб-доступа.\n * WA.CR.statistics.enable();\n * $(\"#toolbar_container\").on('mousedown.stat', function (event) {\n * WA.CR.statistics.write(event.target);\n * }); \n */\n statistics.write = function (HTMLelement, opt_actionTarget) {\n if (this._isDisabled) return this;\n if (WA.getLocation() === 'login') return;\n var params = this._getParams(HTMLelement, opt_actionTarget);\n if (!params || !params.Action) return;\n if (this.saveImmediate) {\n WA.SRV.call('/ClientStatistic.asmx/Write', params);\n } else {\n var queue = WA.cache.getObject('statistics') || [];\n queue.push(params);\n WA.cache.setObject('statistics', queue);\n if (queue.length > this.maxStackSize) this.writeQueue();\n }\n return this;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Получить параметры пригодные для статистики указанного элемента\n * @private\n */\n statistics._getParams = function (HTMLelement, opt_actionTarget) {\n opt_actionTarget = opt_actionTarget || HTMLelement;\n var stat = global.current.statistics;\n var params = { 'Time': new Date() };\n\n if (HTMLelement.tagName) {\n var actionAndArea = stat._getActionAndAreas(HTMLelement, true);\n\n params.Page = WA.getLocation();\n params.Action = actionAndArea.action;\n params.Area = (actionAndArea.areas.length > 0 ? actionAndArea.areas[0] : '');\n params.Target = stat._getTargetAndAreas(opt_actionTarget);\n } else {\n params.Page = HTMLelement.page;\n params.Action = HTMLelement.action;\n params.Area = HTMLelement.area;\n params.Target = stat._getTargetAndAreas(HTMLelement.target);\n };\n\n if (params.Action == '' || $.inArray(params.Action, this._ignoredActions) !== -1) return;\n if (params.Area == '' || $.inArray(params.Area, this._ignoredAreas) !== -1) return;\n\n //console.log('page: ' + params.Page);\n //console.log('action: ' + params.Action);\n //console.log('area: ' + params.Area);\n //console.log('targetAndAreas: ' + params.Target);\n return params;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /** \n * Выгрузить текущий пакет статистики на сервер веб-доступа.\n *\n * @method WebAccess.current.statistics.writeQueue\n * @return {WebAccess.current.statistics} Объект типа statistics.\n * @since 5.1.0.1300\n */\n statistics.writeQueue = function () {\n if (this._isDisabled) return this;\n //FIXME Шамов А.: Вообще есть вероятность потери некоторых данных. Думаю нужно создавать срез копированием, и потом его отправлять, что бы новые, те что добавлятся\n // пока идет запрос не потерялись. Но со срезом потом сложно будет его убрать из очереди после удачного сохранения. Подумай над вариантами.\n var queue = WA.cache.getObject('statistics');\n WA.SRV.call('/ClientStatistic.asmx/writeQueue', { \"Queue\": queue }).done(function (success) {\n if (success) WA.cache.setObject('statistics', []);\n });\n return this;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Получение имени элемента и имени области в которой произошло событие\n * @method WebAccess.current.statistics._getActionAndAreas \n * @param {HTMLElement}\n * @param {returnFirstOnly} вернуть только первую найденную область в виде строки\n * @private\n * @since 5.1.0.1300\n */\n statistics._getActionAndAreas = function (target, returnFirstOnly) {\n var me = this;\n var result = {\n action: '',\n areas: []\n };\n var isDisabled = '';\n\n var curr = target;\n while (curr) {\n // Проверяем есть ли область.\n if (curr.className) {\n var className = curr.className.baseVal || curr.className;\n // Проверяем тип className, т.к. для svg use className может вернуть объект. \n if (className && typeof className === 'string' && className.indexOf('stat_') !== -1) {\n result.areas.push(me._getAreaFromElement(curr, returnFirstOnly));\n // Если нашли область, то действие должно было быть в пределах этой области и не важно нашли мы его или нет. Если не нашли, значит искать выше уже нет смысла.\n if (returnFirstOnly) return result;\n }\n }\n\n // Если мы действие уже нашли, то оставляем его. Дальше будет искаться только область.\n if (result.action == '') {\n if (className && className.toLowerCase().indexOf(\"disabled\") !== -1) isDisabled = ' (disabled)';\n if (curr.getAttribute) {\n if (curr.getAttribute('data-stataction')) {\n result.action = curr.getAttribute('data-stataction') + isDisabled;\n } else\n if (curr.getAttribute('name')) {\n result.action = curr.getAttribute('name') + isDisabled;\n } else\n if (curr.getAttribute('data-name')) {\n result.action = curr.getAttribute('data-name') + isDisabled;;\n } else\n if (curr.getAttribute('id')) {\n result.action = curr.getAttribute('id') + isDisabled;;\n }\n }\n }\n\n curr = curr.parentNode;\n }\n\n return result;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить имя конкретной области\n * @private \n */\n statistics._getAreaFromElement = function (areaElement, returnFirstOnly) {\n var cNames;\n var cName;\n cNames = areaElement.className.split(' ');\n for (var m = 0; m < cNames.length; m++) {\n cName = cNames[m];\n if (cName.indexOf('stat_') === -1) continue;\n return cName.replace('stat_', '');\n }\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение DOM-цепочки к элементу\n * @method WebAccess.current.statistics._getTargetAndAreas \n * @private\n * @since 5.1.0.1300\n */\n statistics._getTargetAndAreas = function (HTMLelement) {\n var stat = global.current.statistics;\n var actionAndAreas = stat._getActionAndAreas(HTMLelement);\n return ([actionAndAreas.action].concat(actionAndAreas.areas)).join(',');\n };\n\n global.current.statistics = statistics;\n });\n\n})(window.WebAccess);","\"use strict\";\n\n(function (global) {\n\n global.factories.references = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.scripts = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.reports = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.folders = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.tasks = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.jobs = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.documents = global.factories.eDocuments = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.dialogs = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n \n})(window.WebAccess);","\"use strict\";\n(function (global) {\n\n /** \n * Базовый класс фабрики объектов.\n *\n * @class WebAccess.factories.BaseFactory\n * @param {string} contentType Тип объектов\n * @property {string} contentType Тип объектов \n * @throws ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED - заданы не все обязательные параметры.\n * @since 5.0.0.7300\n */\n var BaseFactory = BaseObject.extend({\n\n className: \"BaseFactory\",\n contentType: OBJECT_TYPE.UNKNOWN,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (contentType) {\n if (contentType < 0) {\n WA.raise(\"ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED\", \"contentType\");\n }\n this.contentType = contentType;\n this._super(contentType);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить объект по ИД.\n *\n * @method WebAccess.factories.BaseFactory#getObjectByID\n * @param {Integer} id ИД объекта\n * @param {MODEL} [opt_modelType] Тип возвращаемой модели данных\n * @since 5.0.0.7300\n * @return {Deferred} Специальный deferred-объект.\n */\n \n getObjectByID: function (id, opt_modelType) {\n var me = this;\n opt_modelType = (!opt_modelType) ? MODEL.FULL : opt_modelType;\n var proxyCall = $.Deferred();\n\n var result; \n WA.SRV.call('Factories.asmx/GetObjectByID', { ObjectType: me.contentType, ID: id, ReferenceName: me.referenceName || '', Mode: opt_modelType }).done(function (model) { \n result = me._handleModel(model, opt_modelType);\n proxyCall.resolve(result);\n }).fail(function (err) {\n proxyCall.reject(err);\n });\n return proxyCall;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Исходя из типа модели возвращает соответсвующий объект\n * @private\n * @method WebAccess.factories.BaseFactory#_handleModel\n * @since 5.0.0.7300\n * @return {Object}\n */\n _handleModel: function (model, opt_modelType) {\n var result;\n if (opt_modelType == MODEL.LINK) { \n var link = new WA.Link(model.ID, this.contentType, this.referenceName || null);\n link.isNew = (!!model.IsNew);\n result = link;\n } else {\n result = new BaseObjectModel(model);\n }\n return result;\n },\n\n // Пусть будет пока, но в справку не лезет\n objectInfo: function(id) {\n return this.getObjectByID(id, 1);\n }\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.BaseFactory = BaseFactory;\n\n})(window.WebAccess.factories);","\"use strict\";\n\n(function (global) {\n\n /**\n * Фабрика записей справочников.\n * Предоставлет инструменты для работы с записями справочников. Например, для открытия справочника, для создания новой записи.\n *\n * @namespace WebAccess.factories.references\n * @property {OBJECT_TYPE} WebAccess.factories.references.contentType Тип содержимого фабрики\n * @throws ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED – заданы не все обязательные параметры.\n * @since 5.0.0.7300\n */\n\n\n /**\n * Параметры создаваемой задачи.\n *\n * @typedef {Object} WebAccess.factories.references.referenceRecordSettings\n * @property {Object} [environmentVars] Тема задачи\n * @property {Object} [paramVars] Текст задачи\n * @property {Object} [ourFirmID] ИД нашей организации\n * @property {boolean} [autoSave] Признак сохранения задачи после ее создания\n * @property {WA.Link} [bindTo] Создание связи с объектом\n * @since 5.0.0.7300\n */\n\n var ReferenceFactory = global.factories.BaseFactory.extend({\n className: \"ReferenceFactory\",\n referenceName: '',\n\n\n contentType: OBJECT_TYPE.REFERENCE_RECORD,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function (referenceName) {\n if (!referenceName) {\n WA.raise('ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED', 'referenceName');\n };\n\n this.referenceName = referenceName;\n this._super(this.contentType);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить задачу по ее ИД.\n *\n * @method WebAccess.factories.tasks.getRecordByID\n * @param {Integer} id ИД карточки задачи\n * @param {MODEL} opt_modelType Тип возвращаемой модели данных\n * @return {deferred} Искомая задача.\n * @since 5.0.0.7300\n */\n getRecordByID: function (id, opt_modelType) {\n return this.getObjectByID(id, opt_modelType);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Формирует объект WebAccess.URL с URL-адресом формы-списка справочника.\n *\n * @method WebAccess.factories.references.toURL\n * @return {WebAccess.URL} URL-адрес справочника.\n *\n * @example Сформировать URL-адрес справочника «Работники».\n * WebAccess.factories.references('РАБ').toURL();\n * @since 5.4.0.1013\n */\n toURL: function() {\n return new WA.URL(\"/ReferenceRecords.aspx?sys=\" + g_SysCode + \"&ext=\" + g_ExtName + \"&mode=RefRecords&compcode=\" + this.referenceName + \"&toolitem=Run\");\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Открыть справочник.\n *\n * @method WebAccess.factories.references.open\n * @return {WebAccess.factories.references} Список записей указанного справочника.\n *\n * @example Открыть список записей справочника «Работники» в проводнике веб-доступа.\n * WebAccess.factories.references('РАБ').open();\n * @since 5.0.0.7300\n */\n open: function () {\n this.toURL().open();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Открывает справочник в модальном окне.\n *\n * @method WebAccess.factories.references.openInModal\n * @return {WebAccess.factories.references} Список записей указанного справочника.\n *\n * @example Открыть справочник «Работники» в модальном окне в режиме множественного выбора.\n * WebAccess.factories.references('РАБ').openInModal({mode: REFERENCE_MODAL_MODE.MULTI});\n * @since 5.4.0.1013\n */\n openInModal: function(settings) {\n var me = this;\n var newSettings = $.extend({}, settings, {\n referenceName: me.referenceName\n });\n WebAccess.components.dialogs.ReferenceGridDialog.createAndShow(newSettings);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создать записи справочника.\n *\n * @method WebAccess.factories.references.createRecord\n * @param {Object | WebAccess.factories.references.referenceRecordSettings} [opt_environmentVars] Перемнные окружения\n * @param {Integer} [opt_ourFirmID] ИД нашей организации\n * @param {Object} [opt_paramVars] Параметры записи справочника\n * @param {MODEL} [opt_modelType] Тип возвращаемой модели данных\n * @since 5.0.0.7300\n *\n * @example Создать новую запись в справочнике «Работники» и затем открыть ее.\n * WebAccess.factories.references(\"РАБ\").createRecord(null, 38838).done(function(record) {\n * record.open();\n * });\n *\n * @example Создать новую запись в справочнике «Работники» и заполнить ее реквизиты.\n * WebAccess.factories.references('РАБ') .createRecord({\n * ourFirmID: 38838,\n * requisites: {\n * 'Примечание': 'Запись, созданная фабрикой'\n * }}).done(function (record) {\n * record.open();\n * });\n */\n createRecord: function (opt_environmentVars, opt_ourFirmID, opt_paramVars, opt_modelType) {\n var me = this;\n var proxyCall = $.Deferred();\n opt_modelType = (!opt_modelType) ? MODEL.FULL : opt_modelType;\n\n var envVars;\n var ourFirmID;\n var paramVars;\n var query = {};\n\n if ($.isPlainObject(opt_environmentVars)) {\n query = opt_environmentVars;\n\n if (opt_environmentVars.hasOwnProperty('environmentVars')) {\n query.envVars = $.toJSON(opt_environmentVars.environmentVars);\n };\n\n if (opt_environmentVars.hasOwnProperty('paramVars')) {\n query.paramVars = $.toJSON(opt_environmentVars.paramVars);\n };\n\n if (opt_environmentVars.hasOwnProperty('requisites')) {\n query.requisites = $.toJSON(opt_environmentVars.requisites);\n };\n\n if (opt_environmentVars.hasOwnProperty('bindTo')) {\n query.bindTo = opt_environmentVars.bindTo.asString();\n }\n\n } else {\n query.envVars = opt_environmentVars;\n query.ourFirmID = opt_ourFirmID;\n query.paramVars = paramVars\n };\n\n WA.SRV.call(\"/Factories.asmx/CreatePreConfiguredRecord\", {\n ReferenceName: this.referenceName,\n Params: query,\n Mode: opt_modelType\n }).done(function (model) {\n proxyCall.resolve(me._handleModel(model, opt_modelType));\n }).fail(function(error) {\n proxyCall.reject(error);\n });\n return proxyCall;\n }\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.references = function (referenceName) {\n return new ReferenceFactory(referenceName);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.WebAccess);","\"use strict\";\r\n\r\n(function (global) {\r\n\r\n /** \r\n * Фабрика сценариев.\r\n * Предоставлет инструменты для работы со сценариями, например, для выполнения сценария.\r\n *\r\n * @namespace WebAccess.factories.scripts\r\n * @property {OBJECT_TYPE} WebAccess.factories.scripts.contentType Тип содержимого фабрики\r\n * @since 5.0.0.7300\r\n */\r\n\r\n var Script = BaseObject.extend({\r\n className: \"ScriptsFactory\",\r\n\r\n contentType: OBJECT_TYPE.SCRIPT,\r\n name: '',\r\n parameters: {},\r\n\r\n init: function (scriptName) {\r\n if (!scriptName) {\r\n WA.raise('ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED', 'scriptName');\r\n };\r\n\r\n this.scriptName = scriptName;\r\n this._super(this.contentType);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Выполнить сценарий.\r\n *\r\n * @method WebAccess.factories.scripts.execute\r\n * @return {Object|WebAccess.components.dialogs.FormDialog} [opt_parameters] Параметры сценария или экземпляр диалога для копирования реквизитов диалога в параметры сценария.\r\n * @return {Deferred} Deferred-объект. \r\n * @since 5.0.0.7300\r\n *\r\n * @example Выполнить сценарий и вывести его результат на консоль отладки.\r\n * WebAccess.factories.scripts(\"WADemoTest\").execute({Note:'Примечание'}).done(function(data) { \r\n * //В data возвращается результат выполнения скрипта. \r\n * //Если этот результат является объектом IsBuilder, то он приводится к типу Models.Link. Примитивные типы остаются без изменений. \r\n * console.log(data)\r\n * });\r\n */\r\n execute: function (opt_parameters) {\r\n var me = this;\r\n me.parameters = opt_parameters || {};\r\n\r\n // Может расширить, сократить или переопределить поля модельки.\r\n var createRequestModel = function (model) {\r\n var requestModel = {};\r\n requestModel.webAccessClientClassName = (model) ? model.className:'';\r\n switch (requestModel.webAccessClientClassName) {\r\n case 'Link':\r\n $.extend(requestModel, {\r\n id: model.id,\r\n type: model.type,\r\n referenceName: model.referenceName || \"\"\r\n });\r\n break;\r\n case 'FormDialog':\r\n var dialog = me.parameters;\r\n $.extend(requestModel, dialog.form.serialize({\r\n onlyValue: true,\r\n useRowNumber: true,\r\n withoutTables: true,\r\n transformMultiReqsToDetailRows: true\r\n }));\r\n break;\r\n default:\r\n requestModel = model;\r\n }\r\n return requestModel;\r\n }\r\n\r\n if (me.parameters && me.parameters.className === 'FormDialog') {\r\n // Копируем реквизиты диалога в параметры сценария.\r\n var dialog = me.parameters;\r\n var serializedForm = createRequestModel(dialog);\r\n return WA.services.script.runWithSerializedForm(me.scriptName, serializedForm);\r\n }\r\n\r\n // Здесь моделька приобраетает вид, который мы сможем распознать на сервере\r\n // В поле webAccessClientClassName передается имя класса КОМ\r\n var requestParams = _.mapObject(me.parameters, function (value) {\r\n return createRequestModel(value);\r\n });\r\n\r\n return WA.services.script.run(me.scriptName, requestParams);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Выполнить сценарий с предварительным показом диалога.\r\n *\r\n * @method WebAccess.factories.scripts.showDialogAndExecute\r\n * @param {String} dialogName Имя диалога.\r\n * @return {Deferred} Результат выполнения сценария.\r\n * @since 5.0.0.1900\r\n *\r\n * @example Выполнить сценарий и вывести его результат на консоль отладки.\r\n * WebAcces.factories.scripts(\"WADemoTest\").showDialogAndExecute('DialogName').done(function(data) { \r\n * console.log(data)\r\n * });\r\n */\r\n showDialogAndExecute: function (dialogName) {\r\n var me = this;\r\n var def = $.Deferred();\r\n if (dialogName) {\r\n // Отображение диалога.\r\n WA.FC.dialogs.getObjectByName(dialogName, MODEL.FULL).done(function (dialog) {\r\n dialog.show();\r\n dialog.bind(WA.CMP.dialogs.FormDialog.EVENT.AFTER_ACTION, function (dialogActionName, result) {\r\n if (dialogActionName === DIALOG_ACTION.OK) {\r\n me.execute(dialog).then(function (res) {\r\n def.resolve(res);\r\n });\r\n }\r\n });\r\n });\r\n } else {\r\n me.execute().then(function (res) {\r\n def.resolve(res);\r\n });\r\n }\r\n return def.promise();\r\n }\r\n });\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n global.factories.scripts = function (scriptName) {\r\n return new Script(scriptName);\r\n };\r\n\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n})(window.WebAccess);","\"use strict\";\n\n(function (global) {\n\n /**\n * Фабрика отчетов.\n * Предоставлет инструменты для работы с отчетами. Например, для формирования аналитического или интегрированного отчета.\n *\n * @namespace WebAccess.factories.reports\n * @property {OBJECT_TYPE} WebAccess.factories.reports.contentType Тип содержимого фабрики\n * @since 5.0.0.7300\n */\n\n var Report = WA.FC.BaseFactory.extend({\n className: \"ReportFactory\",\n contentType: OBJECT_TYPE.REPORT,\n reportName: '',\n\n init: function (reportName) {\n if (!reportName) {\n WA.raise('ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED', 'reportName');\n };\n this.reportName = reportName;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Генерирует отчет\n * @param {Object} [opt_params] параметры отчета\n * @private\n * @method WebAccess.factories.reports.execute\n * @since 5.0.0.7300\n */\n _execute: function (dialog, opt_referenceRecord) {\n var me = this;\n\n if (opt_referenceRecord) {\n dialog.requisites.integratedReportRefereneceRecordId = opt_referenceRecord.id;\n dialog.requisites.integratedReportRefereneceCode = opt_referenceRecord.referenceName;\n }\n\n var proxyCall = $.Deferred();\n\n me.fire(me['class'].EVENT.BEFORE_EXECUTING, me);\n\n WA.SRV.call(\"/Report.asmx/Generate\", { ReportName: me.reportName, SerializedForm: dialog }).done(function (guid) {\n var deprecatedObject = {\n download: function () {\n var url = new WA.URL('/download.ashx');\n url.setParam('accesstype', 'private');\n url.setParam('id', guid);\n url.setParam('name', me.reportName);\n url.open();\n },\n\n openByAgent: function () {\n RequestToken(TOKEN_OPERATION.DOWNLOAD_DOCUMENT_BODY, function (token) {\n var requestParams = {\n id: guid,\n Token: token,\n Repository: \"FileSystem\",\n DownloadTool: \"Handler\",\n loc: document.location.host,\n secure: (document.location.protocol == 'http:' ? 'n' : 'y'),\n name: me.reportName\n };\n WA.agent.transmitRequest(\"opendocument\", \"edmsplugin\", requestParams).fail(function (response) {\n ShowError(response.message);\n });\n });\n },\n\n open: function () {\n var self = this;\n if (WA.agent.isAvailable()) {\n WA.agent.isPluginAvailable(\"edmsplugin\").always(function (isAvailableResponse) {\n\n if (isAvailableResponse) {\n self.openByAgent();\n } else {\n self.download();\n }\n });\n } else {\n self.download();\n }\n }\n };\n\n proxyCall.resolve(deprecatedObject);\n }).fail(function (ex) {\n if (!ex) ex = L('ERROR_WHILE_GENERATING_REPORT');\n\n proxyCall.reject(ex);\n });\n\n return proxyCall;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сформировать отчет.\n *\n * @method WebAccess.factories.reports.execute\n * @param {Object|WebAccess.components.dialogs.FormDialog} [opt_params] Параметры отчета или экземпляр диалога для копирования реквизитов диалога в параметры сценария.\n * @return {deferred} Специальный deferred-объект.\n * @since 5.0.0.7300\n *\n * @example Запустить отчет и открыть его в новом окне.\n * WebAccess.factories.reports(\"WATestTest\").execute({Работник: 123213}).done(function(report) {\n * report.open();\n * });\n */\n execute: function (opt_params) {\n return this._execute(this._getParams(opt_params));\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сформировать интегрированный отчет.\n *\n * @method WebAccess.factories.reports.executeIntegrated\n * @param {WA.Link} [referenceRecord] Ссылка на объект записи справочника\n * @param {Object|WebAccess.components.dialogs.FormDialog} [opt_params] Параметры отчета или экземпляр диалога для копирования реквизитов диалога в параметры сценария.\n * @return {deferred} Специальный deferred-объект.\n * @since 5.0.0.7300\n *\n * @example Запустить интегрированный отчет «Использование записи справочника» из справочника «Поручения по РКК».\n * var referenceRecord = new WA.Link(132632,OBJECT_TYPE.REFERENCE_RECORD, 'RRCAssignments');\n * WebAccess.factories.reports('Использование записи справочника').executeIntegrated(referenceRecord).done(function(report) {\n * report.open();\n * }).fail(function(error) {\n * alert(error);\n * });\n */\n executeIntegrated: function (referenceRecord, opt_params) {\n if (!!referenceRecord\n && referenceRecord.className == 'Link'\n && referenceRecord.type === OBJECT_TYPE.REFERENCE_RECORD) {\n\n return this._execute(this._getParams(opt_params), referenceRecord);\n } else {\n WA.raise('ERROR_INVALID_PARAMETER', referenceRecord);\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сформировать отчет с предварительным показом диалога.\n *\n * @method WebAccess.factories.reports.showDialogAndExecute\n * @param {String} [dialogName] Имя диалога.\n * @return {deferred} Специальный deferred-объект.\n * @since 5.0.0.1900\n *\n * @example Запустить отчет и открыть его в новом окне.\n * WebAccess.factories.reports(\"WATestTest\").execute('DialogName').done(function(report) {\n * report.open();\n * });\n */\n showDialogAndExecute: function (dialogName, opt_isModal) {\n var me = this;\n var def = $.Deferred();\n me._showDialog(dialogName, opt_isModal).done(function (dialog) {\n me.execute(dialog).done(function (report) {\n def.resolve(report);\n }).fail(function (error) {\n def.reject(error);\n });\n }).fail(function () {\n def.reject(DIALOG_ACTION.CANCEL);\n });\n return def.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сформировать интегрированный отчет.\n *\n * @method WebAccess.factories.reports.showDialogAndExecuteIntegrated\n * @param {WA.Link} [referenceRecord] Ссылка на объект записи справочника.\n * @param {String} [dialogName] Имя диалога.\n * @return {deferred} Специальный deferred-объект.\n * @since 5.0.0.1900\n *\n * @example Запустить интегрированный отчет «Использование записи справочника» из справочника «Поручения по РКК».\n * var referenceRecord = new WA.Link(132632,OBJECT_TYPE.REFERENCE_RECORD, 'RRCAssignments');\n * WebAccess.factories.reports('Использование записи справочника').showDialogAndExecuteIntegrated(referenceRecord, 'DialogName').done(function(report) {\n * report.open();\n * }).fail(function(error) {\n * alert(error);\n * });\n */\n showDialogAndExecuteIntegrated: function (referenceRecord, dialogName, opt_isModal) {\n var me = this;\n var def = $.Deferred();\n me._showDialog(dialogName, opt_isModal).done(function (dialog) {\n me.executeIntegrated(referenceRecord, dialog).done(function (report) {\n def.resolve(report);\n }).fail(function (error) {\n def.reject(error);\n });\n }).fail(function () {\n def.reject(DIALOG_ACTION.CANCEL);\n });\n return def.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отображает диалог.\n *\n * @method WebAccess.factories.reports._showDialog\n * @private\n * @since 5.0.0.1900\n */\n _showDialog: function (dialogName, opt_isModal) {\n var def = $.Deferred();\n var me = this;\n\n if (dialogName) {\n // Отображение диалога.\n WA.FC.dialogs.getObjectByName(dialogName, MODEL.FULL).done(function (dialog) {\n if (opt_isModal === false)\n dialog.modal = false;\n\n dialog.show();\n dialog.setTitle(L('REPORT_ASKABLE_PARAMS'));\n\n dialog.bind(WA.CMP.dialogs.FormDialog.EVENT.AFTER_ACTION, function (dialogActionName, result) {\n if (dialogActionName === DIALOG_ACTION.OK) {\n def.resolve(dialog);\n } else {\n me.fire(me['class'].EVENT.ABORT_FILLING_PARAMS, me);\n }\n });\n });\n } else {\n def.resolve(null);\n }\n return def.promise();\n },\n\n /**\n * Сформировать отчет с предварительным запросом параметров.\n *\n * @method WebAccess.factories.reports.queryParamsAndExecute\n * @param {Object|WebAccess.components.dialogs.FormDialog} [opt_params] Параметры отчета или экземпляр диалога для копирования реквизитов диалога в параметры сценария.\n * @return {deferred} Специальный deferred-объект.\n * @since 5.2.0.1931-beta\n */\n queryParamsAndExecute: function (opt_isModal) {\n var me = this;\n var def = $.Deferred();\n\n me._queryParams(null, opt_isModal).done(function (dialog) {\n me._execute(dialog).done(function (report) {\n def.resolve(report);\n }).fail(function (ex) {\n def.reject(ex);\n });\n }).fail(function (ex) {\n def.reject(ex);\n });\n\n return def.promise();\n },\n\n /**\n * Сформировать интегрированный отчет с предварительным запросом параметров.\n *\n * @method WebAccess.factories.reports.queryParamsAndExecuteIntegrated\n * @param {WA.Link} [referenceRecord] Ссылка на объект записи справочника.\n * @param {Object|WebAccess.components.dialogs.FormDialog} [opt_params] Параметры отчета или экземпляр диалога для копирования реквизитов диалога в параметры сценария.\n * @return {deferred} Специальный deferred-объект.\n * @since 5.2.0.1931-beta\n */\n queryParamsAndExecuteIntegrated: function (referenceRecord, opt_isModal) {\n if (!!referenceRecord\n && referenceRecord.className === 'Link'\n && referenceRecord.type === OBJECT_TYPE.REFERENCE_RECORD) {\n\n var me = this;\n var def = $.Deferred();\n\n me._queryParams(referenceRecord, opt_isModal).done(function (dialog) {\n me._execute(dialog, referenceRecord).done(function (report) {\n def.resolve(report);\n }).fail(function (ex) {\n def.reject(ex);\n });\n }).fail(function (ex) {\n def.reject(ex);\n });\n\n return def.promise();\n } else {\n WA.raise('ERROR_INVALID_PARAMETER', referenceRecord);\n return null;\n };\n },\n\n /**\n * Заполнить параметры в соответствии с настройками веб-модуля (из даилога, из xml).\n * @return {Deferred} Специальный deferred-объект.\n * @since 5.2.0.1931-beta\n */\n _queryParams: function (opt_referenceRecord, opt_isModal) {\n var def = $.Deferred();\n var me = this;\n\n WA.SRV.call(\"/report.asmx/GetReportDialogName\", { ReportName: me.reportName }).done(function (res) {\n if (res && res.length > 0) {\n me._showDialog(res, opt_isModal).done(function (dialog) {\n def.resolve(me._getParams(dialog));\n }).fail(function (ex) {\n def.reject(ex);\n });\n } else {\n me._queryParamsFromXml(opt_referenceRecord, opt_isModal).done(function (dialog) {\n def.resolve(me._getParams(dialog));\n }).fail(function (ex) {\n def.reject(ex);\n });\n }\n }).fail(function (ex) {\n def.reject(ex);\n });\n\n return def.promise();\n },\n\n /**\n * Заполнить параметры из xml.\n * @return {Deferred} Специальный deferred-объект.\n * @since 5.2.0.1931-beta\n */\n _queryParamsFromXml: function (opt_referenceRecord, opt_isModal) {\n var def = $.Deferred();\n var me = this;\n var params = { name: this.reportName };\n\n if (opt_referenceRecord) {\n params.id = opt_referenceRecord.id;\n params.refcode = opt_referenceRecord.referenceName;\n }\n\n // На сервере строится разметка модалки со всеми нужными параметрам.\n WA.SRV.call(\"/ModalWindow.asmx/Create\", {\n ControlName: 'report_params',\n Params: $.toJSON(params)\n }).done(function (res) {\n\n // Если параметров нет то в классе ReportParams.vb не передается контрол с ИД ReportParamsModalWindow.\n if ($(res.html).find('#ReportParamsModalWindow').length > 0) {\n var dialog = new WA.components.dialogs.ReportParamsDialog({}, {\n FormHtml: res.html,\n // ModalWindow возвращает модалки для многих объектов, а не только для отчетов, а возвращает он объек состоящий из 2 свойств\n // html и initJs. Html нам подходит, а вот в initJs напихано много всего ненужного и он строка, поэтому мы просто добавляем туда нужную\n // нам информаию (описание всех реквизитов) после ключа 'FormData:' и обрезаем строку.\n FormData: res.initJs.substring(res.initJs.indexOf('FormData:') + 9)\n });\n\n if (opt_isModal === false)\n dialog.modal = false;\n\n // Если закрыли модалку не по ОК то просто ничего не делаем.\n dialog.bind(dialog['class'].EVENT.AFTER_CLOSE_BY_OK, function () {\n dialog.validateForm();\n def.resolve(dialog);\n });\n\n dialog.bind(dialog['class'].EVENT.AFTER_CLOSE_BY_CANCEL, function () {\n me.fire(me['class'].EVENT.ABORT_FILLING_PARAMS, me);\n });\n\n dialog.show();\n } else {\n def.resolve(null);\n }\n }).fail(function (res) {\n def.reject(res);\n });\n\n return def.promise();\n },\n\n /**\n * Парсит параметры диалога.\n * @returns {} Сериализованная форма диалога.\n * @since 5.2.0.1931-beta\n */\n _getParams: function (params) {\n var serializeForm = { tables: {}, requisites: {}, details: {} };\n\n if (params) {\n if (params.className === 'FormDialog' || params.className === 'ReportParamsDialog') {\n\n serializeForm = params.form.serialize({\n onlyValue: true,\n useRowNumber: true,\n withoutTables: true,\n transformMultiReqsToDetailRows: true\n });\n } else {\n for (var param in params) {\n serializeForm.requisites[param] = params[param];\n }\n }\n }\n\n return serializeForm;\n }\n }, {\n EVENT: {\n /**\n * Срабатывает перед началом генерации отчета.\n * @event Core.report.EVENT.BEFORE_EXECUTING\n * @since 5.2.0.1931-beta\n */\n BEFORE_EXECUTING: 'beforeExecuting',\n\n /**\n * Срабатывает при нажатии кнопки \"Отмена\" в окне запрашиваемых параметров.\n * @event Core.report.EVENT.ABORT_FILLING_PARAMS\n * @since 5.2.0.1934-beta\n */\n ABORT_FILLING_PARAMS: 'abortFillingParams'\n }\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n global.factories.reports = function (reportName) {\n return new Report(reportName);\n };\n\n global.factories.reports.getReportByName = function (reportName) {\n WA.raise('NOT_IMPLEMENTED');\n return $.Deferred;\n };\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.WebAccess);","\"use strict\";\n\n(function (global) {\n\n\n /** \n * Фабрика папок.\n * Предоставлет инструменты для работы с папками. Например, для создания новой папки, для поиска требуемой папки по ее ИД.\n *\n * @namespace WebAccess.factories.folders\n * @property {OBJECT_TYPE} WebAccess.factories.folders.contentType Тип содержимого фабрики\n * @since 5.0.0.7300\n */\n\n var FoldersFactory = global.factories.BaseFactory.extend({\n className: \"FoldersFactory\",\n\n contentType: OBJECT_TYPE.FOLDER,\n\n init: function () {\n this._super(this.contentType);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверить, являетя ли указаная папка корневой.\n *\n * @method WebAccess.factories.folders.isRootFolder\n * @param {Integer} folderID ИД папки\n * @return {Boolean} True – папка является корневой, иначе False.\n * @since 5.1.0.1523\n */\n isRootFolder: function(folderID) {\n return (!isNaN(folderID) && (folderID == InboxFolderID || folderID == OutboxFolderID || folderID == FavoritesFolderID || folderID == CommonFolderID));\n },\n\n /**\n * Получить ИД предопределенной папки.\n *\n * @method WebAccess.factories.folders.getRootFolderID\n * @param {FOLDER_TYPE} folderType Тип папки\n * @return {Deferred} ИД папки.\n * @since 5.0.0.7300\n *\n * @example Получить ИД предопределенной папки «Избранное» текущего пользователя\n * var favoritesId = WebAccess.factories.folders.getRootFolderID(FOLDER_TYPE.FAVORITES);\n */\n getRootFolderID: function (folderType) {\n switch (folderType) {\n case FOLDER_TYPE.INBOX:\n return InboxFolderID;\n break;\n case FOLDER_TYPE.OUTBOX:\n return OutboxFolderID;\n break;\n case FOLDER_TYPE.FAVORITES:\n return FavoritesFolderID;\n break;\n case FOLDER_TYPE.COMMON_FOLDER:\n return CommonFolderID;\n break;\n default:\n return null;\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить папку по ее ИД.\n *\n * @method WebAccess.factories.folders.getFolderByID\n * @param {Integer} id ИД папки\n * @param {MODEL} opt_modelType Тип возвращаемой модели данных\n * @return {deferred} Искомая папка.\n * @since 5.0.0.7300\n *\n * @example Проверить, что папка существует.\n * WebAccess.factories.folders.getFolderByID().done(function(folder) {\n\t * console.log('Папка существует')\n * }).fail(function(error) {\n * console.log('Не удалось найти папку с указанным id');\n\t * console.log(error); \n * });\n */\n getFolderByID: function (id, opt_modelType) {\n return this.getObjectByID(id, opt_modelType);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создать новую папку.\n * \n * @method WebAccess.factories.folders.createFolder\n * @param {FOLDER_CONTENT_TYPE} contentType Тип содержимого папки\n * @param {String} [opt_name] Наименование папки\n * @param {MODEL} opt_modelType Тип возвращаемой модели данных\n * @throws ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED – заданы не все обязательные параметры.\n * @return {Deferred} Специальный deferred-объект.\n *\n * @example Создать папку и открыть ее карточку.\n * WA.FC.folders.сreateFolder(FOLDER_CONTENT_TYPE.ANY, 'FolderName').done(function(folder) { \n * folder.open();\n * });\n *\n * @example Создать, настроить и сохранить папку. Сохраненная папка откроется в проводнике веб-доступа.\n * WA.FC.folders.сreateFolder({\n * contentType: FOLDER_CONTENT_TYPE.ANY,\n * name: 'Новая папка',\n * autoSave: true \n * }).done(function(folder) { \n * folder.open();\n * });\n */\n createFolder: function (contentType, opt_name, opt_modelType) {\n var me = this;\n var proxyCall = $.Deferred();\n opt_modelType = (!opt_modelType) ? MODEL.FULL : opt_modelType;\n\n var query = {};\n\n if ($.isPlainObject(contentType)) {\n query = contentType;\n\n if (contentType.hasOwnProperty('requisites')) {\n query.requisites = $.toJSON(contentType.requisites);\n };\n\n if (contentType.hasOwnProperty('bindTo')) {\n query.bindTo = contentType.bindTo.asString();\n }\n\n } else {\n if (contentType < 0) {\n WA.raise('ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED');\n }\n query.contentType = contentType;\n query.name = opt_name || null;\n };\n\n WA.SRV.call(\"/Factories.asmx/CreatePreConfiguredFolder\", {\n Params: query,\n Mode: opt_modelType\n }).done(function (model) {\n proxyCall.resolve(me._handleModel(model, opt_modelType));\n }).fail(function (error) {\n proxyCall.reject(error);\n });;\n\n return proxyCall;\n }\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.folders = new FoldersFactory();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.WebAccess);","\"use strict\";\n(function (global) {\n\n/**\n * Фабрика задач.\n * Предоставлет инструменты для работы с задачами. Например, для создания новой задачи, поиска требуемой задачи.\n *\n * @namespace WebAccess.factories.tasks\n * @since 5.0.0.7300\n */\n\n /**\n * Параметры создаваемой задачи.\n *\n * @typedef {Object} WebAccess.factories.tasks.taskSettings\n * @property {String} [subject] Тема задачи\n * @property {String} [activeText] Текст задачи \n * @property {Date} [deadline] Срок выполнения\n * @property {WA.Link} [parent] Родительский деловой процесс, например, главная задача или подзадача\n * @property {Array} [attachments] Список вложений\n * @property {JOB_KIND} [jobsKind] Тип заданий\n * @property {Array} [route] Список ИД исполнителей\n * @property {Array} [observers] Список ИД наблюдателей \n * @property {WORK_ACCESS_TYPE} [accessType] Тип доступа к деловому процессу\n * @property {WA.Link} [bindTo] Создание связи с объектом\n * @property {boolean} [autoSave] Сохранение задачи после ее создания\n * @property {boolean} [autoStart] Стартовать задачу после ее создания\n * @since 5.0.0.7300\n */\n\n var TasksFactory = global.factories.BaseFactory.extend({\n className: \"TasksFactory\",\n contentType: OBJECT_TYPE.TASK,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n init: function () {\n this._super(this.contentType);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n /**\n * Получить задачу по ее ИД.\n *\n * @method WebAccess.factories.tasks.getTaskByID\n * @param {Integer} id ИД задачи\n * @param {MODEL} [opt_modelType] Тип возвращаемой модели данных\n * @return {deferred} Искомая задача.\n * @since 5.0.0.7300\n */\n getTaskByID: function (id, opt_modelType) {\n return this.getObjectByID(id, opt_modelType);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создать новую задачу.\n *\n * @method WebAccess.factories.tasks.createTask\n * @param {integer|Link|BaseObjectModel|TaskModel|JobModel|taskSetting} opt_parent Родительский деловой процесс, например, главная задача или подзадача \n * @param {MODEL} [opt_modelType] Тип возвращаемой модели данных\n * @return {deferred} Новая задача. \n * \n * либо как подзадача указанного делового процесса. \n * @since 5.0.0.7300\n *\n * @example\n * // Создать новую задачу.\n * WA.FC.tasks.createTask().done(function (task) {\n * task.open()\n * });\n *\n * @example\n * // Создать новую задачу и указать для нее родительскую задачу.\n * WA.FC.tasks.createTask(2189).done(function (task) {\n * task.open()\n * });\n *\n * @example\n * // Создать подзадачу из задачи.\n * WA.FC.tasks.createTask(new WA.Link(2189, OBJECT_TYPE.TASK)).done(function (task) {\n * task.open()\n * });\n *\n * @example\n * // Создать подзадачу из задания.\n * WA.FC.tasks.createTask(new WA.Link(65, OBJECT_TYPE.JOB)).done(function (task) {\n * task.open()\n * });\n *\n * @example\n * // Создать родительское задание и заполнить его параметры.\n * var taskSettings = {\n * subject: 'Задача, созданная фабрикой',\n * activeText: 'Текст задачи',\n * parent: new WA.Link(65, OBJECT_TYPE.JOB),\n * attachments: [new WA.Link(65, OBJECT_TYPE.JOB)],\n * route: [133311,132970],\n * observers: [133311],\n * accessType: WORK_ACCESS_TYPE.PARTICIPANTS,\n * autoSave: true,\n * autoStart: true\n * };\n *\n * WA.FC.tasks.createTask(taskSettings).done(function (task) {\n * task.open()\n * }); \n */\n createTask: function (opt_parent, opt_modelType) {\n var me = this;\n var params = {};\n var parentLink;\n opt_parent = opt_parent || 0; \n\n var proxyCall = $.Deferred();\n opt_modelType = (!opt_modelType) ? MODEL.FULL : opt_modelType;\n if ($.isPlainObject(opt_parent)) {\n params = opt_parent;\n if (opt_parent.hasOwnProperty('parent')) {\n params.parent = opt_parent.parent.asString();\n }\n\n if (opt_parent.hasOwnProperty('deadLine')) {\n params.deadLine = $.toJSON(opt_parent.deadLine)\n }\n\n if (opt_parent.hasOwnProperty('attachments')) {\n for (var i = 0; i < opt_parent.attachments.length; i++) {\n opt_parent.attachments[i] = opt_parent.attachments[i].toLinkModel();\n }\n params.attachments = $.toJSON(opt_parent.attachments);\n } \n } else {\n if (typeof opt_parent !== 'object' && !isNaN(opt_parent) && opt_parent > 0) {\n parentLink = new WA.Link(opt_parent, me.contentType);\n } else if (typeof opt_parent === 'object' && opt_parent.className === 'Link') {\n parentLink = opt_parent;\n } else if (typeof opt_parent === 'object' && !!opt_parent.className) {\n //Базовых объектов пока не очень существует, ничего нельзя гарантировать\n WA.raise('NOT_IMPLEMENTED_EXCEPTION')\n };\n\n if (!!parentLink) {\n params.parent = parentLink.asString();\n };\n };\n\n WA.SRV.call(\"/Factories.asmx/CreatePreConfiguredTask\", { Params: params, Mode: opt_modelType }).done(function (model) {\n proxyCall.resolve(me._handleModel(model, opt_modelType));\n }).fail(function (error) {\n proxyCall.reject(error);\n });\n return proxyCall;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \n\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.tasks = new TasksFactory();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.WebAccess);\n","\"use strict\";\n\n(function (global) {\n \n /** \n * Фабрика заданий.\n * Предоставлет инструменты для работы с заданиями.\n *\n * @namespace WebAccess.factories.jobs\n * @property {OBJECT_TYPE} WebAccess.factories.jobs.contentType Тип содержимого фабрики\n * @since 5.0.0.7300\n */\n\n var JobsFactory = global.factories.BaseFactory.extend({\n className: \"JobsFactory\",\n\n contentType: OBJECT_TYPE.JOB,\n\n init: function () {\n this._super(this.contentType);\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.factories.jobs = new JobsFactory();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n})(window.WebAccess);","\"use strict\";\n\n(function (global) {\n\n /** \n * Фабрика прикладных диалогов.\n *\n * @namespace WebAccess.factories.dialogs\n * @property {OBJECT_TYPE} WebAccess.factories.dialogs.contentType Тип содержимого фабрики\n * @since 5.2.0.1600\n * @example\n * WebAccess.factories.dialogs.getDialogByName('Actions', MODEL.FULL).done(function(dialog) {\n * dialog.show();\n * dialog.Init.done(function() { \n * dialog.form.requisites['Строка'].setValue('Произвольное значение').disable();\n * dialog.form.controls.tables['CTXGrid1'].addRow();\n * });\n * dialog.bind(WA.CMP.dialogs.FormDialog.EVENT.AFTER_ACTION, function(actionName, result) {\n * console.log(actionName, result)\n * return false; //Возвращая false мы запрещаем даилогу закрываться.\n * }); \n * });\n */\n\n var DialogsFactory = WA.FC.BaseFactory.extend({\n className: \"DialogsFactory\",\n //---------------------------------------------------------------------// \n\n /**\n * Получить диалог по ИД.\n *\n * @method WebAccess.factories.dialogs.getObjectByID\n * @param {Integer} id ИД объекта\n * @param {MODEL} [opt_modelType] тип модели (по умолчанию MODEL.LINK)\n * @since 5.2.0.1600\n * @return {Deferred} Специальный deferred-объект.\n */\n getObjectByID: function (id, opt_modelType) {\n if (isNaN(id)) WA.raise('ERR_AN_INVALID_PARAMETER_WAS_PASSED_TO_FUNCTION', id);\n return this._getObjectBy('ID', id, opt_modelType);\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить диалог по имени.\n *\n * @method WebAccess.factories.dialogs.getObjectByName\n * @param {String} name имя объекта\n * @param {MODEL} [opt_modelType] тип модели (по умолчанию MODEL.LINK)\n * @since 5.2.0.1600\n * @return {Deferred} Специальный deferred-объект.\n */\n getObjectByName: function (name, opt_modelType) {\n if (!_.isString(name)) WA.raise('ERR_AN_INVALID_PARAMETER_WAS_PASSED_TO_FUNCTION', name);\n return this._getObjectBy('Name', name, opt_modelType);\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получение диалог по ИД в кэше.\n *\n * @method WebAccess.factories.dialogs.getObjectByInstanceID\n * @param {String} instanceID ИД диалога.\n * @param {MODEL} [opt_modelType] тип модели (по умолчанию MODEL.LINK)\n * @since 5.2.0.1600\n * @return {Deferred} Специальный deferred-объект.\n */\n getObjectByInstanceID: function (instanceID, opt_modelType) {\n return this._getObjectBy('InstanceID', instanceID, opt_modelType);\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить диалога по ИД.\n *\n * @method WebAccess.factories.dialogs.getDialogByID\n * @param {Integer} id ИД объекта\n * @param {MODEL} [opt_modelType] тип модели (по умолчанию MODEL.LINK)\n * @since 5.2.0.1600\n * @return {Deferred} Специальный deferred-объект.\n */\n getDialogByID: function (id, opt_modelType) {\n return this.getObjectByID.apply(this, arguments);\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить диалога по имени.\n *\n * @method WebAccess.factories.dialogs.getDialogByName\n * @param {String} name имя объекта\n * @param {MODEL} [opt_modelType] тип модели (по умолчанию MODEL.LINK)\n * @since 5.2.0.1600\n * @return {Deferred} Специальный deferred-объект.\n */\n getDialogByName: function (name, opt_modelType) {\n return this.getObjectByName.apply(this, arguments);\n },\n //---------------------------------------------------------------------//\n\n\n /**\n * Получение диалога по ИД в кэше.\n *\n * @method WebAccess.factories.dialogs.getDialogByInstanceID\n * @param {String} instanceID ИД диалога.\n * @param {MODEL} [opt_modelType] тип модели (по умолчанию MODEL.LINK)\n * @since 5.2.0.1600\n * @return {Deferred} Специальный deferred-объект.\n */\n getDialogByInstanceID: function (instanceID, opt_modelType) {\n return this.getObjectByInstanceID.apply(this, arguments);\n },\n //---------------------------------------------------------------------//\n\n /**\n * Исходя из типа модели возвращает соответствующий объект\n * @param {object} model модель объекта\n * @param {MODEL} [opt_modelType] тип модели (по умолчанию MODEL.LINK)\n * @method WebAccess.factories.dialogs._handleModel\n * @private\n * @since 5.2.0.1600\n * @return {Object}\n */\n _handleModel: function (model, opt_modelType) {\n var me = this;\n\n var result;\n if (opt_modelType === MODEL.LINK) {\n var link = new WA.Link(model.ID, this.contentType, this.referenceName || null);\n link.isNew = (!!model.IsNew);\n result = link;\n } else {\n result = new WA.CMP.dialogs.FormDialog({}, model);\n }\n return result;\n },\n //---------------------------------------------------------------------//\n\n /**\n * Получить объект по указанному атрибуту\n * @param {String} attrName имя атрибута\n * @param {attrValue} attrValue значение атрибута\n * @param {MODEL} [opt_modelType] тип модели (по умолчанию MODEL.LINK)\n * @method WebAccess.factories.dialogs._getObjectBy\n * @private\n * @since 5.2.0.1600\n * @return {Deferred} Специальный deferred-объект.\n */\n _getObjectBy: function (attrName, attrValue, opt_modelType) { \n var me = this;\n opt_modelType = (!opt_modelType) ? MODEL.FULL : opt_modelType;\n \n var proxyCall = $.Deferred();\n\n var result;\n var query = { ObjectType: me.contentType, ReferenceName: me.referenceName || '', Mode: opt_modelType };\n query[attrName] = attrValue\n\n WA.SRV.call('Dialogs.asmx/GetObjectBy' + attrName, query).done(function (model) {\n result = me._handleModel(model, opt_modelType);\n proxyCall.resolve(result);\n }).fail(function (err) {\n proxyCall.reject(err);\n });\n return proxyCall;\n }\n //---------------------------------------------------------------------//\n\n });\n //-----------------------------------------------------------------------//\n\n\n global.factories.dialogs = new DialogsFactory(OBJECT_TYPE.DIALOG);\n\n})(window.WebAccess);","\"use strict\";\n\n\n(function (global) {\n \n /** \n * Фабрика документов.\n * Предоставлет инструменты для работы с документами. Например, для создания документа из шаблона.\n *\n * @namespace WebAccess.factories.eDocuments\n * @property {OBJECT_TYPE} WebAccess.factories.eDocuments.contentType Тип содержимого фабрики\n * @since 5.0.0.7300\n */\n\n var EDocumentsFactory = global.factories.BaseFactory.extend({\n className: \"EDocumentsFactory\",\n\n contentType: OBJECT_TYPE.EDOCUMENT,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function () {\n this._super(this.contentType);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /** \n * Получить документ по его ИД.\n * Если документ не существует, будет вызван метод fail.\n *\n * @method WebAccess.factories.eDocuments.getDocumentByID \n * @param {Integer} id ИД документа\n * @param {MODEL} [opt_modelType] Тип возвращаемой модели данных\n * @return {Deferred} Искомый документ.\n * @since 5.0.0.7300\n *\n * @example Проверить, что документ существует, и получить его реквизиты.\n * WebAccess.factories.eDocuments.getDocumentByID().done(function(document) {\n\t * console.log('Документ существует')\n * }).fail(function(error) {\n * console.log('Не удалось найти документ с указанным id');\n\t * console.log(error); \n * });\n */\n getDocumentByID: function (id, opt_modelType) {\n return this.getObjectByID(id, opt_modelType);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Создать документ из шаблона.\n *\n * @method WebAccess.factories.eDocuments.createNewFromTemplate\n * @param {String} typeCode Код типа карточки документа\n * @param {String} kindCode Код вида документа\n * @param {TemplateCode} Код шаблона\n * @since 5.0.0.7300\n *\n * @example Создать документ из шаблона.\n * WebAccess.factories.eDocuments.createNewFromTemplate('ПКО', 'Г000034', 'Д000019').done(function(document) {\n * document.open()\n * });\n *\n * @example Создать документ из шаблона, предварительно заполнив реквизиты документа.\n * WebAccess.factories.eDocuments.createNewFromTemplate({\n * typeCode: 'ПКО',\n * kindCode: 'Г000034',\n * templateCode: 'Д000019',\n * requisites: {\n * 'ISBEDocName': 'Новый', \n * 'Дополнение3': 'Тема'\n * },\n * bindTo: new WA.Link(133475, OBJECT_TYPE.EDOCUMENT),\n * pasteToFolder: \"-1\", // Если указан неизвестный ИД папки, документ будет перемещен в предопределенную папку «Избранное».\n * autoSave: true, \n * }).done(function(document) {\n * document.open()\n * });\n */\n createNewFromTemplate: function (typeCode, kindCode, templateCode, opt_modelType) {\n var me = this;\n var params = {};\n var proxyCall = $.Deferred(); \n opt_modelType = (!opt_modelType) ? MODEL.FULL : opt_modelType;\n\n if ($.isPlainObject(typeCode)) {\n params = typeCode;\n\n if (typeCode.hasOwnProperty('requisites')) {\n params.requisites = $.toJSON(typeCode.requisites);\n }\n if (typeCode.hasOwnProperty('bindTo')) {\n params.bindTo = typeCode.bindTo.asString();\n }\n } else {\n if (arguments.length < 3) {\n WA.raise('ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED');\n }\n params = {\n typeCode: typeCode,\n kindCode: kindCode,\n templateCode: templateCode\n };\n };\n\n WA.SRV.call(\"/Factories.asmx/CreatePreConfiguredEDocumentFromTemplate\", {\n Params: params,\n Mode: opt_modelType\n }).done(function (model) {\n proxyCall.resolve(me._handleModel(model, opt_modelType));\n }).fail(function (error) {\n proxyCall.reject(error);\n });;\n return proxyCall;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n });\n\n\n global.factories.eDocuments = new EDocumentsFactory();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n \n})(window.WebAccess);","\"use strict\";\n\n/**\n * Предоставляет инструменты для работы с прикладными константами. \n *\n * @namespace WebAccess.isbuilder\n * @since 5.5.0.5500\n */\n(function (global) {\n /**\n * Предоставляет информацию о значений общих констант и констант нашей организации.\n *\n * @namespace WebAccess.isbuilder\n * @since 5.0.0.5500\n\n * @example\n * var sharedConstValue = WA.isbuilder.constants[\"CMAgreementStandardRoute\"];\n * var sharedConstValue = WA.isbuilder.constants.CMAgreementStandardRoute;\n * var ourFirmConstValue = WA.isbuilder.constants.getOurFirmConstant(38838, \"RMArchiveChiefCode\");\n */\n var DomainConstants = BaseObject.extend({ \n _ourFirmsConstants: {},\n\n init: function () {\n $.extend(this, g_SharedPublicConstants);\n this._ourFirmsConstants = g_OurFirmsPublicConstants;\n },\n\n /**\n * Возврщает значение константы нашей организации.\n *\n * @method WebAccess.isbuilder.constants.getOurFirmConstant\n * @param {integer} firmId ИД нашей организации\n * @param {string} name наименование константы\n * @return {string} Значение константы.\n * @since 5.5.0.5500\n */\n getOurFirmConstant: function (firmId, name) {\n var constants = this._ourFirmsConstants[firmId];\n if (constants)\n return constants[name];\n return null;\n }\n });\n\n global.constants = new DomainConstants();\n})(window.WebAccess.isbuilder);\n","\"use strict\";\n(function (global) {\r\n /**\r\n * Произвольный парамер прикладного метода.\r\n * \r\n * @class WA.domainMethods.VariantParameter\r\n * @since 5.5.0.1000\r\n */\r\n var VariantParameter = Class.extend({\r\n className: 'VariantParameter',\n\n init: function (value, type, opt_name) {\r\n this.value = value;\n this.type = type;\n this.name = opt_name || \"\";\n return this;\r\n }\r\n });\n\n global.VariantParameter = VariantParameter;\n})(window.WebAccess.domainMethods);","\"use strict\";\n(function (global) {\r\n /**\r\n * Фабрика параметров прикладного метода.\r\n * \r\n * @private \r\n * @class WA.domainMethods.VariantParameterFactory\r\n * @since 5.5.0.1000\r\n */\n var VariantParameterFactory = Class.extend({\r\n className: \"VariantParameterFactory\",\n\n /**\n * Создает параметр прикладного метода.\n * @param {object} parameter \n * @returns {WA.VariantParameter} \n */\n сreateVariantParameter: function (parameter) {\r\n switch (typeof parameter) {\r\n case \"number\":\n return this.сreateVariantParameterFromNumber(parameter);\n case \"boolean\":\n return this.сreateVariantParameterFromBoolean(parameter);\n case \"string\":\n return this.сreateVariantParameterFromString(parameter);\n case \"object\":\n return this.сreateVariantParameterFromObject(parameter);\n default:\n throw new Error(\"Unknown type of parameter.\");\r\n }\r\n },\n\n /**\n * Создает параметр прикладного метода из числа.\n * @param {number} number \n * @returns {WA.VariantParameter} \n */\n сreateVariantParameterFromNumber: function (number) {\r\n return new global.VariantParameter(number, VARIANT_TYPE.SINGLE, \"\");\r\n },\n\n /**\n * Создает параметр прикладного метода из логического типа.\n * @param {boolean} boolean \n * @returns {WA.VariantParameter} \n */\n сreateVariantParameterFromBoolean: function (boolean) {\r\n return new global.VariantParameter(boolean, VARIANT_TYPE.BOOLEAN, \"\");\r\n },\n\n /**\n * Создает параметр прикладного метода из даты.\n * @param {Date} date \n * @returns {WA.VariantParameter} \n */\n сreateVariantParameterFromDate: function (date) {\r\n return new global.VariantParameter(date, VARIANT_TYPE.DATE_TIME, \"\");\r\n },\n\n /**\n * Создает параметр прикладного метода из строки.\n * @param {string} string \n * @returns {WA.VariantParameter} \n */\n сreateVariantParameterFromString: function (string) {\n //пытаемся получить из строки число\n var re = new RegExp(/^-?\\d*(\\.\\d+)?$/);\n var isNumber = re.test(string);\n if (isNumber) {\r\n return this.сreateVariantParameterFromNumber(parseFloat(string));\r\n }\n\n //пытаемся получить из строки дату\n var date = parseDateTime(string);\n if (date !== null) {\r\n return this.сreateVariantParameterFromDate(date);\r\n }\n\n return new global.VariantParameter(string, VARIANT_TYPE.STRING, \"\");\r\n },\n\n /**\n * Создает параметр прикладного метода из переменной типа object.\n * @param {object} obj \n * @returns {WA.VariantParameter} \n */\n сreateVariantParameterFromObject: function (obj) {\r\n var me = this;\r\n\r\n if (obj instanceof Date) {\r\n return this.сreateVariantParameterFromDate(obj);\r\n }\n\n if (obj instanceof WA.Link) {\r\n var parameterType = getVariantTypeFromLinkType(obj.type);\n return new global.VariantParameter(obj.id, parameterType, \"\");\r\n }\n\n if (obj instanceof Array) {\r\n var variantParameters = obj.map(function (item) {\r\n return me.сreateVariantParameter(item);\r\n });\n var parameterValue = variantParameters.map(function (item) {\r\n return item.value;\r\n });\n return new global.VariantParameter(parameterValue, getVariantCollectionTypeFromVariantType(variantParameters[0].type), \"\");\r\n }\n\n return null;\r\n }\r\n });\n\n /**\r\n * Возвращает тип параметра прикладного метода, соответствующий типу ссылки.\r\n * @param {OBJECT_TYPE} linkType тип объекта ссылки\r\n * @returns {VARIANT_TYPE} тип параметра прикладного метода\r\n */\n function getVariantTypeFromLinkType(linkType) {\r\n switch (linkType) {\r\n case OBJECT_TYPE.EDOCUMENT:\n return VARIANT_TYPE.DOCUMENT;\n case OBJECT_TYPE.FOLDER:\n return VARIANT_TYPE.FOLDER;\n case OBJECT_TYPE.TASK:\n return VARIANT_TYPE.TASK;\n case OBJECT_TYPE.JOB:\n return VARIANT_TYPE.JOB;\n case OBJECT_TYPE.REFERENCE_RECORD:\n return VARIANT_TYPE.REFERENCE_RECORD;\n default:\n return null;\r\n }\r\n };\n\n /**\r\n * Возвращает тип параметра прикладного метода для коллекции, соответствующий единичному типу.\r\n * @param {VARIANT_TYPE} type единичный тип параметра\r\n * @returns {VARIANT_TYPE} тип параметра для коллекции \r\n */\n function getVariantCollectionTypeFromVariantType(type) {\r\n switch (type) {\r\n case VARIANT_TYPE.INTEGER:\n return VARIANT_TYPE.INTEGER_COLLECTION;\n case VARIANT_TYPE.SINGLE:\n return VARIANT_TYPE.SINGLE_COLLECTION;\n case VARIANT_TYPE.STRING:\n return VARIANT_TYPE.STRING_COLLECTION;\n case VARIANT_TYPE.BOOLEAN:\n return VARIANT_TYPE.BOOLEAN_COLLECTION;\n case VARIANT_TYPE.DATE_TIME:\n return VARIANT_TYPE.DATE_TIME_COLLECTION;\n case VARIANT_TYPE.TASK:\n return VARIANT_TYPE.TASK_COLLECTION;\n case VARIANT_TYPE.JOB:\n return VARIANT_TYPE.JOB_COLLECTION;\n case VARIANT_TYPE.FOLDER:\n return VARIANT_TYPE.FOLDER_COLLECTION;\n case VARIANT_TYPE.DOCUMENT:\n return VARIANT_TYPE.DOCUMENT_COLLECTION;\n case VARIANT_TYPE.REFERENCE_RECORD:\n return VARIANT_TYPE.REFERENCE_RECORD_COLLECTION;\n case VARIANT_TYPE.USER:\n return VARIANT_TYPE.USER_COLLECTION;\n case VARIANT_TYPE.USER_GROUP:\n return VARIANT_TYPE.USER_GROUP_COLLECTION;\n case VARIANT_TYPE.USER_ROLE:\n return VARIANT_TYPE.USER_ROLE_COLLECTION;\n default:\n return null;\r\n }\r\n }\n\n /**\r\n * Экземпляр фабрики параметров прикладного метода.\r\n * \r\n * @since 5.5.0.1000\r\n * @property variantParameterFactory\r\n * @type {Object}\r\n */\n global.variantParameterFactory = new VariantParameterFactory();\r\n})(window.WebAccess.domainMethods);","\"use strict\";\n(function (global) {\n /**\r\n * Вызывает прикладной метод.\r\n * \r\n * @function WA.domainMethods.executeEntityMethod\r\n * @param {string} service Путь к сервису. \r\n * @param {int} entityId ИД объекта, для которого вызызвается метод.\r\n * @param {string} methodName Имя метода. \r\n * @param {Array} parameters параметры, с которыми вызызвается метод. \r\n * @returns {object} Результат выполнения прикладного метода.\r\n */\n global.executeEntityMethod = function (service, entityId, viewName, methodName, parameters) {\r\n var factory = global.variantParameterFactory;\r\n var variantParameters = parameters.map(function (parameter) {\r\n if (parameter instanceof global.VariantParameter) {\r\n return parameter;\r\n } else {\r\n return factory.сreateVariantParameter(parameter);\r\n }\r\n });\n\n var d = $.Deferred();\r\n\r\n //для записи справочника обязательно надо отправить ссылку, так как для несохраненной записи обязательно нужен код справочника\r\n //а для диалога нельзя отправить ссылку, так как для диалога отправляется InstanceId \r\n WA.SRV.call(service, {\n \"entityLink\": entityId instanceof WA.Link ? entityId.toLinkModel() : null,\n \"entityId\": entityId instanceof WA.Link ? entityId.id : entityId,\n \"methodName\": methodName,\n \"methodParameters\": variantParameters,\n \"viewName\": viewName\n }).done(function (res) {\n //спец обработка для дат, так как они приходят в формате \"/Date(-1797825600000)/\"\n res.MethodResult = parseMethodResult(res.MethodResult);\n\n //скрываем сообщения о предыдущих ошибках, если были\n ErrorHide();\n\n d.resolve(res);\r\n }).fail(function (message, res) {\r\n d.reject(message, res);\r\n });\n\n return d.promise();\r\n }\r\n\r\n /**\r\n * Проверяет, доступнен ли метод для текущего объекта.\r\n * @since 5.5.0.1000\r\n * @function WA.domainMethods.isMethodAvailable\r\n * @param {string} service Путь к сервису. \r\n * @param {int} entityId ИД объекта, для которого вызызвается метод.\r\n * @param {string} methodName Имя метода.\r\n * @returns {boolean} true, если метод доступен, иначе false.\r\n */\r\n global.isMethodAvailable = function (service, entityId, methodName) {\n var d = $.Deferred();\n\n //для записи справочника обязательно надо отправить ссылку, так как для несохраненной записи обязательно нужен код справочника\r\n //а для диалога нельзя отправить ссылку, так как для диалога отправляется InstanceId \n WA.SRV.call(service, {\n \"entityLink\": entityId instanceof WA.Link ? entityId.toLinkModel() : null,\n \"entityId\": entityId instanceof WA.Link ? entityId.id : entityId,\n \"methodName\": methodName\n }).done(function (res) {\n d.resolve(res);\n }).fail(function(res) {\n d.reject(res);\n });\n\n return d.promise();\n }\n\n /**\r\n * Проверяет, является ли объект датой.\r\n * @param {object} obj Проверяемый объект. \r\n * @returns {boolean} true, если является. \r\n */\n function isLinkModel(obj) {\n return (typeof obj === \"object\" && obj.__type && obj.__type === \"NpoComputer.WebAccess.Models.Link\");\n }\n\n /**\r\n * Проверяет, является ли объект массивом дат.\r\n * @param {object} obj Проверяемый объект. \r\n * @returns {boolean} true, если является. \r\n */\n function isLinkModelArray(obj) {\n return (obj instanceof Array && obj[0] && isLinkModel(obj[0]));\n }\n\n /**\r\n * Проверяет, является ли объект датой.\r\n * @param {object} obj Проверяемый объект. \r\n * @returns {boolean} true, если является. \r\n */\n function isDate(obj) {\r\n return (typeof obj === \"string\" && obj.indexOf(\"/Date\") === 0);\r\n }\n\n /**\r\n * Проверяет, является ли объект массивом дат.\r\n * @param {object} obj Проверяемый объект. \r\n * @returns {boolean} true, если является. \r\n */\n function isDateArray(obj) {\r\n return (obj instanceof Array && obj[0] && isDate(obj[0]));\r\n }\n\n /**\r\n * Заменяет объекты-модельки на обычные объекты в результате прикладного метода.\r\n * @param {object} methodResult Результат выполнения прикладного метода c модельками. \r\n * @returns {object} Результат выполнения прикладного метода c обычными оъектами. \r\n */\n function parseMethodResult(methodResult) {\n\n if (methodResult != null) {\n if (isLinkModel(methodResult)) {\r\n return (new WA.Link()).fromLinkModel(methodResult);\r\n } else if (isLinkModelArray(methodResult)) {\r\n var linkArray = methodResult.map(function (item) {\r\n return (new WA.Link()).fromLinkModel(item);\r\n });\n return linkArray;\r\n }\n\n if (isDate(methodResult)) {\r\n return parseDate(methodResult);\r\n } else if (isDateArray(methodResult)) {\r\n var dateArray = methodResult.map(function (item) {\r\n return parseDate(item);\r\n });\n return dateArray;\r\n }\n }\n\n return methodResult;\n }\n\n})(window.WebAccess.domainMethods);","\"use strict\";\n(function (global) {\n\n /**\n * Функции реализующие стандартный функционал веб-доступа.\n * @namespace Core\n * @since 5.0.0.4102\n */\n global.Core = {}; \n \n})(window);\n","var log = WebAccess.utils.log;\r\n/**\r\n* Инициализация всех страниц.\r\n*/\r\n$('document').ready(function () {\r\n log.info('NAVIGATION', new WA.URL().asString());\r\n Core.migration.init();\r\n Core.agent.checkNotifications();\r\n\r\n switch (WA.getLocation()) {\r\n case \"login\":\r\n setRealHeightAndWidth();\r\n break;\r\n\r\n case \"explorer\":\r\n Core.agent.init();\r\n\r\n Core.header.actions.\r\n initAboutMenu().\r\n initSettingsMenu();\r\n\r\n Core.footer.\r\n initFastSearchFilter().\r\n initViewSwitchingMenu().\r\n initExtensionsMenu().\r\n initCurrentFolder();\r\n AfterSearch();\r\n\r\n Core.objectList.dragging.init();\r\n Core.toolBars.objectList.initPreFiltersMenu();\r\n Core.contextmenu.createFolderContextMenu();\r\n break;\r\n\r\n case \"reference\":\r\n Core.sideBar.\r\n initTabs();\r\n\r\n Core.objectList.dragging.init();\r\n Core.cards.bindButtonsEnablingOnFormChange(['RefCardSave', 'RefCardSaveAndClose']);\r\n break;\r\n\r\n case \"job\":\r\n InitContentListToolbox();\r\n\r\n Core.objectList.dragging.init();\r\n Core.customWorks.bindButtonsEnabling('textarea.Job_Edit_Text_Area_Control');\r\n break;\r\n\r\n case \"task\":\r\n InitContentListToolbox();\r\n\r\n Core.objectList.dragging.init();\r\n Core.tasks\r\n .initSelectStandardRouteButton()\r\n .bindButtonsEnabling();\r\n break;\r\n\r\n case \"notice\":\r\n Core.objectList.dragging.init();\r\n break;\r\n\r\n case \"doc\":\r\n Core.sideBar.\r\n initTabs();\r\n\r\n Core.objectList.dragging.init();\r\n Core.documents.bindButtonsEnabling();\r\n break;\r\n\r\n case \"settings\":\r\n Core.settings.\r\n initPreviewSettings().\r\n initColoringRecordsSettings().\r\n initAutoCleaningSettings().\r\n initAgentControls().\r\n initDocDefaultAction().\r\n initManagedFoldersSettings();\r\n\r\n break;\r\n\r\n case \"referencerecords\":\r\n WA.CR.window.bind('beforeClose', function () {\r\n var grid = WA.CR.objectList._grid;\r\n if (typeof grid !== 'undefined') {\r\n WA.SRV.callSync(\"/Reference.asmx/FreeReferenceQuery\", {\r\n ReferenceName: WA.CR.ReferenceCode,\r\n QueryInstanceId: WA.CR.objectList._grid.state.QueryInstanceID\r\n });\r\n }\r\n });\r\n break;\r\n\r\n case \"folder\":\r\n window.bindButtonsEnablingOnFormChange();\r\n break;\r\n };\r\n});\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n// Старый mobile safari не может совладать со 100% шириной внутри flex'а, оставляя ее равной ширине родителя.\r\n// Пришлось запилить такой фикс, чтобы гамбургер в списке объектов был виден и в старых версиях\r\nWebAccess.ready(function () {\r\n if (WA.ENV.isIOS()\r\n && (WA.ENV.browser.name.toLowerCase().indexOf('safari') !== -1)\r\n && (parseInt(WA.ENV.browser.version) <= 8)) {\r\n $('.object-list-item__column_type_IconMenu').css('margin-left', '-130px');\r\n }\r\n});\r\n\r\n/**\r\n* При смене ориентации устройства:\r\n* 1. Если есть модальное окно и у него есть \"засеренный\" слой, его надо\r\n* поджимать при повороте, иначе его фиксированная ширина делает страницу\r\n* шире чем она есть и появляются белые зоны. Актуально для ipad.\r\n* 2. Центируем открытые диалоги если такие есть.\r\n*/\r\n$(window).on(\"orientationchange\", function (event) {\r\n fitDialogOverlayToPage();\r\n setTimeout(function () {\r\n moveOpenedDialogToCenter();\r\n }, 500); //полсекунды. больше - плохо, меньше - не работает.\r\n})\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * При смене размеров окна:\r\n * 1. Создаем событие для $(window), которое вызовется, толко после завершения\r\n * изменения размера.\r\n */\r\n .on(\"resize\", function () {\r\n createResizeEndEvent($(this));\r\n })\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * После изменения размеров окна:\r\n * 1. Инициализация drag & drop раздвижения панели с деревом в проводнике.\r\n * 2. Сворачивание и разворачивание групп кнопок, в зависимости от размеров\r\n * окна и их приоритета.\r\n * 3. Центирируем диалоги, если есть.\r\n */\r\n .on('resizeEnd', function () {\r\n if (WA.getLocation == \"explorer\") {\r\n InitExplorerSidebar(window.treeWidth);\r\n };\r\n Core.toolBars.main.groupToolbarItems();\r\n moveOpenedDialogToCenter();\r\n });\r\n\r\n/**\r\n* Обработка статистики\r\n*/\r\nWebAccess.ready(function () {\r\n if (Core.isStatisticEnabled) {\r\n WA.CR.statistics.enable();\r\n var eventName = (WA.ENV.os.name.toLowerCase() === 'ios' || WA.ENV.os.name.toLowerCase() === 'android' ? 'touchstart' : 'mousedown');\r\n $(document).on(eventName + '.stat', function (event) {\r\n WA.CR.statistics.write(event.target);\r\n });\r\n };\r\n});\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n\r\n/* =Main==================================================================== */\r\n\r\nvar VisibleAddedDivs = 0;\r\nvar g_ResStr;\r\nvar g_LeadJobID = 0;\r\nvar g_ViewOnlyMsg = '';\r\n\r\nvar TimerCloseMenu = null;\r\nvar LeftRegionWidth = 0;\r\nvar needExit = false;\r\n\r\nvar c_MultiSelectCloseStatus = \"close_status\";\r\nvar c_MultiSelectCloseStatus_OK = \"OK\";\r\nvar c_MultiSelectCloseStatus_Canceled = \"CANCELED\";\r\nvar MIN_WINDOW_WIDTH = $('body').hasClass('tablet') ? 770 : 930;\r\nvar MIN_WINDOW_HEIGHT = 600;\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* @todo описать\r\n*/\r\nfunction px(intVal) {\r\n return intVal + \"px\";\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* @todo описать\r\n*/\r\nfunction windowWidth() {\r\n return window.innerWidth || document.documentElement.clientWidth;\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* @todo описать\r\n*/\r\nfunction windowHeight() {\r\n return window.innerHeight || document.documentElement.clientHeight;\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\nwindow.lastWindowWidth = $(window).width();\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Вычисление размеров полос прокрутки.\r\n*/\r\n(function () {\r\n var i = document.createElement('p');\r\n i.style.width = '100%';\r\n\r\n i.style.height = px(200);\r\n\r\n var o = document.createElement('div');\r\n o.style.position = 'absolute';\r\n o.style.top = px(0);\r\n o.style.left = px(0);\r\n o.style.visibility = 'hidden';\r\n o.style.width = px(200);\r\n o.style.height = px(200);\r\n o.style.overflow = 'hidden';\r\n o.appendChild(i);\r\n\r\n document.body.appendChild(o);\r\n var w1 = i.offsetWidth;\r\n var\r\n h1 = i.offsetHeight;\r\n o.style.overflow = 'scroll';\r\n var w2 = i.offsetWidth;\r\n var h2 = i.offsetHeight;\r\n if (w1 == w2) w2 = o.clientWidth;\r\n if (h1 == h2) h2 = o.clientWidth;\r\n\r\n document.body.removeChild(o);\r\n\r\n /**\r\n * Ширина полосы прокуртки\r\n * @global scrollbarWidth\r\n */\r\n window.scrollbarWidth = w1 - w2;\r\n\r\n /**\r\n * Высота полосы прокрутки\r\n */\r\n window.scrollbarHeight = h1 - h2;\r\n})();\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n(function (global) {\r\n\r\n var AttachmentBottomPadding = 7,\r\n isHorizontalScrollExist = false,\r\n jMainContainer,\r\n jAttachments,\r\n jAttachmentsIsVisible,\r\n jCard,\r\n windowHeight;\r\n\r\n /**\r\n * Вычисление и перерисовка размеров элементов, для которых не удалось задать\r\n * нормальные кроссбраузерные параметры одной лишь версткой.\r\n * @global\r\n * @function setRealHeightAndWidth\r\n */\r\n global.setRealHeightAndWidth = function (ev, _wh) {\r\n windowHeight = global.windowHeight();\r\n\r\n adaptiveRules();\r\n jMainContainer = $('#main_container');\r\n jAttachments = jMainContainer.find('.attachments_td');\r\n jAttachmentsIsVisible = jAttachments.is(':visible');\r\n jCard = jMainContainer.find('div.card');\r\n\r\n setMainColumnsHeight();\r\n\r\n switch (WA.getLocation()) {\r\n case \"doc\":\r\n case \"documentpreview\":\r\n setDocumentPreviewHeight();\r\n break;\r\n\r\n case \"job\":\r\n case \"task\":\r\n setAttachmentsHeight();\r\n break;\r\n };\r\n\r\n //Шамов А.: Расчет высоты грида делаем всегда, т.к. он может быть\r\n //расположен во вкладке.\r\n setGridHeight();\r\n setMinimalWindowWidth();\r\n\r\n $('html').trigger('OnSetRealHeightAndWidth');\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Правила скрытия и появления элементов, когда экран сильно необычный\r\n * 1. Если мобильник или планшет, то убираем overflow:hidden чтобы сделать\r\n * min-height/min-width сразу после загрузки.\r\n */\r\n function adaptiveRules() {\r\n if (WA.getLocation() === \"login\") return;\r\n\r\n switch (WA.ENV.os.name) {\r\n case \"iOS\":\r\n resetZoomForIpad();\r\n break;\r\n case \"Android\":\r\n resetZoomForAndroid();\r\n break;\r\n default:\r\n applyExtraZoomForSurface();\r\n };\r\n\r\n if (windowWidth() < MIN_WINDOW_WIDTH) {\r\n isHorizontalScrollExist = true;\r\n $(\"body\").css({ \"overflow-x\": \"visible\" });\r\n } else {\r\n isHorizontalScrollExist = false;\r\n $(\"body\").scrollLeft(0).css({ \"overflow-x\": \"hidden\" });\r\n };\r\n\r\n if (windowHeight < MIN_WINDOW_HEIGHT) {\r\n $(\"body\").css({ \"overflow-y\": \"visible\" });\r\n } else {\r\n $(\"body\").scrollTop(0).css({ \"overflow-y\": \"hidden\" });\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Zoom для Surface; Используется правило, которое\r\n * работает только в новых версиях ИЕ. При смене ориентации включается\r\n * css правило которое увеличивает все страницу пропорционально.\r\n * @inner\r\n * @function applyExtraZoom\r\n */\r\n function applyExtraZoomForSurface() {\r\n /**$(\"#MSWP\").remove();\r\n\r\n var jStyle;\r\n var style = '';*/\r\n if (WA.ENV.isTouch()) {\r\n /*if (WA.ENV.isVertical()) {\r\n if (screen.width < 1000) return;\r\n else {\r\n jStyle = $(format(style, 640));\r\n };\r\n } else {\r\n setTimeout(function () { console.log(screen.width) }, 5000)\r\n if (screen.width < 1800) return;\r\n else {\r\n jStyle = $(format(style, 1280));\r\n };\r\n }\r\n jStyle.appendTo(\"head\");*/\r\n\r\n /**\r\n * При таком зуме проявляется дефект когда нижняя панель в спраочниках\r\n * уезжает направо.\r\n */\r\n $(\"#reference_footer .tc_right\").css({ \"width\": \"auto\" });\r\n };\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * В андроиде есть проблема: при смене ориентации меняются размеры страницы,\r\n * поэтому setRealHeightAndWidth неправильно масштабирует главные колонки.\r\n * Данная функция сбрасывает зум при каждом изменении экрана.\r\n * @function resetZoomForAndroid\r\n * @inner\r\n */\r\n function resetZoomForAndroid() {\r\n var jMeta = $('meta[name=viewport]');\r\n var reset = 'width=device-width, height=device-height, initial-scale=1.0' +\r\n ', minimum-scale=1.0';\r\n jMeta.attr('content', reset);\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * В Ipad тоже есть проблема: при смене ориентации меняются размеры страницы,\r\n * Данная функция сбрасывает размер viewport-а на\r\n * минимальную ширину/высоту страницы, но не ломает масштабирование.\r\n * @see http://goo.gl/RC4HmF\r\n * @function resetZoomForAndroid\r\n * @inner\r\n */\r\n function resetZoomForIpad() {\r\n var denyScale, allowScale;\r\n var jMeta = $('meta[name=viewport]');\r\n if (jMeta) {\r\n denyScale = 'width=device-width, minimum-scale=1.0,' +\r\n 'maximum-scale=1.0, initial-scale=1.0';\r\n jMeta.attr('content', denyScale);\r\n\r\n document.body.addEventListener('gesturestart', function () {\r\n allowScale = 'width=device-width, minimum-scale=0.25,' +\r\n 'maximum-scale=1.6';\r\n jMeta.attr('content', allowScale);\r\n }, false);\r\n };\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n };\r\n\r\n /**\r\n * У предпросмотра убираем прокрутки и отступы.\r\n * @function setDocumentPreviewHeight\r\n */\r\n function setDocumentPreviewHeight() {\r\n var view = GetParamInURL(\"view\").toLowerCase();\r\n if (view !== \"preview\" && view !== \"\") return;\r\n\r\n var mode = GetParamInURL(\"mode\").toLowerCase();\r\n if (mode !== 'new') {\r\n $(\"#main_container\").css({ \"overflow-y\": \"hidden\" });\r\n }\r\n\r\n var jContentContainer = $('#contentContainer');\r\n if (jContentContainer.length > 0) {\r\n var iframeHeight = $(window).height() - jContentContainer.offset().top;\r\n jContentContainer.height(iframeHeight);\r\n }\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Столбец с вложениями в ЗЗУ. 100%ая высота делает область непрокручиваемой,\r\n * поэтому приходится устанавливать фиксированную высоту, чтобы появился\r\n * скролл, это нужно чтобы был доступ к элементам, которые уходят\r\n * за область экрана - вниз.\r\n * @function setAttachmentsHeight\r\n * @inner\r\n */\r\n function setAttachmentsHeight() {\r\n var cardHeight = jCard.outerHeight() + 3;\r\n var headerHeight = jAttachments.find('.ListRequisiteHeader').height();\r\n var contentHight = cardHeight - headerHeight - AttachmentBottomPadding;\r\n var jLeftColumn = $('#left_column');\r\n var jLeftColumnHeight = 0;\r\n if (jLeftColumn.hasClass('horizontal')) {\r\n jLeftColumnHeight = jLeftColumn.height();\r\n }\r\n jAttachments.height(cardHeight + jLeftColumnHeight);\r\n\r\n var jInstruction = $('div.attachments_instruction');\r\n var jListReq = jAttachments.find('.ListRequisiteList');\r\n if (jInstruction.length > 0) {\r\n jListReq.height(contentHight - jInstruction.height() + jLeftColumnHeight);\r\n } else {\r\n var jRightColumn = $(\"#right_column\");\r\n var jToolbar = $(\"#content_list_toolbox\")\r\n jListReq.height(jRightColumn.height() - jToolbar.height() - AttachmentBottomPadding);\r\n }\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Поведение страниц, когда экран становится слишком маленьким,\r\n * для того, чтобы продолжать отображаться как прежде.\r\n * @function setMinimalWindowWidth\r\n * @inner\r\n */\r\n function setMinimalWindowWidth() {\r\n\r\n switch (WA.getLocation()) {\r\n\r\n case \"job\":\r\n case \"task\":\r\n /**\r\n * Когда экран уменьшается, появляется 2 сколла, один снизу, и второй\r\n * справа. Второй-справа, нужен не всегда, и иногда появляется просто\r\n * из-за нижнего. Поэтому мы прячем правую прокрутку.\r\n */\r\n\r\n if (GetParamInURL(\"view\").toLowerCase() == \"card\") {\r\n jMainContainer.css(\"overflow-y\", \"hidden\");\r\n }\r\n\r\n /**\r\n * Вложения если они больше минимальной ширины имеют свойство наезжать\r\n * на карточку, при уменьшении размеров окна.\r\n * Строка ниже, исправляет это.\r\n * Если в тексте написано большое неразрывное слово, то убираем отступ.\r\n */\r\n if (jAttachmentsIsVisible) {\r\n var jScroller = $(\"#scroller\");\r\n var attachmentWidth = jScroller.width() - jCard.width();\r\n jAttachments.width(attachmentWidth);\r\n jCard.css(\"margin-right\", attachmentWidth);\r\n var jLeftColumn = $('#left_column');\r\n if (jLeftColumn.hasClass('horizontal')) {\r\n jLeftColumn.css(\"margin-right\", attachmentWidth);\r\n }\r\n }\r\n setSavedTextWidth(jMainContainer);\r\n break;\r\n\r\n case \"explorer\":\r\n /**\r\n * Если места становится мало, то боковая панель, сворачивается\r\n * и наоборот, разворачивается если места достаточно.\r\n */\r\n if (WA.SideBarInit.state() === \"resolved\") {\r\n if ((windowWidth() < MIN_WINDOW_WIDTH && !$.cookie('SideBarCollapsed')) || $.cookie('SideBarCollapsed') == '1') {\r\n WA.current.sideBar.collapse();\r\n } else {\r\n if (!$.cookie('SideBarCollapsed') || $.cookie('SideBarCollapsed') == '0') {\r\n WA.current.sideBar.expand();\r\n };\r\n };\r\n }\r\n };\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Проверяет, не находится ли страница внутри ифрейма.\r\n * @function inIframe\r\n * @inner\r\n */\r\n function inIframe() {\r\n try {\r\n return window.self !== window.top;\r\n } catch (e) {\r\n return true;\r\n }\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Подбор высоты основных колонок. Эти колонки есть почти на каждой странице\r\n * и имеют высоту 100%. Но 100% - растягивает их не на ширину доступной\r\n * области, а в высоту окна. Данная функция исправляет это.\r\n * Если область меньше минимальной, то высота должна быть фиксированной.\r\n * @function setMainColumnsHeight\r\n * @inner\r\n */\r\n function setMainColumnsHeight() { // TODO: Почемуто вызывается дважды при ресайзе\r\n\r\n var windowHeight = $(window).height();\r\n if (!inIframe() && (windowHeight < MIN_WINDOW_HEIGHT)) {\r\n windowHeight = $(document).height();\r\n }\r\n\r\n var jLeftColumn = $(\"#left_column\");\r\n if (jLeftColumn.length > 0 && !jLeftColumn.hasClass('horizontal')) {\r\n jLeftColumn.height(windowHeight - jLeftColumn.offset().top);\r\n }\r\n\r\n var jRightColumn = $(\"#right_column\");\r\n if (jRightColumn.length > 0) {\r\n var toolbarPanelHeight = $(\".toolbar\").height();\r\n jRightColumn.height(windowHeight - jRightColumn.offset().top);\r\n var jMainContainer = $(\"#main_container\");\r\n\r\n // Скорректировать высоту в карточке документа\r\n if (WA.getLocation() === \"doc\" || WA.getLocation() === \"reference\" || WA.getLocation() === \"folder\")\r\n jMainContainer.height(jRightColumn.height() - toolbarPanelHeight);\r\n\r\n if (WA.getLocation() === \"task\" || WA.getLocation() === \"job\") {\r\n // Скорректировать высоту вкладок в ЗЗУ.\r\n if (($(\".task-corresponds\").length == 0))\r\n jMainContainer.height(jRightColumn.height() - toolbarPanelHeight);\r\n }\r\n\r\n // Скорректировать высоту вкладки История в карточках.\r\n var jHistoryTable = $(\".history_table\")\r\n if (jHistoryTable.length > 0)\r\n jMainContainer.height(jRightColumn.height() - toolbarPanelHeight);\r\n\r\n if ($(\".filtration-area\").length > 0) {\r\n var QFilterHeight = $(\".filtration-area\").height() + 7;\r\n jRightColumn.css(\"padding-bottom\", QFilterHeight);\r\n jRightColumn.height(windowHeight - jRightColumn.offset().top - QFilterHeight - toolbarPanelHeight);\r\n }\r\n }\r\n\r\n var jFolderCover = $('#folder_cover_frame');\r\n if (jFolderCover.length > 0) {\r\n jRightColumn.height(windowHeight - jRightColumn.offset().top - QFilterHeight + 9);\r\n //Когда отображена обложка, то под iframe появляется 2px какого-то отступа.\r\n jFolderCover.height(windowHeight - jFolderCover.offset().top - 2);\r\n }\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Подгонка высоты грида в справочниках.\r\n * @function setGridHeight\r\n * @inner\r\n */\r\n function setGridHeight() {\r\n if (WA.getLocation() != 'referencerecords') return;\r\n\r\n var jMainContainer = $('#main_container');\r\n var jRightColumn = $(\"#right_column\");\r\n var fullHeight = jRightColumn.height();\r\n fullHeight += 3; //Шамов А.: Не смог придумать боллее хорошего решения :( , но +3 нужно чтобы убрать 3px снизу грида.\r\n jMainContainer.height(fullHeight - jRightColumn.find(\".toolbar\").height());\r\n jMainContainer.trigger('resizeEnd.grid');\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n})(window);\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n\r\n(function () {\r\n\r\n var oldWidth = null;\r\n var oldHeight = null;\r\n\r\n // На планшетах ресайз вызывается, даже когда размер окна не меняется - при скроллинге. Не будем вызывать мега-функцию, если размер окна не изменился.\r\n window.setRealHeightAndWidthOnResize = function (ev) {\r\n var w = windowWidth();\r\n var h = windowHeight();\r\n if (oldWidth != w || oldHeight != h) {\r\n setRealHeightAndWidth(ev);\r\n oldWidth = w;\r\n oldHeight = h;\r\n }\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Если открыт какой-либо диалог, то эта функция переместит его в центр страницы\r\n * @global\r\n * @function moveOpenedDialogToCenter\r\n */\r\n window.moveOpenedDialogToCenter = function () {\r\n var jDialog = $(\".ui-dialog-content\");\r\n if (jDialog.length > 0) jDialog.dialog(\"option\", \"position\", \"center\");\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Если открыт какой-либо диалог, то эта функция подожмет рамеры штрихованного\r\n * слоя, под размер страницы.\r\n * Делается только для ios, в остальных местах все удовлетворительно.\r\n * @global\r\n * @function moveOpenedDialogToCenter\r\n */\r\n window.fitDialogOverlayToPage = function () {\r\n if (WA.ENV.os.name !== \"iOS\") return;\r\n var jOverlay = $(\".ui-widget-overlay\");\r\n jOverlay.css({ \"width\": \"100%\", \"height\": $(document).height() });\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * При ресайзе окна, событие ресайза срабатывает очень часто.\r\n * Обычно такая скорость и огромное кол-во срабатываний не нужно.\r\n * Данная функция срабатывает лишь однажды, когда изменение размера окна\r\n * действительно было завершено.\r\n * @global\r\n * @function createResizeEndEvent\r\n * @param {Object} jWindow - jquery объект $(window)\r\n * @return {Object} $(window)\r\n */\r\n window.createResizeEndEvent = function (jWindow) {\r\n if (jWindow.resizeTO) clearTimeout(jWindow.resizeTO);\r\n jWindow.resizeTO = setTimeout(function () {\r\n if (jWindow.width() != window.lastWindowWidth || jWindow.height() != window.lastWindowHeight) {\r\n window.lastWindowWidth = jWindow.width();\r\n window.lastWindowHeight = jWindow.height();\r\n jWindow.trigger('resizeEnd');\r\n };\r\n }, 300);\r\n return jWindow;\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n})();\r\n\r\n// Клавиатурная навигация активна?\r\nvar isKeyNavigationActive = false;\r\n\r\nfunction GetEventsName(namespace) {\r\n var ns = (namespace != '' ? '.' + namespace : '');\r\n var hoverEventNames = ['mouseenter' + ns, 'mouseleave' + ns];\r\n if (\"ontouchend\" in document) {\r\n hoverEventNames = ['touchstart' + ns, 'touchend' + ns];\r\n }\r\n return hoverEventNames;\r\n}\r\n\r\nfunction InitMouseEvents() {\r\n if ($.ipad) return;\r\n var hoverEventNames = GetEventsName('hover_toolbar_item');\r\n $('.toolbar_item, .small_toolbar_item')\r\n .bind(hoverEventNames[0], function () { $(this).not('.disabled').addClass('hover'); })\r\n .bind(hoverEventNames[1], function () { $(this).not('.disabled').removeClass('hover'); });\r\n InitHoverForButtons();\r\n}\r\n\r\nfunction InitHoverForButtons(cont) {\r\n if ($.ipad) return;\r\n var hoverEventNames = GetEventsName('hover_buttons');\r\n var c;\r\n var buttons;\r\n\r\n if (cont) {\r\n c = cont;\r\n }\r\n else {\r\n c = $('body');\r\n }\r\n buttons = c.find('button, input[type=button], input[type=submit], input[type=reset]');\r\n\r\n // навешиваем событие нажатия на пробел и энтер только в диалогах, иначе будет на всех кнопках\r\n if (cont) {\r\n buttons.keydown(function (ev) {\r\n if (ev.keyCode == 13 || ev.keyCode == 32) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n return false;\r\n }\r\n }).keyup(function (ev) {\r\n if (ev.keyCode == 13 || ev.keyCode == 32) {\r\n $(this).click();\r\n }\r\n });\r\n }\r\n buttons\r\n .unbind(hoverEventNames[0]).bind(hoverEventNames[0], function () { $(this).not('.disabled').addClass('hover'); })\r\n .unbind(hoverEventNames[1]).bind(hoverEventNames[1], function () { $(this).not('.disabled').removeClass('hover'); })\r\n .unbind('mousedown.click_buttons').bind('mousedown.click_buttons', function () { $(this).not('.disabled').addClass('active'); })\r\n .unbind('mouseleave.click_buttons').bind('mouseleave.click_buttons', function () { $(this).not('.disabled').removeClass('active'); });\r\n}\r\n\r\n\r\n/* =Клавиатурная навигация============================================================================================================================ */\r\n\r\nfunction IsListExist(callbackIfExist) {\r\n if (/explorer\\.aspx/i.test(location.pathname)) {\r\n var res = $('.List').length > 0;\r\n } else {\r\n var res = $('.List.selected,.List.hover').length > 0;\r\n }\r\n if (res) {\r\n if (callbackIfExist) callbackIfExist();\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n}\r\n\r\nfunction SelectAll() {\r\n return IsListExist(function () {\r\n var chk = $('#chkAll');\r\n if (WA.ENV.browser.name.toLowerCase() === 'ie') {\r\n chk.attr('checked', !chk.is(':checked')).click().attr('checked', !chk.is(':checked'));\r\n } else {\r\n chk.attr('checked', !chk.is(':checked')).change();\r\n }\r\n });\r\n}\r\n\r\nfunction InitKeyNavigation() {\r\n if ($.ipad) return;\r\n // Получает элемент со скролингом.\r\n function GetScroller() {\r\n var maincont = $('.dataTables_scrollBody').first();\r\n if (maincont.length == 0) {\r\n maincont = $('#main_container');\r\n }\r\n return maincont;\r\n }\r\n\r\n function ArrowKeyNavigation(IsDownPressed, IsPageUpDown) {\r\n isKeyNavigationActive = true;\r\n\r\n var maincont = GetScroller();\r\n var maincont_h = maincont.height();\r\n\r\n var hovered = $('.List.hover');\r\n var next = null;\r\n if (hovered.length == 0) {\r\n hovered = null;\r\n if (IsPageUpDown) {\r\n if (!IsListExist()) {\r\n next = $('.List:first');\r\n }\r\n }\r\n else next = $('.List:first');\r\n } else {\r\n if (IsDownPressed) {\r\n if (!IsPageUpDown) {\r\n //down\r\n next = hovered;\r\n do {\r\n next = next.next();\r\n if (next.length > 0 && next.hasClass('SubBounds') && next.is(':visible')) {\r\n var newNext = next.find('.List:first');\r\n if (newNext.length > 0) next = newNext;\r\n }\r\n } while (next.length > 0 && !next.hasClass('List'));\r\n\r\n // Выделение с шифтом.\r\n if (key.shift) {\r\n CheckHovered(hovered);\r\n }\r\n } else {\r\n //pagedown\r\n next = hovered;\r\n var oldnext;\r\n do {\r\n oldnext = next;\r\n // Выделение с шифтом.\r\n if (key.shift) {\r\n CheckHovered(oldnext);\r\n }\r\n next = next.next(\".List\");\r\n } while (next.length > 0 && next.position().top < maincont_h && (next.position().top + next.height()) < maincont_h);\r\n // Если дошли до конца, то выделяем последний.\r\n if (next.length == 0) {\r\n next = oldnext;\r\n }\r\n }\r\n } else {\r\n if (!IsPageUpDown) {\r\n //up\r\n next = hovered;\r\n do {\r\n next = next.prev();\r\n if (next.length == 0 && hovered.parents('.SubBounds:first').length > 0) {\r\n var newNext = hovered.parents('.SubBounds:first').prev();\r\n if (newNext.length > 0) next = newNext;\r\n }\r\n } while (next.length > 0 && !next.hasClass('List'));\r\n // Выделение с шифтом.\r\n if (key.shift) {\r\n CheckHovered(hovered);\r\n }\r\n } else {\r\n //pageup\r\n next = hovered;\r\n var oldnext;\r\n do {\r\n oldnext = next;\r\n // Выделение с шифтом.\r\n if (key.shift) {\r\n CheckHovered(oldnext);\r\n }\r\n next = next.prev(\".List\");\r\n } while (next.length > 0 && next.position().top > 0);\r\n // Если дошли до конца, то выделяем последний.\r\n if (next.length == 0) {\r\n next = oldnext;\r\n }\r\n }\r\n }\r\n }\r\n if (next && next.length > 0) {\r\n if (hovered && hovered.length > 0) hovered.trigger('mouseout', [true]).trigger('mouseleave', [true]);\r\n next.addClass('hover').trigger('mouseover', [true]).trigger('mouseenter', [true]);\r\n\r\n //Скрываем контекстное меню.\r\n ContextMenu.hide();\r\n\r\n // Прокрутка до следующего элемента.\r\n var next_top = Math.ceil(next.position().top);\r\n var next_h = next.height() || null;\r\n\r\n // При движении вверх.\r\n if (next_top <= 0) {\r\n maincont.scrollTop(maincont.scrollTop() + next_top + (IsPageUpDown ? (next_h - maincont_h) : 0));\r\n }\r\n // При движении вниз.\r\n if (next_top > maincont_h || (next_top + next_h) > maincont_h) {\r\n maincont.scrollTop(maincont.scrollTop() + next_top + (IsPageUpDown ? 0 : (next_h - maincont_h)));\r\n }\r\n\r\n //console.debug([next_top, next_h, maincont_h, maincont.scrollTop()]);\r\n }\r\n else if (next.length == 0 && IsDownPressed) maincont.scrollTop(maincont.scrollTop() + 100);\r\n }\r\n\r\n function CheckHovered(tocheck) {\r\n var hovered = (!!tocheck) ? tocheck : $('.List.hover');\r\n var chk = hovered.find('input.chk');\r\n if (chk.length > 0) {\r\n chk.click();\r\n }\r\n }\r\n\r\n function OpenBounds() {\r\n isKeyNavigationActive = true;\r\n var hovered = $('.List.hover');\r\n var b = hovered.find('div[col=\"BOUND_PLUS\"]');\r\n if (b && b.length > 0) {\r\n b.click();\r\n }\r\n }\r\n\r\n function PerformDefaultAction() {\r\n var hovered = $('.List.hover');\r\n if (hovered.length > 0) {\r\n if ($('div.ui-dialog').filter(':visible').length == 0) {\r\n var nameCont = hovered.find('div[col=\"NAME\"]');\r\n if (nameCont.length > 0) {\r\n nameCont.click();\r\n } else {\r\n // для списка версий\r\n var defaultAction = hovered.children('td:last').find('a.default');\r\n if (defaultAction.length == 0) {\r\n // для справочников.\r\n defaultAction = hovered.children('td:last').find('a');\r\n }\r\n defaultAction.click();\r\n }\r\n }\r\n }\r\n }\r\n\r\n function KeyboardActionWithLink(toolBarBtnSelector, miniToolbarBtnSelector, needCheckIsListExist) {\r\n var f = function () {\r\n var hovered = $('.List.hover');\r\n var hasClassSelected = true;\r\n if (hovered.length > 0) {\r\n hasClassSelected = hovered.hasClass('selected');\r\n if (!hasClassSelected) CheckHovered(hovered);\r\n }\r\n // Если мы находимся в справочнике, то ссылки удалять нельзя, поэтому меняем действие на удаление записи.\r\n if (toolBarBtnSelector === 'DeleteLinks' && typeof grid !== 'undefined') {\r\n toolBarBtnSelector = 'RefRecDelete';\r\n }\r\n\r\n var toolBtn;\r\n // Ищем сначала в большом тулбаре (риббоне) кнопку.\r\n if (WA.ToolBarInit.state() == 'resolved') {\r\n toolBtn = WA.CR.toolBar.buttons[toolBarBtnSelector];\r\n }\r\n // Если не нашли, ищем в маленьком тулбаре (для вложений и ListRequisite).\r\n if (!toolBtn) {\r\n toolBtn = $(miniToolbarBtnSelector);\r\n }\r\n\r\n // Если нашли, кликаем по ней.\r\n if (!!toolBtn) {\r\n setTimeout(function () { //Кнопка может быть неактивной, она становится активной после выделения галочки, но событие отрабатывает в другом потоке.\r\n toolBtn.click();\r\n }, 10);\r\n }\r\n\r\n if (hovered.length > 0 && !hasClassSelected) {\r\n CheckHovered(hovered);\r\n }\r\n };\r\n if (needCheckIsListExist === undefined || needCheckIsListExist) {\r\n return IsListExist(f);\r\n } else {\r\n return f();\r\n }\r\n }\r\n\r\n function OpenCard() {\r\n // window.open все равно заблокирует.\r\n var hovered = $('.List.hover');\r\n if (hovered.length > 0) {\r\n var openCardLnk = hovered.find('a[data-name=\"ShowCard\"]');\r\n if (openCardLnk.length > 0) {\r\n // Выполняем действие \"Открыть карточку\".\r\n var t = openCardLnk.attr('target');\r\n if (!t || t == '') t = '_self';\r\n window.open(openCardLnk.attr('href'), t);\r\n } else {\r\n //Если действий нет, то открываем карточку явно.\r\n var Kind = hovered.attr('kind');\r\n // Открываем карточку.\r\n ShowObjectCard({ id: +hovered.attr('id'), kind: Kind }, 'view=Card');\r\n }\r\n }\r\n }\r\n\r\n function SaveCard() {\r\n var btn = $('div[name=\"Save\"]');\r\n if (btn.length > 0) {\r\n btn.click();\r\n }\r\n }\r\n\r\n var shortcutBind = function (actionname, shortcut, scope, handler) {\r\n key(shortcut, scope, function () {\r\n if (!WA.CR.statistics.isDisabled()) {\r\n var hovered = $('.List.hover, .List.selected');\r\n //var actionPostfix = (hovered.length == 0 ? '' : (hovered.length == 1 ? ' (one)' : ' (multiple)'));\r\n if (Core.isStatisticEnabled) {\r\n WA.CR.statistics.write({\r\n page: WA.getLocation(),\r\n action: actionname, // + actionPostfix,\r\n area: 'KeyboardShortcut',\r\n target: (hovered.length > 0 ? hovered.get(0) : null)\r\n });\r\n };\r\n }\r\n return handler();\r\n });\r\n };\r\n\r\n var scope = 'common';\r\n shortcutBind('Navigation', 'down, shift+down', scope, function () { ArrowKeyNavigation(true, false); return false; });\r\n shortcutBind('Navigation', 'up, shift+up', scope, function () { ArrowKeyNavigation(false, false); return false; });\r\n shortcutBind('Navigation', 'pagedown, shift+pagedown', scope, function () { ArrowKeyNavigation(true, true); return false; });\r\n shortcutBind('Navigation', 'pageup, shift+pageup', scope, function () { ArrowKeyNavigation(false, true); return false; });\r\n shortcutBind('SelectItem', 'space', scope, function () { CheckHovered(); return false; });\r\n shortcutBind('OpenBounds', 'right, left', scope, function () { OpenBounds(); return false; });\r\n shortcutBind('Open', 'enter', scope, function () { PerformDefaultAction(); return false; });\r\n shortcutBind('SelectAll', 'ctrl+a', scope, function () { WA.current.objectList.selectAll(); return false; });\r\n shortcutBind('CopyLinks', 'ctrl+c', scope, function () { return KeyboardActionWithLink('CopyLinks', '.copy_btn'); });\r\n shortcutBind('PasteLinks', 'ctrl+v', scope, function () { return KeyboardActionWithLink('PasteLinks', '.paste_btn', false); });\r\n shortcutBind('CutLinks', 'ctrl+x', scope, function () { return KeyboardActionWithLink('CutLinks', '.cut_btn', false); });\r\n\r\n shortcutBind('DeleteLinks', 'del', scope, function () {\r\n if (WA.getLocation() != 'referencerecords') DeleteLinks();\r\n else DeleteSelectedRecords();\r\n });\r\n shortcutBind('OpenCard', 'ctrl+enter', scope, function () { OpenCard(); return false; });\r\n shortcutBind('SaveCard', 'ctrl+s', scope, function () { SaveCard(); return false; }, true);\r\n\r\n // В keymaster модификаторы снимаются на keyup, поэтому если нажать на Alt+Tab модификатор остается, т.к. keyup возникает уже в другом окне. Пока не пофиксят будет так:\r\n shortcutBind('Navigation', 'alt+down, alt+shift+down', scope, function () { ArrowKeyNavigation(true, false); return false; });\r\n shortcutBind('Navigation', 'alt+up, alt+shift+up', scope, function () { ArrowKeyNavigation(false, false); return false; });\r\n shortcutBind('Navigation', 'alt+pagedown, alt+shift+pagedown', scope, function () { ArrowKeyNavigation(true, true); return false; });\r\n shortcutBind('Navigation', 'alt+pageup, alt+shift+pageup', scope, function () { ArrowKeyNavigation(false, true); return false; });\r\n shortcutBind('SelectItem', 'alt+space', scope, function () { CheckHovered(); return false; });\r\n shortcutBind('OpenBounds', 'alt+right, alt+left', scope, function () { OpenBounds(); return false; });\r\n shortcutBind('Open', 'alt+enter', scope, function () { PerformDefaultAction(); return false; });\r\n shortcutBind('SelectAll', 'alt+ctrl+a', scope, function () { return SelectAll(); });\r\n shortcutBind('CopyLinks', 'alt+ctrl+c', scope, function () { return KeyboardActionWithLink('CopyLinks', '.copy_btn'); });\r\n shortcutBind('PasteLinks', 'alt+ctrl+v', scope, function () { return KeyboardActionWithLink('PasteLinks', '.paste_btn', false); });\r\n shortcutBind('CutLinks', 'alt+ctrl+x', scope, function () { return KeyboardActionWithLink('CutLinks', '.cut_btn', false); });\r\n shortcutBind('DeleteLinks', 'alt+del', scope, function () { return KeyboardActionWithLink('DeleteLinks', '.delete_btn'); });\r\n shortcutBind('OpenCard', 'alt+ctrl+enter', scope, function () { OpenCard(); return false; });\r\n shortcutBind('SaveCard', 'alt+ctrl+s', scope, function () { SaveCard(); return false; });\r\n key.setScope(scope);\r\n // Снимаем запрет на выделение мышкой.\r\n $('body').bind('mousemove.keynavigation', function () { isKeyNavigationActive = false; });\r\n}\r\n\r\n/* =================================================================================================================================================== */\r\n/* =================================================================================================================================================== */\r\n\r\nfunction OpenInDesktopClient() {\r\n DoAction('Desktop=1&-view', false);\r\n}\r\n\r\nfunction CloseDocWindow(msg, edocId) {\r\n BaseCloseDocWindow(edocId);\r\n try {\r\n //Вызывает освобождение объекта явно, т.к. перезагрузка окна прерывает \"анализатор открытости окна\".\r\n if (WA.ENV.browser.name.toLowerCase() === 'opera') {\r\n FreeEDoc(edocId);\r\n }\r\n CloseWindow();\r\n } catch (ex) { }\r\n return false;\r\n}\r\n\r\nfunction CloseTaskWindow(msg, taskId) {\r\n CloseBaseTaskWindow(taskId);\r\n try {\r\n //Вызывает освобождение объекта явно, т.к. перезагрузка окна прерывает \"анализатор открытости окна\".\r\n if (WA.ENV.browser.name.toLowerCase() === 'opera') {\r\n FreeTask(taskId);\r\n }\r\n CloseWindow();\r\n } catch (ex) { }\r\n return false;\r\n}\r\nfunction CloseJobWindow(msg, jobId) {\r\n CloseBaseJobWindow(jobId);\r\n try {\r\n //Вызывает освобождение объекта явно, т.к. перезагрузка окна прерывает \"анализатор открытости окна\".\r\n if (WA.ENV.browser.name.toLowerCase() === 'opera') {\r\n FreeJob(jobId);\r\n }\r\n CloseWindow();\r\n } catch (ex) { }\r\n return false;\r\n}\r\nfunction CloseWizardWindow(confmsg, wizardKey) {\r\n ConfirmDialogNew(confmsg, function () {\r\n if (wizardKey != null)\r\n CloseBaseWizardWindow(wizardKey);\r\n try {\r\n if (WA.ENV.browser.name.toLowerCase() === 'opera') {\r\n FreeWizard(wizardKey);\r\n }\r\n window.close();\r\n } catch (e) {\r\n location.href = \"/\";\r\n }\r\n });\r\n\r\n return false;\r\n}\r\n\r\n/** @deprecated *******/\r\nvar showTopSpinnerTimer = null;\r\nfunction ShowTopSpinnerMessageIfVeryLongQuery(callback) {\r\n if (showTopSpinnerTimer) clearTimeout(showTopSpinnerTimer);\r\n showTopSpinnerTimer = setTimeout(callback, 400);\r\n}\r\n\r\nfunction IsModalShown() {\r\n var dlg = $('.ui-dialog:visible');\r\n return dlg.length > 0;\r\n}\r\n\r\n\r\n/** @deprecated */\r\nfunction ShowTopSpinner(msg, instant, inModal) {\r\n $.when(WA.FormControlsInit).done(function () {\r\n var spinner = WA.CR.spinner;\r\n if (inModal) {\r\n if (instant) {\r\n spinner.showInDialog();\r\n } else {\r\n spinner.showInDialog(2000);\r\n }\r\n } else {\r\n if (instant) {\r\n spinner.show();\r\n } else {\r\n spinner.showDelayed(2000);\r\n }\r\n }\r\n return spinner;\r\n });\r\n};\r\n\r\n/** @deprecated */\r\nfunction ShowTopSpinnerResult(msg, delay, func, inModal) {\r\n ShowTopSpinnerMessageIfVeryLongQuery(function () {\r\n if (delay == null) delay = 2000;\r\n HideTopSpinner(msg, delay, func, inModal);\r\n });\r\n};\r\n\r\n/** @deprecated */\r\nfunction HideTopSpinner(msg, delay, func, inModal) {\r\n $.when(WA.FormControlsInit).done(function () {\r\n WA.CR.spinner.hide(msg, delay, func);\r\n });\r\n}\r\n\r\n/* =================================================================================================================================================== */\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Explorer.aspx===================================================================================================================================== */\r\nfunction ShowAllRows() {\r\n DoAction('show=full', false);\r\n}\r\nfunction ShowAllRowsPostback() {\r\n DoAction('', true, ChangeParamInURL(window.location.href, \"show\", \"full\"));\r\n}\r\n\r\n// Возвращает имя страницы, которая отвечает за отображение объекта.\r\nfunction GetPageNameByKind(kind) {\r\n switch (kind[0].toUpperCase()) {\r\n case \"E\": return \"doc.asp\";\r\n case \"F\": return \"folder.asp\";\r\n case \"J\": return \"job.asp\";\r\n case \"T\": return \"task.asp\";\r\n case \"R\": return \"reference.asp\";\r\n }\r\n return \"\";\r\n}\r\n\r\nfunction MakeHref(link) {\r\n var pagename;\r\n if (link.Type)\r\n pagename = GetPageNameByKind(link.Type);\r\n else\r\n pagename = GetPageNameByKind(link.Kind);\r\n return 'http://' + g_WebServerName + '/' + pagename + '?sys=' + g_SysCode + ((link.CompCode != '') ? '&compcode=' + utf8_decode(link.CompCode) : '') + \"&id=\" + link.ID + \"\\r\\n\";\r\n}\r\n\r\n//utf8 to 1251 converter (1 byte format, RU/EN support only + any other symbols) by drgluck\r\nfunction utf8_decode(aa) {\r\n var bb = '', c = 0;\r\n for (var i = 0; i < aa.length; i++) {\r\n c = aa.charCodeAt(i);\r\n if (c > 127) {\r\n if (c > 1024) {\r\n if (c == 1025) {\r\n c = 1016;\r\n } else if (c == 1105) {\r\n c = 1032;\r\n }\r\n bb += '%' + (c - 848).toString(16);\r\n }\r\n } else {\r\n bb += '%' + c.toString(16);\r\n }\r\n }\r\n return bb;\r\n}\r\n\r\nfunction MakeHrefsFromLinks(links) {\r\n return $.map(links, MakeHref).join('');\r\n}\r\n\r\nfunction GetSelectedID(selected) {\r\n var links = [];\r\n var hrefs = [];\r\n\r\n if (typeof selected === \"undefined\") {\r\n selected = $(\".List.selected\").filter(':visible');\r\n if (selected.length == 0) {\r\n selected = $(\".List.hover\");\r\n }\r\n }\r\n\r\n selected.each(function () {\r\n var item = $(this);\r\n var id = item.data('recid') ? item.data('recid') : item.attr('id');\r\n var compcode = item.attr('compcode');\r\n var kind = item.attr('kind').toUpperCase();\r\n\r\n if (compcode == null) compcode = '';\r\n\r\n var link = { ID: id, Kind: kind, CompCode: compcode, Desc: item.find('div.objectname').text() };\r\n links.push(link);\r\n hrefs.push(MakeHref(link));\r\n });\r\n return { hrefs: hrefs.join(''), links: links }\r\n}\r\n\r\nfunction InitTree() {\r\n $('#Tree').find('li').each(function () {\r\n $(this).addClass(\"CorrectTreeLi\");\r\n });\r\n}\r\n\r\n//============ тулбар ===============\r\n/* Прокрутка дерева папок */\r\nvar scrollTimeout;\r\nfunction incScroll(side) {\r\n var tr = $('#TreeFixedWidth');\r\n tr.scrollLeft(tr.scrollLeft() + (10 * side));\r\n scrollTimeout = setTimeout('incScroll(' + side + ')', 80);\r\n}\r\nfunction InitToolbar() {\r\n //Скрипт для тулбара.\r\n if ($.ipad) return;\r\n $('.ToolbarActionDiv').hover(function () { if (!$(this).hasClass(\"disabled\")) { $(this).addClass('over'); } }, function () { $(this).removeClass('over'); });\r\n WebAccess.ready(function () {\r\n if (ShowWhenAgentEnabled() && WebAccess.current.toolBar.buttons.hasOwnProperty('OpenForEdit')) {\r\n WebAccess.current.toolBar.buttons.OpenForEdit.show();\r\n }\r\n });\r\n //$('.ToolbarActionDiv').find('img[id=SearchToolbar]').each(function () {});\r\n}\r\n//Установка выделенным элемент тулбара.\r\nfunction SetElementToolBar(el, deselect) {\r\n if ($(el).hasClass('selected') || deselect) {\r\n $(el).removeClass('selected');\r\n } else {\r\n $(el).addClass('selected');\r\n }\r\n}\r\nfunction ClearSelectedElements(el) {\r\n $(el).parent().find('div').each(function () { SetElementToolBar(this, true); });\r\n}\r\n\r\n/** @depecated */\r\nfunction CreateTask(opt_withoutAttachments) {\r\n return Core.toolBars.main.createTask(opt_withoutAttachments);\r\n}\r\n\r\n/** @depecated */\r\nfunction CreateFolder() {\r\n return Core.toolBars.main.createFolder();\r\n}\r\n\r\nfunction CreateTaskTM() {\r\n var folder_id = GetParamInURL(\"id\");\r\n if (folder_id == \"\") folder_id = OutboxFolderID;\r\n window.open(\"Task.aspx?mode=NewSR&folder=\" + folder_id, \"CreateTaskTM\");\r\n}\r\n\r\nfunction CreateFromTemplate(folder_id) {\r\n var folder_id = GetParamInURL(\"id\");\r\n if (folder_id == \"\") folder_id = FavoritesFolderID;\r\n CreateNewDocument(\"template\", folder_id);\r\n //window.open(\"doc.aspx?op=createtempl&folder=\" + folder_id);\r\n}\r\nfunction CreateFromFile(folder_id) {\r\n var folder_id = GetParamInURL(\"id\");\r\n if (folder_id == \"\") folder_id = FavoritesFolderID;\r\n CreateNewDocument(\"file\", folder_id);\r\n //window.open(\"doc.aspx?op=createfile&folder=\" + folder_id);\r\n}\r\n\r\nfunction CreateFromTemplateOrFile(folder_id) {\r\n var folder_id = GetParamInURL(\"id\");\r\n if (folder_id == \"\") folder_id = FavoritesFolderID;\r\n CreateNewDocument(\"create\", folder_id);\r\n}\r\n\r\n\r\n/////////////////////////////////////////////////////////\r\nfunction BindToRecord(RecordID, RefName, callback) {\r\n WA.agent.isPluginAvailable(\"clipboard\").always(function (isAvailableResponse) {\r\n if (isAvailableResponse) {\r\n Core.clipboard.getLinksFromClipboard().done(function (links) {\r\n if (links.length > 0 && typeof links != 'string') {\r\n WA.SRV.call('/Session.asmx/BindLinksToRefRecord', { Record: { ID: RecordID, Kind: 'REF', CompCode: RefName }, Links: links })\r\n .success(function (res) {\r\n\r\n if (res == 0) HideTopSpinner(L('NOT_LINKS_TO_BIND'), 2000);\r\n\r\n if (typeof callback != 'undefined') {\r\n callback();\r\n }\r\n else if (res > 0) {\r\n $('form:first').submit();\r\n }\r\n })\r\n .fail(function (error) {\r\n var severity = (error.Severity !== \"-1\" ? Number(error.Severity) : undefined);\r\n WA.CR.inlineHint.show(error, undefined, severity);\r\n });\r\n }\r\n else if (links.length == 0) {\r\n HideTopSpinner(L('NOT_LINKS_TO_BIND'), 2000);\r\n }\r\n }).fail(function (error) {\r\n ShowError(error);\r\n });\r\n } else {\r\n // Агента или плагина нет.\r\n if (g_ViewOnlyMsg != '') {\r\n ShowTopSpinnerResult(g_ViewOnlyMsg, 2000);\r\n } else {\r\n if (typeof callback == 'undefined')\r\n ShowTopSpinner(L(\"BIND_LINKS\"));\r\n //if (RecordID == null) RecordID = GetParamInURL(\"id\");\r\n $.ajax({\r\n type: \"post\",\r\n dataType: \"json\",\r\n contentType: \"application/json; charset=utf-8\",\r\n url: \"/Session.asmx/BindToRecord\",\r\n data: \"{'RecordID': \" + RecordID + \", 'ReferenceName': '\" + RefName + \"'}\",\r\n cache: false,\r\n success: function (res) {\r\n if (!CheckForLoginPage(res)) {\r\n if (res.d.Result != 0) {\r\n if (typeof callback != 'undefined')\r\n callback();\r\n else\r\n $('form:first').submit();\r\n } else {\r\n if (typeof callback == 'undefined')\r\n HideTopSpinner(L(\"NOT_LINKS_TO_BIND\"), 2000);\r\n };\r\n }\r\n }\r\n });\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction UnBindFromRecord(RecordID, RefName, callback) {\r\n var submit = (typeof needSubmit == 'undefined' ? \"\" : needSubmit);\r\n var sourceFol = (typeof SourceID == 'undefined' ? \"\" : SourceID);\r\n\r\n if (g_ViewOnlyMsg != '') {\r\n ShowTopSpinnerResult(g_ViewOnlyMsg, 2000);\r\n } else {\r\n var r;\r\n var chkAll = $('#chkAll');\r\n var DeleteAll = chkAll.length > 0 && chkAll.is(':checked') && !chkAll.hasClass('notallyet');\r\n if (!DeleteAll) {\r\n if (typeof Links == \"undefined\")\r\n r = GetSelectedID().links;\r\n else\r\n r = Links;\r\n } else {\r\n r = [{ 'ID': 0, 'Kind': 'ALL' }];\r\n }\r\n\r\n\r\n if (r.length > 0) {\r\n ConfirmDialogNew({\r\n text: L('CONFIRM_DELETE_LINKS', r.length),\r\n ok: function () {\r\n ShowTopSpinner(L(\"DELETE_LINKS\"));\r\n CallService(\"/Session.asmx/UnBindFromRecord\", { Links: r, RecordID: (RecordID), ReferenceName: RefName }, function (res) {\r\n if (res.Success) {\r\n res = res.Result;\r\n if (res != 0) {\r\n if ((typeof needSubmit == 'undefined') || (submit)) {\r\n if (typeof callback != 'undefined')\r\n callback();\r\n else\r\n $('form:first').submit();\r\n }\r\n }\r\n else {\r\n if (typeof needSubmit == 'undefined') HideTopSpinner(L(\"NO_RIGHT_DELETE_LINKS\"), 2000);\r\n }\r\n } else {\r\n HideTopSpinner(res.Error, 2000);\r\n }\r\n });\r\n },\r\n cancel: null,\r\n width: 'auto'\r\n });\r\n } else {\r\n ShowTopSpinnerResult(L(\"OBJECTS_NOT_SELECTED\"), 2000);\r\n }\r\n }\r\n}\r\n\r\n//=========================\r\n\r\n//---- leftPanel toggle\r\nfunction ShowFolder(el) {\r\n var tree = $('#Tree');\r\n $('.show-folder-link').hide();\r\n $('.explorer-header__logo').show();\r\n $('#Search').hide();\r\n $('#RunList').hide();\r\n $('#NameFilter').hide();\r\n tree.show();\r\n $('#spinner').hide();\r\n\r\n ShowFolderTree(el);\r\n\r\n $('#tree_container').redraw();\r\n $('#main_container').redraw();\r\n}\r\nfunction CustomSearch(name, el) {\r\n $('.explorer-header__logo').hide();\r\n $('.show-folder-link').show();\r\n\r\n ClearSelectedElements(el);\r\n SetElementToolBar(el);\r\n $('#Search').show();\r\n LoadSearch(name, $('#Search'));\r\n $('#Tree').hide();\r\n $(\"#tree_container\").redraw();\r\n}\r\nfunction JobSearch(el) {\r\n CustomSearch(\"JOB_SEARCH\", el);\r\n $(\"#tree_container\").redraw();\r\n}\r\nfunction SearchEDoc(el) {\r\n CustomSearch(\"EDOCUMENT_SEARCH\", el);\r\n $(\"#tree_container\").redraw();\r\n}\r\nfunction TaskSearch(el) {\r\n CustomSearch(\"TASK_SEARCH\", el);\r\n $(\"#tree_container\").redraw();\r\n}\r\nfunction GeneralSearch(el) {\r\n CustomSearch(\"GENERAL_SEARCH\", el);\r\n $(\"#tree_container\").redraw();\r\n}\r\n\r\nfunction ShowSearchLoader(obj) {\r\n obj.children().hide();\r\n if (obj.find('#spinner').length === 0)\r\n obj.prepend('
    \"'
    ');\r\n\r\n obj.find('#spinner').show();\r\n}\r\n\r\nfunction LoadSearch(SearchName, obj) {\r\n if ($('#' + SearchName).length == 0) {\r\n ShowSearchLoader(obj);\r\n $.ajax({\r\n type: \"GET\",\r\n dataType: \"html\",\r\n url: \"DynControl.ashx?c=search&name=\" + SearchName,\r\n cache: false,\r\n success: function (res) {\r\n if (!CheckForLoginPage(res)) {\r\n obj.children().hide();\r\n //obj.append('
    ' + res + '
    ');\r\n obj.append(res);\r\n $('#spinner').hide();\r\n $(\"#spinner\").redraw();\r\n $(\"#main_container\").redraw();\r\n ChangePositionSearchButtons(SearchName);\r\n }\r\n if (SearchName === \"SrchGeneral\") {\r\n DisableIsAllCheckboxNotChecked(\"\", 'input.Search_Btn:first');\r\n }\r\n }\r\n });\r\n } else {\r\n $('#Search').children().hide();\r\n $('#' + SearchName).show();\r\n ChangePositionSearchButtons(SearchName);\r\n }\r\n}\r\n\r\n// Если критериев поиска очень много, то меняем css блока с критериями, чтобы кнопки поиска были всегда навиду\r\nfunction ChangePositionSearchButtons(SearchName) {\r\n setTimeout(function () {\r\n if (typeof (SearchName) != 'object') {\r\n var jSearch = $('#' + SearchName);\r\n var heightNew = windowHeight() - $('#header').height() - $('#toolbar_container').height() - jSearch.find('.LastSearch').height() * 2 - jSearch.find('.Search_Btn_Td').height() * 2 - 13;\r\n var jsearchCriterias = jSearch.find('.Search_Criterias');\r\n var jsearchCriteriasDiv = jSearch.find('.Search_Criterias>div');\r\n var searchCriteriasDivHeight = jsearchCriteriasDiv.height();\r\n var searchCriteriasHeight = jsearchCriterias.height();\r\n if ((searchCriteriasHeight > heightNew) || (jsearchCriteriasDiv.height() > searchCriteriasHeight)) {\r\n jsearchCriterias.css({ height: heightNew, \"margin-right\": \"-10px\", \"padding-right\": \"10px\", \"overflow\": \"scroll\", \"overflow-x\": \"hidden\" });\r\n }\r\n if (searchCriteriasDivHeight && searchCriteriasDivHeight < heightNew) {\r\n jsearchCriterias.css({ height: jsearchCriteriasDiv.height(), \"overflow\": \"hidden\" });\r\n }\r\n }\r\n }, 10);\r\n}\r\n\r\nfunction AfterSearch() {\r\n var searchId = $('.Search_Table:visible').parent().attr('id');\r\n if (searchId != undefined) {\r\n ChangePositionSearchButtons(searchId);\r\n if (searchId === \"SrchGeneral\") {\r\n DisableIsAllCheckboxNotChecked(\"\", 'input.Search_Btn:first');\r\n }\r\n }\r\n}\r\n\r\nfunction ExecuteSearch(name, sort) {\r\n var f = $(\"form:first\");\r\n var url = f.attr('action');\r\n ShowTopSpinner(L(\"SEARCHING\"));\r\n url = ChangeParamInURL(url, 'searchname', name);\r\n url = ChangeParamInURL(url, 'mode', 'search');\r\n url = RemoveParamInURL(url, 'show');\r\n if (name == 'SrchGeneral') {\r\n url = ChangeParamInURL(url, 'sort', '-RANK');\r\n } if (sort) {\r\n url = ChangeParamInURL(url, 'sort', sort);\r\n } else {\r\n url = RemoveParamInURL(url, 'sort');\r\n }\r\n url = RemoveParamInURL(url, 'uid');\r\n url = RemoveParamInURL(url, 'refcode');\r\n url = RemoveParamInURL(url, 'treeitem');\r\n f.attr('action', url);\r\n f.submit();\r\n}\r\n\r\n/**\r\n* Запускает поиск последних объектов, с которыми взаимодействовал пользователь.\r\n* @global\r\n* @param {String} searchName - имя поиска\r\n* @param {String} objType - тип искомых объектов\r\n* @function showLastObjects\r\n*/\r\nfunction showLastObjects(searchName, objType) {\r\n switch (objType) {\r\n case \"EDOC\":\r\n executeLastActedObjectsSearch(searchName, 'SrchDocPseudoReader', 'SrchDocPseudoReaded');\r\n break;\r\n case \"JOB\":\r\n executeLastActedObjectsSearch(searchName, 'SrchJobPseudoModifier', 'SrchJobPseudoModified');\r\n case \"TASK\":\r\n executeLastActedObjectsSearch(searchName, 'SrchTaskPseudoModifier', 'SrchTaskPseudoModified');\r\n case \"FOL\":\r\n executeLastActedObjectsSearch(searchName, 'SrchFolPseudoModifier', 'SrchFolPseudoModified');\r\n break;\r\n case \"REF\":\r\n DoAction('mode=lastobjects&sort=-MODIFIED&objtype=REF&searchname=' + searchName + '&-uid', false);\r\n break;\r\n }\r\n}\r\n\r\n/**\r\n* Заполняет критерии для поиска последних объектов, с которыми взаимодействовал пользователь, и запускает поиск на выполнение.\r\n* @global\r\n* @param {String} searchName - имя поиска\r\n* @param {String} actedByRequisiteId - ИД контрола с реквизитом, определяющим пользователя, для которого выполняется поиск\r\n* @param {String} actedDateRequisiteId - ИД контрола с реквизитом, определяющим дату, за которую требуется произвести поиск\r\n* @function executeLastActedObjectsSearch\r\n*/\r\nfunction executeLastActedObjectsSearch(searchName, actedByRequisiteId, actedDateRequisiteId) {\r\n //Устанавливаем текущего пользователя\r\n $.when(WA.UserInfoInit).then(function () {\r\n $('#' + actedByRequisiteId).SetValue([Constants.usersReference.REFERENCE_NAME + ':' + WA.current.user.ID, WA.current.user.fullName, WA.current.user.fullName], false);\r\n\r\n //Устанавливаем дату поиска (-2 недели дней)\r\n var lastWeek = (new Date()).getTime() - 2 * 604800000;\r\n var fromDate = new Date(lastWeek);\r\n\r\n $(\"#Search\").find('input[id$=' + actedDateRequisiteId + ']').val(formatDate(fromDate));\r\n\r\n ExecuteSearch(searchName, \"-MODIFIED\");\r\n });\r\n}\r\n\r\nfunction ShowReferences(el) {\r\n ClearSelectedElements(el);\r\n SetElementToolBar(el);\r\n\r\n ShowSearchLoader($(\"#Search\"));\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/Reference.asmx/GetAllReferences\",\r\n data: \"{}\",\r\n success: function (res) {\r\n if (!CheckForLoginPage(res)) {\r\n if (res.d.Success) {\r\n var refs = res.d.Result;\r\n $(\"#Search\").empty();\r\n template(\"ReferenceList\", \"#Search\", { 'HeaderText': L(\"REFERENCES\"), 'IconAlt': L(\"REFERENCE\"), 'refs': refs }, {});\r\n }\r\n }\r\n }\r\n });\r\n\r\n $('#Tree').hide();\r\n $('div.SizeLeftRegion:first').css(\"overflow\", \"visible\");\r\n}\r\n\r\nfunction FindParam(aoData, name) {\r\n for (var i = 0, count = aoData.length; i < count; i++) {\r\n if (aoData[i].name == name) return aoData[i].value;\r\n }\r\n}\r\n\r\nfunction ShowReferenceRecords(refCode, additional, el) {\r\n var defaultAction = function () {\r\n //ShowTopSpinner(L('PLEASE_WAIT'));\r\n var url = 'mode=RefRecords&compcode=' + refCode + '&-ID&-filter&-refview&-fpath&' + additional;\r\n if (el && $(el).data('ex')) {\r\n var ex = $(el).data('ex');\r\n url = PrepareUrl(\"/ReferenceRecords.aspx\" + window.location.search, url);\r\n url = RemoveParamInURL(url, \"caption\");\r\n if (url.charAt(url.length - 1) == '&')\r\n url = url.substr(0, url.length - 1);\r\n if (ex.refview) {\r\n url += '&refview=' + encodeURIComponent(ex.refview);\r\n }\r\n if (ex.filter) {\r\n url += '&filter=' + encodeURIComponent(ex.filter);\r\n }\r\n if (ex.caption) {\r\n url += \"&caption=\" + ex.caption;\r\n }\r\n window.open(url);\r\n } else {\r\n DoAction(url);\r\n }\r\n return false;\r\n };\r\n\r\n var linkData = $(el).data('ex');\r\n if (!linkData) {\r\n defaultAction();\r\n return false;\r\n }\r\n\r\n var jsAction = linkData.jsAction;\r\n //Если кто-то прописал свой js-action в веб-модуле\r\n if (!!jsAction) {\r\n var action = new Function(jsAction);\r\n linkData.continueDefaultAction = defaultAction;\r\n if (action.call(linkData) === false) return false;\r\n }\r\n\r\n defaultAction();\r\n return false;\r\n}\r\n\r\nfunction CreateRefRecord(RefCode, parent) {\r\n Reference_CreateRecord(RefCode, parent);\r\n}\r\n\r\nfunction Reference_CreateRecord(RefCode, parent, fillreq, refview, afterCreateCallback, envVars, params) {\r\n var parentParam = '';\r\n\r\n if (parent != null) {\r\n if (WA.CR.form.isExist()) {\r\n var parentReq = WA.CR.form.getRequisiteByControlId(parent);\r\n if (parentReq === null) {\r\n for (var tableName in WA.CR.form.controls.tables) {\r\n parentReq = WA.CR.form.controls.tables[tableName].getRequisiteByControlId(parent);\r\n };\r\n };\r\n if (parentReq !== null) {\r\n parentParam = \"&parent=\" + parentReq.fullName;\r\n }\r\n } else {\r\n parentParam = \"&parent=\" + parent;\r\n }\r\n }\r\n if (typeof fillreq == 'undefined') {\r\n fillreq = null;\r\n }\r\n if (typeof params == 'undefined') {\r\n params = null;\r\n }\r\n var filter = GetParamInURL(\"filter\");\r\n var view = refview || GetParamInURL(\"refview\");\r\n\r\n ShowTopSpinner(L('PLEASE_WAIT'), true);\r\n\r\n if (IsUseOurFirm(RefCode)) {\r\n\r\n var firms = GetAllOurFirms();\r\n if (firms.length > 1) {\r\n var form = CreateOurFirmSelectForm(firms);\r\n var dialog = new WA.components.dialogs.BaseDialog();\r\n dialog.title = L(\"OUR_FIRMS\");\r\n dialog.html = form.render();\r\n dialog.isShowCancelButton = true;\r\n dialog.ok = function () {\r\n ShowTopSpinner(L('PLEASE_WAIT'), true);\r\n SetOurFirmID(form.getValue('FIRM_SELECT'));\r\n NewRecordService(RefCode, fillreq, view, parentParam, firms, afterCreateCallback, envVars, params);\r\n };\r\n dialog.show();\r\n } else {\r\n if (firms.length == 1) {\r\n SetOurFirmID(firms[0].ID);\r\n }\r\n NewRecordService(RefCode, fillreq, view, parentParam, firms, afterCreateCallback, envVars, params);\r\n }\r\n } else {\r\n NewRecordService(RefCode, fillreq, view, parentParam, null, afterCreateCallback, envVars, params);\r\n }\r\n}\r\n\r\nfunction CreateOurFirmSelectForm(firms) {\r\n var CP = WA.components;\r\n var form = new CP.forms.FormBuilder(\"filter_save_modal\");\r\n var pickRequisites = {};\r\n for (var i = 0; i < firms.length; i++) {\r\n pickRequisites[firms[i].ID] = firms[i].Name.replace(/\"/g, '"');\r\n }\r\n form.addPick('FIRM_SELECT', pickRequisites);\r\n return form;\r\n}\r\n\r\nfunction IsUseOurFirm(RefCode) {\r\n var useOurFirm = false;\r\n CallServiceSync(\"/Reference.asmx/IsUseOurFirm\", { ReferenceCode: RefCode }, function (res) {\r\n useOurFirm = res;\r\n });\r\n return useOurFirm;\r\n}\r\n\r\nfunction GetAllOurFirms() {\r\n var firms = null;\r\n CallServiceSync(\"/OurFirm.asmx/GetOurFirmList\", {}, function (res) {\r\n firms = res;\r\n });\r\n return firms;\r\n}\r\n\r\nfunction SetOurFirmID(FirmID) {\r\n CallServiceSync(\"/OurFirm.asmx/SetOurFirm\", { OurFirmID: FirmID });\r\n}\r\n\r\nfunction NewRecordService(RefCode, fillreq, view, parentParam, firms, afterCreateCallback, envVars, params) {\r\n if (typeof envVars === 'undefined') {\r\n envVars = null;\r\n }\r\n\r\n if (typeof params === 'undefined') {\r\n params = null;\r\n }\r\n\r\n CallServiceSync(\"/Reference.asmx/NewRecordWithEnvironmentAndParams\", { ReferenceCode: RefCode, RequisiteValuesJSON: fillreq, EnvironmentVarsJSON: envVars, ParamsJSON: params }, function (res) {\r\n if (res.Success) {\r\n if (firms != null && firms.length > 1) {\r\n CallServiceSync(\"/OurFirm.asmx/ClearOurFirm\", {});\r\n }\r\n var RecID = res.Result;\r\n if (afterCreateCallback) afterCreateCallback(RecID);\r\n\r\n var customTitle = '';\r\n // Это нужно только если ссылку формируют из списка записей справочника.\r\n if (WA.getLocation() === 'referencerecords') {\r\n var currentCaption = $(\".card-header__label\").data('pluraltitle');\r\n if (currentCaption) {\r\n customTitle = \"&title=\" + encodeURI(currentCaption);\r\n }\r\n }\r\n\r\n window.open(\"/Reference.aspx?sys=\" + g_SysCode + \"&ext=\" + g_ExtName + \"&compcode=\" + encodeURI(RefCode) + \"&id=\" + RecID + \"&refview=\" + view + customTitle + parentParam, 'Ref' + RecID);\r\n HideTopSpinner();\r\n } else {\r\n var severity = (res.Severity !== \"-1\" ? Number(res.Severity) : undefined);\r\n WA.CR.inlineHint.show(res.Error, undefined, severity);\r\n HideTopSpinner();\r\n }\r\n });\r\n}\r\n\r\n//-------------------------------\r\n\r\n//=========== Обзор объекта ===============\r\nfunction ShowAddRegion(obj, isDoc, reload) {\r\n var tr;\r\n if (!reload)\r\n tr = $(obj).parent().parent();\r\n else\r\n tr = $(obj);\r\n var trAdd;\r\n var tdAdd;\r\n var id = tr.attr('id');\r\n var kind = tr.attr('kind');\r\n var isAdded = tr.next().hasClass('AddRegion');\r\n if (!isAdded) {\r\n tr.after('' +\r\n '' +\r\n ((tr.children().length > 3) ? '' : '') +\r\n '');\r\n if (isDoc && tr.hasClass(\"t_even\")) {\r\n var added = tr.next();\r\n added.addClass(\"t_even\");\r\n }\r\n }\r\n trAdd = tr.next();\r\n if (trAdd.is(':hidden') || !isAdded || reload) {\r\n var helper = L(\"PLEASE_WAIT\");\r\n trAdd.show();\r\n if (!isDoc) {\r\n trAdd.css('text-align', 'center');\r\n trAdd.css('vertical-align', 'middle');\r\n }\r\n\r\n tdAdd = $(trAdd.children()[2]);\r\n tdAdd.html(' ' + helper + '');\r\n LoadAddRegion(tdAdd, id, kind, \"SHOWVERLIST\");\r\n if (!isDoc) {\r\n var img = $(obj).children().find('img');\r\n $(img).attr(\"src\", \"/App_Sprites/Circle_ArrowUp.png\");\r\n }\r\n tr.addClass(\"RegionAdded\");\r\n } else {\r\n if (!isDoc) {\r\n var img = $(obj).children().find('img');\r\n $(img).attr(\"src\", \"/App_Sprites/Circle_ArrowDown.png\");\r\n }\r\n trAdd.hide();\r\n tr.removeClass(\"RegionAdded\");\r\n }\r\n tr.attr('ShowAddRegion', '1');\r\n}\r\n\r\nfunction DocShowAddRegion(obj) {\r\n ShowAddRegion(obj, true);\r\n}\r\nfunction LoadAddRegion(obj, id, kind, view) {\r\n $.ajax({\r\n type: \"GET\",\r\n dataType: \"html\",\r\n url: \"DynControl.ashx?c=addRegion&ID=\" + id + \"&kind=\" + kind + \"&view=\" + view,\r\n cache: false,\r\n success: function (res) {\r\n if (!CheckForLoginPage(res)) {\r\n var el = obj.parent().prev();\r\n if (el.hasClass('unread')) {\r\n el.removeClass('unread');\r\n ChangeUnreadCountInTree(-1);\r\n }\r\n obj.html(res);\r\n }\r\n }\r\n });\r\n}\r\nfunction AddRegionTo(obj, view) {\r\n var td = $(obj).parents(\".AddRegion_Table\").parent();\r\n var tr = td.parent();\r\n LoadAddRegion(td, tr.attr('id'), tr.attr('kind'), view);\r\n};\r\nfunction MakeReadedWhenClick(el) {\r\n var tr = $(el).parents('.List:first');\r\n //Убираем признак только на клиенте, на сервере сам убирается\r\n if (tr.hasClass('unread')) {\r\n tr.removeClass('unread');\r\n // Задерживаем обновление значения в дереве, чтобы серверное значение успело обновиться.\r\n setTimeout(function () {\r\n ChangeUnreadCountInTree(-1);\r\n }, 700);\r\n }\r\n}\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Изменение счетчика непрочитанных элементов папки, в дереве папок.\r\n* @function ChangeUnreadCountInTree\r\n* @global\r\n* @param {integer} d - вычитаемое или добавляемое число (напр. 1, -1, 2);\r\n*/\r\nfunction ChangeUnreadCountInTree(d) {\r\n // Обновить счетчик непрочитанных для текущей папки\r\n WA.CR.folderTree.updateUnreadJobCount(WA.CR.ID, true);\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n// Используется для открытия инструкций.\r\nfunction wopenf(url, name, withoutmenu, width, height) {\r\n try {\r\n if (withoutmenu) {\r\n var left = (window.screen.availWidth - width) / 2;\r\n var top = (window.screen.availHeight - height) / 2;\r\n var oSize = 'left=' + left + 'px,top=' + top + 'px,width=' + width + 'px,height=' + height + 'px,';\r\n oWindow = window.open(url, name, oSize + \"resizable=yes,toolbar=0,location=0,status=0,menubar=0,directories=0,scrollbars=yes\");\r\n }\r\n else {\r\n oWindow = window.open(url, name, \"resizable=yes,toolbar=1,location=1,status=1,menubar=1,directories=1,scrollbars=yes\");\r\n }\r\n if (oWindow != null) { oWindow.focus(); }\r\n else { alert(g_ErrMes); }\r\n } catch (e) { alert(e.message); };\r\n return false;\r\n}\r\n/* =================================================================================================================================================== */\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Doc.aspx========================================================================================================================================== */\r\n// Тулбар\r\nfunction UnlockEDoc() {\r\n DoAction('__POSTBACK_ACTION=UnlockEDoc', true);\r\n}\r\nfunction LockEDoc() {\r\n DoAction('__POSTBACK_ACTION=LockEDoc', true);\r\n}\r\n/* =================================================================================================================================================== */\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Job.aspx========================================================================================================================================== */\r\nfunction SaveInJob() {\r\n UnbindBeforeUnload();\r\n SaveInBaseJob(false);\r\n}\r\n\r\nfunction SaveAndCloseJob() {\r\n UnbindBeforeUnload();\r\n SaveInBaseJob(true);\r\n}\r\n\r\nfunction AcceptContolJob() {\r\n UnbindBeforeUnload();\r\n if ('undefined' != typeof (g_LeadJobID) && g_LeadJobID != 0) {\r\n if ($(\"#modal\").length == 0)\r\n $(\"body\").append('
    ')\r\n\r\n var msg = g_ConfirmParam.Content;\r\n\r\n var $dialog = $(\"#modal\")\r\n .html(msg)\r\n .dialog({\r\n resizable: false,\r\n modal: true,\r\n autoOpen: true,\r\n width: 510,\r\n title: L(\"CONFIRMATION\"),\r\n buttons:\r\n [\r\n {\r\n text: L(\"PERFORM\"), click: function () { BaseAcceptContolJob(1); $(this).dialog(\"close\"); }\r\n },\r\n {\r\n text: L(\"NOT_PERFORM\"), click: function () { BaseAcceptContolJob(2); $(this).dialog(\"close\"); }\r\n },\r\n {\r\n text: L(\"OPEN\"), click: function () { BaseAcceptContolJob(3); $(this).dialog(\"close\"); }\r\n },\r\n {\r\n text: L(\"CANCEL\"), click: function () { $(this).dialog(\"close\"); }\r\n }\r\n ]\r\n });\r\n AdjustDialogIfIpad(500);\r\n InitHoverForButtons($dialog.next());\r\n } else {\r\n BaseAcceptContolJob(null);\r\n }\r\n}\r\n\r\nfunction Job_SetFocusToEditText() {\r\n var el = $('textarea.Job_Edit_Text_Area_Control');\r\n if (!$.ipad && el.length == 1) {\r\n el.focus();\r\n }\r\n}\r\n\r\n/* =================================================================================================================================================== */\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Task.aspx========================================================================================================================================= */\r\nfunction DoHighImportance(el) {\r\n DoImportance(el, \"High\", 'selected');\r\n}\r\nfunction DoLowImportance(el) {\r\n DoImportance(el, \"Low\", 'selected');\r\n}\r\n/*function ChangeStandartRoute(el) {\r\nBaseChangeStandartRoute(el, 'selected');\r\n}*/\r\nfunction CancelStandartRoute() {\r\n BaseCancelStandartRoute(function () {\r\n CloseWindow();\r\n });\r\n}\r\nfunction Task_SetFocusToEditText() {\r\n var el = $('textarea.Card_Task_EditText');\r\n if (!$.ipad && el.length == 1) {\r\n el.focus();\r\n }\r\n}\r\n/* =================================================================================================================================================== */\r\n/* =================================================================================================================================================== */\r\n\r\n/* =Reference.aspx========================================================================================================================================= */\r\n\r\nfunction ReferenceCard_ShowTab(el, Num) {\r\n var tab = $('#RefCardTab' + Num);\r\n if (tab.length == 0) {\r\n DoAction('TabNum=' + Num, false);\r\n } else {\r\n $('.ViewPanel_Tr_card').removeClass('ViewPanel_Tr_Selected_card');\r\n $('.Reference_Tab').hide();\r\n\r\n $(el).addClass('ViewPanel_Tr_Selected_card');\r\n tab.show();\r\n }\r\n}\r\n\r\nfunction ReferenceCard_ShowDefaultTab(Num) {\r\n DoAction('TabNum=' + Num, false);\r\n}\r\n\r\nfunction Reference_IsDisabled(btn) {\r\n return $(btn).hasClass('disabled');\r\n}\r\n\r\nfunction Reference_GetPrefix() {\r\n return $('.ReferenceCard').data('prefix');\r\n}\r\n\r\nfunction Reference_GetName() {\r\n return WA.CR.getReferenceCode();\r\n}\r\n\r\nfunction Reference_GetView() {\r\n return WA.CR.getReferenceView();\r\n}\r\n\r\nfunction Reference_GetRecordID() {\r\n return WA.CR.getID();\r\n}\r\n\r\nfunction Reference_Save(btn, SuccessCallback, isAutoSave) {\r\n function getNewRecordName() {\r\n var result = \"\";\r\n CallServiceSync(\"/Reference.asmx/GetRecords\", {\r\n \"ReferenceCode\": WA.CR.getReferenceCode(),\r\n \"FilterExpression\": \"[\" + L(\"REQID\") + \"] = \" + WA.CR.getID(),\r\n \"FilterValue\": \"\",\r\n \"Requisites\": [L(\"REQNAME\")],\r\n \"RecordsCount\": 1,\r\n \"StartFromRecord\": 0,\r\n \"SortIndex\": 0,\r\n \"SortDirection\": 0\r\n }, function (res) {\r\n result = res.Result[0].Requisites[0].Value;\r\n });\r\n return result;\r\n }\r\n\r\n if (!Reference_IsDisabled(btn)) {\r\n\r\n if (isAutoSave) {\r\n WA.CR.form.save(function (ok) {\r\n if (ok && SuccessCallback) SuccessCallback();\r\n }, false);\r\n } else {\r\n ShowTopSpinner(L(\"REF_REC_SAVING\"));\r\n $('html').trigger('CardFormSave');\r\n var parentId = decodeURI(decodeURI(GetParamInURL('parent')));\r\n\r\n\r\n var button = new WA.CMP.wrappers.toolBar.ToolBarButton(btn);\r\n button.disable();\r\n\r\n WA.CR.form.save(function (ok) {\r\n button.enable();\r\n\r\n HideTopSpinner();\r\n if (ok) {\r\n if (!!window.opener) {\r\n if (!!parentId) {\r\n var name = getNewRecordName();\r\n window.opener.document.setOpenersRequisite(parentId, WA.CR.getID(), name);\r\n } else {\r\n window.opener.NeedUpdateOnChildClose = true;\r\n }\r\n }\r\n\r\n if (SuccessCallback) {\r\n SuccessCallback();\r\n }\r\n else {\r\n UnbindBeforeUnload();\r\n window.location.reload();\r\n }\r\n }\r\n }, true);\r\n }\r\n }\r\n}\r\n\r\nvar setOpenersRequisite = window.document.setOpenersRequisite = function (reqName, value, displayValue) {\r\n if (!reqName) return;\r\n\r\n if (WA.CR.form.isExist()) {\r\n\r\n var req = WA.CR.form.requisites[reqName];\r\n if (!req) req = WA.CR.form.getRequisiteByControlId(reqName);\r\n if (!req) {\r\n var tables = WA.CR.form.controls.tables;\r\n for (name in tables) {\r\n if (!$.isFunction(tables[name]) && tables[name].className) {\r\n req = tables[name].getRequisiteByControlId(reqName);\r\n if (req) break;\r\n };\r\n };\r\n }\r\n\r\n if (req) {\r\n req.setValue(value, displayValue);\r\n };\r\n\r\n } else {\r\n $(\"#\" + reqName).SetValue(['' + value, '' + displayValue, '' + displayValue, {}])\r\n ProcessEmptyChecks();\r\n }\r\n};\r\n\r\nfunction Reference_SaveAndClose(btn, successCallback) {\r\n Reference_Save(btn, function () {\r\n if (successCallback) successCallback();\r\n\r\n setTimeout(function () {\r\n var parentId = decodeURI(decodeURI(GetParamInURL('parent')));\r\n if (window.opener && (parentId == null || parentId === '')) {\r\n try {\r\n WA.CR.window.updateParentExplorerContent();\r\n WA.CR.window.unbind('beforeClose');\r\n window.close();\r\n } catch (e) {\r\n console.error($.toJSON(e));\r\n }\r\n } else {\r\n WA.CR.window.close();\r\n }\r\n }, 100);\r\n });\r\n}\r\n\r\nfunction Reference_ForceUpdateRequisitesFromDatabase(callback) {\r\n CallServiceSync(\"/Reference.asmx/ForceUpdateRequisitesFromDatabase\", { RefCode: $(\"#RefCode\").val(), RecID: GetParamInURL(\"id\") }, function (res) {\r\n if (res.Success) {\r\n if (callback) callback();\r\n }\r\n });\r\n}\r\n\r\nfunction Reference_ContextMenu_Card_OnCreate(item, menu) {\r\n var el = menu.lastElement;\r\n var RefCode = el.data('refcode');\r\n var RecID = el.data('recid');\r\n item.href = \"/Reference.aspx?sys=\" + g_SysCode + \"&ext=\" + g_ExtName + \"&compcode=\" + RefCode + \"&id=\" + RecID;\r\n item.target = \"Ref\" + RefCode + RecID;\r\n}\r\n\r\nfunction Reference_ContextMenu_Copy_OnCreate(item, menu) {\r\n var el = menu.lastElement;\r\n var RefCode = el.data('refcode');\r\n var RecID = el.data('recid');\r\n item.onClick = function () {\r\n Reference_CopyRecord(RefCode, RecID);\r\n }\r\n}\r\n\r\n\r\nfunction Reference_ContextMenu_Delete_OnCreate(item, menu) {\r\n var el = menu.lastElement;\r\n var RefCode = el.data('refcode');\r\n var RecID = el.data('recid');\r\n\r\n item.onClick = function () {\r\n Reference_ContextMenu_Delete(RefCode, RecID);\r\n }\r\n}\r\n\r\n/**\r\n* Удаление записи справочника из грида.\r\n*/\r\nfunction Reference_ContextMenu_Delete(RefCode, RecID) {\r\n RefCode = RefCode || WA.CR.getReferenceCode();\r\n\r\n ConfirmDialogNew({\r\n text: L(\"CONFIRM_RECORD_DELETE\"),\r\n okText: L(\"YES\"),\r\n cancelText: L(\"NO\"),\r\n ok: function () {\r\n WA.SRV.reference.deleteRecord(RefCode, RecID).success(function () {\r\n Core.grid.reference.reloadData();\r\n setTimeout(function () {\r\n WA.CR.objectList.fire(\"itemUnSelect\", {});\r\n }, 500);\r\n });\r\n }\r\n });\r\n}\r\n\r\n\r\n/**\r\n * Удаление записи справочника.\r\n * В списке записей мы окно не закрываем. * Когда удаялем из карточки, то закрываем её.\r\n *\r\n * @global\r\n * @function Reference_DeleteRecord_ToolItemClick\r\n * @param {int} recordId идентификатор записи\r\n * @param {string} refCode код справочника\r\n */\r\nfunction Reference_DeleteRecord_ToolItemClick(recordId, refCode) {\r\n\r\n ConfirmDialogNew({\r\n text: L(\"CONFIRM_RECORD_DELETE\"),\r\n okText: L(\"YES\"),\r\n cancelText: L(\"NO\"),\r\n ok: function () {\r\n var referenceCode = refCode || WA.current.getReferenceCode();\r\n WA.SRV.reference.deleteRecord(referenceCode, recordId).success(function () {\r\n //Закрытие текущей страницы происходит только если мы находимся в карточке и удаляем текущую запись.\r\n //при удалении на странице со списком записи справочника и на вкладке карточки с компонентой справочника закрытие страницы не требуется\r\n if (WA.getLocation() === \"referencerecords\") {\r\n Core.grid.reference.reloadData();\r\n Core.grid.reference.grid.getSelectedRows([]);\r\n } else {\r\n if (window.opener && window.opener.Core.grid.reference.grid) {\r\n window.opener.Core.grid.reference.reloadData();\r\n window.opener.Core.grid.reference.grid.getSelectedRows([]);\r\n } else {\r\n UnbindBeforeUnload();\r\n WA.CR.window.updateParentExplorerContent().reloadParentGrid();\r\n }\r\n WA.CR.window.close();\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Удаляет выделенные записи справочника.\r\n */\r\nfunction DeleteSelectedRecords() {\r\n var items = WA.CR.objectList.getSelectedItems();\r\n if (items.length > 0) {\r\n var confirmDialogMessage = (items.length === 1) ? L(\"CONFIRM_RECORD_DELETE\") : L(\"CONFIRM_SELECTED_RECORDS_DELETE\");\r\n ConfirmDialogNew({\r\n text: confirmDialogMessage,\r\n okText: L(\"YES\"),\r\n cancelText: L(\"NO\"),\r\n ok: function () {\r\n var deferreds = [];\r\n items.forEach(function (item) {\r\n deferreds.push(WA.SRV.reference.deleteRecord(item.referenceCode, item.id));\r\n });\r\n\r\n //когда все записи удалятся, обновляем грид\r\n $.when.apply($, deferreds).always(function () {\r\n Core.grid.reference.reloadData();\r\n Core.grid.reference.grid.getSelectedRows([]);\r\n });\r\n }\r\n });\r\n }\r\n else {\r\n HideTopSpinner(L(\"OBJECTS_NOT_SELECTED\"), 2000);\r\n }\r\n}\r\n\r\nfunction Reference_CopyRecord(RefCode, RecID, callback) {\r\n ShowTopSpinner(L(\"REF_REC_COPYING\"));\r\n CallServiceSync(\"/Reference.asmx/CopyRecord\", { ReferenceCode: RefCode, SourceRecordID: RecID }, function (res) {\r\n if (res.Success) {\r\n if (res.Warning != null && res.Warning != '') {\r\n ErrorShow(res.Warning, false);\r\n }\r\n HideTopSpinner(L(\"REF_REC_COPYING_COMPLETE\"), 2000);\r\n var view = GetParamInURL(\"refview\");\r\n // Открываем новую запись.\r\n window.open(\"/Reference.aspx?sys=\" + g_SysCode + \"&ext=\" + g_ExtName + \"&compcode=\" + encodeURI(RefCode) + \"&id=\" + res.Result + \"&refview=\" + view, 'Ref' + res.Result);\r\n } else {\r\n var severity = (res.Severity !== \"-1\" ? Number(res.Severity) : undefined);\r\n WA.CR.inlineHint.show(res.Error, undefined, severity);\r\n HideTopSpinner(\"\", 0);\r\n }\r\n }, function () { HideTopSpinner(\"\", 0); });\r\n}\r\n\r\nfunction Reference_CopyRecord_ToolItemClick(RecID) {\r\n var RefCode = $('#RefCode').val();\r\n Reference_CopyRecord(RefCode, RecID);\r\n}\r\n\r\nfunction BaseCloseRecordCard(RefName, RecID) {\r\n window.onunload = function () { FreeRecord(RefName, RecID); }\r\n}\r\n\r\nfunction CloseRecordCardWindow(msg, RefName, RecID) {\r\n BaseCloseRecordCard(RefName, RecID);\r\n try {\r\n //UnbindBeforeUnload();\r\n //Вызывает освобождение объекта явно, т.к. перезагрузка окна прерывает \"анализатор открытости окна\".\r\n if (WA.ENV.browser.name.toLowerCase() === 'opera') {\r\n FreeRecord(RefName, RecID);\r\n }\r\n CloseWindow();\r\n //BindBeforeUnload();\r\n } catch (ex) { }\r\n return false;\r\n}\r\nfunction FreeRecord(RefName, RecID) {\r\n var R;\r\n var WSSParam = GetWSSParam(location.href, true);\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: \"/Reference.asmx/FreeRecord\" + WSSParam,\r\n data: \"{'ReferenceCode':'\" + RefName + \"','RecordID':'\" + RecID + \"'}\",\r\n async: false,\r\n success: function (res) {\r\n R = res.d;\r\n }\r\n });\r\n CheckForLoginPage(R);\r\n return R;\r\n}\r\n\r\n/* =================================================================================================================================================== */\r\n/* =================================================================================================================================================== */\r\n\r\n\r\n/* =Folder.aspx=======================================================================================================================================*/\r\nfunction CloseFolderCardWindow(msg, folderId) {\r\n BaseCloseFolderCardWindow(folderId);\r\n try {\r\n //UnbindBeforeUnload();\r\n //Вызывает освобождение объекта явно, т.к. перезагрузка окна прерывает \"анализатор открытости окна\".\r\n if (WA.ENV.browser.name.toLowerCase() === 'opera') {\r\n FreeFolder(folderId);\r\n }\r\n CloseWindow();\r\n //BindBeforeUnload();\r\n }\r\n catch (ex) { }\r\n return false;\r\n}\r\n/* =================================================================================================================================================== */\r\n/* =================================================================================================================================================== */\r\n\r\nfunction SideItem_Click() {\r\n $(document).on(\"click\", \"#sidebar_container .sidebar_item\", function () {\r\n $('.toolbar_group').find('.hover').removeClass('hover');\r\n });\r\n}\r\n\r\nfunction Ext_Click(el, ext, notInExplorer) {\r\n notInExplorer = notInExplorer || false;\r\n var RemoveParamsStr = \"\";\r\n // При смене расширения с результатами поиска, переходит на папки в которой были раньше.\r\n if (GetParamInURL(\"mode\").toLowerCase() === 'search') {\r\n RemoveParamsStr = \"-mode&-searchname&-sort&\";\r\n }\r\n if (!$(el).hasClass('selected') || notInExplorer) DoAction(RemoveParamsStr + 'ext=' + ext);\r\n}\r\n\r\nfunction cancelBubble(event) {\r\n event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation();\r\n}\r\n\r\n\r\n/**\r\n* Место где происходит создание ссылки для объектов проводника\r\n* @important\r\n*/\r\nfunction MakeActionListItemHyperlink(item, obj) {\r\n var hyperlink = '';\r\n if (typeof item.hyperlink != 'undefined') {\r\n hyperlink = item.hyperlink + (item.hyperlink.indexOf('?') == -1 ? '?' : '&');\r\n hyperlink += 'sys=' + g_SysCode;\r\n // Для записи справочника добавлем код справочника.\r\n if (obj.kind == 'ref') hyperlink += '&compcode=' + obj.refcode;\r\n if (obj.kind == 'fol') hyperlink += '&fpath=' + obj.id + '-' + GetParamInURL('fpath');\r\n if ((obj.kind == 'job' || obj.kind == 'task') && !GetParamInURL(\"mode\")) { hyperlink += '&opener=' + WA.CR.getID(); }\r\n hyperlink += '&id=' + obj.id;\r\n hyperlink += '&ext=' + g_ExtName;\r\n }\r\n return hyperlink;\r\n}\r\n\r\nfunction DoFirstAction(nameLink, objType) {\r\n\r\n var sett = listActionsSettings[objType];\r\n if (sett && sett.items.length > 0) {\r\n if (objType == 'EDocument') return DoDefaultAction(nameLink, objType);\r\n var number = 0;\r\n var item;\r\n while (sett.items[number].hasOwnProperty('needshow')) {\r\n if ((new Function(\"return \" + sett.items[number]['needshow'] + '();'))()) {\r\n item = sett.items[number];\r\n break;\r\n }\r\n else number++;\r\n }\r\n item = sett.items[number];\r\n StartAction(item, nameLink);\r\n };\r\n return false;\r\n};\r\n\r\nfunction DoDefaultAction(nameLink, objType) {\r\n var sett = listActionsSettings[objType];\r\n if (sett && sett.items.length > 0) {\r\n var defaultAction;\r\n for (var i = 0; i < sett.items.length; i++) {\r\n\r\n //Шамов А.: Как в настройках, если агент не доступен, то открываем предпросмотр.\r\n //Шамов А.: Решили пока это не делать, т.к. для пользователя будет не понятно почему вдруг открылся предпросмотр, если агент упал.\r\n //Barkova_YN: Делаем, так как отсутствие реакции при клике по названию документа непонятно для пользователя.\r\n var currentDefaultAction = g_defaultListAction;\r\n var needDisableAgentSetts = !WA.agent.isAvailable();\r\n if (needDisableAgentSetts && (currentDefaultAction != 'showcard')) {\r\n currentDefaultAction = 'preview';\r\n }\r\n\r\n if (sett.items[i].id.toLowerCase() == currentDefaultAction) {\r\n defaultAction = sett.items[i];\r\n break;\r\n }\r\n }\r\n\r\n StartAction(defaultAction, nameLink);\r\n }\r\n return false;\r\n}\r\n\r\nfunction StartAction(item, nameLink) {\r\n var proxy = GetObjectInfoFromRow($(nameLink).parents('.List:first'));\r\n // Выполняем гиперссылку, если нужно.\r\n if (typeof item.hyperlink != 'undefined') {\r\n hyperlink = MakeActionListItemHyperlink(item, proxy);\r\n var mode = GetParamInURL('mode');\r\n var isSearch = WA.getLocation() == 'explorer' && (mode == 'search' || mode == 'placedin');\r\n window.open(hyperlink, (item.innewwindow == 'True' || isSearch || WA.getLocation() != 'explorer' ? (proxy.kind + proxy.id) : '_self'));\r\n };\r\n\r\n // Выполняем JS, если нужно.\r\n if (item.jsaction != 'undefined') {\r\n var f = new Function('CurrentActionHTMLElement', item.jsaction);\r\n f.call(proxy, $(nameLink));\r\n }\r\n}\r\n/* =================================================================================================================================================== */\r\n\r\n/* = Текст ЗЗУ ======================================================================================================================================= */\r\nfunction ExpandCollapseButtonMouseDown(Button) {\r\n SetExpandCollapseButtonImage(Button, 3);\r\n}\r\nfunction ExpandCollapseButtonMouseOver(Button) {\r\n SetExpandCollapseButtonImage(Button, 2);\r\n}\r\nfunction ExpandCollapseButtonMouseLeave(Button) {\r\n SetExpandCollapseButtonImage(Button, 1);\r\n}\r\nfunction SetExpandCollapseButtonImage(Button, DestImageType) {\r\n ArrowImages = new Array(2);\r\n ArrowImages[0] = [\"Circle_ArrowUp\", \"Circle_ArrowUp.png\", \"Circle_ArrowUpOver.png\", \"Circle_ArrowUpClick.png\"];\r\n ArrowImages[1] = [\"Circle_ArrowDown\", \"Circle_ArrowDown.png\", \"Circle_ArrowDownOver.png\", \"Circle_ArrowDownClick.png\"];\r\n var btn = $(Button);\r\n for (j = 0; j < ArrowImages.length; j++) {\r\n if (btn.length > 0 && btn[0].className.indexOf(ArrowImages[j][0]) != -1) {\r\n RemoveAllCircleArrowClasses(btn).addClass(ArrowImages[j][DestImageType]);\r\n break;\r\n }\r\n }\r\n}\r\nfunction RemoveAllCircleArrowClasses(btn) {\r\n return btn.removeClass(function (index, classes) {\r\n var reg = new RegExp(\"Circle_.+\", \"i\");\r\n var matches = classes.match(reg);\r\n return (matches.join(' '));\r\n });\r\n}\r\nfunction ApplyStyle(el, StyleName) {\r\n el.className = StyleName;\r\n}\r\nfunction ChangeItemTextsVisible(Button) {\r\n var btn = $(Button);\r\n if (btn.length > 0) {\r\n if (btn[0].className.indexOf('Circle_ArrowDown') != -1) {\r\n RemoveAllCircleArrowClasses(btn).addClass(\"Circle_ArrowUp.png\");\r\n } else {\r\n RemoveAllCircleArrowClasses(btn).addClass(\"Circle_ArrowDown.png\");\r\n }\r\n var id = Button.id;\r\n var first = id.indexOf(\"_\");\r\n $(\"div[id^='TextBlock\" + id.substr(first, id.length - first) + \"']\").toggle();\r\n }\r\n}\r\nfunction ChangeItemExpandCollapse(Button) {\r\n var btn = $(Button);\r\n var sub_divs = btn.parents('div:first');\r\n var jSvgIcon = btn.find('use');\r\n\r\n if (jSvgIcon.length != 0 || btn.hasClass('att_minus.png') || btn.hasClass('att_plus.png')) {\r\n if (jSvgIcon.length == 0)\r\n btn.toggleClass('att_plus.png').toggleClass('att_minus.png');\r\n else {\r\n if (jSvgIcon.attr('xlink:href') === '#expand')\r\n jSvgIcon.attr('xlink:href', '#collapse');\r\n else\r\n jSvgIcon.attr('xlink:href', '#expand');\r\n }\r\n\r\n sub_divs.children('div').each(function () {\r\n var me = $(this);\r\n // Пишем свою toggle, т.к. стандартная $('..').toggle() не работает для вложенных элементов, если родительский скрыт.\r\n if (me.css('display') != 'none') {\r\n $(me).data('olddisplay', me.css('display')).css('display', 'none');\r\n } else {\r\n if (!$(me).data('olddisplay')) me.css('display', 'block');\r\n else me.css('display', $(me).data('olddisplay'));\r\n }\r\n });\r\n }\r\n}\r\n\r\n/* =================================================================================================================================================== */\r\n\r\n/* Контекстное меню */\r\n\r\nvar ShowContextMenu = function (el, options, coords, isRightButton) {\r\n window.Core.contextmenu.show(el, options, coords, isRightButton);\r\n};\r\n\r\n// функции для работы с документами\r\nvar EDocument;\r\n\r\n(function () {\r\n\r\n\r\n\r\n var lockUnlockRunning = false;\r\n\r\n EDocument = function (src) {\r\n return new EDocumentClass(src);\r\n }\r\n\r\n EDocumentClass = function (src) {\r\n $.extend(this, src);\r\n var el_name = this.hasOwnProperty('tr') ? this.tr.find('[col=\"NAME\"]') : \"\";\r\n //var el_name = this.tr.find('[col=\"NAME\"]');\r\n if (el_name.length)\r\n this.name = el_name.html();\r\n }\r\n\r\n EDocumentClass.prototype = {\r\n CopyDoc: function () {\r\n var sourceID = this.id;\r\n\r\n function DoIt(decryptedKey) {\r\n var folder_id = GetParamInURL(\"id\");\r\n if (folder_id == \"\") folder_id = FavoritesFolderID;\r\n\r\n //window.open(\"doc.aspx?op=copydoc&folder=\" + folder_id + \"&id=\" + id);\r\n CreateNewDocument(\"copy\", folder_id, sourceID, null, decryptedKey);\r\n }\r\n\r\n // Копирование зашифрованных документов не поддерживается.\r\n var encoding = this.tr.attr('encoding');\r\n if (encoding > 0) {\r\n ShowError(L(\"ERR_ENCRYPTED_DOCUMENT_COPY_UNSUPPORTED\"), null, 400);\r\n return;\r\n }\r\n\r\n DoIt();\r\n },\r\n\r\n LockUnlock: function () {\r\n if (lockUnlockRunning)\r\n return false;\r\n else\r\n lockUnlockRunning = true;\r\n var me = this;\r\n var tr = this.hasOwnProperty('tr') ? this.tr : \"\";\r\n var id = this.id;\r\n var lock = this.hasOwnProperty('islocked') ? !(this.islocked == \"1\") : !(tr.attr('islocked') == \"1\");\r\n ShowTopSpinner(lock ? L(\"EDOC_LOCKING\") : L(\"EDOC_UNLOCKING\"));\r\n var result = true;\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n url: lock ? \"/Document.asmx/Lock\" : \"/Document.asmx/Unlock\",\r\n data: \"{DocumentID:\" + id + \", UseGlobalLock:false}\",\r\n async: false,\r\n cache: false,\r\n success: function (res) {\r\n res = res.d;\r\n if (CheckForLoginPage(res)) return;\r\n if (res.Success) {\r\n if (me.hasOwnProperty('tr'))\r\n tr.attr('islocked', lock ? \"1\" : \"0\");\r\n else\r\n $(\"#islocked\").val(lock ? \"1\" : \"0\")\r\n HideTopSpinner(\"\", 0);\r\n return true;\r\n }\r\n else {\r\n //HideTopSpinner(res.Error, 5000);\r\n HideTopSpinner(\"\", 0);\r\n ErrorShow(res.Error);\r\n result = false\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n return result;\r\n\r\n },\r\n\r\n LockUnlockOnCreate: function () {\r\n return { disabled: this.tr.attr('canlockunlock') != '1', text: this.GetLockUnlockText() }\r\n },\r\n\r\n GetLockUnlockText: function () {\r\n return this.tr.attr('islocked') == '1' ? 'MENU_UNLOCK' : 'MENU_LOCK';\r\n },\r\n\r\n EnsureVersions: function (callback) {\r\n function handle() {\r\n this.currentVersionNumber = this.tr.data('currentVersionNumber');\r\n if (!this.currentVersionNumber)\r\n this.SetCurrentVersionNumber(this.GetActualVersionNumber());\r\n callback.call(this);\r\n }\r\n\r\n this.versions = this.tr.data('versions');\r\n if (!this.versions) {\r\n this.tr.addClass('please_wait');\r\n this.GetVersions(function () {\r\n this.tr.removeClass('please_wait');\r\n this.tr.data('versions', this.versions);\r\n handle.call(this);\r\n });\r\n } else {\r\n handle.call(this);\r\n }\r\n },\r\n\r\n UpdateVersions: function (callback) {\r\n this.tr.data('versions', false);\r\n this.EnsureVersions(function () { if (callback) callback.call(this); });\r\n },\r\n\r\n GetContextMenu: function (menu, callback) {\r\n var me = this;\r\n\r\n //FIXME: убрал ветвление, т.к. содержимое контекстного меню не должно зависеть от состояния объекта, к тому же тут лишняя дорогая загрузка данных\r\n $.extend(menu.getItemById('EditReturn'), {\r\n text: \"RETURN_EDOC_VERSION\",\r\n icon: \"/App_Sprites/ToolbarAndTab/ImportDocument_16.png\",\r\n jsaction: \"EDocument(this).ImportVersion()\"\r\n });\r\n $.extend(menu.getItemById('EditReturn'), {\r\n text: \"OPEN_FOR_EDIT\",\r\n icon: \"/App_Sprites/ToolbarAndTab/EditDocument_16.png\",\r\n jsaction: \"EDocument(this).OpenEdit()\"\r\n });\r\n\r\n if (typeof FirstValidCertificate !== \"undefined\") {\r\n var i = $.inArray(menu.getItemById('LockUnlockVer'), menu.items);\r\n if (i != -1 && !menu.getItemById('Sign')) {\r\n menu.getItemById('LockUnlockVer').separator = false;\r\n menu.items.splice(i + 1, 0, {\r\n id: \"Sign\",\r\n text: \"SIGN\",\r\n icon: \"/App_Sprites/Sign_16.png\",\r\n onClick: function () {\r\n me.SignVersion();\r\n },\r\n separator: true\r\n });\r\n }\r\n }\r\n callback();\r\n\r\n //this.EnsureVersions(function () {\r\n //var ver = this.GetCurrentVersion();\r\n //if (ver) {\r\n // if (ver.IsLocked) {\r\n // $.extend(menu.getItemById('EditReturn'), {\r\n // text: \"RETURN_EDOC_VERSION\",\r\n // icon: \"/App_Sprites/ToolbarAndTab/ImportDocument_16.png\",\r\n // jsaction: \"EDocument(this).ImportVersion()\"\r\n // });\r\n // } else {\r\n // $.extend(menu.getItemById('EditReturn'), {\r\n // text: \"OPEN_FOR_EDIT\",\r\n // icon: \"/App_Sprites/ToolbarAndTab/EditDocument_16.png\",\r\n // jsaction: \"EDocument(this).OpenEdit()\"\r\n // });\r\n // }\r\n //}\r\n // if (typeof FirstValidCertificate !== \"undefined\") {\r\n // var i = $.inArray(menu.getItemById('LockUnlockVer'), menu.items);\r\n // if (i != -1 && !menu.getItemById('Sign')) {\r\n // menu.getItemById('LockUnlockVer').separator = false;\r\n // menu.items.splice(i + 1, 0, {\r\n // id: \"Sign\",\r\n // text: \"SIGN\",\r\n // icon: \"/App_Sprites/Sign_16.png\",\r\n // onClick: function () {\r\n // me.SignVersion();\r\n // },\r\n // separator: true\r\n // });\r\n // }\r\n // }\r\n // callback();\r\n //});\r\n },\r\n\r\n //GetVersionsMenu: function (menu, callback) {\r\n // var me = this;\r\n\r\n // function getVerText(ver) {\r\n // return '
    ' +\r\n // ver.Number + '. ' + ver.SignImage +\r\n // '' + ver.Note + '' +\r\n // '
    ' +\r\n // '' + ver.LockImage + ver.Size + ' ' + ver.SizeLabel + '' +\r\n // '
    ' +\r\n // '
    ' +\r\n // L('MODIFIED') + ': ' + formatDateTime(ver.TextModified) + ' ' +\r\n // L('AUTHOR') + ': ' + ver.Author + '
    ' +\r\n // '
    ';\r\n // }\r\n\r\n // var vs = me.tr.find('.version_select');\r\n // vs.addClass('hover');\r\n // me.EnsureVersions(function () {\r\n // var menuItems = $.map(me.versions, function (ver) {\r\n // return {\r\n // text: getVerText(ver),\r\n // icon: /src\\=\\\"(.*?)\\\"/.exec(ver.Ico)[1],\r\n // onClick: function () {\r\n // me.SetCurrentVersionNumber(ver.Number);\r\n // }\r\n // };\r\n // });\r\n // $.extend(menu, {\r\n // items: menuItems,\r\n // width: 450,\r\n // shiftY: 20,\r\n // shiftX: 0,\r\n // onHide: function () { vs.removeClass('hover') }\r\n // });\r\n // if (callback) callback();\r\n // });\r\n //},\r\n\r\n GetCurrentVersion: function () {\r\n return this.GetVersionByNumber(this.currentVersionNumber);\r\n },\r\n\r\n SetCurrentVersionNumber: function (num) {\r\n var me = this;\r\n me.currentVersionNumber = num;\r\n me.tr.data('currentVersionNumber', num);\r\n },\r\n GetVersionLockImage: function (ver) {\r\n var imgHTML = '\"{1}\"';\r\n if (ver.IsLocked)\r\n return format(imgHTML, \"/App_Sprites/Doc/LockDocument_16.png\", L(\"VERSION_LOCK\"));\r\n else\r\n return \"\";\r\n },\r\n\r\n GetVersions: function (callback) {\r\n var id = this.id;\r\n var _this = this;\r\n CallService(\"/EDocument.asmx/GetVersionList\", { EDocID: id, ShowAllVersions: true }, function (res) {\r\n if (res.Success) {\r\n _this.versions = res.Result.Versions;\r\n _this.versions.sort(function (x, y) { return y.Number - x.Number });\r\n if (callback) callback.call(_this);\r\n }\r\n });\r\n },\r\n\r\n GetActualVersionNumber: function () {\r\n var ver = this.versions.slice(); // копируем массив версий, чтоб не испортить.\r\n ver.sort(function (x, y) {\r\n if (x.LifeStage != y.LifeStage) {\r\n var priority = [1, 0, 2]; // сначала действующие, потом в разработке, потом устаревшие.\r\n return priority[x.LifeStage] - priority[y.LifeStage];\r\n } else {\r\n return y.Number - x.Number; // в обратном порядке по номеру\r\n }\r\n });\r\n if (ver.length > 0) return ver[0].Number;\r\n return -1;\r\n },\r\n\r\n GetVersionByNumber: function (num) {\r\n return $.grep(this.versions, function (ver) { return ver.Number == num; })[0];\r\n },\r\n\r\n OpenRead: function () {\r\n var me = this;\r\n var d = $.Deferred();\r\n // Если плагин доступен, то проверим локальные копии.\r\n WebAccess.agent.isPluginAvailable(\"edmsplugin\").done(function (isAvailable) {\r\n var localCopiesCount = 0;\r\n WA.agent.edms.checkDocumentHasLocalCopy(me.id).done(function (localCopies) {\r\n localCopiesCount = localCopies.length;\r\n if (localCopiesCount > 0) {\r\n GetEDocumentObject(me.id, function (docObj) {\r\n AskForActionOnDocument(docObj, localCopies, false);\r\n });\r\n }\r\n });\r\n // Отобазить предпросмотр.\r\n d.resolve(!isAvailable || localCopiesCount == 0);\r\n }).fail(function () {\r\n d.resolve(true);\r\n });\r\n\r\n d.done(function (isShowPreview) {\r\n if (isShowPreview) ExportEDoc(me.id, true, 0, true);\r\n });\r\n },\r\n\r\n OpenEdit: function () {\r\n OpenWithAgent(this, true);\r\n },\r\n\r\n ViewInEditor: function () {\r\n OpenWithAgent(this, false);\r\n },\r\n\r\n Export: function () {\r\n ExportEDoc(this.id, false);\r\n this.tr.data('versions', false);\r\n },\r\n\r\n Import: function () {\r\n var DocID = this.id;\r\n var DoIt = function (decryptedKey) {\r\n ImportEDocNew(DocID, 'import', null, null, null, decryptedKey);\r\n };\r\n\r\n var encoding = this.tr.attr('encoding');\r\n var pluginName = this.tr.attr('encpluginname');\r\n if (encoding && parseInt(encoding) > 0) {\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n var onError = function (error) { ShowError(error, null, 350); };\r\n switch (encoding) {\r\n case '1':\r\n WebAccess.agent.edms.getDocumentDecryptedKey(DocID, encoding, pluginName, '', DoIt, onError);\r\n break;\r\n case '2':\r\n case '3':\r\n RequestPasswordForDecryption('', function (password) { WebAccess.agent.edms.getDocumentDecryptedKey(DocID, encoding, pluginName, password, DoIt, onError); });\r\n break;\r\n }\r\n }).fail(function () {\r\n ImportEDocNew(DocID);\r\n });\r\n } else {\r\n ImportEDocNew(DocID);\r\n }\r\n },\r\n\r\n ImportVersion: function () {\r\n ImportEDocNew(this.id, 'return_showversions');\r\n },\r\n\r\n LockUnlockVersion: function () {\r\n this.EnsureVersions(function () {\r\n var me = this;\r\n var ver = this.GetCurrentVersion();\r\n if (ver.ReturnDoc_CanClick) {\r\n function doAction() {\r\n ShowTopSpinner(ver.IsLocked ? L(\"EDOC_UNLOCKING\") : L(\"EDOC_LOCKING\"));\r\n CallService(\"/EDocument.asmx/VersionLockUnlock\", { EDocID: me.id, VerNum: ver.Number },\r\n function (res) {\r\n if (res.Warning || res.Error)\r\n HideTopSpinner(res.Warning || res.Error, 5000);\r\n else\r\n HideTopSpinner();\r\n me.UpdateVersions();\r\n });\r\n }\r\n if (!ver.IsLocked)\r\n ConfirmDialogNew(L(\"EDOC_VER_CONFIRM_LOCK\", ver.Number, me.name), doAction);\r\n else\r\n doAction();\r\n } else {\r\n ShowTopSpinnerResult(ver.ReturnDoc_CanClick_Reason, 5000);\r\n }\r\n });\r\n },\r\n\r\n SignVersion: function () {\r\n this.EnsureVersions(function () {\r\n var me = this;\r\n var ver = this.GetCurrentVersion();\r\n ConfirmDialogNew(L(\"EDOC_VER_CONFIRM_SIGN\", ver.Number, me.name), function () {\r\n me._SignVersion(ver, FirstValidCertificate, function () { HideTopSpinner(); me.UpdateVersions(); });\r\n });\r\n });\r\n },\r\n\r\n _SignVersion: function (ver, cert, callback) {\r\n var _this = this;\r\n\r\n ShowTopSpinner(L(\"EDOC_SIGNING\"));\r\n WrapToShowErrors(function () {\r\n var dc = GetCryptoObject();\r\n try {\r\n var certObj = dc.GetCertificateFromStorage(cert.plugin, cert.id);\r\n } catch (e) {\r\n if (e.message.indexOf('E_CERTIFICATE_NOT_FOUND_MESSAGE') != -1) {\r\n certObj = null;\r\n } else {\r\n throw e;\r\n }\r\n }\r\n if (certObj == null)\r\n throw L(\"PRIVATE_KEY_CERTIFICATE_HAS_NOT_BEEN_FOUND_IN_LOCAL_PERSONAL_STORAGE\");\r\n CallService(\"/EDocument.asmx/GetVersionDataEx\", { EDocID: _this.id, VersionNum: ver.Number, NeedLock: false }, WrapToShowErrors(function (res) {\r\n if (res.Success) {\r\n var data = res.Result;\r\n var signResult = dc.Sign(certObj, data);\r\n CallService(\"/EDocument.asmx/AddSignature\", {\r\n EDocID: _this.id,\r\n VersionNum: ver.Number,\r\n SignStr: signResult,\r\n UserCertificateStr: cert.plugin,\r\n Comment: \"\",\r\n IsApprovingSign: false,\r\n IsSubstituted: false,\r\n SubstUser: \"\"\r\n }, WrapToShowErrors(function (res) {\r\n if (!res.Success) throw res.Error;\r\n else {\r\n HideTopSpinner();\r\n if (callback) callback();\r\n }\r\n }));\r\n } else {\r\n throw res.Error;\r\n }\r\n }));\r\n })();\r\n },\r\n\r\n CreateVersion: function () {\r\n var encoding = this.tr.attr('encoding');\r\n var docID = this.id;\r\n var pluginName = this.tr.attr('encpluginname');\r\n CreateVersionToolbar(docID, null, encoding, pluginName);\r\n }\r\n\r\n }\r\n\r\n})();\r\n\r\n// функции для работы с версиями документа.\r\nvar EDocumentVersion;\r\n\r\n(function () {\r\n EDocumentVersion = function (src) {\r\n return new EDocumentVersionClass(src);\r\n }\r\n\r\n EDocumentVersionClass = function (src) {\r\n $.extend(this, src);\r\n }\r\n\r\n EDocumentVersionClass.prototype = {\r\n GetDocID: function () {\r\n return +this.id.split('_')[0];\r\n },\r\n\r\n GetCurrentVersion: function () {\r\n return this.tr.data('verinfo');\r\n },\r\n\r\n GetContextMenu: function (menu, callback) {\r\n var me = this;\r\n var ver = this.GetCurrentVersion();\r\n if (ver.IsLocked) {\r\n $.extend(menu.getItemById('EditReturn'), {\r\n text: \"RETURN_EDOC_VERSION\",\r\n icon: \"/App_Sprites/ToolbarAndTab/ImportDocument_16.png\",\r\n jsaction: \"EDocumentVersion(this).ReturnVersion()\"\r\n });\r\n $.extend(menu.getItemById('LockUnlockVer'), {\r\n text: \"UNLOCK_EDOCUMENT_VERSION\",\r\n icon: \"documentUnblock-16\"\r\n });\r\n } else {\r\n $.extend(menu.getItemById('EditReturn'), {\r\n text: \"OPEN_FOR_EDIT\",\r\n icon: \"/App_Sprites/ToolbarAndTab/EditDocument_16.png\",\r\n jsaction: \"EDocumentVersion(this).OpenForEdit()\"\r\n });\r\n $.extend(menu.getItemById('LockUnlockVer'), {\r\n text: \"LOCK_EDOCUMENT_VERSION\",\r\n icon: \"documentBlock-16\"\r\n });\r\n }\r\n callback();\r\n },\r\n\r\n OpenRead: function () {\r\n var ver = this.GetCurrentVersion();\r\n //Открываем закладку предпросмотра\r\n //location.href = format(\"Doc.aspx?sys={code}&ext={ext}&ID={doc_id}&view=Preview&VersionNum={ver_num}\", { code: g_SysCode, ext: g_ExtName, doc_id: this.GetDocID(), ver_num: ver.Number });\r\n ExportEDocNow(this.GetDocID(), ver.Number, false, false);\r\n },\r\n\r\n ReturnVersion: function () {\r\n var ver = this.GetCurrentVersion();\r\n ImportEDocNew(this.GetDocID(), \"return\", ver.Number);\r\n //window.open(format(\"Doc.aspx?sys={code}&ext={ext}&ID={doc_id}&op=ImportDoc&ver={ver_num}&mode=WithUnlock&place=explorer\", { code: g_SysCode, ext: g_ExtName, doc_id: this.GetDocID(), ver_num: ver.Number }));\r\n },\r\n\r\n OpenForEdit: function () {\r\n /*var me = this;\r\n var ver = this.GetCurrentVersion();\r\n location.href = format(\"Doc.aspx?sys={code}&ext={ext}&ID={doc_id}&view=ShowVerList&ver={ver_num}&mode=EDITLOCK\", { code: g_SysCode, ext: g_ExtName, doc_id: this.GetDocID(), ver_num: ver.Number });*/\r\n var ver = this.GetCurrentVersion();\r\n var me = this;\r\n setTimeout(function () {\r\n me.UpdateVersions();\r\n }, 1000);\r\n ExportEDocNow(this.GetDocID(), ver.Number, true, false);\r\n },\r\n\r\n LockUnlockVersion: function () {\r\n var me = this;\r\n var ver = me.GetCurrentVersion();\r\n function doAction() {\r\n ShowTopSpinner(ver.IsLocked ? L(\"EDOC_UNLOCKING\") : L(\"EDOC_LOCKING\"));\r\n CallService(\"/EDocument.asmx/VersionLockUnlockNew\", { EDocID: me.GetDocID(), VerNum: ver.Number },\r\n function (res) {\r\n if (!!res.Warning) {\r\n ErrorShow(res.Warning, false);\r\n }\r\n else if (!!res.Error) {\r\n ErrorShow(res.Error, true);\r\n } else {\r\n me.UpdateVersions();\r\n }\r\n HideTopSpinner('', 0);\r\n });\r\n }\r\n if (!ver.IsLocked) {\r\n ConfirmDialogNew(L(\"EDOC_VER_CONFIRM_LOCK_WITHOUT_NAME\", ver.Number), doAction);\r\n } else {\r\n doAction();\r\n }\r\n },\r\n\r\n CreateNew: function () {\r\n var version = this.GetCurrentVersion();\r\n var encoding = WA.Document.Encoding;\r\n var pluginName = WA.Document.PluginName;\r\n CreateVersionToolbar(this.GetDocID(), version.Number, encoding, pluginName);\r\n },\r\n\r\n Export: function () {\r\n var ver = this.GetCurrentVersion();\r\n ExportEDoc(this.GetDocID(), false, ver.Number);\r\n },\r\n\r\n Import: function () {\r\n //$('#__DOC_VER_SELECTED_' + this.GetDocID()).val(this.id);\r\n var ver = this.GetCurrentVersion();\r\n ImportEDocNew(this.GetDocID(), \"import\", ver.Number);\r\n },\r\n\r\n Sign: function () {\r\n SignEDoc(this.GetDocID(), this.GetCurrentVersion().Number);\r\n },\r\n\r\n Delete: function () {\r\n var me = this;\r\n if (WA.getLocation() == 'doc' && !WA.current.CanChange) {\r\n ShowError(L('DOCVER_NO_MODIFY_ACCESS'), null, 350);\r\n return;\r\n }\r\n var ver = me.GetCurrentVersion();\r\n\r\n if (ver.IsLocked === true) {\r\n ShowWarning(L('WRN_CANT_DELETE_DOC_VER_LOCKED', ver.Number, WA.Document.ClientName, ver.DBLock.LockedByUser, formatDateTime(new Date(ver.DBLock.LockTime))));\r\n } else {\r\n ConfirmDialogNew(format(L(\"CONFIRM_DELETE_VERSION\"), { '0': ver.Number }), function () {\r\n ShowTopSpinner(L(\"DELETING_VERSION\"));\r\n CallService(\"/EDocument.asmx/DeleteVersion\", { EDocID: me.GetDocID(), VerNum: ver.Number }, function (res) {\r\n if (res.Success) {\r\n ShowTopSpinnerResult(L(\"VERSION_DELETE_COMPLETE\"));\r\n me.UpdateVersions();\r\n } else {\r\n HideTopSpinner('', 0);\r\n var severity = (res.Severity !== \"-1\" ? Number(res.Severity) : undefined);\r\n WA.CR.inlineHint.show(res.error, undefined, severity);\r\n }\r\n });\r\n });\r\n }\r\n\r\n },\r\n\r\n // Изменения состояния версии\r\n SetState: function (state) {\r\n var me = this;\r\n var ver = me.GetCurrentVersion();\r\n\r\n if (WA.Document.Lock.IsLocked && !WA.Document.Lock.IsLockedByMe) {\r\n ErrorShow(L(\"WARN_DOCUMENT_LOCKED\", WA.Document.Lock.LockedByUser, formatDateTime(new Date(WA.Document.Lock.LockTime))));\r\n return;\r\n }\r\n\r\n ShowTopSpinner();\r\n WA.services.document.version.setState(me.GetDocID(), ver.Number, state).done(function () {\r\n me.UpdateVersions();\r\n me.ChangeCountActualVersions(ver.Number, state);\r\n HideTopSpinner();\r\n }).fail(function () {\r\n HideTopSpinner();\r\n });\r\n },\r\n\r\n //Изменение количества действующих версий\r\n ChangeCountActualVersions: function (num, state) {\r\n if (state == 2) {\r\n WA.current.CountActiveVersions += 1;\r\n WA.current.Versions[num - 1].CurrentLifestage = state;\r\n } else {\r\n if (WA.current.Versions[num - 1].CurrentLifestage == 2) {\r\n WA.current.Versions[num - 1].CurrentLifestage = state;\r\n WA.current.CountActiveVersions -= 1;\r\n }\r\n }\r\n },\r\n\r\n // Изменения примечания\r\n ChangeNote: function () {\r\n var me = this;\r\n var ver = me.GetCurrentVersion();\r\n\r\n // Если нет прав на изменение, выходим с ошибкой.\r\n if (WA.Document.CanChange === false) {\r\n ErrorShow(L(\"DOCVER_NO_MODIFY_ACCESS\"), true);\r\n return;\r\n }\r\n\r\n // Если документ заблокирован, выходим с ошибкой.\r\n if (WA.Document.Lock.IsLocked && !WA.Document.Lock.IsLockedByMe) {\r\n ErrorShow(L(\"WARN_DOCUMENT_LOCKED\", WA.Document.Lock.LockedByUser, formatDateTime(new Date(WA.Document.Lock.LockTime))), true);\r\n return;\r\n }\r\n\r\n var f = new WA.components.forms.FormBuilder('CHANGE_NOTE_FORM');\r\n f.setOrientation('vertical');\r\n f.addInput('NOTE');\r\n var d = new WA.components.dialogs.BaseDialog();\r\n d.title = L('CHANGE_NOTE');\r\n d.isShowOkButton = true;\r\n d.isShowCancelButton = true;\r\n d.ok = function () {\r\n ShowTopSpinner();\r\n WA.services.document.version.setNote(me.GetDocID(), ver.Number, f.getValue('NOTE')).done(function () {\r\n me.UpdateVersions();\r\n HideTopSpinner(L('MSG_CHANGE_NOTE_COMPLETE'), 2000);\r\n }).fail(function () {\r\n HideTopSpinner();\r\n });\r\n };\r\n d.bind('onOpen', function () {\r\n // Установим старое примечание в поле.\r\n f.setValue('NOTE', me.tr.find('.Version_Name').text());\r\n });\r\n d.setHtml(f.render());\r\n d.show();\r\n },\r\n\r\n UpdateVersions: function () {\r\n if (typeof ReloadVersionList != 'undefined') ReloadVersionList();\r\n }\r\n\r\n }\r\n\r\n})();\r\n\r\n\r\n// функции для работы с заданиями\r\nvar Job;\r\n\r\n(function () {\r\n\r\n Job = function (src) {\r\n return new JobClass(src);\r\n }\r\n\r\n JobClass = function (src) {\r\n $.extend(this, src);\r\n }\r\n\r\n JobClass.prototype = {\r\n MarkAsReadOnCreate: function () {\r\n return {\r\n text: this.tr.hasClass('unread') ? \"MENU_MARK_AS_READ\" : \"MENU_MARK_AS_UNREAD\",\r\n icon: this.tr.hasClass('unread') ? \"markRead-16\" : \"markUnread-16\"\r\n }\r\n },\r\n\r\n MarkAsRead: function (link) {\r\n var _this = this;\r\n var tr = _this.tr;\r\n if (typeof tr == \"undefined\")\r\n tr = $(link).parents('.List');\r\n if (typeof link == \"undefined\") {\r\n link = tr.find('a[data-name=\"MarkAsRead\"]');\r\n }\r\n\r\n var unread = tr.hasClass('unread');\r\n ShowTopSpinner(L(\"PLEASE_WAIT\"));\r\n CallService(\"/Job.asmx/MarkAsRead\", { JobID: _this.id, IsRead: unread }, function (res) {\r\n if (res.Success) {\r\n if (unread) {\r\n tr.removeClass('unread');\r\n ChangeUnreadCountInTree(-1);\r\n if (link) $(link).text(L('MENU_MARK_AS_UNREAD'));\r\n } else {\r\n tr.addClass('unread');\r\n ChangeUnreadCountInTree(1);\r\n if (link) $(link).text(L('MENU_MARK_AS_READ'));\r\n }\r\n HideTopSpinner();\r\n } else {\r\n HideTopSpinner(L(\"ERROR_MSG\", res.Error), 5000);\r\n }\r\n });\r\n },\r\n\r\n Sign: function () {\r\n\r\n }\r\n\r\n }\r\n\r\n})();\r\n\r\n// Получает описание объекта системы (id, kind, refcode) из атрибутов DOM-элемента списка объектов.\r\nfunction GetObjectInfoFromRow(tr) {\r\n var obj = $(tr);\r\n var refcode = (typeof obj.attr('compcode') == 'undefined' ? '' : obj.attr('compcode'));\r\n return { id: obj.data('recid') ? obj.data('recid') : obj.attr('id'), kind: obj.attr('kind').toLowerCase(), refcode: refcode, tr: obj };\r\n}\r\n\r\nfunction GetObjectCardUrl(obj, options) {\r\n var page = GetPageNameByKind(obj.kind);\r\n\r\n var customTitle = '';\r\n // Это нужно только если ссылку формируют из списка записей справочника.\r\n if (WA.getLocation() === 'referencerecords') {\r\n var currentCaption = $(\".card-header__label\").data('pluraltitle');\r\n if (currentCaption) {\r\n customTitle = \"&title=\" + encodeURI(currentCaption);\r\n }\r\n }\r\n\r\n var url = page + \"x?sys=\" + g_SysCode +\r\n \"&ext=\" + g_ExtName +\r\n \"&id=\" + obj.id +\r\n (obj.kind == \"FOL\" ? \"&view=Card\" : \"\") +\r\n (obj.refcode ? \"&compcode=\" + encodeURI(obj.refcode) +\r\n (obj.refview ? \"&refview=\" + encodeURI(obj.refview) : \"\") : \"\") +\r\n customTitle +\r\n (options ? \"&\" + options : \"\");\r\n return url;\r\n}\r\n\r\n// Открыть карточку объекта.\r\nfunction ShowObjectCard(obj, options) {\r\n window.open(GetObjectCardUrl(obj, options), obj.kind + obj.id);\r\n}\r\n\r\n// Открывает содержимое папки в текущем окне.\r\nfunction OpenFolder(obj) {\r\n var jItem = obj.tr;\r\n var newFolderPath;\r\n\r\n if (!obj.node && (!jItem || jItem.hasClass('List'))) {\r\n // В списке объектов.\r\n var fpathParam = GetParamInURL('fpath');\r\n var mode = GetParamInURL('mode');\r\n newFolderPath = obj.id + '-'\r\n if (fpathParam !== '' && mode !== 'placedin' && mode !== 'search') {\r\n newFolderPath += fpathParam;\r\n }\r\n } else {\r\n // В дереве папок.\r\n newFolderPath = obj.node.key;\r\n }\r\n\r\n // Если папка открывается в новом окне, то для корректного определения её доступности заполнять fpath не нужно\r\n var fpath = '';\r\n if (newFolderPath !== '')\r\n fpath = '&fpath=' + newFolderPath;\r\n\r\n var url = '/explorer.aspx?sys=' + g_SysCode + '&ext=' + g_ExtName + '&id=' + obj.id;\r\n\r\n if (WA.getLocation() === 'explorer' || WA.getLocation() === 'folder') {\r\n url += fpath;\r\n // Сначала пытаемся открыть по folder path из дерева, чтобы корректно изменить состояние дерева.\r\n if (!WA.CR.folderTree.selectNodeByPath || !WA.CR.folderTree.selectNodeByPath(newFolderPath, true)) {\r\n var folderTitle = jItem.find('.objectname').text();\r\n // Иначе сами генерируем событие перехода.\r\n var state = {\r\n type: 'explorer',\r\n folderID: obj.id,\r\n title: folderTitle,\r\n path: newFolderPath,\r\n hasCover: false,\r\n hasCoverOnly: false\r\n };\r\n\r\n WA.history.pushState(state, folderTitle, url);\r\n }\r\n } else {\r\n window.open(url, '_blank');\r\n }\r\n}\r\n\r\n// Послать объект вложением в задачу.\r\nfunction SendAsAttachment(obj, routecode, subject) {\r\n if (!$.isArray(obj)) {\r\n obj = [obj];\r\n }\r\n var attach = encodeURIComponent($.toJSON($.map(obj, function (o) { return o.refcode ? [[o.id, o.kind, o.refcode]] : [[o.id, o.kind]] })));\r\n var wnd = window.open(\"task.aspx?sys=\" + g_SysCode + \"&ext=\" + g_ExtName + \"&val=\" + attach + \"&mode=newattach&folder=\" + GetParamInURL('id') + '&routecode=' + encodeURIComponent(routecode));\r\n if (subject) {\r\n\r\n var setSubject = function () {\r\n $('input#ctl00_MainContent_CardContrrolSubject', wnd.document).val(subject).trigger('change');\r\n };\r\n // Lysenko_YN: в опере и ие не работает событие онлоад , без setTimeout не устанавливается значение subject\r\n var browser = WA.ENV.browser.name.toLowerCase();\r\n if (browser === 'opera' || browser === 'ie') {\r\n $(wnd.document).ready(function () {\r\n setTimeout(setSubject, 1000);\r\n });\r\n }\r\n else {\r\n wnd.onload = setSubject;\r\n }\r\n }\r\n}\r\n\r\n// Находится в папках.\r\nfunction ShowInsideFolders(obj) {\r\n var url = 'mode=placedin' + '&id=' + obj.id + '&objtype=' + obj.kind + (obj.refcode ? \"&refcode=\" + obj.refcode : \"\");\r\n if (/explorer\\.aspx/i.test(location.pathname)) {\r\n DoAction(url, false);\r\n } else {\r\n window.open('explorer.aspx?' + url);\r\n }\r\n}\r\n\r\n// Вложено в задачи.\r\nfunction ShowAttachedToTasks(obj) {\r\n var lowerKind = obj.kind.toLowerCase();\r\n if (lowerKind === 'edoc' || lowerKind === 'ref') {\r\n // Открываем в карточке.\r\n ShowObjectCard(obj, 'view=AttachedTasks');\r\n } else {\r\n //Открывается в проводнике.\r\n var url = 'mode=attachedtotask' + '&id=' + obj.id + '&objtype=' + obj.kind + (obj.refcode ? \"&refcode=\" + obj.refcode : \"\");\r\n if (/explorer\\.aspx/i.test(location.pathname)) {\r\n DoAction(url, false);\r\n } else {\r\n window.open('explorer.aspx?' + url);\r\n }\r\n }\r\n}\r\n\r\n// Копировать ссылку.\r\nfunction ObjCopyLink(obj) {\r\n CopyLinks(obj, false);\r\n}\r\n\r\n// Удалить ссылку.\r\nfunction ObjDeleteLink(obj, CurrentActionHTMLElement, callback, msg) {\r\n var tr = obj.tr;\r\n if (typeof tr == \"undefined\")\r\n tr = $(CurrentActionHTMLElement).parents('.List');\r\n\r\n var lrList = tr.parents('.ListRequisite');\r\n if (lrList.length) // мы в списке объектов ListRequisite\r\n {\r\n var id = lrList.attr('id');\r\n // Shamov_AN: удалил, т.к. не работало удаление вложений из контекстного меню.\r\n //id = id.substr(0, id.length - 5);\r\n ListRequisite(id).DeleteLink(obj, callback, msg);\r\n } else {\r\n if (WA.getLocation() == \"reference\") {\r\n UnBindFromRecord('' + WA.current.getID(), WA.current.getReferenceCode());\r\n } else {\r\n if (WA.getLocation() == \"reference\") {\r\n UnBindFromRecord('' + WA.current.getID(), WA.current.getReferenceCode());\r\n } else {\r\n DeleteLinks('', [{ ID: obj.id, Kind: obj.kind, CompCode: obj.refcode || '' }]);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Возвращает ActiveX объект для подписания документов.\r\nfunction GetCryptoObject() {\r\n if ($('#NpoComputerCrypto').length == 0) {\r\n $('body').append('
    Ошибка при загрузке ActiveX!
    ');\r\n }\r\n return $('#NpoComputerCrypto')[0];\r\n}\r\n\r\n// Возвращает обертку для функции, которая ловит исключения и отображает их в top spinner.\r\nfunction WrapToShowErrors(func) {\r\n return function () {\r\n try {\r\n return func.apply(this, arguments);\r\n } catch (ex) {\r\n HideTopSpinner(L(\"ERROR_MSG\", typeof ex == \"object\" ? ex.message : ex.toString()), 5000);\r\n }\r\n }\r\n}\r\n\r\n// Периодически посылает запрос на поддержание кэша.\r\nfunction CacheKeepAlive(cache_id, interval) {\r\n function update() {\r\n CallService(\"/Entity.asmx/CacheKeepAlive\", { Key: cache_id }, function (res) {\r\n if (res.Success)\r\n setTimeout(update, interval);\r\n });\r\n }\r\n setTimeout(update, interval);\r\n}\r\n\r\n// Периодически посылает запрос на поддержание кэша.\r\nfunction SearchCacheKeepAlive(SearchGUID, interval) {\r\n function update() {\r\n CallService(\"/Session.asmx/SearchCacheKeepAlive\", { UniqueID: SearchGUID }, function (res) {\r\n if (res.Success) {\r\n setTimeout(update, interval);\r\n }\r\n });\r\n }\r\n setTimeout(update, interval);\r\n}\r\n\r\n\r\n// ==========================================================================================================\r\n// ==========================================================================================================\r\n/** @deprecated */\r\nfunction OpenReference(refcode) {\r\n if (refcode == null) {\r\n refcode = $('#RefCode').val();\r\n }\r\n if (refcode != null && refcode != '') {\r\n window.open(\"/explorer.aspx?sys=\" + g_SysCode + \"&ext=\" + g_ExtName + \"&mode=RefRecords&compcode=\" + encodeURI(refcode) + \"&toolitem=Run\", '_blank');\r\n }\r\n}\r\n\r\n/** @deprecated\r\nKychanov_SA: метод по прежнему используется! */\r\nfunction ExitBtnClick(msg, callbackFunc) {\r\n var exit = function (message) {\r\n if ($(\"#ExitForm\").length == 0)\r\n\r\n ConfirmDialogNew({ text: message, width: 400, height: 'auto' }, function () {\r\n WA.logout();\r\n });\r\n }\r\n\r\n if (WA.agent.isSessionInitialized()) {\r\n WA.agent.isPluginAvailable('edmsplugin').done(function (isAvailable) {\r\n if (isAvailable) {\r\n WA.agent.transmitRequest(\"CheckCurrentDocuments\", \"edmsPlugin\", {}).done(function (response) {\r\n if (response.result) {\r\n msg = L('CONFIRM_EXIT_WHILE_OPEN_DOCUMENTS_EXISTS');\r\n }\r\n });\r\n }\r\n }).always(function () {\r\n exit(msg);\r\n });\r\n } else {\r\n exit(msg);\r\n }\r\n}\r\n\r\n/** @deprecated */\r\nfunction logout() {\r\n $('html').append(\"
    \");\r\n $.cookie('lang', null);\r\n\r\n Core.agent.getPlugin().done(function (plugin) {\r\n WebAccess.agent.transmitRequest(\"CheckCurrentDocuments\", \"edmsPlugin\", {}).done(function (response) {\r\n if (response.result) {\r\n $.cookie('WAUID', null);\r\n $.cookie('WEBACCESSSAUTH', null);\r\n CallService(\"UserLogin.asmx/Disconnect\", {}, function () { window.location = \"Login.aspx\"; });\r\n }\r\n });\r\n }).fail(function () {\r\n //Сообщаем агенту о выходе\r\n WebAccess.agent.endSession();\r\n\r\n //Закрываем сессию\r\n $(\"#SignOut\").val(\"SignOut\");\r\n $('#ExitForm').submit();\r\n });\r\n};\r\n\r\n/* DEPRECATED */\r\nfunction InitTheme(ThemeName) {\r\n return false;\r\n}\r\n\r\n(function (global) {\r\n var regionalSettings = {};\r\n\r\n var getSelectedLang = function (selectedLangSelector) {\r\n var newLang = $(selectedLangSelector).val();\r\n $.datepicker.setDefaults($.datepicker.regional[newLang]);\r\n $.timepicker.setDefaults($.datepicker.regional[newLang]);\r\n return newLang;\r\n };\r\n\r\n regionalSettings.setNewLang = function (selectedLangSelector) {\r\n var newLang = getSelectedLang(selectedLangSelector);\r\n\r\n $.when(WA.AgentInit).done(function () { WebAccess.agent.setLanguage(newLang.split(\"-\")[0]); });\r\n\r\n if ($('#lang').length == 0) {\r\n $('form:first').append('');\r\n };\r\n DoAction(\"lang=\" + newLang, true);\r\n };\r\n\r\n regionalSettings.cancelNewLang = function (selectedLangSelector) {\r\n var newLang = getSelectedLang(selectedLangSelector);\r\n $.cookie('lang', newLang);\r\n };\r\n\r\n // Public\r\n global.regionalSettings = regionalSettings;\r\n})(window);\r\n\r\nfunction ViewPreviewSettingsModal_DisableControls() {\r\n if ($(\"#chkOpenPreviewFromList\").is(\":checked\") || $(\"#chkOpenCardFromList\").is(\":checked\")) {\r\n //$(\"#chkOpenFullscreenPreview\").attr(\"disabled\", false).parent(\"label\").removeClass(\"field_disabled\");\r\n $('#chkOpenDocForReadingDefault,#chkOpenDocForEditingDefault').attr('disabled', \"disabled\").next(\"label\").addClass('field_disabled');\r\n } else {\r\n //$(\"#chkOpenFullscreenPreview\").attr(\"disabled\", true).parent(\"label\").addClass(\"field_disabled\");\r\n $('#chkOpenDocForReadingDefault,#chkOpenDocForEditingDefault').attr('disabled', false).next(\"label\").removeClass('field_disabled');\r\n }\r\n}\r\n\r\nfunction ViewPreviewSettingsModal_ChangePreviewSettings(radio) {\r\n if ($(radio).is(\":checked\")) {\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n ViewPreviewSettingsModal_DisableControls();\r\n }).fail(function () {\r\n ReloadWindowToLoadPlugin = function () {\r\n WebAccess.agent.stop();\r\n WebAccess.agent.start();\r\n };\r\n });\r\n }\r\n else {\r\n ReloadWindowToLoadPlugin = null;\r\n }\r\n}\r\n\r\nvar ReloadWindowToLoadPlugin;\r\n\r\nfunction RegisterUserMenuHelpItem(title, url) {\r\n if (title !== '' && url !== '') {\r\n g_UserMenuHelpItem = {\r\n text: title,\r\n onClick: function () {\r\n window.open(url);\r\n }\r\n };\r\n }\r\n}\r\n\r\nfunction InitExplorerSidebar(opt_width) {\r\n //Скрывем либо отображаем логотип в зависимости от режима открытия страницы\r\n if (Core.toolBars.main.isSearchMode() && !Core.toolBars.main.isIntegratedSearchMode()) {\r\n $('.explorer-header__logo').hide();\r\n $('.show-folder-link').show();\r\n } else {\r\n $('.show-folder-link').hide();\r\n $('.explorer-header__logo').show();\r\n }\r\n}\r\n\r\n(function () {\r\n var lastCount = 0; // количество объектов в списке после фильтрации.\r\n var lastTotalCount = 0; // всего объектов в списке.\r\n var lastIsFiltered = false;\r\n\r\n var GetRowsCount = this.GetRowsCount = function () {\r\n //Shirobokov_AV: раньше было lastTotalCount.\r\n return lastCount;\r\n }\r\n\r\n var GetTotalRowsCount = this.GetTotalRowsCount = function () {\r\n return lastTotalCount;\r\n }\r\n\r\n var ShowRowsCount = this.ShowRowsCount = function (count, totalCount, isFiltered) {\r\n lastCount = count;\r\n lastTotalCount = totalCount;\r\n lastIsFiltered = isFiltered;\r\n //var visible = $('.object_contents .folder_item, .dxgvDataRow[id]', $('#main_container')).length;\r\n\r\n //if (isFiltered) {\r\n // $('#RowCount').html(L(\"OBJECTS_TOTAL\", L(\"SELECTED_OF_TOTAL\", count, totalCount)));\r\n // $('#RowCount').html(L(\"OBJECTS_TOTAL\", L(\"SELECTED_OF_TOTAL\", count, totalCount)));\r\n //}\r\n //else {\r\n // $('#RowCount').html(L(\"OBJECTS_TOTAL\", count) + ' ');\r\n //}\r\n if (WA.getLocation() !== \"referencerecords\") $('#RowCount').html(\"(\" + count + \")\")\r\n else $('#RowCount').html(L(\"RECORDS_TOTAL\", count));\r\n }\r\n\r\n var UpdateRowsCount = this.UpdateRowsCount = function () {\r\n ShowRowsCount(lastCount, lastTotalCount, lastIsFiltered);\r\n }\r\n\r\n var ModifyRowsCount = this.ModifyRowsCount = function (addCount) {\r\n if (lastCount != '1000+') {\r\n lastCount = parseInt(lastCount, 10) + addCount;\r\n }\r\n if (lastCount != '1000+') {\r\n lastTotalCount = parseInt(lastTotalCount, 10) + addCount;\r\n }\r\n ShowRowsCount(lastCount, lastTotalCount, lastIsFiltered);\r\n }\r\n})();\r\n\r\n// Диалоговое окно с кнопкой OK.\r\n// text - текст сообщения\r\n// title - заголовок сообщения\r\n// OK - callback по нажатию на OK.\r\nfunction ShowMessage(text, title, ok, buttonText, width, onClose, isError) {\r\n title = title || \"\";\r\n var okFunc = null;\r\n var settings = {\r\n title: title,\r\n resizable: false,\r\n modal: true,\r\n autoOpen: true,\r\n buttons: [\r\n {\r\n text: buttonText || L(\"OK\"),\r\n click: function () { $(this).dialog(\"close\"); if (okFunc) okFunc(); }\r\n }\r\n ],\r\n width: width || 600,\r\n close: function () { if (onClose) onClose(); clearAllModalDivs(); }\r\n };\r\n if ($.isPlainObject(ok)) {\r\n $.extend(settings, ok);\r\n } else {\r\n okFunc = ok;\r\n }\r\n\r\n var bgClass = '', iconClass = '';\r\n if (isError === true) {\r\n bgClass = 'ui-state-error';\r\n iconClass = 'errp';\r\n }\r\n if (isError === false) {\r\n bgClass = 'ui-state-highlight';\r\n iconClass = 'wrnp';\r\n };\r\n\r\n var errHTML;\r\n if (bgClass !== '') {\r\n errHTML = '

    ' + text + '

    ';\r\n } else {\r\n errHTML = text;\r\n }\r\n\r\n var res = $(\"
    \", { html: errHTML }).dialog(settings);\r\n AdjustDialogIfIpad(settings.width);\r\n InitHoverForButtons(res.next());\r\n}\r\n\r\n// Диалоговое окно с кнопкой OK.\r\n// text - текст сообщения\r\nfunction ShowError(text, okClick, width, onClose) {\r\n var mbox = new WA.CMP.dialogs.MessageBox();\r\n mbox.width = !!width ? width : 600;\r\n mbox.okButton(okClick);\r\n mbox.showError(text, null, L('ERROR'), onClose);\r\n //ShowMessage(text,\r\n // L('ERROR'), !!okClick ? okClick : null,\r\n // null,\r\n // !!width ? width : null,\r\n // !!onClose ? onClose : null,\r\n // true);\r\n}\r\n\r\n// Диалоговое окно с кнопкой OK.\r\n// text - текст сообщения\r\nfunction ShowWarning(text, okClick, width, onClose) {\r\n var mbox = new WA.CMP.dialogs.MessageBox();\r\n mbox.width = !!width ? width : 400;\r\n mbox.okButton(okClick);\r\n mbox.showWarning(text, null, L('WARNING'), null, onClose);\r\n //ShowMessage(text,\r\n // L('WARNING'),\r\n // !!okClick ? okClick : null,\r\n // null,\r\n // !!width ? width : null,\r\n // !!onClose ? onClose : null,\r\n // false);\r\n}\r\n\r\n\r\n// Диалоговое окно с кнопкной Закрыть\r\n// text - текст сообщения, может состоять из двух частей разделенных знаком ^\r\n// title - заголовок окна. по-умолчанию - Информация\r\n// onClose - функция обратного вызова на закрытие окна\r\nfunction ShowInfo(text, title, width, height, onClose) {\r\n var mbox = new WA.CMP.dialogs.MessageBox();\r\n if (width) mbox.width = width;\r\n if (height) mbox.height = height;\r\n mbox.showInfo(text, null, title, onClose);\r\n}\r\n\r\n// Показывает диалог подтверждения.\r\n// Вариант 1: ConfirmDialog(\"Вы хотите удалить все документы?\", function() { DeleteAllDocuments(); });\r\n// Вариант 2: ConfirmDialog({\r\n// text: \"Вы хотите удалить все документы?\",\r\n// ok: function() { DeleteAllDocuments(); }\r\n// });\r\nfunction ConfirmDialog(text, ok, cancel) {\r\n var settings = {\r\n title: L(\"CONFIRMATION\"),\r\n text: \"\",\r\n okText: L(\"YES\"),\r\n cancelText: L(\"NO\"),\r\n ok: function () { },\r\n cancel: function () { },\r\n resizable: false,\r\n modal: true,\r\n enterOk: true,\r\n onOpen: function () { },\r\n isShowOkButton: true,\r\n isShowCancelButton: true\r\n };\r\n if ($.isPlainObject(text)) {\r\n $.extend(settings, text);\r\n } else {\r\n settings.text = text;\r\n }\r\n if (ok) settings.ok = ok;\r\n if (cancel) settings.cancel = cancel;\r\n\r\n var modalWindowButtons = [];\r\n if (settings.isShowOkButton) {\r\n modalWindowButtons.push({\r\n text: settings.okText,\r\n click: function () { if (settings.ok(this) === false) { return; }; $(this).dialog(\"close\"); $(this).remove(); },\r\n 'class': 'primary'\r\n });\r\n };\r\n if (settings.isShowCancelButton) {\r\n modalWindowButtons.push({\r\n text: settings.cancelText,\r\n click: function () { if (settings.cancel(this) === false) { return; }; $(this).dialog(\"close\"); $(this).remove(); }\r\n });\r\n };\r\n\r\n\r\n var res = $(\"
    \", { html: settings.text }).dialog({\r\n zIndex: 1000,\r\n title: settings.title,\r\n resizable: settings.resizable,\r\n height: settings.height,\r\n width: settings.width,\r\n modal: settings.modal,\r\n open: function () {\r\n key.setScope('keysoff');\r\n hideAllPopups();\r\n if (settings.onOpen) settings.onOpen();\r\n },\r\n autoOpen: true,\r\n close: function () { key.setScope('common'); if (settings.close) settings.close(); clearAllModalDivs(); },\r\n buttons: modalWindowButtons\r\n });\r\n AdjustDialogIfIpad(settings.width);\r\n var buttons = res.next();\r\n if (settings.enterOk) {\r\n res.parents('.ui-dialog').find('.ui-dialog-buttonpane button').keyup(function (ev) {\r\n if (ev.keyCode == 13 || ev.keyCode == 32) {\r\n $(this).click();\r\n }\r\n });\r\n }\r\n InitHoverForButtons(buttons);\r\n AppendDialogHelpIcon(res);\r\n}\r\n\r\n// Показывает диалог подтверждения c иконкой\r\n// Вариант 1: ConfirmDialog(\"Вы хотите удалить все документы?\", function() { DeleteAllDocuments(); });\r\n// Вариант 2: ConfirmDialog({\r\n// text: \"Вы хотите удалить все документы?\",\r\n// ok: function() { DeleteAllDocuments(); }\r\n// });\r\nfunction ConfirmDialogNew(text, ok, cancel) {\r\n var settings = {\r\n text: '',\r\n ok: ok,\r\n cancel: cancel,\r\n close: function () { },\r\n width: '',\r\n height: ''\r\n };\r\n if ($.isPlainObject(text)) {\r\n $.extend(settings, text);\r\n } else {\r\n settings.text = text;\r\n }\r\n var mbox = new WA.CMP.dialogs.MessageBox();\r\n if (settings.width) mbox.width = settings.width;\r\n if (settings.height) mbox.height = settings.height;\r\n mbox.onClose = settings.close;\r\n mbox.yesNoButtons(settings.ok, settings.cancel);\r\n mbox.showQuestion(settings.text);\r\n}\r\n\r\n// То же самое, что ConfirmDialog, но с width = 300.\r\nfunction ShowDialog(html, ok, cancel) {\r\n var settings = {\r\n text: html,\r\n ok: ok,\r\n cancel: cancel,\r\n width: 300\r\n }\r\n if ($.isPlainObject(html)) {\r\n if (html.html) {\r\n html.text = html.html;\r\n delete html.html;\r\n }\r\n $.extend(settings, html);\r\n }\r\n ConfirmDialog(settings);\r\n}\r\n\r\n// Ресайзим окно инcтрукции\r\nfunction InstructionResize() {\r\n var $ins = $('.instruction_container');\r\n if ($ins.length) {\r\n var cont = $('body');\r\n $ins.height(cont.height() - $ins.position().top - 25);\r\n }\r\n}\r\n\r\n\r\n// Сделать datepicker-ы\r\nfunction CreateDatePicker(clientId, showTime, onUpdate, settings) {\r\n if (typeof clientId == \"string\") {\r\n var cntl = $(\"#\" + clientId);\r\n } else {\r\n var cntl = $(clientId);\r\n }\r\n\r\n // Инициализизуем локализацию datepicker.\r\n $.datepicker.setDefaults($.datepicker.regional[currentCultureName]);\r\n $.timepicker.setDefaults($.timepicker.regional[currentCultureName]);\r\n\r\n var isClosing = false;\r\n\r\n // Общие настройки.\r\n settings = $.extend({\r\n beforeShow: function (input, inst) {\r\n var d = cntl.attr('readonly') ? 'none' : 'auto';\r\n setTimeout(function () {\r\n $('#ui-datepicker-div').css('display', d);\r\n }, 50);\r\n },\r\n onSelect: function (d, datepicker, needTriggerChange) {\r\n var input = (datepicker.input || datepicker.$input);\r\n // Если используем timepicker, то скрывать календарь при нажатии на уже выбранную дату\r\n if (showTime) {\r\n setTimeout(\r\n function () {\r\n $('.ui-datepicker-current-day').bind('click', function () { input.datepicker('hide'); });\r\n }, 0\r\n );\r\n }\r\n // Для статистики\r\n if (Core.isStatisticEnabled) {\r\n WA.CR.statistics.write({\r\n page: WA.getLocation(),\r\n action: \"DateSelect\",\r\n area: (showTime ? 'DateTimePicker' : 'DatePicker'),\r\n target: (typeof datepicker.input !== 'undefined' ? datepicker.input.get(0) : '')\r\n });\r\n }\r\n if ($.isFunction(onUpdate)) {\r\n onUpdate.apply(this, arguments);\r\n }\r\n if (needTriggerChange !== false && typeof datepicker.input !== 'undefined') {\r\n input.trigger('change');\r\n }\r\n\r\n\r\n },\r\n onClose: function (dateText, inst) {\r\n if (!isClosing) {\r\n isClosing = true;\r\n // setTimeout нужен, т.к. в этом событии в input еще присутствует выбранное значение, даже если нажали Отмена.\r\n //setTimeout(function () {\r\n SetValidDate(inst.input);\r\n isClosing = false;\r\n //}, 10);\r\n }\r\n }\r\n }, settings);\r\n\r\n if (showTime) {\r\n settings = $.extend({\r\n showOn: \"button\",\r\n buttonImageOnly: true,\r\n buttonText: ''\r\n }, settings);\r\n\r\n cntl.datetimepicker(settings);\r\n } else {\r\n settings = $.extend({\r\n showOn: \"button\",\r\n showButtonPanel: false\r\n }, settings);\r\n cntl.datepicker(settings);\r\n }\r\n\r\n cntl.on('blur.DatePickerInitializator', function () {\r\n if (!cntl.hasClass('Req_Disabled') && !cntl.datepicker(\"widget\").is(\":visible\")) SetValidDate(cntl);\r\n }).on('keydown.DatePickerInitializator', function (ev) {\r\n var key = ev.which || ev.keyCode;\r\n //ENTER\r\n if (key === 13) {\r\n SetValidDate($(this));\r\n // Вызовем событие изменения. Проверки needTriggerChange нет, т.к. его значение определяется в выпадайке с таймпикером (false, если время не выбрано)\r\n cntl.trigger('change');\r\n }\r\n });\r\n\r\n cntl.addClass('inited').trigger('Init');\r\n}\r\n\r\nfunction SetValidDate(inp) {\r\n function setDate(date) {\r\n inp.datepicker(\"setDate\", date);\r\n inp.data('selDate', date);\r\n }\r\n\r\n var d = ParseDateTime(inp);\r\n setDate(d);\r\n}\r\n\r\n// timeArr = [\"time\"[, \"AMPM\"]]\r\nfunction ParseTime(timeArr, timeFormat) {\r\n var h = -1;\r\n var m = -1;\r\n var s = -1;\r\n var time = timeArr[0].split(\":\");\r\n var TT = (timeArr.length == 2 ? timeArr[1] : \"\");\r\n // Регулярка для проверки введено am, pm или нет.\r\n var re = new RegExp(\"^([aApP]?|[aApP]{1}[mM]?)$\");\r\n\r\n h = parseInt(time[timeFormat.indexOf(\"h\")], 10);\r\n m = parseInt(time[timeFormat.indexOf(\"m\")], 10);\r\n s = parseInt(time[timeFormat.indexOf(\"s\")], 10);\r\n\r\n // Если ввели корректно am/pm => формат американский и продолжаем парсить\r\n if (!re.test(TT))\r\n TT = null;\r\n\r\n h = (h >= 0 && h <= 23 ? h : 0);\r\n m = (m >= 0 && m <= 59 ? m : 0);\r\n s = (s >= 0 && s <= 59 ? s : 0);\r\n\r\n if (TT && TT.toLowerCase() == 'am' && h == 12) {\r\n h = 0;\r\n }\r\n if (TT && TT.toLowerCase() == 'pm' && h != 12) {\r\n h += 12;\r\n }\r\n\r\n return [h, m, s];\r\n}\r\n\r\n// Проверяет установленные даты в компоненте поиска и предупреждает если дата ПО установлена меньше\r\nfunction CheckPeriod(dateText, inst) {\r\n var id = inst.input.attr('id');\r\n var idPO;\r\n var d, dPO;\r\n if (id.indexOf('PO') >= 0) { idPO = id; id = id.substr(0, id.indexOf('PO')); }\r\n else { idPO = id + 'PO'; }\r\n d = $('#' + id).datepicker('getDate');\r\n dPO = $('#' + idPO).datepicker('getDate');\r\n if (dPO != null && d != null) {\r\n if (dPO.getTime() < d.getTime()) {\r\n // строку локализации для сообщения потом изменим\r\n ShowMessage(L(\"CHECK_PERIOD\"), L(\"WARNING\"), function () { $('#' + id).focus(); }, null, null, null, false);\r\n }\r\n }\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n/**\r\n* Механизм сворачивания / разворачивания груп кнопок.\r\n* При загрузке/обновлении группируем элементы тулбара, сайдбара.\r\n* Обрабатываем ресайз используем данные о ширине тулбара на данный момент\r\n* @fixme И еще инициализация ссылок для копирования, затесалась сюда зачем-то.\r\n* @global\r\n* @function initCollapsableElements\r\n*/\r\nfunction initCollapsableElements() {\r\n $.when(WA.ToolBarInit, WA.SideBarInit).then(function () {\r\n Core.toolBars.main.groupToolbarItems();\r\n });\r\n};\r\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n$(document).bind('click', function (el, ev) {\r\n var needHide = (!$(el.target).hasClass(\"toolbar_group_header\") && $(el.target).parent(\".toolbar_group_header\").length == 0);\r\n\r\n if (VisibleAddedDivs != 0 && needHide) { VisibleAddedDivs.hide(); VisibleAddedDivs = 0; }\r\n});\r\n\r\nfunction ShowSetDocumentRightsDialog(callback) {\r\n var mbox = new WA.CMP.dialogs.MessageBox();\r\n mbox\r\n .addButton('set_rights_btn', L('SET_EDOC_RIGHTS'), function () {\r\n DoAction('mode=edit&view=RightsList', false);\r\n })\r\n .addButton('proceed_btn', L('PROCEED_SAVING'), function () {\r\n if (callback) callback();\r\n })._setDefaultButton('set_rights_btn');\r\n mbox.isShowCancelButton = false;\r\n mbox.isShowOkButton = false;\r\n mbox.showWarning(L('EDOC_SET_RIGHTS_MSG'));\r\n\r\n AdjustDialogIfIpad(450);\r\n}\r\n\r\nfunction CopyInfoToClientBuffer() {\r\n var info = \"\";\r\n $(\"div.settings-params\").find('p,li').each(function () {\r\n info += (this.nodeName == 'LI' ? '- ' : '') + $(this).text() + '\\n';\r\n });\r\n Core.clipboard.copyTextToClipboard(info);\r\n}\r\n\r\n(function () {\r\n\r\n function make(msgType) {\r\n return '
    ' +\r\n '
    ';\r\n }\r\n\r\n function CreateMessageHtml(msg, type) {\r\n var mainText = msg;\r\n var secondText = '';\r\n var splitterIndex = msg.indexOf('^');\r\n if (splitterIndex != -1) {\r\n mainText = msg.substring(0, splitterIndex);\r\n secondText = (msg.substring(splitterIndex + 1, msg.length)).fromISBuilderToNormal();\r\n }\r\n if (!type) type = '';\r\n var messageHtml = ''; //'';\r\n messageHtml += '
    ';\r\n messageHtml += '
    ' + mainText + '
    ';\r\n messageHtml += '
    ' + secondText + '
    ';\r\n messageHtml += '
    ';\r\n return messageHtml;\r\n }\r\n\r\n // Возвращает предупреждение (html-элемент).\r\n this.MakeWarningMessage = function (msg) {\r\n var res = $(make('highlight'));\r\n res.append(CreateMessageHtml(msg, 'wrn'));\r\n //res.find('.error_msg').html(msg);\r\n return res;\r\n };\r\n\r\n this.MakeErrorMessage = function (msg) {\r\n var res = $(make('error'));\r\n res.append(CreateMessageHtml(msg, 'err'));\r\n //res.find('.error_msg').html(msg);\r\n return res;\r\n };\r\n\r\n this.MakeInfoMessage = function (msg) {\r\n var res = $(make('info'));\r\n res.append(CreateMessageHtml(msg, 'info')).children().first().attr('class', 'Information_16.png');\r\n //res.find('.error_msg').html(msg).prev().attr('class', 'Information_16.png');\r\n return res;\r\n };\r\n\r\n})();\r\n\r\n// Показ модального окна.\r\n// name - название контроля для отображения.\r\nfunction ShowModalWindow(name, options) {\r\n var handlerExecuted = false;\r\n var hideReferenceDropDown = function () {\r\n hideAllPopups();\r\n if (!handlerExecuted) {\r\n handlerExecuted = true;\r\n return settings.cancel();\r\n }\r\n };\r\n\r\n // если высоту не задали явно, то пусть будет auto. Раньше всегда была auto.\r\n var settings = {\r\n title: \"\", // Заголовок окна.\r\n params: null, // Параметры, передаваемые контролю.\r\n okText: L(\"OK\"), // Текст на кнопке \"ОК\"\r\n cancelText: L(\"CANCEL\"), // Текст на кнопке \"CANCEL\"\r\n ok: function () { }, // Функция, которая выполнится при нажатии на \"ОК\"\r\n cancel: function () { }, // Функция, которая выполнится при нажатии на \"CANCEL\"\r\n drag: function () { },\r\n width: 600, // Ширина окна\r\n height: \"auto\",\r\n resizable: false, // Можно ли изменять размеры окна\r\n position: \"default\", // Позиционирование окна\r\n autoOpen: true,\r\n close: hideReferenceDropDown\r\n };\r\n\r\n\r\n function executeAndCloseFunc(handler) {\r\n return function () {\r\n var needClose = true;\r\n try {\r\n handlerExecuted = true;\r\n if (handler() === false)\r\n needClose = false;\r\n } catch (_) { }\r\n if (needClose) {\r\n $(this).dialog('close');\r\n };\r\n };\r\n };\r\n\r\n var hh = null;\r\n\r\n function showMessage(errMsg, msgType) {\r\n if (!wnd.is(':visible') && errMsg != null && errMsg != '')\r\n wnd.dialog('open');\r\n if (hh === null) {\r\n hh = wnd.height();\r\n }\r\n if (typeof errMsg === 'undefined' || errMsg === null || errMsg === '') {\r\n wnd.find('.error_msg_container').hide();\r\n wnd.height(hh);\r\n } else {\r\n wnd.find('.error_msg_container').remove();\r\n if (msgType === 'error') {\r\n wnd.prepend(MakeErrorMessage(errMsg));\r\n } else if (msgType === 'info') {\r\n wnd.prepend(MakeInfoMessage(errMsg));\r\n } else {\r\n wnd.prepend(MakeWarningMessage(errMsg));\r\n }\r\n if (msgType == 'warning') msgType = 'highlight';\r\n wnd.find('.error_msg_container').removeClass('ui-state-error').removeClass('ui-state-highlight').removeClass('ui-state-info').addClass('ui-state-' + msgType).show();\r\n wnd.css('height', hh + wnd.find('.error_msg_container').outerHeight() + 10);\r\n }\r\n }\r\n\r\n var shownMessageType = '';\r\n\r\n function showError(errMsg) {\r\n shownMessageType = (errMsg ? 'error' : '');\r\n showMessage(errMsg, 'error');\r\n }\r\n\r\n function showWarning(warnMsg) {\r\n // Не показываем warning если уже была показана ошибка.\r\n if (shownMessageType === 'error') return;\r\n\r\n shownMessageType = (warnMsg ? 'warning' : '');\r\n showMessage(warnMsg, 'warning');\r\n }\r\n\r\n function showInformation(infoMsg) {\r\n // Не показываем info если уже была показана ошибка или предупреждение.\r\n if (shownMessageType === 'error' || shownMessageType === 'warning') return;\r\n\r\n shownMessageType = (infoMsg ? 'info' : '');\r\n showMessage(infoMsg, 'info');\r\n }\r\n\r\n $.extend(settings, options);\r\n\r\n $('div#modal_window').remove();\r\n var wnd = $('
    ');\r\n var ready = false;\r\n\r\n var needShowButtons = (typeof settings.showButtons === 'undefined' || settings.showButtons === true);\r\n\r\n // Было еще height: settings.height, но из-за него высота была слишком большой.\r\n $(function () {\r\n wnd.dialog({\r\n zIndex: 1000,\r\n title: settings.title,\r\n resizable: settings.resizable,\r\n width: settings.width,\r\n height: settings.height,\r\n maxHeight: Math.floor($(window).height() * 0.95), // максимальная высота диалога в 95% высоты браузера\r\n modal: true,\r\n autoOpen: settings.autoOpen,\r\n close: function () { if (settings.close) settings.close(); key.setScope('common'); },\r\n closeText: L('CLOSE'),\r\n dragStart: function () {\r\n hideAllPopups();\r\n },\r\n drag: settings.drag,\r\n buttons: (needShowButtons ? [\r\n {\r\n text: settings.okText,\r\n click: executeAndCloseFunc(settings.ok),\r\n 'class': 'primary',\r\n 'data-name': 'OkButton'\r\n },\r\n {\r\n text: settings.cancelText,\r\n click: executeAndCloseFunc(settings.cancel),\r\n 'data-name': 'CancelButton'\r\n }\r\n ] : [])\r\n }).data('error', showError).data('info', showInformation).data('warning', showWarning).data('disable_ok', function () {\r\n $('#modal_window').next().find('.ui-button:first').data('uiButton').disable();\r\n }).data('enable_ok', function () {\r\n $('#modal_window').next().find('.ui-button:first').removeClass('active hover').data('uiButton').enable();\r\n });\r\n AdjustDialogIfIpad(settings.width);\r\n\r\n // Для статистики.\r\n var jModalWindowContainer = wnd.parents('.ui-dialog');\r\n jModalWindowContainer.find('.ui-dialog-titlebar').addClass('stat_Title');\r\n jModalWindowContainer.find('.ui-dialog-titlebar-close').attr('data-name', 'CloseIcon');\r\n jModalWindowContainer.find('.ui-dialog-content').addClass('stat_Content');\r\n jModalWindowContainer.find('.ui-dialog-buttonpane').addClass('stat_Buttons');\r\n\r\n // TODO Bessolcyn_FI: надо как то исправить эту затычку\r\n if (name != 'askable_params' && WA.getLocation() == 'task') key.setScope('modalwindow');\r\n });\r\n InitHoverForButtons(wnd.next());\r\n\r\n CallServiceSync(\"/ModalWindow.asmx/Create\", { ControlName: name, Params: $.toJSON(settings.params) }, function (res) {\r\n if (res.Success) {\r\n res = res.Result;\r\n var jModalWindowContainer = wnd.parents('.ui-dialog');\r\n\r\n // Для статистики.\r\n jModalWindowContainer.addClass('stat_ModalWindow_' + name).attr(\"data-stataction\", 'ModalWindow');\r\n\r\n wnd.html(res.html);\r\n //Добавляем \"?\" для вызова справки.\r\n AppendDialogHelpIcon(wnd);\r\n jModalWindowContainer.find('.DialogHelpIco').attr('data-name', 'HelpIcon');\r\n\r\n // Устанавливаем position тут, т.к. диалог выравнивается неправильно до добавления html-контента.\r\n if (wnd.hasClass('ui-dialog-content')) wnd.dialog('option', 'position', { my: 'center center', at: 'center center', of: window });\r\n\r\n if (name === 'sign') {\r\n wnd.css('position', 'static');\r\n }\r\n if (res.initJs) {\r\n var f = new Function(res.initJs);\r\n var cnt = this;\r\n setTimeout(function () {\r\n f.apply(cnt);\r\n }, 10);\r\n }\r\n ready = true;\r\n } else {\r\n wnd.empty();\r\n showError(res.Error);\r\n $(function () {\r\n wnd.data('disable_ok')();\r\n });\r\n }\r\n if (settings.afterOpen) settings.afterOpen();\r\n }, function (err) { showError(err); });\r\n\r\n return wnd;\r\n}\r\n\r\n//Добавляет \"?\" для вызова справки.\r\nfunction AppendDialogHelpIcon(wnd, isCustomDlg) {\r\n if (wnd && wnd.length > 0) {\r\n var el;\r\n if (isCustomDlg === true) {\r\n el = wnd;\r\n } else {\r\n el = wnd.parent().find('.ui-dialog-titlebar');\r\n };\r\n if (el.find('.DialogHelpIco').length == 0) {\r\n el.append('');\r\n };\r\n };\r\n};\r\n\r\n// Экспорт документа - без модального окна.\r\n// eDocId - ид документа\r\n// verNumber - номер версии или 'lastver'\r\n// needLock - экспорт с блокировкой\r\n// needExport - чтение/изменение или экспорт\r\nfunction ExportEDocNow(eDocId, verNumber, needLock, needExport, transform, toEsd, withOnlyApprovingSigns) {\r\n var mode = needLock ? (needExport ? \"EXPLOCK\" : \"EDITLOCK\") : (needExport ? \"EXPORT\" : \"VIEW\");\r\n var url = \"\";\r\n var openPreview = false;\r\n\r\n if (mode == \"VIEW\") {\r\n // if (g_UseWebAccessAgent) {\r\n // SendEDocToAgent(eDocId, verNumber, false);\r\n // return;\r\n // }\r\n // else {\r\n //Определяем, поддерживается ли формат для предпросмотра\r\n // пока закомментировали, вдруг все обратно поменяется\r\n //CallServiceSync(\"/EDocument.asmx/CheckVersionFormatForPreview\", { EDocID: eDocId, VerNum: verNumber == \"lastver\" ? 0 : verNumber },\r\n // function (res) {\r\n // if (res.Success) {\r\n // openPreview = res.Result;\r\n // }\r\n // else {\r\n // ShowError(res.Error);\r\n // }\r\n // },\r\n // function (err) {\r\n // showError(err);\r\n // });\r\n openPreview = true;\r\n url = GetPreviewEDocUrl(eDocId, verNumber);\r\n //}\r\n }\r\n else {\r\n url = format(\"Doc.aspx?sys={code}&ext={ext}&ID={doc_id}&view=ShowVerList&ver={ver_num}{explock}{transformName}{toEsd}{withOnlyApprovingSigns}\",\r\n { code: g_SysCode, ext: g_ExtName, doc_id: eDocId, ver_num: verNumber, explock: \"&mode=\" + mode, transformName: \"&transform=\" + transform, toEsd: \"&toEsd=\" + toEsd, withOnlyApprovingSigns: \"&withOnlyAppSings=\" + withOnlyApprovingSigns });\r\n }\r\n //if (openPreview) {\r\n // url = GetPreviewEDocUrl(eDocId, verNumber);\r\n //} else {\r\n // if (WebAccess.agent.isPluginAvailable(\"edmsplugin\") && $('#lock').length == 0) {\r\n // SendEDocToAgent(eDocId, verNumber, false);\r\n // return;\r\n // }\r\n\r\n\r\n if (needLock && !needExport) {\r\n setTimeout(function () {\r\n ShowMessage(L(\"OPEN_FOR_EDIT_TITLE\"), L(\"TAKE_OUT_DOCUMENT_VERSION\"), null, null, 500, null, false);\r\n }, 500);\r\n }\r\n\r\n UnbindBeforeUnload();\r\n\r\n if (($.ipad) || (openPreview)) {\r\n if (openPreview) ShowTopSpinner(L(\"PLEASE_WAIT\"), true);\r\n window.open(url, 'EDoc' + eDocId);\r\n if (openPreview) HideTopSpinner(\"\", 1);\r\n } else {\r\n setTimeout(function () {\r\n if (needLock && WA.getLocation() == 'doc' && GetParamInURL('view').toLowerCase() == 'showverlist') {\r\n ReloadVersionList();\r\n }\r\n }, 100);\r\n location.href = url;\r\n }\r\n\r\n}\r\n\r\nfunction GetPreviewEDocUrl(id, versionNumber) {\r\n var useFullScreen = (g_isFullscreenPreview) || ($('body').width() <= 800);\r\n return format(\"{page}.aspx?sys={code}&ext={ext}&ID={doc_id}&view=Preview&VersionNum={ver_num}\",\r\n { page: useFullScreen ? \"DocumentPreview\" : \"Doc\", code: g_SysCode, ext: g_ExtName, doc_id: id, ver_num: versionNumber });\r\n}\r\n\r\n// Вызов модального окна для экспорта документа.\r\n// id: id документа, если не задан - берется из url.\r\n// hideLock: true - спрятать галочку \"заблокировать\"\r\n// verNumber: если задан, то версия с данным номером будет выбрана.\r\n// openRead: true - открыть на чтение (не блокировать версию).\r\nfunction ExportEDoc(id, hideLock, verNumber, openRead, OkFunc, AgentCallback) {\r\n /*if ($.ipad && !WA.ENV.isAndroid()) {\r\n ShowError(L(\"NO_FILES_FOR_IPAD\"));\r\n return;\r\n }*/\r\n id = id || GetParamInURL('id');\r\n var showLock = !hideLock;\r\n if (!verNumber) verNumber = 0;\r\n if (!showLock) {\r\n var needShowWindow = true;\r\n // если не нужно показывать чекбокс с блокировкой, то проверяем, только ли одна версия у документа.\r\n CallServiceSync(\"/EDocument.asmx/HasOnlyOneVersion\", { EDocID: id }, function (res) {\r\n if (!res.Success && res.Error) {\r\n needShowWindow = false;\r\n var severity = (res.Severity !== \"-1\" ? Number(res.Severity) : undefined);\r\n WA.CR.inlineHint.show(res.Error, undefined, severity);\r\n return;\r\n }\r\n\r\n if (res.Success && res.Result) {\r\n //Здесь умышленно оставлено \"==\", т.к. может прийти \"2\" в строке\r\n if (!openRead && res.Result == 2) {\r\n if (AgentCallback) {\r\n AgentCallback();\r\n needShowWindow = false;\r\n }\r\n return;\r\n }\r\n if (AgentCallback) AgentCallback();\r\n else ExportEDocNow(id, \"lastver\", !openRead && res.Result == 1, showLock);\r\n needShowWindow = false;\r\n }\r\n\r\n /**\r\n * Всегда открывать последнуюю версию без модалки,\r\n * если необходим предпросмотр\r\n * @since 5.0.4\r\n * @see Замечание #74358\r\n */\r\n if (!AgentCallback) {\r\n ExportEDocNow(id, \"lastver\", !openRead && res.Result == 1, showLock);\r\n needShowWindow = false;\r\n };\r\n\r\n });\r\n if (!needShowWindow)\r\n return;\r\n }\r\n\r\n var OK = OkFunc ? OkFunc : function () {\r\n var modalWindow = $('#modal_window');\r\n var verNumberCheckedRadio = modalWindow.find('input[type=\"radio\"]:checked');\r\n var verNumber = verNumberCheckedRadio.val();\r\n if (showLock)\r\n var explock = modalWindow.find('#lock:checked').length != 0;\r\n else\r\n var explock = !openRead && verNumberCheckedRadio.data('islocked') != '1';\r\n\r\n var transform = modalWindow.find('#transformationinp').val();\r\n\r\n var toEsd = modalWindow.find(\"#export_to_esd_checkbox:checked\").length != 0;\r\n var withOnlyApprovingSigns = false;\r\n if (toEsd)\r\n withOnlyApprovingSigns = modalWindow.find(\"#export_with_only_approving_signature_checkbox\").prop(\"checked\");\r\n\r\n if (verNumber) ExportEDocNow(id, verNumber, explock, showLock, transform, toEsd, withOnlyApprovingSigns);\r\n };\r\n\r\n ShowModalWindow(\"export\", {\r\n title: showLock ? L(\"EXPORT_DOCUMENT_VERSION\") : (openRead ? L(\"VIEW\") : L(\"EDITING\")),\r\n okText: showLock ? L(\"OK\") : (openRead ? L(\"OK\") : L(\"OPEN\")),\r\n afterOpen: function () {\r\n BindHelpIcoClickOnModalWindow('Export');\r\n key.setScope('baseDialog');\r\n var transformationsPick = new WebAccess.components.wrappers.form.requisites.Pick('transformation', 'transformation');\r\n transformationsPick.disable();\r\n UpdateExportDialog.call($('#modal_window input[type=\"radio\"]:checked'));\r\n\r\n var jExportWithOnlyApprovingSignature = $(\"#export_with_only_approving_signature_checkbox\");\r\n var jExportToEsd = $(\"#export_to_esd_checkbox\");\r\n // Управление состояниями checkbox В структуированном виде и Только утверждающие подписи\r\n jExportToEsd.on(\"change\", function () {\r\n if (!$(this).prop(\"checked\"))\r\n if (jExportWithOnlyApprovingSignature.prop(\"checked\"))\r\n jExportWithOnlyApprovingSignature.prop(\"checked\", false);\r\n });\r\n jExportWithOnlyApprovingSignature.on(\"change\", function () {\r\n if ($(this).prop(\"checked\"))\r\n if (!jExportToEsd.prop(\"checked\"))\r\n jExportToEsd.prop(\"checked\", true);\r\n });\r\n\r\n },\r\n close: function () {\r\n clearAllModalDivs();\r\n key.setScope('common');\r\n },\r\n ok: OK,\r\n params: { EDocID: id, ShowLock: showLock, VerNumber: verNumber, Mode: openRead ? \"VIEW\" : \"EDIT\", IsExport: AgentCallback ? false : true, ShowTransformations: true, ShowToEsd: true }\r\n });\r\n\r\n\r\n if (showLock) {\r\n $('#modal_window').data('warnlocked', function () {\r\n $('#modal_window').data('warning')(L('WRN_CANT_EXPORT_DOC_VER_LOCKED_DB_NO_PARAMS'));\r\n });\r\n } else if (!openRead) {\r\n $('#modal_window').data('warnlocked', function () {\r\n $('#modal_window').data('warning')(L('WRN_EXPORT_READONLY'));\r\n });\r\n } else {\r\n $('#modal_window').data('warnlocked', $.noop);\r\n }\r\n}\r\n\r\nfunction CheckLock(event, el) {\r\n if (event.keyCode == 32 || event.which == 32) {\r\n if (el.checked) {\r\n el.checked = false;\r\n }\r\n else {\r\n el.checked = true;\r\n }\r\n }\r\n}\r\n\r\nvar UpdateExportDialog = function () {\r\n var radio = $(this);\r\n if (radio.is(':checked')) {\r\n var modal = $('#modal_window');\r\n var lock = modal.find('#lock');\r\n var lock_label = modal.find('#lock_label');\r\n\r\n if (radio.data('document_id')) {\r\n var transformationsPick = new WebAccess.components.wrappers.form.requisites.Pick('transformation', 'transformation');\r\n transformationsPick.clearValues();\r\n transformationsPick.addValue(L(\"NO\"), L(\"NO\"));\r\n transformationsPick.setValue(L(\"NO\"));\r\n\r\n WA.services.call(\"/EDocument.asmx/GetTransformationsForVersion\",\r\n { DocumentId: radio.data('document_id'), VersionNum: radio.val() }).\r\n success(function (res) {\r\n var availableTransformations = res;\r\n _.each(availableTransformations, function (t) {\r\n if (t != L(\"NO\"))\r\n transformationsPick.addValue(t, t);\r\n });\r\n\r\n if (availableTransformations.length <= 1 && availableTransformations[0] === L(\"NO\")) {\r\n transformationsPick.disable();\r\n } else {\r\n transformationsPick.enable();\r\n }\r\n });\r\n }\r\n\r\n if (radio.data('islocked') == '1') {\r\n lock.attr('disabled', 'disabled').removeAttr('checked');\r\n if (lock_label.is(\":visible\")) modal.data('warning')(radio.data('locked_msg').d);\r\n } else {\r\n lock.removeAttr('disabled');\r\n modal.data('warning')(null);\r\n if (!lock_label.is(':visible')) {\r\n modal.data('enable_ok')();\r\n }\r\n }\r\n }\r\n};\r\n\r\nfunction CreateVersionToolbar(DocID, VersionNumber, Encoding, PluginName) {\r\n var encoding = Encoding;\r\n var docID = DocID;\r\n var verNum = (!!VersionNumber ? VersionNumber : null);\r\n\r\n // Если агент доступен, проверяем зашифрован ли документ\r\n WA.agent.isPluginAvailable('edmsplugin').done(function (isPluginAvailable) {\r\n if (isPluginAvailable && encoding > 0) {\r\n var onError = function (error) { ShowError(error, null, 350); };\r\n var pluginName = PluginName;\r\n switch (encoding + '') {\r\n case '1':\r\n //FIXME: переделать на WA.agent.getDocumentDecryptionKey\r\n GetEncryptionKeyForDoc(docID, encoding, pluginName, '',\r\n function (encryptionKey) { ImportEDocNew(docID, 'create', verNum, null, '', encryptionKey); },\r\n onError);\r\n break;\r\n case '2':\r\n //FIXME: переделать на WA.agent.getDocumentDecryptionKey\r\n RequestPasswordForDecryption('', function (password) {\r\n ImportEDocNew(docID, 'create', verNum, null, password);\r\n });\r\n break;\r\n case '3':\r\n //FIXME: переделать на WA.agent.getDocumentDecryptionKey\r\n RequestPasswordForDecryption('', function (password) {\r\n GetEncryptionKeyForDoc(docID, encoding, pluginName, password,\r\n function (encryptionKey) { ImportEDocNew(docID, 'create', verNum, null, password, encryptionKey); },\r\n onError);\r\n });\r\n break;\r\n }\r\n return;\r\n }\r\n ImportEDocNew(docID, \"create\", verNum);\r\n }).fail(function () {\r\n ImportEDocNew(docID, \"create\", verNum);\r\n });\r\n}\r\n\r\n// Выводит диалоговое окно импорта документа.\r\n// id - ид документа (если не задан, берется из url)\r\n// mode - режим (по умолчанию import):\r\n// import - импорт документа\r\n// return - вернуть документ\r\n// return_showversions - вернуть документ, при этом вывести окно версий\r\n// create - создать новую версию\r\n// verNumber - номер версии\r\nfunction ImportEDoc(id, mode, verNumber, callback) {\r\n var helpContextId = 'Import';\r\n if ($.ipad && !WA.ENV.isAndroid()) {\r\n ShowError(L(\"NO_FILES_FOR_IPAD\"), null, 350);\r\n return;\r\n }\r\n id = id || GetParamInURL('id');\r\n mode = mode || \"import\";\r\n if (!verNumber) verNumber = 0;\r\n var settings = GetImportModeSettings(mode);\r\n ShowModalWindow(\"import\", $.extend(settings, {\r\n afterOpen: function () {\r\n BindHelpIcoClickOnModalWindow(helpContextId);\r\n },\r\n ok: function () {\r\n var modalWindow = $(\"#modal_window\");\r\n $(modalWindow.dialog(\"option\", \"buttons\")).each(function () { if (this.text == L(\"IMPORT\")) g_import_btn = this; });\r\n\r\n var checkFileSize = CheckFileSize(modalWindow.find('input[type=\"file\"]')[0], modalWindow.data('error'));\r\n // Сделал для того, чтоб при повторном нажатии на \"Импорт\" документ не импортировался повторно (замечание 56158).\r\n if (settings.isImporting) {\r\n if (typeof g_import_btn.isPressed == 'undefined') {\r\n g_import_btn.isPressed = true;\r\n if (checkFileSize) {\r\n modalWindow.find('form').submit();\r\n }\r\n }\r\n else if (!g_import_btn.isPressed) {\r\n g_import_btn.isPressed = true;\r\n if (CheckFileSize($('#modal_window form input[type=\"file\"]')[0], $('#modal_window').data('error'))) {\r\n modalWindow.find('form').submit();\r\n }\r\n }\r\n }\r\n else {\r\n if (CheckFileSize($('#modal_window form input[type=\"file\"]')[0], $('#modal_window').data('error'))) {\r\n modalWindow.find('form').submit();\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n params: { EDocID: id, DisplayMode: mode, VerNumber: verNumber }\r\n }));\r\n $('#modal_window').data('success', function () {\r\n $('#modal_window').dialog('close');\r\n ShowTopSpinnerResult(successText, 2000, callback);\r\n if (!callback && typeof ReloadVersionList != \"undefined\")\r\n ReloadVersionList();\r\n });\r\n}\r\n\r\nfunction ImportEDocNewToolbar() {\r\n var DocID = GetParamInURL('id');\r\n var DoIt = function (decryptedKey) {\r\n ImportEDocNew(DocID, 'import', null, null, null, decryptedKey);\r\n };\r\n\r\n var encoding = WA.Document.Encoding;\r\n\r\n if (encoding > 0) {\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n var onError = function (error) { ShowError(error, null, 350); };\r\n var pluginName = WA.Document.PluginName;\r\n switch (encoding + '') {\r\n case '1':\r\n WebAccess.agent.emds.getDocumentDecryptedKey(DocID, encoding, pluginName, \"\", DoIt, onError);\r\n break;\r\n case '2':\r\n case '3':\r\n RequestPasswordForDecryption('', function (password) { WebAccess.agent.edms.getDocumentDecryptedKey(DocID, encoding, pluginName, password, DoIt, onError); });\r\n break;\r\n }\r\n }).fail(function () {\r\n ImportEDocNew(DocID);\r\n });\r\n } else {\r\n ImportEDocNew(DocID);\r\n }\r\n}\r\n\r\nfunction ImportEDocNew(DocID, Mode, VersionNumber, Callback, password, encryptionKey) {\r\n if ($.ipad && !WA.ENV.isAndroid() && (Mode !== 'create')) {\r\n ShowError(L(\"NO_FILES_FOR_IPAD\"), null, 350);\r\n return;\r\n }\r\n Mode = !!Mode ? Mode : 'import';\r\n VersionNumber = !!VersionNumber ? VersionNumber : '0';\r\n\r\n var decryptKey = !!encryptionKey ? encryptionKey : '';\r\n var pass = !!password ? password : '';\r\n\r\n CallService(\"/ModalWindow.asmx/Create\", {\r\n ControlName: \"import\", Params: $.toJSON({\r\n EDocID: DocID,\r\n DisplayMode: Mode,\r\n VerNumber: VersionNumber,\r\n DecryptKey: decryptKey,\r\n Pass: pass\r\n })\r\n }, function (res) {\r\n if (res.Success) {\r\n var settings = GetImportModeSettings(Mode);\r\n var dialog = new WA.components.dialogs.BaseDialog();\r\n dialog.title = settings.title;\r\n dialog.isShowOkButton = false;\r\n dialog.isShowCancelButton = true;\r\n dialog.setHtml($('
    ').css('overflow', 'hidden').html(res.Result.html)[0].outerHTML);\r\n dialog.width = 610;\r\n dialog.onClose = function () {\r\n // Обновить список версий\r\n if (typeof ReloadVersionList != 'undefined') ReloadVersionList();\r\n };\r\n\r\n dialog.modalWindowButtons.push({\r\n id: 'modal_ok_button',\r\n 'class': 'primary',\r\n text: settings.okText,\r\n click: function () {\r\n dialog.disableButton('modal_ok_button');\r\n ShowTopSpinner('', true, true);\r\n return OnImportOkClick(settings.isImporting);\r\n },\r\n closeDialog: false\r\n });\r\n dialog.onOpen = function () {\r\n $('#modal_window:visible').\r\n data('isFileAccepted', false).\r\n data('success', function () {\r\n dialog.close();\r\n ShowTopSpinnerResult(settings.successText, 2000, Callback);\r\n if (!Callback && typeof ReloadVersionList != \"undefined\")\r\n ReloadVersionList();\r\n }).\r\n data('error', function (error) {\r\n var wnd = $('#modal_window:visible');\r\n if (!!error) {\r\n wnd.data('isFileAccepted', false);\r\n dialog.enableButton('modal_ok_button');\r\n ShowMessageInDialog(wnd, error, 'error');\r\n }\r\n HideTopSpinner('', 0, null, true);\r\n }).\r\n data('warning', function (warning) {\r\n var wnd = $('#modal_window:visible');\r\n if (!!warning) {\r\n wnd.data('isFileAccepted', false);\r\n dialog.enableButton('modal_ok_button');\r\n ShowMessageInDialog(wnd, warning, 'warning');\r\n }\r\n HideTopSpinner('', 0, null, true);\r\n }).\r\n data('disable_ok', function () { dialog.disableButton('modal_ok_button'); }).\r\n data('enable_ok', function () { dialog.enableButton('modal_ok_button'); });\r\n };\r\n dialog.show();\r\n BindHelpIcoClickOnModalWindow(settings.helpContextId);\r\n\r\n if (res.Result.initJs) {\r\n var f = new Function(res.Result.initJs);\r\n setTimeout(function () {\r\n f.apply(window);\r\n }, 10);\r\n }\r\n }\r\n else {\r\n if (!!res.Error) {\r\n ShowError(res.Error, null, 350);\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction GetImportModeSettings(mode) {\r\n var title, okText, successText, height, isImporting, helpContextId;\r\n switch (mode) {\r\n case \"import\":\r\n title = L(\"EDOCUMENT_IMPORT\");\r\n okText = L(\"IMPORT\");\r\n successText = L(\"EDOCUMENT_IMPORT_SUCCESS\");\r\n height = 375;\r\n isImporting = true;\r\n helpContextId = 'Import';\r\n break;\r\n case \"return\":\r\n title = L(\"EDOCUMENT_VERSION_RETURN\");\r\n okText = L(\"RETURN_EDOC\");\r\n successText = L(\"EDOCUMENT_VERSION_RETURN_SUCCESS\");\r\n height = 200;\r\n helpContextId = 'Import';\r\n break;\r\n case \"return_showversions\":\r\n title = L(\"EDOCUMENT_RETURN\");\r\n okText = L(\"RETURN_EDOC\");\r\n successText = L(\"EDOCUMENT_RETURN_SUCCESS\");\r\n height = 375;\r\n helpContextId = 'Import';\r\n break;\r\n case \"create\":\r\n title = L(\"EDOCUMENT_CREATE_VERSION\");\r\n okText = L(\"CREATE_VERSION\");\r\n successText = L(\"EDOCUMENT_CREATE_VERSION_SUCCESS\");\r\n height = 270;\r\n helpContextId = 'CreateNewVersion';\r\n break;\r\n default:\r\n throw new Error(\"Invalid mode\");\r\n }\r\n var settings = {\r\n \"title\": title,\r\n \"okText\": okText,\r\n \"successText\": successText,\r\n \"height\": height,\r\n \"isImporting\": isImporting,\r\n \"helpContextId\": helpContextId\r\n };\r\n return settings;\r\n}\r\n\r\nfunction ShowMessageInDialog(wnd, errMsg, msgType) {\r\n if (!!errMsg) {\r\n errMsg = errMsg.replace(/\\\\n/g, \"
    \");\r\n wnd.find('.error_msg_container').remove();\r\n wnd.prepend((msgType == \"error\" ? MakeErrorMessage : MakeWarningMessage)(errMsg));\r\n //wnd.find('.error_msg').html(errMsg);\r\n }\r\n else {\r\n wnd.find('.error_msg_container').hide();\r\n }\r\n}\r\n\r\nfunction OnImportOkClick(IsImporting) {\r\n var modalWindow = $('#modal_window');\r\n var isFileSizeAccepted = CheckFileSize(modalWindow.find('input[type=\"file\"]')[0], modalWindow.data('error'));\r\n var allowCreateActiveVersion = CheckAllowCreateActiveVersion();\r\n var currentState = modalWindow.find('#version_state').find('.pickFieldHidden').val();\r\n\r\n if ((currentState == \"2\") && (!allowCreateActiveVersion)) {\r\n //выдать модалку на установку устаревших версий\r\n var dialog = new WA.CMP.dialogs.MessageBox();\r\n dialog.removeDefaultButtons();\r\n dialog.addButton('YesButton', L('YES'), function () {\r\n //пометить что нужно сделать устаревшими все остальные\r\n modalWindow.find('#set_obsolete_versions').val('true');\r\n modalWindow.find('form').submit();\r\n });\r\n dialog.addButton('NoButton', L('NO'), function () { dialog.close(); HideTopSpinner(); $('#modal_ok_button').removeClass('disabled').removeAttr('disabled'); });\r\n var kindName;\r\n if (typeof WA.current.EDocKind == 'undefined') {\r\n var importEdocId = modalWindow.find('input[name=\"import_edocid\"]').val();\r\n var jEDocTr = $('#' + importEdocId + '');\r\n kindName = jEDocTr.attr('data-kind-name');\r\n } else {\r\n kindName = WA.current.EDocKind;\r\n }\r\n\r\n dialog.show(L('CONFIRM_SET_OBSOLETE_STATE_MAIN_TEXT'), format(L(\"CONFIRM_SET_OBSOLETE_STATE_ADDITIONAL_TEXT\"), { '0': kindName }), L('CONFIRMATION'), 'question');\r\n } else {\r\n if (IsImporting) {\r\n if (!modalWindow.data('isFileAccepted') && isFileSizeAccepted) {\r\n modalWindow.data('isFileAccepted', true);\r\n modalWindow.find('form').submit();\r\n }\r\n } else {\r\n if (isFileSizeAccepted) {\r\n modalWindow.find('form').submit();\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n//Проверяет возможность создания действующей версии\r\nfunction CheckAllowCreateActiveVersion() {\r\n var res = true;\r\n if (typeof WA.current.AllowMultipleActiveVersions !== 'undefined') {\r\n if ((WA.current.AllowMultipleActiveVersions === false) && (WA.current.CountActiveVersions > 0)) {\r\n res = false;\r\n }\r\n } else {\r\n var importEdocId = $('#modal_window').find('input[name=\"import_edocid\"]').val();\r\n var jEDocTr = $('#' + importEdocId + '');\r\n if ((jEDocTr.attr('data-allow-multiple-versions') === \"False\") && (jEDocTr.attr('data-count-active-versions') != \"0\")) {\r\n res = false;\r\n }\r\n }\r\n return res;\r\n}\r\n\r\n//Проверяет возможность создания действующей версии\r\nfunction CheckAllowCreateActiveVersion() {\r\n var res = true;\r\n if (typeof WA.current.AllowMultipleActiveVersions !== 'undefined') {\r\n if ((WA.current.AllowMultipleActiveVersions === false) && (WA.current.CountActiveVersions > 0)) {\r\n res = false;\r\n }\r\n } else {\r\n var importEdocId = $('#modal_window').find('input[name=\"import_edocid\"]').val();\r\n var jEDocTr = $('#' + importEdocId + '');\r\n if (jEDocTr.attr('data-allow-multiple-versions') === \"False\") {\r\n //проверяем, есть ли у докемента уже активные версии\r\n WA.SRV.callSync('/Document.asmx/HasDocumentAnyActiveVersion', { DocumentID: importEdocId }).done(function (result) {\r\n res = !result;\r\n });\r\n }\r\n }\r\n return res;\r\n}\r\n\r\nfunction CheckVersionAllowLock() {\r\n var modalWindow = $('#modal_window');\r\n var unlockDocLabel = modalWindow.find('#unlock_label');\r\n var unlockDoc = modalWindow.find('#unlock');\r\n var allowLock = function () {\r\n var radio = $(this);\r\n if (radio.is(':checked')) {\r\n if (radio.data('islocked') != '1' || radio.parent().find('.Version_Table_Sign_Img:visible').length > 0) {\r\n unlockDocLabel.addClass('field_disabled');\r\n unlockDoc.attr('disabled', 'disabled').removeAttr('checked');\r\n }\r\n else {\r\n unlockDocLabel.removeClass('field_disabled');\r\n unlockDoc.removeAttr('disabled').attr('checked', true);\r\n }\r\n //Для закрепленных версий за сервером\r\n if (radio.data('islockedforserver') == 'True') {\r\n modalWindow.data('warning')(L(\"WRN_UNABLE_IMPORT_VERSION_IS_LOCKED_FOR_SERVER\", radio.val(), radio.data('lockedservername')));\r\n modalWindow.data('disable_ok')();\r\n unlockDocLabel.addClass('field_disabled').children().attr('disabled', 'disabled').removeAttr('checked');\r\n } else {\r\n modalWindow.find('.error_msg_container').hide();\r\n modalWindow.data('enable_ok')();\r\n }\r\n modalWindow.find('#import_note').val(radio.data('note'));\r\n }\r\n };\r\n var radios = modalWindow.find('input[type=\"radio\"]').change(allowLock);\r\n allowLock.call(radios.filter(':checked'));//modalWindow.find('input[type=\"radio\"]:checked'));\r\n}\r\n\r\n// Показать окно для подписания документа.\r\n// id - ид документа.\r\nfunction SignEDoc(id, versionNumber) {\r\n if (WA.agent.isAvailable()) {\r\n id = id || GetParamInURL('id');\r\n\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n ShowModalWindow(\"sign\", {\r\n title: L(\"EDOCUMENT_SIGN\"),\r\n afterOpen: function () {\r\n BindHelpIcoClickOnModalWindow('Sign');\r\n var jModalWnd = $('#modal_window');\r\n if (!!versionNumber) {\r\n jModalWnd.find('input[type=radio][value=' + versionNumber + ']').click();\r\n }\r\n key.setScope('baseDialog');\r\n\r\n var jTokenPinMessage = jModalWnd.find(\"#new_error_container\");\r\n var jTokenPinInput = jModalWnd.find(\".token_pin_code\");\r\n\r\n if (jTokenPinMessage.length != 0) {\r\n // Обернуть сообщение и поле ввода для пин-кода нельзя ввиду особенностей рендера диалога.\r\n jTokenPinMessage.parent().hide();\r\n jTokenPinInput.parent().parent().hide();\r\n }\r\n },\r\n ok: function () {\r\n var handler = $('#modal_window').data('ok');\r\n if (handler) return handler();\r\n },\r\n cancel: function () {\r\n var handler = $('#modal_window').data('cancel');\r\n if (handler) return handler();\r\n },\r\n params: { EDocID: id, UseAgent: true },\r\n height: \"auto\",\r\n drag: function () { $('#modal_window').parent().css(\"height\", \"auto\"); },\r\n close: function () {\r\n var handler = $('#modal_window').data('close');\r\n if (handler) return handler();\r\n clearAllModalDivs();\r\n key.setScope('common');\r\n },\r\n position: ['center', (windowHeight() / 2) - 200]\r\n });\r\n }).fail(function () {\r\n ShowError(L('ERR_SIGNING_UNSUPPORTED'));\r\n });\r\n } else {\r\n ShowInfo(L('AGENT_NEED_ENABLE_FOR_EXECUTE'));\r\n }\r\n}\r\n\r\n// Инициализация контролей для диалогового окна подписания документа.\r\nfunction SignEDoc_InitControls(edocid, isMultiple) {\r\n //ShowTopSpinner(L('CHECKING_SIGN_CONDITIONS'), true, false);\r\n var wnd = $('#modal_window');\r\n var verData = {};\r\n var certData = {};\r\n var userCode = null;\r\n var docKind = null;\r\n\r\n // Инициализация контрола по запросу пин-кода для токена.\r\n var jTokenPinMessage = wnd.find(\"#new_error_container\");\r\n var jTokenPinInput = wnd.find(\".token_pin_code\");\r\n // Обернуть сообщение и поле ввода для пин-кода нельзя ввиду особенностей рендера диалога.\r\n var tokenPinMessageHeight = jTokenPinMessage.parent().height();\r\n var tokenPinInputHeight = jTokenPinInput.parent().parent().height();\r\n\r\n // Показать контрол запроса пин-кода.\r\n function showTokenPinControls(withAnimation) {\r\n if (jTokenPinMessage.length > 0 && !jTokenPinMessage.is(':visible')) {\r\n jTokenPinMessage.parent().show();\r\n jTokenPinInput.parent().parent().show();\r\n\r\n var pinPadding = 20; // Дополнительный отступ, чтобы не появлялся скролл.\r\n var newHeight = wnd.height() + tokenPinMessageHeight + tokenPinInputHeight + pinPadding;\r\n\r\n if (withAnimation) {\r\n wnd.animate({\r\n height: newHeight\r\n }, 300, function () {\r\n $(\".token_pin_code\").focus();\r\n });\r\n } else {\r\n wnd.height(newHeight);\r\n $(\".token_pin_code\").focus();\r\n }\r\n }\r\n }\r\n\r\n // Скрыть контрол запроса пин-кода.\r\n function hideTokenPinControls(withAnimation) {\r\n if ((jTokenPinMessage.length != 0) && (jTokenPinMessage.parent().is(\":visible\"))) {\r\n var newHeight = wnd.height() - tokenPinMessageHeight - tokenPinInputHeight;\r\n\r\n if (withAnimation) {\r\n wnd.animate({\r\n height: newHeight\r\n }, 500, function () {\r\n jTokenPinMessage.parent().hide();\r\n jTokenPinInput.parent().parent().hide();\r\n jTokenPinInput.val(\"\");\r\n });\r\n } else {\r\n wnd.height(newHeight);\r\n jTokenPinMessage.parent().hide();\r\n jTokenPinInput.parent().parent().hide();\r\n jTokenPinInput.val(\"\");\r\n }\r\n }\r\n }\r\n\r\n var pleaseWaitMessage = {\r\n _topSpinner: null,\r\n _pleaseWaitText: $('#SignPleaseWait'),\r\n _pleaseWaitCounter: 0,\r\n show: function () {\r\n this._topSpinner = WA.CR.spinner.showInDialog();\r\n this._pleaseWaitText.show();\r\n this._pleaseWaitCounter += 1;\r\n },\r\n hide: function () {\r\n this._pleaseWaitCounter -= 1;\r\n if (this._pleaseWaitCounter === 0) {\r\n this._topSpinner.hide();\r\n this._pleaseWaitText.hide();\r\n }\r\n }\r\n };\r\n\r\n\r\n function getSelectedVersionNumber() {\r\n return wnd.find('input[type=\"radio\"]:checked').val();\r\n }\r\n\r\n function getIsApproving() {\r\n return wnd.find('#sign_approving').is(':checked');\r\n }\r\n\r\n function getIsSubstitute() {\r\n return wnd.find('#sign_substitute').is(':checked');\r\n }\r\n\r\n function getSelectedCertificate() {\r\n var tmp = wnd.find('input[name=\"sign_certificate\"]').val().split('###');\r\n return {\r\n id: tmp[2],\r\n id_base64: tmp[1],\r\n plugin: tmp[0],\r\n plugin_version: tmp[3]\r\n };\r\n }\r\n\r\n function getSelectedUser() {\r\n return $.trim(wnd.find('#hSelID_sign_user').val());\r\n }\r\n\r\n function setAllowedUserCodes(codes) {\r\n wnd.find('#hLeadSelID_sign_user').val('SUBS_' + codes.join(';'));\r\n }\r\n\r\n // Получает список замещаемых пользователей, которым доступно подписание. Функция возвращает $.Deferred.\r\n function getSubstitutedUserCodes(verNumber) {\r\n\r\n var def = $.Deferred();\r\n var signTypeVal = { vis: false, app: true };\r\n var signType = 'vis';\r\n if (getIsApproving()) {\r\n signType = 'app';\r\n }\r\n\r\n if (isMultiple) {\r\n CallService('/EDocument.asmx/GetSubstitutedUserCodesForMultipleDocuments', { EDocID: edocid, IsApprovingSignType: signTypeVal[signType] }, function (res) {\r\n res = $.trim(res.substr(5));\r\n def.resolve((res === '' ? [] : res.split(';')));\r\n }, function () {\r\n def.reject();\r\n });\r\n return def;\r\n }\r\n\r\n if (verData[verNumber][signType] !== 'loading') {\r\n def.resolve();\r\n } else {\r\n // Грузим список пользователей, за которых мы можем подписать эту версию.\r\n CallService('/EDocument.asmx/GetSubstitutedUserCodes', { EDocID: edocid, VersionNum: verNumber, IsApprovingSignType: signTypeVal[signType] }, function (res) {\r\n res = $.trim(res.substr(5)); // сервис возвращает в убогом формате\r\n verData[verNumber][signType] = (res === '' ? [] : res.split(';'));\r\n def.resolve();\r\n }, function () {\r\n def.reject();\r\n });\r\n }\r\n\r\n return def;\r\n }\r\n\r\n // Событие выбора версии.\r\n function verSelect(verNumber) {\r\n if (isMultiple) {\r\n if (getIsSubstitute()) {\r\n getSubstitutedUserCodes();\r\n }\r\n return verNumber\r\n }\r\n\r\n pleaseWaitMessage.show();\r\n if (!verData.hasOwnProperty(verNumber)) {\r\n verData[verNumber] = { vis: \"loading\", app: \"loading\", data: \"loading\" }; // в начале все \"loading\", потом заменятся на норм. данные, когда они подгрузятся с сервера.\r\n\r\n if (getIsSubstitute()) {\r\n getSubstitutedUserCodes(verNumber);\r\n }\r\n\r\n // Грузим информацию о состоянии подписей к версии.\r\n CallService(\"/EDocument.asmx/GetSignState\", { EDocID: edocid, VersionNum: verNumber }, function (res) {\r\n if (res.Error) {\r\n verData[verNumber].error = res.Error;\r\n } else {\r\n verData[verNumber].data = { canApprovingSign: res.CanApprovingSign, signatures: res.SignsInfo };\r\n userCode = res.UserCode;\r\n docKind = res.Kind;\r\n }\r\n checkConditions();\r\n pleaseWaitMessage.hide();\r\n });\r\n } else {\r\n checkConditions();\r\n pleaseWaitMessage.hide();\r\n }\r\n }\r\n\r\n // Событие выбора сертификата.\r\n function certSelect() {\r\n hideTokenPinControls(false);\r\n pleaseWaitMessage.show();\r\n var curCert = getSelectedCertificate();\r\n if (!certData.hasOwnProperty(curCert.sid)) {\r\n certData[curCert.id] = \"loading\";\r\n CallService(\"/Certificates.asmx/IsCertificateValid\", { CertificateID: curCert.id_base64 }, function (res) {\r\n certData[curCert.id] = { valid: res.Result };\r\n checkConditions();\r\n pleaseWaitMessage.hide();\r\n });\r\n }\r\n else {\r\n checkConditions();\r\n pleaseWaitMessage.hide();\r\n }\r\n }\r\n\r\n // Проверка возможности подписания.\r\n function checkConditions() {\r\n var verNumber = getSelectedVersionNumber();\r\n var ver = verData[verNumber];\r\n var error = null;\r\n var isApproving = getIsApproving();\r\n var isSubstitute = getIsSubstitute();\r\n if (ver) {\r\n try {\r\n if (ver.error) // если произошла ошибка при получении данных с сервера.\r\n throw new Error(ver.error);\r\n if (isSubstitute) {\r\n // Проверка наличия пользователей, за которых можно подписать утверждающей подписью.\r\n if (isApproving) {\r\n if (ver.app == \"loading\")\r\n throw new Error(\"loading\");\r\n if (!ver.app.length)\r\n throw new Error('w#' + L('YOU_CANT_SIGN_THIS_DOCUMENT_IN_THE_NAME_OF_SUBSTITUTED_USER_APPROV'));\r\n setAllowedUserCodes(ver.app);\r\n }\r\n // Проверка наличия пользователей, за которых можно подписать визирующей подписью.\r\n if (!isApproving) {\r\n if (ver.vis == \"loading\")\r\n throw new Error(\"loading\");\r\n if (!ver.vis.length)\r\n throw new Error('w#' + L('YOU_CANT_SIGN_THIS_DOCUMENT_IN_THE_NAME_OF_SUBSTITUTED_USER'));\r\n setAllowedUserCodes(ver.vis);\r\n }\r\n }\r\n if (ver.data != \"loading\") {\r\n // Проверка возможности подписания утверждающей подписью.\r\n if (isApproving && !ver.data.canApprovingSign) {\r\n throw new Error('w#' + L('HAVENT_RIGHTS_FOR_APPR_SIGN', docKind.Name));\r\n }\r\n // Проверка на то, что версия уже подписана тем же пользователем и сертификатом.\r\n var curCert = getSelectedCertificate();\r\n var signErr = 'w#';\r\n var curUserCode, curUserName;\r\n if (isSubstitute) {\r\n // Проверяем подписи от имени другого пользователя.\r\n curUserCode = $.trim(wnd.find('#hSelID_sign_user').val());\r\n curUserName = $.trim(wnd.find('#sign_user').val());\r\n } else {\r\n // Проверяем подписи текущего пользователя.\r\n curUserCode = userCode;\r\n }\r\n $.each(ver.data.signatures, function () {\r\n var sign = this;\r\n if (isApproving == (sign.SignatureType == '2') &&\r\n sign.ByUser == curUserCode &&\r\n sign.PluginName == curCert.plugin &&\r\n sign.CertificateID == curCert.id_base64) {\r\n if (isApproving && !isSubstitute)\r\n signErr += L('EDOC_VERSION_ALREADY_APPROVINGLY_SIGNED', verNumber);\r\n else if (!isApproving && !isSubstitute)\r\n signErr += L('EDOC_VERSION_ALREDY_SIGNED', verNumber);\r\n else if (isApproving && isSubstitute)\r\n signErr += L('EDOC_VERSION_ALREADY_APPROVINGLY_SIGNED_BY_USER', verNumber, curUserName);\r\n else if (!isApproving && isSubstitute)\r\n signErr += L('EDOC_VERSION_ALREDY_SIGNED_BY_USER', verNumber, curUserName);\r\n return false;\r\n }\r\n });\r\n if (signErr != 'w#') throw new Error(signErr);\r\n } else {\r\n throw new Error(\"loading\");\r\n }\r\n } catch (ex) {\r\n error = ex.message;\r\n }\r\n }\r\n var curCert = getSelectedCertificate();\r\n var cert = certData[curCert.id];\r\n if (!error && cert && cert != \"loading\") {\r\n if (!cert.valid) {\r\n error = L(\"CERTIFICATE_WITH_ID_IS_NOT_VALID\", curCert.id);\r\n }\r\n }\r\n if (error !== null) {\r\n if (error != \"loading\") {\r\n if (error.indexOf('w#') == 0) {\r\n wnd.data('warning')(error.substr(2));\r\n } else if (error.indexOf('info#') == 0) {\r\n wnd.data('info')(error.substring(5));\r\n } else {\r\n wnd.data('error')(error);\r\n }\r\n }\r\n wnd.data('disable_ok')();\r\n return false;\r\n } else {\r\n if (!wnd.find('.message-text.wrn').length) wnd.data('error')(null);\r\n wnd.data('enable_ok')();\r\n return true;\r\n }\r\n }\r\n\r\n // Сохраняем функцию в data, чтобы был доступ к ней в глобальной области видимости (нужно для контролей реквизитов)\r\n wnd.data('checkConditions', checkConditions);\r\n wnd.data('certSelect', certSelect);\r\n\r\n // Событие нажатия на чекбокс \"подписать за\".\r\n wnd.find('#sign_substitute').change(function () {\r\n if ($(this).is(':checked')) {\r\n\r\n // Загружаем коды пользователей, за которых можно подписать.\r\n pleaseWaitMessage.show();\r\n var verNumber = getSelectedVersionNumber();\r\n getSubstitutedUserCodes(verNumber).always(function (users) {\r\n var curUserCodes = (verData[verNumber]) ? verData[verNumber][getIsApproving() ? \"app\" : \"vis\"] : users;\r\n if (curUserCodes && curUserCodes.length && curUserCodes != \"loading\") {\r\n $('#sign_user').SetEnabled();\r\n if (isMultiple) {\r\n wnd.data('enable_ok')();\r\n setAllowedUserCodes(curUserCodes);\r\n } else {\r\n checkConditions();\r\n }\r\n } else {\r\n wnd.data('error')(L('YOU_CANT_SIGN_THIS_DOCUMENT_IN_THE_NAME_OF_SUBSTITUTED_USER_INLINE'));\r\n wnd.data('disable_ok')();\r\n }\r\n pleaseWaitMessage.hide();\r\n });\r\n\r\n } else {\r\n $('#sign_user').SetDisabled();\r\n checkConditions();\r\n }\r\n });\r\n\r\n // Событие нажатия на чекбокс \"утверждающая подпись\".\r\n wnd.find('#sign_approving').change(function () {\r\n if (getIsSubstitute()) {\r\n var verNumber = getSelectedVersionNumber();\r\n pleaseWaitMessage.show();\r\n getSubstitutedUserCodes(verNumber).always(function () {\r\n checkConditions();\r\n pleaseWaitMessage.hide();\r\n });\r\n } else {\r\n checkConditions();\r\n };\r\n });\r\n\r\n // Событие выбора версии.\r\n wnd.find('input[type=\"radio\"]').change(function () {\r\n if ($(this).is(':checked')) {\r\n verSelect($(this).val());\r\n }\r\n }).change(); // изначально версия выбрана.\r\n\r\n certSelect(); // запускаем проверку сертификата.\r\n\r\n function UnlockDocIfNeed() {\r\n if (wnd.find('#was_locked').val() == 'True') {\r\n var method = isMultiple ? 'MultipleDocsUnlock' : 'DocUnlock';\r\n CallService('/EDocument.asmx/' + method, { EDocID: edocid });\r\n };\r\n };\r\n\r\n // При нажатии на кнопку ОК - подписываем документ.\r\n wnd.data('ok', function (opt_customWorkSignResults) {\r\n // Сохраняем выбранный тип подписи в профиле пользователя\r\n saveDialogParams();\r\n\r\n var dc; // DCrypto плагин.\r\n var cert; // Информация о выбранном сертификате.\r\n\r\n // Подписать с помощью сертификата.\r\n // dcCert - объект сертификата, полученный с помощью DCrypto.\r\n function signWithCertificate(dcCert) {\r\n\r\n // Проверка, соответствует ли сертификат выбранному.\r\n if (dcCert.CertificateID != cert.id) {\r\n throw new Error(L('CERTIFICATE_FOR_SIGNING_OBJECT_IS_NOT_SPECIFIED_OR_SPECIFIED_INCORRECTLY'));\r\n } else {\r\n var verNumber = getSelectedVersionNumber();\r\n // Получаем текст версии.\r\n CallService(\"/EDocument.asmx/GetVersionDataEx\", { EDocID: edocid, VersionNum: verNumber, NeedLock: false }, wrap(function (res) {\r\n if (res.Success) {\r\n var data = res.Result;\r\n // Подписываем!\r\n var signResult = dc.Sign(dcCert, data, appLang);\r\n // Отправляем подпись на сервер.\r\n CallService(\"/EDocument.asmx/AddSignature\", {\r\n EDocID: edocid,\r\n VersionNum: verNumber,\r\n SignStr: signResult,\r\n UserCertificateStr: cert.plugin,\r\n Comment: wnd.find('#sign_comment').val(),\r\n IsApprovingSign: getIsApproving(),\r\n IsSubstituted: getIsSubstitute(),\r\n SubstUser: getSelectedUser()\r\n }, wrap(function (res) {\r\n if (!isMultiple) UnlockDocIfNeed();\r\n if (!res.Success) {\r\n throw new Error(res.Error.replace(/\\^/g, ' '));\r\n } else {\r\n success();\r\n };\r\n }));\r\n } else {\r\n throw new Error(res.Error.replace(/\\^/g, ' '));\r\n };\r\n }));\r\n }\r\n }\r\n\r\n var password; // пароль от сертификата.\r\n\r\n // Сертификат не найден в локальном хранилище, покажем диалог поиска.\r\n function locateAndSign() {\r\n var text = L(\"PRIVATE_KEY_CERTIFICATE_HAS_NOT_BEEN_FOUND_IN_LOCAL_PERSONAL_STORAGE\") +\r\n \"

    \" +\r\n L(\"PASSWORD_FOR_ACCESS_TO_CERTIFICATE\") +\r\n \": \";\r\n ConfirmDialog({\r\n text: text,\r\n title: \"\",\r\n okText: L(\"LOCATE\"),\r\n width: 400,\r\n ok: wrap(function () {\r\n password = $('#PasswordForCert').val();\r\n if (!wnd.find('#sign_locate').length) {\r\n $('
    ').appendTo(wnd);\r\n }\r\n setTimeout(function () { // без таймаута клик не работал\r\n wnd.find('#sign_locate').click();\r\n }, 10);\r\n }),\r\n cancel: function () {\r\n fail(null);\r\n }\r\n });\r\n }\r\n\r\n // Подпишем сертификатом, который находится в файле.\r\n function signWithFile(filename, _password) {\r\n _password = _password || password;\r\n try {\r\n var dcCert = dc.GetCertificateFromFile(cert.plugin, filename, _password);\r\n } catch (ex) {\r\n if (ex.message.indexOf(\"E_CERTIFICATE_NOT_FOUND_MESSAGE\") != -1) {\r\n throw new Error(L(\"CERTIFICATE_FOR_SIGNING_OBJECT_IS_NOT_SPECIFIED_OR_SPECIFIED_INCORRECTLY\"));\r\n } else if (ex.message.indexOf(\"E_INVALID_PASSWORD_MESSAGE\") != -1) {\r\n throw new Error(L(\"INVALID_PASSWORD\"));\r\n } else {\r\n throw ex;\r\n }\r\n }\r\n signWithCertificate(dcCert);\r\n }\r\n wnd.data('signWithFile', wrap(signWithFile)); // даем доступ к функции из глобальной области видимости.\r\n\r\n // Вызывается, если подписание прошло успешно.\r\n function success(opt_docId) {\r\n var isApproving = getIsApproving();\r\n\r\n //ReloadExplorer();\r\n if (!isMultiple) {\r\n wnd.dialog('close');\r\n ShowTopSpinnerResult(L('EDOCUMENT_SIGN_SUCCESS'), 3000);\r\n };\r\n\r\n if (WA.getLocation() == 'doc') {\r\n if (GetParamInURL('view').toLowerCase() == 'showverlist') {\r\n setTimeout(function () { ReloadVersionList(); }, 500);\r\n } else {\r\n window.location.reload();\r\n }\r\n }\r\n\r\n // Обновить иконку, чтобы отобразить результат подписания.\r\n updateSignIco(getIsApproving());\r\n\r\n if (isMultiple) {\r\n updateSignIco(isApproving, opt_docId);\r\n }\r\n }\r\n\r\n function updateSignIco(isApproving, opt_id) {\r\n var item = $('div#' + (opt_id || edocid));\r\n log.info('DOCUMENT_SIGNING', 'Updating icon for document #' + opt_id);\r\n\r\n if (item.length) {\r\n var signatureIcon = (item.find('.sign_ico'));\r\n if (signatureIcon.length == 0 || (isApproving && signatureIcon.find('use').attr('xlink:href') != \"#signRed-16\")) {\r\n signatureIcon.remove();\r\n var signIco = '' +\r\n '' +\r\n '';\r\n item.find('.object-list-item__column_type_icon').append(signIco);\r\n }\r\n }\r\n }\r\n\r\n // Вызывается, если произошла ошибка.\r\n function fail(err) {\r\n if (!!wnd.data('error')) {\r\n wnd.data('error')(err);\r\n wnd.data('enable_ok')();\r\n } else {\r\n var d = new WA.CMP.dialogs.MessageBox();\r\n d.showError(err);\r\n }\r\n }\r\n\r\n // Запуск с проверкой, посмотрел ли пользователь версию документа\r\n function runWithCheckReadByUser(docId, versionNum, callback) {\r\n // Если диалог подтверждения был уже показан, то не надо показывать его еще раз\r\n var confirmed = wnd.data('signConfirmed');\r\n if (confirmed) {\r\n callback();\r\n } else {\r\n WA.SRV.call('/EDocument.asmx/CheckReadByUserState', { EDocID: docId, VersionNum: versionNum }).done(function (res) {\r\n if (!!res) {\r\n callback();\r\n } else {\r\n // Если последние изменения не просмотрены, показать диалог подтверждения\r\n confirmSignDialog(function () {\r\n wnd.data('signConfirmed', true);\r\n callback();\r\n });\r\n }\r\n }).fail(function () {\r\n callback();\r\n });\r\n }\r\n }\r\n\r\n function confirmSignDialog(okAction) {\r\n var confirmDialog = new WA.CMP.dialogs.MessageBox();\r\n confirmDialog.yesNoButtons(okAction);\r\n\r\n var mainText = L('EDOC_CONTINUE_SIGNING');\r\n var additionalText = L('EDOC_VERSION_IS_NOT_READ');\r\n var title = L('CONFIRMATION');\r\n var icon = 'info';\r\n confirmDialog.show(mainText, additionalText, title, icon);\r\n }\r\n\r\n // Декоратор для функций. Если в функции произошла ошибка (брошено исключение), то вызывает fail и возвращает false. Иначе возвращает true.\r\n // func - функция для декорирования.\r\n function wrap(func) {\r\n return function () {\r\n try {\r\n func.apply(this, arguments);\r\n return true;\r\n } catch (ex) {\r\n var msg = ex.message;\r\n if (msg.indexOf('E_CANT_LOAD_PLUGIN') != -1) {\r\n msg = L('SIGN_PLUGIN_NOT_FOUND');\r\n }\r\n fail(msg);\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n // Сохранение типа подписи в профиле пользователя\r\n function saveDialogParams() {\r\n WA.SRV.call('Session.asmx/SetUserProfileSettings', { ParamName: 'DefaultSignType', ParamValue: getIsApproving() ? 'approve' : '' });\r\n }\r\n function getErrorWithDocName(error, docName, docId) {\r\n return format('
  • {0} \"{1}\": {2}
  • ',\r\n L(\"DOCUMENT\"),\r\n docName,\r\n error,\r\n (new WA.Link(docId, OBJECT_TYPE.EDOCUMENT)).toURL().asString());\r\n }\r\n\r\n var sign = function (docId, versionNum, docName) {\r\n docName = ('' + docName).escapeHtml();\r\n\r\n var signResult = $.Deferred();\r\n // Дизейблим ок, чтобы пользователь не тыкал куда попало.\r\n wnd.data('disable_ok')();\r\n if (isMultiple) {\r\n if (getIsSubstitute() && !getSelectedUser()) {\r\n return signResult.reject(L(\"VALUE_OF_REQUIRED_REQUISITE_USER_MUST_BE_SPECIFIED\"));\r\n }\r\n } else {\r\n if (getIsSubstitute() && !getSelectedUser()) {\r\n throw new Error((L(\"VALUE_OF_REQUIRED_REQUISITE_USER_MUST_BE_SPECIFIED\")));\r\n }\r\n }\r\n\r\n // Версия не передана или её номер не корректный.\r\n if (+versionNum < 1) {\r\n if (isMultiple) {\r\n return signResult.reject(getErrorWithDocName(L('ERR_NO_VERSIONS_AVAILIBLE_WITHOUT_DOCUMENT_NAME'), docName, docId));\r\n } else {\r\n throw new Error(format(L(\"ERR_NO_VERSIONS_AVAILIBLE\"), docName));\r\n }\r\n }\r\n\r\n cert = getSelectedCertificate();\r\n //Определяем, будем мы подписывать через агент или ActiveX\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n var onSignCallback = function (res) {\r\n if (res.success) {\r\n success(docId);\r\n log.info('DOCUMENT_SIGNING', 'Signing success for document ' + docName);\r\n signResult.resolve();\r\n } else {\r\n if (!!res.message && (res.result === 'ERR_PIN_REQUIRED')) {\r\n showTokenPinControls(true);\r\n wnd.data(\"enable_ok\")();\r\n return;\r\n }\r\n\r\n log.info('DOCUMENT_SIGNING', 'Signing failed for document ' + docName);\r\n if (!res.message) return; //например, агент отвалился\r\n signResult.reject(getErrorWithDocName(res.message.fromISBuilderToNormal(), docName, docId));\r\n\r\n if (!isMultiple) {\r\n if (!!res.message && res.message !== 'CONNECTION_NOT_AVAILABLE') fail(L(res.message));\r\n }\r\n };\r\n if (!isMultiple) UnlockDocIfNeed();\r\n };\r\n var edocVersion = getSelectedVersionNumber();\r\n\r\n WA.SRV.callSync('/EDocument.asmx/GetAdditionalInfo', { EdocId: docId || edocid }).done(function (additionalInfo) {\r\n WebAccess.agent.edms.signDocument(docId || edocid,\r\n versionNum || edocVersion,\r\n cert.id_base64,\r\n cert.plugin,\r\n wnd.find('#sign_comment').val(),\r\n getIsApproving(),\r\n getIsSubstitute(),\r\n getSelectedUser(),\r\n onSignCallback,\r\n additionalInfo,\r\n cert.plugin_version,\r\n wnd.find(\".token_pin_code\").val());\r\n });\r\n }).fail(function () {\r\n dc = GetCryptoObject();\r\n try {\r\n // Пробуем получить сертификат.\r\n var dcCert = dc.GetCertificateFromStorage(cert.plugin, cert.id_base64);\r\n signWithCertificate(dcCert);\r\n } catch (ex) {\r\n if (ex.number == -2146827850) {\r\n // ActiveX отключен.\r\n throw new Error(L('PLEASE_ALLOW_ACTIVEX'));\r\n }\r\n // Если он не найден в локальном хранилище, то\r\n if (ex.message.indexOf(\"E_CERTIFICATE_NOT_FOUND_MESSAGE\") != -1)\r\n // показываем диалог выбора файла.\r\n locateAndSign();\r\n else {\r\n throw ex;\r\n }\r\n }\r\n });\r\n\r\n return signResult;\r\n };\r\n\r\n /**\r\n * Подписка множества документов\r\n */\r\n if (isMultiple) {\r\n var selectedVersion = getSelectedVersionNumber();\r\n var onlyActual = false;\r\n\r\n var signVersions = function (versions) {\r\n var signResults = [];\r\n for (var docId in versions) {\r\n signResults.push(sign(docId, versions[docId][0], versions[docId][2]));\r\n };\r\n\r\n signResults = signResults.concat(opt_customWorkSignResults);\r\n\r\n $.whenAllDone.apply($, signResults).done(function () {\r\n UnlockDocIfNeed();\r\n wnd.dialog('close');\r\n (new WA.CMP.NTF.Toast).show(L('MULTIPLE_SIGN_COMFIRMATION'));\r\n $('#modal_window').remove();\r\n }).fail(function () {\r\n wnd.dialog('close');\r\n $('#modal_window').remove();\r\n var args = Array.prototype.slice.call(arguments);\r\n if (args.length === 1) { //Странно конечно, но вот, так\r\n args = Array.prototype.slice.call(args[0]);\r\n }\r\n\r\n var dialog = new WA.CMP.dialogs.MessageBox({ width: 600 });\r\n var details = new WA.CMP.forms.FormBuilder('signingDetails');\r\n details.setOrientation(ORIENTATION.VERTICAL);\r\n details.addTextFrame('NOT_ALL_OBJECTS_SIGNED_INFORMATION_MESSAGE', '
      ' + args.join('') + '
    ');\r\n\r\n details.renderAsync().done(function (data) {\r\n dialog.showError(L('MULTIPLE_SIGN_SUCCESS_WITH_ERROR'), data);\r\n });\r\n });\r\n };\r\n\r\n switch (selectedVersion) {\r\n case 'last_actual':\r\n onlyActual = true;\r\n case 'last':\r\n WA.SRV.call('/EDocument.asmx/GetLastVersionForMultipleDocs', { EDocID: edocid, OnlyActual: onlyActual }).done(function (versions) {\r\n signVersions(versions);\r\n }).error(function (error) {\r\n wnd.dialog('close');\r\n ErrorHide();\r\n var dialog = new WA.CMP.dialogs.MessageBox({ width: 600 });\r\n dialog.showError(error);\r\n });\r\n break;\r\n case 'ask':\r\n WA.SRV.call('/EDocument.asmx/GetLastVersionForMultipleDocs', { EDocID: edocid, OnlyActual: onlyActual }).done(function (versions) {\r\n var docsWithManyVersions = [];\r\n for (docId in versions) {\r\n if (versions[docId][1] > 1) {\r\n docsWithManyVersions.push(docId);\r\n }\r\n };\r\n\r\n var askFinished = $.Deferred();\r\n\r\n //Запрашиваем версию для всех документов\r\n if (docsWithManyVersions.length) {\r\n\r\n var getSelectedVersionNumber = function (jDialog) {\r\n return jDialog.find('input[type=\"radio\"]:checked').val();\r\n };\r\n\r\n var buildNextDialog = function () {\r\n var docId = docsWithManyVersions.shift();\r\n if (!docId) {\r\n askFinished.resolve(versions);\r\n return;\r\n };\r\n\r\n var dialog = new WA.CMP.dialogs.BaseDialog();\r\n dialog.setSpinner();\r\n dialog.setTitle(L('VERSION_SELECT'));\r\n dialog.width = 600;\r\n dialog.isShowOkButton = true;\r\n dialog.isShowCancelButton = true;\r\n dialog.show();\r\n\r\n dialog.ok = function () {\r\n var version = getSelectedVersionNumber($('#dialog_content_' + dialog.id));\r\n versions[docId][0] = version;\r\n buildNextDialog();\r\n };\r\n\r\n dialog.cancel = function () {\r\n // Пропускаем документ, т.к. версию так и не выбрали.\r\n delete versions[docId];\r\n buildNextDialog();\r\n };\r\n\r\n WA.SRV.call('/EDocument.asmx/GetVersionListControl', { EDocID: docId, OnlyActual: false }).done(function (html) {\r\n dialog.setHtml(L('SELECT_FROM_EDOC_VERSION_LIST_CAPTION', ('' + versions[docId][2]).escapeHtml()) + '

    ' + html);\r\n });\r\n };\r\n\r\n buildNextDialog();\r\n } else {\r\n askFinished.resolve(versions);\r\n }\r\n\r\n askFinished.done(function (versions) {\r\n signVersions(versions);\r\n });\r\n }).error(function (error) {\r\n wnd.dialog('close');\r\n ErrorHide();\r\n var dialog = new WA.CMP.dialogs.MessageBox({ width: 600 });\r\n dialog.showError(error);\r\n });\r\n break;\r\n }\r\n } else {\r\n // Выполнить проверку, просмотрен ли документ\r\n runWithCheckReadByUser(edocid, getSelectedVersionNumber(), wrap(sign));\r\n }\r\n\r\n return false; // Возвращаем false, чтоб окно не закрылось.\r\n });\r\n\r\n wnd.data(\"close\", function () {\r\n UnlockDocIfNeed();\r\n });\r\n\r\n wnd.data('disable_ok')(); // не разрешаем никуда нажимать, пока все не прогрузилось.\r\n}\r\n\r\n//Копирование документа\r\nfunction CopyEdoc() {\r\n // Копирование зашифрованных документов не поддерживается.\r\n if (WA.CR.Encoding > 0) {\r\n ShowError(L(\"ERR_ENCRYPTED_DOCUMENT_COPY_UNSUPPORTED\"), null, 400);\r\n return;\r\n }\r\n CreateNewDocument('copy', WA.FC.folders.getRootFolderID(FOLDER_TYPE.FAVORITES), WA.CR.ID);\r\n}\r\n\r\n// Создание нового документа (модальное окно).\r\n// mode - режим template, file или copy\r\n// folder_id - ид папки, куда сохранить документ\r\n// source_id - ид исходного документа (если копирование)\r\n// success - опционально - коллбек после создания, но перед открытием окна. Аргумент - id документа\r\n// decryptedKey - опционально - ключ для расшифровки документа (имеет смысл только для случая source_id != null)\r\nfunction CreateNewDocument(mode, folder_id, source_id, success, decryptedKey) {\r\n var data = { Mode: mode, FolderID: folder_id };\r\n if (source_id) {\r\n data.SourceID = source_id;\r\n }\r\n var title;\r\n switch (mode.toLowerCase()) {\r\n case \"template\":\r\n title = L(\"CREATE_DOCUMENT_FROM_TEMPLATE\");\r\n break;\r\n case \"file\":\r\n title = L(\"CREATE_DOCUMENT_FROM_FILE\");\r\n break;\r\n case \"create\":\r\n title = L(\"CREATE_DOCUMENT\");\r\n break;\r\n case \"copy\":\r\n title = L(\"COPY_DOCUMENT\");\r\n break;\r\n }\r\n var rnd = Math.floor(Math.random() * 10000).toString();\r\n var popup;\r\n\r\n function isFormValid(jModalWindow) {\r\n if (!jModalWindow.find('input[name=refVid]').val()) return false;\r\n if (!jModalWindow.find('input[name=refCardType]').val()) return false;\r\n if (mode == 'copy') return true;\r\n if ($('#radio_from_template').is(':checked')) {\r\n if (!jModalWindow.find('input[name=refTempl]').val()) return false;\r\n } else {\r\n if (!jModalWindow.find('input[type=file]').val()) return false;\r\n if (!jModalWindow.find('input[name=refApp]').val()) return false;\r\n }\r\n return true;\r\n };\r\n\r\n ShowModalWindow(\"new_document\", {\r\n title: title,\r\n okText: mode == \"copy\" ? L(\"COPY\") : L(\"CREATE\"),\r\n afterOpen: function () {\r\n // Для создание документа из шаблона навешиваем справку.\r\n $('#radio_from_template').off('click.ExtHelp').on('click.ExtHelp', function () {\r\n BindHelpIcoClickOnModalWindow('NewDoc');\r\n });\r\n // Для создание документа из файла навешиваем другую справку.\r\n $('#radio_from_file').off('click.ExtHelp').on('click.ExtHelp', function () {\r\n BindHelpIcoClickOnModalWindow('NewDocFromFile');\r\n });\r\n //Сохраняем ключ для дешифрования\r\n $('#new_decryptionKey').val(decryptedKey);\r\n if (mode != \"copy\") {\r\n BindHelpIcoClickOnModalWindow('NewDoc');\r\n } else {\r\n BindHelpIcoClickOnModalWindow('CopyDoc');\r\n }\r\n\r\n // Убрать лишние отступы, если не нужны\r\n if (mode === 'file' || mode === 'template') {\r\n $('#modal_window .modal_td_padded').removeClass('modal_td_padded');\r\n }\r\n\r\n key.setScope('baseDialog');\r\n },\r\n ok: function () {\r\n var modalWindow = $('#modal_window');\r\n var validForm = isFormValid(modalWindow);\r\n if (validForm && CheckFileSize(modalWindow.find('form input[type=\"file\"]')[0], modalWindow.data('error'))) {\r\n\r\n var pleaseWait = new WA.URL('/PleaseWait.aspx');\r\n pleaseWait.setParam('message', L('PLEASE_WAIT_EDOCUMENT'));\r\n popup = pleaseWait.open('wnd' + rnd);\r\n\r\n //Шамов А.: Так делать в IE9 нельзя, т.к. после этого не работает импорт документа (form.submit в модальном окне).\r\n //popup.document.write(' ' + L('PLEASE_WAIT_EDOCUMENT') + '');\r\n //popup.document.close();\r\n modalWindow.find('form').submit();\r\n }\r\n else if (!validForm) {\r\n modalWindow.data('error')(L('NOT_ALL_REQUIRED_FIELDS_FILLED'));\r\n }\r\n return false;\r\n },\r\n close: function () {\r\n setTimeout(function () {\r\n var modalWindow = $('#modal_window');\r\n if (!!modalWindow) {\r\n modalWindow.remove();\r\n }\r\n }, 50)\r\n },\r\n cancel: function () {\r\n if (onClose) onClose();\r\n },\r\n params: data\r\n });\r\n\r\n var modalWindow = $('#modal_window');\r\n modalWindow.data('success', function (res) {\r\n modalWindow.dialog('close');\r\n if (success) success(GetParamInURL('id', res));\r\n window.open(res, 'wnd' + rnd);\r\n }).data('fail', function (res) {\r\n modalWindow.data('error')(res);\r\n popup.close();\r\n });\r\n}\r\n\r\nfunction InitCreateNewDocumentControl() {\r\n $('#modal_window [name=\"is_from_file\"]').change(function () {\r\n if ($('#modal_window #radio_from_file').is(':checked')) {\r\n $('#new_div_file input').removeAttr('disabled');\r\n setTimeout(function () { //setTimeout нужно т.к. инициализация \"выбора из справочника\" проходит немного позже этого события.\r\n $('#new_div_app input').SetEnabled();\r\n $('#new_div_template input').SetDisabled();\r\n }, 50);\r\n $('#new_div_file, #new_div_app').removeClass('field_disabled');\r\n $('#new_div_template').addClass('field_disabled');\r\n } else {\r\n $('#new_div_file input').attr('disabled', 'disabled');\r\n setTimeout(function () { //setTimeout нужно т.к. инициализация \"выбора из справочника\" проходит немного позже этого события.\r\n $('#new_div_app input').SetDisabled();\r\n $('#new_div_template input').SetEnabled();\r\n }, 50);\r\n $('#new_div_file, #new_div_app').addClass('field_disabled');\r\n $('#new_div_template').removeClass('field_disabled');\r\n }\r\n }).trigger('change');\r\n if ($.ipad && !WA.ENV.isAndroid()) {\r\n $('#modal_window #radio_from_file').attr('disabled', 'disabled');\r\n }\r\n}\r\n\r\n(function () { // Функции для работы с отчетами.\r\n\r\n var lastWnd; // последнее модальное окно.\r\n var _fillHiddenParamsCallback;\r\n\r\n /**\r\n * Запустить диалог для получения параметров если указан.\r\n * @inner\r\n */\r\n var showReportDialog = function (params) {\r\n if (!params.dialogName) {\r\n WA.FC.reports(params.name).execute().done(function (report) {\r\n report.open();\r\n });\r\n };\r\n\r\n // Интегрированный отчет.\r\n if (params.referenceName) {\r\n var referenceRecord = new WA.Link(params.recordId, OBJECT_TYPE.REFERENCE_RECORD, params.referenceName);\r\n return WA.FC.reports(params.name).showDialogAndExecuteIntegrated(referenceRecord, params.dialogName).done(function (report) {\r\n report.open();\r\n });\r\n } else {\r\n return WA.FC.reports(params.name).showDialogAndExecute(params.dialogName).done(function (report) {\r\n report.open();\r\n });\r\n }\r\n };\r\n\r\n // Показывает окно запрашиваемых параметров для отчета.\r\n // Если все параметры заполнены, или параметров нет, то сразу показывает отчет.\r\n var ShowReportParams = this.ShowReportParams = function (reportName, id, refcode, opt_reportCaption) {\r\n\r\n var dialog = new WA.CMP.dialogs.BaseDialog;\r\n dialog.isShowOkButton = false;\r\n dialog.width = 'auto';\r\n dialog.height = 'auto';\r\n dialog.closeOnEscape = false;\r\n\r\n // Невидимая кнопка для того, чтобы сработал setScope и нельзя было на клавиатуре по странице гулять.\r\n dialog.modalWindowButtons.push({\r\n id: \"hiddenButton\",\r\n text: \"\",\r\n click: buttonClick = function () { return false; },\r\n Class: \"dialog_hidden_button\"\r\n });\r\n\r\n var report = WA.factories.reports(reportName);\r\n\r\n var executeFunction = \"queryParamsAndExecute\";\r\n var link = \"\";\r\n\r\n if (id && refcode) {\r\n link = new WA.Link(id, OBJECT_TYPE.REFERENCE_RECORD, refcode);\r\n executeFunction = \"queryParamsAndExecuteIntegrated\";\r\n }\r\n\r\n report.bind(report['class'].EVENT.BEFORE_EXECUTING, function () {\r\n dialog.setSpinner(L('PLEASE_WAIT_DONT_CLOSE_PAGE'));\r\n dialog.setTitle(format(L('PLEASE_WAIT_REPORT'), opt_reportCaption || reportName));\r\n dialog.show();\r\n dialog.removeCloseButton();\r\n });\r\n\r\n report[executeFunction](link).always(function () {\r\n dialog.close();\r\n }).done(function (res) {\r\n res.open();\r\n }).fail(function (err) {\r\n // Ошибка должна быть только в модалке.\r\n ErrorHide();\r\n ShowError(err);\r\n });\r\n }\r\n\r\n // Инициализирует компоненту \"Параметры отчета\".\r\n var InitReportParams = this.InitReportParams = function (params, fillHiddenParamsCallback) {\r\n _fillHiddenParamsCallback = fillHiddenParamsCallback;\r\n // Получает контроль для параметра.\r\n function GetParamControl(name) {\r\n var reqID = 'rp_' + name;\r\n var res = $('#' + reqID + '[data-requisite]');\r\n if (!res.length) {\r\n res = $(':not(span)#' + reqID);\r\n if (!res.length) {\r\n res = $('input[name=\"' + reqID + '\"],textarea[name=\"' + reqID + '\"]');\r\n }\r\n }\r\n return res;\r\n }\r\n\r\n // Получает значение параметра.\r\n function GetParamValue(name) {\r\n var control = GetParamControl(name);\r\n if (control.data('requisite')) {\r\n return control.data('requisite').val();\r\n }\r\n var hidden = $('#hSelID_rp_' + name);\r\n if (hidden.length) {\r\n control = hidden;\r\n }\r\n return control.val();\r\n }\r\n\r\n // additionalParams {'param1_Name': 'param1_Value', 'param2_Name': 'param2_Value'}\r\n var wnd = lastWnd.data('ok', function () {\r\n var data = {};\r\n var err = false;\r\n $.each(params, function (_, param) {\r\n var val = GetParamValue(param.name);\r\n if (!val && param.required) {\r\n err = L('NOT_ALL_REQUIRED_FIELDS_FILLED');\r\n return false;\r\n } else {\r\n data[param.name] = val;\r\n }\r\n });\r\n\r\n if (typeof _fillHiddenParamsCallback != 'undefined') {\r\n var hiddenParams = _fillHiddenParamsCallback();\r\n data = $.extend(data, hiddenParams);\r\n }\r\n\r\n // logDebug($.toJSON(data));\r\n // return false;\r\n if (err) {\r\n wnd.data('error')(err);\r\n return false;\r\n } else {\r\n ShowReport(wnd.data('report'), data);\r\n }\r\n });\r\n wnd.find('input.hasDatepicker').attr('tabindex', '-1');\r\n wnd.dialog('open');\r\n wnd.find('input.hasDatepicker').removeAttr('tabindex');\r\n var h = Math.min(450, $('.modal_table', wnd).height() + 5);\r\n wnd.css('height', h);\r\n }\r\n\r\n function getIframeDocument(iframeNode) {\r\n if (iframeNode.contentDocument) return iframeNode.contentDocument\r\n if (iframeNode.contentWindow) return iframeNode.contentWindow.document\r\n return iframeNode.document\r\n }\r\n\r\n // Выводит отчет.\r\n // report - dict с параметрами name[, id, refcode]\r\n // params - параметры отчета\r\n var ShowReport = this.ShowReport = function (report, params) {\r\n $('#report_iframe').remove();\r\n\r\n var url = format('/Report.aspx?{0}&__go=1&{1}', $.param(report), $.param(params));\r\n if (($.ipad || WA.ENV.isAndroid()) && !isOpera()) {\r\n // var hFrame = $('
    ').appendTo('body');\r\n // var form = $('form', hFrame);\r\n // $.each(report, addParam);\r\n // $.each(params, addParam);\r\n // function addParam(name, val) {\r\n // $(format('', name)).appendTo(form).val(val);\r\n // }\r\n // form.submit();\r\n window.open(url, '_blank'); //location.href = url; // не работает открытие аттачмента в iframe :(\r\n }\r\n else {\r\n var hFrame = $('
    ').appendTo('body');\r\n getIframeDocument($('iframe', hFrame)[0]).location.replace(url);\r\n }\r\n }\r\n\r\n // Выводит отчет без запроса параметров.\r\n var ShowReportWithoutParams = this.ShowReportWithoutParams = function (report) {\r\n if (lastWnd) {\r\n lastWnd.remove();\r\n lastWnd = null;\r\n }\r\n ShowReport(report, {});\r\n }\r\n\r\n})();\r\n\r\n// Выводит ошибку при создании отчета.\r\nfunction ReportError(err) {\r\n ShowMessage(err, L(\"ERROR_WHILE_GENERATING_REPORT\"), null, null, null, null, true);\r\n}\r\n\r\n(function () {\r\n var divDebug = null;\r\n var num = 0;\r\n\r\n window.logDebug = function (msg) {\r\n if (!divDebug) {\r\n divDebug = $('
    ', { css: { 'z-index': '1000000', position: 'fixed', top: '20px', right: '20px', padding: '10px', opacity: 0.5, color: 'red', backgroundColor: 'black' } }).appendTo($('body'));\r\n }\r\n divDebug.prepend('
    ' + (num++) + ': ' + msg + '
    ');\r\n }\r\n\r\n})();\r\n\r\n// Устанавливает приложение-редактор по имени файла.\r\n// $file - контроль \r\n// req_id - ид контроля-реквизита\r\nfunction SetEditorAppFromFile($file, req_id) {\r\n var re = new RegExp('.*\\\\.([^.]*)', 'gi');\r\n var m = re.exec($file.val());\r\n ext = (m != null ? m[1] : \"\");\r\n var res = GetImgByExt(ext);\r\n $(\"#\" + req_id).SetValue(['' + res.analit, '' + encodeURI(res.name), '' + res.name, {}]);\r\n}\r\n\r\n\r\nfunction myDateSort(x, y, dir) {\r\n x = ParseDateTime(x);\r\n y = ParseDateTime(y);\r\n return dir * ((x < y) ? 1 : ((x > y) ? -1 : 0));\r\n}\r\n\r\nif (jQuery.fn.dataTableExt) {\r\n jQuery.fn.dataTableExt.oSort['mydate-asc'] = function (x, y) {\r\n return myDateSort(x, y, -1);\r\n };\r\n jQuery.fn.dataTableExt.oSort['mydate-desc'] = function (x, y) {\r\n return myDateSort(x, y, 1);\r\n };\r\n}\r\n\r\n(function (global) {\r\n var mainContainer;\r\n // Таблица истории с навешенным плагином dataTable.\r\n var currentHistotyTable = null;\r\n\r\n global.InitHistoryTable = function (tableSelector) {\r\n var tbl = $(tableSelector).find('table');\r\n if (tbl.length) {\r\n var sortDownHtml = '';\r\n var sortUpHtml = '';\r\n tbl.find('th').prepend(sortDownHtml + sortUpHtml);\r\n\r\n var isInit = false;\r\n $('html').on('OnSetRealHeightAndWidth', function () {\r\n if (!isInit) {\r\n\r\n mainContainer = $('#main_container');\r\n\r\n var colnum = tbl.find('th').length;\r\n var res = [];\r\n for (var i = 0; i < colnum; ++i)\r\n res.push(null);\r\n res[0] = { sType: 'mydate' };\r\n\r\n currentHistotyTable = tbl.dataTable({\r\n bPaginate: false,\r\n aoColumns: res,\r\n sScrollX: \"100%\",\r\n sScrollY: (mainContainer.height() - 34),\r\n aaSorting: [[0, 'desc']],\r\n oLanguage: { \"sZeroRecords\": L(\"EMPTY\") }\r\n });\r\n\r\n InitHover(tbl.find('tr'));\r\n isInit = true;\r\n }\r\n });\r\n }\r\n };\r\n\r\n // Корректируем размеры колонок истории при ресайзе окна.\r\n $(window).bind(\"resizeEnd\", function () {\r\n // Пересчитываем высоту.\r\n if (!!mainContainer) {\r\n mainContainer.find('.dataTables_scrollBody').height(mainContainer.height() - 34);\r\n }\r\n if (!!currentHistotyTable) {\r\n // Пересчитываем размеры колонок.\r\n currentHistotyTable.fnAdjustColumnSizing();\r\n }\r\n AfterSearch();\r\n });\r\n})(window);\r\n\r\nfunction ConfirmDelete(num, text) {\r\n var promise = $.Deferred();\r\n ConfirmDialogNew({\r\n text: $.trim(text || (num > 1 ? L(\"CONFIRM_DELETE_LINKS\", num) : L(\"CONFIRM_DELETE_LINK\"))).replace('\\n', '
    '),\r\n ok: $.proxy(promise.resolve, promise),\r\n cancel: $.proxy(promise.reject, promise),\r\n width: 'auto'\r\n });\r\n return promise;\r\n}\r\n\r\n// Проверяет размер файла в форме. Возвращает true, если файл допустимого размера (или если проверка не удалась).\r\n// input - элемент \r\n// onError - функция, вызываемая в случае если файл слишком велик. В качестве параметра передается сообщение об ошибке.\r\nfunction CheckFileSize(input, onError) {\r\n try {\r\n var f;\r\n var size;\r\n // можно проверить для IE < 10, но тогда будет использоваться ActiveX и пользователю будет выдаваться \"непонятный запрос\"\r\n if (input && input.files && input.files.length > 0) {\r\n f = input.files[0];\r\n size = f.size || f.fileSize;\r\n } else {\r\n return true;\r\n }\r\n if (typeof size == \"number\" && size > MaxRequestLength) {\r\n if (onError) onError(L(\"FILE_TOO_LARGE\", MaxRequestLength));\r\n return false;\r\n }\r\n } catch (e) {\r\n console.log(e.message);\r\n }\r\n return true;\r\n}\r\n\r\nfunction ReferenceOpen(name, viewname) {\r\n window.open(format(\"/explorer.aspx?sys={sys}&ext={ext}&mode=RefRecords&compcode={name}&refview={view}&toolitem=Run\",\r\n { sys: GetParamInURL('sys'), ext: GetParamInURL('ext'), name: name, view: viewname }));\r\n}\r\n\r\nfunction WizardExecute(name) {\r\n window.open(format(\"/wizard.aspx?code={name}\", { name: name }));\r\n}\r\n\r\n// Инициализация обложки папки.\r\nfunction InitFolderCover() {\r\n\r\n var methods = {\r\n ReferenceOpen: function (name, viewname) {\r\n return top.ReferenceOpen(name, viewname);\r\n },\r\n\r\n WizardExecute: function (name) {\r\n return top.WizardExecute(name);\r\n },\r\n\r\n TMExecute: function (code) {\r\n window.open(\"/task.aspx?sys=\" + g_SysCode + \"&ext=\" + g_ExtName + '&mode=newSR&routecode=' + encodeURIComponent(code));\r\n return;\r\n },\r\n\r\n ComponentExecuteInNewProcess: function (_, type, name) {\r\n if (type == 'Report') {\r\n top.ShowReportParams(name);\r\n return;\r\n }\r\n top.ShowMessage(L('NO_FILES_FOR_IPAD'));\r\n },\r\n\r\n IsWebAccess: true\r\n };\r\n\r\n var iframe = $('#folder_cover_frame');\r\n\r\n if (iframe.length) {\r\n // Добавить к родительской области соответствующий класс.\r\n var jRightColumn = $(\"#right_column\");\r\n jRightColumn.addClass(\"folder_has_cover\");\r\n\r\n // Расширить стили для панели фильтрации.\r\n var jFiltrationPanel = $(\".filtration-panel\");\r\n jFiltrationPanel.addClass(\"filtration-panel__has_cover\");\r\n\r\n if (iframe.attr('src').indexOf('users/foldercovers/') != 0) // non-local frame\r\n return;\r\n\r\n var iframe_wnd = iframe[0].contentWindow || iframe[0].contentDocument.parentWindow;\r\n iframe_wnd.onload = function () {\r\n $.extend(iframe_wnd, methods);\r\n Object.defineProperty(iframe_wnd, \"external\", { get: function () { top.ShowMessage(L('NO_FILES_FOR_IPAD')); return undefined; } });\r\n\r\n // Добавить кастомные стили для обложки\r\n changeCoverStylesImages($('#folder_cover_frame'));\r\n }\r\n }\r\n}\r\n\r\n// Использовать кастомные стили обложки\r\nfunction changeCoverStylesImages(jFrame) {\r\n jFrame.on('load', function () {\r\n var imagesPath = \"/images/covers\";\r\n var jFrameContents = $(this).contents();\r\n var jFrameHead = jFrameContents.find(\"head\");\r\n\r\n //Подключаем свои стили\r\n jFrameHead.append($(\"\",\r\n { rel: \"stylesheet\", href: \"/css/covers.css\", type: \"text/css\" }));\r\n\r\n //Заменяем иконки\r\n jFrameContents.find('img[src$=\"icon_1.gif\"]').each(function () {\r\n $(this).attr('src', imagesPath + '/folder-32.svg');\r\n $(this).width(40);\r\n });\r\n jFrameContents.find('img[src$=\"icon_2.gif\"]').each(function () {\r\n $(this).attr('src', imagesPath + '/report-32.svg');\r\n $(this).width(40);\r\n });\r\n jFrameContents.find('img[src$=\"icon_3.gif\"]').each(function () {\r\n $(this).attr('src', imagesPath + '/folderComponents-32.svg');\r\n $(this).width(40);\r\n });\r\n\r\n //Заменяем(убираем) логотип\r\n jFrameContents.find('img.logo').each(function () {\r\n $(this).attr('src', imagesPath + '/dot.gif');\r\n });\r\n });\r\n}\r\n\r\nfunction InsertRouteSchemaImage() {\r\n if (RouteSchemaPath != '') {\r\n var img = $('');\r\n img.bind('load', function () {\r\n //setRealHeightAndWidth();\r\n }).appendTo($('#ctl00_MainContent_CardContainer'));\r\n }\r\n}\r\n\r\nfunction InitTooltips() {\r\n if (typeof showHints === 'undefined' || showHints === \"true\" || showHints) {\r\n $(\".hint\").each(function () {\r\n // Убираем title у ячейки-родителя (проставляется slick-grid'ом), чтобы не всплывал браузерный toolptip одновоременно с кастомным.\r\n $(this).parent().attr('title', '');\r\n InitAdditionalInfoTooltip($(this));\r\n });\r\n }\r\n}\r\n\r\nfunction ContextMenuCheckAll() {\r\n var check = $('.chkAll').eq(0);\r\n if (WA.ENV.browser.name.toLowerCase() === 'IE') {\r\n if (check.attr('CHECKED') == 'checked') check.removeAttr('checked');\r\n else check.attr('CHECKED', 'checked');\r\n }\r\n check.click();\r\n}\r\n\r\n// Показать модалку заполенения исполнителей в задаче.\r\nfunction showRouteModal() {\r\n var inp = $(\"#CardContrrolRoute\");\r\n if (inp.length == 0) {\r\n inp = $('#CardContrrolStandartRoute');\r\n // У стартованых по ТМ нельзя сбрасывать маршрут.\r\n if (WA.CR.State !== 0 && inp.hasClass('Req_Disabled')) return;\r\n ConfirmDialogNew({\r\n text: L('CONFIRM_TEXT_CLEAR_ROUTE'),\r\n width: 330\r\n }, function () {\r\n SetStandardRoute(GetParamInURL('id'), 0, function () {\r\n $.cookie('showroutemw', '1');\r\n });\r\n });\r\n } else {\r\n inp.ShowMultiSelectModalWindow();\r\n };\r\n}\r\n\r\n// Показать модалку заполенения наблюдателей в задаче.\r\nfunction showObserversModal() {\r\n var threeDotsDiv = $(\"#CardContrrolObservers\").parents(\".rs_SelItems_cont\").next(\".RefSelect_Arrow\");\r\n threeDotsDiv.click();\r\n}\r\n\r\nfunction BindHelpIcoClick(links, ico) {\r\n $(function () {\r\n if (g_IsExtHelpAvailable) {\r\n // Внешняя справка есть.\r\n var isExplorerAboutIco = false;\r\n\r\n if (!ico) {\r\n ico = $('#info').find('.HelpIco');\r\n // Если кнопка в проводнике и шапке, то нужно еще отобразить \"О программе\".\r\n isExplorerAboutIco = (WA.getLocation() === 'explorer');\r\n };\r\n\r\n // Сбрасываем click на иконку Справки и запрещаем дальнейшую инициализацию в Core\r\n ico.off('click').addClass('inited').attr('title', L('HELP'));\r\n\r\n if (links === null) {\r\n // Справка по объекту не найдена.\r\n if (isExplorerAboutIco) {\r\n // Открываем \"О программе\".\r\n ico.attr('title', L('ABOUT')).on('click', function () {\r\n window.open(\"/Settings.aspx?view=About\", 'settings');\r\n });\r\n } else {\r\n ico.on('click.ExtHelp', function () {\r\n // Шамов А.: Убрал для исправления замечания http://directum.npo-comp.ru/reference.asp?sys=TEHKASNPO&compcode=%C7%C7%CF&id=5642859\r\n //ShowMessage(L('INSTRUCTIONS_ARE_NOT_FOUND_FOR_THIS_OBJECT'), L('ERROR'), null, L('OK'), 400, null, true);\r\n });\r\n };\r\n } else {\r\n var lastUrl;\r\n var menu_items = [];\r\n for (lastUrl in links) {\r\n var click = (function (_lastUrl) {\r\n return function () { window.open(_lastUrl); };\r\n })(lastUrl);\r\n menu_items.push({ text: links[lastUrl], onClick: click });\r\n };\r\n if (menu_items.length > 0) {\r\n menu_items[menu_items.length - 1].separator = true;\r\n }\r\n\r\n if (isExplorerAboutIco) {\r\n // Добавляем пункт меню \"Справка: <система>\"\r\n if (typeof g_UserMenuHelpItem != 'undefined' && !!g_UserMenuHelpItem) {\r\n menu_items.push(g_UserMenuHelpItem);\r\n };\r\n };\r\n\r\n if (menu_items.length === 1) {\r\n ico.on('click.ExtHelp', function () {\r\n window.open(lastUrl);\r\n });\r\n } else {\r\n var menu = new ContextMenu(menu_items, { width: 'auto', \"shiftX\": -225 });\r\n $(ico).contextMenu(menu, \"click.ExtHelp\");\r\n }\r\n };\r\n };\r\n\r\n });\r\n}\r\n\r\n// Навешивает открытие справки на иконку в модальном диалоге.\r\nfunction BindHelpIcoClickOnModalWindow(contextId, wnd) {\r\n // Проверяем есть ли внешняя справка.\r\n if (g_IsExtHelpAvailable) {\r\n if (!wnd) {\r\n wnd = $('.ui-dialog').filter(':visible');\r\n };\r\n var ico = wnd.find('.DialogHelpIco');\r\n if (!!window['g_ModalWindowExtHelpLinks']) BindHelpIcoClick(window['g_ModalWindowExtHelpLinks'][contextId], ico);\r\n ico.show();\r\n }\r\n};\r\n\r\n// Обновляет список ссылок внешней справки модальных диалогов.\r\nfunction UpdateModalWindowExtHelpLinks(newLinks) {\r\n if (!window['g_ModalWindowExtHelpLinks']) window['g_ModalWindowExtHelpLinks'] = {};\r\n window['g_ModalWindowExtHelpLinks'] = $.extend(window['g_ModalWindowExtHelpLinks'], newLinks);\r\n};\r\n\r\nfunction AdjustDialogIfIpad(dialogWidth) {\r\n\r\n var width = 0;\r\n if (dialogWidth) width = dialogWidth;\r\n if ($.ipad) { $('[role=dialog]').last().css('left', Math.max(($(document).width() - width) / 2, 0)).css('top', 200); }\r\n}\r\n\r\nfunction clearAllModalDivs() {\r\n $('body').find('> div[role=dialog]').filter(':not(:visible)').children().remove();\r\n}\r\n\r\nfunction ViewOnDesktop(isForEdit) {\r\n var currentVersion = null;\r\n if (GetParamInURL('view').toLowerCase() == \"preview\" && WA.Document.Encoding == 0) {\r\n var versionName = $('#versionSelect').find('input.pickField').val();\r\n currentVersion = !!versionName ? versionName.substring(0, versionName.indexOf(\".\")) : null;\r\n }\r\n\r\n // Если передано все что угодно, но не False, то открывает на редактирование.\r\n if (isForEdit !== false) isForEdit = true;\r\n\r\n OpenWithAgent({ id: WebAccess.Document.ID }, isForEdit, currentVersion);\r\n}\r\n\r\nfunction OpenWithAgent(Doc, Lock, Version) {\r\n var jDoc = $('#' + Doc.id);\r\n\r\n // Убирает иконку загрузки\r\n function removeDownloadInProgressStatus() {\r\n if (jDoc.length > 0) {\r\n jDoc.find('.object-list-item__upload-icon').remove();\r\n var jDocIcon = jDoc.find('.object-list-item__icon');\r\n jDocIcon.attr('class', 'object-list-item__icon');\r\n } else {\r\n $.when(WA.FormControlsInit).done(function () {\r\n WA.CR.spinner.hide();\r\n });\r\n }\r\n }\r\n // Устанавливает иконку загрузки на 3 сек\r\n function setDownloadInProgressStatus() {\r\n if (jDoc.length > 0) {\r\n var jUploadIcon = $('');\r\n var jDocIcon = jDoc.find('.object-list-item__icon');\r\n jDocIcon.attr('class', jDocIcon.attr('class') + ' object-list-item__icon_uploaded');\r\n jDoc.find('.object-list-item__column_type_icon').eq(0).append(jUploadIcon);\r\n } else {\r\n $.when(WA.FormControlsInit).done(function () {\r\n if (WA.getLocation() === \"wizard\") {\r\n WA.CR.spinner.showInDialog();\r\n } else {\r\n WA.CR.spinner.show();\r\n }\r\n });\r\n }\r\n setTimeout(removeDownloadInProgressStatus, 4000);\r\n }\r\n\r\n setDownloadInProgressStatus();\r\n\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n WebAccess.agent.edms.checkDocumentHasLocalCopy(Doc.id).always(function (localCopies) {\r\n if (localCopies.length > 0) {\r\n removeDownloadInProgressStatus();\r\n GetEDocumentObject(Doc.id, function (docObj) {\r\n AskForActionOnDocument(docObj, localCopies, Lock);\r\n });\r\n } else {\r\n ExportEDoc(Doc.id, true, Version, !Lock, function () { // функция при нажатии на ОК при выборе версии\r\n var selectedVerRadio = $('#modal_window input[type=\"radio\"]:checked');\r\n var verNumber = selectedVerRadio.val();\r\n var canExportWithLock = selectedVerRadio.data('islocked') != '1';\r\n if (canExportWithLock) {\r\n if (verNumber) {\r\n SendEDocToAgent(Doc.id, verNumber, Lock);\r\n // TODO: Получать колбэк\r\n }\r\n } else {\r\n AskOpenForView(selectedVerRadio.data('locked_msg').d, Doc.id, verNumber);\r\n // TODO: Получать колбэк\r\n }\r\n }, function () {\r\n SendEDocToAgent(Doc.id, \"lastver\", Lock);\r\n // TODO: Получать колбэк\r\n });\r\n }\r\n });\r\n }).fail(function () {\r\n // TODO: Убрать стрелку\r\n log.error('Can not open document with agent. EDMS plugin is not available');\r\n });\r\n}\r\n\r\nfunction SendVersionToAgent(version, lock) {\r\n var Version = EDocumentVersion(version);\r\n var docID = Version.GetDocID();\r\n\r\n //FIXME: always переделать на done и fail\r\n WebAccess.agent.edms.checkDocumentHasLocalCopy(docID).always(function (localCopies) {\r\n if (localCopies.length > 0) {\r\n GetEDocumentObject(docID,\r\n function (docObj) {\r\n AskForActionOnDocument(docObj, localCopies, lock);\r\n });\r\n return;\r\n }\r\n\r\n SendEDocToAgent(Version.GetDocID(), Version.GetCurrentVersion().Number, lock);\r\n });\r\n}\r\n\r\nfunction SendEDocToAgent(EDocID, verNumber, Lock) {\r\n GetEDocumentObject(EDocID, function (Doc) {\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n var operation = Lock ? (1 | 2 | 64) : 1;\r\n if (verNumber === \"lastver\") verNumber = Doc.Versions[Doc.Versions.length - 1].Number;\r\n if (Lock) {\r\n CallServiceSync(\"/EDocument.asmx/CheckVersionStateForExport\", { \"EDocID\": Doc.ID, \"VerNum\": verNumber, \"IsExport\": false }, function (res) {\r\n if (res.EnableLock === \"false\" || res.Error !== \"\") {\r\n // предупреждение что нельзя экспортировать и предложение открыть на просмотр\r\n AskOpenForView(res.Error ? res.Error : res.Warning, Doc.ID, verNumber);\r\n }\r\n else {\r\n RequestTokenAndContinue(operation, Doc, verNumber, Lock);\r\n }\r\n }, null);\r\n }\r\n else {\r\n RequestTokenAndContinue(operation, Doc, verNumber, Lock);\r\n }\r\n\r\n }).fail(function () {\r\n log.error('Can not open document with agent. EDMS plugin is not available');\r\n });\r\n });\r\n}\r\n\r\nfunction AskOpenForView(message, id, verNumber) {\r\n var ver = !!verNumber ? verNumber : 0;\r\n var radio = $('#modal_window input[type=\"radio\"]:checked:visible');\r\n var okCallback;\r\n if (radio.length > 0) {\r\n ver = radio.val();\r\n okCallback = function () { SendEDocToAgent(id, ver, false); }; // ExportEDocNow(id, ver, false, false); };\r\n }\r\n else {\r\n okCallback = function () { SendEDocToAgent(id, ver, false); }; // ExportEDoc(id, true, 0, true); };\r\n }\r\n\r\n WA.SRV.call('/EDocument.asmx/CheckVersionFormatForPreview', { EDocID: id, VerNum: verNumber === \"lastver\" ? 0 : ver })\r\n .success(function (isPreviewSupported) {\r\n var mbox = new WA.CMP.dialogs.MessageBox();\r\n mbox.addButton('ViewInEditor', L('OPEN_IN_EDITOR_FOR_VIEW'), okCallback);\r\n mbox.addButton('Preview', L('OPEN_IN_PREVIEW'), function () {\r\n ShowTopSpinner(L(\"PLEASE_WAIT\"), true);\r\n window.open(GetPreviewEDocUrl(id, ver), 'EDoc' + id);\r\n HideTopSpinner(\"\", 1);\r\n });\r\n mbox.addButton('cancel', L('CANCEL'));\r\n mbox.isShowCancelButton = false;\r\n mbox.isShowOkButton = false;\r\n mbox._setDefaultButton('ViewInEditor');\r\n mbox.width = 520;\r\n mbox.showInfo(message);\r\n if (!isPreviewSupported) mbox.baseDialog.disableButton('preview');\r\n });\r\n\r\n //ConfirmDialogNew({\r\n // text: L(\"OPEN_FOR_VIEW_QUESTION\") + '^' + message, // MakeWarningMessage(message).add($(\"
    \" + L(\"OPEN_FOR_VIEW_QUESTION\") + \"
    \")),\r\n // width: 600,\r\n // height: \"auto\",\r\n // ok: okCallback, // OpenEDocForView(id, verNumber); },\r\n // cancel: null\r\n //});\r\n}\r\n\r\nfunction OpenEDocForView(id, verNumber) {\r\n CallServiceSync(\"/EDocument.asmx/CheckVersionFormatForPreview\", { EDocID: id, VerNum: verNumber == \"lastver\" ? 0 : verNumber },\r\n function (res) {\r\n var hrefForExport = format(\"Doc.aspx?sys={code}&ext={ext}&ID={doc_id}&view=ShowVerList&ver={ver_num}{explock}\",\r\n { code: g_SysCode, ext: g_ExtName, doc_id: id, ver_num: verNumber, explock: \"&mode=EXPORT\" });\r\n if (res.Success) {\r\n var formatSupported = res.Result;\r\n if (formatSupported || ($.ipad)) {\r\n ShowTopSpinner(L(\"PLEASE_WAIT\"), true);\r\n window.open(GetPreviewEDocUrl(id, verNumber), 'EDoc' + id);\r\n HideTopSpinner(\"\", 1);\r\n }\r\n else {\r\n location.href = hrefForExport;\r\n }\r\n }\r\n else {\r\n location.href = hrefForExport;\r\n }\r\n },\r\n function (err) {\r\n var severity = (err.Severity !== \"-1\" ? Number(err.Severity) : undefined);\r\n WA.CR.inlineHint.show(err.error, undefined, severity);\r\n });\r\n}\r\n\r\nfunction RequestTokenAndContinue(Operation, Doc, verNumber, Lock) {\r\n var OpenDoc = function (password) {\r\n RequestToken(Operation, function (token) {\r\n try {\r\n ShowTopSpinner(L(\"EDOC_OPENING\"));\r\n var params = GetAgentOpenDocRequestParamsObject(Doc, verNumber, token, Lock);\r\n if ((Doc.Encoding == 2 || Doc.Encoding == 3) && !!password) params[\"Password\"] = password;\r\n WebAccess.agent.transmitRequest('opendocument', 'edmsPlugin', params).fail(function (response) {\r\n if (response.message == \"CONNECTION_NOT_AVAILABLE\") {\r\n // Значит агент отвалился. Очистим кэш и попытаемся снова.\r\n if (typeof WA.CR.agent !== 'undefined') {\r\n WA.CR.agent.clearPluginCache();\r\n }\r\n RequestTokenAndContinue(Operation, Doc, verNumber, Lock);\r\n } else {\r\n ShowError(response.message);\r\n if (params.lock === \"y\") {\r\n //Необходимо снять блокировку\r\n WA.SRV.call(\"Document.asmx/UnlockVersion\", {\r\n DocumentID: Doc,\r\n VersionNumber: verNumber,\r\n UseGlobalLock: false\r\n });\r\n }\r\n }\r\n console.log(response);\r\n });\r\n }\r\n catch (ex) {\r\n console.log(ex);\r\n }\r\n\r\n HideTopSpinner(\"\", 4000);\r\n }, Doc.ID, verNumber);\r\n }\r\n\r\n if ((Doc.Encoding == 2) || (Doc.Encoding == 3)) {\r\n RequestPasswordForDecryption(Doc, OpenDoc);\r\n } else {\r\n OpenDoc(null);\r\n }\r\n}\r\n\r\nfunction GetEDocumentObject(docID, callback) {\r\n //if (WebAccess.Document.ID == docID) {\r\n // if (callback) callback(WebAccess.Document);\r\n //}\r\n //else {\r\n WA.SRV.call(\"EDocument.asmx/GetEDocObject\", { EDocID: docID }).done(function (res) {\r\n if (callback) callback(res);\r\n });\r\n //}\r\n}\r\n\r\nfunction RequestToken(Operation, RequestTokenCallback) {\r\n if (arguments.length >= 2 && arguments.length <= 5) {\r\n var svcParams = { \"Operation\": Operation };\r\n for (var i = 2; i < arguments.length; i++) {\r\n svcParams[\"Param\" + (i - 1)] = arguments[i];\r\n }\r\n WA.SRV.call(\"/Security.asmx/GetOpToken\" + (arguments.length - 2), svcParams).done(function (res) {\r\n if (RequestTokenCallback) RequestTokenCallback(res);\r\n });\r\n }\r\n}\r\n\r\nfunction GetAgentOpenDocRequestParamsObject(Doc, Version, Token, needLock) {\r\n var verIndex = -1;\r\n for (var i = 0; i < Doc.Versions.length; i++) {\r\n if (Doc.Versions[i].Number == Version) { verIndex = i; break; }\r\n }\r\n //FIXME: убрать лишние параметры, названия привести в Pascal стиль.\r\n return {\r\n callback: \"ProcessResponse\",\r\n id: Doc.ID,\r\n name: Doc.ClientName,\r\n ver: Version,\r\n ext: (Doc.Versions[verIndex] ? Doc.Versions[verIndex].Editor.Extension : $('#' + Doc.ID + '_' + Version).data('verinfo').Extension),\r\n editor: (Doc.Versions[verIndex] ? Doc.Versions[verIndex].Editor.EditorCode : $('#' + Doc.ID + '_' + Version).data('verinfo').EditorCode),\r\n EncodeType: Doc.Encoding,\r\n observetype: (Doc.Versions[verIndex] ? Doc.Versions[verIndex].Editor.CloseObservingType : $('#' + Doc.ID + '_' + Version).data('verinfo').CloseObservingType),\r\n loc: document.location.host,\r\n lock: (needLock ? (needLock ? 'y' : 'n') : ($('#lock:checked').length == 1 ? 'y' : 'n')),\r\n EncryptionPluginName: Doc.PluginName,\r\n //method: 'opendocument',\r\n //plugin: 'EdmsPlugin',\r\n token: Token,\r\n secure: (document.location.protocol == 'http:' ? 'n' : 'y'),\r\n culture: currentCultureName,\r\n sys: g_SysCode\r\n };\r\n}\r\n\r\nfunction GetAgentOpenDocRequestParams(Doc, Version, Token, needLock) {\r\n var verIndex = -1;\r\n for (var i = 0; i < Doc.Versions.length; i++) {\r\n if (Doc.Versions[i].Number == Version) { verIndex = i; break; }\r\n }\r\n return '&id=' + Doc.ID +\r\n '&name=' + Doc.ClientName +\r\n '&ver=' + Version +\r\n '&ext=' + (Doc.Versions[verIndex] ? Doc.Versions[verIndex].Editor.Extension : $('#' + Doc.ID + '_' + Version).data('verinfo').Extension) +\r\n '&editor=' + (Doc.Versions[verIndex] ? Doc.Versions[verIndex].Editor.EditorCode : $('#' + Doc.ID + '_' + Version).data('verinfo').EditorCode) +\r\n '&observetype=' + (Doc.Versions[verIndex] ? Doc.Versions[verIndex].Editor.CloseObservingType : $('#' + Doc.ID + '_' + Version).data('verinfo').CloseObservingType) +\r\n '&loc=' + document.location.host +\r\n '&lock=' + (needLock ? (needLock ? 'y' : 'n') : ($('#lock:checked').length == 1 ? 'y' : 'n')) +\r\n '&method=' + 'opendocument' +\r\n '&plugin=EdmsPlugin' +\r\n '&token=' + Token +\r\n '&secure=' + (document.location.protocol == 'http:' ? 'n' : 'y') +\r\n '&culture=' + currentCultureName +\r\n '&sys=' + g_SysCode;\r\n}\r\n\r\nfunction ProcessResponse(data) {\r\n if (data.ok) {\r\n HideTopSpinner(data.message, 2500);\r\n } else {\r\n HideTopSpinner(data.message, 2500);\r\n }\r\n}\r\n\r\n/**\r\n* Используется в WebAccess для проверки наличия биндингов\r\n* @function jQuery.hasAttr\r\n* @return {jQuery}\r\n*/\r\n$.fn.hasAttr = function (name) {\r\n return this.attr(name) !== undefined;\r\n};\r\n\r\n/**\r\n* Форсирует обновление элемента(для IE и андроида например), когда остаются\r\n* артефакты.\r\n* @function jQuery.redraw\r\n* @return {jQuery}\r\n*/\r\n$.fn.redraw = function () {\r\n var me = $(this);\r\n setTimeout(function () { me.css({ \"outline\": \"0px solid white\" }) }, 50);\r\n setTimeout(function () { me.css({ \"outline\": \"none\" }) }, 100);\r\n return $(this);\r\n}\r\n\r\nfunction ShutdownAgentSession() {\r\n log.info('AGENT', 'End of the session');\r\n WebAccess.agent.endSession();\r\n}\r\n\r\nfunction selectToolbarBtnOnShowContextMenu(btn) {\r\n return {\r\n onShow: function () {\r\n $(btn).addClass('menu_select');\r\n },\r\n onHide: function () {\r\n $('#toolbar_container').find('.menu_select').removeClass('menu_select');\r\n }\r\n };\r\n}\r\n\r\n\r\n$(function () {\r\n if ((WA.getLocation() === 'explorer' || WA.getLocation() === 'referencerecords') && WA.ENV.browser.name === 'IE') {\r\n //Замечание №74474. Что бы после того как нажали \"Назад в браузере\" чекбоксы были выключены.\r\n $('#main_container').find('.List input').add('#chkAll').attr('checked', false);\r\n }\r\n});\r\n\r\nfunction OpenEDocByAgent(id, ver, lock) {\r\n OpenWithAgent({ id: id }, lock, ver);\r\n};\r\n\r\nvar wizardLinkRegExp = /compcode=WIZARDS&id=(\\d+)/i;\r\n\r\nfunction ReplaceWizardLinks(TaskID) {\r\n $(function () {\r\n $('.Card_Task_SavedText').find('a').each(function () {\r\n var $this = $(this);\r\n var href = $this.attr('href');\r\n var b = href.match(wizardLinkRegExp);\r\n if ((b !== null) && (b.length > 0)) {\r\n $this.attr('href', '/wizard.aspx?id=' + b[1] + '&TaskID=' + TaskID);\r\n }\r\n });\r\n });\r\n}\r\n","(function (globalCore) {\n\n /**\n * Функции отвечающие за инициализацию агента.\n * @namespace Core.agent\n * @since 5.4.0.1005\n */\n globalCore.agent = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n var initializeAgentSession = function () {\r\n log.info('AGENT', '\"InitializeAgentSession\" function');\n\n //если записи в кэше о работе с агентом или без еще нет, то делаем ее в зависимости от поддерживаемости устройства\n if (!WA.agent.isDisableSetted() && !WA.agent.canUseInCurrentDevice()) {\r\n Core.agent.disable();\n log.info('AGENT', 'Agent is disabled for current device');\n return;\r\n }\n\n if (!WA.agent.isAvailable()) {\r\n log.info('AGENT', 'Agent is disabled in user settings');\n return;\r\n }\n\n if (g_IsAgentEnabled) {\r\n log.info('AGENT', 'Agent is enabled in web.config');\r\n } else {\n // Агент выключен в web.config.\n log.info('AGENT', 'Agent is disabled in web.config');\n return;\r\n }\n\n // Проверим запущен ли агент.\n WA.agent.checkSessionState(1).done(function (isSessionRegistered) {\r\n if (isSessionRegistered) {\n // Агент запущен.\n log.info('AGENT', 'Agent is started');\n\n // Если начнется обновление, то надо отобразить это в виджете.\n globalCore.agent.beforeUpdating(function () {\r\n globalCore.footer.agentNotStartedWidget.show();\r\n });\n\n _initSession()\n .then(_updateAgent)\n .then(_initAgentUI);\r\n }\r\n }).fail(function (isSessionError) {\r\n if (isSessionError) {\r\n log.info(\"AGENT\", \"Try start with URI\");\n // Некорректный ИД сессии, запускаем по URI\n start();\r\n } else {\n // Агент не запущен.\n log.info('AGENT', 'Agent is NOT started');\n\n // Не показываем виджет агента\n //// Запуск\n //var eventName = globalCore.footer.agentNotStartedWidget['class'].EVENT.AFTER_START;\n //globalCore.footer.agentNotStartedWidget.bind(eventName, function () {\n // _initSession()\n // .then(_updateAgent)\n // .then(_initAgentUI);\n //});\n\n //// Скачивание\n //var eventName = globalCore.footer.agentNotStartedWidget['class'].EVENT.AFTER_DOWNLOAD;\n //globalCore.footer.agentNotStartedWidget.bind(eventName, showDownloadInstruction);\n\n //// Диалог может и не показаться, если его закрыл пользователь, такая уж у него логика.\n //globalCore.footer.agentNotStartedWidget.show();\n }\r\n });\r\n };\n\n function UpdateAgentProgressBar(dialog, progress) {\r\n $('#progress-bar').animate({ width: progress + '%' }, 1000);\r\n }\n\n function GetProgressBarHtml() {\r\n var html = '
    ' + L(\"AGENT_IS_BEING_UPDATED\") + '
    ';\n return html;\r\n }\n\n\n // Функция вызываемая после запуска агента.\n function afterStartAgent() {\r\n log.info('AGENT', '\"afterStartAgent\" function was called');\n\n return _initSession().then(_initAgentUI);\r\n };\n\n // Функция вызываемая после скачивания агента.\n function showDownloadInstruction(platform) {\r\n if (platform) {\n // TODO Если будем делать инструкцию. \n } else {\n // TODO Если будем делать инструкцию.\n }\r\n };\n\n // Проверить, нужно ли отобразить какие-то уведомления. \n function checkNotifications() {\n // Показать инструкцию, если агент был отключен. \n if (needShowInstruction()) {\r\n showEnableInstruction();\r\n }\r\n };\n\n // Нужно ли показать toast с инструкцией\n function needShowInstruction() {\r\n if (WA.agent.canUseInCurrentDevice()) {\r\n var needShow = WA.cache.getItem('agent.needShowInstruction');\n WA.cache.setItem('agent.needShowInstruction', null);\n return needShow == \"1\";\r\n }\n\n return false;\r\n };\n\n function showEnableInstruction() {\r\n var toast = new WA.CMP.NTF.Toast();\n toast.showMessage(L(\"WORK_WITHOUT_AGENT_INSTRUCTION\"), true);\n // Ссылка для перехода в настройки\n $(\".toast_settings-link\").click(function () {\r\n window.open(\"/Settings.aspx\", 'settings');\r\n });\r\n };\n\n // Вызвать действие через агент.\n function invoke(requestName, pluginName, params) {\r\n var def = $.Deferred();\n\n // Запрос к агенту\n function request(requestName, pluginName, params) {\r\n WA.agent.transmitRequest(requestName, pluginName, params).done(function (res) {\r\n def.resolve(res);\r\n }).fail(function (res) {\r\n def.reject(res);\r\n });\r\n };\n\n WA.agent.checkSessionState(1).done(function () {\n // Если агент запущен - выполняем действие \n request(requestName, pluginName, params);\r\n }).fail(function (isSessionError) {\r\n if (isSessionError) {\r\n log.info(\"AGENT\", \"Try start with URI\");\n // Некорректный ИД сессии, запускаем по URI\n start();\r\n } else {\n // Если нет - отображаем диалог запуска. \n var dialog = new globalCore.agent.RunWithAgentDialog();\n dialog.agentAction = function () {\r\n request(requestName, pluginName, params);\r\n };\n dialog.show();\r\n }\r\n });\n\n return def.promise();\r\n };\n\n // Получить объект для выполнения запросов к плагину.\n // Использовать как: Core.agent.getPlugin('edmsPlugin').done(function (plugin) { plugin.invoke('opendocument', params).done(...); })\n function getPlugin(pluginName) {\r\n var def = $.Deferred();\n var pluginObj = {\r\n invoke: function (method, params) {\r\n return invoke(method, pluginName, params);\r\n }\r\n };\n\n function _getPlugin() {\r\n WA.agent.isPluginAvailable(pluginName).done(function (isAvailable) {\r\n isAvailable ? def.resolve(pluginObj) : def.reject();\r\n }).fail(function (err) {\n // Если не удалось получить значение, то отображаем диалог запуска и выполняем проверку еще раз. \n showDialog();\r\n });\r\n };\n\n function showDialog() {\r\n var dialog = new globalCore.agent.RunWithAgentDialog();\n dialog.agentAction = function () {\r\n WA.agent.isPluginAvailable(pluginName).done(function (isAvailable) {\r\n isAvailable ? def.resolve(pluginObj) : def.reject();\r\n }).fail(function (err) {\r\n def.reject(err);\r\n });\r\n };\n dialog.show();\r\n };\n\n var defForSession = $.Deferred();\n WA.agent.checkSessionState().done(function (isSessionRegistered) {\n //Если сессия зарегистрирована, но не проинициализирована то вызываем beginSession\n if (!WA.agent.isSessionInitialized())\n WA.agent.beginSession().done(function () {\r\n log.info('AGENT', 'Agent session is initialized.');\n WA.agent.setSessionInitialized(true);\n defForSession.resolve(isSessionRegistered);\r\n }).fail(function () {\r\n defForSession.reject(true);\r\n });\n else defForSession.resolve(isSessionRegistered);\r\n }).fail(function (isSessionError) {\r\n defForSession.reject(isSessionError);\r\n });\n\n // Проверим, запущен ли агент и зарегистрирована ли сессия.\n defForSession.done(function (isSessionRegistered) {\r\n if (isSessionRegistered) {\n // Агент запущен.\n log.info('AGENT', 'Agent is started');\n _getPlugin();\r\n }\r\n }).fail(function (isSessionError) {\r\n if (isSessionError) {\r\n log.info(\"AGENT\", \"Try start with URI\");\n // Некорректный ИД сессии, запускаем по URI\n start().done(function () {\r\n _getPlugin();\r\n });\r\n } else {\n // Агент не запущен - отобразится диалог запуска. \n showDialog();\r\n }\r\n });\n\n return def.promise();\r\n };\n\n // Запуск приложения\n function _startAgent() {\r\n var def = $.Deferred();\n\n log.info('AGENT', 'Agent starting by URL scheme...');\n var startDef = WA.agent.start().done(function (isStarted) {\r\n if (isStarted) {\r\n log.info('AGENT', 'Agent started.');\n def.resolve();\r\n } else {\r\n log.info('AGENT', 'Agent runnting in another windows session');\n def.reject(L('AGENT_RUNNING_IN_AHOTHER_WINDOWS_SESSION_ADDITIONAL_TEXT'));\r\n }\r\n }).fail(function (err) {\n // Не запустился timeout или oldagent.\n log.info('AGENT', 'Agent NOT started. Error code = ' + err);\n // Если запуск был отменен, то не отображаем сообщения об ошибке.\n var text = err === 'canceled' ? \"\" : L('AGENT_WAITING_START_FAIL');\n def.reject(text);\r\n });\n\n return def.promise();\r\n };\n\n // Обновить агент\n function _updateAgent() {\r\n var def = $.Deferred();\n var CHECK_STATE_INTERVAL = 2000;\n var errCount = 0;\n\n // Проверка состояния обновления \n function checkUpdateState() {\r\n WebAccess.agent.updates.getUpdateProgress().done(function (resp) {\r\n if (resp.success) {\r\n $.event.trigger(globalCore.agent.EVENT.ON_UPDATING, resp.result);\n if (resp.result == 100) {\r\n $.event.trigger(globalCore.agent.EVENT.AFTER_UPDATING, resp.result);\n\n WA.agent.restart().done(function () {\r\n _initSession().done(function () {\r\n def.resolve(resp.result);\r\n });\r\n });\r\n } else if (resp.result === -1) {\n //сюда попадаем, если агент начал обновляться, но не может завершить обновление до конца\n //если сделать reject, ВД не прекратит попытки обновляться, поэтому resolve\n log.info(\"AGENT\", \"Agent cannot finish updating\");\n def.resolve();\r\n } else {\r\n setTimeout(checkUpdateState, CHECK_STATE_INTERVAL);\r\n }\r\n }\r\n }).fail(function (err) {\r\n errCount += 1;\n log.info(\"AGENT\", \"Agent getUpdateProgress error count: \" + errCount);\n if (errCount > 2) {\r\n $.event.trigger(globalCore.agent.EVENT.ON_FAIL_UPDATING, err.result);\n def.reject(err.message);\r\n } else {\r\n setTimeout(checkUpdateState, CHECK_STATE_INTERVAL);\r\n }\r\n });\r\n }\n\n WebAccess.agent.updates.checkUpdates().done(function () {\r\n $.event.trigger(globalCore.agent.EVENT.BEFORE_UPDATING);\n setTimeout(checkUpdateState, CHECK_STATE_INTERVAL);\r\n }).fail(function () {\r\n def.resolve();\r\n });\n\n return def.promise();\r\n };\n\n // Инициализировать сессию.\n function _initSession() {\r\n var def = $.Deferred();\n\n log.info('AGENT', 'Agent session is initializing...');\n WA.agent.beginSession().done(function () {\r\n log.info('AGENT', 'Agent session is initialized.');\n WA.agent.setSessionInitialized(true);\n def.resolve();\r\n }).fail(function (err) {\r\n log.info('AGENT', 'Agent session failed.');\n def.reject(err);\r\n });\n\n return def.promise();\r\n };\n\n // Инициализировать виджет открытия документов.\n function _initAgentUI() {\r\n var def = $.Deferred();\n if (WA.getLocation() === 'explorer') {\n // Скрываем виджет о необходимости запустить агента.\n globalCore.footer.agentNotStartedWidget.hide();\n //Проверяем наличие редактируемых документов\n globalCore.footer.openedDocumentsWidget.init();\r\n }\n def.resolve();\n\n return def.promise();\r\n };\n\n // Запуск агента\n function start() {\r\n return _startAgent()\n .then(_initSession)\n .then(_updateAgent)\n .then(_initAgentUI);\r\n };\n\n function cancelStart() {\r\n log.info('AGENT', 'Agent is not starting');\n WA.agent.cancelStart();\r\n };\n\n function download(jClickedElement) {\r\n var def = $.Deferred();\n\n var platform = WA.ENV.platform;\n if (platform === 'linux') {\r\n\n var downloadDebPackageButton = {\r\n id: \"deb\",\n text: L('AGENT_DOWNLOAD_DEB_PACKAGE_NAME'),\n click: function () {\r\n WA.agent.download('linux_deb');\n def.resolve();\r\n }\r\n };\n var downloadRpmPackageButton = {\r\n id: \"rpm\",\n text: L('AGENT_DOWNLOAD_RPM_PACKAGE_NAME'),\n click: function () {\r\n WA.agent.download('linux_rpm');\n def.resolve();\r\n }\r\n };\n\n var dialog = new WebAccess.components.dialogs.BaseDialog({\r\n title: L('AGENT_DOWNLOAD_LINUX_PACKAGE_INSTRUCTION_TITLE'),\n isShowOkButton: false,\n isShowCancelButton: true,\n width: '415px'\r\n });\n dialog.setHtml(L('AGENT_DOWNLOAD_LINUX_PACKAGE_INSTRUCTION'));\n dialog.modalWindowButtons.push(downloadDebPackageButton);\n dialog.modalWindowButtons.push(downloadRpmPackageButton);\n dialog.show();\r\n\n\n } else {\r\n WA.agent.download();\n def.resolve();\r\n }\n\n return def.promise();\r\n };\n\n function uploadLogs() {\n return WA.agent.uploadLogs();\n };\n\n function disable() {\r\n WA.agent.disable();\n Core.settings.saveDocDefaultActionSettings().always(function () {\n // Установить значение в кэше, чтобы отобразить toast с инструкцией после перезагрузки странцицы.\n WA.cache.setItem('agent.needShowInstruction', '1');\n window.location.reload();\r\n });\r\n };\n\n function bind(event, handler) {\n // Обработчики можно добавить только к своим событиям \n if (_.contains(_.values(globalCore.agent.EVENT), event)) {\r\n $(document).on(event, handler);\r\n }\r\n };\n\n function unbind(event, handler) {\n // Обработчики можно убрать только у своих событий\n if (_.contains(_.values(globalCore.agent.EVENT), event)) {\r\n $(document).off(event, handler);\r\n }\r\n }\n\n // ---------------------------------------------------------------------------------------------------\n // Public functions\n // ---------------------------------------------------------------------------------------------------\n\n globalCore.agent = {\n // События агента\n EVENT: {\r\n BEFORE_UPDATING: 'beforeAgentUpdating',\n ON_UPDATING: 'onAgentUpdating',\n AFTER_UPDATING: 'afterAgentUpdating',\n ON_FAIL_UPDATING: 'onFailAgentUpdating'\r\n },\n\n /**\n * Инициализировать сессию агента.\n *\n * @method Core.agent.init\n */\n init: initializeAgentSession,\n\n /**\n * Проверить сообщения для отоборажения в веб досупе. \n *\n * @method Core.agent.checkNotifications\n */\n checkNotifications: checkNotifications,\n\n /**\n * Вызвать действие через агент.\n *\n * @method Core.agent.invoke\n * @return {$.Deferred} Deferred-объект.\n */\n invoke: invoke,\n\n /** \n * Запуск агента.\n *\n * @method Core.agent.start\n * @return {$.Deferred} Deferred-объект.\n */\n start: start,\n\n /** \n * Отменить запуск агента. Функция изменяется в зависимости от шага выполнения. \n *\n * @method Core.agent.cancelStart\n */\n cancelStart: cancelStart,\n\n /**\n * Скачать агент.\n *\n * @method Core.agent.download\n * @return {$.Deferred} Deferred-объект.\n */\n download: download,\n\n /**\n * Включить уведомление для отключеннго агента. \n *\n * @method Core.agent.disable\n */\n disable: disable,\n\n /**\n * Получить объект для выполнения запросов к плагину.\n *\n * @method Core.agent.getPlugin\n * @return {$.Deferred} Deferred-объект.\n *\n * @example \n * Core.agent.getPlugin('edmsPlugin').done(function (plugin) { \n * plugin.invoke('opendocument', params).done(...); \n * }).fail(...);\n */\n getPlugin: getPlugin,\n\n /**\n * Навесить обработчик на событие. \n * @method Core.agent.bind\n *\n */\n bind: bind,\n\n /**\n * Убрать обработчик события. \n * @method Core.agent.unbind\n *\n */\n unbind: unbind,\n\n /**\n * Навесить обработчик на событие \"До обновления агента\". \n * @method Core.agent.beforeUpdating\n *\n */\n beforeUpdating: function (handler) {\r\n globalCore.agent.bind(globalCore.agent.EVENT.BEFORE_UPDATING, handler);\r\n },\n\n /**\n * Навесить обработчик на событие \"Обновление агента\". \n * @method Core.agent.onUpdating\n *\n */\n onUpdating: function (handler) {\r\n globalCore.agent.bind(globalCore.agent.EVENT.ON_UPDATING, handler);\r\n },\n\n /**\n * Навесить обработчик на событие \"После обновления агента\". \n * @method Core.agent.afterUpdating\n *\n */\n afterUpdating: function (handler) {\r\n globalCore.agent.bind(globalCore.agent.EVENT.AFTER_UPDATING, handler);\r\n },\n\n /**\n * Навесить обработчик на событие \"Ошибка обновления агента\". \n * @method Core.agent.onFailUpdating\n *\n */\n onFailUpdating: function (handler) {\r\n globalCore.agent.bind(globalCore.agent.EVENT.ON_FAIL_UPDATING, handler);\r\n },\n\n /**\n * Выгружает логи агента на сервер веб-доступа.\n *\n * @method Core.agent.uploadLogs\n * @return {$.Deferred} Deferred-объект.\n */\n uploadLogs: uploadLogs\r\n };\r\n\n})(window.Core);\n","\"use strict\";\n\n(function (global) {\n var BUTTONS = {\n RUN_AGENT: \"run_and_resume_button\",\n WITHOUT_AGENT: \"work_without_agent_button\",\n CANCEL: \"modal_cancel_button_\"\n };\n\n // Интервал пинга агента.\n var PING_INTERVAL = 1000;\n // Время для предупреждения о долгом запуске агента.\n var PING_SUSPECT_FAIL_TIME = 10000;\n // Время, после которого перестаем пинговать.\n var PING_MAX_TIME = 30000;\n\n var RunWithAgentDialog = WA.CMP.dialogs.BaseDialog.extend({\n className: 'RunWithAgentDialog',\n title: L(\"AGENT_APP_NAME\"),\n mainText: L(\"AGENT_RUN_DIALOG_MAIN_TEXT\"),\n additionalText: L(\"AGENT_RUN_DIALOG_INSTALL_TEXT\"),\n agentAction: null,\n _agentStartTimeoutID: null,\n _agentStartFailTimeoutID: null,\n _waitDialog: null,\n\n /**\n * Инициализация диалога.\n *\n * @method WebAccess.components.dialogs.RunWithAgentDialog#init\n * @param {object} settings Настройки диалога\n */\n init: function (settings) {\n var me = this;\n me._super($.extend({}, settings, { isShowCancelButton: true, isShowOkButton: false }));\n\n me.bind(me['class'].EVENT.AFTER_CLOSE, function () {\n Core.agent.cancelStart();\n me._clearCheckAgentTimers();\n });\n },\n\n /**\n * Показать диалог.\n *\n * @method WebAccess.components.dialogs.RunWithAgentDialog#show\n * @return WebAccess.components.dialogs.RunWithAgentDialog\n */\n show: function () {\n var me = this;\n me._initButtons();\n me.setHtml(me._getHtml());\n\n me._super();\n me._initDownloadLink();\n me._initUpdateHandling();\n\n // Навешиваем событие на иконку \"?\".\n BindHelpIcoClickOnModalWindow('RunWithAgentDialog', me._jDialog.parents('.ui-dialog'));\n\n return me;\n },\n\n /**\n * Запустить агент.\n *\n * @private\n */\n _runAgent: function () {\n var me = this;\n me.enableButtonWaitState(BUTTONS.RUN_AGENT, L(\"AGENT_STARTING\"));\n me._initCheckAgentTimers();\n\n // Запустить агент и выполнить действие.\n Core.agent.start(PING_MAX_TIME).done(function () {\n log.info('AGENT', 'Agent is started from dialog.')\n if (me.agentAction)\n me.agentAction();\n me.close();\n }).fail(function (err) {\n me.inlineHint.showError(err.message);\n }).always(function () {\n me._clearCheckAgentTimers();\n });\n },\n\n /**\n * Работать без агента.\n *\n * @private\n */\n _disableAgent: function () {\n Core.agent.disable();\n },\n\n /**\n * Инициализировать timeout функции для отображения информации в диалоге.\n *\n * @private\n */\n _initCheckAgentTimers: function () {\n var me = this;\n // Предупреждение\n me._agentStartTimeoutID = setTimeout(function() {\n me.inlineHint.showWarning(L(\"AGENT_START_IS_TOO_LONG\"));\n },\n PING_SUSPECT_FAIL_TIME);\n\n // Прекратить\n me._agentStartFailTimeoutID = setTimeout(function() {\n Core.agent.cancelStart();\n me.inlineHint.showError(L(\"AGENT_LAUNCHING_WAS_FAILED\"));\n me._initButtons();\n me.updateButtons();\n },\n PING_MAX_TIME);\n },\n\n /**\n * Очистить timeout функции для отображения информации в диалоге.\n *\n * @private\n */\n _clearCheckAgentTimers: function () {\n var me = this;\n clearTimeout(me._agentStartTimeoutID)\n clearTimeout(me._agentStartFailTimeoutID);\n log.info('AGENT', 'Agent dialog info timers destroyed');\n },\n\n /**\n * Инициализировать кнопки для диалога.\n *\n * @private\n */\n _initButtons: function () {\n var me = this;\n me.modalWindowButtons = [];\n me.modalWindowButtons.push({\n id: BUTTONS.RUN_AGENT,\n text: L(\"RUN_AND_RESUME\"),\n click: function () {\n me._runAgent();\n return false;\n },\n 'class': 'primary'\n });\n me.modalWindowButtons.push({\n id: BUTTONS.WITHOUT_AGENT,\n text: L(\"CONTINUE_WITHOUT_AGENT\"),\n click: function () {\n me._disableAgent();\n }\n });\n if (!_.findWhere(me.modalWindowButtons, { id: BUTTONS.CANCEL + me.id })) {\n me.modalWindowButtons.push({\n id: BUTTONS.CANCEL + me.id,\n text: me.cancelText,\n click: function () { me.close(); return false; },\n 'data-name': 'CancelButton'\n });\n }\n },\n\n /**\n * Инициализировать ссылку на скачивание агента.\n *\n * @private\n */\n _initDownloadLink: function () {\n var me = this;\n me._jDialog.find('.agent-dialog_download-link').click(function (event) {\n log.info('AGENT', 'Agent downloading...');\n Core.agent.download(this).done(function (platform) {\n me.fire(me['class'].EVENT.AFTER_DOWNLOAD, platform);\n }).fail(function () {\n me.fire(me['class'].EVENT.AFTER_DOWNLOAD, null);\n });\n\n event.preventDefault();\n return false;\n });\n },\n\n /**\n * Возвращает html-разметку для окна.\n * @private\n */\n _getHtml: function () {\n var mainTextHtml = '
    ' + this.mainText + '
    ';\n var additionalTextHtml = '
    ' + this.additionalText + '
    ';\n var html = '
    ' + mainTextHtml + additionalTextHtml + '
    ';\n return html;\n },\n\n // Обработка событий обновления агента.\n _initUpdateHandling: function () {\n var me = this;\n Core.agent.beforeUpdating(function () { me._beforeUpdating(); });\n Core.agent.onUpdating(function (progress) { me._onUpdating(progress); });\n Core.agent.afterUpdating(function () { me._afterUpdating(); });\n Core.agent.onFailUpdating(function () { me._onFailUpdating(); });\n\n log.info('AGENT', 'Agent updating handlers was initalized');\n },\n\n // До начала процесса обновления.\n _beforeUpdating: function () {\n var me = this;\n log.info('AGENT', 'Agent before updating was triggered');\n\n me._waitDialog = waitDialog();\n me._waitDialog.show();\n // Если обновляемся, то не надо ожидать запуска агента\n me._clearCheckAgentTimers();\n\n function waitDialog() {\n var spinnerImage = 'spinner.gif';\n var dialog = new WA.CMP.dialogs.BaseDialog();\n dialog.removeDefaultButtons();\n dialog.removeCloseButton();\n dialog.title = L('AGENT_APP_NAME');\n dialog.setHtml(format('{0}', L('AGENT_IS_BEING_UPDATED')));\n\n return dialog;\n };\n },\n // В процессе обновления.\n _onUpdating: function (progress) {\n log.info(\"AGENT\", \"Agent updating status: \" + progress);\n },\n // После обновления.\n _afterUpdating: function () {\n var me = this;\n if (me._waitDialog)\n me._waitDialog.close();\n // Снова инициализируем таймеры\n me._initCheckAgentTimers();\n // Отключить обработчики, они больше не нужны\n me._unbindUpdateHandlers();\n },\n // Если обновление завершилось с ошибкой.\n _onFailUpdating: function () {\n var me = this;\n if (me._waitDialog)\n me._waitDialog.close();\n me.inlineHint.showError(L(\"AGENT_UPDATING_WAS_FAILED\"));\n me.disableButtonWaitState(BUTTONS.RUN_AGENT);\n me._clearCheckAgentTimers();\n },\n // Отключить обработчики событий обновления агента.\n _unbindUpdateHandlers: function () {\n var me = this;\n Core.agent.unbind(Core.agent.EVENT.BEFORE_UPDATING);\n Core.agent.unbind(Core.agent.EVENT.ON_UPDATING);\n Core.agent.unbind(Core.agent.EVENT.AFTER_UPDATING);\n Core.agent.unbind(Core.agent.EVENT.ON_FAIL_UPDATING);\n }\n\n }, {\n EVENT: $.extend({\n // Событие срабатывает после старта агента.\n AFTER_START: 'start',\n\n // Событие срабатывает после скачивания агента.\n AFTER_DOWNLOAD: 'download'\n }, WA.CMP.dialogs.BaseDialog.EVENT)\n });\n\n global.RunWithAgentDialog = RunWithAgentDialog;\n})(window.Core.agent);","(function (global) {\n \n /**\n * Функции отвечающие за работу пенелей инструментов\n * @namespace Core.header\n * @since 5.0.0.410?? Версия по интерфейсам\n */\n global.header = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Функции отвечающие за работу главную риббон панель инструментов с кнопками.\n * @namespace Core.header.extraActions\n * @since 5.0.0.410??\n */\n global.header.actions = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.Core);","\"use strict\";\n\n(function (global) {\n\n global._iw = {}; // initial width\n global._jo = {}; // jObjects\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Кэширование объектов, для дальнейшего использования\n * @since 5.0.0.4200\n * @private\n * @function Core.header.actions._preInitObjects\n * @return {Core.header.actions}\n */\n global._preInitObjects = function () {\n if ($.isEmptyObject(global._jo)) {\n global._jo.header = $(\"#header\");\n global._jo.info = $(\"#info\");\n global._jo.actions = $(\"#actions\");\n global._jo.caption = $(\"#caption_container\");\n };\n\n if ($.isEmptyObject(global._iw)) {\n global._iw.info = global._jo.info.width();\n global._iw.actions = global._jo.actions.width();\n global._iw.caption = global._jo.caption.css(\"marginRight\");\n };\n\n\n // Корректируем отступ заголовка для корректной работы при изменении окна браузера.\n global._jo.caption.css('margin-left', $('#logo_container').outerWidth(true));\n\n global._initHovers();\n return global;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Меняем спрайты при наведении мыши на иконки.\n */\n global._initHovers = function () {\n var button = global._jo.actions.find('.usermenu_button p');\n button\n .on(\"mouseenter.actions\", function () {\n var oldImage = $(this).attr(\"class\").replace(\"Hovered\", \"\").split(\".\");\n $(this).attr(\"class\", oldImage[0] + \"Hovered.\" + oldImage[1]);\n })\n .on('mouseleave.actions', function () {\n var oldImage = $(this).attr(\"class\").replace(\"Hovered\", \"\");\n $(this).attr(\"class\", oldImage);\n });\n\n $(\"#username\").on(\"mouseenter.actions\", function () {\n var oldImage = $(this).children(\"p\").attr(\"class\").replace(\"Hovered\", \"\").split(\".\");\n $(this).children(\"p\").attr(\"class\", oldImage[0] + \"Hovered.\" + oldImage[1]);\n })\n .on('mouseleave.actions', function () {\n var oldImage = $(this).children(\"p\").attr(\"class\").replace(\"Hovered\", \"\");\n $(this).children(\"p\").attr(\"class\", oldImage);\n });\n\n };\n\n /**\n * Меню для кнопочки с вопросительным знаком\n * @since 5.0.0.4200\n * @function Core.header.actions.initAboutMenu \n * @return {Core.header.actions}\n */\n global.initAboutMenu = WA.tryCatchDecorator(function () {\n var jAbout = $(\"#header_about_action\");\n if (!jAbout.hasClass('inited')) {\n jAbout.on('click', function () {\n window.open(\"/Settings.aspx?view=About\", 'settings');\n });\n }\n return global;\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Меню для кнопочки с шестерней. (Настройки)\n * @since 5.0.0.4200\n * @function Core.header.actions.initSettingsMenu \n * @return {Core.header.actions}\n */\n global.initSettingsMenu = WA.tryCatchDecorator(function () {\n $(\"#header_settings_action\").on('click', function () {\n window.open(\"/Settings.aspx\", 'settings');\n });\n return global;\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Подсказка на имя текущего пользователя.\n * @since 5.0.0.4200\n * @function Core.header.actions.initCurrentUserHint \n * @return {Core.header.actions}\n */\n global.initCurrentUserHint = function (usersRefCode, userId, hasHint) {\n $(function () {\n var jUsername = $('#username');\n jUsername.data('data-hint', { 'compcode': usersRefCode, 'id': userId });\n var position = {\n target: jUsername,\n adjust: {\n mouse: false,\n x: -120,\n y: +118\n }\n };\n InitAdditionalInfoTooltip(jUsername, position);\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.Core.header.actions);","\"use strict\";\n\n(function (global) {\n\n /**\n * Функции отвечающие за работу пенелей инструментов\n * @namespace Core.sideBar\n * @since 5.0.0.4200\n */\n global.sideBar = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n})(window.Core);\n\n\n(function (global) {\n global.tabSelector = \"div.tab_item\";\n global.tab = 0;\n\n global.initTabs = function () {\n var url = new WA.URL();\n var view = url.getParam('view').toLowerCase()\n if ($('.CardForm_Tab').length && (view == \"card\" || !view)) {\n Core.sideBar.updateTab();\n }\n return global;\n };\n\n global.updateTab = function (tab) {\n\n var me = global;\n var tabGiven;\n if (tab) {\n me.tab = tab;\n tabGiven = true;\n } else {\n var res = /Tab(\\d+)/.exec(location.hash);\n if (res)\n me.tab = parseInt(res[1], 10);\n tabGiven = false;\n }\n\n var url = new WA.URL();\n var SB = WA.CR.sideBar;\n if (!me.tab || me.tab <= 0 || ($('#TabHeader' + me.tab).length == 0 && $('#ViewList_TabHeader' + me.tab).length == 0)) {\n SB.tabs.toArray().forEach(function (tab, index) {\n if (!me.tab && tab.isVisible()) {\n me.tab = index + 1;\n }\n });\n }\n if (tabGiven && url.getParam('view') && url.getParam('view').toLowerCase() != \"card\" && url.getParam('mode').toLowerCase() != \"new\") {\n var newUrl = PrepareUrl(location.href, 'view=Card');\n newUrl += '#Tab' + me.tab;\n try {\n //UnbindBeforeUnload();\n window.location.href = newUrl;\n } catch (_) { }\n } else {\n $('.CardForm .CardForm_Tab').hide();\n var jCardFormTabs = $('.CardFormTabs');\n if (jCardFormTabs.length) { // вкладки сверху\n jCardFormTabs.find('li').removeClass('background');\n $('#TabHeader' + me.tab, jCardFormTabs).addClass('background');\n } else { // вкладки сбоку\n\n var jSelectedTab;\n if (me.tab > 1) {\n jSelectedTab = $('.tab_item#ViewList_TabHeader' + me.tab);\n } else {\n jSelectedTab = $('.tab_item#ViewList_Card');\n }\n\n var tabName = jSelectedTab.attr('name');\n\n //TODO Шамов А.: События должны fire внутри класса, а не где попало.\n if (SB) SB.fire(SB['class'].EVENT.BEFORE_TAB_SWITCH, SB.tabs[tabName]);\n\n var jTabItem = $('.tab_item');\n jTabItem.removeClass('selected');\n jSelectedTab.addClass('selected');\n window.location.hash = \"Tab\" + me.tab;\n\n //TODO Шамов А.: События должны fire внутри класса, а не где попало.\n if (SB) SB.fire(SB['class'].EVENT.AFTER_TAB_SWITCH, SB.tabs[tabName]);\n }\n\n $('.CardForm #CardForm_Tab_' + tabName).show();\n if (me.tab == 1) $('.CardForm #CardForm_Tab_Card').show();\n }\n\n // $('.CardForm .datatable').dataTable().fnDraw();\n var dtTables = $('.CardForm div.dataTables_scrollBody .refrecord_table');\n if (dtTables.length > 0) {\n for (var i = 0; i < dtTables.length; i++) {\n $(dtTables[i]).dataTable().fnDraw();\n };\n };\n\n return global;\n };\n\n\n /**\n * \n * @function Core.sideBar.setHorizontal\n * @since 5.0.0.4200 \n * @return {integer}\n */\n global.isHorizontal = function () {\n return $(window).width() < $(window).height();\n };\n\n /**\n * \n * @function Core.sideBar.setOrientationCookie\n * @since 5.0.0.4200 \n * @return {integer}\n */\n global.setOrientationCookie = function (isNeedInvert) {\n var isHorizontal = global.isHorizontal();\n if (isNeedInvert === true) isHorizontal = !isHorizontal;\n $.cookie(\"IsHorizontal\", isHorizontal ? \"1\" : \"0\");\n };\n\n /**\n * \n * @function Core.sideBar.setHorizontal\n * @since 5.0.0.4200 \n * @return {integer}\n */\n global.setHorizontal = function () {\n WA.SideBarInit.done(function () {\n WA.current.sideBar.setOrientation(ORIENTATION.HORIZONTAL);\n });\n };\n\n /**\n * Устновить нормальную ориентацию сайдбара.\n * @function Core.sideBar.setVertical\n * @since 5.0.0.4200 \n * @return {integer}\n */\n global.setVertical = function () {\n WA.SideBarInit.done(function () {\n WA.current.sideBar.setOrientation(ORIENTATION.VERTICAL);\n });\n };\n\n})(window.Core.sideBar);","(function (global) {\n \n /**\n * Функции отвечающие за работу пенелей инструментов\n * @namespace Core.toolbars\n * @since 5.0.0.4102\n */\n global.toolBars = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Функции отвечающие за работу панель инструментов (риббона) в проводнике.\n * @namespace Core.toolbars.main\n * @since 5.0.0.4102\n */\n global.toolBars.main = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Функции отвечающие за работу панели списка объектов.\n * @namespace Core.toolbars.objectList \n * @since 5.1.0.1505\n */\n global.toolBars.objectList = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Функции отвечающие за работу панель инструментов (риббона) в справочнике.\n * @namespace Core.toolbars.reference\n * @since 5.0.0.4200\n */\n global.toolBars.reference = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Функции отвечающие за работу панель инструментов (риббона) в карточке задания.\n * @namespace Core.toolbars.job\n * @since 5.2.0.1500\n */\n global.toolBars.job = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.Core);","\"use strict\";\n\n(function (global) {\n\n var WITHOUT_FILTER_NAME = '';\n\n /**\n * Инициализация меню предустановленных фильтров.\n * @since 5.2.0.2000\n * @return {Core.toolBars.objectList}\n */\n global.initPreFiltersMenu = WA.TCD(function () {\n var bottomSeparator;\n var menuSelector = '#predefined_filters';\n var jFilters = $(menuSelector);\n if (!jFilters.length) return;\n\n var jSelectedItemText = jFilters.find('.filtration-panel__dropdown-text');\n\n var allFilters = jFilters.data('predefinedfilters');\n var selectedFilterName = jFilters.data('predefinedselectedfilter');\n\n // Инициализирует фильтр.\n $.when(WA.ObjectListInit).done(function () {\n WA.CR.objectList.setPredefinedFilter(selectedFilterName);\n });\n\n // Предопределенные фильтры без скрытых.\n var predefinedFilters = _(allFilters).filter(function (item) {\n return !item.IsHidden;\n });\n // Фильтры по статусам. Считаем что все скрытые это статусы.\n var statuses = _(allFilters).filter(function (item) {\n return item.IsHidden;\n });\n\n\n var menuItems = _(predefinedFilters).map(function (item) {\n return {\n name: item.Name,\n label: item.Text,\n tooltip: L(item.Tooltip),\n icon: item.Icon,\n bottomSeparator: bottomSeparator,\n selected: (item.Name === selectedFilterName)\n };\n });\n // Разделитель для последнего элемента предопределенных фильтров.\n menuItems[menuItems.length - 1].bottomSeparator = true;\n // Без фильтра.\n menuItems.push({\n \"name\": WITHOUT_FILTER_NAME,\n \"label\": L(\"DEFAULT_EMPTY_FILTER\"),\n selected: (!selectedFilterName || selectedFilterName === WITHOUT_FILTER_NAME)\n });\n\n\n var statusesMenuItems = _(statuses).map(function (item) {\n return {\n name: item.Name,\n text: L(item.Text),\n tooltip: L(item.Tooltip),\n label: item.Text,\n image: item.Icon,\n selected: (item.Name === selectedFilterName)\n };\n });\n\n var baseMenu = new WA.components.menus.BaseContextMenu(menuSelector, menuItems, {\n width: 220,\n shiftY: -30 //поднимаем выше оба меню.\n });\n baseMenu.render();\n\n if (statusesMenuItems.length > 0) {\n baseMenu._menu.onShow = function () {\n // Надо каждый раз рендерить, т.к. основное контекстное меню всё чистит.\n var statusesMenu = new WebAccess.components.menus.OnlyIconsContextMenu(menuSelector, statusesMenuItems);\n statusesMenu.render();\n\n statusesMenu.jMenu.css({\n 'width': '210px',\n 'margin-bottom': '22px' // отсутуп между меню.\n });\n statusesMenu.showIn($('#mainContextMenuContainer'), true);\n statusesMenu.bind(\"itemSelect\", function (selectedItem) {\n onSelectFilter(selectedItem);\n ContextMenu.hide();\n });\n };\n }\n\n baseMenu.bind(\"itemSelect\", onSelectFilter);\n\n function onSelectFilter(selectedItem) {\n jFilters.data('predefinedselectedfilter', selectedItem.name);\n\n // Устанавливаем новый выбранный.\n _(statusesMenuItems).each(function (item) {\n item.selected = (item.name === selectedItem.name);\n });\n _(menuItems).each(function (menuItem) {\n baseMenu.setSelectedItem(menuItem.name, menuItem.name == selectedItem.name);\n });\n\n var iconSymbol = '#filter' + (selectedItem.name === WITHOUT_FILTER_NAME ? 'Off' : 'On') + '-16';\n jFilters.find('use').attr('xlink:href', iconSymbol);\n jSelectedItemText.text(L(selectedItem.label));\n\n global.setPredefinedFilter(selectedItem.name);\n\n if (Core.isStatisticEnabled) {\n ///Запись в статистику\n WA.CR.statistics.write({\n page: WA.getLocation(),\n action: \"PredefinedFiltering\",\n area: 'FilterPanel',\n target: jFilters.get(0)\n });\n };\n }\n\n return global;\n });\n\n global.setPredefinedFilter = function (value) {\n WA.CR.objectList.setPredefinedFilter(value).reload();\n };\n\n /**\n * Инициализация меню сортировки.\n * @since 5.2.0.2000\n * @return {Core.toolBars.objectList}\n */\n global.initSortMenu = WA.TCD(function (id, data) {\n var ASC = 1;\n var DESC = -1;\n var OFF = 0;\n\n var contextMenu;\n var jSortText = $(\"#\" + id);\n var jSortIcon = jSortText.prev();\n var currentItem = null;\n\n // Если нет данных для построения контектного меню скрывает сортировку.\n if ($.isEmptyObject(data)) {\n jSortText.parent().hide();\n return true;\n }\n\n var menuItems = [];\n $.each(data, function () {\n var itemData = this;\n var sortIcon = 'sort-16';\n\n menuItems.push({\n name: itemData.name,\n label: itemData.caption,\n icon: (itemData.sort === OFF ? '' : sortIcon),\n iconCSSClass: (itemData.sort === OFF ? '' : getIcon(itemData.sort === ASC)),\n selected: (itemData.sort !== OFF),\n sort: itemData.sort,\n defaultDirection: itemData.defaultDirection,\n hoverIcon: sortIcon,\n iconHoverCSSClass: getHoverIconCssClass(itemData)\n });\n\n if (itemData.sort !== OFF) currentItem = menuItems[menuItems.length - 1];\n });\n\n // Инициализирует сортировку.\n $.when(WA.ObjectListInit).done(function () {\n setSortByMenuItem(currentItem);\n });\n\n function sortDirectionIsAsc(item) {\n if (item.sort === OFF) {\n return item.defaultDirection === ASC;\n } else {\n return item.sort === ASC;\n }\n }\n function getHoverIconCssClass(item) {\n if (item.sort === OFF) {\n return getIcon(item.defaultDirection === ASC);\n } else {\n return getIcon(item.sort !== ASC);\n }\n }\n function getIcon(isAsc) {\n return (isAsc ? '' : 'reverse');\n }\n\n contextMenu = new WA.components.menus.BaseContextMenu(\"#\" + id, menuItems);\n contextMenu.render();\n contextMenu.bind(\"itemSelect\", function (item) {\n sortItemOnClick(item);\n });\n jSortIcon.click(function () {\n // При клике на иконку меняем сортировку на обратную.\n sortItemOnClick(currentItem);\n });\n\n function sortItemOnClick(clickedItem) {\n if (Core.isStatisticEnabled) {\n ///Запись в статистику\n WA.CR.statistics.write({\n page: WA.getLocation(),\n action: \"Sorting\",\n area: 'FilterPanel',\n target: $('#list_sort')\n });\n };\n\n _(menuItems).each(function (menuItem) {\n if ((currentItem) && (menuItem.name == currentItem.name)) {\n // Меняем направление текущей сортировки.\n menuItem.sort = (menuItem.sort === ASC ? DESC : ASC);\n currentItem = menuItem;\n } else\n if ((clickedItem) && (menuItem.name == clickedItem.name)) {\n // Если не текущий, но мы его выбрали устанавливаем направление по умолничаю.\n menuItem.sort = menuItem.defaultDirection;\n currentItem = menuItem;\n } else {\n // Сбрасываем сортировку для всех остальных.\n menuItem.sort = OFF;\n }\n // Сбрасываем стили и иконки.\n contextMenu.setSelectedItem(menuItem.name, false);\n menuItem.icon = '';\n menuItem.image = '';\n menuItem.iconCSSClass = '';\n menuItem.iconHoverCSSClass = getHoverIconCssClass(menuItem);\n });\n if (!currentItem) return;\n\n contextMenu.setSelectedItem(currentItem.name, true, 'sort-16', getIcon(currentItem.sort === ASC));\n\n jSortText.text(currentItem.label);\n\n if (currentItem.sort === ASC) jSortIcon.attr(\"class\", \"filtration-panel__dropdown-icon\");\n else jSortIcon.attr(\"class\", \"filtration-panel__dropdown-icon filtration-panel__dropdown-icon_reverse\");\n\n setSortByMenuItem(currentItem);\n WA.CR.objectList.reload();\n }\n\n function setSortByMenuItem(currentItem) {\n if (!currentItem) return;\n\n var column = currentItem.name;\n var isAsc = (currentItem.sort === ASC);\n WA.CR.objectList.setSort(column, isAsc)\n }\n });\n})(window.Core.toolBars.objectList);\n","\"use strict\";\n\n(function (global) {\n global.toolbarWidth = 0;\n\n /**\n * Поиск родительской папки в переданной части URL\n * @since 5.0.0.7300\n * @function Core.toolBars.main.getSourceId\n */\n global.getSourceId = function () {\n return (new WA.URL()).getParam('opener');\n };\n\n /**\n * Активирует кнопку 'Удалить ссылку', если есть id родительской папки\n * @since 5.0.0.7300\n * @function Core.toolBars.main.enableDeleteButton\n */\n global.enableDeleteButton = function (toolItem) {\n //if (global.getSourceId()) toolItem.enable();\n };\n\n /**\n * Действие для кнопки 'Удалить ссылку' в карточках объектов\n * @since 5.0.1.1700\n * @function Core.toolBars.main.deleteLinkFromCard\n */\n global.deleteLinkFromCard = WA.TCD(function () {\n var link = new WA.Link();\n var sourceId = global.getSourceId();\n\n if (WA.isMobile()) {\n WA.SRV.call(\"/Session.asmx/DeleteLinks\", { Links: [link.toLinkModel()], SourceID: sourceId, SourceType: 'FOLDER' }).done(function (res) {\n CloseJobWindow(WA.CR.getID);\n });\n return this;\n };\n\n var toast = new WA.CMP.notifications.Toast();\n\n ConfirmDelete(1, L('CONFIRM_DELETE_LINK_FROM_INBOX')).done(function () {\n WA.SRV.call(\"/Session.asmx/DeleteLinks\", { Links: [link.toLinkModel()], SourceID: sourceId, SourceType: 'FOLDER' }).done(function (res) {\n if (res != 0) {\n var opener = window.opener;\n if (opener) {\n if (opener.WA.getLocation() === 'explorer') {\n opener.WA.CR.objectList.reload().done(function () {\n if (opener.WA.CR.folderTree)\n opener.WA.CR.folderTree.updateNodesWithFolder(opener.WA.CR.getID());\n });\n opener.updateChkAll($('div.object_contents'), $('#chkAll'));\n opener.UpdateCopyPasteIcons();\n toast.show(L('DELETED_LINKS', res));\n opener.EnableOrDisableCheckAll();\n };\n };\n } else {\n toast.show(L(\"CANNOT_DELETE_LINK\"));\n }\n\n WA.CR.window.close(this);\n });\n });\n\n return this;\n });\n\n /**\n * Действие для кнопки 'Создать папку'\n * @since 5.0.0.7300\n * @function Core.toolBars.main.createFolder\n */\n global.createFolder = function () {\n var folderId = WA.CR.getID() || FavoritesFolderID;\n var folderTab = (new WA.URL('/PleaseWait.aspx')).open();\n\n //IOS замораживает вкладки, которые висят в фоне, поэтому фабрики в нем отдыхают\n if (WA.ENV.os.name.toLowerCase() === 'ios') {\n (new WA.URL('/Folder.aspx')).setParam('mode', 'new').setParam('path', folderId).openIn(folderTab);\n return global;\n }\n\n //Во всех нормальных браузерах можно пользоваться фабриками\n WA.FC.folders.createFolder({\n 'pasteToFolder': folderId\n }).done(function (folder) {\n folder.toURL().setParam('folder', folderId).openIn(folderTab);\n }).fail(function () {\n folderTab.close();\n });\n return global;\n },\n\n /**\n * Действие для кнопки 'Создать задачу' и 'Отравить вложением'\n * @since 5.0.0.7300\n * @function Core.toolBars.main.createTask\n */\n global.createTask = function (opt_withoutAttachments) {\n var folderId = WA.CR.getID() || OutboxFolderID;\n\n if (opt_withoutAttachments === true) {\n _createTask([]);\n return;\n }\n\n var handled = false;\n var $list = $('.object_contents.auto_load');\n\n if (isAllRecordsInFolderSelected() && $list.length) {\n // выделены все объекты\n // есть автоподгрузка - нужен специальный метод\n if ($list.data('component') == 'FolderContents') {\n // работаем с папкой\n handled = true;\n WA.SRV.call(\"/Session.asmx/GetAllLinksFolder\", { FolderID: folderId }).done(function (links) {\n links = $.map(links, function (model) { return (new WA.Link()).fromLinkModel(model); });\n _createTask(links);\n });\n } else {\n // работаем с результатами поиска\n // может быть очень много найденных элементов, поэтому отправлять задачу со всеми ими не будем.\n WA.CR.inlineHint.showError(L('ERR_CANNOT_SEND_ALL_THE_SEARCH_RESULTS_AS_AN_ATTACHMENT'));\n }\n } else {\n _createTask($.map(GetSelectedObjects(), function (q) { return new WA.Link(q.id, objectKindToObjectType(q.kind), q.refcode) }));\n }\n\n /**\n * Непосредственно создание задачи\n * @inner\n */\n function _createTask(attachments) {\n var taskTab = (new WA.URL('/PleaseWait.aspx')).setParam(\"message\", L(\"PLEASE_WAIT_TASK\")).open();\n\n //IOS замораживает вкладки, которые висят в фоне, поэтому к сожалению фабрики в нем отдыхают\n if (WA.ENV.os.name.toLowerCase() === 'ios') {\n if (attachments.length) {\n attachments = $.map(GetSelectedObjects(), function (q) { return { ID: q.id, Kind: q.kind, CompCode: q.refcode } });\n WA.SRV.callSync(\"/Task.asmx/CreateTaskWithAttachments\", { Attachments: attachments }).done(function (id) {\n (new WA.URL(\"Task.aspx?view=Card&mode=edit\")).setParam(\"id\", id).openIn(taskTab);\n });\n return;\n }\n (new WA.URL('/Task.aspx')).setParam('mode', 'new').setParam('folder', folderId).openIn(taskTab);\n return\n }\n\n //Во всех нормальных браузерах можно пользоваться фабриками\n WA.FC.tasks.createTask({\n attachments: attachments\n }).done(function (task) {\n task.toURL().setParam('folder', folderId).openIn(taskTab);\n }).fail(function () {\n taskTab.close();\n });\n };\n }\n\n /**\n * Данная функция вызывается серверной логикой, которая сначала формирует словарь buttons в следующем формате:\n * init({\n * ‘Btn1’: function() { try {\n * DisableIfNotEq1(this);\n * } catch(ex) { ShowError(ex.message); }; },\n * ‘Btn2’: function() { try {\n * DisableIfNotEq1(this, ‘SomeParam1’, ‘SomeParam2’)\n * } catch(ex) { ShowError(ex.message); }; },\n *});\n * затем все эти функции последовательно запускаются.\n * функции указываются в расширениях ВД, для каждой отдельной кнопки в атрибуте oninit\n *\n * @since 5.0.0.4102\n * @function Core.toolBars.main.init\n * @param {[type]} buttons [description]\n */\n global.init = function (buttons) {\n $.when(WA.ToolBarInit).done(function () {\n for (var button in buttons) {\n buttons[button].apply(WA.current.toolBar.buttons[button]);\n };\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сбросить состояние тулбара. Для списка переданных кнопок заменяет состояние, для всех остальных - сбрасывает.\n *\n * @param {array} states Список состояний кнопок, которые нужно заменить.\n * @function Core.toolBars.main.reset\n */\n global.reset = function (states) {\n _.each(WA.CR.toolBar.buttons.toArray(), function (button) {\n var isDisabled, isSelected;\n var jButton = button._jObject;\n var state = _.find(states, function (el) { return el.name === button.name; });\n if (state) {\n isDisabled = state.isDisabled;\n isSelected = state.isSelected;\n }\n if (typeof isDisabled === 'undefined')\n isDisabled = jButton.data('disabled');\n if (typeof isSelected === 'undefined')\n isSelected = jButton.data('selected');\n\n isDisabled ? button.disable() : button.enable();\n isSelected ? button.select() : button.unSelect();\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить текущую ширину области списка объектов\n * @since 5.0.0.4104\n * @function Core.toolBars.main.getObjectListWidth\n */\n global.getObjectListWidth = function (jToolBar) {\n var addWidth = 0;\n var jAttachments = $(\".attachments_td\");\n\n if (WA.getLocation() === 'explorer') {\n // В левой колонке дерево папок.\n var jLeftColumn = $(\"#left_column\");\n if (jLeftColumn.length != 0)\n addWidth += jLeftColumn.width();\n }\n\n if (jAttachments.length != 0)\n addWidth += jAttachments.width();\n\n return $(window).width() - 10 - addWidth;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить текущую ширину совокупности всех групп тулбара\n * @since 5.0.0.4104\n * @param {object} jToolBar jquery объект контейнера тулбара\n * @function Core.toolBars.main.getToolbarWidth\n */\n global.getToolbarWidth = function (jToolBar) {\n global.toolbarWidth = 0;\n jToolBar.find('.toolbar_group, .toolbar_separator').each(function () {\n global.toolbarWidth += $(this).outerWidth(true);\n });\n return global.toolbarWidth;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сворачивание и разворачивание групп кнопок, в зависимости от размеров окна и их приоритета.\n * @since 5.0.0.4104\n * @function Core.toolBars.main.groupToolbarItems\n */\n global.groupToolbarItems = function () {\n var group;\n var jToolBar = $('#toolbar_container');\n var toolbarWidth = global.getToolbarWidth(jToolBar);\n var objectListWidth = global.getObjectListWidth(jToolBar);\n var jGroups = $('.toolbar_group', jToolBar);\n\n // Сортируем группы по увеличению приоритета\n jGroups.sort(function (a, b) {\n // Без приоритета будут последними.\n return (parseInt(a.getAttribute(\"priority\") || Number.MAX_SAFE_INTEGER) - parseInt(b.getAttribute(\"priority\") || Number.MAX_SAFE_INTEGER));\n });\n\n if (jGroups.length > 0 && WA.ToolBarInit.state() === \"resolved\") {\n if (objectListWidth < toolbarWidth) {\n //Сворачиваем\n for (var i = 0; i < jGroups.length; i++) {\n group = WA.CR.toolBar.groups[jGroups.eq(i).attr(\"name\")];\n var stop = true;\n do {\n stop = group.fold(GROUP_FOLD_MODE.AUTO);\n objectListWidth = global.getObjectListWidth(jToolBar);\n toolbarWidth = global.getToolbarWidth(jToolBar);\n } while (stop && objectListWidth < toolbarWidth);\n };\n } else {\n //Разворачиваем\n var i = jGroups.length - 1;\n for (i; i >= 0; i--) {\n group = WA.CR.toolBar.groups[jGroups.eq(i).attr(\"name\")];\n var stop = true;\n do {\n stop = group.unfold(GROUP_FOLD_MODE.AUTO);\n objectListWidth = global.getObjectListWidth(jToolBar);\n toolbarWidth = global.getToolbarWidth(jToolBar);\n while (objectListWidth < toolbarWidth) {\n group.fold(GROUP_FOLD_MODE.AUTO);\n break;\n }\n } while (stop && objectListWidth > toolbarWidth);\n };\n };\n setRealHeightAndWidth();\n };\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Активирует кнопку тулбара, если в списке объектов выделено только [count] записей.\n * @since 5.0.0.4200\n * @function Core.toolBars.main.enableButtonOnItemsSelect\n */\n global.enableButtonOnItemsSelect = function (toolItem, count) {\n $.when(WA.ObjectListInit).done(function () {\n WA.current.objectList\n .bind('onSelect', function (last, allItems) {\n if (allItems.length === count) toolItem.enable();\n else toolItem.disable();\n })\n .bind(\"onChange\", function (selectedItems, allItems) {\n if (selectedItems.length === count) toolItem.enable();\n else toolItem.disable();\n });\n });\n\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Активирует кнопку тулбара, если в списке объектов выделена более count записей.\n * @since 5.0.0.4200\n * @function Core.toolBars.main.enableButtonOnItemsSelectGt\n */\n global.enableButtonOnItemsSelectGt = function (toolItem, count) {\n $.when(WA.ObjectListInit).done(function () {\n WA.current.objectList\n .bind('onSelect', function (last, allItems) {\n if (allItems.length > count) toolItem.enable();\n else toolItem.disable();\n })\n .bind(\"onChange\", function (selectedItems, allItems) {\n if (selectedItems.length > count) toolItem.enable();\n else toolItem.disable();\n });\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Активирует галочку выделения всех записей,\n * если в списке объектов выделена более count записей.\n * @since 5.0.0.4200\n * @function Core.toolBars.main.enableCheckBoxOnItemsSelect\n */\n global.enableCheckBoxOnItemsSelect = function () {\n var jCheckAll = $('#chkAll');\n $.when(WA.ObjectListInit).done(function () {\n WA.current.objectList.bind('onSelect', function (last, allItems) {\n if (allItems.length > 0) jCheckAll.prop('checked', true);\n else jCheckAll.prop('checked', false);\n });\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выполняет действие callback для первого веделенного элемента.\n * @since 5.0.0.4200\n * @function Core.toolBars.main.processFirstSelectedItem\n */\n global.processFirstSelectedItem = function (callback) {\n var items = WA.CR.objectList.getSelectedItems();\n if (items.length > 0) {\n var item = items[0];\n if ($.isFunction(callback)) callback.call(this, { id: item.id, kind: item.kind, refcode: item.referenceCode });\n };\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выполняет действие callback для текущего открытого объекта.\n * @since 5.0.0.4216\n * @function Core.toolBars.main.processCurrentObject\n */\n global.processCurrentObject = function (callback) {\n // Находимся в карточке.\n var kind = WA.CR.getKind();\n if (!!kind && $.isFunction(callback)) {\n callback.call(this, {\n id: WA.CR.getID(),\n kind: kind,\n refcode: WA.CR.getReferenceCode()\n });\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Активирует кнопку \"Открыть карточку\" и меняет название группы \"Объект\".\n * @since 5.0.0.4219\n * @function Core.toolBars.main.enableObjectCardBtn\n */\n global.enableObjectCardBtn = function (toolItem) {\n if (toolItem.groupName === 'TOOLBAR_ACTIONS_WITH_OBJECT_GROUP') {\n $.when(WA.ToolBarInit).done(function () {\n var mode = GetParamInURL('mode').toLowerCase();\n if (mode == 'search') {\n var searchName = GetParamInURL('searchname').toLowerCase();\n var groupName;\n switch (searchName) {\n case 'srchdoc': groupName = 'TOOLBAR_ACTIONS_WITH_DOCUMENT_GROUP'; break;\n case 'srchjob': groupName = 'TOOLBAR_ACTIONS_WITH_JOB_GROUP'; break;\n case 'srchtask': groupName = 'TOOLBAR_ACTIONS_WITH_TASK_GROUP'; break;\n default: groupName = 'TOOLBAR_ACTIONS_WITH_OBJECT_GROUP';\n }\n } else if (mode == 'attachedtotask') {\n groupName = 'TOOLBAR_ACTIONS_WITH_TASK_GROUP';\n } else {\n groupName = 'TOOLBAR_ACTIONS_WITH_OBJECT_GROUP';\n }\n WA.current.toolBar.groups.TOOLBAR_ACTIONS_WITH_OBJECT_GROUP.setLabel(L(groupName));\n });\n }\n return global.enableButtonOnItemsSelect(toolItem, 1);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Выполняет действие \"Открыть карточку\".\n * @since 5.0.0.4200\n * @function Core.toolBars.main.openObjectCard\n */\n global.openObjectCard = function () {\n Core.toolBars.main.processFirstSelectedItem(ShowObjectCard);\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выполняет действие \"Копировать объект\".\n * @since 5.0.0.4200\n * @function Core.toolBars.main.copyObject\n */\n global.copyObject = function () {\n Core.toolBars.main.processFirstSelectedItem(function (proxy) {\n switch (proxy.kind.toLowerCase()) {\n case 'edoc':\n proxy.tr = $('#' + proxy.id);\n EDocument(proxy).CopyDoc();\n break;\n case 'ref':\n Reference_CopyRecord(proxy.refcode, proxy.id)\n break;\n default:\n ShowError(L('ERR_UNSUPPORTED_METHOD'));\n }\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Активирует кнопку, если выбран документ или запись справочника (используется для кнопок \"Копировать объект\" и \"Связанные документы\").\n * @since 5.0.0.4207\n * @function Core.toolBars.main.enableButtonForDocOrRefRecord\n */\n global.enableButtonForDocOrRefRecord = function (toolItem) {\n $.when(WA.ObjectListInit).done(function () {\n WA.current.objectList.bind('onSelect', function (last, allItems) {\n if (allItems.length === 1) {\n Core.toolBars.main.processFirstSelectedItem(function (proxy) {\n var kindLowered = proxy.kind.toLowerCase();\n // Копирвоание обеъекта работает только для документа и записи справочника.\n if (kindLowered === 'edoc' || kindLowered === 'ref') {\n toolItem.enable();\n } else {\n toolItem.disable();\n }\n });\n } else {\n toolItem.disable();\n }\n });\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выполняет действие \"История\".\n * @since 5.0.0.4200\n * @function Core.toolBars.main.openObjectHistory\n */\n global.openObjectHistory = function () {\n Core.toolBars.main.processFirstSelectedItem(function (proxy) {\n ShowObjectCard(proxy, 'view=History&mode=read');\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выполняет действие \"Вложено в задачи\".\n * @since 5.0.0.4200\n * @function Core.toolBars.main.showAttachedToTasks\n */\n global.showAttachedToTasks = function () {\n Core.toolBars.main.processFirstSelectedItem(function (proxy) {\n var lowerKind = proxy.kind.toLowerCase();\n if (lowerKind === 'edoc' || lowerKind === 'ref') {\n // Открываем в карточке.\n ShowObjectCard(proxy, 'view=AttachedTasks');\n } else {\n //Открывается в проводнике.\n ShowAttachedToTasks(proxy);\n };\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выполняет действие \"Находится в папках\".\n * @since 5.0.0.4200\n * @function Core.toolBars.main.showInsideFolders\n */\n global.showInsideFolders = function () {\n Core.toolBars.main.processFirstSelectedItem(function (proxy) {\n var lowerKind = proxy.kind.toLowerCase();\n if (lowerKind === 'edoc') {\n // Открываем в карточке.\n ShowObjectCard(proxy, 'view=PlacedInFolders');\n } else {\n //Открывается в проводнике.\n ShowInsideFolders(proxy);\n };\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выполняет действие \"Связанные документы\".\n * @since 5.0.0.4207\n * @function Core.toolBars.main.showBoundDocuments\n */\n global.showBoundDocuments = function () {\n Core.toolBars.main.processFirstSelectedItem(function (proxy) {\n ShowObjectCard(proxy, 'view=BoundDocuments')\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Выполняет действие \"Связанные документы\".\n * @since 5.0.0.4207\n * @function Core.toolBars.main.showBoundDocuments\n */\n global.showBoundDocuments = function () {\n Core.toolBars.main.processFirstSelectedItem(function (proxy) {\n ShowObjectCard(proxy, 'view=BoundDocuments')\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отправляет объект proxy вложением.\n * @since 5.0.0.4200\n * @function Core.toolBars.main.sendAsAttachment\n */\n global.sendAsAttachment = function (proxy) {\n window.WA.services.task.createTaskWithAttachments([{ 'ID': proxy.id, 'Kind': proxy.kind, 'CompCode': proxy.refcode }]).success(function (res) {\n window.open(\"Task.aspx?view=Card&mode=edit&id=\" + res, \"task\" + res);\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Открывает содержимое папки, переданной в виде прокси объекта.\n * @since 5.2.0.2006\n * @function Core.toolBars.main.openFolderContent\n */\n global.openFolderContent = function (proxy) {\n if (proxy.kind == 'FOL') {\n var folderContentUrl = \"\";\n if (!$.isEmptyObject(WA.EXT))\n folderContentUrl = \"explorer.aspx?ext=\" + WA.EXT.current.name + \"&ID=\" + proxy.id;\n else\n folderContentUrl = \"explorer.aspx?ID=\" + proxy.id;\n window.open(folderContentUrl);\n }\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверяет находимся ли мы в режиме поиска в проводнике или нет.\n * @since 5.0.0.4206\n * @function Core.toolBars.main.isSearchMode\n */\n global.isSearchMode = function () {\n var mode = GetParamInURL('mode').toLowerCase();\n return (mode == 'search' || mode === 'placedin' || mode === 'attachedtotask' || mode == \"lastobjects\");\n };\n\n /**\n * Проверяет находимся ли мы в режиме интегрированного поиска (поиск по связи с объектом) в проводнике или нет.\n * @since 5.0.0.4206\n * @function Core.toolBars.main.isIntegratedSearchMode\n */\n global.isIntegratedSearchMode = function () {\n var mode = GetParamInURL('mode').toLowerCase();\n return (mode === 'placedin' || mode === 'attachedtotask');\n };\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверяет выделен ли объект во втором уровне иерархии?\n * @since 5.0.0.4212\n */\n var isSelectedSecondLevelInRelationTree = function () {\n if (WA.ObjectListInit.state() === \"resolved\" && !!WA.CR.objectList) {\n var items = WA.current.objectList.getSelectedItems();\n for (var i = 0; i < items.length; i++) {\n if (items[i]._jObject.parents('.SubBounds').length > 0) {\n return true;\n }\n }\n }\n return false;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Активирует кнопки \"Вырезать ссылки\" и \"Удалить ссылки\".\n * @since 5.0.0.4203\n * @function Core.toolBars.main.enableCutAndDeleteLinksBtn\n */\n global.enableCutAndDeleteLinksBtn = function (toolItem) {\n $.when(WA.ObjectListInit).done(function () {\n WA.current.objectList.bind('onSelect', function (last, allItems) {\n if (!global.isSearchMode() && allItems.length > 0 && !isSelectedSecondLevelInRelationTree()) {\n toolItem.enable();\n } else {\n toolItem.disable();\n }\n });\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Активирует/деактивирует кнопку \"Вставить ссылки\" при наступлении события смены папки.\n * @since 5.5.0.9067\n * @function Core.toolBars.main.enablePasteLinksBtnOnFolderChange\n */\n global.enablePasteLinksBtnOnFolderChange = function (toolItem) {\n WA.current.objectList.bind('onChange', function () {\n Core.toolBars.main.enablePasteLinksBtn(this);\n }, toolItem);\n Core.toolBars.main.enablePasteLinksBtn(toolItem);\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Активирует/деактивирует кнопку \"Вставить ссылки\".\n * @since 5.0.0.4203\n * @function Core.toolBars.main.enablePasteLinksBtn\n */\n global.enablePasteLinksBtn = function (toolItem) {\n var isSearch = global.isSearchMode();\n var currFolIsReadolny = $('#CurrentFolderIsReadonlyRights').val() === 'True';\n if (isSearch || currFolIsReadolny) {\n toolItem.disable();\n } else {\n toolItem.enable();\n }\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Действие на кнопку \"Вставить ссылки\" во вкладке \"Связанные документы\".\n * @since 5.0.0.4216\n * @function Core.toolBars.main.pasteBoundsInTab\n */\n global.pasteBoundsInTab = function (toolItem) {\n var id = WA.current.getID();\n\n if (WA.getLocation() == \"doc\") {\n PasteLinks('EDOCUMENT', '' + id);\n } else if (WA.getLocation() == \"reference\") {\n BindToRecord('' + id, WA.current.getReferenceCode());\n }\n\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Действие на кнопку \"Удалить ссылки\" во вкладке \"Связанные документы\".\n * @since 5.0.0.4216\n * @function Core.toolBars.main.deleteBoundsInTab\n */\n global.deleteBoundsInTab = function (toolItem) {\n var id = WA.current.getID();\n\n if (WA.getLocation() == \"doc\") {\n DeleteLinks('&docid=' + id);\n } else if (WA.getLocation() == \"reference\") {\n UnBindFromRecord('' + id, WA.current.getReferenceCode());\n }\n\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Делает не активной кнопку \"Отправить задачей\", если открыта папка \"Ярлыки\".\n * @since 5.1.0.1518\n * @function Core.toolBars.main.enableSendAsTaskAttachment\n */\n global.enableSendAsTaskAttachment = function (toolItem) {\n if (WA.CR.getKind() === 'FOL' && WA.CR.FolderType === FOLDER_TYPE.SHORTCUTS) {\n toolItem.disable();\n } else {\n toolItem.enable();\n };\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Действие на кнопку \"Создать и вложить\" в карточках ЗЗУ.\n * @since 5.1.0.1522\n * @function Core.toolBars.main.createAndAttach\n */\n global.createAndAttach = function () {\n var popup;\n var dialog = new WA.CMP.dialogs.CreateDocument();\n dialog.bind('loaded', function (data) {\n // Изменяем имя папки за имя ЗЗУ, в которую будет вставлен документ.\n $('#pasteInLabel').text(L('ATTACH_IN'));\n $('#new_txtFolder').text($('.card-header__label').text().trunc(50));\n });\n dialog.bind('ok', function (data) {\n var pleaseWait = new WA.URL('/PleaseWait.aspx');\n pleaseWait.setParam('message', L('PLEASE_WAIT_EDOCUMENT'));\n var rnd = Math.floor(Math.random() * 10000).toString();\n popup = pleaseWait.open('wnd' + rnd);\n });\n dialog.bind('create', function (document) {\n var docUrl = document.toURL();\n docUrl.setParam('mode', 'new');\n docUrl.setParam('cwid', WA.CR.ID);\n docUrl.setParam('cwtype', WA.getLocation());\n docUrl.openIn(popup);\n });\n dialog.bind('error', function (message) {\n popup.close();\n })\n dialog.show()\n\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Активирует кнопку тулбара, если в списке объектов выделена хотя бы она запись с заданным типом.\n * @since 5.5.0.9000\n * @function Core.toolBars.main.enableButtonOnJobSelected\n */\n global.enableButtonOnObjectTypeSelected = function (toolItem, type) {\n $.when(WA.ObjectListInit).done(function () {\n WA.current.objectList\n .bind('onSelect', function (last, allItems) {\n var objects = allItems.filter(function (value) { return value.kind === type });\n if (objects.length > 0 && objects.length === allItems.length) {\n toolItem.enable();\n }\n else\n toolItem.disable();\n })\n .bind(\"onChange\", function (selectedItems, allItems) {\n var objects = selectedItems.filter(function (value) { return value.kind === type });\n if (objects.length > 0 && objects.length === allItems.length) {\n toolItem.enable();\n }\n else\n toolItem.disable();\n });\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.Core.toolBars.main);\n","\"use strict\";\n\n(function (global) {\n // Доступные статусы.\n var availableStatuses = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Purple', 'Completed', 'Clean'];\n // Регулярка для извлечения статуса по имени css-класса.\n var statusNameInClassRX = /um(.+)/i;\n\n /**\n * @inner\n * Получает имя картинки статуса по его названию.\n */\n var getStatusIconByStatusName = function (statusName, opt_normalClean) {\n if (statusName == 'Clean' && opt_normalClean !== true) return 'status-20';\n else return 'um' + statusName;\n };\n\n /**\n * Изменение иконки статуса в тулбаре.\n * @inner\n */\n var changeStatusToolbarButtonIconByEl = function (toolItemEl, statusName) {\n if (!!toolItemEl) {\n window.WA.current.toolBar.buttons[$(toolItemEl).attr('name')].setIcon(getStatusIconByStatusName(statusName));\n }\n };\n\n // Сохраняет новый статус в БД.\n var setUserStatus = function (statusName, toolItemEl, afterChangeCallback, isForList) {\n // скроем меню.\n ContextMenu.hide();\n\n if (isForList) {\n massSetUserStatus(statusName, window.WA.CR.objectList.getSelectedItems(), afterChangeCallback);\n } else {\n // Находимся в карточке.\n global.processCurrentObject(function (obj) {\n window.WA.services.entity.setUserStatus(obj, statusName).success(function () {\n if (afterChangeCallback) afterChangeCallback(obj, statusName);\n });\n });\n }\n };\n\n var massSetUserStatus = function (statusName, items, afterChangeCallback) {\n // Находимся в списке.\n if (window.WA.current.objectList._isAllSelected) {\n // Проверим поиск это или нет. Если поиск, то нельзя устанавливать статусы всех объектов.\n if (GetParamInURL(\"mode\") === '') {\n // Выделенны все объекты в папке.\n var folderId = WA.current.getID();\n // Отправим запрос на изменнение статуса на сервер.\n window.WA.services.folder.setStatusForAllObjects(folderId, statusName).success(function () {\n var items = window.WA.CR.objectList.getSelectedItems();\n for (var i = 0; i < items.length; i++) {\n var item = items[i];\n // Пропускаем записи справочника.\n if (item.kind.toUpperCase() !== 'REF') {\n if (afterChangeCallback) afterChangeCallback({ id: item.id, kind: item.kind }, statusName);\n }\n }\n });\n } else {\n ShowError(L('ERR_CAN_NOT_CHANGE_OBJECTS_USER_STATUS_IN_SEARCH_RESULT'));\n }\n } else {\n // Выделенны НЕ все объекты в папке.\n for (var i = 0; i < items.length; i++) {\n var obj = { id: items[i].id, kind: items[i].kind };\n // Пропускаем записи справочника.\n if (obj.kind.toUpperCase() !== 'REF') {\n var succFunc = (function (obj) { // для предотвращения замыкания obj в цикле.\n return function () {\n if (afterChangeCallback) afterChangeCallback(obj, statusName);\n };\n })(obj);\n window.WA.services.entity.setUserStatus(obj, statusName).success(succFunc);\n };\n };\n };\n };\n\n /**\n * Обновляет стасус у элемента списка объектов.\n * @since 5.0.0.4200\n * @function Core.toolBars.main.updateStatusInList\n */\n global.updateStatusInList = function (obj, statusName) {\n // сменим картинку статуса.\n var statusEl = $('#' + obj.id).find('.status:first');\n if (statusEl.length > 0) {\n statusEl.removeClass(function (index, classes) {\n var reg = new RegExp(\"um.+\", \"i\");\n var matches = classes.match(reg);\n if (!!matches) {\n return (matches.join(' '));\n } else {\n return '';\n }\n }).addClass('um' + statusName);\n }\n return global;\n };\n\n // Отображает меню выбора статуса.\n var showStatusContextMenu = function (toolItem, afterChangeCallback, isForList) {\n var userStatusMenu = getUserStatusMenu();\n userStatusMenu.width = 150;\n userStatusMenu.shiftY = 37;\n $.each(userStatusMenu.items, function () {\n var statusName = this.id;\n this.name = 'SetStatus';\n this.onClick = function () { setUserStatus(statusName, toolItem, afterChangeCallback, isForList); };\n })\n userStatusMenu.items[userStatusMenu.items.length - 2].bottomSeparator = true;\n $.extend(userStatusMenu, selectToolbarBtnOnShowContextMenu(toolItem));\n userStatusMenu.show(toolItem);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отображает меню для изменения стасуса для текущего объекта.\n * @since 5.0.0.4200\n * @function Core.toolBars.main.openStatusContextMenu\n */\n global.openStatusContextMenu = function (toolItem, afterChangeCallback) {\n showStatusContextMenu(toolItem, afterChangeCallback, false);\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отображает меню для изменения стасуса для первого выделенного объекта.\n * @since 5.0.0.4216\n * @function Core.toolBars.main.openStatusContextMenu\n */\n global.openStatusContextMenuForList = function (toolItem, afterChangeCallback) {\n showStatusContextMenu(toolItem, afterChangeCallback, true);\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Получает статус у элемента.\n var getStatusOfItem = function (itemEl) {\n var statusEl = itemEl.find('.status:first');\n if (statusEl.length > 0) {\n // Выделяем имя статуса из названия класса. um<Название>\n var matches = statusNameInClassRX.exec(statusEl.attr('class'));\n if (!!matches && matches.length > 0) {\n return matches[1];\n }\n }\n return null;\n };\n\n /**\n * Инициализация кнопки смены статуса.\n * @since 5.0.0.4200\n * @function Core.toolBars.main.statusButtonForListOnInit\n */\n global.statusButtonForListOnInit = function (toolItem) {\n $.when(window.WA.ObjectListInit).done(function () {\n window.WA.current.objectList.bind('onSelect', function (last, allItems) {\n if (allItems.length > 0) {\n toolItem.enable();\n\n // Находимся в списке.\n if (window.WA.current.objectList._isAllSelected) {\n // Выделенны все объекты в папке.\n toolItem.setIcon(getStatusIconByStatusName('Clean'));\n // В результатах поиска делаем кнопку не активной.\n if (GetParamInURL(\"mode\") !== '') {\n toolItem.disable();\n }\n } else {\n // Получаем все выбранные элементы списка.\n var statusName = null;\n var items = window.WA.CR.objectList.getSelectedItems();\n\n // Если выбраны только записи справочника, то кнопку дизэйблим.\n var isSelectedOnlyReferences = true;\n for (var i = 0; i < items.length; i++) {\n if (items[0].kind.toUpperCase() !== 'REF') {\n isSelectedOnlyReferences = false;\n break;\n }\n }\n if (isSelectedOnlyReferences) {\n toolItem.disable();\n toolItem.setIcon(getStatusIconByStatusName('Clean'));\n return global;\n }\n }\n } else {\n toolItem.disable();\n toolItem.setIcon(getStatusIconByStatusName('Clean'));\n }\n });\n });\n return global;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Определяем общий статус, что бы правильно изменить иконку в риббоне.\n var getStatusNameForItems = function (items) {\n var statusName = null;\n for (var i = 0; i < items.length; i++) {\n var elStatusName = getStatusOfItem($('#' + items[i].id));\n if (!!elStatusName) {\n if (statusName === null) statusName = elStatusName;\n if (statusName !== elStatusName) {\n statusName = 'Clean';\n break;\n }\n }\n }\n if (statusName === null) statusName = 'Clean';\n return statusName;\n };\n\n\n /**\n * Отображаем меню статусов в виде горизонтальной полоски.\n * @since 5.0.0.4200\n * @function Core.toolBars.main.showHorizontalStatusContextMenu\n */\n global.showHorizontalStatusContextMenu = function (generalMenu, menuIconEl, objs, isRightButton) {\n var items;\n if ($.isArray(objs)) {\n items = objs;\n } else {\n items = [objs];\n }\n\n var itemsStatus = getStatusNameForItems(items);\n\n // Формируем элементы меню.\n var menuitems = [];\n for (var i = 0; i < availableStatuses.length; i++) {\n var text = L('CHANGE_STATUS') + ': ' + (L(\"USER_STATUS_\" + availableStatuses[i].toUpperCase()).toLowerCase());\n menuitems.push({\n name: availableStatuses[i],\n text: text,\n image: getStatusIconByStatusName(availableStatuses[i], true),\n imageCSSClass: availableStatuses[i],\n selected: (availableStatuses[i] === itemsStatus)\n });\n }\n\n\n // Генерируем меню.\n var menuId = 'statusesCM';\n var menu = new window.WebAccess.components.menus.OnlyIconsContextMenu(menuIconEl, menuitems, {}, menuId, isRightButton);\n\n menu.render();\n menu.bind('itemSelect', function (item) {\n\n if (Core.isStatisticEnabled) {\n ///Запись в статистику\n WA.CR.statistics.write({\n page: WA.getLocation(),\n action: (items.length > 1 ? 'Mass' : '') + 'SetStatus',\n area: 'OnlyIconsContextMenu',\n target: (items.length > 1 ? 'Mass' : (isRightButton ? items[0].tr.get(0) : menuIconEl.get(0)))\n });\n };\n\n var statusName = item.name;\n massSetUserStatus(statusName, items, function (obj, statusName) {\n global.updateStatusInList(obj, statusName);\n });\n ContextMenu.hide();\n });\n\n // Отображаем внутри обычного контекстного меню.\n\n var oldOnShow = generalMenu.onShow;\n\n generalMenu.shiftY = -25;\n generalMenu.onShow = function () {\n if ($.isFunction(oldOnShow)) oldOnShow();\n menu.jMenu.css({ 'margin-bottom': '10px' });\n menu.showIn($('#mainContextMenuContainer'), true);\n };\n\n\n return menu;\n };\n\n\n})(window.Core.toolBars.main);","(function referenceToolbarActions(global) {\n \"use strict\";\n\n /**\n * Навешивает контекстное меню фильтра по текущему периоду.\n * @since 5.0.0.1904\n * @function Core.toolBars.main.createCurrentPeriodFilterMenu\n */\n global.createCurrentPeriodFilterMenu = function (btn, onPeriodSet, opt_placementContext, opt_needDisableChangeCurrentPeriod) {\n var items = [];\n var needDisableChangeCurrentPeriod = opt_needDisableChangeCurrentPeriod || false;\n\n var isCurrentPeriodRequired = $(\"#toolbar_container\")\n .find('span')\n .data('currentperiodisrequired') === 'True';\n var isSelected = btn.isSelected() || isCurrentPeriodRequired;\n if (isCurrentPeriodRequired) {\n btn._jObject.addClass('selected');\n }\n items.push({\n name: 'toggle',\n label: L('CURRENT_PERIOD_TOGGLE'),\n tooltip: L('SET_INTERVAL_ACTION_HINT'),\n icon: 'filterPeriod-16',\n selected: isSelected,\n onCreate: function (item) {\n item.selected = btn.isSelected() || isCurrentPeriodRequired;\n },\n disabled: isCurrentPeriodRequired\n });\n items.push({\n name: 'change',\n label: L('CHANGE_CURRENT_PERIOD'),\n tooltip: L('CURRENT_PERIOD_ACTION_HINT'),\n icon: 'calendar-16',\n disabled: needDisableChangeCurrentPeriod\n });\n var settings = {\n shiftY: 37\n };\n $.extend(settings, selectToolbarBtnOnShowContextMenu(btn._jObject));\n var cm = new WA.components.menus.BaseContextMenu(btn.selector, items, settings);\n cm.render();\n cm.bind(\"itemSelect\", function (item) {\n switch (item.name) {\n case 'toggle':\n ToggleCurrentPeriod($(btn.selector), onPeriodSet, opt_placementContext);\n break;\n case 'change':\n SetCurrentPeriod(onPeriodSet);\n break;\n }\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * @function SetCurrentPeriod - действие по кнопке \"Изменить период\".\n * @param {function} onPeriodSet - callback установки текущего периода.\n */\n function SetCurrentPeriod(onPeriodSet) {\n\n // Тип периода, определяет, на какой момент времени относительно текущего накладывается период.\n var CURRENT_PERIOD_TYPE = {\n CURRENT: '0',\n PREVIOUS: '1',\n SLIDING: '2',\n CUSTOM: '3'\n };\n\n // Длина периода, определяет протяжённость действия текущего периода.\n var CURRENT_PERIOD_LENGTH = {\n MONTH: '0',\n QUARTER: '1',\n YEAR: '2',\n CUSTOM: '3'\n };\n\n\n var dialog = (new WA.CMP.dialogs.BaseDialog())\n .showCancelButton()\n .setSpinner()\n .show();\n\n\n // Форма текущего периода.\n var form = {\n\n // Реквизиты формы.\n requisites: {},\n\n // Рендеринг HTML-кода формы.\n renderAsync: function () {\n var currentPick = new WebAccess.components.forms.requisites.Pick();\n var currentPickData = {\n id: 'currentPeriod_currentPick',\n uniqueID: 'currentPeriod_currentPick',\n values: $.toJSON([\n [CURRENT_PERIOD_LENGTH.MONTH, L('MONTH'), L('MONTH')],\n [CURRENT_PERIOD_LENGTH.QUARTER, L('QUARTER'), L('QUARTER')],\n [CURRENT_PERIOD_LENGTH.YEAR, L('YEAR'), L('YEAR')]\n ]),\n selectedValue: L('MONTH'),\n selectedKey: CURRENT_PERIOD_LENGTH.MONTH,\n styleClass: '',\n isReadOnly: true\n };\n\n var previousPick = new WebAccess.components.forms.requisites.Pick();\n var previousPickData = {\n id: 'currentPeriod_previousPick',\n uniqueID: 'currentPeriod_previousPick',\n values: $.toJSON([\n [CURRENT_PERIOD_LENGTH.MONTH, L('MONTH'), L('MONTH')],\n [CURRENT_PERIOD_LENGTH.QUARTER, L('QUARTER'), L('QUARTER')],\n [CURRENT_PERIOD_LENGTH.YEAR, L('YEAR'), L('YEAR')]\n ]),\n selectedValue: L('MONTH'),\n selectedKey: CURRENT_PERIOD_LENGTH.MONTH,\n styleClass: '',\n isReadOnly: true\n };\n\n var lastDays = $.Deferred();\n var lastDaysHtml = '';\n lastDays.resolve(lastDaysHtml);\n\n var beginDateData = {\n id: 'currentPeriod_beginDate',\n value: '',\n showTime: false\n };\n var endDateData = {\n id: 'currentPeriod_endDate',\n value: '',\n showTime: false\n };\n\n return $.when(\n currentPick.renderAsync(currentPickData),\n previousPick.renderAsync(previousPickData),\n lastDays,\n WA.templates.render('formBuilder/date.compile.html', beginDateData),\n WA.templates.render('formBuilder/date.compile.html', endDateData)\n ).then(function (currentPickHtml, previousPickHtml, lastDaysHtml, beginDateHtml, endDateHtml) {\n return WA.templates.render('components/currentPeriod.compile.html', {\n currentPickLabel: L('CURRENT'),\n currentPickHtml: currentPickHtml,\n previousPickLabel: L('PREVIOUS'),\n previousPickHtml: previousPickHtml,\n lastDaysLabel: L('LAST'),\n lastDaysLabelEnd: L('DAYS'),\n lastDaysHtml: lastDaysHtml,\n periodLabel: L('PERIOD'),\n beginDateLabel: L('FROM'),\n beginDateHtml: beginDateHtml,\n endDateLabel: L('TO'),\n endDateHtml: endDateHtml\n });\n });\n },\n\n // Инициализация реквизитов. \n init: function (jForm) {\n var me = this;\n me.jForm = jForm;\n\n jForm.find('input#currentPeriod_lastDays').autoNumeric('init', { mDec: '0', aPad: false });\n\n me.requisites = {\n 'Current': new WebAccess.components.wrappers.form.requisites.Pick('Current', 'currentPeriod_currentPick'),\n 'Previous': new WebAccess.components.wrappers.form.requisites.Pick('Previous', 'currentPeriod_previousPick'),\n 'LastDays': new WebAccess.components.wrappers.form.requisites.Integer('LastDays', 'currentPeriod_lastDays'),\n 'BeginDate': new WebAccess.components.wrappers.form.requisites.Date('BeginDate', 'currentPeriod_beginDate'),\n 'EndDate': new WebAccess.components.wrappers.form.requisites.Date('EndDate', 'currentPeriod_endDate')\n };\n\n // По умолчанию все дизэйблим.\n for (var reqName in me.requisites) {\n me.requisites[reqName].disable();\n }\n\n jForm.find('input[name=currentPeriodType]').click(function () {\n me.setType($(this).val());\n });\n },\n\n // Установить тип текущего периода.\n setType: function (type) {\n var me = this;\n for (var reqName in me.requisites) {\n me.requisites[reqName].disable();\n }\n\n me.jForm.find('input[name=currentPeriodType]').prop('checked', false);\n me.jForm.find('input[value=' + type + ']').prop('checked', true);\n\n switch (type) {\n case 'previous':\n me.requisites.Previous.enable();\n break;\n case 'sliding':\n me.requisites.LastDays.enable();\n break;\n case 'custom':\n me.requisites.BeginDate.enable();\n me.requisites.EndDate.enable();\n break;\n case 'current':\n default:\n me.requisites.Current.enable();\n break;\n }\n },\n\n // Получить тип текущего периода.\n getType: function () {\n return this.jForm.find('input[name=currentPeriodType]').filter(':checked').val();\n },\n\n // Установить значение реквизита.\n setValue: function (reqName, value) {\n this.requisites[reqName].setValue(value);\n },\n // Получить значение реквизита.\n getValue: function (reqName) {\n return this.requisites[reqName].getValue();\n },\n // Проверка валидности формы.\n isValid: function () {\n return true;\n }\n\n };\n\n $.when(form.renderAsync(), WA.SRV.call('/Session.asmx/GetCurrentPeriod')).done(function(html, period) {\n var period = period[0];\n\n dialog.setTitle(L('CURRENT_PERIOD_SET'));\n dialog.setHtml(html);\n\n form.init(dialog._jContent);\n\n // Устанавливаем значения на форме.\n var type = period.PeriodType;\n switch ('' + type) {\n case CURRENT_PERIOD_TYPE.PREVIOUS:\n form.setType('previous');\n form.setValue('Previous', '' + period.PeriodLength);\n break;\n\n case CURRENT_PERIOD_TYPE.SLIDING:\n form.setType('sliding');\n form.setValue('LastDays', period.PeriodLength);\n break;\n\n case CURRENT_PERIOD_TYPE.CUSTOM:\n form.setType('custom');\n form.setValue('BeginDate', period.Period.AsString[0]);\n form.setValue('EndDate', period.Period.AsString[1]);\n break;\n\n case CURRENT_PERIOD_TYPE.CURRENT:\n default:\n form.setType('current');\n form.setValue('Current', '' + period.PeriodLength);\n }\n BindHelpIcoClickOnModalWindow('CurrentPeriod');\n });\n\n dialog.ok = function () {\n if (form.isValid() === false) return false;\n\n var type, days, begin, end;\n // Сохраняем текущий период по значениям с формы.\n var formType = form.getType();\n switch (formType) {\n case 'previous':\n type = CURRENT_PERIOD_TYPE.PREVIOUS;\n days = form.getValue('Previous');\n break;\n case 'sliding':\n type = CURRENT_PERIOD_TYPE.SLIDING;\n days = form.getValue('LastDays');\n if ((!days) || (days == '') || (days == '0'))\n days = 1;\n if (days > 10000)\n days = 10000;\n if (days < 1)\n days = 1;\n break;\n case 'custom':\n type = CURRENT_PERIOD_TYPE.CUSTOM;\n begin = form.getValue('BeginDate');\n end = form.getValue('EndDate');\n break;\n case 'current':\n default:\n type = CURRENT_PERIOD_TYPE.CURRENT;\n days = form.getValue('Current');\n };\n\n var setCurrentPeriodService;\n if (type === CURRENT_PERIOD_TYPE.CUSTOM) {\n setCurrentPeriodService = WA.SRV.call(\"/Session.asmx/SetCurrentPeriod\", {\n PerionBegin: begin,\n PeriodEnd: end\n });\n } else {\n setCurrentPeriodService = WA.SRV.call(\"/Session.asmx/SetCurrentPeriodByType\", {\n CurrentPeriodType: +type,\n CurrentPeriodLength: +days\n });\n }\n\n setCurrentPeriodService.done(function () {\n if ($.isFunction(onPeriodSet)) {\n // Сбросить выделение\n Core.grid.reference.grid.setSelectedRows([]);\n\n onPeriodSet(dialog);\n } else {\n UnbindBeforeUnload();\n window.location.reload();\n }\n });\n return false;\n };\n }\n\n /**\n * @function ToggleCurrentPeriod - действие по кнопке \"Фильтр по периоду\"\n * @param {object} btn - кнопка включение/отключения текущего периода.\n * @param {function} onPeriodSet - callback установки текущего периода.\n * @param {string} opt_placementContext - контекст, в рамках которого происходит установка фильтрации.\n */\n function ToggleCurrentPeriod(btn, onPeriodSet, opt_placementContext) {\n $(btn).toggleClass('selected');\n var isEnabled = $(btn).hasClass('selected');\n var location = WA.getLocation();\n CallService(\"/Session.asmx/EnableCurrentPeriod\", {\n Enable: isEnabled,\n Location: location,\n PlacementContext: opt_placementContext || ''\n }, function (res) {\n // Если все сохранилось, то убираем спинер\n HideTopSpinner(\"\", 1);\n if (res.Success) {\n if ($.isFunction(onPeriodSet)) {\n // Сбросить выделение\n Core.grid.reference.grid.setSelectedRows([]);\n\n onPeriodSet();\n } else {\n UnbindBeforeUnload();\n window.location.reload();\n }\n } else {\n ErrorShow(res.Error, true);\n }\n });\n }\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.Core.toolBars.main);","(function referenceToolbarActions(global) {\r\n \"use strict\";\r\n\r\n /**\r\n * Состояние кнопки \"Область группироки\".\r\n * @since 5.0.0.4209\r\n * @function Core.toolBars.reference.selectFilterButton\r\n */\r\n global.selectFilterButton = function (toolItem) {\r\n $(function () {\r\n if (Core.grid.reference && Core.grid.reference.state) {\r\n var selected = Core.grid.reference.state.IsFilterPanelVisible;\r\n if (selected) toolItem.select();\r\n }\r\n });\r\n return global;\r\n };\r\n\r\n global.toggleFilterPanel = function (el) {\r\n var jButton = $(el);\r\n if (jButton.hasClass(\"disabled\")) return;\r\n\r\n var isEnabled = jButton.hasClass(\"selected\");\r\n if (isEnabled) {\r\n jButton.removeClass(\"selected\");\r\n } else {\r\n jButton.addClass(\"selected\");\r\n };\r\n\r\n Core.grid.reference.toggleFiltering(!isEnabled);\r\n };\r\n\r\n global.selectUseArchiveDataButton = function (toolItem) {\r\n var RefName = WA.CR.getReferenceCode();\r\n var RefView = WA.CR.getReferenceView();\r\n WA.SRV.call(\"/Reference.asmx/GetArchiveDataShowing\", { ReferenceName: RefName, ReferenceView: RefView }).done(function (enabled) {\r\n if (enabled) toolItem.select();\r\n });\r\n return global;\r\n };\r\n\r\n global.toggleUseArchiveDataPanel = function (btn) {\r\n var isEnabled = $(btn).hasClass('selected');\r\n if (!isEnabled) {\r\n WA.CR.toolBar.buttons[btn.getAttribute('name')].select();\r\n } else {\r\n WA.CR.toolBar.buttons[btn.getAttribute('name')].unSelect();\r\n }\r\n var RefName = WA.CR.getReferenceCode();\r\n var RefView = WA.CR.getReferenceView();\r\n WA.SRV.call(\"/Reference.asmx/SetArchiveDataShowing\", { Enabled: !isEnabled, ReferenceName: RefName, ReferenceView: RefView })\r\n Core.grid.reference.reloadData()\r\n };\r\n\r\n /**\r\n * Состояние кнопки \"Область группироки\".\r\n * @since 5.0.0.4209\r\n * @function Core.toolBars.reference.enableDeleteRecordBtn\r\n */\r\n global.selectGroupButton = function (toolItem) {\r\n $(function () {\r\n if (Core.grid.reference && Core.grid.reference.state) {\r\n var selected = Core.grid.reference.state.IsGroupPanelVisible;\r\n if (selected) toolItem.select();\r\n }\r\n });\r\n return global;\r\n };\r\n\r\n global.toggleGroupPanel = function (el) {\r\n var jButton = $(el);\r\n if (jButton.hasClass(\"disabled\")) return;\r\n\r\n var isEnabled = jButton.hasClass(\"selected\");\r\n if (isEnabled) {\r\n jButton.removeClass(\"selected\");\r\n } else {\r\n jButton.addClass(\"selected\");\r\n };\r\n\r\n Core.grid.reference.toogleGrouping(!isEnabled);\r\n };\r\n\r\n global.autoAdjustColumnWidth = function (el) {\r\n var jButton = $(el);\r\n if (jButton.hasClass(\"disabled\")) return;\r\n\r\n var isEnabled = jButton.hasClass(\"selected\");\r\n if (isEnabled) {\r\n jButton.removeClass(\"selected\");\r\n } else {\r\n jButton.addClass(\"selected\");\r\n };\r\n\r\n Core.grid.reference.autoAdjustColumnWidth(!isEnabled);\r\n };\r\n\r\n /**\r\n * Окно выбора отображаемых колонок\r\n */\r\n global.selectVisibleColumns = function () {\r\n var columns = Core.grid.reference.getColumnsForDialog();\r\n\r\n var visibleColumns = Core.grid.reference.getVisibleColumnsForDialog();\r\n //var visibleColumnsIds = _(visibleColumns).pluck('id');\r\n\r\n var dialog = new WebAccess.components.dialogs.SelectableMultiSelect(columns, visibleColumns).bind(\"selectComplete\", function (newVisibleColumns) {\r\n // var removedColumns = _.difference(visibleColumnsIds, _(newVisibleColumns).pluck('id'));\r\n // Core.grid.reference.unGroupColumnsById(removedColumns);\r\n\r\n Core.grid.reference.setVisibleColumnsFromDialog(newVisibleColumns);\r\n });\r\n\r\n dialog.title = L(\"GRID_VISIBLE_COLUMNS\");\r\n dialog.filterPlaceholder = L(\"GRID_SEARCH_IN_COLUMNS\");\r\n dialog.availableItemslabel = L(\"GRID_ALL_COLUMNS\");\r\n dialog.selectedItemslabel = L(\"GRID_SELECTED_COLUMNS\");\r\n dialog.isShowCancelButton = true;\r\n dialog.show();\r\n\r\n BindHelpIcoClickOnModalWindow('VisibleColumns');\r\n\r\n /* } else {\r\n ShowError(L('ERR_UNEXPECTED_ERROR'));\r\n }*/\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Доступность кнопки \"Удалить запись справочника\".\r\n * @since 5.0.0.4209\r\n * @function Core.toolBars.reference.enableDeleteRecordBtn\r\n */\r\n global.enableDeleteRecordBtn = function (toolItem) {\r\n var hasRights = ($('#HasUserRightsForDeleteRefRec').val() === 'True');\r\n if (hasRights) {\r\n Core.toolBars.main.enableButtonOnItemsSelectGt(toolItem, 0);\r\n } else {\r\n toolItem.disable();\r\n }\r\n return global;\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n* Доступность кнопки \"Копировать запись справочника\".\r\n* @since 5.4.1.1002\r\n* @function Core.toolBars.reference.enableCopyRecordBtn\r\n*/\r\n global.enableCopyRecordBtn = function (toolItem) {\r\n var hasRights = ($('#HasUserRightsForCopyRefRec').val() === 'True');\r\n if (hasRights) {\r\n Core.toolBars.main.enableButtonOnItemsSelectGt(toolItem, 0);\r\n } else {\r\n toolItem.disable();\r\n }\r\n return global;\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Выполняет действие \"Удалить запись справочника\".\r\n * @since 5.0.0.4200\r\n * @function Core.toolBars.reference.DeleteRecord\r\n */\r\n global.DeleteRecord = function () {\r\n if (WA.getLocation() === \"referencerecords\") {\r\n DeleteSelectedRecords();\r\n }\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Навешивает контекстное меню текущего фильтра.\r\n * @since 5.0.0.4200\r\n * @function Core.toolBars.reference.ShowCurrentFilterMenu\r\n */\r\n global.CreateCurrentFilterMenu = function (btn) {\r\n if (!!Filters.menuItems) {\r\n Filters.contextMenuElementSelector = btn.selector;\r\n Filters.createReferenceMenu(btn.selector, Filters.menuItems);\r\n }\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Устанавливает выделенности кнопки \"Текущий фильтр\".\r\n * @since 5.0.0.4200\r\n * @function Core.toolBars.reference.SetCurrentFilterState\r\n */\r\n global.SetCurrentFilterState = function () {\r\n if (!!Filters.contextMenuElementSelector) {\r\n if (Core.grid.reference.state.CurrentFilter.Expression == '') {\r\n $(Filters.contextMenuElementSelector).removeClass('selected')\r\n } else {\r\n $(Filters.contextMenuElementSelector).addClass('selected')\r\n };\r\n };\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Callback срабатываемый после изменения текущего периода.\r\n * @since 5.0.0.4200\r\n * @function Core.toolBars.reference.PeriodSetCallback\r\n * @param {object} dialog - диалог установки фильтра по текущему периоду.\r\n */\r\n global.PeriodSetCallback = function (dialog) {\r\n Core.grid.reference.reloadData();\r\n if (Core.grid.reference.updateFooter) {\r\n Core.grid.reference.updateFooter();\r\n }\r\n // Изменяем заголовок страницы.\r\n appendCurrentPeriodInPageTitle();\r\n\r\n if (dialog) dialog.close()\r\n };\r\n\r\n // Добавление интервала дат текущего периода в заголовок страниц..\r\n function appendCurrentPeriodInPageTitle() {\r\n var jObjectName = $(\".card-header__label\");\r\n var refCaption = jObjectName.data('pluraltitle');\r\n var def = $.Deferred();\r\n\r\n var isEnabled = WA.CR.toolBar.buttons['ToggleCurrentPeriod'].isSelected();\r\n if (isEnabled) {\r\n WA.SRV.call('/Session.asmx/GetCurrentPeriod').done(function (period) {\r\n var serverBegin = period.Period.AsString[0];\r\n var serverEnd = period.Period.AsString[1];\r\n if (!serverBegin || !serverEnd) {\r\n def.resolve(refCaption);\r\n } else {\r\n def.resolve(refCaption + ', ' + serverBegin + ' - ' + serverEnd);\r\n }\r\n });\r\n } else {\r\n def.resolve(refCaption);\r\n }\r\n\r\n def.always(function (caption) {\r\n document.title = caption;\r\n jObjectName.text(caption);\r\n });\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Нужно ли дизэйблить смену текущего периода.\r\n * @since 5.4.0.1012\r\n * @function Core.toolBars.reference.needDisableChangeCurrentPeriod\r\n */\r\n global.needDisableChangeCurrentPeriod = function () {\r\n // Дизэйблим кнопку \"Изменить период\" при вызове справчоника в модальном диалоге потому, что так в билдере.\r\n //Support ORPB\tВ общем это легаси код, почему так сказать сложно.\r\n //Support ORPB\tВозможно смысл тут в том, что мы если выбираем, то выбираем куда-то и смысла менять текущий период тут нет.\r\n return global.getReferenceContext().toLowerCase().indexOf('modal') !== -1;\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Опеределяет текущий контекст.\r\n * @since 5.4.0.1012\r\n * @function Core.toolBars.reference.getReferenceContext\r\n */\r\n global.getReferenceContext = function () {\r\n return Core.grid.getPlacementContext();\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Экспорт записей в CSV.\r\n * @since 5.0.0.4200\r\n * @function Core.toolBars.reference.ExportRecords\r\n */\r\n global.ExportRecords = function (btn) {\r\n WA.SRV.call('/Reference.asmx/ExportRecordsToExcel', {\r\n Params: $.toJSON(Core.grid.reference.state)\r\n }).done(function (guid) {\r\n if (WA.agent.isAvailable()) {\r\n WA.agent.isPluginAvailable(\"edmsplugin\").done(function (isPluginAvailable) {\r\n if (isPluginAvailable && WA.agent.isSessionInitialized()) {\r\n RequestToken(TOKEN_OPERATION.DOWNLOAD_DOCUMENT_BODY, function (token) {\r\n var requestParams = {\r\n id: guid,\r\n Token: token,\r\n Repository: \"FileSystem\",\r\n DownloadTool: \"Handler\",\r\n loc: document.location.host,\r\n name: WA.CR.ReferenceCode\r\n };\r\n WA.agent.transmitRequest(\"opendocument\", \"edmsplugin\", requestParams).fail(function (response) {\r\n ShowError(response.message);\r\n });\r\n });\r\n } else {\r\n download();\r\n }\r\n }).fail(function () {\r\n download();\r\n });\r\n } else {\r\n download();\r\n }\r\n\r\n function download() {\r\n var url = new WA.URL('/download.ashx');\r\n url.setParam('accesstype', 'private');\r\n url.setParam('id', guid);\r\n url.setParam('name', WA.CR.ReferenceCode);\r\n url.open();\r\n }\r\n }).fail(function (res) {\r\n var severity = (res.Severity !== \"-1\" ? Number(res.Severity) : undefined);\r\n WA.CR.inlineHint.show(res.Error, undefined, severity);\r\n });\r\n };\r\n\r\n\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n})(window.Core.toolBars.reference);","\"use strict\";\r\n\r\n(function (global) {\r\n\r\n /**\r\n * Навешивает меню на кнопку \"Выполнить\" для заданий.\r\n * @since 5.2.0.1500\r\n * @function Core.toolBars.job.initPerformButton\r\n */\r\n global.initPerformButton = function () {\r\n var button = $('div[name=JobDoIt]');\r\n var spanText = $('span:first', button);\r\n spanText.after('');\r\n button.removeAttr('onclick');\r\n\r\n var menu_items = [];\r\n var choices = fillJobChoiceText();\r\n for (var i = 0; i < choices.length; ++i) {\r\n menu_items.push({\r\n text: choices[i].DisplayName,\r\n onClick: (function (performResult) { // замыкание для корректной передачи choices[i], т.к. переменная i меняется в цикле\r\n return function () {\r\n global.performResult(performResult);\r\n }\r\n })(choices[i])\r\n });\r\n }\r\n var additionalSettings = selectToolbarBtnOnShowContextMenu(button);\r\n var menu = new ContextMenu(menu_items, {\r\n shiftX: 0,\r\n shiftY: 38,\r\n width: \"auto\",\r\n cssClass: \"performs-context-menu\",\r\n onShow: function () {\r\n if (button.hasClass('disabled')) {\r\n ContextMenu.hide();\r\n return false;\r\n }\r\n additionalSettings.onShow();\r\n },\r\n onHide: function () {\r\n additionalSettings.onHide();\r\n }\r\n });\r\n button.contextMenu(menu);\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n // Проверяет наличие параметров ТМ.\r\n function ExecuteBeforeQueryParamsEvent(performResultCode) {\r\n var jActiveText;\r\n if (WA.isMobile()) {\r\n jActiveText = $('.textarea');\r\n } else {\r\n jActiveText = $('.Job_Edit_Text_Area_Control').filter('textarea');\r\n }\r\n var activeText = jActiveText.val();\r\n\r\n return WA.SRV.call('/Job.asmx/ExecuteBeforeQueryParamsEvent', {\r\n JobID: WA.CR.ID,\r\n PerformResultName: performResultCode,\r\n ActiveText: (activeText) ? activeText : \"\"\r\n }).done(function (r) {\r\n jActiveText.val(r.newActiveText);\r\n });\r\n }\r\n\r\n //Выполнение задания с результатами выполнения и запрашиваемыми параметрами.\r\n function JobWFSetResult(el) {\r\n UnbindBeforeUnload();\r\n $(\"#__RESULT_VAR\").val(el.id);\r\n // Вызвать событие \"До запроса параметров\", если по ТМ и означено.\r\n WebAccess.Job.fireAll(\"ParamAsking\", function () { DoAction('__POSTBACK_ACTION=AcceptWfVar', true) });\r\n }\r\n\r\n //Выполнение задания с результатами выполнения без запрашиваемых параметров.\r\n function JobWFParams(el) {\r\n UnbindBeforeUnload();\r\n $(\"#__RESULT_VAR\").val(el.id);\r\n\r\n WebAccess.Job.fireAll(\"ParamAsking\", function () {\r\n if (GetParamInURL(\"op\") != \"\") {\r\n DoAction('__POSTBACK_ACTION=ShowParams', true, RemoveParamInURL($('form:first').attr('action'), 'op'));\r\n } else {\r\n DoAction('__POSTBACK_ACTION=ShowParams', true);\r\n }\r\n });\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n /**\r\n * Действие на кнопку \"Выполнить\" для заданий.\r\n * @since 5.2.0.1500\r\n * @function Core.toolBars.job.perform\r\n */\r\n global.perform = function (event) {\r\n if (!CheckIsWf()) {\r\n // Задание не по ТМ.\r\n ConfirmDialogNew(L(\"CONFIRM_JOB_PERFORM\"), function () {\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=ApproveWf', true);\r\n });\r\n } else {\r\n if (ResultNotEmpty()) {\r\n // Есть результаты выполнения.\r\n DoItAdditionalAction(event);\r\n } else {\r\n ConfirmDialogNew(L(\"CONFIRM_JOB_PERFORM\"), function () {\r\n // Нет результатов выполнения.\r\n ExecuteBeforeQueryParamsEvent('').done(function (r) {\r\n if (r.hasAskableParams) {\r\n // Есть запрашиваемые параметры.\r\n JobWFParamsEmptyResult();\r\n } else {\r\n // Нет запрашиваемых параметров.\r\n JobWFSetEmptyResult();\r\n }\r\n });\r\n });\r\n }\r\n }\r\n };\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n //Выполнение задания без результатов выполнения, но с запрашиваемыми параметрами.\r\n function JobWFParamsEmptyResult() {\r\n UnbindBeforeUnload();\r\n WebAccess.Job.fireAll(\"ParamAsking\", function () {\r\n if (GetParamInURL(\"op\") != \"\") {\r\n DoAction('__POSTBACK_ACTION=ShowParams', true, RemoveParamInURL($('form:first').attr('action'), 'op'));\r\n } else {\r\n DoAction('__POSTBACK_ACTION=ShowParams', true);\r\n }\r\n });\r\n }\r\n\r\n //Выполнение задания без результатов выполнения и без запрашиваемыми параметрами.\r\n function JobWFSetEmptyResult() {\r\n UnbindBeforeUnload();\r\n // Вызвать событие \"До запроса параметров\", если по ТМ и означено.\r\n WebAccess.Job.fireAll(\"ParamAsking\", function () { DoAction('__POSTBACK_ACTION=AcceptWfEmpty', true); });\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Кнопка \"Выполнить с результатом выполнения\" для заданий.\r\n * @since 5.2.0.1500\r\n * @function Core.toolBars.job.performResult\r\n */\r\n global.performResult = function (performResult) {\r\n ConfirmDialogNew(L(\"CONFIRM_JOB_PERFORM_RESULT\", performResult.DisplayName), function () {\r\n ExecuteBeforeQueryParamsEvent(performResult.Name).done(function (r) {\r\n if (r.hasAskableParams) {\r\n JobWFParams({ id: performResult.Index });\r\n } else {\r\n JobWFSetResult({ id: performResult.Index });\r\n }\r\n });\r\n });\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Кнопка \"Выполнить с результатом выполнения\" для заданий.\r\n * @since 5.2.0.1500\r\n * @function Core.toolBars.job.performResultInMobile\r\n */\r\n global.performResultInMobile = function (resultEl) {\r\n global.performResult({\r\n Name: $(resultEl).text(),\r\n Index: resultEl.id\r\n });\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n // Отображение вариантов выполнения.\r\n function DoItAdditionalAction() {\r\n var isMobile = $('html').hasClass('mobile');\r\n if (isMobile) {\r\n var m = $(\"table.AddActions\");\r\n m.find('td').empty().html(fillJobChoiceText());\r\n m.show();\r\n } else {\r\n // Тут нет, т.к. в основной версии кнопка переопределяется и при нажатии выводится контекстное меню.\r\n }\r\n }\r\n\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n})(window.Core.toolBars.job);","\"use strict\";\r\n\r\n(function (global) {\r\n\r\n /**\r\n * Функции отвечающие за работу пенелей инструментов\r\n * @namespace Core.toolbars\r\n * @since 5.0.0.4102\r\n */\r\n global.footer = {};\r\n})(window.Core);\r\n\r\n\r\n(function (global) {\r\n var g_ContentFilterTimeout;\r\n\r\n /**\r\n * Создание контекстного меню для смены представления, с обложки, на список.\r\n * @function Core.footer.initViewSwitchingMenu\r\n * @since 5.0.0.4200\r\n * @return {Core.footer}\r\n */\r\n global.initViewSwitchingMenu = WA.tryCatchDecorator(function () {\r\n var currentView = $(\"#current_view\");\r\n var menuItems = currentView.data(\"menu\");\r\n if (currentView.length > 0) {\r\n var menu = new WA.CMP.menus.BaseContextMenu(\"#current_view\", menuItems);\r\n menu.render();\r\n menu.bind(\"itemSelect\", function (item) {\r\n switchView(item.name);\r\n });\r\n };\r\n\r\n function switchView(viewmode) {\r\n var url = new WA.URL();\r\n var folderTitle = window.document.title;\r\n var showCover = false;\r\n var fpath = url.getParam('fpath');\r\n\r\n switch (viewmode) {\r\n case 'cover':\r\n url.removeParam('cover');\r\n showCover = true;\r\n break;\r\n default:\r\n url.setParam('cover', '0');\r\n }\r\n\r\n // Записать в историю переход.\r\n var state = {\r\n type: 'explorer',\r\n folderID: WA.CR.getID(),\r\n path: fpath,\r\n title: window.document.title,\r\n hasCover: showCover,\r\n hasCoverOnly: false\r\n };\r\n WA.history.pushState(state, folderTitle, url.asString());\r\n }\r\n\r\n return global;\r\n });\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n\r\n /**\r\n * Создание контекстного меню для смены расширения.\r\n * @function Core.footer.initExtensionsMenu\r\n * @since 5.0.0.4200\r\n * @return {Core.footer}\r\n */\r\n global.initExtensionsMenu = WA.tryCatchDecorator(function () {\r\n var selector = \"#extensions_label\"\r\n if ($(selector).length > 0) {\r\n\r\n var items = [];\r\n var extension = {};\r\n\r\n for (var name in WA.extensions) {\r\n if (name !== \"current\") {\r\n extension = WA.extensions[name];\r\n items.push({\r\n \"name\": extension.name,\r\n 'label': extension.title,\r\n 'icon': \"/App_Sprites/\" + extension.icon\r\n });\r\n };\r\n };\r\n\r\n var settings = {\r\n width: 250\r\n };\r\n\r\n var menu = new WA.CMP.menus.BaseContextMenu(selector, items, settings);\r\n menu.render();\r\n menu.bind(\"itemSelect\", function (item) {\r\n WA.EXT[item.name].setAsCurrent();\r\n });\r\n };\r\n return global;\r\n });\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Поле быстрой фильтрации списка объектов.\r\n * @function Core.footer.initFastSearchFilter\r\n * @since 5.0.0.4200\r\n * @return {Core.footer}\r\n */\r\n global.initFastSearchFilter = WA.tryCatchDecorator(function () {\r\n var jFastSearch = $('#FastSearch');\r\n var clearButton = jFastSearch.parent().children('.input-with-button__button');\r\n var currFldWidth;\r\n\r\n // При нажатии на кнопку очистки поля ввода фильтра нам не нужно, чтобы отрабатывал blur на jFastSearch\r\n // Потеря фокуса с элемента jFastSearch приведет к изменению его размера\r\n clearButton.mousedown(function (event) {\r\n event.preventDefault();\r\n clearButton.removeClass('input-with-button__clear_active');\r\n jFastSearch.val('');\r\n updateFolderListItems();\r\n });\r\n\r\n setInlineHint();\r\n resetFilterInputWidth();\r\n\r\n // Если изменяется размер окна, то сбрасываем размер поля.\r\n $(window).on(\"resizeEnd\", function () {\r\n if (jFastSearch.val()) {\r\n updateFilterInputWidth();\r\n }\r\n });\r\n\r\n // Вычислить размер поля.\r\n jFastSearch.click(function () {\r\n if (!jFastSearch.val()) {\r\n $(\".current-folder__name\").hide();\r\n $(\".current-folder__arrow\").hide();\r\n\r\n updateFilterInputWidth();\r\n }\r\n }).bind('blur', function () {\r\n if (!jFastSearch.val()) resetFilterInputWidth();\r\n }).bind('keyup blur', function () {\r\n updateFolderListItems();\r\n }).bind('keydown', function (event) {\r\n return onFilterInputKeyDown(event);\r\n }).bind('keyup', function (event) {\r\n return onFilterInputKeyUp(event);\r\n });\r\n return global;\r\n\r\n // Функция для обновления ширины поля фильтрации.\r\n function updateFilterInputWidth() {\r\n var filterAreaWidth = $(\".filtration-area\").width();\r\n var checkAllWidth = $(\".filtration-panel__check-all\").outerWidth();\r\n if (!currFldWidth) {\r\n currFldWidth = $(\".current-folder\").outerWidth();\r\n }\r\n var filterDropdownWidth = $(\".sort-filter-area\").outerWidth();\r\n\r\n $(\".filtration-panel__fast-search\").outerWidth(filterAreaWidth - checkAllWidth - currFldWidth - filterDropdownWidth);\r\n }\r\n\r\n // Функция для обновления списка элементов текущей папки, удовлетворяющих фильтру.\r\n function updateFolderListItems() {\r\n var f = jFastSearch.val();\r\n\r\n // Быстрый фильтр\r\n if (f != oldf) {\r\n var names = $(\"#QFilter input[id*='FilterVariantsNoLoc']\").val();\r\n clearTimeout(g_ContentFilterTimeout);\r\n g_ContentFilterTimeout = setTimeout(function () {\r\n FilterEDMSContent(regionID, f, names);\r\n $(\"#chkAll\").attr('checked', false);\r\n }, 300);\r\n oldf = f;\r\n }\r\n }\r\n\r\n // Функция возвращения размера поля к исходному значению, если в нем нет данных.\r\n function resetFilterInputWidth() {\r\n $(\".current-folder__name\").show();\r\n $(\".current-folder__arrow\").show();\r\n $(\".filtration-panel__fast-search\").css(\"width\", \"\");\r\n }\r\n\r\n // Функция-обработчик нажатия клавиши в поле ввода фильтра.\r\n function onFilterInputKeyDown(event) {\r\n var code = event.which;\r\n switch (code) {\r\n // Чтобы нажатие Enter в быстрой фильтрации не приводило к сабмиту формы.\r\n case $.ui.keyCode.ENTER:\r\n event.preventDefault();\r\n return false;\r\n // Чтобы нажатие Esc очищало значение в поле ввода.\r\n case $.ui.keyCode.ESCAPE:\r\n event.preventDefault();\r\n if (jFastSearch.is(\":focus\")) {\r\n clearButton.trigger('mousedown');\r\n } else {\r\n jFastSearch.val('');\r\n jFastSearch.trigger('blur');\r\n }\r\n return false;\r\n default:\r\n return true;\r\n }\r\n }\r\n\r\n // Функция-обработчик отпускания клавиши в поле ввода фильтра. Показывает крестик очистки поля фильтра, если в поле есть значение.\r\n function onFilterInputKeyUp(event) {\r\n if (jFastSearch.val()) clearButton.addClass('input-with-button__clear_active');\r\n else clearButton.removeClass('input-with-button__clear_active');\r\n }\r\n });\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Заголовок текущей папки.\r\n * @function Core.footer.initCurrentFolder\r\n * @since 5.5.0.9000\r\n * @return {Core.footer}\r\n */\r\n global.initCurrentFolder = WA.tryCatchDecorator(function () {\r\n var jCurrentFolder = $('.current-folder');\r\n var jCurrentFolderArrow = jCurrentFolder.find('.current-folder__arrow');\r\n\r\n // Убрать иконку стрелочки если мы в поиске.\r\n toogleCurrentFolderArrow();\r\n\r\n jCurrentFolder.on('click contextmenu', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (!Core.toolBars.main.isSearchMode()) {\r\n $(this).attr(\"kind\", \"current_fol\");\r\n $(this).attr(\"id\", WA.CR.ID);\r\n ShowContextMenu($(this), {}, { 'left': e.pageX, 'top': e.pageY }, true);\r\n }\r\n return false;\r\n });\r\n\r\n // Обновление содержимого окна.\r\n WA.history.bind(WA.history.EVENT.CHANGE_STATE, toogleCurrentFolderArrow);\r\n\r\n function toogleCurrentFolderArrow() {\r\n if (Core.toolBars.main.isSearchMode()) {\r\n jCurrentFolderArrow.hide();\r\n } else {\r\n jCurrentFolderArrow.show();\r\n }\r\n }\r\n\r\n });\r\n\r\n})(window.Core.footer);\r\n","\"use strict\";\n\n(function (globalFooter) {\n\n var AGENT_NOT_STARTED_OR_NOT_INSTALLED_TEMPLATE = '/components/agentNotStarted.html'; // Скомпилированные шаблоны не позволяют использовать функцию L\n\n\n var AgentNotStartedWidget = WA.components.dialogs.FloatDialog.extend({\n\n // Конструктор.\n init: function (args) {\n var me = this;\n me._super('agentNotStartedWidget', {\n showMinimizeButton: false,\n showCloseButton: false,\n minimized: true,\n hidden: true,\n title: L('WEBACCESS_AGENT_NAME'),\n loadingText: L('WAITING_AGENT_TEXT')\n });\n\n me.bind(me['class'].EVENT.AFTER_CLOSE, function () {\n WA.cache.setItem(\"agent.dontShowAgentNotStartedWidget\", \"1\");\n });\n\n // Инициализировать обработку событий обновления.\n me._initUpdateHandling();\n },\n\n _createHtml: function () {\n var me = this;\n\n me._super();\n\n //// Когда отрендерятся шаблон, создаем из них DOM элементы.\n //$.when(WA.templates.render(AGENT_NOT_STARTED_OR_NOT_INSTALLED_TEMPLATE)).done(function (agentNotStartedMessage) {\n // me.setContentAsHtml(agentNotStartedMessage, function () {\n // me._jContent.find('.agent-not-started__button_start').on('click', function () {\n // me.onStart();\n // return false;\n // });\n // me._jContent.find('.agent-not-started__button_download').on('click', function () {\n // me.onDownload();\n // return false;\n // });\n // });\n //});\n },\n\n show: function () {\n // Не показываем диалог, если пользователь его уже закрывал.\n this._super();\n },\n\n onStart: function () {\n var me = this;\n\n // Сворачиваем виджет и пишем «Запуск агента…»\n me.setMinimized(true);\n me.setTitle(L('AGENT_WAITING_START'));\n\n log.info('AGENT', 'Agent starting by URL scheme...');\n Core.agent.start().done(function () {\n log.info('AGENT', 'Agent started');\n me.fire(me['class'].EVENT.AFTER_START);\n }).fail(function (err) {\n me.setMinimized(false);\n me.setTitle(L('WEBACCESS_AGENT_NAME'));\n me.setContent(err);\n });\n },\n\n onDownload: function () {\n var me = this;\n log.info('AGENT', 'Agent downloading...');\n WA.agent.download().done(function (platform) {\n me.fire(me['class'].EVENT.AFTER_DOWNLOAD, platform);\n }).fail(function () {\n me.fire(me['class'].EVENT.AFTER_DOWNLOAD, null);\n });\n },\n\n // Обработка событий обновления агента.\n _initUpdateHandling: function () {\n var me = this;\n Core.agent.beforeUpdating(function () { me._beforeUpdating(); });\n Core.agent.onUpdating(function (progress) { me._onUpdating(progress); });\n Core.agent.afterUpdating(function () { me._afterUpdating(); });\n Core.agent.onFailUpdating(function () { me._onFailUpdating(); });\n\n log.info('AGENT', 'Agent updating handlers was initalized');\n },\n\n // До начала процесса обновления.\n _beforeUpdating: function () {\n var me = this;\n me.show();\n me.setMinimized(false);\n log.info('AGENT', 'Agent before updating was triggered');\n me.setTitle(L('WEBACCESS_AGENT_NAME'));\n me.showLoader(L('AGENT_IS_BEING_UPDATED'));\n },\n // В процессе обновления.\n _onUpdating: function (progress) {\n log.info(\"AGENT\", \"Agent updating status: \" + progress);\n },\n // После обновления.\n _afterUpdating: function () {\n var me = this;\n me.setMinimized(true);\n me.hide();\n },\n // Если обновление завершилось с ошибкой. \n _onFailUpdating: function () {\n var me = this;\n\n me.setMinimized(false);\n me.setTitle(L('WEBACCESS_AGENT_NAME'));\n me.setContent(L(\"AGENT_UPDATING_WAS_FAILED\"));\n },\n // Отключить обработчики событий обновления агента.\n _unbindUpdateHandlers: function () {\n var me = this;\n Core.agent.unbind(Core.agent.EVENT.BEFORE_UPDATING);\n Core.agent.unbind(Core.agent.EVENT.ON_UPDATING);\n Core.agent.unbind(Core.agent.EVENT.AFTER_UPDATING);\n Core.agent.unbind(Core.agent.EVENT.ON_FAIL_UPDATING);\n }\n\n }, {\n EVENT: $.extend({\n // Событие срабатывает после старта агента.\n AFTER_START: 'start',\n\n // Событие срабатывает после скачивания агента.\n AFTER_DOWNLOAD: 'download'\n }, WA.CMP.dialogs.FloatDialog.EVENT)\n });\n\n\n\n\n // ---------------------------------------------------------------------------------------------------\n // Public functions\n // ---------------------------------------------------------------------------------------------------\n var agentNotStartedWidget = new AgentNotStartedWidget()\n globalFooter.agentNotStartedWidget = agentNotStartedWidget;\n\n})(window.Core.footer);","\"use strict\";\n\n(function (globalFooter) {\n\n var FLOAT_DIALOG_TEMPLATE = '/layouts/FloatDialog.compile.html';\n var AGENT_NOT_STARTED_OR_NOT_INSTALLED_TEMPLATE = '/components/agentNotStartedOrNotInstalled.html'; // Скомпилированные шаблоны не позволяют использовать функцию L\n var TITLE_TEMPLATE = '{title}({count})';\n var CONTENT_TEMPLATE = '
    {content}
    ';\n\n var OpenedDocumentsWidget = WA.components.dialogs.FloatDialog.extend({\n\n // Конструктор.\n init: function (args) {\n var me = this;\n\n me._super('openedDocumentsWidget', {\n title: L('OPENED_DOCUMENTS_TITLE'),\n showMinimizeButton: true,\n minimized: true,\n showCloseButton: false,\n isLoading: true,\n hidden: true,\n loadingText: L('OPENED_DOCUMENTS_LOADING_TEXT')\n });\n\n me.setMinimized(true);\n me._requestGetOpenedDocuments();\n me._startGetOpenedDocumentsTimer(5); //5 сек.\n },\n\n // Запускает таймер получения редактируемых документов.\n _startGetOpenedDocumentsTimer: function (intervalInSec) {\n var me = this;\n setTimeout(function () {\n me._requestGetOpenedDocuments();\n me._startGetOpenedDocumentsTimer(intervalInSec);\n }, intervalInSec * 1000);\n },\n\n // Отправляет запрос к агенту для получения списка редактируемых документов, а потом обрабатывает его.\n _requestGetOpenedDocuments: function () {\n var me = this;\n\n WA.agent.edms.getOpenedDocuments().done(function (docs) {\n // Агент ответил, проверим изменились ли данные.\n if ($.toJSON(docs) != $.toJSON(me._prevDocs)) {\n var count = docs.length;\n if (count) {\n // Если есть неотслеживаемые документы, то раскрыть список. Иначе - свернуть. \n if (!me.isUserExpanded() || me.isMinimized()) {\n me.setMinimized(!_.some(docs, function(doc) { return !doc.IsObservable; }));\n }\n\n me.getOpenedDocumentsListComponentHtml(docs).done(function (content, js) {\n var titleHtml = format(TITLE_TEMPLATE, { title: L('OPENED_DOCUMENTS_TITLE'), count: count });\n me.setTitleAsHtml(titleHtml);\n\n var wrappedContent = format(CONTENT_TEMPLATE, { content: content });\n me.setContentAsHtml(wrappedContent, function () {\n if (js) {\n var f = new Function(js);\n setTimeout(function() {\n f.apply(window);\n\n // Делаем недоступным контекстное меню для элементов виджета\n var jOpenDocumentList = me._jContent.find('#OpenedDocumentList');\n var tr = jOpenDocumentList.children('div.folder_item');\n tr.unbind('contextmenu.entitylist');\n // Отключаем обработку клика по иконке\n tr.find(\".object-list-item__icon\").off('click.entitylist');\n }, 10);\n }\n });\n me._prevDocs = docs;\n }).fail(function(message) {\n me.setContent(L('WARN_CANNOT_RETRIEVE_OPENED_DOCUMENTS'));\n me._prevDocs = null;\n }).always(function() {\n me.show();\n });\n } else {\n me.hide();\n }\n }\n }).fail(function () {\n me.hide();\n me.setContent(\"\");\n me._prevDocs = null;\n });\n },\n\n // Получает компоненту \n getOpenedDocumentsListComponentHtml: function (docs) {\n var def = $.Deferred();\n\n if (docs.length > 0) {\n CallService(\"/ModalWindow.asmx/Create\", {\n ControlName: \"OPENEDDOCUMENTSLIST\",\n Params: $.toJSON({\n \"Documents\": $.toJSON(docs)\n })\n }, function(res) {\n if (res.Success && res.Result.html) {\n def.resolve(res.Result.html, res.Result.initJs);\n } else {\n def.resolve(L(\"NO_OPENED_DOCUMENTS\"), null);\n }\n }, function(message) {\n def.reject(message);\n });\n } else {\n def.resolve(L(\"NO_OPENED_DOCUMENTS\"), null);\n }\n\n return def;\n }\n });\n\n\n\n // ---------------------------------------------------------------------------------------------------\n // Public functions\n // ---------------------------------------------------------------------------------------------------\n globalFooter.openedDocumentsWidget = (function () {\n var openedDocumentsWidget = null;\n\n return {\n /**\n * Инициализировать виджет открытых документов. \n * \n * @method Core.footer.openedDocumentsWidget.init\n */\n init: function () {\n openedDocumentsWidget = new OpenedDocumentsWidget();\n },\n\n /**\n * Обновить виджет открытых документов. \n * \n * @method Core.footer.openedDocumentsWidget.update\n */\n update: function () {\n if (openedDocumentsWidget) \n openedDocumentsWidget._requestGetOpenedDocuments();\n }\n };\n })();\n\n})(window.Core.footer);","\"use strict\";\n\n(function (global) {\n\n global.dropping = {\n droppable: \".Fol_obj, .List.EDoc_obj, .List.Job_obj, .List.Task_obj\",\n jDroppbable: null,\n\n /**\n * Проверка возможности вставки ссылок указанного типа в папку с\n * указанным типом.\n * @function Core.dropping.isfolderAcceptObject\n * @since 5.1.0.1523\n * @return {boolean}\n */\n isfolderAcceptObject: function (folderType, objectType) {\n if (!folderType) return false;\n //Приведенные ниже числа -это значения глбального перечисления OBJECT_TYPE\n var associations = {\n '1': [0, 1],\n '2': [0, 2],\n '3': [0, 3],\n '5': [0, 1, 2, 3, 5, 9]\n }\n return associations[folderType].indexOf(objectType) !== -1\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * ОБработка нажатия клавиши CTRL\n * @method Core.dropping.enableCopyButton\n * @return {Integer} id\n * @since 5.1.0.1523\n */\n enableCopyButton: function (event, ui) {\n var jObject = $('.movedStack');\n if (event.ctrlKey) {\n Core.dropping.isCopyKeyPressed = true;\n jObject.addClass('cursorCopy');\n }\n else {\n Core.dropping.isCopyKeyPressed = false;\n jObject.removeClass('cursorCopy');\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение id элемента в дереве\n * @method Core.dropping.getTreeItemId\n * @return {Integer} id\n * @since 5.1.0.1523\n */\n getTreeItemId: function (jObject) {\n return jObject.find('a').attr('id').replace('f','');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение id родителя элемента в дереве\n * @method Core.dropping.getTreeItemParentId\n * @return {Integer} id\n * @since 5.1.0.1523\n */\n getTreeItemParentId: function (id) {\n if (WA.FC.folders.isRootFolder(id)) return id;\n return $(\"#f\" + id).parents('ul').first().parents('.collapsable').first().find('.Fol_obj:first').find('a').attr('id').replace('f', '');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение ссылок перемещаемых объектов\n * @function Core.dropping.getDraggingLinks\n * @since 5.1.0.1523\n * @return {WA.Link[]} список ссылок\n */\n getDraggingLinks: function (jDraged) {\n var me = this;\n var links = [];\n if (jDraged.is('span')) {\n //Папка из дерева папок\n links = [new WA.Link(me.getTreeItemId(jDraged), OBJECT_TYPE.FOLDER)];\n } else {\n //Объект из списка объектов\n\n links = WA.CR.objectList.getSelectedItems();\n }\n return links;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Настройка элементов, В(!) которые можно перетаскивать\n * @function Core.dropping.dropSetup\n * @since 5.1.0.1523\n * @return {Core.dropping}\n */\n init: function () {\n var me = this;\n log.info('DRAG&DROP', 'Init dropable');\n\n me.jDroppbable = $(me.droppable).not('drop_binded');\n\n var settings = {\n accept: function (jDraged) {\n var allow = false;\n var jReciever = $(this);\n\n //Игнорируем все элементы кроме объектов из спика и дерева папок\n if (!jDraged.is('div.List') && !jDraged.is('span.Fol_obj')) return;\n\n var links = me.getDraggingLinks(jDraged);\n var recieverType = me.getObjectType(jReciever)\n\n /**\n * Разрешаем вставлять в соответствующие папки\n */\n if (recieverType === OBJECT_TYPE.FOLDER) {\n var folderType = me.getFolderType($(this));\n for (var i = 0; i < links.length; i++) {\n allow = me.isfolderAcceptObject(folderType, links[i].type);\n if (allow) break;\n }\n }\n\n /**\n * Разрешаем связывать документы c документами\n */\n if (recieverType === OBJECT_TYPE.EDOCUMENT) {\n for (var i = 0; i < links.length; i++) {\n allow = links[i].type === OBJECT_TYPE.EDOCUMENT;\n if (allow) break;\n }\n }\n\n /**\n * В task-и и job-ы можно вкладывать все\n */\n if (recieverType === OBJECT_TYPE.TASK || recieverType == OBJECT_TYPE.JOB) {\n allow = true;\n }\n\n return allow;\n },\n hoverClass: \"dragAllowed\",\n tolerance: \"pointer\",\n drop: function (event, ui) {\n var links = me.getDraggingLinks($(ui.draggable));\n var dragIsFromFolderTree = $(ui.draggable).is('span');\n me.handleDrop(links, $(this), dragIsFromFolderTree);\n return true;\n }\n }\n me.jDroppbable.droppable(settings).addClass('drop_binded');\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Отменяем текущую операцию по нажатию клавиши ESC\n * @function Core.dropping.enableEscapeButton\n * @since 5.1.0.1523\n * @return {Core.dropping}\n */\n enableEscapeButton: function () {\n var me = this;\n $(document).keyup(function (e) {\n if (e.which === 27 || e.keyCode === 27) {\n me.isCancelKeyPressed = true;\n $('.ui-draggable-dragging').draggable({ 'revert': true }).trigger('mouseup');\n setTimeout(function () {\n me.isCancelKeyPressed = false;\n }, 100);\n }\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отсеивание элементов, которые не подходят под разрешенное содержимое\n * папок.\n * @function Core.dropping.filterLinks\n * @since 5.1.0.1523\n * @return {Core.dropping}\n */\n filterLinks: function (links, destID, destType, jReciever) {\n var me = this;\n var filtered = [];\n if (destType === OBJECT_TYPE.FOLDER) {\n var folderType = me.getFolderType(jReciever);\n for (var i = 0; i < links.length; i++) {\n if (me.isfolderAcceptObject(folderType, links[i].type) && destID != links[i].id) {\n filtered.push(links[i]);\n }\n };\n };\n\n if (destType === OBJECT_TYPE.EDOCUMENT) {\n for (var i = 0; i < links.length; i++) {\n if (links[i].type === OBJECT_TYPE.EDOCUMENT) filtered.push(links[i]);\n };\n };\n\n if (destType === OBJECT_TYPE.TASK || destType === OBJECT_TYPE.JOB) {\n filtered = links;\n };\n\n return filtered;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Чтобы отобразить в модальном диалоге имя объекта в который будет\n * произведена вставка\n * необходио знать его имя. Получаем имя из существующих DOM-элементов;\n * @function Core.dropping.getObjectName\n * @since 5.1.0.1523\n * @param {Object} jObject - объект списка\n * @return {String}\n */\n getObjectName: function (jObject) {\n if (jObject.is('span')) { //в дереве\n return jObject.find('a').attr('name').toString().escapeHtml();\n } else { //в списке объектов\n return (''+jObject.find('div.objectname').data('title')).escapeHtml();\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Мы сами добаили выделение для объекта который переносим, сами-же его и уберем\n * @function Core.dropping.removeSelection\n * @return {Core.dropping}\n */\n removeSelection: function () {\n var links = WA.CR.objectList.getSelectedItems();\n for (var i = 0; i 0) {\n toast.show(L('COPIED_LINKS', count));\n } else {\n toast.show(L('NOT_LINKS_TO_COPY'));\n }\n refreshAll();\n } else {\n if (links.length > 0 && count == 0) {\n toast.show(L('NOT_LINKS_TO_MOVE'));\n refreshAll();\n return;\n }\n WA.SRV.session.deleteLinks(links, sourceID, sourceType).done(function (count) {\n if (count > 0) {\n OL.removeItems(links, true);\n OL.fire(\"itemsChange\");\n OL.fire('onSelect', null, OL.getSelectedItems());\n toast.show(L('MOVED_LINKS', count));\n } else {\n if (pastedCount > 0) {\n toast.show(L('COPIED_LINKS', pastedCount));\n } else {\n toast.show(L('NOT_LINKS_TO_MOVE'));\n }\n }\n refreshAll();\n });\n };\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Связывание документов\n * @function Core.dropping.bindLinks\n * @param {WA.Link[]} links список ссылок\n * @param {Integer} destID if элемента получателя\n * @param {OBJECT_TYPE} destType элемента получателя\n * @param {OBJECT_TYPE} jReciever jquery объект получателя\n * @since 5.1.0.1523\n * @return {Core.dropping}\n */\n bindLinks: function (links, destID, destType, jReciever) {\n var me = this;\n if (links.length === 0) {\n var toast = new WA.CMP.NTF.Toast();\n toast.show(L('NOT_LINKS_TO_BIND'));\n }\n\n WA.SRV.session.pasteLinks(links, destID, destType).done(function (count) {\n for (var i = 0; i < links.length; i++) {\n links[i].showBindIcon();\n };\n jReciever.find('.object-list-item__addicon_type_bound').show();\n var toast = new WA.CMP.NTF.Toast();\n if (count > 0) {\n toast.show(L('BOUND_LINKS', count));\n } else {\n toast.show(L('NOT_LINKS_TO_BIND'));\n }\n me.removeSelection();\n UpdateSelectionNumbers();\n });\n\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Добавление во вложения\n * @function Core.dropping.attachToTask\n * @param {WA.Link[]} links список ссылок\n * @param {Integer} destID if элемента получателя\n * @param {OBJECT_TYPE} destType элемента получателя\n * @param {OBJECT_TYPE} jReciever jquery объект получателя\n * @since 5.1.0.1523\n * @return {Core.dropping}\n */\n attachToTask: function (links, destID, destType, jReciever) {\n var me = this;\n if (links.length === 0) {\n var toast = new WA.CMP.NTF.Toast();\n toast.show(L('NOT_LINKS_TO_ATTACH'));\n }\n\n WA.SRV.session.pasteLinks(links, destID, destType).done(function (count) {\n var toast = new WA.CMP.NTF.Toast();\n if (count > 0) {\n toast.show(L('ATTACHED_LINKS', count));\n } else {\n toast.show(L('NOT_LINKS_TO_ATTACH'));\n }\n me.removeSelection();\n UpdateSelectionNumbers();\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Определение типа объекта\n * @function Core.dropping.attachToTask\n * @param {Object} jObject jquery объект объекта\n * @since 5.1.0.1523\n * @return {OBJECT_TYPE}\n */\n getObjectType: function (jObject) {\n if (jObject.hasClass(\"EDoc_obj\")) return OBJECT_TYPE.EDOCUMENT;\n if (jObject.hasClass(\"Ref_obj\")) return OBJECT_TYPE.REFERENCE_RECORD;\n if (jObject.hasClass(\"Task_obj\")) return OBJECT_TYPE.TASK;\n if (jObject.hasClass(\"Job_obj\")) return OBJECT_TYPE.JOB;\n if (jObject.hasClass(\"Fol_obj\")) return OBJECT_TYPE.FOLDER;;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Определение типа папки\n * @function Core.dropping.attachToTask\n * @param {Object} jObject jquery объект папки\n * @since 5.1.0.1523\n * @return {FOLDER_CONTENT_TYPE}\n */\n getFolderType: function (jObject) {\n if (jObject.hasClass('EDocument_fol')) return FOLDER_CONTENT_TYPE.EDOCUMENT;\n if (jObject.hasClass('Job_fol')) return FOLDER_CONTENT_TYPE.JOB;\n if (jObject.hasClass('Task_fol')) return FOLDER_CONTENT_TYPE.TASK;\n if (jObject.hasClass('Any_fol')) return FOLDER_CONTENT_TYPE.ANY;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n }\n\n})(window.Core);\n\n","(function (global) {\n\n /**\n * Функции списка объектов\n * @namespace Core.objectList\n * @since 5.1.0.1523\n */\n global.objectList = {};\n\n\n})(window.Core);\n\n\n(function (global) {\n\n /**\n * Подписать указанные ссылки. \n * @function Core.objectList.signListItems\n * @since 5.3.0.1001\n * @return {Core.objectList}\n */\n global.signListItems = function (items) {\n var links = _.map(items, function (item) {\n var linkModel = item.toLinkModel();\n // Добавляем наименование объекта что бы потом мы смогли выдать ошибку с наименование объекта.\n linkModel['name'] = item.name;\n return linkModel;\n });\n return global.signLinks(links);\n }\n\n /**\n * Подписать указанные ссылки. \n * @function Core.objectList.signLinks\n * @since 5.3.0.1001\n * @return {Core.objectList}\n */\n global.signLinks = function (links) {\n var sortedLinks = {\n documents: [],\n tasks: [],\n jobs: []\n };\n\n if (links) {\n for (var i = 0; i < links.length; i++) {\n switch (links[i].Kind.toLowerCase()) {\n case 'edoc':\n sortedLinks.documents.push(links[i]);\n break;\n case 'task':\n sortedLinks.tasks.push(links[i]);\n break;\n case 'job':\n sortedLinks.jobs.push(links[i]);\n break;\n }\n };\n }\n\n signSortedLinks(sortedLinks);\n };\n\n\n /**\n * Подписать указанные ссылки. \n * @param {sorteLinks} - объект со списком ссылок { 'documents': [{},{}], 'tasks': [{},{}...], 'jobs': [{}]}\n */\n var signSortedLinks = function (sortedLinks) {\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\n if (sortedLinks.documents.length) {\n signDocuments();\n } else if (sortedLinks.tasks.length || sortedLinks.jobs.length) {\n signCustomWork();\n } else {\n (new WA.CMP.NTF.Toast).showMessage(L('NO_OBJECT_SELECTED'));\n }\n }).fail(function () {\n showSigningUnsupportedDialog();\n });\n \n /**\n * Подписание множества документов\n * @innner\n * @function signDocuments\n * @since 5.1.0.1505\n */\n function signDocuments() {\n ShowModalWindow(\"MULTIPLE_SIGN\", {\n title: L(\"EDOCUMENT_SIGN\"),\n afterOpen: function () {\n var jModalWindow = $(\"#modal_window\");\n BindHelpIcoClickOnModalWindow('Sign');\n jModalWindow.find('input[type=radio]:first').click();\n key.setScope('baseDialog');\n if (sortedLinks.tasks.length || sortedLinks.jobs.length) {\n jModalWindow.data('warning')(L('MULTIPLE_OBJECTS_SIGN_DIALOG_INPLACE_HINT'));\n }\n var jTokenPinMessage = jModalWindow.find(\"#new_error_container\");\n var jTokenPinInput = jModalWindow.find(\".token_pin_code\");\n\n if (jTokenPinMessage.length != 0) {\n var tokenPinMessageHeight = jTokenPinMessage.parent().height();\n var tokenPinInputHeight = jTokenPinInput.parent().parent().height();\n var newHeight = jModalWindow.height() - tokenPinMessageHeight - tokenPinInputHeight;\n jTokenPinMessage.parent().hide();\n jTokenPinInput.parent().parent().hide();\n jModalWindow.height(newHeight);\n }\n },\n ok: function () {\n var handler = $('#modal_window').data('ok');\n var results = getSignedCustomWork();\n if (handler) return handler(results);\n },\n cancel: function () {\n var handler = $('#modal_window').data('cancel');\n if (handler) return handler();\n },\n params: {\n Links: _.map(sortedLinks.documents, function (linkModel) {\n return $.extend({}, linkModel, { \"name\": null }); // для экономии трафика, т.к. в linkModel может присутствовать наименование объекта для выдачи ошибки.\n }),\n UseAgent: true\n },\n height: 'auto',\n drag: function () { $('#modal_window').parent().css(\"height\", \"auto\"); },\n onClose: function () { clearAllModalDivs(); key.setScope('common'); },\n position: ['center', (windowHeight() / 2) - 200]\n });\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Возврашает подписанное множество ЗЗУ\n * @innner\n * @function getSignedCustomWor\n * @since 5.4.0.1006\n */\n function getSignedCustomWork() {\n var results = [];\n for (var i = 0; i < sortedLinks.tasks.length; i++) {\n results.push(SignTask(sortedLinks.tasks[i].ID, sortedLinks.tasks[i].name, true));\n }\n for (var i = 0; i < sortedLinks.jobs.length; i++) {\n results.push(SignJob(sortedLinks.jobs[i].ID, sortedLinks.jobs[i].name, true));\n }\n\n return results;\n }\n\n /**\n * Подписание множества ЗЗУ\n * @innner\n * @function signCustomWork\n * @since 5.1.0.1505\n */\n function signCustomWork() {\n var results = getSignedCustomWork();\n\n $.whenAllDone.apply($, results).done(function () {\n if (arguments.length) {\n (new WA.CMP.NTF.Toast).show(L('MULTIPLE_SIGN_COMFIRMATION'));\n }\n }).fail(function (error) {\n if (arguments.length) {\n var args = Array.prototype.slice.call(arguments);\n var dialog = new WA.CMP.dialogs.MessageBox({ width: 600 });\n\n var details = new WA.CMP.forms.FormBuilder('signingDetails');\n details.setOrientation(ORIENTATION.VERTICAL);\n details.addTextFrame('NOT_ALL_OBJECTS_SIGNED_INFORMATION_MESSAGE', '
      ' + args.join('') + '
    ');\n\n details.renderAsync().done(function (data) {\n dialog.showError(L('MULTIPLE_SIGN_SUCCESS_WITH_ERROR'), data);\n });\n }\n });\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Показывает диалог подписания с ошибкой \"Пописание возможно только с агентом\"\n function showSigningUnsupportedDialog() {\n var err = L(\"ERR_SIGNING_UNSUPPORTED\");\n var dialog = new WA.CMP.dialogs.MessageBox({\n width: 600,\n isShowOkButton: true,\n isShowCancelButton: true\n });\n dialog.bind(WA.CMP.dialogs.BaseDialog.EVENT.AFTER_OPEN, function () {\n dialog.disableButton('modal_ok_button');\n });\n dialog.show('', '', L('EDOCUMENT_SIGN'));\n ShowMessageInDialog(dialog._jDialog, err, 'error');\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n return global;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.Core.objectList);\n","\"use strict\";\n\n(function (global) {\n /**\n * Drag & drop для списка объектов проводника\n * @namespace Core.objectList.dragging\n * @since 5.1.0.1523\n */\n global.dragging = {\n draggable: \".List\",\n jDraggable: null,\n isCopyKeyPressed: false,\n isCancelKeyPressed: false,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация Drag & drop\n * @function Core.objectList.dragging.init\n * @since 5.1.0.1523\n * @return {Core.objectList.dragging}\n */\n init: function () {\n var me = this;\n if (WA.ENV.isTouch()) {\n log.info('DRAG&DROP', 'Drag & Drop is disabled for touch devices');\n return;\n }\n log.info('DRAG&DROP', 'Drag & Drop initializing for objectList');\n\n me.refreshObjects();\n\n me.dragSetup()\n .dropSetup()\n .enableCopyButton();\n\n WA.ObjectListInit.done(function () {\n WA.CR.objectList.bind('itemsChange', function () {\n me.refreshObjects()\n .enableCopyButton()\n .dragSetup()\n .dropSetup();\n });\n });\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Обновить jquery объекты, когда обнвовляется дерево\n * @function Core.objectList.dragging.refreshObjects\n * @since 5.1.0.1523\n * @return {Core.folderTree.dragAndDrop}\n */\n refreshObjects: function () {\n var me = this;\n me.jDraggable = $(me.draggable).not('drag_binded');\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * При нажатии на CTRL при переносе должно происходить копирование ссылок\n * а не перенос.\n * @function Core.objectList.dragging.enableCopyButton\n * @since 5.1.0.1523\n * @return {Core.objectList.dragging}\n */\n enableCopyButton: function () {\n this.jDraggable.bind(\"drag keydown\", Core.dropping.enableCopyButton);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Настройка элементов, которые можно перетаскивать\n * Здесь же в функции helper формируется представление переносимого\n * объекта.\n * @function Core.objectList.dragging.dragSetup\n * @since 5.1.0.1523\n * @return {Core.objectList.dragging}\n * @see #91763\n * @see #93576\n * @see http://goo.gl/QIkKPS\n */\n dragSetup: function () {\n var me = this;\n var MaxVisuallyStackedObjects = 3;\n\n var settings = {\n helper: function () {\n var jObject = $(this);\n\n var jAttachedToCursorItem;\n if (!jObject.hasClass('selected')) WA.CR.objectList.selectItemByID(jObject.attr('id'));\n\n var count = WA.CR.objectList.getSelectedItems().length;\n if (count == 1) jObject.addClass('lastDrag');\n\n jAttachedToCursorItem = $('
    ');\n for (var i = 1; i < count && i < MaxVisuallyStackedObjects; i++) {\n jAttachedToCursorItem.prepend('
    ');\n }\n jAttachedToCursorItem.append($(this).clone().addClass('movedItem'));\n\n return jAttachedToCursorItem;\n },\n\n revert: 'invalid',\n //scroll: false,\n cursorAt: { left: 13, top: 13 },\n cursor: \"grabbing\",\n distance: 10,\n cancel: '.fastActions'\n }\n\n me.jDraggable.draggable(settings).addClass('drag_binded');\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Настройка элементов, В(!) которые можно перетаскивать\n * @function Core.folderTree.objectList.dropSetup\n * @since 5.1.0.1523\n * @return {Core.folderTree.objectList}\n */\n dropSetup: function () {\n Core.dropping.init();\n return this;\n }\n }\n\n\n})(window.Core.objectList);\n\n\n","\n(function (global) {\n\n /**\n * Функции реализующие предпросмотр\n * @namespace Core.preview\n * @since 5.1.0.1523\n */\n global.preview = {};\n\n global.preview._checkDocumentType = function (accepted, extension) {\n if (WA.CR.Editor) {\n if (extension) {\n return (accepted.indexOf(extension) !== -1)\n } else {\n return (accepted.indexOf(WA.CR.Editor.Extension) !== -1)\n }\n } else {\n return false\n }\n }\n\n /**\n * Проверка того, что данный документ - документ для которого нужно включить прокрутку\n * @return {boolean}\n * @function Core.preview.isScrollableDocument\n * @since 5.1.0.1523\n * @global\n */\n global.preview.isScrollableDocument = function (opt_extension) {\n var accepted = ['PDF', 'TIF', 'TIFF', 'XPS', 'PPT', 'PPTX', 'PPTM', 'ODP'];\n return global.preview._checkDocumentType(accepted, opt_extension);\n };\n\n /**\n * Проверка того, что данный документ - текстовый.\n * @return {boolean}\n * @function Core.preview.isTextDocument\n * @since 5.2.0.1100\n * @global\n */\n global.preview.isTextDocument = function (opt_extension) {\n var accepted = ['DOC', 'DOCX', 'RTF', 'TXT', 'ODT'];\n return global.preview._checkDocumentType(accepted, opt_extension);\n };\n\n /**\n * Проверка того, что данный документ - таблица.\n * @return {boolean}\n * @function Core.preview.isSpreadSheet\n * @since 5.2.0.1100\n * @global\n */\n global.preview.isSpreadSheet = function (opt_extension) {\n var accepted = ['XLS', 'CSV', 'ODS'];\n return global.preview._checkDocumentType(accepted, opt_extension);\n }\n\n /**\n * Исправление запрета смешанного содержимого, когда ссылка http в iframe\n * блочится, пробрасываем её на родительский документ и открываем из него\n * @see #81595\n * @return {boolean}\n * @function Core.preview.fixHttpLinks\n * @since 5.2.0.1100\n * @global\n */\n global.preview.fixHttpLinks = function (data) {\n me = global;\n me._data = data || Core.preview.info;\n if (!me._data) return;\n var extension = me._data.objectsData[me._data.selectedObj.id].dataType;\n if (!global.preview.isSpreadSheet(extension)) return;\n\n var jIframe = $('iframe').contents();\n\n function getFrame(name) {\n return $(jIframe.find('frame[name=' + name + ']').get(0).contentWindow.document);\n }\n\n function rebindPassthrow() {\n getFrame('frSheet').find('a').unbind('click.pass').bind('click.pass', function () {\n window.open($(this).attr('href'));\n return false;\n })\n }\n\n getFrame('frTabs').find('a').bind('click.pass', function () {\n setTimeout(function () { rebindPassthrow(); }, 300);\n });\n },\n\n\n /**\n * Ограничение размеров текстовых документов страницей, и перемещение\n * комментариев рецензирования вправо.\n * @return {boolean}\n * @function Core.preview.isTextDocument\n * @since 5.2.0.1100\n * @global\n */\n global.preview.resizeTextDocuments = function (data) {\n me = global;\n me._data = data || Core.preview.info;\n if (!me._data) return;\n var extension = me._data.objectsData[me._data.selectedObj.id].dataType;\n if (!global.preview.isTextDocument(extension)) return;\n\n var jFrame = $('#contentContainer');\n var jDoc = jFrame.contents();\n\n if (extension === 'TXT') {\n jDoc.find('body')\n .wrapInner('
    ');\n }\n\n jDoc.find('body').children('div')\n .wrapAll('
    ')\n .wrapAll('
    ');\n\n var jCentered = jDoc.find('#centered');\n\n var isResized = false;\n jDoc.find('div[class*=WordSection]').each(function (el) {\n var jComments = $(this).find('.msocomanchor');\n\n if (jComments.length) {\n if (!jDoc.find('#review').length) {\n jCentered.append('
    ');\n jCentered.append('
    ');\n }\n jCentered.css('width', '');\n } else {\n jCentered.css('width', '780px');\n }\n\n if (!$.ipad) {\n if ($(this).find('.MsoNormalTable').width() > $(this).width()) {\n //альбомная ориентация\n jCentered.css('width', '1613px');\n jDoc.find('#leftColumn').css('width', '1135px');\n $(this).css('width', '1135px');\n isResized = true;\n } else {\n if (isResized) {\n jCentered.css('width', '1613px');\n jDoc.find('#leftColumn').css('width', '1135px');\n $(this).css('width', '1135px');\n }\n }\n } else {\n if ($(this).find('.MsoNormalTable').width() > $(this).width()) {\n jCentered.css('width', '1630px');\n jDoc.find('#leftColumn').css('width', '1135px');\n $(this).css('width', '1135px');\n $(this).find('.MsoNormalTable').width('40%');\n isResized = true;\n }\n else {\n if (!isResized) {\n jCentered.css('width', '913px');\n jDoc.find('#leftColumn').css('width', '435px');\n $(this).css('width', '435px');\n isResized = true;\n } else {\n jCentered.css('width', '1630px');\n jDoc.find('#leftColumn').css('width', '1135px');\n $(this).css('width', '1135px');\n }\n }\n }\n\n //Ставим таймаут, чтобы для медленных браузеров отрисовка комментов не бежала впереди инициализации блока '#review'\n setTimeout(function () {\n if (jComments.length) {\n jComments.each(function (el) {\n var commentIdSelector = $(this).attr('href');\n var jComment = jDoc.find(commentIdSelector);\n var width = '300px';\n\n if ($.ipad) {\n width = '200px';\n }\n function bindHover(jEl) {\n jEl.hover(function () {\n jDoc.find('.hovered').removeClass('hovered');\n jComment.addClass('hovered');\n\n var commentAreaName = jComment.find('.comment-area').attr('href');\n if (commentAreaName)\n commentAreaName = commentAreaName.substring(1);\n jDoc.find('a[name=' + commentAreaName + ']').addClass('hovered');\n });\n };\n\n bindHover($(this));\n\n jComment = jDoc.find(commentIdSelector).css({\n position: 'absolute',\n width: width,\n border: '1px solid #F66',\n color: '#333',\n padding: '10px',\n background: '#FCC',\n 'text-align': 'left',\n '-webkit-backface-visibility': 'visible'\n });\n\n bindHover(jComment);\n bindHover(jDoc.find('a.comment-area[name=' + commentIdSelector.replace('#_cmnt', '_cmntref') + ']'));\n\n if ($.ipad) {\n setTimeout(function () {\n jDoc.find('a[href=' + commentIdSelector + ']').bind('click touchstart', function (e) {\n jDoc.find('.hovered').removeClass('hovered');\n jDoc.find(commentIdSelector).addClass('hovered');\n\n var top = -(jDoc.find(commentIdSelector).offset().top - frames[0].window.prevScroll.y);\n var left = -jDoc.find(commentIdSelector).offset().left;\n frames[0].window.prevScroll.scrollTo(left, top);\n });\n jDoc.find(commentIdSelector).bind('click touchstart', function (e) {\n jDoc.find('.hovered').removeClass('hovered');\n $(this).addClass('hovered');\n });\n }, 200);\n }\n });\n };\n // Отступы для комментариев.\n global.preview.alignComments(jComments);\n }, 100);\n });\n \n // Высота не успевала рассчитываться, поэтому необходим таймут.\n setTimeout(function () {\n jDoc.find('#review').height(jCentered.height() - 47); // +20+25 margin +2 borders\n }, 101);\n\n };\n\n global.preview.alignComments = function (jComments) {\n var jFrame = $('#contentContainer');\n var jDoc = jFrame.contents();\n\n var jReviewControl = jDoc.find('#review');\n if (jReviewControl.length > 0) {\n var left = jReviewControl.offset().left;\n left += !$.ipad ? 15 : -25;\n }\n\n jComments.each(function () {\n var commentIdSelector = $(this).attr('href');\n var top = $(this).offset().top;\n\n jDoc.find(commentIdSelector).css({\n position: 'absolute',\n top: top,\n left: left + 'px'\n });\n });\n };\n\n})(window.Core);\n\n//При ресайзе окна комментарии съезжали влево\n$(window).on('resize', function () {\n\n if ((WA.getLocation() == \"doc\") && ((new WA.URL(location.href)).getParam('view') == \"Preview\")) {\n var jFrame = $(\"#contentContainer\");\n var jDoc = jFrame.contents();\n if (jDoc.find('#review').length > 0) {\n setTimeout(function () {\n if (jDoc.find('#review').length > 0) {\n var left = jDoc.find('#review').offset().left;\n if (!$.ipad) {\n left += 15;\n } else {\n left -= 25;\n }\n jDoc.find('div[class*=WordSection]').each(function (el) {\n var jComments = $(this).find('.msocomanchor');\n\n jComments.each(function (el) {\n var commentIdSelector = $(this).attr('href');\n jDoc.find(commentIdSelector).css({\n left: left + 'px'\n });\n });\n\n });\n }\n }, 200);\n }\n }\n});\n\n\n","\"use strict\";\n\n(function (global) {\n\n /**\n * Объект цикличный-итератор по направлениям вращения по сторонам света\n * @object Directions\n * @since 5.1.0.1523\n */\n var Directions = {\n index: 0,\n directions: ['N', 'E', 'S', 'W'],\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n next: function () {\n this.index++;\n this._reset();\n return this.directions[this.index];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n prev: function () {\n this.index--;\n this._reset();\n return this.directions[this.index];\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n _reset: function () {\n if (this.index > this.directions.length - 1) this.index = 0;\n if (this.index < 0) this.index = this.directions.length - 1;\n }\n }\n\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n\n /**\n * Управление бесконечной прокруткой\n * @namespace Core.preview.scrolling\n * @since 5.1.0.1523\n */\n global.scrolling = {\n _jFrame: null,\n _jArea: null,\n _jDoc: null,\n _href: null,\n _data: null,\n _jImage: null,\n _direction: null,\n _areaHeight: null,\n _pagesIterator: 2,\n _height: null,\n _width: null,\n _isIE: null,\n _jPageNumber: null,\n _lastPageHandlerTimout: null,\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация бесконечной прокрутки документов в предросмотре\n * @function Core.preview.scrolling.init\n * @since 5.1.0.1523\n * @return {Core.preview.scrolling}\n */\n init: function (data) {\n var me = this;\n me._data = data || Core.preview.info;\n if (!me._data) return;\n\n if (!global.isScrollableDocument(me._data.objectsData[me._data.selectedObj.id].dataType)) return;\n\n me._pagesIterator = 2;\n log.info('PREVIEW', 'Initializing endless document scrolling');\n\n me._isIE = WA.ENV.browser.name === 'IE';\n me._jFrame = $(\"#contentContainer\");\n me._jArea = me._jFrame.parent('div');\n me._areaHeight = me._jArea.height();\n me._jDoc = me._jFrame.contents();\n me._jPageNumber = $(\".page-number-field\");\n\n me.postInit();\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Подгрузка стилей и изменение страницы для адаптации под прокрутку.\n * @function Core.preview.scrolling.init\n * @since 5.1.0.1523\n * @return {Core.preview.scrolling}\n */\n postInit: function () {\n log.info('PREVIEW', 'Preview frame loaded successfully');\n var me = this;\n\n me._href = format(\"{0}/{1}/{2}\", me._data.previewHandlerUrl, me._data.convertedObj.id, '{0}');\n\n me.prepareFirstImage().done(function (scrolling) {\r\n scrolling\n .fillWithPlaceHolders()\n .attachToFrameScrolling()\n .loadNeighbors(1);\r\n });\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Первая картинка грузится всегда, она опорная точка, с нее\n * снимаются все параметры. Её-же мы делаем похожей на все остальные.\n * ИЕ8 слишком быстро выполняет js =), для него дополнительно используем\n * отложенный перерасчет величин.\n * @function Core.preview.scrolling.prepareFirstImage\n * @return {Deferred}\n * @since 5.1.0.1523\n */\n prepareFirstImage: function () {\n var d = $.Deferred();\n\n\n var me = this;\n me._jImage = me._jDoc.find('img:first').attr('id', 'page_1').data('pagenumber', '1').wrap('
    ');\n log.info('PREVIEW', 'Preparing first image');\n\n me._width = me._jImage.width();\n me._height = me._jImage.height();\n\n me._jImage.parent('.placeholder').width(me._width).height(me._height);\n\n if (me._isIE) {\n setTimeout(function () {\n me._width = me._jImage.width();\n me._height = me._jImage.height();\n d.resolve(me);\n }, 100);\n } else {\r\n d.resolve(me);\r\n }\n\n return d.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * После загрузки фрейма наполняем его пустышками чтобы появилась\n * прокрутка необходимой высоты.\n * @function Core.preview.scrolling.fillWithPlaceHolders\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n fillWithPlaceHolders: function () {\n var me = this;\n\n var page = {\n id: me._pagesIterator,\n width: me._width,\n height: me._height,\n src: ''\n };\n\n while (me._pagesIterator <= me._data.convertedObj.pageCount) {\n\n //Скопируем объект в переменную, иначе итерация можер произойти до рендера шаблонов.\n var currentPage = $.extend({}, page, {\n id: me._pagesIterator\n });\n\n WA.templates.render('components/previewPage.compile.html', currentPage).done(function (html) {\n me._jDoc.find('body').append(html);\n });\n me._pagesIterator++;\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * При перематывании страниц находим текущую страницу\n * @function Core.preview.scrolling.attachToFrameScrolling\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n attachToFrameScrolling: function () {\n var me = this;\n var frame = $(me._jFrame.get(0).contentWindow);\n\n frame.on('scroll touchmove', function () {\n // setTimeout потому-что в ie8 иначе не работает,\n // и чтобы слишком часто не вызывались вычисления.\n clearTimeout(me._lastPageHandlerTimout);\n me._lastPageHandlerTimout = setTimeout(function () {\n me.handleCurrentPage();\n }, 100);\n });\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Поиск и выделение текущей страницы\n * @function Core.preview.scrolling.handleCurrentPage\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n handleCurrentPage: function () {\n var me = this;\n var jPage = $(me._jFrame.get(0).contentWindow.document.elementFromPoint(me._areaWidth * 0.5, (1 / 3) * me._areaHeight));\n\n me._jDoc.find('.placeholder').removeClass('current');\n jPage.parent('.placeholder').addClass('current');\n var id = jPage.data('pagenumber');\n\n if (id && !isNaN(id)) {\n me._jPageNumber.val(id);\n me.loadPage(id);\n me.loadNeighbors(id);\n };\n\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Загрузка страницы и обработка загрузки\n * @function Core.preview.scrolling.loadPage\n * @param {integer} pageNum номер страницы\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n loadPage: function (pageNum) {\n\n var me = this;\n var jPage = me._jDoc.find(\"#page_\" + pageNum);\n\n var bindOnLoad = function () {\n jPage.parent().addClass('placeholder_spinner');\n jPage.attr('src', me.getURLForPage(pageNum)).one(\"load\", function () {\n $(this).removeClass('invisible');\n $(this).parent().removeClass('placeholder_spinner');\n }).each(function () {\n //Если картинка была уже загружена, она помещеатся в браузерный кэш,\n // и при следующем откртытии страницы событие load не вызывается.\n // Вызываем его принудительно здесь.\n if (this.complete) $(this).load();\n });\n }\n\n if (!jPage.attr('src')) {\n if (WA.ENV.device.model && WA.ENV.device.model.toLowerCase() === 'ipad') {\n setTimeout(function () {\n bindOnLoad();\n });\n } else {\n bindOnLoad();\n }\n };\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Вращение всех страниц в указанном направлении\n * @function Core.preview.scrolling.rotatePages\n * @param {String} direction 'N' - север, 'E' - восток, 'S' - юг 'W' - запад\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n rotatePages: function (direction) {\n var me = this;\n\n me._direction = direction;\n var jPage = me._jDoc.find(\"img\");\n\n\n if (jPage.parent().hasClass('placeholder')) {\n var placeholders = me._jDoc.find(\".placeholder\");\n placeholders\n .removeClass('N E W S')\n .addClass(direction);\n switch (direction) {\n case 'N':\n case 'S':\n placeholders.css({ 'margin': '20px auto' });\n break;\n case 'E':\n case 'W':\n var placeholderMargin = Math.abs(me._width - me._height);\n placeholders.css({ 'margin': placeholderMargin + 20 + 'px auto' });\n placeholders.filter('.current').css({ 'margin-top': placeholderMargin/2 + 20 + 'px' });\n break;\n }\n } else {\n jPage\n .removeClass('N E W S')\n .addClass(direction);\n if ($('.fit-to-height').hasClass('selected')) {\n $('.fit-to-height').click().click();\n }\n }\n setTimeout(function () { me.handleCurrentPage(); }, 0);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Вращение всех страниц по часовой стрелке\n * @function Core.preview.scrolling.rotateCW\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n rotateCW: function () {\n this.rotatePages(Directions.next());\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Вращение всех страниц против часовой стрелки\n * @function Core.preview.scrolling.rotateCCW\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n rotateCCW: function () {\n this.rotatePages(Directions.prev());\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * У страницы при малом масштабе могут быть видимые соседи. Их тоже требуется\n * загрузить чтобы картина была полной.\n * @function Core.preview.scrolling.loadNeighbors\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n loadNeighbors: function (pageNum, opt_rotate, opt_direction) {\n var me = this;\n\n pageNum = +pageNum; //преобразование в число, чтобы 1+2 не стало 12\n if (me._jImage.height()) {\n var neighborsCount = Math.ceil(me._areaHeight / me._jImage.height() / 2);\n for (var i = pageNum; i <= pageNum + neighborsCount; i++) {\n if (opt_rotate) me.rotatePage(i, opt_direction)\n else me.loadPage(i);\n }\n }\n return me;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение url изображения по номеру страницы\n * @function Core.preview.scrolling.getURLForPage\n * @param {integer} pageNum номер страницы\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n getURLForPage: function (pageNum) {\n return format(this._href, pageNum);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Переход к указанной странице\n * @function Core.preview.scrolling.jumpToPage\n * @param {integer} pageNum номер страницы\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n jumpToPage: function (pageNum) {\n log.info('PREVIEW', 'Jumping to page #' + pageNum);\n\n var me = this;\n pageNum = +pageNum;\n\n if (pageNum > me._data.convertedObj.pageCount) pageNum = me._data.convertedObj.pageCount;\n\n if (WA.ENV.device.model && WA.ENV.device.model.toLowerCase() === 'ipad') {\n var jFrame = $(me._jFrame.get(0).contentWindow)\n var top = -(me._jDoc.find(\"#page_\" + pageNum).offset().top - frames[0].window.prevScroll.y);\n frames[0].window.prevScroll.scrollTo(0, top);\n jFrame.trigger('scroll');\n } else {\n me._jDoc.scrollTop(me._jDoc.find(\"#page_\" + pageNum).offset().top);\n }\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Смена масштаба\n * @function Core.preview.scrolling.setScale\n * @param {string} key масштаб\n * @return {Core.preview.scrolling}\n * @since 5.1.0.1523\n */\n setScale: function (key) {\n log.info('PREVIEW', 'Setting scale ' + key)\n\n var me = this;\n\n //Это надо оставить, этот метод вызывается из обычного предпросмотра\n // и может вызваться раньше чем был init;\n me._jFrame = $(\"#contentContainer\");\n me._jDoc = me._jFrame.contents();\n me._jImage = me._jDoc.find('img:first');\n\n me._jArea = me._jFrame.parent('div');\n me._areaHeight = me._jArea.height();\n me._areaWidth = me._jArea.width();\n\n var jHolders = me._jDoc.find('div.placeholder');\n // Надо отметить, что сюда не попадает предпросмотр картинки, тут только документы\n var jPages = me._jDoc.find('placeholder .img').add(jHolders);\n\n /**\n * Сменить размеры страниц\n * @function zoomPages\n * @inner\n */\n var zoomPages = function (key) {\n jPages.css({\n height: (me._jImage.attr('initHeight') * (key)) + 'px',\n width: (me._jImage.attr('initWidth') * (key)) + 'px'\n });\n };\n\n switch (key) {\n case 'w':\n // Здесь 40 = 20 + 10 + 10 (скролл + паддинги), делаем поправку, чтобы картинка корректно растягивалась по ширине\n var key = (me._areaWidth - 40)/me._jImage.attr('initWidth');\n zoomPages(key);\n break\n case 'h':\n var key = me._areaHeight / me._jImage.attr('initHeight');\n zoomPages(key);\n break;\n case 'a':\n var key = Math.min(me._areaWidth / me._jImage.attr('initWidth'), me._areaHeight / me._jImage.attr('initHeight'));\n zoomPages(key);\n break\n default:\n key = +key;\n if (me._direction == 'W' || me._direction == 'E') {\n zoomPages(key / 100);\n } else {\n zoomPages(key / 100);\n }\n }\n\n me._width = me._jImage.width();\n me._height = me._jImage.height();\n\n setTimeout(function () {\n me.handleCurrentPage();\n }, 0);\n return me;\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n }\n})(window.Core.preview);\n\n\n","\"use strict\";\n\n(function (global) {\n /**\n * Функции отвечающие за работу контекстного меню.\n * @namespace Core.contextmenu\n * @since 5.1.0.1516\n */\n global.contextmenu = {};\n})(window.Core);\n\n\n(function (global) {\n\n var menusCache = {};\n var objKindMap = {\n 'edoc': 'EDocument',\n 'task': 'Task',\n 'job': 'Job',\n 'fol': 'Folder',\n 'ref': 'ReferenceRecord',\n 'usr': 'UserSettings',\n 'ver': 'EDocumentVersion',\n 'com': 'Common',\n 'att': 'Attachments',\n 'localcopy': 'LocalCopy',\n 'current_fol': 'CurrentFolder'\n };\n\n\n /**\n * Показывает контекстное меню.\n *\n * @param {object} clickedEl Объект, по которому совершен клик.\n * @param {object} options Параметры.\n * @param {object} coords Координаты меню.\n * @param {boolean} isRightButton Признак нажатия правой кнопки мыши.\n */\n global.show = function (obj, options, coords, isRightButton) {\n if (obj instanceof jQuery || obj instanceof HTMLElement) {\n if (WA.CR && WA.CR.objectList) {\n var jClickedEl = $(obj);\n\n if (isRightButton) {\n selectClickedElementAndUnselectOther(jClickedEl);\n }\n\n var selectedItems = WA.CR.objectList.getSelectedItems();\n if (selectedItems.length > 1) {\n showContextMenuForManyObjects(selectedItems, jClickedEl, options, coords, isRightButton);\n // Что бы не вызвалось меню для одного элемента.\n return;\n }\n }\n showContextMenuForOneObject(obj, options, coords, isRightButton);\n } else {\n showForFolderTreeItem(obj, options, coords);\n }\n };\n\n function showContextMenuForManyObjects(selectedItems, jClickedEl, options, coords, isRightButton) {\n var types = _.chain(selectedItems).pluck('type').uniq().value();\n var menuType = 'Mass' + types.join('');\n\n var resultMenuItems = getMassMenuItemsByTypes(types);\n if (resultMenuItems.length === 0) return;\n\n _toggleMarkAsReadMenuItemText(resultMenuItems, selectedItems);\n\n var menu = getOrAddContextMenuFormCache(menuType, resultMenuItems, { width: 212 });\n if (!menu) return;\n // Передаем в контекстное меню список выбранных элементов.\n setMenuProperties(menu, { context: selectedItems });\n\n var hasStatusBar = _.every(selectedItems, function (item) { return item._jObject.find('div.status').length > 0; });\n if (hasStatusBar) {\n // Показываем горизонтальное меню статусов.\n window.Core.toolBars.main.showHorizontalStatusContextMenu(menu, jClickedEl, selectedItems, isRightButton);\n }\n showContextMenuInternal(menu, jClickedEl, coords);\n };\n\n // Изменяет текст пункта меню \"Пометить прочитанным\" в зависимости от выбранных заданий.\n function _toggleMarkAsReadMenuItemText(resultMenuItems, selectedItems) {\n var markAsReadMenuItem = _.first(_.filter(resultMenuItems, function (item) { return item.id === 'MarkAsRead' }));\n\n if (markAsReadMenuItem) {\n var jobs = _.filter(selectedItems, function (item) { return item.type === OBJECT_TYPE.JOB });\n if (jobs.length > 0) {\n if (_.filter(jobs, function (job) { return job.isUnread() }).length === 0) {\n markAsReadMenuItem.text = 'MENU_MARK_AS_UNREAD';\n } else {\n markAsReadMenuItem.text = 'MENU_MARK_AS_READ';\n }\n }\n }\n };\n\n // Создает объект контекстного меню.\n function build(options) {\n var menu = getOrAddContextMenuFormCache(options.objectType);\n if (menu) {\n // Изменить доступность пунктов меню.\n enableItem('CreateSubTask', menu);\n enableItem('CopyDoc', menu);\n if (options.cannotDelete) {\n disableItem('DeleteLink', menu);\n } else {\n enableItem('DeleteLink', menu);\n }\n };\n setDefaultItem(menu, options.defaultItem);\n\n setMenuProperties(menu, {\n context: options.proxy,\n onHide: options.onHide\n });\n\n return menu;\n };\n\n\n function showContextMenuForOneObject(obj, options, coords, isRightButton) {\n var el = $(obj);\n var listItem = el.parents('.List:first');\n var tr = listItem.length > 0 ? listItem : el;\n var proxy;\n\n var menuOptions = {};\n\n if (options && options.from === 'ReferenceTable') {\n proxy = { id: tr.data('recid'), kind: 'ref', refcode: Reference_GetName(), elem: el, tr: tr };\n menuOptions.objectType = 'ReferenceRecordTable';\n } else {\n proxy = GetObjectInfoFromRow(tr);\n }\n $.extend(proxy, options);\n\n menuOptions.proxy = proxy;\n if (!menuOptions.objectType) {\n menuOptions.objectType = objKindMap[proxy.kind.toLowerCase()];\n \n if (proxy.kind.toLowerCase() === 'current_fol')\n proxy.kind = 'fol';\n }\n\n if (menuOptions.objectType === 'ReferenceRecord' || menuOptions.objectType === 'ReferenceRecordTable') {\n var refName = Reference_GetName();\n var refView = Reference_GetView();\n var specObjType = [\n menuOptions.objectType + '_' + refName,\n menuOptions.objectType + '_' + refView,\n menuOptions.objectType + '_' + refName + '_' + refView\n ];\n for (var i = 0, specObjTypeLen = specObjType.length; i < specObjTypeLen; i++) {\n if (contextMenuSettings[specObjType[i]]) {\n menuOptions.objectType = specObjType[i];\n }\n }\n }\n proxy.type = menuOptions.objectType;\n\n menuOptions.cannotDelete = !!(tr.hasClass('cannot_delete') || (WA.getLocation() === 'task' && GetParamInURL('mode') !== 'edit'));\n\n if (menusCache.hasOwnProperty('EDocumentVersion')) {\n menuOptions.defaultItem = (g_defaultListAction === 'showcard' || g_defaultListAction === 'preview')\n ? 'Preview'\n : (g_openDocForEditByDefault ? 'OpenForEdit' : 'ViewInEditor');\n }\n\n if (menusCache.hasOwnProperty('EDocument')) {\n switch (g_defaultListAction) {\n case 'showcard':\n menuOptions.defaultItem = 'Card';\n break;\n case 'preview':\n menuOptions.defaultItem = 'Preview';\n break;\n case 'open':\n menuOptions.defaultItem = 'OpenForEdit';\n break;\n case 'viewineditor':\n menuOptions.defaultItem = 'ViewInEditor';\n break;\n default:\n }\n }\n\n if (menusCache.hasOwnProperty('Task') || menusCache.hasOwnProperty('Job') || menusCache.hasOwnProperty('Folder')) {\n menuOptions.defaultItem = '';\n }\n\n if (!el.hasClass('menuicon_border')) {\n ContextMenu.hide();\n menuOptions.onHide = function () {\n var jListParent = $('body');\n jListParent.find('.menuicon_border').removeClass('menuicon_border');\n jListParent.find('.menu_select').removeClass('menu_select');\n };\n\n if (!isRightButton) {\n el.addClass('menuicon_border');\n }\n tr.addClass('menu_select');\n\n var menu = build(menuOptions);\n\n var hasStatusBar = tr.find('div.status').length > 0;\n if ((menuOptions.objectType === 'EDocument' || menuOptions.objectType === 'Task'\n || menuOptions.objectType === 'Job' || menuOptions.objectType === 'Folder')\n && hasStatusBar) {\n // Показываем горизонтальное меню статусов.\n window.Core.toolBars.main.showHorizontalStatusContextMenu(menu, el, proxy, isRightButton);\n }\n\n setTimeout(function () { //Для того, что бы контекстное меню для свободной области проводника сразу НЕ скрывалось после отображения.\n switch (menuOptions.objectType) {\n case 'EDocument':\n EDocument(proxy).GetContextMenu(menu, function () { showContextMenuInternal(menu, el, coords); });\n break;\n case 'EDocumentVersion':\n EDocumentVersion(proxy).GetContextMenu(menu, function () { showContextMenuInternal(menu, el, coords); });\n break;\n case 'ReferenceRecordTable':\n showReferenceContextMenu(menu, el, coords);\n break;\n default:\n showContextMenuInternal(menu, el, coords);\n }\n }, 10);\n }\n else {\n ContextMenu.hide();\n }\n };\n\n function showForFolderTreeItem(node, options, coords) {\n var objType = node.kind === 'COMPONENT_TOKEN' ? '' : 'fol';\n\n var menuOptions = {};\n menuOptions.objectType = objKindMap[objType];\n\n if (objType) {\n menuOptions.proxy = options;\n menuOptions.defaultItem = '';\n\n ContextMenu.hide();\n var menu = build(menuOptions);\n showContextMenuInternal(menu, null, coords);\n }\n };\n\n // Получает (или добавляет, если нет) компоненту контекстного меню из кэша.\n function getOrAddContextMenuFormCache(objType, items, settings) {\n if (!menusCache.hasOwnProperty(objType)) {\n var menuItems = items;\n var menuSettings = settings || {};\n\n if (!menuItems) {\n var settings = contextMenuSettings[objType];\n if (!settings) return null;\n menuItems = settings.items.slice(0); //Клонируем массив, чтобы сохранить его в первозданном виде.\n\n // Удаляем пункт \"Вырезать ссылку\" везде кроме папки.\n if (location.href.toLowerCase().indexOf('explorer.aspx') == -1) {\n menuItems = deleteItemById(menuItems, 'CutLink');\n };\n\n menuSettings = settings.settings;\n }\n\n menusCache[objType] = new ContextMenu(menuItems, menuSettings);\n }\n\n if (menusCache.hasOwnProperty('EDocument')) {\n updateContextMenu('EDocument');\n }\n if (menusCache.hasOwnProperty('EDocumentVersion')) {\n updateContextMenu('EDocumentVersion');\n }\n if (menusCache.hasOwnProperty('Task')) {\n updateContextMenu('Task');\n }\n if (menusCache.hasOwnProperty('Job')) {\n updateContextMenu('Job');\n }\n return menusCache[objType];\n };\n\n // устанавливает свойства контекстного меню.\n function setMenuProperties(menu, props) {\n menu.self = props.context;\n menu.onHide = function () {\n if ($.isFunction(props.onHide)) props.onHide();\n };\n var copyItem = menu.getItemById('CopyLink');\n if (copyItem) {\n var dd;\n copyItem.onCreate = function () { dd = this; }\n menu.onShow = function () {\n if ($.isFunction(props.onShow)) props.onShow();\n }\n }\n };\n\n // Получает элементы контекстного меню для массовых операций в зависимости от переданных типов (если типы разные то, будет вычислятся пересечения пунктов меню).\n function getMassMenuItemsByTypes(types) {\n var resultMenuItems = [];\n var resultMenuItemsId = []; // для упрощения поиска\n\n _.each(types, function (type) {\n var menuType;\n switch (type) {\n case OBJECT_TYPE.EDOCUMENT: menuType = 'MassEDocument'; break;\n case OBJECT_TYPE.FOLDER: menuType = 'MassFolder'; break;\n case OBJECT_TYPE.TASK: menuType = 'MassTask'; break;\n case OBJECT_TYPE.JOB: menuType = 'MassJob'; break;\n case OBJECT_TYPE.REFERENCE_RECORD: menuType = 'MassReferenceRecord'; break;\n default: return;\n }\n\n var settings = contextMenuSettings[menuType];\n if (!settings) return;\n var currentItems = settings.items.slice(0); //Клонируем массив, чтобы сохранить его в первозданном виде.\n\n var newResultMenuItems = [];\n var newResultMenuItemsId = []; // для упрощения поиска\n\n _.each(currentItems, function (currentItem) {\n\n // Если еще нет объединенного результируешего меню, то добавим все.\n // или Если элемент меню уже был добавлен в результирующий, то добавим текущий элемент к новому результирующему.\n if (resultMenuItemsId.length === 0 || resultMenuItemsId.indexOf(currentItem.id) !== -1) {\n newResultMenuItems.push(currentItem);\n newResultMenuItemsId.push(currentItem.id);\n }\n\n });\n\n resultMenuItems = newResultMenuItems;\n resultMenuItemsId = newResultMenuItemsId;\n });\n\n return resultMenuItems;\n };\n\n // Выделяет тот, по которому кликнули и снимает выделения с остальных (если кликнутый элемент не в числе выделенных).\n function selectClickedElementAndUnselectOther(jClickedEl) {\n if (!jClickedEl.hasClass('List')) {\n jClickedEl = jClickedEl.parents('.List:first');\n }\n var clickedId = jClickedEl.attr('id');\n\n var selectedItems = WA.CR.objectList.getSelectedItems();\n var hasClicked = _.any(selectedItems, function (selectedItem) {\n return selectedItem.id === clickedId;\n });\n\n if (!hasClicked) {\n // Снимаем выделение со всех остальных.\n WA.CR.objectList.deselectAll();\n // Выделяем кликнутый.\n WA.CR.objectList.selectItem({ id: clickedId });\n }\n };\n\n function showContextMenuInternal(menu, el, coords) {\n enableDisableItems(menu, el);\n if (!coords) menu.show(el);\n else menu.showAt(coords, null, null);\n }\n\n function enableDisableItems(menu, el) {\n var menuItem;\n if (!Core.contextmenu.isElementInFolderTree(el) && Core.toolBars.main.isSearchMode()) {\n menuItem = menu.getItemById('CutLink');\n if (menuItem) {\n menuItem.disabled = true;\n delete menuItem.jsaction;\n }\n menuItem = menu.getItemById('DeleteLink');\n if (menuItem) {\n menuItem.disabled = true;\n delete menuItem.jsaction;\n }\n }\n if (menu.type === 'Attachments' && $('div [name=PasteLnk]').length === 0) {\n menuItem = menu.getItemById('PasteLink');\n menuItem.disabled = true;\n delete menuItem.jsaction;\n }\n }\n\n function showReferenceContextMenu(menu, el, coords) {\n var menuItem;\n if (g_IsReferenceReadOnly) {\n menuItem = menu.getItemById(\"Delete\");\n if (menuItem) {\n menuItem.disabled = true;\n delete menuItem.jsaction;\n }\n\n menuItem = menu.getItemById(\"Copy\");\n if (menuItem) {\n menuItem.disabled = true;\n delete menuItem.jsaction;\n }\n }\n if (!coords) menu.show(el); else menu.showAt(coords, null, null);\n }\n\n // Удаляет элемент по ID из массива объектов.\n function deleteItemById(items, id) {\n var newItems = [];\n for (var i = 0; i < items.length; i++) {\n //Здесь умышленно не стоит !==, для работы со строками (т.е. \"id\" == id)\n if (items[i].id != id) {\n newItems.push(items[i]);\n }\n else {\n if (items[i].separator && i > 0) {\n items[i - 1].separator = true;\n }\n }\n }\n return newItems;\n }\n\n function updateContextMenu(objType) {\n var settings = contextMenuSettings[objType];\n\n var changedItems = switchItemsForAgent(settings);\n if (WA.getLocation() !== 'explorer') {\n changedItems = deleteItemById(changedItems, 'CutLink');\n }\n menusCache[objType] = new ContextMenu(changedItems, settings.settings);\n }\n\n function switchItemsForAgent(settings) {\n var changedItems = settings.items;\n // Убираем действия, только если включена работа без агента.\n if (WA.agent.isDisabled()) {\n changedItems = deleteItemById(changedItems, 'OpenForEdit');\n changedItems = deleteItemById(changedItems, 'ViewInEditor');\n if ($.ipad || WA.ENV.isAndroid()) { changedItems = deleteItemById(changedItems, 'Sign'); }\n }\n\n return changedItems;\n }\n\n function disableItem(itemID, menu) {\n var menuItem = menu.getItemById(itemID);\n if (menuItem) {\n menuItem.disabled = true;\n }\n }\n\n function enableItem(itemID, menu) {\n var menuItem = menu.getItemById(itemID);\n if (menuItem) {\n menuItem.disabled = false;\n }\n }\n function setDefaultItem(menu, itemID) {\n var menuItem = !!itemID ? menu.getItemById(itemID) : menu.items[0];\n if (!!menuItem) {\n menuItem['default'] = true;\n }\n }\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверяет находится ли переденный элемент в дереве папок.\n * @function Core.contextmenu.isElementInFolderTree\n * @since 5.0.0.1516\n * @return {Core.contextmenu}\n */\n global.isElementInFolderTree = function (el) {\n return (el && el.parents('#Tree').length > 0);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Событие создания пункта контекстного меню \"Копировать ссылку\" для папки.\n * @function Core.contextmenu.copyFolderLinkOnCreate\n * @since 5.0.0.1519\n * @return {Core.contextmenu}\n */\n global.copyFolderLinkOnCreate = function (fol) {\n //Нельзя отправлять копировать ссылку на папку \"Ярлыки\" - запрещено в билдере получение по ИД этой папки (http://directum.npo-comp.ru/reference.asp?sys=TEHKASNPO&compcode=%C7%C7%CF&id=5664818).\n if (fol instanceof jQuery || fol instanceof HTMLElement) {\n var jFol = fol.tr.hasClass('List') ? fol.tr : fol.tr.children();\n return { disabled: jFol.hasClass('ShortcutsFolderType') };\n } else {\n return (fol.hasOwnProperty('canCopy')) ? { disabled: !fol.canCopy } : {};\n }\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Делает неактивным пункт \"Вставить ссылки\" в режиме поиска.\n */\n global.pasteLinksOnCreate = function () {\n return {\n disabled: Core.toolBars.main.isSearchMode()\n };\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Событие создания пункта контекстного меню \"Вставить ссылки\" для папки.\n * @function Core.contextmenu.pasteLinksToFolderOnCreate\n * @since 5.0.0.1516\n * @return {Core.contextmenu}\n */\n global.pasteLinksToFolderOnCreate = function (fol) {\n //Проверка возможности вставки ссылок в папку fol.\n //Нельзя вставлять в папки поиска.\n var disabled;\n var visibility = (WA.getLocation() === 'settings') ? 'hidden' : '';\n if (fol instanceof jQuery || fol instanceof HTMLElement) {\n var jFol = fol.tr.hasClass('List') ? fol.tr : fol.tr.children();\n disabled = Core.toolBars.main.isSearchMode() && !(jFol.hasClass('EDocument_fol') || jFol.hasClass('Job_fol') || jFol.hasClass('Task_fol') || jFol.hasClass('Any_fol'));\n } else {\n if (fol.hasOwnProperty('canPaste')) disabled = !fol.canPaste;\n else return { visibility: visibility };\n }\n\n return {\n disabled: disabled,\n visibility: visibility\n };\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Действие контекстного меню \"Удалить ссылку\".\n * @function Core.contextmenu.deleteLinksFromFolder\n * @since 5.0.0.1516\n * @return {Core.contextmenu}\n */\n global.deleteLinksFromFolder = function (fol, callback, msg) {\n if (global.isElementInFolderTree(fol.tr)) {\n var jParentFolder = fol.tr.parents('ul:first').parent();\n // Проверяем удалось ли определить родительскую папку или нет.\n if (!jParentFolder.hasClass('FolderTreeDiv')) {\n var parentFolderId = jParentFolder.children('span').find('a').attr('id').substring(1);//id ссылки в формате \"f\", поэтому ИД берем с 1 символа.\n DeleteLinks('', [{ ID: fol.id, Kind: 'FOL', CompCode: '' }], false, parentFolderId, true, function () {\n WA.CR.folderTree.updateNodesWithFolder(fol.id);\n }, true);\n }\n } else {\n ObjDeleteLink(fol, null, callback, msg);\n }\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Действие контекстного меню \"Удалить ссылку\".\n * @function Core.contextmenu.deleteLinksFromFolder\n * @since 5.0.0.1516\n * @return {Core.contextmenu}\n */\n global.handleDeleteAction = function (fol) {\n var callback = null;\n var msg = \"\";\n if (WA.getLocation() === \"settings\") {\n callback = function (link) {\n window.Core.settings.setAutoCleanFolder(link.ID, false);\n };\n msg = L('SETTINGS_SAVED');\n }\n\n global.deleteLinksFromFolder(fol, callback, msg);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Событие создания пункта контекстного меню \"Удалить ссылку\" для папки.\n * @function Core.contextmenu.deleteLinksFromFolderOnCreate\n * @since 5.0.0.1519\n * @return {Core.contextmenu}\n */\n global.deleteLinksFromFolderOnCreate = function (fol) {\n return (fol.hasOwnProperty('canDelete')) ? { disabled: !fol.canDelete } : {};\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Событие создания пункта контекстного меню \"Отправить задачей\" для папки.\n * @function Core.contextmenu.sendAsTaskAttachmentForFolderOnCreate\n * @since 5.0.0.1518\n * @return {Core.contextmenu}\n */\n global.sendAsTaskAttachmentForFolderOnCreate = function (fol) {\n //Нельзя отправлять вложением папку \"Ярлыки\" - запрещено в билдере получение по ИД этой папки (http://directum.npo-comp.ru/reference.asp?sys=TEHKASNPO&compcode=%C7%C7%CF&id=5664818).\n if (fol instanceof jQuery || fol instanceof HTMLElement) {\n var jFol = fol.tr.hasClass('List') ? fol.tr : fol.tr.children();\n return { disabled: jFol.hasClass('ShortcutsFolderType') };\n } else {\n return (fol.hasOwnProperty('canSend')) ? { disabled: !fol.canSend } : {};\n }\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Событие создания пункта контекстного меню \"Создать и вложить\".\n * @function Core.contextmenu.createAndAttachOnCreate\n * @since 5.0.0.1522\n * @return {Core.contextmenu}\n */\n global.createAndAttachOnCreate = function () {\n \n var jAttachmentsToolbar = $(\"#content_list_toolbox\");\n var isDisabled = true;\n\n if (jAttachmentsToolbar.length > 0) {\n var jAttachButton = jAttachmentsToolbar.find(\".attach_doc_btn\");\n \n if (jAttachButton.length > 0)\n isDisabled = jAttachButton.hasClass(\"disabled\");\n }\n\n return {\n disabled: isDisabled\n };\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n* Создание контекстного меню для контейнера main главной страницы..\n* @function Core.contextmenu.createFolderContextMenu\n* @since 5.2.0.2006\n*/\n global.createFolderContextMenu = function () {\n var jMainContainer = $('#main_container');\n jMainContainer.attr('kind', 'com');\n jMainContainer.bind('contextmenu', function (e) {\n e.preventDefault();\n e.stopPropagation();\n ShowContextMenu($(this), {}, { 'left': e.pageX, 'top': e.pageY }, true);\n return false;\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Клик по пункту контекстного меню \"Показать/скрыть папки в списке\".\n * @function Core.contextmenu.showFolderInList\n * @since 5.5.0.9000\n * @return {Core.contextmenu}\n */\n global.showFolderInList = function () {\n var currentNeedToShow = WA.CR.objectList.isShowFolders();\n var currentFolderID = WA.current.getID();\n\n WA.services.call(\"/Session.asmx/UpdateShowFoldersInList\", {\n FolderID: currentFolderID,\n NeedToShow: !currentNeedToShow\n }).success(function (result) {\n WA.CR.objectList.setIsShowFolders(!currentNeedToShow);\n WA.CR.objectList.loadFolderContent(currentFolderID);\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Событие создания пункта контекстного меню \"Показать/скрыть папки в списке\".\n * @function Core.contextmenu.showFolderInList\n * @since 5.5.0.9000\n * @return {Core.contextmenu}\n */\n global.showFolderInListOnCreate = function () {\n var isShowFolders = WA.CR.objectList.isShowFolders();\n return {\n selected: isShowFolders,\n image: isShowFolders ? '/App_Sprites/menu_check.png' : ''\n };\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.Core.contextmenu);\n","///**\n// * Стандартные провайдеры аутентификации. \n// * @readonly\n// * @global\n// * @enum {string} STD_AUTH_PROVIDERS \n// * @example \n//*/\nSTD_AUTH_PROVIDERS = {\n WINDOWS: 'windows',\n SQL: 'sql',\n NOVELL: 'novell',\n CURRENT: 'current'\n};\n\n///**\n// * Варианты результата аутентификации. \n// * @readonly\n// * @global\n// * @enum {string} AUTH_REQUEST_RESULT \n// * @example \n//*/\nAUTH_REQUEST_RESULT = {\n DONE: 0,\n CHANGE_DEFAULT_PASSWOD: 1,\n SHOW_LOGON_MESSAGE: 2\n};\n\n/**\n* Удялет куку UserStatus после открытия страницы входа, что она не сохранялась при закрытии браузера в режиме сохранения последних открытых вкладок.\n*/\nfunction RemoveUserStatusCookie() {\n //Очищаем cookie со статусом пользователя\n if ($.cookie('UserStatus') === 'logout') {\n $.cookie('UserStatus', null, { path: '/' });\n $.cookie('UserStatus', null, { path: '/pda' });\n }\n}\n\n/**\n* Проводит аутентификацию пользователя через сервис Authentication.\n*/\nfunction LoginUser(providerName, userName, userRealm, userPassword, rememberMe, changePasswordCallback, showMessageCallback, showErrorCallback) {\n var mobileView = WA.isMobile();\n var returnUrl = (new WA.URL()).getParam('ReturnUrl');\n \n var loginFunc = function () {\n WA.services.authenticaion.loginUser(providerName, userName, userRealm, userPassword, rememberMe,\n function (res) {\n switch (res.Result) {\n case AUTH_REQUEST_RESULT.CHANGE_DEFAULT_PASSWOD:\n //Необходимо сменить пароль\n if (changePasswordCallback)\n changePasswordCallback(res.Warning);\n break;\n\n case AUTH_REQUEST_RESULT.SHOW_LOGON_MESSAGE:\n //Отображаем сообщение о входе\n if (showMessageCallback)\n showMessageCallback(res.Warning);\n break;\n\n default:\n //Вход успешен, переходим на страницу по умолчанию, либо returnUrl\n window.location.href = (returnUrl == '') ? g_defaultPage : returnUrl;\n }\n }, function (res) {\n //Аутентификация завершилась ошибкой\n if (showErrorCallback)\n showErrorCallback(res.Error);\n });\n };\n\n if (providerName == STD_AUTH_PROVIDERS.CURRENT) {\n //Пользователь уже аутентифицирован, можно просто перейти на страницу по умолчанию, либо returnUrl\n window.location.href = (returnUrl == '') ? g_defaultPage : returnUrl;\n } else {\n if (mobileView) {\n loginFunc();\n } else {\n WA.AgentInit.done(function () {\n loginFunc();\n });\n }\n }\n}\n\n/**\n* Изменяет пароль пользователя.\n*/\nfunction ChangeUserPassword(providerName, userName, oldPassword, newPassword, confirmPassword, isFirstLogin, successCallback, showErrorCallback) {\n WA.services.authenticaion.changePassword(userName, oldPassword, newPassword, confirmPassword, isFirstLogin,\n function (res) {\n if (successCallback)\n successCallback(res.Warning);\n }, function (res) {\n if (showErrorCallback)\n showErrorCallback(res.Error);\n }); \n}","\"use strict\";\n\n(function (global) {\n /**\n * Функции отвечающие за работу с задачами и заданиями.\n * @namespace Core.customWorks\n * @since 5.5.0.2201\n */\n global.customWorks = {};\n})(window.Core);\n\n(function (global) {\n /**\n * Установить доступность кнопок на ленте для задач и заданий.\n * @since 5.5.2201\n */\n global.bindButtonsEnabling = function (textAreaSelector) {\n var buttonNames = ['Save'];\n // Флаг, указывающий необходимость осуществления блокировки кнопок не ленте\n // на основе режима доступности\n var isControlChangedBefore = false;\n $(textAreaSelector).one(\"keypress\", function () {\n Core.cards.enableButtonsOnFormChange(buttonNames);\n if (!isControlChangedBefore) {\n Core.cards.setButtonsEnablingOnEnabledMode();\n isControlChangedBefore = true;\n }\n });\n // Установить изменение доступности при изменении списка вложений.\n var attachments = $('.ListRequisite');\n attachments.change(function () {\n Core.cards.enableButtonsOnFormChange(buttonNames);\n if (!isControlChangedBefore) {\n Core.cards.setButtonsEnablingOnEnabledMode();\n isControlChangedBefore = true;\n }\n });\n // Установить изменение состояний на основе выделения списка вложений\n attachments.on('itemChecked', function () {\n var buttons = WA.CR.toolBar.buttons.getButtonsEnabledOnAttachmentSelection();\n var selectedItems = WA.CR.objectList.getSelectedItems();\n if (selectedItems.length) {\n buttons.forEach(function (button) {\n // В зависимости от состояния ЗЗУ\n switch (WA.CR.State) {\n case WORK_STATE.RUNNING:\n case WORK_STATE.CONTROLLED:\n case WORK_STATE.CONTINUED:\n if (button.getIsEnabledOnRunning()) {\n button.enable();\n }\n break;\n case WORK_STATE.DONE:\n if (button.getIsEnabledOnDone()) {\n button.enable();\n }\n break;\n case WORK_STATE.ABORTED:\n if (button.getIsEnabledOnAborted()) {\n button.enable();\n }\n break;\n }\n });\n } else {\n buttons.forEach(function (button) {\n button.disable();\n });\n }\n });\n };\n\n})(window.Core.customWorks)","\"use strict\";\n\n(function (global) {\n /**\n * Функции отвечающие за работу с задачами.\n * @namespace Core.tasks\n * @since 5.5.0.2201\n */\n global.tasks = {};\n})(window.Core);\n\n(function (global) {\n\n /**\n * Инициализация кнопки выбора ТМ в поле маршрута.\n * @since 5.5.0.1000\n */\n global.initSelectStandardRouteButton = function () {\n var jRoute = $('#CardContrrolRoute');\n if (jRoute.length === 0) {\n // Когда ТМ выбран будет другой контрол.\n jRoute = $('#CardContrrolStandartRoute');\n }\n jRoute = jRoute.closest('.reference_requisite');\n\n var jAdditionalIcons = jRoute.find('.Req_AdditionalIcons');\n\n var jSelectStandardRoute = $('

    ');\n jSelectStandardRoute.on('click', function () {\n ChangeStandartRoute();\n });\n\n // Удаляем все иконки внутри, т.к. они бесполезны с данным справочником (ТМ).\n jAdditionalIcons.find('p').remove();\n\n // Добавляем новую иконку для выбор ТМ.\n jAdditionalIcons\n .append(jSelectStandardRoute)\n .show();\n\n return global;\n };\n\n /**\n * Установить доступность кнопок на ленте для задач.\n * @since 5.5.0.2201\n */\n global.bindButtonsEnabling = function () {\n if (!WA.CR.IsNew) {\n var toolBarButtons = WA.CR.toolBar.buttons;\n var isBindNeeded = !(toolBarButtons.isExist('TaskChange') && !toolBarButtons.TaskChange.isSelected());\n if (isBindNeeded) {\n window.Core.customWorks.bindButtonsEnabling('textarea.Card_Task_EditText');\n\n var toolBarButtonNames = ['TaskHighImp', 'TaskLowImp'];\n var enableButtonNames = ['Save'];\n toolBarButtonNames.forEach(function (buttonName) {\n var toolBarButton = toolBarButtons[buttonName];\n if (toolBarButton) {\n toolBarButton.bind('click', function () {\n Core.cards.enableButtonsOnFormChange(enableButtonNames);\n });\n }\n });\n\n $(\".Card_Table_Container\").find('input').one('change keypress',function () {\n Core.cards.enableButtonsOnFormChange(enableButtonNames);\n });\n }\n }\n\n return global;\n };\n\n})(window.Core.tasks);","\n(function (global) {\n\n /**\n * Функции реализующие логику страниц\n * @namespace Core.pages\n * @since 5.2.0.1200\n */\n global.pages = {}\n})(window.Core);","\"use strict\";\n(function (global) {\n\n var waitIntervalID = 0;\n var selectedProvider;\n var defaultRealm;\n var jLogin,\n jPassword,\n jRealm,\n jRealmBlock,\n jChangePasswordBlock,\n jChangePasswordLink,\n jWinAuthLogin,\n jChangePasswordLabel,\n jLoginLabel,\n jDefaultRealm,\n jProviders,\n jError,\n jLoginContainer,\n jAdvancedSettingsContainer;\n\n\n /**\n * Логика страницы входа веб-доступа\n * @namespace Core.preview.scrolling\n * @since 5.2.0.1200\n */\n global.login = {\n\n init: function () {\n InitHoverForButtons();\n RemoveUserStatusCookie();\n log.debug('LOGIN','LoginPage initialization');\n\n this.initInputsFocus();\n this.initDomObjects();\n this.bindInputHandlers();\n this.onAuthenticationProviderChange($('#ProviderList'));\n log.debug('LOGIN', 'LoginPage initialized'); \n },\n\n /**\n * Выбираем куда поставить фокус при загрузке. На поле с паролем или на поле\n * с логином.\n */\n initInputsFocus: function () {\n var login = $(\"#LoginTextBox\");\n try {\n if (login.val() != \"\") {\n $(\"#PasswordTextBox\").focus();\n } else {\n login.focus();\n }\n } catch (ex) {\n //Глушим. \n };\n },\n\n /**\n * Закшируем все объекты раз и до конца.\n * @global\n * @function initDomObjects \n */\n initDomObjects: function () {\n // jRealmBlock = $(\"#realmBlock\");\n // //jDefaultRealmBlock = $(\"#defaultRealmBlock\");\n jDefaultRealm = $(\"#DefaultRealmValue\");\n jProviders = $(\"#ProviderList\");\n // jChangePasswordBlock = $(\"#changePaswordBlock\");\n // jChangePasswordLink = $('#ChangePasswordLink'); \n // jWinAuthLogin = $('#WinAuthLogin');\n jLogin = $('#LoginTextBox');\n jPassword = $('#PasswordTextBox');\n jRealm = $(\"#RealmTextBox\");\n jChangePasswordLabel = $('.forchangepwd');\n jLoginLabel = $('.forlogin');\n jAdvancedSettingsContainer = $(\"#advancedSettingsContainer\");\n jError = $('#login_error');\n jLoginContainer = $('#login_container');\n },\n\n /**\n * Навешиваем обработчки пользовательского ввода\n * @global\n * @function bindInputHandlers\n */\n bindInputHandlers: function () {\n if (jProviders.find(\"option[value='\" + STD_AUTH_PROVIDERS.WINDOWS + \"']\").length !== 0) {\n jLogin.bind('keypress keyup', this.processUserName);\n if (WA.ENV.isAndroid()) jLogin.bind('change', this.processUserName);\n };\n },\n\n /**\n * Показать дополнительные параметры\n */\n toggleAdvancedSettings: function (el) {\n if ($(el).hasClass(\"disabled\")) return;\n //$('#advancedSettingsContainer').slideToggle('fast');\n var height = 140;\n $('#advancedSettings').hide('fast');\n \n $('#advancedSettingsContainer').css({ visibility: \"visible\" }).animate(\n { height: height, opacity: 1.0},\n { duration: 'normal' });\n $('#defaultRealmRow').animate(\n { height: 0, margin: 0, opacity: 1.0},\n { duration: 'normal' });\n },\n\n /**\n * Оправка формы по Enter-у\n */\n formSubmit: function (event) {\n try {\n var isLoginDisabled = ($(\"#LoginTextBox\").attr('disabled') == \"disabled\");\n var charCode = (event.which) ? event.which : window.event.keyCode;\n if (charCode == 13) {\n if (isLoginDisabled) {\n document.getElementById('ChangePasswordButton').onclick();\n } else {\n document.getElementById('LoginButton').onclick();\n }\n return false;\n }\n } catch (e) { };\n }, \n\n /**\n * Обновляем интерфейс при смене типа аутентификации пользователем.\n */\n onAuthenticationProviderChange: function (el) {\n var type = el.val();\n selectedProvider = type;\n\n var credentials = g_userCredentials[selectedProvider];\n if (credentials) {\n var loginField = credentials[\"http://schemas.comp.npo/ws/2015/user/credentials/name\"];\n var passwordField = credentials[\"http://schemas.comp.npo/ws/2015/user/credentials/password\"];\n var realmField = credentials[\"http://schemas.comp.npo/ws/2015/user/credentials/realm\"];\n var enteredLogin = $(\"#LoginTextBox\").val();\n \n\n if (loginField) {\n $(\"#loginRow\").show();\n $(\"#LoginTextBox\").val(enteredLogin);\n $(\"#loginLabel\").text(loginField.caption);\n } else {\n $(\"#loginRow\").hide();\n }\n\n if (passwordField) {\n $(\"#passwordRow\").show();\n //$(\"#PasswordTextBox\").val('');\n $(\"#passwordLabel\").text(passwordField.caption);\n } else {\n $(\"#passwordRow\").hide();\n }\n\n if (realmField) {\n $(\"#defaultRealmRow\").show();\n $(\"#DefaultRealmValue\").val(realmField.value);\n $(\"#defaultRealmLabel\").text(realmField.caption);\n defaultRealm = realmField.value;\n\n $(\"#realmRow\").show();\n $(\"#RealmTextBox\").val(realmField.value);\n $(\"#realmLabel\").text(realmField.caption);\n } else {\n $(\"#realmRow\").hide();\n $(\"#defaultRealmRow\").hide();\n }\n\n $(\"#LoginTextBox\").attr('disabled', false);\n $(\"#PasswordTextBox\").attr('disabled', false);\n $(\"#RealmTextBox\").attr('disabled', false);\n } else {\n $(\"#LoginTextBox\").attr('disabled', true);\n $(\"#PasswordTextBox\").attr('disabled', true);\n $(\"#RealmTextBox\").attr('disabled', true);\n\n var authenticatedUserName = $(\"#AuthenticatedUserName\").val();\n if (authenticatedUserName != \"\") {\n $(\"#LoginTextBox\").val(authenticatedUserName);\n this.showMessageOnLogin(L('THIRD_PARTY_PASSTHROUGH_AUTHENTICATION_CONFIGURED'), MESSAGE_TYPE.INFO);\n }\n }\n\n if (selectedProvider == STD_AUTH_PROVIDERS.SQL) {\n $(\"#changePaswordBlock\").show();\n $(\"#ChangePasswordLink\").removeClass('hidden');\n } else {\n $(\"#changePaswordBlock\").hide();\n $(\"#ChangePasswordLink\").addClass('hidden');\n }\n },\n\n /**\n * Отображает сообщение при входе пользователя.\n */\n showLogonMessage: function (msg) {\n $(function () {\n try { $(\"select\").focus(); } catch (ex) { };\n\n if ($('#modal').length == 0)\n $(\"form#LoginForm\").append(\"\")\n\n var $dialog = $(\"#modal\")\n .html(msg)\n .dialog({\n resizable: false,\n modal: true,\n autoOpen: true,\n title: L(\"INFO\"),\n width: 380,\n buttons:\n [\n {\n text: L(\"OK\"),\n click: function () {\n window.location.reload();\n }\n }\n ]\n });\n });\n InitMouseEvents();\n },\n\n /**\n * Отображает сообщение об успешной смене пароля.\n */\n showChangePasswordMessage: function (firstMsg, firstLogin, msg) {\n var me = this;\n\n //Данный код отображает тултип вместо окна диалога\n //$('#PasswordTextBox').val($('#NewPasswordTextBox').val());\n //HideTopSpinner(L(\"USER_PASSWORD_WAS_CHANGED_SUCCESSFULLY\"), 2000);\n //me.loginUser();\n //me.showLoginForm();\n //return false;\n\n $(document).ready(function () {\n try { $(\"select\").focus(); } catch (ex) { };\n\n if ($('#modal').length == 0)\n $(\"form#LoginForm\").append(\"\")\n\n var $dialog = $(\"#modal\")\n .html(msg)\n .dialog({\n resizable: false,\n modal: true,\n autoOpen: true,\n title: L(\"INFO\"),\n width: 360,\n buttons:\n [\n {\n text: L(\"OK\"),\n click: function () {\n if (firstMsg == 'False' && firstLogin == 'True') {\n $('#LoginUser').attr('disabled', true);\n var buttonSet = $('.ui-dialog').find('.ui-dialog-buttonset');\n buttonSet.find('button').attr('disabled', true);\n buttonSet.prepend('');\n $('#PasswordTextBox').val($('#NewPasswordTextBox').val());\n me.loginUser();\n me.showLoginForm();\n } else {\n if (firstMsg == 'False' && firstLogin == 'False') {\n $('#PasswordTextBox').val('');\n $('#NewPasswordTextBox').val('')\n $('#ConfirmPasswordTextBox').val('')\n me.showLoginForm();\n }\n $(this).dialog(\"close\");\n }\n }\n }\n ]\n });\n });\n InitMouseEvents();\n },\n\n ///**\n //* Поиск информации о домене в имени пользователя\n //* @innner\n //* @function findDomain\n //* @return {object}\n //*/\n //findDomain: function (text, separator) {\n // var hasDomain = false,\n // connectionString,\n // userName,\n // domain;\n\n // if (text.indexOf(separator) !== -1) {\n // connectionString = text.split(separator);\n // userName = connectionString[1];\n // domain = connectionString[0];\n // hasDomain = true;\n // };\n\n // return {\n // \"hasDomain\": hasDomain,\n // \"userName\": userName,\n // \"domain\": domain\n // };\n //},\n\n /**\n * Обработка домена в строке с именем пользователя\n * @global \n * @function processUserName\n */\n processUserName: function () {\n var findDomain = function (text, separator) {\n var hasDomain = false,\n connectionString,\n userName,\n domain;\n\n if (text.indexOf(separator) !== -1) {\n connectionString = text.split(separator);\n userName = connectionString[1];\n domain = connectionString[0];\n hasDomain = true;\n };\n\n return {\n \"hasDomain\": hasDomain,\n \"userName\": userName,\n \"domain\": domain\n };\n }\n\n if (selectedProvider == STD_AUTH_PROVIDERS.WINDOWS) {\n var userName = $(this).val();\n var separators = ['\\\\'];\n\n for (var separator in separators) {\n var domainInfo = findDomain(userName, separators[separator]);\n if (domainInfo.hasDomain) {\n jDefaultRealm.val(domainInfo.domain);\n jRealm.val(domainInfo.domain);\n } else {\n //Меняем домен на значение по умолчанию, только если текущее значение не было изменено пользователем.\n if (jDefaultRealm.text() == jRealm.val()) {\n jDefaultRealm.val(defaultRealm);\n jRealm.val(defaultRealm);\n }\n }\n }\n }\n },\n\n /**\n * Отображает сообщение на страница входа пользователя.\n * @global\n * @function showMessageOnLogin \n */\n showMessageOnLogin: function (msg, type) {\n if (jError.length == 0) {\n jError = $('
    ');\n jLoginContainer.append(jError);\n }\n\n if (msg) {\n jError.html(msg).show();\n if (type == MESSAGE_TYPE.INFO) {\n jError.addClass('login__error_type_notification');\n } else {\n jError.removeClass('login__error_type_notification');\n }\n } else {\n jError.hide().text('');\n }\n },\n\n /**\n * Скрывает сообщение на страница входа пользователя.\n * @global\n * @function hideMessageOnLogin \n */\n hideMessageOnLogin: function () {\n this.showMessageOnLogin('');\n },\n\n /**\n * Если была нажата ссылка \"изменить пароль\", показываем форму смены пароля.\n * @global\n * @function ShowPasswordChangeForm \n */\n showPasswordChangeForm: function (firstLogin) {\n jAdvancedSettingsContainer.hide();\n jChangePasswordLabel.removeClass('hidden');\n jLoginLabel.addClass('hidden');\n //Очищаем поле пароля, игнорируем первый вход (т.е. пароль по умолчанию, которого сейчас нет)\n jPassword.val('');\n $(\"#defaultRealmRow\").hide(); \n jLogin.attr('disabled', true);\n jLogin.attr('readonly', true).addClass('react-input__field_disabled');\n //if (firstLogin == 'True') {\n // jLogin.attr('readonly', true).css('color', '#808080');\n // jPassword.parent().hide();\n //}\n $('#IsFirstLogin').val(firstLogin);\n $('#login_error').hide();\n return false;\n },\n\n /**\n * После успешной смены пароля, а также при нажатии на кнопку \"Отмена\"\n * восстанавливается форма логина.\n * @global\n * @function ShowLoginForm \n */\n showLoginForm: function () {\n jAdvancedSettingsContainer.show();\n this.hideMessageOnLogin();\n jLoginLabel.not('.novell').removeClass('hidden');\n jChangePasswordLabel.addClass('hidden'); \n jLogin.attr('readonly', false).removeClass('react-input__field_disabled');\n jLogin.attr('disabled', false);\n jPassword.parent().show();\n return false;\n },\n\n changePassword: function () {\n var me = this;\n $(\"#ChangePasswordButton\").attr('disabled', true).addClass('disabled');\n\n ChangeUserPassword($(\"#ProviderList\").val(),\n $(\"#LoginTextBox\").val(),\n $(\"#PasswordTextBox\").val(),\n $(\"#NewPasswordTextBox\").val(),\n $(\"#ConfirmPasswordTextBox\").val(),\n $(\"#IsFirstLogin\").val(),\n function (message) {\n $(\"#ChangePasswordButton\").removeAttr('disabled').removeClass('disabled');\n me.hideMessageOnLogin();\n me.showChangePasswordMessage('False', $(\"#IsFirstLogin\").val(), message);\n }, function (message) {\n $(\"#ChangePasswordButton\").removeAttr('disabled').removeClass('disabled');\n me.showMessageOnLogin(message);\n });\n\n //CallService(\"/Authentication.asmx/ChangePassword\", {\n // Login: $(\"#LoginTextBox\").val(),\n // PasswordOld: $(\"#PasswordTextBox\").val(),\n // PasswordNew: $(\"#NewPasswordTextBox\").val(),\n // PasswordConfirm: $(\"#ConfirmPasswordTextBox\").val(),\n // IsFirstLogin: $(\"#IsFirstLogin\").val()\n //}, function (res) {\n // $(\"#ChangePasswordButton\").removeAttr('disabled').removeClass('disabled');\n // if (res.Success) {\n // me.hideMessageOnLogin();\n // me.showChangePasswordMessage('False', $(\"#IsFirstLogin\").val(), res.Warning);\n // } else {\n // me.showMessageOnLogin(res.Error);\n // }\n //}\n //);\n return false;\n },\n\n loginUser: function () {\n var me = this;\n clearTimeout(waitIntervalID);\n $(\"#LoginButton\").attr('disabled', true).addClass('disabled');\n waitIntervalID = setTimeout(this.showWait, 800);\n\n var userRealm = $(\"#RealmTextBox\").val();\n if (userRealm == \"\")\n userRealm = $(\"#DefaultRealmLabel\").text();\n\n LoginUser($(\"#ProviderList\").val(), $(\"#LoginTextBox\").val(), userRealm, $(\"#PasswordTextBox\").val(), ($(\"#RememberMeChk:checked\").length == 1),\n function (message) {\n clearTimeout(waitIntervalID);\n me.hideWait();\n $(\"#LoginButton\").removeAttr('disabled').removeClass('disabled');\n me.showPasswordChangeForm('True');\n me.showChangePasswordMessage('True', 'True', message);\n }, function (message) {\n clearTimeout(waitIntervalID);\n me.hideWait();\n $(\"#LoginButton\").removeAttr('disabled').removeClass('disabled');\n me.showLogonMessage(message);\n }, function (message) {\n clearTimeout(waitIntervalID);\n me.hideWait();\n $(\"#LoginButton\").removeAttr('disabled').removeClass('disabled');\n me.showMessageOnLogin(message);\n });\n return false;\n },\n\n showWait: function () {\n var loginform = $('#login_form');\n loginform.find(\"input, select, span, label, a\").attr('disabled', true).addClass('disabled');\n loginform.find(\"clearfix.forlogin\").hide();\n $('#ChangePwdLink').addClass('disabled');\n loginform.append(\"\");\n loginform.find(\".login_wait\").show();\n },\n\n hideWait: function () {\n var loginform = $('#login_form');\n loginform.find(\".login_wait\").hide().remove();\n loginform.find(\".clearfix.forlogin\").show();\n $('#ChangePwdLink').removeClass('disabled');\n loginform.find(\"input, select, span, label, a\").removeAttr('disabled').removeClass('disabled');\n }\n };\n})(window.Core.pages)","\"use strict\";\n(function (global) {\n\n global.explorer = {\n _jMainContainer: null,\n _jFilterContainer: null,\n _jSpinner: null,\n\n /**\n * Инициализирует проводник.\n *\n * @method Core.pages.explorer.init\n */\n init: function () {\n var me = this;\n\n // TODO перенести в текущий объект\n InitToolbar();\n InitExplorerSidebar();\n InitFolderCover();\n window.name = 'explorer';\n\n // Установить текущее состояние для истории, если его еще нет.\n me.setCurrentState();\n\n // Обновление содержимого окна.\n WA.history.bind(WA.history.EVENT.CHANGE_STATE, function (state) {\n if (state && state.type === 'explorer' && state.folderID) {\n me.openFolder(state);\n } else {\n // Если state не определен - перезагружаем окно.\n window.location.reload();\n }\n });\n\n me._jMainContainer = $('#main_container .MainContentPlaceHolder');\n me._jFilterContainer = $(\"#QFilter\");\n me._jSpinner = $('#main_container .explorer-spinner');\n\n me._initFolderTreeScroll();\n me._initExpandFoldertree();\n },\n\n /**\n * Загружает указанную папку.\n *\n * @method Core.pages.explorer.openFolder\n * @param {object} folder\n */\n openFolder: function (folder) {\n var me = this;\n\n me._jMainContainer.empty();\n me._showSpinner();\n\n WA.SRV.call('/Folder.asmx/ContentAsHtml', {\n 'FolderId': folder.folderID,\n 'ShowCover': !!folder.hasCover,\n 'IsCoverOnly': !!folder.hasCoverOnly\n }).done(function (content) {\n WA.CR.ID = folder.folderID;\n\n // Панель фильтрации\n me._jFilterContainer.html(content.Filter);\n if (content.FilterJs)\n _exec(content.FilterJs);\n Core.footer\n .initFastSearchFilter()\n .initViewSwitchingMenu();\n Core.toolBars.objectList.initPreFiltersMenu();\n\n // Основной контент.\n me._jMainContainer.html(content.Main);\n if (content.MainJs)\n _exec(content.MainJs);\n me._hideSpinner();\n\n // Выделить узел дерева\n if (folder.path)\n WA.CR.folderTree.selectNodeByPath(folder.path);\n\n // Обновить счетчик непрочитанных для текущей папки\n WA.CR.folderTree.updateUnreadJobCount(folder.folderID, false);\n\n // Заголовок\n me.setTitle(folder.title);\n\n // Применить кастомные стили для обложки\n var jRightColumn = $(\"#right_column\");\n var hasCoverSelector = \"folder_has_cover\";\n if (folder.hasCover) {\n var jCoverFrame = $('#folder_cover_frame');\n changeCoverStylesImages(jCoverFrame);\n jRightColumn.addClass(hasCoverSelector);\n } else {\n jRightColumn.removeClass(hasCoverSelector);\n }\n\n //Если текущая папка допускает в качестве контента только ЗЗУ, то скрываем кнопку экспортировать документ.\n if (folder.contentType === 'Job') {\n WA.CR.toolBar.buttons[\"ExportDoc\"].hide();\n WA.CR.toolBar.buttons[\"MarkAsRead\"].show();\n } else if (folder.contentType === 'EDocument') {\n //Если текущая папка допускает в качестве контента только документы, то скрываем кнопку пометить как прочитанное.\n WA.CR.toolBar.buttons[\"MarkAsRead\"].hide();\n WA.CR.toolBar.buttons[\"ExportDoc\"].show();\n } else if (folder.contentType === 'ComponentToken' || folder.contentType === 'Task') {\n //Если текущая папка допускает в качестве контента только варианты запуска, то скрываем кнопки пометить как прочитанное и экспортировать документ.\n WA.CR.toolBar.buttons[\"MarkAsRead\"].hide();\n WA.CR.toolBar.buttons[\"ExportDoc\"].hide();\n } else {\n WA.CR.toolBar.buttons[\"MarkAsRead\"].show();\n WA.CR.toolBar.buttons[\"ExportDoc\"].show();\n }\n\n // Пересчитать размеры элементов\n setRealHeightAndWidth();\n }).fail(function (msg) {\n WA.CR.inlineHint.showError(msg);\n });\n\n function _exec(func) {\n var f = new Function(func);\n setTimeout(function () {\n f.apply(window);\n }, 10);\n }\n },\n\n /**\n * Устанавливает заголовок текущего окна проводника.\n *\n * @method Core.pages.explorer.setTitle\n * @param {} title\n * @returns {}\n */\n setTitle: function (title) {\n window.document.title = title;\n var folderTitle = $('.explorer-folder-name');\n folderTitle.text(title);\n folderTitle.attr('title', title);\n },\n\n /**\n * Возвращает заголовок текущего окна проводника.\n *\n * @method Core.pages.explorer.setTitle\n * @returns {}\n */\n getTitle: function (title) {\n return $('.explorer-folder-name').text();\n },\n\n\n /**\n * Обновляет текущий список и узел для текущей папки.\n *\n * @method Core.pages.explorer.refreshList\n */\n refreshList: function () {\n var me = this;\n var id = WA.CR.getID();\n me._showSpinner();\n WA.CR.objectList.reload().done(function () {\n WA.CR.folderTree.updateNodesWithFolder(id);\n WA.CR.folderTree.updateUnreadJobCount(id, true);\n me._hideSpinner();\n });\n },\n\n /**\n * Устанавливает history state для текущей страницы проводника.\n *\n */\n setCurrentState: function () {\n // Не устанавливаем текущее состояние для страниц поиска, чтобы при возвращении назад выполнялся поиск.\n if (!history.state && location.href.toLowerCase().search('mode=search') < 0) {\n var jMainContainer = $('#main_container .MainContentPlaceHolder');\n var id = WA.CR.getID();\n var title = this.getTitle();\n // Если нет контейнера для списка, то значит в режиме папки.\n var hasCover = jMainContainer.find('.object_contents').length === 0;\n // QFilter пустой, если режим \"Только обложка\"\n var hasCoverOnly = hasCover && $('#QFilter').children().length === 0;\n var url = new WA.URL();\n var fpath = url.getParam('fpath');\n\n WA.history.replaceState({\n type: 'explorer',\n folderID: id,\n title: title,\n path: fpath,\n hasCover: hasCover,\n hasCoverOnly: hasCoverOnly\n }, title, url.asString());\n }\n },\n\n /*\n * Выполняет быстрый поиск.\n * @method Core.pages.explorer.executeQuickSearch\n */\n executeQuickSearch: function (value) {\n // TODO: Произвести запись в клиентскую статистику.\n var f = $(\"form:first\");\n var url = f.attr('action');\n\n ShowTopSpinner(L(\"SEARCHING\"));\n\n url = ChangeParamInURL(url, 'searchname', 'SrchQuick');\n url = ChangeParamInURL(url, 'mode', 'search');\n url = RemoveParamInURL(url, 'show');\n url = ChangeParamInURL(url, 'value', value);\n url = ChangeParamInURL(url, 'sort', '-RANK');\n url = RemoveParamInURL(url, 'uid');\n url = RemoveParamInURL(url, 'refcode');\n url = RemoveParamInURL(url, 'treeitem');\n\n f.attr('action', url);\n f.submit();\n },\n\n /**\n * Скрыть область с деревом папки\n * @private\n */\n collapseFolderTree: function () {\n $.when(WA.SideBarInit).then(function () {\n WA.CR.sideBar.collapse();\n });\n },\n /**\n * Раскрытие области с деревом папки\n * @private\n */\n expandFolderTree: function () {\n $.when(WA.SideBarInit).then(function () {\n WA.CR.sideBar.expand();\n });\n },\n\n /**\n * Отображает спиннер.\n * @private\n */\n _showSpinner: function () {\n var me = this;\n me._jMainContainer.hide();\n me._jSpinner.show();\n },\n\n /**\n * Скрывает спиннер.\n * @private\n */\n _hideSpinner: function () {\n var me = this;\n me._jMainContainer.show();\n me._jSpinner.hide();\n },\n\n /**\n * Инициализирует действие раскрытия области с деревом папок.\n * @private\n */\n _initExpandFoldertree: function () {\n var me = this;\n $(\"#expand_tree_container, .explorer-header__expand-area\").click(function () {\n me.expandFolderTree();\n });\n },\n\n /**\n * Заменяет стандартный скролл у дерево папок.\n * @private\n */\n _initFolderTreeScroll: function () {\n $(\"#tree_container\").niceScroll({\n cursorcolor: \"#d8dce3\",\n cursorwidth: \"6px\",\n cursorborder: \"0\",\n autohidemode: \"false\",\n cursorborderradius: \"0\",\n railpadding: { right: 0 }\n });\n },\n\n /**\n * Инициализирует кнопку отображения папок в списке страницы.\n * @private\n */\n _initShowFolderInList: function () {\n\n // Инициализирует клик по кнопке Показать/Скрыть папки в списке.\n function bindShowFoldersInListClick() {\n $(\"#ShowFoldersInList\").bind('click', function () {\n var jShowFoldersInListButton = $(\"#ShowFoldersInList\");\n var selectedSelector = \"selected\";\n var currentFolderID = WA.current.getID();\n var currentNeedToShow = !jShowFoldersInListButton.hasClass(selectedSelector);\n\n WA.services.call(\"/Session.asmx/UpdateShowFoldersInList\", {\n FolderID: currentFolderID,\n NeedToShow: currentNeedToShow\n }).success(function (result) {\n if (currentNeedToShow) {\n jShowFoldersInListButton.addClass(selectedSelector)\n WA.CR.objectList.setIsShowFolders(true);\n } else {\n jShowFoldersInListButton.removeClass(selectedSelector);\n WA.CR.objectList.setIsShowFolders(false);\n }\n WA.CR.objectList.loadFolderContent(currentFolderID);\n });\n });\n };\n\n bindShowFoldersInListClick();\n\n WA.current.objectList\n .bind('onChange', function (selectedItems, allItems) {\n\n var jShowFoldersInListButton = $(\"#ShowFoldersInList\");\n var selectedSelector = \"selected\";\n\n if (location.href.toLowerCase().search('mode=search') < 0) {\n bindShowFoldersInListClick();\n if (WA.CR.objectList.isShowFolders())\n jShowFoldersInListButton.addClass(selectedSelector);\n else\n jShowFoldersInListButton.removeClass(selectedSelector);\n } else {\n jShowFoldersInListButton.hide();\n jShowFoldersInListButton.prev().hide();\n }\n });\n },\n\n /**\n * Устанавливает состояние Selected/Unselected кнопок отображения папок в списке страницы.\n * @private\n */\n _setShowFolderInListState: function () {\n var jShowFoldersInListButton = $(\"#ShowFoldersInList\");\n var selectedSelector = \"selected\";\n\n if (location.href.toLowerCase().search('mode=search') < 0) {\n if (WA.CR.objectList.isShowFolders())\n jShowFoldersInListButton.addClass(selectedSelector);\n else\n jShowFoldersInListButton.removeClass(selectedSelector);\n } else {\n jShowFoldersInListButton.hide();\n jShowFoldersInListButton.prev().hide();\n }\n }\n };\n})(window.Core.pages)\n","\"use strict\";\n\n(function (global) {\n /**\n * Функции отвечающие за работу с документами.\n * @namespace Core.documents\n * @since 5.3.0.1000\n */\n global.documents = {};\n})(window.Core);\n\n(function (global) {\n /** \n * Массовый экспорт документов\n *\n * @param {Object[]} documents Список документов\n * @since 5.3.0.1000\n */\n global.massExport = function (documents) {\n WA.CR.spinner.showDelayed(400);\n loadAvailableTransformations().done(function (transformationValues, transformationIsSuccess) {\n var disableTransformation = !transformationIsSuccess;\n\n var archiveName = '';\n var transformationName = '';\n var needLock = false;\n\n documents = $.isArray(documents) ? documents : WA.CR.objectList.getSelectedItems();\n\n if (documents.length > 0) {\n if (typeof documents[0] == 'object') {\n var selectedDocuments =\n _.filter(documents, function (item) { return item.type == OBJECT_TYPE.EDOCUMENT; });\n documents = _.map(selectedDocuments, function (item) { return { id: item.id, name: item.name } });\n archiveName = selectedDocuments.length > 0 ? selectedDocuments[0].name + '.zip' : '';\n } else if (typeof documents[0] != 'number') {\n throw L('ERR_NOT_ALL_REQUIRED_ARGUMENTS_HAVE_BEEN_SUPLIED');\n }\n }\n\n\n if (documents.length == 1) {\n //единичный экспорт \n EDocument(documents[0]).Export();\n return;\n }\n\n var exportSettings = {\n Documents: _.map(documents, function (doc) {\n return { DocumentId: doc.id, VersionNumber: 'last', Lock: false }\n }),\n CompressResult: true,\n PackToEsd: false\n };\n\n var massExportVersionAsk = 'ask';\n var massExportLockAsk = 'ask';\n var massExportLockAll = 'lock';\n var formBuilder = new WA.CMP.forms.FormBuilder(\"massexport\");\n\n formBuilder.addInput('MASS_EXPORT_DEFAULT_ARCHIVE_NAME', null, null, null, archiveName);\n\n formBuilder.addPick('MASS_EXPORT_MAKE_TRANSFORMATION', transformationValues);\n\n formBuilder.addRadioButtons('MASS_EXPORT_VERSION', {\n 'last': 'MASS_EXPORT_VERSION_LAST',\n 'lastactive': 'MASS_EXPORT_VERSION_LAST_ACTIVE',\n 'ask': 'MASS_EXPORT_VERSION_ASK'\n }, null, 'last');\n formBuilder.addRadioButtons('MASS_EXPORT_LOCK', {\n 'lock': 'MASS_EXPORT_LOCK_ALL',\n 'nolock': 'MASS_EXPORT_WITHOUT_LOCK_ALL',\n 'ask': 'MASS_EXPORT_LOCK_ASK'\n }, null, 'nolock');\n\n formBuilder.addCheckbox('MASS_EXPORT_TO_STRUCTURED_DOCUMENT', false);\n formBuilder.addCheckbox('EXPORT_WITH_ONLY_APPROVING_SIGNATURE', false);\n\n var dialog = new WA.CMP.dialogs.BaseDialog();\n dialog.setHtml(formBuilder.render());\n dialog.title = L('MASS_EXPORT_TITLE');\n dialog.isShowOkButton = true;\n dialog.isShowCancelButton = true;\n\n key.setScope('modalwindow');\n\n dialog.bind('onShow', function () {\n if (disableTransformation) {\n formBuilder.disable('MASS_EXPORT_MAKE_TRANSFORMATION');\n }\n $('.primary').focus();\n });\n\n\n var showExportResult = function (res) {\n var dialog = new WA.CMP.dialogs.MessageBox();\n var exportFailedDocuments = _.filter(res.Result.DocumentsMassExportResult, function (d) { return !d.Success });\n\n var messages = _.map(exportFailedDocuments, function (failedDoc) {\n var currentDocument = _.first(_.filter(documents, function (d) { return d.id == failedDoc.DocumentId }));\n return format('
  • {0} \"{1}\": {2}
  • ',\n L('DOCUMENT'),\n ('' + currentDocument.name).escapeHtml(),\n failedDoc.Result,\n (new WA.Link(currentDocument.id, OBJECT_TYPE.EDOCUMENT)).toURL().asString());\n });\n\n if (exportFailedDocuments.length <= 0) {\n if (res.Success) {\n dialog.showInfo(L('MASS_EXPORT_COMFIRMATION'));\n }\n } else {\n var details = new WA.CMP.forms.FormBuilder('exportDetails');\n details.setOrientation(ORIENTATION.VERTICAL);\n details.addTextFrame('MASS_EXPORT_NOT_ALL_DOCUMENTS_EXPORTED_INFORMATION_MESSAGE', '
      ' + messages.join('') + '
    ');\n details.renderAsync().done(function (data) {\n if (!res.Success || res.Warning) {\n dialog.showError(L('MASS_EXPORT_ERROR'), data);\n } else {\n dialog.showInfo(L('MASS_EXPORT_COMFIRMATION'), data);\n }\n });\n }\n }\n\n // Функция вызывает метод веб-сервиса экспорта и обрабатывает результат.\n var exportDocuments = function (exportSettings, archiveName, transformationName) {\n WA.services.call('/EDocument.asmx/ExportMultipleDocuments', {\n Settings: exportSettings,\n ArchiveName: archiveName,\n TransformationName: transformationName\n }, null, null, true, true)\n .success(function (res, res2) {\n showExportResult(res2);\n\n if (!res2.Warning)\n window.open('/Download.ashx?accesstype=private&id=' + res.Result);\n }).error(function (res, res2) {\n if (res2 && res2.Result)\n showExportResult(res2);\n\n if (res2.Result.Success || _.any(res2.Result.DocumentsMassExportResult, function (r) { return r.Success; })) {\n window.open('/Download.ashx?accesstype=private&id=' + res2.Result.Result);\n }\n });\n };\n\n dialog.ok = function () {\n archiveName = formBuilder.getValue('MASS_EXPORT_DEFAULT_ARCHIVE_NAME');\n transformationName = formBuilder.getValue('MASS_EXPORT_MAKE_TRANSFORMATION');\n needLock = formBuilder.getValue('MASS_EXPORT_LOCK');\n\n exportSettings.PackToEsd = formBuilder.getValue('MASS_EXPORT_TO_STRUCTURED_DOCUMENT');\n exportSettings.OnlyApprovingSignaturesType = formBuilder.getValue('EXPORT_WITH_ONLY_APPROVING_SIGNATURE');\n\n var versionFromForm = formBuilder.getValue('MASS_EXPORT_VERSION');\n\n if (versionFromForm == massExportVersionAsk || needLock == massExportLockAsk) {\n if (versionFromForm != massExportVersionAsk) {\n var settings = _.map(exportSettings.Documents, function (s) {\n return {\n DocumentId: s.DocumentId,\n VersionNumber: versionFromForm,\n Lock: needLock == massExportLockAll\n }\n });\n WA.services.callSync(\"/EDocument.asmx/GetDocumentVersions\", {\n DocumentMassExportSettings: settings\n })\n .success(function (res) {\n for (var r = 0; r < res.length; r++) {\n for (var d = 0; d < exportSettings.Documents.length; d++) {\n if (exportSettings.Documents[d].DocumentId == res[r].DocumentId) {\n exportSettings.Documents[d].VersionNumber = res[r].VersionNumber;\n continue;\n }\n }\n }\n })\n .error(function (res) { ShowError(res) });\n } else {\n exportSettings.Documents = _.map(exportSettings.Documents, function (docSetting) {\n return {\n DocumentId: docSetting.DocumentId,\n VersionNumber: 1,\n Lock: docSetting.Lock\n }\n });\n }\n\n // Shirobokov_AV: Метод показывает диалог выбора версии и блокировки.\n // @doc: object { id: docId, name: docName }.\n // @isLast: bool. Требуется для того, чтобы возвращать соответствующий ответ при клике на ok (закрывать или нет диалог).\n var showDialogForOneDocument = function (doc, isLast) {\n var deferred = $.Deferred();\n var verNum = _.filter(exportSettings.Documents, function (setting) { return doc.id == setting.DocumentId })[0].VersionNumber;\n\n ShowModalWindow('export', {\n title: format('{0}: {1}', L('EXPORT_DOCUMENT_VERSION'), doc.name),\n okText: L('EXPORT'),\n afterOpen: function () {\n BindHelpIcoClickOnModalWindow('Export');\n key.setScope('baseDialog');\n },\n close: function () {\n clearAllModalDivs();\n key.setScope('common');\n },\n ok: function () {\n var modal = $('#modal_window');\n var exportParam = modal.find('input[type=\"radio\"]:checked');\n var version = exportParam.val();\n var needBlock;\n\n if (askLock)\n needBlock = modal.find('#lock:checked').length != 0;\n else\n needBlock = needLock === massExportLockAll;\n\n deferred.resolve({ DocumentId: doc.id, VersionNumber: version, Lock: needBlock });\n\n return isLast;\n },\n cancel: function () {\n deferred.resolve(doc.id);\n\n return isLast;\n },\n params: {\n EDocID: doc.id,\n ShowLock: askLock,\n VerNumber: verNum,\n Mode: 'VIEW',\n IsExport: true,\n ShowTransformations: false,\n ShowToEsd: false\n }\n });\n\n return deferred.promise();\n }\n\n var askLock = needLock == massExportLockAsk;\n var docSettingAsked = showDialogForOneDocument(documents[0], documents.length === 1 ? true : false);\n\n var updateExportSettings = function (prevSetting) {\n for (var d = 0; d < exportSettings.Documents.length; d++) {\n if (exportSettings.Documents[d].DocumentId == prevSetting.DocumentId) {\n exportSettings.Documents[d].VersionNumber = prevSetting.VersionNumber;\n exportSettings.Documents[d].Lock = prevSetting.Lock;\n break;\n }\n }\n };\n var removeDocFromExportSettings = function (docId) {\n exportSettings.Documents = _.reject(exportSettings.Documents, function (doc) {\n return doc.DocumentId == docId;\n });\n };\n\n for (var k = 1; k < documents.length; k++) {\n (function (doc, isLast) {\n docSettingAsked = docSettingAsked.then(function (prevSetting) {\n if (_.isObject(prevSetting)) {\n updateExportSettings(prevSetting);\n } else {\n removeDocFromExportSettings(prevSetting);\n }\n return showDialogForOneDocument(doc, isLast);\n });\n })(documents[k], documents.length === k + 1);\n }\n\n docSettingAsked.then(function (prevSetting) {\n if (_.isObject(prevSetting)) {\n updateExportSettings(prevSetting);\n } else {\n removeDocFromExportSettings(prevSetting);\n }\n exportDocuments(exportSettings, archiveName, transformationName);\n });\n }\n else {\n exportSettings.Documents = _.map(exportSettings.Documents, function (settings) {\n settings.Lock = needLock === massExportLockAll;\n settings.VersionNumber = versionFromForm;\n return settings;\n });\n exportDocuments(exportSettings, archiveName, transformationName);\n }\n };\n\n dialog.show();\n // Инициализация ссылки на справку\n WA.services.call(\"/Session.asmx/GetHelpLink\", {\n HelpPageCode: \"5#EXPORT_EDOCUMENT\"\n }).success(function (res) {\n var exportHelpLink = {\n Export: JSON.parse(res)\n }\n UpdateModalWindowExtHelpLinks(exportHelpLink);\n BindHelpIcoClickOnModalWindow('Export');\n });\n\n // Управление состояниями чекбоксов В структурированный документ и Экспортировать только утверждающие подписи\n var jExportWithOnlyApprovingSignature = $(\"#export_with_only_approving_signature\");\n var jExportToEsd = $(\"#mass_export_to_structured_document\");\n jExportToEsd.on(\"change\", function () {\n if (!$(this).prop(\"checked\"))\n if (jExportWithOnlyApprovingSignature.prop(\"checked\"))\n jExportWithOnlyApprovingSignature.prop(\"checked\", false);\n });\n jExportWithOnlyApprovingSignature.on(\"change\", function () {\n if ($(this).prop(\"checked\"))\n if (!jExportToEsd.prop(\"checked\"))\n jExportToEsd.prop(\"checked\", true);\n });\n\n WA.CR.spinner.hide();\n });\n };\n\n // Загружает список доступных преобразований документов.\n function loadAvailableTransformations() {\n var d = $.Deferred();\n var values = { '': L('NO') };\n\n WA.SRV.call('/EDocument.asmx/AvailableTransformations', {}, null, null, true, true).done(function (availableTransformations) {\n\n _.each(availableTransformations, function (availableTransformation) {\n values[availableTransformation] = availableTransformation;\n });\n\n d.resolve(values, true);\n\n }).fail(function () {\n d.resolve(values, false);\n });\n\n return d;\n };\n\n /**\n * Установить доступность кнопок на ленте.\n * @since 5.5.2201\n */\n global.bindButtonsEnabling = function () {\n var buttonNames = ['Save', 'SaveAndClose'];\n // Флаг, указывающий необходимость осуществления блокировки кнопок не ленте\n // на основе режима доступности\n var isControlChangedBefore = false;\n if (WA.CR.form && WA.CR.form.isExist()) {\n Core.cards.bindButtonsEnablingOnFormChange(buttonNames);\n } else {\n switch (WA.CR.sideBar.tabs.current.name) {\n case 'ShowVerList':\n $('#main_container').find('[id$=EdocLifeStage]').not('.pickFieldHidden').change(function () {\n Core.cards.enableButtonsOnFormChange(buttonNames);\n if (!isControlChangedBefore) {\n Core.cards.setButtonsEnablingOnEnabledMode();\n isControlChangedBefore = true;\n }\n });\n break;\n case 'RightsList':\n $(\".rights-controls\").find('input[type=checkbox]').change(function () {\n $('.Rights').trigger('rightsChange');\n });\n $('.Rights').on('rightsChange', function () {\n Core.cards.enableButtonsOnFormChange(buttonNames);\n if (!isControlChangedBefore) {\n Core.cards.setButtonsEnablingOnEnabledMode();\n isControlChangedBefore = true;\n }\n });\n break;\n }\n }\n };\n\n})(window.Core.documents)","\"use strict\";\n\n(function (global) {\n /**\n * Функции отвечающие за работу с заданиями.\n * @namespace Core.jobs\n * @since 5.3.0.1010\n */\n global.jobs = {};\n})(window.Core);\n\n(function (global) {\n /**\n * Изменяет статус прочитанности заданий.\n * @description Задания помечаются непрочитанными, если все выбранные задания прочитаны. Иначе, все задания помечаются прочитанными.\n * @param {List} items Список элменетов, статус прочитанности которых требуется изменить. \n */\n global.toggleReadStatus = function (items) {\n var jobs = _.filter(items, function (e) { return e.type === OBJECT_TYPE.JOB });\n var jobIds = _.map(jobs, function (e) { return e.id });\n var unreadJobs = _.filter(jobs, function (job) { return job.isUnread(); });\n var markAsRead = unreadJobs.length > 0;\n\n WA.services.call('/Job.asmx/MassMarkAsRead', { JobIDList: jobIds, MarkAsRead: markAsRead }).success(function (res) {\n var count = -unreadJobs.length;\n // Shirobokov_AV: Задания помечаются непрочитанными, если все выбранные задания прочитаны. Иначе, все задания помечаются прочитанными.\n if (!markAsRead) {\n count = jobs.length;\n }\n\n $.each(jobs, function (i, job) {\n if (markAsRead) {\n job.removeUnreadStyle();\n } else {\n job.addUnreadStyle();\n }\n });\n\n ChangeUnreadCountInTree(count);\n }).error(function (res) {\n (new WA.CMP.dialogs.MessageBox()).showError(res);\n });\n };\n})(window.Core.jobs)","\"use strict\";\r\n\r\n(function (global) {\r\n var AgentSession = {\r\n\r\n /**\r\n * Поддерживает жизнь сессии Агента веб-доступа.\r\n *\r\n * @method WebAccess.agent.keepAlive\r\n * @return {WebAccess.agent} Объект типа agent.\r\n */\r\n keepAlive: function () {\r\n this.transmitRequest(\"PING\", \"\", { \"SessionID\": window.g_UserContextID || '' });\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Начинает новую сессию для агента.\r\n * @method WebAccess.agent._beginSession\r\n * @private\r\n * @return {object}\r\n */\r\n beginSession: function () {\r\n var me = this; \r\n var d = $.Deferred();\r\n log.info('AGENT', '\"beginSession\" method was called');\r\n var response = \"\";\r\n var params = {\r\n \"UserLanguage\": currentCultureName.split(\"-\")[0],\r\n \"UserName\": g_User.Name,\r\n \"SystemLanguage\": appLang,\r\n \"System\": g_SysCode,\r\n \"IsSecured\": (document.location.protocol == 'http:' ? 'n' : 'y'),\r\n \"Host\": document.location.host,\r\n \"WebLinkServer\": g_WebServerName,\r\n \"SessionUpdateTime\": typeof SessionUpdateTime !== 'undefined' ? SessionUpdateTime : (10 * 60000),\r\n \"MaxRequestLength\": g_MaxJsonRequestLength,\r\n \"NewJobsNotificationToken\": \"\",\r\n \"ClientAffinity\": ($.cookie('ARRAffinity') == null ? '' : $.cookie('ARRAffinity'))\r\n };\r\n //Получаем токен на запрос уведомлений о новых заданиях\r\n WA.SRV.call(\"/Security.asmx/GetOpToken0\", { Operation: TOKEN_OPERATION.GET_NEW_JOB_LIST }).done(function (token) {\r\n params[\"NewJobsNotificationToken\"] = token;\r\n\r\n //Отправляем параметры новой сессии агенту\r\n me.transmitRequest(\"BeginSession\", \"\", params).done(function (res) {\r\n d.resolve(res);\r\n }).fail(function (res) {\r\n if (!!res) {\r\n log.error('AGENT', 'Error in beginSession response: ' + res.message);\r\n }\r\n d.reject(res);\r\n });\r\n });\r\n \r\n \r\n return d.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Заканчивает сессию для агента. \r\n * @method WebAccess.agent._endSession\r\n * @private\r\n * @return {object}\r\n */\r\n endSession: function () {\r\n var proxy = this._proxy;\r\n var response = \"\";\r\n var params = {};\r\n\r\n //Отправляем параметры новой сессии агенту\r\n this.transmitRequest(\"EndSession\", \"\", params).fail(function (res) {\r\n if (!!res) {\r\n log.error('AGENT', 'Error in endSession response: ' + res.message);\r\n }\r\n });\r\n \r\n return response;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Устанавливает языковые настройки текущей сессии Агента веб-доступа.\r\n *\r\n * @method WebAccess.agent.setLanguage\r\n * @param {string} language Текущий язык. Возможные значения: ru, en\r\n * @return {WebAccess.agent} Объект типа agent.\r\n */\r\n setLanguage: function (language) {\r\n this.transmitRequest(\"SetLanguage\", \"\", { \"Language\": language });\r\n return this;\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n };\r\n\r\n window.AgentSession = AgentSession;\r\n})(window.WebAccess);\r\n","\"use strict\";\n\n/**\n * Предоставляет инструменты для работы с Агентом веб-доступа.\n * Например, запустить или отключить Агент веб-доступа.\n *\n * @namespace WebAccess.agent\n * @since 5.0.0.4100\n */\n(function (global) {\n var Agent = BaseObject.extend([AgentSession], {\n _availablePlugins: {},\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n init: function () {\n this._availablePlugins = {};\n },\n\n /**\n * Проверяет, включен ли запрет на использование и запуск Агента веб-доступа.\n *\n * @method WebAccess.agent.isDisabled\n * @return {boolean} True – запрет на использование и запуск Агент веб-доступа включен, иначе False.\n * @since 5.1.0.1511\n */\n isDisabled: function () {\n var isDisabledValue = WA.cache.getItem('agent.isDisabled');\n $.cookie('IsAgentDisabled', isDisabledValue, { expires: 3650 });\n return isDisabledValue === '1';\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Включает запрет на использование и запуск Агента веб-доступа.\n *\n * @method WebAccess.agent.disable\n * @return {WebAccess.agent} Объект типа agent.\n * @since 5.1.0.1511\n */\n disable: function () {\n log.warning('AGENT', 'Agent was manualy disabled');\n WA.cache.setItem('agent.isDisabled', '1');\n $.cookie('IsAgentDisabled', '1', { expires: 3650 });\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отключает запрет на использование и запуск Агента веб-доступа.\n *\n * @method WebAccess.agent.enable\n * @return {WebAccess.agent} Объект типа agent.\n * @since 5.1.0.1511\n */\n enable: function () {\n log.info('AGENT', 'Agent was manualy enabled');\n WA.cache.setItem('agent.isDisabled', '0');\n $.cookie('IsAgentDisabled', '0', { expires: 3650 });\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Определяет, сохранено ли в кэше значение о запрете на использование и запуск Агента веб-доступа.\n *\n * @method WebAccess.agent.isDisableSetted\n * @return {boolean} True – значение в кэше сохранено, иначе False.\n * @since 5.4.0.1037\n */\n isDisableSetted: function () {\n return WA.cache.getItem('agent.isDisabled') !== null;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверяет, доступен ли Агент веб-доступа.\n *\n * @method WebAccess.agent.isAvailable\n * @return {boolean} True – Агент веб-доступа доступен для работы, иначе False.\n *\n * @example\n * if (WebAccess.agent.isAvailable()) {\n * alert('На текущем компьютере Агент веб-доступа установлен и доступен для работы.');\n * };\n */\n isAvailable: function () {\n return this.canUseInCurrentDevice() && !this.isDisabled();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверяет, возможно ли использование Агента веб-доступа на данном устройстве.\n *\n * @method WebAccess.agent.canUseInCurrentDevice\n * @return {boolean} True – использование Агента веб-доступа возможно, иначе False.\n *\n * @example\n * if (WebAccess.agent.canUseInCurrentDevice()) {\n * alert('Использование Агента веб-доступа на данном устройстве возможно.');\n * };\n */\n canUseInCurrentDevice: function () {\n var isARM = WA.ENV.ua.toLowerCase().search(/arm/) >= 0; \n var isBlackberry = WA.ENV.os.name === \"BlackBerry\";\n return !WA.ENV.isAndroid() && !WA.ENV.isIOS() && !isARM && !isBlackberry;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Проверяет, что сессия Агента веб-доступа инициализирована.\n *\n * @method WebAccess.agent.isSessionInitialized\n * @return {boolean} True – сессия Агента веб-доступа инициализирована, иначе False.\n * @since 5.1.0.1511\n */\n isSessionInitialized: function () {\n return $.cookie('IsAgentSessionInitialized') === '1';\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Устанавливает признак инициализации сессии Агента веб-доступа.\n *\n * @param {Boolean} value Устанавливаемое значение\n * @method WebAccess.agent.setSessionInitialized\n * @return {WebAccess.agent} Объект типа agent.\n * @since 5.1.0.1511\n */\n setSessionInitialized: function (value) {\n log.info('AGENT', 'Setting IsAgentSessionInitialized cookie with value: ' + value);\n $.cookie('IsAgentSessionInitialized', value ? '1' : '0');\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отображает состояние агента.\n * @method WebAccess.agent._showState\n * @return {WebAccess.agent}\n * @since 5.1.0.1532\n * @private\n */\n _showState: function () {\n log.debug('AGENT', '------------ AGENT STATE --------------');\n log.debug('AGENT', 'web.config enabled: ' + g_IsAgentEnabled);\n log.debug('AGENT', 'isDisabled: ' + WA.agent.isDisabled());\n log.debug('AGENT', 'isSessionInitialized: ' + WA.agent.isSessionInitialized());\n log.debug('AGENT', '---------------- END -----------------');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверяет, доступен ли плагин Агента веб-доступа.\n * @method WebAccess.agent#isPluginAvailable\n * @param {string} pluginName Имя плагина\n * @return {promise} Объект Promise, в котором True – плагин Агента веб-доступа доступен для работы, иначе False.\n *\n * @example\n * WebAccess.agent.isPluginAvailable('edmsplugin').done(function(res){\n * if (res)\n * alert('Плагин Агента веб-доступа доступен для работы с EDMS-объектами системы DIRECTUM');\n * });\n */\n isPluginAvailable: function (pluginName) {\n var d = $.Deferred();\n\n var me = this;\n var params = {\n 'name': pluginName\n };\n\n if (typeof me._availablePlugins[pluginName] !== 'undefined') {\n d.resolve(me._availablePlugins[pluginName]);\n return d.promise();\n }\n\n //Шамов А.: Если тут проверять запущен или нет, то тогда мы не покажем диалог \"Подождать еще\", т.к. он будет не запущен и ВД будет работать без него. Например, в быстрых действиях.\n if (me.isAvailable()) {\n me.transmitRequest('IsPluginAvailable', '', params)\n .done(function (response) {\n var booleanResult = (response.result === \"true\");\n me._availablePlugins[pluginName] = booleanResult;\n d.resolve(booleanResult);\n })\n .fail(function (response) {\n me._availablePlugins[pluginName] = false;\n d.reject(false);\n });\n } else {\n me._availablePlugins[pluginName] = false;\n d.reject(false);\n }\n\n return d.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отправляет запрос Агенту веб-доступа, используя доступный транспорт.\n * Транспорт – это один из механизмов для взаимодействия с Агентом веб-доступа. Например, NPAPI-транспорт или HTTP-транспорт.\n *\n * @method WebAccess.agent.transmitRequest\n * @param {string} requestName Имя запроса\n * @param {string} pluginName Имя плагина Агента, к которому идет обращение.\n * Для базовых вызовов к ядру Агента веб-доступа передается пустая строка\n * @param {object} params Параметры запроса\n * @param {object} extraParams Дополнительные параметры запроса (например, timeout)\n * @return {promise} Объект Promise, внутри которого object - результат запроса.\n *\n * @example\n * WebAccess.agent.transmitRequest('PING','',{}).done(function(response){\n * console.log(response) // Object { message=\"PONG\", success=true}\n * });\n */\n transmitRequest: function (requestName, pluginName, params, extraParams) {\n var me = this;\n\n var d = $.Deferred();\n\n log.info('AGENT', '\"transmitRequest\" method \"' + requestName + '\" was called');\n\n if (me.isDisabled()) {\n log.info('AGENT', 'Agent disabled');\n d.reject({ message: null, success: false });\n }\n\n global.agent.transport.transmitRequest(requestName, pluginName, params, extraParams).always(function (respObj) {\n log.info('AGENT', 'Response of \"transmitRequest\" method \"' + requestName + '\": ', $.toJSON(respObj));\n }).done(function (respObj) {\n d.resolve(respObj);\n }).fail(function (respObj) {\n d.reject(respObj);\n });\n\n return d.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Окно отображаемое при потере связи с агентом.\n * @method WebAccess.agent._showWaitMoreDialog\n * @since 5.1.0.1511\n * @private\n * @return WebAccess.agent\n */\n _showWaitMoreDialog: function () {\n var me = this;\n\n if (!!me._showWaitMoreDialogTimeout) clearTimeout(me._showWaitMoreDialogTimeout);\n me._showWaitMoreDialogTimeout = setTimeout(function () {\n\n var isAgentStartedAfterWait = false;\n\n var cancelClickAndOnClose = function () {\n if (!isAgentStartedAfterWait) {\n WA.agent.disable();\n window.location.reload();\n }\n };\n\n var d = new WA.CMP.dialogs.MessageBox();\n d.id = 'waitMore';\n //d.isSingleInstance = true;\n d.width = 450;\n d.okCancelButtons(function okClick() {\n d.disableButton('modal_ok_button');\n d.inlineHint.showWarning(L('AGENT_WAITING_START'));\n $('#errIcon').find('span').css({ 'background': 'url(\"images/spinner.gif\")' });\n\n global.agent.transport.waitForStart(60000).done(function () {\n log.info('AGENT', 'Waiting for agnent is done');\n // Всё же дождались старта.\n isAgentStartedAfterWait = true;\n d.close();\n }).fail(function (reason) {\n log.info('AGENT', 'Waiting for agnent is failed');\n\n d.enableButton('modal_ok_button');\n // Не дождались.\n d.inlineHint.show(L('AGENT_WAITING_START_FAIL'));\n });\n\n return false;\n }, cancelClickAndOnClose);\n d.okText = L('WAIT_AGENT');\n d.cancelText = L('CONTINUE_WITHOUT_AGENT');\n d.show(L('AGENT_NOT_RESPONSE_WAIT_MORE'), L('AGENT_NOT_RESPONSE_WAIT_MORE_ADDITIONAL_TEXT'), L('ERROR'), 'error', null, cancelClickAndOnClose);\n\n log.info('AGENT', 'WaitMoreDialog was shown');\n\n }, 400);\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n _showWaitMoreDialogTimeout: null,\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Окно отображаемое при обращении к агенту в другой сессии ОС.\n * @method WebAccess.agent._showAgentStartedInAnotherSessionDialog\n * @since 5.1.0.1511\n * @private\n */\n _showAgentStartedInAnotherSessionDialog: function () {\n var me = this;\n var d = new WA.CMP.dialogs.MessageBox();\n d.id = 'anotherSessionError';\n d.isSingleInstance = true;\n d.okText = L('CONTINUE_WITHOUT_AGENT');\n d.show(L('AGENT_RUNNING_IN_AHOTHER_WINDOWS_SESSION'), L('AGENT_RUNNING_IN_AHOTHER_WINDOWS_SESSION_ADDITIONAL_TEXT'), L('ERROR'), 'error', null, function () {\n WA.agent.disable();\n window.location.reload();\n });\n log.info('AGENT', 'AgentStartedInAnotherSessionDialog was shown');\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Метод вызывается при потере соединения, когда агент изначально был\n * запущен, но не отвечает, перезапускаем его.\n * @private\n * @since 5.1.0.1505\n */\n _onConnectionLost: function () {\n var me = this;\n log.info('AGENT', 'Connection lost. Trying start agent again');\n WA.agent.start(true).done(function startDone(isRegistered) {\n afterStartAgent();\n });\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Запускает Агент веб-доступа.\n *\n * @method WebAccess.agent.start\n * @param {Boolean} [opt_force] Принудительный запуск Агента веб-доступа. Запуск выполняется при любых условиях.\n * @return {Deferred} Специальный deferred-объект.\n * @since 5.1.0.1500\n */\n start: function (opt_force) {\n this._availablePlugins = {};\n return global.agent.transport.start(opt_force);\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Останавливает работу Агента веб-доступа.\n * Используется для повторного соединения веб-страницы с Агентом веб-доступа.\n *\n * @method WebAccess.agent.stop\n * @return {WebAccess.agent} Объект типа agent.\n */\n stop: function () {\n this._availablePlugins = {};\n global.agent.transport.stop();\n return global.agent;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Перезапускает Агент веб-доступа.\n *\n * @method WebAccess.agent.restart\n * @return {WebAccess.agent} Объект типа agent.\n */\n restart: function () {\n this._availablePlugins = {};\n return global.agent.transport.restart();\n },\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отменяет запуск Агента веб-доступа.\n *\n * @method WebAccess.agent.cancelStart\n * @return {WebAccess.agent} Объект типа agent.\n */\n cancelStart: function () {\n this._availablePlugins = {};\n global.agent.transport.cancelStart();\n return this;\n },\n\n /**\n * Скачивает Агент веб-доступа.\n *\n * @method WebAccess.agent.download\n * @return {$.Deferred} Отложенный объект с результатом запуска.\n */\n download: function (packageName) {\n var def = $.Deferred();\n\n if (!packageName) {\n var platform = WA.ENV.platform;\n var os = WA.ENV.os.name.toLowerCase();\n\n if (platform === 'linux') {\n if (os === 'mint' || os === 'ubuntu' || os === 'debian') {\n packageName = platform + '_deb';\n } else {\n packageName = platform + '_rpm';\n }\n } else {\n packageName = platform;\n }\n }\n\n if (g_AgentInstallID[packageName]) {\n window.open('/Download.ashx?accesstype=0&id=' + g_AgentInstallID[packageName]);\n def.resolve(packageName);\n } else {\n def.reject();\n }\n\n return def;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверяет, запущен ли Агент веб-доступа. Делает attemptNumber попыток.\n *\n * @method WebAccess.agent.checkSessionState\n * @param {integer} attemptNumber Количество попыток\n * @return {$.Deferred} Отложенный объект с результатом запуска.\n */\n checkSessionState: function (attemptNumber) {\n attemptNumber = typeof attemptNumber !== 'undefinded' ? attemptNumber : 1;\n return this._checkSessionStateLoop($.Deferred(), 0, attemptNumber);\n },\n\n // Проверяет запущен ли агент. Делает несколько попыток.\n _checkSessionStateLoop: function (def, attemptIndex, maxAttemptNumber) {\n var me = this;\n // Если агент не запущен, то сам transmitRequest будет по таймауту висеть.\n me.transmitRequest(\"GetSessionRegistrationStatus\", \"\", { \"SessionID\": window.g_UserContextID || '' }).done(function (pingResponse) {\n if (pingResponse.result === 'REGISTERED') {\n log.info('AGENT', 'Session successfully registered by agent');\n def.resolve(true);\n } else if (pingResponse.result === 'NOTREGISTERED') {\n log.info('AGENT', 'Session registration rejected by agent');\n def.resolve(false);\n WA.agent._showAgentStartedInAnotherSessionDialog();\n }\n }).fail(function (pingResponse) {\n if (pingResponse.result === \"ERR_INVALID_SESSION_ID\") {\n def.reject(true);\n } else {\n if (attemptIndex < maxAttemptNumber) {\n me._checkSessionStateLoop(def, attemptIndex + 1);\n } else {\n def.reject();\n }\n }\n });\n\n return def;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Очищает кэш доступных плагинов Агента веб-доступа.\n *\n * @method WebAccess.agent.clearPluginCache\n */\n clearPluginCache: function () {\n this._availablePlugins = {};\n },\n\n /**\n * Выгружает логи агента на сервер веб-доступа.\n *\n * @method WebAccess.agent.uploadLogs \n */\n uploadLogs: function () {\n var me = this;\n var d = $.Deferred();\n\n var params = {\n \"IsSecured\": (document.location.protocol === 'http:' ? 'n' : 'y'),\n \"Host\": document.location.host,\n \"ClientAffinity\": ($.cookie('ARRAffinity') == null ? '' : $.cookie('ARRAffinity'))\n };\n\n //Получаем токен на запрос уведомлений о новых заданиях\n WA.SRV.call(\"/Security.asmx/GetOpToken0\", { Operation: TOKEN_OPERATION.DIAGNOSTICS }).done(function (token) {\n params[\"Token\"] = token;\n\n me.transmitRequest(\"GetLogs\", \"\", params).done(function (response) {\n if (response.success === true) {\n d.resolve(response);\n } else {\n d.reject(response);\n };\n }).fail(function (response) {\n d.reject(response);\n });\n });\n\n return d.promise();\n }\n });\n\n global.agent = new Agent();\n global.agent.Agent = Agent;\n})(window.WebAccess);\n","\"use strict\";\r\n\r\n/**\r\n * Предоставляет инструменты для получения и работы с доступным транспортом Агента веб-доступа, например с NPAPI- или HTTP-транспортом.\r\n *\r\n * @namespace WebAccess.agent.transport\r\n * @since 5.0.0.4100 \r\n */\r\n(function (global) {\r\n var transport = {\r\n httpReady: $.Deferred(),\r\n\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * @private\r\n * @method WebAccess.agent.transport.#_getHTTP\r\n */\r\n _getHTTP: function () {\r\n return global.agent.transport.HTTP;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /** \r\n * Получает доступный транспорт для Агента веб-доступа.\r\n * Доступные виды транспорта: HTTP-транспорт.\r\n *\r\n * @method WebAccess.agent.transport.getTransport \r\n * @return {WebAccess.agent.transport.BaseTransport} Объект типа BaseTransport.\r\n * @since 5.1.0.1500\r\n */\r\n getTransport: function (opt_force) {\r\n return this._getHTTP();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Запускает Агент веб-доступа.\r\n *\r\n * @method WebAccess.agent.transport.start\r\n * @return {Deferred} Специальный deferred-объект.\r\n * @since 5.1.0.1500\r\n */\r\n start: function (opt_force) {\r\n log.info('AGENT', 'Starting agent transport');\r\n return this.getTransport(opt_force).start();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n waitForStart: function (timeout) {\r\n return this.getTransport().waitForStart(timeout);\r\n },\r\n\r\n cancelStart: function () {\r\n this.getTransport().cancelStart();\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n stop: function () {\r\n this.getTransport().stop();\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n restart: function () {\r\n return this.getTransport().restart();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Отправляет запрос Агенту веб-доступа, используя доступный транспорт.\r\n * Транспорт – это один из механизмов для взаимодействия с Агентом веб-доступа. Например, NPAPI-транспорт или HTTP-транспорт.\r\n *\r\n * @method WebAccess.agent.transport.transmitRequest\r\n * @param {string} requestName Имя запроса\r\n * @param {string} pluginName Имя плагина Агента, к которому идет обращение.\r\n * Для базовых вызовов к ядру Агента веб-доступа передается пустая строка\r\n * @param {object} params Параметры запроса\r\n * @param {object} extraParams Дополнительные параметры запроса (например, timeout)\r\n * @return {object} Результат запроса.\r\n * @since 5.1.0.1500\r\n */\r\n transmitRequest: function (requestName, pluginName, params, extraParams) {\r\n return this.getTransport().transmitRequest(requestName, pluginName, params, extraParams);\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n };\r\n\r\n global.agent.transport = transport;\r\n $.when(transport.httpReady).then(function () {\r\n WA.AgentInit.resolve();\r\n });\r\n\r\n})(window.WebAccess);","\"use strict\";\n\n/**\n * Базовый класс транспорта Агента веб-доступа.\n *\n * @class WebAccess.agent.transport.BaseTransport\n * @since 5.1.0.1500\n */\n(function (global) {\n var BaseTransport = BaseObject.extend({\n className: 'BaseTransport',\n name: 'base',\n // Отменен ли запуск агента.\n _isCanceled: false,\n\n init: function () {\n this._super();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отправляет запрос Агенту веб-доступа.\n * Реализация отправки данных.\n\n * @method WebAccess.agent.transport.BaseTransport#call\n * @param {string} requestName Имя запроса\n * @param {string} pluginName Имя плагина Агента, к которому идет обращение.\n * Для базовых вызовов к ядру Агента веб-доступа передается пустая строка\n * @param {object} params Параметры запроса\n * @return {object} Результат запроса.\n * @since 5.1.0.1500\n */\n call: function (requestName, pluginName, params) {\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Перезапускает Агент веб-доступа.\n *\n * @method WebAccess.agent.transport.BaseTransport#restart\n * @return {WebAccess.agent.transport.BaseTransport} Объект типа BaseTransport.\n * @since 5.1.0.1511\n */\n restart: function () {\n this._isCanceled = false;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Запускает Агент веб-доступа.\n *\n * @method WebAccess.agent.transport.BaseTransport#start\n * @return {WebAccess.agent.transport.BaseTransport} Объект типа BaseTransport.\n * @since 5.1.0.1500\n */\n start: function () {\n this._isCanceled = false;\n return this;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Ожидает запуск Агента веб-доступа.\n *\n * @method WebAccess.agent.transport.BaseTransport#waitForStart\n * @return {Deferred} Специальный deferred-объект.\n * @since 5.1.0.1511\n */\n waitForStart: function (timeout) {\n var me = this;\n var result = $.Deferred();\n\n var sessionID = '';\n if (typeof g_UserContextID !== \"undefined\") {\n sessionID = g_UserContextID;\n }\n\n timeout = timeout || 60000;\n\n var startTime = $.now();\n var getSessionRegistrationStatus = function () {\n // Если установка отменена - выполнить reject\n if (me._isCanceled) {\n result.reject('canceled');\n return result;\n }\n\n // Если promise разрешен, проверять статус сессии больше не нужно.\n var state = result.state();\n if (state === 'rejected' || state === 'resolved') {\n return;\n }\n\n if ($.now() - startTime > timeout) {\n result.reject('timeout');\n return result;\n }\n\n setTimeout(function () {\n var params = {\n method: 'GetSessionRegistrationStatus',\n SessionID: sessionID\n };\n me._send(params).done(function (doc, method, xhr) {\n var response = xhr.responseText;\n var respObj = $.parseJSON(response);\n\n if (respObj.success === true) {\n if (respObj.result === 'REGISTERED') {\n log.info('AGENT', 'Session successfully registered by agent');\n result.resolve(true);\n } else if (respObj.result === 'NOTREGISTERED') {\n log.info('AGENT', 'Session registration rejected by agent');\n result.resolve(false);\n WA.agent._showAgentStartedInAnotherSessionDialog();\n }\n } else {\n if (respObj.result == \"ERR_INVALID_REQUEST_NAME\") { //Уж не знаю правда ли так, но если это убрать то в старом агенте тост будет висеть 1 мин.\n //Агент старой версии, данный метод не поддерживается\n result.reject('oldagent');\n } else {\n getSessionRegistrationStatus();\n }\n }\n\n return result;\n }).fail(function () {\n getSessionRegistrationStatus();\n });\n }, 200);\n\n return result;\n };\n\n setTimeout(function () {\n getSessionRegistrationStatus();\n }, 300); //Небольшая задержка для того что бы URL-схема передала агенту нужную информацию, если он уже был запущен (#93952).\n\n return result;\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отправляет запрос Агенту веб-доступа.\n * Если при первом запуске веб-доступа Агент не запустился, то запрос не отправляется.\n *\n * @method WebAccess.agent.transport.BaseTransport#transmitRequest\n * @param {string} requestName Имя запроса\n * @param {string} pluginName Имя плагина Агента, к которому идет обращение.\n * Для базовых вызовов к ядру Агента веб-доступа передается пустая строка\n * @param {object} params Параметры запроса\n * @param {object} extraParams Дополнительные параметры запроса (например, timeout)\n * @return {object} Результат запроса.\n * @since 5.1.0.1500\n */\n transmitRequest: function (requestName, pluginName, params, extraParams) {\n var me = this;\n\n var d = $.Deferred();\n\n var sessionID = '';\n if (typeof g_UserContextID !== \"undefined\") {\n sessionID = g_UserContextID;\n if (params.SessionID == undefined) params[\"SessionID\"] = sessionID || '';\n }\n\n //переводим параметры в строковые значения\n for (var k in params) {\n params[k] = '' + params[k];\n }\n\n this.call(requestName, pluginName, params, extraParams).done(function (response) {\n var respObj;\n\n if (!response) {\n d.reject({ message: \"Uknown error\", success: false });\n return;\n }\n if (response === \"OK\") {\n d.resolve({ message: \"OK\", success: true });\n return;\n }\n\n if (response === \"true\") {\n d.resolve({ result: \"true\", success: true });\n return;\n }\n\n if (response === \"false\") {\n d.resolve({ result: \"false\", success: true });\n return;\n }\n\n if (response === \"PONG\") {\n d.resolve({ message: \"PONG\", success: true });\n return;\n }\n try {\n respObj = $.parseJSON(response);\n try {\n respObj.result = $.parseJSON(respObj.result.replace(/'/g, '\"'));\n } catch (_) {\n }\n if (!respObj.success)\n d.reject(respObj);\n d.resolve(respObj);\n } catch (e) {\n log.error(e.message);\n if ($.isPlainObject(respObj) && 'message' in respObj) {\n ShowError(respObj.message);\n } else {\n ShowError(response);\n }\n d.reject(null);\n }\n }).fail(function (response) {\n d.reject({ message: \"CONNECTION_NOT_AVAILABLE\", success: false });\n });\n\n return d.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Отменяет запуск Агента веб-доступа.\n *\n * @since 5.4.0.1006\n */\n cancelStart: function () {\n this._isCanceled = true;\n }\n });\n\n global.agent.transport.BaseTransport = BaseTransport;\n\n})(window.WebAccess);","\"use strict\";\r\n\r\n/**\r\n * Предоставляет инструменты для работы с Агентом веб-доступа через HTTP. Например, получить адрес Агент веб-доступа.\r\n *\r\n * @namespace WebAccess.agent.transport.HTTP\r\n * @since 5.1.0.1500\r\n */\r\n(function (global) {\r\n var HTTP = global.agent.transport.BaseTransport.extend({\r\n className: 'HTTP',\r\n name: 'HTTP',\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n init: function () {\r\n this._super();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /** \r\n /**\r\n * Запускает Агент веб-доступа по URI-схеме.\r\n * После запуска во всех браузерах, отличных от Internet Explorer, проверяется соединение с Агентом. \r\n * Если Агент не отвечает, он считается недоступным. \r\n * @method WebAccess.agent.transport.HTTP.start\r\n * @return {Deferred} Специальный deferred-объект.\r\n * @since 5.1.0.1500\r\n */\r\n start: function () {\r\n var me = this;\r\n me._super();\r\n\r\n return me._run(me._getSessionID());\r\n },\r\n\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /** \r\n /**\r\n * Перезапускает Агент веб-доступа по URI-схеме.\r\n * После запуска во всех браузерах, отличных от Internet Explorer, проверяется соединение с Агентом.\r\n * Если Агент не отвечает, он считается недоступным. \r\n * @method WebAccess.agent.transport.HTTP.restart\r\n * @return {Deferred} Специальный deferred-объект.\r\n * @since 5.1.0.1500\r\n */\r\n restart: function () {\r\n var me = this;\r\n me._super();\r\n return me._run('RESTART&' + me._getSessionID());\r\n },\r\n\r\n /**\r\n * Получает ИД сессии веб-доступа.\r\n *\r\n * @method WebAccess.agent.transport.HTTP._getSessionID\r\n * @return {string} ИД сессии Агента веб-доступа.\r\n * @since 5.4.0.1011\r\n */\r\n _getSessionID: function () {\r\n if (typeof g_UserContextID !== \"undefined\") {\r\n return g_UserContextID;\r\n }\r\n return '';\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Запускает агента по URI схеме с параметром param \r\n * @private\r\n */\r\n _run: function (param) {\r\n var me = this;\r\n me._super();\r\n log.info('AGENT', 'Starting HTTP transport');\r\n\r\n var uri = \"waagent54:\" + param;\r\n log.info('AGENT', 'Launched URL Schema: ' + uri);\r\n\r\n if (WA.ENV.engine.name.toLowerCase() === 'webkit') {\r\n this._startInWebKit(uri);\r\n } else {\r\n switch (WA.ENV.browser.name.toLowerCase()) {\r\n case 'firefox':\r\n this._startInFirefox(uri);\r\n break;\r\n default:\r\n this._startDefault(uri);\r\n break;\r\n }\r\n }\r\n\r\n return me.waitForStart();\r\n },\r\n\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Останавливает работу Агента веб-доступа.\r\n *\r\n * @method WebAccess.agent.transport.HTTP.stop\r\n * @return {WebAccess.agent.transport.HTTP} Объект типа HTTP.\r\n * @since 5.1.0.1500\r\n */\r\n stop: function () {\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получает адрес сервера Агента в зависимости от используемого протокола веб-доступа.\r\n *\r\n * @method WebAccess.agent.transport.HTTP.getAgentServerUrl\r\n * @return {string} Адрес сервера Агента веб-доступа.\r\n * @since 5.1.0.1516\r\n */\r\n getAgentServerUrl: function () {\r\n // HACK: Edge не доверяет агенту по http, поэтому всегда используем https.\r\n if (window.location.protocol === 'https:' || WA.ENV.browser.name.toLowerCase() === 'edge') {\r\n return 'https://localhost:9654';\r\n } else {\r\n return 'http://localhost:9554';\r\n }\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Оправка служебных асинхронных запросов агенту. Например, GetSessionRegistrationStatus.\r\n * Метод вынесен отдельно для возможности подмены его в тестах.\r\n * @private\r\n */\r\n _send: function (params) {\r\n var me = this;\r\n return $.ajax({\r\n timeout: 2000,\r\n type: 'GET',\r\n url: me.getAgentServerUrl(),\r\n data: params,\r\n cache: false\r\n });\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /** \r\n * Отправляет запрос Агенту веб-доступа через HTTP-протокол (тип GET, заголовки CORS).\r\n * Сторона, отвечающая на запрос, должна отправить соответствующие заголовки запроса.\r\n * Если ответ на запрос не был получен, то вернется строка \"CNA - connection not available\".\r\n *\r\n * @method WebAccess.agent.transport.HTTP.call \r\n * @param {string} requestName Имя запроса\r\n * @param {string} pluginName Имя плагина Агента, к которому идет обращение. \r\n * Для базовых вызовов к ядру Агента веб-доступа передается пустая строка\r\n * @param {object} params Параметры запроса\r\n * @return {object} Результат запроса.\r\n * @since 5.1.0.1500\r\n */\r\n call: function (requestName, pluginName, params, ajaxParams) {\r\n\r\n var d = $.Deferred();\r\n\r\n var me = this;\r\n var error = '';\r\n params.method = requestName;\r\n params.plugin = pluginName;\r\n\r\n var resultAjaxParams = $.extend({}, ajaxParams, {\r\n type: 'GET',\r\n url: me.getAgentServerUrl(),\r\n async: true,\r\n cache: false,\r\n data: params\r\n });\r\n\r\n $.ajax(resultAjaxParams).done(function (res) {\r\n var respText = res;\r\n log.info('AGENT', '\"Call\" method result: requestName: ' + requestName + ' response:', respText);\r\n d.resolve(respText);\r\n }).fail(function (err) {\r\n log.info('AGENT', '\"Call\" method error: requestName: ' + requestName + ' error:', err);\r\n d.reject('CNA');\r\n });\r\n\r\n return d.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Открытие URI-схемы в Firefox\r\n * @method WebAccess.agent.transport.HTTP._startInFirefox\r\n * @private\r\n * @return {WebAccess.agent.transport.HTTP}\r\n * @since 5.1.0.1500\r\n */\r\n _startInFirefox: function (url) {\r\n var me = this;\r\n // Создаем скрытый фрейм, в котором пытаемся открыть наш URL\r\n var frame = document.createElement('iframe');\r\n frame.style.display = 'none';\r\n frame = document.body.appendChild(frame);\r\n\r\n try {\r\n frame.contentWindow.location = url;\r\n } catch (e) {\r\n }\r\n // Удаляем наш временный фрейм\r\n document.body.removeChild(frame);\r\n return this;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Открытие URI-схемы в Chrome, Safari\r\n * К сожалению в отличие от FF хром выводит окошко асинхронно и что там решилось\r\n * мы от браузера узнать не можем, и поэтому атакуем агента с надеждой на \r\n * ответ.\r\n * @method WebAccess.agent.transport.HTTP._startInWebKit\r\n * @private\r\n * @since 5.1.0.1500\r\n */\r\n _startInWebKit: function (url) {\r\n var me = this;\r\n // Если веб-доступ работает через HTTPS, то запрос из frame к waagent блокируются, поэтому меняем просто window.location.\r\n // Без setTimeout агент не всегда запускался по url-схеме в Chrome.\r\n setTimeout(function () {\r\n window.location = url;\r\n }, 100);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Открытие URI-схемы во всех остальных браузерах.\r\n * @method WebAccess.agent.transport.HTTP._startDefault\r\n * @private\r\n * @since 5.1.0.1500\r\n */\r\n _startDefault: function (url) {\r\n var me = this;\r\n // Создаем скрытый фрейм, в котором пытаемся открыть наш URL\r\n var frame = document.createElement('iframe');\r\n frame.style.display = 'none';\r\n frame = document.body.appendChild(frame);\r\n frame.contentWindow.location = url;\r\n setTimeout(function () {\r\n try {\r\n // Пытаемся поработать с не определенным атрибутом фрейма\r\n // (вместо something можно использовать что-угодно)\r\n if (frame.contentWindow.location != 'something') {\r\n $.noop();\r\n }\r\n } catch (e) {\r\n }\r\n\r\n // Удаляем наш временный фрейм\r\n document.body.removeChild(frame);\r\n }, 0);\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// \r\n });\r\n\r\n var http = new HTTP();\r\n global.agent.transport.HTTP = http;\r\n\r\n global.agent.transport.httpReady.resolve();\r\n})(window.WebAccess);","\"use strict\";\n\n/**\n * Предоставляет инструменты для работы с обновлениями Агента веб-доступа.\n *\n * @namespace WebAccess.agent.updates\n * @since 5.0.0.4100 \n */\n(function (global) {\n var updates = {\n\n /**\n * Проверить наличие обновлений для Агента веб-доступа.\n *\n * @method WebAccess.agent.updates.checkUpdates\n * @return {bool} True – Агента веб-доступа имеет одно или несколько обновлений, иначе False.\n */\n checkUpdates: function() {\n\n var d = $.Deferred();\n\n var params = {\n \"IsSecured\": (document.location.protocol === 'http:' ? 'n' : 'y'),\n \"Host\": document.location.host,\n \"ClientAffinity\": ($.cookie('ARRAffinity') == null ? '' : $.cookie('ARRAffinity'))\n };\n\n //Получаем токен на запрос уведомлений о новых заданиях\n WA.SRV.callSync(\"/Security.asmx/GetOpToken0\", { Operation: TOKEN_OPERATION.UPDATE_AGENT }).done(function (res) {\n params[\"Token\"] = res; \n });\n\n global.transmitRequest(\"CheckUpdates\", \"\", params).done(function(response) {\n if (response.result === \"YES\") {\n d.resolve();\n } else {\n d.reject();\n };\n }).fail(function(response) {\n d.reject();\n });\n \n return d.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить информацию о прогрессе загрузки обновления Агента веб-доступа.\n * Рассчитывается в процентах.\n *\n * @method WebAccess.agent.updates.getUpdateProgress\n * @return {int} Процент загруженного обновления.\n */\n getUpdateProgress: function() {\n return global.transmitRequest(\"GetUpdateProgress\", \"\", {});\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n };\n\n global.updates = updates;\n})(window.WebAccess.agent);\n","\"use strict\";\r\n\r\n/**\r\n * Предоставляет инструменты для работы с EDMS-объектами через Агент веб-доступа.\r\n *\r\n * @namespace WebAccess.agent.edms\r\n * @since 5.0.0.4100\r\n */\r\n(function (global) {\r\n\r\n var edms = {\r\n /**\r\n * Проверяет наличие локальных копий документов.\r\n * Если локальные копии документов найдены, отобразится окно с полным списком копий.\r\n *\r\n * @method WebAccess.agent.edms.checkDocumentLocalCopies\r\n * @return {WebAccess.agent.edms} Объект типа edms.\r\n */\r\n checkDocumentLocalCopies: function () {\r\n //FIXME: always переделать на done и fail\r\n global.isPluginAvailable(\"edmsplugin\").always(function (isAvailableResponse) {\r\n if (isAvailableResponse) {\r\n global.transmitRequest(\"CheckDocumentLocalCopies\", \"edmsPlugin\", {}).done(function (response) {\r\n var localCopies = response.result;\r\n if (localCopies.length > 0) {\r\n ShowLocalCopiesWindow($.toJSON(localCopies));\r\n }\r\n }).fail(function (response) {\r\n ShowError(response.message);\r\n });\r\n }\r\n });\r\n return global;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получает список редактируемых документов.\r\n *\r\n * @method WebAccess.agent.edms.getOpenedDocuments\r\n * @return {$.Deferred} Отложенный объект с результатом запроса.\r\n */\r\n getOpenedDocuments: function () {\r\n var def = $.Deferred();\r\n global.isPluginAvailable(\"edmsplugin\").done(function (isAvailable) {\r\n if (isAvailable) {\r\n global.transmitRequest(\"CHECKOPENEDDOCUMENTS\", \"edmsPlugin\", {}).done(function (response) {\r\n var docs = response.result;\r\n def.resolve(docs);\r\n }).fail(function(response) {\r\n def.reject(response.message);\r\n });\r\n } else {\r\n def.reject();\r\n }\r\n }).fail(function () {\r\n def.reject();\r\n });\r\n\r\n return def;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Проверяет наличие локальной копии документа с указанным ИД.\r\n *\r\n * @method WebAccess.agent.edms.checkDocumentHasLocalCopy\r\n * @param {int} docID ИД документа, у которого нужно проверить наличие локальных копий\r\n * @return {promise} Объект Promise, возвращающий в отложенном режиме массив с локальными копиями указанного документа.\r\n */\r\n checkDocumentHasLocalCopy: function (docID) {\r\n var d = $.Deferred();\r\n\r\n //FIXME: always переделать на done и fail\r\n global.isPluginAvailable(\"edmsplugin\")\r\n .always(function (isAvailableResponse) {\r\n if (isAvailableResponse) {\r\n global.transmitRequest(\"CheckDocumentLocalCopies\", \"edmsPlugin\", {}).done(function(response) {\r\n var localCopies = !!response.result ? response.result : [];\r\n var res = [];\r\n if (localCopies.length > 0) {\r\n for (var i = 0; i < localCopies.length; i++) {\r\n if (localCopies[i].ID == docID) {\r\n res.push(localCopies[i]);\r\n }\r\n }\r\n }\r\n d.resolve(res);\r\n }).fail(function(response) {\r\n d.reject([]);\r\n });\r\n } else {\r\n d.reject([]);\r\n }\r\n });\r\n return d.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Подписывает документ указанным сертификатом.\r\n *\r\n * @method WebAccess.agent.edms.signDocument\r\n * @param {int} docID ИД документа для подписания\r\n * @param {int} versionNumber Номер версии документа для подписания\r\n * @param {int} certificateID ИД сертификата, которым будет подписан документ\r\n * @param {base64string} pluginName Имя плагина Агента веб-доступа для подписания\r\n * @param {string} comment Комментарий к подписи\r\n * @param {bool} isApprovingSign Признак утверждающей подписи\r\n * @param {bool} isForSubstitute Признак подписания документа от имени замещаемого пользователя\r\n * @param {string} substituteUserCode Код замещаемого пользователя. Параметр передается, если в параметре isForSubstitute установлено значение true\r\n * @param {function} onSignedCallback Функция обратного вызова для подписания. В качестве параметра передается ответ от Агента веб-доступа\r\n * @param {string} pluginVersion Версия плагина Агента веб-доступа для подписания\r\n * @return {WebAccess.agent.edms} Объект типа edms.\r\n */\r\n signDocument: function (docID, versionNumber, certificateID, pluginName, comment, isApprovingSign, isForSubstitute, substituteUserCode, onSignedCallback, additionalInfo, pluginVersion, tokenPinCode) {\r\n var me = this;\r\n var d = $.Deferred();\r\n RequestToken(TOKEN_OPERATION.SIGN_DOCUMENT | TOKEN_OPERATION.DOWNLOAD_DOCUMENT_BODY, function (token) {\r\n var requestParams = {\r\n \"DocumentID\": docID,\r\n \"DocumentVersion\": versionNumber,\r\n \"Token\": token,\r\n \"AdditionalInfo\": additionalInfo,\r\n \"PluginVersion\": typeof pluginVersion == 'undefined' ? null : pluginVersion,\r\n \"TokenPinCode\": typeof tokenPinCode == 'undefined' ? null : tokenPinCode\r\n };\r\n me._signObject(\"SignDocumentVersion\", requestParams, certificateID, pluginName, comment, isApprovingSign, isForSubstitute, substituteUserCode, onSignedCallback)\r\n .done(function (res) {\r\n d.resolve(res);\r\n });\r\n }, docID, versionNumber);\r\n return d.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Подписывает текст задания.\r\n *\r\n * @method WebAccess.agent.edms.signJob\r\n * @param {int} jobID ИД задания для подписания\r\n * @param {int} certificateID ИД сертификата, которым будет подписан текст задания\r\n * @param {base64string} pluginName Имя плагина Агента веб-доступа для подписания\r\n * @param {string} comment Комментарий к подписи\r\n * @param {bool} isApprovingSign Признак утверждающей подписи\r\n * @param {bool} isForSubstitute Признак подписания текста от имени замещаемого пользователя\r\n * @param {string} substituteUserCode Код замещаемого пользователя. Параметр передается, если в параметре isForSubstitute установлено значение true\r\n * @param {function} onSignedCallback Функция обратного вызова для подписания. В качестве параметра передается ответ от Агента веб-доступа\r\n * @param {string} pluginVersion Версия плагина Агента веб-доступа для подписания\r\n * @return {WebAccess.agent.edms} Объект типа edms.\r\n */\r\n signJob: function (jobID, certificateID, pluginName, comment, isApprovingSign, isForSubstitute, substituteUserCode, onSignedCallback, pluginVersion, tokenPinCode) {\r\n var me = this;\r\n var d = $.Deferred();\r\n RequestToken(TOKEN_OPERATION.SIGN_TASK | TOKEN_OPERATION.DOWNLOAD_DOCUMENT_BODY, function (token) {\r\n var requestParams = {\r\n \"JobID\": jobID,\r\n \"Token\": token,\r\n \"PluginVersion\": typeof pluginVersion == 'undefined' ? null : pluginVersion,\r\n \"TokenPinCode\": typeof tokenPinCode == 'undefined' || tokenPinCode == null ? \"\" : tokenPinCode\r\n };\r\n me._signObject(\"SignJobText\", requestParams, certificateID, pluginName, comment, isApprovingSign, isForSubstitute, substituteUserCode, onSignedCallback)\r\n .done(function (res) {\r\n d.resolve(res);\r\n }).fail(function(res) {\r\n d.reject(res);\r\n });\r\n }, jobID);\r\n return d.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Подписывает текст задачи.\r\n *\r\n * @method WebAccess.agent.edms.signTask\r\n * @param {int} taskID ИД задачи для подписания\r\n * @param {int} certificateID ИД сертификата, которым будет подписываться текст задачи\r\n * @param {base64string} pluginName Имя плагина Агента веб-доступа для подписания\r\n * @param {string} comment Комментарий к подписи\r\n * @param {bool} isApprovingSign Признак утверждающей подписи\r\n * @param {bool} isForSubstitute Признак подписания текста от имени замещаемого пользователя\r\n * @param {string} substituteUserCode Код замещаемого пользователя. Параметр передается, если в параметре isForSubstitute установлено значение true\r\n * @param {function} onSignedCallback Функция обратного вызова для подписания. В качестве параметра передается ответ от Агента веб-доступа\r\n * @param {string} pluginVersion Версия плагина Агента веб-доступа для подписания\r\n * @return {WebAccess.agent.edms} Объект типа edms.\r\n */\r\n signTask: function (taskID, certificateID, pluginName, comment, isApprovingSign, isForSubstitute, substituteUserCode, onSignedCallback, pluginVersion, tokenPinCode) {\r\n var me = this;\r\n var d = $.Deferred();\r\n RequestToken(TOKEN_OPERATION.SIGN_TASK | TOKEN_OPERATION.DOWNLOAD_DOCUMENT_BODY, function (token) {\r\n var requestParams = {\r\n \"TaskID\": taskID,\r\n \"Token\": token,\r\n \"PluginVersion\": typeof pluginVersion == 'undefined' ? null : pluginVersion,\r\n \"TokenPinCode\": typeof tokenPinCode == 'undefined' || tokenPinCode == null ? \"\" : tokenPinCode\r\n };\r\n me._signObject(\"SignTaskText\", requestParams, certificateID, pluginName, comment, isApprovingSign, isForSubstitute, substituteUserCode, onSignedCallback)\r\n .done(function(res) {\r\n d.resolve(res);\r\n }).fail(function(res) {\r\n d.reject(res);\r\n });\r\n }, taskID);\r\n return d.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Подписать произвольный объект.\r\n *\r\n * @method WebAccess.agent.edms._signObject\r\n * @private\r\n * @param {string} requestName Название запроса\r\n * @param {object} requestParams Объект с параметрами для запроса\r\n * @param {string} certificateID Ид сертификата\r\n * @param {base64string} pluginName Имя плагина подписания\r\n * @param {string} comment Комментарий к подписи\r\n * @param {bool} isApprovingSign Признак утверждающей подписи\r\n * @param {bool} isForSubstitute Признак если подпись совершается от имени замещаемого пользователя\r\n * @param {string} substituteUserCode Если isForSubstitute = true, то здесь передается код замещаемого пользователя\r\n * @param {function} onSignedCallback Функция обратного вызова для подписания. В качестве параметра передается ответ от Агента веб-доступа\r\n * @return {object} Результат подписания\r\n */\r\n _signObject: function (requestName, requestParams, certificateID, pluginName, comment, isApprovingSign, isForSubstitute, substituteUserCode, onSignedCallback) {\r\n var d = $.Deferred();\r\n requestParams[\"PluginName\"] = pluginName;\r\n requestParams[\"CertificateID\"] = certificateID;\r\n requestParams[\"Comment\"] = !!comment ? encodeURIComponent(comment) : \"\";\r\n requestParams[\"IsApprovingSign\"] = !!isApprovingSign ? isApprovingSign : false;\r\n requestParams[\"IsForSubstitute\"] = !!isForSubstitute ? isForSubstitute : false;\r\n requestParams[\"SubstituteUserCode\"] = !!substituteUserCode ? substituteUserCode : \"\";\r\n\r\n global.transmitRequest(requestName, \"edmsplugin\", requestParams).always(function(res) {\r\n if (onSignedCallback) onSignedCallback(res);\r\n }).done(function(res) {\r\n d.resolve(res);\r\n }).fail(function(res) {\r\n d.reject(res);\r\n });\r\n\r\n return d.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получает ключ для дешифрования документа.\r\n *\r\n * @method WebAccess.agent.edms.getDocumentDecryptedKey\r\n * @param {int} documentID ИД документа\r\n * @param {string} encryptionType Тип шифрования\r\n * @param {base64string} pluginName Имя плагина Агента веб-доступа для шифрования\r\n * @param {string} password Пароль для расшифровки\r\n * @param {function} onSuccess Функция обратного вызова для возвращения ключа. В качестве параметра передается ответ от Агента веб-доступа\r\n * @param {function} onError Функция обратного вызова для отображения ошибки. В качестве параметра передается ответ от Агента веб-доступа\r\n * @return {WebAccess.agent.edms} Объект типа edms.\r\n */\r\n getDocumentDecryptedKey: function (documentID, encryptionType, pluginName, password, onSuccess, onError) {\r\n var me = this;\r\n RequestToken(TOKEN_OPERATION.DOWNLOAD_DOCUMENT_BODY, function (token) {\r\n var requestParams = { \"DocID\": documentID, \"Version\": 0, \"Token\": token };\r\n return me._getObjectDecryptedKey(\"GetDocDecryptedKey\", requestParams, encryptionType, pluginName, password, onSuccess, onError);\r\n }, documentID, 0);\r\n return me;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получает ключ для дешифрования задачи.\r\n *\r\n * @method WebAccess.agent.edms.getTaskDecryptedKey\r\n * @param {int} documentID ИД задачи\r\n * @param {string} encryptionType Тип шифрования\r\n * @param {base64string} pluginName Имя плагина Агента веб-доступа для шифрования\r\n * @param {string} password Пароль для расшифровки\r\n * @param {function} onSuccess Функция обратного вызова для возвращения ключа. В качестве параметра передается ответ от Агента веб-доступа\r\n * @param {function} onError Функция обратного вызова для отображения ошибки. В качестве параметра передается ответ от Агента веб-доступа\r\n * @return {WebAccess.agent.edms} Объект типа edms.\r\n */\r\n getTaskDecryptedKey: function (taskID, encryptionType, pluginName, password, onSuccess, onError) {\r\n var me = this;\r\n RequestToken(TOKEN_OPERATION.GET_ENCRYPTION_KEY, function (token) {\r\n var requestParams = { \"TaskID\": taskID, \"Token\": token };\r\n return me._getObjectDecryptedKey(\"GetTaskDecryptedKey\", requestParams, encryptionType, pluginName, password, onSuccess, onError);\r\n }, taskID);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получает ключ для дешифрования задания.\r\n *\r\n * @method WebAccess.agent.edms.getJobDecryptedKey\r\n * @param {int} jobID ИД задания\r\n * @param {string} encryptionType Тип шифрования\r\n * @param {base64string} pluginName Имя плагина Агента веб-доступа для шифрования\r\n * @param {string} password Пароль для расшифровки\r\n * @param {function} onSuccess Функция обратного вызова для возвращения ключа. В качестве параметра передается ответ от Агента веб-доступа\r\n * @param {function} onError Функция обратного вызова для отображения ошибки. В качестве параметра передается ответ от Агента веб-доступа\r\n * @return {WebAccess.agent.edms} Объект типа edms.\r\n */\r\n getJobDecryptedKey: function (jobID, encryptionType, pluginName, password, onSuccess, onError) {\r\n var me = this;\r\n RequestToken(TOKEN_OPERATION.GET_ENCRYPTION_KEY, function (token) {\r\n var requestParams = { \"JobID\": jobID, \"Token\": token };\r\n return me._getObjectDecryptedKey(\"GetJobDecryptedKey\", requestParams, encryptionType, pluginName, password, onSuccess, onError);\r\n }, jobID);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * Получить ключ для дешифрования объекта.\r\n * @method WebAccess.agent.edms._getObjectDecryptedKey\r\n * @private\r\n * @param {string} requestName Название запроса\r\n * @param {object} requestParams Объект с параметрами для запроса\r\n * @param {string} encryptionType Тип шифрования\r\n * @param {base64string} pluginName Имя плагина шифрования\r\n * @param {string} password Пароль для расшифровки\r\n * @param {function} onSuccess Функция обратного вызова для возвращения ключа. В качестве параметра передается ответ от агента.\r\n * @param {function} onError Функция обратного вызова для отображения ошибки. В качестве параметра передается ответ от агента.\r\n */\r\n _getObjectDecryptedKey: function (requestName, requestParams, encryptionType, pluginName, password, onSuccess, onError) {\r\n requestParams[\"EncryptionPluginName\"] = pluginName;\r\n requestParams[\"EncodeType\"] = encryptionType;\r\n requestParams[\"Password\"] = password;\r\n\r\n global.transmitRequest(requestName, \"edmsplugin\", requestParams).done(function(response) {\r\n if (onSuccess) { onSuccess(response.result); }\r\n }).fail(function(response) {\r\n if (onError) onError(response.message);\r\n });\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n };\r\n\r\n global.edms = edms;\r\n})(window.WebAccess.agent);\r\n","\"use strict\";\n\n/**\n * Предоставляет инструменты для работы с уведомлениями Агента веб-доступа, обеспечивающие взаимодействие Агента с пользователем.\n *\n * @namespace WebAccess.agent.notifications\n * @since 5.1.0.1500\n */\n(function (global) {\n var notifications = {\n\n /**\n * Отобразать уведомление для пользователя.\n *\n * @method WebAccess.agent.notifications.show\n * @param {string} message Текст сообщения\n * @return {promise} promise, в отложенном режиме возвращающий результат запроса. \n */\n show: function (message) {\n var d = $.Deferred();\n global.transmitRequest(\"Notify\", \"NotificationPlugin\", { message: message }).always(function(res) {\n d.resolve(res);\n });\n return d.promise();\n }\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n };\n\n global.notifications = notifications;\n})(window.WebAccess.agent);\n","\"use strict\";\n\n/**\n * Предоставляет инструменты для работы с буфером обмена через Агент веб-доступа. Например, скопировать ссылки в буфер обмена.\n *\n * @namespace WebAccess.agent.clipboard\n * @since 5.1.0.1500\n */\n(function (global) {\n var clipboard = {\n\n /**\n * Скопировать массив ссылок в буфер обмена.\n *\n * @method WebAccess.agent.clipboard#copyLinksToClipboard\n * @param {array} links Массив ссылок для перемещения в буфер обмена\n * @return {int} Количество скопированных ссылок.\n */\n copyLinksToClipboard: function (links) {\n var d = $.Deferred();\n var transmittedRefs = 0;\n\n var addLink = function (link) {\n var g = $.Deferred();\n global.transmitRequest(\"AddLinkToClipboard\", \"Clipboard\", link).done(function (res) {\n if (res.success) {\n transmittedRefs++;\n }\n g.resolve();\n });\n return g.promise();\n };\n\n //первая ссылка копируется в буфер\n global.transmitRequest(\"CopyLinkToClipboard\", \"Clipboard\", links[0]).always(function (res) {\n if (res.success) transmittedRefs++;\n //все последующие ссылки добавляются к первой\n var deferreds = [];\n for (var i = 1; i < links.length; i++)\n deferreds.push(addLink(links[i]));\n //когда все ссылки добавятся, возвращаем число успешно скопированных\n $.when.apply(null, deferreds).then(function () {\n d.resolve(transmittedRefs);\n });\n });\n\n return d.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить объект-папку, из которой были скопированы ссылки. Необходим для вырезания ссылок.\n *\n * @method WebAccess.agent.clipboard#getLinkSourceLocation\n * @return {object} Объект-папка, из которой были скопированы ссылки.\n */\n getLinkSourceLocation: function () {\n var d = $.Deferred();\n global.transmitRequest(\"GetLinksSource\", \"Clipboard\", {}).done(function (response) {\n d.resolve(response.result);\n });\n return d.promise();\n },\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получает массив объектов ссылок из буфера обмена.\n * @method WebAccess.agent.clipboard#getLinksFromClipboard\n * @return {array} Массив объектов ссылок.\n */\n getLinksFromClipboard: function () {\n var d = $.Deferred();\n global.transmitRequest(\"PasteLinksFromClipboard\", \"Clipboard\", {}).always(function (response) {\n if (response.success) {\n var links = response.result;\n if (links.length > 0) {\n //Преобразовываем ссылки к нужному формату, FIXME: привести потом всё к одному виду\n for (var i = 0; i < links.length; i++) {\n links[i].Kind = (links[i].Kind == 'E' ? 'EDOC' : links[i].Kind);\n links[i].Kind = (links[i].Kind == 'F' ? 'FOL' : links[i].Kind);\n links[i].Kind = (links[i].Kind == 'T' ? 'TASK' : links[i].Kind);\n links[i].Kind = (links[i].Kind == 'J' ? 'JOB' : links[i].Kind);\n links[i].Kind = (links[i].Kind == 'R' ? 'REF' : links[i].Kind);\n }\n }\n d.resolve(links);\n } else {\n d.reject();\n }\n });\n\n return d.promise();\n }\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n global.clipboard = clipboard;\n\n})(window.WebAccess.agent);\n","(function (global) {\n\n //CREVIEW Шамов А.: Раз разделил на вкладки все настройки, то и этот файл надо бы разбить по вкладкам.\n\n /**\n * Блокируем сверх-частый вызов сервиса.\n * В сервисе происходят не самые легкие\n * махинации.\n * @inner\n * @function setLock();\n */\n var themeLock = false;\n var setLock = function () {\n themeLock = true;\n setTimeout(function () { themeLock = false }, 2000);\n };\n\n var saveTimeout = null;\n\n /**\n * Функции отвечающие за работу страницы настроек.\n * @namespace Core.settings\n * @since 5.0.0.4200 Версия по интерфейсам\n */\n global.settings = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Действие для кнопки \"Переустановить\" для агента\n * @method Core.settings.initAgentControls\n */\n global.settings.installAgent = function () {\n var jButton = $('#reinstall');\n\n WA.agent\n .enable()\n .setSessionInitialized(false);\n\n InitializeAgentSession(true);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Действие для кнопки \"Запустить\" для агента\n * @method Core.settings.startAgent\n */\n global.settings.startAgent = function () {\n var start = WA.agent.start(true);\n log.info('AGENT', 'Launching agent from settings page');\n var jButton = $('#launch');\n\n WA.Init.done(function () {\n WA.CR.spinner.show();\n var toast = new WA.CMP.NTF.Toast();\n start.done(function (isOK) {\n if (isOK) {\n toast.show(L('AGENT_WAS_SUCCESSFULLY_LAUNCHED'));\n Core.agent.init();\n } else {\n toast.show(L('AGENT_LAUNCHING_WAS_FAILED'));\n }\n }).fail(function () {\n toast.show(L('AGENT_LAUNCHING_WAS_FAILED'));\n });\n\n setTimeout(function () {\n WA.CR.spinner.hide();\n start.reject();\n }, 3500);\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Информация о темах\n */\n global.settings.themes = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализация контролов отвечающих за работу с агентом\n * @method Core.settings.initAgentControls\n */\n global.settings.initAgentControls = WA.TCD(function () {\n\n var jCheck = $(\"#isAgentEnabled\");\n var jDownload = $(\"#download\");\n var jLaunch = $(\"#launch\");\n var jUploadLogFiles = $(\"#uploadLogFiles\");\n\n if (WA.agent.isDisabled()) {\n jCheck.prop(\"checked\", true);\n jDownload.addClass('disabled');\n jDownload.attr('disabled', true);\n jLaunch.addClass('disabled');\n jLaunch.attr('disabled', true);\n jUploadLogFiles.addClass('disabled');\n jUploadLogFiles.attr('disabled', true);\n };\n\n\n jCheck.on('change', function () {\n if ($(this).is(':checked')) {\n WA.agent.disable();\n jDownload.addClass('disabled');\n jDownload.attr('disabled', true);\n jLaunch.addClass('disabled');\n jLaunch.attr('disabled', true);\n jUploadLogFiles.addClass('disabled');\n jUploadLogFiles.attr('disabled', true);\n } else {\n WA.agent.enable();\n jDownload.removeClass('disabled');\n jDownload.attr('disabled', false);\n jLaunch.removeClass('disabled');\n jLaunch.attr('disabled', false);\n jUploadLogFiles.removeClass('disabled');\n jUploadLogFiles.attr('disabled', false);\n }\n Core.settings.initDocDefaultAction();\n global.settings.saveDocDefaultActionSettings();\n //(new WA.CMP.NTF.Toast()).show(L('SETTINGS_SAVED'));\n });\n return global.settings;\n });\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Вызывает сервис сохранения настроек открытия документов и предпросмотра.\n * @function Core.settings.applyPreviewSettingss\n * @since 5.4.0.1006\n * @return Core.settings\n */\n global.settings.applyPreviewSettings = function (isPreviewEnabled, isColoringRecordsEnabled, isFullscreenPreview, openDocForEditByDefault, openCardByDefault) {\n\n g_isPreviewEnabled = isPreviewEnabled;\n g_isColoringRecordsEnabled = isColoringRecordsEnabled;\n g_isFullscreenPreview = isFullscreenPreview;\n g_openDocForEditByDefault = openDocForEditByDefault;\n\n return WA.SRV.call(\"/Session.asmx/ApplyPreviewSettings\",\n {\n EnablePreview: isPreviewEnabled ? \"True\" : \"False\",\n EnableColoringRecords: isColoringRecordsEnabled ? \"True\" : \"False\",\n UseFullScreenPreview: isFullscreenPreview ? \"True\" : \"False\",\n OpenCardByDefault: openCardByDefault ? \"True\" : \"False\",\n OpenDocForEditByDefault: openDocForEditByDefault ? \"True\" : \"False\"\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Сохраняет настройки открытия документов и предпросмотра.\n * @function Core.settings.saveDocDefaultActionSettings\n * @since 5.0.0.4200\n * @return Core.settings\n */\n global.settings.saveDocDefaultActionSettings = function () {\n var isPreviewEnabled = $(\"#chkOpenPreviewFromList\").length !== 0\n ? $(\"#chkOpenPreviewFromList\").is(':checked')\n : !WA.agent.isAvailable() && (g_defaultListAction != 'showcard');\n var isColoringRecordsEnabled = $(\"#chkColoringRecords\").length !== 0\n ? $(\"#chkColoringRecords\").is(':checked')\n : g_isColoringRecordsEnabled;\n var isFullscreenPreview = $(\"#chkOpenFullscreenPreview\").length !== 0\n ? $(\"#chkOpenFullscreenPreview\").is(':checked')\n : g_isFullscreenPreview;\n var openDocForEditByDefault = $('#chkOpenDocForEditingDefault').length !== 0\n ? $('#chkOpenDocForEditingDefault').is(':checked')\n : g_openDocForEditByDefault;\n var openCardByDefault = $(\"#chkOpenCardFromList\").length !== 0\n ? $(\"#chkOpenCardFromList\").is(':checked')\n : g_defaultListAction === 'showcard';\n\n return global.settings.applyPreviewSettings(isPreviewEnabled, isColoringRecordsEnabled, isFullscreenPreview, openDocForEditByDefault, openCardByDefault).done(function (res) {\n (new WA.CMP.NTF.Toast()).show(L('SETTINGS_SAVED'));\n }).always(function () {\n if ($.isFunction(ReloadWindowToLoadPlugin)) ReloadWindowToLoadPlugin();\n });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализирует настройки предпросмотра.\n * @function Core.settings.initPreviewSettings\n * @since 5.0.0.4200\n * @return Core.settings\n */\n global.settings.initPreviewSettings = WA.TCD(function () {\n $(function () {\n var jOpenFullscreenPreviewChk = $('#chkOpenFullscreenPreview');\n if (g_isFullscreenPreview) {\n jOpenFullscreenPreviewChk.attr('checked', true);\n }\n });\n\n $(\"#chkOpenPreviewFromList, #chkOpenEditorFromList, #chkOpenCardFromList\")\n .on(\"change\", ViewPreviewSettingsModal_DisableControls)\n .on(\"change\", window.Core.settings.saveDocDefaultActionSettings);\n\n $(\"#chkOpenDocForReadingDefault, #chkOpenDocForEditingDefault\")\n .on(\"change\", ViewPreviewSettingsModal_ChangePreviewSettings)\n .on(\"change\", window.Core.settings.saveDocDefaultActionSettings);\n\n return global.settings;\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n* Инициализирует настройки раскраски записей справочников.\n* @function Core.settings.initColoringRecordsSettings\n* @since 5.2.1.1000\n* @return Core.settings\n*/\n global.settings.initColoringRecordsSettings = WA.TCD(function () {\n $(function () {\n jColoringRecordsEnabled = $(\"#chkColoringRecords\");\n\n if (g_isColoringRecordsEnabled) {\n jColoringRecordsEnabled.attr('checked', true);\n }\n\n if (g_isColoringRecordsSettingsHidden) {\n jColoringRecordsEnabled.attr('disabled', true);\n jColoringRecordsEnabled.parent().attr('title', L(\"DISABLE_COLORING_RECORD_SETTINGS_HINT\"));\n jColoringRecordsEnabled.parent().addClass(\"field_disabled\");\n }\n });\n\n return global.settings;\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n* Инициализирует настройки автоочистки.\n* @function Core.settings.initAutoCleaningSettings\n* @since 5.1.0.1515\n* @return Core.settings\n*/\n global.settings.initAutoCleaningSettings = WA.TCD(function () {\n\n var jSettingsAutocleaningEnable = $('#settings-autocleaning-enable');\n var jSettingsAutocleaningOnCompletion = $(\"#settings-autocleaning-oncompletion\");\n var jSettingsAutocleaningPeriod = $('#settings-autocleaning-period');\n var jSettingsAutocleaningDefault = $('#settings-autocleaning-default');\n var jSettingsAutocleaningAfterdays = $('#settings-autocleaning-afterdays');\n var AutocleaningDefaultChangeLink = $('.ac-change-link');\n var changedObjects = [\n jSettingsAutocleaningEnable, jSettingsAutocleaningOnCompletion, jSettingsAutocleaningAfterdays,\n jSettingsAutocleaningPeriod\n ];\n\n //Отключение автоочиски\n jSettingsAutocleaningEnable.on('change', window.Core.settings.switchAutoCleaningSettings);\n\n //Изменение настроек\n $.each(changedObjects, function (index, value) {\n value.on(\"change\", function () {\n clearTimeout(saveTimeout);\n saveTimeout = setTimeout(window.Core.settings.saveAutoCleaningSettings, 500);\n });\n });\n\n jSettingsAutocleaningPeriod.on('keydown', function () {\n clearTimeout(saveTimeout);\n saveTimeout = setTimeout(window.Core.settings.saveAutoCleaningSettings, 500);\n });\n\n //Валидатор числа дней\n //$('#settings-autocleaning-period').on('keypress', function (event) {\n // return event.charCode >= 48 && event.charCode <= 57\n //});\n jSettingsAutocleaningPeriod.Validator(\"^([-]?|[-]?[\\\\d]+)$\");\n\n //Настройки по умолчанию\n jSettingsAutocleaningDefault.on('click', window.Core.settings.updateDefaultAutocleaningSettings);\n\n // Сброс настроек\n AutocleaningDefaultChangeLink.on('click', window.Core.settings.createAutocleaningSettingsFromDefaultSettings);\n\n return global.settings;\n });\n\n /**\n* Сохраняет настройки автоочистки.\n* @function Core.settings.saveAutoCleaningSettings\n* @since 5.1.0.1515\n* @return Core.settings\n*/\n global.settings.saveAutoCleaningSettings = WA.TCD(function () {\n\n var jSettingsAutocleaningEnable = $('#settings-autocleaning-enable');\n var jSettingsAutocleaningOnCompletion = $(\"#settings-autocleaning-oncompletion\");\n var jSettingsAutocleaningPeriod = $('#settings-autocleaning-period');\n\n var enableAutoClean = jSettingsAutocleaningEnable.is(':checked');\n var cleanMode = enableAutoClean ? (jSettingsAutocleaningOnCompletion.is(':checked') ? 0 : 1) : 255;\n var linkStoringPeriod = jSettingsAutocleaningPeriod.val();\n\n //Если режим автоочистки по дням, а количество дней не задано, то не сохраняем\n if ((cleanMode == 1) && (linkStoringPeriod === \"\"))\n return global.settings;\n\n //Если введено некорректное значение, то ставим 1\n if (!linkStoringPeriod) {\n linkStoringPeriod = 1;\n jSettingsAutocleaningPeriod.val(1)\n }\n\n ShowTopSpinner();\n WA.services.call(\"/Session.asmx/ApplyAutoCleanSettings\", {\n CleanMode: cleanMode,\n LinkStoringPeriod: linkStoringPeriod\n }).always(function () {\n HideTopSpinner(L('SETTINGS_SAVED'), 2000);\n }).error(function (error) {\n console.log(error);\n });\n return global.settings;\n });\n\n /**\n * Добавляет папку в список папок автоочистки.\n * @function Core.settings.addAutoCleanFolder\n * @since 5.1.0.1515\n * @return Core.settings\n */\n global.settings.addAutoCleanFolder = WA.TCD(function (list) {\n list.PasteLinks(function (link) {\n return window.Core.settings.setAutoCleanFolder(link.ID, true);\n }, L('SETTINGS_SAVED'));\n return global.settings;\n });\n\n /**\n * Удаляет папку из список папок автоочистки.\n * @function Core.settings.removeAutoCleanFolder\n * @since 5.1.0.1515\n * @return Core.settings\n */\n global.settings.removeAutoCleanFolder = WA.TCD(function (list) {\n list.DeleteLinks(null, function (link) {\n return window.Core.settings.setAutoCleanFolder(link.ID, false);\n }, L('SETTINGS_SAVED'));\n return global.settings;\n });\n\n /**\n * Устанавливает статус автоочистки для папки.\n * @function Core.settings.setAutoCleanFolder\n * @since 5.1.0.1515\n * @return Core.settings\n */\n global.settings.setAutoCleanFolder = WA.TCD(function (folderID, enabled) {\n var success = false;\n //CREVIEW Шамов А.: Почему тут callSync? Выше был обычный call\n // Isaev_DM: setAutoCleanFolder завязаны на работу с ссылками, не стал рефакторить пока старый код\n WA.services.callSync(\"/Folder.asmx/SetFolderAutoClean\", {\n FolderID: folderID,\n Enabled: enabled\n }, \"\", \"\", true).success(function (result) {\n success = true;\n });\n return success;\n });\n\n /**\n * Устанавливает настройки автоочистки по умолчанию.\n * @function Core.settings.defaultAutoCleaningSettings\n * @since 5.1.0.1515\n * @return Core.settings\n */\n function setAutoCleaningSettings(defaultSettings) {\n\n if (defaultSettings != null) {\n\n var autocleaningFolderList = ListRequisite('ctl00_MainContent_ctl00_AutoCleanFolderList');\n var defaultLinks = [];\n\n var jSettingsAutocleaningEnable = $('#settings-autocleaning-enable');\n var jSettingsAutocleaningOnCompletion = $(\"#settings-autocleaning-oncompletion\");\n var jSettingsAutocleaningPeriod = $('#settings-autocleaning-period');\n var jSettingsAutocleaningAfterdays = $('#settings-autocleaning-afterdays');\n\n jSettingsAutocleaningOnCompletion.attr('disabled', false);\n jSettingsAutocleaningAfterdays.attr('disabled', false);\n jSettingsAutocleaningPeriod.attr('disabled', false);\n jSettingsAutocleaningPeriod.removeClass('Req_Disabled');\n\n if (defaultSettings.AllUsersNeedDeleteLinks == \"Y\")\n jSettingsAutocleaningEnable.prop('checked', true);\n else {\n jSettingsAutocleaningEnable.prop('checked', false);\n jSettingsAutocleaningAfterdays.attr('disabled', true);\n jSettingsAutocleaningPeriod.attr('disabled', true);\n jSettingsAutocleaningOnCompletion.prop('disabled', true);\n }\n\n if (defaultSettings.AllUsersLinkStoringPeriod == \"0\") {\n jSettingsAutocleaningAfterdays.prop('checked', false);\n jSettingsAutocleaningOnCompletion.prop('checked', true);\n jSettingsAutocleaningPeriod.val(1);\n } else {\n jSettingsAutocleaningOnCompletion.prop('checked', false);\n jSettingsAutocleaningAfterdays.prop('checked', true);\n jSettingsAutocleaningPeriod.val(defaultSettings.AllUsersLinkStoringPeriod);\n }\n\n if (defaultSettings.AutoCleanInbox != \"0\")\n defaultLinks.push({ ID: parseInt(defaultSettings.AutoCleanInbox), Kind: \"FOL\", CompCode: null });\n\n if (defaultSettings.AutoCleanOutbox != \"0\")\n defaultLinks.push({ ID: parseInt(defaultSettings.AutoCleanOutbox), Kind: \"FOL\", CompCode: null });\n\n autocleaningFolderList.Clear(function (link) {\n window.Core.settings.setAutoCleanFolder(link.ID, false);\n });\n\n autocleaningFolderList.AddLinks(defaultLinks, autocleaningFolderList, function (link) {\n return window.Core.settings.setAutoCleanFolder(link.ID, true);\n });\n\n }\n\n window.Core.settings.saveAutoCleaningSettings();\n\n };\n\n /**\n * Включает/Отключает автоочистку в настройках.\n * @function Core.settings.disableAutoCleaningSettings\n * @since 5.1.0.1515\n * @return Core.settings\n */\n global.settings.switchAutoCleaningSettings = WA.TCD(function () {\n\n var jSettingsAutocleaningEnable = $('#settings-autocleaning-enable');\n var jSettingsAutocleaningOnCompletion = $(\"#settings-autocleaning-oncompletion\");\n var jSettingsAutocleaningPeriod = $('#settings-autocleaning-period');\n var jSettingsAutocleaningAfterdays = $('#settings-autocleaning-afterdays');\n\n var disable = !jSettingsAutocleaningEnable.is(\":checked\");\n jSettingsAutocleaningOnCompletion.attr('disabled', disable);\n jSettingsAutocleaningAfterdays.attr('disabled', disable);\n jSettingsAutocleaningPeriod.attr('disabled', disable);\n if (disable)\n jSettingsAutocleaningPeriod.addClass('Req_Disabled');\n else\n jSettingsAutocleaningPeriod.removeClass('Req_Disabled');\n });\n\n /**\n * Получает дефолтные настройки автоочистки.\n * @function Core.settings.updateDefaultAutocleaningSettings\n * @since 5.1.0.1515\n * @return Core.settings\n */\n global.settings.updateDefaultAutocleaningSettings = WA.TCD(function () {\n var success = false;\n\n //CREVIEW Шамов А.: Почему callSync. Это плохо, т.к. зависает браузер на время этого запроса.\n WA.services.callSync(\"/Session.asmx/GetDefaultAutocleaningSettings\",\n null, \"\", \"\", true).success(function (result) {\n setAutoCleaningSettings(result);\n success = true;\n });\n return success;\n });\n\n /**\n * Создает пользовательские настройки на основе настроек администратора.\n * @function Core.settings.getDefaultAutocleaningSettings\n * @since 5.1.0.1515\n * @return Core.settings\n */\n global.settings.createAutocleaningSettingsFromDefaultSettings = WA.TCD(function () {\n var success = false;\n WA.services.call(\"/Session.asmx/CreateAutocleaningSettingsFromDefaultSettings\",\n null, \"\", \"\", true).success(function (result) {\n success = true;\n //CREVIEW Isaev_DM: Пересмотреть реализацию в ходе поддержки тестирования\n location.reload();\n });\n return success;\n });\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n // Событие change вызывается всегда поэтому модалка\n // снова срабатывает при нажатии на кнопку отмена если убрать cancelLock.\n var cancelLock = false;\n global.settings.setNewLanguage = function (jObject) {\n if (cancelLock) return;\n\n var handler = arguments.callee;\n var pickInstance = jObject.data()['DropDownListInstance'];\n\n var lang = pickInstance.getValue();\n var langCaption = pickInstance.getDisplayValue();\n if (lang == pickInstance.prevValue) return;\n\n var dialog = new WA.CMP.dialogs.MessageBox();\n dialog.isShowCancelButton = true;\n dialog.isShowOkButton = false;\n dialog.removeDefaultButtons();\n\n var labels = {\n 'relogin': L('RELOGIN'),\n 'reloginLater': L('OK'),\n 'cancel': L('RELOGINCANCEL')\n };\n\n if (isPassthrough) labels = {\n 'relogin': L('RELOGIN_AUTO'),\n 'reloginLater': L('RELOGIN_LATER_AUTO')\n };\n\n var cancel = function () {\n cancelLock = true;\n pickInstance.setPrevValue(false);\n setTimeout(function () { cancelLock = false; }, 100);\n };\n\n dialog.addButton('ReloginLater', labels.reloginLater, function () {\n WebAccess.services.session.SetNewLanguage(lang);\n ErrorShow(L('REGIONAL_SETTINGS_LATER_NEW_LANGUAGE', langCaption));\n })\n .addButton('CancelButton', L('CANCEL'), cancel)\n .bind('crossClose', cancel)\n .show(L('RELOGIN_DIALOG_MAIN_TEXT'), L('RELOGIN_DIALOG_ADDITIONAL_TEXT'), L('RELOGIN_DIALOG_TITLE'), 'warning')\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Инициализирует настройки открытия документов.\n * @function Core.settings.initDocDefaultAction\n * @since 5.0.0.4200\n * @return Core.settings\n */\n global.settings.initDocDefaultAction = WA.TCD(function () {\n var enableRadioButton = function (jBtn) {\n jBtn.next(\"label\").removeClass('field_disabled');\n jBtn.attr('disabled', false);\n };\n\n var disableRadioButton = function (jBtn) {\n jBtn.next(\"label\").addClass('field_disabled');\n jBtn.attr('disabled', 'disabled');\n };\n\n $.when(WA.AgentInit).then(function () {\n var jOpenPreviewFromListChk = $('#chkOpenPreviewFromList');\n var jOpenCardFromListChk = $('#chkOpenCardFromList');\n var jOpenEditorFromListChk = $('#chkOpenEditorFromList');\n var jOpenDocForReadingDefaultChk = $('#chkOpenDocForReadingDefault');\n var jOpenDocForEditingDefaultChk = $('#chkOpenDocForEditingDefault');\n\n var needDisableAgentSetts = !WA.agent.isAvailable();\n switch (g_defaultListAction) {\n case 'preview':\n jOpenPreviewFromListChk.attr('checked', true);\n break;\n case 'showcard':\n jOpenCardFromListChk.attr('checked', true);\n break;\n case 'open':\n jOpenEditorFromListChk.attr('checked', true);\n break;\n case 'viewineditor':\n jOpenEditorFromListChk.attr('checked', true);\n break;\n }\n\n if (needDisableAgentSetts && (g_defaultListAction != 'showcard')) {\n jOpenPreviewFromListChk.attr('checked', true);\n }\n\n if (!g_openDocForEditByDefault) {\n jOpenDocForReadingDefaultChk.attr('checked', true);\n } else {\n jOpenDocForEditingDefaultChk.attr('checked', true);\n }\n\n if (!needDisableAgentSetts) {\n enableRadioButton(jOpenEditorFromListChk);\n }\n if (!needDisableAgentSetts && !g_isPreviewEnabled && !jOpenCardFromListChk.is(':checked')) {\n enableRadioButton(jOpenDocForReadingDefaultChk);\n enableRadioButton(jOpenDocForEditingDefaultChk);\n }\n\n if (needDisableAgentSetts) {\n disableRadioButton(jOpenEditorFromListChk);\n disableRadioButton(jOpenDocForReadingDefaultChk);\n disableRadioButton(jOpenDocForEditingDefaultChk);\n }\n });\n return global.settings;\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * DEPRECATED\n * Получает параметры тем из JSON файлов, инициализирует контролы\n * @function Core.settings.loadThemesData\n * @return Core.settings\n * @deprecated As of 5.5.0.1801\n */\n global.settings.loadThemesData = WA.TCD(function (force) {\n return global.settings;\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * DEPRECATED\n * Предварительная настройка контролов отвечающих за изменение темы.\n * @function Core.settings.initThemesEvents\n * @return Core.settings\n * @deprecated As of 5.5.0.1801\n */\n global.settings.initThemesEvents = WA.TCD(function () {\n return global.settings;\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * DEPRECATED\n * Установить выбранный пользователем цвет\n * @function Core.settings.setCustomColor\n * @param {array} rgbColor основной цвет\n * @param {boolean} opt_commit нужно ли сохранить значние в профиле\n * @deprecated As of 5.5.0.1801\n */\n global.settings.setCustomColor = function (rgbColor, opt_commit) {\n return false;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Применить тему.\n * DEPRECATED\n * @function Core.settings.applyTheme\n * @param {string} name - имя темы(gray, green)\n * @param {string} type - вариант темы(dark,light)\n * @param {array} backgroundColor - базовый цвет фона, массив [R(int),G(int),B(int)]\n * @param {array} textColor - базовый цвет текста, массив [R(int),G(int),B(int)]\n * @since 5.0.0.4214\n * @return Core.settings\n * @deprecated As of 5.5.0.1801\n */\n global.settings.applyTheme = function (name, type, backgroundColor, textColor) {\n return false;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * DEPRECATED\n * Смена темы.\n * @function Core.settings.changeTheme\n * @since 5.0.0.4214\n * @return Core.settings\n * @deprecated As of 5.5.0.1801\n */\n global.settings.changeTheme = function (fullName) {\n return global.settings;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /*\n * Инициализировать настройки управляемых папок.\n * @function Core.settings.initManagedFoldersSettings\n * @return Core.settings\n */\n global.settings.initManagedFoldersSettings = WA.TCD(function () {\n\n $(\".all-managed-folders\").find(\"input[type=checkbox]\").on(\"change\", function () {\n changeChildControlsCheckedState($(this).parent());\n });\n\n $(\".single-managed-folder\").find(\"input[type=checkbox]\").on(\"change\", function () {\n var jChildContainer = $(this).parent().parent();\n var jParentCheckbox = jChildContainer.parent().find(\".all-managed-folders\").find(\"input[type=checkbox]\");\n global.settings.updateManagedFoldersLinks([$(this).parent().attr(\"data-control\")], $(this).is(\":checked\"))\n var checkedItemsLength = jChildContainer.find(\"input[type=checkbox]:checked\").length;\n var allItemsLength = jChildContainer.find(\"input[type=checkbox]\").length;\n if ((checkedItemsLength == 0) || (checkedItemsLength != allItemsLength))\n jParentCheckbox.prop(\"checked\", false);\n else\n if (checkedItemsLength == allItemsLength) {\n jParentCheckbox.prop(\"checked\", true);\n }\n });\n\n return global.settings;\n });\n\n /*\n * Обновить ссылки управляемых папок по идентификаторам.\n * @return {boolean} Успешное/неуспешное завершение вызова метода веб-сервиса.\n */\n global.settings.updateManagedFoldersLinks = WA.TCD(function (managedFoldersIDs, pasteLinks) {\n ShowTopSpinner();\n WA.services.call(\"/FolderList.asmx/UpdateManagedFoldersLinks\", {\n ManagedFoldersIDs: managedFoldersIDs,\n PasteLinks: pasteLinks\n }, \"\", \"\", true).always(function (result) {\n HideTopSpinner(L('SETTINGS_SAVED'), 2000);\n });\n return global.settings;\n });\n\n /*\n * Изменить состояния дочерних чекбоксов и обновить настройки управляемых папок\n * @function changeChildControlsCheckedState\n * @param {object} parentControl\n */\n function changeChildControlsCheckedState(jParentControl) {\n var parentControlIsChecked = $(jParentControl).find(\"input[type=checkbox]\").is(\":checked\");\n var managedFoldersIDs = [];\n jParentControl.parent().find(\".single-managed-folder\").each(function () {\n var jChildCheckbox = $(this).find(\"input[type=checkbox]\");\n jChildCheckbox.prop(\"checked\", parentControlIsChecked);\n managedFoldersIDs.push($(this).attr(\"data-control\"));\n });\n global.settings.updateManagedFoldersLinks(managedFoldersIDs, parentControlIsChecked);\n };\n\n /**\n * Отправить логи на сервер\n */\n global.settings.uploadLogs = function () {\n var d = $.Deferred();\n var toast = new WA.CMP.NTF.Toast();\n WA.agent.checkSessionState(1).done(function (isSessionRegistered) {\n if (isSessionRegistered) {\n Core.agent.uploadLogs().done(function (response) {\n toast.showMessage(L(\"ERROR_REPORT_SUCCESS_MESSAGE\"));\n d.resolve(response);\n }).fail(function (response) {\n toast.showMessage(L('ERROR_REPORT_FAIL_MESSAGE'));\n d.reject(response);\n });\n } else {\n ShowWarning(L(\"LAUNCH_AGENT_TO_SEND_ERROR_REPORT\"));\n }\n }).fail(function () {\n ShowWarning(L(\"LAUNCH_AGENT_TO_SEND_ERROR_REPORT\"));\n });\n\n return d.promise();\n };\n\n})(window.Core);\n","(function (global) {\n\n /**\n * Функции отвечающие за работу карточек.\n * @namespace Core.cards\n * @since 5.0.0.7100\n */\n global.cards = {};\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Удаление строки детального раздела.\n * @function Core.cards.deleteTableRow\n * @since 5.0.0.7100\n * @return Core.cards\n */\n global.cards.deleteTableRow = function (el, rowNum) {\n ConfirmDialogNew({\n text: L(\"CONFIRM_TABLE_RECORD_DELETE\"),\n okText: L(\"YES\"),\n cancelText: L(\"NO\"),\n ok: function () {\n var tbl = $(el).parents().filter('table:first');\n var detailNum = +tbl.data('section');\n WA.CR.form.controls.tables[tbl.data('name')].deleteRow(+rowNum);\n }\n });\n return this;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Установить доступность кнопок.\n * @since 5.5.2201\n */\n global.cards.enableButtonsOnFormChange = function (buttonNames) {\n var toolBar = WA.CR.toolBar;\n if (toolBar) {\n buttonNames.forEach(function (buttonName) {\n var button = toolBar.buttons[buttonName];\n if (button) {\n button.enable();\n }\n });\n }\n };\n //---------------------------------------------------------------------//\n\n /**\n * Установить доступность кнопок на ленте при изменении формы.\n * @since 5.5.2201\n */\n global.cards.bindButtonsEnablingOnFormChange = function (buttonNames) {\n // Флаг, указывающий необходимость осуществления блокировки кнопок не ленте\n // на основе режима доступности\n var isControlChangedBefore = false;\n $.when(WA.FormControlsInit, WA.FormInit, WA.ToolBarInit).done(function () {\n WA.CR.form.bind('change', function () {\n global.cards.enableButtonsOnFormChange(buttonNames);\n if (!isControlChangedBefore) {\n Core.cards.setButtonsEnablingOnEnabledMode();\n isControlChangedBefore = true;\n }\n });\n\n //подписываем реквизиты карточки на события ввода\n bindButtonsEnablingOnMainSectionRequisitesKeypress(buttonNames);\n bindButtonsEnablingOnDetailSectionRequisitesKeypress(buttonNames);\n });\n };\n\n /**\r\n * Делает конопки доступными при вводе на реквизиты основного раздела\r\n * @param {Array} buttonNames названия кнопок\r\n */\n function bindButtonsEnablingOnMainSectionRequisitesKeypress(buttonNames) {\n WA.CR.form.requisites.toArray().forEach(function (req) {\n req.controls.forEach(function (c) {\n c.one('keypress',function () {\n global.cards.enableButtonsOnFormChange(buttonNames);\n });\n });\n });\n }\n\n /**\r\n * Делает конопки доступными при вводе на реквизиты детального раздела\r\n * @param {Array} buttonNames названия кнопок\r\n */\n function bindButtonsEnablingOnDetailSectionRequisitesKeypress(buttonNames) {\n var tables = WA.CR.form.controls.tables;\n for (var tableName in tables) {\n tables[tableName].rows.toArray().forEach(function (row) {\n row.requisites.toArray().forEach(function (req) {\n req.bind('editModeChange', function () {\n req.controls.forEach(function(c) {\n c.one('keypress', function() {\n global.cards.enableButtonsOnFormChange(buttonNames);\n });\n });\n });\n });\n });\n };\n }\n\n /**\n * Установить доступность кнопок на ленте при изменении формы на основе режима доступности.\n * @since 5.5.2201\n */\n global.cards.setButtonsEnablingOnEnabledMode = function () {\n WA.CR.toolBar.buttons.getButtonsByEnabledMode(ACTION_ENABLED_MODE.ENABLED_ON_BROWSE).forEach(function (button) {\n button.disable();\n });\n WA.CR.toolBar.buttons.getButtonsByEnabledMode(ACTION_ENABLED_MODE.ENABLED_ON_EDIT).forEach(function (button) {\n button.enable();\n });\n };\n\n})(window.Core);\n","\"use strict\";\n(function gridNamespace(global) {\n\n /**\n * Функции отвечающие за грид\n * @namespace Core.grid\n * @since 5.2.0.1100\n */\n global.grid = {};\n\n /**\n * Функции отвечающие за грид списка записей справочника.\n * @namespace Core.grid.reference\n * @since 5.2.0.1100\n */\n global.grid.reference = {};\n\n /**\n * Deferred-объект. Сообщает о готовности к использованию Core.grid.reference.\n * @namespace Core.grid.referenceInit\n * @since 5.4.0.1021\n */\n global.grid.referenceInit = $.Deferred();\n\n /**\n * Определяем место размещения грида\n * @method Core.grid.getPlacementContext\n * @return {String}\n */\n global.grid.getPlacementContext = function () {\n if (typeof g_ReferencePlacementContext !== 'undefined') {\n return g_ReferencePlacementContext;\n } else {\n var currentTab = WA.current.sideBar.tabs.current;\n if (!!currentTab) {\n var prefix;\n switch (WA.getLocation()) {\n case \"reference\": prefix = \"RefCard\"; break;\n case \"doc\": prefix = \"DocCard\"; break;\n case \"task\": prefix = \"TaskCard\"; break;\n case \"job\": prefix = \"JobCard\"; break;\n case \"folder\": prefix = \"FolderCard\"; break;\n default: prefix = \"Card\";\n }\n return prefix + '_' + currentTab.name.toUpperCase();\n }\n return 'Explorer';\n }\n }\n\n})(window.Core);\n","(function referenceDataSourceInitLambda(global) {\n\n // Источник данных для грида.\n var ReferenceDataSource = WA.CMP.dataViews.BaseDataProvider.extend({\n referenceName: '',\n referenceView: '',\n initialState: null,\n\n _cacheID: '',\n _saveSateTimeout: null,\n\n init: function (referenceName, referenceView, placementContext, initialState) {\n var me = this;\n\n me._super(initialState);\n\n me.referenceName = referenceName;\n me.referenceView = referenceView;\n me.placementContext = placementContext;\n me.initialState = initialState;\n\n me._cacheID = generateUniqueID();\n\n me.defaults = {\n ReferenceName: me.referenceName,\n ReferenceView: me.referenceView,\n PlacementContext: me.placementContext\n }\n },\n\n makeParams: function (loadOptions) {\n var me = this;\n loadOptions.CacheID = me._cacheID;\n return {\n Params: $.toJSON(me.extendDefaults(loadOptions))\n }\n },\n\n load: function (loadOptions) {\n var me = this;\n var result = new $.Deferred();\n var rowsQuery = WA.SRV.call('/Reference.asmx/GetGridRows', me.makeParams(loadOptions));\n\n // Запрос получения данных уже и так сохраняет состояние в профиле, поэтому предотвращаем отдельные лишние запросы для сохранения состояния.\n clearTimeout(me._saveSateTimeout);\n\n rowsQuery.done(function onDataLoad(data) {\n result.resolve($.parseJSON(data));\n }).fail(function onDataFail(err) {\n log.error(\"GRID\", \"Can not get data for table. \" + err);\n WA.CR.inlineHint.show(err);\n result.reject(\"Can not get data for table. \" + err);\n });\n\n return result.promise();\n },\n\n totalCount: function (filter, globalLikeFilter) {\n var me = this;\n return WA.SRV.call(\"/Reference.asmx/GetRecordCount\", {\n ReferenceCode: me.referenceName,\n ReferenceView: me.referenceView,\n SelectExpression: filter ? filter : \"\", \n IgnoreRestrictions: true,\n PlacementContext: me.placementContext,\n QueryInstanceID: me.initialState.QueryInstanceID,\n QueryContext: me.initialState.QueryContext,\n GlobalLikeFilter: globalLikeFilter ? globalLikeFilter : \"\"\n }).promise();\n },\n\n loadState: function () {\n var me = this;\n var result = $.Deferred();\n result.resolve(me.initialState);\n return result.promise();\n },\n\n saveState: function (loadOptions, forceSaveToServer) {\n var me = this;\n var result = $.Deferred();\n if (forceSaveToServer !== true) {\n // Сохранение состояния теперь при получении данных.\n result.resolve();\n } else {\n clearTimeout(me._saveSateTimeout);\n me._saveSateTimeout = setTimeout(function () {\n WA.SRV.call('/Reference.asmx/SaveGridState', me.makeParams(loadOptions)).promise().done(function () {\n result.resolve();\n }).fail(function () {\n result.reject();\n });\n }, 200);\n }\n return result.promise();\n }\n });\n\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n // Публичные объекты.\n global.ReferenceDataSource = ReferenceDataSource;\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.Core.grid);","(function selectListDataProvider(global) {\n \"use strict\";\n\n global.SelectListDataProvider = WA.CMP.dataViews.BaseDataProvider.extend({\n className: 'SelectListDataProvider',\n _cachedPages: {},\n lastLike: '',\n lastExpression: '',\n settings: null,\n lastCurrentPeriodEnabled: null,\n\n init: function (settings) {\n var me = this;\n me._super();\n me._cachedPages = {};\n me.settings = $.extend({}, settings);\n },\n\n load: function (loadOptions) {\n var me = this;\n var result = $.Deferred();\n var selectedRecords = [];\n var notSelectedRecords = [];\n var specialRecords = [];\n\n if (loadOptions.selectedRecords && loadOptions.selectedRecords.length) {\n selectedRecords = _(loadOptions.selectedRecords).pluck('Value');\n }\n\n //Записи которые были исключены\n if (loadOptions.notSelectedRecords && loadOptions.notSelectedRecords.length) {\n notSelectedRecords = _(loadOptions.notSelectedRecords).pluck('Value');\n }\n\n //если применили фильтр то придется сбросить кэш\n var isCurrentPeriodEnabled = Core.grid.reference.isCurrentPeriodEnabled();\n if (loadOptions.like !== me.lastLike || loadOptions.expression !== me.lastExpression || me.lastCurrentPeriodEnabled !== isCurrentPeriodEnabled) {\n me._cachedPages = {};\n me.lastLike = loadOptions.like;\n me.lastExpression = loadOptions.expression;\n me.lastCurrentPeriodEnabled = isCurrentPeriodEnabled;\n }\n\n //Если страница есть в кэше, то возьмем из кэша\n if (me._cachedPages[loadOptions.page]) {\n var records = me._cachedPages[loadOptions.page];\n\n records = _(records).map(function (record) {\n if (!loadOptions.invertedMode) {\n record.isSelected = selectedRecords.indexOf(record.value) !== -1\n } else {\n record.isSelected = notSelectedRecords.indexOf(record.value) === -1\n }\n return record;\n });\n \n \n result.resolve(_(specialRecords.concat(records)).map(function (r) {\n r.id = (\"\" + r.value).makeSafeString(); return r\n }));\n return result.promise();\n }\n\n WA.SRV.call('/Reference.asmx/GetDistinctRequisiteValues', {\n ReferenceCode: me.settings.referenceName || WA.CR.getReferenceCode(),\n ReferenceView: me.settings.referenceView || WA.CR.getReferenceView(),\n RequisiteName: loadOptions.requisiteName,\n Filter: me.settings.filter,\n CustomFilter: loadOptions.like,\n SelectExpr: loadOptions.expression,\n Skip: loadOptions.skip,\n Take: loadOptions.take,\n QueryInstanceID: me.settings.queryInstanceID,\n QueryContext: me.settings.queryContext\n }).done(function (records) {\n records = _(records).map(function (item) {\n return {\n value: item.First,\n displayValue: $.trim(item.Second),\n type: '',\n isSelected: (!loadOptions.invertedMode) ? selectedRecords.indexOf(item.First) !== -1 : notSelectedRecords.indexOf(item.First) === -1\n }\n });\n\n me._cachedPages[loadOptions.page] = records;\n result.resolve(specialRecords.concat(records).map(function (r) {\n r.id = (\"\" + r.value).makeSafeString(); return r\n }));\n });\n\n return result.promise();\n }\n });\n\n})(Core.grid);","(function referenceGridInitLambda(global) {\n\n var TEMPLATES = {\n LINK_CELL: 'components/grid/linkCell.compile.html'\n };\n\n /**\n * Преобразует строку с правилами стиля в html стили.\n */\n global.getReferenceRecordStyle = function (styleRules) {\n var style = \"\";\n\n // По умолчанию цвет белый, не нужно его прописывать чтобы не ломать темы пользователя.\n if (styleRules.TextColor.R + styleRules.TextColor.G + styleRules.TextColor.B > 0)\n style = format(\"color: rgb({0},{1},{2}) !important;\",\n styleRules.TextColor.R,\n styleRules.TextColor.G,\n styleRules.TextColor.B);\n\n if (styleRules.IsBold)\n style = style + \"font-weight: bold;\";\n\n if (styleRules.IsItalic)\n style = style + \"font-style: italic;\";\n\n if (styleRules.IsStrikeOut)\n style = style + \"text-decoration: line-through;\";\n\n return style;\n };\n\n /**\n * Обновить данные в форме-список справочника.\n */\n global.forceReloadData = function () {\n global.reference.updateState({ QueryInstanceID: generateUniqueID() }, true);\n global.reference.reloadData();\n }\n\n global.initReference = function (referenceName, referenceView, placementContext, columns, state) {\n // Создает объект для формирования ссылки на запись справочника.\n var createReferenceRecordObj = function (id) {\n return { id: id, kind: \"REF\", refcode: referenceName, refview: referenceView };\n };\n\n // Дополнительная информация по строке записи справочника.\n var getReferenceRecordRowAdditionalInfo = function (rowNumber, grid) {\n var row = this.getItem(rowNumber);\n if (row.__nonDataRow !== true) {\n var backgroundColor = \"\";\n\n if (row.styleRules) {\n var backgroundColorObj = JSON.parse(row.styleRules).BackgroundColor;\n // По умолчанию цвет белый, не нужно его прописывать чтобы не ломать темы пользователя.\n // TODO сделать цвет выделения ячейки смещением от текущего цвета.\n if (backgroundColorObj.R + backgroundColorObj.G + backgroundColorObj.B < 765) {\n backgroundColor = format(\"background: rgb({0},{1},{2}) !important;\",\n backgroundColorObj.R,\n backgroundColorObj.G,\n backgroundColorObj.B);\n }\n }\n\n return {\n cssClasses: 'List ' + (Core.grid.reference.grid.getSelectedRows().indexOf(rowNumber) !== -1 ? 'selected' : ''), //FIXME\n backgroundColor: backgroundColor,\n attributes: {\n 'id': row.id,\n 'kind': 'REF',\n 'compcode': referenceName,\n 'data-recid': row.id,\n 'data-refcode': referenceName,\n 'oncontextmenu': 'var event = arguments[0] || window.event; return Core.grid.reference.openContextMenu(this, event);'\n }\n };\n }\n };\n\n WA.ready(function () {\n WA.templates.load(TEMPLATES.LINK_CELL).done(function (cellTemplate) {\n\n var DV = WA.CMP.dataViews;\n\n var plugins = [\n new DV.gridPlugins.SortingPlugin(true),\n new DV.gridPlugins.GroupingPlugin(),\n new DV.gridPlugins.FooterPlugin(),\n new DV.gridPlugins.CheckboxPlugin(),\n new DV.gridPlugins.ContextMenuPlugin({ from: 'ReferenceTable', refview: referenceView }),\n new DV.gridPlugins.ColumnResizePlugin(),\n new DV.gridPlugins.FilteringPlugin(global.SelectListDataProvider)\n ];\n\n var dataSource = new global.ReferenceDataSource(referenceName, referenceView, placementContext, state);\n\n // Шаблонизатор ячеек.\n var referenceRecordsCellTemplate = function (rowNumber, cellNumber, value, columnDef, dataContext) {\n var recID = dataContext.id;\n value = value || '';\n\n switch (columnDef.id) {\n case '_ContextMenu':\n // Метод openContextMenu находится в плагине gridPlugins.ContextMenuPlugin.\n return '';\n case '_Checkbox':\n // Для этой колонки подключается спец. плагин gridPlugins.CheckboxPlugin.\n break;\n default:\n var href = GetObjectCardUrl(createReferenceRecordObj(recID));\n // Подсказка.\n var hint = {\n classes: '',\n data: ''\n };\n\n if (columnDef.hint) {\n var columnRecId = dataContext[columnDef.id];\n hint.classes = 'hint';\n hint.data = 'data-hint=\"' + columnDef.hint.replace('%REC_ID%', recID).replace('%REQ_ID%', columnRecId) + '\"';\n }\n\n var style = \"\";\n if (dataContext['styleRules']) {\n style = global.getReferenceRecordStyle(JSON.parse(dataContext['styleRules']));\n }\n\n var target = \"Ref\" + recID;\n\n return cellTemplate.render({\n style: style,\n hint: hint,\n value: value,\n href: href,\n target: target\n });\n }\n };\n\n var referenceGrid = new DV.Grid('#main_container', dataSource, columns, {\n getRowAdditionalInfo: getReferenceRecordRowAdditionalInfo,\n cellTemplate: referenceRecordsCellTemplate,\n plugins: plugins,\n selectListDataProviderSettings: {\n referenceName: referenceName,\n referenceView: referenceView,\n filter: state.GlobalPageFilterLikeQuery,\n queryInstanceID: state.QueryInstanceID,\n queryContext: state.QueryContext\n }\n });\n\n // Для работы клиентской ОМ.\n var notifyObjectList = function () {\n WA.ObjectListInit.done(function () {\n WA.CR.objectList.fire('itemsChange');\n });\n };\n referenceGrid.bind(WA.CMP.DV.Grid.EVENT.AFTER_DATA_LOADED, notifyObjectList).bind(WA.CMP.DV.Grid.EVENT.SELECTED_ROWS_CHANGED, notifyObjectList);\n\n referenceGrid.bind(WA.CMP.DV.Grid.EVENT.AFTER_DATA_LOADED, function () {\n // Инициализируем подсказки к объектам системы.\n InitTooltips();\n });\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n // Публичные объекты.\n global.reference = referenceGrid;\n global.referenceInit.resolve();\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n });\n });\n }\n\n})(window.Core.grid);\n","(function detailsDataProviderInitLambda(global) {\r\n\r\n\r\n /** \r\n * Источник данных для грида.\r\n * @since 5.2.0.1300\r\n */\r\n var DetailsDataProvider = WA.CMP.dataViews.BaseDataProvider.extend({\r\n _DetailSectionNumber: null,\r\n _DFMName: null,\r\n\r\n init: function (initialState) {\r\n var me = this;\r\n\r\n me._super(initialState);\r\n me._cacheID = generateUniqueID();\r\n me._DetailSectionNumber = initialState.DetailSectionNumber;\r\n me._DFMName = initialState.DFMName;\r\n \r\n me.defaults = {\r\n ObjectLink: new WA.Link().toLinkModel() \r\n }\r\n \r\n $.extend(me.defaults, initialState);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n _makeKey: function () {\r\n var me = this;\r\n var code;\r\n if (WA.CR.Type === OBJECT_TYPE.EDOCUMENT) {\r\n code = \"\" + WA.CR.CardTypeCode;\r\n }\r\n\r\n if (WA.CR.Type === OBJECT_TYPE.REFERENCE_RECORD) {\r\n code = \"\" + WA.CR.getReferenceCode();\r\n }\r\n return $.toJSON([code, \"\"+WA.CR.getReferenceView(), \"\"+me._DetailSectionNumber]).replaceAll(' ','');\r\n },\r\n\r\n /**\r\n * @since 5.2.0.1300\r\n */\r\n makeParams: function (loadOptions) {\r\n var me = this;\r\n loadOptions.CacheID = me._cacheID;\r\n return me.extendDefaults(loadOptions);\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n /**\r\n * @since 5.2.0.1300\r\n */\r\n load: function (loadOptions) {\r\n var me = this;\r\n var result = new $.Deferred(); \r\n WA.SRV.call('/CardForm.asmx/GetDetailsData', me.makeParams(loadOptions)).done(function (data) { \r\n result.resolve({ Rows: $.parseJSON(data)});\r\n }).fail(function (e) {\r\n WA.ready(function () {\r\n var severity = (e.Severity !== \"-1\" ? Number(e.Severity) : undefined);\r\n WA.CR.inlineHint.show(e.Error, undefined, severity);\r\n });\r\n result.resolve({ Rows: [] });\r\n });\r\n \r\n return result.promise();\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n \r\n loadState: function () {\r\n var me = this;\r\n var result = $.Deferred();\r\n var jTable = $('#'+me._DFMName);\r\n \r\n //WA.cache.serverCache.getItem(me._makeKey()).done(function (data) {\r\n\r\n var data = jTable.data('state');\r\n if (data && data[\"ObjectLink\"]) delete data[\"ObjectLink\"]; //В профиле может быть неактуальная ссылка\r\n result.resolve(data);\r\n\r\n //}).fail(function (e) {\r\n // result.reject(e);\r\n //});\r\n return result;\r\n },\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n saveState: function (loadOptions, forceSaveToServer) {\r\n var me = this;\r\n var result = $.Deferred(); \r\n clearTimeout(me._saveSateTimeout);\r\n me._saveSateTimeout = setTimeout(function () { \r\n WA.cache.serverCache.setItem(me._makeKey(), me.makeParams(loadOptions)).done(function () {\r\n result.resolve();\r\n }).fail(function () {\r\n result.reject();\r\n });\r\n }, 200); \r\n return result.promise();\r\n }\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n });\r\n\r\n\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n // Публичные объекты.\r\n global.DetailsDataProvider = DetailsDataProvider;\r\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\r\n\r\n})(window.Core.grid);","(function detailsGridInitLambda(global) {\n\n $(function () {\n\n var Initiializer = WebAccess.components.wrappers.details.DetailsInitiializer;\n detailsInitiializer = new Initiializer('div.Reference_Detail', global.DetailsDataProvider, {}, WA.components.dataViews.gridPlugins.DetailsContextMenu, WA.CR);\n detailsInitiializer.bind(Initiializer.EVENT.COMPLETE, function (initiializer) {\n global.details = initiializer.gridInstances;\n initiializer.waitForData().done(function () {\n WA._DetailsGridInit.resolve();\n });\n });\n });\n\n $.when(WA.FormControlsInit, WA.FormInit, WA.DetailsInit).then(function () {\n if (!WA.CR.form.isExist()) return;\n\n // Логика работы ведущих/ведомых в дательных разделах.\n WA.CR.bindLeaderDrivenLogic();\n\n //Удаляем пустые строки перед сохранением\n WA.CR.form.bind(\"prepareSave\", function removeEmptyRows() {\n for (var tableName in WA.CR.form.controls.tables) {\n var table = WA.CR.form.controls.tables[tableName];\n var rows = table.rows.toArray();\n var lastRow = rows[rows.length - 1];\n\n if (rows.length && lastRow && !lastRow.hasFilledRequisites() && !lastRow._locked) {\n table.deleteRow(lastRow.getRowId(), true);\n }\n }\n });\n\n });\n\n\n})(window.Core.grid);","(function (global) {\n\n var getGrid = function () {\n return Core.grid.reference;\n };\n\n var getReferenceName = function () {\n return getGrid()._dataSource.referenceName;\n };\n\n var reloadFiltersAndData = function (params) {\n var grid = getGrid();\n\n var newState = {};\n if (typeof params['PageIndex'] !== 'undefined') {\n newState.PageIndex = params['PageIndex'];\n }\n if (typeof params['CurrentFilter'] !== 'undefined') {\n newState.CurrentFilter = params['CurrentFilter'];\n }\n if (typeof params['UnselectAllRecords'] !== 'undefined' && params['UnselectAllRecords'] === true) {\n grid.grid.setSelectedRows([]); // Сбросить выделение записей справочника\n }\n if (typeof params['IsEnabled'] !== 'undefined') {\n var currentFilter = newState.CurrentFilter || grid.state.CurrentFilter;\n $.extend(newState, {\n CurrentFilter: $.extend({}, currentFilter, {\n IsEnabled: params['IsEnabled']\n })\n });\n }\n\n // Обновляем информацию о фильтрах.\n grid.updateState(newState);\n\n if (!!grid.updateFilter) grid.updateFilter();\n if (!!grid.updateFooter) grid.updateFooter();\n\n grid.reloadData(newState).always(function (data) {\n // Обновляем информацию о фильтрах.\n grid.updateState({\n SavedFilters: data.State.SavedFilters\n });\n global.Filters.setupFiltersState();\n });\n };\n\n /**\n * Функции отвечающие за работу с пользовательскими фильтрами\n * @namespace Filters\n * @ignore\n */\n global.Filters = {\n isChanged: false,\n currentID: \"0\",\n contextMenuElementSelector: '#filters_menu_caption',\n contextMenuSettings: { width: 270, shiftY: 37 },\n referenceName: WA.CR.getReferenceCode(),\n referenceView: WA.CR.getReferenceView(),\n placementContext: ''\n };\n\n /**\n * Сохраняет список элементов контекстного меню.\n * @function Filters.initFilterMenuItems\n * @ignore\n */\n Filters.initFilterMenuItems = function (items, opt_referenceName, opt_referenceView, opt_placementContext) {\n Filters.menuItems = items;\n Filters.referenceName = opt_referenceName || WA.CR.getReferenceCode();\n Filters.referenceView = opt_referenceView || WA.CR.getReferenceView();\n Filters.placementContext = opt_placementContext;\n if (!Filters.placementContext) {\n $.when(WA.SideBarInit).then(function () {\n Filters.placementContext = Core.grid.getPlacementContext();\n });\n }\n };\n\n /**\n * Создание контестного меню для выбора фильтра справочника(минитулбар, справа)\n * @function Filters.createReferenceMenu\n * @param {string} selector селектор компоненты\n * @param {Array.} data доступные пункты меню\n * @ignore\n */\n Filters.createReferenceMenu = function (selector, data) {\n //Здесь сделаем фильтр с идексом 0 последним в списке.\n var autoFilter = null;\n var saveFilterItemIndex = data.length - 1;\n for (var i = 0; i < data.length; i++) {\n if (data[i][\"name\"] == \"0\") {\n autoFilter = data[i];\n data.splice(i, 1);\n };\n if (data[i][\"name\"] == \"save_filter\") {\n saveFilterItemIndex = i;\n }\n };\n if (!!autoFilter) {\n // Убираем с последнего фильтра бордер снизу, т.е. теперь автофильтр последний.\n var prevLast = data[saveFilterItemIndex - 1];\n if (prevLast['name'] !== '-1') {\n prevLast.bottomSeparator = false;\n }\n autoFilter.bottomSeparator = true;\n // Добавялем перед \"Сохранить фильтр\" или в самый конец.\n data.splice(saveFilterItemIndex, 0, autoFilter);\n }\n\n try {\n var settings = $.extend({}, Filters.contextMenuSettings, selectToolbarBtnOnShowContextMenu(selector));\n Filters.currentMenu = new WA.components.menus.BaseContextMenu(selector, data, settings);\n Filters.currentMenu.render();\n Filters.currentMenu.bind(\"itemSelect\", function (item) {\n switch (item.name) {\n case 'save_filter':\n window.Filters.saveCurrentFilter($(selector));\n break;\n case 'save_filter_as':\n window.Filters.saveCurrentFilterAs($(selector));\n break;\n case 'delete_filter':\n window.Filters.deleteFilter($(selector));\n break;\n default:\n WA.SRV.reference.setFilter(Filters.referenceName, item.name, Filters.referenceView, Filters.placementContext).success(function (newCurrentFilter) {\n if (newCurrentFilter.ID !== \"-1\") newCurrentFilter.IsEnabled = true;\n reloadFiltersAndData({\n CurrentFilter: newCurrentFilter,\n PageIndex: 0,\n UnselectAllRecords: true\n });\n // Снимаем выделение с кнопки тулбар, если выбрали \"Без фильтра\".\n if (item.name === \"-1\") {\n $(selector).removeClass('selected');\n } else {\n $(selector).addClass('selected');\n }\n });\n };\n });\n } catch (ex) {\n }\n };\n\n\n Filters.saveCurrentFilter = function (el) {\n Filters.saveFilter(el, false);\n };\n\n Filters.saveCurrentFilterAs = function (el) {\n Filters.saveFilter(el, true)\n };\n\n\n /**\n * Сохранение текущего фильтра в новый\n * @function Filters.saveFilter\n * @ignore\n */\n Filters.saveFilter = function (el, createNew) {\n if ($(el).hasClass(\"disabled\")) return;\n var CP = WA.components;\n\n var filters = Filters.currentMenu.items;\n var options = {};\n\n for (var i = 0; i < filters.length; i++) {\n if (filters[i].name != \"-1\" && filters[i].name != \"0\" && filters[i].name != \"save_filter\" && filters[i].name != \"save_filter_as\" && filters[i].name != \"delete_filter\") {\n options[filters[i].name] = filters[i].label;\n }\n };\n\n if (Filters.currentID == \"0\" && !$(\".resetFilterState\").is(\":visible\")) {\n return ShowMessage(L(\"FILTER_IS_EMPTY\"), L(\"NOTHING_TO_SAVE\"));\n };\n\n var form = new CP.forms.FormBuilder(\"filter_save_modal\")\n .setOrientation(\"horizontal\")\n .addPick(\"FILTER_NAME\", options, null, null, true, { \"isRequired\": true });\n form.displayErrors = \"tip\";\n\n var dialog = new CP.dialogs.BaseDialog();\n dialog.title = createNew ? L(\"SAVE_NEW_FILTER\") : L(\"SAVE_FILTER\");\n dialog.html = form.render();\n dialog.isShowCancelButton = true;\n dialog.ok = function () {\n if (form.isValid() === false) return false;\n var filterID = form.getValue(\"FILTER_NAME\");\n var filterName = form.getDisplayValue(\"FILTER_NAME\");\n if (!createNew) {\n if (Filters.currentID != \"0\")\n WA.SRV.reference.saveFilter(Filters.referenceName, Filters.currentID, filterName, Filters.referenceView, Filters.placementContext).success(function (newCurrentFilter) {\n reloadFiltersAndData({\n CurrentFilter: newCurrentFilter\n });\n });\n else\n if (filterID == \"\") {\n WA.SRV.reference.createNewFilter(Filters.referenceName, filterName, Filters.referenceView, Filters.placementContext).success(function (newCurrentFilter) {\n reloadFiltersAndData({\n CurrentFilter: newCurrentFilter\n });\n });\n } else {\n WA.SRV.reference.saveFilter(Filters.referenceName, filterID, filterName, Filters.referenceView, Filters.placementContext).success(function (newCurrentFilter) {\n reloadFiltersAndData({\n CurrentFilter: newCurrentFilter\n });\n });\n }\n } else {\n WA.SRV.reference.createNewFilter(Filters.referenceName, filterName, Filters.referenceView, Filters.placementContext).success(function (newCurrentFilter) {\n reloadFiltersAndData({\n CurrentFilter: newCurrentFilter\n });\n });\n };\n };\n //$(\"#save_filter\").addClass(\"disabled\").attr(\"title\", L(\"FILTER_NOT_CHANGED\"));\n dialog.bind(\"onOpen\", function () {\n var autoFilterName;\n var index = getElementIndexByAttr(filters, \"name\", \"0\");\n if (parseInt(index, 10) >= 0) {\n autoFilterName = filters[index].label;\n } else {\n if (!createNew) {\n index = getElementIndexByAttr(filters, \"name\", Filters.currentID);\n autoFilterName = filters[index].label;\n } else {\n var maxFilterID = _(_(filters).map(function (f) {\n return +f.name; // Преобразуем в число, что бы вычислить max.\n })).max();\n autoFilterName = L('AUTO_FILTER_LABEL') + ' ' + Math.max(maxFilterID + 1, 1); //Если фильтров нет, то max вернет -Infinity, а имя фильтра сделаем с номером 1.\n }\n }\n form.setValue(\"FILTER_NAME\", '-1', autoFilterName);\n\n $(\"#filter_name\").keypress(function (ev) {\n if (ev.keyCode == 13) {\n dialog.ok();\n dialog.close();\n };\n });\n });\n dialog.show();\n\n BindHelpIcoClickOnModalWindow('SaveFilter');\n };\n\n /**\n * Удаление текущего фильтра\n * @function Filters.removeReferenceMenu\n * @ignore\n */\n Filters.deleteFilter = function (el) {\n if ($(el).hasClass(\"disabled\")) return;\n var selected = Filters.currentMenu.getSelectedItem();\n var dialog = new WA.components.dialogs.BaseDialog();\n dialog.title = L(\"CONFIRMATION\");\n dialog.height = 'auto',\n dialog.isShowCancelButton = true;\n dialog.setHtml(format('{0} \"{1}\"?', L(\"FILTER_DELETE_CONFIRMATION\"), escapeHtml(selected.label)));\n dialog.bind(\"ok\", function () {\n WA.SRV.reference.removeFilter(Filters.referenceName, selected.name, Filters.referenceView, Filters.placementContext).success(function (result) {\n clearFilter();\n });\n });\n dialog.show();\n };\n\n /**\n * Обновление визуальных компонент ответственных за фильтры.\n * Здесь же, происходит выделение текущего фильтра в меню.\n * @function Filters.setupFiltersState\n * @ignore\n */\n Filters.setupFiltersState = function () {\n var grid = getGrid();\n var selectedID = \"-1\";\n var filterID = '' + grid.state.CurrentFilter.ID;\n Filters.currentID = filterID;\n\n var filters = grid.state.SavedFilters;\n if (!!filters) {\n var emptyItem = {\n \"name\": \"-1\",\n \"label\": L(\"DEFAULT_EMPTY_FILTER\"),\n \"bottomSeparator\": true,\n 'selected': (filterID === '-1')\n };\n var wellFormedFilters = [emptyItem];\n for (var filterName in filters) {\n var item = {\n \"name\": filterName,\n \"label\": filters[filterName]\n };\n if (filterName == filterID) {\n item.selected = true;\n selectedID = filterID;\n }\n item['stataction'] = \"SetSavedFilter\";\n wellFormedFilters.push(item);\n };\n\n // Добавляем кнопки только, если есть компонента для управления фильтрами.\n if ($(\"#filters_menu_caption\").length === 0) {\n // У последнего фильтра рисуем нижнюю границу.\n wellFormedFilters[wellFormedFilters.length - 1]['bottomSeparator'] = true;\n\n var btnsDisabled = (selectedID === '-1' || typeof grid === \"undefined\"); //Замечание №69912\n //TODO Если задизэйблены, то нужно еще и подсказку изменить, но контекстное меню этого не поддерживает.\n wellFormedFilters.push({ name: 'save_filter', label: L('SAVE_CURRENT_FILTER'), icon: 'filterSave-16', disabled: btnsDisabled, \"tooltip\": format(\"{0}.\\n{1}.\", L(\"SAVE_CURRENT_FILTER\"), L(\"AVAILABLE_ONLY_IF_FILTER_EXIST\")) });\n wellFormedFilters.push({ name: 'save_filter_as', label: L('SAVE_CURRENT_FILTER_AS'), disabled: btnsDisabled, \"tooltip\": format(\"{0}\\n{1}.\", L(\"SAVE_CURRENT_FILTER_AS\"), L(\"AVAILABLE_ONLY_IF_SAVED_FILTER_EXIST\")) });\n wellFormedFilters.push({ name: 'delete_filter', label: L('DELETE_CURRENT_FILTER'), icon: 'delete-16', disabled: btnsDisabled, \"tooltip\": format(\"{0}.\\n{1}.\", L(\"DELETE_CURRENT_FILTER\"), L(\"AVAILABLE_ONLY_IF_FILTER_EXIST\")) });\n }\n\n Filters.menuItems = wellFormedFilters;\n\n if (!!Filters.contextMenuElementSelector)\n Filters.createReferenceMenu(Filters.contextMenuElementSelector, wellFormedFilters);\n\n // Обновляем компоненту управлющую фильтрами.\n Filters.updateFilterMenuWidget(filters, selectedID);\n\n // Устанавливаем активность/неактивность кнопки ленты \"Текущий фильтр\".\n Core.toolBars.reference.SetCurrentFilterState();\n };\n };\n /**\n * Обновляем компоненту управляющую фильтрами.\n * @function Filters.updateFilterMenuWidget\n * @ignore\n */\n Filters.updateFilterMenuWidget = function (filters, selectedID) {\n var jFilterMenuWidget = $(\"#filters_menu_caption\");\n if (jFilterMenuWidget.length > 0 && !!filters) {\n jFilterMenuWidget.text(filters[selectedID]);\n\n if (selectedID == \"-1\") {\n jFilterMenuWidget.text(L(\"DEFAULT_EMPTY_FILTER\"));\n emptyItem.selected = true;\n } else {\n jFilterMenuWidget.text(filters[selectedID].trunc(50));\n }\n\n //Отключение кнопок\n //-1 - <Отсутсвует>\n if (selectedID === '-1') {\n enableFilterActions();\n } else {\n disableFilterActions();\n }\n }\n };\n\n /// \n /// Очищает фильтр.\n /// \n /// \n Filters.resetFilter = function () {\n var grid = getGrid();\n //Автофильтр придется тоже удалить\n if (grid) {\n WA.SRV.reference.removeFilter(Filters.referenceName, \"0\", Filters.referenceView, Filters.placementContext).success(function (result) {\n clearFilter();\n });\n } else {\n clearFilter();\n }\n }\n\n /// \n /// Вкл./выкл фильтр.\n /// \n /// \n Filters.changeFilterState = function (isEnabled) {\n var data = {\n IsEnabled: isEnabled,\n PageIndex: 0 // Перекинуть на первую страницу\n };\n getGrid().grid.setSelectedRows([]); // Сбросить выделение записей справочника\n reloadFiltersAndData(data);\n };\n\n function clearFilter() {\n var grid = getGrid();\n var currentFilter = grid.state.CurrentFilter;\n\n var newSavedFilters = grid.state.SavedFilters;\n delete newSavedFilters[currentFilter.ID];\n\n reloadFiltersAndData({\n CurrentFilter: $.extend({}, currentFilter, {\n ID: '-1',\n Name: '',\n DisplayValue: '',\n DisplayHint: '',\n Expression: '',\n ColumnsFilter: {}\n }),\n SavedFilters: newSavedFilters,\n PageIndex: 0\n });\n };\n\n function enableFilterActions() {\n $(\"#delete_filter, #save_filter_as, #save_filter\").removeClass(\"disabled\");\n $(\"#delete_filter\").attr('title', L(\"DELETE_CURRENT_FILTER\"));\n $(\"#save_filter_as\").attr('title', L(\"SAVE_CURRENT_FILTER_AS\"));\n $(\"#save_filter\").attr('title', L(\"SAVE_CURRENT_FILTER\"));\n };\n function disableFilterActions() {\n $(\"#delete_filter, #save_filter_as, #save_filter\").addClass(\"disabled\");\n $(\"#delete_filter\").attr('title', L(\"DELETE_CURRENT_FILTER\") + \"\\n\" + L(\"AVAILABLE_ONLY_IF_FILTER_EXIST\"));\n $(\"#save_filter_as\").attr('title', L(\"SAVE_CURRENT_FILTER_AS\") + \"\\n\" + L(\"AVAILABLE_ONLY_IF_SAVED_FILTER_EXIST\"));\n $(\"#save_filter\").attr('title', L(\"SAVE_CURRENT_FILTER\") + \"\\n\" + L(\"AVAILABLE_ONLY_IF_FILTER_EXIST\"));\n };\n\n})(window);\n","\"use strict\";\n\n(function (global) {\n\n /** \n * Механизм запускающий JS функции из массива handlers когда происходит смена версии веб-доступа;\n * @namespace Core.migration\n * @since 5.2.0.1100\n * @return {boolean}\n * @example @see localStorage.js\n */\n global.migration = {\n handlers: [],\n\n init: function () {\n var newVersion = g_Version;\n var oldVersion = WA.cache.getItem('version');\n \n if (newVersion != oldVersion) {\n log.warning('DEFAULT', 'Version is changed. Running migration scripts');\n for (var handler in this.handlers) {\n this.handlers[handler].call(this, oldVersion, newVersion);\n };\n WA.cache.setItem('version', newVersion);\n };\n }\n };\n\n\n})(window.Core);\n\n","(function (global) {\n\n /**\n * Некоторые значение в localStorage устаревают от версии к версии. здесь можно \n * их очистить.\n */\n var clearOldCache = function (oldVersion, newVersion) {\n log.info('MIGRATION', 'Removing some items from localStorage');\n\n WA.cache.removeItem('themes/light.css');\n WA.cache.removeItem('themes/dark.css');\n\n };\n\n global.handlers.push(clearOldCache);\n\n})(Core.migration);","(function (global) {\n\n /**\n * Некоторые значение в localStorage устаревают от версии к версии. здесь можно \n * их очистить.\n */\n var clearOldTemplates = function (oldVersion, newVersion) {\n log.info('MIGRATION', 'Removing old templates from localStorage');\n\n for (var k in localStorage) {\n // Шаблоны пока ни как не отличаются от других элементов хранилища, отличить их можно только так.\n if (k.indexOf('.html') !== -1) {\n WA.cache.removeItem(k);\n }\n }\n\n };\n\n global.handlers.push(clearOldTemplates);\n\n})(Core.migration);","\"use strict\";\n\n(function (global) {\n var reportPage = {};\n\n /**\n * Базовый диалог отчетов для вывода ошибок и информационных сообщений.\n */\n reportPage.ReportDialog = WA.CMP.dialogs.MessageBox.extend({\n init: function () {\n this.ok = WA.CR.window.close;\n this.setWidth(500);\n this.modal = false;\n }\n });\n\n /**\n * Отображение модального окна с текстом ошибки.\n * При закрытии окна страница перезагружается.\n * @param {string} Текст ошибки. \n */\n reportPage.showError = function (text) {\n (new reportPage.ReportDialog).show(text, null, L('ERR'), 'error');\n };\n\n /**\n * Отображение диалога завершения генерации отчета.\n */\n reportPage.showFinishDialog = function () {\n (new reportPage.ReportDialog).show(L('COMPLETING_WORKING_WITH_REPORT_MESSAGE'),\n null,\n L('COMPLETING_WORKING_WITH_REPORT'),\n \"info\");\n };\n\n /**\n * Отображение в шапке спиннера.\n */\n reportPage.showSpinner = function () {\n reportPage.jCaptionContainer.hide();\n reportPage.jSpinner.show();\n };\n\n /**\n * Скрытие спиннера.\n */\n reportPage.hideSpinner = function () {\n reportPage.jCaptionContainer.show();\n reportPage.jSpinner.hide();\n };\n\n global.reportPage = reportPage;\n}(window.Core));\n\n/**\n * Инициализация отчета.\n */\nWebAccess.ready(function () {\n if (WA.getLocation() === 'report') {\n Core.reportPage.jCaption = $(\"#ReportName\");\n Core.reportPage.jCaptionContainer = $(\"#captionContainer\");\n Core.reportPage.jSpinner = $(\"#spinner\");\n Core.reportPage.jSpinnerText = $(\"#spinnerText\");\n\n var url = new WebAccess.URL;\n var reportName = url.getParam('compcode') || url.getParam('name');\n\n // Это плохой способ декодировать имя из урла, но другого не нашлось, если найдется клиентский - заменить в url.getParam.\n WA.services.call(\"report.asmx/DecodeReportName\", { ReportName: reportName }).done(function(reportName) {\n var report = WA.factories.reports(reportName);\n\n WA.services.call(\"report.asmx/getreportcaption\", {\n ReportName: reportName,\n SerializedForm: null\n }).done(function (reportCaption) {\n Core.reportPage.jCaption.html(format(L('REPORT'), reportCaption));\n Core.reportPage.jSpinnerText.html(format(L('GENERATING_REPORT'), reportCaption));\n\n // Перед непосредственным выполнением отчета нужно начинать крутить спиннер.\n report.bind(report['class'].EVENT.BEFORE_EXECUTING, function () {\n Core.reportPage.showSpinner();\n });\n\n // Перед непосредственным выполнением отчета нужно начинать крутить спиннер.\n report.bind(report['class'].EVENT.ABORT_FILLING_PARAMS, function () {\n WA.CR.window.close();\n });\n\n // Начать выполнение отчета.\n report.queryParamsAndExecute().always(function () {\n Core.reportPage.hideSpinner();\n }).done(function (report) {\n report.open();\n Core.reportPage.showFinishDialog();\n }).fail(function (ex) {\n Core.reportPage.showError(ex);\n });\n }).fail(function (ex) {\n Core.reportPage.showError(ex);\n });;\n });\n };\n});","\"use strict\";\n\n(function (global) {\n /**\n * Функции отвечающие за работу с реквизитами.\n * @namespace Core.requisites\n * @since 5.5.0.1000\n */\n global.requisites = {};\n})(window.Core);\n","(function ($, global) {\r\n\r\n /**\r\n * Вспомогательные функции реквизита выбора объекта.\r\n * @since 5.5.0.1000\r\n */\r\n var BaseSelectRequisite = Class.extend({\r\n className: 'BaseSelectRequisite',\r\n\r\n _jInput: null,\r\n\r\n // ИД поля компоненты.\r\n controlId: '',\r\n // Страница для проверки в парсинге ссылок. doc.asp или reference.asp\r\n linkPageName: '',\r\n // Множественный выбор или нет.\r\n isMultiSelect: false,\r\n\r\n // Конструктор.\r\n init: function (options) {\r\n var me = this;\r\n $.extend(me, options);\r\n\r\n if ($(\"input#\" + me.controlId).length) {\r\n me._initControl();\r\n } else\r\n $(function () {\r\n setTimeout(me._initControl.bind(me), 0);\r\n });\r\n },\r\n\r\n _initControl: function () {\r\n var me = this;\r\n\r\n me._jInput = $(\"input#\" + me.controlId);\r\n me._jHidden = $('#hSelID_' + me.controlId);\r\n\r\n me._bindOnPaste();\r\n },\r\n\r\n // Инициализирует компоненту.\r\n _bindOnPaste: function () {\r\n var me = this;\r\n me._jInput.on('paste', me._onPaste.bind(me));\r\n },\r\n\r\n // Обработка вставки ссылки.\r\n _onPaste: function (event) {\r\n var me = this;\r\n\r\n var clipboardData = event.originalEvent.clipboardData || window.clipboardData;\r\n var pastedData = clipboardData.getData('text');\r\n\r\n if (pastedData) {\r\n var links = me._parsePastedDataAndGetLinks(pastedData);\r\n if (links && links.length > 0) {\r\n me._loadExtendedDataForLinks(links).done(function (extendedLinks) {\r\n me._setValueByLinks(extendedLinks);\r\n }).fail(function (err) {\r\n // Если нет прав или какая-то ошибка, просто вставим в поле текст из буфера (так в билдере).\r\n me._jInput.val(pastedData);\r\n });\r\n } else {\r\n // Если нет ссылок, просто вставим в поле текст из буфера.\r\n me._jInput.val(pastedData);\r\n }\r\n }\r\n\r\n event.preventDefault();\r event.stopPropagation();\r },\r\n\r\n // Загружает дополнительнные данные для ссылок. Например, наименование или ведущие реквизиты.\r\n _loadExtendedDataForLinks: function (links) {\r\n //Надо переопределять в потомках.\r\n var d = $.Deferred();\r\n d.resolve(links.map(function (link) {\r\n link.name = link.id;\r\n return link;\r\n }))\r\n return d.promise();\r\n },\r\n\r\n // Устанавливает значение в реквизиты выбора на основе распарсенных ссылок.\r\n _setValueByLinks: function (extendedLinks) {\r\n var me = this;\r\n if (me.isMultiSelect) {\r\n var values = extendedLinks.map(function (extendedLink) {\r\n return me._convertLinkToReferenceSelectValue(extendedLink);\r\n });\r\n me._jInput.SetValues(values, true);\r\n } else {\r\n me._jInput.SetValue(me._convertLinkToReferenceSelectValue(extendedLinks[0]), true);\r\n }\r\n },\r\n\r\n // Конвертирует ссылку в значение, которое принимает реквизиты выбора.\r\n _convertLinkToReferenceSelectValue: function (extendedLink) {\r\n //TODO Надо значения ведущих реквизитов.\r\n return [extendedLink.id, extendedLink.name.escapeHtml(), extendedLink.name, '{}'];\r\n },\r\n\r\n // Парсит текст, вставленный из буфера, и возвращает первую ссылку на объект.\r\n _parsePastedDataAndGetLinks: function (pastedData, isMultiSelect) {\r\n var me = this;\r\n var pastedLines = pastedData.split('\\n');\r\n var links = [];\r\n for (var i = 0; i < pastedLines.length; i++) {\r\n var line = pastedLines[i];\r\n var link = me._parsePastedLine(line);\r\n if (link) {\r\n links.push(link);\r\n if (!isMultiSelect) {\r\n break;\r\n }\r\n }\r\n }\r\n return links;\r\n },\r\n\r\n // Парсит одну строку, вставленную из буфера.\r\n _parsePastedLine: function (line) {\r\n var me = this;\r\n var lineLowered = line.toLowerCase();\r\n\r\n me._webServerNameLowered = me._webServerNameLowered || g_WebServerName.toLowerCase();\r\n me._sysCodeLowered = me._sysCodeLowered || g_SysCode.toLowerCase();\r\n\r\n //NOTE Шамов А.: Не сделал регуляркой, потому что нужно экранировать спец.символы в _webServerNameLowered и _sysCodeLowered и она получается сложнее.\r\n\r\n if (lineLowered.indexOf(me._webServerNameLowered) !== -1 &&\r\n lineLowered.indexOf(me._sysCodeLowered) !== -1 &&\r\n lineLowered.indexOf('/' + me.linkPageName) !== -1) {\r\n return me._parseSuitableUrl(line);\r\n }\r\n return null;\r\n },\r\n\r\n // Парсинг подходящей строки в ссылку.\r\n _parseSuitableUrl: function (url) {\r\n //Надо переопределять в потомках.\r\n return null;\r\n },\r\n\r\n });\r\n\r\n global.BaseSelectRequisite = BaseSelectRequisite;\r\n\r\n})(jQuery, window.Core.requisites);\r\n","(function ($, global) {\r\n\r\n /**\r\n * Вспомогательные функции реквизита \"Документ\".\r\n * @since 5.5.0.1000\r\n */\r\n var DocumentSelectRequisite = global.BaseSelectRequisite.extend({\r\n className: 'DocumentSelectRequisite',\r\n\r\n // Инициализирует компоненту.\r\n _initControl: function () {\r\n var me = this;\r\n me._super();\r\n\r\n var jInput = me._jInput;\r\r jInput.parent().hover(\r function () { me._showAdditionalButtons(this, jInput, me.isAccessDenied); },\r function () { me._hideAdditionalButtons(this, jInput); }\r );\r\r jInput.on('contextmenu', function (e) {\r\n e.preventDefault();\r e.stopPropagation();\r return false;\r\n });\r\r var referenceSelectPluginSettings = me.referenceSelectPluginSettings || jInput.data('settings');\r referenceSelectPluginSettings = $.extend(referenceSelectPluginSettings, {\r\n hidd: me._jHidden,\r dataProvider: window.Core.requisites.DocumentSelectDataProvider\r\n });\r jInput.ReferenceSelect(referenceSelectPluginSettings, jInput.parent().parent().find('div.Req_Icon'));\r\r jInput.result(function (event, data) {\r\n me._attachResult(\r jInput,\r data,\r me.afterSelectCallback,\r me.isNeedCallAfterSelectCallbackOnClear\r );\r\n });\r\n },\r\n\r\n // Загружает дополнительнные данные для ссылок. Например, наименование или ведущие реквизиты.\r\n _loadExtendedDataForLinks: function (links) {\r\n var d = $.Deferred();\r\n\r\n var link = links[0]; // множественный выбор пока что не поддерживаем не мы, не билдер.\r\n\r\n //setTimeout нужен для IE11, т.к. этот метод вызывается в событии onPaste и IE блокирует запросы в нем. Решение от сюда https://stackoverflow.com/questions/26910691/jquery-ajax-request-ie11-access-is-denied\r\n setTimeout((function (_link) {\r\n return function () {\r\n WA.SRV.document.getNameById([_link.id]).done(function (documentName) {\r\n _link.name = documentName;\r\n d.resolve([_link]);\r\n }).fail(function (err) {\r\n d.reject(err);\r\n });\r\n };\r\n })(link), 1);\r\n\r\n return d.promise();\r\n },\r\n\r\n // Парсинг подходящей строки в ссылку.\r\n _parseSuitableUrl: function (url) {\r\n var idIndex = url.toLowerCase().indexOf('&id=');\r\n if (idIndex !== -1) {\r\n var idStr = url.substr(idIndex + 4); //+4 это пропуск \"&id=\", parseInt отбрасывает всё ненужно после первых цифр, поэтому нам не важно где кончается id. Например, parseInt('123¶m=value') -> 123\r\n var id = parseInt(idStr, 10);\r\n return new WA.Link(id, OBJECT_TYPE.EDOCUMENT);\r\n }\r\n return null;\r\n },\r\n\r\n // Обработка выбора документа в выпадающем списке.\r\n _attachResult: function (inp, data, afterSelectFunc, isNeedCallFuncOnClear) {\r\n if (data) {\r\n if ($.isFunction(afterSelectFunc)) afterSelectFunc(data[0]);\r\n } else {\r\n //вызываем функцию если поле очищено\r\n if (isNeedCallFuncOnClear) afterSelectFunc(null);\r\n inp.SetValue(null);\r\n }\r\n inp.change();\r\n },\r\n\r\n // Показать дополнительные кнопки.\r\n _showAdditionalButtons: function (container, inp, isAccessDenied) {\r\n var jIcons = $(container).find('.Req_AdditionalIcons');\r\n jIcons.show();\r\n\r\n var jOpenIco = jIcons.find('.OpenCardIco');\r\n var jOpenBodyIco = jIcons.find('.OpenBodyIco');\r\n\r\n var selVal = $('#hSelID_' + inp.attr('id')).val();\r\n if (selVal != null && selVal !== '*' && !isAccessDenied && (inp.data('selected') == \"true\" || inp.data('selected') == \"selected\" || inp.data('selected') === true) && /^\\d+$/.test(selVal)) {\r\n jOpenIco.show();\r\n jOpenBodyIco.show();\r\n } else {\r\n jOpenIco.hide();\r\n jOpenBodyIco.hide();\r\n }\r\n },\r\n\r\n // Скрыть дополнительные кнопки.\r\n _hideAdditionalButtons: function (container, inp) {\r\n $(container).find('.Req_AdditionalIcons').hide().find('p').hide();\r\n }\r\n\r\n }, {\r\n // Тут статические методы.\r\n\r\n // Открыть карточку выбранного документа.\r\n openSelected: function (jOpenIco, inputId) {\r\n var selVal = $('#hSelID_' + inputId).val();\r\n var link = new WA.Link(+selVal, OBJECT_TYPE.EDOCUMENT);\r\n link.open();\r\n },\r\n\r\n // Открыть тело выбранного документа.\r\n openSelectedBody: function (jOpenIco, inputId) {\r\n var docId = +$('#hSelID_' + inputId).val();\r\n\r\n if (g_defaultListAction === 'open') {\r\n OpenWithAgent({ id: docId }, true);\r\n return;\r\n } else if (g_defaultListAction === 'viewineditor') {\r\n OpenWithAgent({ id: docId }, false);\r\n return;\r\n }\r\n\r\n // Если ничего не получилось, то открываем предпросмотр.\r\n ExportEDoc(docId, true, 0, true);\r\n\r\n }\r\n });\r\n\r\n global.DocumentSelectRequisite = DocumentSelectRequisite;\r\n\r\n})(jQuery, window.Core.requisites);\r\n","(function ($, global) {\n\n /**\n * Провайдер данных для выбора из справочника.\n * @since 5.5.0.1000\n */\n var DocumentSelectDataProvider = {\n /**\n * Отправляет запрос на сервер и обрабатывает результаты.\n * @param {string} url Адрес веб-сервиса или веб-хэндлера.\n * @param {Object} params Список параметров веб-сервиса или веб-хэндлера.\n * @param {successCallback} OnSuccess Функция, вызываемая при удачном выполнении запроса от сервера. \n * @param {errorCallback} OnError Функция, вызываемая при НЕ удачном выполнении запроса от сервера. \n * @returns {jqXHR} Объект запроса возвращаемой функцией jQuery.ajax.\n */\n sendQuery: function (url, params, OnSuccess, OnError) {\r\n var me = this;\n\n return WA.SRV.call('/api/LinkQuery.asmx/GetDocumentsFromQueryContext', {\r\n queryContext: $.parseJSON(params.queryContext),\n queryString: params.q,\n pageSize: params.limit,\n pageNumber: params.page,\n sortRequisite: 'ISBEDocTextModifyDate',\n sortDirection: -1\r\n }, '', '', true, true).done(function (data) {\r\n var entities = $.parseJSON(data).map(function (docLink) {\r\n var iconName = g_ImgsByDocExt[docLink.ext.toLowerCase()];\n if (!iconName) iconName = 'documentUnknown';\n var editorIcon = ' ';\n var signIcon = '';\n switch (docLink.sign) {\r\n case 'APPR':\n signIcon = '';\n case 'AUTH':\n signIcon = '';\r\n }\n var icon = '' + editorIcon + signIcon + '';\n return {\r\n id: docLink.id,\n encodedTitle: icon + docLink.name.escapeHtml(),\n title: docLink.name,\n leadingRequisitesValue: \"{}\"\r\n };\r\n });\n\n if (OnSuccess) OnSuccess(1000000, entities);\r\n\n }).fail(function (errorMessage) {\r\n if (OnError) OnError(errorMessage, false);\r\n });\r\n }\n };\n\n global.DocumentSelectDataProvider = DocumentSelectDataProvider;\n\n})(jQuery, window.Core.requisites);\n","(function ($, global) {\n\n /**\n * Вспомогательные функции реквизита \"Выбор из справочника\".\n * @since 5.5.0.1000\n */\n var ReferenceRecordSelectRequisite = global.BaseSelectRequisite.extend({\n className: 'ReferenceRecordSelectRequisite',\n\n // Загружает дополнительнные данные для ссылок. Например, наименование или ведущие реквизиты.\n _loadExtendedDataForLinks: function (links) {\n //Надо переопределять в потомках.\n var d = $.Deferred();\n d.resolve(links.map(function (link) {\n link.name = '' + link.id;\n return link;\n }))\n return d.promise();\n },\n\n // Парсинг подходящей строки в ссылку.\n _parseSuitableUrl: function (url) {\n // Пример ссылки http://irwebaccess:83/reference.asp?sys=DIR55WebAccess&compcode=%ce%d0%c3&id=134049\n\n var idIndex = url.toLowerCase().indexOf('&id=');\n if (idIndex !== -1) {\n var idStr = url.substr(idIndex + 4); //+4 это пропуск \"&id=\", parseInt отбрасывает всё ненужно после первых цифр, поэтому нам не важно где кончается id. Например, parseInt('123¶m=value') -> 123\n var id = parseInt(idStr, 10);\n //TODO\n var compcode = '';\n return new WA.Link(id, OBJECT_TYPE.REFERENCE_RECORD, compcode);\n }\n return null;\n }\n });\n\n global.ReferenceRecordSelectRequisite = ReferenceRecordSelectRequisite;\n\n})(jQuery, window.Core.requisites);\n","/// \r\n/// \r\n\r\nfunction CreateSubTaskFromListActions(obj, el) {\r\n obj['tr'] = $(el).parents('#' + obj.id);\r\n CreateSubTaskFromContextMenu(obj);\r\n}\r\n\r\nfunction CreateSubTaskFromContextMenu(parent) {\r\n var newCard;\r\n var OnError = function (error) {\r\n newCard.close();\r\n ShowError(error, null, 400);\r\n };\r\n\r\n function DoIt(decryptedKey) {\r\n var newTaskID;\r\n var serviceName;\r\n var serviceParams;\r\n //Создаём подзадачу\r\n\r\n if (parent.kind == \"task\") {\r\n serviceName = 'Task.asmx';\r\n serviceParams = { TaskID: parent.id, EncryptionKey: decryptedKey };\r\n } else {\r\n serviceName = 'Job.asmx';\r\n serviceParams = { JobID: parent.id, EncryptionKey: decryptedKey };\r\n }\r\n\r\n CallService(serviceName + '/CreateSubTask', serviceParams,\r\n function (res) {\r\n if (!res.Success) OnError(res.Error);\r\n else {\r\n newTaskID = res.Result;\r\n if (!!newTaskID) {\r\n parent.id = newTaskID;\r\n parent.kind = \"task\";\r\n var params = \"mode=edit\";\r\n newCard.location = GetObjectCardUrl(parent, params);\r\n newCard.focus();\r\n }\r\n }\r\n },\r\n OnError);\r\n\r\n\r\n //if (!!newTaskID) {\r\n // parent.id = newTaskID;\r\n // parent.kind = \"task\";\r\n // var params = \"mode=edit\";\r\n // ShowObjectCard(parent, params);\r\n //}\r\n }\r\n\r\n var encoding = parent.tr.attr('encoding');\r\n var pleaseWait = new WA.URL('/PleaseWait.aspx');\r\n pleaseWait.setParam('message', L('PLEASE_WAIT_TASK'));\r\n\r\n if (encoding > 0) {\r\n // Не поддерживаем работу с зашифрованными объектами.\r\n (new WA.CMP.dialogs.MessageBox()).showWarning(L('ERR_ENCODED_OBJECT_ARE_NOT_SUPPORTED'));\r\n //if ($('body').hasClass('tablet') || $('body').hasClass('smartphone')) {\r\n // (new WA.CMP.dialogs.MessageBox()).showError(L('ERR_ENCODED_OBJECT_ARE_NOT_SUPPORTED'));\r\n // return;\r\n //}\r\n\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n var pluginName = parent.tr.attr('encpluginname');\r\n switch (encoding) {\r\n case '1':\r\n newCard = pleaseWait.open(parent.kind + parent.id);\r\n if (parent.kind == 'task') {\r\n WebAccess.agent.edms.getTaskDecryptedKey(parent.id, encoding, pluginName, \"\", DoIt, OnError);\r\n } else {\r\n WebAccess.agent.edms.getJobDecryptedKey(parent.id, encoding, pluginName, \"\", DoIt, OnError);\r\n }\r\n break;\r\n case '2':\r\n case '3':\r\n RequestPasswordForDecryption('',\r\n function (password) {\r\n newCard = pleaseWait.open(parent.kind + parent.id);\r\n if (parent.kind == 'task') {\r\n WebAccess.agent.edms.getTaskDecryptedKey(parent.id, encoding, pluginName, password, DoIt, OnError);\r\n } else {\r\n WebAccess.agent.edms.getJobDecryptedKey(parent.id, encoding, pluginName, password, DoIt, OnError);\r\n }\r\n });\r\n break;\r\n }\r\n });\r\n } else {\r\n newCard = pleaseWait.open('sub' + parent.kind + parent.id);\r\n\r\n //IOS замораживает вкладки, которые висят в фоне, поэтому к сожалению фабрики и асинхронные запросы в нем отдыхают\r\n if (WA.ENV.os.name.toLowerCase() === 'ios') {\r\n var folderId = WA.CR.getID() || OutboxFolderID;\r\n var page = (parent.kind == 'task' ? 'Task' : 'Job');\r\n var pageUrl = (new WA.URL('/' + page + '.aspx'));\r\n if (parent.kind == 'task') {\r\n pageUrl.setParam('mode', 'newsubtask');\r\n } else {\r\n pageUrl.setParam('op', 'newsubtask');\r\n }\r\n pageUrl.setParam('id', parent.id).setParam('folder', folderId).openIn(newCard);\r\n return;\r\n }\r\n\r\n DoIt(null);\r\n }\r\n}\r\n\r\n\r\n// Показывает запрашиваемые параметры для ззу.\r\n// id - id задачи или задания.\r\n// type - \"job\" или \"task\".\r\nfunction ShowAskableParams(id, type, block) {\r\n id = id || GetParamInURL('id');\r\n type = type || (/job\\.aspx/i.test(location.pathname) ? 'job' : 'task');\r\n block = block || null;\r\n ShowModalWindow(\"askable_params\", {\r\n title: L(\"CUSTOMWORK_ASKABLE_PARAMS\"),\r\n ok: function () {\r\n $('#modal_window').data('success', function () {\r\n $('#modal_window').dialog('close');\r\n if (type == 'job')\r\n DoAction(\"op=doit\");\r\n else\r\n DoAction(\"-op\");\r\n });\r\n $('#modal_window form').submit();\r\n return false;\r\n },\r\n cancel: function () {\r\n if (type == 'task') {\r\n CallService(\"/Task.asmx/SetStandardRoute\", { TaskID: id, StandardRouteID: 0 }, function () {\r\n $('#modal_window').dialog('close');\r\n DoAction(\"-op\")\r\n });\r\n } else {\r\n UnbindBeforeUnload();\r\n DoAction(\"-op&-val\");\r\n }\r\n },\r\n params: { WorkID: id, WorkType: type, WorkflowBlock: block },\r\n height: \"auto\",\r\n width: 700,\r\n afterOpen: function () {\r\n setTimeout(function () {\r\n //иначе форма не растягивается при ListRequisite\r\n $('#modal_window').css('height', 'auto');\r\n //вызов события после показа окна с запрашиваемыми параметрами\r\n WebAccess.Job.fire(\"AfterShow\");\r\n\r\n var currentDialog = $(\".ui-dialog\");\r\n // при перетаскивании диалога слетает высота и кнопки ОК/Отмена также могут уходить за границы видимой области\r\n currentDialog.on(\"dragstop\", function (event, ui) {\r\n currentDialog.css('height', 'auto');\r\n });\r\n }, 50);\r\n }\r\n });\r\n $('#modal_window').css('overflow', 'auto');\r\n}\r\n\r\nfunction ClearOpAfterError() {\r\n var id = GetParamInURL('id');\r\n CallService(\"/Task.asmx/SetStandardRoute\", { TaskID: id, StandardRouteID: 0 }, function () {\r\n $('#modal_window').dialog('close');\r\n DoAction(\"-op\")\r\n });\r\n}\r\n\r\nfunction ShowErrorOnAskableParams(text) {\r\n ShowMessage(text, L(\"CUSTOMWORK_ASKABLE_PARAMS\"), ClearOpAfterError, null, null, null, true);\r\n}\r\n\r\n// Показывает окно выбора типового маршрута.\r\nfunction ChangeStandartRoute() {\r\n var id = GetParamInURL('id');\r\n ShowModalWindow(\"standard_route\", {\r\n title: L(\"STANDARD_ROUTE\"),\r\n ok: function () {\r\n var wnd = $('#modal_window');\r\n var routeID = wnd.find('#hSelID_route').val();\r\n\r\n SetStandardRoute(id, routeID, function () {\r\n DoAction(\"op=ChangeRoute\");\r\n wnd.dialog('close');\r\n return false;\r\n }, function (errMessage) {\r\n wnd.data('error')(errMessage);\r\n });\r\n return false;\r\n },\r\n params: { TaskID: id }\r\n });\r\n}\r\n\r\nfunction SetStandardRoute(TaskID, StandardRouteID, OnSuccess, OnError) {\r\n GetStandardRouteCodeByAnalit(StandardRouteID, function (data) {\r\n var standardRouteCode;\r\n var setStandardRouteCallback = function () {\r\n CallService(\"/Task.asmx/SetStandardRoute\", { TaskID: TaskID, StandardRouteID: StandardRouteID }, function (res) {\r\n if (res.Success) {\r\n if (OnSuccess) {\r\n var r = OnSuccess();\r\n if (r === false) {\r\n return;\r\n }\r\n }\r\n if (res.Result) {\r\n ShowAskableParams(TaskID, 'task');\r\n } else {\r\n DoAction(\"op=ChangeRoute\");\r\n }\r\n if (OnSuccess) OnSuccess();\r\n } else {\r\n if (OnError) {\r\n OnError(res.Error);\r\n };\r\n }\r\n });\r\n }\r\n\r\n // если запрос выполнился успешно и вернул только одну запись (если больше, то что-то явно не то - по одному ИД может быть только одна запись).\r\n // третье условие - что венрнулся только Код записи.\r\n if (data.Success && data.Result.length == 1 && data.Result[0].Requisites.length == 1) {\r\n standardRouteCode = $.trim(data.Result[0].Requisites[0].Value);\r\n }\r\n\r\n // Если для ТМа с кодом standardRouteCode есть означенные события, то выполним событие \"До запроса параметров\".\r\n if (typeof WebAccess.Events[standardRouteCode] != 'undefined') {\r\n WebAccess.Task.fireAll(\"Select\", setStandardRouteCallback, standardRouteCode);\r\n } else {\r\n setStandardRouteCallback();\r\n }\r\n }, function () {\r\n ClearOpAfterError();\r\n });\r\n}\r\n\r\nfunction ShowWarningForTaskRouteException(msg) {\r\n var _showWarningFunc = function (callback) {\r\n ShowMessage(msg, L('WARNING'), null, L('OK'), 600, callback, false);\r\n };\r\n var _isModalShown = IsModalShown();\r\n\r\n HideTopSpinner('', 0, null, _isModalShown);\r\n setTimeout(function () {\r\n if (_isModalShown) {\r\n // Отключаем горячие главищи вообще, что бы Enter на кнопке ОК в окне ошибки сработал нормально. Для этого же и setTimeout\r\n key.setScope('');\r\n _showWarningFunc(function () {\r\n key.setScope('modalwindow');\r\n });\r\n } else {\r\n _showWarningFunc();\r\n }\r\n }, 100);\r\n}\r\n\r\n// Получает выбранные элементы (либо в диалоге, если он показан, либо в выборе из справочника).\r\nfunction GetRouteSelectedItemsCount() {\r\n var inps = [$(\"#CardContrrolRoute\"), $('#CardContrrolObservers')];\r\n var count = 0;\r\n for (var i = 0; i < inps.length; i++) {\r\n var inp = inps[i];\r\n var ms = inp.data('MultiSelectModalWindowInstance');\r\n if (ms && ms.isModalShown()) {\r\n count += ms.dataObject.selectedItems.length;\r\n } else if (inp.length > 0) {\r\n count += inp.data('ReferenceSelectInstance').getValues().length;\r\n }\r\n }\r\n return count;\r\n}\r\n\r\n// Событие после смены маршрута с множественным выбором.\r\nfunction TaskRouteChanged(inp, data, UsersRefName, UserGroupsRefName, StandardRoutesRefName, RouteLastObjectsRefName, isInModal) {\r\n var selItem;\r\n var isNeedToAddLastObject = true;\r\n if (!data || data.length == 0)\r\n return;\r\n\r\n if (!$.isPlainObject(data[0])) {\r\n // Данные выбраны через стандартное выпадающее меню.\r\n var id = data[0];\r\n var idParts = id.split(':');\r\n var refCode = '';\r\n if (idParts.length == 2) {\r\n refCode = idParts[0];\r\n id = idParts[1];\r\n } else {\r\n refCode = UsersRefName;\r\n };\r\n selItem = { groupcode: refCode, id: id, name: data[2] };\r\n } else {\r\n // Данные выбраны через модальное окно.\r\n selItem = data[0];\r\n // После нажатии на кнопку ОК уже не добавляем в последние объекты, т.к. уже были добавлены при переносе в правую часть.\r\n isNeedToAddLastObject = !!isInModal;\r\n };\r\n\r\n // Сохраним элемент для замены, т.к. возможно мы его изменим ниже.\r\n var itemToReplace = { groupcode: selItem.groupcode, id: selItem.id, name: selItem.name };\r\n\r\n // Если это псевдосправочник \"Последние объекты в маршруте\", то получим настоящий справочник и ИД выбираемой записи.\r\n if (selItem.groupcode === RouteLastObjectsRefName) {\r\n var idParts = selItem.id.split(\"_\");\r\n if (idParts.length == 2) {\r\n selItem.groupcode = idParts[0];\r\n selItem.id = idParts[1];\r\n };\r\n };\r\n\r\n // Функция TaskRouteChanged срабатывает при нажатии на кнопку \"ОК\" в модальном диалоге, в этом случае, добавлять последние объекты не нужно,\r\n // т.к. они уже были добавлены при переносе в правую часть.\r\n // Добавляем к последним объектам, только корректные объекты.\r\n if (isNeedToAddLastObject && selItem.id > 0) {\r\n WA.SRV.session.addLastUsedObject(selItem.groupcode, selItem.id, selItem.name);\r\n }\r\n\r\n switch (selItem.groupcode) {\r\n case UsersRefName:\r\n //Текущее кол-во элементов поля\r\n if (typeof MAX_ROUTE_PARTICIPANT_COUNT !== 'undefined' && MAX_ROUTE_PARTICIPANT_COUNT !== null) {\r\n var CurrentUsersCount = GetRouteSelectedItemsCount();\r\n if (CurrentUsersCount > MAX_ROUTE_PARTICIPANT_COUNT) {\r\n inp.ReplaceLastSelectedItem(itemToReplace.groupcode + ':' + itemToReplace.id, []);\r\n ShowWarningForTaskRouteException(L(\"TO_MANY_ITEMS\"));\r\n } else {\r\n if (!IsModalShown()) {\r\n WA.CMP.NTF.InlineHint.hideAll();\r\n }\r\n };\r\n }\r\n\r\n //Если выбрали из RouteLastObjectsRefName, то заменяем на обычного пользователя.\r\n if (itemToReplace.groupcode === RouteLastObjectsRefName) {\r\n inp.ReplaceSelectedItem(itemToReplace.groupcode + ':' + itemToReplace.id, [[UsersRefName + ':' + selItem.id, selItem.name, selItem.name]]);\r\n }\r\n\r\n break;\r\n case UserGroupsRefName:\r\n ExpandUsersGroup(inp, selItem, UserGroupsRefName, UsersRefName, itemToReplace);\r\n break;\r\n case StandardRoutesRefName:\r\n UnbindBeforeUnload();\r\n inp.SetDisabled();\r\n $('#CardContrrolObservers').SetDisabled();\r\n SetStandardRoute(GetParamInURL('id'), selItem.id, null, function (msg) {\r\n // покажем сообщение об ошибке\r\n ErrorShow(msg, true);\r\n // и почистим ReferenceSelect.\r\n inp.Clear();\r\n inp.SetEnabled();\r\n $('#CardContrrolObservers').SetEnabled();\r\n });\r\n break;\r\n };\r\n}\r\n\r\nfunction ExpandUsersGroup(inp, item, UserGroupsRefName, UsersRefName, itemToReplace) {\r\n if (item.groupcode == UserGroupsRefName) {\r\n ShowTopSpinner(L(\"GROUP_EXPANDS\"), false, true);\r\n\r\n var replaceGroup = function (NeedProcessSubGroups) {\r\n // Получим всех пользователей в группе.\r\n CallService(\"/UserList.asmx/GetUsersInGroup\", { GroupID: item.id, NeedProcessSubGroups: NeedProcessSubGroups, RenderItems: false }, function (res) {\r\n if (res.Success) {\r\n var newValues = [];\r\n //Текущее кол-во элементов поля\r\n var CurrentUsersCount = GetRouteSelectedItemsCount() - 1; // -1 без вставленной группы\r\n\r\n if (MAX_ROUTE_PARTICIPANT_COUNT == null || (CurrentUsersCount + res.Result.length) <= MAX_ROUTE_PARTICIPANT_COUNT) {\r\n if (!IsModalShown()) {\r\n WA.CMP.NTF.InlineHint.hideAll();\r\n }\r\n\r\n $.each(res.Result, function () {\r\n newValues.push([UsersRefName + ':' + this.id, ('' + this.text).escapeHtml(), this.text]);\r\n });\r\n\r\n //Переинициализируем компоненту.\r\n inp.ReplaceSelectedItem(itemToReplace.groupcode + ':' + itemToReplace.id, newValues);\r\n\r\n if (newValues.length > 0) {\r\n HideTopSpinner(L(\"GROUP_EXPANDED\"), 3000, null, true);\r\n } else {\r\n HideTopSpinner(L(\"EMPTY_GROUP_WASNT_EXPANDED\"), 3000, null, true);\r\n }\r\n } else {\r\n inp.ReplaceSelectedItem(itemToReplace.groupcode + ':' + itemToReplace.id, []);\r\n ShowWarningForTaskRouteException(L(\"TO_MANY_ITEMS\"));\r\n }\r\n } else {\r\n inp.ReplaceSelectedItem(itemToReplace.groupcode + ':' + itemToReplace.id, []);\r\n ShowWarningForTaskRouteException(res.Error);\r\n };\r\n });\r\n };\r\n\r\n CallService(\"/UserList.asmx/HasGroupUsersAndSubGroups\", { GroupID: item.id }, function (res) {\r\n if (res.Success) {\r\n // Если ли в группе и пользователи, и группы одновременно?\r\n if (res.Result) {\r\n var isButtonClicked = false;\r\n // Выдаем предложение что будем добавлять - пользователй группы или пользователей всех её подгрупп.\r\n var yesBtn = function () {\r\n isButtonClicked = true;\r\n replaceGroup(true);\r\n };\r\n var sett = {\r\n text: format(L('DO_YOU_ALSO_WANT_TO_ADD_USERS_FROM_SUBGROUPS_OF_GROUP'), { 'groupName': item.name }),\r\n close: function () {\r\n if (!isButtonClicked) {\r\n replaceGroup(false);\r\n }\r\n HideTopSpinner('', 3000, null, true);\r\n key.setScope('modalwindow');\r\n }\r\n };\r\n setTimeout(function () {\r\n // Отключаем горячие главищи вообще, что бы Enter на кнопке ОК в окне ошибки сработал нормально. Для этого же и setTimeout\r\n key.setScope('');\r\n ConfirmDialogNew(sett, yesBtn, function () { });\r\n }, 100);\r\n } else {\r\n // Добавляем всех пользователей всех подгрупп.\r\n replaceGroup(true);\r\n };\r\n };\r\n });\r\n }\r\n}\r\n\r\nfunction InitTaskRouteModalWindowsOpts(inp, UsersRefName, UserGroupsRefName, StandardRoutesRefName, customPlaceHolder, RouteLastObjectsRefName) {\r\n return {\r\n excludeGroups: [StandardRoutesRefName, RouteLastObjectsRefName],\r\n treeMode: true,\r\n customPlaceholder: customPlaceHolder,\r\n events: {\r\n 'OnAfterOpen': function () {\r\n var inpId = inp.attr('id');\r\n if (inpId == 'CardContrrolRoute') {\r\n BindHelpIcoClickOnModalWindow('RouteSetup');\r\n } else {\r\n BindHelpIcoClickOnModalWindow('ObserversSetup');\r\n };\r\n },\r\n 'OnSelectedItem': function (eventName, item) {\r\n TaskRouteChanged(inp, [item], UsersRefName, UserGroupsRefName, StandardRoutesRefName, RouteLastObjectsRefName, true);\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction ShowRouteModalWindowAfterLoad() {\r\n $(function () {\r\n setTimeout(function () {\r\n $(\"#CardContrrolRoute\").ShowMultiSelectModalWindow();\r\n }, 100);\r\n });\r\n};\r\n\r\n// Навешиват кнопку удаления последних объектов.\r\nfunction BindRemoveLastObjectBtn(RouteLastObjectsRefName, jControl) {\r\n var touchDev = $.ipad || WA.ENV.isAndroid();\r\n\r\n jControl.on('OnRowsCreated', function (ev, refCode, rows) {\r\n if (refCode.toLowerCase() === RouteLastObjectsRefName.toLowerCase()) {\r\n $.each(rows, function () {\r\n var row = $(this);\r\n if (!row.hasClass('removeLastObjBtnInit')) {\r\n var rowIco = row.find('.rs_ico');\r\n // Пропускаем Избранных, их нельзя удалять.\r\n if (!rowIco.hasClass('FavoriteUser_16.png') && !rowIco.hasClass('FavoriteUserGroup_16.png')) {\r\n var delBtn = $('

    ' +\r\n '' +\r\n '

    ');\r\n delBtn.on('click', function (ev) {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n\r\n //Получаем набор данных; берем ИД [0]; для этого справочника ИД сложный, поэтому берем настоящий ИД [1]. Сложнный ИД в формате \"КОДСПР_ИД\"\r\n var id = row.attr('DataRow').split('|')[0].split('_')[1];\r\n WA.SRV.session.removeLastUsedObject(id);\r\n // Удаляем сразу, что бы не ждать завершения запроса и пользователь сразу увидел результат своего действия.\r\n row.remove();\r\n\r\n return false;\r\n });\r\n row.find('.rs_td').prepend(delBtn);\r\n\r\n // Показываем кнопку удаления при наведении только для обычных PC.\r\n if (!touchDev) {\r\n row.on('mouseenter.removeLastObj', function () {\r\n $(this).find('.deleteLastObj').removeClass('vishidden');\r\n }).on('mouseleave.removeLastObj', function () {\r\n $(this).find('.deleteLastObj').addClass('vishidden');\r\n });\r\n };\r\n };\r\n\r\n row.addClass('removeLastObjBtnInit');\r\n };\r\n });\r\n }\r\n });\r\n}\r\n\r\n\r\n\r\n(function (global) {\r\n\r\n /** Чтобы получение сертификатов было всего один раз на странице */\r\n var lastResponse = null;\r\n\r\n // Получаем сертификат по умолчанию.\r\n var getUserDefaultCertificate = function () {\r\n if (!!lastResponse) return lastResponse;\r\n return lastResponse = WA.SRV.call('/Certificates.asmx/GetDefaultOrFirstValid', null, null, null, true, true);\r\n };\r\n\r\n // Отправляет запрос к агенту для подписания.\r\n var signingCustomWorkIds = [];\r\n var _sendSignDataToAgent = function (type, id, pluginName, pluginVersion, certId, afterSignCallback, tokenPinCode) {\r\n if (type === 'T') {\r\n WebAccess.agent.edms.signTask(id, certId, pluginName, null, null, null, null, afterSignCallback, pluginVersion, tokenPinCode);\r\n }\r\n if (type === 'J') {\r\n WebAccess.agent.edms.signJob(id, certId, pluginName, null, null, null, null, afterSignCallback, pluginVersion, tokenPinCode);\r\n }\r\n };\r\n\r\n var getErrorWithCustomWorkName = function (error, name, type, id) {\r\n if (name) {\r\n return format('
  • {0} \"{1}\": {2}
  • ',\r\n L((type === 'T' ? 'TASK' : 'JOB')),\r\n name,\r\n error,\r\n (new WA.Link(id, L((type === 'T' ? OBJECT_TYPE.TASK : OBJECT_TYPE.JOB)))).toURL().asString());\r\n } else {\r\n return '
  • ' + error + '
  • ';\r\n }\r\n };\r\n\r\n var SignCustomWork = function (type, id, name, opt_silent) {\r\n var result = $.Deferred();\r\n\r\n if (name) {\r\n name = ('' + name).escapeHtml();\r\n }\r\n\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n getUserDefaultCertificate().done(function (res, resp) {\r\n var certificate = res;\r\n var certArr = certificate.split('###');\r\n models.User._current.DefaultCertificate = {\r\n PluginName: certArr[0],\r\n CertificateID: certArr[1],\r\n PluginVersion: certArr[2],\r\n IsValid: !resp.Warning\r\n };\r\n\r\n var cert = models.User._current.DefaultCertificate;\r\n if (!cert.IsValid) {\r\n if (!opt_silent) ShowError((resp.Warning || '').fromISBuilderToNormal());\r\n result.reject(getErrorWithCustomWorkName((resp.Warning || '').fromISBuilderToNormal(), name, type, id));\r\n return;\r\n }\r\n\r\n // Подписание ЗЗУ.\r\n var onSignCallback = function(res) {\r\n if (res.success) {\r\n var successMessageCode = (type === 'T' ? 'TASK_SIGN_SUCCESS' : 'JOB_SIGN_SUCCESS');\r\n if (!opt_silent) ShowTopSpinnerResult(L(successMessageCode), 3000);\r\n result.resolve(L(successMessageCode));\r\n } else {\r\n if (!!res.message && (res.result === 'ERR_PIN_REQUIRED')) {\r\n\r\n var jTokenPinCode = $(\"#task_token_pin_code\");\r\n // Так мы определим, что у нас происходит массовое совместное подписание документов и ЗЗУ\r\n var jDocsTokenPinCode = $(\"#modal_window\").find(\".token_pin_code\");\r\n\r\n if (signingCustomWorkIds.indexOf(id) == -1)\r\n signingCustomWorkIds.push(id);\r\n\r\n if (jTokenPinCode.length == 0) {\r\n // Проверка массового совместном подписании документов и ЗЗУ\r\n if (jDocsTokenPinCode.length != 0)\r\n {\r\n if (jDocsTokenPinCode.val() != \"\") {\r\n for (var i = 0; i < signingCustomWorkIds.length; i++)\r\n _sendSignDataToAgent(type, signingCustomWorkIds[i], cert.PluginName, cert.PluginVersion, cert.CertificateID, onSignCallback, jDocsTokenPinCode.val());\r\n }\r\n\r\n return;\r\n }\r\n \r\n var formBuilder = new WA.CMP.forms.FormBuilder('taskjobpincode');\r\n var tokenPinCodeId = 'TASK_TOKEN_PIN_CODE';\r\n formBuilder.addInput(tokenPinCodeId, null, null, 'password');\r\n\r\n var dialog = new WA.CMP.dialogs.BaseDialog();\r\n dialog.title = L(\"PIN_CODE_ASK\");\r\n dialog.setHtml(formBuilder.render());\r\n\r\n dialog.isShowCancelButton = true;\r\n dialog.ok = function() {\r\n var pinCodeValue = formBuilder.getValue(tokenPinCodeId);\r\n dialog.close();\r\n for (var i = 0; i < signingCustomWorkIds.length; i++)\r\n _sendSignDataToAgent(type, signingCustomWorkIds[i], cert.PluginName, cert.PluginVersion, cert.CertificateID, onSignCallback, pinCodeValue);\r\n };\r\n dialog.show();\r\n }\r\n return;\r\n }\r\n\r\n if (!!res && !opt_silent) ShowError(res.message);\r\n result.reject(getErrorWithCustomWorkName(res.message.fromISBuilderToNormal(), name, type, id));\r\n }\r\n };\r\n _sendSignDataToAgent(type, id, cert.PluginName, cert.PluginVersion, cert.CertificateID, onSignCallback, null);\r\n\r\n }).fail(function (errMsg) {\r\n if (!opt_silent) ShowError(errMsg);\r\n result.reject(getErrorWithCustomWorkName(errMsg.fromISBuilderToNormal(), name, type, id));\r\n });\r\n }).fail(function () {\r\n var err = L(\"ERR_SIGNING_UNSUPPORTED\");\r\n if (!opt_silent) ShowError(err);\r\n result.reject(getErrorWithCustomWorkName(err.fromISBuilderToNormal(), name, type, id));\r\n });\r\n return result;\r\n };\r\n\r\n global.SignTask = function (id, name, opt_silent) {\r\n return SignCustomWork('T', id, name, opt_silent);\r\n };\r\n global.SignJob = function (id, name, opt_silent) {\r\n return SignCustomWork('J', id, name, opt_silent);\r\n };\r\n\r\n\r\n var GetEncryptedCustomWorkTree = function (type, id, encodingType, pluginName) {\r\n Core.agent.getPlugin('edmsplugin').done(function (plugin) {\r\n //Получает ключ для расшифровки текста делового процесса\r\n var GetDecryptedKey = function (additionalParams) {\r\n ShowTopSpinner(L(\"PLEASE_WAIT\"), true);\r\n\r\n //Запрашиваем токен на расшифровку текста делового процесса\r\n RequestToken(TOKEN_OPERATION.GET_ENCRYPTION_KEY, function (token) {\r\n var requestName = (type == 'T' ? \"GetTaskDecryptedKey\" : \"GetJobDecryptedKey\");\r\n\r\n //Заполняем параметры запроса\r\n var params = { \"EncodeType\": encodingType, \"EncryptionPluginName\": pluginName, \"Token\": token };\r\n if (!!additionalParams) $.extend(params, additionalParams);\r\n if (type == 'T') {\r\n params[\"TaskID\"] = id;\r\n } else {\r\n params[\"JobID\"] = id;\r\n }\r\n\r\n WebAccess.agent.transmitRequest(requestName, \"edmsplugin\", params).done(function (response) {\r\n //Получаем текст делового процесса\r\n if (type == 'T') {\r\n CallService(\"Task.asmx/GetWorkTreeHtml\", { TaskID: id, EncryptionKey: response.result }, function (response) {\r\n if (response.Success) {\r\n if ($('.ListRequisiteList[kind=att]').length > 0) {\r\n $('span.MainText').append(response.Result);\r\n } else {\r\n window.location.reload();\r\n }\r\n } else {\r\n $('span.MainText').append(response.Error);\r\n }\r\n });\r\n } else {\r\n CallService(\"Job.asmx/GetWorkTreeHtml\", { JobID: id, EncryptionKey: response.result }, function (response) {\r\n if (response.Success) {\r\n if ($('.ListRequisiteList[kind=att]').length > 0) {\r\n $('span.MainText').append(response.Result);\r\n } else {\r\n window.location.reload();\r\n }\r\n } else {\r\n $('span.MainText').append(response.Error);\r\n }\r\n });\r\n }\r\n }).fail(function (response) {\r\n try {\r\n //FIXME: нужен ли декодинг?\r\n //resultMessage = decodeURIComponent(response.message);\r\n resultMessage = response.message;\r\n } catch (e) {\r\n resultMessage = L('CUSTOMWORK_DECODING_FAIL');\r\n }\r\n ShowError(resultMessage, function () {\r\n if (encodingType % 2 === 1) {\r\n CloseWindow();\r\n } else {\r\n GetEncryptedCustomWorkTree(type, id, encodingType, pluginName);\r\n }\r\n },\r\n 400,\r\n function () {\r\n CloseWindow();\r\n });\r\n }).always(function (response) {\r\n HideTopSpinner(\"\", 1);\r\n });\r\n }, id);\r\n };\r\n\r\n //Если в шифровании используется пароль, то запросим его у пользователя.\r\n if (encodingType >= 2) {\r\n return RequestPasswordForDecryption(null,\r\n function (pass) { GetDecryptedKey({ Password: pass }); },\r\n function () {\r\n if (!!!$(\"#docPassword\").data('entered')) {\r\n CloseWindow();\r\n }\r\n }).cancel = function () {\r\n CloseWindow();\r\n };\r\n } else {\r\n GetDecryptedKey(null);\r\n }\r\n });\r\n };\r\n\r\n global.GetEncryptedTaskTree = function (id, encoding, pluginName) {\r\n return GetEncryptedCustomWorkTree('T', id, !!encoding ? encoding : WebAccess.current.Encoding, !!pluginName ? pluginName : WebAccess.current.PluginName);\r\n };\r\n\r\n global.GetEncryptedJobTree = function (id, encoding, pluginName) {\r\n return GetEncryptedCustomWorkTree('J', id, !!encoding ? encoding : WebAccess.current.Encoding, !!pluginName ? pluginName : WebAccess.current.PluginName);\r\n };\r\n\r\n})(window);\r\n\r\n\r\nvar setSavedTextWidth = function (jMainContainer) {\r\n //var setWidth = function () {\r\n // // Если в тексте написано большое неразрывное слово, что для того что бы оно не раздвигало все остальное, устанавливаем размер явно\r\n // jMainContainer.find(\".card_task_savedtext_container\").css({\r\n // \"width\": jMainContainer.find(\".card:first\").width() - 30 // 30 - это padding + border + margin.\r\n // });\r\n //};\r\n //setWidth();\r\n //setTimeout(function () { //для корректировки после появления и исчезания скрола.\r\n // setWidth();\r\n //}, 10);\r\n};\r\n\r\nfunction ShowEncodedObjectError(error) {\r\n var mbox = new WA.CMP.dialogs.MessageBox();\r\n mbox.width = 470;\r\n mbox.showError(error, null, null, function () { WA.CR.window.close(); });\r\n}\r\n\r\nvar clamp = function (val, min, max) {\r\n return Math.min(Math.max(val, min), max);\r\n};\r\n\r\n// Инициализирует возможность изменять размер панели вложений.\r\nfunction InitAttachmentsResize() {\r\n var minX = 850;\r\n var defaultAttachWidth = 260;\r\n\r\n function setWidth(w) {\r\n w = parseInt(w, 10);\r\n var jMainContainer = $('#main_container');\r\n var attd = jMainContainer.find('.attachments_td');\r\n attd.width(w);\r\n\r\n var jCard = jMainContainer.find(\".card:first\");\r\n jCard.css({ \"marginRight\": w });\r\n var jLeftColumn = $('#left_column');\r\n if (jLeftColumn.hasClass('horizontal')) {\r\n jLeftColumn.css({ \"marginRight\": w});\r\n }\r\n\r\n setSavedTextWidth(jMainContainer);\r\n\r\n var lr = ListRequisite(attd.find('.ListRequisite').attr('id'));\r\n if (lr.onUpdate) lr.onUpdate();\r\n }\r\n\r\n var res = $.cookie('attwidth');\r\n if (!!res) {\r\n setWidth(res);\r\n } else {\r\n setWidth(defaultAttachWidth);\r\n }\r\n\r\n $('#attachments_dragarea').mousedown(function (ev) {\r\n ev.preventDefault();\r\n var $this = $(this);\r\n var maxX = $(window).width() - defaultAttachWidth;\r\n $this.addClass('dragging').offset({ left: clamp(ev.pageX, minX, maxX) });\r\n $('html').css('cursor', 'col-resize')\r\n .bind('mousemove.attresize', function (ev) {\r\n ev.preventDefault();\r\n $this.offset({ left: clamp(ev.pageX, minX, maxX) });\r\n })\r\n .bind('mouseup.attresize', function (ev) {\r\n ev.preventDefault();\r\n $('html').css('cursor', '').unbind('mousemove.attresize').unbind('mouseup.attresize');\r\n $this.removeClass('dragging').css('left', '');\r\n var w = $(window).width() - clamp(ev.pageX, minX, maxX) + 10;\r\n setWidth(w);\r\n document.cookie = \"attwidth=\" + w;\r\n });\r\n });\r\n}\r\n\r\n\r\n// Для ресайза текста ззу.\r\n$(function () {\r\n var initialSavedTextSize = $(\".bottom_textarea:visible\").innerHeight();\r\n\r\n //Нам ни к чему шевелиться на страницах, где это не требутся.\r\n var allowedPages = ['task', 'job', 'notice'];\r\n if (allowedPages.indexOf(WA.getLocation()) === -1) return;\r\n\r\n var jMainContainer = $('#main_container');\r\n var jSavedText = jMainContainer.find('.card_task_savedtext_container');\r\n if (jSavedText.length) {\r\n var savedTextInitTop = jSavedText.offset().top;\r\n var jTextarea = jMainContainer.find('.bottom_textarea');\r\n\r\n var isResize = false;\r\n\r\n window.initSavedTextHeight = function (ev) {\r\n if (!isResize) {\r\n var isSmall = windowHeight() < MIN_WINDOW_HEIGHT;\r\n wh = isSmall ? $(document).height() : windowHeight();\r\n jTextarea.height(Math.max(100, jTextarea.height()));\r\n // Значение 12px - дополнительное смещение карточки ЗЗУ отностительно страницы.\r\n var h = Math.max(100, wh - savedTextInitTop - jTextarea.height() - 12);\r\n jSavedText.height(h);\r\n if (!$.ipad) {\r\n jSavedText.resizable(\"option\", \"maxHeight\", jSavedText.height() + jTextarea.height() - initialSavedTextSize);\r\n }\r\n setRealHeightAndWidth();\r\n\r\n savedTextInitTop = jSavedText.offset().top; //пересчитываем после изменения размеров.\r\n }\r\n };\r\n\r\n if (!$.ipad) {\r\n var dragEl = jSavedText.next();\r\n jSavedText.resizable({\r\n handles: { s: dragEl },\r\n helper: \"ui-resizable-helper\",\r\n start: function () { isResize = true; },\r\n resize: function (ev, ui) {\r\n ui.helper.width(ui.originalSize.width - 1);\r\n },\r\n stop: function () {\r\n //debugger;\r\n var wh = windowHeight();\r\n if (wh < 626) wh = 626;\r\n var h = Math.max(100, wh - savedTextInitTop - jSavedText.height() - 23);\r\n jTextarea.height(h);\r\n jSavedText.css({ \"width\": \"auto\" });\r\n //Что бы не улетало при ресайзе.\r\n setSavedTextWidth(jMainContainer);\r\n isResize = false;\r\n },\r\n minHeight: 100,\r\n maxHeight: jSavedText.height() + jTextarea.height() - 100\r\n });\r\n }\r\n\r\n initSavedTextHeight();\r\n\r\n setTimeout(function() {\r\n ShowOnlyCurrentRelatedTasks();\r\n initSavedTextHeight();\r\n ScrollTreeToCurrentJob();\r\n $('.TaskTree').removeClass('TaskTree__hidden');\r\n }, 15);\r\n\r\n $(window).resize(initSavedTextHeight);\r\n }\r\n});\r\n\r\n// Скрытие (схлопывание) всех подзадач - есть в десктопе, в вебе может понадобиться в дальнейшем.\r\n/*function CollapseAllTasks() {\r\n var jTreeElements = $('.TaskTree').find('[id*=\"Item_\"]');\r\n jTreeElements.each(function() {\r\n ChangeItemExpandCollapse($(this).find('.ItemExpandCollapse').get(0));\r\n });\r\n}*/\r\n\r\n// Отображение в раскрытом виде только тех подзадач, которые относятся к текущему заданию.\r\nfunction ShowOnlyCurrentRelatedTasks() {\r\n var jTreeElements = $('.TaskTree').find('[id*=\"Item_\"]');\r\n // Скрытие (схлопывание) подзадач, не содержащих текущее задание.\r\n jTreeElements.each(function() {\r\n if (!$(this).find('.ParentForCurrentItemHeader, .CurrentItemHeader').length) {\r\n var jArrow = $(this).find('.ItemExpandCollapse').get(0);\r\n ChangeItemExpandCollapse(jArrow);\r\n }\r\n });\r\n // Раскрытие всех потомков текущих элементов.\r\n var jChildrenOfCurrentElement = $('.CurrentItemHeader').eq(0).parents('div:first').children('div');\r\n var jExpandCollapseArrow = jChildrenOfCurrentElement.find('.ItemExpandCollapse');\r\n jExpandCollapseArrow.each(function() {\r\n if ($(this).hasClass('att_plus.png')) {\r\n ChangeItemExpandCollapse($(this));\r\n }\r\n });\r\n // Раскрытие всех заданий-потомков родителя текущего элемента.\r\n var jChildrenOfParentForCurrentElement = $('.ParentForCurrentItemHeader').eq(0).parents('div:first').children('div');\r\n jChildrenOfParentForCurrentElement.each(function() {\r\n if ($(this).hasClass('Item_Job')) {\r\n var jExpandCollapseArrow = $(this).find('.ItemExpandCollapse');\r\n jExpandCollapseArrow.each(function() {\r\n if ($(this).hasClass('att_plus.png')) {\r\n ChangeItemExpandCollapse($(this));\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\n// Прокрутка до активного задания.\r\nfunction ScrollTreeToCurrentJob() {\r\n var jMainContainer = $('#main_container');\r\n\r\n var jCurrentItem = jMainContainer.find('.CurrentItemHeader').parents('table:first');\r\n if (!jCurrentItem.length)\r\n jCurrentItem = jMainContainer.find('.ParentForCurrentItemHeader').parents('table:first');\r\n\r\n\r\n if (jCurrentItem.length) {\r\n var currentItemPos = jCurrentItem.position();\r\n var jSavedText = jMainContainer.find('.card_task_savedtext_container');\r\n jSavedText.scrollTop(jSavedText.scrollTop() + currentItemPos.top);\r\n }\r\n}\r\n\r\n//Диалог актуализации срока задачи.\r\nfunction ShowTaskDeadlineActualizeDialog(onClose) {\r\n var res = $(\"
    \", { html: L('TASK_DEADLINE_ACTUALIZE_MSG') }).dialog({\r\n title: L('CONFIRMATION'),\r\n resizable: false,\r\n width: 440,\r\n modal: true,\r\n autoOpen: true,\r\n close: onClose,\r\n buttons: [\r\n {\r\n text: L('ACTUALIZE'),\r\n click: function () {\r\n $(this).dialog(\"close\");\r\n $('.dateField').focus();\r\n }\r\n },\r\n {\r\n text: L('NOACTUALIZE'),\r\n click: function () {\r\n $(this).dialog(\"close\");\r\n UnbindBeforeUnload();\r\n DoAction('__POSTBACK_ACTION=StartTask', true);\r\n }\r\n },\r\n {\r\n text: L('CANCEL'),\r\n click: function () {\r\n $(this).dialog(\"close\");\r\n }\r\n }\r\n ]\r\n });\r\n InitHoverForButtons(res.next());\r\n}\r\n\r\n// Диалог установки прав на вложения\r\nfunction ShowTaskAttachmentsAssignRightDlg(taskID, userRights, message) {\r\n //var title = 'What attachments rights assign to task participants?'\r\n //var msg = 'Some of the task participants do not have minimal necessary attachments rights (to view). Press View, Modify or Full to assign corresponding rights, Ignore if you don\\'t want to change any rights and Cancel to abort task start.'\r\n function ProceedTaskStarting(attachmentsRights) {\r\n UnbindBeforeUnload();\r\n CallService(\"/Task.asmx/SetAttachmentsRights\", { TaskID: taskID, Rights: attachmentsRights }, function (res) {\r\n if (res.Success) {\r\n DoAction('__POSTBACK_ACTION=StartTask&IgnoreAttachmentsRights=true', true);\r\n } else {\r\n ShowTaskAttachmentsAssignRightDlg(taskID, res.Result, res.Error);\r\n };\r\n });\r\n }\r\n\r\n if (userRights == \"Empty\") {\r\n DoAction('__POSTBACK_ACTION=StartTask&IgnoreAttachmentsRights=true', true);\r\n return;\r\n }\r\n\r\n var mbox = new WA.CMP.dialogs.MessageBox();\r\n if (userRights == \"Full\") {\r\n mbox\r\n .addButton('view_right_btn', L('VIEWING'), function () { ProceedTaskStarting(ACCESS_RIGHTS.VIEW); })\r\n .addButton('modify_right_btn', L('MODIFY'), function () { ProceedTaskStarting(ACCESS_RIGHTS.CHANGE); })\r\n .addButton('full_right_btn', L('FULL'), function () { ProceedTaskStarting(ACCESS_RIGHTS.FULL); })\r\n .addButton('max_right_btn', L('MAXIMALLY_POSSIBLE_RIGHTS'), function () {\r\n WA.services.call(\"/Task.asmx/SetMaximallyPossibleRightsOnAttachments\", { TaskID: taskID }).success(function () {\r\n DoAction('__POSTBACK_ACTION=StartTask&IgnoreAttachmentsRights=true', true);\r\n });\r\n })\r\n .addButton('ignore_button', L('IGNORE'), function () { ProceedTaskStarting(ACCESS_RIGHTS.EMPTY); })\r\n ._setDefaultButton('view_right_btn');\r\n }\r\n if (userRights == \"View\") {\r\n mbox\r\n .addButton('view_right_btn', L('VIEWING'), function () { ProceedTaskStarting(ACCESS_RIGHTS.VIEW); })\r\n .addButton('ignore_button', L('IGNORE'), function () { ProceedTaskStarting(ACCESS_RIGHTS.EMPTY); })\r\n ._setDefaultButton('view_right_btn');\r\n }\r\n if (userRights == \"Change\") {\r\n mbox\r\n .addButton('view_right_btn', L('VIEWING'), function () { ProceedTaskStarting(ACCESS_RIGHTS.VIEW); })\r\n .addButton('modify_right_btn', L('MODIFY'), function () { ProceedTaskStarting(ACCESS_RIGHTS.CHANGE); })\r\n .addButton('max_right_btn', L('MAXIMALLY_POSSIBLE_RIGHTS'), function () {\r\n WA.services.call(\"/Task.asmx/SetMaximallyPossibleRightsOnAttachments\", { TaskID: taskID }).success(function () {\r\n DoAction('__POSTBACK_ACTION=StartTask&IgnoreAttachmentsRights=true', true);\r\n });\r\n })\r\n .addButton('ignore_button', L('IGNORE'), function () { ProceedTaskStarting(ACCESS_RIGHTS.EMPTY); })\r\n ._setDefaultButton('view_right_btn');\r\n }\r\n\r\n if (userRights == \"NoAccess\") {\r\n mbox\r\n .addButton('ignore_button', L('IGNORE'), function () { ProceedTaskStarting(ACCESS_RIGHTS.EMPTY); })\r\n ._setDefaultButton('ignore_button');\r\n }\r\n\r\n mbox.isShowCancelButton = true;\r\n mbox.isShowOkButton = false;\r\n var msg = L('ASSING_TASK_ATTACHMENTS_RIGHTS_DLG_MSG');\r\n\r\n if (typeof message != 'undefined') {\r\n msg = L('WRN_CANNOT_SET_ATTACHMENTS_RIGHTS') + '
    ' + message;\r\n }\r\n\r\n mbox.showQuestion(L('ASSING_TASK_ATTACHMENTS_RIGHTS_DLG_CAPTION'), msg, L('ACCESS_RIGHTS'));\r\n}\r\n\r\n\r\n(function (global) {\r\n var encryptTaskWithCert = function (id) {\r\n var encryption = 1;\r\n\r\n var encryptCheckBox = $('#EncryptWithCertCheck');\r\n var rightType = $('input[id*=RightsType][type=text]');\r\n setTimeout(function () {\r\n if (encryption == 1) {\r\n encryptCheckBox.attr('checked', 'chedked').change();\r\n //rightType.data('DropDownListInstance').addDropDownListItem(['M', L('MANUAL'), L('MANUAL'), false]).setValue('M').disable();\r\n } else {\r\n encryptCheckBox.removeAttr('checked').change();\r\n //rightType.data('DropDownListInstance').removeDropDownListItem('M').setPrevValue().enable();\r\n }\r\n }, 100);\r\n $('#TaskEncryptionType').val(encryption);\r\n //SaveInTask();\r\n\r\n //setEncryption(id, encryption, '',\r\n // function () {\r\n // var button = $(WA.current.toolBar.buttons.EncryptTask.selector);\r\n // var rightType = $('input[id*=RightsType][type=text]');\r\n // if (encryption == 1) {\r\n // button.addClass('selected');\r\n // rightType.data('DropDownListInstance').addDropDownListItem(['M', L('MANUAL'), L('MANUAL'), false]).setValue('M').disable();\r\n // } else {\r\n // button.removeClass('selected');\r\n // rightType.data('DropDownListInstance').removeDropDownListItem('M').setValue('A').enable();\r\n // }\r\n\r\n // }, function() {\r\n // });\r\n };\r\n\r\n var setEncryption = function (id, encryption, password, onSuccess, onFail) {\r\n WA.SRV.call('/Task.asmx/SetEncryption', { TaskID: id, Encryption: encryption, Password: password })\r\n .success(function (res) {\r\n HideTopSpinner('task enctypted!');\r\n if (!!onSuccess) onSuccess();\r\n })\r\n .fail(function (error) {\r\n if (!!onFail) onFail(error);\r\n });\r\n };\r\n\r\n global.EncryptTaskWithCert = function (id) {\r\n return encryptTaskWithCert(id);\r\n };\r\n})(window);\r\n\r\nfunction EncryptWithCertCheckbox(el) {\r\n var encryption = $(el).is(':checked') ? 1 : 0;\r\n var rightType = $('input[id*=RightsType][type=text]');\r\n var dropDownList = rightType.data('DropDownListInstance');\r\n if (encryption == 1) {\r\n dropDownList.addDropDownListItem(['M', L('MANUAL'), L('MANUAL'), false]).setValue('M').disable();\r\n if (dropDownList.prevValue != 'M') $.cookie('lastAccessType', dropDownList.prevValue);\r\n } else {\r\n dropDownList.removeDropDownListItem('M');\r\n if (!!$.cookie('lastAccessType')) dropDownList.setValue($.cookie('lastAccessType')).enable();\r\n else dropDownList.setPrevValue().enable();\r\n }\r\n $('#TaskEncryptionType').val(encryption);\r\n}\r\n\r\n$(function () {\r\n WA.ready(function () {\r\n setTimeout(function () {\r\n if (WA.getLocation() == 'task') {\r\n var rightType = $('input[id*=RightsType][type=text]');\r\n if ($('#TaskEncryptionType').val() == '1') {\r\n if (rightType.length) rightType.data('DropDownListInstance').addDropDownListItem(['M', L('MANUAL'), L('MANUAL'), false]).setValue('M').disable();\r\n $('#EncryptWithCertCheck').attr('checked', true);\r\n } else {\r\n if (rightType.length && (WA.Task.ID == WA.Task.MainTaskID)) rightType.data('DropDownListInstance').removeDropDownListItem('M').setPrevValue().enable();\r\n $('#EncryptWithCertCheck').removeAttr('checked');\r\n }\r\n }\r\n }, 100);\r\n });\r\n})\r\n\r\n/**\r\n * Добавляет ссылку на объект во вложения.\r\n * @param {Link} link Ссылка на объект.\r\n * @since 5.1.0.1522\r\n */\r\nfunction AddAttachment(link) {\r\n if (!!link) {\r\n var att = ListRequisite('ctl00_MainContent_Attachments_AttachmentsList');\r\n var linkModel = link.toLinkModel();\r\n // Проверяем если уже такая ссылка.\r\n if (att.CheckObject(linkModel)) {\r\n // Если нет, то добавляем.\r\n att.AddObject(linkModel);\r\n att.UpdateList();\r\n }\r\n }\r\n};","/// \n/// \n\nfunction ParseLocalCopyModifyDate(modifyDate) {\n var timedateSeparatorIndex = modifyDate.indexOf(\" \");\n var timePart = modifyDate.substring(timedateSeparatorIndex + 1);\n var datePart = modifyDate.substring(0, timedateSeparatorIndex);\n\n var monthSeparatorIndex = datePart.indexOf(\"/\");\n var daySeparatorIndex = datePart.lastIndexOf(\"/\");\n var month = datePart.substring(0, monthSeparatorIndex);\n var day = datePart.substring(monthSeparatorIndex+1, daySeparatorIndex);\n var year = datePart.substring(daySeparatorIndex+1);\n\n var hoursSeparatorIndex = timePart.indexOf(\":\");\n var minsSeparatorIndex = timePart.lastIndexOf(\":\");\n var hours = timePart.substring(0, hoursSeparatorIndex);\n var mins = timePart.substring(hoursSeparatorIndex + 1, minsSeparatorIndex);\n var secs = timePart.substring(minsSeparatorIndex + 1);\n\n return new Date(year, month-1, day, hours, mins, secs, 0);\n}\n\n//Возвращает размер документа в виде строки.\nfunction GetDocumentSizeAsString(sizeB) {\n var sizeMB = Math.floor(sizeB / (1024 * 1024));\n var sizeKB = Math.floor(sizeB / 1024);\n if (sizeMB > 0) {\n return sizeMB + \" \" + L(\"SIZE_POSTFIX_MBYTES\");\n } else if (sizeKB > 0) {\n return sizeKB + \" \" + L(\"SIZE_POSTFIX_KBYTES\");\n } else {\n return sizeB + \" \" + L(\"SIZE_POSTFIX_BYTES\");\n }\n}\n\n//Отображает модальное окно с выбором действий при открытии документа, у которого есть локальная копия.\nfunction AskForActionOnDocument(Doc, LocalCopies, Lock) {\n var hasOnlyOneCopy = LocalCopies.length == 1;\n var actions = [L('RECOVER_FROM_LOCAL_COPY'), L('OPEN_DOC_AND_DELETE_LOCAL_COPY'), L('GO_TO_DOCUMENT_RECOVERY')];\n var documentVersion = null;\n for (var i = 0; i < Doc.Versions.length; ++i) {\n if (Doc.Versions[i].Number == LocalCopies[0].Version);\n documentVersion = Doc.Versions[i];\n }\n\n var localCopyModifyDate = ParseLocalCopyModifyDate(LocalCopies[0].EditDate);\n var documentModifyDate = parseDateTime(documentVersion.LastModifiedText);\n var message = format(hasOnlyOneCopy ? (L(\"DOCUMENT_HAS_LOCAL_COPY\").replaceAll(\"\\\\\\\\n\", \"
    \")) : L(\"DOCUMENT_HAS_MULTIPLE_LOCAL_COPIES\"), {\n 0: Doc.ClientName,\n 1: formatDateTime(documentModifyDate),\n 2: formatDateTime(localCopyModifyDate),\n 3: GetDocumentSizeAsString(documentVersion.Size),\n 4: GetDocumentSizeAsString(LocalCopies[0].Size)\n });\n var html = '
    ';\n html += '
    ';\n html += '
    ' + L('LOCAL_COPY_OPTIONS') + '
    ';\n html += '
    ';\n for (var i = 0; i < actions.length; i++) {\n var needCheck = (i == 0 && hasOnlyOneCopy) || (i == 2 && !hasOnlyOneCopy);\n html += '
    '\n + ''\n + '
    ';\n }\n html += '
    ';\n\n LocalCopyRecommendedAction[(LocalCopies[0].ID + 'v' + LocalCopies[0].Version)] = localCopyModifyDate > documentModifyDate ? \"RECOVER\" : \"DELETE\";\n\n var mbox = new WA.CMP.dialogs.MessageBox();\n mbox.width = 600;\n mbox.okCancelButtons(function () {\n var opcode = $('#actionOptions').find('input:checked').attr('opcode');\n switch (opcode) {\n case \"0\": ReturnLocalCopy(Doc.ID, LocalCopies[0].Version, Doc.Encoding, Doc.PluginName, GetFileNameFromDoc(Doc, LocalCopies[0].Version), LocalCopies[0].EditDate); break;\n case \"1\":\n DeleteLocalCopy(Doc.ID, LocalCopies[0].Version, function () {\n OpenWithAgent({ id: Doc.ID }, Lock);\n });\n break;\n case \"2\": WebAccess.agent.edms.checkDocumentLocalCopies(); break;\n }\n }, null);\n mbox.showWarning(message, html);\n BindHelpIcoClickOnModalWindow('RestoreDocuments', $('#dialog_content_' + mbox.id).parents('.ui-dialog'));\n}\n\nfunction GetFileNameFromDoc(Doc, Version) {\n var ext = Doc.Editor.Extension; ;\n if (!!Version) {\n var verIndex = -1;\n for (var i = 0; i < Doc.Versions.length; i++) {\n if (Doc.Versions[i].Number == Version) { verIndex = i; break; }\n }\n ext = Doc.Versions[verIndex].Editor.Extension;\n }\n return Doc.ClientName + '.' + ext.toLowerCase();\n}\n\nfunction ExportCert(el) {\n var jEl = $(el);\n var certid = jEl.attr('data-certid');\n var docId = WA.current.ID;\n var verNum = jEl.attr('data-vernum');\n if (certid === \"\") {\n ShowError(format(L(\"ERR_INVALID_SIGN\"), verNum, WA.current.ClientName));\n } else {\n window.location.href = \"DynControl.ashx?c=export_certificate&certid=\" + certid + \"&docid=\" + docId + \"&verNum=\" + verNum;\n }\n}\n","(function (global) {\n\n // Регистрирует событие на смену значения типа папки для мобильной версии.\n function registerDisableShowUnreadControlForMobile(kindsToDisable, noKey) {\n $(function () {\n $('select[id$=\"Kind\"]').change(function () {\n disableShowUnreadControl($(this).val(), kindsToDisable, noKey);\n });\n });\n }\n\n // Делает неактивным поле \"Показывать число непрочитанных заданий\", если выбрано неположенное значение.\n function disableShowUnreadControl(selectedKey, kindsToDisable, noKey) {\n var jShowUnreadControl = getShowUnreadControl();\n var showUnreadPick = jShowUnreadControl.data('DropDownListInstance');\n if ($.inArray(selectedKey, kindsToDisable) === -1) {\n if (showUnreadPick) {\n // Для обычной версии.\n showUnreadPick.disable();\n showUnreadPick.setValue(noKey);\n } else {\n // Для мобильной версии.\n getShowUnreadControl().val(noKey).attr('disabled', true).addClass('Req_Disabled');\n }\n } else {\n if (showUnreadPick) {\n // Для обычной версии.\n showUnreadPick.enable();\n } else {\n // Для мобильной версии.\n getShowUnreadControl().attr('disabled', false).removeClass('Req_Disabled');\n }\n }\n };\n\n // Получает контрол \"Показывать число непрочитанных заданий\".\n function getShowUnreadControl() {\n var r = $('.ShowUnreadContainer').find('input.pickField');\n if (r.length === 0) {\n // Для мобильной версии.\n r = $('select[id$=\"ShowUnread\"]');\n }\n return r;\n };\n\n /**\n * Установить доступность кнопок на ленте при изменении формы папки.\n * @since 5.5.2201\n */\n global.bindButtonsEnablingOnFormChange = function () {\n var buttonNames = ['Save', 'SaveAndClose'];\n switch (WA.CR.sideBar.tabs.current.name) {\n case 'Card':\n $('#main_container').find('input, textarea').one('change keypress',\n function() {\n Core.cards.enableButtonsOnFormChange(buttonNames);\n });\n break;\n case 'RightsList':\n $('.Rights').on('rightsChange', function () {\n Core.cards.enableButtonsOnFormChange(buttonNames);\n });\n break;\n }\n };\n\n // Exports\n global.RegisterDisableShowUnreadControlForMobile = registerDisableShowUnreadControlForMobile;\n global.DisableShowUnreadControl = disableShowUnreadControl;\n\n})(window);","","(function ($) {\n function MultiSelectModalWindow(inp, opt) {\n this.init(inp, opt);\n }\n\n MultiSelectModalWindow.prototype = {\n //Input на странице, на который навешивается этот плагин.\n inp: null,\n //Класс компоненты \"Выбор из справочника\"\n rsInstance: null,\n\n // html разметка для добавления в модальное окно\n html: null,\n // объект со списком записей и выбранными записями\n dataObject: null,\n // нужна ли колонка с названием группы, к которой принадлежит запись\n withGroupColumn: null,\n // jquery объект таблицы с выбранными записями\n selectedRecordsTable: null,\n // jquery объект списка записей\n recordsList: null,\n // Input фильтра.\n filterInput: null,\n // Спиннер в строке фильтра.\n filterSpinner: null,\n // Сообщение под деревом.\n groupsListMessageBox: null,\n\n //REVIEW Комментарий\n navigationKeyCodes: [27, 9, 13, 37, 38, 39, 40],\n // Предыдущее значение фильтра.\n lastFilterValue: \"\",\n\n\n /* Переопределяемые параметры */\n defaultRecordIconClass: \"user-tree__icon_default\",\n defaultMarkedRecordIconClass: \"user-tree__icon_selected-default\",\n // Группы, в которых не будет осуществляться поиск.\n excludeGroups: [],\n customPlaceholder: null,\n // Дерево пользователей.\n treeMode: false,\n treeUrl: \"/UserList.asmx/GetUsers?isrightslist=false\",\n treeModeRecordIconClass: \"user-tree__icon_user\",\n treeModeGroupIconClass: \"user-tree__icon_group\",\n treeModeMarkedRecordIconClass: \"user-tree__icon_selected-user\",\n treeModeMarkedGroupIconClass: \"user-tree__icon_selected-group\",\n favoriteUserIconClass: \"user-tree__icon_fav-user\",\n favoriteUserGroupIconClass: \"user-tree__icon_fav-group\",\n recordsListContextMenu: null,\n // нужно ли показывать окно по нажатию на [...]\n bindWindowOnInput: true,\n\n\n // Список выполняющихся запросов, что была возможно их досрочно прекратить.\n _lastRequests: [],\n // Для небольшой задержки при вводе фильтра, что бы не отправлять слишком много запросов.\n _filterTimeout: null,\n // Отображены не все записи?.\n _isNotAllRecordsShown: false,\n\n\n //Список навешенных событий.\n events: null,\n // Привязка к событиям\n bind: function (name, func) {\n var me = this;\n if (me.events != null) {\n me.events[name] = func;\n }\n },\n // Создание событий\n fire: function (name) {\n var me = this;\n if (me.events != null && typeof me.events[name] !== 'undefined') {\n var r = me.events[name].apply(me, arguments);\n return (typeof r === 'undefined' || r);\n }\n },\n\n\n // Инициализация объекта.\n init: function (inp, opt) {\n var me = this;\n\n me.events = {};\n //По-умолчанию нужно показывать окно по нажатию на [...]\n me.bindWindowOnInput = true;\n //Вначале не нужно показывать сообщение что показы не все записи.\n me._isNotAllRecordsShown = false;\n\n // Переозначиваем параметры.\n if (opt) { $.extend(me, opt); };\n\n // Инициализируем объект с данными.\n me.dataObject = {\n groups: {\n length: 0\n },\n selectedItems: []\n };\n\n if (inp) {\n me.inp = inp;\n me.rsInstance = inp.data('ReferenceSelectInstance');\n if (!!me.rsInstance) {\n me.bindThis();\n }\n }\n },\n\n // Навешивает события на открытие модального окна.\n bindThis: function () {\n var me = this, rs = me.rsInstance;\n\n // Переопределим функцию замены выбранного элемента на что-то другое.\n me.inp.off('ReplaceSelectedItem').on('ReplaceSelectedItem.MultiSelectModalWindow', function (e, oldID, newValues) {\n if (me.isModalShown()) {\n var convNewValues = [];\n for (var i = 0, len = newValues.length; i < len; i++) {\n convNewValues.push(me.convertRefSelectItemToThis(newValues[i]));\n };\n me.replaceSelectedItem(me.convertRefSelectItemIdToThisId(oldID), convNewValues);\n } else {\n rs.replaceSelectedItem(oldID, newValues);\n };\n });\n\n try {\n if (me.bindWindowOnInput) {\n rs.img.addClass('MultiselectModalWindowIco').off('click touchstart').on('click.MultiSelectModalWindow touchstart.MultiSelectModalWindow', function () {\n me.show();\n });\n }\n else {\n rs.img.removeClass('MultiselectModalWindowIco');\n }\n } catch (e) {\n // Всякое бывает.\n }\n },\n\n // Конвертирует ИД выбранного элемента обычного выбора из справочника в ИД выбранного элемента модального диалога.\n convertRefSelectItemIdToThisId: function (itemId) {\n var me = this, rs = me.rsInstance;\n\n var groupcode,\n id = itemId,\n idParts = id.split(':');\n\n if (idParts.length == 2) {\n groupcode = idParts[0];\n id = idParts[1];\n } else {\n groupcode = rs.getFirstRefCode();\n };\n\n return {\n id: id,\n groupcode: groupcode\n };\n },\n\n // Конвертирует выбранный элемент обычного выбора из справочника в выбранный элемент модального диалога.\n convertRefSelectItemToThis: function (item) {\n var res = this.convertRefSelectItemIdToThisId(item[0]);\n res['name'] = (res.id > 0 ? item[2] : item[1]);\n return res;\n },\n\n // Открыто ли модальное окно.\n isModalShown: function () {\n return this.recordsList != null && this.recordsList.is(':visible');\n },\n\n // Получение записей всех справочников.\n getData: function (q, OnSuccess, OnError) {\n var me = this;\n var rs = me.rsInstance;\n // Показывает спиннер вместо иконки с тремя точками.\n me.showSpinner();\n\n // Запоминаем фильтр для которого сделали запрос.\n me.lastFilterValue = q;\n\n if (me.treeMode) {\n me.requestTree('', q);\n }\n else {\n me.sendRequests(q).done(function () {\n me.hideSpinner();\n if (OnSuccess) OnSuccess();\n }).fail(function () {\n // Скрывает спиннер вместо иконки с тремя точками.\n rs.hideSpinner();\n if (OnError) OnError();\n });\n }\n },\n // Отправляет запросы на сервер для каждого справочника.\n sendRequests: function (q) {\n var me = this, rs = me.rsInstance;\n var requests = [];\n\n // Прекращаем все предыдущие запросы.\n while (me._lastRequests.length > 0) {\n me._lastRequests.pop().abort();\n }\n\n // Обновляем результаты фильтрации.\n me.fillAvailableGroups();\n\n // Для пустого запроса не загружаем все справочники, а подгружаем их только при нажатии на стрелочку. Если 1 справочник, то загружаем.\n if (q == '' && me.dataObject.groups.length > 1) {\n // Сразу же завершаем запросы, т.к. подгрузка значение осуществляется после нажатия на стрелочку.\n return $.when();\n }\n\n // Получаем записи всех справочников.\n for (var groupcode in me.dataObject.groups) {\n if (groupcode !== 'length') { //Нужно ли исключить группу из обратки.\n requests.push(me.sendRequest(q, groupcode));\n };\n };\n me._lastRequests = $.merge(me._lastRequests, requests);\n\n // Возвращаем $.Deferred объект что бы дождаться завершения всех запросов и только потом открыть модальное окно.\n return $.when.apply(this, requests);\n },\n // Отправляет запрос на сервер для одного справочника.\n sendRequest: function (q, groupcode, OnSuccess, OnError) {\n var me = this, rs = me.rsInstance;\n var OnSuccessFunc = function (status, data) {\n me.onSuccessGetData(groupcode, status, data);\n // Признак загруженности записей в группе.\n me.dataObject.groups[groupcode].isLoaded = true;\n if (OnSuccess) OnSuccess();\n };\n var OnErrorFunc = function (msg, isHttp) {\n me.onErrorGetData(groupcode, msg, isHttp);\n // Признак загруженности записей в группе.\n me.dataObject.groups[groupcode].isLoaded = true;\n if (OnError) OnError();\n };\n var limit = (MULTI_SELECT_RECORD_COUNT === -1 ? 300 : MULTI_SELECT_RECORD_COUNT + 1); // Загружаем +1 запись, что бы потом выдать сообщение \"Показаны не все\".\n return rs.sendQuery(groupcode, q, 1, limit, OnSuccessFunc, OnErrorFunc);\n },\n //Успешное получение записей одного справочника.\n onSuccessGetData: function (refcode, status, rows) {\n var me = this;\n var rowsLen = rows.length;\n\n if (rowsLen > 0) {\n // Какие-то записи найдены.\n for (var i = 0; i < rowsLen; i++) {\n var row = rows[i];\n var id = parseInt(row.id, 10);\n\n // ИД < 0 - это ошибка и для неё берем значение c htmlencode.\n me.dataObject.groups[refcode].items.push({\n id: id,\n name: row.encodedTitle\n });\n\n // Если уже достигли ограничения, а еще остались, то отображаем сообщение \"Показаны не все\".\n if (i === MULTI_SELECT_RECORD_COUNT && rowsLen >= MULTI_SELECT_RECORD_COUNT) {\n me._isNotAllRecordsShown = true;\n break;\n };\n };\n };\n },\n //Неуспешное получение записей одного справочника.\n onErrorGetData: function (refcode, msg, isHttp) {\n var me = this;\n // Если там ошибка и она не тот что записей не найдено, сохраним её для вывода в шапке.\n if (msg !== L('NO_RECORDS_FOUND')) {\n // В некоторых случаях нужно отображать разные сообщения в заголовке и при раскрытии.\n me.dataObject.groups[refcode].error = msg.split('^')[0];\n };\n },\n\n //Возвращает индекс найденного элемента по ИД.\n findSelectedItemById: function (id) {\n var me = this,\n selItems = me.dataObject.selectedItems;\n for (var i = 0, len = selItems.length; i < len; i++) {\n if (selItems[i].id === id) {\n return i;\n };\n };\n return -1;\n },\n\n // Показывает спиннер.\n showSpinner: function () {\n var me = this, rs = me.rsInstance;\n // Показывает спиннер в строке фильтра.\n if (me.filterSpinner) me.filterSpinner.addClass('processing');\n // Показывает спиннер вместо иконки с тремя точками.\n if (rs) rs.showSpinner();\n },\n // Скрывает спиннер.\n hideSpinner: function () {\n var me = this, rs = me.rsInstance;\n // Скрывает спиннер в строке фильтра.\n if (me.filterSpinner) me.filterSpinner.removeClass('processing');\n // Скрывает спиннер вместо иконки с тремя точками.\n if (rs) rs.hideSpinner();\n },\n\n showModalWindow: function () {\n var me = this, rs = me.rsInstance;\n\n // если группа только одна то не отображаем ее заголовок в списке и в таблице нет колонки с названиями групп\n me.withGroupColumn = me.dataObject.groups.length > 1;\n me.html = me.buildHtml();\n if (me.html) {\n var dialog = new WA.CMP.dialogs.BaseDialog({\n title: (rs ? rs.Label : ''),\n html: me.html,\n okText: L(\"OK\"),\n cancelText: L(\"CANCEL\"),\n dialogClass: 'stat_MultiselectModalWindow',\n width: 890,\n height: 500,\n isShowCancelButton: !rs.isReadonly(),\n onClose: function () {\n if (WA.ENV.isAndroid()) {\n rs.inp.removeAttr('disabled');\n $('.fakeInput').removeAttr('disabled');\n }\n me.hideContextMenu();\n key.setScope('common');\n },\n ok: function () {\n //OK\n me.save();\n }, cancel: function () { /* Cancel */ }\n });\n dialog.show();\n\n key.setScope('modalwindow');\n me._InitInternalObjects();\n me.fillItemsList();\n me.fillSelectedItemsTable();\n me._InitEvents();\n me._fixSelectedItemsTableBorder();\n me._adjustModalWindowIfSmallScreen();\n me._disableRefSelectInputIfAndroid();\n\n // Событие \"После открытия окна\".\n me.fire('OnAfterOpen');\n }\n },\n\n hideContextMenu: function () {\n $('#mainContextMenuContainer').css('visibility', 'hidden');\n },\n\n // Заполняет список доступных групп.\n fillAvailableGroups: function () {\n var me = this, rs = me.rsInstance;\n me.dataObject.groups = { length: 0 };\n // Получаем записи всех справочников.\n var i = 0;\n for (var refcode in rs.refcodes) {\n if ($.inArray(refcode, me.excludeGroups) === -1) { //Нужно ли исключить группу из обратки.\n // Пока записей нет.\n me.dataObject.groups[refcode] = {\n groupname: me.rsInstance.refcodes[refcode].Caption,\n isLoaded: false,\n items: []\n };\n i++;\n };\n };\n me.dataObject.groups.length = i;\n },\n\n show: function () {\n var me = this, rs = me.rsInstance;\n // Получаем выбранные элементы.\n me.dataObject.selectedItems = rs.getValues();\n // Заполняем список доступных групп.\n me.fillAvailableGroups();\n // Получаем дерево без фильтра.\n me.getData('', function () {\n me.showModalWindow();\n });\n },\n\n // Сохраняет выбранные элементы в скрытом поле выбора из справочника.\n save: function () {\n var me = this, rs = me.rsInstance;\n // Сохранение в режиме \"только для чтения\" не работает.\n if (!rs.isReadonly()) {\n rs.setValues(me.dataObject.selectedItems, true);\n me.inp.trigger('change');\n }\n },\n\n /*--------------------------------------------*/\n\n\n /* Построение html по полученному объекту */\n\n buildHtml: function () {\n var me = this;\n var html = me.buildLeftArea();\n html += me.buildSelectedRecords();\n return html;\n },\n\n buildSelectedRecords: function () {\n var html = '
    ' + L('SELECTED_RECORDS') + ':
    ';\n html += '
    ';\n html += this.buildSelectedItemsTable();\n html += '
    ';\n return html;\n },\n\n buildSelectedItemsTable: function () {\n var me = this, rs = me.rsInstance;\n var html = '';\n // Не добавляем колонку для удаления записи, если только для чтения.\n if (!rs.isReadonly()) {\n html += '';\n }\n html += '';\n if (me.withGroupColumn) {\n html += '';\n }\n html += '
    ' + L('NAME') + '' + L('REFERENCE') + '
    ';\n return html;\n },\n\n fillSelectedItemsTable: function () {\n var me = this,\n html = \"\";\n var selItems = me.dataObject.selectedItems;\n for (var i = 0, len = selItems.length; i < len; i++) {\n html += this.buildSelectedItemsTableRow(selItems[i]);\n }\n me.selectedRecordsTable.append(html);\n },\n\n //REVIEW Название не говорящее.\n buildSelectedItemsTableRow: function (selectedItem) {\n var me = this, rs = me.rsInstance;\n var html = '';\n // Не добавляем колонку для удаления записи, если только для чтения.\n if (!rs.isReadonly()) {\n html += '

    ';\n }\n // Получить представление справочника\n var controlId = me.inp.attr('id');\n var requisite = WA.CR.form.getRequisiteByControlId(controlId);\n\n var viewNameParam = \"\";\n if (requisite) {\n var referenceViewName = requisite.referenceViewName();\n if (referenceViewName) viewNameParam = \"&refview=\" + referenceViewName;\n }\n\n // Нужно ли отображать подсказку.\n var link = '';\n var hintData = rs.getHintData(selectedItem.groupcode, selectedItem.id, selectedItem.name);\n html += '';\n if (me.withGroupColumn) {\n html += '
    ' + (me.dataObject.groups[selectedItem.groupcode] ? link + me.dataObject.groups[selectedItem.groupcode].groupname + '' : '') + '
    ';\n }\n html += '';\n return html;\n },\n\n buildLeftArea: function () {\n var me = this, rs = me.rsInstance;\n var tooltip = this._BuildPlaceholderString();\n var html = '
    ';\n html += '
    ' + L('ALL_RECORDS') + ':
    ';\n\n var filterDisabledAttr = !rs.isReadonly() ? '' : 'disabled=\"disabled\" readonly=\"readonly\" ';\n //Шамов А.: Для единообразия убрал placeholder, что бы крутые браузеры не отображали его.\n html += '

    ';\n\n html += '
    ';\n html += '
    ';\n return html;\n },\n\n fillItemsList: function () {\n var me = this;\n var html = \"\";\n var dataObject = me.dataObject;\n\n if (me._isNotAllRecordsShown) {\n //Отобразим информационное сообщение.\n me.showGroupsListMessage(L('NOT_ALL_RECORDS_SHOWN'));\n } else {\n //Скроем информационное сообщение.\n me.hideGroupsListMessage();\n };\n\n if (dataObject.groups.length == 1) {\n for (var key in dataObject.groups) {\n if (key != \"length\") html += me.buildItemsList(key, dataObject.groups[key]);\n }\n }\n else if (dataObject.groups.length > 1) {\n html += me.buildGroupsList(dataObject.groups);\n }\n\n if (html != \"\") {\n me._updateRecordsList(html);\n }\n // Если групп нет, то отображаем \"Пусто (с учетом фильтра).\"\n if (html == '') {\n me.showInfoInGroupsList(me._isFilterEmpty() ? L('ENTER_FILTER_VALUE') : L('EMPTY_WITH_FILTER'));\n }\n\n me.MarkSelectedRecordsInList();\n me.recordsList.scrollTop(0);\n if (!$.ipad && !WA.ENV.isAndroid()) { me.HoverItem(me.recordsList.find('.item:first')); }\n },\n\n buildGroupsList: function (groups) {\n var me = this;\n var html = \"\";\n\n for (var groupcode in groups) {\n // Не отображаем справочники, в которых не нашли записей, но отображаем если была какая-то ошибка.\n if (groupcode != \"length\" && (!groups[groupcode].isLoaded || groups[groupcode].items.length > 0 || typeof groups[groupcode].error !== 'undefined')) {\n html += me.buildSingleGroup(groups[groupcode], groupcode);\n }\n }\n return html;\n },\n\n buildSingleGroup: function (group, key) {\n var me = this;\n var html = \"\";\n html += '
    ' +\n '

    ' + group.groupname + '
    ';\n html += me.buildItemsList(key, group);\n html += '
    ';\n return html;\n },\n\n //REVIEW Название не говорящее -какие ItemsList? в дереве или таблице?.\n buildItemsList: function (groupcode, group) {\n var me = this, rs = me.rsInstance;\n var items = group.items;\n var html = \"\";\n\n if (items.length == 0 && typeof (group.error) != 'undefined') {\n g_group = group;\n var record = { id: -1, name: group.error };\n var text = record.name;\n var item = '
    ' + text + '
    ';\n html += item;\n return html;\n }\n\n for (var j = 0; j < items.length; j++) {\n if (items[j].groupname) {\n html += this.buildSingleGroup(items[j], items[j].compcode);\n }\n else {\n var record = items[j];\n // ИД могут быть отрицательные - это информационные сообшения для определенного справочника.\n if (record.id > 0) {\n // Нужно ли отображать подсказку.\n var recordName = record.name.indexOf('

    -1 ? record.name.substr(record.name.indexOf('

    ') + 4) : record.name;\n var hintData = rs.getHintData(groupcode, \"\" + record.id, recordName);\n var text = '

    ' + recordName + '
    ';\n var item = '
    ' + text +\n '

    ' +\n '' +\n '

    ';\n html += item;\n } else {\n //Отобразим информационное сообщение.\n me.showGroupsListMessage(record.name);\n };\n };\n };\n\n return html;\n },\n\n //Отображает сообщение в центре дерева групп.\n showInfoInGroupsList: function (msg) {\n var me = this;\n var container = me.recordsList.data('iscroll') ? me.recordsList.find('#records_scroller') : me.recordsList;\n container.html('
    ' + msg + '
    ');\n },\n\n requestTree: function (folder, filter) {\n var me = this, rs = me.rsInstance;\n var folderId = folder === '' ? folder : folder.attr('id');\n return CallService(me.treeUrl,\n { ObjectID: \"-1\", ObjectType: \"-1\", FolderID: \"\" + folderId, Filtrator: \"\" + filter },\n function (res) {\n if (res.Success) {\n // Получаем названия всех справочников.\n for (var refcode in rs.refcodes) {\n if ($.inArray(refcode, me.excludeGroups) === -1) { //Нужно ли исключить группу из обратки.\n me.dataObject.groups[refcode] = {\n groupname: me.rsInstance.refcodes[refcode].Caption,\n items: []\n };\n };\n me.dataObject.groups.length += 1;\n };\n\n //Данные получены, открываем модальное окно, что бы создались нужные div\n if (!me.isModalShown()) me.showModalWindow();\n me.hideSpinner();\n //Скроем информационное сообщение.\n me.hideGroupsListMessage();\n if (folder.length) {\n //Подгруппа.\n var html = me.fillTree(res.Result);\n //var group = me.recordsList.find('#' + folderID);\n folder.find('.waiting').remove(); // убираем спинер\n me._InitRecordsListEvents(folder.append(html), true);\n }\n else {\n if (res.Result.length > 0) {\n me._updateRecordsList(me.fillTree(res.Result));\n me._InitRecordsListEvents();\n if (res.Result.length == 1 && res.Result[0].id == 0 && res.Result[0].isGroup && res.Result[0].children.length == 0) {\n me.showGroupsListMessage(L(\"ADD_USER_TO_FAVORITES_WITH_RIGHT_CLICK\"));\n }\n } else {//Если результата нет, то значит скрыта орг.структура.\n //Невозможно просмотреть дерево пользователей. Воспользуйтесь поиском по имени пользователя или группы.\n me.showInfoInGroupsList(me._isFilterEmpty() ? L(\"RIGHTS_SHOWING_TREE_ERROR\") : L('EMPTY_WITH_FILTER'));\n };\n };\n me.MarkSelectedRecordsInList();\n };\n },\n function () { me.hideSpinner(); });\n },\n\n _updateRecordsList: function (html) {\n var me = this;\n // Оставляем div с сообщением. если активен сколлинг, то убираем внутри контейнера для скрола\n var container = me.recordsList.data('iscroll') ? me.recordsList.find('#records_scroller') : me.recordsList;\n container.children('div:not(.groupsListMessageBox)').remove();\n // Добавляем в начало новые данные.\n container.prepend(html);\n },\n\n fillTree: function (nodes) {\n var html = \"\";\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i].id >= 0) {\n html += this.buildTreeNodeHTML(nodes[i]);\n } else {\n this.showGroupsListMessage(nodes[i].text);\n }\n }\n return html;\n },\n\n buildTreeNodeHTML: function (node) {\n var html = node.text;\n if (node.children.length > 0) {\n html = $(html).append(this.fillTree(node.children));\n return html[0].outerHTML;\n }\n return html;\n },\n\n // Отображает сообщение под деревом.\n showGroupsListMessage: function (msg) {\n var me = this;\n var msgBox = me.recordsList.find('.groupsListMessageBox');\n if (msgBox.length == 0) {\n msgBox = me.groupsListMessageBox.clone();\n me.recordsList.append(msgBox);\n };\n msgBox.text(msg).show();\n },\n // Скрывает сообщение под деревом.\n hideGroupsListMessage: function () {\n var me = this;\n me.recordsList.find('.groupsListMessageBox').text('').hide();\n },\n\n /* ---------------------------------- */\n\n /* Инициализация объектов и событий */\n\n _InitInternalObjects: function () {\n var me = this;\n me.selectedRecordsTable = $('#selectedRecordsScrollArea').children('table');\n me.recordsList = $('#recordsList');\n me.groupsListMessageBox = $('.groupsListMessageBox', me.recordsList);\n me.filterInput = $('#filterInput');\n //if ($.ipad && !WA.ENV.isAndroid()) me.filterInput.css('width', '100%');\n me.filterSpinner = me.filterInput.find('p');\n },\n\n _isFilterEmpty: function () {\n return this.filterInput.val().replace(/ /g, \"\") === '';\n },\n\n _InitScrollForTouchScreens: function () {\n if ($.scrollActive) {\n if (this.recordsList.data('iscroll')) {\n //logDebug('refreshScroll');\n this.recordsList.data('iscroll').refresh();\n // вычитается 20 пикселей чтобы последний элемент в списке было видно при прокрутке\n this.recordsList.data('iscroll').maxScrollY -= 20;\n } else {\n //logDebug('initScroll');\n this.recordsList.children().wrapAll('
    ');\n var recordsListScroll = new iScroll('recordsList', { useTransform: true });\n // вычитается 20 пикселей чтобы последний элемент в списке было видно при прокрутке\n recordsListScroll.maxScrollY -= 20;\n this.recordsList.data('iscroll', recordsListScroll);\n }\n }\n },\n\n _InitEvents: function () {\n var me = this;\n if (me.html != null) {\n me._InitSelectedRecordsEvents();\n me._InitLeftAreaEvents();\n }\n },\n\n _InitLeftAreaEvents: function () {\n this._InitRecordsListEvents();\n this._InitFilterInputEvents();\n },\n\n _InitRecordsListEvents: function (block, isNeedProcessChild) {\n var me = this, rs = me.rsInstance;\n var HoverItem = function () { me.HoverItem(this); };\n var UnhoverItem = function () { me.UnhoverItem(this); };\n\n var items = $([]); // = block ? block.find('div.item') : me.recordsList.find('div.item');\n if (block) {\n if (isNeedProcessChild) {\n items = block.find('div.item');\n } else {\n if (block.hasClass('item')) items = block;\n }\n } else {\n items = me.recordsList.find('div.item');\n }\n\n // Если только на чтение, то запрещаем выбирать записи.\n if (!rs.isReadonly()) {\n items.find('span > div, p[data-name=\"ArrowRight\"]').off('click.MultiSelectModalWindow').on('click.MultiSelectModalWindow', function (ev) {\n me.SelectItem($(this).parent().parent());\n });\n\n var groups = $(); // = block ? block.find('.recordGroup > span') : me.recordsList.find('.recordGroup > span');\n if (block) {\n if (isNeedProcessChild) {\n groups = block.find('.recordGroup > span');\n } else {\n if (block.hasClass('recordGroup')) groups = block.children('span');\n }\n } else {\n groups = me.recordsList.find('.recordGroup > span');\n }\n if (me.treeMode) {\n groups.find('p:first').off('click.MultiSelectModalWindow').on('click.MultiSelectModalWindow', function () {\n me.ShowHideRecordsGroup($(this).parent());\n });\n\n me._InitItemsListContextMenu(groups.not('#0'));\n me._InitItemsListContextMenu(items);\n // Если только на чтение, то запрещаем выбирать группы в дереве.\n groups.find('div, p[data-name=\"ArrowRight\"]').off('click.MultiSelectModalWindow').on('click.MultiSelectModalWindow', function () {\n me.SelectItem($(this).parent().parent());\n });\n } else {\n groups.off('click.MultiSelectModalWindow').on('click.MultiSelectModalWindow', function () {\n me.ShowHideRecordsGroup(this);\n });\n }\n if (!$.ipad && !WA.ENV.isAndroid()) { // для айпада отключаем ховеры\n items.hover(HoverItem, UnhoverItem);\n groups.hover(function () { me.HoverGroup($(this).parent()); }, function () { me.UnhoverGroup($(this).parent()); });\n }\n\n //REVIEW Может это в ветке else сделать?\n me._InitScrollForTouchScreens();\n }\n\n // Навешивает события для отображения подсказок.\n me._initHintEvents(items);\n },\n\n // добавляет кнопочку для контекстного меню на планшетах и навешивает клик\n _InitItemsListContextMenu: function (items) {\n var me = this;\n var favoritesGroup = $('#0');\n var ShowContextMenu = function (e, currObj) {\n e.preventDefault();\n e.stopPropagation();\n\n var pos = { x: e.pageX, y: e.pageY };\n if (currObj) {\n //для планшетов\n pos.x = currObj.offset().left;\n pos.y = currObj.offset().top + 50; //смещаем что бы было видно элемент, для которого вызвали меню.\n };\n\n currObj = currObj ? currObj : $(this);\n if (!currObj.attr('id')) currObj = currObj.parent();\n var menu = me._GetContextMenu(currObj, favoritesGroup);\n menu.showAt({ 'left': pos.x, 'top': pos.y });\n };\n var ShowContextMenuTablet = function (e) {\n var a = $(this).parent().parent().parent();\n ShowContextMenu(e, a);\n };\n\n if (!$.ipad && !WA.ENV.isAndroid()) {\n items.bind('contextmenu', ShowContextMenu);\n favoritesGroup.children('span').unbind('contextmenu');\n } else { // для планшетов\n var contextMenuBtn = items.find('.tabletcontextm');\n if (contextMenuBtn.length > 0) {\n contextMenuBtn.off('touchstart.multiselect').on('touchstart.multiselect', ShowContextMenuTablet);\n } else {\n var contextmenuButton = '';\n items.find('p.ico').before(contextmenuButton).prev().off('touchstart.multiselect').on('touchstart.multiselect', ShowContextMenuTablet);\n }\n favoritesGroup.children('span').find('.tabletcontextm').off('touchstart.multiselect').remove();\n }\n },\n\n _InitSelectedRecordsEvents: function () {\n var me = this, rs = me.rsInstance;\n\n var cols = [];\n\n // Колонка для удаления выбранной записи.\n if (!rs.isReadonly()) {\n var colWidth = $.ipad || WA.ENV.isAndroid() || WA.ENV.browser.name.toLowerCase() == 'safari' ? '35px' : '15px';\n cols.push({ \"sWidth\": colWidth, \"bVisible\": true, \"bSortable\": false });\n }\n\n // Колонка \"Наименование\"\n var colWidth = me.withGroupColumn ? '300px' : '400px';\n cols.push({ \"bVisible\": true, \"sWidth\": colWidth, \"bSortable\": false });\n\n // Колонка \"Справочник\"\n if (me.withGroupColumn) {\n cols.push({ \"bVisible\": true, \"bSortable\": false });\n }\n\n me.selectedRecordsTable.dataTable({\n \"sScrollY\": (me.selectedRecordsTable.parent().height() - 33) + 'px',\n \"sScrollX\": \"100%\",\n \"bAutoWidth\": false,\n \"bDeferRender\": true,\n \"bPaginate\": false,\n \"bSortable\": false,\n \"oLanguage\": { \"sZeroRecords\": L(\"EMPTY\") },\n 'aoColumns': cols\n });\n var tableWidth;\n if (!$.ipad) {\n tableWidth = '100%';\n }\n if (WA.ENV.isAndroid()) tableWidth = 489; // хаки чтобы таблица не прокручивалась по горизонтали\n me.selectedRecordsTable.css('width',tableWidth); // просто через width в Firefox и IE ширина некорректно устанавливалась (v5.5)\n me.selectedRecordsTable.find('th:last-child').width('auto');\n me.selectedRecordsTable.parent().width(tableWidth).attr('id', 'selectedRecordsWrapper');\n $('.dataTables_scrollHeadInner').width(tableWidth)\n .children('table').css('width',tableWidth)\n .find('th:last-child').width('auto');\n me.selectedRecordsTable.find('tr').each(function () { me._InitSingleSelectedRecordEvents(this); });\n },\n\n _InitSingleSelectedRecordEvents: function (row) {\n var me = this, rs = me.rsInstance;\n row = $(row);\n\n if (!$.ipad && !WA.ENV.isAndroid()) {\n row.hover(\n function () { $(this).addClass('over').find('.removeFromSelect').css('visibility', 'visible'); },\n function () { $(this).removeClass('over').find('.removeFromSelect').css('visibility', 'hidden'); });\n }\n else {\n row.find('.removeFromSelect').css('visibility', 'visible');\n }\n row.find('.removeFromSelect').on('click.MultiSelectModalWindow', this, function (e) {\n e.data.DeleteItemFromSelection(this);\n });\n\n // Навешивает события для отображения подсказок.\n me._initHintEvents(row);\n },\n\n // Навешивает события для отображения подсказок.\n _initHintEvents: function (el) {\n if (!$.ipad && !WA.ENV.isAndroid()) {\n el.find('.hint').each(function () {\n InitAdditionalInfoTooltip($(this));\n });\n };\n },\n\n // Навешивает события на поле фильтрации\n _InitFilterInputEvents: function () {\n var me = this;\n var eventName = 'keydown';\n //if ($.browser.mozilla) eventName = 'keypress'; убрали так как шифт+таб не работал нормально\n me.filterInput.on(eventName + '.MultiSelectModalWindow blur.MultiSelectModalWindow', me, me._KeyPressEventHandler);\n me._InitKeyNavigation();\n },\n\n _KeyPressEventHandler: function (ev) {\n var me = ev.data;\n if ($.inArray(ev.keyCode, me.navigationKeyCodes) > -1) {\n if (ev.keyCode == 9) {\n $(this).blur();\n var firstItem = me.recordsList.find('div:first');\n firstItem.hasClass('item') ? me.HoverItem(firstItem) : me.HoverGroup(firstItem);\n me.recordsList.scrollTop(0);\n return false;\n }\n //me._NavigationKeyPressHandler(ev);\n } else {\n me.MakeFilterRequest();\n }\n },\n\n _InitKeyNavigation: function () {\n var me = this, rs = me.rsInstance;\n if (!rs.isReadonly()) {\n if (!me.rsInstance.inp.hasClass('modalWindowKeyNavigationActive')) {\n var scope = 'modalwindow';\n key('down', scope, function () { me.upDownKeyNavigation(true); return false; });\n key('up', scope, function () { me.upDownKeyNavigation(false); return false; });\n key('right', scope, function () { me.RightArrowKeyPress(); return false; });\n key('left', scope, function () { me.LeftArrowKeyPress(); return false; });\n key('delete', scope, function () { me.DeleteKeyPress(); return false; });\n key('shift+tab', scope, function () {\n me.filterInput.focus();\n me.UnhoverItem(me.recordsList.find('.over'));\n me.UnhoverGroup(me.recordsList.find('.groupOver'));\n return false;\n });\n var selector = '.item.over';\n if (this.treeMode) { selector += ',.recordGroup.groupOver'; }\n key('enter', scope, function () {\n var item = me.recordsList.find(selector).first();\n if (item.length) me.SelectItem(item); return false;\n });\n key.setScope(scope);\n me.rsInstance.inp.addClass('modalWindowKeyNavigationActive');\n }\n }\n },\n\n _BuildPlaceholderString: function () {\n var me = this;\n if (me.customPlaceholder === null) {\n var str = (me.dataObject.groups.length == 1 ? L('MULTI_SEARCH_IN_REFERENCE') : L('MULTI_SEARCH_IN_REFERENCES'));\n var i = 0;\n var names = [];\n for (var key in me.dataObject.groups) {\n if (key != 'length') {\n names[i] = '"' + me.dataObject.groups[key].groupname + '"';\n i++;\n }\n }\n str += names.join(', ');\n return str;\n } else {\n return me.customPlaceholder;\n };\n },\n\n // Строит контекстное меню в зависимости от элемента\n _GetContextMenu: function (item, favoritesGroup) {\n var menuItems = [];\n var addMenuItemText;\n var addClickHandler;\n var favoritesMenuItemText;\n var favoritesClickHandler;\n var favoritesIcon;\n var actionIcon;\n var itemID = item.attr('id');\n var me = this;\n\n if (favoritesGroup.children('#' + itemID).length > 0 || item.hasClass('favorite')) {\n favoritesMenuItemText = L(\"REMOVE_FROM_FAVORITES\");\n favoritesClickHandler = function () {\n me.addOrRemoveFavorites(item, itemID, false, favoritesGroup);\n };\n favoritesIcon = \"deleteFromFavourites-16\";\n } else {\n favoritesMenuItemText = L(\"ADD_TO_FAVORITES\");\n favoritesClickHandler = function () {\n me.addOrRemoveFavorites(item, itemID, true, favoritesGroup);\n };\n favoritesIcon = \"folderFavorites-16\";\n }\n if (me.findSelectedItemById(itemID) !== -1) {\n // то элемент уже выбран\n addMenuItemText = L(\"USERGROUP_EXCLUDE\");\n addClickHandler = function () {\n me.selectedRecordsTable.find('tr#' + itemID).find('p:first').click();\n };\n actionIcon = \"unchooseRecord-16\";\n } else {\n addMenuItemText = L(\"USERGROUP_INCLUDE\");\n addClickHandler = function () {\n me.SelectItem(item);\n };\n actionIcon = \"chooseRecord-16\";\n }\n\n menuItems.push({ text: addMenuItemText, onClick: addClickHandler, icon: actionIcon, name: 'addMenuItem' });\n menuItems.push({ text: favoritesMenuItemText, onClick: favoritesClickHandler, icon: favoritesIcon, name: 'favoritesMenuItem' });\n\n return new ContextMenu(menuItems, { width: \"auto\", targetElement: item });\n },\n\n // Добавление или удаление пользователей из избранного\n // item - элемент, который надо добавить\n // needToAdd - нужно ли добавить или удалить\n addOrRemoveFavorites: function (item, itemId, needToAdd, favoritesGroup) {\n var me = this;\n CallService(\"/UserList.asmx/AddOrRemoveFavorites\", { PrincipalID: itemId, IsGroup: item.hasClass('recordGroup'), NeedToAdd: needToAdd },\n function (res) {\n if (res.Success) {\n if (needToAdd) {\n if (favoritesGroup.children('#' + itemId).length == 0) {\n var clone = item.clone();\n me._InitRecordsListEvents(clone, false);\n me._InitRecordsListEvents(clone, true); // для инициализации событий у дочерних элементов\n clone.appendTo(favoritesGroup);\n if (clone.hasClass('recordGroup')) { // если группа, то свернем ее\n me.HideRecordsGroup(clone.children('span'));\n me.HideRecordsGroup(clone.find('.recordGroup > span'));\n }\n me.markUnmarkItemAsFavorite(itemId, needToAdd);\n favoritesGroup.removeClass('emptyGroup');\n }\n }\n else {\n favoritesGroup.children('#' + itemId).remove();\n me.markUnmarkItemAsFavorite(itemId, needToAdd);\n // Если скрыта оргструктура (кроме избранного ничего не отображается) и в избранном ничего нет, то покажем сообщение,\n // что нужно пользоваться поиском\n if (favoritesGroup.length != 0 && favoritesGroup.children('div').length == 0) {\n if (res.Warning == \"orghidden\") {\n me.showGroupsListMessage(L(\"ADD_USER_TO_FAVORITES_WITH_RIGHT_CLICK\"));\n }\n favoritesGroup.addClass('emptyGroup');\n }\n }\n }\n });\n },\n\n // Помечает или снимает отметку избранных пользователей или групп\n // isFavorite - признак пометить как избранное или нет\n markUnmarkItemAsFavorite: function (id, isFavorite) {\n if (id) {\n var me = this;\n // если айпад, то в recordsList добавляется див для скролла\n var favGroup = $.scrollActive ? me.recordsList.children().children('#0') : me.recordsList.children('#0');\n var item = favGroup.length > 0 ? favGroup.siblings().find('#' + id) : me.recordsList.find('#' + id);\n item = item.add(favGroup.siblings('#' + id));\n item = item.add(favGroup.children().find('#' + id));\n var icon = item.children('span').find('p.ico');\n var iconClass = me.treeModeRecordIconClass;\n if (isFavorite) {\n if (item.hasClass('item')) { // если это пользователь\n if (!item.hasClass('selected')) { // у выбранных записей иконки не меняем\n icon.removeClass(iconClass).addClass(me.favoriteUserIconClass);\n }\n } // если это группа\n else {\n icon.removeClass(me.treeModeGroupIconClass).addClass(me.favoriteUserGroupIconClass);\n }\n item.addClass('favorite');\n }\n else {\n if (item.hasClass('item')) { // если это пользователь\n if (!item.hasClass('selected')) { // у выбранных записей иконки не меняем\n icon.removeClass(me.favoriteUserIconClass).addClass(iconClass);\n }\n } // если это группа\n else {\n icon.removeClass(me.favoriteUserGroupIconClass).addClass(me.treeModeGroupIconClass);\n }\n item.removeClass('favorite');\n }\n }\n },\n\n /* ------------------------------------- */\n\n /* Действия с записями */\n\n //REVIEW Название не говорящее + Комментарий (что за курсор?)\n MoveCursor: function (down) {\n var me = this;\n if (me.recordsList) {\n var currentItem = me.recordsList.find('.item.over, .groupOver').first();\n if (currentItem.length) { // если уже есть выделенный элемент, то ищем следующий\n var obj = me.GetNextItemToSelect(currentItem, down);\n if (obj.NextItem.length) {\n if (currentItem.hasClass('item')) { // если текущее выделение было на элементе группы\n me.ScrollListToHoveredItem(currentItem, down);\n me.UnhoverItem(currentItem);\n }\n else { // если текущее выделение было на заголовке группы\n me.ScrollListToHoveredItem(currentItem.children(':first'), down);\n me.UnhoverGroup(currentItem);\n }\n // если следующий элемент - группа, то вызываем соотв-щий ховер\n obj.IsGroup ? me.HoverGroup(obj.NextItem) : me.HoverItem(obj.NextItem);\n }\n }\n else { // если в списке не было выделенного элемента\n var item;\n var isGroup = true;\n // при нажатии вниз выделяем заголовок первой группы\n if (down) {\n item = me.recordsList.find('.recordGroup:first');\n if (item.length == 0) { // если группу не нашли то выдеялем первый элемент\n item = me.recordsList.find('.item:visible:first');\n isGroup = false;\n }\n }\n else { // при нажатии вверх выделяем последний видимый элемент\n item = me.recordsList.find('.item:visible:last');\n isGroup = false;\n if (item.length == 0) { // если элемент не нашли, выделяем заголовок последней свернутой группы\n item = me.recordsList.find('.hiddengroup:last');\n isGroup = true;\n }\n }\n // если нажали вниз и нет выделенного элемента, то переходим к самому первому\n me.recordsList.scrollTop(down ? 0 : 1000000); //REVIEW зачем? - для перемещения скрола в конец или начало списка\n isGroup ? me.HoverGroup(item) : me.HoverItem(item);\n }\n }\n },\n\n upDownKeyNavigation: function (down) {\n var me = this;\n var currentItem = me.recordsList.find('div.item.over:visible,div.recordGroup.groupOver:visible');\n if (currentItem.length) {\n // от текущего элемента делаем поиск в 3-х направлениях: в дочерних элементах, в следующих элементах на уровень выше и в элементах того же уровня\n var nextItem;\n if (down) {\n nextItem = currentItem.find('.item:visible:first,.recordGroup:visible:first').first();\n if (nextItem.length == 0) { // если не нашли внизу\n nextItem = me.findSiblingOrParent(currentItem, down);\n }\n if (nextItem.html() == currentItem.parent().html()) {\n nextItem = currentItem;\n }\n }\n else {\n nextItem = me.findSiblingOrParent(currentItem, down);\n }\n if (nextItem.length) {\n currentItem.hasClass('item') ? me.UnhoverItem(currentItem) : me.UnhoverGroup(currentItem);\n nextItem.hasClass('item') ? me.HoverItem(nextItem) : me.HoverGroup(nextItem);\n me.scrollListToHoveredItem(nextItem, down);\n }\n }\n else {\n if (down) {\n var item = me.recordsList.find('.item:visible:first,.recordGroup:visible:first').first();\n item.hasClass('item') ? me.HoverItem(item) : me.HoverGroup(item);\n me.recordsList.scrollTop(0);\n }\n else {\n var item = me.recordsList.find('.item:visible:last,.recordGroup:visible:last').last();\n item.hasClass('item') ? me.HoverItem(item) : me.HoverGroup(item);\n me.recordsList.scrollTop(100000);\n }\n }\n },\n\n findSiblingOrParent: function (item, down) {\n var nextItem;\n if (down) {\n nextItem = item.next('div:visible:first'); // ищем след элемент на этом же уровне\n if (nextItem.length == 0) { // если не нашли\n if (!item.parent('#recordsList').length) { // и если родительский элемент это не все дерево, и значит есть куда подниматься выше\n nextItem = this.findSiblingOrParent(item.parents('div:visible:first'), down); // ищем сиблингов у родителя или его родителей\n }\n else {\n nextItem = item;\n }\n }\n }\n else { // движение вверх\n nextItem = item.prev('div:visible:first'); // ищем сперва сиблинга\n var sibling = true;\n if (nextItem.length == 0) { // если его не нашли и родительский элемент не само дерево, и значит есть куда подниматься выше\n if (!item.parent('#recordsList').length) {\n nextItem = item.parents('div:visible:first'); // то берем родителя\n sibling = false;\n if (nextItem.length == 0) { // если его не нашли, то пытаемся найти сиблинга родителя или его родителей\n nextItem = this.findSiblingOrParent(item.parents('div:visible:first'), down);\n }\n }\n else { // если родитель - это все дерево, то мы на крайнем элементе и никуда не двигаемся\n nextItem = item;\n sibling = false;\n }\n }\n if (sibling) { // если нашли сиблинга, то проверяем наличие дочерних узлов и переходим к ним\n var subItem = nextItem.find('.item:visible:last,.recordGroup:visible:last').last();\n if (subItem.length) {\n nextItem = subItem;\n }\n }\n }\n if (nextItem.length && !nextItem.hasClass('item') && !nextItem.hasClass('recordGroup')) {\n nextItem = item;\n }\n return nextItem;\n },\n\n scrollListToHoveredItem: function (item, down) {\n var me = this;\n if (me.getItemsListHeight() > me.recordsList.height()) {\n var itemHeight = 20;\n var height = 0;\n var currentID = item.attr('id');\n var items = me.recordsList.find('div.item:visible,div.recordGroup:visible');\n\n if (down) {\n for (var i = items.length - 1; i >= 0; i--) {\n if ($(items[i]).attr('id') == currentID) {\n height += (i + 1) * itemHeight;\n break;\n }\n }\n if (me.recordsList.height() - height < 50) {\n me.recordsList.scrollTop(me.recordsList.scrollTop() + itemHeight);\n }\n }\n else {\n for (var i = 0; i < items.length; i++) {\n if ($(items[i]).attr('id') == currentID) {\n height += (i + 1) * itemHeight;\n break;\n }\n }\n if (height - me.recordsList.scrollTop() < 50) {\n me.recordsList.scrollTop(me.recordsList.scrollTop() - itemHeight);\n }\n }\n }\n },\n\n getItemsListHeight: function () {\n var height = 0;\n var items = this.recordsList.children();\n for (var i = 0; i < items.length; i++) {\n height += $(items[i]).height();\n }\n return height;\n },\n\n // Получает следующий элемент для выделения при навигации стрелочками\n GetNextItemToSelect: function (currentItem, down) {\n var me = this;\n var nextItem;\n var isGroup = false;\n if (currentItem.hasClass('item')) {\n nextItem = down ? currentItem.next('.item:visible') : currentItem.prev('.item:visible');\n if (nextItem.length == 0) { // если не нашлись записи то переводим курсор на группу\n nextItem = down ? currentItem.parent('.recordGroup').next() : currentItem.parent('.recordGroup');\n isGroup = true;\n }\n }\n else {\n // здесь nextItem - это группа\n nextItem = down ? currentItem.children('.item:visible:first') : currentItem.prev().children('.item:visible:last');\n if (nextItem.length == 0) { // если не нашлись записи то переводим курсор на группу\n nextItem = down ? currentItem.next() : currentItem.prev();\n isGroup = true;\n }\n }\n return { NextItem: nextItem, IsGroup: isGroup };\n },\n\n ScrollListToHoveredItem: function (currentItem, down) {\n var me = this;\n if (down) {\n if (Math.abs(currentItem.position().top - me.recordsList.height()) < 55) { //REVIEW что за магические числа? - вычисленные экспериментальным путем\n var scroll = me.recordsList.scrollTop();\n me.recordsList.scrollTop(scroll + currentItem.height());\n }\n }\n else {\n if (Math.abs(currentItem.position().top) < 104) { //REVIEW что за магические числа?\n var scroll = me.recordsList.scrollTop();\n me.recordsList.scrollTop(scroll - currentItem.height());\n }\n }\n },\n\n RightArrowKeyPress: function () {\n var me = this;\n var title = me.recordsList.find('.groupOver');\n // пустые или группы со скрытой структурой не открываем\n if (title.length > 0 && !title.hasClass('emptyGroup')) {\n me.HoverGroup(title);\n me.ShowRecordsGroup(title.children(':first'));\n }\n },\n\n LeftArrowKeyPress: function () {\n var me = this;\n var title = me.recordsList.find('.item.over,.recordGroup.groupOver').parent(':not(#recordsList)');\n if (!title.length) { title = me.recordsList.find('.groupOver'); }\n if (title.length) {\n me.HoverGroup(title);\n me.HideRecordsGroup(title.children(':first'));\n me.ScrollListToHoveredItem(title.children(':first'), true);\n }\n },\n\n DeleteKeyPress: function () {\n var me = this;\n var idToRemove = me.recordsList.find('.item.over').attr('id');\n if (idToRemove) {\n var rowDeleteButton = me.selectedRecordsTable.find('tr[id=' + idToRemove + ']').find('.removeFromSelect');\n me.DeleteItemFromSelection(rowDeleteButton);\n }\n },\n\n ShowHideRecordsGroup: function (groupTitle) {\n groupTitle = $(groupTitle);\n var gr = groupTitle.parent();\n // Группы которые нельзя раскрывать, не расскрываем.\n if (!gr.hasClass('emptyGroup')) {\n if (groupTitle.parent().hasClass('hiddengroup')) {\n this.ShowRecordsGroup(groupTitle);\n }\n else {\n this.HideRecordsGroup(groupTitle);\n };\n this._InitScrollForTouchScreens();\n };\n },\n\n ShowRecordsGroup: function (groupTitle) {\n var me = this;\n groupTitle.parent().removeClass('hiddengroup');\n groupTitle.children().first().removeClass('closedgroup').addClass('openedgroup');\n if (me.treeMode) {\n if (groupTitle.siblings().length == 0) {\n groupTitle.parent().append($('

    '));\n me.requestTree(groupTitle.parent(), \"\");\n }\n } else {\n var grEl = groupTitle.parent();\n var groupcode = grEl.attr('compcode');\n var group = me.dataObject.groups[groupcode];\n // Загружаем, если еще не загружали.\n if (!group.isLoaded) {\n if (grEl.find('.waiting').length == 0) {\n grEl.append($('

    '));\n };\n me.sendRequest('', groupcode, function () {\n // Построим элементы группы.\n groupTitle.siblings('.waiting').remove();\n grEl.append(me.buildItemsList(groupcode, group));\n me._InitRecordsListEvents(grEl, true);\n me.MarkSelectedRecordsInList();\n }, function () {\n // Покажем сообщение об ошибке.\n groupTitle.siblings('.waiting').remove();\n grEl.append(me.buildItemsList(groupcode, group));\n });\n }\n };\n },\n\n HideRecordsGroup: function (groupTitle) {\n groupTitle.parent().addClass('hiddengroup');\n groupTitle.find('.openedgroup').removeClass('openedgroup').addClass('closedgroup');\n },\n\n MakeFilterRequest: function () {\n var me = this;;\n if (me.filterInput) {\n // Таймаут - что бы сократить количество обращений к серверу\n if (me._filterTimeout) clearTimeout(me._filterTimeout);\n me._filterTimeout = setTimeout(function () {\n var changedValue = me._CheckFilterValue();\n if (changedValue !== false) {\n me.getData(changedValue, function () {\n // Success\n me.fillItemsList();\n me._InitRecordsListEvents();\n });\n }\n }, 400);\n }\n },\n\n _CheckFilterValue: function () {\n var me = this;\n var currentValue;\n currentValue = $.trim(me.filterInput.val());\n var whiteSpaceCheck = currentValue.replace(/ /g, \"\"); // убираем все пробелы в строке из поля ввода для проверки на строку из пробелов.\n if (currentValue !== me.lastFilterValue) {\n if (whiteSpaceCheck !== \"\") {\n return currentValue;\n } else {\n return \"\";\n };\n } else {\n return false;\n };\n },\n\n SelectItem: function (item) {\n var me = this, rs = me.rsInstance;\n // Если только для чтения запрещаем выбирать.\n if (!rs.isReadonly()) {\n item = $(item);\n var id = item.attr('id');\n if (typeof id === 'undefined') return;\n var groupcode;\n if (me.treeMode) {\n groupcode = item.data('groupcode');\n } else {\n groupcode = me.dataObject.groups.length > 1 ? item.parents('.recordGroup').first().attr('compcode') : me.rsInstance.getFirstRefCode();\n }\n var name = item.find('> span div').text();\n var newItem = { groupcode: groupcode, id: id, name: '' + name };\n\n me._addItemCollectionToSelectedTable([newItem]);\n\n me.fire(\"OnSelectedItem\", newItem);\n }\n },\n\n // Добавляет новые строки в таблицу выбранных и помечает галочкой в дереве.\n _addItemCollectionToSelectedTable: function (items) {\n var me = this;\n var html = \"\";\n for (var i = 0; i < items.length; i++) {\n if (me.findSelectedItemById(items[i].id) !== -1) continue;\n html += me.buildSelectedItemsTableRow(items[i]);\n me.dataObject.selectedItems.push(items[i]);\n me.MarkRecord(items[i].id, true);\n }\n if (html != \"\") {\n me.selectedRecordsTable.find('td.dataTables_empty').parent().remove();\n me.selectedRecordsTable.append(html);\n me.selectedRecordsTable.find('tr').each(function () { me._InitSingleSelectedRecordEvents(this); });\n me._fixSelectedItemsTableBorder();\n me.selectedRecordsTable.parent().scrollTop(1000000);\n }\n },\n\n // Заменяет добавленный элемент на другие.\n replaceSelectedItem: function (oldId, newItems) {\n var me = this, rs = me.rsInstance;\n // Если только для чтения, запрещаем заменять выбранные записи.\n if (!rs.isReadonly()) {\n // Удаляем элемент по ИД.\n me.DeleteItemFromSelection(me.selectedRecordsTable.find('tr[id=\"' + oldId.id + '\"]').find('p.removeFromSelect'));\n // Добавляем новые элементы в таблицу.\n me._addItemCollectionToSelectedTable(newItems);\n }\n },\n\n DeleteItemFromSelection: function (item) {\n var me = this, rs = me.rsInstance;\n // Если только для чтения, запрещаем удалять выбранные записи.\n if (!rs.isReadonly()) {\n var row = $(item).parent().parent();\n var id = row.attr('id');\n\n var idx = me.findSelectedItemById(id);\n if (idx !== -1) {\n me.dataObject.selectedItems.splice(idx, 1);\n };\n\n row.remove();\n me.MarkRecord(id, false);\n me._fixSelectedItemsTableBorder();\n me.checkEmptyTable();\n }\n },\n\n HoverGroup: function (group) {\n this.UnhoverGroup(this.recordsList.find('.groupOver'));\n $(group).addClass('groupOver');\n this.UnhoverItem(this.recordsList.find('.over'));\n },\n\n UnhoverGroup: function (group) {\n $(group).removeClass('groupOver').addClass('fake');\n },\n\n HoverItem: function (item) {\n var me = this;\n me.UnhoverItem(this.recordsList.find('.over'));\n me.UnhoverGroup(this.recordsList.find('.groupOver'));\n $(item).addClass('over').find('.treeview_img_action').css('visibility', 'visible');\n },\n\n UnhoverItem: function (item) {\n $(item).removeClass('over').find('.treeview_img_action').css('visibility', 'hidden');\n },\n\n MarkSelectedRecordsInList: function () {\n var me = this,\n selItems = me.dataObject.selectedItems;\n for (var i = 0, len = selItems.length; i < len; i++) {\n me.MarkRecord(selItems[i].id, true);\n }\n },\n\n MarkRecord: function (id, mark) {\n if (id) {\n var item = this.recordsList.find('.item[id=' + id + '],.recordGroup[id=' + id + ']');\n var icon = item.find('p.ico');\n var isGroup = item.hasClass('recordGroup');\n var iconClass;\n var favoritesItem;\n if (this.treeMode) {\n favoritesItem = this.recordsList.find('#0').children('#' + id);\n if (item.hasClass('favorite')) { // если есть в избранных\n iconClass = isGroup ? this.favoriteUserGroupIconClass : this.favoriteUserIconClass;\n }\n else {\n iconClass = isGroup ? this.treeModeGroupIconClass : this.treeModeRecordIconClass;\n }\n //если группа избранное\n if (item.find('div[title=\"Favorites\"]').length > 0) {\n iconClass = this.favoriteUserGroupIconClass;\n }\n }\n else {\n iconClass = this.defaultRecordIconClass;\n }\n var markedIconClass = this.treeMode ? (isGroup ? this.treeModeMarkedGroupIconClass : this.treeModeMarkedRecordIconClass) : this.defaultMarkedRecordIconClass;\n if (mark) {\n item.addClass('selected');\n if (this.treeMode) { icon.removeClass(this.treeModeRecordIconClass).removeClass(this.favoriteUserIconClass); }\n icon.removeClass(iconClass).addClass(markedIconClass);\n }\n else {\n item.removeClass('selected');\n icon.removeClass(markedIconClass).addClass(iconClass);\n // в группе избранное иконки со звездочкой заменяем на обычные. значение iconClass определяется выше в if(this.treeMode)\n if (this.treeMode) {\n favoritesItem.find('p.ico').removeClass(iconClass).addClass(isGroup ? this.treeModeGroupIconClass : this.treeModeRecordIconClass);\n }\n }\n }\n },\n\n // Добавлем бордер к div в которой находится таблица.\n _fixSelectedItemsTableBorder: function () {\n var me = this;\n var p = me.selectedRecordsTable.parent();\n if (me.selectedRecordsTable.height() > p.height()) {\n p.addClass('fixBorderBottom');\n } else {\n p.removeClass('fixBorderBottom');\n };\n },\n\n _adjustModalWindowIfSmallScreen: function () {\n var me = this;\n if ($(window).width() < 1000) {\n me.recordsList.parents('[role=dialog]').css('left', 50).css('top', 200);\n $(window).scrollLeft(0);\n }\n },\n\n _disableRefSelectInputIfAndroid: function () {\n if (WA.ENV.isAndroid()) {\n this.rsInstance.inp.attr('disabled', true);\n $('.fakeInput').attr('disabled', true);\n }\n },\n\n checkEmptyTable: function () {\n var rows = this.selectedRecordsTable.children('tbody').find('tr');\n if (rows.length == 0) {\n var emptyRow = $('' + L('EMPTY') + '');\n this.selectedRecordsTable.append(emptyRow);\n this._InitSingleSelectedRecordEvents(emptyRow);\n }\n }\n\n };\n\n $.fn.extend({\n MultiSelectModalWindow: function (opt) {\n this.data('MultiSelectModalWindowInstance', new MultiSelectModalWindow(this, opt));\n return this;\n },\n ShowMultiSelectModalWindow: function () {\n var ms = this.data('MultiSelectModalWindowInstance');\n if (ms) ms.show();\n return this;\n }\n });\n})(jQuery);\n\n// Оставлено для примера. не удалять!\n//var data = {\n// groups:\n// {\n// length: 2,\n// 'ПОЛ': {\n// groupname: \"Пользователи\",\n// isLoaded: true,\n// items: [\n// { id: \"1\", name: \"Пупкин Андрей Борисович 1\" },\n// { id: \"2\", name: \"Пупкин Андрей Борисович 2\" },\n// { id: \"3\", name: \"Пупкин Андрей Борисович 3\" }\n// ]\n// },\n// \"ГПЛ\": {\n// groupname: \"Группы пользователей\",\n// isLoaded: true,\n// items: [\n// { id: \"100\", name: \"Группа 1\" },\n// { id: \"101\", name: \"Группа 2\" },\n// { id: \"102\", name: \"Группа 3\"}//,\n// //{ groupname: \"Бухгалтерия\", compcode: \"ПОЛ\", items: [{ id: \"1\", name: \"Пупкин Андрей Борисович 1\" }, { id: \"4\", name: \"Бухгалтер 1\" }, { id: \"5\", name: \"Бухгалтер 2\"}] }\n// ]\n// }\n// },\n// selectedItems:\n// [\n// { groupcode: \"ПОЛ\", id: \"111\", name: \"Пупкин Андрей Борисович\" },\n// { groupcode: \"ПОЛ\", id: \"112\", name: \"Иванов Иван Иванович\" },\n// { groupcode: \"ПОЛ\", id: \"113\", name: \"Петров Петр Петрович\" }\n// ]\n//};\n","// Команды CardForm.\nvar c_CardFormCmd_AddDetailItem = 1;\nvar c_CardFormCmd_DeleteDetailItem = 2;\n\n(function () {\n var startMonitoringTime = $.now();\n\n window.CardForm = function () {\n if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') {\n log.warn('DEFAULT','Cardform is marked as deprecated since WebAccess 5.0.0.7100 version, use WebAccess.current.form instead');\n }\n WA.include('/js/cardform.js');\n window.CardForm = CardForm;\n if (typeof (window.formData) !== 'undefined') CardForm().init(formData);\n\n var someWait = $.Deferred();\n setTimeout(function () { someWait.resolve(); }, 200);\n $.when(WA.FormInit, WA.FormControlsInit, someWait).done(function () {\n $('html').trigger('CardFormInit');\n });\n return window.CardForm();\n };\n\n var CardFormInitMonitor = function () {\n // Максимум мониторим 3 сек.\n if ($.now() - startMonitoringTime > 3000) return;\n // Проверяем навесился ли кто-то на CardFormInit, если да, то инициализируем CardForm.\n if (typeof (jQuery.event.global['CardFormInit']) !== 'undefined' && typeof (window.formData) !== 'undefined') {\n window.CardForm();\n } else {\n setTimeout(CardFormInitMonitor, 100);\n }\n };\n CardFormInitMonitor();\n\n})();\n","(function (j, global) {\n\n // Селекторы для объектов Aspose.\n var asposeSelectors = {\n comments: 'div[id^=_cmnt]',\n commentAnchors: 'a[href^=#_cmnt]',\n commentArea: 'a[name^=_cmntref]'\n };\n\n // Селекторы для объектов.\n var wordDocumentSelector = {\n comments: '.msocomtxt',\n commentAnchors: '.msocomanchor',\n commentArea: '.comment-area',\n insertedText: 'ins',\n deletedText: 'del'\n };\n\n /**\n * Иницииализация предпросмотра.\n */\n $(window).load(function () {\n // У мобильной версии есть свои нюансы работы.\n if (WAforPDA()) {\n $(\"#previewTools\").on(\"click\", function () {\n $(\"#toolsBox\").toggle();\n });\n\n var url = new WA.URL();\n\n if (url.getParam('Parent').toLowerCase() === 'explorer' && url.getParam('view').toLowerCase() === 'preview') setFullScreenInPda();\n $(\"#fullScreenToogle\").parent().insertAfter(\"#versionSelect\");\n\n // Делаем чтобы выбор версии работал и в мобильном ВД\n $(\"#versionSelect select\").on(\"change\", function () {\n jQuery.npocomputer.modules.previewdoc.selectVersion($(this).val());\n\n autoResizeFrame(\"#contentContainer\");\n });\n\n // Чтобы выбор масштаба работал в мобильном ВД\n $(\".set-scale select\").on(\"change\", function () {\n var scale = $(this).val();\n jQuery.npocomputer.modules.previewdoc.setScale(scale);\n WA.SRV.session.setPreviewScale(scale);\n autoResizeFrame(\"#contentContainer\");\n });\n\n\n // Тогда, когда excel документ полностью загружен, надо его отмасштабировать\n if (isExcelDocument(getObjectDataType())) {\n $(\"#contentContainer\").load(function () {\n getjSheetFrame().ready(function () {\n $('#contentContainer').css({ \"min-width\": getSheetSize()[0] + \"px\", \"min-height\": getSheetSize()[1] + \"px\" });\n });\n });\n };\n\n // Пагинатору надо бы быть пониже.\n $(\"#paginator\").insertAfter(\"#toolsBox\");\n };\n });\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Смена масштаба при выборе значения в pick реквизите\n */\n global.onPickChangeScale = function (scale) {\n jQuery.npocomputer.modules.previewdoc.setScale(scale);\n WA.SRV.session.setPreviewScale(scale);\n };\n\n\n /**\n * При нажатии на кнопку во весь экран, прячем картчку, показываем доп-тулбар.\n * @function setFullScreenInPda\n */\n function setFullScreenInPda() {\n $(\".ribbon, .ViewName, .header, #toolsBox\").toggle();\n $(\"#fullScreenToogle\")\n .toggleClass(\"Pda/fullSize.png\")\n .toggleClass(\"Pda/originalSize.png\");\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Проверка того, что данный документ - excel документ\n * @return {boolean}\n * @function isExcelDocument\n */\n function isExcelDocument(extension) {\n var exts = ['XLS', 'XLSX', 'ODS'];\n return _.indexOf(exts, extension) > -1;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n* Проверка того, что данный документ - word документ\n* @return {boolean}\n* @function isWordDocument\n*/\n function isWordDocument(extension) {\n var wordExts = ['DOC', 'DOCX', 'RTF', 'ODT'];\n\n return _.indexOf(wordExts, extension) > -1;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение фрейма с excel таблицей\n */\n function getjSheetFrame() {\n var jMainFrame = $(\"#contentContainer\").contents();\n var jInnerFrame = $(jMainFrame.find('frameset').find('frame[name=\"frSheet\"]')[0].contentDocument);\n return jInnerFrame;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получить тип объекта.\n */\n function getObjectDataType() {\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n return context.objectsData[context.selectedObj.id].dataType;\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n\n /**\n * Находимся ли мы в мобильном ВД\n * @function WAforPDA\n * @private\n * @return {boolean}\n */\n var WAforPDA = function () {\n return ($(\"html.mobile\").length > 0);\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Получение размера excel таблицы\n * В главном iframe ищется frame с таблицей, а\n * внтри него берутся рамеры непосредственно саммой таблицы и блока со\n * ссылками\n * @inner\n * @function getSheetSize\n * @return {Array}\n */\n var getSheetSize = function () {\n var jBody = getjSheetFrame().find('body');\n var jSheet = jBody.find(\"table\");\n var jFooter = jBody.find(\"div\");\n return [jSheet.width(), jSheet.height() + jFooter.height()];\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n /**\n * Изменение размера iframe под размер содержимого.\n * @global\n * @param {string|object} DOM-элемент или jquery-селектор\n * @function autoResizeFrame\n */\n global.autoResizeFrame = function (elem) {\n if (!WAforPDA()) return;\n var newHeight = $(elem).get(0).contentWindow.document.body.scrollHeight;\n $(elem).css({ \"height\": newHeight, \"overflow\": \"hidden\" });\n };\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n if (typeof j.npocomputer === 'undefined') j.npocomputer = {};\n if (typeof j.npocomputer.modules === 'undefined') j.npocomputer.modules = {};\n\n var isActiveBtn = function (btn) {\n return !btn.hasClass(\"btn-disabled\");\n };\n\n var isTurnOnBtn = function (btn) {\n return btn.hasClass(\"selected\");\n };\n\n var disableScreen = function (disable) {\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n var container = j(\"#\" + context.wrapperId);\n var modal = container.prev('.npocomputer-previewdoc-modal');\n modal\n .height(container.height())\n .width(container.width());\n if (disable) {\n modal.show();\n } else {\n modal.hide();\n }\n };\n\n /**\n * Смена страницы у документа\n * @function changePage\n */\n var changePage = function (pageNumber, actionFromPage, hadlerParams) {\n var format = \"{0}/{1}/{2}/\";\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n\n if (pageNumber > context.convertedObj.pageCount)\n pageNumber = context.convertedObj.pageCount;\n\n if (pageNumber < 1)\n pageNumber = 1;\n\n context.selectedObj.pageNumber = pageNumber;\n\n var frame = j(\"#\" + context.wrapperId + \" #\" + context.frameId);\n\n // Для Excel установим фон, т.к. в его css фон прозрачный, а не белый.\n if (isExcelDocument(getObjectDataType())) {\n frame.css({ 'background-color': '#fff' });\n }\n\n frame.attr(\"src\", format.replace(\"{0}\", context.previewHandlerUrl).replace(\"{1}\", context.convertedObj.id).replace(\"{2}\", pageNumber) + (hadlerParams != '' ? \"?\" + hadlerParams : ''))\n .off('load')\n .on('load', function () {\n var contents = frame.contents();\n\n var styleLink = ('');\n contents.find('head').append(styleLink);\n\n if (context.convertedObj.isImage) {\n var img = contents.find('img');\n if (img.attr('initWidth') == null) {\n img.attr('initWidth', img.width());\n }\n if (img.attr('initHeight') == null) {\n img.attr('initHeight', img.height());\n }\n img.addClass('previewImage');\n }\n\n if (!WAforPDA()) {\n // Если отображается документ Word, то добавить классы для корректного отображения комментариев.\n if (isWordDocument(getObjectDataType())) {\n // Добавить классы к комментариям.\n contents.find(asposeSelectors.comments).addClass('msocomtxt');\n contents.find(asposeSelectors.commentAnchors).addClass('msocomanchor');\n contents.find(asposeSelectors.commentArea).addClass('comment-area');\n\n // Переместить комментарии в отдельный контейнер.\n var comments = contents.find(wordDocumentSelector.comments);\n if (comments.length > 0) {\n var commentsColumn = j('
    ');\n contents.find('body').append(commentsColumn);\n comments.appendTo(commentsColumn);\n\n // Заменим инициалы в примечаниях на полное имя.\n comments.each(function (index, el) {\n var infoStr = $(el).attr('style');\n if (infoStr) {\n try {\n var info = infoStr.split(';');\n for (var i = 0; i < info.length; i++) {\n var params = info[i].split(':');\n if (params[0] === '-aw-comment-author') {\n $(el).find(wordDocumentSelector.commentAnchors).html(params[1].replaceAll(\"'\", \"\") + '
    ');\n }\n }\n } catch (e) {\n // Если не удалось распарсить дополнительную информацию, то ничего не делаем,\n // в примечании останутся инициалы.\n }\n }\n });\n }\n\n // Добавить класс к основному тексту.\n contents.find('body > div')\n .not('.comments-container')\n .each(function (i, el) {\n j(el).addClass('WordSection' + i);\n });\n // HACK: Исправим ссылки в odt. Для ссылок задается тег span с inline-стилями.\n if (getObjectDataType() === 'ODT') {\n contents.find('a')\n .css('text-decoration', 'underline')\n .find('span')\n .css('color', '');\n }\n }\n\n Core.preview.scrolling.init(context);\n Core.preview.resizeTextDocuments(context);\n Core.preview.fixHttpLinks(context);\n };\n\n var wrapper = j('#' + context.wrapperId);\n\n // restore settings for image.\n var scale = wrapper.find('.set-scale');\n var scaleVal;\n if (!WAforPDA()) {\n scaleVal = scale.data('scale') || Core.preview.info.selectedObj.scale;\n } else {\n if ($('.fit-to-width').hasClass('selected')) scaleVal = 'w';\n else if ($('.fit-to-height').hasClass('selected')) scaleVal = 'h';\n else scaleVal = scale.find('input.pickFieldHidden').val();\n };\n\n frameLoad(frame);\n j.npocomputer.modules.previewdoc.setScale(scaleVal);\n if (!WAforPDA()) {\n Core.preview.scrolling.loadNeighbors(1);\n };\n\n // #94073\n if (WA.ENV.device && WA.ENV.device.model && WA.ENV.device.model.toLowerCase() === 'ipad') {\n setTimeout(function () { fitTo(context.selectedObj.scale); }, 300);\n } else {\n fitTo(context.selectedObj.scale);\n }\n });\n\n //Шамов А.: Для мобильной версии можно расширить iframe по его содержимому для включения глобальной прокрутки.\n j('#' + context.wrapperId + ' .page-number-field').val(pageNumber);\n };\n\n var printDocFromPreview = function () {\n setTimeout(function () {\n var iframeContent = $(\"#contentContainer\").get(0).contentWindow;\n iframeContent.focus();\n iframeContent.print();\n }, 100);\n };\n\n var setFrameHeight = function (context) {\n var wrapper = j(\"#\" + context.wrapperId);\n var currFrame = wrapper.find('#' + context.frameId);\n };\n\n var frameLoad = function (frame) {\n var docBody = frame.contents().find('body');\n if (!docBody.length && frame[0].contentWindow.frames[\"frSheet\"] != null) {\n docBody = $(frame[0].contentWindow.frames[\"frSheet\"].document).find('body');\n };\n\n /**\n * Скрываем раскрытые списки pick реквизитов, при нажатии на фрэйм.\n * @see замечание 76935\n */\n docBody.on(\"click\", function () {\n $('.rs_container').hide();\n });\n\n docBody.find('a').each(function (index) {\n var _this = $(this);\n var href = _this.attr(\"href\");\n if (href != null && href != '' && !href.match(\"^#\")) { //&& !href.match(\"^\" + curLocation)\n _this.attr(\"target\", \"_blank\");\n }\n });\n\n // set frame styles.\n var frameBody = frame.contents().find('body');\n\n var padding = '0 10px';\n if (frameBody.children('img').length > 0) {\n padding = 0;\n frameBody.addClass('previewImageContainer');\n }\n frameBody.css({ 'margin': 0, 'padding': padding });\n\n frame.addClass('previewContent_shown');\n\n if ($.scrollActive || WA.ENV.isAndroid()) {\n if (!WAforPDA()) {\n CreatePreviewScrollForiPad();\n AttachHandlersToTabs();\n };\n }\n };\n\n\n var initSelectedVersion = function () {\n var context = j.npocomputer.modules.previewdoc.context;\n if (!context && Core.preview) { context = Core.preview.info; }\n\n if (!context) return;\n var wrapper = j(\"#\" + context.wrapperId);\n\n if (WAforPDA()) {\n var wrapper = j(\"#\" + context.wrapperId);\n var jScale = wrapper.find(\".set-scale\");\n var jScaleInput = jScale.find(\"select\");\n jQuery.npocomputer.modules.previewdoc.setScale(jScaleInput.val());\n };\n\n if (context.errorMessage == '') {\n changePage(context.selectedObj.pageNumber);\n }\n\n wrapper.find(\".page-count\").text(\"/ \" + context.convertedObj.pageCount);\n\n if (context.convertedObj.pageCount <= 1) {\n wrapper.find(\".page-next-btn\").parent().hide();\n $(\"#paginator\").hide();\n } else {\n wrapper.find(\".page-next-btn\").parent().show();\n $(\"#paginator\").show();\n }\n\n var setScaleIcon = wrapper.find(\"#scale\");\n if (context.convertedObj.isImage) {\n\n // TODO: disabling allow-copy-text icon\n wrapper.find(\".fit-to-width\").show();\n wrapper.find(\".fit-to-height\").show();\n wrapper.find(\".fit-to-window\").show();\n wrapper.find(\".rotate-CW\").show();\n wrapper.find(\".rotate-CCW\").show();\n setScaleIcon.show();\n } else {\n wrapper.find(\".fit-to-width\").hide();\n wrapper.find(\".fit-to-height\").hide();\n wrapper.find(\".fit-to-window\").hide();\n wrapper.find(\".rotate-CW\").hide();\n wrapper.find(\".rotate-CCW\").hide();\n setScaleIcon.hide();\n }\n\n // Кнопки для управления режимом исправления и показа примечаний в Word\n if (isWordDocument(getObjectDataType())) {\n wrapper.find('.enable-change-track').show();\n wrapper.find('.enable-comments').show();\n // Проверяем, не было ли отключено отображение исправлений\n if (!$(\"div.enable-change-track\").hasClass('selected')) {\n var frame = wrapper.find(\"#\" + context.frameId);\n $(frame).load(function () {\n $.npocomputer.modules.previewdoc.disableTrackChanges();\n });\n }\n // Проверяем, не был ли отключен показ примечаний\n if (!$(\"div.enable-comments\").hasClass('selected')) {\n var frame = wrapper.find(\"#\" + context.frameId);\n $(frame).load(function () {\n setTimeout(function () {\n $.npocomputer.modules.previewdoc.disableComments();\n }, 100);\n });\n }\n } else {\n wrapper.find('.enable-change-track').hide();\n wrapper.find('.enable-comments').hide();\n }\n };\n\n $(window).bind('orientationchange', function (event) {\n initSelectedVersion();\n });\n\n\n /**\n * Смена масштаба изображения.\n * На мобильных вместо pick-виджета обычный select\n * @see Замечание №76866\n * @function fitTo\n * @param {string} type ['10','20',...,'100', 'w','h']\n * @global\n */\n var fitTo = function (type) {\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n\n ////не меняем масштабы если открыт word-вый документ\n\n if (!WA.isMobile() && Core.preview.isTextDocument(getObjectDataType())) return;\n\n var wrapper = j(\"#\" + context.wrapperId);\n var frame = wrapper.find(\"#\" + context.frameId);\n var img = frame.contents().find('img');\n var fitWidth = wrapper.find(\".fit-to-width\");\n var fitHeight = wrapper.find(\".fit-to-height\");\n var fitWindow = wrapper.find(\".fit-to-window\");\n // для айпада подменяем объект фрейма на его обертку, чтобы размеры для картинок считались правильные. потому что фрейм растягивается\n if (!WAforPDA() && WA.ENV.os.name.toLowerCase() == 'ios') {\n frame = $('.iosOverflow');\n frame.height($(window).height() - 160);\n }\n\n var fitToHeight = function () {\n img.width('auto');\n if (!WAforPDA()) {\n if (img.hasClass('E') || img.hasClass('W')) {\n img.width($(frame).height());\n img.height('auto');\n }\n else img.height('100%');\n } else {\n img.add($(frame)).height($(window).height() - $(\"iframe\").offset().top);\n };\n\n if ($.scrollActive || WA.ENV.isAndroid()) {\n if (!WAforPDA()) RefreshScrollInIFrame();\n }\n };\n var fitToWidth = function () {\n img.height('auto');\n img.width('100%');\n //почему-то ipad не любит 100%, и иногда игнорит её.\n if ($.ipad) img.width($(\".npocomputer-previewdoc\").width());\n\n if ($.scrollActive || WA.ENV.isAndroid()) {\n if (!WAforPDA()) RefreshScrollInIFrame();\n }\n };\n\n if (type == \"h\" || type == \"w\" || type == '100' || type == 'a') {\n context.selectedObj.scale = type;\n var jScale = wrapper.find(\".set-scale\");\n var jScaleInput = WAforPDA() ? jScale.find(\"select\") : jScale.find(\"input.pickField\");\n if (type == '100') {\n if (!WAforPDA()) {\n jScaleInput.val(type + \"%\");\n } else {\n jScaleInput.val(type);\n }\n } else {\n if (!WAforPDA()) {\n jScaleInput.val((type == \"h\") ? context.scaleHeightText : ((type == \"w\") ? context.scaleWidthText : context.scaleWindowText));\n } else {\n jScaleInput.val(type);\n };\n }\n if (!WAforPDA()) jScaleInput.find(\"input.pickFieldHidden\").val(type);\n else jScale.data(\"scale\", type);\n }\n\n if (WAforPDA()) {\n var jScale = wrapper.find(\".set-scale\");\n var jScaleInput = WAforPDA() ? jScale.find(\"select\") : jScale.find(\"input.pickField\");\n jScale.data(\"scale\", type);\n };\n\n if (type == \"h\") {\n fitToHeight();\n\n fitWidth.removeClass(\"selected\");\n fitHeight.addClass(\"selected\");\n fitWindow.removeClass(\"selected\");\n } else if (type == \"w\") {\n fitToWidth();\n\n fitWidth.addClass(\"selected\");\n fitHeight.removeClass(\"selected\");\n fitWindow.removeClass(\"selected\");\n } else if (type == 'a') {\n var k = img.height() / img.width();\n var newH = k * img.attr('initWidth');\n if (newH < frame.height()) {\n if (img.parent().hasClass('placeholder')) {\n img\n .height('auto')\n .width('100%');\n } else {\n img\n .height(\"auto\")\n .width(img.attr('initWidth'));\n }\n } else {\n newH = k * frame.width();\n if (newH >= frame.height()) {\n fitToHeight();\n } else {\n fitToWidth();\n }\n }\n\n fitWidth.removeClass(\"selected\");\n fitHeight.removeClass(\"selected\");\n fitWindow.addClass(\"selected\");\n }\n else {\n fitHeight.removeClass(\"selected\");\n fitWidth.removeClass(\"selected\");\n fitWindow.removeClass(\"selected\");\n }\n };\n\n j.npocomputer.modules.previewdoc =\n {\n register: function (context) {\n var me = this;\n j.npocomputer.modules.previewdoc.context = context;\n\n if (context.errorMessage != '') {\n me.showError(context.errorMessage, context.errorType);\n }\n\n var wrapper = j(\"#\" + context.wrapperId);\n\n // PAGER FIELD\n var pageNumberField = wrapper.find(\".page-number-field\");\n pageNumberField.on(\"keypress\", function (event) {\n\n if (event.which == 13) {\n\n var newPageNumber = Number(j(this).val());\n\n if (!WAforPDA()) {\n Core.preview.scrolling.jumpToPage(newPageNumber)\n }\n else {\n changePage(newPageNumber, true);\n }\n event.preventDefault();\n\n }\n\n if (String.fromCharCode(event.which).match(/[^0-9]/g)) event.preventDefault();\n\n });\n pageNumberField.on(\"blur\", function () {\n\n var newPageNumber = Number(j(this).val());\n if (!WAforPDA()) {\n Core.preview.scrolling.jumpToPage(newPageNumber)\n } else {\n changePage(newPageNumber, true);\n }\n });\n\n // PAGER PREV BTN\n wrapper.find(\".page-prev-btn\").on(\"click\", function () {\n\n var currEl = j(this);\n if (isActiveBtn(currEl)) {\n\n var currPageNumber = Number(pageNumberField.val());\n\n if (currPageNumber > 1) {\n currPageNumber--;\n if (!WAforPDA()) {\n Core.preview.scrolling.jumpToPage(currPageNumber)\n } else {\n changePage(currPageNumber, true);\n }\n }\n\n }\n\n return false;\n\n });\n\n // PAGER NEXT BTN\n wrapper.find(\".page-next-btn\").on(\"click\", function () {\n\n var currEl = j(this);\n if (isActiveBtn(currEl)) {\n var currPageNumber = Number(pageNumberField.val());\n\n if (currPageNumber < context.convertedObj.pageCount) {\n currPageNumber++;\n\n if (!WAforPDA()) {\n Core.preview.scrolling.jumpToPage(currPageNumber)\n } else {\n changePage(currPageNumber, true);\n };\n };\n\n };\n\n return false;\n\n });\n\n\n // FIT TO WIDTH BTN\n wrapper.find(\".fit-to-width\").on(\"click\", function () {\n\n var currEl = j(this);\n if (isActiveBtn(currEl)) {\n\n if (isTurnOnBtn(currEl)) {\n j.npocomputer.modules.previewdoc.setScale(\"100\");\n WA.SRV.session.setPreviewScale(\"100\");\n } else {\n j.npocomputer.modules.previewdoc.setScale(\"w\");\n WA.SRV.session.setPreviewScale(\"w\");\n }\n\n }\n\n return false;\n\n });\n\n // FIT TO HEIGHT BTN\n wrapper.find(\".fit-to-height\").on(\"click\", function () {\n\n var currEl = j(this);\n if (isActiveBtn(currEl)) {\n\n if (isTurnOnBtn(currEl)) {\n j.npocomputer.modules.previewdoc.setScale(\"100\");\n WA.SRV.session.setPreviewScale(\"100\");\n } else {\n j.npocomputer.modules.previewdoc.setScale(\"h\");\n WA.SRV.session.setPreviewScale(\"h\");\n }\n\n }\n\n return false;\n\n });\n\n // FIT TO WINDOW BTN\n wrapper.find(\".fit-to-window\").on(\"click\", function () {\n var currEl = j(this);\n if (isActiveBtn(currEl)) {\n if (isTurnOnBtn(currEl)) {\n j.npocomputer.modules.previewdoc.setScale(\"100\");\n WA.SRV.session.setPreviewScale(\"100\");\n } else {\n j.npocomputer.modules.previewdoc.setScale(\"a\");\n WA.SRV.session.setPreviewScale(\"a\");\n }\n }\n return false;\n });\n\n // FIT TO ROTATE CW\n wrapper.find(\".rotate-CW\").on(\"click\", function () {\n if (!WAforPDA()) {\n Core.preview.scrolling.rotateCW();\n } else {\n changePage(context.selectedObj.pageNumber, null, 'Rotate=CW');\n }\n return false;\n });\n\n // FIT TO ROTATE CCW\n wrapper.find(\".rotate-CCW\").on(\"click\", function () {\n if (!WAforPDA()) {\n Core.preview.scrolling.rotateCCW();\n } else {\n changePage(context.selectedObj.pageNumber, null, 'Rotate=CCW');\n }\n return false;\n });\n\n // PRINT FROM PREVIEW\n wrapper.find(\".print-from-preview\").on(\"click\", function () {\n printDocFromPreview();\n return false;\n });\n\n // DISABLE CHANGE TRACKING\n wrapper.find(\".enable-change-track\").on(\"click\", function () {\n me.toggleTrackChanges();\n return false;\n });\n\n // DISABLE WORD COMMENTS\n wrapper.find(\".enable-comments\").on(\"click\", function () {\n me.toggleComments();\n return false;\n });\n\n // CHANGE WINDOW MODE BTN\n wrapper.find(\".change-window-mode\").on(\"click\", function () {\n\n var currEl = j(this);\n /**\n * В MoblieWA ничего не открывается, просто сыкрывается верхнаяя панель .\n */\n if (WAforPDA()) {\n setFullScreenInPda();\n } else {\n if (isActiveBtn(currEl)) {\n var url = context.actionUrl;\n var objData = context.objectsData[context.selectedObj.id];\n\n var concatSymbol = \"&\";\n if (url.indexOf(\"?\") < 0) concatSymbol = \"?\";\n\n if (objData.requestParams != null) {\n for (var i = 0; i < objData.requestParams.length; i++) {\n var param = objData.requestParams[i];\n url = url + concatSymbol + param.Key + \"=\" + param.Value;\n concatSymbol = \"&\";\n }\n }\n\n url = url + concatSymbol + \"previewPageNum=\" + context.selectedObj.pageNumber + \"&previewScale=\" + context.selectedObj.scale + \"&previewAllowCopyText=\" + context.selectedObj.allowCopyText;\n global.location = url;\n }\n }\n\n return false;\n });\n\n // Контекстное меню над документом.\n wrapper.find(\".document-context-menu\").on(\"click\", function (e) {\n var jButton = $(this)\n .attr(\"id\", WA.CR.ID)\n .attr(\"kind\", \"edoc\")\n .addClass('cannot_delete');\n\n var jButtonsPanel = jButton.closest('.preview-panel');\n\n var buttonOffset = jButton.offset();\n var buttonsPanelOffset = jButtonsPanel.offset();\n var buttonsPanelHeight = jButtonsPanel.outerHeight();\n\n window.Core.contextmenu.show(jButton, {}, { 'left': buttonOffset.left, 'top': buttonsPanelOffset.top + buttonsPanelHeight }, false);\n return false;\n });\n\n\n // MODAL\n j('
    ').insertBefore(wrapper);\n\n var currFrame = wrapper.find('#' + context.frameId);\n\n j(currFrame).on('load', function () {\n j.npocomputer.modules.previewdoc.context = context;\n disableScreen(false);\n\n var frameBody = j(currFrame).contents().find('body');\n if (!frameBody.length && currFrame[0].contentWindow.frames[\"frSheet\"] != null) {\n frameBody = $(currFrame[0].contentWindow.frames[\"frSheet\"].document).find('body');\n }\n var isErrorMsg = false;\n\n if (frameBody[0].childElementCount == 0) {\n\n isErrorMsg = true;\n try {\n var errorObj = JSON.parse(frameBody.text());\n } catch (e) {\n // don't parse text, it's meens TXT document.\n isErrorMsg = false;\n }\n\n }\n if (isErrorMsg) {\n\n currFrame.hide();\n me.showError(errorObj.error, errorObj.errorType);\n\n } else {\n if (context.convertedObj.isImage) {\n\n var img = j(currFrame).contents().find('img');\n if (img.attr('initWidth') == null) {\n img.attr('initWidth', img.width());\n }\n if (img.attr('initHeight') == null) {\n img.attr('initHeight', img.height());\n }\n\n // restore settings for image.\n var scale = wrapper.find(\".set-scale\");\n var scaleVal;\n if (WAforPDA()) {\n scaleVal = scale.data(\"scale\");\n } else {\n if ($(\".fit-to-width\").parent(\"div\").hasClass(\"selected\")) scaleVal = \"w\";\n else if ($(\".fit-to-height\").parent(\"div\").hasClass(\"selected\")) scaleVal = \"h\";\n else scaleVal = scale.find(\"input.pickFieldHidden\").val();\n };\n\n j.npocomputer.modules.previewdoc.setScale(scaleVal);\n fitTo(context.selectedObj.scale);\n\n currFrame.css('visibility', 'visible');\n }\n\n // open external links in separate window.\n frameLoad(currFrame);\n }\n\n });\n\n // TODO: disabling allow-copy-text icon\n // open external links in separate window.\n frameLoad(currFrame);\n\n disableScreen(false);\n\n setFrameHeight(context);\n\n initSelectedVersion();\n\n // исправление замечания: http://directum.npo-comp.ru/reference.asp?sys=TEHKASNPO&compcode=%D0%97%D0%97%D0%9F&ID=4991248\n //j.npocomputer.modules.previewdoc.setScale(\"w\");\n },\n\n selectVersion: function (key) {\n var me = this;\n var context = this.context || Core.preview.info;;\n disableScreen(true);\n var verId = key;\n\n context.errorMessage = false;\n\n j.ajax({\n type: \"GET\",\n url: context.previewHandlerUrl,\n data: { id: verId },\n cache: false,\n dataType: \"json\",\n success: function (data) {\n\n me.hideError();\n disableScreen(false);\n\n var currFrame = j(\"#\" + context.wrapperId + ' #' + context.frameId);\n currFrame.show();\n\n context.selectedObj.id = verId;\n context.selectedObj.pageNumber = 1;\n context.convertedObj.id = data.Id;\n context.convertedObj.pageCount = data.PageCount;\n context.convertedObj.docExtension = data.DocExtension;\n context.convertedObj.isImage = data.IsImage;\n\n initSelectedVersion();\n },\n error: function (response) {\n\n me.hideError();\n disableScreen(false);\n\n var msg = JSON.parse(response.responseText);\n me.showError(msg.error, msg.errorType);\n\n var currFrame = j(\"#\" + context.wrapperId + ' #' + context.frameId);\n currFrame.hide();\n\n }\n });\n },\n\n setScale: function (key) {\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n context.selectedObj.scale = key;\n var frame = j(\"#\" + context.wrapperId + \" #\" + context.frameId);\n var img = frame.contents().find('img');\n fitTo(key);\n\n if (!WAforPDA()) {\n Core.preview.scrolling.setScale(key);\n } {\n if (key != 'h' && key != 'w' && key != 'a') {\n img\n .height(\"auto\")\n .width(img.attr('initWidth') * (key / 100));\n }\n\n if ($.scrollActive || WA.ENV.isAndroid()) {\n if (!WAforPDA()) RefreshScrollInIFrame();\n }\n }\n },\n\n showError: function (errorMsg, errorType) {\n var cont = j(\".npocomputer-previewdoc-errors-place-holder\");\n cont.find('.error_div_msg').hide();\n\n var errType = (errorType == 'error');\n ErrorShow(errorMsg, errType);\n cont.show();\n\n // Убираем padding со стандартной компоненты с ошибкой, т.к. в предпросмотре своя.\n j(\".error_content_padding\").removeClass('error_content_padding');\n },\n\n hideError: function () {\n j(\".npocomputer-previewdoc-errors-place-holder\").hide();\n },\n\n /**\n * Отключить показ исправлений\n * @function Core.preview.scrolling.toggleTrackChanges\n * @return {Core.preview.scrolling}\n * @since 5.1.3.1030\n */\n toggleTrackChanges: function () {\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n\n var wrapper = j(\"#\" + context.wrapperId);\n var button = wrapper.find(\".enable-change-track\");\n\n if (button.hasClass('selected')) {\n button.removeClass('selected');\n this.disableTrackChanges();\n } else {\n button.addClass('selected');\n this.enableTrackChanges();\n }\n\n // Сохранить настройку в профиле\n WA.SRV.call('Session.asmx/SetUserProfileSettings', { ParamName: 'DisableWordChangeTracking', ParamValue: +(!button.hasClass('selected')) });\n },\n enableTrackChanges: function () {\n // Нужно получать, т.к. вызывается при инициализации страницы\n var me = this;\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n var wrapper = j(\"#\" + context.wrapperId);\n var frameDoc = wrapper.find(\"#\" + context.frameId).contents();\n\n frameDoc.find(wordDocumentSelector.insertedText)\n .css('color', 'teal')\n .css('text-decoration', 'underline');\n frameDoc.find(wordDocumentSelector.deletedText).show();\n\n // Показать скрытые примечания\n var commentButton = wrapper.find(\".enable-comments\");\n if (commentButton.hasClass('selected')) {\n var comments = frameDoc.find(wordDocumentSelector.comments);\n var areas = frameDoc.find(wordDocumentSelector.commentArea);\n if (comments.filter(':visible').length === 0) {\n me.enableComments();\n } else {\n comments.show();\n areas.show();\n }\n }\n },\n disableTrackChanges: function () {\n // Нужно получать, т.к. вызывается при инициализации страницы\n var me = this;\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n var wrapper = j(\"#\" + context.wrapperId);\n var frameDoc = wrapper.find(\"#\" + context.frameId).contents();\n\n frameDoc.find(wordDocumentSelector.insertedText)\n .css('color', 'inherit')\n .css('text-decoration', 'none');\n frameDoc.find(wordDocumentSelector.deletedText).hide();\n\n // Если скрываем исправления, то нужно скрыть и соответствующие примечания\n var delCommentsSelectors = me.getDeletedCommentsSelector(frameDoc);\n var comments = frameDoc.find(delCommentsSelectors.comments);\n if (comments.length === frameDoc.find(wordDocumentSelector.comments).length) {\n me.disableComments();\n } else {\n comments.hide();\n frameDoc.find(delCommentsSelectors.anchors).hide();\n frameDoc.find(delCommentsSelectors.areas).hide();\n }\n\n },\n\n /**\n * Отключить показ примечаний\n * @function Core.preview.scrolling.toggleTrackChanges\n * @return {Core.preview.scrolling}\n * @since 5.1.3.1031\n */\n toggleComments: function () {\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n\n var wrapper = j(\"#\" + context.wrapperId);\n var button = wrapper.find(\".enable-comments\");\n\n if (button.hasClass('selected')) {\n this.disableComments();\n button.removeClass('selected');\n } else {\n this.enableComments();\n button.addClass('selected');\n }\n\n // Сохранить настройку в профиле\n WA.SRV.call('Session.asmx/SetUserProfileSettings', { ParamName: 'DisableWordComments', ParamValue: +(!button.hasClass('selected')) });\n },\n enableComments: function () {\n // Нужно получать, т.к. вызывается при инициализации страницы\n var me = this;\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n var wrapper = j(\"#\" + context.wrapperId);\n var frameDoc = wrapper.find(\"#\" + context.frameId).contents();\n var buttonTrack = wrapper.find(\".enable-change-track\");\n\n var reviewBlockWidth = frameDoc.find('#review').width();\n var docContainer = frameDoc.find('div[class*=WordSection]');\n var oldMarginStr = docContainer.css('margin-left') || \"0px\";\n var newMargin = parseInt(oldMarginStr.replace('px', '')) - Math.round(reviewBlockWidth / 2.0);\n\n var comments = frameDoc.find(wordDocumentSelector.comments);\n\n // Исключить примечания к исправлениям, если отключен их показ\n if (!buttonTrack.hasClass('selected')) {\n comments = comments.not(me.getDeletedCommentsSelector(frameDoc).comments);\n }\n if (comments.length > 0) {\n frameDoc.find(wordDocumentSelector.commentAnchors).show();\n comments.show();\n frameDoc.find('#review').show();\n docContainer.css('margin-left', newMargin + 'px');\n Core.preview.alignComments(frameDoc.find(wordDocumentSelector.commentAnchors));\n }\n },\n disableComments: function () {\n // Нужно получать, т.к. вызывается при инициализации страницы\n var context = j.npocomputer.modules.previewdoc.context || Core.preview.info;\n var wrapper = j(\"#\" + context.wrapperId);\n var frameDoc = wrapper.find(\"#\" + context.frameId).contents();\n\n var reviewBlockWidth = frameDoc.find('#review').width();\n var docContainer = frameDoc.find('div[class*=WordSection]');\n var oldMarginStr = docContainer.css('margin-left') || \"0px\";\n var newMargin = parseInt(oldMarginStr.replace('px', '')) + Math.round(reviewBlockWidth / 2.0);\n\n var comments = frameDoc.find(wordDocumentSelector.comments + ':visible');\n if (comments.length > 0) {\n comments.hide();\n frameDoc.find(wordDocumentSelector.commentAnchors).hide();\n frameDoc.find('#review').hide();\n docContainer.css('margin-left', newMargin + 'px');\n }\n },\n\n getCommentIdByAnchorName: function (href) {\n return href.replace('#_mso', '_');\n },\n\n getDeletedCommentsSelector: function (container) {\n var commentAreas = container.find(wordDocumentSelector.commentArea);\n // Ищем текст комментариев, в котором находится только del-элемент.\n commentAreas = _.filter(commentAreas, function (el) { return el.children.length === 1 && j(el).find('del').length > 0; });\n\n var commentSelectors = {};\n\n var comments = j.map(commentAreas, function (el) { return '#' + el.name.replace('ref', ''); });\n commentSelectors.areas = j.map(commentAreas, function (el) { return 'a[name=' + el.name + ']' }).join(',');\n commentSelectors.anchors = j.map(comments, function (el) { return wordDocumentSelector.commentAnchors + '[href=' + el + ']' }).join(',');\n commentSelectors.comments = comments.join(',');\n\n return commentSelectors;\n }\n };\n\n})(jQuery, window);\n","// Показывает все записи в истории\nfunction ShowAll() {\n DoAction('showall=1', false);\n return false;\n}","\"use strict\";\n\n/**\n * Предоставляет инструменты для работы с буфером обмена через Агент веб-доступа. Например, скопировать ссылки в буфер обмена.\n *\n * @namespace window.Core.clipboard\n * @since 5.4.0.1000\n */\n(function (global) {\n global.clipboard = {};\n\n /**\r\n * Копирует ссылки в буфер обмена\r\n * @param {Array} links Массив ссылок вида {ID:..., Type:..., CompCode:..., Description}}\r\n */\n function copyLinksToClientBuffer(links) {\n var textHtml = \"\";\n var textPlain = MakeHrefsFromLinks(links);\n links.forEach(function(link) {\n textHtml += '} links Массив ссылок вида {ID:..., Type:..., CompCode:..., Description}}\r\n */\n function copyLinksInSessionStorage(links) {\n var d = $.Deferred();\n CallService(\"/Session.asmx/CopyLinks\", { Links: convertAgentLinksToLinkModels(links) }, function (res) {\n if (res.Success) {\n d.resolve(res);\n }\n else {\n d.reject(res);\n }\n });\n return d.promise();\n }\n\n /**\n * Скопировать массив ссылок в буфер обмена.\n *\n * @method window.Core.clipboard#copyLinksToClipboard\n * @param {Array} links Массив ссылок вида {ID:..., Type:..., CompCode:..., Description}}\n * @return {int} Количество скопированных ссылок.\n */\n global.clipboard.copyLinksToClipboard = function (links) {\n var d = $.Deferred();\n var copiedLinksCount = 0;\n\n //Если ничего не скопировано, то сразу выходим\n if (!(links) || !(links.length > 0)) {\n d.resolve(copiedLinksCount);\n return;\n }\n\n //Если мы в IE\n if (WA.ENV.browser.name === 'IE') {\n WebAccess.agent.isPluginAvailable(\"Clipboard\").always(function(isAvailableResponse) {\n //Если агент доступен, копируем через него\n if (isAvailableResponse) {\n copyLinksInSessionStorage(links);\n WebAccess.agent.clipboard.copyLinksToClipboard(links).done(function (res) {\n d.resolve(res);\n }).fail(function (res) {\n d.reject(res.Error);\n });\n } else {\n //Если агент не доступен, то хотя бы в сессию копируем + HTML5 скопирует адрес к объекту\n copiedLinksCount = copyLinksToClientBuffer(links);\n copyLinksInSessionStorage(links).done(function(res) {\n d.resolve(res.Result);\n }).fail(function(res) {\n d.reject(res.Error);\n });\n }\n });\n } else {\n //Копируем ссылки через HTML5 + серверные инструменты\n copiedLinksCount = copyLinksToClientBuffer(links);\n copyLinksInSessionStorage(links).done(function (res) {\n d.resolve(res.Result);\n }).fail(function (res) {\n d.reject(res.Error);\n });\n }\n \n return d.promise();\n },\n \n /**\n * Скопировать текст в буфер обмена.\n *\n * @method window.Core.clipboard#copyLinksToClipboard\n * @param {string} text Текст для помещения в буфер обмена\n */\n global.clipboard.copyTextToClipboard = function(text) {\n clipboard.copy({\n \"text/plain\": text\n });\n }\n\n /**\n * Получает массив объектов ссылок из буфера обмена.\n * @method window.Core.clipboard#getLinksFromClipboard\n * @return {array} Массив объектов ссылок.\n */\n global.clipboard.getLinksFromClipboard = function () {\n return WebAccess.agent.clipboard.getLinksFromClipboard();\n }\n\n //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//\n\n})(window.Core);"]}